Skip to content

Commit 56ba6ae

Browse files
committed
fix(a11y): resolve 14 WCAG AA color-contrast violations exposed by vite-plus 0.1.20
- LinkBase disabled: replace opacity-50 + text-fg/bg-fg (3.69:1) with text-fg-muted / bg-fg-muted tokens (~8:1) and add aria-disabled. - DiffSidebarPanel + DiffMobileSidebarDrawer: stats and semver badges use text-{green,red,yellow,purple}-700 dark:text-{...}-400, matching the existing Alert.vue convention. - DiffSkipBlock: drop redundant opacity-50; text-fg-muted on bg-bg-muted already meets contrast. - DiffLine: line-number cell uses text-fg-subtle (5.5:1+) instead of opacity-50 over inherited text (3.69:1). - main.css: light-mode --accent default oklch(0.5 0.16 247.27) so text-accent on bg-fg/10 reaches 5:1 (was 4.19); user-set --accent-color overrides remain unaffected.
1 parent 8781e29 commit 56ba6ae

6 files changed

Lines changed: 29 additions & 18 deletions

File tree

app/assets/main.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@
9595
--border-subtle: oklch(0.922 0 0);
9696
--border-hover: oklch(0.715 0 0);
9797

98-
--accent: var(--accent-color, oklch(0.53 0.16 247.27));
98+
--accent: var(--accent-color, oklch(0.5 0.16 247.27));
9999
--accent-muted: var(--accent-color, oklch(0.205 0 0));
100100

101101
/* accent colors */
102-
--swatch-sky: oklch(0.53 0.16 247.27);
102+
--swatch-sky: oklch(0.5 0.16 247.27);
103103
--swatch-coral: oklch(0.56 0.17 10.75);
104104
--swatch-amber: oklch(0.58 0.18 46.34);
105105
--swatch-emerald: oklch(0.51 0.13 162.4);

app/components/Diff/Line.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const renderedSegments = computed(() =>
8484
<td :class="borderClasses" />
8585

8686
<!-- Line number -->
87-
<td class="tabular-nums text-center opacity-50 px-2 text-xs select-none w-12 shrink-0">
87+
<td class="tabular-nums text-center text-fg-subtle px-2 text-xs select-none w-12 shrink-0">
8888
{{ line.type === 'delete' ? '–' : lineNumberNew }}
8989
</td>
9090

app/components/Diff/MobileSidebarDrawer.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,17 @@ watch(open, value => {
5959
<div class="flex items-center justify-between gap-2 py-2 px-4">
6060
<div class="text-xs font-mono text-fg-muted flex items-center gap-2">
6161
<span class="flex items-center gap-1">
62-
<span class="text-green-500">+{{ props.compare.stats.filesAdded }}</span>
62+
<span class="text-green-700 dark:text-green-400"
63+
>+{{ props.compare.stats.filesAdded }}</span
64+
>
6365
<span class="text-fg-subtle">/</span>
64-
<span class="text-red-500">-{{ props.compare.stats.filesRemoved }}</span>
66+
<span class="text-red-700 dark:text-red-400"
67+
>-{{ props.compare.stats.filesRemoved }}</span
68+
>
6569
<span class="text-fg-subtle">/</span>
66-
<span class="text-yellow-500">~{{ props.compare.stats.filesModified }}</span>
70+
<span class="text-yellow-700 dark:text-yellow-400"
71+
>~{{ props.compare.stats.filesModified }}</span
72+
>
6773
</span>
6874
<span class="text-fg-subtle">•</span>
6975
<span>{{

app/components/Diff/SidebarPanel.vue

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ const filteredChanges = computed(() => {
5757
function getSemverBadgeClass(semverDiff: string | null | undefined): string {
5858
switch (semverDiff) {
5959
case 'major':
60-
return 'bg-red-500/10 text-red-500'
60+
return 'bg-red-500/10 text-red-700 dark:text-red-400'
6161
case 'minor':
62-
return 'bg-yellow-500/10 text-yellow-500'
62+
return 'bg-yellow-500/10 text-yellow-700 dark:text-yellow-400'
6363
case 'patch':
64-
return 'bg-green-500/10 text-green-500'
64+
return 'bg-green-500/10 text-green-700 dark:text-green-400'
6565
case 'prerelease':
66-
return 'bg-purple-500/10 text-purple-500'
66+
return 'bg-purple-500/10 text-purple-700 dark:text-purple-400'
6767
default:
6868
return 'bg-bg-muted text-fg-subtle'
6969
}
@@ -87,11 +87,15 @@ function handleFileSelect(file: FileChange) {
8787
</span>
8888
<div class="flex items-center gap-3 font-mono text-3xs">
8989
<span class="flex items-center gap-1">
90-
<span class="text-green-500">+{{ compare.stats.filesAdded }}</span>
90+
<span class="text-green-700 dark:text-green-400"
91+
>+{{ compare.stats.filesAdded }}</span
92+
>
9193
<span class="text-fg-subtle">/</span>
92-
<span class="text-red-500">-{{ compare.stats.filesRemoved }}</span>
94+
<span class="text-red-700 dark:text-red-400">-{{ compare.stats.filesRemoved }}</span>
9395
<span class="text-fg-subtle">/</span>
94-
<span class="text-yellow-500">~{{ compare.stats.filesModified }}</span>
96+
<span class="text-yellow-700 dark:text-yellow-400"
97+
>~{{ compare.stats.filesModified }}</span
98+
>
9599
</span>
96100
<span v-if="compare.dependencyChanges.length > 0" class="text-fg-muted">
97101
{{

app/components/Diff/SkipBlock.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ defineProps<{
1212
<!-- Skip block row -->
1313
<tr class="h-10 font-mono bg-bg-muted text-fg-muted">
1414
<td />
15-
<td class="opacity-50 select-none text-center">
15+
<td class="select-none text-center">
1616
<span class="i-lucide:chevrons-up-down w-4 h-4" />
1717
</td>
1818
<td>
19-
<span class="px-0 sticky inset-is-2 italic opacity-50">
19+
<span class="px-0 sticky inset-is-2 italic">
2020
{{ content || $t('compare.lines_hidden', { count }, count) }}
2121
</span>
2222
</td>

app/components/Link/Base.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,16 @@ const keyboardShortcutsEnabled = useKeyboardShortcuts()
7272
<template>
7373
<span
7474
v-if="disabled"
75+
aria-disabled="true"
7576
:class="{
7677
'flex': block,
7778
'inline-flex': !block,
78-
'opacity-50 gap-x-1 items-center justify-center font-mono border border-transparent rounded-md':
79+
'gap-x-1 items-center justify-center font-mono border border-transparent rounded-md':
7980
isButton,
8081
'text-sm px-4 py-2': isButtonMedium,
8182
'text-xs px-2 py-0.5': isButtonSmall,
82-
'text-bg bg-fg': variant === 'button-primary',
83-
'bg-transparent text-fg': variant === 'button-secondary',
83+
'text-bg bg-fg-muted': variant === 'button-primary',
84+
'bg-transparent text-fg-muted': variant === 'button-secondary',
8485
}"
8586
><slot
8687
/></span>

0 commit comments

Comments
 (0)