@jungherz-de/glasskit 1.32.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,39 @@ 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
+
10
43
  ## [1.32.0] – 2026-10-27
11
44
 
12
45
  ### Added
@@ -1324,6 +1357,7 @@ during development. Version 1.3 is the first public open-source release.
1324
1357
 
1325
1358
  ---
1326
1359
 
1360
+ [1.33.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.33.0
1327
1361
  [1.32.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.32.0
1328
1362
  [1.31.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.31.0
1329
1363
  [1.30.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.30.0
@@ -1369,4 +1403,4 @@ during development. Version 1.3 is the first public open-source release.
1369
1403
  [1.3.2]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.2
1370
1404
  [1.3.1]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.1
1371
1405
  [1.3.0]: https://github.com/JUNGHERZ/GlassKit/releases/tag/v1.3.0
1372
- [Unreleased]: https://github.com/JUNGHERZ/GlassKit/compare/v1.32.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.32.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
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.32.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>
@@ -74,22 +74,22 @@ No download, no build tool – just include and go:
74
74
 
75
75
  ```html
76
76
  <!-- jsDelivr – Minified -->
77
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.32/glasskit.min.css">
77
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.33/glasskit.min.css">
78
78
 
79
79
  <!-- jsDelivr – Unminified (for reading/debugging) -->
80
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.32/glasskit.css">
80
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.33/glasskit.css">
81
81
 
82
82
  <!-- unpkg – Alternative -->
83
- <link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.32/glasskit.min.css">
83
+ <link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.33/glasskit.min.css">
84
84
  ```
85
85
 
86
- > **Tip:** Replace `@1.32` 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.
87
87
 
88
88
  The [droplet](#-droplet-a-fluid-selection) takes one optional module next to the stylesheet:
89
89
 
90
90
  ```html
91
91
  <script type="module">
92
- import { attachDroplets } from 'https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.32/glasskit-droplet.js';
92
+ import { attachDroplets } from 'https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.33/glasskit-droplet.js';
93
93
  attachDroplets();
94
94
  </script>
95
95
  ```
@@ -182,8 +182,8 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
182
182
  | **Background** | `.glass-bg` | Aurora gradient with light effects |
183
183
  | **Nav Bar** | `.glass-nav` | Transparent navigation |
184
184
  | **Pill Button** | `.glass-pill` | Round glass icon button (46×46) |
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 |
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
187
  | **Breadcrumbs** | `.glass-breadcrumbs` | The path through nested levels: CSS separators, a "…" for folded levels, crumbs as drop targets |
188
188
  | **Accordion** | `.glass-accordion` | Collapsible content sections |
189
189
  | **Divider** | `.glass-divider` | Fading separator line |
@@ -195,7 +195,7 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
195
195
  | **Title** | `.glass-title` | Page title with text shadow |
196
196
  | **Card** | `.glass-card` | Glass container for content |
197
197
  | **Card (Glow)** | `.glass-card--glow` | Card with light-to-milky gradient |
198
- | **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 |
199
199
  | **Avatar** | `.glass-avatar` | Glass circle (sm/md/lg) |
200
200
  | **Status** | `.glass-status` | Notice card with icon |
201
201
  | **List** | `.glass-list` | iOS-style grouped settings list with auto dividers |
@@ -226,7 +226,7 @@ Download the files directly from the [GitHub Release](https://github.com/JUNGHER
226
226
 
227
227
  | Component | Class | Description |
228
228
  |---|---|---|
229
- | **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` |
230
230
  | **Textarea** | `.glass-textarea` | Multi-line input |
231
231
  | **Select** | `.glass-select` | Dropdown with custom chevron |
232
232
  | **Search** | `.glass-search` | Input with search icon |
@@ -298,6 +298,26 @@ Since **1.32.0** the tab bar is not bound to the bottom edge. The items stay the
298
298
 
299
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
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
+
301
321
  ---
302
322
 
303
323
  ## 🌗 Theming
@@ -545,6 +565,13 @@ All visual values are controlled via CSS Custom Properties:
545
565
  --gl-tab-bar-z-index /* 900; fixed bar and floating dock */
546
566
  --gl-tab-bar-rail-width /* 72px; the icon rail */
547
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) */
548
575
  --gl-flash-color /* the flash of a changed list item or tree row; unset: the primary at 30 % */
549
576
  --gl-droplet-duration, -easing, -trail-duration, -trail-delay, -trail-easing /* the drop's journey */
550
577
  --gl-droplet-lift, -lift-duration, -settle-duration, -settle-easing /* its squash and spring back */
@@ -835,6 +862,7 @@ Progress Modifiers:
835
862
  Badge Modifiers:
836
863
  .glass-badge--primary / --success / --warning / --error
837
864
  .glass-badge--interactive / --selected (chips)
865
+ .glass-badge--md (choice chip, 36px; --gl-badge-md-height)
838
866
 
839
867
  Avatar Modifiers:
840
868
  .glass-avatar--sm / --lg
@@ -855,6 +883,7 @@ Select:
855
883
  Input affixes:
856
884
  .glass-input-wrap > __prefix / __suffix · --prefix / --suffix
857
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)
858
887
 
859
888
  List Modifiers:
860
889
  .glass-list--flush / --bare
@@ -931,13 +960,18 @@ Tab Bar – Floating:
931
960
  .glass-tab-bar__accessory--accent / --success / --error
932
961
  --gl-tab-bar-active-bg / -shadow · --gl-tab-bar-spotlight-opacity · --gl-tab-bar-active-glow
933
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
934
964
  --gl-droplet-duration / -easing / -trail-duration / -trail-delay / -trail-easing / -lift / -lift-duration / -settle-duration / -settle-easing / -lens-duration / -lens-easing
935
965
 
936
966
  Tab Bar – Layouts:
937
- .glass-tab-bar--vertical (sidebar) · --start / --end (fixed to a side) · --rail (icons alone)
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)
938
971
  .glass-tab-bar--top (top of a page)
939
972
  .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
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
941
975
 
942
976
  Right to left:
943
977
  dir="rtl" on <html> or a container – the components mirror
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: glasskit-css
3
- description: GlassKit is a pure CSS glassmorphism component library (v1.32.0) with 38 components, Dark & Light mode, design tokens, and BEM-like naming. Use this reference whenever generating HTML that uses GlassKit classes to ensure correct structure, nesting, modifiers, and token usage.
3
+ description: GlassKit is a pure CSS glassmorphism component library (v1.33.0) with 38 components, Dark & Light mode, design tokens, and BEM-like naming. Use this reference whenever generating HTML that uses GlassKit classes to ensure correct structure, nesting, modifiers, and token usage.
4
4
  ---
5
5
 
6
6
  # GlassKit CSS – AI Component Reference
@@ -14,6 +14,8 @@ description: GlassKit is a pure CSS glassmorphism component library (v1.32.0) wi
14
14
 
15
15
  > **New in 1.32.0 — one navigation for every edge, four components, and AA on the accent fills.** The tab bar leaves the bottom edge: `--vertical` makes it a sidebar, `--start` or `--end` fixes it to that side of the viewport — where the thumb rests on a phone held open, or a foldable that moved its system controls to a side — `--rail` shrinks it to icons, `--top` lays it out for the top of a page, and the floating bar stands upright in `.glass-tab-bar-dock--vertical`. In a column the drop runs along y, and its timing is tokens (`--gl-droplet-*`). New: the tooltip, the menu, the tree and the breadcrumbs (3.36–3.39), the states of a drag that reorders a list or a tree (3.40), and for the table a sort button, a sticky header, a row action column, an empty row and a card layout (3.27). Popover, tooltip and menu open in the top layer with the `popover` attribute. `--gl-btn-primary-bg` and `--gl-color-primary-fill` darken the accent fills for white text without touching the brand colour, and the radio's dot follows `--gl-color-on-primary`. **Where a project builds its own sidebar, tooltip, menu, tree or breadcrumbs, overrides the drop's transitions, or darkens `--gl-color-primary` for white button text, replace that** (3.4, 3.7, 3.25, section 2).
16
16
 
17
+ > **New in 1.33.0 — a rail that names its items, and tokens for the tab bar's details.** `--rail` with `--labels` keeps the label under the icon, and `--floating` with `--vertical` and `--start` or `--end` makes the rail a pane of its own glass at that edge, full height and inset from it; `__leading` and `__trailing` hold a mark, the accessory (`__accessory-item` with its name under it) and a foot inside the bar. `--gl-tab-bar-icon-size`, `--gl-tab-bar-item-radius` and `--gl-tab-bar-active-weight` replace overrides of global tokens, and the items transition only colour, surface, shadow, opacity and the press. Also new: `.glass-input-group--label-end` for a link such as "Forgot password?" at the end of the label row, and `.glass-badge--md`, a 36px choice chip with a 44px tap target.
18
+
17
19
  ---
18
20
 
19
21
  ## 1. Setup & Boilerplate
@@ -505,10 +507,14 @@ Every state — inactive, hover, active, under the drop, the drag — sets `colo
505
507
  | `--gl-tab-bar-color` | `--gl-icon-muted` | Icon and label of the inactive tabs; `var(--gl-icon-strong)` reads better on a busy background |
506
508
  | `--gl-tab-bar-hover-color` | `--gl-icon-default` | Icon and label of a hovered tab — set it too when `--gl-tab-bar-color` is lighter than `--gl-icon-default`, or hover dims the tab |
507
509
  | `--gl-tab-bar-label-size` | `10px` | Label size (Material uses 12px, Apple's HIG about 13px) |
510
+ | `--gl-tab-bar-icon-size` | `24px` | Size of the icon box and of an SVG in it (since 1.33.0); a compact top bar takes the segmented control's 18px |
511
+ | `--gl-tab-bar-active-weight` | `--gl-font-weight-medium` | Weight of the active tab's label (since 1.33.0), e.g. `var(--gl-font-weight-semibold)` |
508
512
  | `--gl-tab-bar-z-index` | `900` | Stacking of `.glass-tab-bar` and `.glass-tab-bar-dock`, e.g. below a side drawer |
509
513
 
510
514
  Never copy the state rules onto an icon element of your own, and never override `stroke` on `.glass-tab-bar__icon svg`: since 1.28.0 such a rule reaches every state, the active one too. Set the tokens.
511
515
 
516
+ **Transitions (since 1.33.0).** The items move only what a state changes — `color`, `background-color`, `box-shadow`, `opacity`, `transform` — not `all`. A bar that switches its layout (upright, floating, a rail) takes its new size at once; with `all`, padding, width and height glided for 250ms and an item measured meanwhile was not yet its size. Do not put `transition: all` back on the items.
517
+
512
518
  #### Floating variant + Accessory
513
519
 
514
520
  Pill-shaped, centered, floating bar (iOS 26 Liquid Glass style). Wrap it in `.glass-tab-bar-dock` together with an optional `.glass-tab-bar__accessory` capsule (e.g. search, compose). Use `.glass-bg--has-tab-bar-floating` on the background container instead of `--has-tab-bar`. The active item gets a soft radial Spotlight halo.
@@ -610,6 +616,8 @@ Tokens for a capsule behind the active item, like the selected tab of iOS 26 —
610
616
 
611
617
  A nearly opaque white capsule (`rgba(255, 255, 255, 0.9)`) lets a dark brand primary stay the active colour in the dark theme. The capsule is the item's background, rounded like the item: a pill on the floating bar, 12px on the fixed one.
612
618
 
619
+ `--gl-tab-bar-item-radius` (since 1.33.0) rounds the floating items and the drop together — unset a capsule (`--gl-radius-full`); in a rail with labels unset 16px. Set it on the bar instead of `--gl-radius-full`, which every pill and badge shares: 18px for the rounded squares of a rail, 12px for a compact top bar that looks like a segmented control.
620
+
613
621
  #### Sidebar, rail, top bar and side dock (since 1.32.0)
614
622
 
615
623
  One navigation in more places than the bottom edge. The items stay the same — icon, label, badge, `.is-active`, the drop — and only the bar's modifiers change, so a page switches between the layouts (a media query in script, a setting per device) without rendering the items again.
@@ -667,6 +675,51 @@ One navigation in more places than the bottom edge. The items stay the same —
667
675
  - **Every bar, the bottom one too,** shows a focus ring on the item that has the keyboard focus — the active item under the drop included — and an item may be an `<a>` (no underline, the bar's colours).
668
676
  - The drop runs along y in a column (see Droplet above); `--vertical` with `--droplet` needs nothing else.
669
677
 
678
+ #### Rail with labels, floating rail, leading and trailing places (since 1.33.0)
679
+
680
+ A desktop rail that names its items: `--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; with `--start` or `--end` as well, it stands at that edge of the viewport, full height less `--gl-tab-bar-floating-inset` at both ends and that far from its edge, clear of the safe areas, with the corners of a card. `__leading` and `__trailing` are places inside the bar: above the items in a column (a mark, the accessory) and at its far end (a foot such as the account); before and after the items in a row.
681
+
682
+ ```html
683
+ <nav class="glass-tab-bar glass-tab-bar--floating glass-tab-bar--vertical glass-tab-bar--start
684
+ glass-tab-bar--rail glass-tab-bar--labels glass-tab-bar--droplet"
685
+ aria-label="Main" style="--gl-tab-bar-rail-width: 96px; --gl-tab-bar-label-size: 12px">
686
+ <div class="glass-tab-bar__leading">
687
+ <img src="mark.svg" alt="" width="40" height="40">
688
+ <div class="glass-tab-bar__accessory-item">
689
+ <button class="glass-tab-bar__accessory glass-tab-bar__accessory--accent" aria-label="Assistant"><svg viewBox="0 0 24 24"><!-- Icon --></svg></button>
690
+ <span class="glass-tab-bar__accessory-label" aria-hidden="true">Assistant</span>
691
+ </div>
692
+ </div>
693
+ <a class="glass-tab-bar__item is-active" href="/" aria-current="page">
694
+ <span class="glass-tab-bar__icon"><svg viewBox="0 0 24 24"><!-- Icon --></svg></span>
695
+ <span class="glass-tab-bar__label">App</span>
696
+ </a>
697
+ <!-- more items -->
698
+ <div class="glass-tab-bar__trailing"><!-- the account --></div>
699
+ </nav>
700
+ <main style="padding-inline-start: calc(96px + 2 * 16px)">…</main>
701
+ ```
702
+
703
+ | Class | Description |
704
+ |---|---|
705
+ | `.glass-tab-bar--labels` | With `--rail`: the label under the icon at `--gl-tab-bar-label-size`; the items fill the rail's width (`--gl-tab-bar-rail-width`) and are at least `--gl-tab-bar-rail-item-height` (62px) high, rounded by `--gl-tab-bar-item-radius` (unset 16px), and so is the drop; a long label ends in an ellipsis; no tooltips needed |
706
+ | `--floating` + `--vertical` + `--rail` | A rail of its own glass, docked or not: as high as its container, corners `--gl-tab-bar-rail-radius` (unset `--gl-radius-card`), padding `--gl-space-sm` / `--gl-space-xs`. With `--start` / `--end` as well, fixed at that edge: `top` / `bottom` and the side `--gl-tab-bar-floating-inset` (16px) plus the safe area; mirrored right to left |
707
+ | `.glass-tab-bar__leading` / `__trailing` | Places inside the bar before and after the items: in a column above them and at the far end (`margin-block-start: auto`), in a row before and after them; hide an empty one with `hidden` |
708
+ | `.glass-tab-bar__accessory-item` | The accessory over its name, `.glass-tab-bar__accessory-label` — the name is the button's `aria-label` too, so the visible one is `aria-hidden`; let a click on it press the button |
709
+
710
+ | Token | Unset | Effect |
711
+ |---|---|---|
712
+ | `--gl-tab-bar-rail-width` | `72px` | Width of the rail (a labelled one usually 96px) |
713
+ | `--gl-tab-bar-rail-item-height` | `62px` | Least height of an item in a rail with labels |
714
+ | `--gl-tab-bar-item-radius` | a capsule; `16px` in a rail with labels | Corners of the floating items, the labelled rail's items and the drop |
715
+ | `--gl-tab-bar-floating-inset` | `16px` | Distance of a floating rail at an edge from that edge and from the viewport's ends |
716
+ | `--gl-tab-bar-rail-radius` | `--gl-radius-card` | Corners of a floating rail, docked or not |
717
+
718
+ - **The page keeps the rail's side free**, its width plus the inset on both sides: `padding-inline-start: calc(var(--rail-width) + 2 * 16px)`.
719
+ - **In the flow** (no `--start` / `--end`) a floating rail is the same pane: as high as its container (a grid column), with `--gl-tab-bar-rail-radius` corners and room around its items. Only the compact upright pill without `--rail` — the one in `.glass-tab-bar-dock--vertical` — stays a capsule.
720
+ - **A compact top bar** looks like a segmented control with `--gl-tab-bar-icon-size: 18px`, `--gl-tab-bar-item-radius: 12px` and `--gl-tab-bar-active-weight: var(--gl-font-weight-semibold)` on `.glass-tab-bar--top`.
721
+ - GlassKit Elements: `<glk-tab-bar floating orientation="vertical" dock="start" rail="labels">`, the mark and `<glk-tab-accessory show-label>` in `slot="leading"`, the foot in `slot="trailing"`.
722
+
670
723
  ---
671
724
 
672
725
  ### 3.5 Title
@@ -784,6 +837,7 @@ Tags and labels.
784
837
  | `.glass-badge--error` | Red |
785
838
  | `.glass-badge--interactive` | Pressable chip — cursor, hover tint, focus ring, press feedback |
786
839
  | `.glass-badge--selected` | The chip that is on |
840
+ | `.glass-badge--md` | A chip to choose with (since 1.33.0): `--gl-badge-md-height` (36px) high, in the small text of a form; with `--interactive` a tap target of 44px |
787
841
 
788
842
  **Chips (since 1.12.0).** A badge doubles as a filter chip. Use a real `<button>` and carry the state in `aria-pressed`, so the row is operable by keyboard and announced as a toggle — the classes only paint it.
789
843
 
@@ -794,6 +848,13 @@ Tags and labels.
794
848
  aria-pressed="false">Applied</button>
795
849
  ```
796
850
 
851
+ **Choice chips (since 1.33.0).** `--md` sizes a chip for a choice in a form — a row of sectors in a sign-up — 36px high (`--gl-badge-md-height`) in `--gl-font-size-sm`. Interactive, it takes taps 4px above and below its edges, 44px in all, the target every other control keeps; leave at least 8px between the lines of a wrapping row so the targets meet without overlapping. Never bend `--gl-space-2xs` or `--gl-font-size-xs` to make chips taller.
852
+
853
+ ```html
854
+ <button class="glass-badge glass-badge--md glass-badge--interactive glass-badge--selected" aria-pressed="true">Café &amp; bakery</button>
855
+ <button class="glass-badge glass-badge--md glass-badge--interactive" aria-pressed="false">Restaurant</button>
856
+ ```
857
+
797
858
  `--selected` deepens the color the badge already carries rather than overruling it, so `glass-badge--success glass-badge--selected` stays green. Each variant points `--gl-badge-accent` at its own color; set that variable on a single badge to give one chip a color of its own. Both states paint through a full-bleed inset shadow instead of `background`, so they layer over a variant's gradient without wiping it.
798
859
 
799
860
  Since 1.7.0 each variant is built from tokens rather than fixed `rgba()` literals —
@@ -1028,6 +1089,8 @@ Date and time fields (`type="date"`, `time`, `datetime-local`, `month`) take the
1028
1089
  | `.glass-input-wrap` | Box around the input that holds a prefix and/or suffix (since 1.22.0) |
1029
1090
  | `.glass-input-wrap__prefix` / `__suffix` | Icon, currency, unit or button at the field's start / end (logical: they swap sides under `dir="rtl"`) |
1030
1091
  | `.glass-input-wrap--prefix` / `--suffix` | Makes room in the field; also automatic where `:has()` is supported |
1092
+ | `.glass-input-group--label-end` | The group draws `__label-end` on the label's line, at its end (since 1.33.0) |
1093
+ | `.glass-input-group__label-end` | A link such as "Forgot password?", written **after** the field so the keyboard reaches it after the field |
1031
1094
 
1032
1095
  **Prefix and suffix (since 1.22.0).** The affixes lie on the field, centred; its padding grows by `--gl-input-prefix-size` / `--gl-input-suffix-size` (18px — an icon — unless set; set it for a wider unit). A click on text, an icon or a disabled control reaches the field; enabled controls, links and elements with `tabindex` take their own, form-associated custom elements such as `<glk-button>` included (since 1.22.2 — before, a disabled button took the click and a `<glk-button>` got none). They take it even inside a container locked with `pointer-events: none`: lock it with `inert`, or disable them. `<glk-input>` in GlassKit Elements has `prefix` / `suffix` slots on this and measures the width itself.
1033
1096
 
@@ -1043,6 +1106,16 @@ Date and time fields (`type="date"`, `time`, `datetime-local`, `month`) take the
1043
1106
 
1044
1107
  **Long values, empty labels, picker icon (since 1.25.0).** A value or placeholder too long for the field ends in an ellipsis while the field is not being edited, and a `.glass-label` without text takes no room (`:empty`; it used to keep the group's 8px gap). Date and time fields keep the browser's own picker button; `--gl-input-picker-icon: none` hides it in Chromium (WebKit and Firefox draw none to hide) — for a field whose prefix is the picker; call `showPicker()` from it then. It also hides the arrow of a field with a `<datalist>`.
1045
1108
 
1109
+ **At the end of the label row (since 1.33.0).** A link on the line of the label, such as "Forgot password?" beside "Password": write `.glass-input-group__label-end` after the field and add `--label-end` to the group. The group becomes a grid that draws the link at the end of the label's line, in the label's small text; in the tab order it stays after the field — e-mail, password, "Forgot password?", sign in, the order that reads best in a sign-in form. It works the same around a `.glass-textarea` or `.glass-select`. Never position the link absolutely over the label row. In GlassKit Elements: `slot="label-end"` on `<glk-input>`, `<glk-textarea>` and `<glk-select>`.
1110
+
1111
+ ```html
1112
+ <div class="glass-input-group glass-input-group--label-end">
1113
+ <label class="glass-label" for="password">Password</label>
1114
+ <input class="glass-input" id="password" type="password">
1115
+ <a class="glass-input-group__label-end" href="/reset">Forgot password?</a>
1116
+ </div>
1117
+ ```
1118
+
1046
1119
  ---
1047
1120
 
1048
1121
  ### 3.15 Textarea
@@ -2598,6 +2671,10 @@ Key points:
2598
2671
  | The native `title` attribute as the tooltip of an icon button | `.glass-tooltip` (3.36) — `title` shows neither on keyboard focus nor on touch |
2599
2672
  | Commands behind a button as plain buttons in a popover, without menu roles | `.glass-menu` with `role="menu"` / `menuitem` (3.37), the keyboard from `<glk-menu>` |
2600
2673
  | `›` or `/` typed between breadcrumbs | Leave them out — `.glass-breadcrumbs__item` draws the chevron, hidden from screen readers and mirrored right to left |
2674
+ | `--gl-radius-full` changed on the tab bar to round its drop and items | `--gl-tab-bar-item-radius` (since 1.33.0); the global token shapes every pill and badge |
2675
+ | A wrapper around a floating vertical bar that draws the rail's glass, with the mark and the accessory as its siblings | `--floating --vertical --start` with `--rail --labels`, the mark and `__accessory-item` in `__leading` (since 1.33.0) |
2676
+ | `--gl-space-2xs` / `--gl-font-size-xs` raised on a chip to make it taller | `.glass-badge--md` (since 1.33.0) |
2677
+ | A "Forgot password?" link positioned absolutely over the label row | `.glass-input-group--label-end` with `__label-end` after the field (since 1.33.0) |
2601
2678
  | `position: sticky` on `th` inside `.glass-table-wrap` | `.glass-table-wrap--sticky` + `.glass-table--sticky` (since 1.32.0) — a wrap that scrolls sideways is a scroll container in both directions |
2602
2679
  | `.glass-popover` without `[popover]` inside a card or a scrolling box that clips | Open it in the top layer with the `popover` attribute (since 1.32.0) |
2603
2680
  | Overriding `height` of `.glass-btn`, `.glass-input` etc. for a denser UI | `data-density="compact"` on `<html>`, or set a density token — toggle thumb and label alignment follow the tokens, not a hand-set `height` |
@@ -2615,12 +2692,12 @@ Key points:
2615
2692
  | Title | `.glass-title` | – |
2616
2693
  | Card | `.glass-card` | `--glow` |
2617
2694
  | Button | `.glass-btn` | `--primary`, `--secondary`, `--tertiary`, `--sm`, `--lg`, `--auto`, `:disabled` |
2618
- | Badge | `.glass-badge` | `--primary`, `--success`, `--warning`, `--error`, `--interactive`, `--selected` |
2695
+ | Badge | `.glass-badge` | `--primary`, `--success`, `--warning`, `--error`, `--interactive`, `--selected`, `--md` |
2619
2696
  | Avatar | `.glass-avatar` | `--sm`, `--lg` |
2620
2697
  | Divider | `.glass-divider` | – |
2621
2698
  | Status | `.glass-status` | – |
2622
2699
  | Input | `.glass-input` | `--error`, `:disabled`; `.glass-input-wrap` with `__prefix` / `__suffix`, `--prefix` / `--suffix` |
2623
- | Input Group | `.glass-input-group` | – |
2700
+ | Input Group | `.glass-input-group` | `--label-end` with `__label-end` |
2624
2701
  | Label | `.glass-label` | – |
2625
2702
  | Hint | `.glass-hint` | `--error` |
2626
2703
  | Textarea | `.glass-textarea` | `:disabled` |
@@ -2633,7 +2710,7 @@ Key points:
2633
2710
  | Progress | `.glass-progress` | `--sm`, `--lg`, `--success`, `--error` |
2634
2711
  | Modal | `.glass-modal-overlay` | `.is-active` |
2635
2712
  | Toast | `.glass-toast` | `--success`, `--error`, `--warning`, `.is-visible`, `__action`, `__close` |
2636
- | Tab Bar | `.glass-tab-bar` | `.is-active` on items, `__icon`, `__label`, `__badge`, `--floating`, `--droplet`, `--vertical`, `--start`, `--end`, `--rail`, `--top`; `.glass-tab-bar-dock--vertical`, `-dock--start` / `--end` |
2713
+ | Tab Bar | `.glass-tab-bar` | `.is-active` on items, `__icon`, `__label`, `__badge`, `__leading`, `__trailing`, `__accessory-item`, `__accessory-label`, `--floating`, `--droplet`, `--vertical`, `--start`, `--end`, `--rail`, `--labels`, `--top`; `.glass-tab-bar-dock--vertical`, `-dock--start` / `--end` |
2637
2714
  | Accordion | `.glass-accordion` | `.is-open` on items |
2638
2715
  | List | `.glass-list` | `--flush`, `--bare`, `__item--interactive`, `__item--center`, `__item--danger`, `__item--accent`, `__leading--lg`, `__subtitle--wrap`, `__value`, `__section-header`, `.is-flash` on items |
2639
2716
  | Popover | `.glass-popover` | `--top`, `--start`, `--end`, `.is-open`, `[popover]`, `[data-side]` |