@expressivecss/mcp-server 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3109 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "frameworkVersion": "0.10.1",
4
+ "sourceRevision": "b3821bb0390b985c31a858ab7f4e3dbf0de2d71c",
5
+ "basis": "Reviewed checkout snapshot, not proof of published package contents or target-browser conformance. Implemented means only the named scope. Full Material parity remains unassessed.",
6
+ "browserRun": {
7
+ "recordedOn": "2026-09-18",
8
+ "engine": "chromium",
9
+ "engineVersion": "153.0.8010.12",
10
+ "nodeVersion": "v22.23.1",
11
+ "status": "passed",
12
+ "inputsCurrent": false,
13
+ "reportSha256": "5777e67403861540605d77c5a5055086a49e8fe086297abd8a4bb6cf399c1666",
14
+ "collector": "scripts/record-capability-evidence.mjs"
15
+ },
16
+ "entries": [
17
+ {
18
+ "slug": "app-bar",
19
+ "title": "App bar",
20
+ "kind": "component",
21
+ "support": "unassessed",
22
+ "lastReviewedSupport": "implemented",
23
+ "sourceReview": "needs-review",
24
+ "reviewedOn": "2026-09-17",
25
+ "scope": "Small, medium flexible, large flexible, and search app bars.",
26
+ "adaptation": "Native header/nav composition; AppBar owns scroll collapse and search expansion.",
27
+ "upstream": {
28
+ "source": "https://m3.material.io/components/app-bars/overview",
29
+ "reviewedOn": "2026-09-13",
30
+ "scope": "requirements-prose-reviewed",
31
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
32
+ "sections": [
33
+ "Overview",
34
+ "Specs",
35
+ "Guidelines",
36
+ "Accessibility",
37
+ "Overview/M3 Expressive update: replacement guidance"
38
+ ],
39
+ "sources": [
40
+ "https://m3.material.io/components/app-bars/overview",
41
+ "https://m3.material.io/components/app-bars/specs",
42
+ "https://m3.material.io/components/app-bars/guidelines",
43
+ "https://m3.material.io/components/app-bars/accessibility"
44
+ ],
45
+ "requirements": "Choose small, flexible medium/large or search app bars for the title and screen actions. Preserve meaningful headings, named actions and reachable controls through scrolling and collapse."
46
+ },
47
+ "relationship": "component",
48
+ "sources": [
49
+ {
50
+ "path": "src/sass/components/_navbar.scss",
51
+ "sha256": "2d3a2accd4d0dfeb524f628f9eb2be81bad5a50ab7feea40c0c0ddd58016da96"
52
+ },
53
+ {
54
+ "path": "src/ts/components/appBar.ts",
55
+ "sha256": "91ddc61000a36923995b3633743dd83452d43671c40ae923318dedfeff38893e"
56
+ }
57
+ ],
58
+ "gaps": [
59
+ {
60
+ "kind": "verification",
61
+ "description": "Native zoom, screen-reader announcements, contrast themes and physical mobile keyboard behavior remain pending manual review.",
62
+ "nextStep": "Run the App bar/search fixture in the accessibility manual-review checklist with the actual devices and assistive technology."
63
+ }
64
+ ],
65
+ "browserChecks": [
66
+ {
67
+ "file": "tests/menu-field-browser.test.js",
68
+ "name": "AppBar native search dismissal and reopening (chromium)",
69
+ "scope": "Native Escape, canceled Escape, close-button, form and programmatic dismissal; focus-before-close ordering, fresh focus and pointer reopening, retained query, nested/referenced views and both motion preferences. Equivalent Firefox and WebKit cases run in the same suite.",
70
+ "state": "stale"
71
+ },
72
+ {
73
+ "file": "tests/menu-field-browser.test.js",
74
+ "name": "AppBar focus ownership and teardown (chromium)",
75
+ "scope": "Application close-handler focus, disabled fields, two app bars, non-dialog views, observer/listener teardown and remount without duplicate opening.",
76
+ "state": "stale"
77
+ },
78
+ {
79
+ "file": "tests/menu-field-browser.test.js",
80
+ "name": "AppBar collapsed actions remain reachable (chromium)",
81
+ "scope": "Medium/large sticky headers at 320px with translated enlarged headings, keyboard focus through real scroll collapse, LTR/RTL, both motion preferences and reachable unobscured actions. Not native zoom.",
82
+ "state": "stale"
83
+ }
84
+ ],
85
+ "browserEvidence": "needs-rerun",
86
+ "recheckWhen": [
87
+ "A reviewed source changes",
88
+ "A mapped test or its recorded inputs change",
89
+ "Google revises the linked guidance or before claiming a new release matches it"
90
+ ]
91
+ },
92
+ {
93
+ "slug": "navigation-bar",
94
+ "title": "Navigation bar",
95
+ "kind": "component",
96
+ "support": "unassessed",
97
+ "lastReviewedSupport": "implemented",
98
+ "sourceReview": "needs-review",
99
+ "reviewedOn": "2026-09-12",
100
+ "scope": "Stacked and horizontal destination layouts.",
101
+ "adaptation": "Links navigate; the application marks the current destination.",
102
+ "upstream": {
103
+ "source": "https://m3.material.io/components/navigation-bar/overview",
104
+ "reviewedOn": "2026-09-13",
105
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
106
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings.",
107
+ "sections": [
108
+ "Overview/M3 Expressive update: replacement guidance"
109
+ ],
110
+ "sources": [
111
+ "https://m3.material.io/components/navigation-bar/overview"
112
+ ]
113
+ },
114
+ "relationship": "component",
115
+ "sources": [
116
+ {
117
+ "path": "src/sass/components/_navigation-bar.scss",
118
+ "sha256": "e42c5c395c9f2cdc1dc9c8c4cfdff1a06cb12183cae1d17bcea915536f0aa9c2"
119
+ }
120
+ ],
121
+ "gaps": [],
122
+ "browserChecks": [],
123
+ "browserEvidence": "no-mapped-checks",
124
+ "recheckWhen": [
125
+ "A reviewed source changes",
126
+ "A mapped test or its recorded inputs change",
127
+ "Google revises the linked guidance or before claiming a new release matches it"
128
+ ]
129
+ },
130
+ {
131
+ "slug": "navigation-rail",
132
+ "title": "Navigation rail",
133
+ "kind": "component",
134
+ "support": "unassessed",
135
+ "lastReviewedSupport": "implemented",
136
+ "sourceReview": "needs-review",
137
+ "reviewedOn": "2026-09-12",
138
+ "scope": "Collapsed, expanded, and modal rails.",
139
+ "adaptation": "The compact expanded rail uses a scrim and dismissal behavior.",
140
+ "upstream": {
141
+ "source": "https://m3.material.io/components/navigation-rail/overview",
142
+ "reviewedOn": "2026-09-13",
143
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
144
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings.",
145
+ "sections": [
146
+ "Overview/M3 Expressive update: replacement guidance"
147
+ ],
148
+ "sources": [
149
+ "https://m3.material.io/components/navigation-rail/overview"
150
+ ]
151
+ },
152
+ "relationship": "component",
153
+ "sources": [
154
+ {
155
+ "path": "src/sass/components/_navigation-rail.scss",
156
+ "sha256": "7dcc854d90a48a541ae9ed2380d28063e8217e567f697e27a21fe1ab84e055bb"
157
+ },
158
+ {
159
+ "path": "src/ts/components/navigationRail.ts",
160
+ "sha256": "f7b4e682a87ea664dc8b8927ea86a784fd61ab1d538a9996f97d5c2e95db4406"
161
+ }
162
+ ],
163
+ "gaps": [],
164
+ "browserChecks": [
165
+ {
166
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
167
+ "name": "partial replacement and client navigation preserve shell ownership across repeated mounts",
168
+ "scope": "Rail shell ownership; enhanced select interaction; generated Menu registry/resource cleanup; tooltip ownership across route replacement.",
169
+ "state": "stale"
170
+ }
171
+ ],
172
+ "browserEvidence": "needs-rerun",
173
+ "recheckWhen": [
174
+ "A reviewed source changes",
175
+ "A mapped test or its recorded inputs change",
176
+ "Google revises the linked guidance or before claiming a new release matches it"
177
+ ]
178
+ },
179
+ {
180
+ "slug": "panes",
181
+ "title": "Panes",
182
+ "kind": "component",
183
+ "support": "unassessed",
184
+ "lastReviewedSupport": "implemented",
185
+ "sourceReview": "needs-review",
186
+ "reviewedOn": "2026-09-17",
187
+ "scope": "List-detail, supporting pane, and equal panes.",
188
+ "adaptation": "CSS viewport and container queries; the application chooses the active compact pane.",
189
+ "upstream": {
190
+ "source": "https://m3.material.io/foundations/layout/canonical-examples/overview",
191
+ "reviewedOn": "2026-09-13",
192
+ "scope": "requirements-prose-reviewed",
193
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
194
+ "sections": [
195
+ "Canonical examples/List-detail and Supporting pane/Across breakpoints"
196
+ ],
197
+ "sources": [
198
+ "https://m3.material.io/foundations/layout/canonical-examples/overview",
199
+ "https://m3.material.io/foundations/layout/canonical-examples/list-detail",
200
+ "https://m3.material.io/foundations/layout/canonical-examples/supporting-pane"
201
+ ],
202
+ "requirements": "List-detail uses one pane on compact windows, usually one on medium and two on expanded windows. Supporting content stacks below primary content on compact and medium windows, then sits alongside it on expanded windows. Preserve selection and scroll state."
203
+ },
204
+ "relationship": "pattern",
205
+ "sources": [
206
+ {
207
+ "path": "src/sass/components/_panes.scss",
208
+ "sha256": "107d45899b9a41448563215bf670c5f96f25cb9153b8ff173941d5f12b90839b"
209
+ }
210
+ ],
211
+ "gaps": [
212
+ {
213
+ "kind": "integration",
214
+ "description": "Compact supporting layouts retain one-active-pane selection rather than automatic stacking. Native zoom, assistive technology and physical-device review remain pending.",
215
+ "nextStep": "Keep selection application-owned and complete the Panes manual-review fixture before making accessibility-parity claims."
216
+ }
217
+ ],
218
+ "browserChecks": [
219
+ {
220
+ "file": "tests/expressivecss-examples-browser.test.js",
221
+ "name": "complete list-detail example preserves both treatments and its task path",
222
+ "scope": "Example-only compact/detail switching, focus return, read state, breakpoint resizing and themed treatments.",
223
+ "state": "stale"
224
+ },
225
+ {
226
+ "file": "tests/menu-field-browser.test.js",
227
+ "name": "Panes use the nearest available width at layout boundaries (chromium)",
228
+ "scope": "Independent viewport/container widths, both sides and exact 840px/1200px boundaries, nearest-container precedence, viewport fallback, pane aliases, start/left supporting columns, equal/three-pane, separated/floating and RTL. Equivalent Firefox and WebKit cases run in the same suite.",
229
+ "state": "stale"
230
+ },
231
+ {
232
+ "file": "tests/menu-field-browser.test.js",
233
+ "name": "Panes preserve footer icon-button geometry (chromium)",
234
+ "scope": "All five icon-button sizes retain their height, width and block padding for native buttons and anchors across footer aliases. Equivalent Firefox and WebKit cases run in the same suite.",
235
+ "state": "stale"
236
+ },
237
+ {
238
+ "file": "tests/menu-field-browser.test.js",
239
+ "name": "Panes preserve compact selection and independent scrolling (chromium)",
240
+ "scope": "Active selection and first-pane fallback through resizing, independent body scrolling, DOM order, translated footer actions at enlarged root text size, both directions and motion preferences. Not native zoom or screen-reader verification.",
241
+ "state": "stale"
242
+ }
243
+ ],
244
+ "browserEvidence": "needs-rerun",
245
+ "recheckWhen": [
246
+ "A reviewed source changes",
247
+ "A mapped test or its recorded inputs change",
248
+ "Google revises the linked guidance or before claiming a new release matches it"
249
+ ]
250
+ },
251
+ {
252
+ "slug": "footer",
253
+ "title": "Footer",
254
+ "kind": "component",
255
+ "support": "unassessed",
256
+ "lastReviewedSupport": "implemented",
257
+ "sourceReview": "needs-review",
258
+ "reviewedOn": "2026-09-13",
259
+ "scope": "Native footer with navigation columns and copyright content.",
260
+ "adaptation": "Web page landmark styled with theme roles.",
261
+ "upstream": {
262
+ "source": "https://m3.material.io/components",
263
+ "reviewedOn": "2026-09-13",
264
+ "scope": "web-extension-inventory-reviewed",
265
+ "note": "Requirements and boundaries: design reference web-extensions-review. Full visual parity and spoken output unverified.",
266
+ "sections": [
267
+ "No standalone Material component"
268
+ ],
269
+ "sources": [],
270
+ "requirements": "Use a document footer landmark where appropriate, name distinct navigation groups and preserve meaningful links, reading order and reflow."
271
+ },
272
+ "relationship": "none",
273
+ "sources": [
274
+ {
275
+ "path": "src/sass/components/_page-footer.scss",
276
+ "sha256": "71f385db254eb07874be949d5bcb0cdd0ec8835342c1d5a89ba0def76d3668ab"
277
+ }
278
+ ],
279
+ "gaps": [
280
+ {
281
+ "kind": "verification",
282
+ "description": "A document-level contentinfo landmark is checked; section-scoped footers and responsive legal links remain unverified.",
283
+ "nextStep": "Place a document footer outside main and sectioning elements; verify named legal navigation at enlarged text."
284
+ }
285
+ ],
286
+ "browserChecks": [
287
+ {
288
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
289
+ "name": "chromium: remaining web navigation, badges and list controls expose their meaning",
290
+ "scope": "Named navigation, document footer, unavailable pagination non-link, named badge count, list checkbox and scoped TOC aria-current. No spoken-output assertion.",
291
+ "state": "stale"
292
+ }
293
+ ],
294
+ "browserEvidence": "needs-rerun",
295
+ "recheckWhen": [
296
+ "A reviewed source changes",
297
+ "A mapped test or its recorded inputs change",
298
+ "Google revises the linked guidance or before claiming a new release matches it"
299
+ ]
300
+ },
301
+ {
302
+ "slug": "tabs",
303
+ "title": "Tabs",
304
+ "kind": "component",
305
+ "support": "unassessed",
306
+ "lastReviewedSupport": "implemented",
307
+ "sourceReview": "needs-review",
308
+ "reviewedOn": "2026-09-17",
309
+ "scope": "Primary and secondary tabs; stacked and horizontal icon layouts.",
310
+ "adaptation": "Links target panels; use the shipped runtime keyboard contract.",
311
+ "upstream": {
312
+ "source": "https://m3.material.io/components/tabs/overview",
313
+ "reviewedOn": "2026-09-13",
314
+ "scope": "requirements-prose-reviewed",
315
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
316
+ "sections": [
317
+ "Specs/Primary tabs and Secondary tabs",
318
+ "Guidelines/Choosing the tab variant",
319
+ "Accessibility/Keyboard navigation"
320
+ ],
321
+ "sources": [
322
+ "https://m3.material.io/components/tabs/overview",
323
+ "https://m3.material.io/components/tabs/specs",
324
+ "https://m3.material.io/components/tabs/guidelines",
325
+ "https://m3.material.io/components/tabs/accessibility"
326
+ ],
327
+ "requirements": "Use primary or secondary tabs for related content, with consistent labels and icons, selected state and reachable overflow. Google describes arrow navigation; native anchor navigation is a distinct web adaptation."
328
+ },
329
+ "relationship": "component",
330
+ "sources": [
331
+ {
332
+ "path": "src/sass/components/_tabs.scss",
333
+ "sha256": "136d7b15bffd791fdaef451f98fad945bd478a25163528aac572b1f94903d9f6"
334
+ },
335
+ {
336
+ "path": "src/ts/components/tabs.ts",
337
+ "sha256": "72657d5e40d49a8d84357753eb81d488a8756827f83bb5102b9f6269854516cf"
338
+ }
339
+ ],
340
+ "gaps": [
341
+ {
342
+ "kind": "integration",
343
+ "description": "Native links use Tab and aria-current; runtime does not implement composite tab arrow keys.",
344
+ "nextStep": "Retain native anchor semantics. Rendered selection, overflow geometry and teardown are covered; verify spoken current-state output and physical touch manually."
345
+ }
346
+ ],
347
+ "browserChecks": [
348
+ {
349
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
350
+ "name": "chromium: remaining suggestions and section links preserve selection and dismissal",
351
+ "scope": "Native section links, retained search query and single-select suggestions, Arrow/Enter/Escape/Tab; no spoken-result assertion.",
352
+ "state": "stale"
353
+ },
354
+ {
355
+ "file": "tests/menu-field-browser.test.js",
356
+ "name": "Tabs synchronize swipe selection and callbacks (chromium)",
357
+ "scope": "LTR/RTL and ordinary/reduced motion selection state and single callbacks.",
358
+ "state": "stale"
359
+ },
360
+ {
361
+ "file": "tests/menu-field-browser.test.js",
362
+ "name": "Tabs restore panels on teardown and remount (chromium)",
363
+ "scope": "Panel order, owned styles and semantics, wrapper cleanup and remount.",
364
+ "state": "stale"
365
+ },
366
+ {
367
+ "file": "tests/menu-field-browser.test.js",
368
+ "name": "Tabs threshold keeps native links and ordinary panels (chromium)",
369
+ "scope": "Above-threshold ordinary panels, native Tab/Enter, disabled and external-target links.",
370
+ "state": "stale"
371
+ },
372
+ {
373
+ "file": "tests/menu-field-browser.test.js",
374
+ "name": "Tabs hash selection, native dragging and overflow geometry (chromium)",
375
+ "scope": "Initial hash overrides stale authored panel state without initialization callbacks and restores it on teardown; actual pointer dragging, RTL overflow indicator geometry and initialization-only threshold; no physical touch or native zoom claim.",
376
+ "state": "stale"
377
+ }
378
+ ],
379
+ "browserEvidence": "needs-rerun",
380
+ "recheckWhen": [
381
+ "A reviewed source changes",
382
+ "A mapped test or its recorded inputs change",
383
+ "Google revises the linked guidance or before claiming a new release matches it"
384
+ ]
385
+ },
386
+ {
387
+ "slug": "breadcrumbs",
388
+ "title": "Breadcrumbs",
389
+ "kind": "component",
390
+ "support": "unassessed",
391
+ "lastReviewedSupport": "implemented",
392
+ "sourceReview": "needs-review",
393
+ "reviewedOn": "2026-09-13",
394
+ "scope": "Breadcrumb links and app-bar composition.",
395
+ "adaptation": "Labelled navigation with an ordered list and current-page link.",
396
+ "upstream": {
397
+ "source": "https://m3.material.io/components",
398
+ "reviewedOn": "2026-09-13",
399
+ "scope": "web-extension-inventory-reviewed",
400
+ "note": "Requirements and boundaries: design reference web-extensions-review. Full visual parity and spoken output unverified.",
401
+ "sections": [
402
+ "No standalone Material component"
403
+ ],
404
+ "sources": [],
405
+ "requirements": "Use named hierarchy navigation with real ancestor links and a current-page state. It communicates location, not peer categories."
406
+ },
407
+ "relationship": "none",
408
+ "sources": [
409
+ {
410
+ "path": "src/sass/components/_breadcrumb.scss",
411
+ "sha256": "9961900fec76177ae0078a8f68a74fc36155fe97f86d2351c1b527c808642c9e"
412
+ }
413
+ ],
414
+ "gaps": [
415
+ {
416
+ "kind": "verification",
417
+ "description": "Named navigation and current-page markup are checked; CSS separator speech and long-path reflow remain unverified.",
418
+ "nextStep": "Inspect assistive-technology output for separators and test translated paths without truncating essential context."
419
+ }
420
+ ],
421
+ "browserChecks": [
422
+ {
423
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
424
+ "name": "chromium: remaining web navigation, badges and list controls expose their meaning",
425
+ "scope": "Named navigation, document footer, unavailable pagination non-link, named badge count, list checkbox and scoped TOC aria-current. No spoken-output assertion.",
426
+ "state": "stale"
427
+ }
428
+ ],
429
+ "browserEvidence": "needs-rerun",
430
+ "recheckWhen": [
431
+ "A reviewed source changes",
432
+ "A mapped test or its recorded inputs change",
433
+ "Google revises the linked guidance or before claiming a new release matches it"
434
+ ]
435
+ },
436
+ {
437
+ "slug": "pagination",
438
+ "title": "Pagination",
439
+ "kind": "component",
440
+ "support": "unassessed",
441
+ "lastReviewedSupport": "implemented",
442
+ "sourceReview": "needs-review",
443
+ "reviewedOn": "2026-09-13",
444
+ "scope": "Page links, active page, and unavailable previous/next items.",
445
+ "adaptation": "CSS-only navigation; the application supplies destinations.",
446
+ "upstream": {
447
+ "source": "https://m3.material.io/components",
448
+ "reviewedOn": "2026-09-13",
449
+ "scope": "web-extension-inventory-reviewed",
450
+ "note": "Requirements and boundaries: design reference web-extensions-review. Full visual parity and spoken output unverified.",
451
+ "sections": [
452
+ "No standalone Material component"
453
+ ],
454
+ "sources": [],
455
+ "requirements": "Name result-page navigation and previous/next actions. Expose the current page and make unavailable actions genuinely unavailable to keyboard users."
456
+ },
457
+ "relationship": "none",
458
+ "sources": [
459
+ {
460
+ "path": "src/sass/components/_pagination.scss",
461
+ "sha256": "7637a970c2ae783f4f5803d82f4373409de9160d1f635327fd855574312704c3"
462
+ }
463
+ ],
464
+ "gaps": [
465
+ {
466
+ "kind": "integration",
467
+ "description": "aria-disabled and pointer-events alone cannot disable a link for keyboard users.",
468
+ "nextStep": "Use a non-link unavailable control, verify actual page destinations and preserve current-page state after updates."
469
+ }
470
+ ],
471
+ "browserChecks": [
472
+ {
473
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
474
+ "name": "chromium: remaining web navigation, badges and list controls expose their meaning",
475
+ "scope": "Named navigation, document footer, unavailable pagination non-link, named badge count, list checkbox and scoped TOC aria-current. No spoken-output assertion.",
476
+ "state": "stale"
477
+ }
478
+ ],
479
+ "browserEvidence": "needs-rerun",
480
+ "recheckWhen": [
481
+ "A reviewed source changes",
482
+ "A mapped test or its recorded inputs change",
483
+ "Google revises the linked guidance or before claiming a new release matches it"
484
+ ]
485
+ },
486
+ {
487
+ "slug": "menu",
488
+ "title": "Menu",
489
+ "kind": "component",
490
+ "support": "unassessed",
491
+ "lastReviewedSupport": "implemented",
492
+ "sourceReview": "needs-review",
493
+ "reviewedOn": "2026-09-13",
494
+ "scope": "Vertical menus, nested flyouts, grouping, and standard/vibrant styles.",
495
+ "adaptation": "Native menu/li structure; Menu owns opening and keyboard behavior.",
496
+ "upstream": {
497
+ "source": "https://m3.material.io/components/menus/overview",
498
+ "reviewedOn": "2026-09-13",
499
+ "scope": "requirements-prose-reviewed",
500
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
501
+ "sections": [
502
+ "Overview",
503
+ "Specs",
504
+ "Guidelines",
505
+ "Accessibility"
506
+ ],
507
+ "sources": [
508
+ "https://m3.material.io/components/menus/overview",
509
+ "https://m3.material.io/components/menus/specs",
510
+ "https://m3.material.io/components/menus/guidelines",
511
+ "https://m3.material.io/components/menus/accessibility"
512
+ ],
513
+ "requirements": "Choose the current standard, vibrant or grouped menu for a set of choices. Verify 48dp actionable targets, unclipped placement, first-item focus, arrows, typeahead, Escape and submenu navigation. A menu item should not contain multiple independent controls."
514
+ },
515
+ "relationship": "component",
516
+ "sources": [
517
+ {
518
+ "path": "src/sass/components/_menu.scss",
519
+ "sha256": "8ad4eab498fa24199203070cf2b5792f6d61aa52e18b75770549ffcc7e0c64dc"
520
+ },
521
+ {
522
+ "path": "src/ts/components/menu.ts",
523
+ "sha256": "dffb2df2cbd79a4b1fdfb354c62509952070059eb35418aec9cb296680f6a241"
524
+ }
525
+ ],
526
+ "gaps": [
527
+ {
528
+ "kind": "verification",
529
+ "description": "Closing focus exclusion, scoped nested keys, RTL flyout placement and representative item targets have browser checks. Spoken output and full visual parity remain unverified.",
530
+ "nextStep": "Review spoken nested-menu context, translated labels and visual parity in the target application."
531
+ }
532
+ ],
533
+ "browserChecks": [
534
+ {
535
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
536
+ "name": "partial replacement and client navigation preserve shell ownership across repeated mounts",
537
+ "scope": "Rail shell ownership; enhanced select interaction; generated Menu registry/resource cleanup; tooltip ownership across route replacement.",
538
+ "state": "stale"
539
+ },
540
+ {
541
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
542
+ "name": "resource observations detect omitted teardown after a partial replacement",
543
+ "scope": "Negative control proves resources remain without destroy; no visual parity assertion.",
544
+ "state": "stale"
545
+ },
546
+ {
547
+ "file": "tests/menu-field-browser.test.js",
548
+ "name": "Menu cancels superseded callbacks and teardown work (chromium)",
549
+ "scope": "Open/close reversal and destruction during opening/closing preserve visibility, focus and completion callback ownership. Equivalent Firefox and WebKit cases run in the same file.",
550
+ "state": "stale"
551
+ },
552
+ {
553
+ "file": "tests/menu-field-browser.test.js",
554
+ "name": "Menu excludes closing content and preserves callback focus (chromium)",
555
+ "scope": "Tab exclusion during nonzero closing transitions, callback-directed focus, reopening, autoFocus false, and authored inert restoration. Ordinary and reduced motion; equivalent Firefox and WebKit cases run in the same file.",
556
+ "state": "stale"
557
+ },
558
+ {
559
+ "file": "tests/menu-field-browser.test.js",
560
+ "name": "Menu scopes nested keys and mirrors flyouts in RTL (chromium)",
561
+ "scope": "Nested entry/return keys, innermost Escape, scoped typeahead, disabled activation, representative 44px targets, single activation, and both viewport edges in LTR/RTL. Equivalent Firefox and WebKit cases run in the same file.",
562
+ "state": "stale"
563
+ },
564
+ {
565
+ "file": "tests/menu-field-browser.test.js",
566
+ "name": "Menu consumers keep values and focus through closing (chromium)",
567
+ "scope": "Enhanced select submits the selected value and changes once; autocomplete selection retains input focus; Tab skips closing lists. Equivalent Firefox and WebKit cases run in the same file.",
568
+ "state": "stale"
569
+ }
570
+ ],
571
+ "browserEvidence": "needs-rerun",
572
+ "recheckWhen": [
573
+ "A reviewed source changes",
574
+ "A mapped test or its recorded inputs change",
575
+ "Google revises the linked guidance or before claiming a new release matches it"
576
+ ]
577
+ },
578
+ {
579
+ "slug": "scrollspy",
580
+ "title": "Scrollspy",
581
+ "kind": "component",
582
+ "support": "unassessed",
583
+ "lastReviewedSupport": "implemented",
584
+ "sourceReview": "needs-review",
585
+ "reviewedOn": "2026-09-17",
586
+ "scope": "Section tracking with per-section offsets and independent tables of contents grouped by getActiveElement callback identity.",
587
+ "adaptation": "Web document navigation helper.",
588
+ "upstream": {
589
+ "source": "https://m3.material.io/components",
590
+ "reviewedOn": "2026-09-13",
591
+ "scope": "web-extension-inventory-reviewed",
592
+ "note": "Requirements and boundaries: design reference web-extensions-review. Full visual parity and spoken output unverified.",
593
+ "sections": [
594
+ "No standalone Material component"
595
+ ],
596
+ "sources": [],
597
+ "requirements": "Use named in-page navigation, real fragment links, stable heading IDs and current-section state. Account for sticky offsets and reduced-motion preferences."
598
+ },
599
+ "relationship": "none",
600
+ "sources": [
601
+ {
602
+ "path": "src/sass/components/_scrollspy.scss",
603
+ "sha256": "39e23fb90c5b0bc2a5d34513bec7342a9a12d0a080043074f287ab8594d87c69"
604
+ },
605
+ {
606
+ "path": "src/sass/components/_table_of_contents.scss",
607
+ "sha256": "ebf956a3836c8a68d55a44f83f5abf8ecaa603e3f7435421f07e5819cd5b90c7"
608
+ },
609
+ {
610
+ "path": "src/ts/components/scrollspy.ts",
611
+ "sha256": "dd7d9babc18578824804f6c8c6b622c307712a7a93e6a40f4cbd6727f4814fd2"
612
+ }
613
+ ],
614
+ "gaps": [
615
+ {
616
+ "kind": "verification",
617
+ "description": "Offsets, independent TOCs, per-instance active classes, fallback, teardown and native anchors have rendered coverage. Spoken current-link state, native zoom, actual contrast themes and physical devices remain unverified.",
618
+ "nextStep": "Complete the ScrollSpy fixtures in the accessibility manual-review checklist with actual browsers, assistive technology and devices."
619
+ }
620
+ ],
621
+ "browserChecks": [
622
+ {
623
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
624
+ "name": "chromium: remaining web navigation, badges and list controls expose their meaning",
625
+ "scope": "Named navigation, document footer, unavailable pagination non-link, named badge count, list checkbox and scoped TOC aria-current. No spoken-output assertion.",
626
+ "state": "stale"
627
+ },
628
+ {
629
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
630
+ "name": "chromium: ScrollSpy isolation: offsets",
631
+ "scope": "Per-section observer offsets and removal of the previous section's active class.",
632
+ "state": "not-recorded"
633
+ },
634
+ {
635
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
636
+ "name": "chromium: ScrollSpy isolation: groups",
637
+ "scope": "Independent callback groups retain separate current links and fallback state during scrolling and destruction.",
638
+ "state": "not-recorded"
639
+ },
640
+ {
641
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
642
+ "name": "chromium: ScrollSpy isolation: teardown",
643
+ "scope": "Repeated destruction and remount restore authored offset value and priority and update surviving current links.",
644
+ "state": "not-recorded"
645
+ },
646
+ {
647
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
648
+ "name": "chromium: ScrollSpy isolation: anchors",
649
+ "scope": "Native keyboard fragment navigation and actual scrolling in LTR/RTL with ordinary and reduced motion.",
650
+ "state": "not-recorded"
651
+ }
652
+ ],
653
+ "browserEvidence": "needs-rerun",
654
+ "recheckWhen": [
655
+ "A reviewed source changes",
656
+ "A mapped test or its recorded inputs change",
657
+ "Google revises the linked guidance or before claiming a new release matches it"
658
+ ]
659
+ },
660
+ {
661
+ "slug": "buttons",
662
+ "title": "Buttons",
663
+ "kind": "component",
664
+ "support": "unassessed",
665
+ "lastReviewedSupport": "partial",
666
+ "sourceReview": "needs-review",
667
+ "reviewedOn": "2026-09-12",
668
+ "scope": "Filled, tonal, outlined, elevated, and text; xsmall through xlarge.",
669
+ "adaptation": "Native buttons run commands; a.button links navigate.",
670
+ "upstream": {
671
+ "source": "https://m3.material.io/components/buttons/overview",
672
+ "reviewedOn": "2026-09-13",
673
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
674
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings.",
675
+ "sections": [
676
+ "Overview/M3 Expressive update: replacement guidance"
677
+ ],
678
+ "sources": [
679
+ "https://m3.material.io/components/buttons/overview"
680
+ ]
681
+ },
682
+ "relationship": "component",
683
+ "sources": [
684
+ {
685
+ "path": "src/sass/components/_buttons.scss",
686
+ "sha256": "cc0b3dd320002682c9b2cbe9e2192dd0af124047fd7ced7811456fecfc9b689a"
687
+ },
688
+ {
689
+ "path": "src/sass/abstracts/_mixins.scss",
690
+ "sha256": "734b13a6a1775f1f293e49c16f50697cb9f3e6b0fc20c23bd2f950a87f7dede7"
691
+ },
692
+ {
693
+ "path": "src/sass/abstracts/_variables.scss",
694
+ "sha256": "e8a5dfd7355cefde5a87775455cb95ac41c735f0d407a7b23ef94b2ec1ed8fd8"
695
+ }
696
+ ],
697
+ "gaps": [
698
+ {
699
+ "kind": "feature",
700
+ "description": "Standalone common buttons do not document a square/toggle shape-morph contract; do not borrow icon-button or connected-group modifiers.",
701
+ "nextStep": "Define and test a standalone shape-morph contract without borrowing connected-group or icon-button modifiers."
702
+ }
703
+ ],
704
+ "browserChecks": [
705
+ {
706
+ "file": "tests/expressivecss-examples-browser.test.js",
707
+ "name": "complete settings example preserves both treatments and its task path",
708
+ "scope": "Example-only responsive layout, targets, keyboard settings and save behavior, themed treatments; no component-wide parity.",
709
+ "state": "stale"
710
+ },
711
+ {
712
+ "file": "tests/expressivecss-examples-browser.test.js",
713
+ "name": "complete editor example preserves both treatments and its task path",
714
+ "scope": "Example-only input, group toggle, preview/focus, save and bfcache-style remount behavior, themed treatments.",
715
+ "state": "stale"
716
+ },
717
+ {
718
+ "file": "tests/expressivecss-examples-browser.test.js",
719
+ "name": "complete list-detail example preserves both treatments and its task path",
720
+ "scope": "Example-only compact/detail switching, focus return, read state, breakpoint resizing and themed treatments.",
721
+ "state": "stale"
722
+ }
723
+ ],
724
+ "browserEvidence": "needs-rerun",
725
+ "recheckWhen": [
726
+ "A reviewed source changes",
727
+ "A mapped test or its recorded inputs change",
728
+ "Google revises the linked guidance or before claiming a new release matches it"
729
+ ]
730
+ },
731
+ {
732
+ "slug": "icon-buttons",
733
+ "title": "Icon buttons",
734
+ "kind": "component",
735
+ "support": "unassessed",
736
+ "lastReviewedSupport": "implemented",
737
+ "sourceReview": "needs-review",
738
+ "reviewedOn": "2026-09-13",
739
+ "scope": "Standard, filled, tonal, outlined; five sizes; narrow, wide, and square.",
740
+ "adaptation": "Accessible name belongs to the control; the glyph is decorative.",
741
+ "upstream": {
742
+ "source": "https://m3.material.io/components/icon-buttons/overview",
743
+ "reviewedOn": "2026-09-13",
744
+ "scope": "requirements-prose-reviewed",
745
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
746
+ "sections": [
747
+ "Overview",
748
+ "Specs",
749
+ "Guidelines",
750
+ "Accessibility",
751
+ "Overview/M3 Expressive update: replacement guidance; Specs/Baseline tokens"
752
+ ],
753
+ "sources": [
754
+ "https://m3.material.io/components/icon-buttons/overview",
755
+ "https://m3.material.io/components/icon-buttons/specs",
756
+ "https://m3.material.io/components/icon-buttons/guidelines",
757
+ "https://m3.material.io/components/icon-buttons/accessibility"
758
+ ],
759
+ "requirements": "Distinguish default and toggle controls, sizes, shapes and widths. Name each action and expose toggle state. Verify 48dp effective targets even for visually smaller sizes, and sufficient icon contrast."
760
+ },
761
+ "relationship": "component",
762
+ "sources": [
763
+ {
764
+ "path": "src/sass/components/_icon-buttons.scss",
765
+ "sha256": "c77a969e392a03be07f10aa6021758d5fa7ddccd999440755c93942a9dbb38e8"
766
+ },
767
+ {
768
+ "path": "src/sass/abstracts/_mixins.scss",
769
+ "sha256": "734b13a6a1775f1f293e49c16f50697cb9f3e6b0fc20c23bd2f950a87f7dede7"
770
+ },
771
+ {
772
+ "path": "src/sass/abstracts/_variables.scss",
773
+ "sha256": "e8a5dfd7355cefde5a87775455cb95ac41c735f0d407a7b23ef94b2ec1ed8fd8"
774
+ }
775
+ ],
776
+ "gaps": [
777
+ {
778
+ "kind": "verification",
779
+ "description": "Existing group checks cover selected icon colors and press shapes, not all standalone target sizes and disabled states.",
780
+ "nextStep": "Measure XS/S effective targets and test named default/toggle controls outside groups."
781
+ }
782
+ ],
783
+ "browserChecks": [
784
+ {
785
+ "file": "tests/button-groups-browser.test.js",
786
+ "name": "button-group toggle colors resolve in a browser",
787
+ "scope": "Filled icon button selected color and glyph fill inside a button group only.",
788
+ "state": "stale"
789
+ },
790
+ {
791
+ "file": "tests/button-groups-browser.test.js",
792
+ "name": "keyboard press changes icon widths and rendered corners",
793
+ "scope": "Icon children inside button group only.",
794
+ "state": "stale"
795
+ }
796
+ ],
797
+ "browserEvidence": "needs-rerun",
798
+ "recheckWhen": [
799
+ "A reviewed source changes",
800
+ "A mapped test or its recorded inputs change",
801
+ "Google revises the linked guidance or before claiming a new release matches it"
802
+ ]
803
+ },
804
+ {
805
+ "slug": "button-groups",
806
+ "title": "Button groups",
807
+ "kind": "component",
808
+ "support": "unassessed",
809
+ "lastReviewedSupport": "implemented",
810
+ "sourceReview": "needs-review",
811
+ "reviewedOn": "2026-09-18",
812
+ "scope": "Standard and connected groups; commands and opt-in selection.",
813
+ "adaptation": "Runtime coordinates neighboring widths and selection; CSS handles connected shapes.",
814
+ "upstream": {
815
+ "source": "https://m3.material.io/components/button-groups/overview",
816
+ "reviewedOn": "2026-09-13",
817
+ "scope": "requirements-prose-reviewed",
818
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
819
+ "sections": [
820
+ "Overview",
821
+ "Specs",
822
+ "Guidelines",
823
+ "Accessibility",
824
+ "Overview/M3 Expressive update: replacement guidance"
825
+ ],
826
+ "sources": [
827
+ "https://m3.material.io/components/button-groups/overview",
828
+ "https://m3.material.io/components/button-groups/specs",
829
+ "https://m3.material.io/components/button-groups/guidelines",
830
+ "https://m3.material.io/components/button-groups/accessibility"
831
+ ],
832
+ "requirements": "Choose standard or connected groups and optional, required, single or multiple selection deliberately. Verify press growth, shapes, 48dp targets and reachable unwrapped content. Google describes Tab between buttons, with no focus on the group itself."
833
+ },
834
+ "relationship": "component",
835
+ "sources": [
836
+ {
837
+ "path": "src/sass/components/_button-groups.scss",
838
+ "sha256": "45bd7960a6da74e0baf80607334334c7253d132a20651f822a6b142c2e7fb5c8"
839
+ },
840
+ {
841
+ "path": "src/ts/components/buttonGroup.ts",
842
+ "sha256": "e628a02ce4d2f6d1d9cbd61c61191f54e4b6de98bcf05b5a19ec7cd4b2da58b8"
843
+ }
844
+ ],
845
+ "gaps": [],
846
+ "browserChecks": [
847
+ {
848
+ "file": "tests/button-groups-browser.test.js",
849
+ "name": "button-group toggle colors resolve in a browser",
850
+ "scope": "Rendered group behavior; does not establish standalone common/icon-button parity.",
851
+ "state": "stale"
852
+ },
853
+ {
854
+ "file": "tests/button-groups-browser.test.js",
855
+ "name": "button-group geometry resolves for overrides, targets, and RTL",
856
+ "scope": "Rendered group behavior; does not establish standalone common/icon-button parity.",
857
+ "state": "stale"
858
+ },
859
+ {
860
+ "file": "tests/button-groups-browser.test.js",
861
+ "name": "standard press redistribution keeps its rendered width stable",
862
+ "scope": "Rendered group behavior; does not establish standalone common/icon-button parity.",
863
+ "state": "stale"
864
+ },
865
+ {
866
+ "file": "tests/button-groups-browser.test.js",
867
+ "name": "keyboard press changes icon widths and rendered corners",
868
+ "scope": "Rendered group behavior; does not establish standalone common/icon-button parity.",
869
+ "state": "stale"
870
+ },
871
+ {
872
+ "file": "tests/expressivecss-examples-browser.test.js",
873
+ "name": "complete editor example preserves both treatments and its task path",
874
+ "scope": "Example-only input, group toggle, preview/focus, save and bfcache-style remount behavior, themed treatments.",
875
+ "state": "stale"
876
+ },
877
+ {
878
+ "file": "tests/button-groups-browser.test.js",
879
+ "name": "selection-required skips disabled controls and preserves a selection",
880
+ "scope": "Required single selection skips native, aria-disabled and class-disabled controls, blocks deselecting the last choice, moves selection, and leaves optional single selection empty when toggled off.",
881
+ "state": "stale"
882
+ },
883
+ {
884
+ "file": "tests/button-groups-browser.test.js",
885
+ "name": "connected translated labels remain reachable in a constrained scroller",
886
+ "scope": "Equal connected widths, unwrapped German labels, local horizontal scrolling, visible focus rings on both edge controls and no page overflow at a 320px viewport.",
887
+ "state": "stale"
888
+ }
889
+ ],
890
+ "browserEvidence": "needs-rerun",
891
+ "recheckWhen": [
892
+ "A reviewed source changes",
893
+ "A mapped test or its recorded inputs change",
894
+ "Google revises the linked guidance or before claiming a new release matches it"
895
+ ]
896
+ },
897
+ {
898
+ "slug": "split-button",
899
+ "title": "Split button",
900
+ "kind": "component",
901
+ "support": "unassessed",
902
+ "lastReviewedSupport": "implemented",
903
+ "sourceReview": "needs-review",
904
+ "reviewedOn": "2026-09-18",
905
+ "scope": "Leading action and trailing menu trigger with matching styles.",
906
+ "adaptation": "Reuses Menu; no separate split-button runtime.",
907
+ "upstream": {
908
+ "source": "https://m3.material.io/components/split-button/overview",
909
+ "reviewedOn": "2026-09-13",
910
+ "scope": "requirements-prose-reviewed",
911
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
912
+ "sections": [
913
+ "Overview",
914
+ "Specs",
915
+ "Guidelines",
916
+ "Accessibility"
917
+ ],
918
+ "sources": [
919
+ "https://m3.material.io/components/split-button/overview",
920
+ "https://m3.material.io/components/split-button/specs",
921
+ "https://m3.material.io/components/split-button/guidelines",
922
+ "https://m3.material.io/components/split-button/accessibility"
923
+ ],
924
+ "requirements": "Keep the leading default action distinct from the trailing additional-choices menu. Name both controls, expose the trailing expanded state, return focus after dismissal and verify separate 48dp effective targets."
925
+ },
926
+ "relationship": "component",
927
+ "sources": [
928
+ {
929
+ "path": "src/sass/components/_split-button.scss",
930
+ "sha256": "8afbc0079bfe13d514e8680086e5b2cdd50d9b0e68e5354d378809445f78eec4"
931
+ },
932
+ {
933
+ "path": "src/ts/components/menu.ts",
934
+ "sha256": "e0fb0c0f6492652fdea2c7bf4189eabad261d5506ec93a22fac508da67d89660"
935
+ }
936
+ ],
937
+ "gaps": [
938
+ {
939
+ "kind": "verification",
940
+ "description": "Pointer and keyboard activation, disabled controls, expanded state and Escape focus return have browser coverage; effective target size remains unverified.",
941
+ "nextStep": "Verify separate 48dp effective targets at the two smaller sizes."
942
+ }
943
+ ],
944
+ "browserChecks": [
945
+ {
946
+ "file": "tests/split-button.test.js",
947
+ "name": "split-button halves activate separately and Escape returns focus",
948
+ "scope": "Pointer and keyboard activation keep the leading action separate from the trailing menu, Escape returns focus, alternate actions remain distinct, and disabled halves stay inert.",
949
+ "state": "stale"
950
+ }
951
+ ],
952
+ "browserEvidence": "needs-rerun",
953
+ "recheckWhen": [
954
+ "A reviewed source changes",
955
+ "A mapped test or its recorded inputs change",
956
+ "Google revises the linked guidance or before claiming a new release matches it"
957
+ ]
958
+ },
959
+ {
960
+ "slug": "fab",
961
+ "title": "Floating action button",
962
+ "kind": "component",
963
+ "support": "unassessed",
964
+ "lastReviewedSupport": "partial",
965
+ "sourceReview": "needs-review",
966
+ "reviewedOn": "2026-09-13",
967
+ "scope": "FAB sizes, extended FABs, and menus of related actions.",
968
+ "adaptation": "Floating action behavior uses the documented FAB runtime.",
969
+ "upstream": {
970
+ "source": "https://m3.material.io/components/floating-action-button/overview",
971
+ "reviewedOn": "2026-09-13",
972
+ "scope": "requirements-prose-reviewed",
973
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
974
+ "sections": [
975
+ "Overview",
976
+ "Specs",
977
+ "Guidelines",
978
+ "Accessibility",
979
+ "Overview/M3 Expressive update: replacement guidance"
980
+ ],
981
+ "sources": [
982
+ "https://m3.material.io/components/floating-action-button/overview",
983
+ "https://m3.material.io/components/floating-action-button/specs",
984
+ "https://m3.material.io/components/floating-action-button/guidelines",
985
+ "https://m3.material.io/components/floating-action-button/accessibility",
986
+ "https://m3.material.io/components/extended-fab/overview",
987
+ "https://m3.material.io/components/extended-fab/specs",
988
+ "https://m3.material.io/components/extended-fab/guidelines",
989
+ "https://m3.material.io/components/extended-fab/accessibility",
990
+ "https://m3.material.io/components/fab-menu/overview",
991
+ "https://m3.material.io/components/fab-menu/specs",
992
+ "https://m3.material.io/components/fab-menu/guidelines",
993
+ "https://m3.material.io/components/fab-menu/accessibility"
994
+ ],
995
+ "requirements": "Use one primary, non-destructive action. Current guidance discourages the small FAB. Extended FABs have visible labels; FAB menus contain two to six labelled actions and must not hide focused controls."
996
+ },
997
+ "relationship": "component",
998
+ "sources": [
999
+ {
1000
+ "path": "src/sass/components/_buttons.scss",
1001
+ "sha256": "cc0b3dd320002682c9b2cbe9e2192dd0af124047fd7ced7811456fecfc9b689a"
1002
+ },
1003
+ {
1004
+ "path": "src/sass/components/_fab-menu.scss",
1005
+ "sha256": "f1d7b579ea34271824a0fdc75d209d00830a1beb352ddbbd670d31bebf5548d0"
1006
+ },
1007
+ {
1008
+ "path": "src/ts/components/buttons.ts",
1009
+ "sha256": "8f693be33245b1984742a4f51272c4f39927f4a75c735583583f530ace701940"
1010
+ }
1011
+ ],
1012
+ "gaps": [
1013
+ {
1014
+ "kind": "verification",
1015
+ "description": "Full visual parity and spoken assistive-technology output remain unverified.",
1016
+ "nextStep": "Review rendered variants and spoken labels before claiming full parity."
1017
+ }
1018
+ ],
1019
+ "browserChecks": [
1020
+ {
1021
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
1022
+ "name": "FAB menu preserves keyboard, dismissal and responsive behavior",
1023
+ "scope": "Click state, hover inactivity, Tab, Escape, action activation, outside focus, reinitialization, reduced motion and narrow layout.",
1024
+ "state": "stale"
1025
+ },
1026
+ {
1027
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
1028
+ "name": "current FAB sizes preserve geometry and explicit extended variants",
1029
+ "scope": "Chromium: button and link FAB geometry, explicit extended sizes and label roles in light/dark themes; baseline extended styling is absent.",
1030
+ "state": "stale"
1031
+ }
1032
+ ],
1033
+ "browserEvidence": "needs-rerun",
1034
+ "recheckWhen": [
1035
+ "A reviewed source changes",
1036
+ "A mapped test or its recorded inputs change",
1037
+ "Google revises the linked guidance or before claiming a new release matches it"
1038
+ ]
1039
+ },
1040
+ {
1041
+ "slug": "cards",
1042
+ "title": "Cards",
1043
+ "kind": "component",
1044
+ "support": "unassessed",
1045
+ "lastReviewedSupport": "implemented",
1046
+ "sourceReview": "needs-review",
1047
+ "reviewedOn": "2026-09-13",
1048
+ "scope": "Elevated, filled, outlined, horizontal, and directly actionable cards.",
1049
+ "adaptation": "Native article anatomy; primary-action links preserve navigation semantics.",
1050
+ "upstream": {
1051
+ "source": "https://m3.material.io/components/cards/overview",
1052
+ "reviewedOn": "2026-09-13",
1053
+ "scope": "requirements-prose-reviewed",
1054
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1055
+ "sections": [
1056
+ "Guidelines/Usage, Behavior/Expanding, Gestures",
1057
+ "Specs/Measurements",
1058
+ "Accessibility/Interaction & style, Focus, Labeling elements"
1059
+ ],
1060
+ "sources": [
1061
+ "https://m3.material.io/components/cards/overview",
1062
+ "https://m3.material.io/components/cards/specs",
1063
+ "https://m3.material.io/components/cards/guidelines",
1064
+ "https://m3.material.io/components/cards/accessibility"
1065
+ ],
1066
+ "requirements": "Group one related subject in an elevated, filled or outlined card. A whole-card primary action must not contain other actions. Avoid unnecessary containment and internal scrolling; provide alternatives to drag and swipe gestures."
1067
+ },
1068
+ "relationship": "component",
1069
+ "sources": [
1070
+ {
1071
+ "path": "src/sass/components/_cards.scss",
1072
+ "sha256": "506c13fe1a87f9397037ead0aaefdfb79f9e201523d9b39fd00b66cbd17a6bfb"
1073
+ },
1074
+ {
1075
+ "path": "src/sass/components/_expanding-card.scss",
1076
+ "sha256": "199e0dfaddb39af5acb823e8dbc7933a459b765efad19cc28d0403ebe3942f5f"
1077
+ },
1078
+ {
1079
+ "path": "src/ts/components/cards.ts",
1080
+ "sha256": "83b5bce0fcf0393cfd71a7e7bfe6ce49c9f46b65a8c93a9ddecd68f85879cd21"
1081
+ },
1082
+ {
1083
+ "path": "src/ts/components/expandingCard.ts",
1084
+ "sha256": "b776a51297bb066b41ce2c035370eac02c62fa7daa61bb1ce4cf57d2c74edff5"
1085
+ }
1086
+ ],
1087
+ "gaps": [
1088
+ {
1089
+ "kind": "verification",
1090
+ "description": "Existing card lifecycle and geometry evidence does not cover every selected variant, contrast and reflow state.",
1091
+ "nextStep": "Measure and keyboard-test the chosen variant with long content and nested controls."
1092
+ }
1093
+ ],
1094
+ "browserChecks": [
1095
+ {
1096
+ "file": "tests/cards-browser.test.js",
1097
+ "name": "dragged and picked-up states override simultaneous pointer states",
1098
+ "scope": "Specific card state, disclosure fallback, or horizontal layout contract.",
1099
+ "state": "stale"
1100
+ },
1101
+ {
1102
+ "file": "tests/cards-browser.test.js",
1103
+ "name": "invalid disclosures keep their panels visible and operable",
1104
+ "scope": "Specific card state, disclosure fallback, or horizontal layout contract.",
1105
+ "state": "stale"
1106
+ },
1107
+ {
1108
+ "file": "tests/cards-browser.test.js",
1109
+ "name": "directly actionable horizontal cards use intrinsic or fixed heights at the breakpoint",
1110
+ "scope": "Specific card state, disclosure fallback, or horizontal layout contract.",
1111
+ "state": "stale"
1112
+ },
1113
+ {
1114
+ "file": "tests/expanding-card-browser.test.js",
1115
+ "name": "expanding-card completion follows CSS and survives interruption (chromium)",
1116
+ "scope": "Chromium: zero and 1.2s container timing, reopening, cancellation, native close, removal, destruction and focus return. Equivalent Firefox and WebKit cases run separately in the browser suite.",
1117
+ "state": "stale"
1118
+ }
1119
+ ],
1120
+ "browserEvidence": "needs-rerun",
1121
+ "recheckWhen": [
1122
+ "A reviewed source changes",
1123
+ "A mapped test or its recorded inputs change",
1124
+ "Google revises the linked guidance or before claiming a new release matches it"
1125
+ ]
1126
+ },
1127
+ {
1128
+ "slug": "lists",
1129
+ "title": "Lists",
1130
+ "kind": "component",
1131
+ "support": "unassessed",
1132
+ "lastReviewedSupport": "implemented",
1133
+ "sourceReview": "needs-review",
1134
+ "reviewedOn": "2026-09-13",
1135
+ "scope": "Standard and segmented lists.",
1136
+ "adaptation": "Native list semantics; visual selection alone does not justify aria-selected.",
1137
+ "upstream": {
1138
+ "source": "https://m3.material.io/components/lists/overview",
1139
+ "reviewedOn": "2026-09-13",
1140
+ "scope": "requirements-prose-reviewed",
1141
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1142
+ "sections": [
1143
+ "Overview/M3 Expressive update",
1144
+ "Specs/Anatomy/Flexibility & slots, Measurements/Shape morphing",
1145
+ "Guidelines/Behavior/List selection modes",
1146
+ "Accessibility/Indicate selection with more than color, Focus, Platform-specific labels"
1147
+ ],
1148
+ "sources": [
1149
+ "https://m3.material.io/components/lists/overview",
1150
+ "https://m3.material.io/components/lists/specs",
1151
+ "https://m3.material.io/components/lists/guidelines",
1152
+ "https://m3.material.io/components/lists/accessibility"
1153
+ ],
1154
+ "requirements": "Choose ordinary content, actionable rows or selection explicitly. Use consistent slots and alignment, 48dp targets and a selection cue beyond color. Google describes composite arrow navigation for actionable lists and listbox/option semantics for web selection; these do not apply automatically to ordinary lists."
1155
+ },
1156
+ "relationship": "component",
1157
+ "sources": [
1158
+ {
1159
+ "path": "src/sass/components/_list.scss",
1160
+ "sha256": "dec11dbc88d047cac5ba72da9ebcef10fef598767dfdb41418a9b84bb39c9b65"
1161
+ }
1162
+ ],
1163
+ "gaps": [
1164
+ {
1165
+ "kind": "integration",
1166
+ "description": "Ordinary native lists and child controls do not implement Google composite arrow navigation.",
1167
+ "nextStep": "Retain native semantics unless a complete composite is supplied; test row control names and selection meaning."
1168
+ }
1169
+ ],
1170
+ "browserChecks": [
1171
+ {
1172
+ "file": "tests/expressivecss-examples-browser.test.js",
1173
+ "name": "complete list-detail example preserves both treatments and its task path",
1174
+ "scope": "Example-only compact/detail switching, focus return, read state, breakpoint resizing and themed treatments.",
1175
+ "state": "stale"
1176
+ },
1177
+ {
1178
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1179
+ "name": "chromium: remaining web navigation, badges and list controls expose their meaning",
1180
+ "scope": "Named navigation, document footer, unavailable pagination non-link, named badge count, list checkbox and scoped TOC aria-current. No spoken-output assertion.",
1181
+ "state": "stale"
1182
+ }
1183
+ ],
1184
+ "browserEvidence": "needs-rerun",
1185
+ "recheckWhen": [
1186
+ "A reviewed source changes",
1187
+ "A mapped test or its recorded inputs change",
1188
+ "Google revises the linked guidance or before claiming a new release matches it"
1189
+ ]
1190
+ },
1191
+ {
1192
+ "slug": "dialogs",
1193
+ "title": "Dialogs",
1194
+ "kind": "component",
1195
+ "support": "unassessed",
1196
+ "lastReviewedSupport": "implemented",
1197
+ "sourceReview": "needs-review",
1198
+ "reviewedOn": "2026-09-18",
1199
+ "scope": "Basic and full-screen dialogs.",
1200
+ "adaptation": "Native dialog.showModal()/close(); shared dialog behavior is separate from AutoInit.",
1201
+ "upstream": {
1202
+ "source": "https://m3.material.io/components/dialogs/overview",
1203
+ "reviewedOn": "2026-09-13",
1204
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
1205
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings."
1206
+ },
1207
+ "relationship": "component",
1208
+ "sources": [
1209
+ {
1210
+ "path": "src/sass/components/_dialog.scss",
1211
+ "sha256": "f4bb79a9f217ab1dfc7cd33325438d502065abec0474b6fd1c66a15d62f8ed30"
1212
+ },
1213
+ {
1214
+ "path": "src/ts/behaviors/dialogs.ts",
1215
+ "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
1216
+ }
1217
+ ],
1218
+ "gaps": [],
1219
+ "browserChecks": [],
1220
+ "browserEvidence": "no-mapped-checks",
1221
+ "recheckWhen": [
1222
+ "A reviewed source changes",
1223
+ "A mapped test or its recorded inputs change",
1224
+ "Google revises the linked guidance or before claiming a new release matches it"
1225
+ ]
1226
+ },
1227
+ {
1228
+ "slug": "bottom-sheet",
1229
+ "title": "Bottom sheet",
1230
+ "kind": "component",
1231
+ "support": "unassessed",
1232
+ "lastReviewedSupport": "implemented",
1233
+ "sourceReview": "needs-review",
1234
+ "reviewedOn": "2026-09-18",
1235
+ "scope": "Standard and modal bottom sheets.",
1236
+ "adaptation": "Native dialog.show()/showModal(); shared runtime handles dragging and dismissal.",
1237
+ "upstream": {
1238
+ "source": "https://m3.material.io/components/bottom-sheets/overview",
1239
+ "reviewedOn": "2026-09-13",
1240
+ "scope": "requirements-prose-reviewed",
1241
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
1242
+ "sections": [
1243
+ "Overview",
1244
+ "Specs",
1245
+ "Guidelines",
1246
+ "Accessibility"
1247
+ ],
1248
+ "sources": [
1249
+ "https://m3.material.io/components/bottom-sheets/overview",
1250
+ "https://m3.material.io/components/bottom-sheets/specs",
1251
+ "https://m3.material.io/components/bottom-sheets/guidelines",
1252
+ "https://m3.material.io/components/bottom-sheets/accessibility"
1253
+ ],
1254
+ "requirements": "Distinguish standard and modal sheets. Keep overflowing content scrollable, close actions reachable and height changes available without dragging. Verify the selected width and margin configuration against Google measurements."
1255
+ },
1256
+ "relationship": "component",
1257
+ "sources": [
1258
+ {
1259
+ "path": "src/sass/components/_bottom-sheet.scss",
1260
+ "sha256": "0f6edc494bfafba25fd34dbddee8d405f8d9b5e4567be6ca99bd0b19cb41f54c"
1261
+ },
1262
+ {
1263
+ "path": "src/sass/components/_dialog.scss",
1264
+ "sha256": "f4bb79a9f217ab1dfc7cd33325438d502065abec0474b6fd1c66a15d62f8ed30"
1265
+ },
1266
+ {
1267
+ "path": "src/ts/behaviors/dialogs.ts",
1268
+ "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
1269
+ },
1270
+ {
1271
+ "path": "src/ts/behaviors/bottomSheets.ts",
1272
+ "sha256": "3f3ae0c8b1cc1247ba75cd1e13c8c2a9a0fad5d284b51f6efac5887a78c3dcf7"
1273
+ },
1274
+ {
1275
+ "path": "src/ts/behaviors/sheetDrag.ts",
1276
+ "sha256": "0f5714a2a1fbb5c20a45f0c6a8cc617959e7b8572128ee8860db909f0d96f3bd"
1277
+ }
1278
+ ],
1279
+ "gaps": [
1280
+ {
1281
+ "kind": "integration",
1282
+ "description": "The shared handle dismisses rather than cycling sheet heights. Interrupted-drag cleanup, long-content scrolling and enlarged-text action access have rendered coverage; application-owned height changes, native zoom and physical touch remain pending.",
1283
+ "nextStep": "Use explicit close controls; verify application-owned height changes, native zoom and physical touch separately."
1284
+ }
1285
+ ],
1286
+ "browserChecks": [
1287
+ {
1288
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1289
+ "name": "chromium: remaining sheet variants retain native modal focus and explicit close actions",
1290
+ "scope": "Each native dialog variant: modal containment, Escape, explicit close/return focus and nonmodal outside focus. No drag or long-content assertion.",
1291
+ "state": "stale"
1292
+ },
1293
+ {
1294
+ "file": "tests/menu-field-browser.test.js",
1295
+ "name": "Sheets cancel only the active pointer and clean interrupted drags (chromium)",
1296
+ "scope": "Rendered bottom and side sheets with synthetic primary/secondary pointers, cancellation, closing, removal, same-task reopen/reattach, ancestor reattachment and a new primary press outside. Unrelated mutations preserve active drags. Physical touch review remains pending.",
1297
+ "state": "stale"
1298
+ },
1299
+ {
1300
+ "file": "tests/menu-field-browser.test.js",
1301
+ "name": "Bottom sheets keep long content and actions reachable at compact widths (chromium)",
1302
+ "scope": "Bottom sheets at 320px and 599px, modal and nonmodal, with 200% root text size, long-body scrolling, horizontal-overflow checks, wrapped headings and action labels, unobscured actions, keyboard dismissal and preserved icon-button/FAB geometry. Root text enlargement is not native browser zoom.",
1303
+ "state": "stale"
1304
+ }
1305
+ ],
1306
+ "browserEvidence": "needs-rerun",
1307
+ "recheckWhen": [
1308
+ "A reviewed source changes",
1309
+ "A mapped test or its recorded inputs change",
1310
+ "Google revises the linked guidance or before claiming a new release matches it"
1311
+ ]
1312
+ },
1313
+ {
1314
+ "slug": "side-sheet",
1315
+ "title": "Side sheet",
1316
+ "kind": "component",
1317
+ "support": "unassessed",
1318
+ "lastReviewedSupport": "implemented",
1319
+ "sourceReview": "needs-review",
1320
+ "reviewedOn": "2026-09-18",
1321
+ "scope": "Standard and modal side sheets.",
1322
+ "adaptation": "Native dialog and shared drag/dismiss behavior.",
1323
+ "upstream": {
1324
+ "source": "https://m3.material.io/components/side-sheets/overview",
1325
+ "reviewedOn": "2026-09-13",
1326
+ "scope": "requirements-prose-reviewed",
1327
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
1328
+ "sections": [
1329
+ "Overview",
1330
+ "Specs",
1331
+ "Guidelines",
1332
+ "Accessibility"
1333
+ ],
1334
+ "sources": [
1335
+ "https://m3.material.io/components/side-sheets/overview",
1336
+ "https://m3.material.io/components/side-sheets/specs",
1337
+ "https://m3.material.io/components/side-sheets/guidelines",
1338
+ "https://m3.material.io/components/side-sheets/accessibility"
1339
+ ],
1340
+ "requirements": "Use standard or modal sheets for optional supporting content. Mirror the trailing edge in RTL, avoid horizontal scrolling and provide an accessible close action separate from dragging."
1341
+ },
1342
+ "relationship": "component",
1343
+ "sources": [
1344
+ {
1345
+ "path": "src/sass/components/_side-sheet.scss",
1346
+ "sha256": "6b1110f3fb68032d603d2b6e05832ad4020cd285d76bf940f993fb941accb067"
1347
+ },
1348
+ {
1349
+ "path": "src/sass/components/_dialog.scss",
1350
+ "sha256": "f4bb79a9f217ab1dfc7cd33325438d502065abec0474b6fd1c66a15d62f8ed30"
1351
+ },
1352
+ {
1353
+ "path": "src/ts/behaviors/dialogs.ts",
1354
+ "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
1355
+ },
1356
+ {
1357
+ "path": "src/ts/behaviors/sideSheets.ts",
1358
+ "sha256": "88d4923d0ef1cd15c310374e4868bcfba9d72782e65eb5d658f114db7a09f6b2"
1359
+ },
1360
+ {
1361
+ "path": "src/ts/behaviors/sheetDrag.ts",
1362
+ "sha256": "0f5714a2a1fbb5c20a45f0c6a8cc617959e7b8572128ee8860db909f0d96f3bd"
1363
+ }
1364
+ ],
1365
+ "gaps": [
1366
+ {
1367
+ "kind": "verification",
1368
+ "description": "Browser checks cover logical aliases, RTL dragging, cancellation and enlarged translated text. Native zoom, spoken output and physical touch remain unverified.",
1369
+ "nextStep": "Complete docs/agents/accessibility-manual-review.md on actual devices and assistive technology."
1370
+ }
1371
+ ],
1372
+ "browserChecks": [
1373
+ {
1374
+ "file": "tests/menu-field-browser.test.js",
1375
+ "name": "Side sheet rendered docking and drag direction (chromium)",
1376
+ "scope": "All docking aliases, LTR/RTL, modal/nonmodal, ordinary/reduced motion, opening keyframes, inner corners, rendered drag translation, snapback, inward rejection, outward dismissal and mouse header dragging.",
1377
+ "state": "stale"
1378
+ },
1379
+ {
1380
+ "file": "tests/menu-field-browser.test.js",
1381
+ "name": "Sheets cancel only the active pointer and clean interrupted drags (chromium)",
1382
+ "scope": "Shared side/bottom drag cleanup under cancellation, secondary pointers, closing, removal, same-task reopen/reattach, ancestor reattachment and another primary press. Unrelated mutations preserve active drags. Synthetic pointers do not establish physical touch usability.",
1383
+ "state": "stale"
1384
+ },
1385
+ {
1386
+ "file": "tests/menu-field-browser.test.js",
1387
+ "name": "Side sheet translated content and close actions remain reachable (chromium)",
1388
+ "scope": "Compact/wide, LTR/RTL, modal/nonmodal, both motion settings, 200% root font size, translated wrapping, body scrolling, footer visibility, disabled control and native close-button pointer/Enter activation. Not native browser zoom.",
1389
+ "state": "stale"
1390
+ },
1391
+ {
1392
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1393
+ "name": "chromium: remaining sheet variants retain native modal focus and explicit close actions",
1394
+ "scope": "Each native dialog variant: modal containment, Escape, explicit close/return focus and nonmodal outside focus. No drag or long-content assertion.",
1395
+ "state": "stale"
1396
+ }
1397
+ ],
1398
+ "browserEvidence": "needs-rerun",
1399
+ "recheckWhen": [
1400
+ "A reviewed source changes",
1401
+ "A mapped test or its recorded inputs change",
1402
+ "Google revises the linked guidance or before claiming a new release matches it"
1403
+ ]
1404
+ },
1405
+ {
1406
+ "slug": "drag-handle",
1407
+ "title": "Drag handle",
1408
+ "kind": "component",
1409
+ "support": "unassessed",
1410
+ "lastReviewedSupport": "implemented",
1411
+ "sourceReview": "needs-review",
1412
+ "reviewedOn": "2026-09-13",
1413
+ "scope": "Decorative grip and actionable button grip.",
1414
+ "adaptation": "The host element determines semantics; no general dragging engine.",
1415
+ "upstream": {
1416
+ "source": "https://m3.material.io/components/bottom-sheets/overview",
1417
+ "reviewedOn": "2026-09-13",
1418
+ "scope": "requirements-prose-reviewed",
1419
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
1420
+ "sections": [
1421
+ "Bottom sheets/Accessibility: dragging alternatives and handle behavior"
1422
+ ],
1423
+ "sources": [
1424
+ "https://m3.material.io/components/bottom-sheets/overview",
1425
+ "https://m3.material.io/components/bottom-sheets/specs",
1426
+ "https://m3.material.io/components/bottom-sheets/guidelines",
1427
+ "https://m3.material.io/components/bottom-sheets/accessibility"
1428
+ ],
1429
+ "requirements": "A decorative grip is not an operable control. Bottom-sheet guidance describes activation to cycle available heights; provide keyboard and non-drag pointer alternatives for any real drag operation."
1430
+ },
1431
+ "relationship": "related",
1432
+ "sources": [
1433
+ {
1434
+ "path": "src/sass/components/_drag-handle.scss",
1435
+ "sha256": "a1ba374ed080c749b0c8f4f5fe6f931bebfe5d12c8151ecfa72b484810e0e238"
1436
+ }
1437
+ ],
1438
+ "gaps": [
1439
+ {
1440
+ "kind": "integration",
1441
+ "description": "Standalone grip styling supplies no drag, resize or reorder operation.",
1442
+ "nextStep": "Provide a named operable control plus keyboard and non-drag pointer alternatives for the real operation."
1443
+ }
1444
+ ],
1445
+ "browserChecks": [],
1446
+ "browserEvidence": "no-mapped-checks",
1447
+ "recheckWhen": [
1448
+ "A reviewed source changes",
1449
+ "A mapped test or its recorded inputs change",
1450
+ "Google revises the linked guidance or before claiming a new release matches it"
1451
+ ]
1452
+ },
1453
+ {
1454
+ "slug": "badges",
1455
+ "title": "Badges",
1456
+ "kind": "component",
1457
+ "support": "unassessed",
1458
+ "lastReviewedSupport": "implemented",
1459
+ "sourceReview": "needs-review",
1460
+ "reviewedOn": "2026-09-13",
1461
+ "scope": "Small dot and large count badges.",
1462
+ "adaptation": "Expose counts through the enclosing control name when its icon is hidden.",
1463
+ "upstream": {
1464
+ "source": "https://m3.material.io/components/badges/overview",
1465
+ "reviewedOn": "2026-09-13",
1466
+ "scope": "requirements-prose-reviewed",
1467
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1468
+ "sections": [
1469
+ "Specs/Measurements",
1470
+ "Guidelines/Container, Placement",
1471
+ "Accessibility/Visual indicators, Labeling elements"
1472
+ ],
1473
+ "sources": [
1474
+ "https://m3.material.io/components/badges/overview",
1475
+ "https://m3.material.io/components/badges/specs",
1476
+ "https://m3.material.io/components/badges/guidelines",
1477
+ "https://m3.material.io/components/badges/accessibility"
1478
+ ],
1479
+ "requirements": "Use a 6dp small badge or a 16dp large badge, with short counts anchored at the trailing icon edge. Expose the badge meaning once alongside its destination. Google badge contrast guidance does not replace WCAG text-contrast requirements."
1480
+ },
1481
+ "relationship": "component",
1482
+ "sources": [
1483
+ {
1484
+ "path": "src/sass/components/_badges.scss",
1485
+ "sha256": "1d9ade7617c30f8584cfee9b3f2fe5d3c5d39f5ed7fa2fd362a9f8205fa15693"
1486
+ }
1487
+ ],
1488
+ "gaps": [
1489
+ {
1490
+ "kind": "verification",
1491
+ "description": "A named count fixture is checked; changing counts, clipping and spoken updates remain unverified.",
1492
+ "nextStep": "Expose count meaning once, test large/localized counts and verify announcements only when the task needs them."
1493
+ }
1494
+ ],
1495
+ "browserChecks": [
1496
+ {
1497
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1498
+ "name": "chromium: remaining web navigation, badges and list controls expose their meaning",
1499
+ "scope": "Named navigation, document footer, unavailable pagination non-link, named badge count, list checkbox and scoped TOC aria-current. No spoken-output assertion.",
1500
+ "state": "stale"
1501
+ }
1502
+ ],
1503
+ "browserEvidence": "needs-rerun",
1504
+ "recheckWhen": [
1505
+ "A reviewed source changes",
1506
+ "A mapped test or its recorded inputs change",
1507
+ "Google revises the linked guidance or before claiming a new release matches it"
1508
+ ]
1509
+ },
1510
+ {
1511
+ "slug": "tooltips",
1512
+ "title": "Tooltips",
1513
+ "kind": "component",
1514
+ "support": "unassessed",
1515
+ "lastReviewedSupport": "implemented",
1516
+ "sourceReview": "needs-review",
1517
+ "reviewedOn": "2026-09-12",
1518
+ "scope": "Plain and rich tooltips; CSS child and runtime-generated forms.",
1519
+ "adaptation": "The selected form determines ownership; CSS-only hover/focus is not runtime initialization.",
1520
+ "upstream": {
1521
+ "source": "https://m3.material.io/components/tooltips/overview",
1522
+ "reviewedOn": "2026-09-13",
1523
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
1524
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings."
1525
+ },
1526
+ "relationship": "component",
1527
+ "sources": [
1528
+ {
1529
+ "path": "src/sass/components/_tooltip.scss",
1530
+ "sha256": "cfd11ea9b5934690458973587b8fa76cd0253badbe1c78e345e29f7a477cc35b"
1531
+ },
1532
+ {
1533
+ "path": "src/ts/components/tooltip.ts",
1534
+ "sha256": "2f9fced2c2d0887cfe3db4bc131507ee3cb871a1198a02b7e2f3fa7fdcaab4d3"
1535
+ }
1536
+ ],
1537
+ "gaps": [],
1538
+ "browserChecks": [
1539
+ {
1540
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
1541
+ "name": "partial replacement and client navigation preserve shell ownership across repeated mounts",
1542
+ "scope": "Rail shell ownership; enhanced select interaction; generated Menu registry/resource cleanup; tooltip ownership across route replacement.",
1543
+ "state": "stale"
1544
+ },
1545
+ {
1546
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
1547
+ "name": "resource observations detect omitted teardown after a partial replacement",
1548
+ "scope": "Negative control proves resources remain without destroy; no visual parity assertion.",
1549
+ "state": "stale"
1550
+ },
1551
+ {
1552
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
1553
+ "name": "Tooltip destroy cancels pending delay and animation callbacks",
1554
+ "scope": "Runtime timer cancellation for enter, exit and animation scheduling.",
1555
+ "state": "stale"
1556
+ },
1557
+ {
1558
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
1559
+ "name": "Tooltip positioning preserves margins and viewport edges after scrolling",
1560
+ "scope": "Coordinate clamping at each viewport edge with custom margin/movement and document scrolling; no visual parity assertion.",
1561
+ "state": "stale"
1562
+ }
1563
+ ],
1564
+ "browserEvidence": "needs-rerun",
1565
+ "recheckWhen": [
1566
+ "A reviewed source changes",
1567
+ "A mapped test or its recorded inputs change",
1568
+ "Google revises the linked guidance or before claiming a new release matches it"
1569
+ ]
1570
+ },
1571
+ {
1572
+ "slug": "snackbar",
1573
+ "title": "Snackbar",
1574
+ "kind": "component",
1575
+ "support": "unassessed",
1576
+ "lastReviewedSupport": "partial",
1577
+ "sourceReview": "needs-review",
1578
+ "reviewedOn": "2026-09-13",
1579
+ "scope": "Timed text feedback or persistent actionable messages, with optional close control and focused Escape dismissal.",
1580
+ "adaptation": "Use the documented announcement and timeout behavior.",
1581
+ "upstream": {
1582
+ "source": "https://m3.material.io/components/snackbar/overview",
1583
+ "reviewedOn": "2026-09-13",
1584
+ "scope": "requirements-prose-reviewed",
1585
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1586
+ "sections": [
1587
+ "Guidelines/Accessibility requirements for web, Placement, Behavior",
1588
+ "Accessibility/Interaction & style, Accessibility requirements on web, Focus, Keyboard navigation"
1589
+ ],
1590
+ "sources": [
1591
+ "https://m3.material.io/components/snackbar/overview",
1592
+ "https://m3.material.io/components/snackbar/specs",
1593
+ "https://m3.material.io/components/snackbar/guidelines",
1594
+ "https://m3.material.io/components/snackbar/accessibility"
1595
+ ],
1596
+ "requirements": "Show one snackbar at a time without autofocus or a focus trap. Actionable snackbars persist until acted on or dismissed. Timed web feedback needs an equivalent persistent inline message. Document a keyboard route to actions, support Escape when focused and restore logical focus."
1597
+ },
1598
+ "relationship": "component",
1599
+ "sources": [
1600
+ {
1601
+ "path": "src/sass/components/_snackbar.scss",
1602
+ "sha256": "538018b8fc0728c1d2933507cb6dd1c24ea6db1e8924449fb9b4e132c3c53d4e"
1603
+ },
1604
+ {
1605
+ "path": "src/ts/components/snackbar.ts",
1606
+ "sha256": "a041948479ad04cf3e32cfaafa9aebfaa0816f32bbb2f99b2e7c42bf8c23083c"
1607
+ }
1608
+ ],
1609
+ "gaps": [
1610
+ {
1611
+ "kind": "verification",
1612
+ "description": "Application keyboard reach controls, custom template actions and spoken live-region delivery need application-level verification.",
1613
+ "nextStep": "Provide a visible notification-actions control, persistent inline equivalents for timed feedback, and verify screen-reader announcements in the target application."
1614
+ }
1615
+ ],
1616
+ "browserChecks": [
1617
+ {
1618
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1619
+ "name": "chromium: remaining snackbar retains a focused action until focus leaves",
1620
+ "scope": "Focused action survives its timeout and activates once; timer resumes after focus leaves a second snackbar.",
1621
+ "state": "stale"
1622
+ },
1623
+ {
1624
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1625
+ "name": "chromium: actionable snackbar persists and restores focus on keyboard dismissal",
1626
+ "scope": "Persistent action defaults, native Tab navigation, focused Escape, inert closing controls, action-directed and replacement focus recovery, shadow roots and nested dialogs. Firefox and WebKit variants run in the browser suite.",
1627
+ "state": "stale"
1628
+ }
1629
+ ],
1630
+ "browserEvidence": "needs-rerun",
1631
+ "recheckWhen": [
1632
+ "A reviewed source changes",
1633
+ "A mapped test or its recorded inputs change",
1634
+ "Google revises the linked guidance or before claiming a new release matches it"
1635
+ ]
1636
+ },
1637
+ {
1638
+ "slug": "progress",
1639
+ "title": "Progress indicators",
1640
+ "kind": "component",
1641
+ "support": "unassessed",
1642
+ "lastReviewedSupport": "partial",
1643
+ "sourceReview": "needs-review",
1644
+ "reviewedOn": "2026-09-13",
1645
+ "scope": "Linear and circular progress, determinate and indeterminate.",
1646
+ "adaptation": "Prefer native progress where applicable; supply accessible state for custom hosts.",
1647
+ "upstream": {
1648
+ "source": "https://m3.material.io/components/progress-indicators/overview",
1649
+ "reviewedOn": "2026-09-13",
1650
+ "scope": "requirements-prose-reviewed",
1651
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1652
+ "sections": [
1653
+ "Overview/M3 Expressive update, Previous updates",
1654
+ "Specs/Configurations",
1655
+ "Guidelines/Usage, Progress indicators in buttons, Responsive layout",
1656
+ "Accessibility/Interaction & style, Labeling elements",
1657
+ "Overview/M3 Expressive update: replacement guidance; Specs/Baseline tokens"
1658
+ ],
1659
+ "sources": [
1660
+ "https://m3.material.io/components/progress-indicators/overview",
1661
+ "https://m3.material.io/components/progress-indicators/specs",
1662
+ "https://m3.material.io/components/progress-indicators/guidelines",
1663
+ "https://m3.material.io/components/progress-indicators/accessibility"
1664
+ ],
1665
+ "requirements": "Report accurate determinate values and omit values for unknown progress. Keep the same process recognizable when its state changes. Mirror linear progress in RTL and provide an end stop when track contrast needs it. Loading indicators cover many short waits; circular progress remains useful in buttons and processes that become determinate."
1666
+ },
1667
+ "relationship": "component",
1668
+ "sources": [
1669
+ {
1670
+ "path": "src/sass/components/_progress.scss",
1671
+ "sha256": "3ef3fc4af36bed45813e0533b93ca1242b4169298c8d9e5eb899ffa6fb9e6266"
1672
+ }
1673
+ ],
1674
+ "gaps": [
1675
+ {
1676
+ "kind": "verification",
1677
+ "description": "Forced-colors rendering is checked in browser emulation; Windows high-contrast and spoken output still require manual review.",
1678
+ "nextStep": "Verify native and custom indicators with Windows contrast themes and screen readers before claiming platform-wide support."
1679
+ },
1680
+ {
1681
+ "kind": "feature",
1682
+ "description": "Version 0.10.0 mirrors custom linear fill and motion in RTL. End-stop and wavy Expressive variants remain unverified.",
1683
+ "nextStep": "Assess an end stop for insufficient track contrast and review wavy variants before claiming current variant parity."
1684
+ }
1685
+ ],
1686
+ "browserChecks": [
1687
+ {
1688
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1689
+ "name": "chromium: remaining progress and loading variants stop spatial motion",
1690
+ "scope": "Named progress state, reduced-motion animation removal and visible custom static fill; no spoken-delivery assertion.",
1691
+ "state": "stale"
1692
+ },
1693
+ {
1694
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1695
+ "name": "chromium: linear progress follows inherited and overridden RTL direction",
1696
+ "scope": "Custom child and token fills at 0/25/100 percent, inherited and overridden direction, mirrored indeterminate animation samples, RTL reduced-motion geometry, unchanged native value and absence of circular linear fill. Firefox and WebKit variants run in the browser suite.",
1697
+ "state": "stale"
1698
+ },
1699
+ {
1700
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1701
+ "name": "chromium: progress remains visible in forced colors",
1702
+ "scope": "Emulated light/dark forced colors: native and custom linear/circular pixels at 0/25/100 percent, LTR/RTL, animated and reduced-motion feedback, legacy preloader, and restoration of custom colors. Firefox and WebKit variants run in the browser suite; no Windows or spoken-output assertion.",
1703
+ "state": "stale"
1704
+ }
1705
+ ],
1706
+ "browserEvidence": "needs-rerun",
1707
+ "recheckWhen": [
1708
+ "A reviewed source changes",
1709
+ "A mapped test or its recorded inputs change",
1710
+ "Google revises the linked guidance or before claiming a new release matches it"
1711
+ ]
1712
+ },
1713
+ {
1714
+ "slug": "loading-indicator",
1715
+ "title": "Loading indicator",
1716
+ "kind": "component",
1717
+ "support": "unassessed",
1718
+ "lastReviewedSupport": "implemented",
1719
+ "sourceReview": "needs-review",
1720
+ "reviewedOn": "2026-09-13",
1721
+ "scope": "Uncontained and contained morphing loading indicator.",
1722
+ "adaptation": "CSS-only; the author supplies an accessible waiting message.",
1723
+ "upstream": {
1724
+ "source": "https://m3.material.io/components/loading-indicator/overview",
1725
+ "reviewedOn": "2026-09-13",
1726
+ "scope": "requirements-prose-reviewed",
1727
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1728
+ "sections": [
1729
+ "Overview/M3 Expressive update",
1730
+ "Guidelines/Usage, Container (optional), Responsive layout, Behavior",
1731
+ "Accessibility/Use cases, Interaction & style, Labeling elements",
1732
+ "Overview/M3 Expressive update: replacement guidance"
1733
+ ],
1734
+ "sources": [
1735
+ "https://m3.material.io/components/loading-indicator/overview",
1736
+ "https://m3.material.io/components/loading-indicator/specs",
1737
+ "https://m3.material.io/components/loading-indicator/guidelines",
1738
+ "https://m3.material.io/components/loading-indicator/accessibility"
1739
+ ],
1740
+ "requirements": "Use for an actual short wait with unknown progress, usually 200ms to five seconds. Do not use for a process that will become determinate. Google specifies a descriptive progressbar role and sufficient shape contrast; a refresh gesture still needs an alternative."
1741
+ },
1742
+ "relationship": "component",
1743
+ "sources": [
1744
+ {
1745
+ "path": "src/sass/components/_loading-indicator.scss",
1746
+ "sha256": "1121e043f42b471963aa823d9c5d651306ab7aeed135bee7a1427c5afe7e5228"
1747
+ }
1748
+ ],
1749
+ "gaps": [
1750
+ {
1751
+ "kind": "integration",
1752
+ "description": "The framework requires a named status while Google recommends progressbar; an indeterminate progressbar validly omits aria-valuenow.",
1753
+ "nextStep": "Record this current contract difference; test meaningful waiting text and spoken delivery. Choose a progress indicator initially when a transition to determinate progress is expected."
1754
+ }
1755
+ ],
1756
+ "browserChecks": [
1757
+ {
1758
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1759
+ "name": "chromium: remaining progress and loading variants stop spatial motion",
1760
+ "scope": "Named progress state, reduced-motion animation removal and visible custom static fill; no spoken-delivery assertion.",
1761
+ "state": "stale"
1762
+ }
1763
+ ],
1764
+ "browserEvidence": "needs-rerun",
1765
+ "recheckWhen": [
1766
+ "A reviewed source changes",
1767
+ "A mapped test or its recorded inputs change",
1768
+ "Google revises the linked guidance or before claiming a new release matches it"
1769
+ ]
1770
+ },
1771
+ {
1772
+ "slug": "carousel",
1773
+ "title": "Carousel",
1774
+ "kind": "component",
1775
+ "support": "unassessed",
1776
+ "lastReviewedSupport": "implemented",
1777
+ "sourceReview": "needs-review",
1778
+ "reviewedOn": "2026-09-17",
1779
+ "scope": "Adaptive visual collections with documented layout variants.",
1780
+ "adaptation": "Runtime owns sizing and navigation; reduced motion removes parallax and morphing.",
1781
+ "upstream": {
1782
+ "source": "https://m3.material.io/components/carousel/overview",
1783
+ "reviewedOn": "2026-09-13",
1784
+ "scope": "requirements-prose-reviewed",
1785
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1786
+ "sections": [
1787
+ "Overview/Updates",
1788
+ "Specs/layout Measurements",
1789
+ "Guidelines/Usage, Full-screen, Item text",
1790
+ "Accessibility/Requirements on scrolling pages, Keyboard navigation, Labeling elements, Reduced motion"
1791
+ ],
1792
+ "sources": [
1793
+ "https://m3.material.io/components/carousel/overview",
1794
+ "https://m3.material.io/components/carousel/specs",
1795
+ "https://m3.material.io/components/carousel/guidelines",
1796
+ "https://m3.material.io/components/carousel/accessibility"
1797
+ ],
1798
+ "requirements": "Choose a supported layout for the content. On scrolling pages provide a route to all items. Name the container and item positions, provide keyboard and non-drag navigation, keep controls clear of content and provide pause controls for autoplay. Reduced motion removes parallax and equalizes item widths."
1799
+ },
1800
+ "relationship": "component",
1801
+ "sources": [
1802
+ {
1803
+ "path": "src/sass/components/_carousel.scss",
1804
+ "sha256": "5a9a8e459c61e84fa4d205fd25e9fd7520f0c80489ad816ba6198fe3ebd71f3f"
1805
+ },
1806
+ {
1807
+ "path": "src/ts/components/carousel.ts",
1808
+ "sha256": "9559aa36e59e4f15b5fbfbc7ff6acd0ff85ce2498972ae7a42b2510825c22224"
1809
+ }
1810
+ ],
1811
+ "gaps": [
1812
+ {
1813
+ "kind": "verification",
1814
+ "description": "Rendered browser checks do not establish native zoom, spoken announcements or physical touch-device usability.",
1815
+ "nextStep": "Review native zoom, screen readers and physical iOS/Android devices with the selected layout and pause control."
1816
+ }
1817
+ ],
1818
+ "browserChecks": [
1819
+ {
1820
+ "file": "tests/menu-field-browser.test.js",
1821
+ "name": "Carousel navigation scrolls and focuses logical items (chromium)",
1822
+ "scope": "Actual scroll position, visible focused items, previous/next, indicators, Home/End, RTL, vertical navigation and editable descendants under ordinary and reduced motion. Synthetic touch, pen and wheel events cancel transition recentering without preventing native defaults.",
1823
+ "state": "stale"
1824
+ },
1825
+ {
1826
+ "file": "tests/menu-field-browser.test.js",
1827
+ "name": "Carousel mounted motion changes preserve explicit pause (chromium)",
1828
+ "scope": "Visible application-owned pause/resume button and mounted reduced-motion changes without cancelling explicit pause; enabling reduced motion interrupts smooth scrolling and immediately realigns the active item.",
1829
+ "state": "stale"
1830
+ },
1831
+ {
1832
+ "file": "tests/menu-field-browser.test.js",
1833
+ "name": "Carousel focus and visibility suspension survive teardown (chromium)",
1834
+ "scope": "Hover and internal focus suspension, simulated document.hidden events, timer teardown and single advancement after remount. Actual background-device behavior pending.",
1835
+ "state": "stale"
1836
+ },
1837
+ {
1838
+ "file": "tests/menu-field-browser.test.js",
1839
+ "name": "Carousel destroys pending scroll completion work (chromium)",
1840
+ "scope": "Rapid navigation and queued resize followed by destruction leave no auto-advance, resize or scroll-completion timers.",
1841
+ "state": "stale"
1842
+ }
1843
+ ],
1844
+ "browserEvidence": "needs-rerun",
1845
+ "recheckWhen": [
1846
+ "A reviewed source changes",
1847
+ "A mapped test or its recorded inputs change",
1848
+ "Google revises the linked guidance or before claiming a new release matches it"
1849
+ ]
1850
+ },
1851
+ {
1852
+ "slug": "lightbox",
1853
+ "title": "Lightbox",
1854
+ "kind": "component",
1855
+ "support": "unassessed",
1856
+ "lastReviewedSupport": "implemented",
1857
+ "sourceReview": "needs-review",
1858
+ "reviewedOn": "2026-09-18",
1859
+ "scope": "Enlarge-on-activation image and dismissal.",
1860
+ "adaptation": "ExpressiveCSS media behavior, not an upstream component contract.",
1861
+ "upstream": {
1862
+ "source": "https://m3.material.io/components",
1863
+ "reviewedOn": "2026-09-13",
1864
+ "scope": "web-extension-inventory-reviewed",
1865
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
1866
+ "sections": [
1867
+ "No standalone Material component"
1868
+ ],
1869
+ "sources": [],
1870
+ "requirements": "Provide a named keyboard-operable enlargement trigger, Escape and an accessible close route, logical focus and reduced motion. Image enlargement is not automatically a modal gallery."
1871
+ },
1872
+ "relationship": "none",
1873
+ "sources": [
1874
+ {
1875
+ "path": "src/sass/components/_lightbox.scss",
1876
+ "sha256": "df62c6c3d359089fcb5f7fe2500464afb8f6cb7c57fbc3f7a04a0cf9fc452599"
1877
+ },
1878
+ {
1879
+ "path": "src/ts/components/lightbox.ts",
1880
+ "sha256": "1e334f6efb12867bc2d75793f042d3b0df0488bcc8cab97236992387c696746e"
1881
+ }
1882
+ ],
1883
+ "gaps": [
1884
+ {
1885
+ "kind": "verification",
1886
+ "description": "Native zoom, screen-reader announcements, actual Windows contrast themes and physical-device interaction remain unverified.",
1887
+ "nextStep": "Complete the Lightbox manual-review fixture. Treat this as image enlargement, not a verified modal gallery."
1888
+ }
1889
+ ],
1890
+ "browserChecks": [
1891
+ {
1892
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1893
+ "name": "chromium: remaining lightbox supports Space and preserves its image on teardown",
1894
+ "scope": "Space opens image enlargement; Escape closes; destroy preserves original image/style.",
1895
+ "state": "stale"
1896
+ },
1897
+ {
1898
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1899
+ "name": "chromium: remaining lightbox teardown cancels pending work and preserves native button focus",
1900
+ "scope": "Native button Space opens without duplicate image Tab stop; destroy cancels opening callbacks and retains image. Subsequent Tab order only.",
1901
+ "state": "stale"
1902
+ },
1903
+ {
1904
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1905
+ "name": "chromium: Lightbox transition reliability: interrupt",
1906
+ "scope": "Repeated requests and immediate closing cancel stale completion callbacks and restore image styles and overflow.",
1907
+ "state": "stale"
1908
+ },
1909
+ {
1910
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1911
+ "name": "chromium: Lightbox transition reliability: reopen",
1912
+ "scope": "Reopening during closing preserves the current overlay, caption, dimensions and callback sequence.",
1913
+ "state": "stale"
1914
+ },
1915
+ {
1916
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1917
+ "name": "chromium: Lightbox transition reliability: motion",
1918
+ "scope": "Mounted reduced-motion changes finish opening and closing without waiting for configured durations.",
1919
+ "state": "stale"
1920
+ },
1921
+ {
1922
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1923
+ "name": "chromium: Lightbox transition reliability: focus",
1924
+ "scope": "Destroying an opening image preserves its focus and cancels completion.",
1925
+ "state": "stale"
1926
+ },
1927
+ {
1928
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1929
+ "name": "chromium: Lightbox transition reliability: isolation",
1930
+ "scope": "Overlapping instances retain their own captions and share ancestor overflow until the final close.",
1931
+ "state": "stale"
1932
+ },
1933
+ {
1934
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1935
+ "name": "chromium: Lightbox transition reliability: triggers",
1936
+ "scope": "Image and native button pointer/Enter/Space activation, Escape, overlay, scroll and resize dismissal, LTR/RTL and both motion preferences.",
1937
+ "state": "stale"
1938
+ },
1939
+ {
1940
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1941
+ "name": "chromium: Lightbox transition reliability: callbacks",
1942
+ "scope": "Start callbacks may close, reopen or destroy without stale work or overriding application focus.",
1943
+ "state": "stale"
1944
+ },
1945
+ {
1946
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
1947
+ "name": "chromium: Lightbox transition reliability: destroy",
1948
+ "scope": "Opening/closing teardown restores attributes, styles and overflow, preserves unrelated focus, and supports remounting. All transition reliability cases also run in Firefox and WebKit.",
1949
+ "state": "stale"
1950
+ }
1951
+ ],
1952
+ "browserEvidence": "needs-rerun",
1953
+ "recheckWhen": [
1954
+ "A reviewed source changes",
1955
+ "A mapped test or its recorded inputs change",
1956
+ "Google revises the linked guidance or before claiming a new release matches it"
1957
+ ]
1958
+ },
1959
+ {
1960
+ "slug": "toolbars",
1961
+ "title": "Toolbars",
1962
+ "kind": "component",
1963
+ "support": "unassessed",
1964
+ "lastReviewedSupport": "implemented",
1965
+ "sourceReview": "needs-review",
1966
+ "reviewedOn": "2026-09-12",
1967
+ "scope": "Floating/docked, standard/vibrant, vertical floating, and companion FAB.",
1968
+ "adaptation": "CSS-only commands; no automatic composite toolbar keyboard model.",
1969
+ "upstream": {
1970
+ "source": "https://m3.material.io/components/toolbars/overview",
1971
+ "reviewedOn": "2026-09-13",
1972
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
1973
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings."
1974
+ },
1975
+ "relationship": "component",
1976
+ "sources": [
1977
+ {
1978
+ "path": "src/sass/components/_toolbar.scss",
1979
+ "sha256": "8fb21bf9336332897e0b4290b80b7ea31a523410a7db893ab7b49cd8abee005b"
1980
+ }
1981
+ ],
1982
+ "gaps": [],
1983
+ "browserChecks": [],
1984
+ "browserEvidence": "no-mapped-checks",
1985
+ "recheckWhen": [
1986
+ "A reviewed source changes",
1987
+ "A mapped test or its recorded inputs change",
1988
+ "Google revises the linked guidance or before claiming a new release matches it"
1989
+ ]
1990
+ },
1991
+ {
1992
+ "slug": "search",
1993
+ "title": "Search",
1994
+ "kind": "component",
1995
+ "support": "unassessed",
1996
+ "lastReviewedSupport": "implemented",
1997
+ "sourceReview": "needs-review",
1998
+ "reviewedOn": "2026-09-13",
1999
+ "scope": "Search bar and expanded search view.",
2000
+ "adaptation": "Application toggles hidden for docked views or opens a native dialog for full-screen views; optional Autocomplete owns suggestions.",
2001
+ "upstream": {
2002
+ "source": "https://m3.material.io/components/search/overview",
2003
+ "reviewedOn": "2026-09-13",
2004
+ "scope": "requirements-prose-reviewed",
2005
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2006
+ "sections": [
2007
+ "Overview",
2008
+ "Specs",
2009
+ "Guidelines",
2010
+ "Accessibility"
2011
+ ],
2012
+ "sources": [
2013
+ "https://m3.material.io/components/search/overview",
2014
+ "https://m3.material.io/components/search/specs",
2015
+ "https://m3.material.io/components/search/guidelines",
2016
+ "https://m3.material.io/components/search/accessibility"
2017
+ ],
2018
+ "requirements": "Prefer the contained Expressive style. Adapt compact full-screen and wider docked search to available space, preserve the submitted query and make suggestions reachable and announced."
2019
+ },
2020
+ "relationship": "component",
2021
+ "sources": [
2022
+ {
2023
+ "path": "src/sass/components/_search.scss",
2024
+ "sha256": "827fd893f6c3ac380a95ed3f5febd3a4fff4fee29cac5b1fb230df5e6f051c76"
2025
+ }
2026
+ ],
2027
+ "gaps": [
2028
+ {
2029
+ "kind": "integration",
2030
+ "description": "CSS does not supply search results announcements or modal focus ownership.",
2031
+ "nextStep": "Verify submitted-query retention, full-screen return focus and spoken results in the application."
2032
+ }
2033
+ ],
2034
+ "browserChecks": [
2035
+ {
2036
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2037
+ "name": "chromium: remaining suggestions and section links preserve selection and dismissal",
2038
+ "scope": "Native section links, retained search query and single-select suggestions, Arrow/Enter/Escape/Tab; no spoken-result assertion.",
2039
+ "state": "stale"
2040
+ }
2041
+ ],
2042
+ "browserEvidence": "needs-rerun",
2043
+ "recheckWhen": [
2044
+ "A reviewed source changes",
2045
+ "A mapped test or its recorded inputs change",
2046
+ "Google revises the linked guidance or before claiming a new release matches it"
2047
+ ]
2048
+ },
2049
+ {
2050
+ "slug": "fieldsets",
2051
+ "title": "Fieldsets",
2052
+ "kind": "component",
2053
+ "support": "unassessed",
2054
+ "lastReviewedSupport": "implemented",
2055
+ "sourceReview": "needs-review",
2056
+ "reviewedOn": "2026-09-13",
2057
+ "scope": "Outlined, filled, and rounded form groups.",
2058
+ "adaptation": "Native fieldset/legend; related text-field tokens do not make this an M3 component.",
2059
+ "upstream": {
2060
+ "source": "https://m3.material.io/components/text-fields/overview",
2061
+ "reviewedOn": "2026-09-13",
2062
+ "scope": "requirements-prose-reviewed",
2063
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2064
+ "sections": [
2065
+ "Related Text fields/Labels and Accessibility/Labeling elements; native grouping is a web adaptation"
2066
+ ],
2067
+ "sources": [
2068
+ "https://m3.material.io/components/text-fields/overview",
2069
+ "https://m3.material.io/components/text-fields/specs",
2070
+ "https://m3.material.io/components/text-fields/guidelines",
2071
+ "https://m3.material.io/components/text-fields/accessibility"
2072
+ ],
2073
+ "requirements": "Use native fieldset and legend to name related form controls. Text-field labels and errors remain relevant, but Google has no dedicated fieldset specification."
2074
+ },
2075
+ "relationship": "related",
2076
+ "sources": [
2077
+ {
2078
+ "path": "src/sass/components/forms/_fieldset.scss",
2079
+ "sha256": "0de91ee778fb360cd8a5451c920df81dd2b1cd5fb9d26993729afe1f745d7e65"
2080
+ }
2081
+ ],
2082
+ "gaps": [
2083
+ {
2084
+ "kind": "verification",
2085
+ "description": "Named native groups and disabled descendants are checked; long legends and nested groups remain unverified.",
2086
+ "nextStep": "Enlarge translated legends and verify readable group names without clipping."
2087
+ }
2088
+ ],
2089
+ "browserChecks": [
2090
+ {
2091
+ "file": "tests/expressivecss-examples-browser.test.js",
2092
+ "name": "complete settings example preserves both treatments and its task path",
2093
+ "scope": "Example-only responsive layout, targets, keyboard settings and save behavior, themed treatments; no component-wide parity.",
2094
+ "state": "stale"
2095
+ },
2096
+ {
2097
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2098
+ "name": "chromium: remaining native controls preserve names, keyboard state and form values",
2099
+ "scope": "Named native controls, form values and native keys; one compact text-spacing/RTL fixture and light/dark label contrast only.",
2100
+ "state": "stale"
2101
+ }
2102
+ ],
2103
+ "browserEvidence": "needs-rerun",
2104
+ "recheckWhen": [
2105
+ "A reviewed source changes",
2106
+ "A mapped test or its recorded inputs change",
2107
+ "Google revises the linked guidance or before claiming a new release matches it"
2108
+ ]
2109
+ },
2110
+ {
2111
+ "slug": "text-fields",
2112
+ "title": "Text fields",
2113
+ "kind": "component",
2114
+ "support": "unassessed",
2115
+ "lastReviewedSupport": "implemented",
2116
+ "sourceReview": "needs-review",
2117
+ "reviewedOn": "2026-09-12",
2118
+ "scope": "Filled and outlined fields, supporting text, and error states.",
2119
+ "adaptation": "Native input/textarea with explicit label and description relationships.",
2120
+ "upstream": {
2121
+ "source": "https://m3.material.io/components/text-fields/overview",
2122
+ "reviewedOn": "2026-09-13",
2123
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
2124
+ "note": "Rendered prose reviewed; collapsed token tables, image-only measurements, runtime and full parity unverified. See the design priority component review for requirement-level findings."
2125
+ },
2126
+ "relationship": "component",
2127
+ "sources": [
2128
+ {
2129
+ "path": "src/sass/components/forms/_input-fields.scss",
2130
+ "sha256": "b3cd9aceac937a183ff554fe75efb5d72e4317e522c702a89cf7a24614e7f088"
2131
+ },
2132
+ {
2133
+ "path": "src/sass/components/forms/_file-input.scss",
2134
+ "sha256": "cc856d49ae84dcae4970c75dd587194b69219a4f707ad95d4598d974eb491221"
2135
+ },
2136
+ {
2137
+ "path": "src/ts/behaviors/forms.ts",
2138
+ "sha256": "c90046cd163d73d9046b0bfc2b4888ba87626704782f295054d9da63b3395d57"
2139
+ },
2140
+ {
2141
+ "path": "src/ts/components/characterCounter.ts",
2142
+ "sha256": "5f12ff055e1ee92562839b9ad103808873d9f81c2e646d588fef9f63dbc16536"
2143
+ }
2144
+ ],
2145
+ "gaps": [],
2146
+ "browserChecks": [
2147
+ {
2148
+ "file": "tests/expressivecss-examples-browser.test.js",
2149
+ "name": "complete editor example preserves both treatments and its task path",
2150
+ "scope": "Example-only input, group toggle, preview/focus, save and bfcache-style remount behavior, themed treatments.",
2151
+ "state": "stale"
2152
+ }
2153
+ ],
2154
+ "browserEvidence": "needs-rerun",
2155
+ "recheckWhen": [
2156
+ "A reviewed source changes",
2157
+ "A mapped test or its recorded inputs change",
2158
+ "Google revises the linked guidance or before claiming a new release matches it"
2159
+ ]
2160
+ },
2161
+ {
2162
+ "slug": "select",
2163
+ "title": "Select",
2164
+ "kind": "component",
2165
+ "support": "unassessed",
2166
+ "lastReviewedSupport": "implemented",
2167
+ "sourceReview": "needs-review",
2168
+ "reviewedOn": "2026-09-17",
2169
+ "scope": "Single/multiple selection, optgroups, and browser-default fallback.",
2170
+ "adaptation": "Native select enhanced by runtime; this is related to menu/text-field patterns.",
2171
+ "upstream": {
2172
+ "source": "https://m3.material.io/components/menus/overview",
2173
+ "reviewedOn": "2026-09-13",
2174
+ "scope": "requirements-prose-reviewed",
2175
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2176
+ "sections": [
2177
+ "Overview",
2178
+ "Specs",
2179
+ "Guidelines",
2180
+ "Accessibility"
2181
+ ],
2182
+ "sources": [
2183
+ "https://m3.material.io/components/menus/overview",
2184
+ "https://m3.material.io/components/menus/specs",
2185
+ "https://m3.material.io/components/menus/guidelines",
2186
+ "https://m3.material.io/components/menus/accessibility",
2187
+ "https://m3.material.io/components/text-fields/guidelines",
2188
+ "https://m3.material.io/components/text-fields/accessibility"
2189
+ ],
2190
+ "requirements": "Google menu guidance includes select and text-field dropdown menus. Single selection replaces the previous value; multiple selection remains open. Preserve field labels and associated errors."
2191
+ },
2192
+ "relationship": "related",
2193
+ "sources": [
2194
+ {
2195
+ "path": "src/sass/components/forms/_select.scss",
2196
+ "sha256": "2e651be3951b59c99f827b190df52d302ffe5f548300767e653b9d09e7b18609"
2197
+ },
2198
+ {
2199
+ "path": "src/sass/components/_menu.scss",
2200
+ "sha256": "64ef33e268c01dd8f24a9f28198b4ae982bcd2d9a4d7f59f7fc334e0d2916774"
2201
+ },
2202
+ {
2203
+ "path": "src/ts/components/select.ts",
2204
+ "sha256": "42977975bb11210ec87701131c3536809b3109e173ccffd724e89817d9561af7"
2205
+ },
2206
+ {
2207
+ "path": "src/ts/components/menu.ts",
2208
+ "sha256": "e0fb0c0f6492652fdea2c7bf4189eabad261d5506ec93a22fac508da67d89660"
2209
+ }
2210
+ ],
2211
+ "gaps": [
2212
+ {
2213
+ "kind": "verification",
2214
+ "description": "Native zoom, screen-reader announcements, Windows contrast themes and physical-device form interaction remain unverified.",
2215
+ "nextStep": "Complete the Select native-forms manual-review fixture and record actual browser, assistive technology and device results."
2216
+ }
2217
+ ],
2218
+ "browserChecks": [
2219
+ {
2220
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
2221
+ "name": "partial replacement and client navigation preserve shell ownership across repeated mounts",
2222
+ "scope": "Rail shell ownership; enhanced select interaction; generated Menu registry/resource cleanup; tooltip ownership across route replacement.",
2223
+ "state": "stale"
2224
+ },
2225
+ {
2226
+ "file": "tests/expressivecss-lifecycle-browser.test.js",
2227
+ "name": "resource observations detect omitted teardown after a partial replacement",
2228
+ "scope": "Negative control proves resources remain without destroy; no visual parity assertion.",
2229
+ "state": "stale"
2230
+ },
2231
+ {
2232
+ "file": "tests/menu-field-browser.test.js",
2233
+ "name": "enhanced select keeps enlarged multiline labels clear of values (chromium)",
2234
+ "scope": "Filled enhanced select label/value separation with multiline LTR/RTL labels at 16px and 32px root text size. Native zoom, native and outlined selects are not covered. Equivalent Firefox and WebKit cases run in the same file.",
2235
+ "state": "stale"
2236
+ },
2237
+ {
2238
+ "file": "tests/menu-field-browser.test.js",
2239
+ "name": "Select native form synchronization: disabled (chromium)",
2240
+ "scope": "Single/multiple selected labels, disabled options and optgroups, empty selections and native FormData. Equivalent Firefox and WebKit cases run in the same file.",
2241
+ "state": "stale"
2242
+ },
2243
+ {
2244
+ "file": "tests/menu-field-browser.test.js",
2245
+ "name": "Select native form synchronization: reset (chromium)",
2246
+ "scope": "Successful and canceled native resets, default selections, generated selection semantics and no synthetic change events. Equivalent Firefox and WebKit cases run in the same file.",
2247
+ "state": "stale"
2248
+ },
2249
+ {
2250
+ "file": "tests/menu-field-browser.test.js",
2251
+ "name": "Select native form synchronization: refresh (chromium)",
2252
+ "scope": "Disabled/enabled refresh, changed and removed options, open-menu focus, Escape, stale rows, native change events and unrelated focus preservation. Equivalent Firefox and WebKit cases run in the same file.",
2253
+ "state": "stale"
2254
+ },
2255
+ {
2256
+ "file": "tests/menu-field-browser.test.js",
2257
+ "name": "Select native form synchronization: interaction (chromium)",
2258
+ "scope": "Pointer and keyboard multiple selection, event counts, checkbox state, native FormData, LTR/RTL, both motion preferences, reset teardown and instance isolation. Equivalent Firefox and WebKit cases run in the same file.",
2259
+ "state": "stale"
2260
+ }
2261
+ ],
2262
+ "browserEvidence": "needs-rerun",
2263
+ "recheckWhen": [
2264
+ "A reviewed source changes",
2265
+ "A mapped test or its recorded inputs change",
2266
+ "Google revises the linked guidance or before claiming a new release matches it"
2267
+ ]
2268
+ },
2269
+ {
2270
+ "slug": "checkboxes",
2271
+ "title": "Checkboxes",
2272
+ "kind": "component",
2273
+ "support": "unassessed",
2274
+ "lastReviewedSupport": "implemented",
2275
+ "sourceReview": "needs-review",
2276
+ "reviewedOn": "2026-09-13",
2277
+ "scope": "Unchecked, checked, indeterminate, and disabled.",
2278
+ "adaptation": "Native checkbox; indeterminate is set through the DOM property.",
2279
+ "upstream": {
2280
+ "source": "https://m3.material.io/components/checkbox/overview",
2281
+ "reviewedOn": "2026-09-13",
2282
+ "scope": "requirements-prose-reviewed",
2283
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2284
+ "sections": [
2285
+ "Overview",
2286
+ "Specs",
2287
+ "Guidelines",
2288
+ "Accessibility"
2289
+ ],
2290
+ "sources": [
2291
+ "https://m3.material.io/components/checkbox/overview",
2292
+ "https://m3.material.io/components/checkbox/specs",
2293
+ "https://m3.material.io/components/checkbox/guidelines",
2294
+ "https://m3.material.io/components/checkbox/accessibility"
2295
+ ],
2296
+ "requirements": "Use labelled independent multi-select options with a 48dp effective target. An indeterminate parent reflects partial child selection. The Google accessibility table contains chip-specific shortcuts; native checkbox behavior uses Space."
2297
+ },
2298
+ "relationship": "component",
2299
+ "sources": [
2300
+ {
2301
+ "path": "src/sass/components/forms/_checkboxes.scss",
2302
+ "sha256": "3fd662bcbca486e3b05413ce9b1ff9a10a8002e3e3ea6e853bd179e8fcfe2f09"
2303
+ }
2304
+ ],
2305
+ "gaps": [
2306
+ {
2307
+ "kind": "verification",
2308
+ "description": "Native state coverage does not verify parent aggregation or every target and forced-colors state.",
2309
+ "nextStep": "Test partial child selection, label activation, effective targets and forced-colors rendering."
2310
+ }
2311
+ ],
2312
+ "browserChecks": [
2313
+ {
2314
+ "file": "tests/expressivecss-examples-browser.test.js",
2315
+ "name": "complete settings example preserves both treatments and its task path",
2316
+ "scope": "Example-only responsive layout, targets, keyboard settings and save behavior, themed treatments; no component-wide parity.",
2317
+ "state": "stale"
2318
+ },
2319
+ {
2320
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2321
+ "name": "chromium: remaining native controls preserve names, keyboard state and form values",
2322
+ "scope": "Named native controls, form values and native keys; one compact text-spacing/RTL fixture and light/dark label contrast only.",
2323
+ "state": "stale"
2324
+ }
2325
+ ],
2326
+ "browserEvidence": "needs-rerun",
2327
+ "recheckWhen": [
2328
+ "A reviewed source changes",
2329
+ "A mapped test or its recorded inputs change",
2330
+ "Google revises the linked guidance or before claiming a new release matches it"
2331
+ ]
2332
+ },
2333
+ {
2334
+ "slug": "radio-buttons",
2335
+ "title": "Radio buttons",
2336
+ "kind": "component",
2337
+ "support": "unassessed",
2338
+ "lastReviewedSupport": "implemented",
2339
+ "sourceReview": "needs-review",
2340
+ "reviewedOn": "2026-09-13",
2341
+ "scope": "Native radio groups and disabled controls.",
2342
+ "adaptation": "Shared name provides exclusivity; fieldset/legend names the group.",
2343
+ "upstream": {
2344
+ "source": "https://m3.material.io/components/radio-button/overview",
2345
+ "reviewedOn": "2026-09-13",
2346
+ "scope": "requirements-prose-reviewed",
2347
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2348
+ "sections": [
2349
+ "Overview",
2350
+ "Specs",
2351
+ "Guidelines",
2352
+ "Accessibility"
2353
+ ],
2354
+ "sources": [
2355
+ "https://m3.material.io/components/radio-button/overview",
2356
+ "https://m3.material.io/components/radio-button/specs",
2357
+ "https://m3.material.io/components/radio-button/guidelines",
2358
+ "https://m3.material.io/components/radio-button/accessibility"
2359
+ ],
2360
+ "requirements": "Use a named group of exclusive options with 48dp targets and native arrow navigation. Guidelines favor a default; the accessibility page also discusses an initially empty group. Choose the initial state for the task."
2361
+ },
2362
+ "relationship": "component",
2363
+ "sources": [
2364
+ {
2365
+ "path": "src/sass/components/forms/_radio-buttons.scss",
2366
+ "sha256": "a8054892643f184463052ad5e566ee0d8c96d2f125f9dea433915eba5f3b7cf1"
2367
+ }
2368
+ ],
2369
+ "gaps": [
2370
+ {
2371
+ "kind": "verification",
2372
+ "description": "Native group selection is checked; initially-empty and disabled-option paths remain unmeasured.",
2373
+ "nextStep": "Check both Tab directions and arrow wrapping with the actual default and disabled choices."
2374
+ }
2375
+ ],
2376
+ "browserChecks": [
2377
+ {
2378
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2379
+ "name": "chromium: remaining native controls preserve names, keyboard state and form values",
2380
+ "scope": "Named native controls, form values and native keys; one compact text-spacing/RTL fixture and light/dark label contrast only.",
2381
+ "state": "stale"
2382
+ }
2383
+ ],
2384
+ "browserEvidence": "needs-rerun",
2385
+ "recheckWhen": [
2386
+ "A reviewed source changes",
2387
+ "A mapped test or its recorded inputs change",
2388
+ "Google revises the linked guidance or before claiming a new release matches it"
2389
+ ]
2390
+ },
2391
+ {
2392
+ "slug": "switches",
2393
+ "title": "Switches",
2394
+ "kind": "component",
2395
+ "support": "unassessed",
2396
+ "lastReviewedSupport": "implemented",
2397
+ "sourceReview": "needs-review",
2398
+ "reviewedOn": "2026-09-13",
2399
+ "scope": "Native checkbox switches and disabled controls.",
2400
+ "adaptation": "Input state owns selection and form value.",
2401
+ "upstream": {
2402
+ "source": "https://m3.material.io/components/switch/overview",
2403
+ "reviewedOn": "2026-09-13",
2404
+ "scope": "requirements-prose-reviewed",
2405
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2406
+ "sections": [
2407
+ "Overview",
2408
+ "Specs",
2409
+ "Guidelines",
2410
+ "Accessibility"
2411
+ ],
2412
+ "sources": [
2413
+ "https://m3.material.io/components/switch/overview",
2414
+ "https://m3.material.io/components/switch/specs",
2415
+ "https://m3.material.io/components/switch/guidelines",
2416
+ "https://m3.material.io/components/switch/accessibility"
2417
+ ],
2418
+ "requirements": "Use a switch for an immediate binary setting with a stable label and a 48dp effective target. Preserve native checkbox keyboard behavior and verify that the setting actually changes."
2419
+ },
2420
+ "relationship": "component",
2421
+ "sources": [
2422
+ {
2423
+ "path": "src/sass/components/forms/_switches.scss",
2424
+ "sha256": "3700fa309d0524fce4eff27c1f337d1ab03f592c567423a275cc9332144b2e8a"
2425
+ }
2426
+ ],
2427
+ "gaps": [
2428
+ {
2429
+ "kind": "integration",
2430
+ "description": "The styled native checkbox does not perform or announce a persisted setting change.",
2431
+ "nextStep": "Verify immediate application outcome and failure recovery with a stable label."
2432
+ }
2433
+ ],
2434
+ "browserChecks": [
2435
+ {
2436
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2437
+ "name": "chromium: remaining native controls preserve names, keyboard state and form values",
2438
+ "scope": "Named native controls, form values and native keys; one compact text-spacing/RTL fixture and light/dark label contrast only.",
2439
+ "state": "stale"
2440
+ }
2441
+ ],
2442
+ "browserEvidence": "needs-rerun",
2443
+ "recheckWhen": [
2444
+ "A reviewed source changes",
2445
+ "A mapped test or its recorded inputs change",
2446
+ "Google revises the linked guidance or before claiming a new release matches it"
2447
+ ]
2448
+ },
2449
+ {
2450
+ "slug": "slider",
2451
+ "title": "Slider",
2452
+ "kind": "component",
2453
+ "support": "unassessed",
2454
+ "lastReviewedSupport": "implemented",
2455
+ "sourceReview": "needs-review",
2456
+ "reviewedOn": "2026-09-17",
2457
+ "scope": "Standard, centered, range, horizontal/vertical, and five sizes.",
2458
+ "adaptation": "Native range inputs with runtime value-label and range coordination.",
2459
+ "upstream": {
2460
+ "source": "https://m3.material.io/components/sliders/overview",
2461
+ "reviewedOn": "2026-09-13",
2462
+ "scope": "requirements-prose-reviewed",
2463
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2464
+ "sections": [
2465
+ "Overview",
2466
+ "Specs",
2467
+ "Guidelines",
2468
+ "Accessibility"
2469
+ ],
2470
+ "sources": [
2471
+ "https://m3.material.io/components/sliders/overview",
2472
+ "https://m3.material.io/components/sliders/specs",
2473
+ "https://m3.material.io/components/sliders/guidelines",
2474
+ "https://m3.material.io/components/sliders/accessibility"
2475
+ ],
2476
+ "requirements": "Choose standard, centered or range selection and an appropriate track size. Verify immediate values, arrows, Home/End, stops and orientation. Provide synchronized numeric entry when precise values matter."
2477
+ },
2478
+ "relationship": "component",
2479
+ "sources": [
2480
+ {
2481
+ "path": "src/sass/components/forms/_slider.scss",
2482
+ "sha256": "355a280e40d21326ee57cd1ff66dcdbc2f02fad5f9abde2fac50623b61d3b488"
2483
+ },
2484
+ {
2485
+ "path": "src/ts/components/slider.ts",
2486
+ "sha256": "9d42da6e411ceb7604d851e9df2c56738de6ab5dd5e7b18343797c76af8526e3"
2487
+ }
2488
+ ],
2489
+ "gaps": [
2490
+ {
2491
+ "kind": "verification",
2492
+ "description": "Browser fixtures cover geometry, native keyboard and pointer interaction, numeric synchronization and emulated forced colors. Manual assistive-technology and device checks remain pending.",
2493
+ "nextStep": "Review native zoom, screen readers, physical mobile devices and Windows contrast themes."
2494
+ }
2495
+ ],
2496
+ "browserChecks": [
2497
+ {
2498
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2499
+ "name": "chromium: remaining native controls preserve names, keyboard state and form values",
2500
+ "scope": "Named native controls, form values and native keys; one compact text-spacing/RTL fixture and light/dark label contrast only.",
2501
+ "state": "stale"
2502
+ },
2503
+ {
2504
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2505
+ "name": "chromium: remaining slider accepts zero maximum and keeps value labels aligned after resize",
2506
+ "scope": "Correct zero maximum fraction/stop count, resized value label, noncentral RTL geometry and native End key.",
2507
+ "state": "stale"
2508
+ },
2509
+ {
2510
+ "file": "tests/menu-field-browser.test.js",
2511
+ "name": "Slider labels follow native handles through direction and resize (chromium)",
2512
+ "scope": "Native handle pixels and label centers at endpoints and noncentral values, horizontal LTR/RTL and vertical, resizing and reduced motion.",
2513
+ "state": "stale"
2514
+ },
2515
+ {
2516
+ "file": "tests/menu-field-browser.test.js",
2517
+ "name": "Slider input events and paired ranges retain native interaction (chromium)",
2518
+ "scope": "Application numeric input, native track clicks and keys, vertical paired resizing, equal endpoints, negative bounds, fractional steps, crossing clamps and teardown.",
2519
+ "state": "stale"
2520
+ },
2521
+ {
2522
+ "file": "tests/menu-field-browser.test.js",
2523
+ "name": "Slider forced colors preserve tracks and handles (chromium)",
2524
+ "scope": "Emulated light/dark system-color tracks and handles in horizontal LTR/RTL and vertical layouts; actual Windows contrast themes pending.",
2525
+ "state": "stale"
2526
+ }
2527
+ ],
2528
+ "browserEvidence": "needs-rerun",
2529
+ "recheckWhen": [
2530
+ "A reviewed source changes",
2531
+ "A mapped test or its recorded inputs change",
2532
+ "Google revises the linked guidance or before claiming a new release matches it"
2533
+ ]
2534
+ },
2535
+ {
2536
+ "slug": "chips",
2537
+ "title": "Chips",
2538
+ "kind": "component",
2539
+ "support": "unassessed",
2540
+ "lastReviewedSupport": "implemented",
2541
+ "sourceReview": "needs-review",
2542
+ "reviewedOn": "2026-09-13",
2543
+ "scope": "Assist, suggestion, filter, input, and display chips.",
2544
+ "adaptation": "Element choice defines behavior; display chips are a framework extension.",
2545
+ "upstream": {
2546
+ "source": "https://m3.material.io/components/chips/overview",
2547
+ "reviewedOn": "2026-09-13",
2548
+ "scope": "requirements-prose-reviewed",
2549
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2550
+ "sections": [
2551
+ "Overview",
2552
+ "Specs",
2553
+ "Guidelines",
2554
+ "Accessibility"
2555
+ ],
2556
+ "sources": [
2557
+ "https://m3.material.io/components/chips/overview",
2558
+ "https://m3.material.io/components/chips/specs",
2559
+ "https://m3.material.io/components/chips/guidelines",
2560
+ "https://m3.material.io/components/chips/accessibility"
2561
+ ],
2562
+ "requirements": "Distinguish assist, filter, input and suggestion chips. Verify a 48dp effective target around the 32dp visual chip, separate named removal controls, overflow and focus after deletion."
2563
+ },
2564
+ "relationship": "component",
2565
+ "sources": [
2566
+ {
2567
+ "path": "src/sass/components/_chips.scss",
2568
+ "sha256": "a906b31175533e454803c06bd6b47f141764792d2edd8f2add58c26c5308230f"
2569
+ },
2570
+ {
2571
+ "path": "src/ts/components/chips.ts",
2572
+ "sha256": "6cb6af3f1b41f5634de1e1bf3a821ad080b006a922d7238466915c87f775f47d"
2573
+ }
2574
+ ],
2575
+ "gaps": [
2576
+ {
2577
+ "kind": "verification",
2578
+ "description": "Deletion and focus recovery are browser-tested; full effective-target sizing, spoken output and physical devices remain unverified.",
2579
+ "nextStep": "Review 48dp effective targets and test with assistive technology and physical touch devices."
2580
+ }
2581
+ ],
2582
+ "browserChecks": [
2583
+ {
2584
+ "file": "tests/menu-field-browser.test.js",
2585
+ "name": "Chips deletion targets and focus recovery (chromium)",
2586
+ "scope": "First, middle, last and only-chip pointer, native-button, keyboard and programmatic deletion; focus, callbacks and form values in LTR/RTL and both motion preferences. Equivalent Firefox/WebKit checks exist.",
2587
+ "state": "stale"
2588
+ },
2589
+ {
2590
+ "file": "tests/menu-field-browser.test.js",
2591
+ "name": "Chips callbacks and instance teardown preserve focus (chromium)",
2592
+ "scope": "Callback-owned and unrelated focus, selected survivor and independent instance teardown. Equivalent Firefox/WebKit checks exist.",
2593
+ "state": "stale"
2594
+ },
2595
+ {
2596
+ "file": "tests/menu-field-browser.test.js",
2597
+ "name": "Chips wrapped labels keep separate actions reachable (chromium)",
2598
+ "scope": "Compact LTR/RTL wrapping at 14px and 28px, separate action/delete controls and native disabled action. Does not verify 48dp effective targets. Equivalent Firefox/WebKit checks exist.",
2599
+ "state": "stale"
2600
+ },
2601
+ {
2602
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2603
+ "name": "chromium: remaining native controls preserve names, keyboard state and form values",
2604
+ "scope": "Named native controls, form values and native keys; one compact text-spacing/RTL fixture and light/dark label contrast only.",
2605
+ "state": "stale"
2606
+ }
2607
+ ],
2608
+ "browserEvidence": "needs-rerun",
2609
+ "recheckWhen": [
2610
+ "A reviewed source changes",
2611
+ "A mapped test or its recorded inputs change",
2612
+ "Google revises the linked guidance or before claiming a new release matches it"
2613
+ ]
2614
+ },
2615
+ {
2616
+ "slug": "autocomplete",
2617
+ "title": "Autocomplete",
2618
+ "kind": "component",
2619
+ "support": "unassessed",
2620
+ "lastReviewedSupport": "partial",
2621
+ "sourceReview": "needs-review",
2622
+ "reviewedOn": "2026-09-13",
2623
+ "scope": "Single and multi-select suggestions.",
2624
+ "adaptation": "Runtime combobox behavior attached to a text field; no standalone upstream component claim.",
2625
+ "upstream": {
2626
+ "source": "https://m3.material.io/components/menus/overview",
2627
+ "reviewedOn": "2026-09-13",
2628
+ "scope": "requirements-prose-reviewed",
2629
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2630
+ "sections": [
2631
+ "Overview",
2632
+ "Specs",
2633
+ "Guidelines",
2634
+ "Accessibility"
2635
+ ],
2636
+ "sources": [
2637
+ "https://m3.material.io/components/menus/overview",
2638
+ "https://m3.material.io/components/menus/specs",
2639
+ "https://m3.material.io/components/menus/guidelines",
2640
+ "https://m3.material.io/components/menus/accessibility",
2641
+ "https://m3.material.io/components/text-fields/guidelines",
2642
+ "https://m3.material.io/components/text-fields/accessibility",
2643
+ "https://m3.material.io/components/search/accessibility"
2644
+ ],
2645
+ "requirements": "Provide a labelled text field, reachable suggestions and clear selection state. Announce new results when suggestions update; filtering and selection must preserve the intended value."
2646
+ },
2647
+ "relationship": "related",
2648
+ "sources": [
2649
+ {
2650
+ "path": "src/sass/components/forms/_input-fields.scss",
2651
+ "sha256": "b3cd9aceac937a183ff554fe75efb5d72e4317e522c702a89cf7a24614e7f088"
2652
+ },
2653
+ {
2654
+ "path": "src/sass/components/_menu.scss",
2655
+ "sha256": "8ad4eab498fa24199203070cf2b5792f6d61aa52e18b75770549ffcc7e0c64dc"
2656
+ },
2657
+ {
2658
+ "path": "src/ts/components/autocomplete.ts",
2659
+ "sha256": "355c7c33a06c563dfb48d3278b3cb21029652f59428e3894bc09a78b8455a813"
2660
+ },
2661
+ {
2662
+ "path": "src/ts/components/menu.ts",
2663
+ "sha256": "dffb2df2cbd79a4b1fdfb354c62509952070059eb35418aec9cb296680f6a241"
2664
+ }
2665
+ ],
2666
+ "gaps": [
2667
+ {
2668
+ "kind": "feature",
2669
+ "description": "Version 0.10.0 exposes localized loading, result counts and multi-selection updates through a polite live region. Spoken delivery and application-owned async ordering remain unverified.",
2670
+ "nextStep": "Check screen-reader delivery and application request cancellation, error handling and stale-response ordering."
2671
+ }
2672
+ ],
2673
+ "browserChecks": [
2674
+ {
2675
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2676
+ "name": "chromium: remaining suggestions and section links preserve selection and dismissal",
2677
+ "scope": "Native section links, retained search query and single-select suggestions, Arrow/Enter/Escape/Tab; no spoken-result assertion.",
2678
+ "state": "stale"
2679
+ },
2680
+ {
2681
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2682
+ "name": "chromium: remaining autocomplete preserves a preselected display label on focus",
2683
+ "scope": "Initial selected record retains its display label and selection through first focus and Tab exit.",
2684
+ "state": "stale"
2685
+ },
2686
+ {
2687
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2688
+ "name": "chromium: autocomplete announces results and selection without moving focus",
2689
+ "scope": "Polite live-region text for synchronous and delayed results, plurals and localization defaults, clearing, multi-selection, focus preservation and teardown with late results. Firefox and WebKit variants run in the browser suite; no spoken-delivery assertion.",
2690
+ "state": "stale"
2691
+ }
2692
+ ],
2693
+ "browserEvidence": "needs-rerun",
2694
+ "recheckWhen": [
2695
+ "A reviewed source changes",
2696
+ "A mapped test or its recorded inputs change",
2697
+ "Google revises the linked guidance or before claiming a new release matches it"
2698
+ ]
2699
+ },
2700
+ {
2701
+ "slug": "date-picker",
2702
+ "title": "Date picker",
2703
+ "kind": "component",
2704
+ "support": "unassessed",
2705
+ "lastReviewedSupport": "partial",
2706
+ "sourceReview": "needs-review",
2707
+ "reviewedOn": "2026-09-17",
2708
+ "scope": "Inline single-date, range, and multiple-date calendar.",
2709
+ "adaptation": "Default inline presentation with optional docked display plugin; no open()/close() methods or modal implementation.",
2710
+ "upstream": {
2711
+ "source": "https://m3.material.io/components/date-pickers/overview",
2712
+ "reviewedOn": "2026-09-13",
2713
+ "scope": "requirements-prose-reviewed",
2714
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2715
+ "sections": [
2716
+ "Accessibility/Date entry methods, Accessible date input, Affordance for keyboard shortcuts, Color contrast between dates, Keyboard navigation"
2717
+ ],
2718
+ "sources": [
2719
+ "https://m3.material.io/components/date-pickers/overview",
2720
+ "https://m3.material.io/components/date-pickers/specs",
2721
+ "https://m3.material.io/components/date-pickers/guidelines",
2722
+ "https://m3.material.io/components/date-pickers/accessibility"
2723
+ ],
2724
+ "requirements": "Distinguish docked, modal, input and range variants. Provide manual entry and a date-format description. Calendar navigation includes arrows, Home/End, Page Up/Down and modified month/year movement."
2725
+ },
2726
+ "relationship": "component",
2727
+ "sources": [
2728
+ {
2729
+ "path": "src/sass/components/_datepicker.scss",
2730
+ "sha256": "3a30cd4a9c57386989e95c7623822e189aa04faf101ee5a4a8ba43f6674b654b"
2731
+ },
2732
+ {
2733
+ "path": "src/sass/components/_docked-display.scss",
2734
+ "sha256": "39107a3b4cde4c0763fff6c077fd7ebf7b964d5312f2435c9786e22c018709a5"
2735
+ },
2736
+ {
2737
+ "path": "src/ts/components/datepicker.ts",
2738
+ "sha256": "44f9df3b5058be3a31d31fe318c2582a8839282438d17e04db08df17c51a185c"
2739
+ },
2740
+ {
2741
+ "path": "src/ts/components/select.ts",
2742
+ "sha256": "33d9285e89d231522070ada3a4cc8e917a620cee245d86c09a2f3e4161fec49e"
2743
+ },
2744
+ {
2745
+ "path": "src/ts/plugins/dockedDisplayPlugin.ts",
2746
+ "sha256": "8411242a17cbbb95fa9863270f471e03dc487474224994b952f67bc555e2eda7"
2747
+ }
2748
+ ],
2749
+ "gaps": [
2750
+ {
2751
+ "kind": "feature",
2752
+ "description": "Modal picker parity is not provided by the documented inline API.",
2753
+ "nextStep": "Decide the modal picker contract, focus behavior and dismissal before adding it; preserve inline and docked APIs."
2754
+ },
2755
+ {
2756
+ "kind": "verification",
2757
+ "description": "Range-end typing and keyboard selection, multiple-date defaults, shrink/regrow/clear, form values and generated-input teardown have rendered coverage. Custom parsing, range constraints through typed input and spoken calendar context need further review.",
2758
+ "nextStep": "Complete the manual picker checklist and separately verify custom parsing and typed range constraints. Do not infer modal or complete accessibility parity."
2759
+ }
2760
+ ],
2761
+ "browserChecks": [
2762
+ {
2763
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2764
+ "name": "chromium: date picker supports calendar keyboard navigation and redraw focus",
2765
+ "scope": "Inline and docked calendar day/week/month/year navigation, leap-year clamping, disabled-date selection prevention, RTL, configured bounds and redraw focus. Firefox and WebKit variants run in the browser suite; no spoken-delivery assertion.",
2766
+ "state": "stale"
2767
+ },
2768
+ {
2769
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2770
+ "name": "chromium: date picker selection lifecycle: default",
2771
+ "scope": "Multiple-date initialization and same-day normalization with nonmidnight defaults.",
2772
+ "state": "stale"
2773
+ },
2774
+ {
2775
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2776
+ "name": "chromium: date picker selection lifecycle: multiple",
2777
+ "scope": "Pointer and keyboard add/remove, disabled day, form values, shrink/regrow/clear, preservation of the original input, generated-field teardown and focus recovery.",
2778
+ "state": "stale"
2779
+ },
2780
+ {
2781
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2782
+ "name": "chromium: date picker selection lifecycle: range",
2783
+ "scope": "Authored end-input typing, Enter-to-calendar, RTL keyboard end selection, rejection of an earlier calendar end and listener cleanup.",
2784
+ "state": "stale"
2785
+ },
2786
+ {
2787
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2788
+ "name": "chromium: date picker selection lifecycle: clear",
2789
+ "scope": "Clearing a native date input resets its value and data-date without throwing.",
2790
+ "state": "stale"
2791
+ }
2792
+ ],
2793
+ "browserEvidence": "needs-rerun",
2794
+ "recheckWhen": [
2795
+ "A reviewed source changes",
2796
+ "A mapped test or its recorded inputs change",
2797
+ "Google revises the linked guidance or before claiming a new release matches it"
2798
+ ]
2799
+ },
2800
+ {
2801
+ "slug": "time-picker",
2802
+ "title": "Time picker",
2803
+ "kind": "component",
2804
+ "support": "unassessed",
2805
+ "lastReviewedSupport": "partial",
2806
+ "sourceReview": "needs-review",
2807
+ "reviewedOn": "2026-09-18",
2808
+ "scope": "Inline clock and digital input; 12-hour and 24-hour formats.",
2809
+ "adaptation": "Default inline presentation with optional docked display plugin; no open()/close() methods or modal implementation.",
2810
+ "upstream": {
2811
+ "source": "https://m3.material.io/components/time-pickers/overview",
2812
+ "reviewedOn": "2026-09-13",
2813
+ "scope": "requirements-prose-reviewed",
2814
+ "note": "Requirements and boundaries: design reference inputs-material-review. Full visual parity and spoken output unverified.",
2815
+ "sections": [
2816
+ "Overview",
2817
+ "Specs",
2818
+ "Guidelines",
2819
+ "Accessibility"
2820
+ ],
2821
+ "sources": [
2822
+ "https://m3.material.io/components/time-pickers/overview",
2823
+ "https://m3.material.io/components/time-pickers/specs",
2824
+ "https://m3.material.io/components/time-pickers/guidelines",
2825
+ "https://m3.material.io/components/time-pickers/accessibility"
2826
+ ],
2827
+ "requirements": "Provide named hour and minute inputs, manual entry, 12/24-hour handling and named AM/PM selection state. Keep an input alternative when the dial is unsuitable for available space."
2828
+ },
2829
+ "relationship": "component",
2830
+ "sources": [
2831
+ {
2832
+ "path": "src/sass/components/_timepicker.scss",
2833
+ "sha256": "87330125fa818b3463a1c4e4f80535e7551d39bdd83795462ac8ec0cc092c439"
2834
+ },
2835
+ {
2836
+ "path": "src/sass/components/_docked-display.scss",
2837
+ "sha256": "39107a3b4cde4c0763fff6c077fd7ebf7b964d5312f2435c9786e22c018709a5"
2838
+ },
2839
+ {
2840
+ "path": "src/ts/components/timepicker.ts",
2841
+ "sha256": "1f74375f4917dce48e955b25f482af13a06bdc9bd7e16f967b661c3168a3bf15"
2842
+ },
2843
+ {
2844
+ "path": "src/ts/plugins/dockedDisplayPlugin.ts",
2845
+ "sha256": "8411242a17cbbb95fa9863270f471e03dc487474224994b952f67bc555e2eda7"
2846
+ }
2847
+ ],
2848
+ "gaps": [
2849
+ {
2850
+ "kind": "feature",
2851
+ "description": "Modal picker parity is not provided by the documented inline API.",
2852
+ "nextStep": "Decide the modal picker contract, focus behavior and dismissal before adding it; preserve inline and docked APIs."
2853
+ },
2854
+ {
2855
+ "kind": "feature",
2856
+ "description": "Version 0.10.0 names hour/minute inputs and exposes AM/PM button state. Clock-dial arrow navigation and modal keyboard behavior remain unimplemented.",
2857
+ "nextStep": "Use the digital inputs for keyboard entry; separately assess dial navigation and modal focus before claiming complete keyboard parity."
2858
+ }
2859
+ ],
2860
+ "browserChecks": [
2861
+ {
2862
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2863
+ "name": "chromium: time picker exposes named keyboard controls in inline and docked modes",
2864
+ "scope": "Localized hour name and fallback minute name, native AM/PM keyboard activation and selected state, no form submission, docked opening focus, and 12/24-hour digital entry including midnight. Firefox and WebKit variants run in the browser suite; no spoken-delivery assertion.",
2865
+ "state": "stale"
2866
+ },
2867
+ {
2868
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2869
+ "name": "chromium: time picker digital values: input",
2870
+ "scope": "Input-only edits, invalid-value recovery, confirmation change counts and form values in 12/24-hour, inline/docked, LTR/RTL and ordinary/reduced motion fixtures. Physical keyboard and clipboard checks remain pending.",
2871
+ "state": "stale"
2872
+ },
2873
+ {
2874
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2875
+ "name": "chromium: time picker digital values: empty",
2876
+ "scope": "Empty hour/minute fallback display and submitted values agree, including twelve-hour midnight normalization and retained AM/PM state.",
2877
+ "state": "stale"
2878
+ },
2879
+ {
2880
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2881
+ "name": "chromium: time picker digital values: boundaries",
2882
+ "scope": "Reinitialization from midnight, noon, late-night 24-hour strings and lowercase AM/PM preserves twelve-hour display and period state.",
2883
+ "state": "stale"
2884
+ }
2885
+ ],
2886
+ "browserEvidence": "needs-rerun",
2887
+ "recheckWhen": [
2888
+ "A reviewed source changes",
2889
+ "A mapped test or its recorded inputs change",
2890
+ "Google revises the linked guidance or before claiming a new release matches it"
2891
+ ]
2892
+ },
2893
+ {
2894
+ "slug": "typography",
2895
+ "title": "Typography",
2896
+ "kind": "foundation",
2897
+ "support": "unassessed",
2898
+ "lastReviewedSupport": "partial",
2899
+ "sourceReview": "needs-review",
2900
+ "reviewedOn": "2026-09-12",
2901
+ "scope": "Fifteen baseline type-role utilities and rem-based tokens; semantic element defaults; separate brand/plain/fallback font tokens; bundled Latin Roboto and Noto Sans 400/500. Existing role-weight tokens permit scoped application emphasis.",
2902
+ "adaptation": "Use supported web component and application overrides; Android attributes and APIs are design references only.",
2903
+ "upstream": {
2904
+ "source": "https://github.com/material-components/material-components-android/blob/master/docs/theming/Typography.md",
2905
+ "reviewedOn": "2026-09-07",
2906
+ "scope": "android-foundation-reviewed; full web specification unassessed"
2907
+ },
2908
+ "relationship": "foundation",
2909
+ "sources": [
2910
+ {
2911
+ "path": "src/sass/tokens/_reference.scss",
2912
+ "sha256": "5725dc82aedcd277d99ff8a5483866b08970647bdd2fc3c67c662d958cd15f4d"
2913
+ },
2914
+ {
2915
+ "path": "src/sass/utilities/_typescale.scss",
2916
+ "sha256": "4f3d7b2c48dd10173ef82eb00473694c9a07c3079380d0eae1797faa6204add3"
2917
+ },
2918
+ {
2919
+ "path": "src/sass/base/_typography.scss",
2920
+ "sha256": "fc8b4d714a911e38fb3dd3e9105853ff33ce3c96fdde984c932f9748b83b9204"
2921
+ },
2922
+ {
2923
+ "path": "src/sass/base/_fonts.scss",
2924
+ "sha256": "0b768be36675e97378e1ba9567896ee6bb87437352e3e6a059c56a9dde11a628"
2925
+ }
2926
+ ],
2927
+ "gaps": [
2928
+ {
2929
+ "kind": "feature",
2930
+ "description": "No emphasized role utilities or emphasized token family; emphasized labels and smaller titles requiring 700 need an application-supplied real face.",
2931
+ "nextStep": "Define an additive emphasized-scale contract and a font-loading policy before implementing public names."
2932
+ },
2933
+ {
2934
+ "kind": "feature",
2935
+ "description": "Bundled text fonts cover Latin and 400/500 only; a Noto Sans fallback declaration does not establish non-Latin coverage.",
2936
+ "nextStep": "Add browser checks for actual rendered font faces/weights, representative scripts, and all type-role metrics; retain native zoom/assistive review separately."
2937
+ }
2938
+ ],
2939
+ "browserChecks": [
2940
+ {
2941
+ "file": "tests/expressivecss-examples-browser.test.js",
2942
+ "name": "complete settings example preserves both treatments and its task path",
2943
+ "scope": "32px/28px example headline sizes, responsive overflow and doubled root text size; does not prove font identity or full scale parity.",
2944
+ "state": "stale"
2945
+ },
2946
+ {
2947
+ "file": "tests/expressivecss-material-quality.test.js",
2948
+ "name": "Material browser exposes wrong hierarchy contracts and motion while keeping design judgments pending",
2949
+ "scope": "Application-scoped headline size, line-height and 500 weight repair is accepted while qualitative judgment stays pending; no synthesized-font detection.",
2950
+ "state": "stale"
2951
+ }
2952
+ ],
2953
+ "browserEvidence": "needs-rerun",
2954
+ "recheckWhen": [
2955
+ "A reviewed source changes",
2956
+ "A mapped test or its recorded inputs change",
2957
+ "Google revises the linked guidance or before claiming a new release matches it"
2958
+ ]
2959
+ },
2960
+ {
2961
+ "slug": "shape",
2962
+ "title": "Shape",
2963
+ "kind": "foundation",
2964
+ "support": "unassessed",
2965
+ "lastReviewedSupport": "partial",
2966
+ "sourceReview": "needs-review",
2967
+ "reviewedOn": "2026-09-12",
2968
+ "scope": "Per-component shape properties and variants; common button scoped radius; separate FAB geometry; icon-button and button-group pressed/selected corner changes; logical connected-group edges.",
2969
+ "adaptation": "Use supported web component and application overrides; Android attributes and APIs are design references only.",
2970
+ "upstream": {
2971
+ "source": "https://github.com/material-components/material-components-android/blob/master/docs/theming/Shape.md",
2972
+ "reviewedOn": "2026-09-07",
2973
+ "scope": "android-foundation-reviewed; full web specification unassessed"
2974
+ },
2975
+ "relationship": "foundation",
2976
+ "sources": [
2977
+ {
2978
+ "path": "src/sass/components/_buttons.scss",
2979
+ "sha256": "cc0b3dd320002682c9b2cbe9e2192dd0af124047fd7ced7811456fecfc9b689a"
2980
+ },
2981
+ {
2982
+ "path": "src/sass/abstracts/_mixins.scss",
2983
+ "sha256": "734b13a6a1775f1f293e49c16f50697cb9f3e6b0fc20c23bd2f950a87f7dede7"
2984
+ },
2985
+ {
2986
+ "path": "src/sass/components/_button-groups.scss",
2987
+ "sha256": "43a5b36f05b1596edb4d3f3a7686eb14f96819e6b67b5ac50dc76b4c179b6d38"
2988
+ }
2989
+ ],
2990
+ "gaps": [
2991
+ {
2992
+ "kind": "feature",
2993
+ "description": "No shared md-sys-shape token family or general rounded/cut-corner theming system.",
2994
+ "nextStep": "Inventory existing component corner defaults against proposed shared roles before introducing an additive shape scale; preserve existing component overrides and state shapes."
2995
+ }
2996
+ ],
2997
+ "browserChecks": [
2998
+ {
2999
+ "file": "tests/button-groups-browser.test.js",
3000
+ "name": "button-group geometry resolves for overrides, targets, and RTL",
3001
+ "scope": "Selected small/xlarge corners, connected XS RTL outer/inner corners, target geometry; reduced-motion transition duration is zero.",
3002
+ "state": "stale"
3003
+ },
3004
+ {
3005
+ "file": "tests/button-groups-browser.test.js",
3006
+ "name": "keyboard press changes icon widths and rendered corners",
3007
+ "scope": "Standard and connected button-group pressed corner changes and release with keyboard activation.",
3008
+ "state": "stale"
3009
+ },
3010
+ {
3011
+ "file": "tests/expressivecss-material-quality.test.js",
3012
+ "name": "Material browser exposes wrong hierarchy contracts and motion while keeping design judgments pending",
3013
+ "scope": "Application-scoped common-button 16px corner repair; does not establish shape-system parity.",
3014
+ "state": "stale"
3015
+ }
3016
+ ],
3017
+ "browserEvidence": "needs-rerun",
3018
+ "recheckWhen": [
3019
+ "A reviewed source changes",
3020
+ "A mapped test or its recorded inputs change",
3021
+ "Google revises the linked guidance or before claiming a new release matches it"
3022
+ ]
3023
+ },
3024
+ {
3025
+ "slug": "motion",
3026
+ "title": "Motion",
3027
+ "kind": "foundation",
3028
+ "support": "unassessed",
3029
+ "lastReviewedSupport": "partial",
3030
+ "sourceReview": "needs-review",
3031
+ "reviewedOn": "2026-09-12",
3032
+ "scope": "Component-owned CSS/runtime motion, sampled fast-spatial linear easing for button-group width/radius, expanding-card container transition, and scale utility. Button groups, expanding cards and the scale utility suppress transitions under reduced motion. Expanding-card close cleanup follows the actual container transition, including CSS timing overrides and cancellation.",
3033
+ "adaptation": "Use supported web component and application overrides; Android attributes and APIs are design references only.",
3034
+ "upstream": {
3035
+ "source": "https://github.com/material-components/material-components-android/blob/master/docs/theming/Motion.md",
3036
+ "reviewedOn": "2026-09-07",
3037
+ "scope": "android-foundation-reviewed; full web specification unassessed"
3038
+ },
3039
+ "relationship": "foundation",
3040
+ "sources": [
3041
+ {
3042
+ "path": "src/sass/components/_button-groups.scss",
3043
+ "sha256": "43a5b36f05b1596edb4d3f3a7686eb14f96819e6b67b5ac50dc76b4c179b6d38"
3044
+ },
3045
+ {
3046
+ "path": "src/ts/components/buttonGroup.ts",
3047
+ "sha256": "e628a02ce4d2f6d1d9cbd61c61191f54e4b6de98bcf05b5a19ec7cd4b2da58b8"
3048
+ },
3049
+ {
3050
+ "path": "src/sass/components/_expanding-card.scss",
3051
+ "sha256": "199e0dfaddb39af5acb823e8dbc7933a459b765efad19cc28d0403ebe3942f5f"
3052
+ },
3053
+ {
3054
+ "path": "src/ts/components/expandingCard.ts",
3055
+ "sha256": "b776a51297bb066b41ce2c035370eac02c62fa7daa61bb1ce4cf57d2c74edff5"
3056
+ },
3057
+ {
3058
+ "path": "src/sass/components/_transitions.scss",
3059
+ "sha256": "fe0c65c4a4de2af661aa39eae2629e5e76f73e681ef5b686694bbbee62eaff77"
3060
+ }
3061
+ ],
3062
+ "gaps": [
3063
+ {
3064
+ "kind": "feature",
3065
+ "description": "No shared md-sys-motion token family, general spring solver, or unified motion-theme selector.",
3066
+ "nextStep": "Define shared semantic timing/spring roles only after mapping existing component needs; distinguish spatial and effects motion without presenting sampled CSS easing as a general solver."
3067
+ }
3068
+ ],
3069
+ "browserChecks": [
3070
+ {
3071
+ "file": "tests/button-groups-browser.test.js",
3072
+ "name": "standard press redistribution keeps its rendered width stable",
3073
+ "scope": "Post-transition standard-group growth/release preserves total rendered width; not spring-curve fidelity.",
3074
+ "state": "stale"
3075
+ },
3076
+ {
3077
+ "file": "tests/button-groups-browser.test.js",
3078
+ "name": "button-group geometry resolves for overrides, targets, and RTL",
3079
+ "scope": "Connected group's transition duration is zero under emulated reduced motion.",
3080
+ "state": "stale"
3081
+ },
3082
+ {
3083
+ "file": "tests/expressivecss-material-quality.test.js",
3084
+ "name": "Material browser exposes wrong hierarchy contracts and motion while keeping design judgments pending",
3085
+ "scope": "Application-owned editor animation is removed only for reduced-motion scenes while visible completion remains; not framework-wide reduced-motion coverage.",
3086
+ "state": "stale"
3087
+ },
3088
+ {
3089
+ "file": "tests/expanding-card-browser.test.js",
3090
+ "name": "expanding-card completion follows CSS and survives interruption (chromium)",
3091
+ "scope": "Chromium: zero and 1.2s container timing, reopening, cancellation, native close, removal, destruction and focus return. Equivalent Firefox and WebKit cases run separately in the browser suite.",
3092
+ "state": "stale"
3093
+ },
3094
+ {
3095
+ "file": "tests/expanding-card-browser.test.js",
3096
+ "name": "scale and expanding cards respect changing motion preferences (chromium)",
3097
+ "scope": "Chromium: reduced-motion final transforms, active transition cancellation, focus preservation and card close cleanup. Equivalent Firefox and WebKit cases run separately in the browser suite.",
3098
+ "state": "stale"
3099
+ }
3100
+ ],
3101
+ "browserEvidence": "needs-rerun",
3102
+ "recheckWhen": [
3103
+ "A reviewed source changes",
3104
+ "A mapped test or its recorded inputs change",
3105
+ "Google revises the linked guidance or before claiming a new release matches it"
3106
+ ]
3107
+ }
3108
+ ]
3109
+ }