@expressivecss/expressive 0.11.0 → 0.13.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.
Files changed (265) hide show
  1. package/CHANGELOG.md +392 -7
  2. package/README.md +37 -1
  3. package/dist/css/expressive.css +5440 -234
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  8. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  9. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  10. package/dist/js/chunks/{chunk-AYYYWUJ4.mjs → chunk-3CLXLPYS.mjs} +17 -11
  11. package/dist/js/chunks/chunk-3CLXLPYS.mjs.map +7 -0
  12. package/dist/js/chunks/chunk-3DHK5CZU.mjs +105 -0
  13. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +7 -0
  14. package/dist/js/chunks/{chunk-IMUPRRI6.mjs → chunk-3VOK6J7U.mjs} +3 -3
  15. package/dist/js/chunks/chunk-4PWAPV6F.mjs +7 -0
  16. package/dist/js/chunks/chunk-4PWAPV6F.mjs.map +7 -0
  17. package/dist/js/chunks/{chunk-XFJ452AZ.mjs → chunk-55IA2XUC.mjs} +5 -6
  18. package/dist/js/chunks/{chunk-XFJ452AZ.mjs.map → chunk-55IA2XUC.mjs.map} +2 -2
  19. package/dist/js/chunks/{chunk-XDB3G6RL.mjs → chunk-6N2XAEFK.mjs} +15 -4
  20. package/dist/js/chunks/{chunk-XDB3G6RL.mjs.map → chunk-6N2XAEFK.mjs.map} +2 -2
  21. package/dist/js/chunks/{chunk-MISGHDUU.mjs → chunk-6OMRGML6.mjs} +9 -7
  22. package/dist/js/chunks/{chunk-MISGHDUU.mjs.map → chunk-6OMRGML6.mjs.map} +2 -2
  23. package/dist/js/chunks/{chunk-A3BJA7V4.mjs → chunk-6WLSDZ4O.mjs} +2 -2
  24. package/dist/js/chunks/chunk-CCWDV5CR.mjs +292 -0
  25. package/dist/js/chunks/chunk-CCWDV5CR.mjs.map +7 -0
  26. package/dist/js/chunks/{chunk-JODJAGFS.mjs → chunk-CKQP6P76.mjs} +31 -8
  27. package/dist/js/chunks/chunk-CKQP6P76.mjs.map +7 -0
  28. package/dist/js/chunks/{chunk-KR44BSYQ.mjs → chunk-DLWYKFEI.mjs} +3 -3
  29. package/dist/js/chunks/chunk-DTKR54I6.mjs +270 -0
  30. package/dist/js/chunks/chunk-DTKR54I6.mjs.map +7 -0
  31. package/dist/js/chunks/{chunk-SLFNPY5M.mjs → chunk-EC63CHXU.mjs} +2 -2
  32. package/dist/js/chunks/chunk-GVGT6MIU.mjs +47 -0
  33. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +7 -0
  34. package/dist/js/chunks/{chunk-LZVBJ33S.mjs → chunk-GZWPXXY6.mjs} +15 -8
  35. package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +7 -0
  36. package/dist/js/chunks/chunk-HKT2S7VM.mjs +48 -0
  37. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-D4UZ4HFN.mjs → chunk-IFXVDDDH.mjs} +23 -11
  39. package/dist/js/chunks/chunk-IFXVDDDH.mjs.map +7 -0
  40. package/dist/js/chunks/chunk-K4CJCRGE.mjs +262 -0
  41. package/dist/js/chunks/chunk-K4CJCRGE.mjs.map +7 -0
  42. package/dist/js/chunks/chunk-LNCCYGPC.mjs +163 -0
  43. package/dist/js/chunks/chunk-LNCCYGPC.mjs.map +7 -0
  44. package/dist/js/chunks/{chunk-QSQ24FYT.mjs → chunk-LTWPGFBR.mjs} +2 -2
  45. package/dist/js/chunks/{chunk-QSQ24FYT.mjs.map → chunk-LTWPGFBR.mjs.map} +2 -2
  46. package/dist/js/chunks/{chunk-I5KR22BY.mjs → chunk-LWBQIX5J.mjs} +15 -15
  47. package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +7 -0
  48. package/dist/js/chunks/{chunk-GY2Z5CJ2.mjs → chunk-NNYP33NB.mjs} +67 -32
  49. package/dist/js/chunks/chunk-NNYP33NB.mjs.map +7 -0
  50. package/dist/js/chunks/chunk-NQLC3YMW.mjs +1 -0
  51. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +406 -0
  52. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +7 -0
  53. package/dist/js/chunks/chunk-P3G3QHII.mjs +166 -0
  54. package/dist/js/chunks/chunk-P3G3QHII.mjs.map +7 -0
  55. package/dist/js/chunks/{chunk-VAS6JQ6P.mjs → chunk-PIJ2TAR3.mjs} +3 -3
  56. package/dist/js/chunks/{chunk-74N6U5JJ.mjs → chunk-PLYXLSH3.mjs} +38 -37
  57. package/dist/js/chunks/chunk-PLYXLSH3.mjs.map +7 -0
  58. package/dist/js/chunks/{chunk-PIIAEYAJ.mjs → chunk-QDAL4IYN.mjs} +2 -2
  59. package/dist/js/chunks/chunk-QKWPQK5N.mjs +179 -0
  60. package/dist/js/chunks/chunk-QKWPQK5N.mjs.map +7 -0
  61. package/dist/js/chunks/{chunk-FRB7TOCS.mjs → chunk-QV2JAWIZ.mjs} +2 -2
  62. package/dist/js/chunks/{chunk-N3UHGN3N.mjs → chunk-QVVEWBOF.mjs} +3 -3
  63. package/dist/js/chunks/chunk-RHRQKTTX.mjs +139 -0
  64. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-SPETGK25.mjs +59 -0
  66. package/dist/js/chunks/chunk-SPETGK25.mjs.map +7 -0
  67. package/dist/js/chunks/{chunk-TK6PX2GC.mjs → chunk-U2OTHOTI.mjs} +131 -19
  68. package/dist/js/chunks/chunk-U2OTHOTI.mjs.map +7 -0
  69. package/dist/js/chunks/{chunk-TYM6U5DY.mjs → chunk-UAEAQBRC.mjs} +2 -2
  70. package/dist/js/chunks/{chunk-7UXHSYIA.mjs → chunk-UBLRRJ7N.mjs} +3 -3
  71. package/dist/js/chunks/{chunk-EP3CVKB5.mjs → chunk-UEZUJQ66.mjs} +8 -5
  72. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-JNPIWFJT.mjs → chunk-UNEMYWEW.mjs} +3 -3
  74. package/dist/js/chunks/chunk-VTLBW7QS.mjs +124 -0
  75. package/dist/js/chunks/chunk-VTLBW7QS.mjs.map +7 -0
  76. package/dist/js/chunks/{chunk-JKNPQQWY.mjs → chunk-WJXDBPXQ.mjs} +28 -12
  77. package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +7 -0
  78. package/dist/js/chunks/{chunk-CDW6WIRT.mjs → chunk-XGHORT7J.mjs} +18 -11
  79. package/dist/js/chunks/chunk-XGHORT7J.mjs.map +7 -0
  80. package/dist/js/chunks/{chunk-7GKXUG4B.mjs → chunk-XH6BEEMY.mjs} +78 -25
  81. package/dist/js/chunks/chunk-XH6BEEMY.mjs.map +7 -0
  82. package/dist/js/chunks/{chunk-XO5WX3TK.mjs → chunk-YDCS5S3J.mjs} +2 -2
  83. package/dist/js/expressive.cjs +2540 -233
  84. package/dist/js/expressive.cjs.map +4 -4
  85. package/dist/js/expressive.js +2540 -233
  86. package/dist/js/expressive.js.map +4 -4
  87. package/dist/js/expressive.min.js +10 -10
  88. package/dist/js/expressive.min.js.map +4 -4
  89. package/dist/js/expressive.mjs +86 -38
  90. package/dist/js/expressive.mjs.map +1 -1
  91. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  92. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  93. package/dist/js/internal/behaviors/forms.mjs +2 -2
  94. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  95. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  96. package/dist/js/internal/components/appBar.mjs +2 -2
  97. package/dist/js/internal/components/autocomplete.mjs +4 -4
  98. package/dist/js/internal/components/barChart.mjs +10 -0
  99. package/dist/js/internal/components/barChart.mjs.map +7 -0
  100. package/dist/js/internal/components/buttonGroup.mjs +2 -2
  101. package/dist/js/internal/components/buttons.mjs +3 -3
  102. package/dist/js/internal/components/cards.mjs +3 -3
  103. package/dist/js/internal/components/carousel.mjs +3 -3
  104. package/dist/js/internal/components/characterCounter.mjs +2 -2
  105. package/dist/js/internal/components/chips.mjs +5 -5
  106. package/dist/js/internal/components/columnChart.mjs +9 -0
  107. package/dist/js/internal/components/columnChart.mjs.map +7 -0
  108. package/dist/js/internal/components/commandPalette.mjs +9 -0
  109. package/dist/js/internal/components/commandPalette.mjs.map +7 -0
  110. package/dist/js/internal/components/datepicker.mjs +6 -6
  111. package/dist/js/internal/components/expandingCard.mjs +3 -3
  112. package/dist/js/internal/components/heatmapChart.mjs +9 -0
  113. package/dist/js/internal/components/heatmapChart.mjs.map +7 -0
  114. package/dist/js/internal/components/index.mjs +79 -31
  115. package/dist/js/internal/components/lightbox.mjs +3 -3
  116. package/dist/js/internal/components/lineChart.mjs +12 -0
  117. package/dist/js/internal/components/lineChart.mjs.map +7 -0
  118. package/dist/js/internal/components/menu.mjs +3 -3
  119. package/dist/js/internal/components/messageScroller.mjs +9 -0
  120. package/dist/js/internal/components/messageScroller.mjs.map +7 -0
  121. package/dist/js/internal/components/mixedChart.mjs +10 -0
  122. package/dist/js/internal/components/mixedChart.mjs.map +7 -0
  123. package/dist/js/internal/components/navigationRail.mjs +2 -2
  124. package/dist/js/internal/components/pieChart.mjs +9 -0
  125. package/dist/js/internal/components/pieChart.mjs.map +7 -0
  126. package/dist/js/internal/components/questionnaire.mjs +9 -0
  127. package/dist/js/internal/components/questionnaire.mjs.map +7 -0
  128. package/dist/js/internal/components/radarChart.mjs +9 -0
  129. package/dist/js/internal/components/radarChart.mjs.map +7 -0
  130. package/dist/js/internal/components/radialChart.mjs +9 -0
  131. package/dist/js/internal/components/radialChart.mjs.map +7 -0
  132. package/dist/js/internal/components/registry.mjs +37 -25
  133. package/dist/js/internal/components/richTextEditor.mjs +9 -0
  134. package/dist/js/internal/components/richTextEditor.mjs.map +7 -0
  135. package/dist/js/internal/components/scrollspy.mjs +2 -2
  136. package/dist/js/internal/components/select.mjs +4 -4
  137. package/dist/js/internal/components/slider.mjs +3 -3
  138. package/dist/js/internal/components/snackbar.mjs +2 -2
  139. package/dist/js/internal/components/tabs.mjs +4 -4
  140. package/dist/js/internal/components/timepicker.mjs +4 -4
  141. package/dist/js/internal/components/tooltip.mjs +3 -3
  142. package/dist/js/internal/core/component.mjs +1 -1
  143. package/dist/js/internal/core/utils.mjs +1 -1
  144. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  145. package/dist/js/modular.mjs +86 -38
  146. package/dist/types/behaviors/forms.d.ts +22 -0
  147. package/dist/types/components/appBar.d.ts +1 -1
  148. package/dist/types/components/barChart.d.ts +24 -0
  149. package/dist/types/components/columnChart.d.ts +21 -0
  150. package/dist/types/components/commandPalette.d.ts +96 -0
  151. package/dist/types/components/datepicker.d.ts +5 -2
  152. package/dist/types/components/heatmapChart.d.ts +49 -0
  153. package/dist/types/components/index.d.ts +12 -0
  154. package/dist/types/components/lineChart.d.ts +134 -0
  155. package/dist/types/components/menu.d.ts +32 -0
  156. package/dist/types/components/messageScroller.d.ts +111 -0
  157. package/dist/types/components/mixedChart.d.ts +25 -0
  158. package/dist/types/components/pieChart.d.ts +40 -0
  159. package/dist/types/components/questionnaire.d.ts +96 -0
  160. package/dist/types/components/radarChart.d.ts +39 -0
  161. package/dist/types/components/radialChart.d.ts +45 -0
  162. package/dist/types/components/registry.d.ts +44 -0
  163. package/dist/types/components/richTextEditor.d.ts +71 -0
  164. package/dist/types/components/slider.d.ts +1 -0
  165. package/dist/types/components/snackbar.d.ts +6 -0
  166. package/dist/types/components/timepicker.d.ts +4 -1
  167. package/dist/types/components/tooltip.d.ts +2 -1
  168. package/dist/types/modular.d.ts +10 -1
  169. package/package.json +4 -1
  170. package/src/sass/README.md +3 -6
  171. package/src/sass/abstracts/_index.scss +1 -1
  172. package/src/sass/abstracts/_mixins.scss +226 -0
  173. package/src/sass/abstracts/_variables.scss +14 -0
  174. package/src/sass/base/_typography.scss +45 -0
  175. package/src/sass/components/_accordion.scss +161 -0
  176. package/src/sass/components/_aura.scss +119 -0
  177. package/src/sass/components/_avatar.scss +86 -0
  178. package/src/sass/components/_bar-chart.scss +285 -0
  179. package/src/sass/components/_bottom-sheet.scss +1 -0
  180. package/src/sass/components/_button-groups.scss +13 -3
  181. package/src/sass/components/_cards.scss +16 -13
  182. package/src/sass/components/_carousel.scss +9 -7
  183. package/src/sass/components/_column-chart.scss +134 -0
  184. package/src/sass/components/_command-palette.scss +140 -0
  185. package/src/sass/components/_countdown.scss +89 -0
  186. package/src/sass/components/_data-table.scss +188 -0
  187. package/src/sass/components/_dialog.scss +1 -0
  188. package/src/sass/components/_empty-state.scss +78 -0
  189. package/src/sass/components/_expanding-card.scss +3 -0
  190. package/src/sass/components/_heatmap-chart.scss +156 -0
  191. package/src/sass/components/_index.scss +27 -0
  192. package/src/sass/components/_kpi.scss +162 -0
  193. package/src/sass/components/_line-chart.scss +102 -0
  194. package/src/sass/components/_marquee.scss +111 -0
  195. package/src/sass/components/_menu.scss +10 -0
  196. package/src/sass/components/_message-scroller.scss +66 -0
  197. package/src/sass/components/_message.scss +202 -0
  198. package/src/sass/components/_mixed-chart.scss +157 -0
  199. package/src/sass/components/_navbar.scss +11 -6
  200. package/src/sass/components/_navigation-bar.scss +1 -0
  201. package/src/sass/components/_navigation-rail.scss +9 -0
  202. package/src/sass/components/_page-footer.scss +0 -11
  203. package/src/sass/components/_pie-chart.scss +203 -0
  204. package/src/sass/components/_popover.scss +112 -0
  205. package/src/sass/components/_progress.scss +25 -6
  206. package/src/sass/components/_questionnaire.scss +144 -0
  207. package/src/sass/components/_radar-chart.scss +205 -0
  208. package/src/sass/components/_radial-chart.scss +174 -0
  209. package/src/sass/components/_rich-text-editor.scss +99 -0
  210. package/src/sass/components/_search.scss +1 -0
  211. package/src/sass/components/_side-sheet.scss +1 -0
  212. package/src/sass/components/_skeleton.scss +81 -0
  213. package/src/sass/components/_snackbar.scss +2 -1
  214. package/src/sass/components/_stat.scss +86 -0
  215. package/src/sass/components/_stepper.scss +190 -0
  216. package/src/sass/components/_timeline.scss +114 -0
  217. package/src/sass/components/_timepicker.scss +2 -2
  218. package/src/sass/components/_toolbar.scss +2 -1
  219. package/src/sass/components/_tooltip.scss +2 -0
  220. package/src/sass/components/_tree.scss +139 -0
  221. package/src/sass/components/forms/_checkboxes.scss +2 -2
  222. package/src/sass/components/forms/_drop-zone.scss +128 -0
  223. package/src/sass/components/forms/_index.scss +2 -0
  224. package/src/sass/components/forms/_input-fields.scss +166 -15
  225. package/src/sass/components/forms/_radio-buttons.scss +2 -2
  226. package/src/sass/components/forms/_rating.scss +165 -0
  227. package/src/sass/components/forms/_slider.scss +51 -29
  228. package/src/sass/components/forms/_switches.scss +3 -3
  229. package/src/sass/tokens/_reference.scss +3 -15
  230. package/src/sass/utilities/_helpers.scss +14 -0
  231. package/src/sass/utilities/_index.scss +2 -0
  232. package/src/sass/utilities/_scroll-area.scss +35 -0
  233. package/src/sass/utilities/_shapes.scss +164 -0
  234. package/src/sass/utilities/_spacing.scss +29 -23
  235. package/src/sass/utilities/_visibility.scss +3 -2
  236. package/dist/js/chunks/chunk-74N6U5JJ.mjs.map +0 -7
  237. package/dist/js/chunks/chunk-7GKXUG4B.mjs.map +0 -7
  238. package/dist/js/chunks/chunk-AYYYWUJ4.mjs.map +0 -7
  239. package/dist/js/chunks/chunk-CDW6WIRT.mjs.map +0 -7
  240. package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +0 -7
  241. package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +0 -7
  242. package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +0 -7
  243. package/dist/js/chunks/chunk-I5KR22BY.mjs.map +0 -7
  244. package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +0 -7
  245. package/dist/js/chunks/chunk-JODJAGFS.mjs.map +0 -7
  246. package/dist/js/chunks/chunk-JR24UB4X.mjs +0 -100
  247. package/dist/js/chunks/chunk-JR24UB4X.mjs.map +0 -7
  248. package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +0 -7
  249. package/dist/js/chunks/chunk-PMBPAFAS.mjs +0 -7
  250. package/dist/js/chunks/chunk-PMBPAFAS.mjs.map +0 -7
  251. package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +0 -7
  252. package/dist/js/chunks/chunk-WWPAPHMA.mjs +0 -1
  253. /package/dist/js/chunks/{chunk-IMUPRRI6.mjs.map → chunk-3VOK6J7U.mjs.map} +0 -0
  254. /package/dist/js/chunks/{chunk-A3BJA7V4.mjs.map → chunk-6WLSDZ4O.mjs.map} +0 -0
  255. /package/dist/js/chunks/{chunk-KR44BSYQ.mjs.map → chunk-DLWYKFEI.mjs.map} +0 -0
  256. /package/dist/js/chunks/{chunk-SLFNPY5M.mjs.map → chunk-EC63CHXU.mjs.map} +0 -0
  257. /package/dist/js/chunks/{chunk-WWPAPHMA.mjs.map → chunk-NQLC3YMW.mjs.map} +0 -0
  258. /package/dist/js/chunks/{chunk-VAS6JQ6P.mjs.map → chunk-PIJ2TAR3.mjs.map} +0 -0
  259. /package/dist/js/chunks/{chunk-PIIAEYAJ.mjs.map → chunk-QDAL4IYN.mjs.map} +0 -0
  260. /package/dist/js/chunks/{chunk-FRB7TOCS.mjs.map → chunk-QV2JAWIZ.mjs.map} +0 -0
  261. /package/dist/js/chunks/{chunk-N3UHGN3N.mjs.map → chunk-QVVEWBOF.mjs.map} +0 -0
  262. /package/dist/js/chunks/{chunk-TYM6U5DY.mjs.map → chunk-UAEAQBRC.mjs.map} +0 -0
  263. /package/dist/js/chunks/{chunk-7UXHSYIA.mjs.map → chunk-UBLRRJ7N.mjs.map} +0 -0
  264. /package/dist/js/chunks/{chunk-JNPIWFJT.mjs.map → chunk-UNEMYWEW.mjs.map} +0 -0
  265. /package/dist/js/chunks/{chunk-XO5WX3TK.mjs.map → chunk-YDCS5S3J.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,388 @@ the format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.13.1] - 2026-10-08
9
+
10
+ ### Fixed
11
+
12
+ - The capability roadmap's source links point at a commit on `master`. The
13
+ 0.13.0 links pointed at a pull request commit that no longer exists, which
14
+ stopped the 0.13.0 release before it reached npm. 0.13.1 contains the
15
+ 0.13.0 changes below.
16
+
17
+ ## [0.13.0] - 2026-10-08
18
+
19
+ ### Added
20
+
21
+ - `.rich-text-editor` turns a `<textarea>` into a Tiptap editor with a
22
+ docked toolbar. The page installs Tiptap and passes its `Editor` class and
23
+ extensions to `RichTextEditor.init()`; ExpressiveCSS does not bundle it.
24
+ A toolbar button's `data-command` names a Tiptap command and
25
+ `data-attributes` holds its JSON argument. Buttons are disabled when their
26
+ command cannot run, and `toggle` commands set `aria-pressed` and `.active`.
27
+ The textarea keeps the editor's HTML, so it submits with its form, and
28
+ names the editable textbox.
29
+ - `.marquee` scrolls a row of logos, images or text without end. Write
30
+ the items in two `.marquee-content` groups, the second marked
31
+ `aria-hidden="true"`. `vertical`, `reverse` and `fade` change the
32
+ direction and edges, `paused` stops it, and hover or focus inside pauses
33
+ it. Reduced motion stops the scroll and hides the copy. CSS only.
34
+ - `<mark>` highlights part of a text in the tertiary container colors,
35
+ with no padding so a match inside a word keeps its spacing.
36
+ `::highlight(mark)` paints ranges registered with the CSS Custom
37
+ Highlight API the same way.
38
+ - `.message-scroller` scrolls a conversation. While the reader is at the
39
+ end it follows streamed replies, and scrolling up releases it. A message
40
+ appended with `data-scroll-anchor` starts a turn and is scrolled to the
41
+ top, leaving 64px of the previous message in view. Messages added above
42
+ keep the reader's place. A transcript can open at its end, its start or
43
+ its last turn, `scrollToMessage(id)` jumps to any message, and an optional
44
+ `.message-scroller-button` scrolls to the latest message.
45
+ - `form.questionnaire` asks one question at a time. Each `<fieldset>` is a
46
+ question with radio, checkbox or text answers, and footer buttons marked
47
+ `value="previous"`, `"skip"` and `"next"` move between them. The component
48
+ adds a progress row, checks each question with the browser's validation
49
+ (`data-required` asks for at least one checkbox), shows the question's
50
+ `.questionnaire-error`, offers Skip on optional questions and leaves out
51
+ disabled ones so pages can branch. The form submits normally, and without
52
+ JavaScript every question shows at once.
53
+ - KPI component: `article.kpi` is a card for one key figure, with its
54
+ label and value in a `<dl>`, a `.kpi-trend` chip that takes `up`, `down`
55
+ and `negative`, an optional `.kpi-icon`, a `.kpi-actions` corner button,
56
+ a sparkline chart, a progress bar and a `.kpi-footer`. A `negative` trend
57
+ also turns the sparkline to the error color. CSS only.
58
+ - `.countdown` shows a whole number from 0 to 999 and rolls its digits up
59
+ or down when `--md-comp-countdown-value` changes. The element's text is
60
+ the value screen readers read. `--md-comp-countdown-digits` pads with
61
+ leading zeros, and reduced motion turns the roll off. CSS only.
62
+ - `.aura` wraps one button, card or panel and runs a light around a ring
63
+ just outside it, to mark the one thing a screen most needs the user to
64
+ see. `dual`, `rainbow` and `glow` change the light, and tokens set its
65
+ color, width, corners and speed. The ring is fully rounded around a
66
+ button, stops turning under reduced motion and stays out of the
67
+ accessibility tree.
68
+ - The agent skill gains an `expressivecss-charts` guide for building charts
69
+ and chart dashboards. It covers choosing a chart for the question asked,
70
+ table cells the charts can read, chart cards with stats, tokens,
71
+ sparklines and redrawing. Its recipes cover a period switch, a KPI row,
72
+ a donut with its total, a budget meter, a gauge, a heatmap and a
73
+ dashboard section. The root skill routes chart work to it.
74
+ - `.mixed-chart` draws a `<figure>`'s data table as columns, lines and
75
+ areas on one plot, chosen by each series header's class: `column`,
76
+ `area`, or a line by default, with `dashed` lines. A series with `end`
77
+ is drawn against a second scale, set by `data-end-min` and
78
+ `data-end-max`, for values in other units. The tooltip, cursor points,
79
+ legend and `sparkline` work as in the line chart.
80
+ - `.radial-chart` draws a `<figure>`'s data table as rings, one per row,
81
+ filled clockwise from the top as a share of `data-max` (100 by default),
82
+ with a legend, tracks, and a tooltip that follows the pointer across the
83
+ rings or the arrow keys. `gauge` draws half circles, a `<tfoot>` row shows
84
+ in the middle, and `sparkline` is a small chart. Ring width, gap and track
85
+ color are tokens.
86
+ - `.heatmap-chart` draws a `<figure>`'s data table as a grid of cells shaded
87
+ from the lowest value to the highest, with the row headers beside it, the
88
+ column headers below and a scale naming the lowest and highest cells. A
89
+ tooltip follows the pointer or the arrow keys from cell to cell. `values`
90
+ writes each cell's text on it in black or white, whichever reads on the
91
+ shade; `data-label` shortens or hides a header on the grid; `data-min` and
92
+ `data-max` fix the scale.
93
+ - `.radar-chart` draws a `<figure>`'s data table as shapes on spokes from a
94
+ shared middle, one spoke per row clockwise from the top and one shape per
95
+ series, with each row's label past its spoke, a legend, and a tooltip that
96
+ follows the pointer round the chart or the arrow keys. `area` fills the
97
+ shapes, `points` marks each value, and `sparkline` is a small chart.
98
+ - `.pie-chart` draws a `<figure>`'s data table as slices of a whole,
99
+ clockwise from the top, with a legend of each row's cell and share and a
100
+ tooltip that follows the pointer round the pie or the arrow keys. `donut`
101
+ cuts a hole and shows a `<tfoot>` total in it, `values` writes each share
102
+ on its slice, and `sparkline` is a small pie. Further value columns show in
103
+ the tooltip.
104
+ - `.bar-chart` draws a `<figure>`'s data table as horizontal bars from zero,
105
+ with each row's label beside it, a legend, and a highlight band and tooltip
106
+ that follow the pointer or the up and down arrows. The plot grows with its
107
+ rows. `stacked`, `split`, `track`, `values` and `sparkline` vary it: `values`
108
+ writes each cell from its bar's base, running past a short bar, and a
109
+ stacked, split row on a track with `data-max` is a meter. It shares the column chart's runtime and markup, and
110
+ the bars grow leftwards in a right-to-left page.
111
+ - Line, column and bar charts: a tap on a touch screen shows the tapped row
112
+ instead of the first, keeps it when the finger lifts, and hides it when the
113
+ page scrolls.
114
+ - `.column-chart` draws a `<figure>`'s data table as columns from zero, one
115
+ group per row, with x labels, a legend, and a highlight band and tooltip that
116
+ follow the pointer or the arrow keys. `stacked`, `fade`, `track` and
117
+ `sparkline` vary it, and negative values hang below zero. It shares the line
118
+ chart's runtime, markup and accessibility; the table stays as the text
119
+ alternative and the no-JavaScript fallback.
120
+ - Line chart: `stacked` draws each series on the total of the ones before it
121
+ and fills the band between them, from a zero baseline. The tooltip still
122
+ shows each cell, and an empty cell breaks the series above it. The docs add chart card layouts with a period switch, a
123
+ compact chart and a side sparkline.
124
+
125
+ - Message component: `.message` lays out one message in a conversation with an
126
+ optional `.message-avatar`, `.message-header` and `.message-footer` around a
127
+ `.message-bubble`. `end` moves a message to the sender's side,
128
+ `.message-group` stacks consecutive messages and joins their corners, and
129
+ `.message-bubble.outlined` holds attachments. CSS only.
130
+ - Accordion component: `.accordion` stacks native `<details>` items as joined
131
+ tiles with a turning chevron. A shared `name` keeps one item open, and
132
+ opening animates where the engine can transition to `auto` height. CSS only.
133
+ - Data table component: `.data-table` wraps a native `<table>` in a scrolling,
134
+ outlined container with a sticky header row. `numeric` aligns number columns,
135
+ `dense` shortens rows, `aria-sort` on a header draws its sort arrow, and a
136
+ checked checkbox in the first cell selects the row. The page owns sorting.
137
+ CSS only.
138
+ - Avatar component: `.avatar` shows a person as a circular image, initials or
139
+ icon in `small`, default and `large` sizes. `.avatar-group` overlaps avatars
140
+ with a surface ring. CSS only.
141
+ - Skeleton component: `.skeleton` draws placeholder boxes, `text` lines and
142
+ `circle` shapes with a shimmer that stops under reduced motion. CSS only.
143
+ - Empty state component: `.empty-state` centers an icon or illustration, a
144
+ heading, supporting text and an `.empty-state-actions` row. CSS only.
145
+ - Popover component: `.popover` styles a native `[popover]` panel opened by a
146
+ `popovertarget` button and places it with CSS anchor positioning, below the
147
+ button by default or with `top`, `start` and `end`, flipping to stay on
148
+ screen. Use it for toggletips and small action panels. CSS only.
149
+ - Stepper component: `ol.stepper` numbers a fixed sequence of steps.
150
+ `aria-current="step"`, `complete` and `invalid` mark each step's state, and
151
+ the complete and invalid states are spoken through translatable tokens.
152
+ `vertical` stacks the steps and takes a `.stepper-content` panel. CSS only.
153
+ - Drop zone component: `.drop-zone` stretches a native file input over a large
154
+ labelled target. The Forms behavior marks a drag with `dragover` and lists
155
+ each chosen file's name and size in `.drop-zone-files`.
156
+ - Text fields take a trailing `.icon-button.suffix` as a clickable control.
157
+ `password-toggle` on that button shows and hides the password and reports
158
+ its state with `aria-pressed`. `input.otp` draws one native input as a row of
159
+ one-time code cells.
160
+ - Menu `contextMenu` option, also set by `data-context-menu` on the trigger:
161
+ the trigger is a region, and its menu opens at the pointer on right-click,
162
+ long-press, the menu key or Shift+F10, flipping to stay on screen.
163
+ - Timeline component: `ol.timeline` marks each event with a dot joined to the
164
+ next by a line, or with a leading icon in a tonal circle. CSS only.
165
+ - Stat component: `dl.stats` lays out key figures as wrapping tiles, with a
166
+ `.stat-change` line that takes `up`, `down` and `negative`. CSS only.
167
+ - Tree component: `ul.tree` nests lists of native disclosures and links with
168
+ guide lines, turning chevrons and an `aria-current` row. It takes no tree
169
+ role. CSS only.
170
+ - Rating component: `fieldset.rating` draws native radios as stars that fill
171
+ up to the choice and preview on hover; `.rating[role="img"]` with
172
+ `--md-comp-rating-value` shows a score, halves included. CSS only.
173
+ - Command palette component: `dialog.command-palette` with a search input and
174
+ a list of link or button commands. `CommandPalette` filters by text and
175
+ `data-keywords`, moves the active command with the arrow keys, runs it with
176
+ Enter and opens on Ctrl+K or Command+K. `AutoInit()` starts it.
177
+ - `<kbd>` is drawn as a keycap; an outer `<kbd>` around a combination stays
178
+ plain.
179
+ - `.line-chart` draws a `<figure>`'s data table as smooth SVG lines with x
180
+ labels, a legend, and a cursor and tooltip that follow the pointer or the
181
+ arrow keys. `area`, `fade`, `sparkline` and `<th class="dashed">` vary it.
182
+ The table stays as the text alternative and the no-JavaScript fallback.
183
+ - `.scroll-area` styles native scrollbars with theme-aware colors and thin
184
+ sizing, with a WebKit fallback and system scrollbars in forced-colors mode.
185
+ - `.shape-*` cuts images, videos, buttons, and other elements to twenty
186
+ rounded shapes after the M3 Expressive shape library, such as
187
+ `.shape-scallop-6`, `.shape-spark`, and `.shape-bloom-4`. Focused shapes draw
188
+ their focus ring inside the edge. CSS only.
189
+ - Frosted glass for floating surfaces. `--expressive-glass: true` on `:root` or
190
+ a wrapper turns it on. `--expressive-glass-blur` (default `16px`) sets the
191
+ frost thickness, and `--expressive-glass-opacity` (default `72%`) sets how
192
+ much of the surface color is kept. Sass `$expressive-glass`,
193
+ `$expressive-glass-blur`, and `$expressive-glass-opacity` change the defaults,
194
+ and `--expressive-glass: false` turns the effect off within a region. Surfaces
195
+ turn solid when the user prefers reduced transparency or more contrast.
196
+ - The docs site opens on a landing page with a features overview, a live
197
+ code demo and the installation guide. Ctrl+K, Command+K or the app bar's
198
+ search button opens a search of every documentation page. Pages now carry
199
+ a meta description and Open Graph tags, and the site publishes
200
+ `sitemap.xml` and `robots.txt`.
201
+
202
+ ### Changed
203
+
204
+ - The default theme seed is Mist Iris (`#c6a0f6`). The docs picker uses the
205
+ same default for its initial value and Reset action. Set `--md-source` or
206
+ Sass `$md-source` to retain an application's existing brand color.
207
+ - The agent skill workflow is version 0.9.0 and costs fewer tokens to read.
208
+ Sub-skill scope now lives only in each frontmatter description, without
209
+ repeated "When to use" sections. Generated component guides no
210
+ longer repeat the page description or the generic rule and documentation
211
+ notes, and the theming, usage, dashboard and charts guides link to the
212
+ reference that owns a rule instead of restating it. Each sub-skill says when
213
+ to read each reference, long references open with a contents list, and the
214
+ design guide links its dated component reviews directly. A new delegation
215
+ reference explains how to split a large audit across subagents and merge
216
+ their findings. The install and runtime guides end with checklists, and the
217
+ charts guide asks for honest scales and labelled sample data. Component
218
+ guides drop the source list and the two notes every guide repeated; the
219
+ root skill states the rule-ID convention once and tells agents to treat
220
+ page content and tool output as evidence, not instructions. Performance
221
+ measurement moved from the design guide into its own reference.
222
+
223
+ ### Fixed
224
+
225
+ - A focused line, column, bar or pie chart no longer cancels Escape when its
226
+ tooltip is already hidden, so a dialog or sheet around the chart can close.
227
+ Pressing a chart's plot away from its marks focuses it without showing the
228
+ first row's tooltip; keyboard focus still shows it.
229
+ - A drawn chart's hidden data table no longer makes a narrow tile or its page
230
+ scroll. The table keeps a fixed 1px layout, as the heatmap's already did,
231
+ and hangs up from the figure's bottom edge, so its rows cannot add overflow
232
+ below it.
233
+ - The line chart docs' chart cards pad their stat and chart off the card's
234
+ border.
235
+
236
+ ## [0.12.0] - 2026-10-01
237
+
238
+ ### Added
239
+
240
+ - Utility classes for shrinking flex and grid children, scrolling or clipping
241
+ overflow, logical inline spacing and text alignment, and text wrapping.
242
+ Physical spacing and alignment classes retain their existing behavior.
243
+ - `.visually-hidden-focusable` hides skip links and other content until the
244
+ element or a descendant receives focus. Use it independently of `.visually-hidden`.
245
+
246
+ ### Fixed
247
+
248
+ - Spacing output and documentation omit padding-auto classes, since CSS does
249
+ not accept `auto` for padding. Margin-auto helpers remain available.
250
+ - Carousel preserves an active mouse drag when delayed resize work completes.
251
+ - Snackbar ignores flick velocity after a pause of 100ms or more before release;
252
+ dragging past the distance threshold still dismisses it.
253
+ - Tooltip supports `open()` in its public TypeScript declarations and honors
254
+ `open(true)` without requiring hover or focus.
255
+ - NavigationRail leaves Escape to a nested component that already handled it.
256
+ Its own Escape collapse restores focus to the rail toggle while preserving
257
+ outside focus and focus moved by close callbacks.
258
+ - Menu respects `closeOnClick` inside open and closed shadow roots, preserving
259
+ submenu navigation, outside dismissal, and touch scrolling.
260
+ - Multiple FormSelect options with the same value can be selected and
261
+ deselected independently, matching their native option state.
262
+ - Chips supports programmatic addition without an editable input and accepts
263
+ numeric ID `0` during initialization and addition. An empty autocomplete menu
264
+ does not prevent adding a custom chip.
265
+ - Autocomplete keeps its open state synchronized with its Menu, accepts
266
+ preselected IDs before data loads, and bubbles selection changes to form
267
+ listeners. Chips lets an open suggestion menu handle Enter.
268
+ - Timepicker reloads edited host values when opened and cancels obsolete clock
269
+ updates, so delayed transitions cannot overwrite newer edits or update a
270
+ destroyed instance.
271
+ - Datepicker honors custom parsers during initialization and reopening, rejects
272
+ reversed range edits through every input path, and preserves an empty
273
+ single-date selection after clearing.
274
+ - Each Datepicker range input emits its own change event. Generated date inputs
275
+ opt out of AutoInit so repeated initialization cannot create duplicate pickers.
276
+ - Component `init()` methods return an empty array for empty element collections,
277
+ matching their TypeScript return types.
278
+ - Datepicker can reopen a range when only its end date is set. Clearing
279
+ either endpoint preserves the other and removes incomplete range shading.
280
+ - A cancelled Snackbar swipe cannot carry its velocity into the next gesture.
281
+ - Bottom and side sheets recognize a recent flick when the release coordinates
282
+ match the last pointer move, while paused or reversed short drags stay open.
283
+ - Carousel preserves ordinary button and link clicks inside slides while keeping
284
+ mouse dragging available, including in swipeable tab panels.
285
+ - Chips autocomplete preserves the query while filtering and clears it after
286
+ an item is selected.
287
+ - Destroying a Timepicker cancels pending automatic submission, so an old
288
+ instance cannot overwrite a replacement input value.
289
+ - Datepicker and Timepicker confirmation buttons invoke their callbacks once
290
+ per Enter press. Both TypeScript option interfaces accept `autoSubmit: false`.
291
+ - Closing a Menu preserves focus on an outside input or another control.
292
+ - Docked Datepicker and Timepicker popovers account for their positioning
293
+ parent, including `.field` wrappers and scrolled containers.
294
+ - Destroying Chips also destroys its owned Autocomplete and Menu.
295
+ - Tooltip teardown restores authored rich content and preserves existing
296
+ description associations, allowing the same content to be initialized again.
297
+ - Snackbars can reuse an element supplied through `snackbarId` without deleting
298
+ it or retaining callbacks and controls from an earlier instance.
299
+ - A vertical touch swipe that starts on a carousel scrolls the page again, and
300
+ pinch-zoom works over it. The carousel tracks no longer restrict
301
+ `touch-action`.
302
+ - In Firefox the top app bar is `surface` at rest instead of
303
+ `surface-container`. The scroll fill now runs only where `animation-timeline`
304
+ is supported.
305
+ - `.slider.stops` draws its dots. Each dot sits at a step position on the
306
+ active track, including centered and right-to-left sliders. Vertical and
307
+ two-handle sliders show no dots.
308
+ - In Firefox an indeterminate `<progress class="progress">` shows its track and
309
+ a moving 40% bar, which stays still under reduced motion.
310
+ - In Firefox a date input with a Datepicker shows its value. The formatted
311
+ overlay only applies in engines that render it.
312
+ - Mouse drag moves the carousel track again in the horizontal full-screen
313
+ layout and in `.uncontained.snap`. Snapping used to pull the track back on
314
+ every move.
315
+ - Editing or clearing a Datepicker `<input type="date">` with the keyboard
316
+ updates the formatted date painted over the field in Chrome and Safari.
317
+ After the field lost focus it used to show the previous date.
318
+ - Clicking a Datepicker date input no longer opens the browser's date picker on
319
+ top of a visible Datepicker calendar (`openByDefault` or `container`). When
320
+ the calendar is hidden, the default, the browser picker still opens.
321
+ - Leading `.prefix` and trailing `.suffix` icons stay visible on a Datepicker
322
+ date input in Chrome and Safari. The input's filled background used to cover
323
+ them.
324
+ - `.slider.stops` puts each dot at `min` plus a whole number of steps, so a
325
+ `step` that does not divide the range no longer spreads the dots over the
326
+ whole track. With no `step`, `step="any"`, or a zero or negative step, the
327
+ slider shows no dots. Dots follow the range input's direction and leave the
328
+ inset icon uncovered.
329
+ - `Slider.destroy()` removes the custom properties it set on the input and its
330
+ host, so stop dots and the track fill no longer stay painted. Inline values
331
+ set before init come back.
332
+ - A `<header>` that holds only a `nav.tabs` is no longer styled as a top app
333
+ bar, so it no longer sticks to the top of the page or takes the app bar fill.
334
+ - Medium and large app bars no longer send the page back to the top when they
335
+ collapse. A short or slow scroll near the top used to snap back and leave the
336
+ bar switching between sizes. The bar now collapses once the page has
337
+ scrolled by the height it gives up, and expands when the page returns to the
338
+ top of the bar.
339
+
340
+ ### Changed
341
+
342
+ - The ExpressiveCSS skill bundles the starter page and the five layout
343
+ templates under `assets/templates/`, and the Install and Design guides point
344
+ to them. The Install guide gives a plain `npm install` command, and its
345
+ minimum page no longer puts the page heading in an app bar without
346
+ destinations.
347
+ - Skill guides put their steps under their own headings instead of under
348
+ "Do not use when". The framework contribution path moved to
349
+ `references/contributing.md`.
350
+ - Component guides list the API reference subsections they leave out. Their
351
+ examples use real link targets, and menu actions are buttons. The Buttons
352
+ reference calls `circle` a round common button and points icon buttons to
353
+ `.icon-button`.
354
+ - Documentation examples no longer use `href="#!"` in copyable code. Menu,
355
+ split-button, app-bar and tooltip actions are `<button type="button">`,
356
+ and code samples link to realistic paths. Live navigation demos on the docs
357
+ site keep `#!`. The app-bar Search icon is a button. The API reference drops
358
+ rendered demo text that had been copied into it, and the Lightbox guide
359
+ includes its options and methods.
360
+ - The footer partial no longer carries sticky-footer rules. Their nested
361
+ `:has()` selector was invalid, so browsers had always dropped them. The
362
+ Footer page now gives the two rules to add yourself, as the API reference
363
+ already did.
364
+ - The Auto Init page and the API reference list every component `AutoInit()`
365
+ starts. They add AppBar and ExpandingCard, give Cards its real selector, and
366
+ list both picker spellings, `.datepicker, .date-picker` and
367
+ `.timepicker, .time-picker`. Both name all eight
368
+ behaviors the bundle starts on import, including Dialogs, BottomSheets and
369
+ SideSheets, and call the range control Slider instead of Range.
370
+ - Documentation code samples match their demos and the current framework. The
371
+ Date picker and Time picker samples select `.date-picker` and `.time-picker`,
372
+ the Slider samples and the M3 guidelines use `Expressive.Slider`, and card
373
+ samples drop the unstyled `supporting-text` class. The Grid, circular image,
374
+ character counter, snackbar dismiss and full-screen dialog samples now match
375
+ the demos next to them. The Scrollspy sample uses the canonical
376
+ `hide-on-compact-only` instead of the legacy `hide-on-small-only` alias.
377
+ - Documentation no longer describes removed classes or markup. Typography
378
+ names `body-large`, `body-medium` and `body-small`, and Select describes the
379
+ `.field` wrapper the plugin reuses or creates instead of `.select-wrapper`.
380
+ Tabs no longer mentions `tabs-horizontal`, and Tooltips no longer says the
381
+ plugin adds `.material-tooltip`. Grid offsets use the Compact through
382
+ Extra-large breakpoint names.
383
+ - Getting started lists `fonts/` and `modular.mjs` in the `dist/` tree and
384
+ the minified files in the project tree. Its README link opens the "Reduce
385
+ page downloads" section.
386
+ - On the docs site, the Start navigation item opens the landing page again.
387
+ Slider demos keep their stop dots, and carousel demo links no longer point
388
+ at anchors that do not exist.
389
+
8
390
  ## [0.11.0] - 2026-09-30
9
391
 
10
392
  ### Added
@@ -94,7 +476,7 @@ the format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
94
476
 
95
477
  - **Offline design context for the ExpressiveCSS skill.** The generator now
96
478
  copies the hard rules, window-size tables, component chooser, screen recipes,
97
- anatomy cheat sheet, and Materialize name map from `m3-guidelines.md` into
479
+ anatomy cheat sheet, and retired name map from `m3-guidelines.md` into
98
480
  `skills/expressivecss/references/design-rules.md`, and the root, Design,
99
481
  Usage, and Install guides route to it. JavaScript component guides inline the
100
482
  options table and method names from `llm.md`. The Install guide carries a
@@ -703,7 +1085,7 @@ semantics sweep keeps rendering — nothing warns at runtime — so each
703
1085
  the same promise with no keyboard model behind it. `semantics.json` records
704
1086
  the rejection.
705
1087
 
706
- **Migration.** `.searchbar`, the pre-1.0 Materialize navbar search field,
1088
+ **Migration.** `.searchbar`, the pre-1.0 navbar search field,
707
1089
  is now an alias of `.search-bar` and moves out of `forms/_input-fields.scss`
708
1090
  into `components/_search.scss`. Old markup keeps working and picks up the M3
709
1091
  container; `tests/m3-naming.test.js` holds the alias to every rule.
@@ -1049,7 +1431,7 @@ semantics sweep keeps rendering — nothing warns at runtime — so each
1049
1431
  `height` above and leave `full-screen` off.
1050
1432
 
1051
1433
  - **The coverflow carousel layout is gone.** `.coverflow` was the 3D
1052
- perspective tween inherited from the vendored MaterializeCSS source, and
1434
+ perspective tween inherited from the older source, and
1053
1435
  Material 3 defines it at no layout and no size. It hand-wrote a momentum
1054
1436
  simulation the browser already performs — velocity smoothing over a
1055
1437
  `Date.now()` delta, exponential-decay easing toward a target, modular index
@@ -1216,7 +1598,7 @@ semantics sweep keeps rendering — nothing warns at runtime — so each
1216
1598
  instead of the spec's 56. Keyed on the shared `$icon` list now, the way
1217
1599
  `_buttons` and `_toolbar` already were.
1218
1600
  - **Five more tokens were declared or referenced but not both**, found by the
1219
- new check below. The time picker's AM/PM buttons referenced Materialize's
1601
+ new check below. The time picker's AM/PM buttons referenced retired
1220
1602
  `--btn-padding` and `--btn-border-radius`, which no longer exist — the
1221
1603
  declarations were invalid at computed-value time, which does *not* fall back
1222
1604
  to the rule underneath, so the padding rendered as 0 while a base button rule
@@ -1597,7 +1979,7 @@ LLM-facing documentation, and the docs site's own templates.
1597
1979
  ### Fixed
1598
1980
 
1599
1981
  - **`llm.md` taught classes that do not exist.** It is the markup contract other
1600
- tools and models read, and several sections still carried Materialize-era
1982
+ tools and models read, and several sections still carried retired
1601
1983
  names the Material Design 3 rewrite removed. Each replacement was verified
1602
1984
  against `dist/css/expressive.css` and `src/ts`:
1603
1985
  - `.btn-floating`, `.btn-large` and `.btn-small` (16 references) — a FAB is
@@ -1680,7 +2062,7 @@ guidelines document. No breaking changes.
1680
2062
 
1681
2063
  ## [0.5.0] - 2026-08-19
1682
2064
 
1683
- The release that finishes moving the vendored Materialize surface onto Material
2065
+ The release that finishes moving the older component set onto Material
1684
2066
  Design 3 Expressive. Components with no M3 counterpart are gone, several were
1685
2067
  renamed to their M3 names, and the color layer now carries the full role set.
1686
2068
  Pre-1.0, so the breaking changes below are not gated behind a deprecation cycle
@@ -1765,7 +2147,10 @@ are no compatibility aliases.
1765
2147
  - `.tabs` nested in a header or app bar as a secondary row. `.tabs` is a
1766
2148
  standalone component; the `.tabs.transparent` app bar variant is gone with it.
1767
2149
 
1768
- [Unreleased]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.11.0...HEAD
2150
+ [Unreleased]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.13.1...HEAD
2151
+ [0.13.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.13.0...v0.13.1
2152
+ [0.13.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.12.0...v0.13.0
2153
+ [0.12.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.11.0...v0.12.0
1769
2154
  [0.11.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.10.1...v0.11.0
1770
2155
  [0.10.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.10.0...v0.10.1
1771
2156
  [0.10.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.9.1...v0.10.0
package/README.md CHANGED
@@ -4,7 +4,7 @@ ExpressiveCSS is a Material Design 3 front-end framework built with Sass and
4
4
  TypeScript. It provides theme tokens, layout and utility classes, styled form
5
5
  controls, and JavaScript components in browser, ES module, and CommonJS builds.
6
6
 
7
- > ExpressiveCSS version `0.11.0` is under active development.
7
+ > ExpressiveCSS version `0.13.1` is under active development.
8
8
 
9
9
  Documentation: [www.expressivecss.com](https://www.expressivecss.com)
10
10
 
@@ -326,6 +326,42 @@ After building, run `node --test tests/selective-builds.test.js`. It records raw
326
326
  gzip, and Brotli sizes in `.cache/selective-builds/sizes.json`. The browser suite
327
327
  records font requests and full/selective screenshots separately in that directory.
328
328
 
329
+ ### Frosted glass
330
+
331
+ Floating surfaces can blur the page behind them. The effect is off by default.
332
+ Turn it on in CSS for the whole page or for one region:
333
+
334
+ ```css
335
+ :root {
336
+ --expressive-glass: true;
337
+ --expressive-glass-blur: 16px; /* frost thickness */
338
+ --expressive-glass-opacity: 72%; /* share of the surface color kept; 100% is solid */
339
+ }
340
+ ```
341
+
342
+ The blur and opacity lines are optional and show the defaults. Set
343
+ `--expressive-glass` on `:root` or on an element that contains the surfaces. The
344
+ browser reads the value from a surface's parent, so setting it on the surface
345
+ itself has no effect. `--expressive-glass: false` turns the effect off again inside
346
+ a region.
347
+
348
+ Sass builds can turn glass on by default and change the default values. The CSS
349
+ properties still override these settings:
350
+
351
+ ```scss
352
+ @use "@expressivecss/expressive/src/sass/expressive" with (
353
+ $expressive-glass: true,
354
+ $expressive-glass-blur: 16px,
355
+ $expressive-glass-opacity: 72%
356
+ );
357
+ ```
358
+
359
+ The effect applies to menus, tooltips, dialogs, bottom and side sheets, the
360
+ snackbar, the navigation bar and rail, toolbars, and the search view. Grouped menus
361
+ and a modal navigation rail keep a solid surface. The rail would otherwise clip its
362
+ own scrim. Users who request reduced transparency or more contrast in their system
363
+ settings see solid surfaces. The switch uses CSS style queries.
364
+
329
365
  ### Themes
330
366
 
331
367
  ExpressiveCSS uses the `theme` attribute on the root element: