Summary
A batch of small, verified usability/a11y fixes that are each tiny but add up to most of the remaining friction.
Items (all verified 2026-09-20)
- Truncate without
title — content clipped with no way to read it in place:
dashboard/+page.svelte:319 (post caption), :345 (schedule caption), media/+page.svelte:363 (filename)
- Sortable
<th> not keyboard accessible — lib/components/DataTable.svelte:124-132: <th onclick> without tabindex/onkeydown/aria-sort. (Rows are done right: role=button + tabindex + Enter/Space + inner-control guard.)
- Mobile sidebar drawer: no Escape-to-close, no body scroll lock —
admin/+layout.svelte (hamburger/backdrop exist; MediaLightbox already implements both correctly — copy that pattern).
- Nav icon duplication — Comments and Mentions both use
MessageSquare (+layout.svelte:91-92) → switch Mentions to AtSign.
- Emoji in chrome —
🕒 in sidebar footer (+layout.svelte:167) is the only emoji in an otherwise Lucide-icon UI → <Clock>.
- Raw backend error strings in toasts — pattern
toast(e.message || 'Fallback', 'error') surfaces raw API errors; normalize to human copy (+ error code) with the detail kept for console.
- Dead code — account switcher state/handler/CSS never rendered (
+layout.svelte:28-43, 194-214, localStorage 'titen.activeAccount' unused elsewhere); StatSkeleton unused label prop + invalid h-2.4 class (h-2.4 is not a Tailwind step → dropped, no height).
Fix
See items; each is ≤ 10 lines.
Acceptance criteria
Source: Titen UX audit 2026-09-20 (findings M4, M5, M6, L1-L4).
Summary
A batch of small, verified usability/a11y fixes that are each tiny but add up to most of the remaining friction.
Items (all verified 2026-09-20)
title— content clipped with no way to read it in place:dashboard/+page.svelte:319(post caption),:345(schedule caption),media/+page.svelte:363(filename)<th>not keyboard accessible —lib/components/DataTable.svelte:124-132:<th onclick>withouttabindex/onkeydown/aria-sort. (Rows are done right: role=button + tabindex + Enter/Space + inner-control guard.)admin/+layout.svelte(hamburger/backdrop exist; MediaLightbox already implements both correctly — copy that pattern).MessageSquare(+layout.svelte:91-92) → switch Mentions toAtSign.🕒in sidebar footer (+layout.svelte:167) is the only emoji in an otherwise Lucide-icon UI →<Clock>.toast(e.message || 'Fallback', 'error')surfaces raw API errors; normalize to human copy (+ error code) with the detail kept for console.+layout.svelte:28-43, 194-214,localStorage 'titen.activeAccount'unused elsewhere);StatSkeletonunusedlabelprop + invalidh-2.4class (h-2.4is not a Tailwind step → dropped, no height).Fix
See items; each is ≤ 10 lines.
Acceptance criteria
title={...}.aria-sortreflects state.AtSign; no emoji in chrome.Source: Titen UX audit 2026-09-20 (findings M4, M5, M6, L1-L4).