@wildmason/aegis 1.15.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,13 +10,84 @@ page; both were written at the time, so the entries are sourced rather than
10
10
  reconstructed from memory. Anything before 1.8.0 lives in `git log` only, and is
11
11
  deliberately not summarised here rather than guessed at.
12
12
 
13
- **Releases from 1.12.0 onward carry no git tag.** They were published through the
14
- GitHub OIDC workflow, which does not tag, so `git tag` stops at `v1.11.0` and the
15
- tag names before that are inconsistent (`1.4.4`, `v1.5.1`). Version links below
16
- are omitted where no tag exists rather than pointed at a URL that 404s.
13
+ **Releases 1.12.0 through 1.14.1 carry no git tag.** They were published through
14
+ the GitHub OIDC workflow, which does not tag, so `git tag` skips from `v1.11.0` to
15
+ `v1.15.0`, and the tag names before that are inconsistent (`1.4.4`, `v1.5.1`).
16
+ Version links below are omitted where no tag exists rather than pointed at a URL
17
+ that 404s.
17
18
 
18
19
  ## [Unreleased]
19
20
 
21
+ _No unreleased changes._
22
+
23
+ ## [1.16.0] - 2026-09-01
24
+
25
+ ### Added
26
+
27
+ - `.wm-kbd--on-accent` — the key cap for an accent fill. The base `.wm-kbd` is
28
+ `--wm-bg-sunken` inside `--wm-border-input`: a recess in a *surface*, and both
29
+ tokens are wrong the moment the cap sits on `.wm-btn--primary`. The modifier
30
+ carries no fill of its own, so the cap's label **is** the button's label and
31
+ inherits the contrast that pair already guarantees; only its edge is new, drawn
32
+ as `--wm-color-accent-text` at 75% over whatever is behind. Mixing toward
33
+ `transparent` rather than toward `--wm-color-accent` is what lets one
34
+ declaration serve the rest fill and the hover fill both.
35
+ - `check:accent-contrast` — measures `.wm-btn--primary`'s label on both of its
36
+ fills, the new cap's edge on both, and how far the hover fill sits from the rest
37
+ fill, across every theme. Its destructive twin has had a guard since
38
+ white-on-danger was caught failing 8 of 12 themes; the accent button is the same
39
+ shape and had none.
40
+
41
+ The separation bar is there because the first pass shipped without one and eight
42
+ hovers came out invisible: the derivation took the smallest lightness step that
43
+ cleared contrast, which is a hover nobody can see. It is expressed as a Weber
44
+ fraction, `|L_hover - L_rest| / L_rest >= 0.14`, because an ABSOLUTE distance
45
+ cannot separate the accepted values from the rejected ones at any threshold —
46
+ sorted by OKLab distance an accepted theme sits below a rejected one. Normalised
47
+ by the rest fill's own lightness they separate cleanly, and 0.14 is the low end
48
+ of the band occupied by the three hovers this repo already shipped and nobody
49
+ ever complained about.
50
+
51
+ ### Fixed
52
+
53
+ - **`.wm-btn--primary:hover` failed WCAG AA on warm-light: white on
54
+ `--wm-color-accent-hover` `#2aa198` measured 3.16:1.** The cause was
55
+ structural rather than one bad value. On five themes the hover was the
56
+ palette's *second accent* rather than a lighter or darker step of the first
57
+ — Solarized cyan behind Solarized blue, Dracula pink behind Dracula purple,
58
+ Monokai orange behind Monokai magenta. A hue jump promises nothing about the
59
+ label riding on it, so the label's contrast was whatever the two palette
60
+ entries happened to be, and on hover it also missed APCA Lc 60 on nine themes,
61
+ as low as Lc 28.7. Nine hover values are now the accent's own hue and chroma at
62
+ a different OKLCh lightness, moved *away* from the label, far enough to clear the
63
+ separation bar as well as the contrast bars. Where sRGB cannot hold the accent's
64
+ chroma at the higher lightness — vampires-kiss and twilight-peach — the colour
65
+ is gamut mapped with hue and lightness held and chroma reduced, rather than
66
+ clamped per channel, which shifts hue.
67
+ - `--wm-color-accent-text` on arctic-night, vampires-kiss and twilight-peach was
68
+ short of APCA Lc 60 on the rest fill by 0.1, 0.3 and 1.4. Each moved a little
69
+ further from its fill in OKLCh lightness — hue and chroma held, two of the
70
+ three by under five values out of 255.
71
+ - `DESIGN_LANGUAGE.md` §13 claimed `.wm-kbd` was "used identically in Helm
72
+ (command palette) and Slate (sidebar search button)". Neither consumer used it
73
+ at all. Helm draws seven key badges from five component-local rules; Slate draws
74
+ none. `check:docs` gates class *existence* in both directions and cannot see a
75
+ false claim about who uses one, so this was found by looking.
76
+
77
+ ### Known limitation
78
+
79
+ - **Four accents cannot reach APCA Lc 60 with any label, and are pinned rather
80
+ than repaired. All four clear WCAG on both fills** — WCAG is the bar this
81
+ package ships to and no theme is exempt from it; APCA Lc 60 is the bar it
82
+ reaches for, enforced the same way because a bar nothing enforces decays. A
83
+ pinned theme is behind an aspiration, not broken. Pure white and pure black bracket every achievable Lc, and on
84
+ posh-sandalwood (`#f92672`, best 40.7 dark / 68.8 white — but white measures
85
+ 3.79:1 and fails WCAG outright), source-control-dark (`#3fb950`, 54.6),
86
+ crepuscular-sky (`#c09d06`, 55.7) and wildmason (`#82a682`, 57.8), neither end
87
+ reaches it. Clearing the bar means changing the accent itself, which is each
88
+ theme's brand colour. The shortfalls are recorded to one decimal in
89
+ `check-accent-contrast.mjs`, which fails if one drifts in either direction.
90
+
20
91
  ## [1.15.0] - 2026-09-01
21
92
 
22
93
  ### Added
@@ -231,6 +302,8 @@ are omitted where no tag exists rather than pointed at a URL that 404s.
231
302
  Releases before 1.8.0 are in `git log`. See also `wiki/products/Aegis - Health.md`
232
303
  for the decisions behind these changes, including the ones decided against.
233
304
 
234
- [Unreleased]: https://github.com/wildmason/aegis/compare/master...HEAD
305
+ [Unreleased]: https://github.com/wildmason/aegis/compare/v1.16.0...HEAD
306
+ [1.16.0]: https://github.com/wildmason/aegis/releases/tag/v1.16.0
307
+ [1.15.0]: https://github.com/wildmason/aegis/releases/tag/v1.15.0
235
308
  [1.11.0]: https://github.com/wildmason/aegis/releases/tag/v1.11.0
236
309
  [1.9.0]: https://github.com/wildmason/aegis/releases/tag/v1.9.0
package/inputs.css CHANGED
@@ -1586,3 +1586,48 @@ select.wm-input {
1586
1586
  color: var(--wm-text-muted);
1587
1587
  pointer-events: none;
1588
1588
  }
1589
+
1590
+ /* ----------------------------------------------------------------
1591
+ On an accent fill — .wm-kbd--on-accent
1592
+ ----------------------------------------------------------------
1593
+ A plain .wm-kbd is --wm-bg-sunken inside --wm-border-input: a
1594
+ recess in a surface. Put one on .wm-btn--primary and both tokens
1595
+ are answering the wrong question — the fill is a surface colour
1596
+ stranded on the accent, and the border is tuned to separate from
1597
+ surfaces rather than from a saturated fill.
1598
+
1599
+ This modifier carries no fill of its own. It borrows the button's,
1600
+ which means the cap's label IS the button's label and inherits the
1601
+ contrast that pair already guarantees; nothing about the text needs
1602
+ measuring twice. The edge is the label colour at 75% over whatever
1603
+ sits behind it, and mixing toward `transparent` rather than toward
1604
+ a named fill is what lets ONE declaration serve both the rest fill
1605
+ and the hover fill — a mix toward --wm-color-accent could only
1606
+ ever be correct for one of the two.
1607
+
1608
+ 75% is held by check-accent-contrast.mjs against both fills on
1609
+ every theme. The binding case is posh-sandalwood, where the edge
1610
+ measures 3.47:1 against WCAG 1.4.11's 3:1.
1611
+
1612
+ Usage — inside an accent button:
1613
+ <button class="wm-btn wm-btn--primary">
1614
+ Accept
1615
+ <span class="wm-kbd-combo">
1616
+ <kbd class="wm-kbd wm-kbd--on-accent">Ctrl</kbd>
1617
+ <kbd class="wm-kbd wm-kbd--on-accent">Enter</kbd>
1618
+ </span>
1619
+ </button>
1620
+ ---------------------------------------------------------------- */
1621
+
1622
+ .wm-kbd--on-accent {
1623
+ color: var(--wm-color-accent-text);
1624
+ background: transparent;
1625
+ border-color: color-mix(in srgb, var(--wm-color-accent-text) 75%, transparent);
1626
+ }
1627
+
1628
+ /* The combo's `+` is --wm-text-muted, a surface colour, so it is as wrong on
1629
+ an accent fill as the cap's own tokens were. Same share as the edge, so
1630
+ there is one number to keep in step rather than two. */
1631
+ .wm-kbd-combo > .wm-kbd--on-accent + .wm-kbd--on-accent::before {
1632
+ color: color-mix(in srgb, currentColor 75%, transparent);
1633
+ }
package/package.json CHANGED
@@ -1,64 +1,65 @@
1
- {
2
- "name": "@wildmason/aegis",
3
- "version": "1.15.0",
4
- "description": "Aegis design system \u00e2\u20ac\u201d CSS tokens and Angular component library",
5
- "scripts": {
6
- "check:offline-fonts": "node scripts/check-offline-fonts.mjs",
7
- "build": "npm run check:offline-fonts && npm run check:destructive-contrast && npm run check:semantic-contrast && npm run check:tooltip-contrast && npm run check:docs && ng-packagr -p ng-package.json",
8
- "prepublishOnly": "npm run build",
9
- "check:destructive-contrast": "node scripts/check-destructive-contrast.mjs",
10
- "check:semantic-contrast": "node scripts/check-semantic-contrast.mjs",
11
- "check:tooltip-contrast": "node scripts/check-tooltip-contrast.mjs",
12
- "check:docs": "node scripts/check-design-language.mjs"
13
- },
14
- "files": [
15
- "CHANGELOG.md",
16
- "dist",
17
- "fonts",
18
- "themes.css",
19
- "inputs.css"
20
- ],
21
- "exports": {
22
- "./themes.css": "./themes.css",
23
- "./inputs.css": "./inputs.css",
24
- "./components": {
25
- "types": "./dist/types/wildmason-aegis.d.ts",
26
- "default": "./dist/fesm2022/wildmason-aegis.mjs"
27
- }
28
- },
29
- "peerDependencies": {
30
- "@angular/cdk": ">=21",
31
- "@angular/core": ">=21",
32
- "@tauri-apps/api": ">=2",
33
- "rxjs": ">=7",
34
- "tslib": "^2.3.0"
35
- },
36
- "devDependencies": {
37
- "@angular/cdk": "^21.0.0",
38
- "@angular/common": "21.2.1",
39
- "@angular/compiler": "21.2.1",
40
- "@angular/compiler-cli": "21.2.1",
41
- "@angular/core": "21.2.1",
42
- "@angular/forms": "21.2.1",
43
- "@angular/platform-browser": "21.2.1",
44
- "@tauri-apps/api": "^2.10.1",
45
- "ng-packagr": "^21.0.0",
46
- "tslib": "^2.8.1",
47
- "typescript": "^5.9.2"
48
- },
49
- "keywords": [
50
- "design-system",
51
- "css",
52
- "angular",
53
- "tokens"
54
- ],
55
- "license": "MIT",
56
- "repository": {
57
- "type": "git",
58
- "url": "git+https://github.com/wildmason/aegis.git"
59
- },
60
- "publishConfig": {
61
- "access": "public",
62
- "registry": "https://registry.npmjs.org"
63
- }
64
- }
1
+ {
2
+ "name": "@wildmason/aegis",
3
+ "version": "1.16.0",
4
+ "description": "Aegis design system \u00e2\u20ac\u201d CSS tokens and Angular component library",
5
+ "scripts": {
6
+ "check:offline-fonts": "node scripts/check-offline-fonts.mjs",
7
+ "build": "npm run check:offline-fonts && npm run check:destructive-contrast && npm run check:semantic-contrast && npm run check:accent-contrast && npm run check:tooltip-contrast && npm run check:docs && ng-packagr -p ng-package.json",
8
+ "prepublishOnly": "npm run build",
9
+ "check:destructive-contrast": "node scripts/check-destructive-contrast.mjs",
10
+ "check:semantic-contrast": "node scripts/check-semantic-contrast.mjs",
11
+ "check:tooltip-contrast": "node scripts/check-tooltip-contrast.mjs",
12
+ "check:accent-contrast": "node scripts/check-accent-contrast.mjs",
13
+ "check:docs": "node scripts/check-design-language.mjs"
14
+ },
15
+ "files": [
16
+ "CHANGELOG.md",
17
+ "dist",
18
+ "fonts",
19
+ "themes.css",
20
+ "inputs.css"
21
+ ],
22
+ "exports": {
23
+ "./themes.css": "./themes.css",
24
+ "./inputs.css": "./inputs.css",
25
+ "./components": {
26
+ "types": "./dist/types/wildmason-aegis.d.ts",
27
+ "default": "./dist/fesm2022/wildmason-aegis.mjs"
28
+ }
29
+ },
30
+ "peerDependencies": {
31
+ "@angular/cdk": ">=21",
32
+ "@angular/core": ">=21",
33
+ "@tauri-apps/api": ">=2",
34
+ "rxjs": ">=7",
35
+ "tslib": "^2.3.0"
36
+ },
37
+ "devDependencies": {
38
+ "@angular/cdk": "^21.0.0",
39
+ "@angular/common": "21.2.1",
40
+ "@angular/compiler": "21.2.1",
41
+ "@angular/compiler-cli": "21.2.1",
42
+ "@angular/core": "21.2.1",
43
+ "@angular/forms": "21.2.1",
44
+ "@angular/platform-browser": "21.2.1",
45
+ "@tauri-apps/api": "^2.10.1",
46
+ "ng-packagr": "^21.0.0",
47
+ "tslib": "^2.8.1",
48
+ "typescript": "^5.9.2"
49
+ },
50
+ "keywords": [
51
+ "design-system",
52
+ "css",
53
+ "angular",
54
+ "tokens"
55
+ ],
56
+ "license": "MIT",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/wildmason/aegis.git"
60
+ },
61
+ "publishConfig": {
62
+ "access": "public",
63
+ "registry": "https://registry.npmjs.org"
64
+ }
65
+ }
package/themes.css CHANGED
@@ -354,7 +354,7 @@
354
354
 
355
355
  /* Accent */
356
356
  --wm-color-accent: #105987;
357
- --wm-color-accent-hover: #2aa198;
357
+ --wm-color-accent-hover: #004771;
358
358
  --wm-color-accent-text: #ffffff;
359
359
  --wm-color-accent-readable: #004066;
360
360
 
@@ -500,8 +500,8 @@
500
500
 
501
501
  /* Accent — light teal requires dark text */
502
502
  --wm-color-accent: #8fc4d3;
503
- --wm-color-accent-hover: #81a1c1;
504
- --wm-color-accent-text: #2e3440;
503
+ --wm-color-accent-hover: #b2e8f7;
504
+ --wm-color-accent-text: #2c323e;
505
505
  --wm-color-accent-readable: #a5dbea;
506
506
 
507
507
  /* Semantic */
@@ -577,8 +577,8 @@
577
577
 
578
578
  /* Accent — slightly lighter than canonical purple for card contrast */
579
579
  --wm-color-accent: #c9a7fa;
580
- --wm-color-accent-hover: #ff79c6;
581
- --wm-color-accent-text: #282a36;
580
+ --wm-color-accent-hover: #e5d5ff;
581
+ --wm-color-accent-text: #242632;
582
582
  --wm-color-accent-readable: #dcc6fe;
583
583
 
584
584
  /* Semantic */
@@ -657,8 +657,8 @@
657
657
 
658
658
  /* Accent — warm peach */
659
659
  --wm-color-accent: #f5986a;
660
- --wm-color-accent-hover: #f08458;
661
- --wm-color-accent-text: #1c1d2e;
660
+ --wm-color-accent-hover: #ffc7ac;
661
+ --wm-color-accent-text: #0e0e1e;
662
662
  --wm-color-accent-readable: #fead85;
663
663
 
664
664
  /* Semantic */
@@ -737,7 +737,7 @@
737
737
 
738
738
  /* Accent — thistle (muted lavender) */
739
739
  --wm-color-accent: #c4a8d8;
740
- --wm-color-accent-hover: #9e7abf;
740
+ --wm-color-accent-hover: #e7cafc;
741
741
  --wm-color-accent-text: #1a1715;
742
742
  --wm-color-accent-readable: #d8bced;
743
743
 
@@ -884,7 +884,7 @@
884
884
 
885
885
  /* Accent — Monokai hot pink */
886
886
  --wm-color-accent: #f92672;
887
- --wm-color-accent-hover: #fd971f;
887
+ --wm-color-accent-hover: #ff8dc2;
888
888
  --wm-color-accent-text: #1c1c15;
889
889
  /* #ff8ac4 was chosen for the WCAG failure (#f92672 is 2.9:1 on bg-float) and
890
890
  cleared 5.03:1, but measures APCA Lc 51.4 there. See the note in :root. */
@@ -964,7 +964,7 @@
964
964
 
965
965
  /* Accent — golden orange, the crepuscular ray color */
966
966
  --wm-color-accent: #c09d06;
967
- --wm-color-accent-hover: #b15000;
967
+ --wm-color-accent-hover: #e0bd3f;
968
968
  --wm-color-accent-text: #060810;
969
969
  --wm-color-accent-readable: #dcb83a;
970
970
 
@@ -1041,7 +1041,7 @@
1041
1041
 
1042
1042
  /* Accent — medium green, needs dark text for contrast */
1043
1043
  --wm-color-accent: #3fb950;
1044
- --wm-color-accent-hover: #58a6ff;
1044
+ --wm-color-accent-hover: #62d96f;
1045
1045
  --wm-color-accent-text: #0d1117;
1046
1046
  --wm-color-accent-readable: #5dd46a;
1047
1047
 
@@ -1118,7 +1118,7 @@
1118
1118
 
1119
1119
  /* Accent — Forest Moss Green */
1120
1120
  --wm-color-accent: #82a682;
1121
- --wm-color-accent-hover: #94b894;
1121
+ --wm-color-accent-hover: #9fc59f;
1122
1122
  --wm-color-accent-text: #161817;
1123
1123
  /* #9bc99b was chosen for the WCAG failure (#82a682 is 3.30:1 on bg-float) and
1124
1124
  cleared 4.74:1, but measures APCA Lc 54.3 there. See the note in :root. */