Skip to content

fix(web): UX audit remediation #270-#277 — a11y toasts, HITL approve guard, token/legacy cleanup, design docs - #278

Merged
ajianaz merged 10 commits into
developfrom
feat/ux-audit-270-277
Sep 20, 2026
Merged

ajianaz merged 10 commits into
developfrom
feat/ux-audit-270-277

Conversation

@ajianaz

@ajianaz ajianaz commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

Summary

Full remediation of the 2026-09-20 UX/UI code audit (scope: web/), tracked across #270-#277. Two HIGH findings (a11y-silent toasts, unguarded HITL approve), all MEDIUM findings (token leaks, dual styling system, inconsistent states, truncate titles, sort a11y, mobile drawer), all LOW findings (icons, dead code, deps), plus the formal design-token spec and component standards docs.

Issue → Commit Map

Issue Fix Commit
#272 tokens/phantom + square avatar define --color-bg-subtle/--color-accent-subtle, radius-pill on avatars, strip all hex fallbacks d78fa1f
#270 toast a11y live region container, role=alert errors, per-type icons 1eb81c4
#271 HITL approve guard two-stage approve (arm → "Confirm?" 3s, aria-pressed), both views f37be3d
#275 polish batch title on truncates, button-in-th sort + aria-sort, drawer Escape + scroll lock, AtSign/Clock icons, dead switcher removed, StatSkeleton fixed 34f5e04, 93518f1
#274 loading/empty consistency calendar skeleton grid, DataTable uses shared EmptyState a1f88cf
#273 retire legacy layer ScheduleDetail/PostDetail → Button, delete .btn-* layer (−135 lines), .text-sm collision resolved, !important dropped f562c8a
#277 design docs web/design/TOKENS.md + web/design/COMPONENT-STANDARDS.md + README rewrite 86b5019
#276 deps remove svelte-sonner, vaul-svelte, embla-carousel-svelte, formsnap, sveltekit-superforms d4c75e4

Verification

  • npx svelte-check --threshold error → 0 errors (36 pre-existing warnings, unchanged)
  • bun run build → exit 0, artifacts complete
  • AC greps (all on branch): fallback-hex var(--x, #…) = 0 · legacy .btn-* in markup = 0 · emoji in chrome = 0 · bare "Loading" text = 0 · toast live-region + alert roles present
  • Behavior notes: reject flow untouched; approve now requires a second click within 3s; dialogs/scroll-lock pattern copied from the existing MediaLightbox implementation.

Out of scope (noted in issues)

ajianaz added 9 commits September 20, 2026 22:24
…hex fallbacks

- define --color-bg-subtle and --color-accent-subtle in @theme (#272)
- account avatar: var(--radius-full) was undefined (square avatars) -> var(--radius-pill)
- strip dormant hex fallbacks from var() in schedules/ScheduleDetail/PostDetail/ConfirmDialog (#272)
…270)

- container role=status aria-live=polite; error toasts role=alert
- success/error/info icons give a non-color cue (WCAG 1.4.1)
Single mis-click no longer approves; button flips to 'Confirm?' for 3s
with aria-pressed + consequence copy in title. Both table and card views.
…275)

- truncate sites get title attr (dashboard captions, media filename)
- DataTable sortable th: native button inside th + aria-sort; rows unchanged
…witcher removed (#275)

- Escape closes mobile drawer; body scroll locked while open
- Mentions nav icon -> AtSign (was duplicate of Comments)
- sidebar footer clock emoji -> Lucide Clock
- remove never-rendered account-switcher state/handler/CSS
- StatSkeleton: drop unused label prop, fix invalid h-2.4 class
…le (#274)

- calendar grid renders 35-cell skeleton while loading (no bare text)
- DataTable empty branch uses the shared EmptyState component
)

- ScheduleDetail/PostDetail footer buttons migrated to Button variants
- delete .btn-primary/.btn-outline (0 usage) + admin .btn-* variants
- drop redundant unlayered .text-sm (Tailwind emits it from @theme)
- remove !important from .detail-dialog (unlayered CSS wins anyway)
- web/design/TOKENS.md: layer map, OKLCH recipe, rules, shadcn mapping
- web/design/COMPONENT-STANDARDS.md: canonical components + contracts
- rewrite web/README.md (was sv template boilerplate), link both docs
svelte-sonner, vaul-svelte, embla-carousel-svelte, formsnap,
sveltekit-superforms — zero imports in web/src. Build + svelte-check clean.
@github-actions

github-actions Bot commented Sep 20, 2026 •

Copy link
Copy Markdown

🔍 Cora AI Code Review

✅ No issues found. Code looks good!


Review powered by cora-code · BYOK · MIT

Fixes RUSTSEC-2026-0285 (rustls TLS 1.3 handshake cross-boundary issue)
and clears the chacha20 yanked warning. rsa RUSTSEC-2023-0071 remains
(no fix available, allowlisted in security.yml).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant