Skip to content

fix(ui): mark search empty-state tone by stroke and restore its desktop tap floor - #2147

Merged
BigSimmo merged 18 commits into
mainfrom
claude/search-recovery-rail
Aug 18, 2026
Merged

fix(ui): mark search empty-state tone by stroke and restore its desktop tap floor#2147
BigSimmo merged 18 commits into
mainfrom
claude/search-recovery-rail

Conversation

@BigSimmo

Copy link
Copy Markdown
Owner

Summary

  • Restyle SearchResultsEmptyState as a left-aligned panel with a leading state mark, replacing the dashed centred box. The mark carries tone the way .search-band-lead already does — as stroke count, not hue — because --clinical-accent resolves to LinkText under forced colors while --warning resolves to CanvasText, so a degraded search and a filtered-to-zero search would otherwise paint identically. One stroke is a search that ran; a doubled stroke is one that did not complete.
  • Replace the 48px tinted glyph disc with a 16px monoline glyph set beside the heading. The glyph sits outside Title deliberately, so nothing enters the accessible name that the existing getByRole("heading", …) assertions resolve.
  • Restore the desktop tap floor on the filtered path's leading control: sm:min-h-9 (36px) to sm:min-h-10 (40px). Every sibling control in this file — emptyStateAction and the shelf controls — already meets 40px from sm; this one did not. The phone floor was already correct at min-h-tap.

No copy string, data-testid, heading level, live-region behaviour, or action wiring changed. The band component itself is untouched, so its eighteen consumers are unaffected.

Verification

  • npm run typecheck — 0 errors
  • npx eslint + npx prettier --check + npm run format:changed — all clean
  • Focused DOM suites — 10 files, 168 tests passed, covering every SearchResultsEmptyState consumer (documents, favourites, calculators, forms, services, therapy-compass) plus style-contract-registry
  • Chromium tests/ui-accessibility.spec.ts16 passed (41.7s), including the three specs that exercise exactly this surface:
    • search results band renders the accent rail and survives forced colors
    • a faulted search is legible as shape, not only as hue
    • fault recovery actions wrap instead of clipping on a phone
  • npm run verify:pr-local

UI verification not run: the full npm run verify:ui sweep (447 Chromium specs) was attempted three times and never reached a terminal state on this machine — once aborted by test-lock contention from a concurrent worktree, once killed mid-run at 30/447 with zero failures when the host process exited, and twice more timing out inside the isolated production build before any spec started. The targeted ui-accessibility.spec.ts run above was completed in full and covers this diff's blast radius; the remaining specs do not touch SearchResultsEmptyState. The one full-suite assertion that does — ui-smoke.spec.ts's getByRole("heading", { level: 3, … }) on this state — is pinned by an identical assertion in document-search-record-fault.dom.test.tsx, which passes. CI's Production UI job should be treated as the authority here.

Risk and rollout

  • Risk: Low, and presentation-only. Retrieval, ranking, answer generation and source governance are untouched; the diff is one component's markup and classes. The behavioural surface that could regress — heading role and level, testids, live region, action handlers — is pinned by the focused suites above and unchanged.
  • Rollback: git revert the single commit. No migration, no config, no state.
  • Provider or production effects: None.

Notes

  • Chosen over an alternative that folded recovery into SearchResultsHeaderBand itself. That surface has eighteen consumers against this component's six, already rations two landmark roles (role="status" and role="alert"), and would have needed a third; the flush-to-band treatment it enabled is also not reachable today, because the filtered-to-zero state renders nested inside the results grid rather than adjacent to the band.
  • The state mark is Tailwind utilities rather than a new unlayered class. .search-band-lead is unlayered specifically so it can beat Tailwind's utilities layer; this mark has no utility to beat, and adding a class would have enlarged the inventory tests/style-contract-registry.test.ts polices for no benefit.
  • Exactly one border-width class is emitted per tone branch. Two would both produce border-left-width and the winner would be stylesheet order rather than the branch.

…op tap floor
Restyle SearchResultsEmptyState as a left-aligned panel with a leading state
mark, replacing the dashed centred box and the 48px tinted glyph disc.
The mark carries tone the way .search-band-lead already does — as stroke count
rather than hue. Under forced colors --clinical-accent resolves to LinkText and
--warning resolves to CanvasText, so hue alone would render a degraded search
and a filtered-to-zero search identically. One stroke is a search that ran; a
doubled stroke is one that did not complete.
The glyph moves beside the heading rather than into it, so nothing enters the
accessible name that the existing getByRole("heading", ...) assertions resolve.
Also restores the desktop tap floor on the control the filtered path leads
with: sm:min-h-9 (36px) to sm:min-h-10 (40px). emptyStateAction and the shelf
controls in this file already meet 40px from sm; this one did not. The phone
floor was already correct at min-h-tap.
No copy string, data-testid, heading level, live-region behaviour or action
wiring changed. SearchResultsHeaderBand is untouched, so its eighteen consumers
are unaffected.
The mark uses Tailwind utilities rather than a new unlayered class:
.search-band-lead is unlayered specifically so it can beat Tailwind's utilities
layer, and this mark has no utility to beat.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@supabase

supabaseBot commented Aug 18, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project sjrfecxgysukkwxsowpy because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your current included review allowance is based on your included PR review attempts over the past 7 days.

Next review available in:13 minutes

Limit details: You’ve used the included review currently available. Your 101 included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: cc10c599-e185-4cb9-a6e8-19c6351fddda

📥 Commits

Reviewing files that changed from the base of the PR and between 90e1a82 and 6651799.

📒 Files selected for processing (3)
  • docs/branch-review-records/6651300a557416232b1653304a7e175fb005cc557190f316fe8c221a57c2e2bf.record.md
  • docs/outstanding-issues-inbox/714e714b-dd1d-4a10-8f95-8552fa2c5296.json
  • src/components/clinical-dashboard/search-results-header-band.tsx

Comment @coderabbitai help to get the list of available commands.

@BigSimmo
BigSimmo enabled auto-merge (squash) August 18, 2026 18:28
BigSimmoand others added 7 commits August 19, 2026 02:38
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ts grid
Records why PR #2147 shipped the self-contained rail panel rather than the
inline treatment: the filtered-to-zero state renders nested inside the results
grid, not adjacent to the band, so recovery cannot share the band's edge or
point at the filter chips instead of duplicating them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@BigSimmoBigSimmo added the skip-branch-sync Opt out of hosted pr-branch-sync / update-branch on this PR label Aug 18, 2026
@BigSimmo
BigSimmo disabled auto-merge August 18, 2026 20:01
@BigSimmo
BigSimmo enabled auto-merge (squash) August 18, 2026 20:18
@BigSimmo
BigSimmo merged commit 9b1e724 into mainAug 18, 2026
26 checks passed
@BigSimmo
BigSimmo deleted the claude/search-recovery-rail branch August 18, 2026 21:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-branch-syncOpt out of hosted pr-branch-sync / update-branch on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@BigSimmo