[ { "file": "apps/web/src/theme.css", "reason": "Continuous loading indicator has an established local repeat period; no equal semantic duration token exists.", "cases": [ [ "motion", "animation", "button-loader-spin 800ms linear infinite", "CSS > @utility btn > &[aria-busy=\"true\"] [data-button-loader]", 1 ] ] }, { "file": "apps/web/src/theme.css", "reason": "Inset three-pixel radio selection ring is control geometry, not elevation; preserve checked and disabled state appearance.", "cases": [ [ "shadow", "box-shadow", "inset 0 0 0 3px var(--color-page)", "CSS > @utility choice-control > &[type=\"radio\"]:checked", 1 ], [ "shadow", "box-shadow", "inset 0 0 0 3px var(--color-gray-200)", "CSS > @utility choice-control > &[type=\"radio\"]:disabled:checked", 1 ] ] }, { "file": "apps/web/src/local-login-view.tsx", "reason": "Existing reduced-motion-gated Tailwind continuous loader uses its standard one-second linear spin; preserve its established behavior.", "cases": [ [ "utility", "class", "motion-safe:animate-spin", "class > LocalLoginView > > ", 1 ] ] }, { "file": "apps/web/src/design-audit/surfaces.css", "reason": "Continuous loading indicator has an established local repeat period; no equal semantic duration token exists.", "cases": [ [ "motion", "animation", "design-audit-spin 900ms linear infinite", "CSS > .design-audit-navigation-loading svg", 1 ] ] }, { "file": "apps/web/src/design-audit/foundations.tsx", "reason": "Specimen iterates a finite list of canonical token names; rendering the token being demonstrated requires a dynamic var() name.", "cases": [ [ "color", "background", "`var(${token})`", "style object > Foundations > ", 1 ], [ "typography", "font-size", "`var(${size})`", "style object > Foundations >
", 1 ], [ "radius", "border-radius", "`var(${token})`", "style object > Foundations > ", 1 ], [ "shadow", "box-shadow", "`var(${token})`", "style object > Foundations > ", 1 ] ], "sourceHash": "7736dc2ddcd49b36b90b85f387b3e497810b7a2b9efd78ca5d91ec282760b6b2", "producers": [ { "file": "apps/web/src/design-audit/foundations.tsx", "sourceHash": "7736dc2ddcd49b36b90b85f387b3e497810b7a2b9efd78ca5d91ec282760b6b2" } ] }, { "file": "apps/web/src/navigation.css", "reason": "Sidebar resize affordance uses neutral 20% black; its interaction geometry owns this existing local treatment.", "cases": [ [ "color", "background", "rgb(0 0 0 / 20%)", "CSS > .navigation-drawer-backdrop", 1 ], [ "color", "background", "rgb(0 0 0 / 20%)", "CSS > .navigation-modal-backdrop", 1 ] ] }, { "file": "apps/web/src/local-login.css", "reason": "Sign-in pulse is a continuous 1.6s status signal with its established curve; not a surface transition role.", "cases": [ [ "motion", "animation", "sign-in-pulse 1.6s cubic-bezier(0.16, 1, 0.3, 1) infinite", "CSS > .sign-in-pulse > &::after", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Existing sheet backdrop consumes the legacy shadow channels through rgb(); preserve current appearance and flag the color-space mismatch for separate review.", "cases": [ [ "color", "background", "rgb(var(--shadow-color))", "CSS > .plan-comment-sheet-backdrop", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Bottom-sheet upward shadow has established geometry distinct from shared downward surface shadows; retained pending dedicated visual review.", "cases": [ [ "shadow", "box-shadow", "0 -1rem 3rem rgb(var(--shadow-color) / 22%)", "CSS > .plan-comment-sheet-popup", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Drawer duration multiplies a shared duration by the gesture library runtime swipe-strength scalar; preserve proportional gesture response.", "cases": [ [ "motion", "transition", "transform calc(var(--drawer-swipe-strength, 1) * var(--duration-base))\n\t\tvar(--ease-out)", "CSS > .plan-comment-sheet-popup", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Legacy editor/source mono stack differs from shared UI mono stack; unifying would change glyph metrics. Preserve it for separate visual review.", "cases": [ [ "typography", "--font-mono", "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace", "CSS > .plan .mdxeditor", 1 ], [ "typography", "font-family", "ui-monospace, SFMono-Regular, monospace", "CSS > .plan-content pre", 1 ], [ "typography", "font-family", "ui-monospace, SFMono-Regular, monospace", "CSS > .plan-content :not(pre) > code", 1 ], [ "typography", "font-family", "ui-monospace, SFMono-Regular, monospace", "CSS > .plan-content [data-plan-source]", 1 ], [ "typography", "font-family", "ui-monospace, SFMono-Regular, monospace", "CSS > .plan-content .planCode .plan-code-view[data-view=\"file\"]", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "One-pixel cursor/insertion marker rounding is fine geometry rather than a control surface radius; preserve it.", "cases": [ [ "radius", "border-radius", "1px", "CSS > .plan-drop", 1 ], [ "radius", "border-radius", "1px", "CSS > .plan .plan-cursor", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Lexical writes participant identity colors at runtime; currentColor fallback keeps unassigned presence visible.", "cases": [ [ "color", "background-color", "var(--lexical-cursor-color, currentColor)", "CSS > .plan .plan-cursor", 1 ], [ "color", "background", "var(--lexical-cursor-color, currentColor)", "CSS > .plan .plan-cursor-name", 1 ], [ "color", "background-color", "color-mix(in srgb, var(--lexical-cursor-color, currentColor) 30%, transparent)", "CSS > .plan .plan-cursor-selection-bg", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Collaborative caret halo uses participant identity color and half-pixel geometry, not shared surface elevation.", "cases": [ [ "shadow", "box-shadow", "0 0 0 0.5px var(--lexical-cursor-color, currentColor)", "CSS > .plan .plan-cursor", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Removed-block marks compose two geometry-driven gap shadows; no DOM tombstone or surface elevation is intended.", "cases": [ [ "shadow", "box-shadow", "var(--plan-gap-above, 0 0 transparent),\n\t\tvar(--plan-gap-below, 0 0 transparent)", "CSS > .plan .plan-content [data-plan-gap-before],\n.plan .plan-content [data-plan-gap-after]", 1 ] ] }, { "file": "packages/editor/src/face.tsx", "reason": "Participant identity color is derived from the account handle, not a semantic interface color; preserve collaborative presence distinction.", "cases": [ [ "color", "background", "`color-mix(in srgb, ${tone} 18%, var(--color-page))`", "style object > Portrait > ", 1 ], [ "color", "color", "`color-mix(in srgb, ${tone} 80%, var(--color-text-primary))`", "style object > Portrait > ", 1 ] ], "sourceHash": "2ade3c7e75dbddc215461d425c92282eebf9b3448e8ebca46df68433663af588" }, { "file": "packages/editor/src/callout.css", "reason": "Callout shadow combines a local inset highlight/semantic outline with depth; no equivalent elevation role preserves the appearance.", "cases": [ [ "shadow", "box-shadow", "inset 0 1px rgb(255 255 255 / 55%), var(--shadow-resting)", "CSS > .plan-content [data-plan-type]", 1 ], [ "shadow", "box-shadow", "0 0 0 1px color-mix(in oklab, var(--callout-accent) 25%, transparent)", "CSS > .plan-callout-title[contenteditable=\"true\"]:focus", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Research status dot is a continuous breathing indicator; its 1.4s cadence and growing ring express bespoke status motion, not a themed duration or surface elevation.", "cases": [ [ "motion", "animation", "plan-research-pulse 1.4s var(--ease-out) infinite", "CSS > .plan-research-dot", 1 ], [ "shadow", "box-shadow", "0 0 0 0 color-mix(in oklch, var(--color-brand) 45%, transparent)", "CSS > @keyframes plan-research-pulse > 0%", 1 ], [ "shadow", "box-shadow", "0 0 0 0.375rem transparent", "CSS > @keyframes plan-research-pulse > 100%", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Progress track fill and its shimmer sheen use bespoke timings and a literal highlight independent of the shared step scale and color roles; they express in-progress motion, not a themed duration or surface color.", "cases": [ [ "motion", "transition", "background-color 500ms var(--ease-out)", "CSS > .plan-research-track span", 1 ], [ "color", "background", "linear-gradient(\n\t\t90deg,\n\t\ttransparent 0%,\n\t\tcolor-mix(in oklch, white 70%, transparent) 50%,\n\t\ttransparent 100%\n\t)", "CSS > .plan-research-track span::after", 1 ], [ "motion", "animation", "plan-research-sheen 1.6s linear infinite", "CSS > .plan-research-track span::after", 1 ], [ "motion", "transition", "opacity 400ms var(--ease-out)", "CSS > .plan-research-track span::after", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "Crossfade entrance and exit durations are tuned to the swap's own content-replacement feel; no shared duration matches this bespoke choreography.", "cases": [ [ "motion", "animation", "plan-research-swap-in 360ms var(--ease-out) var(--duration-fast) both", "CSS > .plan-research-swap > span", 1 ], [ "motion", "animation", "plan-research-swap-out 240ms var(--ease-out) both", "CSS > .plan-research-swap > span[data-leaving]", 1 ] ] }, { "file": "apps/web/src/chat/composer.css", "reason": "User-approved Chopin mode halo uses 10px spread at 0.4 opacity on a separate outer layer. This addressing indicator keeps the input white and does not change shared elevation tiers.", "cases": [ [ "shadow", "box-shadow", "0 0 var(--composer-glow-spread) var(--color-brand)", "CSS > .chat-composer .composer-surface::before", 1 ] ] }, { "file": "apps/web/src/theme.css", "reason": "iOS Safari zooms the page when it focuses editable text under 16px; touch devices floor the existing token at 1rem.", "cases": [ [ "typography", "font-size", "max(1rem, var(--text-sm))", "CSS > @media (pointer: coarse) > .chat-composer .composer-draft-input[contenteditable],\n\ttextarea,\n\tselect,\n\tinput:not([type=\"checkbox\"], [type=\"radio\"], [type=\"range\"], [type=\"color\"], [type=\"file\"])", 1 ] ] }, { "file": "packages/editor/src/styles.css", "reason": "iOS Safari zooms the page when it focuses editable text under 16px; touch devices floor the existing token at 1rem.", "cases": [ [ "typography", "font-size", "max(1rem, var(--plan-body))", "CSS > @media (pointer: coarse) > .plan .plan-content,\n\t.plan-content :is(h4, h5, h6)", 1 ], [ "typography", "font-size", "max(1rem, var(--text-sm))", "CSS > @media (pointer: coarse) > .plan-content :is(pre, [data-plan-source]),\n\t.plan-content [data-plan-preview]:not(:empty) ~ [data-plan-source],\n\t.plan-content .planCode .plan-code-view[data-view=\"file\"]", 1 ] ] } ]