Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
243 commits
Select commit Hold shift + click to select a range
5707e79
docs(windmod): open the react-windmod campaign — plan, ledger, upstre…
ArrayKnight Aug 21, 2026
b9db9d8
feat(windmod): port the Tailwind+CSS-Modules build infra and the them…
ArrayKnight Aug 21, 2026
d826380
feat(windmod): scaffold react-windmod-preview with pilot Button, Tool…
ArrayKnight Aug 21, 2026
510b8c5
feat(windmod): pilot stories with Griffel side-by-side + storybook wi…
ArrayKnight Aug 21, 2026
b60ba87
feat(windmod): pilot verified in storybook — placements, theming, com…
ArrayKnight Aug 21, 2026
08ad9e8
refactor(windmod): address PR review — Tailwind-first CSS, immutabili…
ArrayKnight Aug 21, 2026
b6f6b12
docs(windmod): ledger — Phase 2 items from PR review
ArrayKnight Aug 21, 2026
a2f2bc3
feat(windmod): class-targetable tooltip arrow via headless arrowClass…
ArrayKnight Aug 21, 2026
5a60c61
refactor(windmod): address review round 2 — layer decl only in theme,…
ArrayKnight Aug 21, 2026
551a5b0
docs(windmod): ledger — icons data-variant proposal + optional data-a…
ArrayKnight Aug 21, 2026
a8b92ae
feat(windmod): glyph swap rides data-variant catalog variants
ArrayKnight Aug 21, 2026
e7fe699
chore(windmod): LOCAL-ONLY — resolve react-icons to the data-variant …
ArrayKnight Aug 21, 2026
1a75e72
refactor(windmod): drop numeric size-* variants, merge focus variants
ArrayKnight Aug 21, 2026
e012eeb
refactor(windmod): no union variants — comma-separate at the call site
ArrayKnight Aug 21, 2026
b61eca4
chore(windmod): keep working docs out of the repo
ArrayKnight Aug 21, 2026
6b59aa9
docs(windmod): comment sweep — standalone, minimal, no decision refer…
ArrayKnight Aug 21, 2026
53e1790
chore: finish the comment sweep in storybook rules and the css-module…
ArrayKnight Aug 21, 2026
a3d8c03
test(windmod): add the VR comparison stories and close the icon glyph…
ArrayKnight Aug 21, 2026
e365d73
feat(windmod): add Label
ArrayKnight Aug 21, 2026
a17891d
fix(windmod): exempt VR scene helpers from the extraneous-dependencie…
ArrayKnight Aug 21, 2026
0cf26cd
chore: refresh the local icons tarball checksum [local-only, revert b…
ArrayKnight Aug 21, 2026
08e91a3
refactor(windmod): style the required indicator via its group variant…
ArrayKnight Aug 21, 2026
dc96856
refactor(windmod): move appearance-scoped icon rules to group variant…
ArrayKnight Aug 21, 2026
f2873cc
refactor(windmod): stamp the marker pair through a single helper
ArrayKnight Aug 21, 2026
7f94fe2
feat(windmod): add Divider
ArrayKnight Aug 21, 2026
5384e05
refactor(windmod): move component resting styles from fui.base into f…
ArrayKnight Aug 21, 2026
f995dcb
refactor(windmod): author each module class as a single block
ArrayKnight Aug 21, 2026
ded9ac6
feat(windmod): add Link
ArrayKnight Aug 21, 2026
2ed2657
refactor(windmod): split component-specific variants out of the theme…
ArrayKnight Aug 21, 2026
b54054d
feat(windmod): add Badge
ArrayKnight Aug 21, 2026
c512815
feat(windmod): add Spinner
ArrayKnight Aug 21, 2026
7f9ec0f
feat(windmod): add Skeleton and SkeletonItem
ArrayKnight Aug 22, 2026
7735833
feat(windmod): add Image
ArrayKnight Aug 22, 2026
2ecdea4
feat(windmod): add ProgressBar
ArrayKnight Aug 22, 2026
640dd99
docs(windmod): fix typos inherited from the spec template
ArrayKnight Aug 22, 2026
ae032f3
feat(windmod): add RatingDisplay and RatingItem
ArrayKnight Aug 22, 2026
3c8bd4d
feat(windmod): add ToggleButton
ArrayKnight Aug 22, 2026
6baf4c3
feat(windmod): finalize CompoundButton
ArrayKnight Aug 22, 2026
b387a15
feat(windmod): add Input
ArrayKnight Aug 22, 2026
e7f61d7
feat(react-windmod-preview): add Textarea (headless + Tailwind, pixel…
ArrayKnight Aug 22, 2026
215c76b
feat(react-windmod-preview): add Slider (headless + Tailwind, pixel-i…
ArrayKnight Aug 22, 2026
e02f62e
refactor(react-tailwind-theme-preview): define focus-within-visible n…
ArrayKnight Aug 23, 2026
b985310
fix(react-headless-components-preview): point node/require export con…
ArrayKnight Aug 23, 2026
b95a415
fix(react-breadcrumb): make BreadcrumbButtonBaseProps distribute over…
ArrayKnight Aug 23, 2026
3e070a5
feat(react-windmod-preview)!: rework the provider — FluentProvider re…
ArrayKnight Aug 23, 2026
a1d3b11
feat(react-windmod-preview): add MenuButton (headless + Tailwind, pix…
ArrayKnight Aug 23, 2026
4eab2cd
refactor(styles)!: retire !important from the icon glyph system
ArrayKnight Aug 23, 2026
ddd6c8a
feat(react-windmod-preview): add Select (headless + Tailwind, pixel-i…
ArrayKnight Aug 23, 2026
3dfe360
feat(react-windmod-preview): add SplitButton (headless + Tailwind, pi…
ArrayKnight Aug 23, 2026
a2aa7e5
feat(react-windmod-preview): add Checkbox (headless + Tailwind, pixel…
ArrayKnight Aug 23, 2026
2e37f45
feat(react-windmod-preview): add Switch (headless + Tailwind, pixel-i…
ArrayKnight Aug 23, 2026
08de88f
refactor(react-tailwind-theme-preview): simplify focus-within to the …
ArrayKnight Aug 23, 2026
20924b8
fix(react-color-picker): use nullish fallback in adjustChannel so zer…
ArrayKnight Aug 23, 2026
62fbfa6
feat(react-windmod-preview): add RadioGroup and Radio (headless + Tai…
ArrayKnight Aug 23, 2026
015b5f1
test(react-windmod-preview): freeze-state harness for glyph consumers…
ArrayKnight Aug 23, 2026
f484a3e
fix(workspace-plugin): emit CJS class maps as .cjs and repoint their …
ArrayKnight Aug 23, 2026
6b47167
fix(react-windmod-preview): repair state regressions the revalidation…
ArrayKnight Aug 23, 2026
523e3d8
feat(react-windmod-preview): add Field (headless + Tailwind, pixel-id…
ArrayKnight Aug 23, 2026
8927fe4
feat(react-windmod-preview): add Avatar (headless + Tailwind, pixel-i…
ArrayKnight Aug 23, 2026
b3fabbe
feat(react-windmod-preview): add Tag (headless + Tailwind, pixel-iden…
ArrayKnight Aug 23, 2026
7dcb507
feat(react-windmod-preview): add the Card family (headless + Tailwind…
ArrayKnight Aug 23, 2026
5015f71
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 23, 2026
bc49942
feat(react-tailwind-theme-preview): add the with-description variant …
ArrayKnight Aug 23, 2026
2591e68
feat(react-windmod-preview): add Rating; promote RatingItem with its …
ArrayKnight Aug 24, 2026
5046746
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
659484e
feat(react-windmod-preview): add the Toolbar family (headless + Tailw…
ArrayKnight Aug 24, 2026
588beb3
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
8834001
feat(react-windmod-preview): add TabList and Tab (headless + Tailwind…
ArrayKnight Aug 24, 2026
b994b12
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
19008f0
feat(react-windmod-preview): add the MessageBar family (headless + Ta…
ArrayKnight Aug 24, 2026
a8d18f7
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
a7e0d72
feat(react-windmod-preview): add the Accordion family (headless + Tai…
ArrayKnight Aug 24, 2026
9e95508
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
e9b5bc1
feat(react-windmod-preview): add Nav, NavItem, NavSectionHeader and N…
ArrayKnight Aug 24, 2026
40465b0
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
ec7dd6a
feat(react-windmod-preview): add Breadcrumb, BreadcrumbItem, Breadcru…
ArrayKnight Aug 24, 2026
4981023
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
fbd6377
feat(react-windmod-preview): add NavCategory, NavCategoryItem, NavSub…
ArrayKnight Aug 24, 2026
7807c2e
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
e1cf1ca
feat(react-windmod-preview): add SwatchPicker, ColorSwatch, EmptySwat…
ArrayKnight Aug 24, 2026
3824a55
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
e57faac
refactor(react-windmod-preview): flatten the Accordion family to flat…
ArrayKnight Aug 24, 2026
bcaa656
refactor(react-windmod-preview): flatten the Breadcrumb family to fla…
ArrayKnight Aug 24, 2026
3e0fc6c
refactor(react-windmod-preview): flatten the MessageBar family to fla…
ArrayKnight Aug 24, 2026
5510454
refactor(react-windmod-preview): flatten the Nav family to flat sibli…
ArrayKnight Aug 24, 2026
37b6787
refactor(react-windmod-preview): flatten the Toolbar family to flat s…
ArrayKnight Aug 24, 2026
4a0fec5
refactor(react-windmod-preview): flatten the Skeleton and TabList fam…
ArrayKnight Aug 24, 2026
ca9d520
refactor(react-windmod-preview): flatten the SwatchPicker family to f…
ArrayKnight Aug 24, 2026
6e08bb9
feat(react-windmod-preview): add SpinButton (headless + Tailwind, pix…
ArrayKnight Aug 24, 2026
19ebc11
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
2c7aca5
feat(react-windmod-preview): add SearchBox (headless + Tailwind, pixe…
ArrayKnight Aug 24, 2026
0cf6a94
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
e38f9e7
feat(react-windmod-preview): add ColorPicker, ColorSlider, AlphaSlide…
ArrayKnight Aug 24, 2026
19264a0
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
952c32e
fix(react-windmod-preview): match the reference forced-colors renderi…
ArrayKnight Aug 24, 2026
94d820f
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
9612d54
feat(react-windmod-preview): honour the component look contexts insid…
ArrayKnight Aug 24, 2026
094f0e6
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
dbfc307
fix(react-windmod-preview): match the reference forced-colors renderi…
ArrayKnight Aug 24, 2026
b965f91
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
9b6be21
fix(react-windmod-preview): match the reference forced-colors renderi…
ArrayKnight Aug 24, 2026
6ad601b
refactor(styles): scale the type ramp with the base ratio and alias c…
ArrayKnight Aug 24, 2026
d852cd0
refactor(react-windmod-preview): apply the styling conventions to com…
ArrayKnight Aug 24, 2026
e1d4890
refactor(react-windmod-preview): apply the styling conventions to com…
ArrayKnight Aug 24, 2026
318c160
refactor(react-windmod-preview): apply the styling conventions to com…
ArrayKnight Aug 24, 2026
b8f4d04
refactor(react-windmod-preview): apply the styling conventions to com…
ArrayKnight Aug 24, 2026
a3b0122
feat(react-windmod-preview): add TagGroup (headless + Tailwind, pixel…
ArrayKnight Aug 24, 2026
c37e169
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
85ad6ba
feat(react-windmod-preview): add Persona (headless + Tailwind, pixel-…
ArrayKnight Aug 24, 2026
cf1acea
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 24, 2026
5692aa4
feat(react-windmod-preview): add InteractionTag, InteractionTagPrimar…
ArrayKnight Aug 24, 2026
9b32cda
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 24, 2026
d7856b2
docs(react-windmod-preview): document Overflow compatibility with a l…
ArrayKnight Aug 24, 2026
81c3424
docs(react-windmod-preview): add the Griffel-consumer migration guide
ArrayKnight Aug 24, 2026
01ccede
fix(react-headless-components-preview): let the consumer popover prop…
ArrayKnight Aug 25, 2026
5083f4f
feat(react-windmod-preview): add Popover, PopoverTrigger and PopoverS…
ArrayKnight Aug 25, 2026
40bca2b
fix(react-headless-components-preview): let the consumer popover prop…
ArrayKnight Aug 25, 2026
17f7e79
fix(react-headless-components-preview): reserve the scrollbar gutter …
ArrayKnight Aug 25, 2026
f5d9805
feat(react-windmod-preview): add Dialog, DialogTrigger, DialogSurface…
ArrayKnight Aug 25, 2026
3e0da18
feat(react-windmod-preview): add Drawer and the drawer chrome (headle…
ArrayKnight Aug 25, 2026
38a90bc
feat(react-windmod-preview): add OverlayDrawer and InlineDrawer (head…
ArrayKnight Aug 25, 2026
50bfe1a
Merge branch 'lane-d' into styling/react-windmod
ArrayKnight Aug 25, 2026
2e53d0e
feat(react-windmod-preview): add Combobox, Listbox, Option and Option…
ArrayKnight Aug 26, 2026
94a7b1d
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 26, 2026
06b74a5
chore(react-windmod-preview): regenerate the API rollup after the dra…
ArrayKnight Aug 26, 2026
ea9a086
feat(react-windmod-preview): add Dropdown (headless + Tailwind, pixel…
ArrayKnight Aug 26, 2026
c01a375
feat(react-windmod-preview): add useCssVarValue with scoped automatic…
ArrayKnight Aug 26, 2026
522e804
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 26, 2026
76f85c9
feat(react-windmod-preview): add Toaster, Toast, ToastTitle, ToastBod…
ArrayKnight Aug 26, 2026
333171e
Merge branch 'lane-d' into styling/react-windmod
ArrayKnight Aug 26, 2026
f34b0a1
fix(react-tag-picker): cancel the aside-width frame in a cleanup, not…
ArrayKnight Aug 26, 2026
11c7f15
Merge branch 'lane-c' into styling/react-windmod
ArrayKnight Aug 26, 2026
ced4e3d
feat(react-windmod-preview): add Menu, MenuTrigger, MenuPopover and M…
ArrayKnight Aug 26, 2026
e8cd781
feat(react-windmod-preview): add MenuItem, MenuItemCheckbox and MenuI…
ArrayKnight Aug 26, 2026
f2dc27d
feat(react-windmod-preview): add MenuGroup, MenuGroupHeader and MenuD…
ArrayKnight Aug 26, 2026
e0dd538
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 26, 2026
45fd498
chore(react-windmod-preview): regenerate the API rollup after the men…
ArrayKnight Aug 26, 2026
5a89364
feat(react-windmod-preview): add AvatarGroup family (headless + Tailw…
ArrayKnight Aug 26, 2026
b6e229c
feat(react-windmod-preview): add TagPicker family components (headles…
ArrayKnight Aug 26, 2026
39c5e12
feat(react-windmod-preview): register TagPicker exports, barrels, api…
ArrayKnight Aug 26, 2026
a0617ad
feat(react-windmod-preview): add TagPicker VR scenes and stories [3/3]
ArrayKnight Aug 26, 2026
3f12582
Merge branch 'lane-c' into styling/react-windmod
ArrayKnight Aug 26, 2026
45233e1
feat(react-windmod-preview): add InfoLabel + InfoButton (headless + T…
ArrayKnight Aug 26, 2026
622a96e
Merge branch 'lane-d' into styling/react-windmod
ArrayKnight Aug 26, 2026
10ec632
feat(react-windmod-preview): add TeachingPopover family components (h…
ArrayKnight Aug 26, 2026
174e94c
feat(react-windmod-preview): register TeachingPopover exports, barrel…
ArrayKnight Aug 26, 2026
f92222f
feat(react-windmod-preview): add TeachingPopover VR scenes and storie…
ArrayKnight Aug 26, 2026
95d4d42
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 26, 2026
104b3d8
chore(react-windmod-preview): regenerate the API rollup after the tea…
ArrayKnight Aug 26, 2026
8659c5e
chore(react-tailwind-theme-preview): delete two dead catalog variants
ArrayKnight Aug 26, 2026
4e4705d
refactor(react-windmod-preview): comment dedup polish batch, part 1 of 2
ArrayKnight Aug 26, 2026
5cc7b99
refactor(react-windmod-preview): comment dedup polish batch, part 2 of 2
ArrayKnight Aug 26, 2026
76c3be8
refactor(react-windmod-preview): test-infrastructure polish batch, pa…
ArrayKnight Aug 26, 2026
e2172d6
refactor(react-windmod-preview): test-infrastructure polish batch, pa…
ArrayKnight Aug 26, 2026
956c75b
fix(react-windmod-preview): CompoundButton icon gap survives falsy ch…
ArrayKnight Aug 26, 2026
a909cfb
Merge branch 'lane-d' into styling/react-windmod
ArrayKnight Aug 26, 2026
68d0470
refactor(styles): move scale-coupled px values onto the base-scale ramp
ArrayKnight Aug 26, 2026
5c06682
chore: untrack stray probe scripts committed outside .scratch
ArrayKnight Aug 26, 2026
7f9a3b3
docs(react-windmod-preview): state CardPreview's :not() reach constra…
ArrayKnight Aug 26, 2026
b4186bb
fix(react-windmod-preview): complete reduced-motion parity for the te…
ArrayKnight Aug 26, 2026
ac82e23
refactor(react-windmod-preview): shared class-assembly abstractions, …
ArrayKnight Aug 26, 2026
bf9b486
refactor(react-windmod-preview): shared class-assembly abstractions, …
ArrayKnight Aug 26, 2026
8a09526
fix(react-windmod-preview): suppress the Nav chevron rotation under p…
ArrayKnight Aug 27, 2026
8929c9e
feat(react-tailwind-theme-preview): global reduced-motion floor with …
ArrayKnight Aug 27, 2026
1039205
merge: upstream/master (19 commits, dfab5d732f) into styling/react-wi…
ArrayKnight Aug 27, 2026
4656d1b
fix: refresh yarn.lock for the windmod package's declared dependencies
ArrayKnight Aug 27, 2026
26a252c
fix(react-windmod-preview): follow upstream's positioning narrowing a…
ArrayKnight Aug 27, 2026
c8b58cc
docs(react-windmod-preview): PRE-PR MIGRATION refresh and publish-haz…
ArrayKnight Aug 27, 2026
a1479e9
fix(react-windmod-preview): PopoverSurface box-sizing and cursor parity
ArrayKnight Aug 27, 2026
99a70a4
feat(react-windmod-preview): add NavDrawer family (headless + Tailwin…
ArrayKnight Aug 27, 2026
1f32bc1
feat(react-windmod-preview): add the ./positioning re-export barrel
ArrayKnight Aug 27, 2026
5cecfd9
feat(react-windmod-preview): add MenuItemLink and MenuItemSwitch (hea…
ArrayKnight Aug 27, 2026
d6776da
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 27, 2026
568297d
fix(react-headless-components-preview): provide MenuSplitGroup's context
ArrayKnight Aug 28, 2026
4a92048
feat(react-windmod-preview): add MenuSplitGroup (headless + Tailwind,…
ArrayKnight Aug 28, 2026
e24635f
feat(react-windmod-preview): add the TeachingPopover Carousel family …
ArrayKnight Aug 28, 2026
1e06598
feat(react-windmod-preview): register Carousel subpaths, scenes, and …
ArrayKnight Aug 28, 2026
e9c0437
Merge branch 'lane-c' into styling/react-windmod
ArrayKnight Aug 28, 2026
9f5a5d6
chore(preview-packages): align windmod and tailwind-theme versions to…
ArrayKnight Aug 28, 2026
efbf0dd
fix(babel-preset-storybook-full-source): declare @prettier/sync, the …
ArrayKnight Aug 28, 2026
c5c51a8
chore: add change files for every published package this PR touches
ArrayKnight Aug 28, 2026
c1c1625
chore: refresh yarn.lock for the preview version bump and the @pretti…
ArrayKnight Aug 28, 2026
58f38cb
docs(react-windmod-preview): guide-grade correctness pass over MIGRAT…
ArrayKnight Aug 28, 2026
b008869
chore: gitignore graphify-out so tool cache cannot land in the PR
ArrayKnight Aug 28, 2026
42d42b5
docs(react-windmod-preview): add the fluentui-windmod agent skill
ArrayKnight Aug 28, 2026
c2a7fff
chore(react-windmod-preview): ship the agent skill in the tarball
ArrayKnight Aug 28, 2026
15618da
docs(react-windmod-preview): state what the parity gate actually asserts
ArrayKnight Aug 28, 2026
b7c455e
feat(workspace-plugin): let export-maps-sync preserve hand authored a…
ArrayKnight Aug 28, 2026
9250a0e
feat(react-windmod-preview): release the preview package
ArrayKnight Aug 28, 2026
7c109fb
docs(react-windmod-preview): correct the layer-order claim and close …
ArrayKnight Aug 28, 2026
62d09f9
refactor(react-windmod-preview): track the icons rename to data-fui-i…
ArrayKnight Aug 28, 2026
0c076d6
docs(react-windmod-preview): menu-rtl ceiling 412 — cover both measur…
ArrayKnight Aug 28, 2026
0890ccb
feat(react-windmod-preview): per-component CSS delivery
ArrayKnight Aug 28, 2026
6057ae2
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 28, 2026
c5ba882
docs(react-windmod-preview): close the two subpath-map gaps the split…
ArrayKnight Aug 28, 2026
f3d5b8d
feat(react-windmod-preview): family-barrel export surface [1/12]
ArrayKnight Aug 28, 2026
b3e9a8b
feat(react-windmod-preview): family-barrel export surface [2/12]
ArrayKnight Aug 28, 2026
8497ae4
feat(react-windmod-preview): family-barrel export surface [3/12]
ArrayKnight Aug 28, 2026
7fd984e
feat(react-windmod-preview): family-barrel export surface [4/12]
ArrayKnight Aug 28, 2026
7adaaaa
feat(react-windmod-preview): family-barrel export surface [5/12]
ArrayKnight Aug 28, 2026
dd0de60
feat(react-windmod-preview): family-barrel export surface [6/12]
ArrayKnight Aug 28, 2026
2079c3c
feat(react-windmod-preview): family-barrel export surface [7/12]
ArrayKnight Aug 28, 2026
dac9385
feat(react-windmod-preview): family-barrel export surface [8/12]
ArrayKnight Aug 28, 2026
98cce27
feat(react-windmod-preview): family-barrel export surface [9/12]
ArrayKnight Aug 28, 2026
321bfc5
feat(react-windmod-preview): family-barrel export surface [10/12]
ArrayKnight Aug 28, 2026
2471b0f
feat(react-windmod-preview): family-barrel export surface [11/12]
ArrayKnight Aug 28, 2026
ecbf41c
feat(react-windmod-preview): family-barrel export surface [12/12]
ArrayKnight Aug 28, 2026
f02bd85
fix(scripts-prettier): restore the argv-array execFileSync form
ArrayKnight Aug 28, 2026
e868dd6
refactor(react-windmod-preview): remove redundant pseudo-element cont…
ArrayKnight Aug 28, 2026
93acf4b
refactor(react-windmod-preview): condition-key bucket ladders (style …
ArrayKnight Aug 28, 2026
3afadf8
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 28, 2026
60cc256
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 28, 2026
881a99e
Merge remote-tracking branch 'upstream/master' into styling/react-win…
ArrayKnight Aug 28, 2026
0ec6447
refactor(react-tailwind-theme-preview): split themes into per-theme C…
ArrayKnight Aug 28, 2026
44aa9a9
Merge branch 'styling/react-windmod' into lane-c
ArrayKnight Aug 28, 2026
4c5478f
fix(react-tailwind-theme-preview): normalize CRLF out of compiled CSS…
ArrayKnight Aug 28, 2026
7ca8e58
refactor(react-windmod-preview): derive not-scroll-state-none automat…
ArrayKnight Aug 28, 2026
8792f1c
refactor(react-windmod-preview): direct-child icon-filled/icon-regula…
ArrayKnight Aug 29, 2026
804c9bb
refactor(react-windmod-preview): assign component layer levels per ru…
ArrayKnight Aug 29, 2026
904aa0f
Merge branch 'lane-b' into styling/react-windmod
ArrayKnight Aug 29, 2026
fc799f3
feat(react-tailwind-theme-preview): bind stroke-width tokens to the b…
ArrayKnight Aug 29, 2026
2c2d7be
refactor(react-windmod-preview): adopt the named stroke-width, durati…
ArrayKnight Aug 29, 2026
2a0c0f9
refactor(react-windmod-preview): not-forced-colors variant, single-@a…
ArrayKnight Aug 29, 2026
18303df
refactor(react-tailwind-theme-preview): scale shadow ramp and add num…
ArrayKnight Aug 29, 2026
838b1c9
refactor(react-windmod-preview): delete redundant state re-assertion …
ArrayKnight Aug 29, 2026
dfe3675
Merge branch 'styling/react-windmod' into lane-d
ArrayKnight Aug 29, 2026
9583d28
refactor(react-windmod-preview): CardPreview owns its floating-action…
ArrayKnight Aug 29, 2026
17b25a2
Merge branch 'lane-a' into styling/react-windmod
ArrayKnight Aug 29, 2026
a10fb5f
refactor(react-windmod-preview): sweep the census's fixable outliers …
ArrayKnight Aug 29, 2026
9d187be
docs(react-windmod-preview): add the failure-modes reference to the w…
ArrayKnight Aug 29, 2026
68bb856
fix(react-windmod-preview): restore TeachingPopoverBody's load-bearin…
ArrayKnight Aug 29, 2026
7aa4fb1
refactor(react-windmod-preview): inline InfoButton's size-to-typograp…
ArrayKnight Aug 29, 2026
bdcd4ee
refactor(react-windmod-preview): key icon glyph styling off data-fui-…
ArrayKnight Aug 29, 2026
ceef4dd
Merge remote-tracking branch 'upstream/master' into styling/react-win…
ArrayKnight Sep 1, 2026
496addd
feat(react-tailwind-theme-preview): ship Tailwind preflight in a new …
ArrayKnight Sep 1, 2026
704daf8
refactor(react-windmod-preview): abolish UA-font dependence — leading…
ArrayKnight Sep 1, 2026
23340a9
refactor(react-windmod-preview): convert leading to unitless ratios d…
ArrayKnight Sep 1, 2026
b2b9623
docs(react-windmod-preview): ship-surface updates for preflight + uni…
ArrayKnight Sep 1, 2026
f7b8b7c
refactor(react-tailwind-theme-preview): fold preflight into the head …
ArrayKnight Sep 1, 2026
a4083e7
refactor(react-windmod-preview): converge Toast/TabList/SkeletonItem …
ArrayKnight Sep 1, 2026
ebd97c2
refactor(react-windmod-preview): phase-2B audit tail - scaled literal…
ArrayKnight Sep 1, 2026
95e27de
Merge remote-tracking branch 'upstream/master' into styling/react-win…
ArrayKnight Sep 2, 2026
0624ab3
fix(react-headless-components-preview): converge AvatarGroup context …
ArrayKnight Sep 2, 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
  •  
  •  
  •  
33 changes: 33 additions & 0 deletions .agents/skills/fluentui-windmod/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
name: fluentui-windmod
description: Use when styling, theming or overriding Fluent UI components from @fluentui/react-windmod-preview or @fluentui/react-tailwind-theme-preview, when authoring or verifying component styles inside those packages, or when users say "style this Fluent component", "override the button styles", "theme this app", "switch to dark theme", "restyle windmod", "fui-button", "group variant", "cascade layer", or when working with .module.css files in a windmod project or migrating an app off @fluentui/react-components and Griffel. Provides the override model (cascade layers, not props), the public class and data-attribute surface, the variant catalog, theme class names, the base-scale density knob, and the authoring and verification conventions used inside the library itself.
license: MIT
---

# Fluent windmod

The full skill is vendored with the package it documents, so that the copy published to consumers
and the copy used in this repository can never drift apart.

**Read it here — start with `SKILL.md`, then follow its routing:**

```
packages/react-components/react-windmod-preview/library/skills/fluentui-windmod/
SKILL.md the agent contract — read this first
references/setup.md installing, the two stylesheets, wiring your own Tailwind
references/overriding.md restyling a component from an app
references/variant-catalog.md the two catalogs and the group-variant vocabulary
references/tokens-and-scale.md token namespaces, --base-scale, density
references/griffel-deltas.md the deliberate differences from @fluentui/react-components
references/css-var-values.md reading a resolved token value in JavaScript
references/authoring-conventions.md CONTRIBUTORS: authoring rules + the verification protocol
references/troubleshooting.md a style that will not apply
assets/ a worked override example
```

**Changing anything inside `packages/react-components/react-windmod-preview`** — a `*.module.css`, a
styles hook, a VR scene, a mutation table, a pixel allowance — means loading
`references/authoring-conventions.md` completely first. Those rules are strict and violations are
rejected.

Consumer-facing install and adoption notes live in the same directory's `README.md`.
1 change: 1 addition & 0 deletions .claude/skills/fluentui-windmod/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@../../../.agents/skills/fluentui-windmod/SKILL.md
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,8 @@ packages/react-components/react-menu-grid-preview/library @microsoft/teams-prg
packages/react-components/react-menu-grid-preview/stories @microsoft/teams-prg
packages/react-components/react-headless-components-preview/library @microsoft/cxe-prg
packages/react-components/react-headless-components-preview/stories @microsoft/cxe-prg
packages/react-components/react-windmod-preview/library @microsoft/cxe-prg
packages/react-components/react-windmod-preview/stories @microsoft/cxe-prg
# <%= NX-CODEOWNER-PLACEHOLDER %>

# Deprecated v9 packages - exposed as part of `/unstable` api
Expand Down
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,11 @@ gulp-cache
.cursor/rules/nx-rules.mdc
.github/instructions/nx.instructions.md
.playwright-cli

# session scratch space (never committed)
.scratch/

# knowledge-graph tool output (never committed) — lands at the repo root and, because it is
# written relative to the invocation directory, sometimes under packages/ where nx and beachball
# then scan it. 2,177 cache files at last count, all regenerable.
graphify-out/
14 changes: 13 additions & 1 deletion .storybook/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,19 @@ module.exports = /** @type {import('./types').StorybookConfig} */ ({
}),
],
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.
*
* windmod-preview `*.module.css` files open with `@reference '#theme'` and use `@apply`,
* which are not valid CSS until Tailwind's PostCSS pass has run. Without this wiring
* this storybook — and the package storybooks and docsites that compose it — render
* windmod components 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
22 changes: 22 additions & 0 deletions .storybook/preview.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,29 @@
// Emits the shared Tailwind theme layer once per document (see the file's header).
// Required by windmod-preview `*.module.css`. Package/app previews import this module,
// so the side effect reaches all of them.
import '../scripts/storybook/src/tailwind-theme.css';
import '../packages/react-components/react-storybook-addon/src/styles.css';
import '../packages/react-components/react-storybook-addon-export-to-sandbox/src/styles.css';
import { webLightThemeClassName } from '@fluentui/react-tailwind-theme-preview/theme-class-names';
import { withLinks } from '@storybook/addon-links';

/*
* Stands in for the theme class a real application applies at its root.
*
* The theme stylesheet bakes no default (operator ruling 2026-08-28, "Theme delivery"):
* importing a theme file makes its class AVAILABLE, and the class still has to be applied —
* the same two steps Griffel asks for with `import { webLightTheme }` +
* `<FluentProvider theme={webLightTheme}>`. Web light is the storybook's document theme, so
* this is where it gets set. A story that wants another theme wraps its subtree in a
* FluentProvider with that theme's class, which overrides this one locally.
*
* On `documentElement`, and `add` rather than assignment, so it composes with anything else
* that classes the root and reaches shadow-DOM-free subtrees the same way `:root` did before
* the split. The class name is imported rather than written out so it stays in lockstep with
* the generated stylesheet.
*/
document.documentElement.classList.add(webLightThemeClassName);

/** @typedef {import('../packages/react-components/react-storybook-addon-export-to-sandbox/src/index').Parameters & import('@storybook/react').Parameters} Parameters */

/** @type {import('@storybook/react').Decorator[]} */
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "fix: format through @prettier/sync and declare it as a dependency, so the preset works under prettier 3",
"packageName": "@fluentui/babel-preset-storybook-full-source",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "fix: use DistributiveOmit in BreadcrumbButtonBaseProps so the anchor variant of the root slot survives, restoring href",
"packageName": "@fluentui/react-breadcrumb",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: use nullish coalescing in adjustChannel so a channel whose value is 0 no longer falls through to the hue action",
"packageName": "@fluentui/react-color-picker",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "feat: publish the Button, Link and Avatar contexts so a styling layer can read the look values the render functions already provide",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: apply state.arrowClassName to the Tooltip arrow element, which renderTooltip was dropping",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: let a consumer popover prop win on PopoverSurface by moving the default into the surface slot defaultProps, so more than one Popover can be open per page",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: merge the popover attribute default before the base state in useMenuPopover and useListbox so a consumer value is no longer overwritten",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: give MenuSplitGroup a stable contexts value so useIsInMenuSplitGroup resolves true for descendant halves",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: reserve the scrollbar gutter on documentElement when Dialog locks scroll, so opening a modal on a scrolling page no longer shifts fixed and centred content",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "feat: publish the AvatarGroup context reader and provider from the ./avatar-group subpath",
"packageName": "@fluentui/react-headless-components-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: match both path separators when detecting the addon registration so the addon options are not silently dropped on Windows",
"packageName": "@fluentui/react-storybook-addon-export-to-sandbox",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "fix: cancel the pending TagPickerControl resize frame in the effect cleanup instead of the effect body, which raced away the aside-width custom property",
"packageName": "@fluentui/react-tag-picker",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "feat: add react-tailwind-theme-preview, the Fluent design tokens and themes as a Tailwind v4 CSS layer",
"packageName": "@fluentui/react-tailwind-theme-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "feat: release preview package",
"packageName": "@fluentui/react-windmod-preview",
"email": "array.knight@gmail.com",
"dependentChangeType": "patch"
}
28 changes: 27 additions & 1 deletion jest.preset.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,27 @@ const reactDepsPaths = {
'^react-test-renderer$': path.join(__dirname, 'node_modules/react-test-renderer'),
};

/**
* CSS Modules support (react-windmod-preview / react-tailwind-theme-preview).
*
* Jest resolves `@fluentui/*` to SOURCE via the tsconfig path aliases above, so any suite
* that renders a windmod component evaluates `import styles from './X.module.css'`.
* Without a mapper those suites fail to *run*, so the mapper is repo-wide rather than
* per-package (it only matches `*.module.css`, which no Griffel package imports).
*
* Resolved by path (not via `require('@fluentui/scripts-jest')`) to keep this file free
* of workspace requires: scripts/jest pulls in @fluentui/scripts-monorepo, which walks
* the repo on load.
*
* Caveat: Jest MERGES `moduleNameMapper` from a preset, but a project-level
* `snapshotSerializers` REPLACES the preset's array — packages that declare their own
* serializers AND consume windmod classes must list the css-modules serializer themselves.
*/
const cssModulesJest = {
moduleNameMapperTarget: require.resolve('./scripts/jest/src/css-modules/proxy.js'),
snapshotSerializer: require.resolve('./scripts/jest/src/css-modules/serializer.js'),
};

/**
* @type {import('@jest/types').Config.InitialOptions}
*/
Expand All @@ -37,7 +58,12 @@ const baseConfig = {
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
testPathIgnorePatterns: ['/node_modules/', '/lib/', '/lib-commonjs/', '/dist/'],
testEnvironment: 'jsdom',
moduleNameMapper: { ...tsPathAliases, ...reactDepsPaths },
moduleNameMapper: {
...tsPathAliases,
...reactDepsPaths,
'\\.module\\.css$': cssModulesJest.moduleNameMapperTarget,
},
snapshotSerializers: [cssModulesJest.snapshotSerializer],
cacheDirectory: '<rootDir>/node_modules/.cache/jest',
clearMocks: true,
watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'],
Expand Down
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
"@oddbird/css-anchor-positioning": "0.4.0",
"@phenomnomnominal/tsquery": "6.1.3",
"@playwright/test": "1.56.1",
"@prettier/sync": "0.6.1",
"@react-native/babel-preset": "0.73.21",
"@rnx-kit/eslint-plugin": "0.8.6",
"@rollup/plugin-node-resolve": "13.3.0",
Expand All @@ -107,6 +108,7 @@
"@swc/core": "1.11.24",
"@swc/helpers": "0.5.1",
"@swc/jest": "0.2.38",
"@tailwindcss/postcss": "^4.3.2",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "16.3.0",
Expand Down Expand Up @@ -144,7 +146,6 @@
"@types/markdown-table": "2.0.0",
"@types/micromatch": "4.0.2",
"@types/node": "^22.0.0",
"@types/prettier": "2.7.2",
"@types/progress": "2.0.5",
"@types/react": "19.2.2",
"@types/react-dom": "19.2.2",
Expand Down Expand Up @@ -182,6 +183,7 @@
"circular-dependency-plugin": "5.2.2",
"clean-css": "4.2.3",
"clean-webpack-plugin": "4.0.0",
"clsx": "2.1.1",
"connect-history-api-fallback": "1.6.0",
"copy-webpack-plugin": "12.0.2",
"cross-env": "^5.1.4",
Expand Down Expand Up @@ -267,7 +269,8 @@
"postcss": "8.5.18",
"postcss-loader": "4.1.0",
"postcss-modules": "4.1.3",
"prettier": "2.8.8",
"prettier": "3.9.6",
"prettier-plugin-tailwindcss": "0.8.1",
"progress": "2.0.3",
"puppeteer": "24.42.0",
"raw-loader": "4.0.2",
Expand Down Expand Up @@ -304,6 +307,7 @@
"swc-loader": "0.2.6",
"swc-plugin-de-indent-template-literal": "1.5.0",
"syncpack": "10.6.1",
"tailwindcss": "^4.3.2",
"terser": "5.39.1",
"terser-webpack-plugin": "5.3.10",
"through2": "4.0.2",
Expand Down Expand Up @@ -360,6 +364,7 @@
}
},
"resolutions": {
"@fluentui/react-icons": "file:../fluentui-system-icons/packages/react-icons/fluentui-react-icons-local.tgz",
"@nx/devkit/minimatch": "^9.0.7",
"@nx/jest/minimatch": "^9.0.7",
"@phenomnomnominal/tsquery": "6.1.3",
Expand All @@ -377,7 +382,6 @@
"micromatch/braces": "^3.0.3",
"nx/minimatch": "^9.0.7",
"playwright": "1.56.1",
"prettier": "2.8.8",
"prismjs": "1.30.0",
"puppeteer": "24.42.0",
"shell-quote": "^1.8.2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@
"license": "MIT",
"dependencies": {
"@babel/core": "^7.10.4",
"@prettier/sync": "^0.6.1",
"@swc/helpers": "^0.5.1",
"pkg-up": "^3.1.0",
"prettier": "^2.8.8"
"prettier": "^3.0.0"
},
"exports": {
".": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import * as Babel from '@babel/core';
import * as prettier from 'prettier';
// Babel visitors are synchronous, but prettier 3's `format` is async — use the official
// synchronous wrapper (runs prettier in a worker thread under the hood).
import * as prettier from '@prettier/sync';
import * as fs from 'fs';
import * as nodePath from 'path';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,13 @@ export function modifyImportsPlugin(babel: typeof Babel, options: BabelPluginOpt
parserOptions.plugins.push('typescript');
},
pre() {
this.imports = Object.keys(importMappings).reduce((acc, cur) => {
acc[importMappings[cur].replace] = [];
return acc;
}, {} as PluginState['imports']);
this.imports = Object.keys(importMappings).reduce(
(acc, cur) => {
acc[importMappings[cur].replace] = [];
return acc;
},
{} as PluginState['imports'],
);
},
visitor: {
Program: {
Expand Down
Loading