git:20260706.6b68bd8 to git:20260713.b02765b

345 added, 507 removed. Audit A to A.

- # Mobile Design Language
-
- Version 2.0 - Calm Intelligence for Mobile
-
- This document defines the visual and interaction standards for the mobile application. It is intentionally product-domain neutral: the rules describe structure, behavior, tone, and implementation quality, not business features.
-
- The system is aligned with the broader XOPC design direction: quiet surfaces, precise hierarchy, restrained color, and intelligence expressed through useful state rather than decoration.
-
- ---
+ # XOPC Mobile Design System
- ## 01. Design Philosophy
+ Version 3.0 — Quiet Momentum
- The mobile interface should feel calm, fast, and capable in the hand. It should reduce cognitive load, keep decisions visible, and make repeated use feel stable over long sessions.
+ Status: target design direction. This document is the source of truth for mobile product, interaction, visual design, and the staged implementation work. It supersedes the former “Calm Intelligence” guidance where the two conflict.
- Core principles:
+ ## 1. Product intent
- - **Content leads.** Navigation, chrome, and controls support the task without competing for attention.
- - **Signals are rare.** Color, motion, haptics, and elevation are reserved for meaning.
- - **One hand matters.** Primary actions should sit in reachable zones and remain usable with a thumb.
- - **State is explicit.** Loading, success, error, selection, sync, and disabled states must be visible and understandable.
- - **Patterns repeat.** Similar objects should behave the same way across screens.
- - **Intelligence is embedded.** Assisted behavior should feel operational, not performative.
+ XOPC is a private workspace in a person’s pocket: a place to capture a thought, recover context, direct an agent, and see what needs attention. It must feel composed and personal rather than like a remote admin console or a generic chat clone.
- Avoid:
+ The intended feeling is **quiet momentum**:
- - Decorative gradients as application backgrounds.
- - Large empty marketing-style hero sections inside the app shell.
- - Playful, toy-like, gamified, neon, cyberpunk, or magical visual language.
- - Competing accent colors.
- - Hidden gestures without visible affordances or onboarding.
- - Feature-specific interaction inventions when a shared primitive exists.
+ - Quiet enough that notes, conversations, and decisions remain the focus.
+ - Warm enough to feel alive and owned, not monochrome or sterile.
+ - Precise enough to make gateway, sync, automation, and AI state trustworthy.
+ - Fast enough that capture and asking an agent feel immediate.
- ---
+ “Premium” does not mean more decoration. It means better hierarchy, intentional materials, exact spacing, tactile feedback, excellent empty states, and fewer competing visual treatments.
- ## 02. Mobile Experience Standard
+ ### 1.1 Design principles
- The application should feel like a top-tier native mobile tool:
+ The system takes Apple’s current HIG principles of hierarchy, harmony, consistency, simplicity, and craft as operating criteria, while retaining XOPC’s own identity. See [Apple HIG](https://developer.apple.com/design/human-interface-guidelines/), [Designing for iOS](https://developer.apple.com/design/human-interface-guidelines/designing-for-ios), [Materials](https://developer.apple.com/design/human-interface-guidelines/materials), and [Accessibility](https://developer.apple.com/design/human-interface-guidelines/accessibility).
- - Immediate touch response.
- - Clear visual feedback after every action.
- - Predictable navigation and gesture behavior.
- - Stable layout during loading, keyboard changes, and list updates.
- - Accessible contrast, hit targets, typography, and reduced-motion behavior.
- - Clean light and dark themes with equivalent hierarchy.
- - No visible overlap, clipping, jumpy resizing, or crowded text.
+ 1. **Content owns the canvas.** Chrome frames work; it never becomes the work.
+ 2. **One dominant action.** Each screen exposes one obvious next step. Secondary actions are contextual, not permanently visible.
+ 3. **Hierarchy, not density.** Use title scale, grouping, alignment, and whitespace before adding containers, color, or icons.
+ 4. **Material communicates location.** Floating navigation, input, and transient controls may use a restrained material; document and reading surfaces stay solid and stable.
+ 5. **Energy follows meaning.** Accent color, animation, and haptics appear for capture, direct action, progress, success, and attention — never merely to fill a surface.
+ 6. **Native expectations win.** Back, swipe, pull to refresh, menus, sheets, Dynamic Type, and safe areas work as iOS users expect.
+ 7. **Progressive disclosure protects focus.** A user sees the current task first, then options when needed.
+ 8. **Every state has a shape.** Loading, offline, selected, saving, queued, failed, and completed states are clear without relying only on color.
- Every screen should answer:
+ ### 1.2 Non-goals
- 1. Where am I?
- 2. What is the current state?
- 3. What can I do next?
- 4. What changed after I acted?
+ - Do not imitate Apple Notes or ChatGPT pixel-for-pixel.
+ - Do not use a gradient page background, glass-card grids, neon AI effects, illustration-led empty states, or decorative status colors.
+ - Do not make every control a pill, every object a card, or every list item elevated.
+ - Do not add a permanent bottom tab bar merely to resemble a consumer app. XOPC’s home workspace and focused overlays are deliberate; navigation must earn persistent chrome.
+ - Do not use AI sparkle imagery or a second brand accent as a substitute for useful product feedback.
- ---
+ ## 2. Product model and information architecture
- ## 03. Visual Personality
+ The current application has a single workspace landing surface and task routes for Inbox, Notes, Sessions, Chat, Files, Agents, Automations, Sharing, and Settings. This model is sound, but the home currently presents too many equally weighted sections and every collection uses a similar card treatment.
- The interface should feel:
+ The target model has four modes. A person should always know which mode they are in.
- - Calm
- - Precise
- - Trustworthy
- - Systematic
- - Modern
- - Light in chrome, strong in structure
+ | Mode | Purpose | Primary surface | Primary action | Entry / exit |
+ |---|---|---|---|---|
+ | **Workspace** | Resume the most useful work | Home | Ask AI or capture | Root; return with a direct home action |
+ | **Capture** | Save without interrupting the moment | Inbox composer / capture sheet | Save | Bottom capture control; dismiss returns to context |
+ | **Library** | Find and organize durable material | Inbox, Notes, Sessions, Files | Open or filter | Home shortcuts and search; back returns to prior context |
+ | **Focus** | Read, edit, converse, or run a task | Note, Chat, Automation detail | Contextual to the task | Push or workspace overlay; back preserves context |
- It should not feel:
+ ### 2.1 Workspace home
- - Loud
- - Decorative
- - Casual to the point of imprecision
- - Like a single-purpose messaging product
- - Like a generic Material skin
- - Like a desktop layout compressed onto a phone
+ The home is a **briefing**, not a dashboard or app launcher.
- Reference quality: a native productivity surface with the restraint of Apple system apps, the density discipline of high-end professional tools, and the clarity expected from a modern assistant interface.
+ Order its content by actionability:
- ---
+ 1. A quiet greeting/context line and a compact connection indicator only when it changes what a person can do.
+ 2. **Continue**: one to three most relevant items. It is the visual anchor, not a full recent-activity feed.
+ 3. **Needs attention**: show only items requiring an action. Hide the section entirely when empty.
+ 4. **Ask an agent**: a horizontally scrolling roster with recognisable avatars and names; selecting one begins a focused conversation.
+ 5. **Library**: one compact grouped navigation list, not five independent feature buttons.
- ## 04. Color System
+ Home rules:
- Use semantic tokens from `src/theme/tokens.ts`. Components must consume colors through `useTheme()` or mapped theme APIs. Do not hardcode colors in application components except for token-derived transparency values.
+ - Keep the first actionable content within one viewport below the header on a regular iPhone.
+ - Show a gateway banner only for unavailable, starting, or degraded conditions. A healthy connection is a quiet dot/status in the header or context line, never a persistent card.
+ - “Continue” uses one featured surface plus plain rows when more than one item is needed; it must not become a grid of cards.
+ - A section title uses a small, quiet trailing action only when it leads to a useful complete collection.
+ - The create note action and Ask AI must not compete. The current centered circular button becomes part of a unified bottom action dock described below.
- Target color balance:
+ ### 2.2 Capture and Inbox
- - 90-95% neutral surfaces and text.
- - 5-10% signal color.
- - Semantic colors only for status, risk, or destructive meaning.
+ Inbox is a temporal landing zone, not an unstructured second Notes list.
- ### 4.1 Surface Roles
+ - The bottom composer is always the strongest capture affordance. It opens as a single line, grows only while typing, and gives direct attachment, voice, and send feedback.
+ - A compact count/summary can appear above the list only when it helps triage (for example, “6 unreviewed”). It must not duplicate each row’s state.
+ - AI organize is a contextual toolbar action. The sheet previews the outcome in plain language and supports undo; it never presents speculative AI as fact.
+ - Archive is the primary completion action in row swipe. Delete is deliberately farther away and always reversible through undo where possible.
- | Token | Light | Dark | Use |
- |---|---:|---:|---|
- | `surface.base` | `#FFFFFF` | `#0A0A0A` | App background and grouped screen base |
- | `surface.panel` | `#FAFAFA` | `#121212` | Cards, sheets, menus, elevated content |
- | `surface.input` | `#FAFAFA` | `#1A1A1A` | Inputs, composers, editable containers |
- | `surface.hover` | `#F4F6FF` | `#1A1A1A` | Pressed and hover feedback |
- | `surface.active` | `#EEF2FF` | `#202020` | Active selection and strong focus surfaces |
+ ### 2.3 Notes and Library
- Surface rules:
+ Notes is a reading-first library. It should borrow Apple Notes’ scanability, not its exact visual treatment.
- - Prefer layered surfaces plus borders over heavy shadows.
- - In light mode, do not place important white content on a pure white background without a border or spacing boundary.
- - In dark mode, separate surfaces with tone and border, not bright outlines.
- - Avoid transparent blur as a default container treatment. Use it only when it improves spatial continuity and remains legible.
+ - Use a large page title at rest, collapsing to a compact title while scrolling.
+ - Search is an inline, native-feeling field below the title, not a title-pill replacement. It appears on request and keeps focus stable.
+ - Tags and kind filters are horizontally scrollable text-first controls. One selected filter may use a soft accent fill; unselected filters stay quiet.
+ - A standard note row carries title, one preview line, and one trailing metadata line. Tags appear only when they materially aid retrieval; show at most two. Avoid a chip cloud in every row.
+ - Pin and task state use a small leading/trailing symbol, not a second visual container.
+ - The empty state offers “Create note” or “Capture something” with an example prompt, not a large illustration.
- ### 4.2 Text Roles
+ ### 2.4 Sessions and Chat
- | Token | Light | Dark | Use |
- |---|---:|---:|---|
- | `text.primary` | `#111111` | `#F5F5F5` | Titles, body text, primary controls |
- | `text.secondary` | `#666666` | `#A1A1A1` | Secondary labels, inactive icons |
- | `text.tertiary` | `#999999` | `#666666` | Metadata, placeholders, quiet helper text |
- | `text.disabled` | `#B7B7B7` | `#4F4F4F` | Disabled content |
- | `text.inverse` | `#FFFFFF` | `#000000` | Text on filled accent controls |
+ Chat is a **focus mode**, closer to a calm writing surface than a messaging feed.
- Text rules:
+ - The header contains back, the session name, and at most one visible high-value action. Agent, model, and gateway context live in a compact contextual menu/sheet rather than a cluster of permanent controls.
+ - Conversation content uses a single readable column. User input has a quiet tinted surface; assistant output is primarily unboxed text with separation by spacing and a subtle provenance label when required.
+ - Tool activity, thinking, goals, and artifacts are progressively disclosed. Default to a one-line live status and let people expand details; never make the transcript a stack of status cards.
+ - The composer is a raised bottom material with a solid editable interior. It is visibly connected to the conversation through a soft shadow and top border, not a large opaque panel.
+ - Suggested follow-ups appear after a completed answer, as 1–3 text actions, and disappear once the person types. They must not push the composer off screen.
+ - Streaming uses a restrained breathing status or subtle line reveal, not animated dots that compete with content.
- - Use weight and size before using color.
- - Do not use low-contrast tertiary text for essential information.
- - Placeholders are not labels. Inputs need visible context when ambiguity is possible.
+ ### 2.5 Settings and operational screens
- ### 4.3 Border Roles
+ Settings should feel like an iOS settings list: grouped, legible, and calm.
- | Token | Light | Dark | Use |
- |---|---:|---:|---|
- | `border.subtle` | `#F1F1F1` | `#1A1A1A` | Internal dividers and low-emphasis separation |
- | `border.default` | `#ECECEC` | `#222222` | Cards, panels, inputs, floating elements |
- | `border.strong` | `#D8DCE8` | `#333333` | Focused containers and important boundaries |
+ - Use system-like grouped sections on a page base; section labels are small and spaced, not framed.
+ - Rows have a 52–56pt minimum visual height, one leading symbol treatment, primary label, optional short value, and a familiar trailing affordance.
+ - Connection status is a concise summary row. Detailed logs, route choice, tunnel diagnostics, and QR pairing belong one level deeper.
+ - Automation, agent, gateway, and sharing screens use the same list and detail grammar. Operational data earns denser layout only after a person chooses to inspect it.
- Border rules:
+ ## 3. Navigation and containment
- - Use `StyleSheet.hairlineWidth` for dividers.
- - Use a 1px equivalent for cards, inputs, floating bars, sheets, and menus.
- - Do not use thick borders as decoration.
+ ### 3.1 Header hierarchy
- ### 4.4 Accent and Semantic Roles
+ Replace the universal “three circular controls plus a central pill” header with two native header modes.
- | Token | Light | Dark | Use |
- |---|---:|---:|---|
- | `accent.primary` | `#3A6BFF` | `#3A6BFF` | Primary direction, selected state, main action |
- | `accent.primaryHover` | `#2F55D6` | `#6F91FF` | Hover, pressed, or elevated accent state |
- | `accent.selectionBg` | `rgba(58,107,255,0.10)` | `rgba(58,107,255,0.18)` | Selection backgrounds |
- | `accent.soft` | `#EEF2FF` | `#151A2B` | Quiet accent panels and focused surfaces |
+ | Header | Use | Structure |
+ |---|---|---|
+ | **Large title** | Library roots, settings, home at rest | Safe-area top, optional leading brand/context, title aligned to the content grid, 0–2 trailing icon actions |
+ | **Compact title** | Scroll-collapsed roots and focus/detail screens | Standard 44pt control area, back where appropriate, centered or leading title based on platform convention, 0–1 trailing action |
- | Semantic | Light | Dark | Use |
- |---|---:|---:|---|
- | `success` | `#2CCB7F` | `#2CCB7F` | Completed, healthy, available |
- | `warning` | `#FFB84D` | `#FFB84D` | Attention, uncertainty, review needed |
- | `error` | `#FF5D5D` | `#FF5D5D` | Error and destructive context |
- | `errorBold` | `#E5484D` | `#FF6B6B` | Strong destructive emphasis |
- | `info` | `#3A6BFF` | `#6F91FF` | Informational state |
+ Rules:
- Accent rules:
+ - Header controls are 44 × 44pt hit targets; their visible glyphs remain 20–22pt.
+ - The content grid starts at 20pt on iPhone (16pt only for dense lists or very narrow widths). Header and body share the same leading alignment.
+ - Do not give every header control a filled circular background. Use a bare glyph by default; apply a material circle only when it floats over scrolling or visual content.
+ - The XOPC mark appears on the workspace root and onboarding, not in every pushed screen.
+ - Search is a field in content context, never a decorative replacement for screen identity.
- - Blue is the primary direction and focus signal.
- - Secondary intelligence accents may appear only where a distinct assisted state is required. They must not become a second general brand color.
- - Destructive actions must use semantic error, not accent blue.
- - Success, warning, error, and info colors must not be used as decorative category colors.
+ ### 3.2 Presentations
- ---
+ | Containment | Use | Behavior |
+ |---|---|---|
+ | Push | Read, edit, inspect, or a task with history | Forward movement; standard back gesture; preserve draft state |
+ | Workspace overlay | Ask AI from Home | Home remains perceptibly behind the task; drag/down or explicit close returns to the same scroll position |
+ | Bottom sheet | Agent/model picker, capture source, filters, short choices | Clear grabber, title, grouped options, swipe-to-dismiss where safe |
+ | Dialog | Confirm an irreversible or blocking decision | One concise consequence, safe action, destructive action only when needed |
+ | Full-screen modal | Pair gateway, long form, scanner, complex configuration | Clear cancel/done affordance; never hide unsaved changes silently |
- ## 05. Typography
+ ### 3.3 Bottom action dock
- Use the platform system font stack:
+ The app may use a floating lower control area, but only one system may own that space per screen.
- - iOS: SF Pro Text / SF Pro Display.
- - Android: Roboto.
- - Code or fixed-width content: platform monospace.
+ - **Home:** a small raised dock contains `Capture` and `Ask AI`. Capture is the primary direct action; Ask AI is a text-labeled secondary action. On compact widths, use a primary circular Capture button with an adjacent unobtrusive Ask control, never two matching circular FABs.
+ - **Inbox:** the capture composer owns the dock.
+ - **Chat:** the message composer owns the dock.
+ - **Lists:** use a trailing `+` or compose action in the header/content; do not overlay an unrelated central FAB.
+ - **Selection mode:** the batch action bar replaces the normal dock. It has a visible selected count and safe-area-aware background.
- Use tokenized type from `tokens.typography`.
+ ## 4. Visual foundation
- | Token | Size | Line Height | Weight | Use |
- |---|---:|---:|---:|---|
- | `display` | 30 | 36 | 600 | Empty states and rare major moments |
- | `title` | 20 | 28 | 600 | Screen titles and modal titles |
- | `heading` | 17 | 24 | 600 | Section and card headings |
- | `body` | 15 | 22 | 400 | Main reading text |
- | `ui` | 14 | 20 | 500 | Buttons, controls, inputs, row labels |
- | `label` | 13 | 18 | 400 | Secondary labels |
- | `caption` | 12 | 17 | 400 | Metadata and timestamps |
- | `micro` | 11 | 14 | 500 | Badges and compact annotations |
+ ### 4.1 Color philosophy
- Typography rules:
+ The color system is neutral-led with a distinctive, softened indigo primary. Blue should direct attention, not paint the interface. A warm paper base in light mode and a blue-black base in dark mode add character without turning either mode into a theme effect.
- - Do not scale font size from viewport width.
- - Keep letter spacing at `0` unless a native component requires a platform default.
- - Use `600` for emphasis. Reserve `700+` for rare numeric or status emphasis.
- - Body copy should use comfortable line height. Control labels should stay compact.
- - Multi-line text must wrap cleanly and never overlap adjacent controls.
- - Titles should be short. If a title needs explanation, use supporting text below it.
+ Target balance: 82–88% neutral surface/text, 8–12% accent-supporting tints, 2–5% semantic signal. Actual screens should not use all colors merely because tokens exist.
- ---
+ The implementation remains semantic: components consume `useTheme()` / `src/theme/tokens.ts`; no component hardcodes hex values. The token table below is the approved v3 target for a later token migration.
- ## 06. Spacing and Layout
+ | Role | Light | Dark | Use |
+ |---|---:|---:|---|
+ | `surface.base` | `#F7F7F5` | `#101113` | Page canvas; warm light paper / quiet graphite |
+ | `surface.grouped` | `#EFEFED` | `#17181B` | Grouped list background, secondary regions |
+ | `surface.panel` | `#FFFFFF` | `#1B1C20` | Reading panel, sheet, elevated object |
+ | `surface.elevated` | `#FFFFFF` | `#24262C` | Dock, floating control, popover |
+ | `surface.input` | `#EEF0F4` | `#23252B` | Search, composer interior, editable field |
+ | `surface.pressed` | `#E8E9E8` | `#2B2D33` | Press feedback |
+ | `surface.selected` | `#E8EDFF` | `#263250` | Selected row or active filter |
+ | `text.primary` | `#17181C` | `#F5F5F7` | Essential reading and titles |
+ | `text.secondary` | `#63656E` | `#A8AAB4` | Supporting copy, standard glyphs |
+ | `text.tertiary` | `#8E9099` | `#777982` | Nonessential metadata only |
+ | `border.subtle` | `#E7E7E5` | `#292A2F` | Internal divider |
+ | `border.default` | `#DCDDDF` | `#36373E` | Input, raised surface, selected boundary |
+ | `accent.primary` | `#4B63D9` | `#91A4FF` | Main action, selected state, links |
+ | `accent.pressed` | `#3D52B8` | `#B5C2FF` | Pressed primary action |
+ | `accent.soft` | `#EEF1FF` | `#202944` | AI hint, quiet selected context |
+ | `semantic.success` | `#27845A` | `#56C58D` | Complete, healthy, available |
+ | `semantic.warning` | `#B66A15` | `#F0AD4E` | Needs review, uncertain, degraded |
+ | `semantic.error` | `#C83C45` | `#FF7A82` | Failure and destructive action |
+ | `semantic.info` | `#4B63D9` | `#91A4FF` | Informational state, not decoration |
+ | `overlay.scrim` | `rgba(19, 20, 24, 0.28)` | `rgba(0, 0, 0, 0.52)` | Modal containment |
- Use the 8pt spacing scale from `tokens.spacing`.
+ Rules:
- | Token | Value | Use |
- |---|---:|---|
- | `xxs` | 2 | Optical adjustment only |
- | `xs` | 4 | Tight icon/text gaps |
- | `sm` | 8 | Compact internal gaps |
- | `md` | 12 | Row padding and control groups |
- | `lg` | 16 | Default screen horizontal padding |
- | `xl` | 24 | Section separation |
- | `xxl` | 32 | Large vertical breaks |
- | `xxxl` | 48 | Empty-state and focus spacing |
+ - There is one brand direction: indigo. Do not introduce a general-purpose purple, teal, or gradient “AI” accent.
+ - Status colors never classify notes, agents, or chat messages. Use iconography or neutral grouping for categories.
+ - A subtle warm surface difference in light mode is intentional; do not flatten it to white.
+ - Dark mode is not inverse light mode. Preserve luminance steps, reduce border contrast, and avoid pure black panels.
+ - Material is a depth tool, not a color effect. Respect reduced transparency / increase contrast settings; always supply a solid fallback.
- Mobile layout rules:
+ ### 4.2 Typography
- - Default horizontal screen padding is `16`.
- - Lists and scroll content must reserve bottom space for floating controls and safe area.
- - Primary controls should sit in reachable lower zones when context allows.
- - Do not place persistent primary input at the top of a phone screen unless the screen is specifically search-first.
- - Avoid desktop-style side-by-side layouts on compact widths.
- - Use stable dimensions for toolbars, icon buttons, rows, checkboxes, counters, and fixed-format tiles so state changes do not shift layout.
- - On tablets and wide web, increase content width intentionally. Do not simply stretch phone rows edge to edge.
+ Use the platform system typeface: SF Pro on iOS, Roboto on Android, and the system monospace face for code. The application uses Dynamic Type / font scale, never viewport-derived type scaling.
- Recommended mobile shell:
+ | Token | Size / line height | Weight | Use |
+ |---|---:|---:|---|
+ | `display` | 34 / 41 | 700 | Home moment, empty-state title; rare |
+ | `largeTitle` | 28 / 34 | 700 | Library roots, settings, page identity |
+ | `title` | 22 / 28 | 700 | Detail title, sheet title |
+ | `heading` | 17 / 22 | 600 | Section title, important card title |
+ | `body` | 16 / 23 | 400 | Reading, message, note preview |
+ | `ui` | 15 / 20 | 500 | Rows, controls, composer |
+ | `label` | 13 / 18 | 500 | Section label, compact supporting text |
+ | `caption` | 12 / 16 | 400 | Noncritical timestamp or metadata |
+ | `micro` | 11 / 14 | 600 | Exceptional badge only |
- ```text
- Status bar
- Safe-area top
- Header / navigation area
- Scrollable or fixed content
- Floating action / composer / batch area
- Safe-area bottom
- ```
+ Rules:
- ---
+ - Prefer an increase in type weight or placement before a change in color.
+ - `micro` is not a substitute for concise language. Never put essential information at 11pt.
+ - Use `largeTitle` only at an actual top-level destination. Collapse it as the content scrolls; do not stack it with another framed header title.
+ - Long text, code, filenames, and URLs wrap or truncate deliberately; controls must never overlap them.
+ - Use sentence case and concise verbs. User-facing text must use the i18n catalog.
- ## 07. Shape and Radius
+ ### 4.3 Spacing, layout, and shape
- Use `tokens.radii`.
+ Use an 4pt base grid with deliberately larger content breaks. Small gaps create rhythm; large gaps create hierarchy.
| Token | Value | Use |
|---|---:|---|
- | `sm` | 6 | Small badges and compact tags |
- | `md` | 10 | Chips and compact row elements |
- | `lg` | 14 | Cards and dialogs |
- | `xl` | 18 | Panels, sheets, larger cards |
- | `xxl` | 22 | Buttons, inputs, composers |
- | `full` | 9999 | Pills, avatars, circular controls |
+ | `xxs` | 2 | Optical correction only |
+ | `xs` | 4 | Glyph / text adjacency |
+ | `sm` | 8 | Compact internal relationship |
+ | `md` | 12 | Row padding, control group |
+ | `lg` | 16 | Dense list horizontal inset |
+ | `xl` | 20 | Default iPhone content inset and card interior |
+ | `xxl` | 28 | Section separation |
+ | `xxxl` | 40 | Major screen / empty-state separation |
+ | `xxxxl` | 56 | Rare editorial break |
- Shape rules:
+ | Token | Value | Use |
+ |---|---:|---|
+ | `radius.sm` | 8 | Small tag, compact control |
+ | `radius.md` | 12 | Input, row icon background |
+ | `radius.lg` | 16 | Card, popover, normal sheet element |
+ | `radius.xl` | 22 | Composer, dock, large sheet |
+ | `radius.full` | 9999 | Avatar, circular icon button, limited pills |
- - Use radius to improve touch friendliness, not as decoration.
- - Icon-only circular controls should be visually round and have a minimum 44x44 hit target.
- - Cards should usually use `lg` or `xl`; avoid oversized card radius in dense lists.
- - Inputs and bottom controls may use `xxl` or `full` when the interaction benefits from a pill shape.
- - Do not nest cards inside cards. Use sections, dividers, spacing, or panels instead.
+ Rules:
- ---
+ - Default screen inset is 20pt. A plain high-density grouped list may use 16pt; a text reading surface may use 20–24pt.
+ - Do not create “empty space” by wrapping each row in an extra card. First use section spacing and dividers.
+ - Use radius to communicate containment and touchability, not a blanket visual style.
+ - A full-width card needs a reason: featured continuation, summary, temporary panel, or primary composer. Regular collection rows belong on the page or inside a grouped list.
+ - Avoid nested cards. A card’s interior uses spacing and hairline dividers to create substructure.
+ - A target must have at least a 44 × 44pt interactive hit area; 48pt is preferred for primary bottom controls.
- ## 08. Elevation and Depth
+ ### 4.4 Depth and material
- Depth should be quiet. Most hierarchy comes from surface tone, spacing, and borders.
+ Depth establishes a spatial relationship. It should be perceptible rather than ornamental.
- | Level | Treatment | Use |
+ | Level | Treatment | Allowed use |
|---|---|---|
- | Flat | No shadow, surface only | Page base and static groups |
- | Raised | 1px border, subtle shadow | Floating buttons, bottom bars, sticky controls |
- | Overlay | Stronger shadow, scrim if modal | Menus, sheets, dialogs |
+ | Base | Solid surface, no shadow | Page, reading canvas, standard rows |
+ | Grouped | Tone difference or hairline divider | Settings / library groups |
+ | Raised | Solid or adaptive material, 1px border, shadow 1 | Composer, dock, featured card |
+ | Overlay | Material/solid fallback, shadow 2, scrim | Sheet, dialog, menu |
- Default raised shadow:
+ Suggested light-mode shadows, implemented centrally rather than per component:
```ts
- {
- shadowColor: '#000',
- shadowOpacity: 0.06,
- shadowRadius: 4,
- shadowOffset: { width: 0, height: 2 },
- elevation: 2,
- }
+ raised: {
+ shadowColor: '#17181C',
+ shadowOpacity: 0.08,
+ shadowRadius: 14,
+ shadowOffset: { width: 0, height: 5 },
+ elevation: 3,
+ },
+ overlay: {
+ shadowColor: '#17181C',
+ shadowOpacity: 0.16,
+ shadowRadius: 28,
+ shadowOffset: { width: 0, height: 12 },
+ elevation: 8,
+ },
```
- Depth rules:
-
- - `shadowOpacity` should normally stay at or below `0.10`.
- - Modal overlays may use up to `0.15` when necessary.
- - Dark mode should rely more on borders and surface contrast than shadow.
- - Avoid stacked shadows from nested elevated components.
-
- ---
-
- ## 09. Navigation
-
- Navigation must feel native, boring, and reliable.
-
- Header rules:
-
- - Use a consistent header height and alignment within a navigation stack.
- - The back action appears in the expected platform location.
- - Screen titles should be concise and stable.
- - Header backgrounds should match the screen base unless scroll elevation is needed.
- - Header actions must be visible, minimum 44x44 hit target, and limited to high-value actions.
-
- Route and transition rules:
-
- - Forward navigation moves to detail or task focus.
- - Back returns to the previous context without losing unsaved input silently.
- - Modal presentation is reserved for short, interruptive, or contained tasks.
- - Destructive confirmation should not be presented as a full screen unless the consequence is complex.
-
- ---
-
- ## 10. Interaction Model
-
- Touch behavior must be consistent across the app.
-
- ### 10.1 Touch Targets
-
- - Minimum hit target: `44x44`.
- - Visual controls may be smaller only when transparent padding expands the hit area.
- - Rows should make the full row tappable when the row has one primary action.
- - Disabled controls remain visible but lower contrast and do not trigger haptics.
-
- ### 10.2 Press Feedback
-
- - Use `Pressable` for custom touch surfaces.
- - Pressed state should appear immediately through surface, opacity, scale, or highlight.
- - Avoid heavy opacity changes that make text hard to read.
- - Do not delay primary action feedback until a network request finishes.
-
- ### 10.3 Gestures
-
- Use gestures only when they are conventional or visibly taught.
-
- | Gesture | Meaning |
- |---|---|
- | Tap | Open, activate, or choose |
- | Long press | Enter selection mode for list rows |
- | Horizontal swipe | Fast reversible row action |
- | Pull to refresh | Reload current collection |
- | Drag handle | Reorder or resize only when visible |
-
- Gesture rules:
-
- - Do not assign different long-press meanings to equivalent row objects.
- - Use a 300ms long-press delay for list selection.
- - Put advanced row actions behind visible controls or detail surfaces, not hidden long-press menus.
- - Do not allow swipe actions while a list is in multi-select mode.
- - Destructive swipe actions need clear color, icon, label, and undo or confirmation depending on severity.
- - Gesture thresholds should be forgiving and consistent.
-
- ### 10.4 Selection
-
- Selection mode is a distinct app state.
-
- - Entry: long press or explicit select action.
- - Header: show selected count and a cancel/close action.
- - Rows: show visible selection controls.
- - Tap while selecting: toggle selection.
- - Bottom area: show batch actions instead of the normal persistent composer/action bar.
- - Exit: cancel, back, or completion of the batch action.
-
- ### 10.5 Haptics
-
- Haptics should confirm physical state changes, not decorate every tap.
-
- - Light impact: enter selection, successful quick action, toggle important state.
- - Warning or notification haptic: destructive confirmation or failed action.
- - No haptic: passive navigation, disabled taps, repeated list scrolling.
-
- Always respect platform availability and user settings.
-
- ---
-
- ## 11. Components and Primitives
-
- This section defines generic component standards. It intentionally avoids feature-specific components.
-
- ### 11.1 Rows and List Items
-
- Rows are the core mobile information unit.
-
- - Height should be content-driven but visually stable.
- - Primary text uses `body` or `ui`; metadata uses `caption` or `label`.
- - Leading icons, avatars, or checkboxes should align optically with the text block.
- - Trailing controls must not crowd the primary label.
- - Multi-line summaries should clamp where needed to preserve scan speed.
- - Swipe actions should use consistent circular buttons, icon plus accessible label, and semantic color.
+ - In dark mode, reduce shadow reliance and separate layers through surface luminance and borders.
+ - No more than one raised surface may overlap another in the normal viewport.
+ - Blur is allowed only for a floating dock, composer shell, compact scrolling header, or modal; it cannot reduce text contrast or hide a meaningful state.
- ### 11.2 Cards and Panels
+ ### 4.5 Icons and brand expression
- Cards group related content. Panels frame a temporary or elevated surface.
+ - Use one outlined icon family with rounded terminals. Keep standard actions at 20–22pt and metadata glyphs at 14–16pt.
+ - Use familiar system metaphors. Icons are never the only visible explanation of a non-obvious destructive or operational action.
+ - Brand expression comes from the XOPC mark, careful indigo use, agent avatars, and motion — not from decorative icon backgrounds.
+ - A color-filled icon tile is reserved for a high-value route in a grouped settings/list context or a meaningful status. It is not the default leading treatment for every row.
- - Use cards for repeated objects, previews, or contained summaries.
- - Use full-width sections for page structure.
- - Do not place a card inside another card.
- - Do not use decorative card grids when a simple list communicates better.
- - Cards need a clear tap target if interactive.
+ ## 5. Component grammar
- ### 11.3 Buttons
+ ### 5.1 Lists and rows
- Button hierarchy:
+ Choose the lightest structure that communicates the data.
- | Type | Treatment | Use |
+ | Pattern | Use | Treatment |
|---|---|---|
- | Primary | Filled accent | Main action on a screen or modal |
- | Secondary | Surface plus border | Alternative action |
- | Tertiary | Text or icon only | Low-emphasis action |
- | Destructive | Error color | Delete, remove, reset, or irreversible action |
-
- Button rules:
-
- - Primary buttons should be rare, obvious, and not duplicated.
- - Icon-only buttons require accessible labels.
- - Text must fit at all supported widths and font scales.
- - Do not use a text pill where a familiar icon button would be clearer.
+ | Plain list | Notes, sessions, files, search results | White/solid page or grouped base; row divider; title + one preview/meta line |
+ | Grouped list | Settings, library shortcuts, compact choices | Shared panel; 1px internal dividers; only outer corners rounded |
+ | Featured card | Continue item, task summary, goal mission | One content-rich object with elevated surface; no adjacent duplicate cards |
+ | Timeline / transcript | Chat, activity | Vertical rhythm and date/context separators; messages are not all boxed |
+ | Action grid | Only 2–4 genuinely equal visual destinations | Large enough tap target, one label; never used as a substitute for information architecture |
- ### 11.4 Inputs and Composers
+ Standard row contract:
- Inputs must feel reachable and stable.
+ - Full row opens the primary object; trailing action never steals the row tap.
+ - Primary title: one line. Preview: at most two lines when the object needs it. Metadata: one coherent line.
+ - Leading avatar/icon is optional and purposeful. Trailing metadata aligns consistently.
+ - Long press enters selection. Swipe exposes reversible quick actions. Multi-select disables swipe.
+ - Press feedback changes surface and may translate 1pt; it must be immediate and stable.
- - Use `surface.input`, `border.default`, and appropriate radius.
- - Composer-style inputs near the bottom must account for safe area and keyboard.
- - Placeholder text should be quiet and non-essential.
- - Send/submit controls must show disabled, loading, and error states.
- - Text entry should not be covered by keyboard transitions.
+ ### 5.2 Controls
- ### 11.5 Sheets, Dialogs, and Menus
+ | Control | Appearance | Use |
+ |---|---|---|
+ | Primary button | Indigo fill, white label, 48pt high, `radius.xl` | One main commit action |
+ | Secondary button | Elevated/outlined neutral surface | Alternative or non-destructive task action |
+ | Tertiary button | Text or bare icon | In-context secondary action |
+ | Icon button | Bare by default; material circle only over content | Navigation / familiar frequent action |
+ | Chip / filter | Text-first; selected state uses `accent.soft` | Filter or temporary selection, not general navigation |
+ | Toggle | Native platform control | Boolean preference only |
- Use the lightest container that fits the decision.
+ - A screen or sheet has one primary button at most.
+ - Do not make a text action pill-shaped when an inline label or familiar glyph communicates it better.
+ - Loading state preserves the control’s width and intent; disable repeated commits, but preserve cancel where safe.
+ - Destructive actions use the error role and are separated from safe choices.
- - Menu: quick contextual choice.
- - Bottom sheet: mobile task with several related options.
- - Dialog: short confirmation or blocking decision.
- - Full screen: complex task, long input, or multi-step flow.
+ ### 5.3 Inputs, search, and composer
- Rules:
+ - Inputs have clear visible labels when context is not self-evident; placeholders never carry required meaning.
+ - Search appears at the point of search, receives focus predictably, and can be cleared in one tap.
+ - Composer text remains 16pt minimum and grows up to a defined max before scrolling internally.
+ - Attachment and voice affordances have a visible pressed/recording state; voice recording has time, cancel, and send feedback.
+ - Input, keyboard, and safe-area motion move as one system. Never stack two keyboard avoidance mechanisms.
- - Destructive actions should be separated from safe actions.
- - Sheets and dialogs need clear dismissal behavior.
- - Scrims should use `overlay.scrim`.
- - Content must remain usable with larger font sizes.
+ ### 5.4 Sheets, dialogs, and menus
- ### 11.6 Toasts and Inline Feedback
+ - Bottom sheets have a fixed visual rhythm: 6pt grabber, title/description if needed, grouped content, safe-area-aware actions.
+ - Use an action sheet for a short choice; use a full screen for long editing or configuration.
+ - Dialog copy states the consequence and names the affected object. The safe action is visually quieter than the destructive action.
+ - A menu is for contextual commands, not a replacement for information architecture.
- Feedback should be near the action, brief, and reversible when possible.
+ ### 5.5 States and feedback
- - Toasts use `surface.panel`, `border.default`, rounded shape, and subtle elevation.
- - Toast text uses `ui` or `body`.
- - Toast actions use accent or semantic color according to meaning.
- - Use inline errors for field-level validation.
- - Use toast for global transient result.
- - Use persistent banners only for state that affects the whole screen.
+ | State | Required response |
+ |---|---|
+ | Pressed | Immediate surface/scale change; no network wait |
+ | Loading list | Skeleton that preserves row geometry |
+ | Saving / streaming | Local status near the content; preserve draft and task context |
+ | Success | Inline completion or short toast; haptic only for a meaningful change |
+ | Error | Plain-language recovery action; preserve user input |
+ | Offline | Persistent but compact availability indication; explain what remains local |
+ | Selection | Count in header, visible checks, batch bar replacing normal dock |
+ | Empty | One explanation, one next action, no decorative illustration by default |
- ---
+ Toasts confirm reversible, global, or transient outcomes. Field validation stays inline. Banners are reserved for a condition that changes the entire screen’s usefulness.
- ## 12. Motion
+ ## 6. Motion, haptics, and direct manipulation
- Motion communicates continuity, progress, and spatial relationship. It must never slow down the task.
+ Motion must explain a relationship: where content came from, what changed, or what remains active. It is not a source of personality by itself.
- | Speed | Duration | Use |
+ | Token | Duration | Curve / use |
|---|---:|---|
- | Instant | 0-80ms | Press feedback and state toggles |
- | Fast | 120-180ms | Small reveals, row actions, opacity changes |
- | Standard | 220-320ms | Sheets, route transitions, keyboard-adjacent UI |
- | Slow | 400-600ms | Rare onboarding or major state transitions |
-
- Motion rules:
-
- - Prefer fade, slide, reveal, and scale within small ranges.
- - Avoid bounce, elastic, cartoon motion, confetti, and looping decoration.
- - Animations must be interruptible.
- - Respect reduced-motion settings.
- - Skeletons or reserved space are preferred over layout popping.
-
- ---
-
- ## 13. Icons
-
- Icon language should be linear, simple, and consistent.
-
- - Use the project icon library through existing component APIs.
- - Default stroke style: outline, rounded caps, visually balanced.
- - Common control icon size: 20-24.
- - Metadata icon size: 14-18.
- - Empty-state icon size: 40-56.
- - Icon color defaults to `text.secondary`; active icons may use `text.primary` or `accent.primary`.
-
- Rules:
-
- - Use familiar system metaphors before inventing custom symbols.
- - Do not use icons as decoration when they add no meaning.
- - Icon-only actions need accessible labels and tooltips where applicable on web.
- - Destructive icons need semantic color only in destructive contexts.
-
- ---
-
- ## 14. Accessibility
-
- Accessibility is part of the design standard, not a later pass.
-
- Requirements:
-
- - Minimum touch target is `44x44`.
- - Text must support platform font scaling without overlap.
- - Do not encode meaning by color alone.
- - Interactive controls need accessible names.
- - Loading state must be announced or visibly represented.
- - Error messages must identify the problem and recovery action.
- - Focus order must follow visual order.
- - Reduced motion must be respected.
- - Light and dark modes must maintain contrast for primary tasks.
-
- Contrast guidance:
-
- - Primary text on base or panel surfaces should meet WCAG AA for normal text.
- - Secondary text may be lower contrast only when non-essential.
- - Disabled controls may be low contrast but must remain recognizable.
-
- ---
-
- ## 15. Safe Area and Keyboard
-
- Mobile layout must respect hardware and system UI.
-
- Safe area rules:
-
- - Use safe-area insets for top and bottom persistent UI.
- - Floating bottom controls should sit above the home indicator with at least 12px visual breathing room when possible.
- - Scroll content must include enough bottom padding to avoid being hidden behind floating controls.
- - Do not rely on absolute pixel offsets without inset-aware helpers.
-
- Keyboard rules:
-
- - Use `react-native-keyboard-controller` for sticky input surfaces.
- - Keep focused input and submit action visible during keyboard transitions.
- - Avoid stacking multiple keyboard-avoidance systems on the same screen.
- - Test with short and long text, hardware keyboard, and predictive text bars.
-
- ---
-
- ## 16. Loading, Empty, Error, and Offline States
+ | `press` | 80ms | ease-out; surface and 0.98–0.99 scale |
+ | `quick` | 140ms | ease-out; icon, selection, small reveal |
+ | `standard` | 220ms | system-like ease / spring; sheet, compact header, dock |
+ | `focus` | 320ms | gentle spring; home-to-Ask-AI transition |
+ | `ambient` | 600ms max | only low-amplitude streaming/progress feedback |
- Every async surface needs a designed state model.
+ - Respect `useReducedMotion`; remove transform, blur, and nonessential repeating motion when enabled.
+ - The Home → Ask AI overlay retains a hint of the home surface behind it, then returns to the same home context. It must feel like entering focus, not launching a separate app.
+ - List rows do not bounce on scroll. Swipe action reveal follows the finger directly and includes a label, icon, semantic color, and an undo/confirmation path.
+ - Use haptics for entering selection, committing a capture, sending a message, completing a meaningful action, and warning before a destructive state. Do not haptic ordinary navigation or every tap.
+ - Route transitions should use platform-native behavior wherever Expo Router provides it; custom motion is only for the workspace overlay and small state continuity.
- Loading:
+ ## 7. Accessibility and adaptive design
- - Reserve space to prevent layout jumps.
- - Prefer skeletons for lists and large content blocks.
- - Use spinners only for short, contained waits.
+ Accessibility is a product requirement and a measure of craft.
- Empty:
+ - Support Dynamic Type and Android font scaling through every content and control state. Verify at the largest supported text setting.
+ - Maintain at least 44 × 44pt hit targets, visible focus order, accessible names/roles/states, and a logical VoiceOver reading order.
+ - Do not encode status only through color: pair color with icon, label, position, or text.
+ - Primary text and essential controls meet WCAG AA contrast. Tertiary color is never used for an essential instruction or action.
+ - Respect reduced motion, reduce transparency, increased contrast, system appearance, screen reader, hardware keyboard, and landscape/wide layouts.
+ - Keep primary reach actions in the middle/lower reachable area when task context permits, while respecting safe areas and keyboard.
+ - Every async state is announced visually and, where appropriate, to assistive technologies.
+ - Test light/dark mode, small iPhone, large iPhone, iPad/wide web, slow network, offline state, keyboard, and long localized strings.
- - Explain the state in plain language.
- - Provide one clear next action when possible.
- - Avoid large illustrations unless they communicate the state.
+ ## 8. Implementation rules
- Error:
+ ### 8.1 Source of truth
- - State what failed and how to recover.
- - Preserve user input where possible.
- - Use semantic error color with restraint.
+ - Theme colors, spacing, radii, typography, and elevations live in `src/theme/tokens.ts` and are exposed through `useTheme()`.
+ - `src/theme/paper-theme.ts` maps those semantic values into React Native Paper. It must not introduce a competing MD3 visual system.
+ - Motion comes from `src/motion/`; all custom animated components use the reduced-motion helper.
+ - Reuse `FloatingHeader` only after it is upgraded into the two header modes above. Do not clone a local header to bypass the design system.
+ - Continue using the established `SwipeableRow`, selection, batch action, toast, bottom sheet, keyboard, and safe-area primitives. Improve the primitives centrally rather than inventing feature-local variants.
+ - User-facing content remains in the i18n catalog.
- Offline or unavailable:
+ ### 8.2 Token migration requirements
- - Make the unavailable state visible.
- - Show what remains usable.
- - Retry should be explicit and reachable.
+ The present token file contains the v2 palette and an 8pt-only spacing scale. The v3 values above require a deliberate, app-wide migration; do not change a few raw values and call the result a redesign.
- ---
+ 1. Add semantic roles (`grouped`, `elevated`, `pressed`, and central elevation recipes) without removing compatibility aliases in the same change.
+ 2. Update Paper mapping and shared primitives first.
+ 3. Migrate home, headers, composer/dock, lists, and sheets in the order below.
+ 4. Remove hardcoded component values (including card-specific shadows, `fontSize`, and radius) as each primitive is migrated.
+ 5. Verify both schemes and every state with screenshots on iOS and Android before removing old aliases.
- ## 17. Content and Language
+ ### 8.3 Current audit findings
- Design copy should be calm and operational.
+ These observations come from the current implementation and directly motivate the target system:
- Rules:
+ | Area | Current issue | Target correction |
+ |---|---|---|
+ | Header | `FloatingHeader` renders a filled circle + central filled pill + filled circle for almost every destination | Introduce large/compact native header modes; material only when floating over content |
+ | Home | Continue, attention, agents, and library are all similarly weighted sections, plus a centered note FAB | Make home an action-ranked briefing; use a single bottom dock and hide empty attention |
+ | Collections | Note, inbox, and session objects are nearly all bordered, rounded cards with shadows | Make plain/grouped rows the default; preserve featured cards only for intentional summaries |
+ | Note rows | Title, chips, tag chips, status chip, task chip, pin chip, and timestamp compete in one compact card | Show title, preview, one metadata line, and only high-value tags/states |
+ | Chat | The feature has rich state, which risks a visual stack of controls and blocks | Make transcript reading-first and progressively disclose operational/AI detail |
+ | Tokens | Documentation and code palettes have diverged, and individual components still own visual constants | Use the v3 semantic table and central recipes before broad screen migration |
- - Use concise English in design specifications and shared UI guidance.
- - User-facing strings must come from the localization system.
- - Labels should describe the action, not the implementation.
- - Avoid hype, personality performance, or vague reassurance.
- - Prefer verbs for actions and nouns for destinations.
- - Confirmation copy must name the consequence.
+ ## 9. Delivery sequence and acceptance criteria
- Tone:
+ This design phase intentionally does not change runtime UI. Implement in small, reviewable passes with visual QA after each pass.
- - Clear
- - Direct
- - Quiet
- - Helpful
- - Specific
+ ### Phase 0 — baseline and decisions
- ---
+ - Capture iOS and Android screenshots of Home, Inbox, Notes, Session list, Chat, Settings, offline gateway, selection mode, and one long-text case in both themes.
+ - Confirm typography/font-scaling constraints in the Expo SDK 56 environment.
+ - Inventory component-local hardcoded visual values and duplicate header/card styles.
+ - Lock the v3 token table and approve any platform-specific material fallback before code work.
- ## 18. Implementation Standards
+ ### Phase 1 — foundation and primitives
- Use the established mobile stack and shared primitives.
+ - Migrate theme tokens, Paper mapping, elevations, motion, and accessibility defaults.
+ - Replace `FloatingHeader` with large and compact modes.
+ - Create shared plain row, grouped list, featured card, and bottom dock/composer shells.
+ - Verify focus, safe-area, keyboard, dark mode, reduced motion, and 44pt targets.
- Requirements:
+ ### Phase 2 — product-defining paths
- - Theme values come from `src/theme/tokens.ts`.
- - Components consume theme through `useTheme()` or mapped provider themes.
- - React Native Paper must use the project theme mapping, not default MD3 colors.
- - User-facing strings use localization.
- - Persistent bottom UI uses shared layout constants.
- - Shared list, selection, swipe, toast, and batch primitives should be reused before creating new patterns.
+ 1. Workspace home and Ask AI transition.
+ 2. Inbox capture and list.
+ 3. Notes list and note detail/editor.
+ 4. Chat transcript, composer, and progressive AI/tool states.
- Do not:
+ These are the screens that establish the product’s perceived quality. Do not dilute the pass by restyling settings first.
- - Hardcode color, spacing, radius, or font values when a token exists.
- - Introduce a second navigation system.
- - Introduce a second gesture pattern for equivalent lists.
- - Use default platform component styling when it conflicts with this system.
- - Add decorative animation, gradients, or illustration to compensate for weak hierarchy.
+ ### Phase 3 — system completion
- ---
+ - Migrate Sessions, Files, Settings, Gateways, Agents, Automations, Sharing, onboarding/pairing, dialogs, sheets, toasts, and all empty/error/offline states.
+ - Standardize selection, swipe, undo, search, and list loading behavior across every collection.
+ - Remove obsolete v2 styles and compatibility aliases once no screen uses them.
- ## 19. Quality Checklist
+ ### Definition of done
- Before shipping a screen or component, verify:
+ A redesigned screen is complete only when all of the following are true:
- 1. Colors come from semantic tokens.
- 2. Light and dark themes have equivalent hierarchy.
- 3. Text uses the token type scale.
- 4. Spacing follows the 8pt scale.
- 5. Touch targets are at least `44x44`.
- 6. Primary actions are reachable and visually clear.
- 7. Loading, empty, error, disabled, selected, and pressed states are designed.
- 8. Keyboard and safe-area behavior are correct.
- 9. Gesture behavior matches equivalent objects elsewhere.
- 10. Destructive actions have confirmation or undo as appropriate.
- 11. Text fits with larger font settings and small screens.
- 12. No UI elements overlap, clip, or shift unexpectedly.
- 13. Motion is short, interruptible, and reduced-motion aware.
- 14. Icons have accessible labels when they are interactive.
- 15. The screen works without relying on color alone.
+ 1. It has one clear primary action and no decorative competing accent.
+ 2. It uses shared semantic tokens and primitives; no local color/radius/shadow/type scale is invented.
+ 3. Regular data uses rows or grouped lists; cards are intentional and not nested.
+ 4. Light and dark designs preserve the same hierarchy and state meaning.
+ 5. Default, pressed, loading, empty, error, offline, disabled, selected, and long-content states are designed.
+ 6. Dynamic Type, 44pt targets, screen reader labels, reduced motion, keyboard, safe area, and gesture behavior are verified.
+ 7. The result has been visually compared to the approved baseline on iOS and Android, at compact and large phone widths.
+ 8. The screen feels more legible and more alive through hierarchy and feedback, not through added decoration.
- The best version of this design system should feel almost invisible: the user sees the work, understands the state, and moves forward without friction.
+ The final experience should feel inevitable: open XOPC, immediately see what matters, capture or ask with one confident action, and return to work without managing the interface.