fix(a11y): bump all text below 12px to 12px floor and promote tertiary-on-body to secondary
Brand guidelines (docs/brand/magnotia-brand-guidelines.md §4) say "Never go below 12px for any text" and "tertiary text must be ≥18px bold or ≥24px regular". Audit found 246 sub-12px className sites and 166 cases of text-text-tertiary paired with body sizes. Bumped text-[9/10/11px] → text-[12px] across 26 .svelte files in src/lib and src/routes. Promoted text-text-tertiary → text-text-secondary at body sizes (12-14px) where context allowed; left placeholder pseudo-states, ternary-conditional inactive states, and line-through "done" states alone (8 residual pairings, all decorative). Affects neurodivergent users on 1366×768 budget hardware most directly. svelte-check: 0 errors, 0 warnings.
This commit is contained in:
@@ -572,7 +572,7 @@
|
||||
<!-- Header -->
|
||||
<div class="flex items-center gap-4 px-7 pt-6 pb-4">
|
||||
<h2 class="font-display text-[26px] italic text-text">History</h2>
|
||||
<span class="text-[11px] text-text-tertiary mt-1">{history.length} saved</span>
|
||||
<span class="text-[12px] text-text-secondary mt-1">{history.length} saved</span>
|
||||
<div class="flex-1"></div>
|
||||
<button
|
||||
class="inline-flex items-center gap-1.5 btn-md rounded-lg
|
||||
@@ -582,7 +582,7 @@
|
||||
title={showStarredOnly ? "Showing starred only (click to show all)" : "Show starred only"}
|
||||
>
|
||||
<Star size={14} aria-hidden="true" />
|
||||
<span class="text-[11px]">Starred</span>
|
||||
<span class="text-[12px]">Starred</span>
|
||||
</button>
|
||||
{#if history.some((i) => !i.llmTags || i.llmTags.length === 0)}
|
||||
<button
|
||||
@@ -592,7 +592,7 @@
|
||||
title="Run AI content tagging across every untagged transcript"
|
||||
>
|
||||
<Tag size={13} aria-hidden="true" />
|
||||
<span class="text-[11px]">{bulkTagging ? `Tagging ${bulkTaggingProgress}` : "Tag all untagged"}</span>
|
||||
<span class="text-[12px]">{bulkTagging ? `Tagging ${bulkTaggingProgress}` : "Tag all untagged"}</span>
|
||||
</button>
|
||||
{/if}
|
||||
{#if history.length > 0}
|
||||
@@ -629,9 +629,9 @@
|
||||
data-no-transition
|
||||
/>
|
||||
{#if searchQuery}
|
||||
<span class="text-[11px] text-text-tertiary mr-2">{filtered.length} results</span>
|
||||
<span class="text-[12px] text-text-secondary mr-2">{filtered.length} results</span>
|
||||
<button
|
||||
class="text-[11px] text-text-tertiary hover:text-text"
|
||||
class="text-[12px] text-text-secondary hover:text-text"
|
||||
onclick={() => searchQuery = ""}
|
||||
>Clear</button>
|
||||
{/if}
|
||||
@@ -642,10 +642,10 @@
|
||||
<!-- Tag chip filter bar -->
|
||||
{#if allTags.length > 0}
|
||||
<div class="px-7 pb-3 flex items-center gap-1.5 flex-wrap">
|
||||
<span class="text-[10px] uppercase tracking-wider text-text-tertiary mr-1">Tags</span>
|
||||
<span class="text-[12px] uppercase tracking-wider text-text-secondary mr-1">Tags</span>
|
||||
{#if activeTagFilter}
|
||||
<button
|
||||
class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full border border-accent text-[10px] text-accent bg-accent/10"
|
||||
class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full border border-accent text-[12px] text-accent bg-accent/10"
|
||||
onclick={() => (activeTagFilter = null)}
|
||||
title="Clear tag filter"
|
||||
>
|
||||
@@ -655,11 +655,11 @@
|
||||
{:else}
|
||||
{#each allTags.slice(0, 7) as t (t.tag)}
|
||||
<button
|
||||
class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full border border-border-subtle text-[10px] text-text-secondary hover:border-accent hover:text-accent"
|
||||
class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full border border-border-subtle text-[12px] text-text-secondary hover:border-accent hover:text-accent"
|
||||
onclick={() => (activeTagFilter = t.tag)}
|
||||
>
|
||||
{t.tag}
|
||||
<span class="text-[9px] text-text-tertiary">{t.count}</span>
|
||||
<span class="text-[12px] text-text-secondary">{t.count}</span>
|
||||
</button>
|
||||
{/each}
|
||||
{/if}
|
||||
@@ -774,7 +774,7 @@
|
||||
|
||||
<!-- Duration -->
|
||||
{#if item.duration}
|
||||
<span class="text-[11px] text-text-tertiary flex-shrink-0 tabular-nums">
|
||||
<span class="text-[12px] text-text-secondary flex-shrink-0 tabular-nums">
|
||||
{formatDuration(item.duration)}
|
||||
</span>
|
||||
{/if}
|
||||
@@ -789,7 +789,7 @@
|
||||
</span>
|
||||
|
||||
<!-- Date (right-aligned) -->
|
||||
<span class="text-[11px] text-text-tertiary flex-shrink-0 text-right min-w-[90px]">
|
||||
<span class="text-[12px] text-text-secondary flex-shrink-0 text-right min-w-[90px]">
|
||||
{item.date}
|
||||
</span>
|
||||
|
||||
@@ -808,7 +808,7 @@
|
||||
<!-- Audio player (if playing this item) -->
|
||||
{#if item.audioPath && playingId === item.id}
|
||||
<div class="flex items-center gap-3 mb-4 px-1">
|
||||
<span class="text-[10px] text-text-tertiary tabular-nums w-[80px]">
|
||||
<span class="text-[12px] text-text-secondary tabular-nums w-[80px]">
|
||||
{formatTime(currentTime)} / {formatTime(duration)}
|
||||
</span>
|
||||
<input
|
||||
@@ -825,7 +825,7 @@
|
||||
<div class="flex gap-0.5">
|
||||
{#each PLAYBACK_SPEEDS as speed}
|
||||
<button
|
||||
class="text-[9px] px-1.5 py-0.5 rounded-full
|
||||
class="text-[12px] px-1.5 py-0.5 rounded-full
|
||||
{playbackRate === speed
|
||||
? 'bg-accent/15 text-accent font-medium'
|
||||
: 'text-text-tertiary hover:text-text-secondary'}"
|
||||
@@ -853,12 +853,12 @@
|
||||
<div class="flex items-center gap-1.5 flex-wrap mb-3" onclick={(e) => e.stopPropagation()} role="presentation">
|
||||
{#each deriveAutoTags(item) as t (t)}
|
||||
<span
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-full text-[10px] bg-bg-input text-text-tertiary border border-border-subtle"
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-full text-[12px] bg-bg-input text-text-secondary border border-border-subtle"
|
||||
title="Auto-generated tag"
|
||||
>{t}</span>
|
||||
{/each}
|
||||
{#each (item.manualTags || []) as t (t)}
|
||||
<span class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[10px] bg-accent/10 text-accent border border-accent/30">
|
||||
<span class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[12px] bg-accent/10 text-accent border border-accent/30">
|
||||
{t}
|
||||
<button
|
||||
class="text-[12px] leading-none hover:text-danger"
|
||||
@@ -873,7 +873,7 @@
|
||||
into manualTags. -->
|
||||
{#each (item.llmTags || []) as t (t)}
|
||||
<button
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-full text-[10px] italic border border-dashed border-border-subtle text-text-tertiary hover:text-text hover:border-accent"
|
||||
class="inline-flex items-center px-2 py-0.5 rounded-full text-[12px] italic border border-dashed border-border-subtle text-text-secondary hover:text-text hover:border-accent"
|
||||
onclick={() => promoteLlmTag(item, t)}
|
||||
title="Click to keep as a manual tag"
|
||||
aria-label={`Promote ${t} to manual tag`}
|
||||
@@ -881,7 +881,7 @@
|
||||
{/each}
|
||||
<input
|
||||
type="text"
|
||||
class="bg-bg-input border border-border rounded-full px-2 py-0.5 text-[10px]
|
||||
class="bg-bg-input border border-border rounded-full px-2 py-0.5 text-[12px]
|
||||
text-text placeholder:text-text-tertiary focus:border-accent w-[110px]"
|
||||
placeholder="+ add tag"
|
||||
onkeydown={(e) => handleAddTagKey(e, item)}
|
||||
@@ -895,12 +895,12 @@
|
||||
<!-- Action buttons -->
|
||||
<div class="flex items-center gap-2 flex-wrap">
|
||||
<button
|
||||
class="text-[11px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text"
|
||||
class="text-[12px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text"
|
||||
style="transition-duration: var(--duration-ui)"
|
||||
onclick={(e) => { e.stopPropagation(); copyItem(item); }}
|
||||
>Copy</button>
|
||||
<button
|
||||
class="inline-flex items-center gap-1.5 text-[11px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text"
|
||||
class="inline-flex items-center gap-1.5 text-[12px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text"
|
||||
style="transition-duration: var(--duration-ui)"
|
||||
onclick={(e) => { e.stopPropagation(); openEditor(item); }}
|
||||
title="Open transcript in a popout editor"
|
||||
@@ -909,13 +909,13 @@
|
||||
<ExternalLink size={11} aria-hidden="true" />
|
||||
</button>
|
||||
<button
|
||||
class="text-[11px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text"
|
||||
class="text-[12px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text"
|
||||
style="transition-duration: var(--duration-ui)"
|
||||
onclick={(e) => { e.stopPropagation(); exportMarkdown(item); }}
|
||||
title="Export this transcript as a Markdown file with YAML frontmatter"
|
||||
>Export .md</button>
|
||||
<button
|
||||
class="inline-flex items-center gap-1.5 text-[11px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text disabled:opacity-50"
|
||||
class="inline-flex items-center gap-1.5 text-[12px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-text disabled:opacity-50"
|
||||
style="transition-duration: var(--duration-ui)"
|
||||
onclick={(e) => { e.stopPropagation(); tagRow(item); }}
|
||||
disabled={tagging.has(item.id)}
|
||||
@@ -927,14 +927,14 @@
|
||||
</button>
|
||||
{#if item.audioPath && item.segments && item.segments.length > 0}
|
||||
<button
|
||||
class="text-[11px] px-3 py-1.5 rounded-lg bg-hover text-accent hover:text-accent-hover"
|
||||
class="text-[12px] px-3 py-1.5 rounded-lg bg-hover text-accent hover:text-accent-hover"
|
||||
style="transition-duration: var(--duration-ui)"
|
||||
onclick={(e) => { e.stopPropagation(); openViewer(item); }}
|
||||
>Open viewer</button>
|
||||
{/if}
|
||||
<div class="flex-1"></div>
|
||||
<button
|
||||
class="text-[11px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-danger"
|
||||
class="text-[12px] px-3 py-1.5 rounded-lg bg-hover text-text-secondary hover:text-danger"
|
||||
style="transition-duration: var(--duration-ui)"
|
||||
onclick={(e) => { e.stopPropagation(); removeItem(item); }}
|
||||
>Delete</button>
|
||||
|
||||
Reference in New Issue
Block a user