feat(theme): add appearance nesting tokens - #5963
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
PR Analysis Report📚 Storybook PreviewView Storybook for this PR 🧪 Sandbox PreviewView Sandbox for this PR Modified ComponentsAppShell (@astryxdesign/core) · View in Storybook
BottomSheet (@astryxdesign/core) · View in Storybook
Calendar (@astryxdesign/core) · View in Storybook
Chat (@astryxdesign/core) · View in Storybook
CheckboxInput (@astryxdesign/core) · View in Storybook
CodeBlock (@astryxdesign/core) · View in Storybook
Field (@astryxdesign/core) · View in Storybook
FileInput (@astryxdesign/core) · View in Storybook
InputGroup (@astryxdesign/core) · View in Storybook
Lightbox (@astryxdesign/core) · View in Storybook
NumberInput (@astryxdesign/core) · View in Storybook
Outline (@astryxdesign/core) · View in Storybook
Popover (@astryxdesign/core) · View in Storybook
RadioList (@astryxdesign/core) · View in Storybook
Resizable (@astryxdesign/core) · View in Storybook
SideNav (@astryxdesign/core) · View in Storybook
Slider (@astryxdesign/core) · View in Storybook
Switch (@astryxdesign/core) · View in Storybook
Table (@astryxdesign/core) · View in Storybook
TextArea (@astryxdesign/core) · View in Storybook
Thumbnail (@astryxdesign/core) · View in Storybook
Toast (@astryxdesign/core) · View in Storybook
Chart (@astryxdesign/lab) · View in Storybook
Drawer (@astryxdesign/lab) · View in Storybook
Schedule (@astryxdesign/lab) · View in Storybook
ChartTooltip (@astryxdesign/charts)
RichTextEditor (@astryxdesign/richtext) · View in Storybook
Bundle Size Summary
Accessibility AuditStatus: 5 accessibility violation(s) found — 1 critical, 4 serious. FileInput - 1 issue(s)
RadioList - 1 issue(s)
RichTextEditor - 2 issue(s)
Thumbnail - 1 issue(s)
Visual RegressionStatus: Skipped — Broad stable scope is deferred to the daily release gate. It covers 380 trusted baseline shots instead of recapturing them for this PR. View the report Generated by PR Enrichment workflow | Storybook | Sandbox | View full report |
cixzhang
left a comment
There was a problem hiding this comment.
Semantic verdict: approve
The 10/50 defaults, public exports, override path, generated docs, and built CSS all match the settled layering contract.
[Reviewed by Robohands]
cixzhang
left a comment
There was a problem hiding this comment.
Semantic verdict: request changes
The earlier approval covers 3855819; this head removes the only Changeset. These are public Core and CLI additions, so this PR no longer requests a package bump or changelog entry and can only ship incidentally with another release. Please restore the patch Changeset for both packages. The 10/50 defaults, typed variables, override path, generated docs, and built CSS are otherwise preserved.
[Reviewed by Robohands]
cixzhang
left a comment
There was a problem hiding this comment.
Semantic verdict: approve
My earlier Changeset request covered 4014d9d. This head follows the settled no-bump direction; its 10/50 defaults, typed exports, overrides, docs, and built CSS are correct.
[Reviewed by Robohands]
# Conflicts: # packages/core/src/CheckboxInput/CheckboxInput.tsx # packages/core/src/RadioList/RadioListItem.tsx # packages/core/src/Switch/Switch.tsx
cixzhang
left a comment
There was a problem hiding this comment.
Semantic verdict: approve
The 10/50 migration keeps local ordering intact, and ChartTooltip now stays with its owning chart while the new native-popover path works in Chromium.
[Reviewed by Robohands]
fb3933f to
4f2b9fe
Compare
cixzhang
left a comment
There was a problem hiding this comment.
Semantic verdict: approve
The exact head preserves 10/50 and tooltip mechanics. Resizable now passes RTL; the remaining failure is unverified N/A coverage, not a behavior defect.
[Reviewed by Robohands]
cixzhang
left a comment
There was a problem hiding this comment.
APPROVED at exact head 2314d2934cc13c4451f82481a963aeb0c3c8ae6a.
Verified the complete Appearance nesting migration after landing #5994 and updating from main:
- all 47 positive/dynamic component stacking assignments map to 41 container and 6 layer usages with offsets and exclusions preserved;
- ChartTooltip remains owner-local with native popover geometry reset;
- 144 focused migration tests, all four affected package builds/typechecks, and repository checks pass;
- stable visual, accessibility, and RTL gates pass; RTL coverage is complete at 23 measured / 4 verified N/A / 0 gaps.
No actionable findings.
…d value PR #5909 seeded `options`/`label` playground defaults for Selector so its Properties preview stops showing the "missing required props" placeholder, but did not seed `value` (correctly: Selector's own contract requires "closed with no value" to be a valid representative state, FR1 in Selector.spec.md). That exposed a latent bug in `buildRuntimePreviewState`: it only bridges a controlled callback back into playground state when its target prop already has a value in `state`, so Selector's `onChange` was never wired up and the live preview stayed frozen on the placeholder no matter what option a person clicked. Fix generalizes the bridge instead of papering over Selector specifically: the literal `value`/`onChange` pair — a component's one primary controlled value — now bridges whenever `target` names a real prop, even an optional one with no seeded default. Secondary paired callbacks (onIndexChange, onPageSizeChange, onOpenChange, ...) keep the original opt-in behavior, preserving each preview's chosen representative starting state (verified by the existing Lightbox gallery-index and overlay tests, unchanged and still passing). Added a focused regression test reproducing the exact reported scenario: Selector with options seeded but no value, selecting Orange must update preview state. Testing: - New test: bridges Selector onChange even though its optional value prop is not seeded (red before the fix, green after) - Full docsite suite: 34 files, 475 tests passing - tsc --noEmit: no new errors (pre-existing theme-package /built errors are unrelated to this worktree's unbuilt theme packages) - eslint on both changed files: clean - check:package-boundaries: clean Excludes all work from #5963 (unrelated theme appearance-nesting tokens); touches only docsite preview infrastructure and its test.
…d value (#6035) PR #5909 seeded `options`/`label` playground defaults for Selector so its Properties preview stops showing the "missing required props" placeholder, but did not seed `value` (correctly: Selector's own contract requires "closed with no value" to be a valid representative state, FR1 in Selector.spec.md). That exposed a latent bug in `buildRuntimePreviewState`: it only bridges a controlled callback back into playground state when its target prop already has a value in `state`, so Selector's `onChange` was never wired up and the live preview stayed frozen on the placeholder no matter what option a person clicked. Fix generalizes the bridge instead of papering over Selector specifically: the literal `value`/`onChange` pair — a component's one primary controlled value — now bridges whenever `target` names a real prop, even an optional one with no seeded default. Secondary paired callbacks (onIndexChange, onPageSizeChange, onOpenChange, ...) keep the original opt-in behavior, preserving each preview's chosen representative starting state (verified by the existing Lightbox gallery-index and overlay tests, unchanged and still passing). Added a focused regression test reproducing the exact reported scenario: Selector with options seeded but no value, selecting Orange must update preview state. Testing: - New test: bridges Selector onChange even though its optional value prop is not seeded (red before the fix, green after) - Full docsite suite: 34 files, 475 tests passing - tsc --noEmit: no new errors (pre-existing theme-package /built errors are unrelated to this worktree's unbuilt theme packages) - eslint on both changed files: clean - check:package-boundaries: clean Excludes all work from #5963 (unrelated theme appearance-nesting tokens); touches only docsite preview infrastructure and its test.
Why
Themes need shared stacking bands so nested component chrome and ordinary floating surfaces do not each maintain unrelated z-index numbers.
What
Current main already contains no z-index override in Neutral, and the former Rose theme package is no longer present, so there are no obsolete theme overrides to remove.
Risk
Stacking ownership moves from component-local numbers to theme tokens. Native popovers and modal dialogs continue to rely on the browser top layer. A theme can now adjust the two shared bands while component-local ties and relative ordering remain stable.
Testing
pnpm check:repoNo Changeset is included because this API is not intended to trigger a package version bump yet.