Tighten the mode-home hero rhythm and put its glyphs on the icon scale - #1815
Conversation
The Answer home read as a loose, unresolved stack on a phone and its glyphs looked soft. Measured in Chromium rather than judged by eye, four of those impressions were defects in code. Reserve the phone copy height once, on the pair ----------------------------------------------- ModeHomeHero reserved two line-boxes on the heading AND two on the subtitle (`max-sm:min-h-[2lh]` on each) and centred each element in its own reserve. With a one-line title, half of each element's unused reserve collected between them: at 393px the subtitle sat 27.1px from its own title while the medallion sat 6px away, so the pair that should read as one unit was spread wider than the group boundary above it. Reserving once on the wrapping group puts the slack outside the pair, which now holds its declared 4px (2.4px of rendered text gap) at every width. The reserve is also banded to the measured wrap points instead of assuming the 320px worst case everywhere. Rendering all 13 ui-copy pairs across 320-440px gives 2+2 lines below 323px, 2+1 to 411px and 1+1 from 412px, so the old flat reserve spent 20px of dead space at 393px and 49px at 430px for no stability gain. Cross-mode height is unchanged within each band, so the toggle still cannot shift the composer. Scale the medallion continuously -------------------------------- The tile stepped 48 -> 48 -> 56 at sm/lg, which served the 768-1023px tablet band the phone size while the heading beside it had already grown to 34.56px. --spacing-hero-medallion tracks the viewport the way --text-hero does. The 3rem floor is load-bearing: ui-tools.spec.ts pins the tile at exactly 48px at 390px across seven mode homes, and the floor holds through 430px. Icon quality ------------ The phone composer forced its glyphs to 1.1rem (17.6px); lucide draws on a 24-unit grid with a 2px stroke, so every stroke landed on a sub-pixel boundary and the "+" and send glyphs rendered soft. They now use --spacing-icon-lg (20px), the same size they already had from 431px up. The hero glyph, header Menu/ChevronDown/X/MessageSquarePlus, the mode pill and the popup "+" move onto size-icon-* (the hero's 28px lg step was not on the scale at all), and the two largest/smallest glyphs get size-matched strokeWidth so absolute stroke weight stops swinging 1.17px-2.33px across one screen. Privacy notice -------------- The wrapped link spent a full 48px tap box on a 16px line. The negative margin is bottom-only: split symmetrically it overhangs the line above by 8px, and because that line is 16px tall the overhang reaches its centre, so tapping the "Do not enter patient-identifiable information." sentence navigated to /privacy. Bottom-only keeps the 48px target ui-accessibility.spec.ts measures, reclaims the same 16px, and leaves the sentence inert. Governance wording and the /privacy href are untouched. That 16px is why --spacing-mode-home-composer-phone drops to 6.625rem: the settled phone composer block measures 106px, so the old 122px left an empty band. Every width now reserves exactly its natural height. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VX8tTx165iiKXz78uHb8J1
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (9)
🚧 Files skipped from review as they are similar to previous changes (9)
📝 WalkthroughWalkthroughThis change updates design-token contracts and shadow usage, removes fuzzy search fallbacks, changes universal-search placement, replaces the medication section rail, refines responsive layouts, adds breadcrumb headers, and standardizes Node 24 container validation. ChangesApplication, design-system, and tooling updates
Estimated code review effort: 4 (Complex) | ~60 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed: dependency version conflict. Check your lock file or package.json. Comment |
This pull request has been ignored for the connected project Preview Branches by Supabase. |
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VX8tTx165iiKXz78uHb8J1
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit:f8701a524f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Uh oh!
There was an error while loading. Please reload this page.
CI triageCI failed on this PR. Automated classification of the 2 failed job(s):
Compared with main CI run #9791 (failure). Classification is evidence routing, not permission to ignore a failure. Exact quarantined Playwright identities remain governed by the flake ledger. |
BigSimmo
commented
Aug 11, 2026
There was a problem hiding this comment.
Actionable comments posted: 9
🧹 Nitpick comments (2)
src/components/mode-nav/mode-nav.tsx (1)
64-101: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMove the new visual measurements into theme tokens.
The new arbitrary dimensions create separate design values outside the shared token contract.
src/components/mode-nav/mode-nav.tsx#L64-L101: Replace the new icon, badge, rule-offset, and rule-radius literals with named theme tokens.src/components/in-page-nav/in-page-section-rail.tsx#L99-L99: Reuse the corresponding named badge-size token.As per coding guidelines,
**/*.{ts,tsx,css}requires: “Use Tailwind 4@themetokens in src/app/globals.css and the repository's intentionally unlayered component CSS rather than introducing hardcoded design values.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/mode-nav/mode-nav.tsx` around lines 64 - 101, Move the new icon size, badge size, rule offset, and rule radius values used by the mode-nav component into named Tailwind 4 theme tokens defined in the shared theme CSS, then reference those tokens from the mode-nav classes. Update the badge sizing in src/components/in-page-nav/in-page-section-rail.tsx:99 to reuse the same named badge-size token; both affected sites require changes, with no remaining hardcoded arbitrary design dimensions.Source: Coding guidelines
tests/favourites-auth-gate.test.ts (1)
92-93: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winAdd a behavioral access test for
UniversalSearchAlsoMatches.These assertions only confirm that two identifiers exist in the source. The DOM authentication test mocks this component, so it does not execute the access gate. A dead or inverted gate can still pass.
Render
UniversalSearchAlsoMatchesfor a user without Favourites access. Assert that it renders no Favourites result or Favourites href.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/favourites-auth-gate.test.ts` around lines 92 - 93, Add a behavioral test that renders UniversalSearchAlsoMatches with a user lacking Favourites access and verifies the output contains neither a Favourites result nor a Favourites href. Keep the existing source-identifier assertions, but ensure the new test exercises the real component and access gate rather than the mocked DOM authentication path.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.design-sync/conventions.md:
- Around line 34-36: Update the earlier shadow-alias guidance in conventions.md
to remove the legacy-only and retirement language, and state that the supported
--shadow-* aliases, including --shadow-tight, follow the tier mappings defined
in the later alias list and docs/design-system.md. Preserve --shadow-inset as
bespoke.
In `@Dockerfile.worker`:
- Line 31: Update Dockerfile.worker to copy
scripts/check-installed-lock-parity.mjs into the image before both worker npm ci
commands, ensuring the postinstall hook can locate it in each worker install
stage.
In `@docs/branch-review-ledger.md`:
- Around line 884-886: Update the three ledger rows for 2026-08-11 to include
the decisive output line from each reported verification command, not just test
counts, gate names, or status labels. Preserve the explicit pre-existing
root-permission failure and the “verify:ui NOT run” status, and keep the
existing verification summaries unchanged apart from adding substantiating
command output.
In `@docs/design-system/GATES.md`:
- Line 116: Reconcile the design-system gate by removing --shadow-tight from
legacyShadowAliases if the token inventory and design direction establish it as
the canonical role alias for --e1. Update check:design-system-contract to
ratchet only the remaining legacy aliases, and revise the GATES.md row so new
--shadow-tight usage is allowed while existing legacy aliases remain blocking.
In `@docs/design-system/SPEC.md`:
- Around line 266-267: Update the `--shadow-focus` status wording in the alias
cleanup section of `SPEC.md` from completed deletion to scheduled deletion,
consistent with the open PR 9 entry and the planned status in `TOKENS.md`; leave
the PR 9 tracking entry unchanged.
In `@docs/outstanding-issues.md`:
- Around line 330-331: Update the issues:next-id marker in the
outstanding-issues ledger to 304, leaving the declared `#302` and `#303` rows
unchanged.
- Around line 298-299: Deduplicate the issue records in
docs/outstanding-issues.md so each issue has one canonical entry: remove or
archive the open `#261` row because it is already archived, and resolve the
duplicate `#284/`#296 root-container records by retaining one canonical issue and
eliminating the redundant open/archive entries. Update the affected open and
archived sections consistently without changing unrelated issue records.
In `@src/components/in-page-nav/in-page-nav-header.tsx`:
- Line 397: Update the sheet focus-return handling around returnFocusRef so it
does not always target sectionTriggerRef when that trigger is hidden at the sm
breakpoint. Use a visible active rail button as the fallback target, or close
the sheet when the trigger becomes hidden, while preserving sectionTriggerRef
for visible phone layouts.
In `@src/components/privacy-input-notice.tsx`:
- Around line 36-44: Update the privacy link’s className to remove the
sm:min-h-0 override, preserving min-h-tap at every breakpoint so the link
remains at the required tap size. If needed, adjust the surrounding composer
reserve separately without weakening the link’s minimum height.
---
Nitpick comments:
In `@src/components/mode-nav/mode-nav.tsx`:
- Around line 64-101: Move the new icon size, badge size, rule offset, and rule
radius values used by the mode-nav component into named Tailwind 4 theme tokens
defined in the shared theme CSS, then reference those tokens from the mode-nav
classes. Update the badge sizing in
src/components/in-page-nav/in-page-section-rail.tsx:99 to reuse the same named
badge-size token; both affected sites require changes, with no remaining
hardcoded arbitrary design dimensions.
In `@tests/favourites-auth-gate.test.ts`:
- Around line 92-93: Add a behavioral test that renders
UniversalSearchAlsoMatches with a user lacking Favourites access and verifies
the output contains neither a Favourites result nor a Favourites href. Keep the
existing source-identifier assertions, but ensure the new test exercises the
real component and access gate rather than the mocked DOM authentication path.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b968d093-9d23-4669-8cdb-069b2d2d6833
📒 Files selected for processing (140)
.design-sync/conventions.mdAGENTS.mdDockerfileDockerfile.workerdocs/branch-review-ledger.mddocs/design-system.mddocs/design-system/GATES.mddocs/design-system/HANDOVER-2026-08-07.mddocs/design-system/SPEC.mddocs/design-system/TOKENS.mddocs/design-system/adoption-manifest.jsondocs/outstanding-issues.mddocs/redesign/02-design-direction.mddocs/redesign/permanent-colour-direction.mddocs/search-chrome-behaviour.mdscripts/design-system-contract-baseline.jsonsrc/app/globals.csssrc/app/mockups/answer-evidence-popups/page.tsxsrc/app/mockups/mode-dropdown/page.tsxsrc/components/ClinicalDashboard.tsxsrc/components/DocumentViewer.tsxsrc/components/applications-launcher-page.tsxsrc/components/calculator-mockups/calculator-ui.tsxsrc/components/calculator-mockups/directory-grid-mockup.tsxsrc/components/calculator-mockups/guided-flow-mockup.tsxsrc/components/calculator-mockups/search-page-mockup.tsxsrc/components/calculators/calculator-ui.tsxsrc/components/calculators/directory-grid.tsxsrc/components/calculators/guided-flow.tsxsrc/components/calculators/search-page.tsxsrc/components/clinical-dashboard/ClinicalSidebar.tsxsrc/components/clinical-dashboard/account-setup-dialog.tsxsrc/components/clinical-dashboard/cross-mode-links.tsxsrc/components/clinical-dashboard/dashboard-nav.tsxsrc/components/clinical-dashboard/differentials-home.tsxsrc/components/clinical-dashboard/document-search-results.tsxsrc/components/clinical-dashboard/evidence-panels.tsxsrc/components/clinical-dashboard/favourites-command-library-page.tsxsrc/components/clinical-dashboard/favourites-hub.tsxsrc/components/clinical-dashboard/favourites-library-nav.tsxsrc/components/clinical-dashboard/global-search-shell.tsxsrc/components/clinical-dashboard/master-search-header.tsxsrc/components/clinical-dashboard/medication-nav-header.tsxsrc/components/clinical-dashboard/medication-prescribing-workspace.tsxsrc/components/clinical-dashboard/mode-action-popup.tsxsrc/components/clinical-dashboard/settings-dialog.tsxsrc/components/clinical-dashboard/signed-image.tsxsrc/components/clinical-dashboard/universal-search-command-surface.tsxsrc/components/differentials/diagnosis-map-panel.tsxsrc/components/differentials/differential-detail-page.tsxsrc/components/document-phone-fused-directions-mockups.tsxsrc/components/document-phone-title-mockups.tsxsrc/components/document-phone-title-refined-mockups.tsxsrc/components/document-search-mockups.tsxsrc/components/document-top-navigation-mockups.tsxsrc/components/document-viewer/document-clinical-summary.tsxsrc/components/document-viewer/non-pdf-source-preview.tsxsrc/components/document-viewer/pdf-canvas-viewer.tsxsrc/components/document-viewer/section-nav.tsxsrc/components/dsm/dsm-comparison-page.tsxsrc/components/dsm/dsm-differential-considerations-page.tsxsrc/components/dsm/dsm-search-page.tsxsrc/components/factsheets/factsheets-data.tssrc/components/factsheets/factsheets-search-page.tsxsrc/components/favourites-page-mockups/favourites-page-mockup-page.tsxsrc/components/forms/forms-search-results-page.tsxsrc/components/formulation/formulation-builder-page.tsxsrc/components/formulation/formulation-home-page.tsxsrc/components/in-page-nav/in-page-nav-header.tsxsrc/components/in-page-nav/in-page-section-rail.tsxsrc/components/master-document-flow-mockups.tsxsrc/components/mode-home-page-skeleton.tsxsrc/components/mode-home-template.tsxsrc/components/mode-nav/mode-nav.tsxsrc/components/patient-safety-plan.tsxsrc/components/phone-mode-sheet-yes-mockups.tsxsrc/components/privacy-input-notice.tsxsrc/components/privacy-live-signal-perfected-mockups.tsxsrc/components/pwa-lifecycle.tsxsrc/components/registry-record-loader.tsxsrc/components/services/service-detail-page.tsxsrc/components/services/services-navigator-page.tsxsrc/components/settings-search-mockups/settings-search-mockup-page.tsxsrc/components/source-overlay-redesign-mockups.tsxsrc/components/specifiers/specifier-builder-page.tsxsrc/components/specifiers/specifier-compare-page.tsxsrc/components/specifiers/specifier-map-page.tsxsrc/components/specifiers/specifier-ui.tsxsrc/components/therapy-compass/bindings.tsxsrc/components/therapy-compass/controls.tssrc/components/therapy-compass/data/select.tssrc/components/therapy-compass/screens/compare-screen.tsxsrc/components/therapy-compass/screens/detail-screen.tsxsrc/components/therapy-compass/screens/other-screen.tsxsrc/components/therapy-compass/screens/recommend-screen.tsxsrc/components/therapy-compass/screens/sheets-screen.tsxsrc/components/tools-page-mockups/rectangle-direction-mockups.tsxsrc/components/tools-page-mockups/split-pane-refined-mockups.tsxsrc/components/tools-page-mockups/task-directory-mockup.tsxsrc/components/tools-page-mockups/tools-page-mockup-page.tsxsrc/components/ui-primitives.tsxsrc/components/ui/button.tsxsrc/components/ui/document-frame.tsxsrc/components/ui/segmented-control.tsxsrc/components/universal-search-redesign-mockups.tsxsrc/lib/catalog-search.tssrc/lib/formulation.tssrc/lib/mode-secondary-navigation.tssrc/lib/specifiers.tssrc/lib/tailwind-merge.tssrc/lib/therapies.tstests/audit-navigation-auth-regressions.test.tstests/catalog-search.test.tstests/design-token-contract.test.tstests/differentials-compare-selection.dom.test.tsxtests/factsheets-data.test.tstests/favourites-auth-gate.dom.test.tsxtests/favourites-auth-gate.test.tstests/favourites-empty-state.dom.test.tsxtests/formulation.test.tstests/helpers/style-contracts.tstests/in-page-nav-route-sections.dom.test.tsxtests/medication-prescribing-workspace.dom.test.tsxtests/mode-menu-prefetch.dom.test.tsxtests/mode-nav-contract.test.tstests/mode-secondary-navigation.test.tstests/page-secondary-navigation.dom.test.tsxtests/search-route-ownership.test.tstests/shared-home-empty-state.dom.test.tsxtests/specifiers.test.tstests/style-contract-registry.test.tstests/tailwind-merge-config.test.tstests/therapy-card-preview.test.tstests/ui-overlap.spec.tstests/ui-overlay-css-contract.test.tstests/ui-route-coverage.spec.tstests/ui-smoke.spec.tstests/ui-specifiers.spec.tstests/ui-universal-search.spec.tsworker/validate-runtime.ts
💤 Files with no reviewable changes (13)
- src/components/clinical-dashboard/global-search-shell.tsx
- tests/specifiers.test.ts
- docs/design-system/HANDOVER-2026-08-07.md
- tests/formulation.test.ts
- src/lib/formulation.ts
- src/lib/therapies.ts
- tests/factsheets-data.test.ts
- tests/ui-route-coverage.spec.ts
- src/lib/specifiers.ts
- src/components/ClinicalDashboard.tsx
- src/components/therapy-compass/data/select.ts
- tests/page-secondary-navigation.dom.test.tsx
- tests/ui-universal-search.spec.ts
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
…815-babysit-unblock
There was a problem hiding this comment.
Pull request overview
This PR combines mode-home hero/icon refinements with broader search, navigation, design-token, runtime, and container changes. The review found duplicate cross-mode results, an incorrect phone composer reserve, and a focus-restoration regression.
Changes:
- Refines responsive hero spacing, medallion sizing, glyph scale, and composer geometry.
- Expands cross-mode search and changes secondary navigation/search matching.
- Reintroduces the
--shadow-tightalias and standardizes its usage across UI surfaces.
Reviewed changes
Copilot reviewed 141 out of 141 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
worker/validate-runtime.ts | Pins worker to Node 24. |
tests/ui-universal-search.spec.ts | Formatting-only test change. |
tests/ui-specifiers.spec.ts | Updates specifier headings. |
tests/ui-route-coverage.spec.ts | Allows new breadcrumbs. |
tests/ui-overlay-css-contract.test.ts | Pins composer icon token. |
tests/ui-overlap.spec.ts | Removes phone ticker assertions. |
tests/therapy-card-preview.test.ts | Removes typo-search coverage. |
tests/tailwind-merge-config.test.ts | Updates shadow-token fixture. |
tests/style-contract-registry.test.ts | Clarifies parser regression context. |
tests/specifiers.test.ts | Removes fuzzy-search coverage. |
tests/shared-home-empty-state.dom.test.tsx | Adds hero reserve contracts. |
tests/search-route-ownership.test.ts | Updates phone composer reserve. |
tests/page-secondary-navigation.dom.test.tsx | Relaxes Find-link assertion. |
tests/mode-secondary-navigation.test.ts | Updates navigation state behavior. |
tests/mode-nav-contract.test.ts | Tracks renamed slot component. |
tests/mode-menu-prefetch.dom.test.tsx | Mocks cross-mode results. |
tests/medication-prescribing-workspace.dom.test.tsx | Isolates cross-mode component. |
tests/in-page-nav-route-sections.dom.test.tsx | Removes overflow/focus coverage. |
tests/helpers/style-contracts.ts | Revises ticker exemptions. |
tests/formulation.test.ts | Removes typo-search coverage. |
tests/favourites-empty-state.dom.test.tsx | Mocks cross-mode results. |
tests/favourites-auth-gate.test.ts | Covers cross-mode favourites gating. |
tests/favourites-auth-gate.dom.test.tsx | Mocks cross-mode results. |
tests/factsheets-data.test.ts | Removes typo-search expectation. |
tests/differentials-compare-selection.dom.test.tsx | Mocks cross-mode results. |
tests/design-token-contract.test.ts | Restores shadow alias contract. |
tests/catalog-search.test.ts | Removes fuzzy-search tests. |
tests/audit-navigation-auth-regressions.test.ts | Adds cross-mode mounting contracts. |
src/lib/therapies.ts | Removes fuzzy therapy matching. |
src/lib/tailwind-merge.ts | Registers medallion spacing token. |
src/lib/specifiers.ts | Removes fuzzy specifier matching. |
src/lib/mode-secondary-navigation.ts | Routes searches to mode homes. |
src/lib/formulation.ts | Removes fuzzy formulation matching. |
src/lib/catalog-search.ts | Deletes fuzzy-search implementation. |
src/components/universal-search-redesign-mockups.tsx | Uses shadow role alias. |
src/components/ui/segmented-control.tsx | Uses shadow role alias. |
src/components/ui/document-frame.tsx | Uses shadow role alias. |
src/components/ui/button.tsx | Uses shadow role alias. |
src/components/ui-primitives.tsx | Updates shared shadow recipes. |
src/components/tools-page-mockups/tools-page-mockup-page.tsx | Updates mockup shadows. |
src/components/tools-page-mockups/task-directory-mockup.tsx | Updates mockup shadows. |
src/components/tools-page-mockups/split-pane-refined-mockups.tsx | Updates mockup shadows. |
src/components/tools-page-mockups/rectangle-direction-mockups.tsx | Updates mockup shadows. |
src/components/therapy-compass/screens/sheets-screen.tsx | Updates action shadow. |
src/components/therapy-compass/screens/recommend-screen.tsx | Updates card shadow. |
src/components/therapy-compass/screens/other-screen.tsx | Updates card shadow. |
src/components/therapy-compass/screens/detail-screen.tsx | Updates action shadow. |
src/components/therapy-compass/screens/compare-screen.tsx | Updates comparison shadow. |
src/components/therapy-compass/data/select.ts | Removes fuzzy therapy matching. |
src/components/therapy-compass/controls.ts | Updates control shadow. |
src/components/therapy-compass/bindings.tsx | Updates segment shadow. |
src/components/specifiers/specifier-ui.tsx | Removes old header; tokenizes taps. |
src/components/specifiers/specifier-map-page.tsx | Adds breadcrumb and explanatory header. |
src/components/specifiers/specifier-compare-page.tsx | Adds breadcrumb and explanatory header. |
src/components/specifiers/specifier-builder-page.tsx | Revises builder heading. |
src/components/source-overlay-redesign-mockups.tsx | Updates mockup shadows. |
src/components/settings-search-mockups/settings-search-mockup-page.tsx | Updates mockup shadows. |
src/components/services/services-navigator-page.tsx | Updates service-surface shadows. |
src/components/services/service-detail-page.tsx | Updates contact-tile shadow. |
src/components/registry-record-loader.tsx | Updates action shadow. |
src/components/pwa-lifecycle.tsx | Updates PWA notice shadows. |
src/components/privacy-live-signal-perfected-mockups.tsx | Updates sticky-header shadow. |
src/components/privacy-input-notice.tsx | Resizes icon and adjusts link classes. |
src/components/phone-mode-sheet-yes-mockups.tsx | Updates selected-card shadow. |
src/components/patient-safety-plan.tsx | Updates active/emergency shadows. |
src/components/mode-nav/nav-slot-ink.tsx | Moves underline radius to token. |
src/components/mode-home-template.tsx | Refines hero rhythm and icon scale. |
src/components/mode-home-page-skeleton.tsx | Aligns skeleton with hero geometry. |
src/components/master-document-flow-mockups.tsx | Updates mockup shadows. |
src/components/in-page-nav/in-page-nav-header.tsx | Simplifies section rail and focus return. |
src/components/formulation/formulation-home-page.tsx | Adds cross-mode matches. |
src/components/formulation/formulation-builder-page.tsx | Updates builder shadows. |
src/components/forms/forms-search-results-page.tsx | Updates result shadows. |
src/components/favourites-page-mockups/favourites-page-mockup-page.tsx | Updates mockup shadows. |
src/components/factsheets/factsheets-search-page.tsx | Updates action shadow. |
src/components/factsheets/factsheets-data.ts | Removes fuzzy factsheet matching. |
src/components/dsm/dsm-search-page.tsx | Updates comparison shadows. |
src/components/dsm/dsm-differential-considerations-page.tsx | Updates action shadow. |
src/components/dsm/dsm-comparison-page.tsx | Updates action shadow. |
src/components/DocumentViewer.tsx | Updates document chrome shadows. |
src/components/document-viewer/section-nav.tsx | Updates section-card shadow. |
src/components/document-viewer/pdf-canvas-viewer.tsx | Updates PDF surface shadows. |
src/components/document-viewer/non-pdf-source-preview.tsx | Updates preview affordance shadow. |
src/components/document-viewer/document-clinical-summary.tsx | Updates summary icon shadows. |
src/components/document-top-navigation-mockups.tsx | Updates mockup header shadow. |
src/components/document-search-mockups.tsx | Updates mockup control shadows. |
src/components/document-phone-title-refined-mockups.tsx | Updates pane shadow. |
src/components/document-phone-title-mockups.tsx | Updates pane shadow. |
src/components/document-phone-fused-directions-mockups.tsx | Updates pane shadow. |
src/components/differentials/differential-detail-page.tsx | Updates compare-button shadow. |
src/components/differentials/diagnosis-map-panel.tsx | Updates warning-badge shadow. |
src/components/ClinicalDashboard.tsx | Removes ticker and favourites mount. |
src/components/clinical-dashboard/signed-image.tsx | Updates image-action shadow. |
src/components/clinical-dashboard/settings-dialog.tsx | Updates switch shadow. |
src/components/clinical-dashboard/mode-action-popup.tsx | Uses icon-scale class. |
src/components/clinical-dashboard/medication-prescribing-workspace.tsx | Adds cross-mode matches. |
src/components/clinical-dashboard/medication-nav-header.tsx | Renames Additional section. |
src/components/clinical-dashboard/master-search-header.tsx | Removes ticker and scales glyphs. |
src/components/clinical-dashboard/global-search-shell.tsx | Removes ticker configuration. |
src/components/clinical-dashboard/favourites-library-nav.tsx | Updates favourites shadows. |
src/components/clinical-dashboard/favourites-hub.tsx | Updates hub shadows. |
src/components/clinical-dashboard/favourites-command-library-page.tsx | Updates favourites shadows. |
src/components/clinical-dashboard/evidence-panels.tsx | Updates selected-state shadow. |
src/components/clinical-dashboard/document-search-results.tsx | Adds cross-mode matches and shadows. |
src/components/clinical-dashboard/differentials-home.tsx | Adds cross-mode matches. |
src/components/clinical-dashboard/dashboard-nav.tsx | Updates badge shadow. |
src/components/clinical-dashboard/cross-mode-links.tsx | Updates hover shadow. |
src/components/clinical-dashboard/ClinicalSidebar.tsx | Updates new-chat shadow. |
src/components/clinical-dashboard/account-setup-dialog.tsx | Updates submit shadow. |
src/components/calculators/search-page.tsx | Updates calculator shadows. |
src/components/calculators/guided-flow.tsx | Updates result action shadow. |
src/components/calculators/directory-grid.tsx | Updates search shadow. |
src/components/calculators/calculator-ui.tsx | Updates score/option shadows. |
src/components/calculator-mockups/search-page-mockup.tsx | Updates mockup shadows. |
src/components/calculator-mockups/guided-flow-mockup.tsx | Updates mockup action shadow. |
src/components/calculator-mockups/directory-grid-mockup.tsx | Updates mockup search shadow. |
src/components/calculator-mockups/calculator-ui.tsx | Updates mockup control shadows. |
src/components/applications-launcher-page.tsx | Updates launcher shadows. |
src/app/mockups/mode-dropdown/page.tsx | Updates dropdown mockup shadows. |
docs/search-chrome-behaviour.md | Documents scrolling medication rail. |
docs/redesign/permanent-colour-direction.md | Restores shadow alias guidance. |
docs/redesign/02-design-direction.md | Restores shadow alias guidance. |
docs/design-system/TOKENS.md | Revises shadow deprecations. |
docs/design-system/SPEC.md | Revises shadow cleanup status. |
docs/design-system/HANDOVER-2026-08-07.md | Removes prior focus correction. |
docs/design-system/adoption-manifest.json | Removes affected test mappings. |
docs/design-system.md | Updates shadow usage guidance. |
docs/branch-review-ledger.md | Records review and unblock entries. |
Dockerfile.worker | Downgrades worker image to Node 24. |
Dockerfile | Downgrades app image to Node 24. |
AGENTS.md | Simplifies generated Next.js guidance. |
.design-sync/conventions.md | Restores shadow alias convention. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Restore the phone bottom-only -mb-4 privacy-link reclaim that the reduced composer reserve assumes, cancel it on the calculators fixed dock so the focus ring stays in-viewport, remove the duplicate documents Also Matches mount under the dashboard owner, and restore section-sheet focus to a visible rail control when the title disclosure is sm:hidden. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
BigSimmo
commented
Aug 11, 2026
Babysit summary — PR 1815Tip: Fixed
Dispositioned (no code)
ThreadsAll 13 previously unresolved review threads replied + resolved on this tip. Required CIRe-running on Local gates (decisive)
Residual risks
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Dockerfile.worker`:
- Around line 46-48: Add a production-compatible lock-parity validation after
the npm ci step that checks only the installed production dependency set without
requiring .codex-installed-tree.json or dev-only packages; wire it into the
Dockerfile using the copied check-installed-lock-parity.mjs helper, or remove
that helper copy and revise the surrounding comment if parity validation is
intentionally not needed.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 653965f7-402e-42ea-84a0-2bed5c668715
📒 Files selected for processing (16)
DockerfileDockerfile.workerdocs/branch-review-ledger.mdsrc/app/globals.csssrc/components/ClinicalDashboard.tsxsrc/components/calculators/search-page.tsxsrc/components/clinical-dashboard/document-search-results.tsxsrc/components/clinical-dashboard/settings-dialog.tsxsrc/components/in-page-nav/in-page-nav-header.tsxsrc/components/mode-nav/nav-slot-ink.tsxsrc/components/privacy-input-notice.tsxsrc/components/ui/segmented-control.tsxsrc/lib/tailwind-merge.tstests/in-page-nav-header.dom.test.tsxtests/privacy-ui.test.tstests/ui-smoke.spec.ts
💤 Files with no reviewable changes (1)
- src/components/clinical-dashboard/document-search-results.tsx
🚧 Files skipped from review as they are similar to previous changes (8)
- src/components/clinical-dashboard/settings-dialog.tsx
- src/components/ui/segmented-control.tsx
- src/lib/tailwind-merge.ts
- src/components/ClinicalDashboard.tsx
- docs/branch-review-ledger.md
- tests/ui-smoke.spec.ts
- Dockerfile
- src/app/globals.css
Uh oh!
There was an error while loading. Please reload this page.
BigSimmo
commented
Aug 12, 2026
Review summary (babysit pr-1815):
|
BigSimmo
commented
Aug 12, 2026
Babysit review (scope: exact babysit-pr)Snapshot (current GitHub head):
Outcome: dispositioned (local PR review complete; no code fix required). Merge remains with you. |
BigSimmo
commented
Aug 12, 2026
Babysit snapshot for PR #1815
Fixes made
Reviews / threads
Required checks currently running on head
Local proof
Push status
Next blocker to clear is required CI completion. |
BigSimmo
commented
Aug 12, 2026
Babysit review summary
|
Uh oh!
There was an error while loading. Please reload this page.
Four merge-safe intake requests, no canonical ledger edit: - P1 rec: no gate detects a merged PR whose content is silently reverted by a later merge resolution. Blob sweep over origin/main found seven such PRs since 2026-08-06, six first wiped at one commit in the PR #1815 unblock chain. The reverts took each PR's tests in the same stroke, which is why nothing went red. - P2 task: re-land PR #1800 (fuzzy catalogue search) with the #310 one-edit cap applied in the same commit. - P2 task: re-land PR #1803 (--shadow-tight retirement); 67 files on main still reference the retired alias. - update #310: re-scoped. The defect is not reachable on main because the matcher is absent, not because it was fixed, so the row must not be closed and the fix belongs in the #1800 re-land. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuYJz8hauCsCdx8r4fXiZU
Summary
ModeHomeHeroreserved two line-boxes on the heading and two on the subtitle (max-sm:min-h-[2lh]on each) and centred each element inside its own reserve. With a one-line title, half of each element's unused reserve collected between them: measured at 393px the subtitle sat 27.1px from its own title while the medallion sat 6px away, so the pair that should read as one unit was spread wider than the group boundary above it. Reserving once on the wrapping group moves the slack outside the pair, which now holds its declared 4px (2.4px of rendered text gap) at every width.src/lib/ui-copy.tstitle/subtitle pairs across 320–440px gives 2+2 lines below 323px, 2+1 through 411px, and 1+1 from 412px. The old flat reserve assumed the 320px worst case everywhere, spending 20px of dead space at 393px and 49px at 430px for no stability gain. Cross-mode wrapper height is unchanged within each band, so the mode toggle still cannot shift the composer.sm/lg, which served the 768–1023px tablet band the phone size while the heading beside it had already grown to 34.56px. New--spacing-hero-medalliontracks the viewport the way--text-herodoes; its 3rem floor is load-bearing becausetests/ui-tools.spec.tspins the tile at exactly 48px at 390px across seven mode homes, and that floor holds through 430px.max-width: 430pxblock forced.chat-composer-icon-button svg/.chat-send-button svgto1.1rem(17.6px). Lucide draws on a 24-unit grid with a 2px stroke, so a fractional box lands every stroke on a sub-pixel boundary. They now usevar(--spacing-icon-lg)(20px) — the same size these glyphs already had from 431px up. The pinned 44px button and the dock height that block protects are untouched.Menu/ChevronDown/X/MessageSquarePlus, the mode pill and the mode-action+move tosize-icon-*; the hero's oldlg:h-7(28px) was not on the scale at all. The largest and smallest glyphs get a size-matchedstrokeWidthso absolute stroke weight stops swinging 1.17px–2.33px across one screen./privacylink spent a full 48px tap box on a 16px line. The negative margin is deliberately bottom-only: split symmetrically (-my-2) the box overhangs the line above by 8px, and because that line is only 16px tall the overhang reaches its centre — verified byelementFromPoint, tapping the "Do not enter patient-identifiable information." sentence navigated to/privacy. Bottom-only keeps the full 48px target, reclaims the same 16px, and leaves the sentence inert. The APP-5 wording and the/privacyhref are unchanged.--spacing-mode-home-composer-phonedrops 7.625rem → 6.625rem and its pin intests/search-route-ownership.test.tsmoves with it. Every width now reserves exactly its natural height (dead band 0 at 320/360/375/390/393/430/640/768/1024/1280/1440). The wide value was already exact and is unchanged.tests/shared-home-empty-state.dom.test.tsxasserts the reserve sits on the copy wrapper and not on either child, and that the three measured bands stay inglobals.css, so a copy edit that pushes a mode onto another line fails loudly instead of silently reintroducing the jump.Verification
npm run verify:pr-localIt completed
check:runtime,check:installed-lock-parity,format:changed,lintandtypecheck, then halted atteston a single pre-existing failure unrelated to this diff, sobuildandcheck:rag:fixtureswere not reached. Both were then run directly and passed:The pre-existing failure is
tests/pr-handoff-stop.test.ts > emits handoff context only when the marker file exists. Itchmods a git dir to0o555and expects the marker write to fail, but this container runs as uid 0 and root bypasses file-permission checks, so the write succeeds. It reproduces identically on the base commit with this branch's changes stashed. Full suite otherwise:Test Files 1 failed | 555 passed (556),Tests 1 failed | 6043 passed | 4 skipped (6048).Design-system gates, all offline and all green:
npm run verify:uiwhen UI, routing, styling, browser behavior, reduced-motion, or forced-colors behavior changedUI verification not run: this container cannot launch the pinned Playwright build (repo Playwright wants Chromium r1234, the image ships r1194 — the
#255drift, where the repo's own guidance is to delegate browser proof to CI Production UI rather than force a mismatched binary). Chromium measurement was done against the image's r1194 binary, since layout geometry is unaffected by the browser revision, and is quoted throughout this PR; that is measurement evidence, not the blocking gate.verify:phone-chromeescalates to the fullverify:uifor anyglobals.cssormaster-search-header.tsxchange, so the complete Chromium gate needs to come from CI Production UI on this PR.npm run verify:releasebefore release or handoff confidence claimsNot run — no release or handoff confidence is claimed here, and it is provider-backed.
npm run eval:retrieval:quality— not applicable:classifyPullRequestFilesreportsragRanking: falseand no retrieval, ranking, selection, chunking or scoring behaviour is touched.npm run eval:rag/npm run eval:quality— not applicable: answer generation, the synthesis prompt and answer post-processing are untouched.npm run check:production-readiness— not run: provider-backed, and this diff changes presentation geometry only. No clinical workflow, environment, Supabase, source-governance or deployment behaviour changes.npm run check:deployment-readiness— not applicable: no deployment startup, hosting or rollout behaviour changed.Risk and rollout
stabilizePhoneCopyexists to prevent. That is measured rather than assumed: wrapper height is stable across mode copy within every band at 320/360/393/430/768/1024/1440, no horizontal overflow at any of those widths including the 320px blocking acceptance width, and the medallion resolves to exactly 48px at 390px where the suite pins it. The band thresholds are copy-dependent, which is why the new test pins them. Residual risk is that only CI can run the blocking Chromium journeys.git revertrestores the previous reserve, gaps, medallion steps and glyph sizes together. No data, schema or config migration is involved.Clinical Governance Preflight
/privacylink are byte-identical; the change makes the "Do not enter patient-identifiable information." sentence more correct by removing an 8px overhang that made it navigate to/privacywhen tapped.Clinical KB Database(sjrfecxgysukkwxsowpy) — unchanged; no Supabase configuration, env value or migration is in this diff.src/lib/demo-data.tsandisDemoMode()is untouched.Notes
tests/__screenshots__/linux/dashboard-shell-phone.png,dashboard-shell.png) will drift. Thevisual-baselinejob runs on push/schedule/dispatch only — deliberately not onpull_requestormerge_group, and not inpr-required— with pixel drift soft-failed, so this will not block the PR. Refresh post-merge withnpm run design-system:baselines:adoptagainst that run's artifact.next devrewrites a generated block intoAGENTS.mdwhenever the dev server runs (node_modules/next/dist/server/lib/generate-agent-files.js). That is unrelated to this change and was reverted rather than folded into this PR; it will keep reappearing for anyone running the dev server.Generated by Claude Code
Summary by CodeRabbit
New Features
Improvements
Bug Fixes