WS4 premium minimalism: error states that act, teaching empty state, design tokens#1494
Merged
Conversation
…design tokens Visual/UX polish from docs/TRANSCRIPTED_PREMIUM_PRD.md WS4. Additive and backward-compatible; no perf/latency budget touched (separate thread owns that). Error states that act (WS4.3) - New Foundation-pure AgentSetupFailureCopy + SettingsActionFailureCopy hold plain-words failure copy (no jargon, no exclamation marks). Every fixed failure now reads "what happened" in plain words, keeps its existing control as the retry, and tucks the raw error behind a "Copy Details" reveal instead of dumping error.localizedDescription into a user-facing label. - Fixed the 9 highest-visibility raw-error offenders from the audit: the Agent page (connect row, Codex inbox, all four live-meeting setup paths), the first-run onboarding Claude Desktop connect card, and five Settings status lines (beta sidecar, local-summary prep, model-cache cleanup ×3, launch-at-login, capture-library migration). Empty state that teaches (WS4.5) - The Speakers "All speakers" empty state was a bare gray caption; it now teaches what fills the screen and offers a real next action (Start a meeting), reusing the Home teaching-empty-state pattern. Search-no-match keeps its plain caption. Design tokens (WS4.4) - New docs/DESIGN_TOKENS.md is the single source for the type scale (6-step SF Pro), spacing grid, and corner-radius set, grounded in the app's most-common existing values. MenuTokens now owns the menubar's type roles (MenuTokens.Font) and the menubar rows/header read fonts from there instead of raw NSFont literals — the reference adoption that sets the pattern for the SwiftUI surfaces to follow. Verification - New UIAutomationSurfaceContract guards pin all of the above (teaching empty state present, zero raw error.localizedDescription on the hardened surfaces, tokens are the single source). Full app build, full fast suite (12755 tests), and the duplicate-declaration hygiene check all pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Visual/UX polish from
docs/TRANSCRIPTED_PREMIUM_PRD.mdWS4 (Premium minimalism) — making the app feel like a $99 tool, not a project. Additive and backward-compatible. Perf/latency budget untouched (a separate thread owns WS4.2).An audit found the app is already ~80% premium: the gold-standard patterns exist (
MeetingFailureCopy,HomeListEmptyState,HomeActionFailureCopy). This PR closes the concentrated gaps and pins them so they can't regress.What changed
WS4.3 — Error states that act (the spine)
No user-facing surface dumps a raw
error.localizedDescriptionanymore. Two new Foundation-pure copy primitives (AgentSetupFailureCopy,SettingsActionFailureCopy) hold plain-words messages; each failure keeps its existing control as the retry and tucks the raw error behind a Copy Details reveal.Label(error.localizedDescription)(e.g. "The file couldn't be opened because you don't have permission…")<raw NSError>"<raw NSError>"WS4.5 — Empty state that teaches
The Speakers All speakers empty state was a bare gray caption ("No speakers yet. After your next meeting, the people in it will appear here."). It now teaches what will fill the screen and offers a real next action, reusing the Home teaching-empty-state pattern:
Search-no-match keeps its plain caption (correct there). Home's meeting/dictation empty states were already teaching and were left as-is.
WS4.4 — Design tokens
docs/DESIGN_TOKENS.mdis the new single source: a 6-step SF Pro type scale, a 4pt spacing grid, and a 4-value corner-radius set — each grounded in the app's most-common existing values (so adoption is snap-to-grid, not a redesign; the app carried ~21 ad-hoc font sizes, 12 radii, ~26 padding values).MenuTokens.Fontnow owns the menubar's type roles; the menubar rows and header read fonts from there instead of rawNSFont.systemFont(ofSize:)literals. This is the reference adoption that sets the pattern; the exact current sizes were preserved, so there's no menubar pixel change — the win is centralization. SwiftUI surfaces (Home, Settings) are intentionally left for incremental follow-up per the doc.Verification
build.sh --no-open) — build complete, launch smoke + performance budget passrun-tests.sh) — 12755 tests, 0 failedUIAutomationSurfaceContractguards (3 suites) pin the new state: teaching empty state present + old caption gone; zero rawerror.localizedDescriptionon the hardened surfaces (Agent page, onboarding, Settings); tokens are the single source. Existing 229 contract assertions still green (287 total now).Still needs local human visual sign-off on
I did the code-level work and proved it via automated build + contracts + full suite. The subjective "does it actually feel premium" pass is yours:
Deferred (documented, not done)
GeneralDisclosureRowand reparent Show in Dock, Confirm meeting quits, Auto-detect calls, Missed-call reminders behind it (reuses the existingGeneralDisclosureRow/GeneralExpandedContent; keeps the contract-pinned identifiers in source), taking the General top group from ~13 at-rest rows toward the ≤7 target. Deferred because it's a whole-page relayout and an information-architecture judgment (is "Show in Dock" really advanced?) that wants your product call + visual sign-off — better as its own focused PR than bundled with this verified polish.🤖 Generated with Claude Code