@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 +124 -22
- package/CHANGELOG.md +197 -17
- package/README.md +42 -22
- package/TOKENS.md +44 -44
- package/fesm2022/guildofgleks-ui.mjs +2017 -386
- 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 +95 -0
- package/styles/theme.css +301 -235
- package/styles/utilities.css +27 -0
- package/types/guildofgleks-ui.d.ts +237 -141
- 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,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
|
|
9
|
-
|
|
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-
|
|
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,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
|
-
##
|
|
1419
|
+
## Reading the deprecations at runtime — `GOG_DEPRECATIONS`
|
|
1339
1420
|
|
|
1340
|
-
|
|
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
|
-
|
|
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` |
|
|
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
|
-
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
and a reader upgrading to 21.5.0 has one list to work through rather than one
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
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-<
|
|
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-
|
|
112
|
-
--gog-
|
|
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-
|
|
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
|
|
192
|
-
|
|
|
193
|
-
| Form controls
|
|
194
|
-
| Actions
|
|
195
|
-
| Data
|
|
196
|
-
| Layout & disclosure | `gog-accordion`, `gog-tabs` (+ `gog-tab`), `gog-collapsible`, `gog-divider`, `gog-scroll`
|
|
197
|
-
| Overlays
|
|
198
|
-
| Feedback
|
|
199
|
-
| Content
|
|
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)**
|
|
229
|
-
| **[`TOKENS.md`](./TOKENS.md)**
|
|
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.
|