@guildofgleks/ui 21.4.4 → 21.5.1

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/AGENTS.md CHANGED
@@ -5,7 +5,9 @@ an app that **consumes** the published `@guildofgleks/ui` npm package. It is not
5
5
  authoring the library — if you are working inside the `gleks_web_ui` monorepo itself, read
6
6
  `.github/instructions/*.md` instead.
7
7
 
8
- Everything below reflects the library's actual source as of **`21.4.4`**. `README.md` covers the
8
+ Everything below reflects the library's actual source as of **`21.5.1`**. 21.5.0 removed a batch
9
+ of deprecated API — see **Removed in 21.5.0** near the end of this file, which exists so code
10
+ written against 21.4.x can be migrated — and `CHANGELOG.md` has the rest. `README.md` covers the
9
11
  same ground at a higher level — install, setup, theming, global configuration — and is accurate;
10
12
  this file goes further, into per-component input tables, and is the one to trust for exact names,
11
13
  types and defaults.
@@ -168,17 +170,33 @@ Full model is in `README.md`'s Theming section and `theming.md`; short version:
168
170
 
169
171
  - Every visual value (color, spacing, radius, shadow, duration) is a `--gog-*` CSS custom
170
172
  property, layered **foundation** (`--gog-accent-color`, `--gog-space-md`, …, restyles
171
- everything) → **component** (`--gog-btn-primary-bg`, …, one block per component)
172
- **instance** (`--gog-btn-bg`, …, deliberately undeclared escape hatch for one element).
173
+ everything) → **component** (`--gog-button-primary-bg`, …, one block per component, named after
174
+ the component's own element) → **instance** (`--gog-button-bg`, …, deliberately undeclared
175
+ escape hatch for one element).
176
+ - **Component prefixes are spelled out** since 21.5.0: `--gog-button-*`, `--gog-multiselect-*`,
177
+ `--gog-confirmation-dialog-*`. The abbreviated `--gog-btn-*`, `--gog-ms-*` and `--gog-confirm-*`
178
+ still resolve and are removed in 21.7.0 — don't write new code with them. The exception is
179
+ `--gog-input-*`, which is not an abbreviation: it is the shared text-field block that
180
+ `gog-inputfield` and `gog-textarea` both render, and it keeps that name.
173
181
  - Theme switch is a `data-theme` attribute, usually on `<html>`, toggled through the
174
182
  `ThemeService` (`inject(ThemeService).setTheme('dark')` / `.toggleTheme()` / `.theme` signal).
175
183
  Ships `light` and `dark`. Three more importable presets: `slate`, `one-dark`, `one-light`
176
184
  (`@guildofgleks/ui/styles/presets/<name>.css`).
177
- - Restyle one instance without touching a theme: `<gog-button style="--gog-btn-bg: #ff4edb">`.
185
+ - Restyle one instance without touching a theme: `<gog-button style="--gog-button-bg: #ff4edb">`.
178
186
  - Build a custom theme by declaring a palette against a new `data-theme` value (see
179
187
  `theming.md` for the full worked example) — component tokens re-derive automatically, you
180
188
  don't restate them.
181
189
 
190
+ ## Right-to-left
191
+
192
+ Supported since 21.5.0. `dir="rtl"` on `<html>` or on any wrapper mirrors every component —
193
+ you write nothing per component. Portaled overlays (select/multiselect panels, tooltip bubbles)
194
+ copy a _scoped_ `dir` onto themselves, so an RTL region inside an LTR page works too.
195
+
196
+ Physical by design, in both directions: `gogTooltip [position]="'left' | 'right'"` and
197
+ `ToastConfig.position` (`'top-right'`, …). Use the tooltip's `'auto'` for direction-aware
198
+ placement; a toast corner is a deliberate choice, so it is not mirrored.
199
+
182
200
  ## Global configuration — `GOG_CONFIG` / `provideGogConfig(...)`
183
201
 
184
202
  For the handful of inputs an app typically wants to set once (a size for every form control, a
@@ -604,7 +622,7 @@ not from `value`, since `value` clears the moment the text stops matching the se
604
622
  | `indeterminate`, `disabled`, `fullWidth` | `boolean` | `false` |
605
623
 
606
624
  Model: `checked: boolean`. CVA: yes. Slot: `<ng-template gogCheckboxIcon>` for a custom tick
607
- icon (replaces the deprecated `checkIconTemplate` input).
625
+ icon.
608
626
 
609
627
  ```html
610
628
  <gog-checkbox label="I agree to the terms" formControlName="agree" />
@@ -907,7 +925,7 @@ Outputs: `gogClick: MouseEvent | KeyboardEvent`, `gogRemove: void`.
907
925
  | `iconName` | `GogIconName \| null` | `null` |
908
926
  | `fullWidth` | `boolean` | `false` |
909
927
 
910
- Slot: `<ng-template gogTagIcon>` for custom icon markup (replaces the deprecated `iconTemplate`).
928
+ Slot: `<ng-template gogTagIcon>` for custom icon markup.
911
929
 
912
930
  ```html
913
931
  <gog-tag variant="success">Active</gog-tag>
@@ -1042,6 +1060,12 @@ Model: `open: boolean`.
1042
1060
  </gog-collapsible>
1043
1061
  ```
1044
1062
 
1063
+ **The trigger can be any element.** On a `<button>` or `<a href>` the directive adds only the
1064
+ ARIA wiring, because the browser already handles focus and keys. On anything else — a `<div>`, a
1065
+ `<span>` — it also supplies `role="button"`, `tabindex="0"` and Enter/Space, so the control it
1066
+ announces is one a keyboard can actually reach. If you set `role` or `tabindex` yourself, the
1067
+ directive leaves both alone: you have said what the element is.
1068
+
1045
1069
  An open panel is as tall as its content — `--gog-collapsible-max-height` defaults to
1046
1070
  `max-content`. Set it to a length on an instance to cap one deliberately; the panel is
1047
1071
  `overflow: hidden`, so a cap **clips** rather than scrolls. (Before 21.4.4 that default was
@@ -1298,6 +1322,75 @@ Methods (via template ref): `scrollTo(options)`, `scrollToTop()`, `scrollToBotto
1298
1322
 
1299
1323
  ### Overlays
1300
1324
 
1325
+ **Overlays and the viewport — the caveat that bites once per project.** `gog-dialog`'s backdrop,
1326
+ `gog-toast-container` and `gog-spinner [overlay]` are `position: fixed`, which covers the viewport
1327
+ only while no ancestor establishes a containing block. `contain`, `transform`, `filter`,
1328
+ `backdrop-filter` or `will-change` anywhere above retargets them to that element's box — and
1329
+ **`gog-scroll` sets `contain: layout style`**, so a dialog opened inside a scroller dims the
1330
+ scroller rather than the page. Place the dialog and toast outlets in the root component. The
1331
+ dropdown panels and `gog-menu` sidestep it by rendering into `<body>`.
1332
+
1333
+ #### `gog-menu` + `gogMenuTrigger` / `gogMenuItem`
1334
+
1335
+ A command menu. The trigger is a directive on **your own button** — usually the icon button you
1336
+ already styled — and the items are your own buttons too, so an item can hold an icon, a label and
1337
+ a shortcut hint without an input per piece:
1338
+
1339
+ ```html
1340
+ <button gogButton variant="ghost" [gogMenuTrigger]="rowMenu" aria-label="Row actions">
1341
+ <gog-icon name="more-vertical" />
1342
+ </button>
1343
+
1344
+ <gog-menu #rowMenu ariaLabel="Row actions">
1345
+ <button gogMenuItem (click)="edit(row)"><gog-icon name="check" /> Edit</button>
1346
+ <button gogMenuItem disabled>Transfer ownership</button>
1347
+ <button gogMenuItem (click)="remove(row)"><gog-icon name="close" /> Remove</button>
1348
+ </gog-menu>
1349
+ ```
1350
+
1351
+ | Input | Type | Default | Notes |
1352
+ | ----------- | -------------------------- | -------- | ---------------------------------------------------------------------------- |
1353
+ | `direction` | `'auto' \| 'up' \| 'down'` | `'auto'` | `'auto'` drops down whenever the panel fits and flips up only when it cannot |
1354
+ | `ariaLabel` | `string` | `''` | Names the panel itself |
1355
+
1356
+ **There is no `appendToBody`.** The panel always renders into `<body>` and is placed from the
1357
+ trigger's measured rect, so a menu inside `gog-scroll`, `gog-table` or any `overflow: hidden`
1358
+ ancestor is not clipped and needs no configuration. It also takes the `--gog-dropdown-z` its
1359
+ trigger inherits, so a menu opened inside a `gog-dialog` stacks above the dialog.
1360
+
1361
+ Output: `gogClosed` — fires after every close, whatever caused it.
1362
+
1363
+ Public methods, for driving it yourself: `open(trigger, 'first' | 'last')`, `close(restoreFocus?)`,
1364
+ `toggle(trigger)`, and the `isOpen` signal.
1365
+
1366
+ **Keyboard**, the WAI-ARIA menu button pattern: Enter/Space/ArrowDown open with the first item
1367
+ focused, ArrowUp opens with the last, arrows and Home/End move between items and step over
1368
+ disabled ones, Escape closes and returns focus to the trigger, Tab closes and lets focus move on.
1369
+ A press outside closes without pulling focus back.
1370
+
1371
+ **Disabling an item** is the native `disabled` attribute on your own button — static or bound,
1372
+ there is no input for it:
1373
+
1374
+ ```html
1375
+ <button gogMenuItem disabled>Transfer ownership</button>
1376
+ <button gogMenuItem [disabled]="isLocked()" (click)="edit()">Edit</button>
1377
+ ```
1378
+
1379
+ A disabled item stays in the list rather than disappearing (removing it would shift the others
1380
+ under the pointer), the arrow keys step over it, and clicking it does nothing.
1381
+
1382
+ **A long menu scrolls itself**, using `gog-scroll` — the same thin, auto-hiding scroller as
1383
+ everywhere else in the package, with `overscrollBehavior="contain"` so a wheel at the end of the
1384
+ list does not scroll the page behind it. Arrowing past the last visible item scrolls it into view.
1385
+
1386
+ The panel's height is the smallest of three: its own content, `--gog-menu-max-height` (320px by
1387
+ default), and the room between the trigger and the viewport edge. Lower the token to make a menu
1388
+ scroll sooner. **In 21.5.0 the token did nothing** — the measured room was written onto the panel
1389
+ as an inline `max-height`, which beat it; fixed in 21.5.1.
1390
+
1391
+ A closed menu renders nothing at all, so its commands are not in the accessibility tree until it
1392
+ opens.
1393
+
1301
1394
  #### `gog-dialog`
1302
1395
 
1303
1396
  A **single** `<gog-dialog />` renders **every** dialog `DialogService.open(...)` creates —
@@ -1335,24 +1428,45 @@ screen readers, and a second region would announce everything twice. Don't add e
1335
1428
 
1336
1429
  ---
1337
1430
 
1338
- ## Deprecated patterns do not use in new code
1431
+ ## Reading the deprecations at runtime `GOG_DEPRECATIONS`
1339
1432
 
1340
- These still work (nothing breaks if you use them), but are marked `@deprecated` and **will be
1341
- removed** on the stated schedule. Don't generate new code using any of them — use the listed
1342
- replacement instead.
1433
+ Everything the package currently deprecates, as data:
1343
1434
 
1344
- | Deprecated | Removed in | Replacement |
1345
- | ---------------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------------------- |
1346
- | `GogSelectOption`, `GogMultiselectOption` type aliases | `21.4.0` | `GogDropdownOption` |
1347
- | `gog-select`/`gog-multiselect` `chevronTemplate` input | `21.5.0` | `<ng-template gogDropdownChevron>` |
1348
- | `gog-checkbox` `checkIconTemplate` input | `21.5.0` | `<ng-template gogCheckboxIcon>` |
1349
- | `gog-tag` `iconTemplate` input | `21.5.0` | `<ng-template gogTagIcon>` |
1350
- | `gog-multiselect` `clearIconTemplate` input | `21.5.0` | `<ng-template gogMultiselectClearIcon>` |
1351
- | `gog-inputfield` `iconStartTemplate`/`iconEndTemplate`/`iconStartFn`/`iconEndFn`/`iconStartLabel`/`iconEndLabel` | `21.5.0` | `<span gogInputAddonStart>`/`<span gogInputAddonEnd>` (or a `<button>` with its own handler) |
1352
- | `gog-table`'s `[template]` attribute (`<ng-template template="field" type="body">`) | `21.5.0` | `<ng-template gogColumnBody>` / `<ng-template gogColumnHeader>` declared **inside** the matching `<gog-column>` |
1353
- | `<column>` selector / `Column` export | `21.5.0` | `<gog-column>` / `GogColumn` |
1435
+ ```ts
1436
+ import { GOG_DEPRECATIONS, type GogDeprecation } from '@guildofgleks/ui';
1437
+
1438
+ GOG_DEPRECATIONS.filter((entry) => entry.removedIn === '21.7.0');
1439
+ // { kind: 'token', name: '--gog-btn-bg', replacement: '--gog-button-bg',
1440
+ // since: '21.5.0', sinceDate: '2026-08-19', removedIn: '21.7.0' }
1441
+ ```
1354
1442
 
1355
- The general rule they all follow: a `TemplateRef` **input** or a string-keyed lookup is the old
1443
+ `kind` is `'symbol'` for an export or input and `'token'` for a `--gog-*` custom property. The
1444
+ list is generated from the library's source — tags for symbols, stylesheets for tokens — so it
1445
+ matches what actually still resolves in the version you installed.
1446
+
1447
+ **In 21.5.0 it holds 154 tokens and no symbols.** Nothing in the TypeScript API is deprecated
1448
+ right now; the three abbreviated token prefixes are, until 21.7.0.
1449
+
1450
+ ## Removed in 21.5.0
1451
+
1452
+ **Nothing in this table exists any more.** It is here so that code written against 21.4.x — or
1453
+ generated from a stale copy of this file — can be migrated: each row names what a call site must
1454
+ become. If you are writing new code, ignore this section entirely and use the right-hand column,
1455
+ which is documented in full above.
1456
+
1457
+ | Removed | Replacement |
1458
+ | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
1459
+ | `gog-select`/`gog-multiselect` `chevronTemplate` input | `<ng-template gogDropdownChevron>` |
1460
+ | `gog-checkbox` `checkIconTemplate` input | `<ng-template gogCheckboxIcon>` |
1461
+ | `gog-tag` `iconTemplate` input | `<ng-template gogTagIcon>` |
1462
+ | `gog-multiselect` `clearIconTemplate` input | `<ng-template gogMultiselectClearIcon>` |
1463
+ | `gog-inputfield` `iconStartTemplate`/`iconEndTemplate`/`iconStartFn`/`iconEndFn`/`iconStartLabel`/`iconEndLabel` | `<span gogInputAddonStart>`/`<span gogInputAddonEnd>` (or a `<button>` with its own handler) |
1464
+ | `gog-table`'s `[template]` attribute (`<ng-template template="field" type="body">`) | `<ng-template gogColumnBody>` / `<ng-template gogColumnHeader>` declared **inside** the matching `<gog-column>` |
1465
+ | `<column>` selector / `Column` export | `<gog-column>` / `GogColumn` |
1466
+ | `GogSelectOption` / `GogMultiselectOption` types | `GogDropdownOption` (the same type — they were aliases of it) |
1467
+ | `@guildofgleks/ui/src/styles/…` asset path | `@guildofgleks/ui/styles/…` |
1468
+
1469
+ The general rule they all followed: a `TemplateRef` **input** or a string-keyed lookup was the old
1356
1470
  shape; a **projected content directive with a typed context**, declared where it's used, is the
1357
1471
  current one. If you're about to write `fooTemplate` next to an existing `foo` input, or key
1358
1472
  something off a string that has to match another string elsewhere, that's this exact
package/CHANGELOG.md CHANGED
@@ -4,32 +4,266 @@ All notable changes to `@guildofgleks/ui` are documented here. Format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.0.0/); this project has not yet
5
5
  reached 1.0, so breaking changes may land in minor versions.
6
6
 
7
+ ## [21.5.1] - planned
8
+
9
+ Two defects 21.5.0 shipped, both of the same shape: correct-looking CSS whose effect was cancelled
10
+ by something else in the box model, and neither visible to a test suite that runs without a style
11
+ engine. Both were found by opening the components in a browser while writing the documentation
12
+ site's pages for them. No input, output, type or public token changed, so upgrading from 21.5.0 is
13
+ a version bump with nothing to migrate.
14
+
15
+ ### Fixed
16
+
17
+ - **`--gog-menu-max-height` now caps the panel.** It never did: `gog-menu` measured the room
18
+ between its trigger and the viewport edge and wrote that onto the panel as an inline
19
+ `max-height`, which beats the stylesheet rule the token feeds. Setting
20
+ `--gog-menu-max-height: 150px` on a page with 500px of room changed nothing, and a menu of any
21
+ length simply grew until it ran out of screen.
22
+
23
+ The measured room is now handed to CSS as `--gog-menu-available-height` and `menu.css` takes the
24
+ smaller of the two, so a panel's height is the least of its content, the token, and the room
25
+ available. Lower the token to make a menu start scrolling sooner.
26
+
27
+ A menu that flips **up** is now anchored by its `bottom` rather than by a `top` computed from
28
+ its expected height. That is what makes the cap safe: with the old arithmetic, a panel the token
29
+ cut short would have floated away from its trigger by exactly the height it did not take.
30
+
31
+ - **Text no longer runs underneath a field's own icon in RTL.** `gog-inputfield`, `gog-select`,
32
+ `gog-autocomplete` and `gog-datepicker` each reserve a gutter for their leading or trailing
33
+ chrome. The chrome is placed with `inset-inline-start` / `inset-inline-end` — logical — but the
34
+ gutter was a physical `padding-left`/`padding-right`, so under `dir="rtl"` the two ended up on
35
+ opposite sides: the icon at one edge, the space kept for it stranded at the other, and the value
36
+ or placeholder rendering under the icon. A floating label offset itself by the wrong gutter for
37
+ the same reason, and a clearable `gog-select` was padded on both sides at once.
38
+
39
+ All four now use `padding-block` + `padding-inline`. `gog-inputfield`'s two internal properties
40
+ are renamed to match what they now mean — `--gog-input-pl`/`-pr` became `--gog-input-ps`/`-pe`
41
+ (inline **start** / **end**). Neither was ever public: they are not in `GogTokenName`, not in
42
+ `TOKENS.md` and not declared in `theme.css`, so nothing a consumer can have written changes.
43
+ Left-to-right rendering is byte-for-byte what it was.
44
+
45
+ **`npm run check:logical-properties` now fails the build** on a `padding`, `margin`,
46
+ `border-width` or `border-radius` shorthand that sets the two horizontal sides differently.
47
+ 21.5.0 converted 16 stylesheets to logical properties and still missed these four, because the
48
+ sidedness lives in a value's *position inside a shorthand* rather than in a `left`/`right`
49
+ keyword — invisible to a grep, and invisible to a unit test with no style engine.
50
+
51
+ - **Documented the `position: fixed` containing-block caveat**, in one place plus a line on each
52
+ overlay it affects. `gog-dialog`'s backdrop, `gog-toast-container` and
53
+ `gog-spinner [overlay]` cover the viewport only while no ancestor establishes a containing
54
+ block — `contain`, `transform`, `filter`, `backdrop-filter` or `will-change` above them
55
+ retargets the overlay to that element's box, with no error and no warning. `gog-scroll` sets
56
+ `contain: layout style`, so this library can trigger it on its own: a dialog opened inside a
57
+ scroller dims the scroller. Nothing changed in behaviour; what changed is that the behaviour is
58
+ now written down where you meet it — README's "Overlays and the viewport", `AGENTS.md`, and the
59
+ TSDoc of each overlay.
60
+
7
61
  ## [21.5.0] - planned
8
62
 
9
63
  **The breaking release** — the one version consumers have to read before upgrading into. It
10
- carries the removals below and, per `docs/hardening-21.5.0.md`, the token-prefix rename
11
- (`--gog-ms-*`, `--gog-btn-*`, `--gog-input-*` spelled out in full). Everything non-breaking that
12
- is ready today ships in 21.4.4 instead, so a reader upgrading to 21.4.4 has nothing to migrate
13
- and a reader upgrading to 21.5.0 has one list to work through rather than one buried among fixes.
64
+ carries the removals below and the token-prefix rename (`--gog-btn-*`, `--gog-ms-*` and
65
+ `--gog-confirm-*` spelled out; the old spellings keep working until 21.7.0). Everything
66
+ non-breaking that was ready earlier shipped in 21.4.4 instead, so a reader upgrading to 21.4.4 has
67
+ nothing to migrate and a reader upgrading to 21.5.0 has one list to work through rather than one
68
+ buried among fixes.
14
69
 
15
70
  ### Removed
16
71
 
17
- Not done yet this section records what the version owes. Fourteen public symbols carry an
18
- `@deprecated … Removed in 21.5.0` tag naming its own replacement:
72
+ Everything deprecated for this version is gone. **All of it was announced with a replacement in
73
+ 21.3.0 or earlier**, and every replacement has shipped since then, so each item below is a
74
+ mechanical edit at the call site rather than a redesign. If you are on 21.4.x, your editor has
75
+ been striking these through already.
76
+
77
+ **Per-slot `TemplateRef` inputs → projected slot directives.** Declare the template where it is
78
+ used; it no longer has to be wired through an input, and it carries a typed context.
79
+
80
+ | Removed input | Replacement |
81
+ | ---------------------------------------------------- | --------------------------------------- |
82
+ | `gog-checkbox` `[checkIconTemplate]` | `<ng-template gogCheckboxIcon>` |
83
+ | `gog-tag` `[iconTemplate]` | `<ng-template gogTagIcon>` |
84
+ | `gog-multiselect` `[clearIconTemplate]` | `<ng-template gogMultiselectClearIcon>` |
85
+ | `gog-select` / `gog-multiselect` `[chevronTemplate]` | `<ng-template gogDropdownChevron>` |
86
+
87
+ ```html
88
+ <!-- before -->
89
+ <gog-tag [iconTemplate]="star">Featured</gog-tag>
90
+ <ng-template #star><gog-icon name="check" /></ng-template>
91
+
92
+ <!-- after -->
93
+ <gog-tag>
94
+ <ng-template gogTagIcon><gog-icon name="check" /></ng-template>
95
+ Featured
96
+ </gog-tag>
97
+ ```
98
+
99
+ **`gog-inputfield`'s six legacy icon inputs** — `iconStartTemplate`, `iconEndTemplate`,
100
+ `iconStartFn`, `iconEndFn`, `iconStartLabel`, `iconEndLabel` — replaced by projecting a real
101
+ element into the field's leading or trailing slot. A projected `<button gogInputAddonEnd>` carries
102
+ its own click handler, its own `aria-label` and its own disabled state, which is why six inputs
103
+ collapse into none:
104
+
105
+ ```html
106
+ <!-- before -->
107
+ <gog-inputfield label="Search" iconEnd="check" [iconEndFn]="run" iconEndLabel="Search" />
108
+
109
+ <!-- after -->
110
+ <gog-inputfield label="Search">
111
+ <button gogInputAddonEnd type="button" aria-label="Search" (click)="run()">
112
+ <gog-icon name="check" />
113
+ </button>
114
+ </gog-inputfield>
115
+ ```
116
+
117
+ `iconStart` / `iconEnd` stay, and are now unambiguously **decorative**: they render an
118
+ `aria-hidden` span, never a button. The only action button `gog-inputfield` still renders for
119
+ itself is the password reveal toggle, whose labels remain `showPasswordLabel` /
120
+ `hidePasswordLabel`.
121
+
122
+ **`gog-table`'s string-keyed template slot.** `<ng-template template="field" type="body">` matched
123
+ a column by a string the compiler could not check — a typo silently rendered the default cell.
124
+ Declare the template inside the column it belongs to instead:
125
+
126
+ ```html
127
+ <!-- before -->
128
+ <gog-column field="status" />
129
+ <ng-template template="status" type="body" let-row>…</ng-template>
130
+
131
+ <!-- after -->
132
+ <gog-column field="status">
133
+ <ng-template gogColumnBody let-row let-value="value">…</ng-template>
134
+ </gog-column>
135
+ ```
136
+
137
+ The `TemplateDirective` export goes with it, along with the `GogTableBodyContext` /
138
+ `GogTableHeaderContext` types it carried — `GogColumnBodyContext` / `GogColumnHeaderContext` are
139
+ the typed replacements, and they are what the column-scoped templates have always used.
140
+
141
+ **The unprefixed table column names.** The `<column>` element selector and the `Column` const and
142
+ type are gone; use `<gog-column>` and `GogColumn`.
143
+
144
+ **The `GogSelectOption` and `GogMultiselectOption` type aliases.** Use `GogDropdownOption` — the
145
+ same type; both were aliases of it since 21.2.2. These two were announced for removal in **21.4.0**
146
+ and overran it by a minor: 21.4.0 through 21.4.4 all shipped with them still exported. Recorded
147
+ here rather than quietly re-dated, and `npm run check:deprecations` now fails the build on any
148
+ `@deprecated … Removed in <version>` tag whose version has already been reached, so no deprecation
149
+ can overrun its date again.
150
+
151
+ **The `@guildofgleks/ui/src/styles/…` asset path.** Stylesheets moved to `@guildofgleks/ui/styles/…`
152
+ in 21.3.2, with the old path documented as working until 21.5.0. The package no longer ships the
153
+ duplicate copy, and the `./src/styles/*` export is gone — if your `angular.json` still names the
154
+ long path, drop the `src/` segment.
155
+
156
+ ### Fixed
157
+
158
+ - **`gogCollapsibleTrigger` is reachable by keyboard on any element.** Its own documentation
159
+ invites a non-focusable host ("works on any clickable element"), and on one it used to apply
160
+ `aria-expanded`/`aria-controls` and nothing else: a control that announces itself to a screen
161
+ reader, with no tab stop and no response to Enter or Space — the one combination that strands
162
+ the person relying on that announcement.
163
+
164
+ On a host that is not natively operable the directive now also supplies `role="button"`,
165
+ `tabindex="0"` (`-1` while disabled) and Enter/Space. A `<button>` or `<a href>` is untouched,
166
+ since a second key handler would toggle twice in one press, and a `role`/`tabindex` you set
167
+ yourself is respected rather than overwritten.
168
+
169
+ ### Added
170
+
171
+ - **`GOG_DEPRECATIONS` — the deprecation manifest**, generated from the library's own source and
172
+ shipped in the public API:
173
+
174
+ ```ts
175
+ import { GOG_DEPRECATIONS } from '@guildofgleks/ui';
176
+
177
+ // → { kind: 'token', name: '--gog-btn-radius', replacement: '--gog-button-radius',
178
+ // since: '21.5.0', sinceDate: '2026-08-19', removedIn: '21.7.0' }
179
+ ```
180
+
181
+ It answers "is this still supported, and until when?" for tooling that has to mark an API row —
182
+ a docs site, an editor plugin, a codemod — without anyone maintaining a second list. Symbols
183
+ come from their `@deprecated` tags and tokens from the stylesheets that still resolve them, so
184
+ it cannot drift from the code.
19
185
 
20
- - the six legacy icon inputs on `gog-inputfield`;
21
- - the `checkIconTemplate` / `clearIconTemplate` / `iconTemplate` / `chevronTemplate` inputs;
22
- - the `<column>` element, with its `Column` const and type;
23
- - the string-keyed `[template]` column slot;
24
- - the `GogSelectOption` / `GogMultiselectOption` aliases — **these two overran their announced
25
- 21.4.0 removal**, which is the reason the date on this list is not moved again.
186
+ In this release it holds **154 tokens and no symbols**: 21.5.0 removed every deprecated symbol
187
+ the library had, and its deprecations are the three abbreviated token prefixes above. An empty
188
+ symbol half is the healthy state, not a broken generator.
26
189
 
27
- One more is promised in prose rather than by a tag, so it has no `@deprecated` to grep for and is
28
- the one most likely to be missed:
190
+ - **`gog-menu` a command menu**, with `[gogMenuTrigger]` on your own button and `gogMenuItem` on
191
+ your own items:
192
+
193
+ ```html
194
+ <button gogButton variant="ghost" [gogMenuTrigger]="rowMenu" aria-label="Row actions">
195
+ <gog-icon name="more-vertical" />
196
+ </button>
197
+
198
+ <gog-menu #rowMenu>
199
+ <button gogMenuItem (click)="edit(row)">Edit</button>
200
+ <button gogMenuItem disabled>Transfer ownership</button>
201
+ </gog-menu>
202
+ ```
203
+
204
+ The library created this gap itself: 21.4.0 added `more-horizontal`/`more-vertical` icons and a
205
+ table built for row actions, with nothing to open with them. Everything else a consumer can
206
+ assemble from what already ships; an accessible menu cannot be — it needs focus management,
207
+ roving focus and overlay placement at once.
208
+
209
+ Keyboard follows the WAI-ARIA menu button pattern: Enter/Space/ArrowDown open with the first
210
+ item focused, ArrowUp with the last, arrows and Home/End move and skip disabled items, Escape
211
+ closes and restores focus to the trigger, Tab closes and moves on.
212
+
213
+ Disable an item with the native `disabled` attribute on your own button — the arrow keys step
214
+ over it. The panel always renders into `<body>`, placed from the trigger's measured rect, so a
215
+ menu inside `gog-scroll`, `gog-table` or any clipping ancestor needs no configuration; it takes
216
+ the `--gog-dropdown-z` its trigger inherits, so a menu inside a dialog stacks above it. Past
217
+ `--gog-menu-max-height` the panel scrolls with `gog-scroll`. Themed by `--gog-menu-*`.
218
+
219
+ - **Right-to-left support.** `dir="rtl"` on `<html>` — or on any subtree — now mirrors every
220
+ component, with nothing to set per component. What changed under it: physical `left`/`right`
221
+ declarations became logical properties across 16 stylesheets; the select/multiselect panel and
222
+ the tooltip bubble copy a _scoped_ `dir` onto their portaled host, so an RTL region inside an
223
+ LTR page renders correctly; a tooltip's `position="auto"` prefers the mirrored horizontal side;
224
+ the calendar's month/year arrows turn around; and the slider fill, toast progress bar and
225
+ indeterminate progressbar run from the inline start.
226
+
227
+ Physical by design, because they are physical words in the API: a tooltip's explicit
228
+ `position="left"`/`"right"`, and a toast's `top-left`/`top-right`/`bottom-left`/`bottom-right`.
229
+
230
+ Three CSS custom properties are declared for the handful of properties with no logical form
231
+ (`transform-origin`, `translate`): `--gog-inline-start-side`, `--gog-inline-end-side` (the
232
+ `left`/`right` keywords) and `--gog-direction-sign` (`1`/`-1`). They flip on `[dir='rtl']` and
233
+ are available to your own styles.
234
+
235
+ ### Changed
29
236
 
30
- - the **`./src/styles/*` export** in `package.json`. Stylesheets moved to `./styles/*` in 21.3.2
31
- and the README says the old path "keeps working until 21.5.0". Removing it breaks anyone still
32
- importing `@guildofgleks/ui/src/styles/…`, and the README paragraph promising it goes too.
237
+ - **Component token prefixes are spelled out.** Three families were abbreviations of a
238
+ component's name — the one thing a consumer cannot guess and now read as the component does:
239
+
240
+ | Was | Is |
241
+ | ----------------- | ------------------------------------------------------------ |
242
+ | `--gog-btn-*` | `--gog-button-*` |
243
+ | `--gog-confirm-*` | `--gog-confirmation-dialog-*` |
244
+ | `--gog-ms-*` | `--gog-multiselect-*` (since 21.3.0; the removal moved here) |
245
+
246
+ **Nothing breaks now.** Every old spelling still feeds the component: each replacement declares
247
+ it in its own fallback (`--gog-button-md-padding: var(--gog-btn-md-padding, 0.75rem 1.25rem)`),
248
+ and the per-instance names (`--gog-btn-bg`, `--gog-btn-padding`, …) are still read by the
249
+ button's own fallback chain. Override either spelling, at any scope, and it applies —
250
+ verified in a browser rather than reasoned about, for a theme block, a nested `[data-theme]`
251
+ subtree and an inline instance override.
252
+
253
+ **They are removed in 21.7.0** — two minors rather than one, because a CSS custom property that
254
+ nothing reads fails silently: no error, no warning, just a value that stops applying. Migration
255
+ is a find-and-replace on those three prefixes. `TOKENS.md` lists only the current names.
256
+
257
+ One prefix that looks abbreviated and is staying: **`--gog-input-*`**. It names the text-field
258
+ block that `gog-inputfield` and `gog-textarea` both render, not the `gog-inputfield` component —
259
+ the two restyle together from one token set on purpose, so there is no `--gog-inputfield-*`.
260
+
261
+ - **`peerDependencies` now accept Angular 22** (`^21.2.0 || ^22.0.0` for `@angular/common`,
262
+ `@angular/core`, `@angular/forms`, `@angular/platform-browser`) instead of `^21.2.0` alone.
263
+ The library ships partial-compiled (Ivy partial mode), which is forward-compatible with the
264
+ next major without a rebuild — the strict `^21.2.0` peer range was blocking installation into
265
+ an Angular 22 app that otherwise built and ran fine, forcing every such consumer to reach for
266
+ `overrides`/`resolutions` as a workaround.
33
267
 
34
268
  ## [21.4.4] - 17.08.2026
35
269