@motir/design-system 0.5.0 → 0.6.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/theme.css CHANGED
@@ -1313,15 +1313,36 @@
1313
1313
  is not a colour-painting property, so the material-rule test skips it.
1314
1314
  Per-surface exceptions (the board column's clip-safe shadow, modals) override
1315
1315
  below by source order. Modals carry their own deeper shadow via the modal
1316
- radius (next rule). */
1316
+ radius (next rule).
1317
+
1318
+ ⚠️ EVERY 3D `box-shadow` BELOW LEADS WITH TAILWIND'S RING LAYERS, AND MUST.
1319
+ A Tailwind `ring-*` IS a box-shadow — `--tw-ring-offset-shadow` +
1320
+ `--tw-ring-shadow`, painted by the utility inside `@layer utilities`. These
1321
+ rules are UNLAYERED, and an unlayered declaration outranks a layered one
1322
+ whatever their specificity, so a rule that sets `box-shadow` to the depth
1323
+ alone ERASES the ring: the roadmap canvas's search match, selection and
1324
+ Show-changes emphasis, and every control's `focus-visible:ring`, all went
1325
+ blank in this style (MOTIR-6440). So each rule composes the ring layers
1326
+ FIRST and its depth after — the same order Tailwind's own utility uses. At
1327
+ rest the ring variables are `0 0 #0000` (their registered initial value, and
1328
+ the fallback here for a build that emits no ring utility), so the depth is
1329
+ unchanged; when a ring is on, it paints over it. A `none` becomes the ring
1330
+ layers alone. `tests/theme/immersiveRingSurvivesDepth.test.ts` reads every
1331
+ such rule back off the compiled stylesheet and fails on one that drops them.
1332
+ `--tw-shadow` is deliberately NOT composed: replacing the element's own
1333
+ `shadow-*` IS the style. */
1317
1334
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1318
1335
  .rounded-\(--radius-card\) {
1319
- box-shadow: var(--shadow-card);
1336
+ box-shadow:
1337
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1338
+ var(--tw-ring-shadow, 0 0 #0000), var(--shadow-card);
1320
1339
  }
1321
1340
  }
1322
1341
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1323
1342
  .rounded-\(--radius-modal\) {
1324
- box-shadow: var(--shadow-modal);
1343
+ box-shadow:
1344
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1345
+ var(--tw-ring-shadow, 0 0 #0000), var(--shadow-modal);
1325
1346
  }
1326
1347
  }
1327
1348
 
@@ -1369,7 +1390,9 @@
1369
1390
  transition:
1370
1391
  transform 80ms linear,
1371
1392
  box-shadow 260ms ease-out;
1372
- box-shadow: var(--shadow-elevated);
1393
+ box-shadow:
1394
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1395
+ var(--tw-ring-shadow, 0 0 #0000), var(--shadow-elevated);
1373
1396
  }
1374
1397
  }
1375
1398
 
@@ -1552,6 +1575,9 @@
1552
1575
  )
1553
1576
  ) {
1554
1577
  box-shadow:
1578
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1579
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1580
+ var(--tw-ring-shadow, 0 0 #0000),
1555
1581
  0 3px 0 0 var(--el-border-strong),
1556
1582
  0 5px 10px -3px rgba(15, 15, 15, 0.18);
1557
1583
  transition:
@@ -1563,6 +1589,9 @@
1563
1589
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1564
1590
  [data-variant='primary'] {
1565
1591
  box-shadow:
1592
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1593
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1594
+ var(--tw-ring-shadow, 0 0 #0000),
1566
1595
  0 4px 0 0 var(--el-accent-pressed),
1567
1596
  0 7px 12px -3px rgba(15, 15, 15, 0.32);
1568
1597
  }
@@ -1570,6 +1599,9 @@
1570
1599
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1571
1600
  [data-variant='danger'] {
1572
1601
  box-shadow:
1602
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1603
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1604
+ var(--tw-ring-shadow, 0 0 #0000),
1573
1605
  0 4px 0 0 color-mix(in srgb, var(--el-danger), black 32%),
1574
1606
  0 7px 12px -3px rgba(15, 15, 15, 0.32);
1575
1607
  }
@@ -1577,7 +1609,9 @@
1577
1609
  /* Ghost — the deliberately-flat quiet button; no thickness. */
1578
1610
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1579
1611
  [data-variant='ghost'] {
1580
- box-shadow: none;
1612
+ box-shadow:
1613
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1614
+ var(--tw-ring-shadow, 0 0 #0000);
1581
1615
  }
1582
1616
  }
1583
1617
 
@@ -1597,7 +1631,9 @@
1597
1631
  ),
1598
1632
  :is([data-surface='popover'], [data-menu-surface]) :is(button, a).rounded-\(--radius-control\),
1599
1633
  :is(button, a).w-full.rounded-\(--radius-control\) {
1600
- box-shadow: none;
1634
+ box-shadow:
1635
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1636
+ var(--tw-ring-shadow, 0 0 #0000);
1601
1637
  }
1602
1638
  }
1603
1639
 
@@ -1612,6 +1648,9 @@
1612
1648
  ):active:not(:disabled) {
1613
1649
  transform: translateY(3px);
1614
1650
  box-shadow:
1651
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1652
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1653
+ var(--tw-ring-shadow, 0 0 #0000),
1615
1654
  0 1px 0 0 var(--el-border-strong),
1616
1655
  0 2px 4px rgba(15, 15, 15, 0.14);
1617
1656
  }
@@ -1619,6 +1658,9 @@
1619
1658
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1620
1659
  [data-variant='primary']:active:not(:disabled) {
1621
1660
  box-shadow:
1661
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1662
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1663
+ var(--tw-ring-shadow, 0 0 #0000),
1622
1664
  0 1px 0 0 var(--el-accent-pressed),
1623
1665
  0 2px 5px rgba(15, 15, 15, 0.22);
1624
1666
  }
@@ -1626,13 +1668,18 @@
1626
1668
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1627
1669
  [data-variant='danger']:active:not(:disabled) {
1628
1670
  box-shadow:
1671
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1672
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1673
+ var(--tw-ring-shadow, 0 0 #0000),
1629
1674
  0 1px 0 0 color-mix(in srgb, var(--el-danger), black 32%),
1630
1675
  0 2px 5px rgba(15, 15, 15, 0.22);
1631
1676
  }
1632
1677
  }
1633
1678
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1634
1679
  [data-variant='ghost']:active:not(:disabled) {
1635
- box-shadow: none;
1680
+ box-shadow:
1681
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1682
+ var(--tw-ring-shadow, 0 0 #0000);
1636
1683
  }
1637
1684
  }
1638
1685
 
@@ -1664,6 +1711,9 @@
1664
1711
  select
1665
1712
  ) {
1666
1713
  box-shadow:
1714
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1715
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1716
+ var(--tw-ring-shadow, 0 0 #0000),
1667
1717
  inset 0 2px 6px -2px rgba(15, 15, 15, 0.26),
1668
1718
  inset 0 1px 2px 0 rgba(15, 15, 15, 0.05);
1669
1719
  }
@@ -1726,7 +1776,9 @@
1726
1776
  right depth. */
1727
1777
  @scope ([data-style='3d-immersive']) to ([data-style]) {
1728
1778
  .shadow-\(--shadow-elevated\) {
1729
- box-shadow: var(--shadow-elevated);
1779
+ box-shadow:
1780
+ var(--tw-inset-ring-shadow, 0 0 #0000), var(--tw-ring-offset-shadow, 0 0 #0000),
1781
+ var(--tw-ring-shadow, 0 0 #0000), var(--shadow-elevated);
1730
1782
  }
1731
1783
  }
1732
1784
  @media (prefers-reduced-motion: no-preference) {
@@ -3253,7 +3305,7 @@
3253
3305
  --el-danger-on-surface is the ink for danger text ON a page: the palette's
3254
3306
  own danger hue pulled 30% toward that theme's body ink, which is the
3255
3307
  smallest move that clears AA everywhere. Raw --el-danger does NOT — it is
3256
- 4.25:1 (base), 4.11:1 (cobalt) and 4.24:1 (graphite) on the DARK page, and
3308
+ 4.25:1 (base), 4.11:1 (cobalt) and 4.24:1 (motir, then graphite) on the DARK page, and
3257
3309
  under 4.5 on most tints in both themes.
3258
3310
  DERIVED rather than listed, deliberately: both inputs are tokens, so it
3259
3311
  re-skins with data-palette and a new palette is covered on the day it is
@@ -3323,7 +3375,7 @@
3323
3375
  palettes x both themes (tests/theme/statusHueSeparation.test.ts).
3324
3376
  ⚠️ It is NOT --color-accent, which `design/boards/implemented-column.mock.html`
3325
3377
  originally specified: that reads clean in the base palette and collides in
3326
- five of the ten (amber/candy/citrine/graphite/sienna, ΔE as low as 0.0). The
3378
+ five of the ten (amber/candy/citrine/graphite — now motir — /sienna, ΔE as low as 0.0). The
3327
3379
  asset carries the correction and the measurement. */
3328
3380
  /* pink — BUILT, waiting on checks (MOTIR-3003). The one saturated Tier-0 hue
3329
3381
  no other STATUS spends; sharing a hue across FAMILIES is this file's own
@@ -3345,7 +3397,7 @@
3345
3397
  the four palettes that ride this base value (cobalt, evergreen, spectrum,
3346
3398
  garnet) re-skin it as before and each GAINS contrast; ΔE2000 to the nearest
3347
3399
  sibling stays >= 13.7 in all ten palettes x both themes (27.1 / 26.8 here).
3348
- Why the base and not a [data-palette='motir'] block: <html> carries no
3400
+ Why the base and not a [data-palette='amethyst'] block: <html> carries no
3349
3401
  data-appearance-scope, so a root palette block would be a second cascade
3350
3402
  nobody renders — the base layer IS how the browser reaches these values. */
3351
3403
  --el-status-implemented: color-mix(in srgb, var(--color-accent) 75%, var(--color-charcoal));
@@ -3365,7 +3417,7 @@
3365
3417
  palette-tuned, so the nine palettes that ride this base value re-skin it as
3366
3418
  before and each keeps its own --color-success; ΔE2000 to the nearest
3367
3419
  sibling stays >= 11.3 in all ten palettes x both themes. Why the base and
3368
- not a [data-palette='motir'] block: same as --el-status-implemented above —
3420
+ not a [data-palette='amethyst'] block: same as --el-status-implemented above —
3369
3421
  <html> carries no data-appearance-scope, so the base layer IS how the
3370
3422
  browser reaches these values. */
3371
3423
  /* A person's YES, and NOT yet shipped (MOTIR-5139). The `done` green one ink
@@ -3946,10 +3998,13 @@
3946
3998
  motion / type). That is the data-style axis's job; keeping the two disjoint
3947
3999
  is what makes "style × palette" a product of two independent choices.
3948
4000
 
3949
- v1 ships exactly one palette — `motir` (Yue, 2026-06-17: "use Motir's colour
3950
- palette for the v1"). It IS the Tier-3 base, so — exactly like the
3951
- `warm-editorial` base style — it needs NO override block: setting
3952
- data-palette="motir" simply leaves the base --el-* tokens in force. Each
4001
+ v1 shipped exactly one palette, the warm one (Yue, 2026-06-17: "use Motir's
4002
+ colour palette for the v1"), then called `motir` and since MOTIR-6471 called
4003
+ `amethyst`. It IS the Tier-3 base, so — exactly like the `warm-editorial`
4004
+ base style — it needs NO root override block: data-palette="amethyst" simply
4005
+ leaves the base --el-* tokens in force. `motir` now names the monochrome
4006
+ palette (formerly `graphite`), whose block is below; it is the default id,
4007
+ and <html> always carries a data-palette, so the base is a fallback. Each
3953
4008
  later "Palette: …" subtask ADDS its `[data-palette='<id>']` block here,
3954
4009
  overriding --el-* (light + dark via [data-palette='<id>'][data-theme='dark']
3955
4010
  where the palette diverges from the base flip), and authors its
@@ -3957,21 +4012,22 @@
3957
4012
  [data-style] block on the other axis.
3958
4013
  ═══════════════════════════════════════════════════════════════════════ */
3959
4014
 
3960
- /* `motir` needs no block — it is the Tier-3 base above. Each later palette
3961
- ADDS its [data-palette='<id>'] override here (light + dark companion). */
4015
+ /* `amethyst` needs no root block — it is the Tier-3 base above. Each other
4016
+ palette ADDS its [data-palette='<id>'] override here (light + dark companion). */
3962
4017
 
3963
- /* ── The `motir` BASE palette, re-asserted for a SCOPED subtree (MOTIR-3933) ──
3964
- `motir` is the Tier-0 default, so it historically had NO block: the base
3965
- values simply were the palette. That is correct for `<html>` and wrong for a
3966
- NESTED scope, which inherits its ancestor's palette and has nothing to
3967
- override it with — a `motir` preview under a `graphite` document rendered as
3968
- graphite. Every other palette re-asserts, so the base must too.
4018
+ /* ── The `amethyst` BASE palette, re-asserted for a SCOPED subtree (MOTIR-3933) ──
4019
+ The warm palette is the Tier-0 default (it was called `motir` until
4020
+ MOTIR-6471), so it historically had NO block: the base values simply were
4021
+ the palette. That is correct for `<html>` and wrong for a NESTED scope, which
4022
+ inherits its ancestor's palette and has nothing to override it with — a warm
4023
+ preview under a monochrome document rendered as monochrome. Every other
4024
+ palette re-asserts, so the base must too.
3969
4025
 
3970
4026
  ⚠️ SCOPED BY `[data-appearance-scope]`, DELIBERATELY. `<html>` never carries
3971
4027
  that attribute, so this block matches only a nested preview and the ROOT
3972
4028
  cascade is byte-identical to before. It also keeps the block from reading as
3973
4029
  a palette OVERRIDE: several `tests/theme/*` guards DERIVE "which palettes
3974
- override this token" from the stylesheet, and a bare `[data-palette='motir']`
4030
+ override this token" from the stylesheet, and a bare `[data-palette='amethyst']`
3975
4031
  block silently enrolled the BASE palette in bars written for overrides. It is
3976
4032
  not an override — it is a scope reset — and the selector now says so.
3977
4033
 
@@ -3985,7 +4041,7 @@
3985
4041
  which is a file that has never existed, and the VALUE assertion it promised
3986
4042
  had never been written either — only the token-SET one had. Both are true
3987
4043
  now. A citation to a guard is worth exactly as much as the guard. */
3988
- [data-appearance-scope][data-palette='motir'] {
4044
+ [data-appearance-scope][data-palette='amethyst'] {
3989
4045
  --color-accent: #ff64c8;
3990
4046
  --color-accent-green: #1aae39;
3991
4047
  --color-accent-orange: #dd5b00;
@@ -4045,8 +4101,8 @@
4045
4101
  overrides; the rest keep the light block's values above. Two selectors for
4046
4102
  the same reason every other palette now has two: the compound one for
4047
4103
  `<html>`, the descendant one for a nested scope. */
4048
- [data-theme='dark'] [data-appearance-scope][data-palette='motir']:not([data-theme]),
4049
- [data-appearance-scope][data-palette='motir'][data-theme='dark'] {
4104
+ [data-theme='dark'] [data-appearance-scope][data-palette='amethyst']:not([data-theme]),
4105
+ [data-appearance-scope][data-palette='amethyst'][data-theme='dark'] {
4050
4106
  --color-background: #0f0f0f;
4051
4107
  --color-border: #2a2a2a;
4052
4108
  --color-canvas: #0e0e0e;
@@ -4256,9 +4312,10 @@
4256
4312
  --el-priority-high: var(--color-warning);
4257
4313
  }
4258
4314
 
4259
- /* ── Palette: Graphite (data-palette="graphite") — Subtask 7.3.51 ───────────
4315
+ /* ── Palette: Motir (data-palette="motir") — Subtask 7.3.51, renamed from
4316
+ "Graphite" (the retired `graphite` id) and made the default in MOTIR-6471 ──
4260
4317
  A stark, editorial, COOL-NEUTRAL MONOCHROME re-skin — the cool foil to
4261
- Motir's warmth: true greyscale surfaces + ink on a clean Radix Slate scale,
4318
+ Amethyst's warmth (the base): true greyscale surfaces + ink on a clean Radix Slate scale,
4262
4319
  a single restrained accent. The accent is expressed two ways, exactly as
4263
4320
  Vercel / Linear do it: the primary CTA is a high-contrast INK fill (near-black
4264
4321
  on light, near-white on dark — the monochrome statement), while the one
@@ -4285,8 +4342,8 @@
4285
4342
  Accessibility: every text-on-surface, white-on-fill, link, and chip-tint
4286
4343
  pairing clears WCAG AA (≥4.5; ≥3.0 for icon/UI hues) in BOTH light and dark —
4287
4344
  verified numerically + by rendered specimen, never eyeballed. See
4288
- docs/palettes/graphite.md for the colour-role reference. */
4289
- [data-palette='graphite'] {
4345
+ docs/palettes/motir.md for the colour-role reference. */
4346
+ [data-palette='motir'] {
4290
4347
  /* brand & primary — the high-contrast INK CTA + the single cool-blue accent.
4291
4348
  --color-primary is the accent AS text/icon/focus on a surface (the cool
4292
4349
  blue, AA on white & the slate surface); --color-primary-fill is the CTA
@@ -4294,7 +4351,7 @@
4294
4351
  --color-primary: #155bc4; /* cool-blue accent — links / active / focus / icon */
4295
4352
  --color-primary-foreground: #ffffff; /* white labels on the ink fill */
4296
4353
  --color-primary-pressed: #2b2f35; /* pressed ink CTA (one step off the fill) */
4297
- --color-primary-fill: #1a1d21; /* near-black graphite CTA fill (white-on AA) */
4354
+ --color-primary-fill: #1a1d21; /* near-black ink CTA fill (white-on AA) */
4298
4355
 
4299
4356
  /* surfaces — pure white canvas over cool slate sections (Radix Slate) */
4300
4357
  --color-background: #ffffff; /* stark white canvas */
@@ -4352,7 +4409,7 @@
4352
4409
  /* Status ramp — the one place the mono identity COLLIDES with the Tier-0
4353
4410
  indirection (MOTIR-2073). `--el-status-in-progress` rides --color-info and
4354
4411
  `--el-status-in-review` rides --color-primary; every other palette keeps
4355
- those two sources apart, but Graphite deliberately unifies them (info =
4412
+ those two sources apart, but Motir (then Graphite) deliberately unifies them (info =
4356
4413
  the accent, above), which re-collapsed in_review onto in_progress — the
4357
4414
  exact differentiation MOTIR-1273 delivered. The fix keeps BOTH deliberate
4358
4415
  choices by giving the status ramp its own SECOND STEP of the same accent
@@ -4366,7 +4423,7 @@
4366
4423
  /* Priority ramp — highest vs high (MOTIR-2094, the MOTIR-2085 shape in a
4367
4424
  second palette). `--el-priority-highest` rides --color-destructive
4368
4425
  (#c92a2a) and `--el-priority-high` rides --color-warning (#c2410c);
4369
- Graphite's warning is a RED-leaning burnt orange sitting beside its danger
4426
+ this palette's warning is a RED-leaning burnt orange sitting beside its danger
4370
4427
  red, so the two land ΔE2000 10.02 apart. That PASSES the ΔE 10 bar a
4371
4428
  coloured priority GLYPH needs — by 0.02, which is rounding, not margin: the
4372
4429
  two marks are at the perceptual minimum, and any future nudge to either
@@ -4374,24 +4431,24 @@
4374
4431
  identity (the chrome is greyscale; semantic hues stay chromatic on purpose),
4375
4432
  so it is a collision to fix, not a choice to document.
4376
4433
  The fix is Cobalt's: neither semantic moves — danger stays danger, warning
4377
- stays warning — and the PRIORITY ramp takes its own step of a hue Graphite
4434
+ stays warning — and the PRIORITY ramp takes its own step of a hue this palette
4378
4435
  already owns, Radix Amber 11, one of this palette's documented Radix
4379
4436
  sources. Separation from highest ΔE 24.7 (nearest other step, medium, ΔE
4380
4437
  32.2); contrast 4.6:1 card / 4.0:1 surface, past the 3:1 icon/UI bar. */
4381
4438
  --el-priority-high: #ab6400; /* Radix Amber 11 — the ramp's own amber step */
4382
- /* implemented (MOTIR-3003) — Graphite's --color-accent is its blue accent, a
4439
+ /* implemented (MOTIR-3003) — this palette's --color-accent is its blue accent, a
4383
4440
  step from the same family as --el-status-in-progress. The ink step is free
4384
4441
  here and reads as "not yet coloured in", which is what the state is:
4385
4442
  ΔE 15.9 light / 11.8 dark from the nearest status. */
4386
4443
  --el-status-implemented: var(--color-charcoal);
4387
4444
  }
4388
4445
 
4389
- /* Graphite — dark companion. A cool near-black slate canvas; the CTA fill
4446
+ /* Motir (formerly Graphite) — dark companion. A cool near-black slate canvas; the CTA fill
4390
4447
  inverts to near-WHITE ink (Vercel's dark white-button), the accent blue
4391
4448
  brightens so it reads AS text on the dark canvas, and semantic/type hues
4392
4449
  brighten to clear AA on near-black. */
4393
- [data-theme='dark'] [data-palette='graphite']:not([data-theme]),
4394
- [data-palette='graphite'][data-theme='dark'] {
4450
+ [data-theme='dark'] [data-palette='motir']:not([data-theme]),
4451
+ [data-palette='motir'][data-theme='dark'] {
4395
4452
  --color-background: #0c0d0f; /* stark cool near-black canvas */
4396
4453
  --color-foreground: #edeef0;
4397
4454
  --color-surface: #18191c; /* cool slate section */
@@ -4627,7 +4684,7 @@
4627
4684
  /* Status ramp (MOTIR-2075) — two collisions in this theme.
4628
4685
  in_review vs done: emerald #3ddc97 against grass #34d27a, ΔE2000 4.7. Same
4629
4686
  fix as light, inverted: Radix Jade 12's DARK step, pale rather than deep —
4630
- the light/dark inversion Graphite's accent step already uses. ΔE 17.2;
4687
+ the light/dark inversion this palette's accent step already uses. ΔE 17.2;
4631
4688
  contrast 13.3:1 surface / 14.5:1 card.
4632
4689
  todo vs cancelled: --color-stone #5a6b62 against --color-steel #6f8077,
4633
4690
  ΔE 8.3 — this palette's neutral ramp is compressed against the base's
@@ -4869,7 +4926,7 @@
4869
4926
  --el-sidebar-item-bg-hover: #261f3d;
4870
4927
 
4871
4928
  /* Priority ramp — the dark half of the light block's amber step (MOTIR-2107).
4872
- UNLIKE cobalt and graphite (whose dark hues were already far enough apart to
4929
+ UNLIKE cobalt and motir (whose dark hues were already far enough apart to
4873
4930
  re-assert the source here), Spectrum's dark destructive #f0555f and warning
4874
4931
  #fb8b4c render a chip only ΔE 4.8 apart, so dark carries its own amber too:
4875
4932
  the brighter #fbab4c the other dark palettes already use, which reads as an
@@ -5419,7 +5476,7 @@
5419
5476
  Miro's OTHER brand hue at its own depth — the action blue, blue-650 — which
5420
5477
  leaves blocked on the warning gold where its semantics belong. Note
5421
5478
  in_progress rides blue-500 #3859ff: same family, two depths, ΔE 17.0 apart,
5422
- the Graphite idiom. Contrast 9.2:1 surface / 10.2:1 card.
5479
+ the Motir (ex-Graphite) idiom. Contrast 9.2:1 surface / 10.2:1 card.
5423
5480
  todo vs cancelled: gray-450 #7f8497 vs gray-500 #656b81, ΔE 10.0 — one step
5424
5481
  apart on Mirotone's gray ramp. cancelled drops to gray-600. ΔE 20.6;
5425
5482
  contrast 7.5:1 / 8.3:1. */