@wildmason/aegis 1.15.0 → 1.18.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,124 @@ 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.18.0] - 2026-09-02
24
+
25
+ ### Added
26
+
27
+ - `WmRichTooltip` — a peer to the text-only `WmTooltip` for generic Angular
28
+ markup. Consumers project a trigger marked `wmRichTooltipTrigger` and an
29
+ `ng-template` marked `wmRichTooltipContent`; the template renders in the
30
+ same anchored overlay shape with focus, hover, Escape, ARIA, scroll, and
31
+ clipping behavior. It accepts no raw HTML string, leaving any explicit
32
+ `[innerHTML]` sanitization decision with the consumer. Helm's Stacks
33
+ portfolio uses it to pair full branch refs and state swatches with the
34
+ topology legend, including omitted overflow branches.
35
+
36
+ ## [1.17.0] - 2026-09-01
37
+
38
+ ### Added
39
+
40
+ - `.wm-kbd--on-fill` — the same key cap `.wm-kbd--on-accent` shipped as one
41
+ release ago, driven by `currentColor` instead of `--wm-color-accent-text` so
42
+ it is correct on any control that carries its own fill rather than on the
43
+ accent alone. On `.wm-btn--primary` `currentColor` **is**
44
+ `--wm-color-accent-text`, so the accent case computes to exactly what 1.16.0
45
+ produced and `check:accent-contrast` measures the same numbers.
46
+
47
+ The generality was not speculative. Helm's conflict-resolution row puts a cap
48
+ inside a Reject button filled with `--wm-color-danger` at 22% over a tinted
49
+ header. Measured on all twelve themes, a plain `.wm-kbd` there draws an edge
50
+ that separates from the button at **1.65:1 to 2.89:1 — below WCAG 1.4.11's
51
+ 3:1 on every one of them**. The same cap under this modifier measures 3.55:1
52
+ to 4.43:1. Nothing about that button is unusual; the accent-only modifier
53
+ simply had no answer for it.
54
+
55
+ ### Deprecated
56
+
57
+ - `.wm-kbd--on-accent`, in favour of `.wm-kbd--on-fill`. It still ships, as the
58
+ same declarations, because removing a published class is a breaking change —
59
+ and it had no consumers to break, which is precisely why the name was worth
60
+ correcting one release later rather than living with. Slated for removal at
61
+ 2.0.0.
62
+
63
+ ## [1.16.0] - 2026-09-01
64
+
65
+ ### Added
66
+
67
+ - `.wm-kbd--on-accent` — the key cap for an accent fill. The base `.wm-kbd` is
68
+ `--wm-bg-sunken` inside `--wm-border-input`: a recess in a *surface*, and both
69
+ tokens are wrong the moment the cap sits on `.wm-btn--primary`. The modifier
70
+ carries no fill of its own, so the cap's label **is** the button's label and
71
+ inherits the contrast that pair already guarantees; only its edge is new, drawn
72
+ as `--wm-color-accent-text` at 75% over whatever is behind. Mixing toward
73
+ `transparent` rather than toward `--wm-color-accent` is what lets one
74
+ declaration serve the rest fill and the hover fill both.
75
+ - `check:accent-contrast` — measures `.wm-btn--primary`'s label on both of its
76
+ fills, the new cap's edge on both, and how far the hover fill sits from the rest
77
+ fill, across every theme. Its destructive twin has had a guard since
78
+ white-on-danger was caught failing 8 of 12 themes; the accent button is the same
79
+ shape and had none.
80
+
81
+ The separation bar is there because the first pass shipped without one and eight
82
+ hovers came out invisible: the derivation took the smallest lightness step that
83
+ cleared contrast, which is a hover nobody can see. It is expressed as a Weber
84
+ fraction, `|L_hover - L_rest| / L_rest >= 0.14`, because an ABSOLUTE distance
85
+ cannot separate the accepted values from the rejected ones at any threshold —
86
+ sorted by OKLab distance an accepted theme sits below a rejected one. Normalised
87
+ by the rest fill's own lightness they separate cleanly, and 0.14 is the low end
88
+ of the band occupied by the three hovers this repo already shipped and nobody
89
+ ever complained about.
90
+
91
+ ### Fixed
92
+
93
+ - **`.wm-btn--primary:hover` failed WCAG AA on warm-light: white on
94
+ `--wm-color-accent-hover` `#2aa198` measured 3.16:1.** The cause was
95
+ structural rather than one bad value. On five themes the hover was the
96
+ palette's *second accent* rather than a lighter or darker step of the first
97
+ — Solarized cyan behind Solarized blue, Dracula pink behind Dracula purple,
98
+ Monokai orange behind Monokai magenta. A hue jump promises nothing about the
99
+ label riding on it, so the label's contrast was whatever the two palette
100
+ entries happened to be, and on hover it also missed APCA Lc 60 on nine themes,
101
+ as low as Lc 28.7. Nine hover values are now the accent's own hue and chroma at
102
+ a different OKLCh lightness, moved *away* from the label, far enough to clear the
103
+ separation bar as well as the contrast bars. Where sRGB cannot hold the accent's
104
+ chroma at the higher lightness — vampires-kiss and twilight-peach — the colour
105
+ is gamut mapped with hue and lightness held and chroma reduced, rather than
106
+ clamped per channel, which shifts hue.
107
+ - `--wm-color-accent-text` on arctic-night, vampires-kiss and twilight-peach was
108
+ short of APCA Lc 60 on the rest fill by 0.1, 0.3 and 1.4. Each moved a little
109
+ further from its fill in OKLCh lightness — hue and chroma held, two of the
110
+ three by under five values out of 255.
111
+ - `DESIGN_LANGUAGE.md` §13 claimed `.wm-kbd` was "used identically in Helm
112
+ (command palette) and Slate (sidebar search button)". Neither consumer used it
113
+ at all. Helm draws seven key badges from five component-local rules; Slate draws
114
+ none. `check:docs` gates class *existence* in both directions and cannot see a
115
+ false claim about who uses one, so this was found by looking.
116
+
117
+ ### Known limitation
118
+
119
+ - **Four accents cannot reach APCA Lc 60 with any label, and are pinned rather
120
+ than repaired. All four clear WCAG on both fills** — WCAG is the bar this
121
+ package ships to and no theme is exempt from it; APCA Lc 60 is the bar it
122
+ reaches for, enforced the same way because a bar nothing enforces decays. A
123
+ pinned theme is behind an aspiration, not broken. Pure white and pure black bracket every achievable Lc, and on
124
+ posh-sandalwood (`#f92672`, best 40.7 dark / 68.8 white — but white measures
125
+ 3.79:1 and fails WCAG outright), source-control-dark (`#3fb950`, 54.6),
126
+ crepuscular-sky (`#c09d06`, 55.7) and wildmason (`#82a682`, 57.8), neither end
127
+ reaches it. Clearing the bar means changing the accent itself, which is each
128
+ theme's brand colour. The shortfalls are recorded to one decimal in
129
+ `check-accent-contrast.mjs`, which fails if one drifts in either direction.
130
+
20
131
  ## [1.15.0] - 2026-09-01
21
132
 
22
133
  ### Added
@@ -231,6 +342,10 @@ are omitted where no tag exists rather than pointed at a URL that 404s.
231
342
  Releases before 1.8.0 are in `git log`. See also `wiki/products/Aegis - Health.md`
232
343
  for the decisions behind these changes, including the ones decided against.
233
344
 
234
- [Unreleased]: https://github.com/wildmason/aegis/compare/master...HEAD
345
+ [Unreleased]: https://github.com/wildmason/aegis/compare/v1.18.0...HEAD
346
+ [1.18.0]: https://github.com/wildmason/aegis/releases/tag/v1.18.0
347
+ [1.17.0]: https://github.com/wildmason/aegis/releases/tag/v1.17.0
348
+ [1.16.0]: https://github.com/wildmason/aegis/releases/tag/v1.16.0
349
+ [1.15.0]: https://github.com/wildmason/aegis/releases/tag/v1.15.0
235
350
  [1.11.0]: https://github.com/wildmason/aegis/releases/tag/v1.11.0
236
351
  [1.9.0]: https://github.com/wildmason/aegis/releases/tag/v1.9.0