Skip to content

mac UI/UX pass 2: problems + fix-its, outline, palette scopes, completion, settings, states - #476

Merged
GoKubar merged 19 commits into
mainfrom
agent/kabir-claude/ui-design-pass-2
Sep 14, 2026
Merged

GoKubar merged 19 commits into
mainfrom
agent/kabir-claude/ui-design-pass-2

Conversation

@GoKubar

@GoKubar GoKubar commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Second half of the design pass (steps 5–8 of the order of work), stacked on #471.

What's here

  • Problems + fix-its (step 5): F1 row anatomy — severity glyph, human message, dimmed trailing location; detail (notes/help/recovery/explanation) collapses under the selected row, which is §9's disclosure-inside-the-problem; the redundant per-row Go-to-source button is gone (Return/double-click/context menu). Lines whose diagnostic carries a mechanical edit get an accent ring around the gutter dot — the visible half of "Tab applies the fix at the caret".
  • Outline (step 6): one flat list in document order (never regrouped — §7), typed icons whose colour is type identity, indent from nesting, in-header Show filter (D1), line numbers dimmed trailing.
  • Palette (step 6): Search-Everywhere scopes — All / Files / Sections / Labels / Citations / Commands — over state the shell already holds; Tab cycles scopes; shared typed-icon vocabulary; commands keep key caps and their richer ranking.
  • Completion popup (step 6): already had the K1 anatomy; now on DS tokens, with a snapshot proving both appearances (the surface that once shipped unreadable in light mode). Row height stays 24 (16pt kind icons crowd at the guide's 22 — reference over number).
  • Settings (step 7): the standard macOS toolbar-tabbed window (Editor | Conversion), applying live, no OK/Cancel/Apply. Find/replace deliberately stays the native NSTextFinder bar (loyalty FT-002: dispatch to claude — acknowledgement required #1 over L1's custom bar; its replace path is the documented undo/attribute guarantee).
  • States + sweep (step 8): pressed feedback on every custom row/tab/rail button (PressableStyle), unfocused selection visibly weaker (unemphasized colour; active tab drops its shadow), honest empty-state preview (found and fixed an HSplitView collapse bug), page/zoom readouts only with a result, AA contrast on informational dimmed text, and zero raw style literals across every view file — secondary windows included (QR-white and the 34pt pairing code became named tokens with their reasons).

Gates

  • swift build clean; DesignSnapshots 12/12 green against committed PNGs (both appearances, empty/problems/narrow states); CommandTableTests, completion, preferences, capture/nearby suites green; full suite run attached to the report.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu

GoKubar and others added 16 commits September 14, 2026 17:12
…el, shell surface snapshots

Surfaces render inside real off-screen HostedWindows windows now: List rows
only populate in a window, NavigationSplitView and .toolbar need one, and
vibrancy materials draw black off-screen (neutralized to their plain colour,
the Reduce-Transparency ground). DesignFixtures builds a deterministic demo
project (3 pages, extra tabs, synthetic TeX diagnostics) with machine
preferences pinned. StatusBar/EditorPane/PreviewPane/PreviewHeader lose
'private' so the loop can render them alone.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…splay

macOS 26 glass materials (NSContainerConcentricGlassEffectView and friends,
wrapping every NavigationSplitView sidebar) never reach cacheDisplay or
CALayer.render — the sidebar snapshotted blank white. CGWindowListCreateImage
of our own off-screen window composites what the user actually sees, needs no
Screen Recording permission for the calling process's windows, and turned out
deterministic across runs (asserted green immediately after recording). The
symbol is bound with dlsym because it is deprecated and Swift cannot silence
a deprecation without deprecating every caller; ScreenCaptureKit is not a
substitute here because it does need the permission. Baseline PNGs of the
current design are recorded for all nine surfaces, both appearances.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
The token file from context/style-guide.md — spacing scale, radii, row
heights, type sizes, semantic colours (all defined on AppKit semantic
colours so light/dark/follow-system are structural), interaction-state
opacities, split minimums, preview page constants, motion durations gated
on ReduceMotion — plus FileTypeStyle, the IntelliJ-style colour-coded file
identity used from step 3 on.

Migrated in this pass: ContentView (status bar, preview header, capture and
bridge bars, sheets), DocumentTabBar, WorkspaceSidebar, ProblemsPanel,
DiagnosticsPanel, CommandPalette, PreviewView, PreviewV2View, PreviewZoom,
WordCountStatusView, EditorIntelligence (gutter paints + quick info),
EditorPreferences, ProjectSearchPanel, MathHoverPreview. Values were snapped
to the token scale where they were within a point or two (14→12, 10→8,
5→4/6, 3→2), which the re-recorded snapshots show as sub-pixel-to-2pt
shifts; captions standardise on the 11pt secondary token. Secondary windows
(Nearby, CaptureInbox, scaffolds, history, citation rename) migrate when
their surfaces are touched.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…tool column, three-chip toolbar, 900pt minimum

IntelliJ's structure with Xcode's restraint (design-principles §1/§4):
a left icon rail toggles the tool windows; the tool column stacks the
Project tree above the Outline (which ships collapsed); Problems left the
column — its homes are the bottom panel and the status-bar badge; regions
separate by hairlines and one tonal shift, and the status bar spans the
window. NavigationSplitView is gone (its macOS 26 glass sidebar also never
reached the off-screen render loop).

The title bar now carries the chrome budget: Compile (producer menu behind
its chevron), Export, Commands, plus the Captures toggle. The v2-pane and
dark-preview switches moved into the preview header; Find in Project,
Rename Citation, Durable History and Nearby ride their menus, shortcuts
and the palette, which the toolbar tooltips still name.

Below the width where both columns fit, the preview collapses to a toggle
(tab bar to show, preview header to come back) instead of being crushed;
the window minimum drops from 1200 to 900pt. FocusOrder gains the rail as
pane 1 and the help text follows reality; CommandTableTests pin the new
structure.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
'main.tex › Résumé of a small journey › At the café' — the enclosing
sectioning chain at the caret (DocumentOutline.breadcrumb, unit-tested:
ancestors are the nearest preceding lower level, a following section closes
its siblings' subsections, the preamble shows none). Environments and
labels stay out: the lexical scan records no \end positions, and a segment
that may already be closed would lie. Segments click through to their
section; the outline rescan is edit-debounced and caret moves only re-pick
the chain from cached items. Indicators (word count, latency, route,
revisions, problem counts) move to the trailing side, IntelliJ-fashion.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
… 24pt tree rows

FileTypeStyle is now the one vocabulary for what a file is — .tex blue
(entry filled), .bib purple, .cls/.sty teal, .pdf red, images green,
generated grey — used identically by the project tree and the tab strip
(design-principles §6: colour is identity, never decoration). Tree and
outline rows drop to 24pt with full-row hover and selection highlights.

Tabs get the Islands treatment (§5): the active tab is a filled rounded
card raised out of the recessed strip (hairline + soft shadow), inactive
tabs are icon + name with no chrome, the close control appears only on
hover and on the active tab, and the modified state is the filled dot. The
per-tab durable-revision counter, the edited/saved caption and the
byte/UTF-16 readout leave the strip — the dot, tooltips and the status bar
already carry them (Xcode restraint: an arguable element loses).

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
… pointer-over; Fit Page (⌘⇧9)

Design-principles §8: at rest the header shows only the page indicator and
zoom percentage, dimmed, plus quiet state — the fixed-slot compile spinner,
a FIXTURE/HISTORICAL badge only when the pages are not the worker's current
result, staleness text and capability warnings. On pointer-over the second
tier fades in place (150ms ease-out, gated on Reduce Motion, no reflow):
zoom −/+, Fit Width, the new Fit Page, and the preview-scoped v2/dark
switches. Producer name and layout-capability detail moved into the header
tooltip. No error cards in this column, before or after.

The page indicator rides the anchoring probe (the page under the viewport's
top edge, reported only on change); Fit Page is a real command — table
entry, View menu, ⌘⇧9, palette, README row — computed from the pane
geometry the preview already reports. Toolbar-location claims in the table
and README now match the three-chip toolbar.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
… Tab-applicable fixes

The panel row is now F1's anatomy: severity glyph, the human-readable
message, and the dimmed location at the trailing edge — one line per
problem. The detail (notes, help, recovery, catalogue explanation,
withheld-underline state) collapses under the *selected* row: selecting is
the disclosure, exactly §9's 'a disclosure inside the selected problem,
not a separate destination'. The redundant per-row Go-to-source button is
gone (Return, double-click and the context menu all jump); Fix… and the
'N places' menu stay as the row's actions.

Lines whose diagnostic carries a mechanical edit now get an accent ring
around the gutter's severity dot (a second shape, never colour alone) —
without it the 'Tab applies the fix at the caret' affordance was invisible
(§9). Mark gains hasFix at construction; the fixture demonstrates the whole
path (ringed gutter dot, squiggle, panel Fix…, disclosure) and busts the
editor-marks memo the way a real reply would, with a fresh result id.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…palette grows Search-Everywhere scopes; completion popup on tokens

Outline (D1's Structure panel, simpler on purpose): one flat list in
document order — never regrouped by type, because for prose the order is
the meaning (§7) — indented by nesting, typed icons whose colour is the
item's type identity (floats green/blue, math purple, labels orange,
structure neutral), line numbers dimmed at the trailing edge, and the
filter as an in-header menu. The kind-grouped disclosure sections are gone.

The palette (§10) gains scope tabs — All / Files / Sections / Labels /
Citations / Commands — over state the shell already holds: the project
listing and discoverable includes, the outline scan, the helper's
project-index citations, and the full command table. Tab cycles scopes,
rows carry the shared typed-icon vocabulary with dimmed context, commands
keep their key caps and richer ranking. Table/README texts updated to match.

The completion popup already had the K1 anatomy (typed icon → monospace
candidate → right-aligned dimmed origin, fixed documentation pane, footer
hints); it now reads its chrome from DS tokens, with completion rows pinned
at 24 (not the guide's 22 — candidate rows carry 16pt kind icons and 22
crowds them; the reference, not the number). New snapshot proves both
appearances — the exact surface that once shipped unreadable in light mode.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…rsion), applying live

The Settings scene now shows the standard macOS tabbed IA — two panes are
all this app has, so IntelliJ's search-plus-tree settings IA would be
chrome without content (deliberate simplification of design-principles
§13's reference; the binding parts hold: ⌘,, a window not a sheet, live
apply, no OK/Cancel/Apply anywhere). EditorPreferencesView itself is
untouched, so the panel focus-order table and its accessibility walk stay
exactly as pinned; the Conversion section moves to its own tab as its own
grouped form. Snapshot added, both appearances.

Find/replace stays the native NSTextFinder bar rather than L1's IntelliJ
bar — a deliberate reading of loyalty #1 ('macOS conventions win on
mechanics') over the reference: the bar's replace path is the documented
guarantee that replacements share the editor's undo/attribute machinery,
and rebuilding it custom would trade that for looks. Recorded as a
judgement call for the report.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…ntrast on informational dimmed text

Every custom interactive row now has a visible pressed state
(PressableStyle: a pressed wash over whatever the label draws) — sidebar
rows, tabs, rail buttons; the document tab becomes a real Button (keyboard
activation and pressed feedback) instead of a tap gesture. Selection reads
correctly unfocused (§14): tree rows fall back to the unemphasized
selection colour, the active tab drops its shadow while the window is not
key.

The no-result preview column top-aligns and fills its ground (with both
split children flexible, HSplitView collapsed and centred everything —
found by the new empty-state snapshot), guidance text names the Compile
chip's menu instead of removed toolbar buttons, and the page/zoom readouts
appear only once a result exists. Information-carrying dimmed text
(problem locations, outline line numbers) moves from tertiary to secondary
for AA contrast; decorative separators stay tertiary.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…iterals left in view files

Captures inspector, Nearby pairing window, project scaffolds (New
Project/File, Rename, Delete), Durable History, Rename Citation, the
navigation sheets, proposal preview and review history all migrate onto
DS tokens: spacing snapped to the scale, radii, severity/status colours,
window minimums as named tokens, status dots, thumbnails and image tiles.
Two deliberate one-offs became named tokens rather than exceptions: the QR
ground stays literal white in both appearances (scanners need it) and the
pairing code keeps its across-the-room 34pt monospaced face.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
…e rows report through project.status

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
@d-q222

d-q222 commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

daniel-parent: overlap notes for pass 2. I test-merged it against my open Mac PRs.

All of these are list insertions on my side, and I'll rebase them after #471/#476 in whatever order you merge. No new Mac UI work from me while the design pass is open.

… in play, absent at rest

Same rule the bridge line already followed (daniel-fable-ui-qa #5): a
permanent 'no insertion point pinned' strip under the editor is chrome
with no content. It appears with a pinned anchor, queued proposals, or the
open Captures inspector; ⌘⌥P and the Edit menu still pin from anywhere.
The reading-order table says when the pane is present. Snapshots
re-recorded; the empty and rest states drop the strip.

Implementation-Agent: Claude Fable (lane mac-ui-design, linux-primary)
Commit-Executor: Claude Fable (direct git, observed Cursor usage limit)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5Hmwh5GHNTiAmHUJ1MZu
@GoKubar
GoKubar changed the base branch from agent/kabir-claude/ui-design-tokens to main September 14, 2026 22:40
# Conflicts:
#	apps/mac/README.md
#	apps/mac/Sources/FlashTeXMac/CommandPalette.swift
#	apps/mac/Sources/FlashTeXMac/ContentView.swift
#	apps/mac/Sources/FlashTeXMac/DesignSystem.swift
#	apps/mac/Sources/FlashTeXMac/DiagnosticsPanel.swift
#	apps/mac/Sources/FlashTeXMac/DocumentTabBar.swift
#	apps/mac/Sources/FlashTeXMac/WorkspaceSidebar.swift
#	apps/mac/Tests/DesignSnapshots/DesignFixtures.swift
#	apps/mac/Tests/DesignSnapshots/ShellSnapshotTests.swift
#	apps/mac/Tests/DesignSnapshots/SnapshotHarness.swift
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testCommandPalette.palette-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testCommandPalette.palette-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testMainWindow.shell-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testMainWindow.shell-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testMainWindowNarrow.shell-narrow-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testMainWindowNarrow.shell-narrow-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testMainWindowWithProblems.shell-problems-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testMainWindowWithProblems.shell-problems-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testProblemsPanel.problems-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testProblemsPanel.problems-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testSidebar.sidebar-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testSidebar.sidebar-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testStatusBar.statusbar-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testStatusBar.statusbar-light.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testTabBar.tabbar-dark.png
#	apps/mac/Tests/DesignSnapshots/__Snapshots__/ShellSnapshotTests/testTabBar.tabbar-light.png
@GoKubar
GoKubar merged commit 3ba31e8 into main Sep 14, 2026
20 of 21 checks passed
d-q222 added a commit that referenced this pull request Sep 14, 2026
…to Line / :N

Merged origin/main (includes #471/#476 design system and scoped command
palette). The only conflict was CommandPalette.swift.

Resolution: keep #476's PaletteScope / PaletteEntry structure and DS tokens.
Re-added this PR's Go to Line command in perform(), plus :N as a query
prefix that emits a lineJump palette entry. No clash — #476 uses ':' only
in internal ids (file:, cmd:), not as a typed prefix. GoToLineSheet
restyled onto DS tokens.

Tests (apps/mac):
  swift test --filter 'GoToLineTests|CommandTableTests|CommandPalette'
    Executed 18 tests, with 2 failures — both DesignSnapshots
    ShellSnapshotTests.testCommandPalette (known-failing class on this Mac).
  swift test --skip-build --filter 'GoToLineTests|CommandTableTests' --skip DesignSnapshots
    Executed 17 tests, with 0 failures (CommandTableTests 8, GoToLineTests 9).

Next: push this branch; then PR #411 problems-order in its own worktree.

Implementation-Agent: cursor-agent cursor-grok-4.6
Commit-Executor: cursor-agent
Lane-Owner: daniel-parent (mac-m5pro-dq222)
Co-authored-by: Cursor <cursoragent@cursor.com>
d-q222 added a commit that referenced this pull request Sep 14, 2026
…rseded UI

Merged origin/main (includes #471/#476 Problems panel). Conflicts were
ProblemsPanel.swift and DiagnosticsPanel.swift.

Kept only EditorDiagnostics.listBucket grouping: author errors (0), then
warnings (1), then FlashTeX gaps (2), stable within each bucket. groups()
feeds the panel, copy-text, and stepOccurrence, so next/previous occurrence
and ⌘⌥] land on the first error rather than an earlier gap. goToDiagnostic
still walks underlined marks in document order (it does not iterate groups).
Status-bar badges remain counts, not a list.

Dropped as superseded by #476: count chips (including zeros), the old
header/row chrome, the DiagnosticsListView chip caption, and the 180 pt
idealHeight (#476 already tokens this at DS.Layout.problemsIdealHeight).
Kept #476's "N not implemented" gap count rendering.

Adapted WorkspaceShellTests off the 180 pt assertion. Added
testThreeGapsThenWarningThenErrorListsTheErrorFirst.

Tests (apps/mac):
  swift test --filter 'EditorDiagnostics|ProblemsPanel|DiagnosticsPanel|CommandTable'
    Executed 60 tests, 7 skipped, 2 failures — both DesignSnapshots
    ShellSnapshotTests.testProblemsPanel (known-failing class on this Mac).
    Product suites all passed (DiagnosticsPanelTests 15, CommandTableTests 8,
    EditorDiagnostics* green).
  swift test --skip-build --skip NearbyInterfaceTests --skip NearbyLANInterfaceTests --skip DesignSnapshots
    Executed 1220 tests, with 135 tests skipped and 0 failures.
  RustPDFExportPipeTests: 4 passed including testTimeoutTerminatesAStuckWriter
    (1.002 s); no isolation re-run.

Next: push this branch.

Implementation-Agent: cursor-agent cursor-grok-4.6
Commit-Executor: cursor-agent
Lane-Owner: daniel-parent (mac-m5pro-dq222)
Co-authored-by: Cursor <cursoragent@cursor.com>
GoKubar pushed a commit that referenced this pull request Sep 15, 2026
… gaps (ordering only, on #476) (#411)

* wip(#76): failing tests for Problems list bucket order

Add DiagnosticsPanelTests that pin errors-then-warnings-then-gaps
across two documents, Copy Diagnostics walking that order, and
⌘⌥] starting on the first author error rather than an earlier gap.

What was run: `swift test --filter` of the three new methods in
apps/mac. Result: Executed 3 tests, with 7 failures (0 unexpected)
in 0.238 seconds. Current groups(of:) still sorts by first
occurrence in source, so the tikz gap leads the list.

Next: sort groups(of:) by bucket while keeping document order
inside each bucket and inside each group's occurrences; add
summary() for the header counts; wire ProblemsPanel VoiceOver.

Open questions: whether ProblemsPanel.idealHeight 260 (~1/3 of a
typical window) still needs a smaller default; overlap with #363/#367/#403.

Implementation-Agent: cursor-agent cursor-grok-4.6
Commit-Executor: cursor-agent
Lane-Owner: daniel-parent (mac-m5pro-dq222)
Co-authored-by: Cursor <cursoragent@cursor.com>

* wip(#76): sort Problems groups by bucket and show header counts

groups(of:) lists author errors, then warnings, then FlashTeX gaps,
keeping document order inside each bucket and inside each group's
occurrences. result.diagnostics is not reordered. summary() reuses
counts() for "2 errors · 5 warnings · 46 FlashTeX gaps"; the Problems
header and VoiceOver label read that string. Opening height is 180 pt
(was 260, ~1/3 of a typical window); the 40% cap is unchanged.

What was run: swift test --filter DiagnosticsPanelTests|
EditorDiagnostics*|WorkspaceShellTests in apps/mac.
Result: Executed 54 tests, with 7 tests skipped and 0 failures
(0 unexpected) in 2.107 seconds.

Next: full `swift test` from apps/mac; overlap check; push.

Open questions: none on ordering/header. Existing AppStorage values
of 260 remain until the user resizes.

Implementation-Agent: cursor-agent cursor-grok-4.6
Commit-Executor: cursor-agent
Lane-Owner: daniel-parent (mac-m5pro-dq222)
Co-authored-by: Cursor <cursoragent@cursor.com>

* wip(#76): restore coloured Problems header count chips

Restore the three SF Symbol count labels (errors red, warnings orange,
gaps puzzle-piece secondary) including zeros so an all-gap document still
shows the error column. VoiceOver uses summary() once via .ignore on the
chips; the panel stays .contain so the list remains accessible.
DiagnosticsListView caption matches. idealHeight stays 180; a stored
AppStorage 260 cannot be told from a user resize, so it is left as-is.

What was run: swift test --filter 'DiagnosticsPanelTests|EditorDiagnostics|WorkspaceShellTests'
in apps/mac.
Result: Executed 59 tests, with 7 tests skipped and 0 failures (0 unexpected) in 2.112 seconds.

Next: daniel-parent review / PR.

Open questions: none on the header. AppStorage 260 left as-is.

Implementation-Agent: cursor-agent cursor-grok-4.6
Commit-Executor: cursor-agent
Lane-Owner: daniel-parent (mac-m5pro-dq222)
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@GoKubar
GoKubar deleted the agent/kabir-claude/ui-design-pass-2 branch September 16, 2026 04:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants