@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.
- package/CHANGELOG.md +392 -7
- package/README.md +37 -1
- package/dist/css/expressive.css +5440 -234
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/js/chunks/{chunk-AYYYWUJ4.mjs → chunk-3CLXLPYS.mjs} +17 -11
- package/dist/js/chunks/chunk-3CLXLPYS.mjs.map +7 -0
- package/dist/js/chunks/chunk-3DHK5CZU.mjs +105 -0
- package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-IMUPRRI6.mjs → chunk-3VOK6J7U.mjs} +3 -3
- package/dist/js/chunks/chunk-4PWAPV6F.mjs +7 -0
- package/dist/js/chunks/chunk-4PWAPV6F.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XFJ452AZ.mjs → chunk-55IA2XUC.mjs} +5 -6
- package/dist/js/chunks/{chunk-XFJ452AZ.mjs.map → chunk-55IA2XUC.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-XDB3G6RL.mjs → chunk-6N2XAEFK.mjs} +15 -4
- package/dist/js/chunks/{chunk-XDB3G6RL.mjs.map → chunk-6N2XAEFK.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-MISGHDUU.mjs → chunk-6OMRGML6.mjs} +9 -7
- package/dist/js/chunks/{chunk-MISGHDUU.mjs.map → chunk-6OMRGML6.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-A3BJA7V4.mjs → chunk-6WLSDZ4O.mjs} +2 -2
- package/dist/js/chunks/chunk-CCWDV5CR.mjs +292 -0
- package/dist/js/chunks/chunk-CCWDV5CR.mjs.map +7 -0
- package/dist/js/chunks/{chunk-JODJAGFS.mjs → chunk-CKQP6P76.mjs} +31 -8
- package/dist/js/chunks/chunk-CKQP6P76.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KR44BSYQ.mjs → chunk-DLWYKFEI.mjs} +3 -3
- package/dist/js/chunks/chunk-DTKR54I6.mjs +270 -0
- package/dist/js/chunks/chunk-DTKR54I6.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SLFNPY5M.mjs → chunk-EC63CHXU.mjs} +2 -2
- package/dist/js/chunks/chunk-GVGT6MIU.mjs +47 -0
- package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LZVBJ33S.mjs → chunk-GZWPXXY6.mjs} +15 -8
- package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +7 -0
- package/dist/js/chunks/chunk-HKT2S7VM.mjs +48 -0
- package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +7 -0
- package/dist/js/chunks/{chunk-D4UZ4HFN.mjs → chunk-IFXVDDDH.mjs} +23 -11
- package/dist/js/chunks/chunk-IFXVDDDH.mjs.map +7 -0
- package/dist/js/chunks/chunk-K4CJCRGE.mjs +262 -0
- package/dist/js/chunks/chunk-K4CJCRGE.mjs.map +7 -0
- package/dist/js/chunks/chunk-LNCCYGPC.mjs +163 -0
- package/dist/js/chunks/chunk-LNCCYGPC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QSQ24FYT.mjs → chunk-LTWPGFBR.mjs} +2 -2
- package/dist/js/chunks/{chunk-QSQ24FYT.mjs.map → chunk-LTWPGFBR.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-I5KR22BY.mjs → chunk-LWBQIX5J.mjs} +15 -15
- package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GY2Z5CJ2.mjs → chunk-NNYP33NB.mjs} +67 -32
- package/dist/js/chunks/chunk-NNYP33NB.mjs.map +7 -0
- package/dist/js/chunks/chunk-NQLC3YMW.mjs +1 -0
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs +406 -0
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +7 -0
- package/dist/js/chunks/chunk-P3G3QHII.mjs +166 -0
- package/dist/js/chunks/chunk-P3G3QHII.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VAS6JQ6P.mjs → chunk-PIJ2TAR3.mjs} +3 -3
- package/dist/js/chunks/{chunk-74N6U5JJ.mjs → chunk-PLYXLSH3.mjs} +38 -37
- package/dist/js/chunks/chunk-PLYXLSH3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-PIIAEYAJ.mjs → chunk-QDAL4IYN.mjs} +2 -2
- package/dist/js/chunks/chunk-QKWPQK5N.mjs +179 -0
- package/dist/js/chunks/chunk-QKWPQK5N.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FRB7TOCS.mjs → chunk-QV2JAWIZ.mjs} +2 -2
- package/dist/js/chunks/{chunk-N3UHGN3N.mjs → chunk-QVVEWBOF.mjs} +3 -3
- package/dist/js/chunks/chunk-RHRQKTTX.mjs +139 -0
- package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +7 -0
- package/dist/js/chunks/chunk-SPETGK25.mjs +59 -0
- package/dist/js/chunks/chunk-SPETGK25.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TK6PX2GC.mjs → chunk-U2OTHOTI.mjs} +131 -19
- package/dist/js/chunks/chunk-U2OTHOTI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TYM6U5DY.mjs → chunk-UAEAQBRC.mjs} +2 -2
- package/dist/js/chunks/{chunk-7UXHSYIA.mjs → chunk-UBLRRJ7N.mjs} +3 -3
- package/dist/js/chunks/{chunk-EP3CVKB5.mjs → chunk-UEZUJQ66.mjs} +8 -5
- package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +7 -0
- package/dist/js/chunks/{chunk-JNPIWFJT.mjs → chunk-UNEMYWEW.mjs} +3 -3
- package/dist/js/chunks/chunk-VTLBW7QS.mjs +124 -0
- package/dist/js/chunks/chunk-VTLBW7QS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-JKNPQQWY.mjs → chunk-WJXDBPXQ.mjs} +28 -12
- package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-CDW6WIRT.mjs → chunk-XGHORT7J.mjs} +18 -11
- package/dist/js/chunks/chunk-XGHORT7J.mjs.map +7 -0
- package/dist/js/chunks/{chunk-7GKXUG4B.mjs → chunk-XH6BEEMY.mjs} +78 -25
- package/dist/js/chunks/chunk-XH6BEEMY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XO5WX3TK.mjs → chunk-YDCS5S3J.mjs} +2 -2
- package/dist/js/expressive.cjs +2540 -233
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +2540 -233
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +10 -10
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +86 -38
- package/dist/js/expressive.mjs.map +1 -1
- package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
- package/dist/js/internal/components/appBar.mjs +2 -2
- package/dist/js/internal/components/autocomplete.mjs +4 -4
- package/dist/js/internal/components/barChart.mjs +10 -0
- package/dist/js/internal/components/barChart.mjs.map +7 -0
- package/dist/js/internal/components/buttonGroup.mjs +2 -2
- package/dist/js/internal/components/buttons.mjs +3 -3
- package/dist/js/internal/components/cards.mjs +3 -3
- package/dist/js/internal/components/carousel.mjs +3 -3
- package/dist/js/internal/components/characterCounter.mjs +2 -2
- package/dist/js/internal/components/chips.mjs +5 -5
- package/dist/js/internal/components/columnChart.mjs +9 -0
- package/dist/js/internal/components/columnChart.mjs.map +7 -0
- package/dist/js/internal/components/commandPalette.mjs +9 -0
- package/dist/js/internal/components/commandPalette.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +6 -6
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/heatmapChart.mjs +9 -0
- package/dist/js/internal/components/heatmapChart.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +79 -31
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/lineChart.mjs +12 -0
- package/dist/js/internal/components/lineChart.mjs.map +7 -0
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/messageScroller.mjs +9 -0
- package/dist/js/internal/components/messageScroller.mjs.map +7 -0
- package/dist/js/internal/components/mixedChart.mjs +10 -0
- package/dist/js/internal/components/mixedChart.mjs.map +7 -0
- package/dist/js/internal/components/navigationRail.mjs +2 -2
- package/dist/js/internal/components/pieChart.mjs +9 -0
- package/dist/js/internal/components/pieChart.mjs.map +7 -0
- package/dist/js/internal/components/questionnaire.mjs +9 -0
- package/dist/js/internal/components/questionnaire.mjs.map +7 -0
- package/dist/js/internal/components/radarChart.mjs +9 -0
- package/dist/js/internal/components/radarChart.mjs.map +7 -0
- package/dist/js/internal/components/radialChart.mjs +9 -0
- package/dist/js/internal/components/radialChart.mjs.map +7 -0
- package/dist/js/internal/components/registry.mjs +37 -25
- package/dist/js/internal/components/richTextEditor.mjs +9 -0
- package/dist/js/internal/components/richTextEditor.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +2 -2
- package/dist/js/internal/components/select.mjs +4 -4
- package/dist/js/internal/components/slider.mjs +3 -3
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/tabs.mjs +4 -4
- package/dist/js/internal/components/timepicker.mjs +4 -4
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/core/component.mjs +1 -1
- package/dist/js/internal/core/utils.mjs +1 -1
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/modular.mjs +86 -38
- package/dist/types/behaviors/forms.d.ts +22 -0
- package/dist/types/components/appBar.d.ts +1 -1
- package/dist/types/components/barChart.d.ts +24 -0
- package/dist/types/components/columnChart.d.ts +21 -0
- package/dist/types/components/commandPalette.d.ts +96 -0
- package/dist/types/components/datepicker.d.ts +5 -2
- package/dist/types/components/heatmapChart.d.ts +49 -0
- package/dist/types/components/index.d.ts +12 -0
- package/dist/types/components/lineChart.d.ts +134 -0
- package/dist/types/components/menu.d.ts +32 -0
- package/dist/types/components/messageScroller.d.ts +111 -0
- package/dist/types/components/mixedChart.d.ts +25 -0
- package/dist/types/components/pieChart.d.ts +40 -0
- package/dist/types/components/questionnaire.d.ts +96 -0
- package/dist/types/components/radarChart.d.ts +39 -0
- package/dist/types/components/radialChart.d.ts +45 -0
- package/dist/types/components/registry.d.ts +44 -0
- package/dist/types/components/richTextEditor.d.ts +71 -0
- package/dist/types/components/slider.d.ts +1 -0
- package/dist/types/components/snackbar.d.ts +6 -0
- package/dist/types/components/timepicker.d.ts +4 -1
- package/dist/types/components/tooltip.d.ts +2 -1
- package/dist/types/modular.d.ts +10 -1
- package/package.json +4 -1
- package/src/sass/README.md +3 -6
- package/src/sass/abstracts/_index.scss +1 -1
- package/src/sass/abstracts/_mixins.scss +226 -0
- package/src/sass/abstracts/_variables.scss +14 -0
- package/src/sass/base/_typography.scss +45 -0
- package/src/sass/components/_accordion.scss +161 -0
- package/src/sass/components/_aura.scss +119 -0
- package/src/sass/components/_avatar.scss +86 -0
- package/src/sass/components/_bar-chart.scss +285 -0
- package/src/sass/components/_bottom-sheet.scss +1 -0
- package/src/sass/components/_button-groups.scss +13 -3
- package/src/sass/components/_cards.scss +16 -13
- package/src/sass/components/_carousel.scss +9 -7
- package/src/sass/components/_column-chart.scss +134 -0
- package/src/sass/components/_command-palette.scss +140 -0
- package/src/sass/components/_countdown.scss +89 -0
- package/src/sass/components/_data-table.scss +188 -0
- package/src/sass/components/_dialog.scss +1 -0
- package/src/sass/components/_empty-state.scss +78 -0
- package/src/sass/components/_expanding-card.scss +3 -0
- package/src/sass/components/_heatmap-chart.scss +156 -0
- package/src/sass/components/_index.scss +27 -0
- package/src/sass/components/_kpi.scss +162 -0
- package/src/sass/components/_line-chart.scss +102 -0
- package/src/sass/components/_marquee.scss +111 -0
- package/src/sass/components/_menu.scss +10 -0
- package/src/sass/components/_message-scroller.scss +66 -0
- package/src/sass/components/_message.scss +202 -0
- package/src/sass/components/_mixed-chart.scss +157 -0
- package/src/sass/components/_navbar.scss +11 -6
- package/src/sass/components/_navigation-bar.scss +1 -0
- package/src/sass/components/_navigation-rail.scss +9 -0
- package/src/sass/components/_page-footer.scss +0 -11
- package/src/sass/components/_pie-chart.scss +203 -0
- package/src/sass/components/_popover.scss +112 -0
- package/src/sass/components/_progress.scss +25 -6
- package/src/sass/components/_questionnaire.scss +144 -0
- package/src/sass/components/_radar-chart.scss +205 -0
- package/src/sass/components/_radial-chart.scss +174 -0
- package/src/sass/components/_rich-text-editor.scss +99 -0
- package/src/sass/components/_search.scss +1 -0
- package/src/sass/components/_side-sheet.scss +1 -0
- package/src/sass/components/_skeleton.scss +81 -0
- package/src/sass/components/_snackbar.scss +2 -1
- package/src/sass/components/_stat.scss +86 -0
- package/src/sass/components/_stepper.scss +190 -0
- package/src/sass/components/_timeline.scss +114 -0
- package/src/sass/components/_timepicker.scss +2 -2
- package/src/sass/components/_toolbar.scss +2 -1
- package/src/sass/components/_tooltip.scss +2 -0
- package/src/sass/components/_tree.scss +139 -0
- package/src/sass/components/forms/_checkboxes.scss +2 -2
- package/src/sass/components/forms/_drop-zone.scss +128 -0
- package/src/sass/components/forms/_index.scss +2 -0
- package/src/sass/components/forms/_input-fields.scss +166 -15
- package/src/sass/components/forms/_radio-buttons.scss +2 -2
- package/src/sass/components/forms/_rating.scss +165 -0
- package/src/sass/components/forms/_slider.scss +51 -29
- package/src/sass/components/forms/_switches.scss +3 -3
- package/src/sass/tokens/_reference.scss +3 -15
- package/src/sass/utilities/_helpers.scss +14 -0
- package/src/sass/utilities/_index.scss +2 -0
- package/src/sass/utilities/_scroll-area.scss +35 -0
- package/src/sass/utilities/_shapes.scss +164 -0
- package/src/sass/utilities/_spacing.scss +29 -23
- package/src/sass/utilities/_visibility.scss +3 -2
- package/dist/js/chunks/chunk-74N6U5JJ.mjs.map +0 -7
- package/dist/js/chunks/chunk-7GKXUG4B.mjs.map +0 -7
- package/dist/js/chunks/chunk-AYYYWUJ4.mjs.map +0 -7
- package/dist/js/chunks/chunk-CDW6WIRT.mjs.map +0 -7
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +0 -7
- package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +0 -7
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +0 -7
- package/dist/js/chunks/chunk-I5KR22BY.mjs.map +0 -7
- package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +0 -7
- package/dist/js/chunks/chunk-JODJAGFS.mjs.map +0 -7
- package/dist/js/chunks/chunk-JR24UB4X.mjs +0 -100
- package/dist/js/chunks/chunk-JR24UB4X.mjs.map +0 -7
- package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +0 -7
- package/dist/js/chunks/chunk-PMBPAFAS.mjs +0 -7
- package/dist/js/chunks/chunk-PMBPAFAS.mjs.map +0 -7
- package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +0 -7
- package/dist/js/chunks/chunk-WWPAPHMA.mjs +0 -1
- /package/dist/js/chunks/{chunk-IMUPRRI6.mjs.map → chunk-3VOK6J7U.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-A3BJA7V4.mjs.map → chunk-6WLSDZ4O.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-KR44BSYQ.mjs.map → chunk-DLWYKFEI.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-SLFNPY5M.mjs.map → chunk-EC63CHXU.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-WWPAPHMA.mjs.map → chunk-NQLC3YMW.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-VAS6JQ6P.mjs.map → chunk-PIJ2TAR3.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-PIIAEYAJ.mjs.map → chunk-QDAL4IYN.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-FRB7TOCS.mjs.map → chunk-QV2JAWIZ.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-N3UHGN3N.mjs.map → chunk-QVVEWBOF.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-TYM6U5DY.mjs.map → chunk-UAEAQBRC.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-7UXHSYIA.mjs.map → chunk-UBLRRJ7N.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-JNPIWFJT.mjs.map → chunk-UNEMYWEW.mjs.map} +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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:
|