@jungherz-de/glasskit 1.31.0 → 1.33.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 CHANGED
@@ -7,6 +7,144 @@ GlassKit uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ---
9
9
 
10
+ ## [1.33.0] – 2026-10-28
11
+
12
+ ### Added
13
+
14
+ - **Tokens for the tab bar's icons, corners and active label.** A compact top bar drawn like `.glass-segmented` (18px icons, a 12px segment) or a rail of rounded squares had to wrap its icons in boxes of its own and change the global `--gl-radius-full` on the bar. The drop and the spotlight take that token too.
15
+ - `--gl-tab-bar-icon-size` (24px) sizes the icon's box and its SVG.
16
+ - `--gl-tab-bar-item-radius` rounds the floating items and the drop, unset a capsule as before.
17
+ - `--gl-tab-bar-active-weight` sets the active label's weight, unset the medium of every label.
18
+
19
+ Measured in Chromium 153, WebKit 26.6 and Firefox 151 with the issue's top bar: 18px icons and SVGs, a 12px drop, a 600 active label beside 500 for the others. ([#25](https://github.com/JUNGHERZ/GlassKit/issues/25))
20
+ - **A rail with its labels under the icons, a floating rail at an edge, and places before and after the items.** A desktop rail that names its items, a mark and the accessory above them, and an own pane of glass inset from the edge took a wrapper, overrides of the items' size and the global radius.
21
+ - `.glass-tab-bar--labels` with `--rail` keeps the label under the icon, as on the floating bar. The items fill the rail's width, `--gl-tab-bar-rail-width`, at least `--gl-tab-bar-rail-item-height` (62px) high, with the corners of a button. `--gl-tab-bar-item-radius` sets their corners and the drop's alike.
22
+ - `--floating` with `--vertical` and `--start` or `--end` makes a rail of its own glass at that edge. It is as high as the viewport less `--gl-tab-bar-floating-inset` (16px) at both ends, that far from its edge and clear of the safe areas, with a card's corners (`--gl-tab-bar-rail-radius`, 24px). In the flow, without an edge, a floating rail is such a pane as well, as high as its container; only the upright pill of the vertical dock stays a capsule.
23
+ - `__leading` holds a mark or the accessory above the items, and `__trailing` a foot such as the account at the far end. In a row they sit before and after the items.
24
+ - `__accessory-item` with `__accessory-label` sets the accessory's name under it.
25
+
26
+ Measured in all three engines through GlassKit Elements with the issue's design: a 96px rail 16px from the start edge and the ends, as high as a 760px viewport less 32px, with 24px corners. The items are 78 by 62px with 16px corners, and the labels stand under their icons, a long one cut with an ellipsis. The mark and the accessory with its name sit at the top, the account at the bottom, and the drop runs along y. Right to left the rail stands at the right edge. ([GlassKit Elements #32](https://github.com/JUNGHERZ/GlassKit-Elements/issues/32))
27
+ - **A place at the end of a field's label row: `.glass-input-group--label-end`**, for "Forgot password?" on the line of the label "Password". The `__label-end` element comes after the field in the markup, so the keyboard reaches it after the field, which reads best in a sign-in form; the modifier draws it on the label's line, at its end. Measured in all three engines with an input, a textarea and a select: the link on the label's line, its end at the field's end, above the field, and Tab from the field to the link. Safari reaches links with Tab only with its preference or Option+Tab, as anywhere. ([GlassKit Elements #33](https://github.com/JUNGHERZ/GlassKit-Elements/issues/33))
28
+ - **A chip to choose with: `.glass-badge--md`.** An interactive badge was 25 to 26px high, a filter chip's size, below the room a choice in a form needs. `--md` is `--gl-badge-md-height` (36px) high, in the small text of a form. Interactive, it takes taps 4px above and below its edges, 44px in all, the target every control keeps. Measured in all three engines: 36px, a tap 3.5px above or below the edge goes to the chip, 4.5px below goes past it. ([GlassKit Elements #34](https://github.com/JUNGHERZ/GlassKit-Elements/issues/34))
29
+
30
+ ### Changed
31
+
32
+ - **The tab bar's items move their colours, the press and the shadow, not their box.** Items, icons and labels transitioned `all` for 250ms. A bar that changed its layout (upright, floating, a rail) let padding, width and height glide, and an item measured 250ms later was 60 instead of 62px. They now transition `color`, `background-color`, `box-shadow`, `opacity` and `transform`. Measured in all three engines: an item switched from a row to a labeled rail has its 62px in the next frame. ([#25](https://github.com/JUNGHERZ/GlassKit/issues/25))
33
+
34
+ ### Compatibility
35
+
36
+ - Nothing changes for a project that sets none of the new tokens and classes. One exception: a tab bar item that changes its size no longer glides into it.
37
+ - No theme token changed, so the no-JS mirror of GlassKit Web has nothing to update.
38
+
39
+ Docs (English and German), README, SKILL.md and `theme-override.css` describe the tokens, the labeled and floating rail, the places before and after the items, the label row's end and the chip. With the new stylesheet the existing docs, showcase and landing pages render pixel-identical to 1.32.0: in WebKit and Firefox on whole pages, in Chromium section by section, where full-page captures differ by rasterisation.
40
+
41
+ ---
42
+
43
+ ## [1.32.0] – 2026-10-27
44
+
45
+ ### Added
46
+
47
+ - **The tab bar beyond the bottom edge: a sidebar, an icon rail, a bar docked at a side, a top bar.** `.glass-tab-bar` was a row fixed to the bottom of the viewport. A sidebar on the desktop, a rail of icons in a narrower window or a bar in the header meant a second navigation in the project's own markup, kept in step with the bar by hand. On phones whose system moves its own controls to a side, an unfolded iPhone Duo for one, the thumb rests at that edge and a bottom bar is out of reach. The items stay the same in every layout (icon, label, badge, active state, drop), and modifiers change only the bar:
48
+ - `--vertical` makes it a column for a sidebar. The page's layout places it, and it is as high as its container. Each item is a row: the icon before the label at body size, the badge at the row's end. The active row stands on a surface of its own, `--gl-tab-bar-active-bg`, unset `--gl-surface-3`.
49
+ - With `--start` or `--end` the column is fixed to that edge of the viewport instead, at full height and clear of the edge's safe area. Start and end follow the writing direction.
50
+ - `--rail` shows the icons alone, `--gl-tab-bar-rail-width` wide (72px). The label is hidden from view but stays the item's name, and the badge goes back to the icon's corner.
51
+ - `--top` puts a horizontal bar into the flow, for a sticky header: its border is at the bottom, there is no room for the home indicator, and from 640px the icon sits beside the label.
52
+ - `.glass-tab-bar-dock--vertical` stands the floating bar upright at the end edge, or the start edge with `--start`. The accessory goes below the items, or above them with `--accessory-left`.
53
+
54
+ Every bar's items now show a focus ring on keyboard focus, which they lacked, including the active item under the drop. An item may be a link, `a.glass-tab-bar__item`, so a view can open in a new tab. A long label in a sidebar row ends before the badge, `--gl-tab-bar-badge-room` (32px) from the row's end, and in the top bar the label keeps clear of the badge at the icon's corner. Without `:dir()`, the upright dock finds its edge through logical properties; only the safe area of that side needs `:dir()`. Measured in Chromium 153, WebKit 26.6 and Firefox 151 through GlassKit Elements:
55
+ - A sidebar fills its grid row, and a rail is 72px wide with 48px items.
56
+ - A rail docked at the end runs the full height at the right edge, or at the left edge right to left. The upright dock at the start sits at the left edge, or at the right edge right to left.
57
+ - The top bar keeps its border at the bottom and puts the icon beside the label at 1100px.
58
+
59
+ ([GlassKit Elements #25](https://github.com/JUNGHERZ/GlassKit-Elements/issues/25))
60
+ - **The drop's motion is tokens, and it runs along y in a column.** Durations and curves were literals in the stylesheet and in `glasskit-droplet.js`. A product that keeps its UI motion within about 240ms ease-out could not shorten the one motion that springs on for 850ms. In a column the drop jumped, because the script measured only `left` and `right` and dragged only along x. The motion now reads tokens, unset today's values, in the stylesheet and the script alike:
61
+
62
+ | Token | Moves | Unset |
63
+ |---|---|---|
64
+ | `--gl-droplet-duration`, `--gl-droplet-easing` | the leading edge | 0.3s, `cubic-bezier(.3, 1.2, .5, 1)` |
65
+ | `--gl-droplet-trail-duration`, `-trail-delay`, `-trail-easing` | the trailing edge | 0.5s, 40ms, `cubic-bezier(.5, 1.5, .45, .92)` |
66
+ | `--gl-droplet-lift` | the squash while travelling | 0.86 (1 squashes nothing) |
67
+ | `--gl-droplet-lift-duration` | how long the squash holds | 280ms |
68
+ | `--gl-droplet-settle-duration`, `-settle-easing` | the spring back | 0.55s, `cubic-bezier(.34, 1.8, .5, 1)` |
69
+ | `--gl-droplet-lens-duration`, `-lens-easing` | the item under the drop | 0.4s, `cubic-bezier(.34, 1.6, .5, 1)` |
70
+
71
+ The script follows the drop for as long as the tokens say: the trail's delay and duration, or the leading edge's if that is longer, plus 80ms, which is 620ms as before. The issue proposed waiting for the last `transitionend`. A duration of 0 ends no transition, so the tokens are the safer clock.
72
+
73
+ In a column the script reads the axis from `aria-orientation="vertical"` or the row's flex direction. It sets `data-droplet-axis="y"` and the directions `down` and `up`, and the drop runs along `top` and `bottom` on the same tokens. Its centre picks the item under the lens, a drag follows the pointer along y and scrolls at the top and bottom edges, and the row hands sideways swipes to the page (`touch-action: pan-x`). A drop in a horizontal bar at the top of a page, static or floating, worked before and is kept in the docs.
74
+
75
+ Measured with the issue's journey in all three engines, from a tap to the last frame in which a value changed:
76
+ - Unset, the drop moves as in 1.31.0. In a top bar the leading edge settles after 303 to 316ms, the trailing edge after 551 to 560ms and the spring after 842 to 847ms. A sidebar and a plain column run the same journey along y, with `bottom` at 297 to 308ms, `top` at 540 to 553ms and the spring at 841 to 851ms.
77
+ - With the issue's 240ms ease-out and one line more, `--gl-droplet-lift-duration: 0ms`, every edge stops after 242 to 254ms in the top bar, the sidebar and the column alike, and the shadow settles within 40ms. Without that line, the lift's deeper shadow still fades back until about 600ms.
78
+
79
+ ([#23](https://github.com/JUNGHERZ/GlassKit/issues/23))
80
+ - **A fill of its own for white text on the accent: `--gl-btn-primary-bg` and `--gl-color-primary-fill`.** White text on the primary button, the chosen day of `.glass-calendar` and `.glass-date-strip` and the current step's number reads 2.03 to 3.77:1 on the default orange. The same token also draws focus rings, borders and the accent as text, so it could not be darkened for the fill alone. `--gl-btn-primary-bg` replaces the whole background of `.glass-btn--primary`, with today's gradient as the fallback, as the toggle and the radio already allow. `--gl-color-primary-fill` fills the chosen days and the current step, unset `--gl-color-primary`.
81
+
82
+ With `color-mix(in srgb, var(--gl-color-primary) 75%, #000)` as the fill in the light theme and 65% in the dark one, measured in all three engines, white reads:
83
+ - 4.53:1 on the chosen days and the current step
84
+ - 4.53 to 4.99:1 (light) and 4.53 to 5.82:1 (dark) on a button gradient from these mixes
85
+
86
+ The docs show the other way as well, a dark ink: the 17% ink, and as an opt-in `contrast-color()` behind `@supports`, which resolves to black on the default orange in Chromium 153, WebKit 26.6 and Firefox 151. That gives 7.82 / 6.67 / 5.56:1 (light) and 10.36 / 7.06 / 5.85:1 (dark) on the three stops of the gradient. ([#24](https://github.com/JUNGHERZ/GlassKit/issues/24))
87
+ - **`.glass-tooltip`**: a short name or hint for a control on hover and focus, such as an icon-only button, a rail item or a row action. It is small text on the popover's glass with its edge light, tinted far enough to read over anything: 6.31:1 or more in both themes, white under a dark tooltip included, in all three engines. It is at most `--gl-tooltip-max-width` (240px) wide. `--gl-tooltip-bg` and `--gl-tooltip-color` recolour it. With the `popover` attribute it sits in the top layer and fades in and out, without fading under `prefers-reduced-motion`. GlassKit Elements' `<glk-tooltip>` places it, shows and hides it and names the control. ([GlassKit Elements #29](https://github.com/JUNGHERZ/GlassKit-Elements/issues/29))
88
+ - **`.glass-menu`**: a list of actions behind a button, on the popover's glass with the card's corners, the focused item rounded concentrically within them, and in the top layer like the tooltip.
89
+ - Items are buttons with `role="menuitem"`, or `menuitemcheckbox` and `menuitemradio`, whose `aria-checked` (or `.is-checked`) shows the check mark.
90
+ - Each item can have an icon before its label and a hint such as a shortcut at its end.
91
+ - `--danger` takes the error colour for destructive actions. `aria-disabled="true"` leaves an item announced but inert.
92
+ - `__separator` and `__group-label` divide the list.
93
+
94
+ The keyboard of the WAI-ARIA menu button is GlassKit Elements' `<glk-menu>`. ([GlassKit Elements #30](https://github.com/JUNGHERZ/GlassKit-Elements/issues/30))
95
+ - **`.glass-tree`**: levels that open and close, such as the structure of an app or menus with submenus. Each item is a row: a twisty that turns when the item opens (mirrored right to left), an icon, the label, and something at the end. Rows are indented by `--gl-tree-indent` (20px) per level, read from `--gl-tree-level`, at least `--gl-tree-row-height` (36px) high, with the children in a `__group` below. The states are:
96
+ - `.is-selected`, on raised glass like the active row of a sidebar, and `.is-expanded`
97
+ - `.is-leaf`, which has no twisty
98
+ - `.is-loading`, whose twisty becomes a small spinner while children load
99
+ - `.is-error`, whose twisty becomes a "!" in the error colour when they could not load
100
+ - `.is-disabled`
101
+
102
+ In plain markup the focused `[role="treeitem"]` shows its focus on its row instead of the browser's outline around it and its children. GlassKit Elements' `<glk-tree>` brings the roles and the keyboard of the WAI-ARIA tree view. ([GlassKit Elements #26](https://github.com/JUNGHERZ/GlassKit-Elements/issues/26))
103
+ - **`.glass-breadcrumbs`**: the path through nested levels, as a `<nav>` around an `<ol>`.
104
+ - Crumbs are links or buttons. The current level is plain text with `aria-current="page"`.
105
+ - The separators are drawn by CSS, so assistive technology does not read them, and they mirror right to left.
106
+ - A crumb longer than `--gl-breadcrumbs-crumb-width` (200px) ends in an ellipsis.
107
+ - `__overflow` stands for the middle levels where the path does not fit. Its item, `__item--overflow`, keeps its width where the path still does not fit.
108
+ - `.is-drop-target` and `.is-drop-refused` show a crumb under a dragged item.
109
+
110
+ ([GlassKit Elements #27](https://github.com/JUNGHERZ/GlassKit-Elements/issues/27))
111
+ - **The states of a drag that reorders a list or a tree.**
112
+ - The dragged item stays in place, faded (`.is-sort-source`), while a raised copy, `.glass-sort__ghost`, follows the pointer in the top layer.
113
+ - A line shows where the item lands before or after another (`.is-sort-before`, `.is-sort-after`), indented to the level it lands on.
114
+ - An item that takes it inside lights up (`.is-sort-inside`), and one that refuses it shows the error colour (`.is-sort-refused`).
115
+ - `.glass-sort__handle` holds a drag handle that starts a drag at once, even by touch.
116
+
117
+ `--gl-sort-duration` (180ms) and `--gl-sort-easing` (ease-out) time the glide of GlassKit Elements' sortable lists and trees. ([GlassKit Elements #28](https://github.com/JUNGHERZ/GlassKit-Elements/issues/28))
118
+ - **`.is-flash` on a tree row or a list item**: a 1.2s flash for an item that changed elsewhere, on another device or by an undo, so the eye finds it among the others. `--gl-flash-color` tints it, unset 30% of the primary, and there is no flash under `prefers-reduced-motion`. GlassKit Elements' `highlight()` sets it. ([GlassKit Elements #26](https://github.com/JUNGHERZ/GlassKit-Elements/issues/26))
119
+ - **More for `.glass-table`: sorting, a sticky header, row actions, an empty state, cards on narrow screens.**
120
+ - A header cell can hold a `__sort` button, whose arrow follows `aria-sort` on the `th`.
121
+ - A sticky header with sideways scrolling did not combine before: a wrap with `overflow-x: auto` scrolls on both axes, so a sticky header stuck to the wrap, which never scrolled vertically. `.glass-table-wrap--sticky` now makes the wrap the scroller in both directions, at most `--gl-table-max-height` (60vh) high, and `--sticky` keeps the header cells at its top on `--gl-table-header-bg`, with the line below them as an inset shadow, which a collapsed border would leave behind. Of the two ways the issue offered, this is the first; the second would keep the header in step with the body's `scrollLeft` while the page scrolls.
122
+ - `__actions` cells stay at the row's end while the table scrolls sideways, on a surface of their own once it does (`--scrolls`).
123
+ - `.glass-table-frame` shades an edge where more columns wait, and `__empty` holds an empty state.
124
+ - `--list` makes each row a card, with the column's name before each value. The names come from `data-label` and are shown as generated content without alternative text, so a screen reader, which still has the hidden header, does not hear a column twice.
125
+ - `--gl-table-cell-padding` and `--gl-table-header-padding` set the room in the cells.
126
+
127
+ GlassKit Elements' `<glk-table>` brings it all to a native table. ([GlassKit Elements #31](https://github.com/JUNGHERZ/GlassKit-Elements/issues/31))
128
+ - **`.glass-popover` in the top layer.** With the `popover` attribute, the panel is shown with `showPopover()` and placed by script at fixed coordinates. A box with `overflow: hidden` around it no longer cuts it off, and closed it takes no room, where before it still widened the page by its box. The fade keeps it in the top layer until it ends, and a popover without the attribute works as before. GlassKit Elements' `<glk-popover>` does this, flipped and shifted at the viewport's edges. ([GlassKit Elements #29](https://github.com/JUNGHERZ/GlassKit-Elements/issues/29))
129
+
130
+ ### Changed
131
+
132
+ - **The radio's dot follows the ink on the primary.** `.glass-radio__dot` was white unless `--gl-radio-dot-color` was set. With a dark ink in `--gl-color-on-primary`, the checkbox tick turned dark and the radio dot stayed white on the same orange. It now falls back to `--gl-color-on-primary`, and white only after that. ([#24](https://github.com/JUNGHERZ/GlassKit/issues/24))
133
+ - **The weekday on the chosen day of `.glass-date-strip` is as strong as the number.** At `opacity: .75` it stayed at 3.28:1 even on the fill above, where the number reaches 4.53:1, and now it reaches 4.53:1 as well. On the default orange it reads a little brighter. ([#24](https://github.com/JUNGHERZ/GlassKit/issues/24))
134
+ - **An interactive list row shows a ring on keyboard focus**, inside the row, since the list clips what lies outside it. The tint alone was too faint to find the focus. ([GlassKit Elements #28](https://github.com/JUNGHERZ/GlassKit-Elements/issues/28))
135
+
136
+ ### Compatibility
137
+
138
+ - Nothing changes for a project that sets none of the new tokens or classes, apart from three things:
139
+ - Keyboard focus is visible on tab bar items and on interactive list rows.
140
+ - The weekday on a chosen date strip day is fully opaque.
141
+ - The radio dot is dark where a project has set a dark `--gl-color-on-primary`, which is the point. `--gl-radio-dot-color: #fff` keeps it white.
142
+ - Products that copy GlassKit's tokens, such as the no-JS mirror of GlassKit Web, have nothing to update: no existing token changed its value.
143
+
144
+ Docs (English and German), README, SKILL.md and `theme-override.css` describe the new components, the tab bar's layouts, the drop's tokens and axis, the fill tokens and the dark ink. The showcases show the menu, the tooltip, the breadcrumbs, the tree and a sidebar. With the new stylesheet and script, the existing docs, showcase and landing pages render pixel-identical to 1.31.0, apart from the weekday on the chosen date strip day: in WebKit and Firefox on whole pages, in Chromium section by section, where full-page captures differ by rasterisation.
145
+
146
+ ---
147
+
10
148
  ## [1.31.0] – 2026-10-25
11
149
 
12
150
  ### Added
@@ -1219,6 +1357,8 @@ during development. Version 1.3 is the first public open-source release.
1219
1357
 
1220
1358
  ---
1221
1359
 
1360
+ [1.33.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.33.0
1361
+ [1.32.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.32.0
1222
1362
  [1.31.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.31.0
1223
1363
  [1.30.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.30.0
1224
1364
  [1.29.1]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.29.1
@@ -1263,4 +1403,4 @@ during development. Version 1.3 is the first public open-source release.
1263
1403
  [1.3.2]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.2
1264
1404
  [1.3.1]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.1
1265
1405
  [1.3.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.0
1266
- [Unreleased]: https://github.com/JUNGHERZ/GlassKit/compare/v1.31.0...HEAD
1406
+ [Unreleased]: https://github.com/JUNGHERZ/GlassKit/compare/v1.33.0...HEAD
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  <p align="center">
2
- <img src="https://img.shields.io/badge/version-1.31.0-orange?style=flat-square" alt="Version">
2
+ <img src="https://img.shields.io/badge/version-1.33.0-orange?style=flat-square" alt="Version">
3
3
  <img src="https://img.shields.io/badge/CSS-only-blue?style=flat-square" alt="CSS only">
4
- <img src="https://img.shields.io/badge/components-34-green?style=flat-square" alt="Components">
4
+ <img src="https://img.shields.io/badge/components-38-green?style=flat-square" alt="Components">
5
5
  <img src="https://img.shields.io/badge/license-MIT-lightgrey?style=flat-square" alt="License">
6
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-v1.31.0-f5a623?style=flat-square" alt="Changelog"></a>
6
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-v1.33.0-f5a623?style=flat-square" alt="Changelog"></a>
7
7
  <a href="https://www.npmjs.com/package/@jungherz-de/glasskit"><img src="https://img.shields.io/npm/v/@jungherz-de/glasskit?style=flat-square&color=cb3837&label=npm" alt="npm"></a>
8
8
  <a href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit/"><img src="https://img.shields.io/badge/CDN-jsDelivr-blue?style=flat-square" alt="jsDelivr"></a>
9
9
  </p>
@@ -16,7 +16,7 @@
16
16
 
17
17
  <p align="center">
18
18
  <strong>A modern glassmorphism CSS component library.</strong><br>
19
- 34 Components · Dark & Light Mode · No Dependencies · Design Tokens
19
+ 38 Components · Dark & Light Mode · No Dependencies · Design Tokens
20
20
  </p>
21
21
 
22
22
  <p align="center">
@@ -57,7 +57,8 @@ GlassKit is the **CSS foundation** of a three-layer family: [GlassKit Elements](
57
57
  - 🔌 **Framework-agnostic** – works with React, Vue, Svelte, plain HTML, or any other stack
58
58
  - 🧩 **Shadow DOM ready** – Constructable Stylesheet for Web Components included
59
59
  - 💧 **Fluid selection** – an optional drop of glass that glides between the items of a tab bar or a segmented control (since 1.27.0)
60
- - 🪶 **Lightweight** – 51 KB raw / 39 KB minified / 6.5 KB gzipped, no external dependencies
60
+ - 🧭 **Navigation at every edge** – one tab bar as bottom bar, top bar, sidebar or icon rail, or docked at a side where the thumb rests on a phone held open (since 1.32.0)
61
+ - 🪶 **Lightweight** – 186 KB raw / 115 KB minified / 16.7 KB gzipped, no external dependencies
61
62
  - 🎯 **BEM-like naming convention** – `glass-*` prefix, no conflicts with existing CSS
62
63
  - 🤖 **AI-ready** – ships with [`SKILL.md`](SKILL.md), a structured reference for LLMs & AI copilots
63
64
 
@@ -73,22 +74,22 @@ No download, no build tool – just include and go:
73
74
 
74
75
  ```html
75
76
  <!-- jsDelivr – Minified -->
76
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.31/glasskit.min.css">
77
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.33/glasskit.min.css">
77
78
 
78
79
  <!-- jsDelivr – Unminified (for reading/debugging) -->
79
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.31/glasskit.css">
80
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.33/glasskit.css">
80
81
 
81
82
  <!-- unpkg – Alternative -->
82
- <link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.31/glasskit.min.css">
83
+ <link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.33/glasskit.min.css">
83
84
  ```
84
85
 
85
- > **Tip:** Replace `@1.31` with `@latest` for the newest version – or pin to a specific version for maximum stability.
86
+ > **Tip:** Replace `@1.33` with `@latest` for the newest version – or pin to a specific version for maximum stability.
86
87
 
87
88
  The [droplet](#-droplet-a-fluid-selection) takes one optional module next to the stylesheet:
88
89
 
89
90
  ```html
90
91
  <script type="module">
91
- import { attachDroplets } from 'https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.31/glasskit-droplet.js';
92
+ import { attachDroplets } from 'https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.33/glasskit-droplet.js';
92
93
  attachDroplets();
93
94
  </script>
94
95
  ```
@@ -181,8 +182,9 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
181
182
  | **Background** | `.glass-bg` | Aurora gradient with light effects |
182
183
  | **Nav Bar** | `.glass-nav` | Transparent navigation |
183
184
  | **Pill Button** | `.glass-pill` | Round glass icon button (46×46) |
184
- | **Tab Bar** | `.glass-tab-bar` | Fixed bottom navigation; any icon — SVG, icon font, image — follows its states |
185
- | **Tab Bar – Floating** | `.glass-tab-bar--floating` + `.glass-tab-bar-dock` | Pill-shaped Liquid-Glass tab bar with optional `.glass-tab-bar__accessory` capsule; `--droplet` for a gliding selection |
185
+ | **Tab Bar** | `.glass-tab-bar` | Fixed bottom navigation; any icon — SVG, icon font, image — follows its states. The same bar as a sidebar (`--vertical`), fixed to a side edge (`--start` / `--end`), an icon rail (`--rail`, with `--labels` the label under the icon) or a top bar (`--top`); places before and after the items (`__leading`, `__trailing`) |
186
+ | **Tab Bar – Floating** | `.glass-tab-bar--floating` + `.glass-tab-bar-dock` | Pill-shaped Liquid-Glass tab bar with optional `.glass-tab-bar__accessory` capsule, upright at a side with `.glass-tab-bar-dock--vertical`, a rail of its own glass with `--vertical --rail` (fixed at a side with `--start` / `--end`); `--droplet` for a gliding selection |
187
+ | **Breadcrumbs** | `.glass-breadcrumbs` | The path through nested levels: CSS separators, a "…" for folded levels, crumbs as drop targets |
186
188
  | **Accordion** | `.glass-accordion` | Collapsible content sections |
187
189
  | **Divider** | `.glass-divider` | Fading separator line |
188
190
 
@@ -193,12 +195,14 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
193
195
  | **Title** | `.glass-title` | Page title with text shadow |
194
196
  | **Card** | `.glass-card` | Glass container for content |
195
197
  | **Card (Glow)** | `.glass-card--glow` | Card with light-to-milky gradient |
196
- | **Badge** | `.glass-badge` | Tags, labels & filter chips |
198
+ | **Badge** | `.glass-badge` | Tags, labels & filter chips; `--md` for 36px choice chips with a 44px tap target |
197
199
  | **Avatar** | `.glass-avatar` | Glass circle (sm/md/lg) |
198
200
  | **Status** | `.glass-status` | Notice card with icon |
199
201
  | **List** | `.glass-list` | iOS-style grouped settings list with auto dividers |
202
+ | **Tree** | `.glass-tree` | Levels that open and close: twisty, icon, label and a trailing slot per row; children loading or failed to load; a flash for a changed item |
203
+ | **Sorting** | `.is-sort-*` + `.glass-sort__ghost` | The states of a drag that reorders a list or a tree: source, drop line, inside, refused, a grip |
200
204
  | **Skeleton** | `.glass-skeleton` | Shimmer lines while content loads |
201
- | **Table** | `.glass-table` | Plain `<table>` on glass — hairline rows, tabular numbers |
205
+ | **Table** | `.glass-table` | Plain `<table>` on glass — hairline rows, tabular numbers; sort buttons, a sticky header, a row action column, an empty row, cards for narrow places |
202
206
  | **Prose** | `.glass-prose` | Rendered Markdown / running text with one class |
203
207
  | **Segmented** | `.glass-segmented` | Small exclusive choice as one control, with tone dots, icons or counts, icons alone with `--icons`; scrolls or wraps when crowded; `--droplet` for a gliding selection |
204
208
  | **Steps** | `.glass-steps` | Progress through a short flow; container-query aware |
@@ -214,13 +218,15 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
214
218
  | **Button (Tertiary)** | `.glass-btn--tertiary` | Subtle glass – tertiary action |
215
219
  | **Modal** | `.glass-modal` | Centered dialog with blur overlay |
216
220
  | **Toast** | `.glass-toast` | Temporary notification, optionally with one action and a close button |
217
- | **Popover** | `.glass-popover` | Anchored dropdown / menu with fade & scale animation |
221
+ | **Popover** | `.glass-popover` | Anchored dropdown / menu with fade & scale animation; in the top layer with the `popover` attribute |
222
+ | **Tooltip** | `.glass-tooltip` | A short name or hint for a control, on hover and focus, in the top layer |
223
+ | **Menu** | `.glass-menu` | Actions behind a button: icons, shortcuts, check marks, separators, a destructive item |
218
224
 
219
225
  ### Form Elements
220
226
 
221
227
  | Component | Class | Description |
222
228
  |---|---|---|
223
- | **Input** | `.glass-input` | Text field with glass background |
229
+ | **Input** | `.glass-input` | Text field with glass background; a link at the end of the label row with `.glass-input-group--label-end` |
224
230
  | **Textarea** | `.glass-textarea` | Multi-line input |
225
231
  | **Select** | `.glass-select` | Dropdown with custom chevron |
226
232
  | **Search** | `.glass-search` | Input with search icon |
@@ -257,6 +263,61 @@ The tab bar's active item can also stand on a capsule of its own, without the dr
257
263
 
258
264
  **Icons of any kind (since 1.28.0).** Tab bar, accessory and segmented control colour their icon box, and an SVG strokes in `currentColor`: an icon font such as Material Icons, an `<img>` mask or a custom element in `.glass-tab-bar__icon` or `.glass-segmented__icon` follows every state, the lens of the drop and the drag. `.glass-segmented--icons` makes a row of icons alone, a light / dark / auto switch for instance.
259
265
 
266
+ **Timing and direction (since 1.32.0).** The drop's motion is tokens, unset today's values and read by the stylesheet and the module alike: `--gl-droplet-duration` and `-easing` for the leading edge, `-trail-duration`, `-trail-delay` and `-trail-easing` for the trailing one, `-lift` (`0.86`; `1` runs it without squashing) and `-lift-duration`, `-settle-duration` and `-settle-easing` for the spring back, `-lens-duration` and `-lens-easing` for the item below the drop. A product whose UI motion stays within about 240ms ease-out:
267
+
268
+ ```css
269
+ :root {
270
+ --gl-droplet-duration: 240ms; --gl-droplet-easing: ease-out;
271
+ --gl-droplet-trail-duration: 240ms; --gl-droplet-trail-delay: 0ms; --gl-droplet-trail-easing: ease-out;
272
+ --gl-droplet-lift: 1; --gl-droplet-lift-duration: 0ms; --gl-droplet-settle-duration: 0ms;
273
+ --gl-droplet-lens-duration: 240ms; --gl-droplet-lens-easing: ease-out;
274
+ }
275
+ ```
276
+
277
+ Every edge then stops after about 250ms. Keep `--gl-droplet-lift-duration: 0ms` in it: without it the lift's deeper shadow still fades back until about 600ms.
278
+
279
+ In a column — a sidebar, see below — the drop runs along y: the module takes the axis from the row's `flex-direction` or `aria-orientation="vertical"`, and a finger drags it up and down.
280
+
281
+ ---
282
+
283
+ ## 🧭 One navigation, every edge
284
+
285
+ Since **1.32.0** the tab bar is not bound to the bottom edge. The items stay the same — icon, label, badge, the active item, the drop — and modifiers on the bar choose the layout, so a page switches between them without rendering the items again:
286
+
287
+ ```html
288
+ <nav class="glass-tab-bar glass-tab-bar--vertical" aria-label="Main">…</nav> <!-- sidebar in a grid column -->
289
+ <nav class="glass-tab-bar glass-tab-bar--vertical glass-tab-bar--end" aria-label="Main">…</nav> <!-- fixed to the end edge -->
290
+ <nav class="glass-tab-bar glass-tab-bar--vertical glass-tab-bar--rail" aria-label="Main">…</nav> <!-- icons alone -->
291
+ <nav class="glass-tab-bar glass-tab-bar--top" aria-label="Main">…</nav> <!-- top of a page -->
292
+
293
+ <div class="glass-tab-bar-dock glass-tab-bar-dock--vertical glass-tab-bar-dock--start"> <!-- floating, upright -->
294
+ <nav class="glass-tab-bar glass-tab-bar--floating glass-tab-bar--vertical glass-tab-bar--droplet">…</nav>
295
+ <button class="glass-tab-bar__accessory glass-tab-bar__accessory--accent" aria-label="Compose">…</button>
296
+ </div>
297
+ ```
298
+
299
+ `--vertical` is a column as high as its container, the icon before the label, the badge at the row's end — a long label ends `--gl-tab-bar-badge-room` (32px) before it. `--start` and `--end` fix it to that edge of the viewport, clear of the edge's safe area — where the thumb rests when a phone is held open, or a foldable has moved its own controls to a side; start and end follow the writing direction. `--rail` shows the icons alone, `--gl-tab-bar-rail-width` (72px) wide, the labels hidden from view but still the items' names. `--top` lays the bar out for a sticky header, with the icon beside the label from 640px, clear of the badge. Every bar shows a focus ring for the keyboard now, the active item under the drop too, and an item may be a link. In GlassKit Elements: `<glk-tab-bar orientation="vertical" dock="end" rail>`, `placement="top"`.
300
+
301
+ Since **1.33.0** a rail can name its items and stand as a pane of its own glass. `--labels` next to `--rail` keeps the label under the icon; with `--floating` the rail is a pane of its own glass, as high as its container with the corners of a card, and with `--start` or `--end` as well it stands at that edge, full height less `--gl-tab-bar-floating-inset` (16px) at both ends and that far from the edge, clear of the safe areas. `__leading` and `__trailing` hold a mark, the accessory (`__accessory-item`, its name under it) and a foot such as the account inside the bar:
302
+
303
+ ```html
304
+ <nav class="glass-tab-bar glass-tab-bar--floating glass-tab-bar--vertical glass-tab-bar--start
305
+ glass-tab-bar--rail glass-tab-bar--labels glass-tab-bar--droplet"
306
+ aria-label="Main" style="--gl-tab-bar-rail-width: 96px">
307
+ <div class="glass-tab-bar__leading">
308
+ <img src="mark.svg" alt="" width="40" height="40">
309
+ <div class="glass-tab-bar__accessory-item">
310
+ <button class="glass-tab-bar__accessory glass-tab-bar__accessory--accent" aria-label="Assistant">…</button>
311
+ <span class="glass-tab-bar__accessory-label" aria-hidden="true">Assistant</span>
312
+ </div>
313
+ </div>
314
+ <a class="glass-tab-bar__item is-active" href="/">…</a>
315
+ <div class="glass-tab-bar__trailing">…</div>
316
+ </nav>
317
+ ```
318
+
319
+ Three tokens shape the items without touching global ones: `--gl-tab-bar-icon-size` (24px), `--gl-tab-bar-item-radius` (the drop and the floating items, a capsule unless set; 16px in a rail with labels) and `--gl-tab-bar-active-weight` — a compact top bar like a segmented control takes 18px, 12px and semibold. The items transition only colour, surface, shadow, opacity and the press, so a bar that changes its layout takes its new size at once.
320
+
260
321
  ---
261
322
 
262
323
  ## 🌗 Theming
@@ -324,6 +385,18 @@ a later declaration if you want to bend one.
324
385
 
325
386
  **Contrast (since 1.31.0).** Muted text, card text and icons reach WCAG AA by default in both themes — text 4.5:1, icons with a meaning 3:1, on the page and on glass. The primary as text keeps the primary: GlassKit's light orange reads 2.43:1 as text, but a fixed mix would darken every brand alike, so a light theme that keeps the orange sets `[data-theme="light"] { --gl-color-primary-text: var(--gl-color-primary-on-surface); }` (5.8:1). White on the primary button stays part of the look; `--gl-color-on-primary: color-mix(in srgb, var(--gl-color-primary) 17%, #000)` switches it to a dark ink with 4.6:1 or more.
326
387
 
388
+ **Accent fills with white text (since 1.32.0).** To keep white on the primary button, the chosen day and the current step, darken the fills alone — not `--gl-color-primary`, which also draws focus rings, borders and the accent as text. `--gl-btn-primary-bg` replaces the button's background, `--gl-color-primary-fill` colours the flat fills; both are unset. On GlassKit's orange white reaches 4.5:1 from 75 % of the primary mixed with black in the light theme and from 65 % in the dark one:
389
+
390
+ ```css
391
+ :root, [data-theme="dark"] { --gl-color-primary-fill: color-mix(in srgb, var(--gl-color-primary) 65%, #000); }
392
+ [data-theme="light"] { --gl-color-primary-fill: color-mix(in srgb, var(--gl-color-primary) 75%, #000); }
393
+ :root, [data-theme="dark"], [data-theme="light"] {
394
+ --gl-btn-primary-bg: linear-gradient(135deg, var(--gl-color-primary-fill), color-mix(in srgb, var(--gl-color-primary-dark) 80%, #000));
395
+ }
396
+ ```
397
+
398
+ White reads 4.53:1 on the fill and at least that along the gradient, and on the chosen day of the date strip the weekday is now as strong as the number. The radio's dot follows `--gl-color-on-primary` now, like the checkbox tick, so the dark ink reaches it as well. Where the brand colour is set at run time, `contrast-color(var(--gl-color-primary))` behind `@supports (color: contrast-color(red))` picks black or white by itself — black on GlassKit's orange, 5.5:1 or more on every stop of the button.
399
+
327
400
  The `theme-override.css` template comes with **4 example themes**:
328
401
  - 🔵 Ocean Blue
329
402
  - 🟢 Emerald Green
@@ -424,6 +497,7 @@ All visual values are controlled via CSS Custom Properties:
424
497
  /* Colors */
425
498
  --gl-color-primary /* Primary color */
426
499
  --gl-color-primary-text /* text and line icons in the primary; defaults to it */
500
+ --gl-color-primary-fill /* flat accent fills that carry text: chosen day, current step; defaults to the primary */
427
501
  --gl-color-text /* Text color */
428
502
  --gl-color-text-muted /* Secondary text */
429
503
 
@@ -461,6 +535,7 @@ All visual values are controlled via CSS Custom Properties:
461
535
 
462
536
  /* Component hooks */
463
537
  --gl-modal-max-width /* 340px */
538
+ --gl-btn-primary-bg /* the primary button's whole background; unset: the gradient of the primary */
464
539
  --gl-btn-radius /* buttons alone; unset: --gl-radius-btn, shared with lists, toasts, the segmented control */
465
540
  --gl-btn-radius-sm /* --sm; unset: --gl-btn-radius, then --gl-radius-sm */
466
541
  --gl-btn-padding-x /* room beside the label; unset: 24px */
@@ -476,7 +551,7 @@ All visual values are controlled via CSS Custom Properties:
476
551
  --gl-toggle-track-bg /* toggle track when off; unset: --gl-surface-2 (…-checked: the primary gradient) */
477
552
  --gl-radio-bg, --gl-radio-bg-checked, --gl-radio-border, --gl-radio-border-checked
478
553
  --gl-radio-dot-size /* 10px */
479
- --gl-radio-dot-color /* white */
554
+ --gl-radio-dot-color /* unset: --gl-color-on-primary (white), so it follows a dark ink */
480
555
  --gl-textarea-field-sizing /* fixed; content lets text areas grow with their text */
481
556
  --gl-input-picker-icon /* none hides Chromium's picker button of date and time fields */
482
557
  --gl-tab-bar-active-color /* icon and label of the active tab; unset: --gl-color-primary-text */
@@ -488,6 +563,30 @@ All visual values are controlled via CSS Custom Properties:
488
563
  --gl-tab-bar-hover-color /* … of a hovered tab; unset: --gl-icon-default */
489
564
  --gl-tab-bar-label-size /* 10px */
490
565
  --gl-tab-bar-z-index /* 900; fixed bar and floating dock */
566
+ --gl-tab-bar-rail-width /* 72px; the icon rail */
567
+ --gl-tab-bar-badge-room /* 32px; where a sidebar row's label ends before its badge */
568
+ --gl-tab-bar-icon-size /* 24px; the icon box and its SVG */
569
+ --gl-tab-bar-item-radius /* the floating items and the drop; unset a capsule, 16px in a rail with labels */
570
+ --gl-tab-bar-active-weight /* the active label's weight; unset medium */
571
+ --gl-tab-bar-rail-item-height /* 62px; least height of an item in a rail with labels */
572
+ --gl-tab-bar-floating-inset /* 16px; a floating rail's distance from its edge and the ends */
573
+ --gl-tab-bar-rail-radius /* a floating rail's corners; unset --gl-radius-card */
574
+ --gl-badge-md-height /* 36px; a choice chip (.glass-badge--md) */
575
+ --gl-flash-color /* the flash of a changed list item or tree row; unset: the primary at 30 % */
576
+ --gl-droplet-duration, -easing, -trail-duration, -trail-delay, -trail-easing /* the drop's journey */
577
+ --gl-droplet-lift, -lift-duration, -settle-duration, -settle-easing /* its squash and spring back */
578
+ --gl-droplet-lens-duration, -lens-easing /* the item below it growing */
579
+ --gl-tooltip-max-width /* 240px */
580
+ --gl-tooltip-bg, --gl-tooltip-color /* unset: the theme's dark background, the text colour */
581
+ --gl-tooltip-offset /* 8px; the distance GlassKit Elements keeps from the control */
582
+ --gl-tree-indent /* 20px per level */
583
+ --gl-tree-row-height /* 36px */
584
+ --gl-breadcrumbs-crumb-width /* 200px; a longer crumb ends in an ellipsis */
585
+ --gl-sort-duration, --gl-sort-easing /* 180ms, ease-out: rows making room while a list is sorted */
586
+ --gl-table-cell-padding /* 9px 10px */
587
+ --gl-table-header-padding /* 8px 10px */
588
+ --gl-table-max-height /* 60vh; the wrap with a sticky header */
589
+ --gl-table-header-bg /* the sticky header's surface */
491
590
  --gl-segmented-active-bg /* chosen option and its drop; unset: --gl-surface-5 */
492
591
  --gl-segmented-active-shadow /* their shadow; unset: --gl-shadow-btn */
493
592
  --gl-segmented-active-color /* label and icon of the chosen option; unset: --gl-color-text-heading */
@@ -651,7 +750,7 @@ glasskit/
651
750
 
652
751
  The full documentation with **live previews**, **copy-paste code blocks**, and **class reference tables** is available in `docs.html`:
653
752
 
654
- - Sidebar navigation to all 34 components
753
+ - Sidebar navigation to all 38 components
655
754
  - Live previews on a real glassmorphism background
656
755
  - Design token reference
657
756
  - Theming guide
@@ -693,10 +792,10 @@ GlassKit ships with an **AI-optimized component reference** in [`SKILL.md`](SKIL
693
792
 
694
793
  ### What it provides
695
794
 
696
- - **Copy-paste-ready HTML** for all 34 components with exact nesting rules
795
+ - **Copy-paste-ready HTML** for all 38 components with exact nesting rules
697
796
  - **Complete design token tables** (colors, surfaces, blur, radii, spacing, shadows, typography)
698
797
  - **State class reference** – which class goes where (`is-active`, `is-open`, `is-visible`, `:checked`)
699
- - **6 composition patterns** – full page layouts (Login, Dashboard, Form, Modal, Settings, Progress)
798
+ - **8 composition patterns** – full page layouts (Login, Dashboard, Form, Modal, Settings, iOS Settings, Progress, Back office)
700
799
  - **Common mistakes & corrections** – prevents the most frequent AI-generated errors
701
800
  - **Quick reference table** – all components with their modifiers at a glance
702
801
 
@@ -723,7 +822,8 @@ A few refinements arrive later and fall back quietly where they are missing:
723
822
 
724
823
  - The first-line alignment of toggle, checkbox and radio uses the `lh` unit (Firefox 120); without it the control sits at the top of its label.
725
824
  - List rows without a leading icon move their divider in with `:has()` (Firefox 121); without it the divider keeps the icon inset.
726
- - Right to left, the pairs that must move together — select chevron and padding, toggle thumb and travel, progress gradient — sit under `:dir(rtl)` (Chrome 120); without it they stay left to right.
825
+ - Right to left, the pairs that must move together — select chevron and padding, toggle thumb and travel, progress gradient — sit under `:dir(rtl)` (Chrome 120); without it they stay left to right. A side bar and the upright dock (since 1.32.0) find their edge by the writing direction everywhere; only the padding for the safe area of the physical side waits for `:dir()`.
826
+ - The top-layer variants of popover, tooltip and menu (`[popover]`, since 1.32.0) need the Popover API (Chrome 114, Safari 17, Firefox 125); the anchored `.glass-popover` with `.is-open` works everywhere. `contrast-color()` for the ink is an opt-in behind `@supports`.
727
827
 
728
828
  > **Note:** In browsers without `backdrop-filter` support, elements will be rendered with the defined background colors – the UI remains usable, just without the blur effect.
729
829
 
@@ -739,16 +839,18 @@ Page Attributes (on <html>):
739
839
  Interactive States:
740
840
  .is-active → Tab Bar item, Modal Overlay
741
841
  .is-open → Accordion item, Popover
842
+ :popover-open → Popover, Tooltip, Menu with [popover] (top layer)
742
843
  .is-visible → Toast
743
844
  :checked → Toggle, Checkbox, Radio
744
845
  :focus → Input, Textarea, Select, Range
745
846
  :disabled → Input, Select, Textarea, Range, Toggle, Checkbox, Radio,
746
847
  Button, Pill, Tab Bar Accessory, Modal action, list row
747
- [aria-disabled] → a.glass-btn and the other buttons (link still navigates)
848
+ [aria-disabled] → a.glass-btn and the other buttons (link still navigates), menu items
748
849
 
749
850
  Button Modifiers:
750
851
  .glass-btn--primary / --secondary / --tertiary
751
852
  .glass-btn--sm / --lg / --auto
853
+ --gl-btn-primary-bg (the primary's whole background, for white text with AA)
752
854
 
753
855
  Card Modifiers:
754
856
  .glass-card--glow
@@ -760,6 +862,7 @@ Progress Modifiers:
760
862
  Badge Modifiers:
761
863
  .glass-badge--primary / --success / --warning / --error
762
864
  .glass-badge--interactive / --selected (chips)
865
+ .glass-badge--md (choice chip, 36px; --gl-badge-md-height)
763
866
 
764
867
  Avatar Modifiers:
765
868
  .glass-avatar--sm / --lg
@@ -780,20 +883,43 @@ Select:
780
883
  Input affixes:
781
884
  .glass-input-wrap > __prefix / __suffix · --prefix / --suffix
782
885
  --gl-input-prefix-size / --gl-input-suffix-size (room in the field, 18px unless set)
886
+ .glass-input-group--label-end > __label-end (a link at the end of the label row, written after the field)
783
887
 
784
888
  List Modifiers:
785
889
  .glass-list--flush / --bare
786
890
  .glass-list__item--interactive / --center
891
+ .glass-list__item.is-flash (a changed item flashes; --gl-flash-color)
787
892
  --gl-list-title-white-space / --gl-list-subtitle-white-space / --gl-list-subtitle-lines (wrapping, app-wide)
788
893
 
789
894
  Popover Modifiers:
790
895
  .glass-popover--top / --start / --end
896
+ .glass-popover[popover] (top layer, placed by script; [data-side="top"] above its control)
897
+
898
+ Tooltip:
899
+ .glass-tooltip[popover] (role="tooltip", top layer)
900
+ --gl-tooltip-max-width / --gl-tooltip-bg / --gl-tooltip-color
901
+
902
+ Menu:
903
+ .glass-menu[popover] · __item / __item--danger / [aria-checked] / [aria-disabled] · __check / __icon / __label / __trailing · __separator · __group-label
904
+
905
+ Tree:
906
+ .glass-tree · __row.is-expanded / .is-selected / .is-leaf / .is-loading / .is-error / .is-disabled / .is-flash · __twisty / __icon / __label / __trailing · __group
907
+ --gl-tree-level (per row) / --gl-tree-indent / --gl-tree-row-height
908
+
909
+ Breadcrumbs:
910
+ .glass-breadcrumbs · __list / __item / __item--overflow · __crumb / __current / __overflow · .is-drop-target / .is-drop-refused
911
+
912
+ Sorting:
913
+ .is-sort-source / -before / -after / -inside / -refused · .glass-sort__ghost · .glass-sort__handle
914
+ --gl-sort-duration / --gl-sort-easing
791
915
 
792
916
  Skeleton:
793
917
  .glass-skeleton__line / __line--title
794
918
 
795
919
  Table:
796
920
  .glass-table-wrap · .glass-table__num / __muted
921
+ .glass-table__sort / __sort-icon · th[aria-sort] · .glass-table__actions · .glass-table__empty
922
+ .glass-table-wrap--sticky + .glass-table--sticky · .glass-table--scrolls · .glass-table--list · .glass-table-frame[data-more-start / data-more-end]
797
923
 
798
924
  Prose:
799
925
  .glass-prose (styles the rendered content beneath it)
@@ -817,6 +943,7 @@ Date strip:
817
943
 
818
944
  Calendar:
819
945
  .glass-calendar__nav · __wd · __day[aria-pressed] / --today / --other / [aria-disabled] · __marks · __mark--primary / --success / --warning / --error
946
+ --gl-color-primary-fill (the chosen day's fill, also in the date strip and the current step's number)
820
947
 
821
948
  Image picker:
822
949
  .glass-image-picker__preview / --round · __label / __hint / __actions
@@ -833,6 +960,18 @@ Tab Bar – Floating:
833
960
  .glass-tab-bar__accessory--accent / --success / --error
834
961
  --gl-tab-bar-active-bg / -shadow · --gl-tab-bar-spotlight-opacity · --gl-tab-bar-active-glow
835
962
  --gl-tab-bar-color / -hover-color · --gl-tab-bar-label-size · --gl-tab-bar-z-index
963
+ --gl-tab-bar-icon-size · --gl-tab-bar-item-radius · --gl-tab-bar-active-weight
964
+ --gl-droplet-duration / -easing / -trail-duration / -trail-delay / -trail-easing / -lift / -lift-duration / -settle-duration / -settle-easing / -lens-duration / -lens-easing
965
+
966
+ Tab Bar – Layouts:
967
+ .glass-tab-bar--vertical (sidebar) · --start / --end (fixed to a side) · --rail (icons alone) · --labels (with --rail: the label under the icon)
968
+ .glass-tab-bar--floating + --vertical + --rail (a rail of its own glass; with --start / --end fixed at a side)
969
+ .glass-tab-bar__leading / __trailing (a mark, the accessory, a foot inside the bar)
970
+ .glass-tab-bar__accessory-item > __accessory-label (the accessory with its name under it)
971
+ .glass-tab-bar--top (top of a page)
972
+ .glass-tab-bar-dock--vertical / --start / --end (the floating bar upright at a side)
973
+ --gl-tab-bar-rail-width / --gl-tab-bar-badge-room / --gl-tab-bar-rail-item-height
974
+ --gl-tab-bar-floating-inset / --gl-tab-bar-rail-radius
836
975
 
837
976
  Right to left:
838
977
  dir="rtl" on <html> or a container – the components mirror