Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
640 commits
Select commit Hold shift + click to select a range
2ad3eaf
refactor(react-switch): D14 — remove state-mutation pattern from styl…
ArrayKnight Jul 30, 2026
3ed8097
refactor(react-table): D14 — remove state-mutation pattern from style…
ArrayKnight Jul 30, 2026
a2c8348
refactor(react-tabs): D14 — remove state-mutation pattern from styles…
ArrayKnight Jul 30, 2026
f40af7c
refactor(react-tag-picker): D14 — remove state-mutation pattern from …
ArrayKnight Jul 30, 2026
dc4e461
refactor(react-tags): D14 — remove state-mutation pattern from styles…
ArrayKnight Jul 30, 2026
f1e3f72
refactor(react-teaching-popover): D14 — remove state-mutation pattern…
ArrayKnight Jul 30, 2026
32f8ee1
refactor(react-text): D14 — remove state-mutation pattern from styles…
ArrayKnight Jul 30, 2026
4d69791
refactor(react-textarea): D14 — remove state-mutation pattern from st…
ArrayKnight Jul 30, 2026
bc95e0d
refactor(react-timepicker-compat): D14 — remove state-mutation patter…
ArrayKnight Jul 30, 2026
65d15fb
refactor(react-toast): D14 — remove state-mutation pattern from style…
ArrayKnight Jul 30, 2026
1cb3388
refactor(react-toolbar): D14 — remove state-mutation pattern from sty…
ArrayKnight Jul 30, 2026
2cf7051
refactor(react-tooltip): D14 — remove state-mutation pattern from sty…
ArrayKnight Jul 30, 2026
0a369a4
refactor(react-tree): D14 — remove state-mutation pattern from styles…
ArrayKnight Jul 30, 2026
ef2baa8
refactor(react-utilities): D14 — remove state-mutation pattern from s…
ArrayKnight Jul 30, 2026
970af53
chore: .nxignore update (Batch F)
ArrayKnight Jul 30, 2026
9d74490
docs(public-docsite-v9): Phase 3 Batch G — comments and docs describe…
ArrayKnight Jul 30, 2026
40fd0b7
docs(react-avatar): Phase 3 Batch G — comments and docs describe the …
ArrayKnight Jul 30, 2026
7b9d97f
docs(react-badge): Phase 3 Batch G — comments and docs describe the s…
ArrayKnight Jul 30, 2026
01ee2a7
docs(react-breadcrumb): Phase 3 Batch G — comments and docs describe …
ArrayKnight Jul 30, 2026
f927acc
docs(react-button): Phase 3 Batch G — comments and docs describe the …
ArrayKnight Jul 30, 2026
fe7490f
docs(react-calendar-compat): Phase 3 Batch G — comments and docs desc…
ArrayKnight Jul 30, 2026
3a2dc18
docs(react-carousel): Phase 3 Batch G — comments and docs describe th…
ArrayKnight Jul 30, 2026
0214601
docs(react-color-picker): Phase 3 Batch G — comments and docs describ…
ArrayKnight Jul 30, 2026
b8dd571
docs(react-combobox): Phase 3 Batch G — comments and docs describe th…
ArrayKnight Jul 30, 2026
0b49c0f
docs(react-components): Phase 3 Batch G — comments and docs describe …
ArrayKnight Jul 30, 2026
0306f9e
docs(react-conformance-griffel): Phase 3 Batch G — comments and docs …
ArrayKnight Jul 30, 2026
410c996
docs(react-divider): Phase 3 Batch G — comments and docs describe the…
ArrayKnight Jul 30, 2026
06f8ad5
docs(react-drawer): Phase 3 Batch G — comments and docs describe the …
ArrayKnight Jul 30, 2026
484c862
docs(react-headless-components-preview): Phase 3 Batch G — comments a…
ArrayKnight Jul 30, 2026
ffa1194
docs(react-image): Phase 3 Batch G — comments and docs describe the s…
ArrayKnight Jul 30, 2026
ca1f585
docs(react-menu): Phase 3 Batch G — comments and docs describe the sh…
ArrayKnight Jul 30, 2026
1312f25
docs(react-motion): Phase 3 Batch G — comments and docs describe the …
ArrayKnight Jul 30, 2026
fc74d93
docs(react-nav): Phase 3 Batch G — comments and docs describe the shi…
ArrayKnight Jul 30, 2026
fdf93d3
docs(react-popover): Phase 3 Batch G — comments and docs describe the…
ArrayKnight Jul 30, 2026
b4ebc1b
docs(react-portal): Phase 3 Batch G — comments and docs describe the …
ArrayKnight Jul 30, 2026
121d19e
docs(react-search): Phase 3 Batch G — comments and docs describe the …
ArrayKnight Jul 30, 2026
1e81a43
docs(react-table): Phase 3 Batch G — comments and docs describe the s…
ArrayKnight Jul 30, 2026
7aa2ae4
docs(react-tabs): Phase 3 Batch G — comments and docs describe the sh…
ArrayKnight Jul 30, 2026
685af1f
docs(react-tag-picker): Phase 3 Batch G — comments and docs describe …
ArrayKnight Jul 30, 2026
37fa871
docs(react-tailwind-theme): Phase 3 Batch G — comments and docs descr…
ArrayKnight Jul 30, 2026
7e28442
docs(react-teaching-popover): Phase 3 Batch G — comments and docs des…
ArrayKnight Jul 30, 2026
3243645
docs(react-text): Phase 3 Batch G — comments and docs describe the sh…
ArrayKnight Jul 30, 2026
79aaa89
docs(react-theme): Phase 3 Batch G — comments and docs describe the s…
ArrayKnight Jul 30, 2026
2f24c28
docs(react-timepicker-compat): Phase 3 Batch G — comments and docs de…
ArrayKnight Jul 30, 2026
1fcf0a3
docs(react-toast): Phase 3 Batch G — comments and docs describe the s…
ArrayKnight Jul 30, 2026
46c7855
docs(react-toolbar): Phase 3 Batch G — comments and docs describe the…
ArrayKnight Jul 30, 2026
104aedf
docs(react-tree): Phase 3 Batch G — comments and docs describe the sh…
ArrayKnight Jul 30, 2026
bc5cd2b
docs(react-utilities): Phase 3 Batch G — comments and docs describe t…
ArrayKnight Jul 30, 2026
aa1870f
docs(migration): Batch G closure notes
ArrayKnight Jul 30, 2026
27411c7
docs: Phase 3 Batch G — contributor/agent instructions describe the s…
ArrayKnight Jul 30, 2026
742487e
docs(migration): Phase 4 metrics leg — build 163s (-10.4%), library g…
ArrayKnight Jul 30, 2026
29de795
fix(react-tailwind-theme): unscoped nx project name — repairs getDepe…
ArrayKnight Jul 30, 2026
65cea9b
docs(migration): FINAL REPORT — the PR deliverable; ledger phase 4-re…
ArrayKnight Jul 30, 2026
6503247
docs(migration): Griffel-elimination evaluation — conditional yes on …
ArrayKnight Jul 30, 2026
dda381a
docs(migration): cross-repo Griffel-zero plan — headless entrypoint a…
ArrayKnight Jul 30, 2026
68d492d
docs(migration): griffel-zero plan amendments — contribute-back forks…
ArrayKnight Jul 30, 2026
014a40f
docs(migration): plan amendment 2 — two-PR topology, main-branch work…
ArrayKnight Jul 30, 2026
5a7b7bb
feat(react-charts): convert C1 components to Tailwind v4 + CSS Module…
ArrayKnight Jul 30, 2026
a160a27
fix(react-charts): pass single module class to wrapTextInsideDonut (w…
ArrayKnight Jul 30, 2026
d45169e
docs(migration): charts C1 gate closed — DonutChart Dynamic stories a…
ArrayKnight Jul 30, 2026
7d6e608
feat(react-charts): convert CartesianChart base + AreaChart + Scatter…
ArrayKnight Jul 30, 2026
ce8a605
test(react-charts): re-point legend queries at module class-map (D16 …
ArrayKnight Jul 30, 2026
3db6eb0
docs(migration): charts C2 closed — gate 61/61, dependent-test seam r…
ArrayKnight Jul 30, 2026
787ef62
docs(migration): icons upstream PR description (I7) — fork PR-ready a…
ArrayKnight Jul 30, 2026
2effe21
feat(react-charts): convert VerticalStackedBarChart + GroupedVertical…
ArrayKnight Jul 30, 2026
d4c6006
docs(migration): charts C3 closed — 94/94 VR zero tolerance, jest at …
ArrayKnight Jul 30, 2026
07315c8
docs(migration): C3 report — note post-capture story lint fixes are c…
ArrayKnight Jul 30, 2026
0847349
feat(react-charts): C4 — GaugeChart, FunnelChart, ChartTable, HeatMap…
ArrayKnight Jul 30, 2026
60f8ecf
docs(migration): C4 report — note prettier story rewrap is capture-inert
ArrayKnight Jul 30, 2026
4cddd61
feat(react-charts): C5 — SankeyChart, PolarChart, HorizontalBarChartW…
ArrayKnight Jul 31, 2026
12f6bcd
feat(react-charts): convert ChartAnnotationLayer (C6) — package's las…
ArrayKnight Jul 31, 2026
438e0e1
feat(react-charts): C7 plumbing — @griffel/react removed, D2a5 promot…
ArrayKnight Jul 31, 2026
c350385
feat(harness): S-E — VR story scaffolding, test-ssr, perf scenario of…
ArrayKnight Jul 31, 2026
f4bac41
docs(migration): S-E harness closed — VR 1438/1438 zero tolerance, ss…
ArrayKnight Jul 31, 2026
30c5ce0
docs(migration): harness-se — correct new-CSS-file count (20 in VR tree)
ArrayKnight Jul 31, 2026
ebe2c37
docs(migration): S-F worklist — 548-file census, 7-batch partition
ArrayKnight Jul 31, 2026
2d85dea
docs(migration): S-F worklist correction — doc pages scoped by text, …
ArrayKnight Jul 31, 2026
e91f783
feat(docs): S-F batch 1a — docsite Migration guides off Griffel
ArrayKnight Jul 31, 2026
975439a
feat(docs): S-F batch 1b — docsite Concepts stories + SSR/D21 pages o…
ArrayKnight Jul 31, 2026
12d8169
feat(charts): S-F batch 1c — react-charts stories off Griffel; batch …
ArrayKnight Jul 31, 2026
557a95f
feat(docs): S-F batch 2a — docsite Utilities stories off Griffel
ArrayKnight Jul 31, 2026
9c1e565
feat(react-components): S-F batch 2b — accordion/aria/avatar/badge/br…
ArrayKnight Jul 31, 2026
dbc9b0b
feat(react-button): S-F batch 2c — Button/CompoundButton/MenuButton s…
ArrayKnight Jul 31, 2026
6619e02
feat(react-button): S-F batch 2d — SplitButton/ToggleButton stories o…
ArrayKnight Jul 31, 2026
57893ae
docs(migration): S-F batch 2 closed — 87/87 stories converted, all ga…
ArrayKnight Jul 31, 2026
5633fea
docs(migration): sf-batch2 — note graphify update stalled, graph stale
ArrayKnight Jul 31, 2026
84789b8
feat(react-components): S-F batch 3a — carousel/color-picker/dialog s…
ArrayKnight Jul 31, 2026
df28aaa
feat(react-combobox): S-F batch 3b — Combobox stories off Griffel
ArrayKnight Jul 31, 2026
66f32d1
feat(react-components): S-F batch 3c — Dropdown/DatePicker stories of…
ArrayKnight Jul 31, 2026
381344f
feat(react-components): S-F batch 3d — divider/drawer stories off Gri…
ArrayKnight Jul 31, 2026
2721ffe
docs(migration): S-F batch 3 closed — 88/88 stories converted, all ga…
ArrayKnight Jul 31, 2026
dd3140c
refactor(stories): S-F batch 4a — react-field/infolabel/input/link/li…
ArrayKnight Jul 31, 2026
f32841b
refactor(stories): S-F batch 4b — react-menu/message-bar/migration-v0…
ArrayKnight Jul 31, 2026
8949a99
refactor(stories): S-F batch 4c — react-migration-v8-v9 + react-motio…
ArrayKnight Jul 31, 2026
a7ecc4a
refactor(stories): S-F batch 4d — remaining react-motion stories to C…
ArrayKnight Jul 31, 2026
f437fca
docs(migration): S-F batch 4 closed — 89 stories converted, 2 doc sur…
ArrayKnight Jul 31, 2026
581257e
refactor(stories): S-F batch 5a — motion-preview Atoms/Blur/Stagger s…
ArrayKnight Jul 31, 2026
beefbc7
refactor(stories): S-F batch 5b — motion-preview Collapse/Fade/Introd…
ArrayKnight Jul 31, 2026
86867da
refactor(stories): S-F batch 5c — motion-preview Scale/Slide + react-…
ArrayKnight Jul 31, 2026
887b370
refactor(stories): S-F batch 5d — react-overflow/persona stories to C…
ArrayKnight Jul 31, 2026
a6665ae
refactor(stories): S-F batch 5e — react-popover/portal/positioning st…
ArrayKnight Jul 31, 2026
835f23c
docs(migration): S-F batch 5 closed — 87/87 stories converted, gates …
ArrayKnight Jul 31, 2026
215b759
refactor(stories): S-F batch 6a — react-progress/provider/rating/sear…
ArrayKnight Jul 31, 2026
131b3a7
refactor(stories): S-F batch 6b — react-skeleton/slider/spinbutton/sp…
ArrayKnight Jul 31, 2026
286e0af
refactor(stories): S-F batch 6c — react-swatch-picker/tabs stories to…
ArrayKnight Jul 31, 2026
7d5c131
refactor(stories): S-F batch 6d — react-tag-picker/tags stories to CS…
ArrayKnight Jul 31, 2026
ca32c3c
docs(migration): S-F batch 6 closed — 85/85 stories converted, gates …
ArrayKnight Jul 31, 2026
4fc440b
refactor(stories): S-F batch 7a — react-text/textarea/theme stories +…
ArrayKnight Jul 31, 2026
96a8e89
refactor(stories): S-F batch 7b — react-timepicker-compat/toast/toolb…
ArrayKnight Jul 31, 2026
d0689f6
docs(migration): S-F COMPLETE — batch 7 closed, retro audit clean (0 …
ArrayKnight Jul 31, 2026
a252855
feat(react-provider): Fluent-owned CSP nonce prop; remove Griffel ren…
ArrayKnight Jul 31, 2026
28126bc
feat(react-tabster): delete Griffel focus-ring factories; umbrella ex…
ArrayKnight Jul 31, 2026
5e1a928
feat(react-positioning): GriffelStyle -> PositioningStyleObject in fa…
ArrayKnight Jul 31, 2026
0806963
docs(migration): S-G closed — D20 recorded, sg-core-specials report, …
ArrayKnight Jul 31, 2026
71d6342
feat(react-components)!: remove Griffel runtime re-exports and depend…
ArrayKnight Jul 31, 2026
79024ef
feat(react-migration-v0-v9)!: retire the Griffel style mixins (S-H, D19)
ArrayKnight Jul 31, 2026
b76bad7
refactor: convert the last live Griffel imports off @griffel/react (S-H)
ArrayKnight Jul 31, 2026
d1389dd
feat(react-conformance-griffel)!: retire the package (S-H, D23)
ArrayKnight Jul 31, 2026
4417bb1
test: drop retired make-styles-overrides-win disabledTests entries (1…
ArrayKnight Jul 31, 2026
9232d5e
test: drop retired make-styles-overrides-win disabledTests entries (2…
ArrayKnight Jul 31, 2026
07c59a3
test: drop retired make-styles-overrides-win disabledTests entries (3…
ArrayKnight Jul 31, 2026
3b8b4a0
test: drop retired make-styles-overrides-win disabledTests entries (4…
ArrayKnight Jul 31, 2026
2e305ce
test: drop retired make-styles-overrides-win disabledTests entries (5…
ArrayKnight Jul 31, 2026
b0a48f0
chore: purge Griffel tooling from shared configs and generators (S-H)
ArrayKnight Jul 31, 2026
5dc6131
docs(react-image): teach CSS instead of Griffel makeStyles in MIGRATI…
ArrayKnight Jul 31, 2026
9f27462
chore: drop six stale @griffel/react manifest entries (S-H)
ArrayKnight Jul 31, 2026
091bde5
docs(migration): S-H closed — the break record, D19/D23 recorded, led…
ArrayKnight Jul 31, 2026
1c84806
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
85bdf6a
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
f9e654d
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
7e9f6bd
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
d69a9ce
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
2f41be9
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
7536f19
chore(migration): S-I comment sweep — retired-test narration, wrapper…
ArrayKnight Jul 31, 2026
31e4531
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
e721968
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
aeb0a29
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
7e471d0
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
645defb
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
25c8651
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
5305d35
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
9761f2a
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
251c211
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
2f7b1ed
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
5e1cc65
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
0ec481a
chore(migration): S-I comment sweep — story/app CSS provenance header…
ArrayKnight Jul 31, 2026
acb058a
docs(migration): S-I residue sweep — RFC/handbook annotations, D2a5 c…
ArrayKnight Jul 31, 2026
90d1096
LOCAL-ONLY(revert-before-PR): point @fluentui/react-icons at the head…
ArrayKnight Jul 31, 2026
b0248a5
LOCAL-ONLY(revert-before-PR): consume the icons fork as a packed tarb…
ArrayKnight Jul 31, 2026
c5d6a9b
feat(styling): assign the icons stylesheet into layer fui.components.…
ArrayKnight Jul 31, 2026
8db61a6
test(react-menu): regenerate 3 icon snapshots under headless icons 3.0
ArrayKnight Jul 31, 2026
67302fc
docs(migration): icons integration batch 1 closed — 73/73 VR, drift a…
ArrayKnight Jul 31, 2026
fff0a4c
test(vr): S-J filled/regular swap state-matrix stories for the button…
ArrayKnight Aug 2, 2026
7fb3a06
feat(react-button): retire D2a5 unlayered icon-swap rules into module…
ArrayKnight Aug 2, 2026
ea3206c
docs(migration): S-J batch 1 closed — button-family icon-swap retirem…
ArrayKnight Aug 2, 2026
c467f6d
test(vr): S-J batches 2+3 swap state-matrix stories (nav, menu-grid, …
ArrayKnight Aug 2, 2026
b4f99d3
test(vr): rename S-J tag story to OutlineSelectedWithIcon (duplicate …
ArrayKnight Aug 2, 2026
aba1453
feat(react-nav): retire D2a5 unlayered icon-swap rules into module la…
ArrayKnight Aug 2, 2026
a09c73a
feat(react-components): retire remaining D2a5 unlayered icon-swap rul…
ArrayKnight Aug 2, 2026
5cc9933
chore(jest): retire @griffel/jest-serializer from package jest config…
ArrayKnight Aug 2, 2026
98a7a77
chore(jest): retire @griffel/jest-serializer - devDep, generator, rem…
ArrayKnight Aug 2, 2026
62402f4
docs(migration): S-J batches 2+3 closed + Griffel-zero campaign closure
ArrayKnight Aug 2, 2026
c3820a3
docs(migration): post-campaign audit of the icons fork headless promo…
ArrayKnight Aug 4, 2026
3dea025
docs(migration): post-campaign over-engineering & consistency audit (…
ArrayKnight Aug 4, 2026
8a6cb41
docs(migration): will-change experiment — E-cliff untouched (4th dead…
ArrayKnight Aug 4, 2026
1350988
docs(migration): selector-order experiment — dual-list order is perf-…
ArrayKnight Aug 4, 2026
cc08e66
docs(migration): class-vs-attr experiment — attribute->class selector…
ArrayKnight Aug 4, 2026
cfc71f2
docs(migration): where-wrapper experiment — :where wrapper exonerated…
ArrayKnight Aug 4, 2026
cd601b3
docs(migration): layers-vs-literals experiment - @layer exonerated (9…
ArrayKnight Aug 4, 2026
0563b29
docs(migration): mechanism diagnostic — E-cliff attributed to Blink @…
ArrayKnight Aug 4, 2026
6aff6f1
perf(react-tailwind-theme): drop focus-knob @property registrations, …
ArrayKnight Aug 4, 2026
40ef245
test(vr-tests): focus-visible VR stories for knob-consuming components
ArrayKnight Aug 4, 2026
4e5e093
docs(migration): perf-property-remedy report, D6 amendment, ledger, f…
ArrayKnight Aug 4, 2026
ca4c071
docs(migration): consumer dynamic-className experiment — flat both wo…
ArrayKnight Aug 5, 2026
a9c1903
docs(migration): PR #1204 external review verified — item 1 not a def…
ArrayKnight Aug 5, 2026
bb6ec4c
docs(migration): repair gate table in review-fixes-1204 report
ArrayKnight Aug 5, 2026
eae2756
fix(release): queue breaking Griffel->Tailwind migration entries as m…
ArrayKnight Aug 5, 2026
9b59224
fix(release): lift per-package beachball 'major' gate for breaking mi…
ArrayKnight Aug 5, 2026
9143d11
fix(release): add missing beachball entries for changed packages (rev…
ArrayKnight Aug 5, 2026
6ddf01b
fix(tsconfig): add static-assets typings to spec/cy configs of conver…
ArrayKnight Aug 5, 2026
a50ef45
fix(react-charts): scope donut text wrap and axis font measurement to…
ArrayKnight Aug 5, 2026
768ec1b
docs(migration): record review #36513 items 10+11 verification + fixe…
ArrayKnight Aug 5, 2026
a79fd72
fix(infra): load the Tailwind theme emission in cypress and perf bund…
ArrayKnight Aug 5, 2026
cbed108
fix(export-to-sandbox): ship CSS-module ambient typings in generated …
ArrayKnight Aug 5, 2026
39dc0af
fix(release): correct the stylesheet contract in migration change ent…
ArrayKnight Aug 5, 2026
23ae3aa
docs(react-storybook-addon): document the styles.css / docs-chrome.cs…
ArrayKnight Aug 5, 2026
6de5690
docs(migration): review-fixes-36513 — items 3, 4/19, 6, 7, 8, 13, 14, 16
ArrayKnight Aug 5, 2026
aedb775
fix(react-dialog): unlayer the body-scroll-lock classes so consumer r…
ArrayKnight Aug 5, 2026
900a87a
fix(vr-tests): import tokens from the declared theme package in Chart…
ArrayKnight Aug 5, 2026
c9b6a14
fix(react-carousel): per-property colour gates keep autoplay button b…
ArrayKnight Aug 5, 2026
f5f25d0
fix(react-list): preserve explicit null checkmark indicator — stop re…
ArrayKnight Aug 5, 2026
599b3d0
feat(react-utilities,react-table): useCssVarValue hook; DataGrid offs…
ArrayKnight Aug 5, 2026
80b4966
docs(migration): review-fixes-36513 — items 5, 9, 12, 15, 17 verifica…
ArrayKnight Aug 5, 2026
944cccc
fix(build): static-assets typings for dialog/carousel cy+spec tsconfi…
ArrayKnight Aug 5, 2026
0cad34d
feat(theming): spacing tokens become numeric-axis aliases; camelCase …
ArrayKnight Aug 6, 2026
6b15d91
refactor(theming): repoint old camelCase token var() references to ca…
ArrayKnight Aug 6, 2026
ec13a8e
refactor(theming): repoint old camelCase token var() references to ca…
ArrayKnight Aug 6, 2026
9cdc27f
refactor(theming): repoint old camelCase token var() references to ca…
ArrayKnight Aug 6, 2026
66c85fb
refactor(theming): repoint old camelCase token var() references to ca…
ArrayKnight Aug 6, 2026
7a41986
refactor(theming): repoint old camelCase token var() references to ca…
ArrayKnight Aug 6, 2026
a6868ec
docs(migration): D4 superseding amendment (theming Phase 1, option B …
ArrayKnight Aug 6, 2026
a289a5a
chore(deps): upgrade prettier 2.8.8 -> 3.9.6
ArrayKnight Aug 6, 2026
57d3f8c
style: prettier 3 repo-wide format (1/9, no semantic change)
ArrayKnight Aug 6, 2026
a9b0481
style: prettier 3 repo-wide format (2/9, no semantic change)
ArrayKnight Aug 6, 2026
cd3e30d
style: prettier 3 repo-wide format (3/9, no semantic change)
ArrayKnight Aug 6, 2026
60b9abe
style: prettier 3 repo-wide format (4/9, no semantic change)
ArrayKnight Aug 6, 2026
f968452
style: prettier 3 repo-wide format (5/9, no semantic change)
ArrayKnight Aug 6, 2026
dc71ce9
style: prettier 3 repo-wide format (6/9, no semantic change)
ArrayKnight Aug 6, 2026
e43d331
style: prettier 3 repo-wide format (7/9, no semantic change)
ArrayKnight Aug 6, 2026
0e331ab
style: prettier 3 repo-wide format (8/9, no semantic change)
ArrayKnight Aug 6, 2026
100494e
style: prettier 3 repo-wide format (9/9, no semantic change)
ArrayKnight Aug 6, 2026
cb46e85
feat(tooling): prettier-plugin-tailwindcss 0.8.1 with tailwindStylesheet
ArrayKnight Aug 6, 2026
7644354
style: tailwind class sort via prettier-plugin-tailwindcss (1/27)
ArrayKnight Aug 6, 2026
f312654
style: tailwind class sort via prettier-plugin-tailwindcss (2/4)
ArrayKnight Aug 6, 2026
085bd1f
style: tailwind class sort via prettier-plugin-tailwindcss (3/4)
ArrayKnight Aug 6, 2026
c8ce7d6
style: tailwind class sort via prettier-plugin-tailwindcss (4/4)
ArrayKnight Aug 6, 2026
cdb4590
docs(migration): prettier 3 + tailwind class-sort report
ArrayKnight Aug 6, 2026
f6072c3
feat(tokens): repoint all 467 tokens.* constants to canonical kebab C…
ArrayKnight Aug 7, 2026
c9a7fd0
feat(react-tailwind-theme): canonical-name @theme registration; inlin…
ArrayKnight Aug 7, 2026
85a9c92
feat(react-provider): runtime theme rule writes BOTH vocabularies (le…
ArrayKnight Aug 7, 2026
f868a07
refactor(react-theme-sass): repoint all 433 $-token values to canonic…
ArrayKnight Aug 7, 2026
cc6e408
refactor(charts): old->canonical token var sweep (theming Phase 2a)
ArrayKnight Aug 7, 2026
caac27d
refactor(react-motion): old->canonical token var sweep, stories (them…
ArrayKnight Aug 7, 2026
72d25e6
refactor(react-motion-components-preview): token var sweep, stories (…
ArrayKnight Aug 7, 2026
7397ee5
refactor(theming): old->canonical token var sweep 1/8 (Phase 2a)
ArrayKnight Aug 7, 2026
aa4d63d
refactor(theming): old->canonical token var sweep 2/8 (Phase 2a)
ArrayKnight Aug 7, 2026
be509f6
refactor(theming): old->canonical token var sweep 3/8 (Phase 2a)
ArrayKnight Aug 7, 2026
4fd33a0
refactor(theming): old->canonical token var sweep 4/8 (Phase 2a)
ArrayKnight Aug 7, 2026
b7129fc
refactor(theming): old->canonical token var sweep 5/8 (Phase 2a)
ArrayKnight Aug 7, 2026
e0ae021
refactor(theming): old->canonical token var sweep 6/8 (Phase 2a)
ArrayKnight Aug 7, 2026
4fad40f
refactor(theming): old->canonical token var sweep 7/8 (Phase 2a)
ArrayKnight Aug 7, 2026
c31f4c8
refactor(theming): old->canonical token var sweep 8/8 (Phase 2a)
ArrayKnight Aug 7, 2026
4e90ba2
docs(migration): theming Phase 2a report + committed 467-token rename…
ArrayKnight Aug 7, 2026
674f282
feat(tokens): theme class-name constants + committed theme-values sna…
ArrayKnight Aug 7, 2026
2933760
feat(react-tailwind-theme): emit web-light defaults + 7 shipped theme…
ArrayKnight Aug 7, 2026
1b3af97
feat(react-provider)!: themes are static CSS classes; runtime theme t…
ArrayKnight Aug 7, 2026
8524f64
feat(react-components)!: umbrella/react-theme theming surface swap; u…
ArrayKnight Aug 7, 2026
5784bff
feat(react-charts)!: useIsDarkTheme reads CSS custom properties via u…
ArrayKnight Aug 7, 2026
60783a6
test(react-components): cypress/e2e/test sweep to themeClassName; sco…
ArrayKnight Aug 7, 2026
1dcb45f
feat(theming-tooling)!: theme-designer + v8-v9 shims build theme obje…
ArrayKnight Aug 7, 2026
48fab58
test(vr-harness): theme story variants via CSS theme classes (theming…
ArrayKnight Aug 7, 2026
3207485
docs(public-docsite-v9)!: teach class-based theming; drop the removed…
ArrayKnight Aug 7, 2026
666715c
refactor(apps): perf scenarios, starter template and recipes to theme…
ArrayKnight Aug 7, 2026
23e2d69
fix(react-charts): restore useIsDarkTheme theme reactivity via useCss…
ArrayKnight Aug 7, 2026
ffbc46a
refactor(tooling)!: storybook addons, sandbox scaffold, SSR harness a…
ArrayKnight Aug 7, 2026
247e5bf
chore(release): beachball entries for the theming break; lift stale m…
ArrayKnight Aug 7, 2026
7cc30e3
docs(migration): Phase 2b closeout -- D28 contract, gate evidence, co…
ArrayKnight Aug 7, 2026
a55c132
chore(migration): commit the head-7cc30e35 metrics leg, labelled cont…
ArrayKnight Aug 7, 2026
bb30163
docs(migration): restate every published metric from a measurement re…
ArrayKnight Aug 7, 2026
0be8b96
docs(docsite): document the v9 -> next upgrade path for consumers
ArrayKnight Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
19 changes: 11 additions & 8 deletions .agents/skills/review-pr/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,15 @@ Required if any published package source code changed (not just tests/stories/do

Only for files in `packages/react-components/react-*/library/src/`:

| Check | Look for | Severity |
| ------------------- | --------------------------------------------------------------------------------------------------- | -------- |
| No `React.FC` | `React.FC`, `: FC<`, `React.FunctionComponent` in added lines | BLOCKER |
| No hardcoded styles | Hex colors `#[0-9a-fA-F]{3,8}`, hardcoded `px` values for spacing/radius/font in `.styles.ts` files | WARNING |
| Griffel usage | Style files must use `makeStyles` from `@griffel/react`, not inline styles | WARNING |
| mergeClasses order | User `className` must be the LAST argument in `mergeClasses()` | WARNING |
| Slot system | New components must use `slot.always`/`slot.optional` and `assertSlots` | WARNING |
| Check | Look for | Severity |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| No `React.FC` | `React.FC`, `: FC<`, `React.FunctionComponent` in added lines | BLOCKER |
| No hardcoded styles | Hex colors `#[0-9a-fA-F]{3,8}`, hardcoded `px` values for spacing/radius/font in `.module.css` files | WARNING |
| CSS Modules usage | Styles must live in a co-located `*.module.css`, not in `makeStyles`/`makeResetStyles` or inline styles | WARNING |
| Layer discipline | Library modules author into `fui.components.l1` (or `l2` when styling another component's output); `l3`–`l5` are consumer space and must stay empty | WARNING |
| clsx order | User `className` must be the LAST argument to `clsx()`; the unconditional module class must be first, so the `group/fui-*` marker is never `classList[0]` | WARNING |
| No state mutation | Styles hooks must return a new state object, not assign to `state.<slot>.className` | WARNING |
| Slot system | New components must use `slot.always`/`slot.optional` and `assertSlots` | WARNING |

Reference: [docs/architecture/component-patterns.md](../../../docs/architecture/component-patterns.md)

Expand All @@ -79,7 +81,8 @@ For changes to `package.json` files or new imports in Tier 3 component packages:

- **BLOCKER** if a Tier 3 package (`react-button`, `react-menu`, etc.) adds a dependency on another Tier 3 package
- Allowed Tier 2 deps: `react-utilities`, `react-theme`, `react-shared-contexts`, `react-tabster`, `react-positioning`, `react-portal`
- Allowed Tier 1 deps: `@griffel/react`, `@fluentui/tokens`, `@fluentui/react-jsx-runtime`
- Allowed Tier 1 deps: `@fluentui/tokens`, `@fluentui/react-jsx-runtime`, `clsx`, and
`@fluentui/react-tailwind-theme` as a **devDependency** only (build-time `#theme` alias)

Reference: [docs/architecture/layers.md](../../../docs/architecture/layers.md)

Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/triage-issues/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ For each issue, read the title + body + existing labels. If repro evidence is am
- `packages/react-components/react-field/` — label/description/validation composition (if the ask is form-control adornments)
- The component's stories for worked examples of the composition pattern

v9 defaults to composition over configuration. An ask like "add a `shouldFadeIn` prop" usually has an answer like "compose with `<Fade>`" or "use `onLoad` + `makeStyles` keyframes". Surface the v9 pattern in the comment so the reporter isn't left hanging.
v9 defaults to composition over configuration. An ask like "add a `shouldFadeIn` prop" usually has an answer like "compose with `<Fade>`" or "use `onLoad` plus a `@keyframes` rule in your own stylesheet". Surface the v9 pattern in the comment so the reporter isn't left hanging.

When checking for duplicates, search first:

Expand Down
29 changes: 24 additions & 5 deletions .agents/skills/v9-component/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,27 @@ yarn nx g @fluentui/workspace-plugin:react-component --name $ARGUMENTS --project

1. **Review generated files** against [docs/architecture/component-patterns.md](../../../docs/architecture/component-patterns.md) and fill in component-specific logic.

2. **Add styles** in `use${ARGUMENTS}Styles.styles.ts` using design tokens:
2. **Add styles** in a co-located `${ARGUMENTS}.module.css`, using token custom properties:

```css
@reference '#theme';

@layer fui.theme, fui.base, fui.components, fui.components.l1, fui.components.l2, fui.components.l3, fui.components.l4, fui.components.l5, fui.utilities;

@layer fui.components.l1 {
.root {
@apply flex items-center;

color: var(--colorNeutralForeground1);
}
}
```

Then compose the class names in `use${ARGUMENTS}Styles.styles.ts`:

```tsx
import { makeStyles } from '@griffel/react';
import { tokens } from '@fluentui/react-theme';
import { clsx } from 'clsx';
import styles from './${ARGUMENTS}.module.css';
```

3. **Create a default story** at the appropriate stories package location if not generated.
Expand All @@ -58,8 +74,11 @@ yarn nx g @fluentui/workspace-plugin:react-component --name $ARGUMENTS --project
## Critical Rules

- Always use `ForwardRefComponent` with `React.forwardRef` — never `React.FC`
- Always use design tokens from `@fluentui/react-theme` — never hardcoded colors/spacing/typography
- Always preserve user `className` as the LAST argument in `mergeClasses()`
- Always use design tokens — `var(--colorNeutralForeground1)` in CSS, the `tokens` object from
`@fluentui/react-theme` in TS — never hardcoded colors/spacing/typography
- Always preserve user `className` as the LAST argument to `clsx()` (convention; the cascade layer,
not the argument position, decides which rule wins)
- Styles hooks must **return** the composed state, never mutate the state they are handed
- Use `_unstable` suffix on exported hooks: `use$ARGUMENTS_unstable`, `use${ARGUMENTS}Styles_unstable`, `render${ARGUMENTS}_unstable`
- Guard any `window`/`document`/`navigator` access with `canUseDOM()` from `@fluentui/react-utilities`
- Do not add dependencies on other Tier 3 component packages (see [docs/architecture/layers.md](../../../docs/architecture/layers.md))
Expand Down
10 changes: 8 additions & 2 deletions .devops/templates/build-test-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,19 @@ steps:
env:
DANGER_GITHUB_API_TOKEN: $(DANGER_GITHUB_API_TOKEN)

# `verify-tokens-css` exists on exactly one project (@fluentui/react-tailwind-theme). It asserts
# the checked-in css/tokens.css AND css/themes.css still match what the generator produces from
# @fluentui/tokens (tokens.ts + theme-values.json), so a token added or renamed upstream — or a
# theme value changed without regenerating — cannot silently leave the Tailwind theme layer stale.
# `verify-theme-values` (@fluentui/tokens) asserts the committed theme-values.json snapshot matches
# the built theme objects, closing the loop from the values side (theming Phase 2b).
- script: |
yarn nx affected -t build test lint type-check test-ssr test-integration verify-packaging --nxBail $(sinceArg)
yarn nx affected -t build test lint type-check test-ssr test-integration verify-packaging verify-tokens-css verify-theme-values --nxBail $(sinceArg)
displayName: build, test, lint, test-ssr (affected)
condition: eq(variables.isPR, true)

- script: |
yarn nx run-many -t build test lint type-check test-ssr test-integration verify-packaging --nxBail
yarn nx run-many -t build test lint type-check test-ssr test-integration verify-packaging verify-tokens-css verify-theme-values --nxBail
displayName: build, test, lint, test-ssr (all)
condition: eq(variables.isPR, false)

Expand Down
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ packages/react-components/react-aria @microsoft/teams-prg
packages/react-components/react-aria/library @microsoft/teams-prg
packages/react-components/react-aria/stories @microsoft/teams-prg
packages/react-cards @microsoft/cxe-red @khmakoto
packages/react-components/react-conformance-griffel @microsoft/teams-prg
packages/react-components/deprecated/react-conformance-griffel @microsoft/teams-prg
packages/react-components/react-context-selector @microsoft/teams-prg
packages/react-date-time @microsoft/cxe-red
packages/react-docsite-components @microsoft/fluentui-v8-website
Expand Down
143 changes: 90 additions & 53 deletions .github/instructions/copilot.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ This is a large Nx monorepo with the following key characteristics:

- Location: `packages/react-components/`
- Nx Project Tags: `vNext`
- Features: Current stable version, actively developed. Tree-shakeable, atomic CSS classes
- Features: Current stable version, actively developed. Tree-shakeable, precompiled CSS shipped as `dist/styles.css` per package

2. **Fluent UI v8** (`@fluentui/react`) - **MAINTENANCE ONLY**

Expand Down Expand Up @@ -145,7 +145,8 @@ packages/react-components/react-component-name/
│ │ ├── index.ts # Local exports
│ │ ├── renderComponentName.tsx # JSX rendering
│ │ ├── useComponentName.ts # State management
│ │ └── useComponentNameStyles.styles.ts # Griffel styling
│ │ ├── ComponentName.module.css # Authored styles (CSS Module)
│ │ └── useComponentNameStyles.styles.ts # Class composition (clsx)
│ ├── testing/ # Test utilities
│ └── utils # Reusable utils (if needed)
└── stories/src/ # Storybook documentation
Expand All @@ -164,7 +165,8 @@ react-component-name/
│ │ ├── ComponentName.tsx # Main component export
│ │ ├── ComponentName.types.ts # Props, State, Slots types
│ │ ├── useComponentName.ts # State management hook
│ │ ├── useComponentNameStyles.styles.ts # Griffel styling
│ │ ├── ComponentName.module.css # Authored styles (CSS Module)
│ │ ├── useComponentNameStyles.styles.ts # Class composition (clsx)
│ │ └── renderComponentName.tsx # JSX rendering logic
│ └── index.ts # Package exports
└── stories/ # Storybook stories
Expand All @@ -175,7 +177,7 @@ react-component-name/
Components use three core hooks:

1. **`useComponent_unstable()`** - Processes props, slots and main component logic into normalized state
2. **`useComponentStyles_unstable()`** - Creates Griffel CSS-in-JS styling
2. **`useComponentStyles_unstable()`** - Composes the CSS-Module class names onto the state and returns the new state (never mutates it)
3. **`renderComponent_unstable()`** - Pure JSX rendering from state

### Slot System
Expand Down Expand Up @@ -207,54 +209,81 @@ export const renderButton_unstable = (state: ButtonState) => {
};
```

### Build-Time CSS-in-JS with Atomic Classes
### Precompiled CSS with Tailwind-flavored CSS Modules

**Critical**: v9 uses Griffel for compile-time CSS generation - styles are extracted into atomic CSS classes at build time, not runtime:
**Critical**: v9 authors styles as plain CSS in a co-located `*.module.css`, compiled at build time
into the package's `dist/styles.css`. There is no runtime style engine and no atomic-class merge
step — every conflict is settled by the CSS cascade, using one `@layer` family:

```css
/* Button.module.css */
@reference '#theme';

/* `@reference` emits nothing, so the layer order has to be restated in every module —
otherwise first-appearance order would decide the ranking. Restating it is a no-op. */
@layer fui.theme, fui.base, fui.components, fui.components.l1, fui.components.l2, fui.components.l3, fui.components.l4, fui.components.l5, fui.utilities;

@layer fui.components.l1 {
.root {
@apply inline-flex items-center;

/* Use token custom properties, not hardcoded values */
color: var(--colorNeutralForeground1);
background-color: var(--colorNeutralBackground1);
padding: var(--spacingVerticalS) var(--spacingHorizontalM);
}

.root:hover {
background-color: var(--colorNeutralBackground1Hover);
}

/* Size variations */
.small {
padding: var(--spacingVerticalXS);
}

.large {
padding: var(--spacingVerticalL);
}
}
```

```tsx
// useButtonStyles.styles.ts
import { makeStyles } from '@griffel/react';
import { tokens } from '@fluentui/react-theme';
import { clsx } from 'clsx';
import styles from './Button.module.css';

export const useButtonStyles = makeStyles({
/** The component's public identity class — a named group marker, not a BEM static. */
export const buttonClassNames: { root: string } = {
root: 'group/fui-button',
};

export const useButtonStyles_unstable = (state: ButtonState): ButtonState => ({
...state,
root: {
// Use design tokens, not hardcoded values
color: tokens.colorNeutralForeground1,
backgroundColor: tokens.colorNeutralBackground1,
padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalM}`,

// Pseudo-selectors and media queries supported
':hover': {
backgroundColor: tokens.colorNeutralBackground1Hover,
},

':focus-visible': {
outline: `${tokens.strokeWidthThick} solid ${tokens.colorStrokeFocus2}`,
},
...state.root,
className: clsx(
// Unconditional module class first: the `group/fui-*` marker must never be classList[0].
styles.root,
'group/fui-button',
state.size === 'small' && styles.small,
state.size === 'large' && styles.large,
// Always preserve the user's className, last by convention.
state.root.className,
),
},

// Size variations
small: { padding: tokens.spacingVerticalXS },
large: { padding: tokens.spacingVerticalL },
});
```

// Apply in component hook
export const useButton_unstable = (props, ref) => {
const classes = useButtonStyles();
const state = {
/* ... */
};

state.root.className = mergeClasses(
classes.root,
props.size === 'small' && classes.small,
props.size === 'large' && classes.large,
state.root.className, // Always preserve user className
);
Three rules follow from the cascade-first model:

return state;
};
```
1. **`clsx` argument order carries no cascade meaning.** It is a plain string join. Which rule wins
is decided by layer, then specificity, then source order — record intended winners in the
module's layer assignment.
2. **Styles hooks return state, they do not mutate it** (`react-hooks/immutability` enforces this).
Call sites rebind: `state = useButtonStyles_unstable(state);`.
3. **Library modules author into `fui.components.l1`**, or `l2` when deliberately styling another
component's output. `l3`–`l5` are consumer space; unlayered consumer CSS beats all of it.

### Design Tokens System

Expand All @@ -274,22 +303,30 @@ borderRadius: '4px';

### Theme Architecture

Themes define CSS custom properties consumed by components:
Themes define CSS custom properties consumed by components. They ship as static CSS classes in
`@fluentui/react-tailwind-theme` (import `@fluentui/react-tailwind-theme/styles.css` once per
document; web-light values are the `:root` defaults):

```tsx
// FluentProvider injects CSS variables into DOM
<FluentProvider theme={webLightTheme}>
// FluentProvider applies a static theme class (and propagates it to portals)
<FluentProvider themeClassName={webLightThemeClassName}>
<App />
</FluentProvider>;
</FluentProvider>
```

// Components reference tokens which resolve to CSS variables
makeStyles({
root: {
color: tokens.colorNeutralForeground1, // becomes 'var(--colorNeutralForeground1)'
},
});
Components reference the custom properties directly in their `*.module.css`:

```css
@layer fui.components.l1 {
.root {
color: var(--color-neutral-foreground-1);
}
}
```

From TypeScript, use the `tokens` object — it maps each token name to the same reference
(`tokens.colorNeutralForeground1 === 'var(--color-neutral-foreground-1)'`).

### TypeScript Patterns (v9)

**Strict typing with consistent interfaces:**
Expand Down Expand Up @@ -345,7 +382,7 @@ export const Component: ForwardRefComponent<ComponentProps> = React.forwardRef((
- Comprehensive prop interfaces with JSDoc comments
- Consistent naming conventions (PascalCase for components, camelCase for props)
- Use React hooks and modern patterns for v9 components
- Focus on the slot system, Griffel styling, and hook-based architecture for v9
- Focus on the slot system, CSS-Modules styling with the `@layer fui.*` family, and hook-based architecture for v9

### Testing Requirements

Expand Down
5 changes: 5 additions & 0 deletions .nxignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,8 @@ plop-templates-_

; TODO: temporary ignore - remove once https://github.com/microsoft/fluentui/pull/32371 is merged
scripts/\*/just.config.ts

; local scratch workspace (gitignored) — contains copies of the repo tree from measurement
; runs; without this nx discovers them as duplicate projects and the project graph fails to build
.scratch
**/.scratch/**
4 changes: 4 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# generated or imported files
package-deps.json
# generated theme CSS — byte-exact against packages/tokens values (generator --check);
# prettier would rewrite value bytes (rgba spacing, trailing zeros, line wraps)
packages/react-components/react-tailwind-theme/css/tokens.css
packages/react-components/react-tailwind-theme/css/themes.css
CHANGELOG.*
# generated from `web-features` via `yarn generate-browser-support`
**/browser-support-data.generated.json
Expand Down
20 changes: 19 additions & 1 deletion .storybook/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,29 @@ module.exports = /** @type {import('./types').StorybookConfig} */ ({
test: /\.stories\.tsx$/,
include: /stories/,
},
/**
* Converted packages import `*.module.css`; without this the sandbox export drops
* those imports and every exported story opens unstyled. The addon side has supported
* this since the CSS-modules work landed — only the option was never passed.
*/
cssModules: true,
},
}),
],
webpackFinal: config => {
registerRules({ config, rules: [rules.swcRule] });
/**
* Narrow storybook's own implicit `/\.css$/` rule FIRST, then add ours — webpack applies
* every matching rule, so the builder's plain style-loader/css-loader pair has to stop
* matching `*.module.css` (it would hand back an empty class map) and the Tailwind theme
* entry (it would emit `@import … source(none)` verbatim) before these are registered.
*
* Every converted package's `*.module.css` opens with `@reference '#theme'` and uses
* `@apply`, which are not valid CSS until Tailwind's PostCSS pass has run. Without this
* wiring this storybook — and the ~76 package storybooks and the public docsite that
* compose it — render every converted package unstyled.
*/
rules.excludeTailwindCssFromDefaultCssRule(config);
registerRules({ config, rules: [rules.swcRule, rules.cssModulesRule, rules.tailwindThemeRule] });
registerTsPaths({ config, configFile: tsConfigPath });

if ((process.env.CI || process.env.TF_BUILD) && config.plugins) {
Expand Down
Loading