@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/dist/components/theme/AppearancePickers.js +11 -11
- package/dist/components/theme/AppearancePickers.js.map +1 -1
- package/dist/components/ui/Combobox.d.ts +7 -0
- package/dist/components/ui/Combobox.js +7 -2
- package/dist/components/ui/Combobox.js.map +1 -1
- package/dist/contexts/theme-context.js +33 -13
- package/dist/contexts/theme-context.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -0
- package/dist/specimen/TokensSpecimen.js +33 -13
- package/dist/specimen/TokensSpecimen.js.map +1 -1
- package/dist/theme/appearance-resolution.js +9 -9
- package/dist/theme/appearance-resolution.js.map +1 -1
- package/dist/theme/init-script.d.ts +5 -0
- package/dist/theme/init-script.js +32 -10
- package/dist/theme/init-script.js.map +1 -1
- package/dist/theme/palettes.d.ts +48 -17
- package/dist/theme/palettes.js +12 -10
- package/dist/theme/palettes.js.map +1 -1
- package/dist/theme/types.d.ts +26 -1
- package/dist/theme/types.js +19 -2
- package/dist/theme/types.js.map +1 -1
- package/package.json +1 -1
- package/theme.css +100 -43
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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='
|
|
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='
|
|
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
|
|
3950
|
-
palette for the v1")
|
|
3951
|
-
`
|
|
3952
|
-
|
|
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
|
-
/* `
|
|
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 `
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
|
|
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='
|
|
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='
|
|
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='
|
|
4049
|
-
[data-appearance-scope][data-palette='
|
|
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:
|
|
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
|
-
|
|
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/
|
|
4289
|
-
[data-palette='
|
|
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
|
|
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
|
-
|
|
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
|
|
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) —
|
|
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='
|
|
4394
|
-
[data-palette='
|
|
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
|
|
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
|
|
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. */
|