From a2bf41a9b2347a5e52a8036765008e0c48b9de67 Mon Sep 17 00:00:00 2001 From: mintaka Date: Wed, 7 Oct 2026 03:44:09 -0400 Subject: [PATCH 1/5] docs(ui): Compass Settings design record (RIG-4775) Section nav and /settings/:section routing, row anatomy on the shared primitives, a per-section save model, and the Providers section from the enrollment record (RIG-3121). Two open questions for Matt. Ledger-impact: DL-431, DL-433, DL-434 added. Spec-impact: none. Refs RIG-4775 Co-authored-by: Matt Wilkinson --- docs/designs/ui/compass-settings/design.md | 399 +++++++++++++++++++++ 1 file changed, 399 insertions(+) create mode 100644 docs/designs/ui/compass-settings/design.md diff --git a/docs/designs/ui/compass-settings/design.md b/docs/designs/ui/compass-settings/design.md new file mode 100644 index 000000000..5ca8d479f --- /dev/null +++ b/docs/designs/ui/compass-settings/design.md @@ -0,0 +1,399 @@ +# Compass Settings page + +Builds on: brand parity (`compass-brand-parity/design.md`, open PR #1915: +square corners, weights, surfaces, `--cx-border-field`, text-entry +primitives), [UX foundation](../compass-ux-foundation/design.md) +Refs: RIG-4775 (this record); RIG-3121 (Providers, task E5 of the +[gateway OAuth enrollment record](../../server/compass-gateway-oauth-enrollment/design.md)); +ledger DL-431, DL-433, DL-434 (DL-432 is held for Open Questions 1 and 2) +Depends on: brand-parity T9 (S1); enrollment E3 (S7) + +## Problem / Intent + +Matt's ask: "Settings styling and layout are bad, and we likely need many +more settings. Write a full settings design (sections, which settings +exist, layout), then implement." + +Today Settings is one page that edits the tracker config. Defects (from +`SettingsView.tsx`, the `.settings-*` rules in `app.css`, and +`settings.png`): + +1. **Bespoke boxes.** `.settings-input`/`.settings-select` and + `.settings-btn*` copy `.cx-input` and `.cx-btn`. +2. **Raw sizes and bold.** `14px`/`12px` heads at weight `600`, `11px` + labels, a `10px` gap; none is a token. +3. **Rounded cards.** `.settings-section` has `--cx-radius-md`. +4. **Fixed widths and wrapping.** `100px` and `140px` status columns clip + long names; the `flex-wrap` fields row breaks into ragged lines. +5. **One page, no sections.** Editor and model registry share one scroll + and one route. +6. **The one edit does little.** The store always uses + `createFixtureTrackerSeam(DEFAULT_TRACKER_CONFIG)`, which ignores its + `_config`; only the handle reaches the fixture queue. The kind and the + status map change nothing, and the server maps tracker status itself + (DL-129). Nothing shows the server, account, motion, or providers. + +Brand-parity T2a and T9 fix defects 2 and 3 (they sweep every radius and +`font-weight: 600` in `app.css`). This record fixes the rest: one view +with a section nav, a route per section, one row anatomy on the shared +primitives, and a save model per section. + +## Approach + +### A1 — Sections and settings + +Sections in nav order, with the recommended Open Question answers: + +- **General** (`general`) + - Server URL: read-only `connection.baseUrl`, the URL the transport uses + in both hosts. New. + - Mode: read-only `shellMode()`: none → Browser, `"embedded"` → Embedded + server, `"client"`/`"setup"`/`"reopen"` → Remote server (setup reaches + the app only by connecting; reopen never mounts it). New. + - Server version: read-only `version`, `api_version`, and `rev` from + `GetServerInfo` (the UI reads the first two today). "Not connected" + when `store.daemon().live` is false. New. + - Signed in as: read-only handle and display name, `store.caller()`. New. + - Keyboard shortcuts: a button that opens the shortcuts overlay. New. + - Usage data: Open Question 2. New. +- **Appearance** (`appearance`): Reduce motion, Follow system or Always, + per device in localStorage `compass.settings.reduceMotion`. Always sets + `:root[data-reduce="on"]`, which the CSS already honors and nothing sets + today. New. +- **Tracker** (`tracker`): exists; its future is Open Question 1. +- **Models** (`models`): the model registry, read-only. Exists. +- **Providers** (`providers`): enrollment E5 (A5). Needs E3 + (`ProviderEnrollmentService`), not yet in the proto, Go, or the UI. + +Not in this record: editing the server URL (deferred, native server URL +record OQ-5); browser sign-out (no signed-out boot path); a day theme +(ux-foundation D2, "later"); key remap (deferred; a Keyboard section comes +with it); notifications (none exist); Secrets (`SecretsService` overlaps +the Providers API-key entry, so it gets its own design after E5); Replay +tour (a General row once the tour UI merges); the fleet config bundle +(`GetAgentConfigInfo`, read-only member names: fleet information, not a +preference; a later Fleet section can show it beside Models); pinned +agents and window layout (set in place, they stay there). + +### A2 — Layout + +`.settings-view` is a grid of two columns: the section nav and the body. + +- **Nav.** `