@cloudgrid-io/ui 0.13.0 → 0.14.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/dist/theme.css +49 -3
- package/dist/tokens/base.json +41 -1
- package/dist/tokens/surface-ink.json +18 -0
- package/dist/tokens/surface-panel.json +18 -0
- package/dist/tokens.css +127 -5
- package/dist/tokens.json +8 -0
- package/package.json +1 -1
package/dist/theme.css
CHANGED
|
@@ -147,16 +147,18 @@
|
|
|
147
147
|
gives: a token whose utility lands a release later is a token the first
|
|
148
148
|
consumer reaches for and does not find.
|
|
149
149
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
The grid is whole as of #154: danger and unhealthy have borders now, so the
|
|
151
|
+
absence this comment used to record is gone. --color-offline-fill is still
|
|
152
|
+
the one deliberate hole, and still for #111's reason. */
|
|
153
153
|
--color-online-border: var(--cg-online-border);
|
|
154
154
|
--color-online-strong: var(--cg-online-strong);
|
|
155
155
|
--color-expired-border: var(--cg-expired-border);
|
|
156
156
|
--color-expired-strong: var(--cg-expired-strong);
|
|
157
157
|
--color-pending-border: var(--cg-pending-border);
|
|
158
158
|
--color-pending-strong: var(--cg-pending-strong);
|
|
159
|
+
--color-unhealthy-border: var(--cg-unhealthy-border);
|
|
159
160
|
--color-unhealthy-strong: var(--cg-unhealthy-strong);
|
|
161
|
+
--color-danger-border: var(--cg-danger-border);
|
|
160
162
|
--color-danger-strong: var(--cg-danger-strong);
|
|
161
163
|
|
|
162
164
|
/* ---- lines ---- */
|
|
@@ -273,6 +275,50 @@
|
|
|
273
275
|
--shadow-hover: var(--cg-shadow-hover);
|
|
274
276
|
--shadow-panel: var(--cg-shadow-panel);
|
|
275
277
|
--shadow-focus: var(--cg-ring-focus);
|
|
278
|
+
/* The live dot's halo (#154), paired with --cg-live-halo the way --shadow-focus
|
|
279
|
+
is paired with --cg-focus-ring. */
|
|
280
|
+
--shadow-live: var(--cg-ring-live);
|
|
281
|
+
|
|
282
|
+
/* Tailwind's OWN three rungs, pointed at the brand's (#155).
|
|
283
|
+
|
|
284
|
+
This block is not a rename and not a convenience. Until it existed, the
|
|
285
|
+
elevation of this package's own components was decided by the CONSUMER:
|
|
286
|
+
dropdown-menu is authored with `shadow-md` and `shadow-lg`, select and
|
|
287
|
+
combobox with `shadow-md`, tabs with `shadow-sm`, and theme.css declared
|
|
288
|
+
none of those three names. So in a consumer that declares nothing, every
|
|
289
|
+
library dropdown and select renders Tailwind stock — measured,
|
|
290
|
+
`0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a` for shadow-lg — which
|
|
291
|
+
is far heavier and greyer than anything this brand ships. Nothing errors and
|
|
292
|
+
nothing looks broken; the components are just not on the brand.
|
|
293
|
+
|
|
294
|
+
The console was carrying three lines exactly like these in its own
|
|
295
|
+
globals.css to hold this package's components on this package's elevation.
|
|
296
|
+
A consumer paying to fix the library is the shape #149, #150 and #151 all
|
|
297
|
+
had, and the answer is the same: it belongs in the token file.
|
|
298
|
+
|
|
299
|
+
Forwarded, not repointed. The alternative was to rewrite the four component
|
|
300
|
+
class strings onto `shadow-card` / `shadow-raised`, which would have changed
|
|
301
|
+
the compiled class NAMES and so changed what the console renders today. This
|
|
302
|
+
way the compiled rules are byte-identical to what the console's own forwards
|
|
303
|
+
produce, and every other consumer gets the brand values without knowing this
|
|
304
|
+
was ever a problem. Proof in docs/test-results/.
|
|
305
|
+
|
|
306
|
+
The role mapping is the console's, unchanged: sm and md are the card
|
|
307
|
+
elevation, lg is the overlay lift. sm and md landing on one value is not an
|
|
308
|
+
oversight — this system contains one card elevation, and the console had
|
|
309
|
+
already collapsed its own three-tier ramp onto it.
|
|
310
|
+
|
|
311
|
+
xs, xl and 2xl are deliberately left on Tailwind stock. No component here
|
|
312
|
+
uses them, and forwarding a rung nothing consumes is a value invented to
|
|
313
|
+
complete a grid.
|
|
314
|
+
|
|
315
|
+
KNOWN: a forwarded rung loses Tailwind's --tw-shadow-color fallback, so
|
|
316
|
+
`shadow-red-500/20` stops tinting shadow-md. That is already true of
|
|
317
|
+
shadow-card and shadow-raised, and this palette has no colour a shadow would
|
|
318
|
+
be tinted with. */
|
|
319
|
+
--shadow-sm: var(--cg-shadow-card);
|
|
320
|
+
--shadow-md: var(--cg-shadow-card);
|
|
321
|
+
--shadow-lg: var(--cg-shadow-raised);
|
|
276
322
|
|
|
277
323
|
/* ---- spacing ----
|
|
278
324
|
--spacing sets the 4px base, so the numeric utilities (p-4, gap-6) line up
|
package/dist/tokens/base.json
CHANGED
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
"state": {
|
|
55
|
-
"$description": "state: what an entity IS, not what it means editorially.\n\nAdopted from the Console rather than invented, 2026-08-24 (#96). The Console\nhad already chosen and contrast-tested these — --color-live and\n--color-attention — while the brand carried no state colour at all beyond the\ndanger placeholder. Taking its values means the Console's appearance does not\nchange when it starts consuming this package, and the two stop disagreeing\nabout what 'live' looks like.\n\nEach carries per-surface values in surface-panel and surface-ink, for the same\nreason danger does: measured against all three grounds, no single value works.\nThe live green is 1.72:1 on the purple panel, and the brand's own lime is\n1.54:1 on white. A flat value would be invisible somewhere.\n\nNo --cg-offline-fill, deliberately. Measured, the pair does not work: the\nmuted neutral on a neutral tint is 2.90:1, under the 3:1 bar for a dot or a\nborder. Rather than invent a value to satisfy the ratio, an unplugged chip\nuses the existing surface-card ground with border-control, and --cg-offline\nis the dot on that ground, where it measures 3.28:1. Absence of state should\nnot need a colour of its own.\n\npending joined them on 2026-08-24 (#114) as an ALIAS of expired rather than a\nnew value. Same amber today, separate name, so the two can diverge later with\na one-line edit here and no change in any consumer. Aliases compile to var(),\nso the flip survives.\n\nunhealthy joined them on 2026-08-25 (#122) as a REAL value, not an alias, and\nit is the one tone here that was searched for rather than adopted. Founder\ndecision: expired is terminal, unhealthy is live-and-fixable, and sharing a\ntoken would mean retuning one silently retunes the other. It is a warmer,\nbrighter gold on the same ramp as the amber rather than a new hue family,\nbecause green/amber/red is the traffic light an operator already reads and\n'serving but degraded' is its middle rung. Its own note carries the numbers\nand the three families that were measured and rejected.\n\nTHREE RUNGS PER STATUS, from 2026-09-04 (#149, #150). A chip is a fill, a\nhairline around it, a dot and a word, and until now the set carried only the\nfirst two of those four. -border is the hairline and -strong is the word; the\nbare name stays the dot it has always been.\n\n <status>-fill the chip ground\n <status>-border the hairline around it, a pale tint\n <status> the dot. An indicator, so 3:1, never text\n <status>-strong the word on the fill. Text, so 4.5:1\n\nThe values are the Console's, measured and shipped, not new ones: #149 asked\nfor the rung and console#579 had already been forced to leave two bands as\nliterals for the want of it. Only unhealthy-strong and danger-strong are\nderived, each for a stated reason in its own note.\n\
|
|
55
|
+
"$description": "state: what an entity IS, not what it means editorially.\n\nAdopted from the Console rather than invented, 2026-08-24 (#96). The Console\nhad already chosen and contrast-tested these — --color-live and\n--color-attention — while the brand carried no state colour at all beyond the\ndanger placeholder. Taking its values means the Console's appearance does not\nchange when it starts consuming this package, and the two stop disagreeing\nabout what 'live' looks like.\n\nEach carries per-surface values in surface-panel and surface-ink, for the same\nreason danger does: measured against all three grounds, no single value works.\nThe live green is 1.72:1 on the purple panel, and the brand's own lime is\n1.54:1 on white. A flat value would be invisible somewhere.\n\nNo --cg-offline-fill, deliberately. Measured, the pair does not work: the\nmuted neutral on a neutral tint is 2.90:1, under the 3:1 bar for a dot or a\nborder. Rather than invent a value to satisfy the ratio, an unplugged chip\nuses the existing surface-card ground with border-control, and --cg-offline\nis the dot on that ground, where it measures 3.28:1. Absence of state should\nnot need a colour of its own.\n\npending joined them on 2026-08-24 (#114) as an ALIAS of expired rather than a\nnew value. Same amber today, separate name, so the two can diverge later with\na one-line edit here and no change in any consumer. Aliases compile to var(),\nso the flip survives.\n\nunhealthy joined them on 2026-08-25 (#122) as a REAL value, not an alias, and\nit is the one tone here that was searched for rather than adopted. Founder\ndecision: expired is terminal, unhealthy is live-and-fixable, and sharing a\ntoken would mean retuning one silently retunes the other. It is a warmer,\nbrighter gold on the same ramp as the amber rather than a new hue family,\nbecause green/amber/red is the traffic light an operator already reads and\n'serving but degraded' is its middle rung. Its own note carries the numbers\nand the three families that were measured and rejected.\n\nTHREE RUNGS PER STATUS, from 2026-09-04 (#149, #150). A chip is a fill, a\nhairline around it, a dot and a word, and until now the set carried only the\nfirst two of those four. -border is the hairline and -strong is the word; the\nbare name stays the dot it has always been.\n\n <status>-fill the chip ground\n <status>-border the hairline around it, a pale tint\n <status> the dot. An indicator, so 3:1, never text\n <status>-strong the word on the fill. Text, so 4.5:1\n\nThe values are the Console's, measured and shipped, not new ones: #149 asked\nfor the rung and console#579 had already been forced to leave two bands as\nliterals for the want of it. Only unhealthy-strong and danger-strong are\nderived, each for a stated reason in its own note.\n\nFOUR RUNGS PER STATUS as of 2026-09-05 (#154). --cg-danger-border and\n--cg-unhealthy-border were the two holes #152 left, on the reasoning above: at\nthe time nothing drew either one, so a value would have been invented to complete\na grid rather than to serve a chip. That note said what would change the answer —\n\"add them when something needs them, with the number that made the choice\" — and\nthis is it. Both are DERIVED rather than adopted, because neither has a shipped\nliteral anywhere, and each carries its number in its own note.\n\nThe derivation is one rule, and it is the two adopted borders' own measured\nposition rather than a recipe: a -border is its own tone's hue, at the lightness\nthat reproduces the 1.18-1.19:1 those two hold against their own fills, carrying\nthe mean of their chroma (OKLCH 0.0998) or the most sRGB has at that hue and\nlightness, whichever is smaller. Danger's hue hits the second clause and\nunhealthy's does not; both notes show the sweep.\n\noffline has no -border and no -strong either, and for the reason it has no\nfill: an unplugged chip sits on the card ground with border-control, and its\nword is --cg-text-primary. Absence of state still does not need a colour.\n\nOn the panel and on ink, -border resolves to the surface's own hairline and\n-strong to its own primary text. A dark ground has no darker rung to reach for,\nand the light tints these scopes carry measure 3.03:1 to 3.60:1 on the panel's\nchip fill, which is a dot and not a word. Worth knowing before retuning: on ink\nthe tints DO clear 4.5:1 on the ink fill (5.48:1 to 8.92:1), so a designer who\nwants the word tinted there changes five entries in surface-ink.json. On the\npanel it is not available at any value — white is 4.31:1 on that fill and white\nis the lightest colour there is, so AA on a panel chip needs the FILL to move.",
|
|
56
56
|
"online": {
|
|
57
57
|
"$value": "#00a05c",
|
|
58
58
|
"$type": "color",
|
|
@@ -170,6 +170,26 @@
|
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
},
|
|
173
|
+
"unhealthy-border": {
|
|
174
|
+
"$value": "#eee596",
|
|
175
|
+
"$type": "color",
|
|
176
|
+
"$description": "The hairline around an unhealthy chip. 1.19:1 against --cg-unhealthy-fill and\n1.28:1 on white.\n\nDERIVED, like unhealthy-strong and for the same reason: unhealthy is the one\ntone here the Console never had, so there is no shipped literal to take.\n\nThe rule is the two adopted borders' own position, measured rather than\ninvented. #abefc6 and #fedf89 are not mixes of their tone and their fill — the\nclosest sRGB mix reproduces them at dE2000 5.5 and 13.1 — but they sit in one\nnarrow band: OKLCH L 0.8958 and 0.9112, chroma 0.0886 and 0.1109, and 1.19:1\nand 1.18:1 against their own fills. So a new border is its own tone's hue at the\nlightness that reproduces that ratio, carrying the mean of their chroma (0.0998)\nor the most sRGB has at that hue and lightness, whichever is smaller. Here the\nhue has room: L 0.911, C 0.0998, H 102.17.\n\nKNOWN, measured before it was accepted rather than after: dE2000 6.3 from\nexpired-border, which is far under the 16.5 floor the tones in this palette were\nchosen against. It is not a defect, and the reason is that this rung already\nbehaves this way — expired-fill and unhealthy-fill ship 2.4 apart, so the border\nis MORE separated than the ground it surrounds. 16.5 is a floor for the rungs\nthat carry the signal, the dot and the word, which measure 22.3 and 20.6 for this\npair. At the pale end an amber and a gold are the same colour: swept across the\nwhole hue's usable chroma, the best separation available anywhere in the band is\n11.6, and buying it costs the pale tint that IS this rung's definition. Same\nfinding #122 recorded for the tones on a dark ground.\n\nNot an alias of expired-border, though the two are close enough that it would\nrender almost identically today. #122's whole decision was that unhealthy must\nnot be an alias of expired: a designer retuning one must not silently retune the\nother.",
|
|
177
|
+
"$extensions": {
|
|
178
|
+
"io.cloudgrid": {
|
|
179
|
+
"css": "--cg-unhealthy-border"
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
"danger-border": {
|
|
184
|
+
"$value": "#ffd3cd",
|
|
185
|
+
"$type": "color",
|
|
186
|
+
"$description": "The hairline around a danger chip. 1.19:1 against --cg-danger-fill and 1.35:1 on\nwhite.\n\nDERIVED by the rule unhealthy-border's note sets out, and the interesting part is\nwhere the rule runs out. --cg-danger is OKLCH H 27.03, and at the lightness the\nrule asks for, sRGB carries at most C 0.0506 on that hue — half the 0.0998 the\ntwo adopted borders carry. There is no paler red with more chroma; the gamut\nends. So this is the second clause of the rule doing its work: L 0.904 at the\nmost chroma available, which puts the red channel at 255.\n\nMeasured across the band, so the choice is visible:\n\n L 0.896 maxC 0.0551 #ffd0c9 1.22:1 on fill\n L 0.904 maxC 0.0506 #ffd3cd 1.19:1 on fill <- taken\n L 0.912 maxC 0.0461 #ffd7d2 1.16:1 on fill\n\ndE2000 to its neighbours in this rung: 38.6 from online-border, 27.3 from\nunhealthy-border, 25.0 from expired-border. It is the best separated of the four,\nwhich is the right way round — a failed chip is the one a reader must not\nmisread.\n\n#152 declined to add this, and correctly: at the time nothing drew it, and the\n`state` group's note says a value would then be invented to complete a grid\nrather than to serve a chip. That note also says what would change the answer —\n\"add them when something needs them, with the number that made the choice\" — and\nui#154 is that. The number is above.",
|
|
187
|
+
"$extensions": {
|
|
188
|
+
"io.cloudgrid": {
|
|
189
|
+
"css": "--cg-danger-border"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
},
|
|
173
193
|
"pending-border": {
|
|
174
194
|
"$value": "{state.expired-border}",
|
|
175
195
|
"$description": "The hairline around a pending chip, aliased to expired's for the same reason the\ntone and the fill are. Splitting pending from expired later means editing the\nfour pending entries in this file and nothing else.",
|
|
@@ -1179,6 +1199,16 @@
|
|
|
1179
1199
|
"css": "--cg-ring-focus"
|
|
1180
1200
|
}
|
|
1181
1201
|
}
|
|
1202
|
+
},
|
|
1203
|
+
"ring-live": {
|
|
1204
|
+
"$value": "0 0 0 4px var(--cg-live-halo)",
|
|
1205
|
+
"$description": "The live dot's halo as a ready-made box-shadow, so a surface draws the mark with\none token instead of restating the geometry.\n\nSame pair as --cg-focus-ring and --cg-ring-focus above: the colour lives in the\nindicator group, the shadow that spends it lives here. 4px rather than the focus\nring's 3px because that is the spread the mark ships at — the Console writes\n`box-shadow: 0 0 0 4px var(--color-volt-ring)` at all seven call sites, so the\ngeometry was already one value repeated seven times and is now one token.\n\nA dot larger than 8px wants a larger halo; that is a call site's business, and it\nsets its own box-shadow with --cg-live-halo rather than this rung.",
|
|
1206
|
+
"$extensions": {
|
|
1207
|
+
"io.cloudgrid": {
|
|
1208
|
+
"raw": true,
|
|
1209
|
+
"css": "--cg-ring-live"
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1182
1212
|
}
|
|
1183
1213
|
},
|
|
1184
1214
|
"motion": {
|
|
@@ -1278,6 +1308,16 @@
|
|
|
1278
1308
|
}
|
|
1279
1309
|
}
|
|
1280
1310
|
},
|
|
1311
|
+
"live-halo": {
|
|
1312
|
+
"$value": "color-mix(in srgb, var(--cg-volt) 32%, transparent)",
|
|
1313
|
+
"$description": "The soft ring around a live dot. The other half of the mark --cg-volt's note\ndescribes: \"the dot in its halo\".\n\nDERIVED FROM THE DOT, not written out, and that is the whole reason this exists\nrather than the value being pasted back. Computed it is the Console's own\nrgba(182, 255, 46, 0.32) — 32% of #b6ff2e over white is #e8ffbc, which is what\nships today — but written as a literal it would be a third place #b6ff2e is\nspelled out, and the next volt retune would leave an old-hue halo around a\nnew-hue dot with nothing anywhere going red.\n\nA ROLE name rather than --cg-volt-ring, which #149 purged as volt residue. The\npurge was right about this package (nothing here read it) and the name was the\nresidue: a token named for the hue cannot survive the hue being renamed, and\n--cg-volt's own note records that which lime the brand owns is still open. This\none is deliberately downstream of that question — whatever answers it, the halo\nfollows.\n\nWhat the purge missed is that the Console DOES read it, seven times: .cg-live-dot\nplus StatusChip, DiscoverRails, EngagementHeadline, MyStuffLoopStrip,\nViewsTrendChart and GridStatusBoard, each setting the dot and its box-shadow\ntogether. console#591 kept all three volt names rather than convert two thirds of\none mark, which is what ui#154 reports.\n\nNo contrast obligation of its own: it is a halo, not a foreground, and the dot it\nsurrounds is the signal. Declared at :root only, like --cg-volt itself, because a\nbrand mark is not a state and does not flip per surface.",
|
|
1314
|
+
"$extensions": {
|
|
1315
|
+
"io.cloudgrid": {
|
|
1316
|
+
"raw": true,
|
|
1317
|
+
"css": "--cg-live-halo"
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
},
|
|
1281
1321
|
"scrim": {
|
|
1282
1322
|
"$value": "rgba(34, 34, 34, 0.4)",
|
|
1283
1323
|
"$type": "color",
|
|
@@ -249,6 +249,24 @@
|
|
|
249
249
|
}
|
|
250
250
|
}
|
|
251
251
|
},
|
|
252
|
+
"unhealthy-border": {
|
|
253
|
+
"$value": "{semantic-lines.border-hairline}",
|
|
254
|
+
"$description": "The hairline around an unhealthy chip on this surface. The surface's own hairline, for the reason online-border and expired-border take it: a dark ground has no paler rung of the tone to reach for, and the light tint this scope carries is a dot.",
|
|
255
|
+
"$extensions": {
|
|
256
|
+
"io.cloudgrid": {
|
|
257
|
+
"css": "--cg-unhealthy-border"
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"danger-border": {
|
|
262
|
+
"$value": "{semantic-lines.border-hairline}",
|
|
263
|
+
"$description": "The hairline around a danger chip on this surface. Same rule as every other -border here: the surface's own hairline.",
|
|
264
|
+
"$extensions": {
|
|
265
|
+
"io.cloudgrid": {
|
|
266
|
+
"css": "--cg-danger-border"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
252
270
|
"pending-border": {
|
|
253
271
|
"$value": "{state.expired-border}",
|
|
254
272
|
"$extensions": {
|
|
@@ -233,6 +233,24 @@
|
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
},
|
|
236
|
+
"unhealthy-border": {
|
|
237
|
+
"$value": "{semantic-lines.border-hairline}",
|
|
238
|
+
"$description": "The hairline around an unhealthy chip on this surface. The surface's own hairline, for the reason online-border and expired-border take it: a dark ground has no paler rung of the tone to reach for, and the light tint this scope carries is a dot.",
|
|
239
|
+
"$extensions": {
|
|
240
|
+
"io.cloudgrid": {
|
|
241
|
+
"css": "--cg-unhealthy-border"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
"danger-border": {
|
|
246
|
+
"$value": "{semantic-lines.border-hairline}",
|
|
247
|
+
"$description": "The hairline around a danger chip on this surface. Same rule as every other -border here: the surface's own hairline.",
|
|
248
|
+
"$extensions": {
|
|
249
|
+
"io.cloudgrid": {
|
|
250
|
+
"css": "--cg-danger-border"
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
},
|
|
236
254
|
"pending-border": {
|
|
237
255
|
"$value": "{state.expired-border}",
|
|
238
256
|
"$extensions": {
|
package/dist/tokens.css
CHANGED
|
@@ -124,11 +124,20 @@
|
|
|
124
124
|
literals for the want of it. Only unhealthy-strong and danger-strong are
|
|
125
125
|
derived, each for a stated reason in its own note.
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
serve a chip.
|
|
131
|
-
them when something needs them, with the number that made the choice
|
|
127
|
+
FOUR RUNGS PER STATUS as of 2026-09-05 (#154). --cg-danger-border and
|
|
128
|
+
--cg-unhealthy-border were the two holes #152 left, on the reasoning above: at
|
|
129
|
+
the time nothing drew either one, so a value would have been invented to complete
|
|
130
|
+
a grid rather than to serve a chip. That note said what would change the answer —
|
|
131
|
+
"add them when something needs them, with the number that made the choice" — and
|
|
132
|
+
this is it. Both are DERIVED rather than adopted, because neither has a shipped
|
|
133
|
+
literal anywhere, and each carries its number in its own note.
|
|
134
|
+
|
|
135
|
+
The derivation is one rule, and it is the two adopted borders' own measured
|
|
136
|
+
position rather than a recipe: a -border is its own tone's hue, at the lightness
|
|
137
|
+
that reproduces the 1.18-1.19:1 those two hold against their own fills, carrying
|
|
138
|
+
the mean of their chroma (OKLCH 0.0998) or the most sRGB has at that hue and
|
|
139
|
+
lightness, whichever is smaller. Danger's hue hits the second clause and
|
|
140
|
+
unhealthy's does not; both notes show the sweep.
|
|
132
141
|
|
|
133
142
|
offline has no -border and no -strong either, and for the reason it has no
|
|
134
143
|
fill: an unplugged chip sits on the card ground with border-control, and its
|
|
@@ -218,6 +227,66 @@
|
|
|
218
227
|
--cg-online-border: collapsing it onto --cg-expired measured 3.99:1, which is
|
|
219
228
|
the tone doing the border's job. */
|
|
220
229
|
--cg-expired-border: #fedf89;
|
|
230
|
+
/*
|
|
231
|
+
The hairline around an unhealthy chip. 1.19:1 against --cg-unhealthy-fill and
|
|
232
|
+
1.28:1 on white.
|
|
233
|
+
|
|
234
|
+
DERIVED, like unhealthy-strong and for the same reason: unhealthy is the one
|
|
235
|
+
tone here the Console never had, so there is no shipped literal to take.
|
|
236
|
+
|
|
237
|
+
The rule is the two adopted borders' own position, measured rather than
|
|
238
|
+
invented. #abefc6 and #fedf89 are not mixes of their tone and their fill — the
|
|
239
|
+
closest sRGB mix reproduces them at dE2000 5.5 and 13.1 — but they sit in one
|
|
240
|
+
narrow band: OKLCH L 0.8958 and 0.9112, chroma 0.0886 and 0.1109, and 1.19:1
|
|
241
|
+
and 1.18:1 against their own fills. So a new border is its own tone's hue at the
|
|
242
|
+
lightness that reproduces that ratio, carrying the mean of their chroma (0.0998)
|
|
243
|
+
or the most sRGB has at that hue and lightness, whichever is smaller. Here the
|
|
244
|
+
hue has room: L 0.911, C 0.0998, H 102.17.
|
|
245
|
+
|
|
246
|
+
KNOWN, measured before it was accepted rather than after: dE2000 6.3 from
|
|
247
|
+
expired-border, which is far under the 16.5 floor the tones in this palette were
|
|
248
|
+
chosen against. It is not a defect, and the reason is that this rung already
|
|
249
|
+
behaves this way — expired-fill and unhealthy-fill ship 2.4 apart, so the border
|
|
250
|
+
is MORE separated than the ground it surrounds. 16.5 is a floor for the rungs
|
|
251
|
+
that carry the signal, the dot and the word, which measure 22.3 and 20.6 for this
|
|
252
|
+
pair. At the pale end an amber and a gold are the same colour: swept across the
|
|
253
|
+
whole hue's usable chroma, the best separation available anywhere in the band is
|
|
254
|
+
11.6, and buying it costs the pale tint that IS this rung's definition. Same
|
|
255
|
+
finding #122 recorded for the tones on a dark ground.
|
|
256
|
+
|
|
257
|
+
Not an alias of expired-border, though the two are close enough that it would
|
|
258
|
+
render almost identically today. #122's whole decision was that unhealthy must
|
|
259
|
+
not be an alias of expired: a designer retuning one must not silently retune the
|
|
260
|
+
other. */
|
|
261
|
+
--cg-unhealthy-border: #eee596;
|
|
262
|
+
/*
|
|
263
|
+
The hairline around a danger chip. 1.19:1 against --cg-danger-fill and 1.35:1 on
|
|
264
|
+
white.
|
|
265
|
+
|
|
266
|
+
DERIVED by the rule unhealthy-border's note sets out, and the interesting part is
|
|
267
|
+
where the rule runs out. --cg-danger is OKLCH H 27.03, and at the lightness the
|
|
268
|
+
rule asks for, sRGB carries at most C 0.0506 on that hue — half the 0.0998 the
|
|
269
|
+
two adopted borders carry. There is no paler red with more chroma; the gamut
|
|
270
|
+
ends. So this is the second clause of the rule doing its work: L 0.904 at the
|
|
271
|
+
most chroma available, which puts the red channel at 255.
|
|
272
|
+
|
|
273
|
+
Measured across the band, so the choice is visible:
|
|
274
|
+
|
|
275
|
+
L 0.896 maxC 0.0551 #ffd0c9 1.22:1 on fill
|
|
276
|
+
L 0.904 maxC 0.0506 #ffd3cd 1.19:1 on fill <- taken
|
|
277
|
+
L 0.912 maxC 0.0461 #ffd7d2 1.16:1 on fill
|
|
278
|
+
|
|
279
|
+
dE2000 to its neighbours in this rung: 38.6 from online-border, 27.3 from
|
|
280
|
+
unhealthy-border, 25.0 from expired-border. It is the best separated of the four,
|
|
281
|
+
which is the right way round — a failed chip is the one a reader must not
|
|
282
|
+
misread.
|
|
283
|
+
|
|
284
|
+
#152 declined to add this, and correctly: at the time nothing drew it, and the
|
|
285
|
+
`state` group's note says a value would then be invented to complete a grid
|
|
286
|
+
rather than to serve a chip. That note also says what would change the answer —
|
|
287
|
+
"add them when something needs them, with the number that made the choice" — and
|
|
288
|
+
ui#154 is that. The number is above. */
|
|
289
|
+
--cg-danger-border: #ffd3cd;
|
|
221
290
|
/*
|
|
222
291
|
The hairline around a pending chip, aliased to expired's for the same reason the
|
|
223
292
|
tone and the fill are. Splitting pending from expired later means editing the
|
|
@@ -466,6 +535,19 @@
|
|
|
466
535
|
--cg-shadow-hover: 0 8px 24px rgba(34, 34, 34, 0.08);
|
|
467
536
|
--cg-shadow-panel: 0 10px 40px rgba(90, 71, 240, 0.18);
|
|
468
537
|
--cg-ring-focus: 0 0 0 3px var(--cg-focus-ring);
|
|
538
|
+
/*
|
|
539
|
+
The live dot's halo as a ready-made box-shadow, so a surface draws the mark with
|
|
540
|
+
one token instead of restating the geometry.
|
|
541
|
+
|
|
542
|
+
Same pair as --cg-focus-ring and --cg-ring-focus above: the colour lives in the
|
|
543
|
+
indicator group, the shadow that spends it lives here. 4px rather than the focus
|
|
544
|
+
ring's 3px because that is the spread the mark ships at — the Console writes
|
|
545
|
+
`box-shadow: 0 0 0 4px var(--color-volt-ring)` at all seven call sites, so the
|
|
546
|
+
geometry was already one value repeated seven times and is now one token.
|
|
547
|
+
|
|
548
|
+
A dot larger than 8px wants a larger halo; that is a call site's business, and it
|
|
549
|
+
sets its own box-shadow with --cg-live-halo rather than this rung. */
|
|
550
|
+
--cg-ring-live: 0 0 0 4px var(--cg-live-halo);
|
|
469
551
|
|
|
470
552
|
/* ---- motion ----
|
|
471
553
|
motion: small and quick, nothing slides in */
|
|
@@ -519,6 +601,34 @@
|
|
|
519
601
|
and belongs to volt. Adding a state -ink is still a brand decision and still
|
|
520
602
|
open. */
|
|
521
603
|
--cg-volt-ink: #243d00;
|
|
604
|
+
/*
|
|
605
|
+
The soft ring around a live dot. The other half of the mark --cg-volt's note
|
|
606
|
+
describes: "the dot in its halo".
|
|
607
|
+
|
|
608
|
+
DERIVED FROM THE DOT, not written out, and that is the whole reason this exists
|
|
609
|
+
rather than the value being pasted back. Computed it is the Console's own
|
|
610
|
+
rgba(182, 255, 46, 0.32) — 32% of #b6ff2e over white is #e8ffbc, which is what
|
|
611
|
+
ships today — but written as a literal it would be a third place #b6ff2e is
|
|
612
|
+
spelled out, and the next volt retune would leave an old-hue halo around a
|
|
613
|
+
new-hue dot with nothing anywhere going red.
|
|
614
|
+
|
|
615
|
+
A ROLE name rather than --cg-volt-ring, which #149 purged as volt residue. The
|
|
616
|
+
purge was right about this package (nothing here read it) and the name was the
|
|
617
|
+
residue: a token named for the hue cannot survive the hue being renamed, and
|
|
618
|
+
--cg-volt's own note records that which lime the brand owns is still open. This
|
|
619
|
+
one is deliberately downstream of that question — whatever answers it, the halo
|
|
620
|
+
follows.
|
|
621
|
+
|
|
622
|
+
What the purge missed is that the Console DOES read it, seven times: .cg-live-dot
|
|
623
|
+
plus StatusChip, DiscoverRails, EngagementHeadline, MyStuffLoopStrip,
|
|
624
|
+
ViewsTrendChart and GridStatusBoard, each setting the dot and its box-shadow
|
|
625
|
+
together. console#591 kept all three volt names rather than convert two thirds of
|
|
626
|
+
one mark, which is what ui#154 reports.
|
|
627
|
+
|
|
628
|
+
No contrast obligation of its own: it is a halo, not a foreground, and the dot it
|
|
629
|
+
surrounds is the signal. Declared at :root only, like --cg-volt itself, because a
|
|
630
|
+
brand mark is not a state and does not flip per surface. */
|
|
631
|
+
--cg-live-halo: color-mix(in srgb, var(--cg-volt) 32%, transparent);
|
|
522
632
|
/*
|
|
523
633
|
The wash behind a modal or overlay. Uses the BRAND ink (#222222) rather than the
|
|
524
634
|
Console's (#16181d) — a scrim sits above content and belongs to the system, not
|
|
@@ -599,6 +709,12 @@
|
|
|
599
709
|
--cg-danger-fill: rgba(255, 255, 255, 0.16);
|
|
600
710
|
--cg-online-border: var(--cg-border-hairline);
|
|
601
711
|
--cg-expired-border: var(--cg-border-hairline);
|
|
712
|
+
/*
|
|
713
|
+
The hairline around an unhealthy chip on this surface. The surface's own hairline, for the reason online-border and expired-border take it: a dark ground has no paler rung of the tone to reach for, and the light tint this scope carries is a dot. */
|
|
714
|
+
--cg-unhealthy-border: var(--cg-border-hairline);
|
|
715
|
+
/*
|
|
716
|
+
The hairline around a danger chip on this surface. Same rule as every other -border here: the surface's own hairline. */
|
|
717
|
+
--cg-danger-border: var(--cg-border-hairline);
|
|
602
718
|
--cg-pending-border: var(--cg-expired-border);
|
|
603
719
|
--cg-online-strong: var(--cg-text-primary);
|
|
604
720
|
--cg-expired-strong: var(--cg-text-primary);
|
|
@@ -674,6 +790,12 @@
|
|
|
674
790
|
--cg-danger-fill: rgba(255, 255, 255, 0.08);
|
|
675
791
|
--cg-online-border: var(--cg-border-hairline);
|
|
676
792
|
--cg-expired-border: var(--cg-border-hairline);
|
|
793
|
+
/*
|
|
794
|
+
The hairline around an unhealthy chip on this surface. The surface's own hairline, for the reason online-border and expired-border take it: a dark ground has no paler rung of the tone to reach for, and the light tint this scope carries is a dot. */
|
|
795
|
+
--cg-unhealthy-border: var(--cg-border-hairline);
|
|
796
|
+
/*
|
|
797
|
+
The hairline around a danger chip on this surface. Same rule as every other -border here: the surface's own hairline. */
|
|
798
|
+
--cg-danger-border: var(--cg-border-hairline);
|
|
677
799
|
--cg-pending-border: var(--cg-expired-border);
|
|
678
800
|
--cg-online-strong: var(--cg-text-primary);
|
|
679
801
|
--cg-expired-strong: var(--cg-text-primary);
|
package/dist/tokens.json
CHANGED
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
"--cg-danger-fill": "#fceded",
|
|
21
21
|
"--cg-online-border": "#abefc6",
|
|
22
22
|
"--cg-expired-border": "#fedf89",
|
|
23
|
+
"--cg-unhealthy-border": "#eee596",
|
|
24
|
+
"--cg-danger-border": "#ffd3cd",
|
|
23
25
|
"--cg-pending-border": "var(--cg-expired-border)",
|
|
24
26
|
"--cg-online-strong": "#085d3a",
|
|
25
27
|
"--cg-expired-strong": "#7a3d0a",
|
|
@@ -128,6 +130,7 @@
|
|
|
128
130
|
"--cg-shadow-hover": "0 8px 24px rgba(34, 34, 34, 0.08)",
|
|
129
131
|
"--cg-shadow-panel": "0 10px 40px rgba(90, 71, 240, 0.18)",
|
|
130
132
|
"--cg-ring-focus": "0 0 0 3px var(--cg-focus-ring)",
|
|
133
|
+
"--cg-ring-live": "0 0 0 4px var(--cg-live-halo)",
|
|
131
134
|
"--cg-duration-fast": "120ms",
|
|
132
135
|
"--cg-duration": "180ms",
|
|
133
136
|
"--cg-duration-slow": "280ms",
|
|
@@ -138,6 +141,7 @@
|
|
|
138
141
|
"--cg-press-scale": "0.985",
|
|
139
142
|
"--cg-volt": "#b6ff2e",
|
|
140
143
|
"--cg-volt-ink": "#243d00",
|
|
144
|
+
"--cg-live-halo": "color-mix(in srgb, var(--cg-volt) 32%, transparent)",
|
|
141
145
|
"--cg-scrim": "rgba(34, 34, 34, 0.4)",
|
|
142
146
|
"--cg-hover": "rgba(34, 34, 34, 0.045)"
|
|
143
147
|
},
|
|
@@ -166,6 +170,8 @@
|
|
|
166
170
|
"--cg-danger-fill": "rgba(255, 255, 255, 0.16)",
|
|
167
171
|
"--cg-online-border": "var(--cg-border-hairline)",
|
|
168
172
|
"--cg-expired-border": "var(--cg-border-hairline)",
|
|
173
|
+
"--cg-unhealthy-border": "var(--cg-border-hairline)",
|
|
174
|
+
"--cg-danger-border": "var(--cg-border-hairline)",
|
|
169
175
|
"--cg-pending-border": "var(--cg-expired-border)",
|
|
170
176
|
"--cg-online-strong": "var(--cg-text-primary)",
|
|
171
177
|
"--cg-expired-strong": "var(--cg-text-primary)",
|
|
@@ -201,6 +207,8 @@
|
|
|
201
207
|
"--cg-danger-fill": "rgba(255, 255, 255, 0.08)",
|
|
202
208
|
"--cg-online-border": "var(--cg-border-hairline)",
|
|
203
209
|
"--cg-expired-border": "var(--cg-border-hairline)",
|
|
210
|
+
"--cg-unhealthy-border": "var(--cg-border-hairline)",
|
|
211
|
+
"--cg-danger-border": "var(--cg-border-hairline)",
|
|
204
212
|
"--cg-pending-border": "var(--cg-expired-border)",
|
|
205
213
|
"--cg-online-strong": "var(--cg-text-primary)",
|
|
206
214
|
"--cg-expired-strong": "var(--cg-text-primary)",
|
package/package.json
CHANGED