material-inspired-component-library 8.1.1 → 9.0.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.
Files changed (283) hide show
  1. package/README.md +106 -18
  2. package/components/README.md +1 -1
  3. package/components/accordion/README.md +6 -6
  4. package/components/alert/README.md +10 -10
  5. package/components/alert/index.scss +27 -52
  6. package/components/appbar/README.md +19 -6
  7. package/components/appbar/index.scss +40 -44
  8. package/components/badge/README.md +12 -10
  9. package/components/badge/index.scss +21 -25
  10. package/components/bottomsheet/README.md +26 -1
  11. package/components/bottomsheet/index.scss +58 -44
  12. package/components/button/README.md +7 -5
  13. package/components/button/_shared.scss +210 -0
  14. package/components/button/index.scss +49 -283
  15. package/components/card/README.md +97 -85
  16. package/components/card/index.scss +46 -65
  17. package/components/checkbox/README.md +25 -14
  18. package/{tools/shapes/check.mjs → components/checkbox/_label.scss} +37 -42
  19. package/components/checkbox/index.scss +66 -66
  20. package/components/chip/README.md +186 -0
  21. package/components/chip/index.scss +285 -0
  22. package/components/datepicker/README.md +79 -0
  23. package/components/datepicker/index.scss +346 -315
  24. package/components/dialog/README.md +20 -10
  25. package/components/dialog/index.scss +55 -66
  26. package/components/divider/README.md +16 -15
  27. package/components/divider/index.scss +9 -25
  28. package/components/iconbutton/README.md +8 -3
  29. package/components/iconbutton/index.scss +83 -186
  30. package/components/list/README.md +89 -156
  31. package/components/list/index.scss +34 -36
  32. package/components/menu/README.md +81 -155
  33. package/components/menu/index.scss +52 -58
  34. package/components/navigationbar/README.md +108 -0
  35. package/components/navigationbar/index.scss +185 -0
  36. package/components/navigationrail/README.md +60 -36
  37. package/components/navigationrail/_navitem.scss +96 -0
  38. package/components/navigationrail/index.scss +76 -130
  39. package/components/progressindicator/README.md +83 -47
  40. package/components/progressindicator/index.scss +622 -172
  41. package/components/radio/README.md +11 -9
  42. package/components/radio/index.scss +36 -33
  43. package/components/select/README.md +12 -7
  44. package/components/select/index.scss +26 -34
  45. package/components/shapes/README.md +3 -3
  46. package/components/shapes/index.scss +0 -1
  47. package/components/sidesheet/README.md +21 -9
  48. package/components/sidesheet/index.scss +38 -46
  49. package/components/slider/README.md +21 -0
  50. package/components/slider/index.scss +108 -139
  51. package/components/snackbar/README.md +32 -35
  52. package/components/snackbar/index.scss +10 -22
  53. package/components/stepper/README.md +14 -7
  54. package/components/stepper/index.scss +58 -39
  55. package/components/switch/README.md +22 -15
  56. package/components/switch/index.scss +68 -60
  57. package/components/textfield/README.md +48 -5
  58. package/components/textfield/index.scss +192 -248
  59. package/components/timepicker/README.md +53 -23
  60. package/components/timepicker/index.scss +110 -128
  61. package/dist/alert.css +1 -1
  62. package/dist/alert.js +1 -1
  63. package/dist/appbar.css +1 -1
  64. package/dist/appbar.js +1 -1
  65. package/dist/badge.css +1 -1
  66. package/dist/badge.js +1 -1
  67. package/dist/base.css +1 -0
  68. package/dist/base.js +1 -0
  69. package/dist/bottomsheet.css +1 -1
  70. package/dist/bottomsheet.js +1 -1
  71. package/dist/button.css +1 -1
  72. package/dist/button.js +1 -1
  73. package/dist/card.css +1 -1
  74. package/dist/card.js +1 -1
  75. package/dist/checkbox.css +1 -1
  76. package/dist/checkbox.js +1 -1
  77. package/dist/chip.css +1 -0
  78. package/dist/chip.js +1 -0
  79. package/dist/components/iconbutton/index.d.ts +2 -7
  80. package/dist/components/slider/index.d.ts +1 -1
  81. package/dist/components/textfield/index.d.ts +2 -2
  82. package/dist/datepicker.css +1 -1
  83. package/dist/datepicker.js +1 -1
  84. package/dist/dialog.css +1 -1
  85. package/dist/dialog.js +1 -1
  86. package/dist/divider.css +1 -1
  87. package/dist/divider.js +1 -1
  88. package/dist/field.css +1 -0
  89. package/dist/field.js +1 -0
  90. package/dist/foundations/form/index.js +1 -1
  91. package/dist/foundations/runtime.d.ts +15 -0
  92. package/dist/foundations/runtime.js +1 -0
  93. package/dist/iconbutton.css +1 -1
  94. package/dist/iconbutton.js +1 -1
  95. package/dist/layout.css +1 -1
  96. package/dist/layout.js +1 -1
  97. package/dist/list.css +1 -1
  98. package/dist/list.js +1 -1
  99. package/dist/menu.css +1 -1
  100. package/dist/menu.js +1 -1
  101. package/dist/micl.css +1 -1
  102. package/dist/micl.d.ts +14 -5
  103. package/dist/micl.js +1 -1
  104. package/dist/navigationbar.css +1 -0
  105. package/dist/navigationbar.js +1 -0
  106. package/dist/navigationrail.css +1 -1
  107. package/dist/navigationrail.js +1 -1
  108. package/dist/progressindicator.css +1 -1
  109. package/dist/progressindicator.js +1 -1
  110. package/dist/radio.css +1 -1
  111. package/dist/radio.js +1 -1
  112. package/dist/scrollbar.js +1 -1
  113. package/dist/select.css +1 -1
  114. package/dist/select.js +1 -1
  115. package/dist/shapes.css +1 -1
  116. package/dist/shapes.js +1 -1
  117. package/dist/sidesheet.css +1 -1
  118. package/dist/sidesheet.js +1 -1
  119. package/dist/slider.css +1 -1
  120. package/dist/slider.js +1 -1
  121. package/dist/snackbar.css +1 -1
  122. package/dist/snackbar.js +1 -1
  123. package/dist/stepper.css +1 -1
  124. package/dist/stepper.js +1 -1
  125. package/dist/switch.css +1 -1
  126. package/dist/switch.js +1 -1
  127. package/dist/textfield.css +1 -1
  128. package/dist/textfield.js +1 -1
  129. package/dist/timepicker.css +1 -1
  130. package/dist/timepicker.js +1 -1
  131. package/foundations/_index.scss +35 -0
  132. package/foundations/{index.scss → base/index.scss} +21 -56
  133. package/foundations/field/index.scss +37 -0
  134. package/foundations/layout/index.scss +64 -65
  135. package/package.json +23 -9
  136. package/styles/statelayer.scss +20 -5
  137. package/styles.scss +5 -2
  138. package/.claude/settings.local.json +0 -17
  139. package/.editorconfig +0 -12
  140. package/.gitattributes +0 -9
  141. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
  142. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  143. package/CLAUDE.md +0 -53
  144. package/CODE_OF_CONDUCT.md +0 -128
  145. package/components/bottomsheet/index.ts +0 -153
  146. package/components/button/index.ts +0 -79
  147. package/components/checkbox/index.ts +0 -148
  148. package/components/datepicker/index.ts +0 -693
  149. package/components/iconbutton/index.ts +0 -77
  150. package/components/list/index.ts +0 -138
  151. package/components/menu/index.ts +0 -145
  152. package/components/navigationrail/index.ts +0 -87
  153. package/components/progressindicator/index.ts +0 -77
  154. package/components/slider/index.ts +0 -149
  155. package/components/snackbar/index.ts +0 -118
  156. package/components/stepper/index.ts +0 -248
  157. package/components/textfield/index.ts +0 -188
  158. package/components/timepicker/index.ts +0 -413
  159. package/dist/components/progressindicator/index.d.ts +0 -6
  160. package/dist/foundations.css +0 -1
  161. package/dist/foundations.js +0 -1
  162. package/docs/accordion.html +0 -344
  163. package/docs/alert.html +0 -177
  164. package/docs/bottomsheet.html +0 -240
  165. package/docs/button.html +0 -291
  166. package/docs/card-awards.webp +0 -0
  167. package/docs/card-cabinet.webp +0 -0
  168. package/docs/card-city.webp +0 -0
  169. package/docs/card-fingerprint.webp +0 -0
  170. package/docs/card-holiday.webp +0 -0
  171. package/docs/card-names.webp +0 -0
  172. package/docs/card.html +0 -159
  173. package/docs/checkbox.html +0 -147
  174. package/docs/datepicker.html +0 -274
  175. package/docs/dialog.html +0 -195
  176. package/docs/divider.html +0 -139
  177. package/docs/docs.css +0 -26
  178. package/docs/docs.js +0 -139
  179. package/docs/iconbutton.html +0 -331
  180. package/docs/index.html +0 -431
  181. package/docs/list.html +0 -310
  182. package/docs/menu.html +0 -574
  183. package/docs/micl.css +0 -1
  184. package/docs/micl.js +0 -1
  185. package/docs/navigationrail.html +0 -138
  186. package/docs/progressindicator.html +0 -288
  187. package/docs/radio.html +0 -123
  188. package/docs/select.html +0 -337
  189. package/docs/shapes.css +0 -1
  190. package/docs/shapes.html +0 -159
  191. package/docs/shapes.js +0 -1
  192. package/docs/sidesheet.html +0 -149
  193. package/docs/slider.html +0 -141
  194. package/docs/snackbar.html +0 -102
  195. package/docs/stepper.html +0 -319
  196. package/docs/switch.html +0 -196
  197. package/docs/textfield.html +0 -208
  198. package/docs/themes/airblue/dark-hc.css +0 -51
  199. package/docs/themes/airblue/dark-mc.css +0 -51
  200. package/docs/themes/airblue/dark.css +0 -51
  201. package/docs/themes/airblue/light-hc.css +0 -51
  202. package/docs/themes/airblue/light-mc.css +0 -51
  203. package/docs/themes/airblue/light.css +0 -51
  204. package/docs/themes/airblue/theme.css +0 -306
  205. package/docs/themes/barnred/dark-hc.css +0 -51
  206. package/docs/themes/barnred/dark-mc.css +0 -51
  207. package/docs/themes/barnred/dark.css +0 -51
  208. package/docs/themes/barnred/light-hc.css +0 -51
  209. package/docs/themes/barnred/light-mc.css +0 -51
  210. package/docs/themes/barnred/light.css +0 -51
  211. package/docs/themes/barnred/theme.css +0 -306
  212. package/docs/themes/citrine/dark-hc.css +0 -51
  213. package/docs/themes/citrine/dark-mc.css +0 -51
  214. package/docs/themes/citrine/dark.css +0 -51
  215. package/docs/themes/citrine/light-hc.css +0 -51
  216. package/docs/themes/citrine/light-mc.css +0 -51
  217. package/docs/themes/citrine/light.css +0 -51
  218. package/docs/themes/citrine/theme.css +0 -306
  219. package/docs/themes/gray/dark-hc.css +0 -51
  220. package/docs/themes/gray/dark-mc.css +0 -51
  221. package/docs/themes/gray/dark.css +0 -51
  222. package/docs/themes/gray/light-hc.css +0 -51
  223. package/docs/themes/gray/light-mc.css +0 -51
  224. package/docs/themes/gray/light.css +0 -51
  225. package/docs/themes/gray/theme.css +0 -306
  226. package/docs/themes/greenery/dark-hc.css +0 -51
  227. package/docs/themes/greenery/dark-mc.css +0 -51
  228. package/docs/themes/greenery/dark.css +0 -51
  229. package/docs/themes/greenery/light-hc.css +0 -51
  230. package/docs/themes/greenery/light-mc.css +0 -51
  231. package/docs/themes/greenery/light.css +0 -51
  232. package/docs/themes/greenery/theme.css +0 -306
  233. package/docs/themes/hermana/dark-hc.css +0 -51
  234. package/docs/themes/hermana/dark-mc.css +0 -51
  235. package/docs/themes/hermana/dark.css +0 -51
  236. package/docs/themes/hermana/light-hc.css +0 -51
  237. package/docs/themes/hermana/light-mc.css +0 -51
  238. package/docs/themes/hermana/light.css +0 -51
  239. package/docs/themes/hermana/theme.css +0 -306
  240. package/docs/themes/illuminating/dark-hc.css +0 -51
  241. package/docs/themes/illuminating/dark-mc.css +0 -51
  242. package/docs/themes/illuminating/dark.css +0 -51
  243. package/docs/themes/illuminating/light-hc.css +0 -51
  244. package/docs/themes/illuminating/light-mc.css +0 -51
  245. package/docs/themes/illuminating/light.css +0 -51
  246. package/docs/themes/illuminating/theme.css +0 -306
  247. package/docs/themes/magenta/dark-hc.css +0 -51
  248. package/docs/themes/magenta/dark-mc.css +0 -51
  249. package/docs/themes/magenta/dark.css +0 -51
  250. package/docs/themes/magenta/light-hc.css +0 -51
  251. package/docs/themes/magenta/light-mc.css +0 -51
  252. package/docs/themes/magenta/light.css +0 -51
  253. package/docs/themes/magenta/theme.css +0 -306
  254. package/docs/themes/mocha/dark-hc.css +0 -51
  255. package/docs/themes/mocha/dark-mc.css +0 -51
  256. package/docs/themes/mocha/dark.css +0 -51
  257. package/docs/themes/mocha/light-hc.css +0 -51
  258. package/docs/themes/mocha/light-mc.css +0 -51
  259. package/docs/themes/mocha/light.css +0 -51
  260. package/docs/themes/mocha/theme.css +0 -306
  261. package/docs/themes/olivegreen/dark-hc.css +0 -51
  262. package/docs/themes/olivegreen/dark-mc.css +0 -51
  263. package/docs/themes/olivegreen/dark.css +0 -51
  264. package/docs/themes/olivegreen/light-hc.css +0 -51
  265. package/docs/themes/olivegreen/light-mc.css +0 -51
  266. package/docs/themes/olivegreen/light.css +0 -51
  267. package/docs/themes/olivegreen/theme.css +0 -306
  268. package/docs/themes/peri/dark-hc.css +0 -51
  269. package/docs/themes/peri/dark-mc.css +0 -51
  270. package/docs/themes/peri/dark.css +0 -51
  271. package/docs/themes/peri/light-hc.css +0 -51
  272. package/docs/themes/peri/light-mc.css +0 -51
  273. package/docs/themes/peri/light.css +0 -51
  274. package/docs/themes/peri/theme.css +0 -306
  275. package/docs/timepicker.html +0 -160
  276. package/foundations/form/index.ts +0 -174
  277. package/foundations/layout/README.md +0 -127
  278. package/intl.d.ts +0 -9
  279. package/micl.ts +0 -221
  280. package/styles/README.md +0 -196
  281. package/tools/shapes/generate.mjs +0 -828
  282. package/tsconfig.json +0 -116
  283. package/webpack.config.js +0 -159
package/README.md CHANGED
@@ -1,21 +1,47 @@
1
- # Material-Inspired Component Library (MICL)
2
- The Material-Inspired Component Library (MICL) offers a free and open-source collection of beautifully crafted components leveraging native HTML markup, designed to align with the [Material Design 3](https://m3.material.io/) guidelines. MICL prioritizes minimal HTML markup and often requires no JavaScript, making it a lightweight and efficient choice for your projects.
1
+ # MICL — Material Design 3 Expressive for the plain web
3
2
 
4
- ## Why Choose MICL?
5
- - **Embrace Material Design 3:** Seamlessly integrate the aesthetic and user experience principles of Material Design into your web pages and applications.
6
- - **Lightweight & Efficient:** Benefit from components built with straightforward HTML and minimal to no JavaScript, ensuring fast loading times and a streamlined development process.
7
- - **Effortless Dark Mode:** Enjoy out-of-the-box support for both light and dark modes, automatically adapting to your defined color scheme.
3
+ [![npm](https://img.shields.io/npm/v/material-inspired-component-library)](https://www.npmjs.com/package/material-inspired-component-library)
4
+ [![license](https://img.shields.io/github/license/henkpb/micl)](LICENSE)
5
+ ![zero dependencies](https://img.shields.io/badge/runtime%20dependencies-0-brightgreen)
8
6
 
9
- ## Why Might MICL Not Be for You?
10
- - **Heavy JavaScript Dependencies:** If your project heavily relies on a JavaScript framework for component interaction, MICL's minimalist approach might not be the best fit.
11
- - **Bootstrap Preference:** Users deeply integrated with or preferring the Bootstrap CSS framework may find MICL's distinct design philosophy less suitable.
12
- - **Legacy Browser Support:** MICL is designed for modern browsers, and comprehensive support for older browser versions is not a primary focus.
7
+ **MICL (Material-Inspired Component Library)** is a free, open-source implementation of [Material Design 3](https://m3.material.io/) — including the current **M3 Expressive** update — built from native HTML elements and modern CSS. No custom elements, no framework, no runtime dependencies, and for most components no JavaScript at all.
13
8
 
14
- ## Demo & Documentation 📖
15
- Explore the components in a live environment and see how they work.
9
+ **[Live showcase](https://henkpb.github.io/micl/)** · **[Component documentation](components/README.md)** · **[Quick start](#quick-start-)**
16
10
 
17
- - **Live Demo:** [The MICL Showcase](https://henkpb.github.io/micl/)
18
- - **Component Documentation:** [View all component documentation](components/README.md)
11
+ ## Why MICL exists
12
+
13
+ When Google wound down [material-web](https://github.com/material-components/material-web), the web platform lost its reference implementation of Material Design 3 — and the design system's newest chapter, **M3 Expressive**, never reached the open web at all.
14
+
15
+ MICL picks up that torch with the opposite architecture. Where material-web wrapped every component in a JavaScript custom element, MICL styles the HTML you already write: a progress bar is a `<progress>`, a dialog is a `<dialog>`, a menu is a popover, a navigation rail is a `<nav>`. The heavy lifting is done by modern CSS — registered custom properties, container style queries, typed `attr()`, `clip-path: shape()`, anchor positioning — so components render on first paint, keep their native semantics and accessibility, and never fight your framework (or your decision not to use one).
16
+
17
+ ## Highlights
18
+
19
+ - **The M3 Expressive catalogue, on the web first.** 29 components, the Material shape library, adaptive pane layouts — and the signature Expressive details, like wavy progress indicators drawn and animated entirely in CSS, with the wave motion running on the compositor.
20
+ - **Native HTML first.** Components are your own markup plus a class. Forms post, dialogs trap focus, `<progress>` announces progress — because the platform does it, not a re-implementation.
21
+ - **(Almost) no JavaScript.** Most components need none. All interactive behaviour for the entire library fits in one dependency-free ~11 kB minified and gzipped file — or import per-component slices and let your bundler tree-shake the rest.
22
+ - **Theming per the spec.** Ready-made colour themes with light, dark and high-contrast variants, and every component themable through spec-named `--md-comp-*` custom properties.
23
+ - **À la carte delivery.** Full bundle or per-component CSS/JS pairs, npm or CDN ([jsDelivr](https://cdn.jsdelivr.net/npm/material-inspired-component-library/dist/micl.css)).
24
+ - **International by default.** Right-to-left layouts mirror automatically, and `prefers-reduced-motion` is respected throughout.
25
+
26
+ ## How MICL compares
27
+
28
+ | | **MICL** | material-web | Beer CSS | MUI | Angular Material |
29
+ |---|---|---|---|---|---|
30
+ | Design spec | **M3 Expressive** | M3 | M3 | Material-influenced (M2 heritage) | M3 |
31
+ | Actively developed | ✅ | ❌ development wound down | ✅ | ✅ | ✅ |
32
+ | Framework required | none | none (Lit runtime) | none | React | Angular |
33
+ | Component model | native HTML + CSS | custom elements | HTML + CSS classes | React components | Angular components |
34
+ | Usable without JavaScript | ✅ most components | ❌ | partly | ❌ | ❌ |
35
+ | Runtime dependencies | **0** | Lit | 0 | several | Angular |
36
+ | Server-side rendering | plain HTML + CSS, nothing to hydrate | needs SSR shims | ✅ | hydration | hydration |
37
+
38
+ <sup>Comparison reflects the situation at the time of writing (July 2026); corrections welcome.</sup>
39
+
40
+ ## Trade-offs — when MICL might not fit
41
+
42
+ - **Modern browsers only.** MICL leans on current CSS. Chromium-based browsers get the full experience today; Firefox degrades gracefully where a feature hasn't shipped yet (e.g. determinate progress values wait on typed `attr()`, available behind a preview-setting). Legacy browser support is a non-goal.
43
+ - **CSS-first philosophy.** If your team expects components as framework objects with props and events, MICL's markup-plus-classes approach will feel different — that difference is the point, but it is a real difference.
44
+ - **Not a Bootstrap look-alike.** MICL implements Material Design 3 faithfully rather than offering a neutral, endlessly re-skinnable base.
19
45
 
20
46
  ## Quick start 🚀
21
47
 
@@ -28,10 +54,27 @@ npm install material-inspired-component-library
28
54
 
29
55
  **Sass/SCSS**
30
56
 
31
- To import the styles for a single component (e.g., the [Card component](components/card/README.md)):
57
+ To import the styles for a single component (e.g., the [Card component](components/card/README.md)), import the shared base styles once, followed by the component:
32
58
  ```SCSS
59
+ @use "material-inspired-component-library/dist/base";
33
60
  @use "material-inspired-component-library/dist/card";
34
61
  ```
62
+ The base file contains the foundation design tokens and the `@property` registrations required by the ripple effect. It is small, needed only once, and already included in the full `micl.css`.
63
+
64
+ Some components build on other MICL components; when importing them individually, import their companions as well (each component's README shows the complete list):
65
+
66
+ | Component | Also import |
67
+ | --------- | ----------- |
68
+ | appbar | iconbutton |
69
+ | datepicker | dialog, textfield, button, iconbutton, divider |
70
+ | dialog | button, iconbutton |
71
+ | menu | list |
72
+ | navigationrail | iconbutton |
73
+ | select | textfield, menu, list |
74
+ | sidesheet | button, iconbutton, divider |
75
+ | snackbar | button, iconbutton |
76
+ | stepper | button |
77
+ | timepicker | dialog, button, iconbutton |
35
78
 
36
79
  To import all MICL styles:
37
80
  ```SCSS
@@ -51,6 +94,8 @@ Copy the main `micl.css` file to your distribution folder and include it in your
51
94
  <link rel="stylesheet" type="text/css" href="path/to/dist/micl.css">
52
95
  ```
53
96
 
97
+ The per-component stylesheets can be included the same way; include `base.css` once before them (`<link rel="stylesheet" type="text/css" href="path/to/dist/base.css">`).
98
+
54
99
  The main MICL CSS file can also be found on CDN networks, like on jsDelivr: `https://cdn.jsdelivr.net/npm/material-inspired-component-library/dist/micl.css`
55
100
 
56
101
  ### 3. Add the HTML & JavaScript
@@ -66,18 +111,31 @@ Here is a simple example of a [Card component](components/card/README.md).
66
111
  </div>
67
112
  ```
68
113
 
114
+ And here is the Expressive circular progress indicator — note that updating `value` is all it takes; the 500 ms Material-motion transition, the size adjustments, and the track gap are all CSS:
115
+
116
+ ```HTML
117
+ <progress class="micl-circular-progress" value="0.6"></progress>
118
+ ```
119
+
69
120
  Some components, like the [List](components/list/README.md), require a small amount of JavaScript to handle interactive behaviour. Because the JavaScript footprint in MICL is so small, you can import the code for all components at once.
70
121
  ```JavaScript
71
- import micl from "material-inspired-component-library/dist/micl";
122
+ import "material-inspired-component-library/dist/micl";
72
123
  ```
73
124
  This will initialize all MICL components, including those that will be added to the DOM later on.
74
125
 
126
+ To load only the JavaScript for the components you use, import their files individually. Each component registers itself with a shared runtime, so any combination works:
127
+ ```JavaScript
128
+ import "material-inspired-component-library/dist/list";
129
+ import "material-inspired-component-library/dist/textfield";
130
+ ```
131
+
75
132
  **Plain JavaScript**
76
133
 
77
134
  Copy the main `micl.js` file to your distribution folder and include it in your application:
78
135
  ```HTML
79
136
  <script src="path/to/dist/micl.js"></script>
80
137
  ```
138
+ The per-component files can be included the same way (`<script src="path/to/dist/list.js"></script>`).
81
139
 
82
140
  The main MICL JavaScript file can also be found on CDN networks, like on jsDelivr: `https://cdn.jsdelivr.net/npm/material-inspired-component-library/dist/micl.js`
83
141
 
@@ -90,9 +148,23 @@ MICL uses the [**Google Sans**](https://fonts.google.com/specimen/Google+Sans) a
90
148
 
91
149
  The [Styles guide](styles/README.md) describes how to change the default font.
92
150
 
151
+ ## Under the hood 🔬
152
+
153
+ MICL doubles as a working tour of what production CSS can do in 2026. A few of the techniques in the codebase:
154
+
155
+ - **Typed `attr()`** turns `<progress value>` and `aria-valuenow` into animatable CSS values — determinate indicators transition per the Material motion spec with zero JavaScript.
156
+ - **Registered `@property` custom properties** drive interpolable gradients: carved progress tracks, conic arcs, trigonometric cap positioning.
157
+ - **Compositor-only animation**: the Expressive wave travel is a transform over a static mask — no per-frame repaints, no matter how many indicators run.
158
+ - **`clip-path: shape()`** clips progress rings to geometrically antialiased annuli, with a gradient-mask fallback.
159
+ - **Container style queries** switch components at exact computed states (a wave collapsing to a mathematically flat bar at 100 %).
160
+ - **Anchor positioning** places menus and submenus without measurement code.
161
+
162
+ Each component's README documents its approach and its graceful-degradation story.
163
+
93
164
  ## Foundations 🪟
94
- A separate CSS file, based on the [Material Design Layout Foundation](https://m3.material.io/foundations/layout/understanding-layout/overview), provides styles for an adaptive layout. It includes styles for the **window frame**, **body region** and **panes** that adjust to the available screen space, ensuring your layout follows Material Design's responsive guidelines.
165
+ Separate CSS files, based on the [Material Design Layout Foundation](https://m3.material.io/foundations/layout/layout-overview), provide foundational styles that are not tied to a single component. The **Layout** foundation includes styles for the **window frame**, **rail region** and **panes** that adapt to the available screen space, ensuring your layout follows Material Design's adaptive design guidelines. The **Field** foundation arranges form fields in a grid with the standard Material vertical rhythm, optionally led by an icon column.
95
166
 
167
+ - [x] [Field](foundations/field/README.md)
96
168
  - [x] [Layout](foundations/layout/README.md)
97
169
 
98
170
  ## Available components ✅
@@ -105,13 +177,17 @@ The library currently consists of the following components:
105
177
  - [x] [Button](components/button/README.md)
106
178
  - [x] [Card](components/card/README.md)
107
179
  - [x] [Checkbox](components/checkbox/README.md)
180
+ - [x] [Chip](components/chip/README.md)
108
181
  - [x] [Date picker](components/datepicker/README.md)
182
+ - [x] [Date range picker](components/datepicker/README.md)
109
183
  - [x] [Dialog](components/dialog/README.md)
110
184
  - [x] [Divider](components/divider/README.md)
111
185
  - [x] [Icon button](components/iconbutton/README.md)
112
186
  - [x] [List](components/list/README.md)
113
187
  - [x] [Menu](components/menu/README.md)
188
+ - [x] [Navigation bar](components/navigationbar/README.md)
114
189
  - [x] [Navigation rail](components/navigationrail/README.md)
190
+ - [x] [Progress indicator](components/progressindicator/README.md)
115
191
  - [x] [Radio button](components/radio/README.md)
116
192
  - [x] [Select](components/select/README.md)
117
193
  - [x] [Shapes](components/shapes/README.md)
@@ -125,6 +201,18 @@ The library currently consists of the following components:
125
201
 
126
202
  ## Change Log ↪️
127
203
 
204
+ ### 9.0.0 (20.07.2026)
205
+ - **BREAKING**: Renamed all CSS custom properties from --md-sys- to --md-comp-.
206
+ - **BREAKING**: Renamed the layout class `micl-body` and its `micl-body--*` modifiers to `micl-panes`/`micl-panes--*`, aligning with the M3 Expressive layout terminology.
207
+ - **BREAKING**: Per-component CSS files no longer embed the shared foundation styles; load `dist/base.css` once before them. The full `micl.css` is unaffected.
208
+ - **Chip**: New component.
209
+ - **Progress indicator**: New component.
210
+ - **Navigation bar**: New component.
211
+ - **Navigation rail**: Support for adaptive behaviour.
212
+ - **Date Range picker**: Select two dates in the Date picker to return a date range.
213
+ - **Field**: The `micl-grid-field` and `micl-grid-iconfield` classes are now the 'Field' layout foundation with its own stylesheet (`dist/field.css`).
214
+ - **Layout**: The window now reserves the safety regions (`env(safe-area-inset-*)`) around the content, and sticky app bars and navigation rails stay below the top safety region.
215
+
128
216
  ### 8.1.0 (24.06.2026)
129
217
  - **Shapes**: The Material shape library supported as the 'Shapes' component.
130
218
 
@@ -148,7 +236,7 @@ The library currently consists of the following components:
148
236
  - **Time picker**: New component.
149
237
 
150
238
  ### 4.0.0 (27.10.2025)
151
- - **BREAKING**: Moved layout.scss to sub-folder.
239
+ - **BREAKING**: Moved layout.scss to subfolder.
152
240
  - **Alert**: New component.
153
241
  - **Stepper**: New component.
154
242
 
@@ -11,4 +11,4 @@ Each component is self-contained in a separate folder, making it easy to find wh
11
11
 
12
12
  Most components are standalone, but some are built on top of others. For example, the [Menu component](./menu/README.md) extends the [List component](./list/README.md), so it requires the styles and functionality of both. Always check the documentation for each component to see which dependencies you need to import. This ensures everything works as expected.
13
13
 
14
- A [separate CSS file](../foundations/layout/README.md), based on the [Material Design Layout Foundation](https://m3.material.io/foundations/layout/understanding-layout/overview), provides styles for an adaptive layout. It includes styles for the **window frame**, **body region** and **panes** that adjust to the available screen space, ensuring your layout follows Material Design's responsive guidelines.
14
+ A [separate CSS file](../foundations/layout/README.md), based on the [Material Design Layout Foundation](https://m3.material.io/foundations/layout/layout-overview), provides styles for an adaptive layout. It includes styles for the **window frame**, **rail region** and **panes** that adapt to the available screen space, ensuring your layout follows Material Design's adaptive design guidelines.
@@ -113,17 +113,17 @@ Since the Accordion is based on the List component, you can use the same utility
113
113
  ## Keyboard
114
114
  Each `<summary>` is a tab stop in document order — `Tab` and `Shift+Tab` move focus through the accordion headers. While focus is on a header, `Enter` or `Space` toggles the panel open or closed. As an optional enhancement, `ArrowDown` and `ArrowUp` move focus to the next or previous header in the same group; focus wraps around at the ends.
115
115
 
116
- ## Customizations
117
- You can customize the appearance of the Accordion component by overriding its own global CSS variables and those from the List component. These variables are declared on the `:root` pseudo-class and can be changed on any appropriate parent element to affect its child accordions.
116
+ ## Theming
117
+ You can customize the appearance of the Accordion component by overriding its own CSS custom properties and those of the [List](../list/README.md) component. Set them on any appropriate parent element to affect its child accordions.
118
118
 
119
- | Variable name | Default Value | Description |
120
- | ------------- | ------------- | ----------- |
121
- | --md-sys-accordion-item-space | 0px | The space between an opened accordion item and its next neighbour. |
119
+ | Custom property | Meaning | Default |
120
+ |---|---|---|
121
+ | `--md-comp-accordion-item-space` | The space between an opened accordion item and its next neighbour. | `0px` |
122
122
 
123
123
  **Example: Changing the margin between an opened item and the next**
124
124
 
125
125
  ```HTML
126
- <div class="micl-list" style="--md-sys-accordion-item-space:4px">
126
+ <div class="micl-list" style="--md-comp-accordion-item-space:4px">
127
127
  <details>
128
128
  ...
129
129
  </details>
@@ -56,9 +56,9 @@ To change the color, add one of the following modifier classes to the main `<div
56
56
 
57
57
  | Class name | Description |
58
58
  | ---------- | ----------- |
59
- | micl-alert--primary | Uses the main color scheme of your application |
60
- | micl-alert--secondary | Uses a color scheme that is less prominent than the main one |
61
- | micl-alert--tertiary | Uses a color scheme that provides contrasting accents |
59
+ | `micl-alert--primary` | Uses the main color scheme of your application |
60
+ | `micl-alert--secondary` | Uses a color scheme that is less prominent than the main one |
61
+ | `micl-alert--tertiary` | Uses a color scheme that provides contrasting accents |
62
62
 
63
63
  ### Alert Content Structure
64
64
  The Alert component is built with a few key structural elements.
@@ -69,18 +69,18 @@ The Alert component is built with a few key structural elements.
69
69
 
70
70
  - `micl-alert__supporting-text` (optional): Used for a short description or supplementary information. It is displayed in a smaller font.
71
71
 
72
- ## Customizations
73
- You can customize the appearance of the Alert component by overriding its global CSS variables. These variables are declared on the `:root` pseudo-class and can be changed on any appropriate parent element to affect its child alert.
72
+ ## Theming
73
+ Each alert can be themed with CSS custom properties. Set them on any appropriate parent element to affect its child alerts.
74
74
 
75
- | Variable name | Default Value | Description |
76
- | ------------- | ------------- | ----------- |
77
- | --md-sys-alert-padding | 16px | The inner padding between the alert's edge and its content |
78
- | --md-sys-alert-space | 16px | The spacing between the optional icon and the text container |
75
+ | Custom property | Meaning | Default |
76
+ |---|---|---|
77
+ | `--md-comp-alert-padding` | The inner padding between the alert's edge and its content | `16px` |
78
+ | `--md-comp-alert-space` | The spacing between the optional icon and the text container | `16px` |
79
79
 
80
80
  **Example: Changing the padding**
81
81
 
82
82
  ```HTML
83
- <div style="--md-sys-alert-padding:24px">
83
+ <div style="--md-comp-alert-padding:24px">
84
84
  <div class="micl-alert-filled" role="alert">
85
85
  ...
86
86
  </div>
@@ -19,7 +19,6 @@
19
19
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  // SOFTWARE.
21
21
 
22
- @use '../../foundations';
23
22
  @use '../../styles/shape';
24
23
  @use '../../styles/typography';
25
24
 
@@ -28,27 +27,19 @@
28
27
  @include typography.scale('title-medium');
29
28
  @include typography.scale('body-medium');
30
29
 
31
- :root {
32
- --md-sys-alert-padding: 16px;
33
- --md-sys-alert-space: 16px;
34
- }
35
-
36
- .micl-alert-filled,
37
- .micl-alert-tonal,
38
- .micl-alert-outlined {
39
- --md-sys-alert-background-color: inherit;
40
- --md-sys-alert-color: inherit;
30
+ $alerts: ':is(.micl-alert-filled, .micl-alert-tonal, .micl-alert-outlined)';
41
31
 
32
+ #{$alerts} {
42
33
  box-sizing: border-box;
43
34
  display: flex;
44
35
  inline-size: 100%;
45
- padding: var(--md-sys-alert-padding, 16px);
46
- column-gap: var(--md-sys-alert-space, 8px);
36
+ padding: var(--md-comp-alert-padding, 16px);
37
+ column-gap: var(--md-comp-alert-space, 16px);
47
38
  border: none;
48
39
  outline: none;
49
40
  border-radius: var(--md-sys-shape-corner-small, 8px);
50
- background-color: var(--md-sys-alert-background-color);
51
- color: var(--md-sys-alert-color);
41
+ background-color: var(--_background-color, transparent);
42
+ color: var(--_color, inherit);
52
43
 
53
44
  .micl-alert__icon {
54
45
  block-size: var(--md-sys-icon-size, 24px);
@@ -60,7 +51,7 @@
60
51
  flex-direction: column;
61
52
  row-gap: 8px;
62
53
 
63
- h1, h2, h3, h4, h5, h6, .micl-heading {
54
+ :is(h1, h2, h3, h4, h5, h6, .micl-heading) {
64
55
  @include typography.title-medium;
65
56
 
66
57
  margin: 0;
@@ -74,53 +65,37 @@
74
65
  }
75
66
 
76
67
  .micl-alert-filled {
77
- --md-sys-alert-background-color: var(--md-sys-color-error);
78
- --md-sys-alert-color: var(--md-sys-color-on-error);
68
+ --_background-color: var(--md-sys-color-error);
69
+ --_color: var(--md-sys-color-on-error);
79
70
 
80
- &.micl-alert--primary {
81
- --md-sys-alert-background-color: var(--md-sys-color-primary);
82
- --md-sys-alert-color: var(--md-sys-color-on-primary);
83
- }
84
- &.micl-alert--secondary {
85
- --md-sys-alert-background-color: var(--md-sys-color-secondary);
86
- --md-sys-alert-color: var(--md-sys-color-on-secondary);
87
- }
88
- &.micl-alert--tertiary {
89
- --md-sys-alert-background-color: var(--md-sys-color-tertiary);
90
- --md-sys-alert-color: var(--md-sys-color-on-tertiary);
71
+ @each $scheme in primary, secondary, tertiary {
72
+ &.micl-alert--#{$scheme} {
73
+ --_background-color: var(--md-sys-color-#{$scheme});
74
+ --_color: var(--md-sys-color-on-#{$scheme});
75
+ }
91
76
  }
92
77
  }
93
78
 
94
79
  .micl-alert-tonal {
95
- --md-sys-alert-background-color: var(--md-sys-color-error-container);
96
- --md-sys-alert-color: var(--md-sys-color-on-error-container);
80
+ --_background-color: var(--md-sys-color-error-container);
81
+ --_color: var(--md-sys-color-on-error-container);
97
82
 
98
- &.micl-alert--primary {
99
- --md-sys-alert-background-color: var(--md-sys-color-primary-container);
100
- --md-sys-alert-color: var(--md-sys-color-on-primary-container);
101
- }
102
- &.micl-alert--secondary {
103
- --md-sys-alert-background-color: var(--md-sys-color-secondary-container);
104
- --md-sys-alert-color: var(--md-sys-color-on-secondary-container);
105
- }
106
- &.micl-alert--tertiary {
107
- --md-sys-alert-background-color: var(--md-sys-color-tertiary-container);
108
- --md-sys-alert-color: var(--md-sys-color-on-tertiary-container);
83
+ @each $scheme in primary, secondary, tertiary {
84
+ &.micl-alert--#{$scheme} {
85
+ --_background-color: var(--md-sys-color-#{$scheme}-container);
86
+ --_color: var(--md-sys-color-on-#{$scheme}-container);
87
+ }
109
88
  }
110
89
  }
111
90
 
112
91
  .micl-alert-outlined {
113
- --md-sys-alert-color: var(--md-sys-color-error);
92
+ --_color: var(--md-sys-color-error);
114
93
 
115
- border: 1px solid var(--md-sys-alert-color);
94
+ border: 1px solid var(--_color);
116
95
 
117
- &.micl-alert--primary {
118
- --md-sys-alert-color: var(--md-sys-color-primary);
119
- }
120
- &.micl-alert--secondary {
121
- --md-sys-alert-color: var(--md-sys-color-secondary);
122
- }
123
- &.micl-alert--tertiary {
124
- --md-sys-alert-color: var(--md-sys-color-tertiary);
96
+ @each $scheme in primary, secondary, tertiary {
97
+ &.micl-alert--#{$scheme} {
98
+ --_color: var(--md-sys-color-#{$scheme});
99
+ }
125
100
  }
126
101
  }
@@ -19,6 +19,7 @@ To add a basic (small) app bar, use the `<header>` element with the `micl-appbar
19
19
  Import the app bar styles into your project:
20
20
 
21
21
  ```CSS
22
+ @use "material-inspired-component-library/dist/iconbutton";
22
23
  @use "material-inspired-component-library/dist/appbar";
23
24
  ```
24
25
 
@@ -60,7 +61,7 @@ Use the `micl-appbar__leading` (or: `micl-appbar__leading-icon`) class for an el
60
61
 
61
62
  ```HTML
62
63
  <header class="micl-appbar">
63
- <a href="index.html" class="micl-appbar__leading-icon micl-link micl-iconbutton-standard-m" aria-label="Home">
64
+ <a href="index.html" class="micl-appbar__leading-icon micl-iconbutton-standard-m" aria-label="Home">
64
65
  <span class="material-symbols-outlined" aria-hidden="true">home</span>
65
66
  </a>
66
67
  <div class="micl-appbar__headline">
@@ -86,14 +87,26 @@ Use the `micl-appbar__trailing` (or: `micl-appbar__trailing-icon`) class for ele
86
87
  ### Sticky app bar
87
88
  The app bar is 'glued' to the top of the page when one of the following conditions is met:
88
89
 
89
- - The [body region](../../foundations/layout/README.md) contains only one pane.
90
- - The body region contains two or more panes and the page has a compact size.
91
- - The body region contains two or more panes, has the `micl-body--stacked-to-expanded` class and the page has a compact or medium size.
92
- - The body region contains two or more panes, has the `micl-body--stacked-to-large` class and the page has a compact, medium or expanded size.
93
- - The body region contains two or more panes, has the `micl-body--stacked-to-extralarge` class and the page has a compact, medium, expanded or large size.
90
+ - The [pane area](../../foundations/layout/README.md) contains only one pane.
91
+ - The pane area contains two or more panes and the window is at the compact breakpoint.
92
+ - The pane area contains two or more panes, has the `micl-panes--stacked-to-expanded` class and the window is at the compact or medium breakpoint.
93
+ - The pane area contains two or more panes, has the `micl-panes--stacked-to-large` class and the window is at the compact, medium or expanded breakpoint.
94
+ - The pane area contains two or more panes, has the `micl-panes--stacked-to-extralarge` class and the window is at the compact, medium, expanded or large breakpoint.
94
95
  - The app bar has the `micl-appbar--sticky` class.
95
96
 
96
97
  Adding the `micl-appbar--not-sticky` class to the app bar will prohibit gluing the app bar to the top of the page.
97
98
 
99
+ ## Theming
100
+ Each app bar can be themed with CSS custom properties that follow the Material Design 3 component-token naming convention. Set them on any appropriate parent element to affect its child app bars.
101
+
102
+ | Custom property | Meaning | Default |
103
+ |---|---|---|
104
+ | `--md-comp-app-bar-container-color` | The background color of the app bar | inherited from the page |
105
+ | `--md-comp-app-bar-on-scroll-container-color` | The background color while the page is scrolled | `--md-sys-color-surface-container` |
106
+ | `--md-comp-app-bar-title-color` | The text color of the headline | `--md-sys-color-on-surface` |
107
+ | `--md-comp-app-bar-subtitle-color` | The text color of the subtitle | `--md-sys-color-on-surface-variant` |
108
+ | `--md-comp-app-bar-leading-icon-color` | The color of the leading icon | `--md-sys-color-on-surface` |
109
+ | `--md-comp-app-bar-trailing-icon-color` | The color of the trailing icons | `--md-sys-color-on-surface-variant` |
110
+
98
111
  ## Compatibility
99
112
  This component uses the `animation-timeline` CSS property for the scroll-effect, which may not be supported in your browser. Please check [Browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timeline#browser_compatibility) for details.