@jungherz-de/glasskit 1.31.0 → 1.32.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 +107 -1
- package/README.md +125 -20
- package/SKILL.md +496 -20
- package/glasskit-droplet.js +70 -32
- package/glasskit-styles.js +2 -2
- package/glasskit.css +783 -24
- package/glasskit.min.css +1 -1
- package/glasskit.min.css.map +1 -1
- package/package.json +2 -2
- package/theme-override.css +87 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,111 @@ GlassKit uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [1.32.0] – 2026-10-27
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **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:
|
|
15
|
+
- `--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`.
|
|
16
|
+
- 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.
|
|
17
|
+
- `--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.
|
|
18
|
+
- `--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.
|
|
19
|
+
- `.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`.
|
|
20
|
+
|
|
21
|
+
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:
|
|
22
|
+
- A sidebar fills its grid row, and a rail is 72px wide with 48px items.
|
|
23
|
+
- 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.
|
|
24
|
+
- The top bar keeps its border at the bottom and puts the icon beside the label at 1100px.
|
|
25
|
+
|
|
26
|
+
([GlassKit Elements #25](https://github.com/JUNGHERZ/GlassKit-Elements/issues/25))
|
|
27
|
+
- **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:
|
|
28
|
+
|
|
29
|
+
| Token | Moves | Unset |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `--gl-droplet-duration`, `--gl-droplet-easing` | the leading edge | 0.3s, `cubic-bezier(.3, 1.2, .5, 1)` |
|
|
32
|
+
| `--gl-droplet-trail-duration`, `-trail-delay`, `-trail-easing` | the trailing edge | 0.5s, 40ms, `cubic-bezier(.5, 1.5, .45, .92)` |
|
|
33
|
+
| `--gl-droplet-lift` | the squash while travelling | 0.86 (1 squashes nothing) |
|
|
34
|
+
| `--gl-droplet-lift-duration` | how long the squash holds | 280ms |
|
|
35
|
+
| `--gl-droplet-settle-duration`, `-settle-easing` | the spring back | 0.55s, `cubic-bezier(.34, 1.8, .5, 1)` |
|
|
36
|
+
| `--gl-droplet-lens-duration`, `-lens-easing` | the item under the drop | 0.4s, `cubic-bezier(.34, 1.6, .5, 1)` |
|
|
37
|
+
|
|
38
|
+
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.
|
|
39
|
+
|
|
40
|
+
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.
|
|
41
|
+
|
|
42
|
+
Measured with the issue's journey in all three engines, from a tap to the last frame in which a value changed:
|
|
43
|
+
- 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.
|
|
44
|
+
- 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.
|
|
45
|
+
|
|
46
|
+
([#23](https://github.com/JUNGHERZ/GlassKit/issues/23))
|
|
47
|
+
- **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`.
|
|
48
|
+
|
|
49
|
+
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:
|
|
50
|
+
- 4.53:1 on the chosen days and the current step
|
|
51
|
+
- 4.53 to 4.99:1 (light) and 4.53 to 5.82:1 (dark) on a button gradient from these mixes
|
|
52
|
+
|
|
53
|
+
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))
|
|
54
|
+
- **`.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))
|
|
55
|
+
- **`.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.
|
|
56
|
+
- Items are buttons with `role="menuitem"`, or `menuitemcheckbox` and `menuitemradio`, whose `aria-checked` (or `.is-checked`) shows the check mark.
|
|
57
|
+
- Each item can have an icon before its label and a hint such as a shortcut at its end.
|
|
58
|
+
- `--danger` takes the error colour for destructive actions. `aria-disabled="true"` leaves an item announced but inert.
|
|
59
|
+
- `__separator` and `__group-label` divide the list.
|
|
60
|
+
|
|
61
|
+
The keyboard of the WAI-ARIA menu button is GlassKit Elements' `<glk-menu>`. ([GlassKit Elements #30](https://github.com/JUNGHERZ/GlassKit-Elements/issues/30))
|
|
62
|
+
- **`.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:
|
|
63
|
+
- `.is-selected`, on raised glass like the active row of a sidebar, and `.is-expanded`
|
|
64
|
+
- `.is-leaf`, which has no twisty
|
|
65
|
+
- `.is-loading`, whose twisty becomes a small spinner while children load
|
|
66
|
+
- `.is-error`, whose twisty becomes a "!" in the error colour when they could not load
|
|
67
|
+
- `.is-disabled`
|
|
68
|
+
|
|
69
|
+
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))
|
|
70
|
+
- **`.glass-breadcrumbs`**: the path through nested levels, as a `<nav>` around an `<ol>`.
|
|
71
|
+
- Crumbs are links or buttons. The current level is plain text with `aria-current="page"`.
|
|
72
|
+
- The separators are drawn by CSS, so assistive technology does not read them, and they mirror right to left.
|
|
73
|
+
- A crumb longer than `--gl-breadcrumbs-crumb-width` (200px) ends in an ellipsis.
|
|
74
|
+
- `__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.
|
|
75
|
+
- `.is-drop-target` and `.is-drop-refused` show a crumb under a dragged item.
|
|
76
|
+
|
|
77
|
+
([GlassKit Elements #27](https://github.com/JUNGHERZ/GlassKit-Elements/issues/27))
|
|
78
|
+
- **The states of a drag that reorders a list or a tree.**
|
|
79
|
+
- The dragged item stays in place, faded (`.is-sort-source`), while a raised copy, `.glass-sort__ghost`, follows the pointer in the top layer.
|
|
80
|
+
- A line shows where the item lands before or after another (`.is-sort-before`, `.is-sort-after`), indented to the level it lands on.
|
|
81
|
+
- An item that takes it inside lights up (`.is-sort-inside`), and one that refuses it shows the error colour (`.is-sort-refused`).
|
|
82
|
+
- `.glass-sort__handle` holds a drag handle that starts a drag at once, even by touch.
|
|
83
|
+
|
|
84
|
+
`--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))
|
|
85
|
+
- **`.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))
|
|
86
|
+
- **More for `.glass-table`: sorting, a sticky header, row actions, an empty state, cards on narrow screens.**
|
|
87
|
+
- A header cell can hold a `__sort` button, whose arrow follows `aria-sort` on the `th`.
|
|
88
|
+
- 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.
|
|
89
|
+
- `__actions` cells stay at the row's end while the table scrolls sideways, on a surface of their own once it does (`--scrolls`).
|
|
90
|
+
- `.glass-table-frame` shades an edge where more columns wait, and `__empty` holds an empty state.
|
|
91
|
+
- `--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.
|
|
92
|
+
- `--gl-table-cell-padding` and `--gl-table-header-padding` set the room in the cells.
|
|
93
|
+
|
|
94
|
+
GlassKit Elements' `<glk-table>` brings it all to a native table. ([GlassKit Elements #31](https://github.com/JUNGHERZ/GlassKit-Elements/issues/31))
|
|
95
|
+
- **`.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))
|
|
96
|
+
|
|
97
|
+
### Changed
|
|
98
|
+
|
|
99
|
+
- **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))
|
|
100
|
+
- **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))
|
|
101
|
+
- **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))
|
|
102
|
+
|
|
103
|
+
### Compatibility
|
|
104
|
+
|
|
105
|
+
- Nothing changes for a project that sets none of the new tokens or classes, apart from three things:
|
|
106
|
+
- Keyboard focus is visible on tab bar items and on interactive list rows.
|
|
107
|
+
- The weekday on a chosen date strip day is fully opaque.
|
|
108
|
+
- 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.
|
|
109
|
+
- 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.
|
|
110
|
+
|
|
111
|
+
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.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
10
115
|
## [1.31.0] – 2026-10-25
|
|
11
116
|
|
|
12
117
|
### Added
|
|
@@ -1219,6 +1324,7 @@ during development. Version 1.3 is the first public open-source release.
|
|
|
1219
1324
|
|
|
1220
1325
|
---
|
|
1221
1326
|
|
|
1327
|
+
[1.32.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.32.0
|
|
1222
1328
|
[1.31.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.31.0
|
|
1223
1329
|
[1.30.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.30.0
|
|
1224
1330
|
[1.29.1]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.29.1
|
|
@@ -1263,4 +1369,4 @@ during development. Version 1.3 is the first public open-source release.
|
|
|
1263
1369
|
[1.3.2]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.2
|
|
1264
1370
|
[1.3.1]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.1
|
|
1265
1371
|
[1.3.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.0
|
|
1266
|
-
[Unreleased]: https://github.com/JUNGHERZ/GlassKit/compare/v1.
|
|
1372
|
+
[Unreleased]: https://github.com/JUNGHERZ/GlassKit/compare/v1.32.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.
|
|
2
|
+
<img src="https://img.shields.io/badge/version-1.32.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-
|
|
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.
|
|
6
|
+
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-v1.32.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
|
-
|
|
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
|
-
-
|
|
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.
|
|
77
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.32/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.
|
|
80
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.32/glasskit.css">
|
|
80
81
|
|
|
81
82
|
<!-- unpkg – Alternative -->
|
|
82
|
-
<link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.
|
|
83
|
+
<link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.32/glasskit.min.css">
|
|
83
84
|
```
|
|
84
85
|
|
|
85
|
-
> **Tip:** Replace `@1.
|
|
86
|
+
> **Tip:** Replace `@1.32` 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.
|
|
92
|
+
import { attachDroplets } from 'https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.32/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
|
|
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`) or a top bar (`--top`) |
|
|
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`; `--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
|
|
|
@@ -197,8 +199,10 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
|
|
|
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,7 +218,9 @@ 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
|
|
|
@@ -257,6 +263,41 @@ 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
|
+
|
|
260
301
|
---
|
|
261
302
|
|
|
262
303
|
## 🌗 Theming
|
|
@@ -324,6 +365,18 @@ a later declaration if you want to bend one.
|
|
|
324
365
|
|
|
325
366
|
**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
367
|
|
|
368
|
+
**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:
|
|
369
|
+
|
|
370
|
+
```css
|
|
371
|
+
:root, [data-theme="dark"] { --gl-color-primary-fill: color-mix(in srgb, var(--gl-color-primary) 65%, #000); }
|
|
372
|
+
[data-theme="light"] { --gl-color-primary-fill: color-mix(in srgb, var(--gl-color-primary) 75%, #000); }
|
|
373
|
+
:root, [data-theme="dark"], [data-theme="light"] {
|
|
374
|
+
--gl-btn-primary-bg: linear-gradient(135deg, var(--gl-color-primary-fill), color-mix(in srgb, var(--gl-color-primary-dark) 80%, #000));
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
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.
|
|
379
|
+
|
|
327
380
|
The `theme-override.css` template comes with **4 example themes**:
|
|
328
381
|
- 🔵 Ocean Blue
|
|
329
382
|
- 🟢 Emerald Green
|
|
@@ -424,6 +477,7 @@ All visual values are controlled via CSS Custom Properties:
|
|
|
424
477
|
/* Colors */
|
|
425
478
|
--gl-color-primary /* Primary color */
|
|
426
479
|
--gl-color-primary-text /* text and line icons in the primary; defaults to it */
|
|
480
|
+
--gl-color-primary-fill /* flat accent fills that carry text: chosen day, current step; defaults to the primary */
|
|
427
481
|
--gl-color-text /* Text color */
|
|
428
482
|
--gl-color-text-muted /* Secondary text */
|
|
429
483
|
|
|
@@ -461,6 +515,7 @@ All visual values are controlled via CSS Custom Properties:
|
|
|
461
515
|
|
|
462
516
|
/* Component hooks */
|
|
463
517
|
--gl-modal-max-width /* 340px */
|
|
518
|
+
--gl-btn-primary-bg /* the primary button's whole background; unset: the gradient of the primary */
|
|
464
519
|
--gl-btn-radius /* buttons alone; unset: --gl-radius-btn, shared with lists, toasts, the segmented control */
|
|
465
520
|
--gl-btn-radius-sm /* --sm; unset: --gl-btn-radius, then --gl-radius-sm */
|
|
466
521
|
--gl-btn-padding-x /* room beside the label; unset: 24px */
|
|
@@ -476,7 +531,7 @@ All visual values are controlled via CSS Custom Properties:
|
|
|
476
531
|
--gl-toggle-track-bg /* toggle track when off; unset: --gl-surface-2 (…-checked: the primary gradient) */
|
|
477
532
|
--gl-radio-bg, --gl-radio-bg-checked, --gl-radio-border, --gl-radio-border-checked
|
|
478
533
|
--gl-radio-dot-size /* 10px */
|
|
479
|
-
--gl-radio-dot-color /* white */
|
|
534
|
+
--gl-radio-dot-color /* unset: --gl-color-on-primary (white), so it follows a dark ink */
|
|
480
535
|
--gl-textarea-field-sizing /* fixed; content lets text areas grow with their text */
|
|
481
536
|
--gl-input-picker-icon /* none hides Chromium's picker button of date and time fields */
|
|
482
537
|
--gl-tab-bar-active-color /* icon and label of the active tab; unset: --gl-color-primary-text */
|
|
@@ -488,6 +543,23 @@ All visual values are controlled via CSS Custom Properties:
|
|
|
488
543
|
--gl-tab-bar-hover-color /* … of a hovered tab; unset: --gl-icon-default */
|
|
489
544
|
--gl-tab-bar-label-size /* 10px */
|
|
490
545
|
--gl-tab-bar-z-index /* 900; fixed bar and floating dock */
|
|
546
|
+
--gl-tab-bar-rail-width /* 72px; the icon rail */
|
|
547
|
+
--gl-tab-bar-badge-room /* 32px; where a sidebar row's label ends before its badge */
|
|
548
|
+
--gl-flash-color /* the flash of a changed list item or tree row; unset: the primary at 30 % */
|
|
549
|
+
--gl-droplet-duration, -easing, -trail-duration, -trail-delay, -trail-easing /* the drop's journey */
|
|
550
|
+
--gl-droplet-lift, -lift-duration, -settle-duration, -settle-easing /* its squash and spring back */
|
|
551
|
+
--gl-droplet-lens-duration, -lens-easing /* the item below it growing */
|
|
552
|
+
--gl-tooltip-max-width /* 240px */
|
|
553
|
+
--gl-tooltip-bg, --gl-tooltip-color /* unset: the theme's dark background, the text colour */
|
|
554
|
+
--gl-tooltip-offset /* 8px; the distance GlassKit Elements keeps from the control */
|
|
555
|
+
--gl-tree-indent /* 20px per level */
|
|
556
|
+
--gl-tree-row-height /* 36px */
|
|
557
|
+
--gl-breadcrumbs-crumb-width /* 200px; a longer crumb ends in an ellipsis */
|
|
558
|
+
--gl-sort-duration, --gl-sort-easing /* 180ms, ease-out: rows making room while a list is sorted */
|
|
559
|
+
--gl-table-cell-padding /* 9px 10px */
|
|
560
|
+
--gl-table-header-padding /* 8px 10px */
|
|
561
|
+
--gl-table-max-height /* 60vh; the wrap with a sticky header */
|
|
562
|
+
--gl-table-header-bg /* the sticky header's surface */
|
|
491
563
|
--gl-segmented-active-bg /* chosen option and its drop; unset: --gl-surface-5 */
|
|
492
564
|
--gl-segmented-active-shadow /* their shadow; unset: --gl-shadow-btn */
|
|
493
565
|
--gl-segmented-active-color /* label and icon of the chosen option; unset: --gl-color-text-heading */
|
|
@@ -651,7 +723,7 @@ glasskit/
|
|
|
651
723
|
|
|
652
724
|
The full documentation with **live previews**, **copy-paste code blocks**, and **class reference tables** is available in `docs.html`:
|
|
653
725
|
|
|
654
|
-
- Sidebar navigation to all
|
|
726
|
+
- Sidebar navigation to all 38 components
|
|
655
727
|
- Live previews on a real glassmorphism background
|
|
656
728
|
- Design token reference
|
|
657
729
|
- Theming guide
|
|
@@ -693,10 +765,10 @@ GlassKit ships with an **AI-optimized component reference** in [`SKILL.md`](SKIL
|
|
|
693
765
|
|
|
694
766
|
### What it provides
|
|
695
767
|
|
|
696
|
-
- **Copy-paste-ready HTML** for all
|
|
768
|
+
- **Copy-paste-ready HTML** for all 38 components with exact nesting rules
|
|
697
769
|
- **Complete design token tables** (colors, surfaces, blur, radii, spacing, shadows, typography)
|
|
698
770
|
- **State class reference** – which class goes where (`is-active`, `is-open`, `is-visible`, `:checked`)
|
|
699
|
-
- **
|
|
771
|
+
- **8 composition patterns** – full page layouts (Login, Dashboard, Form, Modal, Settings, iOS Settings, Progress, Back office)
|
|
700
772
|
- **Common mistakes & corrections** – prevents the most frequent AI-generated errors
|
|
701
773
|
- **Quick reference table** – all components with their modifiers at a glance
|
|
702
774
|
|
|
@@ -723,7 +795,8 @@ A few refinements arrive later and fall back quietly where they are missing:
|
|
|
723
795
|
|
|
724
796
|
- 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
797
|
- 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.
|
|
798
|
+
- 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()`.
|
|
799
|
+
- 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
800
|
|
|
728
801
|
> **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
802
|
|
|
@@ -739,16 +812,18 @@ Page Attributes (on <html>):
|
|
|
739
812
|
Interactive States:
|
|
740
813
|
.is-active → Tab Bar item, Modal Overlay
|
|
741
814
|
.is-open → Accordion item, Popover
|
|
815
|
+
:popover-open → Popover, Tooltip, Menu with [popover] (top layer)
|
|
742
816
|
.is-visible → Toast
|
|
743
817
|
:checked → Toggle, Checkbox, Radio
|
|
744
818
|
:focus → Input, Textarea, Select, Range
|
|
745
819
|
:disabled → Input, Select, Textarea, Range, Toggle, Checkbox, Radio,
|
|
746
820
|
Button, Pill, Tab Bar Accessory, Modal action, list row
|
|
747
|
-
[aria-disabled] → a.glass-btn and the other buttons (link still navigates)
|
|
821
|
+
[aria-disabled] → a.glass-btn and the other buttons (link still navigates), menu items
|
|
748
822
|
|
|
749
823
|
Button Modifiers:
|
|
750
824
|
.glass-btn--primary / --secondary / --tertiary
|
|
751
825
|
.glass-btn--sm / --lg / --auto
|
|
826
|
+
--gl-btn-primary-bg (the primary's whole background, for white text with AA)
|
|
752
827
|
|
|
753
828
|
Card Modifiers:
|
|
754
829
|
.glass-card--glow
|
|
@@ -784,16 +859,38 @@ Input affixes:
|
|
|
784
859
|
List Modifiers:
|
|
785
860
|
.glass-list--flush / --bare
|
|
786
861
|
.glass-list__item--interactive / --center
|
|
862
|
+
.glass-list__item.is-flash (a changed item flashes; --gl-flash-color)
|
|
787
863
|
--gl-list-title-white-space / --gl-list-subtitle-white-space / --gl-list-subtitle-lines (wrapping, app-wide)
|
|
788
864
|
|
|
789
865
|
Popover Modifiers:
|
|
790
866
|
.glass-popover--top / --start / --end
|
|
867
|
+
.glass-popover[popover] (top layer, placed by script; [data-side="top"] above its control)
|
|
868
|
+
|
|
869
|
+
Tooltip:
|
|
870
|
+
.glass-tooltip[popover] (role="tooltip", top layer)
|
|
871
|
+
--gl-tooltip-max-width / --gl-tooltip-bg / --gl-tooltip-color
|
|
872
|
+
|
|
873
|
+
Menu:
|
|
874
|
+
.glass-menu[popover] · __item / __item--danger / [aria-checked] / [aria-disabled] · __check / __icon / __label / __trailing · __separator · __group-label
|
|
875
|
+
|
|
876
|
+
Tree:
|
|
877
|
+
.glass-tree · __row.is-expanded / .is-selected / .is-leaf / .is-loading / .is-error / .is-disabled / .is-flash · __twisty / __icon / __label / __trailing · __group
|
|
878
|
+
--gl-tree-level (per row) / --gl-tree-indent / --gl-tree-row-height
|
|
879
|
+
|
|
880
|
+
Breadcrumbs:
|
|
881
|
+
.glass-breadcrumbs · __list / __item / __item--overflow · __crumb / __current / __overflow · .is-drop-target / .is-drop-refused
|
|
882
|
+
|
|
883
|
+
Sorting:
|
|
884
|
+
.is-sort-source / -before / -after / -inside / -refused · .glass-sort__ghost · .glass-sort__handle
|
|
885
|
+
--gl-sort-duration / --gl-sort-easing
|
|
791
886
|
|
|
792
887
|
Skeleton:
|
|
793
888
|
.glass-skeleton__line / __line--title
|
|
794
889
|
|
|
795
890
|
Table:
|
|
796
891
|
.glass-table-wrap · .glass-table__num / __muted
|
|
892
|
+
.glass-table__sort / __sort-icon · th[aria-sort] · .glass-table__actions · .glass-table__empty
|
|
893
|
+
.glass-table-wrap--sticky + .glass-table--sticky · .glass-table--scrolls · .glass-table--list · .glass-table-frame[data-more-start / data-more-end]
|
|
797
894
|
|
|
798
895
|
Prose:
|
|
799
896
|
.glass-prose (styles the rendered content beneath it)
|
|
@@ -817,6 +914,7 @@ Date strip:
|
|
|
817
914
|
|
|
818
915
|
Calendar:
|
|
819
916
|
.glass-calendar__nav · __wd · __day[aria-pressed] / --today / --other / [aria-disabled] · __marks · __mark--primary / --success / --warning / --error
|
|
917
|
+
--gl-color-primary-fill (the chosen day's fill, also in the date strip and the current step's number)
|
|
820
918
|
|
|
821
919
|
Image picker:
|
|
822
920
|
.glass-image-picker__preview / --round · __label / __hint / __actions
|
|
@@ -833,6 +931,13 @@ Tab Bar – Floating:
|
|
|
833
931
|
.glass-tab-bar__accessory--accent / --success / --error
|
|
834
932
|
--gl-tab-bar-active-bg / -shadow · --gl-tab-bar-spotlight-opacity · --gl-tab-bar-active-glow
|
|
835
933
|
--gl-tab-bar-color / -hover-color · --gl-tab-bar-label-size · --gl-tab-bar-z-index
|
|
934
|
+
--gl-droplet-duration / -easing / -trail-duration / -trail-delay / -trail-easing / -lift / -lift-duration / -settle-duration / -settle-easing / -lens-duration / -lens-easing
|
|
935
|
+
|
|
936
|
+
Tab Bar – Layouts:
|
|
937
|
+
.glass-tab-bar--vertical (sidebar) · --start / --end (fixed to a side) · --rail (icons alone)
|
|
938
|
+
.glass-tab-bar--top (top of a page)
|
|
939
|
+
.glass-tab-bar-dock--vertical / --start / --end (the floating bar upright at a side)
|
|
940
|
+
--gl-tab-bar-rail-width / --gl-tab-bar-badge-room
|
|
836
941
|
|
|
837
942
|
Right to left:
|
|
838
943
|
dir="rtl" on <html> or a container – the components mirror
|