@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 +135 -21
- package/CHANGELOG.md +251 -17
- package/README.md +73 -26
- package/TOKENS.md +44 -44
- package/fesm2022/guildofgleks-ui.mjs +2068 -376
- package/fesm2022/guildofgleks-ui.mjs.map +1 -1
- package/package.json +9 -10
- package/styles/button.css +112 -79
- package/styles/index.css +2 -0
- package/styles/menu.css +104 -0
- package/styles/theme.css +301 -235
- package/styles/utilities.css +27 -0
- package/types/guildofgleks-ui.d.ts +285 -138
- package/src/styles/button.css +0 -193
- package/src/styles/fonts.css +0 -16
- package/src/styles/index.css +0 -19
- package/src/styles/presets/one-dark.css +0 -48
- package/src/styles/presets/one-light.css +0 -47
- package/src/styles/presets/slate.css +0 -55
- package/src/styles/theme.css +0 -1702
- package/src/styles/typography.css +0 -15
- package/src/styles/utilities.css +0 -185
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.
|
|
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-
|
|
172
|
-
**instance** (`--gog-
|
|
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-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
1431
|
+
## Reading the deprecations at runtime — `GOG_DEPRECATIONS`
|
|
1339
1432
|
|
|
1340
|
-
|
|
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
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
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
|
-
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
and a reader upgrading to 21.5.0 has one list to work through rather than one
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
|