## facebook/astryx — v0.3.0…v0.4.0

_136 commits._

### Features
- **feat(NumberInput): add formatted display, wheel control, and steppers (#4896)** (7f247bc)
- **feat(core)!: make the two DropdownMenu item modes peers (#4954)** (63038b9)
- **feat(lab)!: drop TransferListSelector's contentXstyle (#4992)** (e3559bb)
- **feat(core): add popup theme targets to ComplexSelector and MultiSelector (#4991)** (9bb4084)
- **feat(core): converge input clear buttons on a shared themeable primitive (#4876)** (5f71f07)
- **feat(core): add EmptyState title and description theme targets (#4942)** (bbc3612)
- **feat(core): add CodeBlock header and title theme targets (#4943)** (64df3b6)
- **feat(docsite): move Theming into its own component tab, wrap tables in Card (#4948)** (27d139f)
- **feat(menu): a menu item can report its own result (hasCloseOnSelect) (#4953)** (f4607ea)
- **feat(layer): derive layer clearance from the resolved placement (offset) (#4951)** (c45c297)
- **feat(sandbox): refactor mobile prototypes onto Astryx components (#4458)** (fcbc342)
- **feat(sandbox): WCAG 2.5.8 AA tap-target audit page (#4903)** (c4ada10)
- **feat(sandbox): add template audit ledger writer (#4957)** (ba306ff)
- **feat(sandbox): Mobile Type explorer tool page (#4883)** (47af759)
- **feat(sandbox): add component and template audit dashboards (#4923)** (c65d101)
- **feat(input): add isReadOnly to TextInput, TextArea, NumberInput (#4816)** (d56973f)
- **feat(multi-selector): themeable dropdown option target with states and size (#4628)** (dab968f)
- **feat(codeblock): themeable copy button with default tooltip, backed by a shared useClipboard hook (#4867)** (9b5eaa0)
- **feat(theme): add themeable indicators (#4712)** (505ccaa)
- **feat(cli): add codemod to migrate tree-mode useTableRowExpansion to the tree plugin (#4142) (#4884)** (ccb5ca9)
- **feat(core): make useTableRowExpansion a detail-panel plugin (#4142) (#4609)** (52a0e0e)
- **feat(eslint-plugin): add no-nullish-jsx-guard rule (#2538) (#3936)** (b26c2b2)
- **feat(selector): add disabled-trigger theme target (#4626)** (909adfa)
- **feat(core): support destructive variant in Table context menu actions (#4864)** (98ea85c)
- **feat(typeahead): themeable empty-state target (#4862)** (9026055)
- **feat(lab): add TransferListSelector and Storybook examples (#4870)** (dccdabe)
- **feat(treelist): flush leaves in all-leaf groups + themeable inter-row gap (#4540)** (7427065)
- **feat(menu): add destructive variant to dropdown/context menu items (#4753)** (e0fef44)
- **feat(selector): themeable empty-state target on Selector and MultiSelector (#4756)** (d52d2cb)
- **feat(theme): let the textarea slot drive --_textarea-inline-padding (#4793)** (0b5a38e)
- **feat(input): reflect disabled state on input theming targets (#4794)** (c96f4dc)
- **feat(docsite): add Design resources (Figma) to community page (#4808)** (f6da17b)
- **feat(docsite): add View Figma button to components gallery hero (#4805)** (9753e39)
- **feat(docsite): theme-aware (light/dark) images in blog post bodies (#4770)** (5b87d6d)
- **feat(lab): add ListInput (#4740)** (6cc7798)
- **feat(date): add weekStartsOn to DateInput, DateRangeInput, DateTimeInput (#4745)** (2ee5dc4)
- **feat(lint): flag div/span wrappers that only style an Astryx component (#4758)** (5c851ad)
- **feat(selector): expose selector-check theme target on the selected marker (#4627)** (7521845)
- **feat(docsite): autolink `astryx docs <topic>` references to their pages (#4766)** (ffa89f4)
- **feat(lab): add Tour (product-tour / NUX walkthrough) (#4579)** (12db2a1)
- **feat(Avatar): make fallback background a direct theme target (#4716)** (5ec028a)
- **feat(core): strengthen borders under contrast: high (#4529)** (c857354)
- **feat(cli): self-documenting CLI — colocated typed docs for every command, API function, and schema (#4714)** (2d2dba1)

### Fixes
- **fix(core): clean up merged refs consistently (#4901)** (fbf9c0b)
- **fix(scripts): keep every paragraph of a multi-paragraph changelog entry (#4999)** (3bbcac4)
- **fix(cli): stage the row-expansion codemod in next/ so 0.3.0 consumers get it (#4996)** (e0f96c0)
- **fix(core): coordinate concurrent useScrollLock instances (#4788)** (757185e)
- **fix(build): import node:fs statically so Vite plugin package discovery survives the ESM build (#4972)** (fb2d385)
- **fix(indicator): omit tabIndex from IndicatorProps (#4947)** (23b60ea)
- **fix(core): stop DateInput/DateTimeInput stealing focus on calendar dismiss (#4974)** (6ae5db7)
- **fix(ProgressBar): size the target mark through derived vars (#4970)** (c1d86e6)
- **fix(core): AppShell audit: banner landmark on mobile, shared skip-link focus ring, corrected mobileNav doc examples (#4944)** (d1441a6)
- **fix(core): scope useContainerReveal by inheritance instead of a six-slot marker pool (#4955)** (50f0adc)
- **fix(core): MoreMenu forwards placement and alignment to DropdownMenu (#4952)** (f85aedc)
- **fix(cli): add `theme build --icons-specifier` for the generated icon import (#4631)** (a2459e5)
- **fix: focus outlines are keyboard-only (:focus-visible), and a lint rule to keep them that way (#4935)** (ee705d8)
- **fix(core): don't reserve TextArea trailing space for a suppressed detached status icon (#4940)** (9bf8949)
- **fix(input): required disabled CheckboxInput/Switch no longer block form submit (#4815)** (fcd8773)
- **fix(indicator): the decorative contract is not a caller's to switch off (#4918) (#4921)** (6537294)
- **fix(Chat): add missing themeProps and fix className clobber (#4634)** (52992ae)
- **fix(core): correct prop forwarding precedence in 4 components (#4725)** (f1ed7fc)
- **fix(empty-state): place rest spread before contract role so consumers cannot clobber it (#4826)** (e8fff4f)
- **fix(deps): resolve 11 Dependabot alerts via pnpm overrides (#4845)** (3461a58)
- **fix(hooks): cycle useTreeFocus typeahead on repeated letters (#4844)** (5576940)
- **fix(lab): refresh Schedule's clock snapshot when the first subscriber attaches (#4891)** (67c07a8)
- **fix(sandbox): stop an unreviewed wiki field from breaking every build (#4924)** (d85c73d)
- **fix(stepper): audit hardening — a11y, theming, responsive labels, docs blocks (#4917)** (6b81ba6)
- **fix(indicator): a falsy child no longer deletes the state mark (#4893) (#4913)** (cd0b9f6)
- **fix(docsite): sync ThemingTarget/DerivedVar with the authoring types (#4915)** (61d3c10)
- **fix(core): TopNavMegaMenu hover-then-click no longer dismisses the panel (#3121) (#4555)** (e19719c)
- **fix(indicator): close the six audit blocks on the indicator layer (#4890)** (b4ec116)
- **fix(theme): make shared focus outlines themeable (#4654)** (041a0ef)
- **fix(dropdown-menu): follow input modality for initial focus so pointer opens don't highlight the first item (#4477) (#4594)** (6123d39)
- **fix(core): select by typing on a focused Selector (#3764) (#3797)** (4c528d0)
- **fix(Chat): stop clipping the hover radius on grouped ChatToolCalls rows (#4858)** (d790582)
- **fix(Chat): render ChatLayoutScrollButton icon-only in its default state (#4854)** (0bb5f3d)
- **fix(theme-neutral): restore --radius-none to the fixed 0px contract (#4856)** (493160e)
- **fix(theme): emit type:display-N heading rules in generateTypeScaleComponents (#4859)** (f687170)
- **fix(hooks): snap useStreamingText's rendered slice to a grapheme boundary (#4866)** (5ec28b6)
- **fix(Typeahead): guard Enter/Escape/arrow keys against IME composition (#4860)** (1135101)
- **fix(cli): don't replace scaffolded video sources with the image placeholder (#4863)** (09e4e29)
- **fix(SideNav): anchor the collapsed icon-only heading trigger to its menu popover (#4850)** (d78d8c0)
- **fix(ComplexSelector): keep popup clearance when placement="above" (#4861)** (95ec092)
- **fix(SideNav): center footer content when collapsed (#4852)** (1e14f3c)
- **fix(stepper): non-visual hygiene — sync theme targets, localize Optional, tokenize bar width (#4872)** (89db883)
- **fix(docsite): render code spans in link labels; auto-link component names in doc prose (#4425) (#4444)** (3a852c1)
- **fix(selector): drop the shared trigger-icon wrapper (#4846)** (8a9073a)
- **fix(core): drop styling wrappers around icons; render glyphs through Icon (#4838)** (4b1fef5)
- **fix(textarea): zero wrapper padding with longhands so the grip sits flush (#4813)** (077087f)
- **fix(input): exclude disabled TextInput/TextArea/NumberInput from form data (#4811)** (e6af10a)
- **fix(Selector): align selected option during popover entry (#4802)** (060cc9d)
- **fix(cli): migrate-grid-minchildwidth-to-columns handles columns + minChildWidth combo (#4792)** (683846b)
- **perf(rtl-audit): run stories across a worker pool (#4799)** (1b8b3f2)
- **fix(rtl-audit): drop the stale knownRealPending banner (#4798)** (f418816)
- **perf(ci): scope pr-rtl to the components a PR touches (#4796)** (846ec30)
- **fix(cli): point agent docs at the layout doc instead of naming a shell (#4772)** (f6cba81)
- **fix(avatar): preserve grapheme clusters when generating initials (#4750)** (8c64f99)
- **fix(cli): document unified Stack component direction prop (#4754)** (19095d6)
- **fix(core): cancel pending long-press when a second finger joins mid-press (#4735)** (6f9bc84)
- **fix(pagination): center prev/next caret icons under the RTL mirror (#4723)** (64f8487)
- **[fix] ProgressBar marks take their color from what they sit on (#4741)** (5f9896c)
- **fix(cli): the documented hook example referenced a hook that does not exist (#4742)** (d1b7d82)
- **fix(cli): generate the ./authoring declarations + make foundation the bottom layer (#4736)** (6afcfb7)

### Backend
- **AlertDialog: night watch component audit, 79.4 C to 89.6 B (#4887)** (ec85ba0)
- **Component score ledger: audit scores in the wiki, a ratchet, and a browsable page (#4875)** (e92bed9)
- **Self-host lookaside CDN images under /public (#3973)** (b68ee61)

### Docs
- **docs: audit, credit and consolidate changesets for v0.4.0 (#4997)** (a535678)
- **docs(core): document AspectRatio's sizing contract and add its anatomy (#4984)** (0795885)
- **docs(blog): i18n + RTL engineering post (#4771)** (c4f6669)
- **docs(dense): add Indicator overlay, fix useClipboard bullet parity (#4933)** (46a9e6a)
- **docs(storybook): clean up Indicator @example blocks (#4932)** (46de841)
- **docs(deslop): recast em dashes in StepperStatus description (#4934)** (e1d2a18)
- **docs(storybook): remove blank line inside RichTextEditorAutoLinkPlugin @example (#4848)** (30cc903)
- **docs(core): replace ellipsis char in DateRangeInput prop prose (#4841)** (8360f05)
- **docs(i18n): restore RTL dir best-practice in dense overlay; drop em dashes (#4840)** (42dec9d)
- **docs(core): replace ellipsis chars in prop prose with plain text (#4825)** (c4a29d3)
- **docs(indicator): untag @example JSDoc fences so Storybook autodocs renders them (#4911)** (be0ba4a)
- **docs: add install of @stylexjs/stylex getting-started.doc.mjs (#4534)** (47f8bb4)
- **docs: consolidate the review and contribution guidance into one source of truth (#4877)** (33411eb)
- **docs: correct guidance-file drift against main (#4873)** (e9fc2bb)
- **docs(dense): restore dropped Icon and Carousel dense/zh best-practice bullets (#4676)** (a522206)
- **docs(slop): straighten em dashes in Item, ProgressBar, BottomSheet docs (#4721)** (6ad1a91)
- **docs(slop): remove em dashes and an ellipsis from doc prose (#4748)** (0011679)
- **docs(slop): straighten em dashes in layout and RichTextEditor doc prose (#4698)** (6275d14)
- **docs(dense): add ComplexSelector docsDense usage section (#4722)** (dba9f0b)
- **docs(timestamp): complete dense best-practices parity and clean prose typography (#4747)** (fbc60c5)
- **docs(rubric): pre-1.0 [breaking] changesets are minor, not patch (#4744)** (269c970)
- **docs(blog): add "Who needs a Figma Library?" launch post (#4733)** (b8cfd19)
- **docs(status-dot): document a11y usage responsibilities in dos and donts (#4737)** (6612569)

### Chore
- **chore: version packages for v0.4.0 (#5002)** (110987b)
- **chore(lint): make .gitignore the source of truth for lint ignores (#4919)** (d31557b)
- **refactor(menu): source DropdownMenuItemData from DropdownMenuItem's props (#4809)** (fc1c3f3)
- **ci: add weekly full-suite RTL audit (#4797)** (8f3912b)
- **refactor(core): migrate style-only wrappers onto component xstyle (#4775)** (5fb9a2d)
- **chore(cli): adopt Center padding prop in login templates (#2594 follow-up) (#4764)** (b54224f)
- **chore(codeowners): remove ejhammond from default reviewers (#4760)** (aaccba1)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/facebook/astryx?utm_source=github-action)._