@guildofgleks/ui 21.4.4 → 21.5.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/AGENTS.md CHANGED
@@ -5,8 +5,10 @@ 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
9
- same ground at a higher levelinstall, setup, theming, global configuration and is accurate;
8
+ Everything below reflects the library's actual source as of **`21.4.4`** plus the removals
9
+ already landed for the unreleased `21.5.0`see **Removed in 21.5.0** near the end of this file,
10
+ and `CHANGELOG.md`. `README.md` covers the same ground at a higher level — install, setup,
11
+ 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.
12
14
 
@@ -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,63 @@ Methods (via template ref): `scrollTo(options)`, `scrollToTop()`, `scrollToBotto
1298
1322
 
1299
1323
  ### Overlays
1300
1324
 
1325
+ #### `gog-menu` + `gogMenuTrigger` / `gogMenuItem`
1326
+
1327
+ A command menu. The trigger is a directive on **your own button** — usually the icon button you
1328
+ already styled — and the items are your own buttons too, so an item can hold an icon, a label and
1329
+ a shortcut hint without an input per piece:
1330
+
1331
+ ```html
1332
+ <button gogButton variant="ghost" [gogMenuTrigger]="rowMenu" aria-label="Row actions">
1333
+ <gog-icon name="more-vertical" />
1334
+ </button>
1335
+
1336
+ <gog-menu #rowMenu ariaLabel="Row actions">
1337
+ <button gogMenuItem (click)="edit(row)"><gog-icon name="check" /> Edit</button>
1338
+ <button gogMenuItem disabled>Transfer ownership</button>
1339
+ <button gogMenuItem (click)="remove(row)"><gog-icon name="close" /> Remove</button>
1340
+ </gog-menu>
1341
+ ```
1342
+
1343
+ | Input | Type | Default | Notes |
1344
+ | ----------- | -------------------------- | -------- | ---------------------------------------------------------------------------- |
1345
+ | `direction` | `'auto' \| 'up' \| 'down'` | `'auto'` | `'auto'` drops down whenever the panel fits and flips up only when it cannot |
1346
+ | `ariaLabel` | `string` | `''` | Names the panel itself |
1347
+
1348
+ **There is no `appendToBody`.** The panel always renders into `<body>` and is placed from the
1349
+ trigger's measured rect, so a menu inside `gog-scroll`, `gog-table` or any `overflow: hidden`
1350
+ ancestor is not clipped and needs no configuration. It also takes the `--gog-dropdown-z` its
1351
+ trigger inherits, so a menu opened inside a `gog-dialog` stacks above the dialog.
1352
+
1353
+ Output: `gogClosed` — fires after every close, whatever caused it.
1354
+
1355
+ Public methods, for driving it yourself: `open(trigger, 'first' | 'last')`, `close(restoreFocus?)`,
1356
+ `toggle(trigger)`, and the `isOpen` signal.
1357
+
1358
+ **Keyboard**, the WAI-ARIA menu button pattern: Enter/Space/ArrowDown open with the first item
1359
+ focused, ArrowUp opens with the last, arrows and Home/End move between items and step over
1360
+ disabled ones, Escape closes and returns focus to the trigger, Tab closes and lets focus move on.
1361
+ A press outside closes without pulling focus back.
1362
+
1363
+ **Disabling an item** is the native `disabled` attribute on your own button — static or bound,
1364
+ there is no input for it:
1365
+
1366
+ ```html
1367
+ <button gogMenuItem disabled>Transfer ownership</button>
1368
+ <button gogMenuItem [disabled]="isLocked()" (click)="edit()">Edit</button>
1369
+ ```
1370
+
1371
+ A disabled item stays in the list rather than disappearing (removing it would shift the others
1372
+ under the pointer), the arrow keys step over it, and clicking it does nothing.
1373
+
1374
+ **A long menu scrolls itself** past `--gog-menu-max-height`, using `gog-scroll` — the same thin,
1375
+ auto-hiding scroller as everywhere else in the package, with `overscrollBehavior="contain"` so a
1376
+ wheel at the end of the list does not scroll the page behind it. Arrowing past the last visible
1377
+ item scrolls it into view.
1378
+
1379
+ A closed menu renders nothing at all, so its commands are not in the accessibility tree until it
1380
+ opens.
1381
+
1301
1382
  #### `gog-dialog`
1302
1383
 
1303
1384
  A **single** `<gog-dialog />` renders **every** dialog `DialogService.open(...)` creates —
@@ -1335,24 +1416,45 @@ screen readers, and a second region would announce everything twice. Don't add e
1335
1416
 
1336
1417
  ---
1337
1418
 
1338
- ## Deprecated patterns do not use in new code
1419
+ ## Reading the deprecations at runtime `GOG_DEPRECATIONS`
1339
1420
 
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.
1421
+ Everything the package currently deprecates, as data:
1343
1422
 
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` |
1423
+ ```ts
1424
+ import { GOG_DEPRECATIONS, type GogDeprecation } from '@guildofgleks/ui';
1425
+
1426
+ GOG_DEPRECATIONS.filter((entry) => entry.removedIn === '21.7.0');
1427
+ // { kind: 'token', name: '--gog-btn-bg', replacement: '--gog-button-bg',
1428
+ // since: '21.5.0', sinceDate: '2026-08-19', removedIn: '21.7.0' }
1429
+ ```
1354
1430
 
1355
- The general rule they all follow: a `TemplateRef` **input** or a string-keyed lookup is the old
1431
+ `kind` is `'symbol'` for an export or input and `'token'` for a `--gog-*` custom property. The
1432
+ list is generated from the library's source — tags for symbols, stylesheets for tokens — so it
1433
+ matches what actually still resolves in the version you installed.
1434
+
1435
+ **In 21.5.0 it holds 154 tokens and no symbols.** Nothing in the TypeScript API is deprecated
1436
+ right now; the three abbreviated token prefixes are, until 21.7.0.
1437
+
1438
+ ## Removed in 21.5.0
1439
+
1440
+ **Nothing in this table exists any more.** It is here so that code written against 21.4.x — or
1441
+ generated from a stale copy of this file — can be migrated: each row names what a call site must
1442
+ become. If you are writing new code, ignore this section entirely and use the right-hand column,
1443
+ which is documented in full above.
1444
+
1445
+ | Removed | Replacement |
1446
+ | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
1447
+ | `gog-select`/`gog-multiselect` `chevronTemplate` input | `<ng-template gogDropdownChevron>` |
1448
+ | `gog-checkbox` `checkIconTemplate` input | `<ng-template gogCheckboxIcon>` |
1449
+ | `gog-tag` `iconTemplate` input | `<ng-template gogTagIcon>` |
1450
+ | `gog-multiselect` `clearIconTemplate` input | `<ng-template gogMultiselectClearIcon>` |
1451
+ | `gog-inputfield` `iconStartTemplate`/`iconEndTemplate`/`iconStartFn`/`iconEndFn`/`iconStartLabel`/`iconEndLabel` | `<span gogInputAddonStart>`/`<span gogInputAddonEnd>` (or a `<button>` with its own handler) |
1452
+ | `gog-table`'s `[template]` attribute (`<ng-template template="field" type="body">`) | `<ng-template gogColumnBody>` / `<ng-template gogColumnHeader>` declared **inside** the matching `<gog-column>` |
1453
+ | `<column>` selector / `Column` export | `<gog-column>` / `GogColumn` |
1454
+ | `GogSelectOption` / `GogMultiselectOption` types | `GogDropdownOption` (the same type — they were aliases of it) |
1455
+ | `@guildofgleks/ui/src/styles/…` asset path | `@guildofgleks/ui/styles/…` |
1456
+
1457
+ The general rule they all followed: a `TemplateRef` **input** or a string-keyed lookup was the old
1356
1458
  shape; a **projected content directive with a typed context**, declared where it's used, is the
1357
1459
  current one. If you're about to write `fooTemplate` next to an existing `foo` input, or key
1358
1460
  something off a string that has to match another string elsewhere, that's this exact
package/CHANGELOG.md CHANGED
@@ -7,29 +7,209 @@ reached 1.0, so breaking changes may land in minor versions.
7
7
  ## [21.5.0] - planned
8
8
 
9
9
  **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.
10
+ carries the removals below and the token-prefix rename (`--gog-btn-*`, `--gog-ms-*` and
11
+ `--gog-confirm-*` spelled out; the old spellings keep working until 21.7.0). Everything
12
+ non-breaking that was ready earlier shipped in 21.4.4 instead, so a reader upgrading to 21.4.4 has
13
+ nothing to migrate and a reader upgrading to 21.5.0 has one list to work through rather than one
14
+ buried among fixes.
14
15
 
15
16
  ### Removed
16
17
 
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:
18
+ Everything deprecated for this version is gone. **All of it was announced with a replacement in
19
+ 21.3.0 or earlier**, and every replacement has shipped since then, so each item below is a
20
+ mechanical edit at the call site rather than a redesign. If you are on 21.4.x, your editor has
21
+ been striking these through already.
22
+
23
+ **Per-slot `TemplateRef` inputs → projected slot directives.** Declare the template where it is
24
+ used; it no longer has to be wired through an input, and it carries a typed context.
25
+
26
+ | Removed input | Replacement |
27
+ | ---------------------------------------------------- | --------------------------------------- |
28
+ | `gog-checkbox` `[checkIconTemplate]` | `<ng-template gogCheckboxIcon>` |
29
+ | `gog-tag` `[iconTemplate]` | `<ng-template gogTagIcon>` |
30
+ | `gog-multiselect` `[clearIconTemplate]` | `<ng-template gogMultiselectClearIcon>` |
31
+ | `gog-select` / `gog-multiselect` `[chevronTemplate]` | `<ng-template gogDropdownChevron>` |
32
+
33
+ ```html
34
+ <!-- before -->
35
+ <gog-tag [iconTemplate]="star">Featured</gog-tag>
36
+ <ng-template #star><gog-icon name="check" /></ng-template>
37
+
38
+ <!-- after -->
39
+ <gog-tag>
40
+ <ng-template gogTagIcon><gog-icon name="check" /></ng-template>
41
+ Featured
42
+ </gog-tag>
43
+ ```
44
+
45
+ **`gog-inputfield`'s six legacy icon inputs** — `iconStartTemplate`, `iconEndTemplate`,
46
+ `iconStartFn`, `iconEndFn`, `iconStartLabel`, `iconEndLabel` — replaced by projecting a real
47
+ element into the field's leading or trailing slot. A projected `<button gogInputAddonEnd>` carries
48
+ its own click handler, its own `aria-label` and its own disabled state, which is why six inputs
49
+ collapse into none:
50
+
51
+ ```html
52
+ <!-- before -->
53
+ <gog-inputfield label="Search" iconEnd="check" [iconEndFn]="run" iconEndLabel="Search" />
54
+
55
+ <!-- after -->
56
+ <gog-inputfield label="Search">
57
+ <button gogInputAddonEnd type="button" aria-label="Search" (click)="run()">
58
+ <gog-icon name="check" />
59
+ </button>
60
+ </gog-inputfield>
61
+ ```
62
+
63
+ `iconStart` / `iconEnd` stay, and are now unambiguously **decorative**: they render an
64
+ `aria-hidden` span, never a button. The only action button `gog-inputfield` still renders for
65
+ itself is the password reveal toggle, whose labels remain `showPasswordLabel` /
66
+ `hidePasswordLabel`.
67
+
68
+ **`gog-table`'s string-keyed template slot.** `<ng-template template="field" type="body">` matched
69
+ a column by a string the compiler could not check — a typo silently rendered the default cell.
70
+ Declare the template inside the column it belongs to instead:
71
+
72
+ ```html
73
+ <!-- before -->
74
+ <gog-column field="status" />
75
+ <ng-template template="status" type="body" let-row>…</ng-template>
76
+
77
+ <!-- after -->
78
+ <gog-column field="status">
79
+ <ng-template gogColumnBody let-row let-value="value">…</ng-template>
80
+ </gog-column>
81
+ ```
82
+
83
+ The `TemplateDirective` export goes with it, along with the `GogTableBodyContext` /
84
+ `GogTableHeaderContext` types it carried — `GogColumnBodyContext` / `GogColumnHeaderContext` are
85
+ the typed replacements, and they are what the column-scoped templates have always used.
86
+
87
+ **The unprefixed table column names.** The `<column>` element selector and the `Column` const and
88
+ type are gone; use `<gog-column>` and `GogColumn`.
89
+
90
+ **The `GogSelectOption` and `GogMultiselectOption` type aliases.** Use `GogDropdownOption` — the
91
+ same type; both were aliases of it since 21.2.2. These two were announced for removal in **21.4.0**
92
+ and overran it by a minor: 21.4.0 through 21.4.4 all shipped with them still exported. Recorded
93
+ here rather than quietly re-dated, and `npm run check:deprecations` now fails the build on any
94
+ `@deprecated … Removed in <version>` tag whose version has already been reached, so no deprecation
95
+ can overrun its date again.
96
+
97
+ **The `@guildofgleks/ui/src/styles/…` asset path.** Stylesheets moved to `@guildofgleks/ui/styles/…`
98
+ in 21.3.2, with the old path documented as working until 21.5.0. The package no longer ships the
99
+ duplicate copy, and the `./src/styles/*` export is gone — if your `angular.json` still names the
100
+ long path, drop the `src/` segment.
19
101
 
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.
102
+ ### Fixed
103
+
104
+ - **`gogCollapsibleTrigger` is reachable by keyboard on any element.** Its own documentation
105
+ invites a non-focusable host ("works on any clickable element"), and on one it used to apply
106
+ `aria-expanded`/`aria-controls` and nothing else: a control that announces itself to a screen
107
+ reader, with no tab stop and no response to Enter or Space the one combination that strands
108
+ the person relying on that announcement.
109
+
110
+ On a host that is not natively operable the directive now also supplies `role="button"`,
111
+ `tabindex="0"` (`-1` while disabled) and Enter/Space. A `<button>` or `<a href>` is untouched,
112
+ since a second key handler would toggle twice in one press, and a `role`/`tabindex` you set
113
+ yourself is respected rather than overwritten.
114
+
115
+ ### Added
116
+
117
+ - **`GOG_DEPRECATIONS` — the deprecation manifest**, generated from the library's own source and
118
+ shipped in the public API:
119
+
120
+ ```ts
121
+ import { GOG_DEPRECATIONS } from '@guildofgleks/ui';
122
+
123
+ // → { kind: 'token', name: '--gog-btn-radius', replacement: '--gog-button-radius',
124
+ // since: '21.5.0', sinceDate: '2026-08-19', removedIn: '21.7.0' }
125
+ ```
126
+
127
+ It answers "is this still supported, and until when?" for tooling that has to mark an API row —
128
+ a docs site, an editor plugin, a codemod — without anyone maintaining a second list. Symbols
129
+ come from their `@deprecated` tags and tokens from the stylesheets that still resolve them, so
130
+ it cannot drift from the code.
131
+
132
+ In this release it holds **154 tokens and no symbols**: 21.5.0 removed every deprecated symbol
133
+ the library had, and its deprecations are the three abbreviated token prefixes above. An empty
134
+ symbol half is the healthy state, not a broken generator.
26
135
 
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:
136
+ - **`gog-menu` a command menu**, with `[gogMenuTrigger]` on your own button and `gogMenuItem` on
137
+ your own items:
138
+
139
+ ```html
140
+ <button gogButton variant="ghost" [gogMenuTrigger]="rowMenu" aria-label="Row actions">
141
+ <gog-icon name="more-vertical" />
142
+ </button>
143
+
144
+ <gog-menu #rowMenu>
145
+ <button gogMenuItem (click)="edit(row)">Edit</button>
146
+ <button gogMenuItem disabled>Transfer ownership</button>
147
+ </gog-menu>
148
+ ```
149
+
150
+ The library created this gap itself: 21.4.0 added `more-horizontal`/`more-vertical` icons and a
151
+ table built for row actions, with nothing to open with them. Everything else a consumer can
152
+ assemble from what already ships; an accessible menu cannot be — it needs focus management,
153
+ roving focus and overlay placement at once.
154
+
155
+ Keyboard follows the WAI-ARIA menu button pattern: Enter/Space/ArrowDown open with the first
156
+ item focused, ArrowUp with the last, arrows and Home/End move and skip disabled items, Escape
157
+ closes and restores focus to the trigger, Tab closes and moves on.
158
+
159
+ Disable an item with the native `disabled` attribute on your own button — the arrow keys step
160
+ over it. The panel always renders into `<body>`, placed from the trigger's measured rect, so a
161
+ menu inside `gog-scroll`, `gog-table` or any clipping ancestor needs no configuration; it takes
162
+ the `--gog-dropdown-z` its trigger inherits, so a menu inside a dialog stacks above it. Past
163
+ `--gog-menu-max-height` the panel scrolls with `gog-scroll`. Themed by `--gog-menu-*`.
164
+
165
+ - **Right-to-left support.** `dir="rtl"` on `<html>` — or on any subtree — now mirrors every
166
+ component, with nothing to set per component. What changed under it: physical `left`/`right`
167
+ declarations became logical properties across 16 stylesheets; the select/multiselect panel and
168
+ the tooltip bubble copy a _scoped_ `dir` onto their portaled host, so an RTL region inside an
169
+ LTR page renders correctly; a tooltip's `position="auto"` prefers the mirrored horizontal side;
170
+ the calendar's month/year arrows turn around; and the slider fill, toast progress bar and
171
+ indeterminate progressbar run from the inline start.
172
+
173
+ Physical by design, because they are physical words in the API: a tooltip's explicit
174
+ `position="left"`/`"right"`, and a toast's `top-left`/`top-right`/`bottom-left`/`bottom-right`.
175
+
176
+ Three CSS custom properties are declared for the handful of properties with no logical form
177
+ (`transform-origin`, `translate`): `--gog-inline-start-side`, `--gog-inline-end-side` (the
178
+ `left`/`right` keywords) and `--gog-direction-sign` (`1`/`-1`). They flip on `[dir='rtl']` and
179
+ are available to your own styles.
180
+
181
+ ### Changed
29
182
 
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.
183
+ - **Component token prefixes are spelled out.** Three families were abbreviations of a
184
+ component's name — the one thing a consumer cannot guess and now read as the component does:
185
+
186
+ | Was | Is |
187
+ | ----------------- | ------------------------------------------------------------ |
188
+ | `--gog-btn-*` | `--gog-button-*` |
189
+ | `--gog-confirm-*` | `--gog-confirmation-dialog-*` |
190
+ | `--gog-ms-*` | `--gog-multiselect-*` (since 21.3.0; the removal moved here) |
191
+
192
+ **Nothing breaks now.** Every old spelling still feeds the component: each replacement declares
193
+ it in its own fallback (`--gog-button-md-padding: var(--gog-btn-md-padding, 0.75rem 1.25rem)`),
194
+ and the per-instance names (`--gog-btn-bg`, `--gog-btn-padding`, …) are still read by the
195
+ button's own fallback chain. Override either spelling, at any scope, and it applies —
196
+ verified in a browser rather than reasoned about, for a theme block, a nested `[data-theme]`
197
+ subtree and an inline instance override.
198
+
199
+ **They are removed in 21.7.0** — two minors rather than one, because a CSS custom property that
200
+ nothing reads fails silently: no error, no warning, just a value that stops applying. Migration
201
+ is a find-and-replace on those three prefixes. `TOKENS.md` lists only the current names.
202
+
203
+ One prefix that looks abbreviated and is staying: **`--gog-input-*`**. It names the text-field
204
+ block that `gog-inputfield` and `gog-textarea` both render, not the `gog-inputfield` component —
205
+ the two restyle together from one token set on purpose, so there is no `--gog-inputfield-*`.
206
+
207
+ - **`peerDependencies` now accept Angular 22** (`^21.2.0 || ^22.0.0` for `@angular/common`,
208
+ `@angular/core`, `@angular/forms`, `@angular/platform-browser`) instead of `^21.2.0` alone.
209
+ The library ships partial-compiled (Ivy partial mode), which is forward-compatible with the
210
+ next major without a rebuild — the strict `^21.2.0` peer range was blocking installation into
211
+ an Angular 22 app that otherwise built and ran fine, forcing every such consumer to reach for
212
+ `overrides`/`resolutions` as a workaround.
33
213
 
34
214
  ## [21.4.4] - 17.08.2026
35
215
 
package/README.md CHANGED
@@ -56,9 +56,6 @@ use — without it they render unstyled.
56
56
  ]
57
57
  ```
58
58
 
59
- > Up to 21.3.1 these files shipped under `@guildofgleks/ui/src/styles/…`. That path keeps working
60
- > until 21.5.0; new setups should use the shorter one.
61
-
62
59
  **2. Import components where you use them** — each is standalone:
63
60
 
64
61
  ```ts
@@ -96,6 +93,18 @@ export class App {}
96
93
  One `<gog-dialog />` hosts every dialog (they stack); one `<gog-toast-container />` hosts all
97
94
  four toast corners.
98
95
 
96
+ ## Right-to-left
97
+
98
+ **RTL is supported.** Set `dir="rtl"` on `<html>` (or on any subtree) and every component
99
+ mirrors: stylesheets use logical properties, portaled panels and tooltip bubbles copy a scoped
100
+ `dir` onto themselves, a tooltip's `position="auto"` prefers the mirrored horizontal side, and
101
+ the calendar's month arrows turn around.
102
+
103
+ Two things stay physical on purpose, because they are physical words in the API: a tooltip's
104
+ explicit `position="left"`/`"right"`, and a toast's `top-left`/`top-right`/`bottom-left`/
105
+ `bottom-right` corner. `"auto"` is the direction-aware tooltip placement; pick the corner you
106
+ want for a toast.
107
+
99
108
  ## Theming
100
109
 
101
110
  Every value the components paint with lives in `styles/theme.css`, in three layers:
@@ -103,13 +112,13 @@ Every value the components paint with lives in `styles/theme.css`, in three laye
103
112
  **Foundation** — palette, type scale, spacing, motion. Override these to restyle everything at
104
113
  once; component tokens derive from them, so a palette swap carries through on its own.
105
114
 
106
- **Component** — `--gog-<block>-*`, one block per component, to restyle a single component
107
- app-wide:
115
+ **Component** — `--gog-<component>-*`, one block per component, named after the component you
116
+ write in markup (`gog-button` → `--gog-button-*`), to restyle a single component app-wide:
108
117
 
109
118
  ```css
110
119
  :root[data-theme='mine'] {
111
- --gog-btn-font-family: var(--gog-font-body);
112
- --gog-btn-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
120
+ --gog-button-font-family: var(--gog-font-body);
121
+ --gog-button-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 20%, transparent);
113
122
  --gog-table-hover-bg: var(--gog-hover-color);
114
123
  }
115
124
  ```
@@ -119,10 +128,21 @@ variant and size classes:
119
128
 
120
129
  ```css
121
130
  .my-form gog-button {
122
- --gog-btn-bg: rebeccapurple; /* wins over .gog-btn--primary */
131
+ --gog-button-bg: rebeccapurple; /* wins over .gog-btn--primary */
123
132
  }
124
133
  ```
125
134
 
135
+ > **Renamed in 21.5.0.** Three prefixes were abbreviated and are now spelled out:
136
+ > `--gog-btn-*` → `--gog-button-*`, `--gog-confirm-*` → `--gog-confirmation-dialog-*`, and
137
+ > `--gog-ms-*` → `--gog-multiselect-*` (that one since 21.3.0). **The old spellings still work**
138
+ > — every new name derives from its old twin — and are **removed in 21.7.0**. A CSS override that
139
+ > stops being read fails silently, which is why the window is two minors rather than one.
140
+ >
141
+ > One prefix that looks abbreviated and is not: **`--gog-input-*`**. It names the shared
142
+ > text-field block that both `gog-inputfield` and `gog-textarea` render (`.gog-input__field`), not
143
+ > the `gog-inputfield` component — the two are meant to restyle together from one token set, so
144
+ > there is no `--gog-inputfield-*` and there will not be one.
145
+
126
146
  Every group and token name is in **[`TOKENS.md`](./TOKENS.md)**, generated from `theme.css` so it
127
147
  cannot drift, and available at runtime as `GOG_TOKEN_GROUPS`.
128
148
 
@@ -188,15 +208,15 @@ provideGogIcons({ cart: '<svg viewBox="0 0 24 24">…</svg>' });
188
208
 
189
209
  ## Components
190
210
 
191
- | Group | Components |
192
- | --- | --- |
193
- | Form controls | `gog-inputfield`, `gog-textarea`, `gog-select`, `gog-multiselect`, `gog-autocomplete`, `gog-checkbox`, `gog-radio-group`, `gog-toggle`, `gog-slider`, `gog-datepicker`, `gog-calendar`, `gog-button-toggle-group` |
194
- | Actions | `gog-button`, `gog-chip` |
195
- | Data | `gog-table` (+ `gog-column`), `gog-paginator`, `gog-tag` |
196
- | Layout & disclosure | `gog-accordion`, `gog-tabs` (+ `gog-tab`), `gog-collapsible`, `gog-divider`, `gog-scroll` |
197
- | Overlays | `gog-dialog`, `gog-confirmation-dialog`, `gog-toast` (+ `gog-toast-container`) |
198
- | Feedback | `gog-spinner`, `gog-spinner-overlay`, `gog-progressbar`, `gog-skeleton` |
199
- | Content | `gog-icon` |
211
+ | Group | Components |
212
+ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
213
+ | Form controls | `gog-inputfield`, `gog-textarea`, `gog-select`, `gog-multiselect`, `gog-autocomplete`, `gog-checkbox`, `gog-radio-group`, `gog-toggle`, `gog-slider`, `gog-datepicker`, `gog-calendar`, `gog-button-toggle-group` |
214
+ | Actions | `gog-button`, `gog-chip` |
215
+ | Data | `gog-table` (+ `gog-column`), `gog-paginator`, `gog-tag` |
216
+ | Layout & disclosure | `gog-accordion`, `gog-tabs` (+ `gog-tab`), `gog-collapsible`, `gog-divider`, `gog-scroll` |
217
+ | Overlays | `gog-dialog`, `gog-confirmation-dialog`, `gog-toast` (+ `gog-toast-container`), `gog-menu` (+ `gogMenuTrigger` / `gogMenuItem`) |
218
+ | Feedback | `gog-spinner`, `gog-spinner-overlay`, `gog-progressbar`, `gog-skeleton` |
219
+ | Content | `gog-icon` |
200
220
 
201
221
  **Directives:** `gogButton` (a link that looks like a button), `gogTooltip`, `gogBadge`,
202
222
  `gogCollapsibleTrigger`, `gogCollapsibleContent`.
@@ -223,11 +243,11 @@ A few things worth knowing before you reach for a workaround:
223
243
 
224
244
  ## Documentation
225
245
 
226
- | | |
227
- | --- | --- |
228
- | **[`AGENTS.md`](./AGENTS.md)** | the full API reference — every input, output, slot, type and default, per component. Ships in this package. |
229
- | **[`TOKENS.md`](./TOKENS.md)** | every `--gog-*` token, generated from `theme.css` |
230
- | [CHANGELOG](https://github.com/GuildOfGleks/gleks_web_ui/blob/master/projects/gleks/ui/CHANGELOG.md) | release history |
246
+ | | |
247
+ | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
248
+ | **[`AGENTS.md`](./AGENTS.md)** | the full API reference — every input, output, slot, type and default, per component. Ships in this package. |
249
+ | **[`TOKENS.md`](./TOKENS.md)** | every `--gog-*` token, generated from `theme.css` |
250
+ | [CHANGELOG](https://github.com/GuildOfGleks/gleks_web_ui/blob/master/projects/gleks/ui/CHANGELOG.md) | release history |
231
251
 
232
252
  `AGENTS.md` is written for an AI coding assistant working in your project, but it is the most
233
253
  complete API reference either way — point your assistant at it and it will stop guessing.