Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/designs/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,9 @@ check enforces the mechanical half. Full rationale:
| DL-232 | The Cmd/Ctrl+K command palette host anatomy is a bare fixed wrapper: a permanently-open Kobalte **Search** primitive (`open` pinned true; Control + Input + Listbox, with `Search.Portal`/`Search.Content` replaced by a plain div per Kobalte's published command-menu recipe, <https://kobalte.dev/docs/core/components/search/>, `@kobalte/core` v0.13.13) inside a hand-positioned `position:fixed` div that IS `.cx-palette`, with its OWN `.cx-palette-backdrop`, Escape/outside-click dismiss, hand-wired focus grant (`ref` + `input.focus()` on mount) and focus-restore on close, plus per-row `onMouseDown`-preventDefault so a result click never blurs the pinned-open input — NO Portal/Content, floating-ui out of the test path. Search over Combobox because Search is built for caller-managed filtering (the palette's own fuzzy match) and publishes this pinned-open/no-portal recipe verbatim, where the same shape on bare Combobox was an unsupported extrapolation. The decider: a DOM-only test path with Kobalte reserved for the Search primitive's ARIA + keyboard traversal (DL-150's a11y-hard carve-out). A Search/Combobox hosted inside a Kobalte `Dialog` (scrim/trap/restore free) was rejected for nested-primitive + Portal/z-layer reconciliation cost against the shipped `.cx-palette` CSS and the window-level `Mod+K` toggle. | Active (Matt, 2026-08-23) | [command palette §Decisions](product/compass-command-palette/design.md#decisions) |
| DL-233 | The palette's navigation mode ships ALL six destination kinds, including issue AND pr. The issue provider rides the tracker's assigned-issue seam (`store.assignedIssues`); the pr provider requires a NEW store-level PR accessor — `prs: Accessor<PrRow[]>` as a `createMemo` over `issues()` via the existing pure `prRows()` (`board.ts:132-134`), mapping each `{issue, pr}` row to a `Destination{kind:"pr"}` that selects the owning issue and reveals the PR pane (`store.selectIssue` + `store.setActiveRightTab("pr")`) — which Matt explicitly accepted as added palette-impl scope (the store has no PR collection today; `IssueTab`'s `"pr"` is a detail-pane tab, not a collection). The fixture already carries PR shapes (`stub-data.ts:238`), so no new offline data source is needed. | Active (Matt, 2026-08-23) | [command palette §Decisions](product/compass-command-palette/design.md#decisions) |
| DL-234 | Point-of-use shortcut chips ship the seam plus the view-button now-win: the `ShortcutChip` primitive + `shortcutFor(id, platform)` + the `PrimaryAction` contract note + populated `board.*` shortcut fields (chips uniformly via `shortcutFor`, no hand-authored shortcut strings), AND `aria-keyshortcuts` + `title` populated via `shortcutFor` on the LeftSidebar `.bridge-link` view buttons (`LeftSidebar.tsx:437-482`: Bridge/Backlog/Done/Settings — the surfaces that actually invoke the D6-seeded `show*` paths), plus the Bridge topbar tab (`App.tsx:68-94`) for parity. Actual `.cx-menu`/hover-tooltip chip adoption is out of scope, deferred to follow-up issue RIG-2530 (it belongs to the first surface that mounts one). Seeds `view.settings/backlog/done` registrations stay under the shared commands-as-inventory rule (DL-229, owned by RIG-2529): the palette's seeds are `scope:"global"` view commands, so the palette is correct on the shared rule. | Active (Matt, 2026-08-23) | [command palette §Decisions](product/compass-command-palette/design.md#decisions) |
| DL-245 | The coaching keyboard-discoverability layer (RIG-2530, refining DL-234's deferred `.cx-menu`/hover-tooltip adoption) is a reusable `CoachTip` component built on the installed **Kobalte v2-alpha `Tooltip`** primitive (`@kobalte/core@2.0.0-alpha.0`), not hand-rolled: a tooltip's hard parts (open/skip-delay timing, safe-area pointer travel, Escape dismiss, portal stacking, `aria-describedby` id plumbing, hover+focus unification) are exactly DL-150's a11y-hard scope, `.cx-tooltip` was authored naming Kobalte as the behavior owner (`tooltip.css:1-2`), and the alpha already ships via the palette's Search (`Palette.tsx:19`) so the version risk is on the books. It styles the existing `.cx-tooltip` box, reveals on hover AND focus (Kobalte default; a mouse-only coaching layer is self-defeating), and delays 400ms via `COACH_TIP_DELAY_MS` mirroring `--cx-tooltip-delay`. Hand-rolled on `.cx-tooltip` was rejected (re-derives ratified a11y-hard behavior beside Kobalte). | Active (Matt, 2026-08-23) | [coaching tooltips §A1](product/compass-coaching-tooltips/design.md#a1--kobalte-v2-alpha-tooltip-not-hand-rolled) |
| DL-246 | `CoachTip` resolves its chord ONLY via `shortcutFor(id, platform)` (DL-234's single-derivation rule — never a hand-authored string) and renders it sequence-aware: a plus-chord (`Ctrl+B`) through `ShortcutChip` (which splits on `"+"`, `ShortcutChip.tsx:17`), a RIG-2484 sequence (`"G then B"`, no `"+"`) as plain text so it does not render one giant `<kbd>`. Because it only reads `shortcutFor`'s return, it shows today's `Mod+B` now and `G then B` automatically once RIG-2484 (PR #544) lands — forward-compatible, never blocked on it. Teaching `ShortcutChip` to split on `" then "` is deferred to the RIG-2484 impl. A parallel tooltip-local chord formatter was rejected (forks the single derivation this net exists to keep). | Active (Matt, 2026-08-23) | [coaching tooltips §A3](product/compass-coaching-tooltips/design.md#a3--rig-2484-forward-compat-sequence-aware-chord-rendering) |
| DL-247 | The `title=` adoption boundary: the coaching sweep converts ONLY the seven command-backed `title=` sites (LeftSidebar view buttons ×4, App.tsx Bridge tab + both sidebar toggles), removing the native `title` (no double-tooltip) and keeping `aria-keyshortcuts` (DL-234, the AT-authoritative chord); every other `title=` (command-less actionable controls, truncation/status text) stays native, per DL-229 (no command registered purely for discoverability). The two sidebar-toggle chords (`Mod+\`/`Mod+Shift+\`, `keymap.ts:116-117`) are dead today (declared in the keymap, registered nowhere — the buttons call `store.toggle*()` directly), so this record registers exactly `sidebar.toggleLeft`/`sidebar.toggleRight` beside their existing store behavior (DL-229-compliant) so the coached chords actually fire — Matt-ruled 2026-08-23, amending the record's "registers nothing new" constraint over shrinking the sweep to five live sites. | Active (Matt, 2026-08-23) | [coaching tooltips §A4](product/compass-coaching-tooltips/design.md#a4--adoption-boundary-the-title-classification) |

## Bridge spawn control

Expand Down
Loading
Loading