@expressivecss/mcp-server 0.2.2 → 0.3.1

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.
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "frameworkVersion": "0.12.0",
4
- "sourceRevision": "b3821bb0390b985c31a858ab7f4e3dbf0de2d71c",
3
+ "frameworkVersion": "0.13.1",
4
+ "sourceRevision": "3ed93f73a1e5a5ab9d201993b132fd64d81478ca",
5
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
6
  "browserRun": {
7
- "recordedOn": "2026-09-18",
7
+ "recordedOn": "2026-10-08",
8
8
  "engine": "chromium",
9
9
  "engineVersion": "153.0.8010.12",
10
- "nodeVersion": "v22.23.1",
10
+ "nodeVersion": "v24.21.0",
11
11
  "status": "passed",
12
12
  "inputsCurrent": false,
13
- "reportSha256": "5777e67403861540605d77c5a5055086a49e8fe086297abd8a4bb6cf399c1666",
13
+ "reportSha256": "b2f7a499810474b2448e87bde25fa13c969ab79a096d7281b84990803d624c47",
14
14
  "collector": "scripts/record-capability-evidence.mjs"
15
15
  },
16
16
  "entries": [
@@ -48,11 +48,11 @@
48
48
  "sources": [
49
49
  {
50
50
  "path": "src/sass/components/_navbar.scss",
51
- "sha256": "2d3a2accd4d0dfeb524f628f9eb2be81bad5a50ab7feea40c0c0ddd58016da96"
51
+ "sha256": "6cb45a812a9c14572d9a4261e0d36b7a89321adc5647bc8e39ce3410b75b57d5"
52
52
  },
53
53
  {
54
54
  "path": "src/ts/components/appBar.ts",
55
- "sha256": "91ddc61000a36923995b3633743dd83452d43671c40ae923318dedfeff38893e"
55
+ "sha256": "6fe4e6f9d55d1820530b731914259dfb677d4e06fcf37137eb930a707cc41fc6"
56
56
  }
57
57
  ],
58
58
  "gaps": [
@@ -115,7 +115,7 @@
115
115
  "sources": [
116
116
  {
117
117
  "path": "src/sass/components/_navigation-bar.scss",
118
- "sha256": "e42c5c395c9f2cdc1dc9c8c4cfdff1a06cb12183cae1d17bcea915536f0aa9c2"
118
+ "sha256": "cfc192f6284aeeffd5ba0cbaba968d68108bf60343c7278752ae7424e777db5d"
119
119
  }
120
120
  ],
121
121
  "gaps": [],
@@ -153,11 +153,11 @@
153
153
  "sources": [
154
154
  {
155
155
  "path": "src/sass/components/_navigation-rail.scss",
156
- "sha256": "7dcc854d90a48a541ae9ed2380d28063e8217e567f697e27a21fe1ab84e055bb"
156
+ "sha256": "1928870f453b486f8ee86a0f1e386b7fba24dc4a1acd06292ac210d701f809bd"
157
157
  },
158
158
  {
159
159
  "path": "src/ts/components/navigationRail.ts",
160
- "sha256": "f7b4e682a87ea664dc8b8927ea86a784fd61ab1d538a9996f97d5c2e95db4406"
160
+ "sha256": "3e6c8f71742235994c3533a56033903765eecbfa1d3ae4d10e7e6dd565800940"
161
161
  }
162
162
  ],
163
163
  "gaps": [],
@@ -273,7 +273,7 @@
273
273
  "sources": [
274
274
  {
275
275
  "path": "src/sass/components/_page-footer.scss",
276
- "sha256": "71f385db254eb07874be949d5bcb0cdd0ec8835342c1d5a89ba0def76d3668ab"
276
+ "sha256": "68f4f28773946707239b84419a512acc18b507763893bccaed26d1ae41543f8c"
277
277
  }
278
278
  ],
279
279
  "gaps": [
@@ -334,7 +334,7 @@
334
334
  },
335
335
  {
336
336
  "path": "src/ts/components/tabs.ts",
337
- "sha256": "72657d5e40d49a8d84357753eb81d488a8756827f83bb5102b9f6269854516cf"
337
+ "sha256": "42bb556083a39c6fe194a02c489e1844f00579604a8eb9bbc76f97c196550c52"
338
338
  }
339
339
  ],
340
340
  "gaps": [
@@ -483,6 +483,56 @@
483
483
  "Google revises the linked guidance or before claiming a new release matches it"
484
484
  ]
485
485
  },
486
+ {
487
+ "slug": "stepper",
488
+ "title": "Stepper",
489
+ "kind": "component",
490
+ "support": "implemented",
491
+ "lastReviewedSupport": "implemented",
492
+ "sourceReview": "source-reviewed",
493
+ "reviewedOn": "2026-10-06",
494
+ "scope": "Horizontal and vertical ordered lists with current, complete and invalid steps, supporting text, links back to finished steps and a content panel in vertical steps.",
495
+ "adaptation": "An <ol> with aria-current=\"step\"; CSS alt text speaks the complete and invalid states from translatable tokens.",
496
+ "upstream": {
497
+ "source": "https://m3.material.io/components",
498
+ "reviewedOn": "2026-10-06",
499
+ "scope": "web-extension-inventory-reviewed",
500
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
501
+ "sections": [
502
+ "No standalone Material component"
503
+ ],
504
+ "sources": [],
505
+ "requirements": "Keep the steps in an ordered list, mark exactly one current step, convey complete and error states in text as well as color, and keep labels translatable."
506
+ },
507
+ "relationship": "none",
508
+ "sources": [
509
+ {
510
+ "path": "src/sass/components/_stepper.scss",
511
+ "sha256": "0efd332c2e84cd20bdf98ab9b1645aecb174cc6042f55abeb7b78383db32be12"
512
+ }
513
+ ],
514
+ "gaps": [
515
+ {
516
+ "kind": "verification",
517
+ "description": "Layout in LTR and RTL, indicator fills and glyphs, and the spoken state text are checked in a browser; screen reader output and enlarged text remain unverified.",
518
+ "nextStep": "Move through a checkout with a screen reader in each engine and confirm the step count, the current step and the completed state are announced once."
519
+ }
520
+ ],
521
+ "browserChecks": [
522
+ {
523
+ "file": "tests/stepper-browser.test.js",
524
+ "name": "chromium: stepper lays out its steps, marks their state and speaks it",
525
+ "scope": "Row and stack layout in LTR and RTL, supporting text and content placement, current, complete and invalid indicator fills and glyphs, no trailing connector, spoken state text and its token override. No spoken-output assertion.",
526
+ "state": "stale"
527
+ }
528
+ ],
529
+ "browserEvidence": "needs-rerun",
530
+ "recheckWhen": [
531
+ "A reviewed source changes",
532
+ "A mapped test or its recorded inputs change",
533
+ "Google revises the linked guidance or before claiming a new release matches it"
534
+ ]
535
+ },
486
536
  {
487
537
  "slug": "menu",
488
538
  "title": "Menu",
@@ -491,7 +541,7 @@
491
541
  "lastReviewedSupport": "implemented",
492
542
  "sourceReview": "needs-review",
493
543
  "reviewedOn": "2026-09-13",
494
- "scope": "Vertical menus, nested flyouts, grouping, and standard/vibrant styles.",
544
+ "scope": "Vertical menus, nested flyouts, grouping, standard/vibrant styles, and context menus opened at the pointer.",
495
545
  "adaptation": "Native menu/li structure; Menu owns opening and keyboard behavior.",
496
546
  "upstream": {
497
547
  "source": "https://m3.material.io/components/menus/overview",
@@ -516,11 +566,11 @@
516
566
  "sources": [
517
567
  {
518
568
  "path": "src/sass/components/_menu.scss",
519
- "sha256": "8ad4eab498fa24199203070cf2b5792f6d61aa52e18b75770549ffcc7e0c64dc"
569
+ "sha256": "fc7456249caec5118a379c9d56c7a7bfb211c147f5fd318bbcf8de6ea1d33654"
520
570
  },
521
571
  {
522
572
  "path": "src/ts/components/menu.ts",
523
- "sha256": "dffb2df2cbd79a4b1fdfb354c62509952070059eb35418aec9cb296680f6a241"
573
+ "sha256": "0ca7f4c0d80012adad3babdfc23005792dbaa2655c3fe5595bc9bcc7e2c35ce8"
524
574
  }
525
575
  ],
526
576
  "gaps": [
@@ -629,25 +679,75 @@
629
679
  "file": "tests/expressivecss-web-accessibility-browser.test.js",
630
680
  "name": "chromium: ScrollSpy isolation: offsets",
631
681
  "scope": "Per-section observer offsets and removal of the previous section's active class.",
632
- "state": "not-recorded"
682
+ "state": "stale"
633
683
  },
634
684
  {
635
685
  "file": "tests/expressivecss-web-accessibility-browser.test.js",
636
686
  "name": "chromium: ScrollSpy isolation: groups",
637
687
  "scope": "Independent callback groups retain separate current links and fallback state during scrolling and destruction.",
638
- "state": "not-recorded"
688
+ "state": "stale"
639
689
  },
640
690
  {
641
691
  "file": "tests/expressivecss-web-accessibility-browser.test.js",
642
692
  "name": "chromium: ScrollSpy isolation: teardown",
643
693
  "scope": "Repeated destruction and remount restore authored offset value and priority and update surviving current links.",
644
- "state": "not-recorded"
694
+ "state": "stale"
645
695
  },
646
696
  {
647
697
  "file": "tests/expressivecss-web-accessibility-browser.test.js",
648
698
  "name": "chromium: ScrollSpy isolation: anchors",
649
699
  "scope": "Native keyboard fragment navigation and actual scrolling in LTR/RTL with ordinary and reduced motion.",
650
- "state": "not-recorded"
700
+ "state": "stale"
701
+ }
702
+ ],
703
+ "browserEvidence": "needs-rerun",
704
+ "recheckWhen": [
705
+ "A reviewed source changes",
706
+ "A mapped test or its recorded inputs change",
707
+ "Google revises the linked guidance or before claiming a new release matches it"
708
+ ]
709
+ },
710
+ {
711
+ "slug": "tree",
712
+ "title": "Tree",
713
+ "kind": "component",
714
+ "support": "implemented",
715
+ "lastReviewedSupport": "implemented",
716
+ "sourceReview": "source-reviewed",
717
+ "reviewedOn": "2026-10-06",
718
+ "scope": "Nested lists of native disclosures and links with guide lines, turning chevrons in LTR and RTL, leading icons and an aria-current row.",
719
+ "adaptation": "Native <details> branches and links; every row is a Tab stop and no tree role is promised.",
720
+ "upstream": {
721
+ "source": "https://m3.material.io/components",
722
+ "reviewedOn": "2026-10-06",
723
+ "scope": "web-extension-inventory-reviewed",
724
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
725
+ "sections": [
726
+ "No standalone Material component"
727
+ ],
728
+ "sources": [],
729
+ "requirements": "Expose each branch's expanded state, mark the current item, keep every row reachable by keyboard and avoid a tree role without its arrow-key contract."
730
+ },
731
+ "relationship": "none",
732
+ "sources": [
733
+ {
734
+ "path": "src/sass/components/_tree.scss",
735
+ "sha256": "3d290dec16e25b71a3e06cbd5fafd3340253659fbf9d95953193dab29b10aa21"
736
+ }
737
+ ],
738
+ "gaps": [
739
+ {
740
+ "kind": "verification",
741
+ "description": "Indentation, chevrons in LTR and RTL, opening a branch and the current row are checked in a browser; long trees for keyboard users, enlarged text and spoken output remain unverified.",
742
+ "nextStep": "Navigate a deep tree with a keyboard and a screen reader in each engine; measure how many Tab stops a long tree costs and whether arrow-key navigation is needed."
743
+ }
744
+ ],
745
+ "browserChecks": [
746
+ {
747
+ "file": "tests/tree-browser.test.js",
748
+ "name": "chromium: tree indents its levels, turns its chevrons and marks the current row",
749
+ "scope": "Level indent, leaf and branch text alignment, open and closed chevrons in LTR and RTL, opening a branch, the current row fill, guide lines and no tree role. No spoken-output assertion.",
750
+ "state": "stale"
651
751
  }
652
752
  ],
653
753
  "browserEvidence": "needs-rerun",
@@ -683,15 +783,15 @@
683
783
  "sources": [
684
784
  {
685
785
  "path": "src/sass/components/_buttons.scss",
686
- "sha256": "cc0b3dd320002682c9b2cbe9e2192dd0af124047fd7ced7811456fecfc9b689a"
786
+ "sha256": "be8b53a9969e443b7f98d106f1d14db694a58728844c920fadf2e0ae37ca62c4"
687
787
  },
688
788
  {
689
789
  "path": "src/sass/abstracts/_mixins.scss",
690
- "sha256": "734b13a6a1775f1f293e49c16f50697cb9f3e6b0fc20c23bd2f950a87f7dede7"
790
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
691
791
  },
692
792
  {
693
793
  "path": "src/sass/abstracts/_variables.scss",
694
- "sha256": "e8a5dfd7355cefde5a87775455cb95ac41c735f0d407a7b23ef94b2ec1ed8fd8"
794
+ "sha256": "2aaccb38cfd12b3829cbaa753e572ffc95f135a1f7f18d8de4f56764e94c3ec4"
695
795
  }
696
796
  ],
697
797
  "gaps": [
@@ -762,15 +862,15 @@
762
862
  "sources": [
763
863
  {
764
864
  "path": "src/sass/components/_icon-buttons.scss",
765
- "sha256": "c77a969e392a03be07f10aa6021758d5fa7ddccd999440755c93942a9dbb38e8"
865
+ "sha256": "6dbdd8e36e4dfbe3b406595b4536adb810753fb5136edb951f1f087af4d00ef9"
766
866
  },
767
867
  {
768
868
  "path": "src/sass/abstracts/_mixins.scss",
769
- "sha256": "734b13a6a1775f1f293e49c16f50697cb9f3e6b0fc20c23bd2f950a87f7dede7"
869
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
770
870
  },
771
871
  {
772
872
  "path": "src/sass/abstracts/_variables.scss",
773
- "sha256": "e8a5dfd7355cefde5a87775455cb95ac41c735f0d407a7b23ef94b2ec1ed8fd8"
873
+ "sha256": "2aaccb38cfd12b3829cbaa753e572ffc95f135a1f7f18d8de4f56764e94c3ec4"
774
874
  }
775
875
  ],
776
876
  "gaps": [
@@ -931,7 +1031,7 @@
931
1031
  },
932
1032
  {
933
1033
  "path": "src/ts/components/menu.ts",
934
- "sha256": "e0fb0c0f6492652fdea2c7bf4189eabad261d5506ec93a22fac508da67d89660"
1034
+ "sha256": "0ca7f4c0d80012adad3babdfc23005792dbaa2655c3fe5595bc9bcc7e2c35ce8"
935
1035
  }
936
1036
  ],
937
1037
  "gaps": [
@@ -998,15 +1098,15 @@
998
1098
  "sources": [
999
1099
  {
1000
1100
  "path": "src/sass/components/_buttons.scss",
1001
- "sha256": "cc0b3dd320002682c9b2cbe9e2192dd0af124047fd7ced7811456fecfc9b689a"
1101
+ "sha256": "be8b53a9969e443b7f98d106f1d14db694a58728844c920fadf2e0ae37ca62c4"
1002
1102
  },
1003
1103
  {
1004
1104
  "path": "src/sass/components/_fab-menu.scss",
1005
- "sha256": "f1d7b579ea34271824a0fdc75d209d00830a1beb352ddbbd670d31bebf5548d0"
1105
+ "sha256": "e40c4871f38141ec874e1acf48db87727e433b3ec9c7cae6b51712306c9ec2b3"
1006
1106
  },
1007
1107
  {
1008
1108
  "path": "src/ts/components/buttons.ts",
1009
- "sha256": "8f693be33245b1984742a4f51272c4f39927f4a75c735583583f530ace701940"
1109
+ "sha256": "7d5a616bc561813687f1453b61da19304cec0266c2dd355219fcd367ce14ada0"
1010
1110
  }
1011
1111
  ],
1012
1112
  "gaps": [
@@ -1069,11 +1169,11 @@
1069
1169
  "sources": [
1070
1170
  {
1071
1171
  "path": "src/sass/components/_cards.scss",
1072
- "sha256": "506c13fe1a87f9397037ead0aaefdfb79f9e201523d9b39fd00b66cbd17a6bfb"
1172
+ "sha256": "d79eefdc47aae6fd30b9346d2e86e5d8772e64994569f68d1541ced58f552509"
1073
1173
  },
1074
1174
  {
1075
1175
  "path": "src/sass/components/_expanding-card.scss",
1076
- "sha256": "199e0dfaddb39af5acb823e8dbc7933a459b765efad19cc28d0403ebe3942f5f"
1176
+ "sha256": "a9db28346c8b6d9c0bf198e07ded62b63b34e6eac7d0221396322efd29045056"
1077
1177
  },
1078
1178
  {
1079
1179
  "path": "src/ts/components/cards.ts",
@@ -1124,6 +1224,56 @@
1124
1224
  "Google revises the linked guidance or before claiming a new release matches it"
1125
1225
  ]
1126
1226
  },
1227
+ {
1228
+ "slug": "aura",
1229
+ "title": "Aura",
1230
+ "kind": "component",
1231
+ "support": "implemented",
1232
+ "lastReviewedSupport": "implemented",
1233
+ "sourceReview": "source-reviewed",
1234
+ "reviewedOn": "2026-10-08",
1235
+ "scope": "A turning light on a ring around one wrapped element, with dual, rainbow and glow styles, token color, width, corner and speed, a reversed turn in RTL, a static ring under reduced motion and a Highlight ring in forced colors.",
1236
+ "adaptation": "A wrapper whose pseudo-element draws a masked conic gradient; it adds nothing to the accessibility tree.",
1237
+ "upstream": {
1238
+ "source": "https://m3.material.io/components",
1239
+ "reviewedOn": "2026-10-08",
1240
+ "scope": "web-extension-inventory-reviewed",
1241
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1242
+ "sections": [
1243
+ "No standalone Material component"
1244
+ ],
1245
+ "sources": [],
1246
+ "requirements": "Keep the light decorative and out of the accessibility tree, state the element's importance in text, and stop motion when reduced motion is requested."
1247
+ },
1248
+ "relationship": "none",
1249
+ "sources": [
1250
+ {
1251
+ "path": "src/sass/components/_aura.scss",
1252
+ "sha256": "e95db68ef71c6f5b3262379825dc52b4ef75968d621df6ae2aa441e2d4caf002"
1253
+ }
1254
+ ],
1255
+ "gaps": [
1256
+ {
1257
+ "kind": "verification",
1258
+ "description": "The ring geometry, the turning angle, its reverse in RTL, its stop under reduced motion and the absence of the ring from the accessibility tree are checked in a browser; forced colors and spoken output remain unverified.",
1259
+ "nextStep": "Check the Highlight ring in Windows forced colors and confirm with a screen reader that only the wrapped element is announced."
1260
+ }
1261
+ ],
1262
+ "browserChecks": [
1263
+ {
1264
+ "file": "tests/aura-browser.test.js",
1265
+ "name": "chromium: aura turns a ring around its element, stops under reduced motion and stays out of the accessibility tree",
1266
+ "scope": "Ring padding and corners around a button and a card, a running registered angle, its reverse in RTL, the glow halo, the stop under reduced motion, a stepped turn and a 0deg resting ring in a shadow-only load, and no aura nodes in the accessibility tree. No spoken-output assertion.",
1267
+ "state": "stale"
1268
+ }
1269
+ ],
1270
+ "browserEvidence": "needs-rerun",
1271
+ "recheckWhen": [
1272
+ "A reviewed source changes",
1273
+ "A mapped test or its recorded inputs change",
1274
+ "Google revises the linked guidance or before claiming a new release matches it"
1275
+ ]
1276
+ },
1127
1277
  {
1128
1278
  "slug": "lists",
1129
1279
  "title": "Lists",
@@ -1189,35 +1339,49 @@
1189
1339
  ]
1190
1340
  },
1191
1341
  {
1192
- "slug": "dialogs",
1193
- "title": "Dialogs",
1342
+ "slug": "message",
1343
+ "title": "Message",
1194
1344
  "kind": "component",
1195
- "support": "unassessed",
1345
+ "support": "implemented",
1196
1346
  "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.",
1347
+ "sourceReview": "source-reviewed",
1348
+ "reviewedOn": "2026-10-06",
1349
+ "scope": "Start and end alignment, avatar, header, footer actions, message groups and outlined attachment bubbles.",
1350
+ "adaptation": "Plain div parts on a CSS grid; the page owns role=\"log\" on a live conversation.",
1201
1351
  "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."
1352
+ "source": "https://m3.material.io/components",
1353
+ "reviewedOn": "2026-10-06",
1354
+ "scope": "web-extension-inventory-reviewed",
1355
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1356
+ "sections": [
1357
+ "No standalone Material component"
1358
+ ],
1359
+ "sources": [],
1360
+ "requirements": "Identify each sender, keep reading order equal to conversation order, name icon-only message actions and announce appended messages through a log region."
1206
1361
  },
1207
- "relationship": "component",
1362
+ "relationship": "none",
1208
1363
  "sources": [
1209
1364
  {
1210
- "path": "src/sass/components/_dialog.scss",
1211
- "sha256": "f4bb79a9f217ab1dfc7cd33325438d502065abec0474b6fd1c66a15d62f8ed30"
1212
- },
1365
+ "path": "src/sass/components/_message.scss",
1366
+ "sha256": "a1b7c89089ac37ccbf2127c1c7bc4f394fd1a27253ec07208caf379a2ffa8240"
1367
+ }
1368
+ ],
1369
+ "gaps": [
1213
1370
  {
1214
- "path": "src/ts/behaviors/dialogs.ts",
1215
- "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
1371
+ "kind": "verification",
1372
+ "description": "Avatar anchoring, start and end sides in LTR and RTL, and grouped corners are checked in a browser; announcements for appended messages and spoken output remain unverified.",
1373
+ "nextStep": "Append messages to a role=\"log\" conversation and inspect assistive-technology output; test enlarged text and RTL."
1216
1374
  }
1217
1375
  ],
1218
- "gaps": [],
1219
- "browserChecks": [],
1220
- "browserEvidence": "no-mapped-checks",
1376
+ "browserChecks": [
1377
+ {
1378
+ "file": "tests/message-browser.test.js",
1379
+ "name": "chromium: message layout anchors the avatar, follows its side and joins grouped corners",
1380
+ "scope": "Avatar level with the bubble bottom and above the footer, start/end edges in LTR and RTL, no gap without an avatar, grouped corner radii and no message landmarks. No spoken-output assertion.",
1381
+ "state": "stale"
1382
+ }
1383
+ ],
1384
+ "browserEvidence": "needs-rerun",
1221
1385
  "recheckWhen": [
1222
1386
  "A reviewed source changes",
1223
1387
  "A mapped test or its recorded inputs change",
@@ -1225,85 +1389,65 @@
1225
1389
  ]
1226
1390
  },
1227
1391
  {
1228
- "slug": "bottom-sheet",
1229
- "title": "Bottom sheet",
1392
+ "slug": "message-scroller",
1393
+ "title": "Message scroller",
1230
1394
  "kind": "component",
1231
- "support": "unassessed",
1395
+ "support": "implemented",
1232
1396
  "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.",
1397
+ "sourceReview": "source-reviewed",
1398
+ "reviewedOn": "2026-10-08",
1399
+ "scope": "Following streamed output, release on scrolling up, a scroll-to-latest button, turn anchors with a peek of the previous message, prepend preservation, opening at the end, start or last turn, and jumping to a message by id.",
1400
+ "adaptation": "A native scroll container; the component sets scroll position, a spacer and the button's inert state. The page owns role=\"log\" and aria-busy.",
1237
1401
  "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.",
1402
+ "source": "https://m3.material.io/components",
1403
+ "reviewedOn": "2026-10-08",
1404
+ "scope": "web-extension-inventory-reviewed",
1405
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1242
1406
  "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"
1407
+ "No standalone Material component"
1253
1408
  ],
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."
1409
+ "sources": [],
1410
+ "requirements": "Keep the reader's place unless they are at the live edge, let them stop following at any time, name the focusable viewport and announce appended messages through a log region."
1255
1411
  },
1256
- "relationship": "component",
1412
+ "relationship": "none",
1257
1413
  "sources": [
1258
1414
  {
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"
1415
+ "path": "src/sass/components/_message-scroller.scss",
1416
+ "sha256": "c535f903268ac93bff12aa12dc647bdb9cc3dde34062a8a7ff850dc95ab06e6d"
1269
1417
  },
1270
1418
  {
1271
- "path": "src/ts/behaviors/bottomSheets.ts",
1272
- "sha256": "3f3ae0c8b1cc1247ba75cd1e13c8c2a9a0fad5d284b51f6efac5887a78c3dcf7"
1273
- },
1274
- {
1275
- "path": "src/ts/behaviors/sheetDrag.ts",
1276
- "sha256": "0f5714a2a1fbb5c20a45f0c6a8cc617959e7b8572128ee8860db909f0d96f3bd"
1419
+ "path": "src/ts/components/messageScroller.ts",
1420
+ "sha256": "0ddbd41f71725cc27a318c92f12eabf329d92dc79402752c2520ce8a049fd799"
1277
1421
  }
1278
1422
  ],
1279
1423
  "gaps": [
1280
1424
  {
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."
1425
+ "kind": "verification",
1426
+ "description": "Following, release on scrolling up, the inert button, prepend preservation, turn anchoring with the spacer, saved-transcript positions and jump to a message are checked in a browser; announcements in a role=\"log\" viewport, touch and scrollbar dragging, and spoken output remain unverified.",
1427
+ "nextStep": "Stream replies into a role=\"log\" viewport with a screen reader in each engine, and check touch scrolling and scrollbar dragging on real devices."
1284
1428
  }
1285
1429
  ],
1286
1430
  "browserChecks": [
1287
1431
  {
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"
1432
+ "file": "tests/message-scroller-browser.test.js",
1433
+ "name": "chromium: message scroller follows output, keeps its place on prepend and anchors new turns",
1434
+ "scope": "Opening at the end, following streamed text, release on a wheel scroll up, the inert button and resuming from it, following kept through a click on a message, scrollToMessage with a peek and with a missing id, prepend preservation, an appended anchor at the peek with a spacer that clears as the reply grows, and destroy. No spoken-output assertion.",
1435
+ "state": "not-recorded"
1292
1436
  },
1293
1437
  {
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"
1438
+ "file": "tests/message-scroller-browser.test.js",
1439
+ "name": "chromium: message scroller opens saved transcripts at the requested position",
1440
+ "scope": "last-anchor on a long last turn, last-anchor falling back to the end, and start.",
1441
+ "state": "not-recorded"
1298
1442
  },
1299
1443
  {
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"
1444
+ "file": "tests/message-scroller-browser.test.js",
1445
+ "name": "chromium: message scroller jumps to a message inside a shadow root",
1446
+ "scope": "scrollToMessage called right after init finds a message in a shadow root and scrolls it one peek below the top; pressing the button from the keyboard there moves focus to the viewport as the button goes inert.",
1447
+ "state": "not-recorded"
1304
1448
  }
1305
1449
  ],
1306
- "browserEvidence": "needs-rerun",
1450
+ "browserEvidence": "incomplete",
1307
1451
  "recheckWhen": [
1308
1452
  "A reviewed source changes",
1309
1453
  "A mapped test or its recorded inputs change",
@@ -1311,68 +1455,1078 @@
1311
1455
  ]
1312
1456
  },
1313
1457
  {
1314
- "slug": "side-sheet",
1315
- "title": "Side sheet",
1458
+ "slug": "accordion",
1459
+ "title": "Accordion",
1316
1460
  "kind": "component",
1317
- "support": "unassessed",
1461
+ "support": "implemented",
1318
1462
  "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.",
1463
+ "sourceReview": "source-reviewed",
1464
+ "reviewedOn": "2026-10-06",
1465
+ "scope": "Joined tiles on native details and summary, exclusive groups through the name attribute, a leading icon, a turning chevron and an animated open where the engine supports it.",
1466
+ "adaptation": "Native <details> and <summary>; the browser owns the toggle, its keyboard support and its expanded state.",
1323
1467
  "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.",
1468
+ "source": "https://m3.material.io/components",
1469
+ "reviewedOn": "2026-10-06",
1470
+ "scope": "web-extension-inventory-reviewed",
1471
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1328
1472
  "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"
1473
+ "No standalone Material component"
1339
1474
  ],
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."
1475
+ "sources": [],
1476
+ "requirements": "Expose each header as a button with its expanded state, keep controls out of the header, keep the reading order equal to the visual order and respect reduced motion."
1341
1477
  },
1342
- "relationship": "component",
1478
+ "relationship": "none",
1343
1479
  "sources": [
1344
1480
  {
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"
1481
+ "path": "src/sass/components/_accordion.scss",
1482
+ "sha256": "cd9c2657f1f840f721575335ffd05d8cd176b2f94c37637341121485901833ee"
1363
1483
  }
1364
1484
  ],
1365
1485
  "gaps": [
1366
1486
  {
1367
1487
  "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."
1488
+ "description": "Tile corners, the chevron turn, exclusive groups and the expanded state Chromium reports are checked in a browser; the open animation, enlarged text and spoken output remain unverified.",
1489
+ "nextStep": "Toggle items with a screen reader in each engine and confirm the expanded state is announced; test enlarged text and reduced motion."
1370
1490
  }
1371
1491
  ],
1372
1492
  "browserChecks": [
1373
1493
  {
1374
- "file": "tests/menu-field-browser.test.js",
1375
- "name": "Side sheet rendered docking and drag direction (chromium)",
1494
+ "file": "tests/accordion-browser.test.js",
1495
+ "name": "chromium: accordion joins its tiles, turns the chevron and keeps one item open per name",
1496
+ "scope": "Outer, inner and open corner radii, chevron rotation, hidden native marker, exclusive name groups, Enter on a focused summary and the expanded state Chromium reports for each summary. No spoken-output assertion.",
1497
+ "state": "stale"
1498
+ }
1499
+ ],
1500
+ "browserEvidence": "needs-rerun",
1501
+ "recheckWhen": [
1502
+ "A reviewed source changes",
1503
+ "A mapped test or its recorded inputs change",
1504
+ "Google revises the linked guidance or before claiming a new release matches it"
1505
+ ]
1506
+ },
1507
+ {
1508
+ "slug": "data-table",
1509
+ "title": "Data table",
1510
+ "kind": "component",
1511
+ "support": "implemented",
1512
+ "lastReviewedSupport": "implemented",
1513
+ "sourceReview": "source-reviewed",
1514
+ "reviewedOn": "2026-10-06",
1515
+ "scope": "Scrolling wrapper with an outline, sticky header row, numeric columns, dense rows, a sort arrow drawn from aria-sort and checkbox row selection.",
1516
+ "adaptation": "A plain div wraps a native <table>, so the table keeps its role; the page owns sorting, select-all and the scroll region name.",
1517
+ "upstream": {
1518
+ "source": "https://m3.material.io/components",
1519
+ "reviewedOn": "2026-10-06",
1520
+ "scope": "web-extension-inventory-reviewed",
1521
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1522
+ "sections": [
1523
+ "No standalone Material component"
1524
+ ],
1525
+ "sources": [],
1526
+ "requirements": "Keep native table semantics with column and row headers, expose sort state on the header cell, name selection checkboxes after their rows and make a scrolling region reachable and named."
1527
+ },
1528
+ "relationship": "none",
1529
+ "sources": [
1530
+ {
1531
+ "path": "src/sass/components/_data-table.scss",
1532
+ "sha256": "dbce2d8f374bb0f5bc7008725c0e8ed680df39d9bb111fea4219b8d120558e9c"
1533
+ }
1534
+ ],
1535
+ "gaps": [
1536
+ {
1537
+ "kind": "verification",
1538
+ "description": "Table semantics, the sticky header, numeric alignment, the sort arrow and selected rows are checked in a browser; sort announcements, enlarged text and spoken output remain unverified.",
1539
+ "nextStep": "Sort and select rows with a screen reader in each engine and confirm the sort state and selection are announced; test enlarged text and RTL."
1540
+ }
1541
+ ],
1542
+ "browserChecks": [
1543
+ {
1544
+ "file": "tests/data-table-browser.test.js",
1545
+ "name": "chromium: data table keeps table semantics, sticks its header and draws sort and selection",
1546
+ "scope": "Table, column header and row counts through the wrapper, sticky header offset after scrolling, end-aligned numeric cells in LTR and RTL, sort arrow opacity and rotation, selected row fill and the named scroll region. No spoken-output assertion.",
1547
+ "state": "stale"
1548
+ }
1549
+ ],
1550
+ "browserEvidence": "needs-rerun",
1551
+ "recheckWhen": [
1552
+ "A reviewed source changes",
1553
+ "A mapped test or its recorded inputs change",
1554
+ "Google revises the linked guidance or before claiming a new release matches it"
1555
+ ]
1556
+ },
1557
+ {
1558
+ "slug": "stat",
1559
+ "title": "Stat",
1560
+ "kind": "component",
1561
+ "support": "implemented",
1562
+ "lastReviewedSupport": "implemented",
1563
+ "sourceReview": "source-reviewed",
1564
+ "reviewedOn": "2026-10-06",
1565
+ "scope": "Wrapping tiles in a description list with headline values, and a change line with up, down and negative states.",
1566
+ "adaptation": "A <dl> pairs each value with its label; the arrow is decoration and the text carries the direction.",
1567
+ "upstream": {
1568
+ "source": "https://m3.material.io/components",
1569
+ "reviewedOn": "2026-10-06",
1570
+ "scope": "web-extension-inventory-reviewed",
1571
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1572
+ "sections": [
1573
+ "No standalone Material component"
1574
+ ],
1575
+ "sources": [],
1576
+ "requirements": "Pair every value with its label, state the direction and comparison of a change in text and keep long values from overflowing their tile."
1577
+ },
1578
+ "relationship": "none",
1579
+ "sources": [
1580
+ {
1581
+ "path": "src/sass/components/_stat.scss",
1582
+ "sha256": "c8f50278bd01fd4ef8d38a5b26fb7b91869f30b9cfc59cef4d482651e9bae9ad"
1583
+ }
1584
+ ],
1585
+ "gaps": [
1586
+ {
1587
+ "kind": "verification",
1588
+ "description": "Tiling, wrapping, the value type role, arrow direction, the negative color and term-definition pairing are checked in a browser; enlarged text and spoken output remain unverified.",
1589
+ "nextStep": "Read a stats row with a screen reader in each engine and confirm each label is announced with its value; test enlarged text at narrow widths."
1590
+ }
1591
+ ],
1592
+ "browserChecks": [
1593
+ {
1594
+ "file": "tests/stat-browser.test.js",
1595
+ "name": "chromium: stats tile their figures, wrap when narrow and mark the change",
1596
+ "scope": "One row when wide and stacked when narrow, the headline value size, up and down arrows, the negative color and term-definition pairs in the accessibility tree. No spoken-output assertion.",
1597
+ "state": "stale"
1598
+ }
1599
+ ],
1600
+ "browserEvidence": "needs-rerun",
1601
+ "recheckWhen": [
1602
+ "A reviewed source changes",
1603
+ "A mapped test or its recorded inputs change",
1604
+ "Google revises the linked guidance or before claiming a new release matches it"
1605
+ ]
1606
+ },
1607
+ {
1608
+ "slug": "kpi",
1609
+ "title": "KPI",
1610
+ "kind": "component",
1611
+ "support": "implemented",
1612
+ "lastReviewedSupport": "implemented",
1613
+ "sourceReview": "source-reviewed",
1614
+ "reviewedOn": "2026-10-08",
1615
+ "scope": "A card with a labelled value in a description list, a trend chip with up, down and negative states, a tonal icon, a corner action, a sparkline, a progress bar and a footer.",
1616
+ "adaptation": "A <dl> pairs the value with its label inside a card <article>; the arrow is decoration, the text carries the direction and the sparkline's table is its text alternative.",
1617
+ "upstream": {
1618
+ "source": "https://m3.material.io/components",
1619
+ "reviewedOn": "2026-10-08",
1620
+ "scope": "web-extension-inventory-reviewed",
1621
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1622
+ "sections": [
1623
+ "No standalone Material component"
1624
+ ],
1625
+ "sources": [],
1626
+ "requirements": "Pair the value with its label, state the direction and unit of a change in text, caption the sparkline and name the action after the figure."
1627
+ },
1628
+ "relationship": "none",
1629
+ "sources": [
1630
+ {
1631
+ "path": "src/sass/components/_kpi.scss",
1632
+ "sha256": "8b54fdf69302d605376d10091bd533054030c3ddffd0384c9c7076b9bcf2c8eb"
1633
+ }
1634
+ ],
1635
+ "gaps": [
1636
+ {
1637
+ "kind": "verification",
1638
+ "description": "Part placement, the value type role, arrow direction, the negative chip and chart colors and term-definition pairing are checked in a browser; enlarged text and spoken output remain unverified.",
1639
+ "nextStep": "Read a KPI row with a screen reader in each engine and confirm the label, value, trend and sparkline caption are announced in order; test enlarged text at narrow widths."
1640
+ }
1641
+ ],
1642
+ "browserChecks": [
1643
+ {
1644
+ "file": "tests/kpi-browser.test.js",
1645
+ "name": "chromium: kpi lays out its label, value, trend, actions, chart and footer",
1646
+ "scope": "Trend beside the value, actions in the label row's end corner, chart under the value, an edge-to-edge footer closing the card, the headline value size, up and down arrows, the negative chip and chart colors and term-definition pairs in the accessibility tree. No spoken-output assertion.",
1647
+ "state": "stale"
1648
+ }
1649
+ ],
1650
+ "browserEvidence": "needs-rerun",
1651
+ "recheckWhen": [
1652
+ "A reviewed source changes",
1653
+ "A mapped test or its recorded inputs change",
1654
+ "Google revises the linked guidance or before claiming a new release matches it"
1655
+ ]
1656
+ },
1657
+ {
1658
+ "slug": "countdown",
1659
+ "title": "Countdown",
1660
+ "kind": "component",
1661
+ "support": "implemented",
1662
+ "lastReviewedSupport": "implemented",
1663
+ "sourceReview": "source-reviewed",
1664
+ "reviewedOn": "2026-10-08",
1665
+ "scope": "Digits from 0 to 999 that roll up or down when --md-comp-countdown-value changes, with zero padding to two or three digits and a reduced-motion fallback.",
1666
+ "adaptation": "The element's text is the accessible value; the digit strips are generated content with empty alternative text. A page script sets the property and the text together.",
1667
+ "upstream": {
1668
+ "source": "https://m3.material.io/components",
1669
+ "reviewedOn": "2026-10-08",
1670
+ "scope": "web-extension-inventory-reviewed",
1671
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1672
+ "sections": [
1673
+ "No standalone Material component"
1674
+ ],
1675
+ "sources": [],
1676
+ "requirements": "Keep the number in the element's text for assistive technology, avoid announcing every tick and stop the motion when the user asks for reduced motion."
1677
+ },
1678
+ "relationship": "none",
1679
+ "sources": [
1680
+ {
1681
+ "path": "src/sass/components/_countdown.scss",
1682
+ "sha256": "74330fcc3e02b6462f40019d7cd37c680e8a71bf54d7a0be0e7fe3ffaa733d05"
1683
+ }
1684
+ ],
1685
+ "gaps": [
1686
+ {
1687
+ "kind": "verification",
1688
+ "description": "Width, digit positions, the baseline, the roll transition, reduced motion and the accessibility tree text are checked in a browser; spoken output inside role=\"timer\" and aria-live regions remains unverified.",
1689
+ "nextStep": "Run a ticking timer and a polite live count with a screen reader in each engine and confirm the timer stays quiet and the live count announces each value once."
1690
+ }
1691
+ ],
1692
+ "browserChecks": [
1693
+ {
1694
+ "file": "tests/countdown-browser.test.js",
1695
+ "name": "chromium: countdown shows 0 to 999 as rolling digits and keeps the text for assistive technology",
1696
+ "scope": "Box width per digit count and padding, strip positions for in-range and clamped values, baseline alignment, the translate transition on change, reduced motion and the accessibility tree text. No spoken-output assertion.",
1697
+ "state": "stale"
1698
+ }
1699
+ ],
1700
+ "browserEvidence": "needs-rerun",
1701
+ "recheckWhen": [
1702
+ "A reviewed source changes",
1703
+ "A mapped test or its recorded inputs change",
1704
+ "Google revises the linked guidance or before claiming a new release matches it"
1705
+ ]
1706
+ },
1707
+ {
1708
+ "slug": "line-chart",
1709
+ "title": "Line chart",
1710
+ "kind": "component",
1711
+ "support": "implemented",
1712
+ "lastReviewedSupport": "implemented",
1713
+ "sourceReview": "source-reviewed",
1714
+ "reviewedOn": "2026-10-06",
1715
+ "scope": "Smooth monotone lines drawn from a figure's data table, with area, stacked, fade and sparkline modifiers, dashed series, gaps, a fixed y range, x labels, a legend, and a pointer and keyboard tooltip.",
1716
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the SVG is aria-hidden and the plot is one Tab stop with a polite live tooltip.",
1717
+ "upstream": {
1718
+ "source": "https://m3.material.io/components",
1719
+ "reviewedOn": "2026-10-06",
1720
+ "scope": "web-extension-inventory-reviewed",
1721
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1722
+ "sections": [
1723
+ "No standalone Material component"
1724
+ ],
1725
+ "sources": [],
1726
+ "requirements": "Keep the data available as text, name the chart, keep series distinguishable and let a keyboard reach every value the pointer can."
1727
+ },
1728
+ "relationship": "none",
1729
+ "sources": [
1730
+ {
1731
+ "path": "src/sass/abstracts/_mixins.scss",
1732
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
1733
+ },
1734
+ {
1735
+ "path": "src/sass/components/_line-chart.scss",
1736
+ "sha256": "cf8029ceb68d9abb123876fbccc2f83567aaf373354edeab57add74be375c957"
1737
+ },
1738
+ {
1739
+ "path": "src/ts/components/lineChart.ts",
1740
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
1741
+ }
1742
+ ],
1743
+ "gaps": [
1744
+ {
1745
+ "kind": "verification",
1746
+ "description": "Drawing, the hidden table, gaps, the y range, RTL, the tooltip, keyboard movement, forced-color swatches and destroy are checked in a browser; screen reader output and enlarged text remain unverified.",
1747
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; test enlarged text."
1748
+ },
1749
+ {
1750
+ "kind": "feature",
1751
+ "description": "There are no y axis value labels; the grid lines carry no numbers.",
1752
+ "nextStep": "Add optional y labels if charts need values readable without the tooltip."
1753
+ }
1754
+ ],
1755
+ "browserChecks": [
1756
+ {
1757
+ "file": "tests/line-chart-browser.test.js",
1758
+ "name": "chromium: line chart draws its table, keeps it readable and restores it on destroy",
1759
+ "scope": "Hidden table in the accessibility tree, aria-hidden SVG, series classes and colors, labels, legend, the dashed series, no curve overshoot, gaps, data-min, data-max, data-value, a typographic minus, the area modifier, the sparkline size and focus, and destroy restoring the table.",
1760
+ "state": "stale"
1761
+ },
1762
+ {
1763
+ "file": "tests/line-chart-browser.test.js",
1764
+ "name": "chromium: line chart tooltip follows the pointer and the arrow keys",
1765
+ "scope": "Pointer position to row, tooltip text and live region, cursor points, flipping right of centre, hiding on leave, focus, arrows, Home, End and Escape. No spoken-output assertion.",
1766
+ "state": "stale"
1767
+ },
1768
+ {
1769
+ "file": "tests/line-chart-browser.test.js",
1770
+ "name": "chromium: line chart handles cards, headerless tables, RTL, strict values and forced colors",
1771
+ "scope": "A chart in a sized card and in a primary action keeps its own layout and caption, a header row without <thead> is not data, the RTL axis matches its labels and arrow keys, ambiguous cell text is a gap, show() is safe without data and skips a repeated row, stacked bands fill down to the series below or the plot bottom with cursor points on the totals and each cell in the tooltip, a stacked gap breaks the series above it, the stacked range keeps 10% headroom above zero, and swatches keep their series colors in forced colors.",
1772
+ "state": "stale"
1773
+ }
1774
+ ],
1775
+ "browserEvidence": "needs-rerun",
1776
+ "recheckWhen": [
1777
+ "A reviewed source changes",
1778
+ "A mapped test or its recorded inputs change",
1779
+ "Google revises the linked guidance or before claiming a new release matches it"
1780
+ ]
1781
+ },
1782
+ {
1783
+ "slug": "column-chart",
1784
+ "title": "Column chart",
1785
+ "kind": "component",
1786
+ "support": "implemented",
1787
+ "lastReviewedSupport": "implemented",
1788
+ "sourceReview": "source-reviewed",
1789
+ "reviewedOn": "2026-10-07",
1790
+ "scope": "Columns drawn from zero from a figure's data table, grouped by row or stacked, with fade, track and sparkline modifiers, negative values, gaps, a fixed y range, x labels, a legend, and a pointer and keyboard tooltip with a highlight band.",
1791
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the columns are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
1792
+ "upstream": {
1793
+ "source": "https://m3.material.io/components",
1794
+ "reviewedOn": "2026-10-07",
1795
+ "scope": "web-extension-inventory-reviewed",
1796
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1797
+ "sections": [
1798
+ "No standalone Material component"
1799
+ ],
1800
+ "sources": [],
1801
+ "requirements": "Keep the data available as text, name the chart, start columns at zero, keep series distinguishable and let a keyboard reach every value the pointer can."
1802
+ },
1803
+ "relationship": "none",
1804
+ "sources": [
1805
+ {
1806
+ "path": "src/sass/abstracts/_mixins.scss",
1807
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
1808
+ },
1809
+ {
1810
+ "path": "src/sass/components/_column-chart.scss",
1811
+ "sha256": "a8434058d5f4a486061317f871d4cabc433934d8127f9dc216bb47b40b0dbee6"
1812
+ },
1813
+ {
1814
+ "path": "src/ts/components/columnChart.ts",
1815
+ "sha256": "3c8ad721e3abc034c763870081d87a2df0aaf2470d212f03c51086e0ee5deb7d"
1816
+ },
1817
+ {
1818
+ "path": "src/ts/components/lineChart.ts",
1819
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
1820
+ }
1821
+ ],
1822
+ "gaps": [
1823
+ {
1824
+ "kind": "verification",
1825
+ "description": "Drawing, the hidden table, grouped and stacked geometry, gaps, negative values, the y range, RTL, the tooltip, the band, keyboard movement and destroy are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
1826
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
1827
+ },
1828
+ {
1829
+ "kind": "feature",
1830
+ "description": "There are no y axis value labels or range columns.",
1831
+ "nextStep": "Add optional y labels if charts need values readable without the tooltip; add range columns when a page needs them."
1832
+ }
1833
+ ],
1834
+ "browserChecks": [
1835
+ {
1836
+ "file": "tests/column-chart-browser.test.js",
1837
+ "name": "chromium: column chart draws grouped, stacked and negative columns from its table",
1838
+ "scope": "Hidden table in the accessibility tree, the named plot and its role description, labels, legend, series classes, separate instances from line charts, grouped column geometry with an empty slot for a gap, stacked segments on the total below with only the top segment rounded, a gap leaving the segments above out, negative columns from a centred zero, data-min above zero, the sparkline size and focus, and destroy restoring the table.",
1839
+ "state": "stale"
1840
+ },
1841
+ {
1842
+ "file": "tests/column-chart-browser.test.js",
1843
+ "name": "chromium: column chart tooltip and band follow the pointer and the arrow keys",
1844
+ "scope": "Pointer position to row, tooltip text without empty cells, no cursor points, the band's width and position, hiding on leave, focus, End and Escape, and the first row on the right in RTL. No spoken-output assertion.",
1845
+ "state": "stale"
1846
+ }
1847
+ ],
1848
+ "browserEvidence": "needs-rerun",
1849
+ "recheckWhen": [
1850
+ "A reviewed source changes",
1851
+ "A mapped test or its recorded inputs change",
1852
+ "Google revises the linked guidance or before claiming a new release matches it"
1853
+ ]
1854
+ },
1855
+ {
1856
+ "slug": "bar-chart",
1857
+ "title": "Bar chart",
1858
+ "kind": "component",
1859
+ "support": "implemented",
1860
+ "lastReviewedSupport": "implemented",
1861
+ "sourceReview": "source-reviewed",
1862
+ "reviewedOn": "2026-10-07",
1863
+ "scope": "Horizontal bars drawn from zero from a figure's data table, grouped by row or stacked, with split, track, values and sparkline modifiers, negative values, gaps, a fixed value range, row labels, a legend, and a pointer and keyboard tooltip with a highlight band.",
1864
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the bars and their values are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
1865
+ "upstream": {
1866
+ "source": "https://m3.material.io/components",
1867
+ "reviewedOn": "2026-10-07",
1868
+ "scope": "web-extension-inventory-reviewed",
1869
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1870
+ "sections": [
1871
+ "No standalone Material component"
1872
+ ],
1873
+ "sources": [],
1874
+ "requirements": "Keep the data available as text, name the chart, start bars at zero, keep series distinguishable and let a keyboard reach every value the pointer can."
1875
+ },
1876
+ "relationship": "none",
1877
+ "sources": [
1878
+ {
1879
+ "path": "src/sass/abstracts/_mixins.scss",
1880
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
1881
+ },
1882
+ {
1883
+ "path": "src/sass/components/_bar-chart.scss",
1884
+ "sha256": "f819b1e6a9106a7999cc0248e92accdf22e7790d4ea7d66bc1131a4d9602712a"
1885
+ },
1886
+ {
1887
+ "path": "src/ts/components/barChart.ts",
1888
+ "sha256": "0830bb0f5cb198ceff231e622f4ad296efc379ef75c47e8ad826dd336f2e922a"
1889
+ },
1890
+ {
1891
+ "path": "src/ts/components/columnChart.ts",
1892
+ "sha256": "3c8ad721e3abc034c763870081d87a2df0aaf2470d212f03c51086e0ee5deb7d"
1893
+ },
1894
+ {
1895
+ "path": "src/ts/components/lineChart.ts",
1896
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
1897
+ }
1898
+ ],
1899
+ "gaps": [
1900
+ {
1901
+ "kind": "verification",
1902
+ "description": "Drawing, the hidden table, grouped, stacked and split geometry, values, gaps, negative values, the value range, RTL, the tooltip, the band, keyboard movement and destroy are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
1903
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
1904
+ },
1905
+ {
1906
+ "kind": "feature",
1907
+ "description": "There are no value axis labels.",
1908
+ "nextStep": "Add optional value labels if charts need numbers readable without the tooltip."
1909
+ }
1910
+ ],
1911
+ "browserChecks": [
1912
+ {
1913
+ "file": "tests/bar-chart-browser.test.js",
1914
+ "name": "chromium: bar chart draws grouped, stacked and negative bars from its table",
1915
+ "scope": "Hidden table in the accessibility tree, the named plot and its role description, row labels beside the plot, legend, separate instances from column charts, plot height from the rows, grouped and stacked bar geometry read across the plot, split segments, values text inside and past short bars and clipped to stacked segments, split gaps only at joints, the grid cleared in forced colors, negative bars from a centred zero, RTL bars growing leftwards from a dir attribute or CSS direction, the sparkline layout and focus, and destroy restoring the table.",
1916
+ "state": "stale"
1917
+ },
1918
+ {
1919
+ "file": "tests/bar-chart-browser.test.js",
1920
+ "name": "chromium: bar chart tooltip and band follow the pointer and the up and down arrows",
1921
+ "scope": "Pointer height to row, tooltip text, the band's height and position, flipping above the row in the lower half, hiding on leave, focus, arrows, End and Escape, the first row at the top in RTL, and a touch tap showing the tapped row in bar and column charts, kept on lift and hidden on pointer cancel. No spoken-output assertion.",
1922
+ "state": "stale"
1923
+ }
1924
+ ],
1925
+ "browserEvidence": "needs-rerun",
1926
+ "recheckWhen": [
1927
+ "A reviewed source changes",
1928
+ "A mapped test or its recorded inputs change",
1929
+ "Google revises the linked guidance or before claiming a new release matches it"
1930
+ ]
1931
+ },
1932
+ {
1933
+ "slug": "pie-chart",
1934
+ "title": "Pie chart",
1935
+ "kind": "component",
1936
+ "support": "implemented",
1937
+ "lastReviewedSupport": "implemented",
1938
+ "sourceReview": "source-reviewed",
1939
+ "reviewedOn": "2026-10-07",
1940
+ "scope": "Slices drawn clockwise from the top from a figure's data table, with a legend of each row's cell and share, donut, values and sparkline modifiers, a <tfoot> total in the donut hole, further columns in the tooltip, and a pointer and keyboard tooltip that highlights the slice.",
1941
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the slices, values, total and legend are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
1942
+ "upstream": {
1943
+ "source": "https://m3.material.io/components",
1944
+ "reviewedOn": "2026-10-07",
1945
+ "scope": "web-extension-inventory-reviewed",
1946
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1947
+ "sections": [
1948
+ "No standalone Material component"
1949
+ ],
1950
+ "sources": [],
1951
+ "requirements": "Keep the data available as text, name the chart, keep slices distinguishable and their shares readable, and let a keyboard reach every slice the pointer can."
1952
+ },
1953
+ "relationship": "none",
1954
+ "sources": [
1955
+ {
1956
+ "path": "src/sass/abstracts/_mixins.scss",
1957
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
1958
+ },
1959
+ {
1960
+ "path": "src/sass/components/_pie-chart.scss",
1961
+ "sha256": "ea811ee29aff2b8e8407ed419d13491b6b1eb639e28669cdd8c5de512b1dd87e"
1962
+ },
1963
+ {
1964
+ "path": "src/ts/components/lineChart.ts",
1965
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
1966
+ },
1967
+ {
1968
+ "path": "src/ts/components/pieChart.ts",
1969
+ "sha256": "d346e4b9b82814107f71872643a627971a249474de46cbc1f5bf4e4a5282811f"
1970
+ }
1971
+ ],
1972
+ "gaps": [
1973
+ {
1974
+ "kind": "verification",
1975
+ "description": "Drawing, the hidden table, slice geometry and colors, the legend and shares, the donut hole and total, values, zero and missing values, RTL, the tooltip, pointer angle hit testing, keyboard movement and destroy are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
1976
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
1977
+ },
1978
+ {
1979
+ "kind": "feature",
1980
+ "description": "There are no labels outside the pie, and rows past six reuse the colors.",
1981
+ "nextStep": "Add outside labels with leader lines if charts need names on the pie; group small parts into an Other row meanwhile."
1982
+ }
1983
+ ],
1984
+ "browserChecks": [
1985
+ {
1986
+ "file": "tests/pie-chart-browser.test.js",
1987
+ "name": "chromium: pie chart draws slices, a legend and a donut total from its table",
1988
+ "scope": "Hidden table in the accessibility tree, the named plot and its role description, the square plot, slice paths and colors, a seventh color avoiding the first, gap lines, a whole-circle slice, zero rows kept in the legend without a slice, legend cells and shares, separate instances from line charts, the donut hole and <tfoot> total, values only on slices of 5% or more, the sparkline size and focus, and destroy restoring the table.",
1989
+ "state": "stale"
1990
+ },
1991
+ {
1992
+ "file": "tests/pie-chart-browser.test.js",
1993
+ "name": "chromium: pie chart tooltip follows the pointer round the pie and the arrow keys",
1994
+ "scope": "Pointer angle to slice, the active slice, tooltip text with the share and further columns, swatches in the slice color, opening leftwards on the right half, hiding off the pie, focus, all four arrows, wrapping past either end, End and Escape, and clockwise slices and arrows in RTL. No spoken-output assertion.",
1995
+ "state": "stale"
1996
+ }
1997
+ ],
1998
+ "browserEvidence": "needs-rerun",
1999
+ "recheckWhen": [
2000
+ "A reviewed source changes",
2001
+ "A mapped test or its recorded inputs change",
2002
+ "Google revises the linked guidance or before claiming a new release matches it"
2003
+ ]
2004
+ },
2005
+ {
2006
+ "slug": "heatmap-chart",
2007
+ "title": "Heatmap chart",
2008
+ "kind": "component",
2009
+ "support": "implemented",
2010
+ "lastReviewedSupport": "implemented",
2011
+ "sourceReview": "source-reviewed",
2012
+ "reviewedOn": "2026-10-07",
2013
+ "scope": "Every body cell of a figure's data table drawn as a shaded grid cell, with row headers beside the grid, column headers below, a scale naming the lowest and highest cells, values, data-label short or hidden labels, data-min and data-max, gaps, and a pointer and keyboard tooltip that moves cell by cell.",
2014
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the grid, labels and scale are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
2015
+ "upstream": {
2016
+ "source": "https://m3.material.io/components",
2017
+ "reviewedOn": "2026-10-07",
2018
+ "scope": "web-extension-inventory-reviewed",
2019
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2020
+ "sections": [
2021
+ "No standalone Material component"
2022
+ ],
2023
+ "sources": [],
2024
+ "requirements": "Keep the data available as text, name the chart, keep values readable without telling shades apart, and let a keyboard reach every cell the pointer can."
2025
+ },
2026
+ "relationship": "none",
2027
+ "sources": [
2028
+ {
2029
+ "path": "src/sass/abstracts/_mixins.scss",
2030
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
2031
+ },
2032
+ {
2033
+ "path": "src/sass/components/_heatmap-chart.scss",
2034
+ "sha256": "e6c9b7e74463c09ce71d7406e07303ae6e78bd2f44e69f0031b83a337ed8ee11"
2035
+ },
2036
+ {
2037
+ "path": "src/ts/components/heatmapChart.ts",
2038
+ "sha256": "c645df4cbb79baaacbe139fff85610cc033b2cec5091c465160294a634c4b997"
2039
+ },
2040
+ {
2041
+ "path": "src/ts/components/lineChart.ts",
2042
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
2043
+ }
2044
+ ],
2045
+ "gaps": [
2046
+ {
2047
+ "kind": "verification",
2048
+ "description": "Drawing, the hidden table, cell shades and gaps, the fixed scale, values and their text color, short and running labels, the scale ends, RTL, page overflow from a wide table, the tooltip, pointer and keyboard movement round the grid and destroy are checked in Chromium, Firefox and WebKit; screen reader output, forced colors and enlarged text remain unverified.",
2049
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
2050
+ },
2051
+ {
2052
+ "kind": "feature",
2053
+ "description": "A wide grid narrows its cells to fit instead of scrolling, and the scale is one color with no diverging or stepped option.",
2054
+ "nextStep": "Add a scrolling layout that keeps the tooltip visible if year-long grids must work on phones, and a diverging scale if charts need a midpoint."
2055
+ }
2056
+ ],
2057
+ "browserChecks": [
2058
+ {
2059
+ "file": "tests/heatmap-chart-browser.test.js",
2060
+ "name": "chromium: heatmap chart draws a shaded grid and a scale from its table",
2061
+ "scope": "Hidden table in the accessibility tree, the named plot and its role description, aria-hidden grid and scale, cell levels and fills, gaps, the row height, row and column labels, empty and running data-labels, the scale ends, data-min and data-max clamping, values, text that takes the higher-contrast of black and white on saturated and near-threshold colors, the legend over a fixed scale, long row labels capped at 40% of the width, no page overflow from a wide table, a table of gaps left undrawn, separate instances from line charts, and destroy restoring the table.",
2062
+ "state": "stale"
2063
+ },
2064
+ {
2065
+ "file": "tests/heatmap-chart-browser.test.js",
2066
+ "name": "chromium: heatmap chart tooltip follows the pointer and the arrow keys round the grid",
2067
+ "scope": "Pointer to cell by position, the space between cells, a touch drag that keeps its first target, the active cell, tooltip text for cells and gaps, the swatch shade and the outlined gap swatch, a press on a label focusing without a tooltip, opening leftwards on the right half, hiding off the cells, focus, all four arrows stopping at the edges, Home, End and Escape, Escape left uncancelled once the tooltip is hidden, and right-to-left columns with swapped arrows and scale. No spoken-output assertion.",
2068
+ "state": "stale"
2069
+ }
2070
+ ],
2071
+ "browserEvidence": "needs-rerun",
2072
+ "recheckWhen": [
2073
+ "A reviewed source changes",
2074
+ "A mapped test or its recorded inputs change",
2075
+ "Google revises the linked guidance or before claiming a new release matches it"
2076
+ ]
2077
+ },
2078
+ {
2079
+ "slug": "radar-chart",
2080
+ "title": "Radar chart",
2081
+ "kind": "component",
2082
+ "support": "implemented",
2083
+ "lastReviewedSupport": "implemented",
2084
+ "sourceReview": "source-reviewed",
2085
+ "reviewedOn": "2026-10-07",
2086
+ "scope": "Spokes drawn clockwise from the top from a figure's data table, one shape per series from zero in the middle to the scale's top at the rim, row labels past each spoke, a legend for several series, area, points, dashed and sparkline modifiers, data-min and data-max, and a pointer and keyboard tooltip with a cursor spoke.",
2087
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the grid, shapes, labels and legend are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
2088
+ "upstream": {
2089
+ "source": "https://m3.material.io/components",
2090
+ "reviewedOn": "2026-10-07",
2091
+ "scope": "web-extension-inventory-reviewed",
2092
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2093
+ "sections": [
2094
+ "No standalone Material component"
2095
+ ],
2096
+ "sources": [],
2097
+ "requirements": "Keep the data available as text, name the chart, keep series distinguishable and every spoke labelled, and let a keyboard reach every row the pointer can."
2098
+ },
2099
+ "relationship": "none",
2100
+ "sources": [
2101
+ {
2102
+ "path": "src/sass/abstracts/_mixins.scss",
2103
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
2104
+ },
2105
+ {
2106
+ "path": "src/sass/components/_radar-chart.scss",
2107
+ "sha256": "a5f8e6984dfc02b0c7fb2a23f6c1311f733de6b853e0b675c95a58d18da05006"
2108
+ },
2109
+ {
2110
+ "path": "src/ts/components/lineChart.ts",
2111
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
2112
+ },
2113
+ {
2114
+ "path": "src/ts/components/radarChart.ts",
2115
+ "sha256": "ee6c818e8bc8ad11f06d4419e3c45234c2de7cdfaf5eca103b93a1c372d7ba0d"
2116
+ }
2117
+ ],
2118
+ "gaps": [
2119
+ {
2120
+ "kind": "verification",
2121
+ "description": "Drawing, the hidden table, the grid, shape geometry and colors, the scale with data-max and clamping, gaps, labels, the legend, area and points, the sparkline, RTL, the tooltip and cursor spoke, nearest-spoke pointer hit testing, keyboard movement and destroy are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
2122
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
2123
+ },
2124
+ {
2125
+ "kind": "feature",
2126
+ "description": "A gap joins the spokes either side of it rather than breaking the shape, the rings have no value labels, and series past four reuse the colors.",
2127
+ "nextStep": "Mark gaps and label the rings if charts need them; keep to three series meanwhile."
2128
+ }
2129
+ ],
2130
+ "browserChecks": [
2131
+ {
2132
+ "file": "tests/radar-chart-browser.test.js",
2133
+ "name": "chromium: radar chart draws a grid, shapes, labels and a legend from its table",
2134
+ "scope": "Hidden table in the accessibility tree, the named plot and its role description, the square plot, four rings and spokes, shape geometry from zero to data-max with a joined gap and a clamped value, series colors and the dashed class, points, the area fill, labels on their spokes, the legend, separate instances from line charts, no fill, points or legend by default, the sparkline size, focus and hidden labels, and destroy restoring the table.",
2135
+ "state": "stale"
2136
+ },
2137
+ {
2138
+ "file": "tests/radar-chart-browser.test.js",
2139
+ "name": "chromium: radar chart tooltip follows the pointer round the spokes and the arrow keys",
2140
+ "scope": "Nearest spoke by pointer angle inside and past the rim, tooltip text without gaps, opening leftwards on the right half, the cursor spoke and its points, focus, all four arrows, wrapping past either end, End and Escape, and clockwise spokes and arrows in RTL. No spoken-output assertion.",
2141
+ "state": "stale"
2142
+ }
2143
+ ],
2144
+ "browserEvidence": "needs-rerun",
2145
+ "recheckWhen": [
2146
+ "A reviewed source changes",
2147
+ "A mapped test or its recorded inputs change",
2148
+ "Google revises the linked guidance or before claiming a new release matches it"
2149
+ ]
2150
+ },
2151
+ {
2152
+ "slug": "radial-chart",
2153
+ "title": "Radial chart",
2154
+ "kind": "component",
2155
+ "support": "implemented",
2156
+ "lastReviewedSupport": "implemented",
2157
+ "sourceReview": "source-reviewed",
2158
+ "reviewedOn": "2026-10-07",
2159
+ "scope": "Rings drawn clockwise from the top from a figure's data table as a share of data-max, with tracks, a legend of each row's cell for more than one row, gauge and sparkline modifiers, a <tfoot> total in the middle, further columns in the tooltip, and a pointer and keyboard tooltip that highlights the ring.",
2160
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the rings, total and legend are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
2161
+ "upstream": {
2162
+ "source": "https://m3.material.io/components",
2163
+ "reviewedOn": "2026-10-07",
2164
+ "scope": "web-extension-inventory-reviewed",
2165
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2166
+ "sections": [
2167
+ "No standalone Material component"
2168
+ ],
2169
+ "sources": [],
2170
+ "requirements": "Keep the data available as text, name the chart, keep rings distinguishable and their values readable, and let a keyboard reach every ring the pointer can."
2171
+ },
2172
+ "relationship": "none",
2173
+ "sources": [
2174
+ {
2175
+ "path": "src/sass/abstracts/_mixins.scss",
2176
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
2177
+ },
2178
+ {
2179
+ "path": "src/sass/components/_radial-chart.scss",
2180
+ "sha256": "4ebff333a3820b516fac11c5be053041d0d5c8a9841b579f35ef47e6cdc247fb"
2181
+ },
2182
+ {
2183
+ "path": "src/ts/components/lineChart.ts",
2184
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
2185
+ },
2186
+ {
2187
+ "path": "src/ts/components/radialChart.ts",
2188
+ "sha256": "2d6acf36785432d8c8ad32adc3aabe0441ad41efe7f14e78c707b1077b7e548e"
2189
+ }
2190
+ ],
2191
+ "gaps": [
2192
+ {
2193
+ "kind": "verification",
2194
+ "description": "Drawing, the hidden table, ring geometry and colors, tracks, the legend, the <tfoot> total, the gauge's half circles, values past the maximum and missing values, thinning crowded rings, RTL, the tooltip, pointer distance hit testing, keyboard movement and destroy are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
2195
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
2196
+ },
2197
+ {
2198
+ "kind": "feature",
2199
+ "description": "There are no labels on the rings, no gradient or segmented fills, and rings past four reuse the colors.",
2200
+ "nextStep": "Add ring-start labels if charts need names on the rings; keep to four rings and use the legend meanwhile."
2201
+ }
2202
+ ],
2203
+ "browserChecks": [
2204
+ {
2205
+ "file": "tests/radial-chart-browser.test.js",
2206
+ "name": "chromium: radial chart draws rings, a legend and a total from its table",
2207
+ "scope": "Hidden table in the accessibility tree, the named plot and its role description, the square plot, ring radii, widths, colors and dash shares, tracks, an empty ring for a missing value, legend cells, separate instances from line charts, the gauge's box, half-circle dash, round track caps and <tfoot> total, no legend for one ring, thinner crowded rings, a value past the maximum, the sparkline size and focus in a flex row, and destroy restoring the table.",
2208
+ "state": "stale"
2209
+ },
2210
+ {
2211
+ "file": "tests/radial-chart-browser.test.js",
2212
+ "name": "chromium: radial chart tooltip follows the pointer across the rings and the arrow keys",
2213
+ "scope": "Pointer distance to ring, gaps split between rings, the active ring, tooltip text with further columns, swatches in the ring color, opening direction, hiding in the middle, off the rings and below a gauge's base line, focus, all four arrows, End and Escape, and clockwise rings with swapped arrows in RTL. No spoken-output assertion.",
2214
+ "state": "stale"
2215
+ }
2216
+ ],
2217
+ "browserEvidence": "needs-rerun",
2218
+ "recheckWhen": [
2219
+ "A reviewed source changes",
2220
+ "A mapped test or its recorded inputs change",
2221
+ "Google revises the linked guidance or before claiming a new release matches it"
2222
+ ]
2223
+ },
2224
+ {
2225
+ "slug": "mixed-chart",
2226
+ "title": "Mixed chart",
2227
+ "kind": "component",
2228
+ "support": "implemented",
2229
+ "lastReviewedSupport": "implemented",
2230
+ "sourceReview": "source-reviewed",
2231
+ "reviewedOn": "2026-10-07",
2232
+ "scope": "Columns, smooth lines and areas drawn per series from a figure's data table by header class, with dashed lines, a second scale for end series with its own fixed range, x labels, a legend, a sparkline modifier, and a pointer and keyboard tooltip with points on the lines.",
2233
+ "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the columns and SVG are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
2234
+ "upstream": {
2235
+ "source": "https://m3.material.io/components",
2236
+ "reviewedOn": "2026-10-07",
2237
+ "scope": "web-extension-inventory-reviewed",
2238
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2239
+ "sections": [
2240
+ "No standalone Material component"
2241
+ ],
2242
+ "sources": [],
2243
+ "requirements": "Keep the data available as text, name the chart, keep series distinguishable without color alone, state each scale's units, and let a keyboard reach every row the pointer can."
2244
+ },
2245
+ "relationship": "none",
2246
+ "sources": [
2247
+ {
2248
+ "path": "src/sass/abstracts/_mixins.scss",
2249
+ "sha256": "df530a22fb6b17740054c81ec3ae63c2199726c103e661885ec9bcad0d0f8f4c"
2250
+ },
2251
+ {
2252
+ "path": "src/sass/components/_mixed-chart.scss",
2253
+ "sha256": "4195fbf13249ef7bf4da8560f5b0ccbc715367f2b5771c3b96a255af4b9e39bb"
2254
+ },
2255
+ {
2256
+ "path": "src/ts/components/columnChart.ts",
2257
+ "sha256": "3c8ad721e3abc034c763870081d87a2df0aaf2470d212f03c51086e0ee5deb7d"
2258
+ },
2259
+ {
2260
+ "path": "src/ts/components/lineChart.ts",
2261
+ "sha256": "6fdb7471049d342a5e66aa30ba84857208c7d2ed167223b26578e62b9437d960"
2262
+ },
2263
+ {
2264
+ "path": "src/ts/components/mixedChart.ts",
2265
+ "sha256": "3c4bc2efee52a5ec53e9318467e9802efbe17b016b4d977c0b3a95ba0f4b52ba"
2266
+ }
2267
+ ],
2268
+ "gaps": [
2269
+ {
2270
+ "kind": "verification",
2271
+ "description": "Drawing, the hidden table, both scales, gaps, the legend, the tooltip, cursor points and keyboard movement are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
2272
+ "nextStep": "Read a chart with a screen reader in each engine and confirm the table and the live tooltip are announced; check forced colors and enlarged text."
2273
+ },
2274
+ {
2275
+ "kind": "feature",
2276
+ "description": "There are no y axis labels for either scale, no always-on line markers, no stacked columns and no straight-line option.",
2277
+ "nextStep": "Add y axis labels to the shared chart parts if charts need them; name the units in the caption meanwhile."
2278
+ }
2279
+ ],
2280
+ "browserChecks": [
2281
+ {
2282
+ "file": "tests/mixed-chart-browser.test.js",
2283
+ "name": "chromium: mixed chart draws columns, areas and lines on two scales",
2284
+ "scope": "Hidden table, the named plot and its role description, column positions on the start scale with an empty slot for a gap, area and dashed line classes and colors, an area fill only on area series, a fixed end scale, a fitted end scale shared by two series, legend order, separate instances from column charts, a chart of gaps showing its table, and the tooltip and cursor points from the keyboard. No spoken-output assertion.",
2285
+ "state": "stale"
2286
+ }
2287
+ ],
2288
+ "browserEvidence": "needs-rerun",
2289
+ "recheckWhen": [
2290
+ "A reviewed source changes",
2291
+ "A mapped test or its recorded inputs change",
2292
+ "Google revises the linked guidance or before claiming a new release matches it"
2293
+ ]
2294
+ },
2295
+ {
2296
+ "slug": "timeline",
2297
+ "title": "Timeline",
2298
+ "kind": "component",
2299
+ "support": "implemented",
2300
+ "lastReviewedSupport": "implemented",
2301
+ "sourceReview": "source-reviewed",
2302
+ "reviewedOn": "2026-10-06",
2303
+ "scope": "Ordered events with times, headings and text, dots joined by a line and a leading icon variant.",
2304
+ "adaptation": "An <ol> of events with <time datetime>; the dots and line are decoration.",
2305
+ "upstream": {
2306
+ "source": "https://m3.material.io/components",
2307
+ "reviewedOn": "2026-10-06",
2308
+ "scope": "web-extension-inventory-reviewed",
2309
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2310
+ "sections": [
2311
+ "No standalone Material component"
2312
+ ],
2313
+ "sources": [],
2314
+ "requirements": "Keep events in an ordered list in the order shown, give each a machine-readable time and hide decorative markers and icons."
2315
+ },
2316
+ "relationship": "none",
2317
+ "sources": [
2318
+ {
2319
+ "path": "src/sass/components/_timeline.scss",
2320
+ "sha256": "75d0c9d03e48ca32661b641bdab7890e2e50b3f6d17338bdfc4cb1977c7fc817"
2321
+ }
2322
+ ],
2323
+ "gaps": [
2324
+ {
2325
+ "kind": "verification",
2326
+ "description": "Marker and line geometry in LTR and RTL and the icon variant are checked in a browser; long feeds, enlarged text and spoken output remain unverified.",
2327
+ "nextStep": "Read a timeline with a screen reader in each engine and confirm the order and times are announced; test enlarged text."
2328
+ }
2329
+ ],
2330
+ "browserChecks": [
2331
+ {
2332
+ "file": "tests/timeline-browser.test.js",
2333
+ "name": "chromium: timeline marks each event, joins it to the next and swaps the dot for an icon",
2334
+ "scope": "Marker column, dot size, connecting line and its absence on the last event, the icon circle and its column in LTR and RTL. No spoken-output assertion.",
2335
+ "state": "stale"
2336
+ }
2337
+ ],
2338
+ "browserEvidence": "needs-rerun",
2339
+ "recheckWhen": [
2340
+ "A reviewed source changes",
2341
+ "A mapped test or its recorded inputs change",
2342
+ "Google revises the linked guidance or before claiming a new release matches it"
2343
+ ]
2344
+ },
2345
+ {
2346
+ "slug": "dialogs",
2347
+ "title": "Dialogs",
2348
+ "kind": "component",
2349
+ "support": "unassessed",
2350
+ "lastReviewedSupport": "implemented",
2351
+ "sourceReview": "needs-review",
2352
+ "reviewedOn": "2026-09-18",
2353
+ "scope": "Basic and full-screen dialogs.",
2354
+ "adaptation": "Native dialog.showModal()/close(); shared dialog behavior is separate from AutoInit.",
2355
+ "upstream": {
2356
+ "source": "https://m3.material.io/components/dialogs/overview",
2357
+ "reviewedOn": "2026-09-13",
2358
+ "scope": "overview-specs-guidelines-accessibility-prose-reviewed",
2359
+ "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."
2360
+ },
2361
+ "relationship": "component",
2362
+ "sources": [
2363
+ {
2364
+ "path": "src/sass/components/_dialog.scss",
2365
+ "sha256": "f1278118f971cae292378b5496954fe38d9a4577717b733ff554b1dffa4747fd"
2366
+ },
2367
+ {
2368
+ "path": "src/ts/behaviors/dialogs.ts",
2369
+ "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
2370
+ }
2371
+ ],
2372
+ "gaps": [],
2373
+ "browserChecks": [],
2374
+ "browserEvidence": "no-mapped-checks",
2375
+ "recheckWhen": [
2376
+ "A reviewed source changes",
2377
+ "A mapped test or its recorded inputs change",
2378
+ "Google revises the linked guidance or before claiming a new release matches it"
2379
+ ]
2380
+ },
2381
+ {
2382
+ "slug": "bottom-sheet",
2383
+ "title": "Bottom sheet",
2384
+ "kind": "component",
2385
+ "support": "unassessed",
2386
+ "lastReviewedSupport": "implemented",
2387
+ "sourceReview": "needs-review",
2388
+ "reviewedOn": "2026-09-18",
2389
+ "scope": "Standard and modal bottom sheets.",
2390
+ "adaptation": "Native dialog.show()/showModal(); shared runtime handles dragging and dismissal.",
2391
+ "upstream": {
2392
+ "source": "https://m3.material.io/components/bottom-sheets/overview",
2393
+ "reviewedOn": "2026-09-13",
2394
+ "scope": "requirements-prose-reviewed",
2395
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
2396
+ "sections": [
2397
+ "Overview",
2398
+ "Specs",
2399
+ "Guidelines",
2400
+ "Accessibility"
2401
+ ],
2402
+ "sources": [
2403
+ "https://m3.material.io/components/bottom-sheets/overview",
2404
+ "https://m3.material.io/components/bottom-sheets/specs",
2405
+ "https://m3.material.io/components/bottom-sheets/guidelines",
2406
+ "https://m3.material.io/components/bottom-sheets/accessibility"
2407
+ ],
2408
+ "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."
2409
+ },
2410
+ "relationship": "component",
2411
+ "sources": [
2412
+ {
2413
+ "path": "src/sass/components/_bottom-sheet.scss",
2414
+ "sha256": "3769e3b98da7466d2fcb0503c0d47e28788d65bbf436a904c43b6e6eb59c208e"
2415
+ },
2416
+ {
2417
+ "path": "src/sass/components/_dialog.scss",
2418
+ "sha256": "f1278118f971cae292378b5496954fe38d9a4577717b733ff554b1dffa4747fd"
2419
+ },
2420
+ {
2421
+ "path": "src/ts/behaviors/dialogs.ts",
2422
+ "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
2423
+ },
2424
+ {
2425
+ "path": "src/ts/behaviors/bottomSheets.ts",
2426
+ "sha256": "3f3ae0c8b1cc1247ba75cd1e13c8c2a9a0fad5d284b51f6efac5887a78c3dcf7"
2427
+ },
2428
+ {
2429
+ "path": "src/ts/behaviors/sheetDrag.ts",
2430
+ "sha256": "a859bc0cfc2ae1522d387b50aab56e82be7071eeef243f6f00410a5fe48f9c8b"
2431
+ }
2432
+ ],
2433
+ "gaps": [
2434
+ {
2435
+ "kind": "integration",
2436
+ "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.",
2437
+ "nextStep": "Use explicit close controls; verify application-owned height changes, native zoom and physical touch separately."
2438
+ }
2439
+ ],
2440
+ "browserChecks": [
2441
+ {
2442
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2443
+ "name": "chromium: remaining sheet variants retain native modal focus and explicit close actions",
2444
+ "scope": "Each native dialog variant: modal containment, Escape, explicit close/return focus and nonmodal outside focus. No drag or long-content assertion.",
2445
+ "state": "stale"
2446
+ },
2447
+ {
2448
+ "file": "tests/menu-field-browser.test.js",
2449
+ "name": "Sheets cancel only the active pointer and clean interrupted drags (chromium)",
2450
+ "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.",
2451
+ "state": "stale"
2452
+ },
2453
+ {
2454
+ "file": "tests/menu-field-browser.test.js",
2455
+ "name": "Bottom sheets keep long content and actions reachable at compact widths (chromium)",
2456
+ "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.",
2457
+ "state": "stale"
2458
+ }
2459
+ ],
2460
+ "browserEvidence": "needs-rerun",
2461
+ "recheckWhen": [
2462
+ "A reviewed source changes",
2463
+ "A mapped test or its recorded inputs change",
2464
+ "Google revises the linked guidance or before claiming a new release matches it"
2465
+ ]
2466
+ },
2467
+ {
2468
+ "slug": "side-sheet",
2469
+ "title": "Side sheet",
2470
+ "kind": "component",
2471
+ "support": "unassessed",
2472
+ "lastReviewedSupport": "implemented",
2473
+ "sourceReview": "needs-review",
2474
+ "reviewedOn": "2026-09-18",
2475
+ "scope": "Standard and modal side sheets.",
2476
+ "adaptation": "Native dialog and shared drag/dismiss behavior.",
2477
+ "upstream": {
2478
+ "source": "https://m3.material.io/components/side-sheets/overview",
2479
+ "reviewedOn": "2026-09-13",
2480
+ "scope": "requirements-prose-reviewed",
2481
+ "note": "Requirements and boundaries: design reference layout-material-review. Full visual parity and spoken output unverified.",
2482
+ "sections": [
2483
+ "Overview",
2484
+ "Specs",
2485
+ "Guidelines",
2486
+ "Accessibility"
2487
+ ],
2488
+ "sources": [
2489
+ "https://m3.material.io/components/side-sheets/overview",
2490
+ "https://m3.material.io/components/side-sheets/specs",
2491
+ "https://m3.material.io/components/side-sheets/guidelines",
2492
+ "https://m3.material.io/components/side-sheets/accessibility"
2493
+ ],
2494
+ "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."
2495
+ },
2496
+ "relationship": "component",
2497
+ "sources": [
2498
+ {
2499
+ "path": "src/sass/components/_side-sheet.scss",
2500
+ "sha256": "1fa872f766de3e3cae5144da9df5d3ec70bcd6db74b85351d1f718285145beba"
2501
+ },
2502
+ {
2503
+ "path": "src/sass/components/_dialog.scss",
2504
+ "sha256": "f1278118f971cae292378b5496954fe38d9a4577717b733ff554b1dffa4747fd"
2505
+ },
2506
+ {
2507
+ "path": "src/ts/behaviors/dialogs.ts",
2508
+ "sha256": "5fc476d1f93312f8cbd88c1df7301aa8a49cc9a459c121e4d1fa5881a759a4f7"
2509
+ },
2510
+ {
2511
+ "path": "src/ts/behaviors/sideSheets.ts",
2512
+ "sha256": "88d4923d0ef1cd15c310374e4868bcfba9d72782e65eb5d658f114db7a09f6b2"
2513
+ },
2514
+ {
2515
+ "path": "src/ts/behaviors/sheetDrag.ts",
2516
+ "sha256": "a859bc0cfc2ae1522d387b50aab56e82be7071eeef243f6f00410a5fe48f9c8b"
2517
+ }
2518
+ ],
2519
+ "gaps": [
2520
+ {
2521
+ "kind": "verification",
2522
+ "description": "Browser checks cover logical aliases, RTL dragging, cancellation and enlarged translated text. Native zoom, spoken output and physical touch remain unverified.",
2523
+ "nextStep": "Complete docs/agents/accessibility-manual-review.md on actual devices and assistive technology."
2524
+ }
2525
+ ],
2526
+ "browserChecks": [
2527
+ {
2528
+ "file": "tests/menu-field-browser.test.js",
2529
+ "name": "Side sheet rendered docking and drag direction (chromium)",
1376
2530
  "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
2531
  "state": "stale"
1378
2532
  },
@@ -1482,7 +2636,7 @@
1482
2636
  "sources": [
1483
2637
  {
1484
2638
  "path": "src/sass/components/_badges.scss",
1485
- "sha256": "1d9ade7617c30f8584cfee9b3f2fe5d3c5d39f5ed7fa2fd362a9f8205fa15693"
2639
+ "sha256": "f249dc305b207a60c642863fb652282310e956049ec3e7eff51782c962b4bd26"
1486
2640
  }
1487
2641
  ],
1488
2642
  "gaps": [
@@ -1507,6 +2661,56 @@
1507
2661
  "Google revises the linked guidance or before claiming a new release matches it"
1508
2662
  ]
1509
2663
  },
2664
+ {
2665
+ "slug": "avatar",
2666
+ "title": "Avatar",
2667
+ "kind": "component",
2668
+ "support": "implemented",
2669
+ "lastReviewedSupport": "implemented",
2670
+ "sourceReview": "source-reviewed",
2671
+ "reviewedOn": "2026-10-06",
2672
+ "scope": "Image, initials and icon avatars in three sizes, and overlapping groups with a surface ring and a count avatar.",
2673
+ "adaptation": "An <img> or a <span> with role=\"img\" and a name; initials scale with the size token.",
2674
+ "upstream": {
2675
+ "source": "https://m3.material.io/components",
2676
+ "reviewedOn": "2026-10-06",
2677
+ "scope": "web-extension-inventory-reviewed",
2678
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2679
+ "sections": [
2680
+ "No standalone Material component"
2681
+ ],
2682
+ "sources": [],
2683
+ "requirements": "Name each person once through alt text or role=\"img\" with a label, hide avatars beside a visible name and keep group counts understandable without the picture."
2684
+ },
2685
+ "relationship": "none",
2686
+ "sources": [
2687
+ {
2688
+ "path": "src/sass/components/_avatar.scss",
2689
+ "sha256": "07b6f8fef3f3a65943f319bc034520b11eae4bd6b41feade183f51fcd2e5cf47"
2690
+ }
2691
+ ],
2692
+ "gaps": [
2693
+ {
2694
+ "kind": "verification",
2695
+ "description": "Sizes, the circle, the group overlap and named initials are checked in a browser; image loading failures, enlarged text and spoken output remain unverified.",
2696
+ "nextStep": "Read a group of avatars with a screen reader and confirm each name and the count are announced once; test enlarged text and RTL."
2697
+ }
2698
+ ],
2699
+ "browserChecks": [
2700
+ {
2701
+ "file": "tests/avatar-browser.test.js",
2702
+ "name": "chromium: avatar sizes its circle, names its initials and overlaps a group",
2703
+ "scope": "Default, small and large sizes, circle radius, image and initials names in the accessibility tree, and the group overlap in LTR and RTL. No spoken-output assertion.",
2704
+ "state": "stale"
2705
+ }
2706
+ ],
2707
+ "browserEvidence": "needs-rerun",
2708
+ "recheckWhen": [
2709
+ "A reviewed source changes",
2710
+ "A mapped test or its recorded inputs change",
2711
+ "Google revises the linked guidance or before claiming a new release matches it"
2712
+ ]
2713
+ },
1510
2714
  {
1511
2715
  "slug": "tooltips",
1512
2716
  "title": "Tooltips",
@@ -1527,11 +2731,11 @@
1527
2731
  "sources": [
1528
2732
  {
1529
2733
  "path": "src/sass/components/_tooltip.scss",
1530
- "sha256": "cfd11ea9b5934690458973587b8fa76cd0253badbe1c78e345e29f7a477cc35b"
2734
+ "sha256": "47e378ebf6b884e740d4e204e1b98ae83b7d7ed1174d3a09b223b68390004496"
1531
2735
  },
1532
2736
  {
1533
2737
  "path": "src/ts/components/tooltip.ts",
1534
- "sha256": "2f9fced2c2d0887cfe3db4bc131507ee3cb871a1198a02b7e2f3fa7fdcaab4d3"
2738
+ "sha256": "1fb60d8396973881ea030378fb3d3110e5a8686e586726dfb310f7ef79bcfb7f"
1535
2739
  }
1536
2740
  ],
1537
2741
  "gaps": [],
@@ -1568,6 +2772,56 @@
1568
2772
  "Google revises the linked guidance or before claiming a new release matches it"
1569
2773
  ]
1570
2774
  },
2775
+ {
2776
+ "slug": "popover",
2777
+ "title": "Popover",
2778
+ "kind": "component",
2779
+ "support": "implemented",
2780
+ "lastReviewedSupport": "implemented",
2781
+ "sourceReview": "source-reviewed",
2782
+ "reviewedOn": "2026-10-06",
2783
+ "scope": "Native popover panels anchored below, above or beside their button with automatic flipping, rich-tooltip styling, an actions row and frosted glass.",
2784
+ "adaptation": "The browser owns opening, light dismiss, Escape, focus return and the button's expanded state; CSS anchor positioning places the panel.",
2785
+ "upstream": {
2786
+ "source": "https://m3.material.io/components",
2787
+ "reviewedOn": "2026-10-06",
2788
+ "scope": "web-extension-inventory-reviewed",
2789
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
2790
+ "sections": [
2791
+ "No standalone Material component"
2792
+ ],
2793
+ "sources": [],
2794
+ "requirements": "Open on press rather than hover, report the expanded state on the button, return focus on dismissal, keep the panel next in reading order and keep it within the viewport."
2795
+ },
2796
+ "relationship": "none",
2797
+ "sources": [
2798
+ {
2799
+ "path": "src/sass/components/_popover.scss",
2800
+ "sha256": "62b149ae34e4e786a1a02a4a12e2208eaff63c08e54fe0a090397b6dd24e4437"
2801
+ }
2802
+ ],
2803
+ "gaps": [
2804
+ {
2805
+ "kind": "verification",
2806
+ "description": "Anchoring and flipping in LTR and RTL, light dismiss, Escape and focus return are checked in a browser, and the expanded state in Chromium; spoken output and engines without anchor positioning remain unverified.",
2807
+ "nextStep": "Open a toggletip with a screen reader in each engine and confirm the expanded state and the panel content are reachable; check an engine without anchor positioning."
2808
+ }
2809
+ ],
2810
+ "browserChecks": [
2811
+ {
2812
+ "file": "tests/popover-browser.test.js",
2813
+ "name": "chromium: popover anchors to its button, flips at the edge and stays open while used",
2814
+ "scope": "Default, top and end placement against the button in LTR and RTL, both-axis flip at the viewport corner, Escape with focus return, outside click, staying open for an inner button, one auto popover at a time and the Chromium expanded state. No spoken-output assertion.",
2815
+ "state": "stale"
2816
+ }
2817
+ ],
2818
+ "browserEvidence": "needs-rerun",
2819
+ "recheckWhen": [
2820
+ "A reviewed source changes",
2821
+ "A mapped test or its recorded inputs change",
2822
+ "Google revises the linked guidance or before claiming a new release matches it"
2823
+ ]
2824
+ },
1571
2825
  {
1572
2826
  "slug": "snackbar",
1573
2827
  "title": "Snackbar",
@@ -1599,11 +2853,11 @@
1599
2853
  "sources": [
1600
2854
  {
1601
2855
  "path": "src/sass/components/_snackbar.scss",
1602
- "sha256": "538018b8fc0728c1d2933507cb6dd1c24ea6db1e8924449fb9b4e132c3c53d4e"
2856
+ "sha256": "2558492a9f9650e5872a15632d3c90b5a02bedd9e675fa33767377685714d4f0"
1603
2857
  },
1604
2858
  {
1605
2859
  "path": "src/ts/components/snackbar.ts",
1606
- "sha256": "a041948479ad04cf3e32cfaafa9aebfaa0816f32bbb2f99b2e7c42bf8c23083c"
2860
+ "sha256": "0fa8bf5e3c774b76c846b1e8c6e35e8d0f6b05bb18e1c486f9a387d9a8e179dd"
1607
2861
  }
1608
2862
  ],
1609
2863
  "gaps": [
@@ -1668,7 +2922,7 @@
1668
2922
  "sources": [
1669
2923
  {
1670
2924
  "path": "src/sass/components/_progress.scss",
1671
- "sha256": "3ef3fc4af36bed45813e0533b93ca1242b4169298c8d9e5eb899ffa6fb9e6266"
2925
+ "sha256": "2d83fa4f8072f6944b9069c397b366d2318823ed8c5c040229b59e504ccba0e2"
1672
2926
  }
1673
2927
  ],
1674
2928
  "gaps": [
@@ -1697,9 +2951,117 @@
1697
2951
  "state": "stale"
1698
2952
  },
1699
2953
  {
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.",
2954
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
2955
+ "name": "chromium: progress remains visible in forced colors",
2956
+ "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.",
2957
+ "state": "stale"
2958
+ }
2959
+ ],
2960
+ "browserEvidence": "needs-rerun",
2961
+ "recheckWhen": [
2962
+ "A reviewed source changes",
2963
+ "A mapped test or its recorded inputs change",
2964
+ "Google revises the linked guidance or before claiming a new release matches it"
2965
+ ]
2966
+ },
2967
+ {
2968
+ "slug": "loading-indicator",
2969
+ "title": "Loading indicator",
2970
+ "kind": "component",
2971
+ "support": "unassessed",
2972
+ "lastReviewedSupport": "implemented",
2973
+ "sourceReview": "needs-review",
2974
+ "reviewedOn": "2026-09-13",
2975
+ "scope": "Uncontained and contained morphing loading indicator.",
2976
+ "adaptation": "CSS-only; the author supplies an accessible waiting message.",
2977
+ "upstream": {
2978
+ "source": "https://m3.material.io/components/loading-indicator/overview",
2979
+ "reviewedOn": "2026-09-13",
2980
+ "scope": "requirements-prose-reviewed",
2981
+ "note": "Requirements and boundaries: design reference feedback-material-review. Full visual parity and spoken output unverified.",
2982
+ "sections": [
2983
+ "Overview/M3 Expressive update",
2984
+ "Guidelines/Usage, Container (optional), Responsive layout, Behavior",
2985
+ "Accessibility/Use cases, Interaction & style, Labeling elements",
2986
+ "Overview/M3 Expressive update: replacement guidance"
2987
+ ],
2988
+ "sources": [
2989
+ "https://m3.material.io/components/loading-indicator/overview",
2990
+ "https://m3.material.io/components/loading-indicator/specs",
2991
+ "https://m3.material.io/components/loading-indicator/guidelines",
2992
+ "https://m3.material.io/components/loading-indicator/accessibility"
2993
+ ],
2994
+ "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."
2995
+ },
2996
+ "relationship": "component",
2997
+ "sources": [
2998
+ {
2999
+ "path": "src/sass/components/_loading-indicator.scss",
3000
+ "sha256": "1121e043f42b471963aa823d9c5d651306ab7aeed135bee7a1427c5afe7e5228"
3001
+ }
3002
+ ],
3003
+ "gaps": [
3004
+ {
3005
+ "kind": "integration",
3006
+ "description": "The framework requires a named status while Google recommends progressbar; an indeterminate progressbar validly omits aria-valuenow.",
3007
+ "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."
3008
+ }
3009
+ ],
3010
+ "browserChecks": [
3011
+ {
3012
+ "file": "tests/expressivecss-web-accessibility-browser.test.js",
3013
+ "name": "chromium: remaining progress and loading variants stop spatial motion",
3014
+ "scope": "Named progress state, reduced-motion animation removal and visible custom static fill; no spoken-delivery assertion.",
3015
+ "state": "stale"
3016
+ }
3017
+ ],
3018
+ "browserEvidence": "needs-rerun",
3019
+ "recheckWhen": [
3020
+ "A reviewed source changes",
3021
+ "A mapped test or its recorded inputs change",
3022
+ "Google revises the linked guidance or before claiming a new release matches it"
3023
+ ]
3024
+ },
3025
+ {
3026
+ "slug": "skeleton",
3027
+ "title": "Skeleton",
3028
+ "kind": "component",
3029
+ "support": "implemented",
3030
+ "lastReviewedSupport": "implemented",
3031
+ "sourceReview": "source-reviewed",
3032
+ "reviewedOn": "2026-10-06",
3033
+ "scope": "Box, text line and circle shapes with a shimmer that reverses in RTL, stops under reduced motion and keeps an outline in forced colors.",
3034
+ "adaptation": "Empty decorative blocks; the page marks the loading region aria-busy and reports the wait through a status.",
3035
+ "upstream": {
3036
+ "source": "https://m3.material.io/components",
3037
+ "reviewedOn": "2026-10-06",
3038
+ "scope": "web-extension-inventory-reviewed",
3039
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
3040
+ "sections": [
3041
+ "No standalone Material component"
3042
+ ],
3043
+ "sources": [],
3044
+ "requirements": "Keep placeholders out of the accessibility tree, report the wait through a status, clear aria-busy when content arrives and stop motion when reduced motion is requested."
3045
+ },
3046
+ "relationship": "none",
3047
+ "sources": [
3048
+ {
3049
+ "path": "src/sass/components/_skeleton.scss",
3050
+ "sha256": "f22efd82847af981cf225a0991a471e5fd25f7cdb07c1e0ec80195e937b13818"
3051
+ }
3052
+ ],
3053
+ "gaps": [
3054
+ {
3055
+ "kind": "verification",
3056
+ "description": "The shimmer, its reduced-motion stop and the absence of skeletons from the accessibility tree are checked in a browser; status announcements and spoken output remain unverified.",
3057
+ "nextStep": "Load content into an aria-busy region with a screen reader and confirm the status is announced once and the skeletons are not; test forced colors."
3058
+ }
3059
+ ],
3060
+ "browserChecks": [
3061
+ {
3062
+ "file": "tests/skeleton-browser.test.js",
3063
+ "name": "chromium: skeleton shimmers, stops under reduced motion and stays out of the accessibility tree",
3064
+ "scope": "Running shimmer animation, its removal under reduced motion, reversed direction in RTL, text and circle geometry and no skeleton nodes in the accessibility tree. No spoken-output assertion.",
1703
3065
  "state": "stale"
1704
3066
  }
1705
3067
  ],
@@ -1711,53 +3073,45 @@
1711
3073
  ]
1712
3074
  },
1713
3075
  {
1714
- "slug": "loading-indicator",
1715
- "title": "Loading indicator",
3076
+ "slug": "empty-state",
3077
+ "title": "Empty state",
1716
3078
  "kind": "component",
1717
- "support": "unassessed",
3079
+ "support": "implemented",
1718
3080
  "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.",
3081
+ "sourceReview": "source-reviewed",
3082
+ "reviewedOn": "2026-10-06",
3083
+ "scope": "Centered icon in a tonal circle or an illustration, a heading, supporting text and a wrapping row of actions.",
3084
+ "adaptation": "A plain div around authored heading, text and buttons; the page picks the heading level.",
1723
3085
  "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.",
3086
+ "source": "https://m3.material.io/components",
3087
+ "reviewedOn": "2026-10-06",
3088
+ "scope": "web-extension-inventory-reviewed",
3089
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
1728
3090
  "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"
3091
+ "No standalone Material component"
1739
3092
  ],
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."
3093
+ "sources": [],
3094
+ "requirements": "State what is empty and what to do next in text, keep the heading in the page outline, hide decorative icons and images and announce results that change after a search."
1741
3095
  },
1742
- "relationship": "component",
3096
+ "relationship": "none",
1743
3097
  "sources": [
1744
3098
  {
1745
- "path": "src/sass/components/_loading-indicator.scss",
1746
- "sha256": "1121e043f42b471963aa823d9c5d651306ab7aeed135bee7a1427c5afe7e5228"
3099
+ "path": "src/sass/components/_empty-state.scss",
3100
+ "sha256": "5740d50963b3e2cb7a62330f0260d4b1a0c89ff2bc051c9bb83f82e23dbdcabe"
1747
3101
  }
1748
3102
  ],
1749
3103
  "gaps": [
1750
3104
  {
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."
3105
+ "kind": "verification",
3106
+ "description": "Centering, the icon circle and the actions row are checked in a browser; announcements when a search empties a list and spoken output remain unverified.",
3107
+ "nextStep": "Empty a filtered list with a screen reader and confirm the change is announced; test enlarged text and narrow widths."
1754
3108
  }
1755
3109
  ],
1756
3110
  "browserChecks": [
1757
3111
  {
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.",
3112
+ "file": "tests/empty-state-browser.test.js",
3113
+ "name": "chromium: empty state centers its content and rings the leading icon",
3114
+ "scope": "Centered column, icon circle size and fill, text width cap, centered wrapping actions and an empty alt image left out of the accessibility tree. No spoken-output assertion.",
1761
3115
  "state": "stale"
1762
3116
  }
1763
3117
  ],
@@ -1801,11 +3155,11 @@
1801
3155
  "sources": [
1802
3156
  {
1803
3157
  "path": "src/sass/components/_carousel.scss",
1804
- "sha256": "5a9a8e459c61e84fa4d205fd25e9fd7520f0c80489ad816ba6198fe3ebd71f3f"
3158
+ "sha256": "b6d452e406fa9f34759bd55256c1a2303a6909b2ee3ec6714a67091e8d7c6638"
1805
3159
  },
1806
3160
  {
1807
3161
  "path": "src/ts/components/carousel.ts",
1808
- "sha256": "9559aa36e59e4f15b5fbfbc7ff6acd0ff85ce2498972ae7a42b2510825c22224"
3162
+ "sha256": "f4b3099fd11a3333d0f915ea3253375823c1fdd607116b4de884ded7ae35f15e"
1809
3163
  }
1810
3164
  ],
1811
3165
  "gaps": [
@@ -1848,6 +3202,56 @@
1848
3202
  "Google revises the linked guidance or before claiming a new release matches it"
1849
3203
  ]
1850
3204
  },
3205
+ {
3206
+ "slug": "marquee",
3207
+ "title": "Marquee",
3208
+ "kind": "component",
3209
+ "support": "implemented",
3210
+ "lastReviewedSupport": "implemented",
3211
+ "sourceReview": "source-reviewed",
3212
+ "reviewedOn": "2026-10-08",
3213
+ "scope": "Two identical groups that loop horizontally or vertically, with reverse, edge fades, a paused class, hover and focus pausing, token duration and gap, a reversed direction in RTL and a hand-scrolled strip under reduced motion.",
3214
+ "adaptation": "A visual copy of the item list marked aria-hidden, with its links taken out of the tab order, so assistive technology and the keyboard meet each item once.",
3215
+ "upstream": {
3216
+ "source": "https://m3.material.io/components",
3217
+ "reviewedOn": "2026-10-08",
3218
+ "scope": "web-extension-inventory-reviewed",
3219
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
3220
+ "sections": [
3221
+ "No standalone Material component"
3222
+ ],
3223
+ "sources": [],
3224
+ "requirements": "Hide the copy from assistive technology, keep each link reachable once, pause on hover and focus, offer a pause control for long-running motion and stop it when reduced motion is requested."
3225
+ },
3226
+ "relationship": "none",
3227
+ "sources": [
3228
+ {
3229
+ "path": "src/sass/components/_marquee.scss",
3230
+ "sha256": "e76d8380b53cf788c1304e9331c632083468109f8b726c2e1eeaa3a20adb95eb"
3231
+ }
3232
+ ],
3233
+ "gaps": [
3234
+ {
3235
+ "kind": "verification",
3236
+ "description": "The group placement, the half-cycle position, the right-to-left and vertical directions, reverse, pausing on hover, focus and .paused, the hidden copy in the accessibility tree and the reduced-motion stop are checked in a browser; spoken output and long-running smoothness remain unverified.",
3237
+ "nextStep": "Listen to a marquee with a screen reader in each engine and confirm each item is read once; watch a long strip for a visible jump at the loop point."
3238
+ }
3239
+ ],
3240
+ "browserChecks": [
3241
+ {
3242
+ "file": "tests/marquee-browser.test.js",
3243
+ "name": "chromium: marquee loops its two groups, pauses, follows direction and stops under reduced motion",
3244
+ "scope": "A short group filling the strip, the copy one gap after it, the half-cycle position horizontally, in RTL and vertically, reverse, pausing on hover, focus and .paused, one link per item in the accessibility tree and the reduced-motion stop with the copy hidden. No spoken-output assertion.",
3245
+ "state": "not-recorded"
3246
+ }
3247
+ ],
3248
+ "browserEvidence": "incomplete",
3249
+ "recheckWhen": [
3250
+ "A reviewed source changes",
3251
+ "A mapped test or its recorded inputs change",
3252
+ "Google revises the linked guidance or before claiming a new release matches it"
3253
+ ]
3254
+ },
1851
3255
  {
1852
3256
  "slug": "lightbox",
1853
3257
  "title": "Lightbox",
@@ -1976,7 +3380,7 @@
1976
3380
  "sources": [
1977
3381
  {
1978
3382
  "path": "src/sass/components/_toolbar.scss",
1979
- "sha256": "8fb21bf9336332897e0b4290b80b7ea31a523410a7db893ab7b49cd8abee005b"
3383
+ "sha256": "0bfd3014f3a8cd2f6ec04ea0af2b892ab89ede8f6252381b2643357d81fe76b7"
1980
3384
  }
1981
3385
  ],
1982
3386
  "gaps": [],
@@ -2021,7 +3425,7 @@
2021
3425
  "sources": [
2022
3426
  {
2023
3427
  "path": "src/sass/components/_search.scss",
2024
- "sha256": "827fd893f6c3ac380a95ed3f5febd3a4fff4fee29cac5b1fb230df5e6f051c76"
3428
+ "sha256": "a23203e638f6ad66660f3e786b26460302702890883b5ebd4a6d1a6108196f9a"
2025
3429
  }
2026
3430
  ],
2027
3431
  "gaps": [
@@ -2046,6 +3450,60 @@
2046
3450
  "Google revises the linked guidance or before claiming a new release matches it"
2047
3451
  ]
2048
3452
  },
3453
+ {
3454
+ "slug": "command-palette",
3455
+ "title": "Command palette",
3456
+ "kind": "component",
3457
+ "support": "implemented",
3458
+ "lastReviewedSupport": "implemented",
3459
+ "sourceReview": "source-reviewed",
3460
+ "reviewedOn": "2026-10-06",
3461
+ "scope": "A modal dialog with a filtering combobox and listbox, group headings, keywords, an empty message, a Ctrl or Command shortcut and native commandfor opening.",
3462
+ "adaptation": "A native modal <dialog>; commands are links and buttons, and the component adds the combobox and listbox roles and the active option.",
3463
+ "upstream": {
3464
+ "source": "https://m3.material.io/components",
3465
+ "reviewedOn": "2026-10-06",
3466
+ "scope": "web-extension-inventory-reviewed",
3467
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
3468
+ "sections": [
3469
+ "No standalone Material component"
3470
+ ],
3471
+ "sources": [],
3472
+ "requirements": "Keep focus in the input while the active option moves, report it with aria-activedescendant, announce when nothing matches, return focus on close and let users turn the shortcut off."
3473
+ },
3474
+ "relationship": "none",
3475
+ "sources": [
3476
+ {
3477
+ "path": "src/sass/components/_command-palette.scss",
3478
+ "sha256": "d9d4dd1fe2b3bc60aa29203a7526139e8e75e6d7b2a76bbe2dd59e671f62ed0d"
3479
+ },
3480
+ {
3481
+ "path": "src/ts/components/commandPalette.ts",
3482
+ "sha256": "55fb823a7e70d5cc7d22cd10a84054badac5a7d5df7274d3b67aa044349a642e"
3483
+ }
3484
+ ],
3485
+ "gaps": [
3486
+ {
3487
+ "kind": "verification",
3488
+ "description": "The shortcut, filtering, arrow and Enter handling, closing, focus return, the native opener and destroy are checked in a browser; screen reader announcements and shortcut conflicts with assistive technology remain unverified.",
3489
+ "nextStep": "Run commands with a screen reader in each engine and confirm the active option and the empty message are announced; check that Ctrl+K does not clash with the screen reader or browser."
3490
+ }
3491
+ ],
3492
+ "browserChecks": [
3493
+ {
3494
+ "file": "tests/command-palette-browser.test.js",
3495
+ "name": "chromium: command palette opens on its shortcut, filters, moves with the arrows and runs a command",
3496
+ "scope": "Combobox and listbox roles, Ctrl+K toggle, input focus, top placement, wrapping arrows, accent-insensitive and keyword filtering, hidden empty groups, the empty message, Enter and click running a command, closing with focus return, the commandfor opener, a fresh search on reopening, Escape, destroy and the keycap style. No spoken-output assertion.",
3497
+ "state": "stale"
3498
+ }
3499
+ ],
3500
+ "browserEvidence": "needs-rerun",
3501
+ "recheckWhen": [
3502
+ "A reviewed source changes",
3503
+ "A mapped test or its recorded inputs change",
3504
+ "Google revises the linked guidance or before claiming a new release matches it"
3505
+ ]
3506
+ },
2049
3507
  {
2050
3508
  "slug": "fieldsets",
2051
3509
  "title": "Fieldsets",
@@ -2076,7 +3534,7 @@
2076
3534
  "sources": [
2077
3535
  {
2078
3536
  "path": "src/sass/components/forms/_fieldset.scss",
2079
- "sha256": "0de91ee778fb360cd8a5451c920df81dd2b1cd5fb9d26993729afe1f745d7e65"
3537
+ "sha256": "5d2a174d889bc97608b200cff7299fb082dd9fb256ad7cc8821ef5ed313921fe"
2080
3538
  }
2081
3539
  ],
2082
3540
  "gaps": [
@@ -2115,7 +3573,7 @@
2115
3573
  "lastReviewedSupport": "implemented",
2116
3574
  "sourceReview": "needs-review",
2117
3575
  "reviewedOn": "2026-09-12",
2118
- "scope": "Filled and outlined fields, supporting text, and error states.",
3576
+ "scope": "Filled and outlined fields, supporting text, error states, trailing icon buttons, a password visibility toggle and one-time code cells.",
2119
3577
  "adaptation": "Native input/textarea with explicit label and description relationships.",
2120
3578
  "upstream": {
2121
3579
  "source": "https://m3.material.io/components/text-fields/overview",
@@ -2127,15 +3585,15 @@
2127
3585
  "sources": [
2128
3586
  {
2129
3587
  "path": "src/sass/components/forms/_input-fields.scss",
2130
- "sha256": "b3cd9aceac937a183ff554fe75efb5d72e4317e522c702a89cf7a24614e7f088"
3588
+ "sha256": "a57917019881ef5f633cef6ed9ac7e53fa009138a7657ea3d1a728fe666b0227"
2131
3589
  },
2132
3590
  {
2133
3591
  "path": "src/sass/components/forms/_file-input.scss",
2134
- "sha256": "cc856d49ae84dcae4970c75dd587194b69219a4f707ad95d4598d974eb491221"
3592
+ "sha256": "ccc130c28cd0109ccef7e28eab6cbbe306d2a380405a1cf7091524a7868a258f"
2135
3593
  },
2136
3594
  {
2137
3595
  "path": "src/ts/behaviors/forms.ts",
2138
- "sha256": "c90046cd163d73d9046b0bfc2b4888ba87626704782f295054d9da63b3395d57"
3596
+ "sha256": "57733061183d4f3adbedd53803d19f26c4d31ca2459cd1707a5266b8bff46d9a"
2139
3597
  },
2140
3598
  {
2141
3599
  "path": "src/ts/components/characterCounter.ts",
@@ -2158,6 +3616,120 @@
2158
3616
  "Google revises the linked guidance or before claiming a new release matches it"
2159
3617
  ]
2160
3618
  },
3619
+ {
3620
+ "slug": "rich-text-editor",
3621
+ "title": "Rich text editor",
3622
+ "kind": "component",
3623
+ "support": "implemented",
3624
+ "lastReviewedSupport": "implemented",
3625
+ "sourceReview": "source-reviewed",
3626
+ "reviewedOn": "2026-10-08",
3627
+ "scope": "A Tiptap editor mounted from a textarea, toolbar buttons that run Tiptap commands with JSON arguments, pressed and disabled button state, form submission through the textarea, label naming and read-only textareas.",
3628
+ "adaptation": "The page supplies Tiptap's Editor class and extensions; the component mounts it, names the contenteditable textbox from the textarea and keeps the textarea in sync. The toolbar is the docked toolbar.",
3629
+ "upstream": {
3630
+ "source": "https://m3.material.io/components",
3631
+ "reviewedOn": "2026-10-08",
3632
+ "scope": "web-extension-inventory-reviewed",
3633
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
3634
+ "sections": [
3635
+ "No standalone Material component"
3636
+ ],
3637
+ "sources": [],
3638
+ "requirements": "Name the editable area, expose formatting state on toggle buttons, keep the toolbar reachable by keyboard and submit the content with its form."
3639
+ },
3640
+ "relationship": "none",
3641
+ "sources": [
3642
+ {
3643
+ "path": "src/sass/components/_rich-text-editor.scss",
3644
+ "sha256": "4ff745197d37043297861b0a4166e0bda0fd3adcdb160baed5dffb6a6821dd46"
3645
+ },
3646
+ {
3647
+ "path": "src/ts/components/richTextEditor.ts",
3648
+ "sha256": "d14e0d63acb86d53a84a131dd83fc96d5aaab5914b8ba10fc1e15e069bb30d11"
3649
+ }
3650
+ ],
3651
+ "gaps": [
3652
+ {
3653
+ "kind": "verification",
3654
+ "description": "Formatting a selection, pressed and disabled toolbar state, textarea sync with input events, label naming and focus, a disabled textarea and destroy are checked in a browser; spoken output, IME composition, paste from other applications and touch selection remain unverified.",
3655
+ "nextStep": "Use the editor with a screen reader and an IME in each engine, paste from a word processor, and select text on touch devices."
3656
+ }
3657
+ ],
3658
+ "browserChecks": [
3659
+ {
3660
+ "file": "tests/rich-text-editor-browser.test.js",
3661
+ "name": "chromium: rich text editor formats text, reflects state and keeps the textarea in sync",
3662
+ "scope": "Hidden textarea, textbox role and name from the label, starting HTML, label click focus, bold and heading commands with aria-pressed and .active, undo disabled state, textarea value and input event, empty value, and destroy. No spoken-output assertion.",
3663
+ "state": "not-recorded"
3664
+ },
3665
+ {
3666
+ "file": "tests/rich-text-editor-browser.test.js",
3667
+ "name": "chromium: rich text editor follows a disabled textarea",
3668
+ "scope": "A disabled textarea makes the editor read-only and disables every toolbar button.",
3669
+ "state": "not-recorded"
3670
+ }
3671
+ ],
3672
+ "browserEvidence": "incomplete",
3673
+ "recheckWhen": [
3674
+ "A reviewed source changes",
3675
+ "A mapped test or its recorded inputs change",
3676
+ "Google revises the linked guidance or before claiming a new release matches it"
3677
+ ]
3678
+ },
3679
+ {
3680
+ "slug": "drop-zone",
3681
+ "title": "Drop zone",
3682
+ "kind": "component",
3683
+ "support": "implemented",
3684
+ "lastReviewedSupport": "implemented",
3685
+ "sourceReview": "source-reviewed",
3686
+ "reviewedOn": "2026-10-06",
3687
+ "scope": "A label-sized native file input with a dragover state and a list of chosen file names and locale-formatted sizes.",
3688
+ "adaptation": "The native input covers the label, so clicks, keys and drops are the browser's; the shared Forms behavior marks the drag and fills the list.",
3689
+ "upstream": {
3690
+ "source": "https://m3.material.io/components",
3691
+ "reviewedOn": "2026-10-06",
3692
+ "scope": "web-extension-inventory-reviewed",
3693
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
3694
+ "sections": [
3695
+ "No standalone Material component"
3696
+ ],
3697
+ "sources": [],
3698
+ "requirements": "Keep a native, labelled file input reachable by keyboard, show drag feedback that is not color alone, list chosen files in text and validate type and size where the files are used."
3699
+ },
3700
+ "relationship": "none",
3701
+ "sources": [
3702
+ {
3703
+ "path": "src/sass/components/forms/_drop-zone.scss",
3704
+ "sha256": "dcc9dc0e721c0057266092591634249620143d8b7350ff867651806c59ad10b1"
3705
+ },
3706
+ {
3707
+ "path": "src/ts/behaviors/forms.ts",
3708
+ "sha256": "57733061183d4f3adbedd53803d19f26c4d31ca2459cd1707a5266b8bff46d9a"
3709
+ }
3710
+ ],
3711
+ "gaps": [
3712
+ {
3713
+ "kind": "verification",
3714
+ "description": "Input coverage, the dragover state, the file list and keyboard focus are checked in a browser with synthetic events; real operating-system drags and spoken output remain unverified.",
3715
+ "nextStep": "Drag files from the operating system onto the zone in each engine and confirm the selection and list update; check the list announcement with a screen reader."
3716
+ }
3717
+ ],
3718
+ "browserChecks": [
3719
+ {
3720
+ "file": "tests/drop-zone-browser.test.js",
3721
+ "name": "chromium: drop zone covers its label with the file input, marks a drag and lists chosen files",
3722
+ "scope": "Input covering the label, label naming the input, dragover set and cleared by dragenter, dragleave and drop, listed names and sizes, list cleared on an empty selection and keyboard focus ring. No spoken-output assertion.",
3723
+ "state": "stale"
3724
+ }
3725
+ ],
3726
+ "browserEvidence": "needs-rerun",
3727
+ "recheckWhen": [
3728
+ "A reviewed source changes",
3729
+ "A mapped test or its recorded inputs change",
3730
+ "Google revises the linked guidance or before claiming a new release matches it"
3731
+ ]
3732
+ },
2161
3733
  {
2162
3734
  "slug": "select",
2163
3735
  "title": "Select",
@@ -2193,19 +3765,19 @@
2193
3765
  "sources": [
2194
3766
  {
2195
3767
  "path": "src/sass/components/forms/_select.scss",
2196
- "sha256": "2e651be3951b59c99f827b190df52d302ffe5f548300767e653b9d09e7b18609"
3768
+ "sha256": "d360405d6a315e4ff8be9936ac1bc0e7ec0c01ad300d177a87de54a096937bec"
2197
3769
  },
2198
3770
  {
2199
3771
  "path": "src/sass/components/_menu.scss",
2200
- "sha256": "64ef33e268c01dd8f24a9f28198b4ae982bcd2d9a4d7f59f7fc334e0d2916774"
3772
+ "sha256": "fc7456249caec5118a379c9d56c7a7bfb211c147f5fd318bbcf8de6ea1d33654"
2201
3773
  },
2202
3774
  {
2203
3775
  "path": "src/ts/components/select.ts",
2204
- "sha256": "42977975bb11210ec87701131c3536809b3109e173ccffd724e89817d9561af7"
3776
+ "sha256": "b375715a62baae95a7ba2c97d85d60ee2c619d5d261ee0abf9aea7ab28c3ae74"
2205
3777
  },
2206
3778
  {
2207
3779
  "path": "src/ts/components/menu.ts",
2208
- "sha256": "e0fb0c0f6492652fdea2c7bf4189eabad261d5506ec93a22fac508da67d89660"
3780
+ "sha256": "0ca7f4c0d80012adad3babdfc23005792dbaa2655c3fe5595bc9bcc7e2c35ce8"
2209
3781
  }
2210
3782
  ],
2211
3783
  "gaps": [
@@ -2299,7 +3871,7 @@
2299
3871
  "sources": [
2300
3872
  {
2301
3873
  "path": "src/sass/components/forms/_checkboxes.scss",
2302
- "sha256": "3fd662bcbca486e3b05413ce9b1ff9a10a8002e3e3ea6e853bd179e8fcfe2f09"
3874
+ "sha256": "14bbdc5bf3c4db17635ff3f4b96848bbdbcaa005cfd8ba43c96525e1f503d536"
2303
3875
  }
2304
3876
  ],
2305
3877
  "gaps": [
@@ -2363,7 +3935,7 @@
2363
3935
  "sources": [
2364
3936
  {
2365
3937
  "path": "src/sass/components/forms/_radio-buttons.scss",
2366
- "sha256": "a8054892643f184463052ad5e566ee0d8c96d2f125f9dea433915eba5f3b7cf1"
3938
+ "sha256": "ce6d4cf6fe3ea48faac681825a292744498d28ab87a23acc065ca90eabd42854"
2367
3939
  }
2368
3940
  ],
2369
3941
  "gaps": [
@@ -2388,6 +3960,56 @@
2388
3960
  "Google revises the linked guidance or before claiming a new release matches it"
2389
3961
  ]
2390
3962
  },
3963
+ {
3964
+ "slug": "rating",
3965
+ "title": "Rating",
3966
+ "kind": "component",
3967
+ "support": "implemented",
3968
+ "lastReviewedSupport": "implemented",
3969
+ "sourceReview": "source-reviewed",
3970
+ "reviewedOn": "2026-10-06",
3971
+ "scope": "A fieldset of radios drawn as stars with fill, hover preview and focus ring, and a read-only display that fills to a fractional value in LTR and RTL.",
3972
+ "adaptation": "Native radios keep keyboard, form and naming behavior; the display is a named role=\"img\".",
3973
+ "upstream": {
3974
+ "source": "https://m3.material.io/components",
3975
+ "reviewedOn": "2026-10-06",
3976
+ "scope": "web-extension-inventory-reviewed",
3977
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
3978
+ "sections": [
3979
+ "No standalone Material component"
3980
+ ],
3981
+ "sources": [],
3982
+ "requirements": "Keep a native radio group with a legend and a name for every star, show focus, fill by more than color where possible and name a read-only display with its value."
3983
+ },
3984
+ "relationship": "none",
3985
+ "sources": [
3986
+ {
3987
+ "path": "src/sass/components/forms/_rating.scss",
3988
+ "sha256": "8b0c0e77791f4e88681a12ff2c78758be20d5ece7129c914e4cf6881a6b61300"
3989
+ }
3990
+ ],
3991
+ "gaps": [
3992
+ {
3993
+ "kind": "verification",
3994
+ "description": "Star fill, hover preview, native arrow keys, form value, the display fill direction and names are checked in a browser; the focus ring after arrow keys is not drawn in Playwright WebKit, and spoken output remains unverified.",
3995
+ "nextStep": "Rate with a keyboard and a screen reader in each engine, including Safari, and confirm the focus ring follows the arrows and each star is announced."
3996
+ }
3997
+ ],
3998
+ "browserChecks": [
3999
+ {
4000
+ "file": "tests/rating-browser.test.js",
4001
+ "name": "chromium: rating fills stars up to the choice, previews on hover and keeps native radios",
4002
+ "scope": "Visible 24px masked radios, fill up to the checked star, Tab entry and arrow keys, focus ring on entry, hover preview, form value, display width and fill direction in LTR and RTL, and the group, radio and image names. No spoken-output assertion.",
4003
+ "state": "stale"
4004
+ }
4005
+ ],
4006
+ "browserEvidence": "needs-rerun",
4007
+ "recheckWhen": [
4008
+ "A reviewed source changes",
4009
+ "A mapped test or its recorded inputs change",
4010
+ "Google revises the linked guidance or before claiming a new release matches it"
4011
+ ]
4012
+ },
2391
4013
  {
2392
4014
  "slug": "switches",
2393
4015
  "title": "Switches",
@@ -2421,7 +4043,7 @@
2421
4043
  "sources": [
2422
4044
  {
2423
4045
  "path": "src/sass/components/forms/_switches.scss",
2424
- "sha256": "3700fa309d0524fce4eff27c1f337d1ab03f592c567423a275cc9332144b2e8a"
4046
+ "sha256": "3d9e047a1ecb7c987cc5645fbfc7d0a918a0ab73abc0ffdac99764c9f4656d70"
2425
4047
  }
2426
4048
  ],
2427
4049
  "gaps": [
@@ -2479,11 +4101,11 @@
2479
4101
  "sources": [
2480
4102
  {
2481
4103
  "path": "src/sass/components/forms/_slider.scss",
2482
- "sha256": "355a280e40d21326ee57cd1ff66dcdbc2f02fad5f9abde2fac50623b61d3b488"
4104
+ "sha256": "1f5a04bd71c371d12b3beb016625e26a9e1e87aa194b3a9c90ca3b8863b22e8e"
2483
4105
  },
2484
4106
  {
2485
4107
  "path": "src/ts/components/slider.ts",
2486
- "sha256": "9d42da6e411ceb7604d851e9df2c56738de6ab5dd5e7b18343797c76af8526e3"
4108
+ "sha256": "d6591284f074bb8774ca890c9e5d4f61b7cc1ca23f1d47b2e10a14c0d4cf6498"
2487
4109
  }
2488
4110
  ],
2489
4111
  "gaps": [
@@ -2565,11 +4187,11 @@
2565
4187
  "sources": [
2566
4188
  {
2567
4189
  "path": "src/sass/components/_chips.scss",
2568
- "sha256": "a906b31175533e454803c06bd6b47f141764792d2edd8f2add58c26c5308230f"
4190
+ "sha256": "7edd85c5caada8feda941eb08894592aba439760eb38bb8cd49ff4a73c748958"
2569
4191
  },
2570
4192
  {
2571
4193
  "path": "src/ts/components/chips.ts",
2572
- "sha256": "6cb6af3f1b41f5634de1e1bf3a821ad080b006a922d7238466915c87f775f47d"
4194
+ "sha256": "ef36c69c467151dc8f9bea2efc56c5c32523dd9d90f63d4431e913bb9557fb89"
2573
4195
  }
2574
4196
  ],
2575
4197
  "gaps": [
@@ -2648,19 +4270,19 @@
2648
4270
  "sources": [
2649
4271
  {
2650
4272
  "path": "src/sass/components/forms/_input-fields.scss",
2651
- "sha256": "b3cd9aceac937a183ff554fe75efb5d72e4317e522c702a89cf7a24614e7f088"
4273
+ "sha256": "a57917019881ef5f633cef6ed9ac7e53fa009138a7657ea3d1a728fe666b0227"
2652
4274
  },
2653
4275
  {
2654
4276
  "path": "src/sass/components/_menu.scss",
2655
- "sha256": "8ad4eab498fa24199203070cf2b5792f6d61aa52e18b75770549ffcc7e0c64dc"
4277
+ "sha256": "fc7456249caec5118a379c9d56c7a7bfb211c147f5fd318bbcf8de6ea1d33654"
2656
4278
  },
2657
4279
  {
2658
4280
  "path": "src/ts/components/autocomplete.ts",
2659
- "sha256": "355c7c33a06c563dfb48d3278b3cb21029652f59428e3894bc09a78b8455a813"
4281
+ "sha256": "903c7add38e73c4e57ef936d48cf9306682e91da5afbd0635a3a063b482b58d0"
2660
4282
  },
2661
4283
  {
2662
4284
  "path": "src/ts/components/menu.ts",
2663
- "sha256": "dffb2df2cbd79a4b1fdfb354c62509952070059eb35418aec9cb296680f6a241"
4285
+ "sha256": "0ca7f4c0d80012adad3babdfc23005792dbaa2655c3fe5595bc9bcc7e2c35ce8"
2664
4286
  }
2665
4287
  ],
2666
4288
  "gaps": [
@@ -2735,15 +4357,15 @@
2735
4357
  },
2736
4358
  {
2737
4359
  "path": "src/ts/components/datepicker.ts",
2738
- "sha256": "44f9df3b5058be3a31d31fe318c2582a8839282438d17e04db08df17c51a185c"
4360
+ "sha256": "12ae366428fc6629864055647a83f3e12905ab80dd5a6316db91cfd09c843c2b"
2739
4361
  },
2740
4362
  {
2741
4363
  "path": "src/ts/components/select.ts",
2742
- "sha256": "33d9285e89d231522070ada3a4cc8e917a620cee245d86c09a2f3e4161fec49e"
4364
+ "sha256": "b375715a62baae95a7ba2c97d85d60ee2c619d5d261ee0abf9aea7ab28c3ae74"
2743
4365
  },
2744
4366
  {
2745
4367
  "path": "src/ts/plugins/dockedDisplayPlugin.ts",
2746
- "sha256": "8411242a17cbbb95fa9863270f471e03dc487474224994b952f67bc555e2eda7"
4368
+ "sha256": "e1e47f2934eca4d71036b5a2ce9b42999aee7f3ab9da43a05e0a03ff443cef28"
2747
4369
  }
2748
4370
  ],
2749
4371
  "gaps": [
@@ -2830,7 +4452,7 @@
2830
4452
  "sources": [
2831
4453
  {
2832
4454
  "path": "src/sass/components/_timepicker.scss",
2833
- "sha256": "87330125fa818b3463a1c4e4f80535e7551d39bdd83795462ac8ec0cc092c439"
4455
+ "sha256": "bcd6a37362d85914a6470b8076c2eec1ab46733c6b0b9f1ff673f255643de7e0"
2834
4456
  },
2835
4457
  {
2836
4458
  "path": "src/sass/components/_docked-display.scss",
@@ -2838,11 +4460,11 @@
2838
4460
  },
2839
4461
  {
2840
4462
  "path": "src/ts/components/timepicker.ts",
2841
- "sha256": "1f74375f4917dce48e955b25f482af13a06bdc9bd7e16f967b661c3168a3bf15"
4463
+ "sha256": "f3b81df00b3a3146670f29350dbc154ef053c21800add11d2c109a99cfe182a6"
2842
4464
  },
2843
4465
  {
2844
4466
  "path": "src/ts/plugins/dockedDisplayPlugin.ts",
2845
- "sha256": "8411242a17cbbb95fa9863270f471e03dc487474224994b952f67bc555e2eda7"
4467
+ "sha256": "e1e47f2934eca4d71036b5a2ce9b42999aee7f3ab9da43a05e0a03ff443cef28"
2846
4468
  }
2847
4469
  ],
2848
4470
  "gaps": [
@@ -2890,6 +4512,71 @@
2890
4512
  "Google revises the linked guidance or before claiming a new release matches it"
2891
4513
  ]
2892
4514
  },
4515
+ {
4516
+ "slug": "questionnaire",
4517
+ "title": "Questionnaire",
4518
+ "kind": "component",
4519
+ "support": "implemented",
4520
+ "lastReviewedSupport": "implemented",
4521
+ "sourceReview": "source-reviewed",
4522
+ "reviewedOn": "2026-10-08",
4523
+ "scope": "A native form of fieldsets shown one at a time, with single choice, multiple choice and text answers, choice descriptions, required and data-required questions, Skip for optional ones, authored or generated errors, a progress row, Enter to advance, disabled questions for branching and normal form submission.",
4524
+ "adaptation": "Each question is a native fieldset named by its legend; the browser's constraint validation checks answers, hidden questions use hidden, and without JavaScript the form shows every question and still submits.",
4525
+ "upstream": {
4526
+ "source": "https://m3.material.io/components",
4527
+ "reviewedOn": "2026-10-08",
4528
+ "scope": "web-extension-inventory-reviewed",
4529
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
4530
+ "sections": [
4531
+ "No standalone Material component"
4532
+ ],
4533
+ "sources": [],
4534
+ "requirements": "Name each question with a legend, show one error per question next to it and move focus to the control to fix, keep hidden questions out of the tab order, let optional questions be skipped and keep the form usable without JavaScript."
4535
+ },
4536
+ "relationship": "none",
4537
+ "sources": [
4538
+ {
4539
+ "path": "src/sass/components/_questionnaire.scss",
4540
+ "sha256": "dc9ce2c61c6533b8e7dc22584c2daa7ca67efed19c5cad4155c1c66583b0e179"
4541
+ },
4542
+ {
4543
+ "path": "src/ts/components/questionnaire.ts",
4544
+ "sha256": "f13384d26139b816b99da0305e956febde43c672d0600d545eb96e998900003b"
4545
+ }
4546
+ ],
4547
+ "gaps": [
4548
+ {
4549
+ "kind": "verification",
4550
+ "description": "Showing one question, required radios, data-required checkboxes that ignore disabled ones, generated and authored errors, aria-invalid and aria-describedby, Enter, Skip clearing an answer, Back focus, a disabled question left out, submit and requestSubmit() opening the first unanswered question, FormData and destroy are checked in a browser; screen reader output, forced colors and enlarged text remain unverified.",
4551
+ "nextStep": "Answer a questionnaire with a screen reader in each engine and confirm the question, its description, errors and the progress are announced; check forced colors and enlarged text."
4552
+ },
4553
+ {
4554
+ "kind": "feature",
4555
+ "description": "There are no letter or number shortcuts for answers, no summary step and no saved progress.",
4556
+ "nextStep": "Add answer shortcuts or a review step when a page needs them; pages can save progress with FormData and goTo()."
4557
+ }
4558
+ ],
4559
+ "browserChecks": [
4560
+ {
4561
+ "file": "tests/questionnaire-browser.test.js",
4562
+ "name": "chromium: questionnaire shows one question, validates, skips, branches and submits",
4563
+ "scope": "One question shown, the buttons that apply, the progress text and named progressbar, aria-describedby with the description and error, required radio and data-required checkbox errors with focus and aria-invalid, errors clearing on answer, a generated requiredMessage error, a question enabled mid-way, Enter moving on instead of submitting, Back focus, Skip clearing an answer and firing change, submit opening the first unanswered question, FormData without a disabled question and destroy restoring the plain form. No spoken-output assertion.",
4564
+ "state": "stale"
4565
+ },
4566
+ {
4567
+ "file": "tests/questionnaire-browser.test.js",
4568
+ "name": "chromium: questionnaire validates requestSubmit and ignores disabled checkboxes",
4569
+ "scope": "A checked disabled checkbox not answering a data-required group, focus on the first enabled checkbox, requestSubmit() blocked by an unanswered group and by a hidden required field with each question opened and its error shown, a valid requestSubmit() sending FormData, and destroy clearing the custom validity. No spoken-output assertion.",
4570
+ "state": "stale"
4571
+ }
4572
+ ],
4573
+ "browserEvidence": "needs-rerun",
4574
+ "recheckWhen": [
4575
+ "A reviewed source changes",
4576
+ "A mapped test or its recorded inputs change",
4577
+ "Google revises the linked guidance or before claiming a new release matches it"
4578
+ ]
4579
+ },
2893
4580
  {
2894
4581
  "slug": "typography",
2895
4582
  "title": "Typography",