Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0117864
accent colors for light & dark mode
jellydeck Feb 1, 2026
3066df9
Merge branch 'main' into accessible-accent
jellydeck Feb 1, 2026
8b27a13
fix download chart
jellydeck Feb 1, 2026
217a533
fix modal chart
jellydeck Feb 1, 2026
b80a683
Merge branch 'main' into accessible-accent
jellydeck Feb 1, 2026
e4e08dd
Merge branch 'main' into accessible-accent
jellydeck Feb 1, 2026
c280a05
Merge branch 'main' into accessible-accent
danielroe Feb 1, 2026
9eb3438
use accent color as focus-ring
jellydeck Feb 1, 2026
96da2c1
conflict fix
jellydeck Feb 1, 2026
7e4e4bb
Merge branch 'main' into accessible-accent
jellydeck Feb 1, 2026
023db12
accent color for ring in uno config
jellydeck Feb 1, 2026
d8de0d0
Merge branch 'main' into accessible-accent
jellydeck Feb 1, 2026
2be900e
tweak colors
jellydeck Feb 1, 2026
abf1d72
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
bd5e802
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
7cbfa0f
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
ed80442
fix: outline clip
jellydeck Feb 2, 2026
215037f
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
aef755e
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
827ebd7
add AppLogo test in a11y.spec.ts
jellydeck Feb 2, 2026
056ef58
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
cf11cf6
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
3047a0e
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
2502007
fix(test) default value for colors is dark
jellydeck Feb 2, 2026
7159952
Merge branch 'main' into accessible-accent
jellydeck Feb 2, 2026
afddd5e
Merge branch 'main' into accessible-accent
jellydeck Feb 3, 2026
65acb78
fix upstream
jellydeck Feb 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions app/assets/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -204,9 +204,9 @@ a:hover {
}

a:focus-visible {
outline: 2px solid var(--border);
outline: 2px solid var(--accent);
outline-offset: 2px;
border-radius: 2px;
border-radius: 4px;
}

/* Reset dd margin (browser default is margin-left: 40px) */
Expand All @@ -223,6 +223,12 @@ button {
padding: 0;
}

button:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
border-radius: 4px;
}

/* Selection */
::selection {
background-color: var(--fg-muted);
Expand Down
28 changes: 7 additions & 21 deletions app/components/AppHeader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,7 @@ onKeyStroke(
:aria-label="$t('nav.tap_to_search')"
@click="expandMobileSearch"
>
<img
aria-hidden="true"
:alt="$t('alt_logo')"
src="/logo.svg"
width="96"
height="96"
class="w-8 h-8 rounded-lg"
/>
<AppLogo class="w-8 h-8 rounded-lg" />
<span class="i-carbon:search w-4 h-4 text-fg-subtle" aria-hidden="true" />
</button>

Expand All @@ -116,16 +109,9 @@ onKeyStroke(
to="/"
:aria-label="$t('header.home')"
dir="ltr"
class="inline-flex items-center gap-2 header-logo font-mono text-lg font-medium text-fg hover:text-fg transition-colors duration-200 focus-ring rounded"
class="inline-flex items-center gap-2 header-logo font-mono text-lg font-medium text-fg hover:text-fg focus-visible:outline-accent/50 transition-colors duration-200 rounded"
>
<img
aria-hidden="true"
:alt="$t('alt_logo')"
src="/logo.svg"
width="96"
height="96"
class="w-8 h-8 rounded-lg"
/>
<AppLogo class="w-8 h-8 rounded-lg" />
<span>npmx</span>
</NuxtLink>
</div>
Expand Down Expand Up @@ -163,11 +149,11 @@ onKeyStroke(
</div>

<!-- End: Desktop nav items + Mobile menu button -->
<div class="flex-shrink-0 flex items-center gap-4 sm:gap-6">
<div class="flex-shrink-0 flex items-center lg:gap-4">
<!-- Desktop: Compare link -->
<NuxtLink
to="/compare"
class="hidden sm:inline-flex link-subtle font-mono text-sm items-center gap-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
class="hidden sm:inline-flex link-subtle px-2 py-1.5 hover:bg-bg-subtle font-mono text-sm items-center gap-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
aria-keyshortcuts="c"
>
{{ $t('nav.compare') }}
Expand All @@ -182,7 +168,7 @@ onKeyStroke(
<!-- Desktop: Settings link -->
<NuxtLink
to="/settings"
class="hidden sm:inline-flex link-subtle font-mono text-sm items-center gap-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
class="hidden sm:inline-flex link-subtle px-2 py-1.5 hover:bg-bg-subtle font-mono text-sm items-center gap-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
aria-keyshortcuts=","
>
{{ $t('nav.settings') }}
Expand All @@ -202,7 +188,7 @@ onKeyStroke(
<!-- Mobile: Menu button (always visible, toggles menu) -->
<button
type="button"
class="sm:hidden flex items-center p-2 -m-2 text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
class="sm:hidden flex items-center p-2 -m-2 text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
:aria-label="showMobileMenu ? $t('common.close') : $t('nav.open_menu')"
:aria-expanded="showMobileMenu"
@click="showMobileMenu = !showMobileMenu"
Expand Down
31 changes: 31 additions & 0 deletions app/components/AppLogo.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<script setup lang="ts">
defineProps<{
class?: string
}>()
</script>

<template>
<svg
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
width="96"
height="96"
:class="class"
>
<title>{{ $t('alt_logo') }}</title>
<rect fill="var(--bg)" width="512" height="512" rx="64" />
<rect fill="var(--fg)" x="110" y="310" width="60" height="60" />
<text
fill="var(--accent)"
x="320"
y="370"
font-family="'Geist Mono',ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"
font-size="420"
font-weight="500"
text-anchor="middle"
>
<tspan>/</tspan>
</text>
</svg>
</template>
4 changes: 2 additions & 2 deletions app/components/CollapsibleSection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ useHead({

<template>
<section class="scroll-mt-20" :data-anchor-id="id">
<div class="flex items-center justify-between mb-3">
<div class="flex items-center justify-between mb-3 px-1">
<component
:is="headingLevel"
:id="headingId"
Expand All @@ -85,7 +85,7 @@ useHead({
<button
:id="buttonId"
type="button"
class="w-4 h-4 flex items-center justify-center text-fg-subtle hover:text-fg-muted transition-colors duration-200 shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
class="w-4 h-4 flex items-center justify-center text-fg-subtle hover:text-fg-muted transition-colors duration-200 shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
:aria-expanded="isOpen"
:aria-controls="contentId"
:aria-label="ariaLabel"
Expand Down
2 changes: 1 addition & 1 deletion app/components/Header/AccountMenu.client.vue
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ function openAuthModal() {
<div ref="accountMenuRef" class="relative flex min-w-24 justify-end">
<button
type="button"
class="relative flex items-center gap-2 px-2 py-1.5 rounded-md transition-colors duration-200 hover:bg-bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50"
class="relative flex items-center justify-end gap-2 px-2 py-1.5 min-w-24 rounded-md transition-colors duration-200 hover:bg-bg-subtle hover:text-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
:aria-expanded="isOpen"
aria-haspopup="true"
@click="isOpen = !isOpen"
Expand Down
10 changes: 5 additions & 5 deletions app/components/Header/AuthModal.client.vue
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ async function handleLogin() {
</div>
</div>
<button
class="w-full px-4 py-2 font-mono text-sm text-fg-muted bg-bg-subtle border border-border rounded-md transition-colors duration-200 hover:text-fg hover:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50"
class="w-full px-4 py-2 font-mono text-sm text-fg-muted bg-bg-subtle border border-border rounded-md transition-colors duration-200 hover:text-fg hover:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
@click="logout"
>
{{ $t('auth.modal.disconnect') }}
Expand All @@ -76,7 +76,7 @@ async function handleLogin() {
:placeholder="$t('auth.modal.handle_placeholder')"
autocomplete="off"
spellcheck="false"
class="w-full px-3 py-2 font-mono text-sm bg-bg-subtle border border-border rounded-md text-fg placeholder:text-fg-subtle transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50"
class="w-full px-3 py-2 font-mono text-sm bg-bg-subtle border border-border rounded-md text-fg placeholder:text-fg-subtle transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
/>
</div>

Expand Down Expand Up @@ -114,21 +114,21 @@ async function handleLogin() {
<button
type="submit"
:disabled="!handleInput.trim()"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 focus-visible:ring-offset-2 focus-visible:ring-offset-bg"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 focus-visible:ring-offset-2 focus-visible:ring-offset-bg"
>
{{ $t('auth.modal.connect') }}
</button>
<button
type="button"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 focus-visible:ring-offset-2 focus-visible:ring-offset-bg"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 focus-visible:ring-offset-2 focus-visible:ring-offset-bg"
@click="handleCreateAccount"
>
{{ $t('auth.modal.create_account') }}
</button>
<hr />
<button
type="button"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 focus-visible:ring-offset-2 focus-visible:ring-offset-bg flex items-center justify-center gap-2"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 focus-visible:ring-offset-2 focus-visible:ring-offset-bg flex items-center justify-center gap-2"
@click="handleBlueskySignIn"
>
{{ $t('auth.modal.connect_bluesky') }}
Expand Down
12 changes: 6 additions & 6 deletions app/components/Header/ConnectorModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ function handleDisconnect() {

<button
type="button"
class="w-full px-4 py-2 font-mono text-sm text-fg-muted bg-bg-subtle border border-border rounded-md transition-colors duration-200 hover:text-fg hover:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50"
class="w-full px-4 py-2 font-mono text-sm text-fg-muted bg-bg-subtle border border-border rounded-md transition-colors duration-200 hover:text-fg hover:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
@click="handleDisconnect"
>
{{ $t('connector.modal.disconnect') }}
Expand Down Expand Up @@ -116,7 +116,7 @@ function handleDisconnect() {
<button
type="button"
:aria-label="copied ? $t('connector.modal.copied') : $t('connector.modal.copy_command')"
class="ms-auto text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
class="ms-auto text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
@click="copy('pnpm npmx-connector')"
>
<span v-if="!copied" class="i-carbon:copy w-5 h-5" aria-hidden="true" />
Expand All @@ -138,7 +138,7 @@ function handleDisconnect() {
:aria-label="
copied ? $t('connector.modal.copied') : $t('connector.modal.copy_command')
"
class="ms-auto text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
class="ms-auto text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
@click="copyCommand"
>
<span v-if="!copied" class="i-carbon:copy w-5 h-5" aria-hidden="true" />
Expand Down Expand Up @@ -169,7 +169,7 @@ function handleDisconnect() {
name="connector-token"
:placeholder="$t('connector.modal.token_placeholder')"
v-bind="noCorrect"
class="w-full px-3 py-2 font-mono text-sm bg-bg-subtle border border-border rounded-md text-fg placeholder:text-fg-subtle transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50"
class="w-full px-3 py-2 font-mono text-sm bg-bg-subtle border border-border rounded-md text-fg placeholder:text-fg-subtle transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
/>
</div>

Expand All @@ -193,7 +193,7 @@ function handleDisconnect() {
name="connector-port"
inputmode="numeric"
autocomplete="off"
class="w-full px-3 py-2 font-mono text-sm bg-bg-subtle border border-border rounded-md text-fg transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50"
class="w-full px-3 py-2 font-mono text-sm bg-bg-subtle border border-border rounded-md text-fg transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
/>
</div>
</details>
Expand Down Expand Up @@ -224,7 +224,7 @@ function handleDisconnect() {
<button
type="submit"
:disabled="!tokenInput.trim() || isConnecting"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 focus-visible:ring-offset-2 focus-visible:ring-offset-bg"
class="w-full px-4 py-2 font-mono text-sm text-bg bg-fg rounded-md transition-all duration-200 hover:bg-fg/90 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 focus-visible:ring-offset-2 focus-visible:ring-offset-bg"
>
{{ isConnecting ? $t('connector.modal.connecting') : $t('connector.modal.connect') }}
</button>
Expand Down
2 changes: 1 addition & 1 deletion app/components/Header/MobileMenu.vue
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ onUnmounted(deactivate)
<span class="font-mono text-sm text-fg-muted">{{ $t('nav.menu') }}</span>
<button
type="button"
class="p-2 -m-2 text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
class="p-2 -m-2 text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
:aria-label="$t('common.close')"
@click="closeMenu"
>
Expand Down
2 changes: 1 addition & 1 deletion app/components/Header/SearchBox.vue
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ defineExpose({ focus })
name="q"
:placeholder="$t('search.placeholder')"
v-bind="noCorrect"
class="w-full min-w-25 bg-bg-subtle border border-border rounded-md ps-7 pe-3 py-1.5 font-mono text-sm text-fg placeholder:text-fg-subtle transition-border-color duration-300 motion-reduce:transition-none focus:border-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50"
class="w-full min-w-25 bg-bg-subtle border border-border rounded-md ps-7 pe-3 py-1.5 font-mono text-sm text-fg placeholder:text-fg-subtle transition-border-color duration-300 motion-reduce:transition-none focus:border-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
@focus="handleSearchFocus"
@blur="handleSearchBlur"
/>
Expand Down
6 changes: 3 additions & 3 deletions app/components/Modal.client.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ defineExpose({
<dialog
ref="dialogRef"
closedby="any"
class="w-full bg-bg border border-border rounded-lg shadow-xl max-h-[90vh] overflow-y-auto overscroll-contain m-0 m-auto p-6 text-white"
class="w-full bg-bg border border-border rounded-lg shadow-xl max-h-[90vh] overflow-y-auto overscroll-contain m-0 m-auto p-6 text-white focus-visible:outline focus-visible:outline-accent/70"
:aria-labelledby="modalTitleId"
v-bind="$attrs"
>
Expand All @@ -36,11 +36,11 @@ defineExpose({
</h2>
<button
type="button"
class="text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
class="text-fg-subtle w-5 h-5 hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70 rounded"
:aria-label="$t('common.close')"
@click="handleModalClose"
>
<span class="i-carbon-close w-5 h-5" aria-hidden="true" />
<span class="i-carbon-close" aria-hidden="true" />
</button>
</div>
<!-- Modal body content -->
Expand Down
Loading
Loading