@hanzo/design 0.5.14 → 0.5.16
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/tokens.gen.d.ts +10 -7
- package/dist/tokens.gen.d.ts.map +1 -1
- package/dist/tokens.gen.js +10 -7
- package/package.json +2 -2
- package/src/tokens.gen.ts +8 -7
- package/styles.css +34 -4
- package/tailwind.css +34 -4
- package/tokens/base.css +22 -1
- package/tokens/colors.css +12 -3
package/dist/tokens.gen.d.ts
CHANGED
|
@@ -35,11 +35,11 @@ export declare const colors: {
|
|
|
35
35
|
readonly 'white-80': "rgb(255 255 255 / .80)";
|
|
36
36
|
readonly 'white-92': "rgb(255 255 255 / .92)";
|
|
37
37
|
readonly background: "#0a0a0a";
|
|
38
|
-
readonly foreground: "#
|
|
38
|
+
readonly foreground: "#e5e5e5";
|
|
39
39
|
readonly card: "#0f0f0f";
|
|
40
|
-
readonly 'card-foreground': "#
|
|
40
|
+
readonly 'card-foreground': "#e5e5e5";
|
|
41
41
|
readonly popover: "#0f0f0f";
|
|
42
|
-
readonly 'popover-foreground': "#
|
|
42
|
+
readonly 'popover-foreground': "#e5e5e5";
|
|
43
43
|
readonly primary: "#fafafa";
|
|
44
44
|
readonly 'primary-hover': "#e5e5e5";
|
|
45
45
|
readonly 'primary-foreground': "#0a0a0a";
|
|
@@ -304,7 +304,9 @@ export declare const fonts: {
|
|
|
304
304
|
readonly 'font-feature-settings': "\"ss01\",\"ss02\",\"cv01\",\"cv02\",\"cv03\"";
|
|
305
305
|
};
|
|
306
306
|
/** base tokens (from tokens/base.css). Values are raw CSS. */
|
|
307
|
-
export declare const base: {
|
|
307
|
+
export declare const base: {
|
|
308
|
+
readonly 'ring-offset': "-2px";
|
|
309
|
+
};
|
|
308
310
|
/** Every token, keyed by its literal CSS custom-property name ('--background', …). */
|
|
309
311
|
export declare const cssVars: {
|
|
310
312
|
readonly '--neutral-50': "#FAFAFA";
|
|
@@ -342,11 +344,11 @@ export declare const cssVars: {
|
|
|
342
344
|
readonly '--white-80': "rgb(255 255 255 / .80)";
|
|
343
345
|
readonly '--white-92': "rgb(255 255 255 / .92)";
|
|
344
346
|
readonly '--background': "#0a0a0a";
|
|
345
|
-
readonly '--foreground': "#
|
|
347
|
+
readonly '--foreground': "#e5e5e5";
|
|
346
348
|
readonly '--card': "#0f0f0f";
|
|
347
|
-
readonly '--card-foreground': "#
|
|
349
|
+
readonly '--card-foreground': "#e5e5e5";
|
|
348
350
|
readonly '--popover': "#0f0f0f";
|
|
349
|
-
readonly '--popover-foreground': "#
|
|
351
|
+
readonly '--popover-foreground': "#e5e5e5";
|
|
350
352
|
readonly '--primary': "#fafafa";
|
|
351
353
|
readonly '--primary-hover': "#e5e5e5";
|
|
352
354
|
readonly '--primary-foreground': "#0a0a0a";
|
|
@@ -585,6 +587,7 @@ export declare const cssVars: {
|
|
|
585
587
|
readonly '--font-mono': "\"Geist Mono\",ui-monospace,SFMono-Regular,monospace";
|
|
586
588
|
readonly '--font-serif': "Georgia,serif";
|
|
587
589
|
readonly '--font-feature-settings': "\"ss01\",\"ss02\",\"cv01\",\"cv02\",\"cv03\"";
|
|
590
|
+
readonly '--ring-offset': "-2px";
|
|
588
591
|
};
|
|
589
592
|
export type CssVarName = keyof typeof cssVars;
|
|
590
593
|
//# sourceMappingURL=tokens.gen.d.ts.map
|
package/dist/tokens.gen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.gen.d.ts","sourceRoot":"","sources":["../src/tokens.gen.ts"],"names":[],"mappings":"AAIA,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FT,CAAA;AAEV,0EAA0E;AAC1E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEb,CAAA;AAEV,oEAAoE;AACpE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CV,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI;;;;;;;;;;;;CAYP,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;CAaT,CAAA;AAEV,6DAA6D;AAC7D,eAAO,MAAM,MAAM;;;;;;;;;;;;CAYT,CAAA;AAEV,gEAAgE;AAChE,eAAO,MAAM,KAAK;;;;;;CAMR,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"tokens.gen.d.ts","sourceRoot":"","sources":["../src/tokens.gen.ts"],"names":[],"mappings":"AAIA,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FT,CAAA;AAEV,0EAA0E;AAC1E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEb,CAAA;AAEV,oEAAoE;AACpE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CV,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI;;;;;;;;;;;;CAYP,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;CAaT,CAAA;AAEV,6DAA6D;AAC7D,eAAO,MAAM,MAAM;;;;;;;;;;;;CAYT,CAAA;AAEV,gEAAgE;AAChE,eAAO,MAAM,KAAK;;;;;;CAMR,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI;;CAEP,CAAA;AAEV,sFAAsF;AACtF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwRV,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAA"}
|
package/dist/tokens.gen.js
CHANGED
|
@@ -38,11 +38,11 @@ export const colors = {
|
|
|
38
38
|
'white-80': 'rgb(255 255 255 / .80)',
|
|
39
39
|
'white-92': 'rgb(255 255 255 / .92)',
|
|
40
40
|
'background': '#0a0a0a',
|
|
41
|
-
'foreground': '#
|
|
41
|
+
'foreground': '#e5e5e5',
|
|
42
42
|
'card': '#0f0f0f',
|
|
43
|
-
'card-foreground': '#
|
|
43
|
+
'card-foreground': '#e5e5e5',
|
|
44
44
|
'popover': '#0f0f0f',
|
|
45
|
-
'popover-foreground': '#
|
|
45
|
+
'popover-foreground': '#e5e5e5',
|
|
46
46
|
'primary': '#fafafa',
|
|
47
47
|
'primary-hover': '#e5e5e5',
|
|
48
48
|
'primary-foreground': '#0a0a0a',
|
|
@@ -307,7 +307,9 @@ export const fonts = {
|
|
|
307
307
|
'font-feature-settings': '"ss01","ss02","cv01","cv02","cv03"',
|
|
308
308
|
};
|
|
309
309
|
/** base tokens (from tokens/base.css). Values are raw CSS. */
|
|
310
|
-
export const base = {
|
|
310
|
+
export const base = {
|
|
311
|
+
'ring-offset': '-2px',
|
|
312
|
+
};
|
|
311
313
|
/** Every token, keyed by its literal CSS custom-property name ('--background', …). */
|
|
312
314
|
export const cssVars = {
|
|
313
315
|
'--neutral-50': '#FAFAFA',
|
|
@@ -345,11 +347,11 @@ export const cssVars = {
|
|
|
345
347
|
'--white-80': 'rgb(255 255 255 / .80)',
|
|
346
348
|
'--white-92': 'rgb(255 255 255 / .92)',
|
|
347
349
|
'--background': '#0a0a0a',
|
|
348
|
-
'--foreground': '#
|
|
350
|
+
'--foreground': '#e5e5e5',
|
|
349
351
|
'--card': '#0f0f0f',
|
|
350
|
-
'--card-foreground': '#
|
|
352
|
+
'--card-foreground': '#e5e5e5',
|
|
351
353
|
'--popover': '#0f0f0f',
|
|
352
|
-
'--popover-foreground': '#
|
|
354
|
+
'--popover-foreground': '#e5e5e5',
|
|
353
355
|
'--primary': '#fafafa',
|
|
354
356
|
'--primary-hover': '#e5e5e5',
|
|
355
357
|
'--primary-foreground': '#0a0a0a',
|
|
@@ -588,4 +590,5 @@ export const cssVars = {
|
|
|
588
590
|
'--font-mono': '"Geist Mono",ui-monospace,SFMono-Regular,monospace',
|
|
589
591
|
'--font-serif': 'Georgia,serif',
|
|
590
592
|
'--font-feature-settings': '"ss01","ss02","cv01","cv02","cv03"',
|
|
593
|
+
'--ring-offset': '-2px',
|
|
591
594
|
};
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanzo/design",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.16",
|
|
4
4
|
"packageManager": "pnpm@11.17.0",
|
|
5
|
-
"description": "Hanzo Design System
|
|
5
|
+
"description": "Hanzo Design System \u2014 monochrome, dark-default tokens + components + brand assets, the single source of truth for every Hanzo surface. CSS + typed programmatic tokens.",
|
|
6
6
|
"license": "MIT OR Apache-2.0",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
package/src/tokens.gen.ts
CHANGED
|
@@ -39,11 +39,11 @@ export const colors = {
|
|
|
39
39
|
'white-80': 'rgb(255 255 255 / .80)',
|
|
40
40
|
'white-92': 'rgb(255 255 255 / .92)',
|
|
41
41
|
'background': '#0a0a0a',
|
|
42
|
-
'foreground': '#
|
|
42
|
+
'foreground': '#e5e5e5',
|
|
43
43
|
'card': '#0f0f0f',
|
|
44
|
-
'card-foreground': '#
|
|
44
|
+
'card-foreground': '#e5e5e5',
|
|
45
45
|
'popover': '#0f0f0f',
|
|
46
|
-
'popover-foreground': '#
|
|
46
|
+
'popover-foreground': '#e5e5e5',
|
|
47
47
|
'primary': '#fafafa',
|
|
48
48
|
'primary-hover': '#e5e5e5',
|
|
49
49
|
'primary-foreground': '#0a0a0a',
|
|
@@ -318,7 +318,7 @@ export const fonts = {
|
|
|
318
318
|
|
|
319
319
|
/** base tokens (from tokens/base.css). Values are raw CSS. */
|
|
320
320
|
export const base = {
|
|
321
|
-
|
|
321
|
+
'ring-offset': '-2px',
|
|
322
322
|
} as const
|
|
323
323
|
|
|
324
324
|
/** Every token, keyed by its literal CSS custom-property name ('--background', …). */
|
|
@@ -358,11 +358,11 @@ export const cssVars = {
|
|
|
358
358
|
'--white-80': 'rgb(255 255 255 / .80)',
|
|
359
359
|
'--white-92': 'rgb(255 255 255 / .92)',
|
|
360
360
|
'--background': '#0a0a0a',
|
|
361
|
-
'--foreground': '#
|
|
361
|
+
'--foreground': '#e5e5e5',
|
|
362
362
|
'--card': '#0f0f0f',
|
|
363
|
-
'--card-foreground': '#
|
|
363
|
+
'--card-foreground': '#e5e5e5',
|
|
364
364
|
'--popover': '#0f0f0f',
|
|
365
|
-
'--popover-foreground': '#
|
|
365
|
+
'--popover-foreground': '#e5e5e5',
|
|
366
366
|
'--primary': '#fafafa',
|
|
367
367
|
'--primary-hover': '#e5e5e5',
|
|
368
368
|
'--primary-foreground': '#0a0a0a',
|
|
@@ -601,6 +601,7 @@ export const cssVars = {
|
|
|
601
601
|
'--font-mono': '"Geist Mono",ui-monospace,SFMono-Regular,monospace',
|
|
602
602
|
'--font-serif': 'Georgia,serif',
|
|
603
603
|
'--font-feature-settings': '"ss01","ss02","cv01","cv02","cv03"',
|
|
604
|
+
'--ring-offset': '-2px',
|
|
604
605
|
} as const
|
|
605
606
|
|
|
606
607
|
export type CssVarName = keyof typeof cssVars
|
package/styles.css
CHANGED
|
@@ -92,11 +92,20 @@
|
|
|
92
92
|
|
|
93
93
|
/* ——— semantic aliases (dark, the default) ——— */
|
|
94
94
|
--background:#0a0a0a;
|
|
95
|
-
|
|
95
|
+
/* READING ink, one rung below the top of the ramp. The note at the head of this
|
|
96
|
+
file already made this argument once — #ffffff on #000000 halates, so #fafafa
|
|
97
|
+
— and the argument does not stop being true at 19.0:1. Every heading and
|
|
98
|
+
paragraph on every surface was set in the brightest ink the system has, while
|
|
99
|
+
the CHROME beside them draws body text at --white-92; a page read as glare
|
|
100
|
+
against its own header. #e5e5e5 is the neutral-200 rung this file already
|
|
101
|
+
spends on --primary-hover, so the ramp gains no new value: 15.7:1 on the page,
|
|
102
|
+
15.2:1 on a card, both more than twice the 7:1 AAA asks of body text.
|
|
103
|
+
Something that genuinely needs the brightest ink names --primary. */
|
|
104
|
+
--foreground:#e5e5e5;
|
|
96
105
|
--card:#0f0f0f;
|
|
97
|
-
--card-foreground:#
|
|
106
|
+
--card-foreground:#e5e5e5;
|
|
98
107
|
--popover:#0f0f0f;
|
|
99
|
-
--popover-foreground:#
|
|
108
|
+
--popover-foreground:#e5e5e5;
|
|
100
109
|
--primary:#fafafa;
|
|
101
110
|
/* A 5% step, not the 16% this used to be. A filled button's fill is already
|
|
102
111
|
the top of the ink ramp, so the only directions available on hover are
|
|
@@ -970,6 +979,22 @@
|
|
|
970
979
|
its buttons at 8-10px and nothing at 6px except 22px chips. */
|
|
971
980
|
border-radius:var(--radius-md);
|
|
972
981
|
padding:0 var(--space-3);
|
|
982
|
+
/* A field's ring is drawn INSIDE its own box. The one focus rule below
|
|
983
|
+
reads this; nothing else about the indicator changes.
|
|
984
|
+
|
|
985
|
+
A field lives in containers a button does not — composers, palettes and
|
|
986
|
+
panels that round their corners with `overflow:hidden`. An outline at a
|
|
987
|
+
POSITIVE offset is painted outside the border box, so any such ancestor
|
|
988
|
+
clips it, and the computed style still says `2px solid` while nothing is
|
|
989
|
+
drawn: a chat composer measured byte-identical screenshots focused and
|
|
990
|
+
unfocused, and a search pill kept only its left and right edges. A
|
|
991
|
+
negative offset cannot be clipped by anything, so a field needs to know
|
|
992
|
+
nothing about what contains it.
|
|
993
|
+
|
|
994
|
+
-2 against a 2px ring lays the outline over the outermost 2px of the box,
|
|
995
|
+
so it REPLACES the 1px edge for as long as focus is there rather than
|
|
996
|
+
drawing a second line a pixel inside the first. */
|
|
997
|
+
--ring-offset:-2px;
|
|
973
998
|
}
|
|
974
999
|
:where(textarea){padding:var(--space-2) var(--space-3);resize:vertical}
|
|
975
1000
|
/* A field has NO focus rule of its own — see the ring at the bottom of this
|
|
@@ -1036,6 +1061,11 @@
|
|
|
1036
1061
|
canvas and clears the 2px perimeter WCAG 2.4.13 asks for; the gate in
|
|
1037
1062
|
check-tokens holds --ring to that and nothing else here may weaken it.
|
|
1038
1063
|
|
|
1064
|
+
WHERE the ring sits is the one thing that varies, and it varies as a VALUE
|
|
1065
|
+
the element carries, never as a second rule: `--ring-offset` defaults to 2
|
|
1066
|
+
and a field sets it to -2 (see the field block above). Two rules is what
|
|
1067
|
+
0.4.9 removed, and a second one here would be the same defect again.
|
|
1068
|
+
|
|
1039
1069
|
There were two rules until 0.4.9, and they collided invisibly. Both computed
|
|
1040
1070
|
to (0,1,0) — :where() zeroes whatever it wraps, leaving one pseudo-class on
|
|
1041
1071
|
each side — so the cascade fell through to SOURCE ORDER inside this layer,
|
|
@@ -1044,7 +1074,7 @@
|
|
|
1044
1074
|
drew BOTH the ring and the edge+halo. Each rule read as correct alone, which
|
|
1045
1075
|
is why it survived review in both files; the defect existed only in their
|
|
1046
1076
|
order. One rule cannot disagree with itself. */
|
|
1047
|
-
:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
|
|
1077
|
+
:focus-visible{outline:2px solid var(--ring);outline-offset:var(--ring-offset,2px)}
|
|
1048
1078
|
/* --white-20 is white-on-white in the light theme, so selection reads through
|
|
1049
1079
|
--selection, which BOTH themes define. */
|
|
1050
1080
|
::selection{background:var(--selection);color:var(--text-primary)}
|
package/tailwind.css
CHANGED
|
@@ -115,11 +115,20 @@
|
|
|
115
115
|
|
|
116
116
|
/* ——— semantic aliases (dark, the default) ——— */
|
|
117
117
|
--background:#0a0a0a;
|
|
118
|
-
|
|
118
|
+
/* READING ink, one rung below the top of the ramp. The note at the head of this
|
|
119
|
+
file already made this argument once — #ffffff on #000000 halates, so #fafafa
|
|
120
|
+
— and the argument does not stop being true at 19.0:1. Every heading and
|
|
121
|
+
paragraph on every surface was set in the brightest ink the system has, while
|
|
122
|
+
the CHROME beside them draws body text at --white-92; a page read as glare
|
|
123
|
+
against its own header. #e5e5e5 is the neutral-200 rung this file already
|
|
124
|
+
spends on --primary-hover, so the ramp gains no new value: 15.7:1 on the page,
|
|
125
|
+
15.2:1 on a card, both more than twice the 7:1 AAA asks of body text.
|
|
126
|
+
Something that genuinely needs the brightest ink names --primary. */
|
|
127
|
+
--foreground:#e5e5e5;
|
|
119
128
|
--card:#0f0f0f;
|
|
120
|
-
--card-foreground:#
|
|
129
|
+
--card-foreground:#e5e5e5;
|
|
121
130
|
--popover:#0f0f0f;
|
|
122
|
-
--popover-foreground:#
|
|
131
|
+
--popover-foreground:#e5e5e5;
|
|
123
132
|
--primary:#fafafa;
|
|
124
133
|
/* A 5% step, not the 16% this used to be. A filled button's fill is already
|
|
125
134
|
the top of the ink ramp, so the only directions available on hover are
|
|
@@ -993,6 +1002,22 @@
|
|
|
993
1002
|
its buttons at 8-10px and nothing at 6px except 22px chips. */
|
|
994
1003
|
border-radius:var(--radius-md);
|
|
995
1004
|
padding:0 var(--space-3);
|
|
1005
|
+
/* A field's ring is drawn INSIDE its own box. The one focus rule below
|
|
1006
|
+
reads this; nothing else about the indicator changes.
|
|
1007
|
+
|
|
1008
|
+
A field lives in containers a button does not — composers, palettes and
|
|
1009
|
+
panels that round their corners with `overflow:hidden`. An outline at a
|
|
1010
|
+
POSITIVE offset is painted outside the border box, so any such ancestor
|
|
1011
|
+
clips it, and the computed style still says `2px solid` while nothing is
|
|
1012
|
+
drawn: a chat composer measured byte-identical screenshots focused and
|
|
1013
|
+
unfocused, and a search pill kept only its left and right edges. A
|
|
1014
|
+
negative offset cannot be clipped by anything, so a field needs to know
|
|
1015
|
+
nothing about what contains it.
|
|
1016
|
+
|
|
1017
|
+
-2 against a 2px ring lays the outline over the outermost 2px of the box,
|
|
1018
|
+
so it REPLACES the 1px edge for as long as focus is there rather than
|
|
1019
|
+
drawing a second line a pixel inside the first. */
|
|
1020
|
+
--ring-offset:-2px;
|
|
996
1021
|
}
|
|
997
1022
|
:where(textarea){padding:var(--space-2) var(--space-3);resize:vertical}
|
|
998
1023
|
/* A field has NO focus rule of its own — see the ring at the bottom of this
|
|
@@ -1059,6 +1084,11 @@
|
|
|
1059
1084
|
canvas and clears the 2px perimeter WCAG 2.4.13 asks for; the gate in
|
|
1060
1085
|
check-tokens holds --ring to that and nothing else here may weaken it.
|
|
1061
1086
|
|
|
1087
|
+
WHERE the ring sits is the one thing that varies, and it varies as a VALUE
|
|
1088
|
+
the element carries, never as a second rule: `--ring-offset` defaults to 2
|
|
1089
|
+
and a field sets it to -2 (see the field block above). Two rules is what
|
|
1090
|
+
0.4.9 removed, and a second one here would be the same defect again.
|
|
1091
|
+
|
|
1062
1092
|
There were two rules until 0.4.9, and they collided invisibly. Both computed
|
|
1063
1093
|
to (0,1,0) — :where() zeroes whatever it wraps, leaving one pseudo-class on
|
|
1064
1094
|
each side — so the cascade fell through to SOURCE ORDER inside this layer,
|
|
@@ -1067,7 +1097,7 @@
|
|
|
1067
1097
|
drew BOTH the ring and the edge+halo. Each rule read as correct alone, which
|
|
1068
1098
|
is why it survived review in both files; the defect existed only in their
|
|
1069
1099
|
order. One rule cannot disagree with itself. */
|
|
1070
|
-
:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
|
|
1100
|
+
:focus-visible{outline:2px solid var(--ring);outline-offset:var(--ring-offset,2px)}
|
|
1071
1101
|
/* --white-20 is white-on-white in the light theme, so selection reads through
|
|
1072
1102
|
--selection, which BOTH themes define. */
|
|
1073
1103
|
::selection{background:var(--selection);color:var(--text-primary)}
|
package/tokens/base.css
CHANGED
|
@@ -97,6 +97,22 @@
|
|
|
97
97
|
its buttons at 8-10px and nothing at 6px except 22px chips. */
|
|
98
98
|
border-radius:var(--radius-md);
|
|
99
99
|
padding:0 var(--space-3);
|
|
100
|
+
/* A field's ring is drawn INSIDE its own box. The one focus rule below
|
|
101
|
+
reads this; nothing else about the indicator changes.
|
|
102
|
+
|
|
103
|
+
A field lives in containers a button does not — composers, palettes and
|
|
104
|
+
panels that round their corners with `overflow:hidden`. An outline at a
|
|
105
|
+
POSITIVE offset is painted outside the border box, so any such ancestor
|
|
106
|
+
clips it, and the computed style still says `2px solid` while nothing is
|
|
107
|
+
drawn: a chat composer measured byte-identical screenshots focused and
|
|
108
|
+
unfocused, and a search pill kept only its left and right edges. A
|
|
109
|
+
negative offset cannot be clipped by anything, so a field needs to know
|
|
110
|
+
nothing about what contains it.
|
|
111
|
+
|
|
112
|
+
-2 against a 2px ring lays the outline over the outermost 2px of the box,
|
|
113
|
+
so it REPLACES the 1px edge for as long as focus is there rather than
|
|
114
|
+
drawing a second line a pixel inside the first. */
|
|
115
|
+
--ring-offset:-2px;
|
|
100
116
|
}
|
|
101
117
|
:where(textarea){padding:var(--space-2) var(--space-3);resize:vertical}
|
|
102
118
|
/* A field has NO focus rule of its own — see the ring at the bottom of this
|
|
@@ -163,6 +179,11 @@
|
|
|
163
179
|
canvas and clears the 2px perimeter WCAG 2.4.13 asks for; the gate in
|
|
164
180
|
check-tokens holds --ring to that and nothing else here may weaken it.
|
|
165
181
|
|
|
182
|
+
WHERE the ring sits is the one thing that varies, and it varies as a VALUE
|
|
183
|
+
the element carries, never as a second rule: `--ring-offset` defaults to 2
|
|
184
|
+
and a field sets it to -2 (see the field block above). Two rules is what
|
|
185
|
+
0.4.9 removed, and a second one here would be the same defect again.
|
|
186
|
+
|
|
166
187
|
There were two rules until 0.4.9, and they collided invisibly. Both computed
|
|
167
188
|
to (0,1,0) — :where() zeroes whatever it wraps, leaving one pseudo-class on
|
|
168
189
|
each side — so the cascade fell through to SOURCE ORDER inside this layer,
|
|
@@ -171,7 +192,7 @@
|
|
|
171
192
|
drew BOTH the ring and the edge+halo. Each rule read as correct alone, which
|
|
172
193
|
is why it survived review in both files; the defect existed only in their
|
|
173
194
|
order. One rule cannot disagree with itself. */
|
|
174
|
-
:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
|
|
195
|
+
:focus-visible{outline:2px solid var(--ring);outline-offset:var(--ring-offset,2px)}
|
|
175
196
|
/* --white-20 is white-on-white in the light theme, so selection reads through
|
|
176
197
|
--selection, which BOTH themes define. */
|
|
177
198
|
::selection{background:var(--selection);color:var(--text-primary)}
|
package/tokens/colors.css
CHANGED
|
@@ -77,11 +77,20 @@
|
|
|
77
77
|
|
|
78
78
|
/* ——— semantic aliases (dark, the default) ——— */
|
|
79
79
|
--background:#0a0a0a;
|
|
80
|
-
|
|
80
|
+
/* READING ink, one rung below the top of the ramp. The note at the head of this
|
|
81
|
+
file already made this argument once — #ffffff on #000000 halates, so #fafafa
|
|
82
|
+
— and the argument does not stop being true at 19.0:1. Every heading and
|
|
83
|
+
paragraph on every surface was set in the brightest ink the system has, while
|
|
84
|
+
the CHROME beside them draws body text at --white-92; a page read as glare
|
|
85
|
+
against its own header. #e5e5e5 is the neutral-200 rung this file already
|
|
86
|
+
spends on --primary-hover, so the ramp gains no new value: 15.7:1 on the page,
|
|
87
|
+
15.2:1 on a card, both more than twice the 7:1 AAA asks of body text.
|
|
88
|
+
Something that genuinely needs the brightest ink names --primary. */
|
|
89
|
+
--foreground:#e5e5e5;
|
|
81
90
|
--card:#0f0f0f;
|
|
82
|
-
--card-foreground:#
|
|
91
|
+
--card-foreground:#e5e5e5;
|
|
83
92
|
--popover:#0f0f0f;
|
|
84
|
-
--popover-foreground:#
|
|
93
|
+
--popover-foreground:#e5e5e5;
|
|
85
94
|
--primary:#fafafa;
|
|
86
95
|
/* A 5% step, not the 16% this used to be. A filled button's fill is already
|
|
87
96
|
the top of the ink ramp, so the only directions available on hover are
|