@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
@@ -0,0 +1,99 @@
1
+ @use "../abstracts" as *;
2
+
3
+ // Rich text editor. An outlined frame around a docked .toolbar and the
4
+ // Tiptap editor, which the script mounts in .rich-text-editor-content after
5
+ // the hidden <textarea>. The outline thickens to primary while the editor has
6
+ // focus, as an outlined text field does. Without the script the textarea
7
+ // stays visible and the toolbar, which could do nothing, is hidden.
8
+ //
9
+ // Tokens:
10
+ // --md-comp-rich-text-editor-min-height 160px (editable area)
11
+ // --md-comp-rich-text-editor-shape 16px (frame corners)
12
+
13
+ .rich-text-editor {
14
+ --md-comp-rich-text-editor-min-height: 160px;
15
+ --md-comp-rich-text-editor-shape: 16px;
16
+
17
+ display: flex;
18
+ flex-direction: column;
19
+ overflow: hidden;
20
+ border: 1px solid var(--md-sys-color-outline);
21
+ border-radius: var(--md-comp-rich-text-editor-shape);
22
+ background-color: var(--md-sys-color-surface);
23
+ color: var(--md-sys-color-on-surface);
24
+
25
+ &:has(> .rich-text-editor-content :focus) {
26
+ outline: 1px solid var(--md-sys-color-primary);
27
+ border-color: var(--md-sys-color-primary);
28
+ }
29
+
30
+ &:not(:has(> .rich-text-editor-content)) > .toolbar {
31
+ display: none;
32
+ }
33
+
34
+ > textarea {
35
+ min-height: var(--md-comp-rich-text-editor-min-height);
36
+ border: none;
37
+ }
38
+
39
+ // A docked bar spaces its actions across the full width; formatting
40
+ // buttons read better packed at the start and wrapped.
41
+ > .toolbar {
42
+ --md-comp-toolbar-container-height: 56px;
43
+ --md-comp-toolbar-leading-space: 4px;
44
+ --md-comp-toolbar-trailing-space: 4px;
45
+
46
+ flex-wrap: wrap;
47
+ justify-content: flex-start;
48
+ gap: var(--md-comp-toolbar-between-space);
49
+ padding-block: 4px;
50
+ border-block-end: 1px solid var(--md-sys-color-outline-variant);
51
+ }
52
+ }
53
+
54
+ .rich-text-editor-content {
55
+ display: flex;
56
+ flex: 1;
57
+ flex-direction: column;
58
+ @include typescale("body-large");
59
+
60
+ // The element Tiptap makes editable.
61
+ > [contenteditable] {
62
+ flex: 1;
63
+ min-height: var(--md-comp-rich-text-editor-min-height);
64
+ padding: 16px;
65
+ outline: none;
66
+ overflow-wrap: break-word;
67
+ white-space: pre-wrap;
68
+
69
+ > :first-child {
70
+ margin-block-start: 0;
71
+ }
72
+
73
+ > :last-child {
74
+ margin-block-end: 0;
75
+ }
76
+
77
+ :not(pre) > code,
78
+ pre {
79
+ border-radius: 8px;
80
+ background-color: var(--md-sys-color-surface-container-highest);
81
+ font-family: ui-monospace, monospace;
82
+ }
83
+
84
+ :not(pre) > code {
85
+ padding: 0 4px;
86
+ }
87
+
88
+ pre {
89
+ padding: 12px 16px;
90
+ overflow-x: auto;
91
+ white-space: pre;
92
+ }
93
+
94
+ hr {
95
+ border: none;
96
+ border-block-start: 1px solid var(--md-sys-color-outline-variant);
97
+ }
98
+ }
99
+ }
@@ -194,6 +194,7 @@ $_bar: ":is(.search-bar, .searchbar)";
194
194
  background-color: var(--md-comp-search-view-container-color);
195
195
  color: var(--md-sys-color-on-surface);
196
196
  @include z-depth("3");
197
+ @include glass(var(--md-comp-search-view-container-color));
197
198
 
198
199
  // Two ways this surface is closed, and an author `display` beats both of the
199
200
  // UA rules that do the hiding - `[hidden] { display: none }` for the docked
@@ -49,6 +49,7 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
49
49
  outline: none;
50
50
  translate: var(--md-comp-side-sheet-shift) 0;
51
51
  transition: translate 280ms ease, border-radius 200ms ease;
52
+ @include glass(var(--md-comp-side-sheet-container-color));
52
53
 
53
54
  &:not(:modal) {
54
55
  z-index: 1100;
@@ -0,0 +1,81 @@
1
+ @use "../abstracts" as *;
2
+
3
+ // Skeleton. An empty block that holds the place of content still loading,
4
+ // with a shimmer passing across it. The block has no text and nothing to
5
+ // announce: mark the region being filled with aria-busy="true", and report
6
+ // the wait through a status such as a loading indicator.
7
+ //
8
+ // Shapes:
9
+ // (default) a box; size it with width and height
10
+ // .text one line of body text; the last of several runs shorter
11
+ // .circle an avatar-sized circle
12
+ //
13
+ // Reduced motion stops the shimmer and leaves the shapes.
14
+ //
15
+ // Tokens:
16
+ // --md-comp-skeleton-color surface-container-highest
17
+ // --md-comp-skeleton-shimmer-color surface at 50%
18
+ // --md-comp-skeleton-shape 8px (text 4px)
19
+ // --md-comp-skeleton-circle-size 40px
20
+
21
+ .skeleton {
22
+ --md-comp-skeleton-color: var(--md-sys-color-surface-container-highest);
23
+ --md-comp-skeleton-shimmer-color: color-mix(
24
+ in oklab,
25
+ var(--md-sys-color-surface) 50%,
26
+ transparent
27
+ );
28
+ --md-comp-skeleton-shape: 8px;
29
+ --md-comp-skeleton-circle-size: 40px;
30
+
31
+ display: block;
32
+ box-sizing: border-box;
33
+ border-radius: var(--md-comp-skeleton-shape);
34
+ background-color: var(--md-comp-skeleton-color);
35
+ background-image: linear-gradient(
36
+ 90deg,
37
+ transparent 0%,
38
+ var(--md-comp-skeleton-shimmer-color) 50%,
39
+ transparent 100%
40
+ );
41
+ background-repeat: no-repeat;
42
+ background-size: 50% 100%;
43
+ animation: skeleton-shimmer 1.5s linear infinite;
44
+
45
+ &:dir(rtl) {
46
+ animation-direction: reverse;
47
+ }
48
+
49
+ &.text {
50
+ --md-comp-skeleton-shape: 4px;
51
+
52
+ width: 100%;
53
+ height: 1em;
54
+ margin-block: 0.25em;
55
+
56
+ &:last-child:not(:first-child) {
57
+ width: 60%;
58
+ }
59
+ }
60
+
61
+ &.circle {
62
+ width: var(--md-comp-skeleton-circle-size);
63
+ height: var(--md-comp-skeleton-circle-size);
64
+ flex: none;
65
+ border-radius: 50%;
66
+ }
67
+
68
+ @media (prefers-reduced-motion: reduce) {
69
+ animation: none;
70
+ background-image: none;
71
+ }
72
+
73
+ @media (forced-colors: active) {
74
+ border: 1px solid GrayText;
75
+ }
76
+ }
77
+
78
+ @keyframes skeleton-shimmer {
79
+ from { background-position: -100% 0; }
80
+ to { background-position: 200% 0; }
81
+ }
@@ -99,6 +99,7 @@ $_bar: ".snackbar";
99
99
  @include typescale("body-medium");
100
100
  @include z-depth("3");
101
101
  cursor: default;
102
+ @include glass(var(--md-comp-snackbar-container-color));
102
103
 
103
104
  @include bp-up("medium") {
104
105
  width: max-content;
@@ -0,0 +1,86 @@
1
+ @use "../abstracts" as *;
2
+
3
+ // Stat. A <dl class="stats"> of key figures, such as a dashboard summary.
4
+ // Each figure is a <div> tile holding a <dt> label, a <dd> value and an
5
+ // optional <dd class="stat-change"> comparison. A description list keeps
6
+ // each value paired with its label for assistive technology.
7
+ //
8
+ // .stat-change takes .up or .down for the arrow and .negative when the
9
+ // change is bad news. The arrow is decoration: say the direction in the
10
+ // text, as in "+12% from last month".
11
+ //
12
+ // Tokens:
13
+ // --md-comp-stat-container-color surface-container-low
14
+ // --md-comp-stat-shape 16px
15
+ // --md-comp-stat-min-width 160px (tiles wrap below this)
16
+
17
+ .stats {
18
+ --md-comp-stat-container-color: var(--md-sys-color-surface-container-low);
19
+ --md-comp-stat-shape: 16px;
20
+ --md-comp-stat-min-width: 160px;
21
+
22
+ display: grid;
23
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--md-comp-stat-min-width)), 1fr));
24
+ gap: 12px;
25
+ margin: $element-top-margin 0 $element-bottom-margin;
26
+ padding: 0;
27
+
28
+ > div {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: 4px;
32
+ min-width: 0;
33
+ padding: 16px;
34
+ border-radius: var(--md-comp-stat-shape);
35
+ background-color: var(--md-comp-stat-container-color);
36
+ color: var(--md-sys-color-on-surface);
37
+ }
38
+
39
+ dt {
40
+ color: var(--md-sys-color-on-surface-variant);
41
+ @include typescale("title-small");
42
+ }
43
+
44
+ dd {
45
+ margin: 0;
46
+ overflow-wrap: anywhere;
47
+ font-variant-numeric: tabular-nums;
48
+ @include typescale("headline-large");
49
+ }
50
+
51
+ dd.stat-change {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ gap: 4px;
55
+ color: var(--md-sys-color-on-surface-variant);
56
+ @include typescale("label-large");
57
+
58
+ &:is(.up, .down)::before {
59
+ content: "";
60
+ flex: none;
61
+ width: 18px;
62
+ height: 18px;
63
+ background-color: currentColor;
64
+ mask: $trend-arrow center / 18px no-repeat;
65
+ }
66
+
67
+ &.down::before {
68
+ transform: rotate(180deg);
69
+ }
70
+
71
+ &.negative {
72
+ color: var(--md-sys-color-error);
73
+ }
74
+ }
75
+ }
76
+
77
+ @media (forced-colors: active) {
78
+ .stats > div {
79
+ outline: 1px solid CanvasText;
80
+ }
81
+
82
+ .stats dd.stat-change::before {
83
+ forced-color-adjust: none;
84
+ background-color: CanvasText;
85
+ }
86
+ }
@@ -0,0 +1,190 @@
1
+ @use "../abstracts" as *;
2
+
3
+ // Stepper. An <ol class="stepper"> shows where the user is in a fixed
4
+ // sequence of steps, such as a checkout. Each <li> is a step; its text, or a
5
+ // link back to a finished step, is the label. The list numbers the steps.
6
+ //
7
+ // State is markup the page keeps current:
8
+ // aria-current="step" the step the user is on
9
+ // .complete a finished step: the number becomes a check
10
+ // .invalid a step that needs attention: the number becomes "!"
11
+ // The check and "!" are also spoken, through the alt text of the indicator;
12
+ // the two labels are tokens so a page can translate them.
13
+ //
14
+ // Each step is a small grid: indicator, label and connector on the first row,
15
+ // an optional <small> supporting line under the label, and in .vertical an
16
+ // optional .stepper-content panel under that.
17
+ //
18
+ // Tokens:
19
+ // --md-comp-stepper-indicator-size 24px
20
+ // --md-comp-stepper-connector-color outline-variant / complete: primary
21
+ // --md-comp-stepper-active-color primary
22
+ // --md-comp-stepper-complete-label "Completed"
23
+ // --md-comp-stepper-error-label "Error"
24
+
25
+ $_stepper-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.55 18 3.85 12.3l1.43-1.43 4.27 4.28 9.17-9.18 1.43 1.43z'/%3E%3C/svg%3E");
26
+ $_stepper-alert: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M11 14V6h2v8zm0 4v-2h2v2z'/%3E%3C/svg%3E");
27
+
28
+ .stepper {
29
+ --md-comp-stepper-indicator-size: 24px;
30
+ --md-comp-stepper-connector-color: var(--md-sys-color-outline-variant);
31
+ --md-comp-stepper-active-color: var(--md-sys-color-primary);
32
+ --md-comp-stepper-complete-label: "Completed";
33
+ --md-comp-stepper-error-label: "Error";
34
+
35
+ // Steps never squeeze below their label; a row too narrow for all of them
36
+ // wraps rather than overlapping. Use .vertical where that is the norm.
37
+ display: flex;
38
+ flex-wrap: wrap;
39
+ gap: 8px;
40
+ margin: $element-top-margin 0 $element-bottom-margin;
41
+ padding: 0;
42
+ list-style: none;
43
+ counter-reset: stepper;
44
+
45
+ > li {
46
+ display: grid;
47
+ flex: 1 1 auto;
48
+ grid-template-columns: auto auto minmax(16px, 1fr);
49
+ grid-template-rows: auto auto;
50
+ column-gap: 8px;
51
+ align-items: center;
52
+ margin: 0;
53
+ counter-increment: stepper;
54
+ color: var(--md-sys-color-on-surface-variant);
55
+ @include typescale("title-small");
56
+
57
+ // The number is already the list position, so it is not spoken again.
58
+ &::before {
59
+ content: counter(stepper) / "";
60
+ grid-column: 1;
61
+ grid-row: 1;
62
+ box-sizing: border-box;
63
+ display: inline-flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ width: var(--md-comp-stepper-indicator-size);
67
+ height: var(--md-comp-stepper-indicator-size);
68
+ border: 1px solid var(--md-sys-color-outline);
69
+ border-radius: 50%;
70
+ @include typescale("label-medium");
71
+ }
72
+
73
+ &::after {
74
+ content: "";
75
+ grid-column: 3;
76
+ grid-row: 1;
77
+ height: 1px;
78
+ min-width: 16px;
79
+ background-color: var(--md-comp-stepper-connector-color);
80
+ }
81
+
82
+ &:last-child {
83
+ flex: none;
84
+
85
+ &::after {
86
+ content: none;
87
+ }
88
+ }
89
+
90
+ // Supporting text may run under the connector rather than wrap word by word.
91
+ > small {
92
+ grid-column: 2 / -1;
93
+ grid-row: 2;
94
+ color: var(--md-sys-color-on-surface-variant);
95
+ @include typescale("body-small");
96
+ }
97
+
98
+ > a {
99
+ color: inherit;
100
+ border-radius: 4px;
101
+ text-decoration: underline;
102
+ text-underline-offset: 2px;
103
+ @include focus-visible;
104
+ }
105
+ }
106
+
107
+ > li[aria-current="step"] {
108
+ color: var(--md-sys-color-on-surface);
109
+
110
+ &::before {
111
+ border-color: var(--md-comp-stepper-active-color);
112
+ background-color: var(--md-comp-stepper-active-color);
113
+ color: var(--md-sys-color-on-primary);
114
+ }
115
+ }
116
+
117
+ // The glyph is knocked out of the filled circle, so it takes the color of
118
+ // whatever surface the stepper sits on.
119
+ > li:is(.complete, .invalid)::before {
120
+ border: 0;
121
+ }
122
+
123
+ > li.complete {
124
+ --md-comp-stepper-connector-color: var(--md-comp-stepper-active-color);
125
+
126
+ color: var(--md-sys-color-on-surface);
127
+
128
+ &::before {
129
+ content: "" / var(--md-comp-stepper-complete-label);
130
+ background-color: var(--md-comp-stepper-active-color);
131
+ mask: $_stepper-check center / 18px no-repeat exclude, linear-gradient(#000 0 0);
132
+ }
133
+ }
134
+
135
+ > li.invalid {
136
+ color: var(--md-sys-color-error);
137
+
138
+ &::before {
139
+ content: "" / var(--md-comp-stepper-error-label);
140
+ background-color: var(--md-sys-color-error);
141
+ mask: $_stepper-alert center / 18px no-repeat exclude, linear-gradient(#000 0 0);
142
+ }
143
+ }
144
+
145
+ &.vertical {
146
+ flex-direction: column;
147
+ gap: 0;
148
+
149
+ > li {
150
+ flex: none;
151
+ grid-template-columns: auto minmax(0, 1fr);
152
+ grid-template-rows: auto auto 1fr;
153
+
154
+ > small {
155
+ grid-column: 2;
156
+ }
157
+
158
+ &::after {
159
+ grid-column: 1;
160
+ grid-row: 2 / -1;
161
+ justify-self: center;
162
+ width: 1px;
163
+ height: auto;
164
+ min-width: 0;
165
+ min-height: 16px;
166
+ margin-block: 4px;
167
+ }
168
+
169
+ &:last-child::after {
170
+ content: none;
171
+ }
172
+
173
+ > .stepper-content {
174
+ grid-column: 2;
175
+ grid-row: 3;
176
+ padding-block: 8px 16px;
177
+ color: var(--md-sys-color-on-surface-variant);
178
+ @include typescale("body-medium");
179
+ }
180
+ }
181
+ }
182
+ }
183
+
184
+ @media (forced-colors: active) {
185
+ .stepper > li:is([aria-current="step"], .complete, .invalid)::before {
186
+ forced-color-adjust: none;
187
+ background-color: Highlight;
188
+ color: HighlightText;
189
+ }
190
+ }
@@ -7,11 +7,13 @@
7
7
  // --md-comp-toc-label-color
8
8
  // --md-comp-toc-active-color
9
9
  // --md-comp-toc-indicator
10
+ // --md-comp-toc-item-height 48px, the Material touch target
10
11
 
11
12
  .table-of-contents {
12
13
  --md-comp-toc-label-color: var(--md-sys-color-on-surface-variant);
13
14
  --md-comp-toc-active-color: var(--md-sys-color-primary);
14
15
  --md-comp-toc-indicator: 2px;
16
+ --md-comp-toc-item-height: 48px;
15
17
 
16
18
  list-style: none;
17
19
  margin: 0;
@@ -29,7 +31,7 @@
29
31
  display: inline-flex;
30
32
  align-items: center;
31
33
  box-sizing: border-box;
32
- min-height: 2rem;
34
+ min-height: var(--md-comp-toc-item-height);
33
35
  padding-inline-start: 16px;
34
36
  border-inline-start: var(--md-comp-toc-indicator) solid transparent;
35
37
  color: var(--md-comp-toc-label-color);
@@ -0,0 +1,114 @@
1
+ @use "../abstracts" as *;
2
+
3
+ // Timeline. An <ol class="timeline"> lists events in order, newest first or
4
+ // oldest first as the page decides. Each <li> is an event: an optional
5
+ // <time>, a heading and supporting text. A dot marks each event and a line
6
+ // joins it to the next.
7
+ //
8
+ // A leading icon as the first child replaces the dot with a tonal circle.
9
+ //
10
+ // Tokens:
11
+ // --md-comp-timeline-marker-color primary
12
+ // --md-comp-timeline-connector-color outline-variant
13
+ // --md-comp-timeline-gap 24px (between events)
14
+
15
+ .timeline {
16
+ --md-comp-timeline-marker-color: var(--md-sys-color-primary);
17
+ --md-comp-timeline-connector-color: var(--md-sys-color-outline-variant);
18
+ --md-comp-timeline-gap: 24px;
19
+
20
+ margin: $element-top-margin 0 $element-bottom-margin;
21
+ padding: 0;
22
+ list-style: none;
23
+
24
+ > li {
25
+ position: relative;
26
+ margin: 0;
27
+ padding-block-end: var(--md-comp-timeline-gap);
28
+ padding-inline-start: 32px;
29
+ color: var(--md-sys-color-on-surface);
30
+
31
+ // The dot sits level with the first line of text.
32
+ &::before {
33
+ content: "";
34
+ position: absolute;
35
+ inset-block-start: 4px;
36
+ inset-inline-start: 4px;
37
+ box-sizing: border-box;
38
+ width: 12px;
39
+ height: 12px;
40
+ border-radius: 50%;
41
+ background-color: var(--md-comp-timeline-marker-color);
42
+ }
43
+
44
+ &::after {
45
+ content: "";
46
+ position: absolute;
47
+ inset-block: 20px 0;
48
+ inset-inline-start: 9.5px;
49
+ width: 1px;
50
+ background-color: var(--md-comp-timeline-connector-color);
51
+ }
52
+
53
+ &:last-child {
54
+ padding-block-end: 0;
55
+
56
+ &::after {
57
+ content: none;
58
+ }
59
+ }
60
+
61
+ > time {
62
+ display: block;
63
+ color: var(--md-sys-color-on-surface-variant);
64
+ @include typescale("label-medium");
65
+ }
66
+
67
+ > :is(h1, h2, h3, h4, h5, h6) {
68
+ margin: 0;
69
+ @include typescale("title-small");
70
+ }
71
+
72
+ > p {
73
+ margin: 4px 0 0;
74
+ color: var(--md-sys-color-on-surface-variant);
75
+ @include typescale("body-medium");
76
+ }
77
+ }
78
+
79
+ // A leading icon takes the dot's place in a 32px tonal circle.
80
+ > li:has(> #{$icon}:first-child) {
81
+ padding-inline-start: 48px;
82
+
83
+ &::before {
84
+ content: none;
85
+ }
86
+
87
+ &::after {
88
+ inset-block-start: 36px;
89
+ inset-inline-start: 15.5px;
90
+ }
91
+
92
+ > #{$icon}:first-child {
93
+ position: absolute;
94
+ inset-block-start: 0;
95
+ inset-inline-start: 0;
96
+ display: inline-flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ width: 32px;
100
+ height: 32px;
101
+ border-radius: 50%;
102
+ background-color: var(--md-sys-color-secondary-container);
103
+ color: var(--md-sys-color-on-secondary-container);
104
+ font-size: 18px;
105
+ }
106
+ }
107
+ }
108
+
109
+ @media (forced-colors: active) {
110
+ .timeline > li::before {
111
+ forced-color-adjust: none;
112
+ background-color: CanvasText;
113
+ }
114
+ }
@@ -87,6 +87,7 @@ $_vibrant: "#{$_toolbar}:is(.vibrant, .filled)";
87
87
  border-radius: var(--md-comp-toolbar-container-shape);
88
88
  background-color: var(--md-comp-toolbar-container-color);
89
89
  color: var(--md-comp-toolbar-color);
90
+ @include glass(var(--md-comp-toolbar-container-color));
90
91
 
91
92
  & + & {
92
93
  margin-block-start: 16px;
@@ -41,6 +41,7 @@
41
41
  overflow-wrap: anywhere;
42
42
  pointer-events: auto;
43
43
  z-index: 2000;
44
+ @include glass(var(--md-comp-plain-tooltip-container-color));
44
45
  }
45
46
 
46
47
  // CSS-only: a child of the activator. Default sits above (M3 preferred).
@@ -137,6 +138,7 @@ body > .tooltip {
137
138
  white-space: normal;
138
139
  pointer-events: auto;
139
140
  @include z-depth("2");
141
+ @include glass(var(--md-comp-rich-tooltip-container-color));
140
142
 
141
143
  > :is(h1, h2, h3, h4, h5, h6) {
142
144
  margin: 0;