Fix L119/L151/L153: empty-state copy, range dashes, dismiss aria-labels

L119: Standardized empty-state copy on the "No X yet." pattern. Terminal
      "Output will appear here." -> "No output yet."; Diagnostics
      "No errors logged." -> "No errors yet."

L151: Range-dash convention is ASCII hyphen everywhere. Changed the lone
      en-dash prose range ("2-3 is a good balance") to a hyphen, matching the
      time-range placeholders (1:30-2:00).

L153: The three "Dismiss" close buttons now name what they dismiss --
      "Dismiss suggested link" (DownloadBar + Library suggestion banners) and
      "Dismiss duplicate warning" (DownloadBar dup row).

L95 left open: the Cookies-card "sign in"/"sign-in" usage is already correct
English (verb vs modifier); no change warranted.

typecheck + 242 tests + eslint green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 15:33:22 -04:00
parent 0d2000f307
commit eb94e84707
5 changed files with 9 additions and 9 deletions
+3 -3
View File
@@ -607,7 +607,7 @@ token system + shared primitives (UI/SIMP — high value, larger effort) · i18n
- [ ] **L117 — Terminal/error-log "empty" aren't centered blocks** like the other empty states (inline text instead). - [ ] **L117 — Terminal/error-log "empty" aren't centered blocks** like the other empty states (inline text instead).
- [ ] **L118 — Cross-component focus via hardcoded id.** App focuses the URL field with - [ ] **L118 — Cross-component focus via hardcoded id.** App focuses the URL field with
`document.getElementById('aerofetch-url')` — brittle coupling into DownloadBar's markup. `document.getElementById('aerofetch-url')` — brittle coupling into DownloadBar's markup.
- [ ] **L119 — "No items" copy varies** — "No … yet" (most) vs "Output will appear here." (Terminal) vs "No errors logged." (Diagnostics). - [x] **L119 — "No items" copy varies** — "No … yet" (most) vs "Output will appear here." (Terminal) vs "No errors logged." (Diagnostics).
- [ ] **L120 — Fluent `Card` vs hand-styled `div` cards.** Only Settings/Onboarding use `<Card>`; every - [ ] **L120 — Fluent `Card` vs hand-styled `div` cards.** Only Settings/Onboarding use `<Card>`; every
other card surface is a bespoke styled `<div>`. other card surface is a bespoke styled `<div>`.
- [ ] **L121 — Raw scrim literal.** CommandPalette backdrop is `rgba(0,0,0,0.32)` (the only raw rgba in - [ ] **L121 — Raw scrim literal.** CommandPalette backdrop is `rgba(0,0,0,0.32)` (the only raw rgba in
@@ -677,11 +677,11 @@ token system + shared primitives (UI/SIMP — high value, larger effort) · i18n
in the tray" is a three-sentence paragraph with a parenthetical. Normalize hint length/voice. in the tray" is a three-sentence paragraph with a parenthetical. Normalize hint length/voice.
- [x] **L150 — "PO token" capitalization varies**`PO Token` (ipc.ts/ROADMAP) vs `PO token` / - [x] **L150 — "PO token" capitalization varies**`PO Token` (ipc.ts/ROADMAP) vs `PO token` /
`Proof-of-Origin token` (SettingsView). Pick one. `Proof-of-Origin token` (SettingsView). Pick one.
- [ ] **L151 — Mixed range dashes.** En-dash in prose ("23 is a good balance") vs hyphen in time-range - [x] **L151 — Mixed range dashes.** En-dash in prose ("23 is a good balance") vs hyphen in time-range
placeholders ("1:30-2:00"). Choose one convention. placeholders ("1:30-2:00"). Choose one convention.
- [ ] **L152 — Search-field sizing differs per screen.** History `minWidth 180 / maxWidth 320`, Settings - [ ] **L152 — Search-field sizing differs per screen.** History `minWidth 180 / maxWidth 320`, Settings
inline `width: 100%`, DownloadBar `flexGrow`. No shared search-input width. inline `width: 100%`, DownloadBar `flexGrow`. No shared search-input width.
- [ ] **L153 — Generic "Dismiss" aria-labels.** Three close buttons (DownloadBar suggestion + dup, - [x] **L153 — Generic "Dismiss" aria-labels.** Three close buttons (DownloadBar suggestion + dup,
Library suggestion) all read just "Dismiss" — ambiguous to a screen reader. Name what's dismissed. Library suggestion) all read just "Dismiss" — ambiguous to a screen reader. Name what's dismissed.
- [x] **L154 — Instructional text in an aria-label.** Sidebar theme-cycle button is - [x] **L154 — Instructional text in an aria-label.** Sidebar theme-cycle button is
`aria-label="Theme: Dark. Click to change."` — "Click to change" is UI instruction, not a name. `aria-label="Theme: Dark. Click to change."` — "Click to change" is UI instruction, not a name.
+2 -2
View File
@@ -588,7 +588,7 @@ export function DownloadBar(): React.JSX.Element {
appearance="subtle" appearance="subtle"
icon={<DismissRegular />} icon={<DismissRegular />}
onClick={dismissSuggestion} onClick={dismissSuggestion}
aria-label="Dismiss" aria-label="Dismiss suggested link"
/> />
</div> </div>
)} )}
@@ -605,7 +605,7 @@ export function DownloadBar(): React.JSX.Element {
appearance="subtle" appearance="subtle"
icon={<DismissRegular />} icon={<DismissRegular />}
onClick={() => setDup(null)} onClick={() => setDup(null)}
aria-label="Dismiss" aria-label="Dismiss duplicate warning"
/> />
</div> </div>
)} )}
+1 -1
View File
@@ -541,7 +541,7 @@ export function LibraryView(): React.JSX.Element {
appearance="subtle" appearance="subtle"
icon={<DismissRegular />} icon={<DismissRegular />}
onClick={clip.dismiss} onClick={clip.dismiss}
aria-label="Dismiss" aria-label="Dismiss suggested link"
/> />
</div> </div>
)} )}
+2 -2
View File
@@ -536,7 +536,7 @@ export function SettingsView(): React.JSX.Element {
<Field <Field
label="Maximum simultaneous downloads" label="Maximum simultaneous downloads"
hint="How many downloads run at once. 23 is a good balance." hint="How many downloads run at once. 2-3 is a good balance."
> >
<SpinButton <SpinButton
value={maxConcurrent} value={maxConcurrent}
@@ -1002,7 +1002,7 @@ export function SettingsView(): React.JSX.Element {
</div> </div>
{errorEntries.length === 0 ? ( {errorEntries.length === 0 ? (
<Caption1 className={styles.hint}>No errors logged.</Caption1> <Caption1 className={styles.hint}>No errors yet.</Caption1>
) : ( ) : (
<div className={styles.errorList}> <div className={styles.errorList}>
{errorEntries.slice(0, 20).map((e) => ( {errorEntries.slice(0, 20).map((e) => (
+1 -1
View File
@@ -205,7 +205,7 @@ export function TerminalView(): React.JSX.Element {
<pre className={styles.log} ref={logRef}> <pre className={styles.log} ref={logRef}>
{lines.length === 0 ? ( {lines.length === 0 ? (
<span className={styles.empty}>Output will appear here.</span> <span className={styles.empty}>No output yet.</span>
) : ( ) : (
lines.map((l) => ( lines.map((l) => (
<div key={l.id} className={lineClass(l.kind)}> <div key={l.id} className={lineClass(l.kind)}>