@expressivecss/expressive 0.12.0 → 0.14.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 (258) hide show
  1. package/CHANGELOG.md +339 -1
  2. package/README.md +38 -1
  3. package/dist/css/expressive.css +5342 -105
  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-3DHK5CZU.mjs +105 -0
  11. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +7 -0
  12. package/dist/js/chunks/{chunk-HB6IW7QQ.mjs → chunk-3GVFZ4XO.mjs} +3 -3
  13. package/dist/js/chunks/{chunk-HLDXZ7XB.mjs → chunk-4HZMB7LI.mjs} +22 -8
  14. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +7 -0
  15. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +270 -0
  16. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +7 -0
  17. package/dist/js/chunks/chunk-4TKTLGEM.mjs +262 -0
  18. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +7 -0
  19. package/dist/js/chunks/{chunk-3VOK6J7U.mjs → chunk-5BKHWHYY.mjs} +13 -6
  20. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +7 -0
  21. package/dist/js/chunks/{chunk-H2WA4XHH.mjs → chunk-5HQSGDZ5.mjs} +16 -7
  22. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +7 -0
  23. package/dist/js/chunks/{chunk-LWBQIX5J.mjs → chunk-A7ALMYUR.mjs} +41 -44
  24. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +7 -0
  25. package/dist/js/chunks/chunk-BG6ZRB5H.mjs +154 -0
  26. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +7 -0
  27. package/dist/js/chunks/{chunk-DLWYKFEI.mjs → chunk-CUQPB25U.mjs} +3 -3
  28. package/dist/js/chunks/{chunk-6WLSDZ4O.mjs → chunk-DAIU5SLG.mjs} +2 -2
  29. package/dist/js/chunks/chunk-FS7XY3HT.mjs +124 -0
  30. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +7 -0
  31. package/dist/js/chunks/{chunk-WJXDBPXQ.mjs → chunk-GIW4K4SE.mjs} +8 -12
  32. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +7 -0
  33. package/dist/js/chunks/chunk-GUB3TNO2.mjs +164 -0
  34. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +7 -0
  35. package/dist/js/chunks/chunk-GVGT6MIU.mjs +47 -0
  36. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +7 -0
  37. package/dist/js/chunks/{chunk-HNFSMIBY.mjs → chunk-GZKEFWPM.mjs} +83 -22
  38. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +7 -0
  39. package/dist/js/chunks/chunk-HKT2S7VM.mjs +48 -0
  40. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +7 -0
  41. package/dist/js/chunks/chunk-ILP3PDTL.mjs +187 -0
  42. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +7 -0
  43. package/dist/js/chunks/{chunk-YSBCHYXP.mjs → chunk-JIDMQGK6.mjs} +118 -13
  44. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +7 -0
  45. package/dist/js/chunks/chunk-KBNN3QDH.mjs +7 -0
  46. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +7 -0
  47. package/dist/js/chunks/{chunk-NNYP33NB.mjs → chunk-KHV6DZXX.mjs} +5 -4
  48. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +7 -0
  49. package/dist/js/chunks/{chunk-RFZZCYVU.mjs → chunk-KY6U46SM.mjs} +3 -3
  50. package/dist/js/chunks/{chunk-CKQP6P76.mjs → chunk-LRZMJZ3T.mjs} +4 -3
  51. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +7 -0
  52. package/dist/js/chunks/{chunk-6OMRGML6.mjs → chunk-MNPROCZF.mjs} +4 -4
  53. package/dist/js/chunks/{chunk-6OMRGML6.mjs.map → chunk-MNPROCZF.mjs.map} +2 -2
  54. package/dist/js/chunks/{chunk-QV2JAWIZ.mjs → chunk-MZ6Z24BX.mjs} +3 -2
  55. package/dist/js/chunks/{chunk-QV2JAWIZ.mjs.map → chunk-MZ6Z24BX.mjs.map} +2 -2
  56. package/dist/js/chunks/chunk-NS2UMNZV.mjs +292 -0
  57. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +7 -0
  58. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +406 -0
  59. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +7 -0
  60. package/dist/js/chunks/{chunk-UBLRRJ7N.mjs → chunk-PM655FXL.mjs} +2 -2
  61. package/dist/js/chunks/{chunk-IFXVDDDH.mjs → chunk-QERLECVU.mjs} +3 -3
  62. package/dist/js/chunks/{chunk-GZWPXXY6.mjs → chunk-QJABDLSD.mjs} +5 -2
  63. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +7 -0
  64. package/dist/js/chunks/chunk-RHRQKTTX.mjs +139 -0
  65. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +7 -0
  66. package/dist/js/chunks/{chunk-UNEMYWEW.mjs → chunk-S3XDFGSZ.mjs} +2 -2
  67. package/dist/js/chunks/chunk-SPETGK25.mjs +59 -0
  68. package/dist/js/chunks/chunk-SPETGK25.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-TBM3FT7G.mjs +398 -0
  70. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-UEXCIMJZ.mjs +214 -0
  72. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-VGZSAFTX.mjs +173 -0
  74. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-UAEAQBRC.mjs → chunk-X7OCHZVF.mjs} +2 -2
  76. package/dist/js/chunks/{chunk-EC63CHXU.mjs → chunk-YMSXJON6.mjs} +7 -6
  77. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +7 -0
  78. package/dist/js/chunks/{chunk-QVVEWBOF.mjs → chunk-Z2NRKI7R.mjs} +2 -2
  79. package/dist/js/chunks/{chunk-PIJ2TAR3.mjs → chunk-ZAS25YFD.mjs} +2 -2
  80. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +1 -0
  81. package/dist/js/expressive.cjs +3113 -148
  82. package/dist/js/expressive.cjs.map +4 -4
  83. package/dist/js/expressive.js +3113 -148
  84. package/dist/js/expressive.js.map +4 -4
  85. package/dist/js/expressive.min.js +11 -11
  86. package/dist/js/expressive.min.js.map +4 -4
  87. package/dist/js/expressive.mjs +95 -35
  88. package/dist/js/expressive.mjs.map +1 -1
  89. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  90. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  91. package/dist/js/internal/behaviors/forms.mjs +2 -2
  92. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  93. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  94. package/dist/js/internal/components/autocomplete.mjs +3 -3
  95. package/dist/js/internal/components/barChart.mjs +10 -0
  96. package/dist/js/internal/components/barChart.mjs.map +7 -0
  97. package/dist/js/internal/components/buttons.mjs +2 -2
  98. package/dist/js/internal/components/cards.mjs +2 -2
  99. package/dist/js/internal/components/carousel.mjs +2 -2
  100. package/dist/js/internal/components/chips.mjs +4 -4
  101. package/dist/js/internal/components/columnChart.mjs +9 -0
  102. package/dist/js/internal/components/columnChart.mjs.map +7 -0
  103. package/dist/js/internal/components/commandPalette.mjs +9 -0
  104. package/dist/js/internal/components/commandPalette.mjs.map +7 -0
  105. package/dist/js/internal/components/confetti.mjs +8 -0
  106. package/dist/js/internal/components/confetti.mjs.map +7 -0
  107. package/dist/js/internal/components/datepicker.mjs +5 -5
  108. package/dist/js/internal/components/expandingCard.mjs +2 -2
  109. package/dist/js/internal/components/heatmapChart.mjs +9 -0
  110. package/dist/js/internal/components/heatmapChart.mjs.map +7 -0
  111. package/dist/js/internal/components/index.mjs +88 -28
  112. package/dist/js/internal/components/lightbox.mjs +2 -2
  113. package/dist/js/internal/components/lineChart.mjs +12 -0
  114. package/dist/js/internal/components/lineChart.mjs.map +7 -0
  115. package/dist/js/internal/components/mapView.mjs +9 -0
  116. package/dist/js/internal/components/mapView.mjs.map +7 -0
  117. package/dist/js/internal/components/menu.mjs +2 -2
  118. package/dist/js/internal/components/messageScroller.mjs +9 -0
  119. package/dist/js/internal/components/messageScroller.mjs.map +7 -0
  120. package/dist/js/internal/components/mixedChart.mjs +10 -0
  121. package/dist/js/internal/components/mixedChart.mjs.map +7 -0
  122. package/dist/js/internal/components/particles.mjs +8 -0
  123. package/dist/js/internal/components/particles.mjs.map +7 -0
  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 +35 -20
  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 +1 -1
  136. package/dist/js/internal/components/select.mjs +3 -3
  137. package/dist/js/internal/components/slider.mjs +2 -2
  138. package/dist/js/internal/components/snackbar.mjs +2 -2
  139. package/dist/js/internal/components/tabs.mjs +3 -3
  140. package/dist/js/internal/components/timepicker.mjs +3 -3
  141. package/dist/js/internal/components/tooltip.mjs +2 -2
  142. package/dist/js/internal/core/utils.mjs +1 -1
  143. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  144. package/dist/js/modular.mjs +95 -35
  145. package/dist/types/behaviors/forms.d.ts +27 -0
  146. package/dist/types/components/barChart.d.ts +24 -0
  147. package/dist/types/components/carousel.d.ts +2 -0
  148. package/dist/types/components/columnChart.d.ts +21 -0
  149. package/dist/types/components/commandPalette.d.ts +96 -0
  150. package/dist/types/components/confetti.d.ts +103 -0
  151. package/dist/types/components/datepicker.d.ts +2 -0
  152. package/dist/types/components/heatmapChart.d.ts +49 -0
  153. package/dist/types/components/index.d.ts +15 -0
  154. package/dist/types/components/lineChart.d.ts +134 -0
  155. package/dist/types/components/mapView.d.ts +151 -0
  156. package/dist/types/components/menu.d.ts +31 -0
  157. package/dist/types/components/messageScroller.d.ts +111 -0
  158. package/dist/types/components/mixedChart.d.ts +25 -0
  159. package/dist/types/components/particles.d.ts +72 -0
  160. package/dist/types/components/pieChart.d.ts +43 -0
  161. package/dist/types/components/questionnaire.d.ts +96 -0
  162. package/dist/types/components/radarChart.d.ts +39 -0
  163. package/dist/types/components/radialChart.d.ts +45 -0
  164. package/dist/types/components/registry.d.ts +52 -0
  165. package/dist/types/components/richTextEditor.d.ts +71 -0
  166. package/dist/types/components/slider.d.ts +1 -1
  167. package/dist/types/components/snackbar.d.ts +2 -0
  168. package/dist/types/components/tabs.d.ts +1 -1
  169. package/dist/types/modular.d.ts +10 -1
  170. package/dist/types/plugins/dockedDisplayPlugin.d.ts +3 -3
  171. package/package.json +5 -1
  172. package/src/sass/README.md +3 -6
  173. package/src/sass/abstracts/_index.scss +1 -1
  174. package/src/sass/abstracts/_mixins.scss +226 -0
  175. package/src/sass/abstracts/_variables.scss +14 -0
  176. package/src/sass/base/_typography.scss +45 -0
  177. package/src/sass/components/_accordion.scss +161 -0
  178. package/src/sass/components/_aura.scss +119 -0
  179. package/src/sass/components/_avatar.scss +86 -0
  180. package/src/sass/components/_bar-chart.scss +285 -0
  181. package/src/sass/components/_bottom-sheet.scss +1 -0
  182. package/src/sass/components/_button-groups.scss +13 -3
  183. package/src/sass/components/_buttons.scss +1 -1
  184. package/src/sass/components/_cards.scss +16 -13
  185. package/src/sass/components/_column-chart.scss +134 -0
  186. package/src/sass/components/_command-palette.scss +140 -0
  187. package/src/sass/components/_confetti.scss +14 -0
  188. package/src/sass/components/_countdown.scss +89 -0
  189. package/src/sass/components/_data-table.scss +188 -0
  190. package/src/sass/components/_dialog.scss +1 -0
  191. package/src/sass/components/_empty-state.scss +78 -0
  192. package/src/sass/components/_expanding-card.scss +3 -0
  193. package/src/sass/components/_heatmap-chart.scss +156 -0
  194. package/src/sass/components/_index.scss +30 -0
  195. package/src/sass/components/_kpi.scss +162 -0
  196. package/src/sass/components/_line-chart.scss +102 -0
  197. package/src/sass/components/_map.scss +188 -0
  198. package/src/sass/components/_marquee.scss +111 -0
  199. package/src/sass/components/_menu.scss +10 -0
  200. package/src/sass/components/_message-scroller.scss +66 -0
  201. package/src/sass/components/_message.scss +202 -0
  202. package/src/sass/components/_mixed-chart.scss +157 -0
  203. package/src/sass/components/_navigation-bar.scss +1 -0
  204. package/src/sass/components/_navigation-rail.scss +9 -0
  205. package/src/sass/components/_particles.scss +14 -0
  206. package/src/sass/components/_pie-chart.scss +203 -0
  207. package/src/sass/components/_popover.scss +112 -0
  208. package/src/sass/components/_questionnaire.scss +144 -0
  209. package/src/sass/components/_radar-chart.scss +205 -0
  210. package/src/sass/components/_radial-chart.scss +174 -0
  211. package/src/sass/components/_rich-text-editor.scss +99 -0
  212. package/src/sass/components/_search.scss +1 -0
  213. package/src/sass/components/_side-sheet.scss +1 -0
  214. package/src/sass/components/_skeleton.scss +81 -0
  215. package/src/sass/components/_snackbar.scss +1 -0
  216. package/src/sass/components/_stat.scss +86 -0
  217. package/src/sass/components/_stepper.scss +190 -0
  218. package/src/sass/components/_table_of_contents.scss +3 -1
  219. package/src/sass/components/_timeline.scss +114 -0
  220. package/src/sass/components/_toolbar.scss +1 -0
  221. package/src/sass/components/_tooltip.scss +2 -0
  222. package/src/sass/components/_tree.scss +139 -0
  223. package/src/sass/components/forms/_checkboxes.scss +7 -2
  224. package/src/sass/components/forms/_drop-zone.scss +128 -0
  225. package/src/sass/components/forms/_index.scss +2 -0
  226. package/src/sass/components/forms/_input-fields.scss +133 -2
  227. package/src/sass/components/forms/_rating.scss +165 -0
  228. package/src/sass/tokens/_reference.scss +3 -15
  229. package/src/sass/utilities/_index.scss +2 -0
  230. package/src/sass/utilities/_scroll-area.scss +35 -0
  231. package/src/sass/utilities/_shapes.scss +164 -0
  232. package/dist/js/chunks/chunk-3VOK6J7U.mjs.map +0 -7
  233. package/dist/js/chunks/chunk-CKQP6P76.mjs.map +0 -7
  234. package/dist/js/chunks/chunk-EC63CHXU.mjs.map +0 -7
  235. package/dist/js/chunks/chunk-G3I5H2U3.mjs +0 -7
  236. package/dist/js/chunks/chunk-G3I5H2U3.mjs.map +0 -7
  237. package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +0 -7
  238. package/dist/js/chunks/chunk-H2WA4XHH.mjs.map +0 -7
  239. package/dist/js/chunks/chunk-HLDXZ7XB.mjs.map +0 -7
  240. package/dist/js/chunks/chunk-HNFSMIBY.mjs.map +0 -7
  241. package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +0 -7
  242. package/dist/js/chunks/chunk-NNYP33NB.mjs.map +0 -7
  243. package/dist/js/chunks/chunk-PSSHQWCX.mjs +0 -100
  244. package/dist/js/chunks/chunk-PSSHQWCX.mjs.map +0 -7
  245. package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +0 -7
  246. package/dist/js/chunks/chunk-WWPAPHMA.mjs +0 -1
  247. package/dist/js/chunks/chunk-YSBCHYXP.mjs.map +0 -7
  248. /package/dist/js/chunks/{chunk-HB6IW7QQ.mjs.map → chunk-3GVFZ4XO.mjs.map} +0 -0
  249. /package/dist/js/chunks/{chunk-DLWYKFEI.mjs.map → chunk-CUQPB25U.mjs.map} +0 -0
  250. /package/dist/js/chunks/{chunk-6WLSDZ4O.mjs.map → chunk-DAIU5SLG.mjs.map} +0 -0
  251. /package/dist/js/chunks/{chunk-RFZZCYVU.mjs.map → chunk-KY6U46SM.mjs.map} +0 -0
  252. /package/dist/js/chunks/{chunk-UBLRRJ7N.mjs.map → chunk-PM655FXL.mjs.map} +0 -0
  253. /package/dist/js/chunks/{chunk-IFXVDDDH.mjs.map → chunk-QERLECVU.mjs.map} +0 -0
  254. /package/dist/js/chunks/{chunk-UNEMYWEW.mjs.map → chunk-S3XDFGSZ.mjs.map} +0 -0
  255. /package/dist/js/chunks/{chunk-UAEAQBRC.mjs.map → chunk-X7OCHZVF.mjs.map} +0 -0
  256. /package/dist/js/chunks/{chunk-QVVEWBOF.mjs.map → chunk-Z2NRKI7R.mjs.map} +0 -0
  257. /package/dist/js/chunks/{chunk-PIJ2TAR3.mjs.map → chunk-ZAS25YFD.mjs.map} +0 -0
  258. /package/dist/js/chunks/{chunk-WWPAPHMA.mjs.map → chunk-ZKZKNSLC.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,340 @@ the format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.14.1] - 2026-10-11
9
+
10
+ ### Fixed
11
+
12
+ - The capability roadmap's source links point at a commit on `master`. The
13
+ 0.14.0 links pointed at a pull request commit that the squash merge left
14
+ off `master`, which stopped the 0.14.0 release before it reached npm. A
15
+ test now fails when the pinned commit is not an ancestor of the checkout.
16
+ 0.14.1 contains the 0.14.0 changes below.
17
+
18
+ ## [0.14.0] - 2026-10-11
19
+
20
+ ### Added
21
+
22
+ - The `expressivecss-review` agent skill reviews a page, template, fragment
23
+ or screenshot with five specialist subagents (theme and tokens, layout,
24
+ component markup, lifecycle and accessibility, framework rules). It reuses
25
+ the `expressivecss` guides, version resolver and `expressivecss-lint`, and
26
+ returns one report scored out of 100 with five 20-point sections. One or two
27
+ critical findings cap the score at 69, and three or more at 49.
28
+ - `.map` is an interactive map built on MapLibre. The page installs
29
+ `maplibre-gl` and passes the module to `MapView.init()`; ExpressiveCSS does
30
+ not bundle it. `.map-marker` children sit at their `data-lng-lat`, can open
31
+ a `.map-popup` named by `aria-controls`, show a `.map-marker-label` and be
32
+ dragged with `data-draggable`. `.map-controls` buttons zoom, reset north,
33
+ locate the reader and go full screen. `addRoute()`, `addArcs()` and
34
+ `addClusters()` draw data in theme colors. The default OpenFreeMap style
35
+ follows the light or dark theme.
36
+ - `.confetti` bursts theme-colored confetti. A button with the class bursts
37
+ from its center over the page when clicked, a `<canvas class="confetti">`
38
+ bursts inside its own box, and `Expressive.Confetti.fire(options)` bursts
39
+ over the page from script. Options cover the count, angle, spread, speed,
40
+ gravity, drift, colors, shapes and size. The page canvas draws above an
41
+ open modal dialog and lets clicks through. Nothing is drawn when the reader
42
+ prefers reduced motion.
43
+ - `<canvas class="particles">` fills its positioned ancestor with drifting
44
+ dots in the theme's on-surface color that lean toward the pointer. Options
45
+ cover the count, size, color, drift and how far and how fast the dots
46
+ follow the pointer. The canvas lets clicks through, and under reduced
47
+ motion the dots are drawn once and stay still.
48
+
49
+ ### Changed
50
+
51
+ - The docs site has a new shell. A rail holds the five catalogue groups from
52
+ 840px, with the current group's pages beside it from 1200px. Below 1200px
53
+ the menu button opens the catalogue in a side sheet. Each page opens with a
54
+ breadcrumb, title, description and a "View as Markdown" link, and the table
55
+ of contents sits in a sticky column. Page content and URLs are unchanged.
56
+ - The `expressivecss` skill is version 0.10.0. It adds guides for map,
57
+ confetti and particles. Its version resolver sizes file reads to the file
58
+ and reports a file that grows during a read as changed.
59
+
60
+ ### Fixed
61
+
62
+ - Idle components no longer listen to the whole document. Carousel attaches
63
+ its pointer listeners while a mouse press is down, Tooltip listens for Escape
64
+ while open, and the docked date picker listens for outside clicks while
65
+ shown.
66
+ - Calling `Forms.Init()`, `BottomSheets.Init()` or `SideSheets.Init()` again,
67
+ as a page that loads both the root and `/modular` entries can, no longer
68
+ adds a second set of document listeners.
69
+ - `Menu.destroy()` no longer throws when the menu's target element is missing,
70
+ which used to leave its listeners attached.
71
+ - `Utils.throttle` times calls with `performance.now()`, so a system clock
72
+ change cannot hold a call back.
73
+ - More hot-path fixes:
74
+ - ScrollSpy skips the document-wide link lookup while the same section
75
+ stays current.
76
+ - MapView finds its zoom buttons once, not on every `move` event.
77
+ - PieChart reuses one percent formatter per legend instead of making one
78
+ per row.
79
+ - Snackbar measures its width once per swipe, not on every pointer move.
80
+ - Slider updates once per drag frame. Its `pointermove` update also ran
81
+ before the browser moved the value.
82
+ - The heatmap tooltip measures its cell before writing to the page.
83
+ - Datepicker checks each calendar row's markup once.
84
+ - Less work on hot paths:
85
+ - Datepicker arrow keys inside the shown month move focus without
86
+ redrawing the grid.
87
+ - Autocomplete renders the result list once per keystroke while its menu is
88
+ open. It used to render the previous results first, and twice more with
89
+ `isMultiSelect`.
90
+ - Particles stop animating and tracking the pointer while the canvas is off
91
+ screen.
92
+ - Carousel reads all item positions before writing parallax offsets and works
93
+ out item sizes before setting them, so scrolling no longer forces a style
94
+ recalculation per item.
95
+ - Tabs throttle their window resize handling.
96
+ - `Utils.throttle` no longer stalls when the system clock moves backwards.
97
+ - Autocomplete with `allowUnsafeHTML` highlights the typed text inside the
98
+ label's text only. It used to insert the highlight into the HTML string, so a
99
+ match inside an attribute value could close the attribute and turn the rest
100
+ of the sanitized label into markup.
101
+ - Table-of-contents links are 48dp tall, the Material touch target, instead
102
+ of 32dp. `--md-comp-toc-item-height` sets a denser height.
103
+ - In Firefox, a carousel that moved several items while its item sizes were
104
+ still changing could slide back to an earlier item after it had settled.
105
+ Firefox re-snapped the track to whichever item it had passed mid-move.
106
+ Snapping is now off while the carousel scrolls to an item and comes back
107
+ once the item is in place.
108
+
109
+ ## [0.13.1] - 2026-10-08
110
+
111
+ ### Fixed
112
+
113
+ - The capability roadmap's source links point at a commit on `master`. The
114
+ 0.13.0 links pointed at a pull request commit that no longer exists, which
115
+ stopped the 0.13.0 release before it reached npm. 0.13.1 contains the
116
+ 0.13.0 changes below.
117
+
118
+ ## [0.13.0] - 2026-10-08
119
+
120
+ ### Added
121
+
122
+ - `.rich-text-editor` turns a `<textarea>` into a Tiptap editor with a
123
+ docked toolbar. The page installs Tiptap and passes its `Editor` class and
124
+ extensions to `RichTextEditor.init()`; ExpressiveCSS does not bundle it.
125
+ A toolbar button's `data-command` names a Tiptap command and
126
+ `data-attributes` holds its JSON argument. Buttons are disabled when their
127
+ command cannot run, and `toggle` commands set `aria-pressed` and `.active`.
128
+ The textarea keeps the editor's HTML, so it submits with its form, and
129
+ names the editable textbox.
130
+ - `.marquee` scrolls a row of logos, images or text without end. Write
131
+ the items in two `.marquee-content` groups, the second marked
132
+ `aria-hidden="true"`. `vertical`, `reverse` and `fade` change the
133
+ direction and edges, `paused` stops it, and hover or focus inside pauses
134
+ it. Reduced motion stops the scroll and hides the copy. CSS only.
135
+ - `<mark>` highlights part of a text in the tertiary container colors,
136
+ with no padding so a match inside a word keeps its spacing.
137
+ `::highlight(mark)` paints ranges registered with the CSS Custom
138
+ Highlight API the same way.
139
+ - `.message-scroller` scrolls a conversation. While the reader is at the
140
+ end it follows streamed replies, and scrolling up releases it. A message
141
+ appended with `data-scroll-anchor` starts a turn and is scrolled to the
142
+ top, leaving 64px of the previous message in view. Messages added above
143
+ keep the reader's place. A transcript can open at its end, its start or
144
+ its last turn, `scrollToMessage(id)` jumps to any message, and an optional
145
+ `.message-scroller-button` scrolls to the latest message.
146
+ - `form.questionnaire` asks one question at a time. Each `<fieldset>` is a
147
+ question with radio, checkbox or text answers, and footer buttons marked
148
+ `value="previous"`, `"skip"` and `"next"` move between them. The component
149
+ adds a progress row, checks each question with the browser's validation
150
+ (`data-required` asks for at least one checkbox), shows the question's
151
+ `.questionnaire-error`, offers Skip on optional questions and leaves out
152
+ disabled ones so pages can branch. The form submits normally, and without
153
+ JavaScript every question shows at once.
154
+ - KPI component: `article.kpi` is a card for one key figure, with its
155
+ label and value in a `<dl>`, a `.kpi-trend` chip that takes `up`, `down`
156
+ and `negative`, an optional `.kpi-icon`, a `.kpi-actions` corner button,
157
+ a sparkline chart, a progress bar and a `.kpi-footer`. A `negative` trend
158
+ also turns the sparkline to the error color. CSS only.
159
+ - `.countdown` shows a whole number from 0 to 999 and rolls its digits up
160
+ or down when `--md-comp-countdown-value` changes. The element's text is
161
+ the value screen readers read. `--md-comp-countdown-digits` pads with
162
+ leading zeros, and reduced motion turns the roll off. CSS only.
163
+ - `.aura` wraps one button, card or panel and runs a light around a ring
164
+ just outside it, to mark the one thing a screen most needs the user to
165
+ see. `dual`, `rainbow` and `glow` change the light, and tokens set its
166
+ color, width, corners and speed. The ring is fully rounded around a
167
+ button, stops turning under reduced motion and stays out of the
168
+ accessibility tree.
169
+ - The agent skill gains an `expressivecss-charts` guide for building charts
170
+ and chart dashboards. It covers choosing a chart for the question asked,
171
+ table cells the charts can read, chart cards with stats, tokens,
172
+ sparklines and redrawing. Its recipes cover a period switch, a KPI row,
173
+ a donut with its total, a budget meter, a gauge, a heatmap and a
174
+ dashboard section. The root skill routes chart work to it.
175
+ - `.mixed-chart` draws a `<figure>`'s data table as columns, lines and
176
+ areas on one plot, chosen by each series header's class: `column`,
177
+ `area`, or a line by default, with `dashed` lines. A series with `end`
178
+ is drawn against a second scale, set by `data-end-min` and
179
+ `data-end-max`, for values in other units. The tooltip, cursor points,
180
+ legend and `sparkline` work as in the line chart.
181
+ - `.radial-chart` draws a `<figure>`'s data table as rings, one per row,
182
+ filled clockwise from the top as a share of `data-max` (100 by default),
183
+ with a legend, tracks, and a tooltip that follows the pointer across the
184
+ rings or the arrow keys. `gauge` draws half circles, a `<tfoot>` row shows
185
+ in the middle, and `sparkline` is a small chart. Ring width, gap and track
186
+ color are tokens.
187
+ - `.heatmap-chart` draws a `<figure>`'s data table as a grid of cells shaded
188
+ from the lowest value to the highest, with the row headers beside it, the
189
+ column headers below and a scale naming the lowest and highest cells. A
190
+ tooltip follows the pointer or the arrow keys from cell to cell. `values`
191
+ writes each cell's text on it in black or white, whichever reads on the
192
+ shade; `data-label` shortens or hides a header on the grid; `data-min` and
193
+ `data-max` fix the scale.
194
+ - `.radar-chart` draws a `<figure>`'s data table as shapes on spokes from a
195
+ shared middle, one spoke per row clockwise from the top and one shape per
196
+ series, with each row's label past its spoke, a legend, and a tooltip that
197
+ follows the pointer round the chart or the arrow keys. `area` fills the
198
+ shapes, `points` marks each value, and `sparkline` is a small chart.
199
+ - `.pie-chart` draws a `<figure>`'s data table as slices of a whole,
200
+ clockwise from the top, with a legend of each row's cell and share and a
201
+ tooltip that follows the pointer round the pie or the arrow keys. `donut`
202
+ cuts a hole and shows a `<tfoot>` total in it, `values` writes each share
203
+ on its slice, and `sparkline` is a small pie. Further value columns show in
204
+ the tooltip.
205
+ - `.bar-chart` draws a `<figure>`'s data table as horizontal bars from zero,
206
+ with each row's label beside it, a legend, and a highlight band and tooltip
207
+ that follow the pointer or the up and down arrows. The plot grows with its
208
+ rows. `stacked`, `split`, `track`, `values` and `sparkline` vary it: `values`
209
+ writes each cell from its bar's base, running past a short bar, and a
210
+ stacked, split row on a track with `data-max` is a meter. It shares the column chart's runtime and markup, and
211
+ the bars grow leftwards in a right-to-left page.
212
+ - Line, column and bar charts: a tap on a touch screen shows the tapped row
213
+ instead of the first, keeps it when the finger lifts, and hides it when the
214
+ page scrolls.
215
+ - `.column-chart` draws a `<figure>`'s data table as columns from zero, one
216
+ group per row, with x labels, a legend, and a highlight band and tooltip that
217
+ follow the pointer or the arrow keys. `stacked`, `fade`, `track` and
218
+ `sparkline` vary it, and negative values hang below zero. It shares the line
219
+ chart's runtime, markup and accessibility; the table stays as the text
220
+ alternative and the no-JavaScript fallback.
221
+ - Line chart: `stacked` draws each series on the total of the ones before it
222
+ and fills the band between them, from a zero baseline. The tooltip still
223
+ shows each cell, and an empty cell breaks the series above it. The docs add chart card layouts with a period switch, a
224
+ compact chart and a side sparkline.
225
+
226
+ - Message component: `.message` lays out one message in a conversation with an
227
+ optional `.message-avatar`, `.message-header` and `.message-footer` around a
228
+ `.message-bubble`. `end` moves a message to the sender's side,
229
+ `.message-group` stacks consecutive messages and joins their corners, and
230
+ `.message-bubble.outlined` holds attachments. CSS only.
231
+ - Accordion component: `.accordion` stacks native `<details>` items as joined
232
+ tiles with a turning chevron. A shared `name` keeps one item open, and
233
+ opening animates where the engine can transition to `auto` height. CSS only.
234
+ - Data table component: `.data-table` wraps a native `<table>` in a scrolling,
235
+ outlined container with a sticky header row. `numeric` aligns number columns,
236
+ `dense` shortens rows, `aria-sort` on a header draws its sort arrow, and a
237
+ checked checkbox in the first cell selects the row. The page owns sorting.
238
+ CSS only.
239
+ - Avatar component: `.avatar` shows a person as a circular image, initials or
240
+ icon in `small`, default and `large` sizes. `.avatar-group` overlaps avatars
241
+ with a surface ring. CSS only.
242
+ - Skeleton component: `.skeleton` draws placeholder boxes, `text` lines and
243
+ `circle` shapes with a shimmer that stops under reduced motion. CSS only.
244
+ - Empty state component: `.empty-state` centers an icon or illustration, a
245
+ heading, supporting text and an `.empty-state-actions` row. CSS only.
246
+ - Popover component: `.popover` styles a native `[popover]` panel opened by a
247
+ `popovertarget` button and places it with CSS anchor positioning, below the
248
+ button by default or with `top`, `start` and `end`, flipping to stay on
249
+ screen. Use it for toggletips and small action panels. CSS only.
250
+ - Stepper component: `ol.stepper` numbers a fixed sequence of steps.
251
+ `aria-current="step"`, `complete` and `invalid` mark each step's state, and
252
+ the complete and invalid states are spoken through translatable tokens.
253
+ `vertical` stacks the steps and takes a `.stepper-content` panel. CSS only.
254
+ - Drop zone component: `.drop-zone` stretches a native file input over a large
255
+ labelled target. The Forms behavior marks a drag with `dragover` and lists
256
+ each chosen file's name and size in `.drop-zone-files`.
257
+ - Text fields take a trailing `.icon-button.suffix` as a clickable control.
258
+ `password-toggle` on that button shows and hides the password and reports
259
+ its state with `aria-pressed`. `input.otp` draws one native input as a row of
260
+ one-time code cells.
261
+ - Menu `contextMenu` option, also set by `data-context-menu` on the trigger:
262
+ the trigger is a region, and its menu opens at the pointer on right-click,
263
+ long-press, the menu key or Shift+F10, flipping to stay on screen.
264
+ - Timeline component: `ol.timeline` marks each event with a dot joined to the
265
+ next by a line, or with a leading icon in a tonal circle. CSS only.
266
+ - Stat component: `dl.stats` lays out key figures as wrapping tiles, with a
267
+ `.stat-change` line that takes `up`, `down` and `negative`. CSS only.
268
+ - Tree component: `ul.tree` nests lists of native disclosures and links with
269
+ guide lines, turning chevrons and an `aria-current` row. It takes no tree
270
+ role. CSS only.
271
+ - Rating component: `fieldset.rating` draws native radios as stars that fill
272
+ up to the choice and preview on hover; `.rating[role="img"]` with
273
+ `--md-comp-rating-value` shows a score, halves included. CSS only.
274
+ - Command palette component: `dialog.command-palette` with a search input and
275
+ a list of link or button commands. `CommandPalette` filters by text and
276
+ `data-keywords`, moves the active command with the arrow keys, runs it with
277
+ Enter and opens on Ctrl+K or Command+K. `AutoInit()` starts it.
278
+ - `<kbd>` is drawn as a keycap; an outer `<kbd>` around a combination stays
279
+ plain.
280
+ - `.line-chart` draws a `<figure>`'s data table as smooth SVG lines with x
281
+ labels, a legend, and a cursor and tooltip that follow the pointer or the
282
+ arrow keys. `area`, `fade`, `sparkline` and `<th class="dashed">` vary it.
283
+ The table stays as the text alternative and the no-JavaScript fallback.
284
+ - `.scroll-area` styles native scrollbars with theme-aware colors and thin
285
+ sizing, with a WebKit fallback and system scrollbars in forced-colors mode.
286
+ - `.shape-*` cuts images, videos, buttons, and other elements to twenty
287
+ rounded shapes after the M3 Expressive shape library, such as
288
+ `.shape-scallop-6`, `.shape-spark`, and `.shape-bloom-4`. Focused shapes draw
289
+ their focus ring inside the edge. CSS only.
290
+ - Frosted glass for floating surfaces. `--expressive-glass: true` on `:root` or
291
+ a wrapper turns it on. `--expressive-glass-blur` (default `16px`) sets the
292
+ frost thickness, and `--expressive-glass-opacity` (default `72%`) sets how
293
+ much of the surface color is kept. Sass `$expressive-glass`,
294
+ `$expressive-glass-blur`, and `$expressive-glass-opacity` change the defaults,
295
+ and `--expressive-glass: false` turns the effect off within a region. Surfaces
296
+ turn solid when the user prefers reduced transparency or more contrast.
297
+ - The docs site opens on a landing page with a features overview, a live
298
+ code demo and the installation guide. Ctrl+K, Command+K or the app bar's
299
+ search button opens a search of every documentation page. Pages now carry
300
+ a meta description and Open Graph tags, and the site publishes
301
+ `sitemap.xml` and `robots.txt`.
302
+
303
+ ### Changed
304
+
305
+ - The default theme seed is Mist Iris (`#c6a0f6`). The docs picker uses the
306
+ same default for its initial value and Reset action. Set `--md-source` or
307
+ Sass `$md-source` to retain an application's existing brand color.
308
+ - The agent skill workflow is version 0.9.0 and costs fewer tokens to read.
309
+ Sub-skill scope now lives only in each frontmatter description, without
310
+ repeated "When to use" sections. Generated component guides no
311
+ longer repeat the page description or the generic rule and documentation
312
+ notes, and the theming, usage, dashboard and charts guides link to the
313
+ reference that owns a rule instead of restating it. Each sub-skill says when
314
+ to read each reference, long references open with a contents list, and the
315
+ design guide links its dated component reviews directly. A new delegation
316
+ reference explains how to split a large audit across subagents and merge
317
+ their findings. The install and runtime guides end with checklists, and the
318
+ charts guide asks for honest scales and labelled sample data. Component
319
+ guides drop the source list and the two notes every guide repeated; the
320
+ root skill states the rule-ID convention once and tells agents to treat
321
+ page content and tool output as evidence, not instructions. Performance
322
+ measurement moved from the design guide into its own reference.
323
+
324
+ ### Fixed
325
+
326
+ - A checkbox label written as `<input type="checkbox"><span>…</span>` keeps
327
+ links and other inline elements in its text. The span was a flex box, so
328
+ each text run and link became a separate item: the spaces around a link
329
+ disappeared and the words split into columns. It now lays out as inline
330
+ text, and one line still sits centered in the 48px target.
331
+ - A focused line, column, bar or pie chart no longer cancels Escape when its
332
+ tooltip is already hidden, so a dialog or sheet around the chart can close.
333
+ Pressing a chart's plot away from its marks focuses it without showing the
334
+ first row's tooltip; keyboard focus still shows it.
335
+ - A drawn chart's hidden data table no longer makes a narrow tile or its page
336
+ scroll. The table keeps a fixed 1px layout, as the heatmap's already did,
337
+ and hangs up from the figure's bottom edge, so its rows cannot add overflow
338
+ below it.
339
+ - The line chart docs' chart cards pad their stat and chart off the card's
340
+ border.
341
+
8
342
  ## [0.12.0] - 2026-10-01
9
343
 
10
344
  ### Added
@@ -1919,7 +2253,11 @@ are no compatibility aliases.
1919
2253
  - `.tabs` nested in a header or app bar as a secondary row. `.tabs` is a
1920
2254
  standalone component; the `.tabs.transparent` app bar variant is gone with it.
1921
2255
 
1922
- [Unreleased]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.12.0...HEAD
2256
+ [Unreleased]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.14.1...HEAD
2257
+ [0.14.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.14.0...v0.14.1
2258
+ [0.14.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.13.1...v0.14.0
2259
+ [0.13.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.13.0...v0.13.1
2260
+ [0.13.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.12.0...v0.13.0
1923
2261
  [0.12.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.11.0...v0.12.0
1924
2262
  [0.11.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.10.1...v0.11.0
1925
2263
  [0.10.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.10.0...v0.10.1
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.12.0` is under active development.
7
+ > ExpressiveCSS version `0.14.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:
@@ -380,6 +416,7 @@ The documentation source lives in `docs/src/` and is published at
380
416
  | `docs/src` | Astro documentation and examples | Yes |
381
417
  | `mcp/expressivecss` | Independently versioned MCP package | Yes |
382
418
  | `skills/expressivecss` | Agent guidance and generated component references | Yes |
419
+ | `skills/expressivecss-review` | Scored interface review that runs five specialist subagents | Yes |
383
420
  | `scripts`, `tests`, `visual` | Generators, verification, and test tooling | Source only |
384
421
  | `semantics.json`, `llm.md`, `m3-guidelines.md` | Markup rules, API reference, design guidance | Yes |
385
422
  | `SEMANTICS.md`, generated skill/MCP data | Derived files checked for drift | Yes |