@expressivecss/expressive 0.10.1 → 0.12.0
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 +238 -7
- package/README.md +22 -1
- package/dist/css/expressive.css +272 -107
- 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-YFXEJ7GR.mjs → chunk-3VOK6J7U.mjs} +7 -8
- package/dist/js/chunks/chunk-3VOK6J7U.mjs.map +7 -0
- 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-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-SLFNPY5M.mjs → chunk-EC63CHXU.mjs} +2 -2
- package/dist/js/chunks/chunk-G3I5H2U3.mjs +7 -0
- package/dist/js/chunks/{chunk-ZAOYQ6SY.mjs.map → chunk-G3I5H2U3.mjs.map} +1 -1
- 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-QYCYP443.mjs → chunk-H2WA4XHH.mjs} +43 -36
- package/dist/js/chunks/chunk-H2WA4XHH.mjs.map +7 -0
- package/dist/js/chunks/{chunk-G576EP5O.mjs → chunk-HB6IW7QQ.mjs} +78 -16
- package/dist/js/chunks/chunk-HB6IW7QQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-7MM4VJJO.mjs → chunk-HLDXZ7XB.mjs} +23 -15
- package/dist/js/chunks/chunk-HLDXZ7XB.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZIZVUWRL.mjs → chunk-HNFSMIBY.mjs} +18 -18
- 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-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-AOGFNMXS.mjs → chunk-LWBQIX5J.mjs} +16 -16
- 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-VAS6JQ6P.mjs → chunk-PIJ2TAR3.mjs} +3 -3
- package/dist/js/chunks/{chunk-JR24UB4X.mjs → chunk-PSSHQWCX.mjs} +2 -2
- package/dist/js/chunks/{chunk-PIIAEYAJ.mjs → chunk-QDAL4IYN.mjs} +2 -2
- package/dist/js/chunks/chunk-QV2JAWIZ.mjs +135 -0
- package/dist/js/chunks/chunk-QV2JAWIZ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-N3UHGN3N.mjs → chunk-QVVEWBOF.mjs} +3 -3
- package/dist/js/chunks/{chunk-ZZBZI2XN.mjs → chunk-RFZZCYVU.mjs} +18 -11
- package/dist/js/chunks/chunk-RFZZCYVU.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-JKNPQQWY.mjs → chunk-WJXDBPXQ.mjs} +28 -12
- package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XO5WX3TK.mjs → chunk-YDCS5S3J.mjs} +2 -2
- package/dist/js/chunks/{chunk-TK6PX2GC.mjs → chunk-YSBCHYXP.mjs} +16 -8
- package/dist/js/chunks/chunk-YSBCHYXP.mjs.map +7 -0
- package/dist/js/expressive.cjs +398 -217
- package/dist/js/expressive.cjs.map +2 -2
- package/dist/js/expressive.js +398 -217
- package/dist/js/expressive.js.map +2 -2
- package/dist/js/expressive.min.js +10 -10
- package/dist/js/expressive.min.js.map +3 -3
- package/dist/js/expressive.mjs +30 -30
- 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/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/datepicker.mjs +6 -6
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/index.mjs +23 -23
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/navigationRail.mjs +2 -2
- package/dist/js/internal/components/registry.mjs +24 -24
- 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 +30 -30
- package/dist/types/components/appBar.d.ts +1 -1
- package/dist/types/components/autocomplete.d.ts +2 -1
- package/dist/types/components/datepicker.d.ts +6 -2
- package/dist/types/components/menu.d.ts +1 -0
- package/dist/types/components/scrollspy.d.ts +5 -4
- package/dist/types/components/select.d.ts +7 -1
- 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 +1 -1
- package/package.json +1 -1
- package/src/sass/abstracts/_mixins.scss +19 -11
- package/src/sass/components/_buttons.scss +45 -0
- package/src/sass/components/_carousel.scss +9 -7
- package/src/sass/components/_chips.scss +5 -9
- package/src/sass/components/_dialog.scss +0 -7
- package/src/sass/components/_navbar.scss +13 -8
- package/src/sass/components/_page-footer.scss +0 -11
- package/src/sass/components/_progress.scss +25 -6
- package/src/sass/components/_snackbar.scss +1 -1
- package/src/sass/components/_timepicker.scss +2 -2
- package/src/sass/components/_toolbar.scss +1 -1
- package/src/sass/components/forms/_checkboxes.scss +2 -2
- package/src/sass/components/forms/_fieldset.scss +20 -1
- package/src/sass/components/forms/_file-input.scss +11 -3
- package/src/sass/components/forms/_input-fields.scss +35 -15
- package/src/sass/components/forms/_radio-buttons.scss +2 -2
- package/src/sass/components/forms/_select.scss +3 -2
- package/src/sass/components/forms/_slider.scss +51 -29
- package/src/sass/components/forms/_switches.scss +3 -3
- package/src/sass/utilities/_helpers.scss +14 -0
- package/src/sass/utilities/_spacing.scss +29 -23
- package/src/sass/utilities/_visibility.scss +7 -1
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +0 -7
- package/dist/js/chunks/chunk-AOGFNMXS.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-G576EP5O.mjs.map +0 -7
- package/dist/js/chunks/chunk-GY2Z5CJ2.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-LZVBJ33S.mjs.map +0 -7
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +0 -7
- package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +0 -7
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +0 -154
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +0 -7
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZAOYQ6SY.mjs +0 -7
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs.map +0 -7
- /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-ZIZVUWRL.mjs.map → chunk-HNFSMIBY.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-VAS6JQ6P.mjs.map → chunk-PIJ2TAR3.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-JR24UB4X.mjs.map → chunk-PSSHQWCX.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-PIIAEYAJ.mjs.map → chunk-QDAL4IYN.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,235 @@ the format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.12.0] - 2026-10-01
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Utility classes for shrinking flex and grid children, scrolling or clipping
|
|
13
|
+
overflow, logical inline spacing and text alignment, and text wrapping.
|
|
14
|
+
Physical spacing and alignment classes retain their existing behavior.
|
|
15
|
+
- `.visually-hidden-focusable` hides skip links and other content until the
|
|
16
|
+
element or a descendant receives focus. Use it independently of `.visually-hidden`.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Spacing output and documentation omit padding-auto classes, since CSS does
|
|
21
|
+
not accept `auto` for padding. Margin-auto helpers remain available.
|
|
22
|
+
- Carousel preserves an active mouse drag when delayed resize work completes.
|
|
23
|
+
- Snackbar ignores flick velocity after a pause of 100ms or more before release;
|
|
24
|
+
dragging past the distance threshold still dismisses it.
|
|
25
|
+
- Tooltip supports `open()` in its public TypeScript declarations and honors
|
|
26
|
+
`open(true)` without requiring hover or focus.
|
|
27
|
+
- NavigationRail leaves Escape to a nested component that already handled it.
|
|
28
|
+
Its own Escape collapse restores focus to the rail toggle while preserving
|
|
29
|
+
outside focus and focus moved by close callbacks.
|
|
30
|
+
- Menu respects `closeOnClick` inside open and closed shadow roots, preserving
|
|
31
|
+
submenu navigation, outside dismissal, and touch scrolling.
|
|
32
|
+
- Multiple FormSelect options with the same value can be selected and
|
|
33
|
+
deselected independently, matching their native option state.
|
|
34
|
+
- Chips supports programmatic addition without an editable input and accepts
|
|
35
|
+
numeric ID `0` during initialization and addition. An empty autocomplete menu
|
|
36
|
+
does not prevent adding a custom chip.
|
|
37
|
+
- Autocomplete keeps its open state synchronized with its Menu, accepts
|
|
38
|
+
preselected IDs before data loads, and bubbles selection changes to form
|
|
39
|
+
listeners. Chips lets an open suggestion menu handle Enter.
|
|
40
|
+
- Timepicker reloads edited host values when opened and cancels obsolete clock
|
|
41
|
+
updates, so delayed transitions cannot overwrite newer edits or update a
|
|
42
|
+
destroyed instance.
|
|
43
|
+
- Datepicker honors custom parsers during initialization and reopening, rejects
|
|
44
|
+
reversed range edits through every input path, and preserves an empty
|
|
45
|
+
single-date selection after clearing.
|
|
46
|
+
- Each Datepicker range input emits its own change event. Generated date inputs
|
|
47
|
+
opt out of AutoInit so repeated initialization cannot create duplicate pickers.
|
|
48
|
+
- Component `init()` methods return an empty array for empty element collections,
|
|
49
|
+
matching their TypeScript return types.
|
|
50
|
+
- Datepicker can reopen a range when only its end date is set. Clearing
|
|
51
|
+
either endpoint preserves the other and removes incomplete range shading.
|
|
52
|
+
- A cancelled Snackbar swipe cannot carry its velocity into the next gesture.
|
|
53
|
+
- Bottom and side sheets recognize a recent flick when the release coordinates
|
|
54
|
+
match the last pointer move, while paused or reversed short drags stay open.
|
|
55
|
+
- Carousel preserves ordinary button and link clicks inside slides while keeping
|
|
56
|
+
mouse dragging available, including in swipeable tab panels.
|
|
57
|
+
- Chips autocomplete preserves the query while filtering and clears it after
|
|
58
|
+
an item is selected.
|
|
59
|
+
- Destroying a Timepicker cancels pending automatic submission, so an old
|
|
60
|
+
instance cannot overwrite a replacement input value.
|
|
61
|
+
- Datepicker and Timepicker confirmation buttons invoke their callbacks once
|
|
62
|
+
per Enter press. Both TypeScript option interfaces accept `autoSubmit: false`.
|
|
63
|
+
- Closing a Menu preserves focus on an outside input or another control.
|
|
64
|
+
- Docked Datepicker and Timepicker popovers account for their positioning
|
|
65
|
+
parent, including `.field` wrappers and scrolled containers.
|
|
66
|
+
- Destroying Chips also destroys its owned Autocomplete and Menu.
|
|
67
|
+
- Tooltip teardown restores authored rich content and preserves existing
|
|
68
|
+
description associations, allowing the same content to be initialized again.
|
|
69
|
+
- Snackbars can reuse an element supplied through `snackbarId` without deleting
|
|
70
|
+
it or retaining callbacks and controls from an earlier instance.
|
|
71
|
+
- A vertical touch swipe that starts on a carousel scrolls the page again, and
|
|
72
|
+
pinch-zoom works over it. The carousel tracks no longer restrict
|
|
73
|
+
`touch-action`.
|
|
74
|
+
- In Firefox the top app bar is `surface` at rest instead of
|
|
75
|
+
`surface-container`. The scroll fill now runs only where `animation-timeline`
|
|
76
|
+
is supported.
|
|
77
|
+
- `.slider.stops` draws its dots. Each dot sits at a step position on the
|
|
78
|
+
active track, including centered and right-to-left sliders. Vertical and
|
|
79
|
+
two-handle sliders show no dots.
|
|
80
|
+
- In Firefox an indeterminate `<progress class="progress">` shows its track and
|
|
81
|
+
a moving 40% bar, which stays still under reduced motion.
|
|
82
|
+
- In Firefox a date input with a Datepicker shows its value. The formatted
|
|
83
|
+
overlay only applies in engines that render it.
|
|
84
|
+
- Mouse drag moves the carousel track again in the horizontal full-screen
|
|
85
|
+
layout and in `.uncontained.snap`. Snapping used to pull the track back on
|
|
86
|
+
every move.
|
|
87
|
+
- Editing or clearing a Datepicker `<input type="date">` with the keyboard
|
|
88
|
+
updates the formatted date painted over the field in Chrome and Safari.
|
|
89
|
+
After the field lost focus it used to show the previous date.
|
|
90
|
+
- Clicking a Datepicker date input no longer opens the browser's date picker on
|
|
91
|
+
top of a visible Datepicker calendar (`openByDefault` or `container`). When
|
|
92
|
+
the calendar is hidden, the default, the browser picker still opens.
|
|
93
|
+
- Leading `.prefix` and trailing `.suffix` icons stay visible on a Datepicker
|
|
94
|
+
date input in Chrome and Safari. The input's filled background used to cover
|
|
95
|
+
them.
|
|
96
|
+
- `.slider.stops` puts each dot at `min` plus a whole number of steps, so a
|
|
97
|
+
`step` that does not divide the range no longer spreads the dots over the
|
|
98
|
+
whole track. With no `step`, `step="any"`, or a zero or negative step, the
|
|
99
|
+
slider shows no dots. Dots follow the range input's direction and leave the
|
|
100
|
+
inset icon uncovered.
|
|
101
|
+
- `Slider.destroy()` removes the custom properties it set on the input and its
|
|
102
|
+
host, so stop dots and the track fill no longer stay painted. Inline values
|
|
103
|
+
set before init come back.
|
|
104
|
+
- A `<header>` that holds only a `nav.tabs` is no longer styled as a top app
|
|
105
|
+
bar, so it no longer sticks to the top of the page or takes the app bar fill.
|
|
106
|
+
- Medium and large app bars no longer send the page back to the top when they
|
|
107
|
+
collapse. A short or slow scroll near the top used to snap back and leave the
|
|
108
|
+
bar switching between sizes. The bar now collapses once the page has
|
|
109
|
+
scrolled by the height it gives up, and expands when the page returns to the
|
|
110
|
+
top of the bar.
|
|
111
|
+
|
|
112
|
+
### Changed
|
|
113
|
+
|
|
114
|
+
- The ExpressiveCSS skill bundles the starter page and the five layout
|
|
115
|
+
templates under `assets/templates/`, and the Install and Design guides point
|
|
116
|
+
to them. The Install guide gives a plain `npm install` command, and its
|
|
117
|
+
minimum page no longer puts the page heading in an app bar without
|
|
118
|
+
destinations.
|
|
119
|
+
- Skill guides put their steps under their own headings instead of under
|
|
120
|
+
"Do not use when". The framework contribution path moved to
|
|
121
|
+
`references/contributing.md`.
|
|
122
|
+
- Component guides list the API reference subsections they leave out. Their
|
|
123
|
+
examples use real link targets, and menu actions are buttons. The Buttons
|
|
124
|
+
reference calls `circle` a round common button and points icon buttons to
|
|
125
|
+
`.icon-button`.
|
|
126
|
+
- Documentation examples no longer use `href="#!"` in copyable code. Menu,
|
|
127
|
+
split-button, app-bar and tooltip actions are `<button type="button">`,
|
|
128
|
+
and code samples link to realistic paths. Live navigation demos on the docs
|
|
129
|
+
site keep `#!`. The app-bar Search icon is a button. The API reference drops
|
|
130
|
+
rendered demo text that had been copied into it, and the Lightbox guide
|
|
131
|
+
includes its options and methods.
|
|
132
|
+
- The footer partial no longer carries sticky-footer rules. Their nested
|
|
133
|
+
`:has()` selector was invalid, so browsers had always dropped them. The
|
|
134
|
+
Footer page now gives the two rules to add yourself, as the API reference
|
|
135
|
+
already did.
|
|
136
|
+
- The Auto Init page and the API reference list every component `AutoInit()`
|
|
137
|
+
starts. They add AppBar and ExpandingCard, give Cards its real selector, and
|
|
138
|
+
list both picker spellings, `.datepicker, .date-picker` and
|
|
139
|
+
`.timepicker, .time-picker`. Both name all eight
|
|
140
|
+
behaviors the bundle starts on import, including Dialogs, BottomSheets and
|
|
141
|
+
SideSheets, and call the range control Slider instead of Range.
|
|
142
|
+
- Documentation code samples match their demos and the current framework. The
|
|
143
|
+
Date picker and Time picker samples select `.date-picker` and `.time-picker`,
|
|
144
|
+
the Slider samples and the M3 guidelines use `Expressive.Slider`, and card
|
|
145
|
+
samples drop the unstyled `supporting-text` class. The Grid, circular image,
|
|
146
|
+
character counter, snackbar dismiss and full-screen dialog samples now match
|
|
147
|
+
the demos next to them. The Scrollspy sample uses the canonical
|
|
148
|
+
`hide-on-compact-only` instead of the legacy `hide-on-small-only` alias.
|
|
149
|
+
- Documentation no longer describes removed classes or markup. Typography
|
|
150
|
+
names `body-large`, `body-medium` and `body-small`, and Select describes the
|
|
151
|
+
`.field` wrapper the plugin reuses or creates instead of `.select-wrapper`.
|
|
152
|
+
Tabs no longer mentions `tabs-horizontal`, and Tooltips no longer says the
|
|
153
|
+
plugin adds `.material-tooltip`. Grid offsets use the Compact through
|
|
154
|
+
Extra-large breakpoint names.
|
|
155
|
+
- Getting started lists `fonts/` and `modular.mjs` in the `dist/` tree and
|
|
156
|
+
the minified files in the project tree. Its README link opens the "Reduce
|
|
157
|
+
page downloads" section.
|
|
158
|
+
- On the docs site, the Start navigation item opens the landing page again.
|
|
159
|
+
Slider demos keep their stop dots, and carousel demo links no longer point
|
|
160
|
+
at anchors that do not exist.
|
|
161
|
+
|
|
162
|
+
## [0.11.0] - 2026-09-30
|
|
163
|
+
|
|
164
|
+
### Added
|
|
165
|
+
|
|
166
|
+
- `.visually-hidden` hides an element from sight and keeps it in the
|
|
167
|
+
accessibility tree, so screen readers still announce it. It exposes the
|
|
168
|
+
existing `visually-hidden` mixin, which now also clears the border and takes
|
|
169
|
+
an `$important` flag for the utility. The filter chip's checkbox uses the
|
|
170
|
+
mixin instead of its own copy.
|
|
171
|
+
- `fieldset.plain` groups radios or checkboxes inside a surface that already
|
|
172
|
+
frames them. It has no outline, fill, padding, or margin from a preceding
|
|
173
|
+
fieldset, and its legend starts flush with the content.
|
|
174
|
+
- The docs ship a downloadable starter page (`docs/public/starter.html`) and five
|
|
175
|
+
copyable responsive layouts: compact, navigation rail, expanded rail,
|
|
176
|
+
list-detail and dashboard.
|
|
177
|
+
|
|
178
|
+
### Changed
|
|
179
|
+
|
|
180
|
+
- Common buttons (`button`, `a.button`, `label.button`, every size and style)
|
|
181
|
+
reflow a label that does not fit. The label wraps between words, the button
|
|
182
|
+
grows from its size's container height, which is now a minimum, and it never
|
|
183
|
+
grows wider than its parent. A label that fits renders at the same size as
|
|
184
|
+
before; 4dp of block padding keeps wrapped lines off the edges. Circle
|
|
185
|
+
buttons, FABs, extended FABs, the chip delete button, carousel dots, Timepicker
|
|
186
|
+
AM/PM controls, and buttons in button groups, split buttons, toolbars, top app
|
|
187
|
+
bars, dialog and
|
|
188
|
+
sheet headers, navigation bars and rails, tabs, pagination and snackbars keep
|
|
189
|
+
one line at a fixed height. The file input trigger grows from its 48dp
|
|
190
|
+
minimum the same way. Dialog action rows drop their own copy of this rule.
|
|
191
|
+
- Chips add 4dp of block padding, so a wrapped label no longer touches the
|
|
192
|
+
chip's edges. A chip that fits on one line keeps its 32dp height.
|
|
193
|
+
- Every top app bar is pinned to the top of the page with `position: sticky`.
|
|
194
|
+
It no longer needs the `fixed` class.
|
|
195
|
+
|
|
196
|
+
### Migration
|
|
197
|
+
|
|
198
|
+
- A common button's container height is now a `min-height`. A rule that gives
|
|
199
|
+
a button a smaller `height` must also set `min-height`, or set
|
|
200
|
+
`--md-comp-filled-button-container-height` instead.
|
|
201
|
+
- Remove `fixed` from top app bar headers; it has no effect. To let a bar
|
|
202
|
+
scroll away with the page, set `position: static` on its `<header>`.
|
|
203
|
+
|
|
204
|
+
### Fixed
|
|
205
|
+
|
|
206
|
+
- ScrollSpy honors per-section offsets and active classes, isolates tables of
|
|
207
|
+
contents through shared `getActiveElement` callbacks, and restores authored
|
|
208
|
+
offset styles on teardown. Native anchor navigation remains unchanged.
|
|
209
|
+
|
|
210
|
+
- Carousel ignores stale scroll-completion events from earlier navigation, so
|
|
211
|
+
selecting a swipeable tab immediately after initialization keeps that selection.
|
|
212
|
+
|
|
213
|
+
- FormSelect preserves every associated label when enhanced, including naming
|
|
214
|
+
order, label activation and authored naming overrides. Teardown restores label
|
|
215
|
+
attributes and removes generated label IDs.
|
|
216
|
+
|
|
217
|
+
- FormSelect hides the native control from assistive technology, leaving one
|
|
218
|
+
named combobox. Required and custom validation errors appear beside the visible
|
|
219
|
+
field; the native select retains form values and validation rules. Static
|
|
220
|
+
validity checks preserve focus, and interactive validation forwards native
|
|
221
|
+
focus to the visible field, including in forms with mixed native controls.
|
|
222
|
+
|
|
223
|
+
- Tabs resolves panel IDs directly, so numeric IDs and IDs containing dots,
|
|
224
|
+
colons or brackets work in normal and swipeable modes without selector errors
|
|
225
|
+
or accidental matches against other elements.
|
|
226
|
+
|
|
227
|
+
- Autocomplete searches on input events, including paste, replacement and deletion
|
|
228
|
+
without key events. Keyboard typing does not repeat the search on keyup.
|
|
229
|
+
|
|
230
|
+
- FormSelect restores the authored label and node order during teardown and
|
|
231
|
+
reinitialization, including when it creates the field wrapper.
|
|
232
|
+
|
|
233
|
+
- Datepicker treats `YYYY-MM-DD` input as a local calendar date during
|
|
234
|
+
initialization, editing and reopening, so dates no longer shift backward in
|
|
235
|
+
timezones west of UTC. Impossible dates such as `2023-02-29` are rejected.
|
|
236
|
+
|
|
8
237
|
## [0.10.1] - 2026-09-22
|
|
9
238
|
|
|
10
239
|
### Added
|
|
@@ -19,7 +248,7 @@ the format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
19
248
|
|
|
20
249
|
- **Offline design context for the ExpressiveCSS skill.** The generator now
|
|
21
250
|
copies the hard rules, window-size tables, component chooser, screen recipes,
|
|
22
|
-
anatomy cheat sheet, and
|
|
251
|
+
anatomy cheat sheet, and retired name map from `m3-guidelines.md` into
|
|
23
252
|
`skills/expressivecss/references/design-rules.md`, and the root, Design,
|
|
24
253
|
Usage, and Install guides route to it. JavaScript component guides inline the
|
|
25
254
|
options table and method names from `llm.md`. The Install guide carries a
|
|
@@ -628,7 +857,7 @@ semantics sweep keeps rendering — nothing warns at runtime — so each
|
|
|
628
857
|
the same promise with no keyboard model behind it. `semantics.json` records
|
|
629
858
|
the rejection.
|
|
630
859
|
|
|
631
|
-
**Migration.** `.searchbar`, the pre-1.0
|
|
860
|
+
**Migration.** `.searchbar`, the pre-1.0 navbar search field,
|
|
632
861
|
is now an alias of `.search-bar` and moves out of `forms/_input-fields.scss`
|
|
633
862
|
into `components/_search.scss`. Old markup keeps working and picks up the M3
|
|
634
863
|
container; `tests/m3-naming.test.js` holds the alias to every rule.
|
|
@@ -974,7 +1203,7 @@ semantics sweep keeps rendering — nothing warns at runtime — so each
|
|
|
974
1203
|
`height` above and leave `full-screen` off.
|
|
975
1204
|
|
|
976
1205
|
- **The coverflow carousel layout is gone.** `.coverflow` was the 3D
|
|
977
|
-
perspective tween inherited from the
|
|
1206
|
+
perspective tween inherited from the older source, and
|
|
978
1207
|
Material 3 defines it at no layout and no size. It hand-wrote a momentum
|
|
979
1208
|
simulation the browser already performs — velocity smoothing over a
|
|
980
1209
|
`Date.now()` delta, exponential-decay easing toward a target, modular index
|
|
@@ -1141,7 +1370,7 @@ semantics sweep keeps rendering — nothing warns at runtime — so each
|
|
|
1141
1370
|
instead of the spec's 56. Keyed on the shared `$icon` list now, the way
|
|
1142
1371
|
`_buttons` and `_toolbar` already were.
|
|
1143
1372
|
- **Five more tokens were declared or referenced but not both**, found by the
|
|
1144
|
-
new check below. The time picker's AM/PM buttons referenced
|
|
1373
|
+
new check below. The time picker's AM/PM buttons referenced retired
|
|
1145
1374
|
`--btn-padding` and `--btn-border-radius`, which no longer exist — the
|
|
1146
1375
|
declarations were invalid at computed-value time, which does *not* fall back
|
|
1147
1376
|
to the rule underneath, so the padding rendered as 0 while a base button rule
|
|
@@ -1522,7 +1751,7 @@ LLM-facing documentation, and the docs site's own templates.
|
|
|
1522
1751
|
### Fixed
|
|
1523
1752
|
|
|
1524
1753
|
- **`llm.md` taught classes that do not exist.** It is the markup contract other
|
|
1525
|
-
tools and models read, and several sections still carried
|
|
1754
|
+
tools and models read, and several sections still carried retired
|
|
1526
1755
|
names the Material Design 3 rewrite removed. Each replacement was verified
|
|
1527
1756
|
against `dist/css/expressive.css` and `src/ts`:
|
|
1528
1757
|
- `.btn-floating`, `.btn-large` and `.btn-small` (16 references) — a FAB is
|
|
@@ -1605,7 +1834,7 @@ guidelines document. No breaking changes.
|
|
|
1605
1834
|
|
|
1606
1835
|
## [0.5.0] - 2026-08-19
|
|
1607
1836
|
|
|
1608
|
-
The release that finishes moving the
|
|
1837
|
+
The release that finishes moving the older component set onto Material
|
|
1609
1838
|
Design 3 Expressive. Components with no M3 counterpart are gone, several were
|
|
1610
1839
|
renamed to their M3 names, and the color layer now carries the full role set.
|
|
1611
1840
|
Pre-1.0, so the breaking changes below are not gated behind a deprecation cycle
|
|
@@ -1690,7 +1919,9 @@ are no compatibility aliases.
|
|
|
1690
1919
|
- `.tabs` nested in a header or app bar as a secondary row. `.tabs` is a
|
|
1691
1920
|
standalone component; the `.tabs.transparent` app bar variant is gone with it.
|
|
1692
1921
|
|
|
1693
|
-
[Unreleased]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.
|
|
1922
|
+
[Unreleased]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.12.0...HEAD
|
|
1923
|
+
[0.12.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.11.0...v0.12.0
|
|
1924
|
+
[0.11.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.10.1...v0.11.0
|
|
1694
1925
|
[0.10.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.10.0...v0.10.1
|
|
1695
1926
|
[0.10.0]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.9.1...v0.10.0
|
|
1696
1927
|
[0.9.1]: https://github.com/BaezFJ/ExpressiveCSS/compare/v0.9.0...v0.9.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.
|
|
7
|
+
> ExpressiveCSS version `0.12.0` is under active development.
|
|
8
8
|
|
|
9
9
|
Documentation: [www.expressivecss.com](https://www.expressivecss.com)
|
|
10
10
|
|
|
@@ -93,6 +93,27 @@ loads fonts from `../fonts/`, so keep `dist/fonts/` next to `dist/css/`.
|
|
|
93
93
|
|
|
94
94
|
## Usage
|
|
95
95
|
|
|
96
|
+
### Copy the starter
|
|
97
|
+
|
|
98
|
+
After building the framework, copy the [basic starter](docs/public/starter.html)
|
|
99
|
+
and the compiled assets into a new directory:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
mkdir my-site
|
|
103
|
+
cp docs/public/starter.html my-site/index.html
|
|
104
|
+
cp -R dist my-site/dist
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Open `my-site/index.html` in your browser. The template includes an app bar,
|
|
108
|
+
responsive cards, a tooltip initialized with `AutoInit()`, and automatic light
|
|
109
|
+
and dark themes. Edit the title and content to make it your own. Keep
|
|
110
|
+
`dist/fonts/` beside `dist/css/` so the bundled fonts load.
|
|
111
|
+
|
|
112
|
+
For complete app layouts, open the [layout gallery](https://www.expressivecss.com/layouts.html).
|
|
113
|
+
The source templates are `docs/public/layout-*.html`: compact, navigation rail,
|
|
114
|
+
expanded rail, list-detail, and dashboard. Copy any one as `index.html` with the
|
|
115
|
+
same `dist/` directory.
|
|
116
|
+
|
|
96
117
|
### Browser bundle
|
|
97
118
|
|
|
98
119
|
Load the compiled stylesheet and browser bundle, then initialize components after
|