@astryxdesign/theme-neutral 0.4.7 → 0.5.0-canary.009bcb3

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/icons.mjs CHANGED
@@ -1,6 +1,69 @@
1
+ // src/icons.tsx
1
2
  import {
2
- neutralIconRegistry
3
- } from "./chunk-5EOEL66W.mjs";
3
+ X,
4
+ ChevronDown,
5
+ ChevronLeft,
6
+ ChevronRight,
7
+ ChevronsLeft,
8
+ ChevronsRight,
9
+ Check,
10
+ CheckCircle,
11
+ XCircle,
12
+ AlertTriangle,
13
+ Info,
14
+ Calendar,
15
+ Clock,
16
+ ExternalLink,
17
+ Menu,
18
+ MoreHorizontal,
19
+ Search,
20
+ ArrowUp,
21
+ ArrowDown,
22
+ ArrowUpDown,
23
+ Filter,
24
+ EyeOff,
25
+ Columns,
26
+ Copy,
27
+ CheckCheck,
28
+ Wrench,
29
+ Square,
30
+ Mic
31
+ } from "lucide-react";
32
+ import { jsx } from "react/jsx-runtime";
33
+ var iconProps = {
34
+ size: "1em",
35
+ "aria-hidden": true
36
+ };
37
+ var neutralIconRegistry = {
38
+ close: /* @__PURE__ */ jsx(X, { ...iconProps }),
39
+ chevronDown: /* @__PURE__ */ jsx(ChevronDown, { ...iconProps }),
40
+ chevronLeft: /* @__PURE__ */ jsx(ChevronLeft, { ...iconProps }),
41
+ chevronRight: /* @__PURE__ */ jsx(ChevronRight, { ...iconProps }),
42
+ chevronsLeft: /* @__PURE__ */ jsx(ChevronsLeft, { ...iconProps }),
43
+ chevronsRight: /* @__PURE__ */ jsx(ChevronsRight, { ...iconProps }),
44
+ check: /* @__PURE__ */ jsx(Check, { ...iconProps }),
45
+ success: /* @__PURE__ */ jsx(CheckCircle, { ...iconProps }),
46
+ error: /* @__PURE__ */ jsx(XCircle, { ...iconProps }),
47
+ warning: /* @__PURE__ */ jsx(AlertTriangle, { ...iconProps }),
48
+ info: /* @__PURE__ */ jsx(Info, { ...iconProps }),
49
+ calendar: /* @__PURE__ */ jsx(Calendar, { ...iconProps }),
50
+ clock: /* @__PURE__ */ jsx(Clock, { ...iconProps }),
51
+ externalLink: /* @__PURE__ */ jsx(ExternalLink, { ...iconProps }),
52
+ menu: /* @__PURE__ */ jsx(Menu, { ...iconProps }),
53
+ moreHorizontal: /* @__PURE__ */ jsx(MoreHorizontal, { ...iconProps }),
54
+ search: /* @__PURE__ */ jsx(Search, { ...iconProps }),
55
+ arrowUp: /* @__PURE__ */ jsx(ArrowUp, { ...iconProps }),
56
+ arrowDown: /* @__PURE__ */ jsx(ArrowDown, { ...iconProps }),
57
+ arrowsUpDown: /* @__PURE__ */ jsx(ArrowUpDown, { ...iconProps }),
58
+ funnel: /* @__PURE__ */ jsx(Filter, { ...iconProps }),
59
+ eyeSlash: /* @__PURE__ */ jsx(EyeOff, { ...iconProps }),
60
+ viewColumns: /* @__PURE__ */ jsx(Columns, { ...iconProps }),
61
+ copy: /* @__PURE__ */ jsx(Copy, { ...iconProps }),
62
+ checkDouble: /* @__PURE__ */ jsx(CheckCheck, { ...iconProps }),
63
+ wrench: /* @__PURE__ */ jsx(Wrench, { ...iconProps }),
64
+ stop: /* @__PURE__ */ jsx(Square, { ...iconProps }),
65
+ microphone: /* @__PURE__ */ jsx(Mic, { ...iconProps })
66
+ };
4
67
  export {
5
68
  neutralIconRegistry
6
69
  };
package/dist/neutral.d.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  * @generated by `astryx theme build` — do not edit manually.
3
3
  * Source: src/neutralTheme.ts
4
4
  * Command: astryx theme build src/neutralTheme.ts --out dist/theme.css
5
- * CLI: @astryxdesign/cli@0.4.7
6
- * Core: @astryxdesign/core@0.4.7
5
+ * CLI: @astryxdesign/cli@0.5.0
6
+ * Core: @astryxdesign/core@0.5.0
7
7
  */
8
8
 
9
9
  /// <reference path="./neutral.variants.d.ts" />
package/dist/neutral.js CHANGED
@@ -2,8 +2,8 @@
2
2
  * @generated by `astryx theme build` — do not edit manually.
3
3
  * Source: src/neutralTheme.ts
4
4
  * Command: astryx theme build src/neutralTheme.ts --out dist/theme.css
5
- * CLI: @astryxdesign/cli@0.4.7
6
- * Core: @astryxdesign/core@0.4.7
5
+ * CLI: @astryxdesign/cli@0.5.0
6
+ * Core: @astryxdesign/core@0.5.0
7
7
  */
8
8
 
9
9
  import { neutralIconRegistry } from "./icons.mjs";
@@ -96,7 +96,7 @@ export const neutralTheme = {
96
96
  "--color-syntax-tag": "light-dark(#89001a, #ffaeaa)",
97
97
  "--color-syntax-attribute": "light-dark(#584400, #eec12f)",
98
98
  "--color-syntax-property": "light-dark(#005348, #83dac9)",
99
- "--color-syntax-punctuation": "light-dark(#a3a3a3, #525252)",
99
+ "--color-syntax-punctuation": "light-dark(#6e6e6e, #a0a0a0)",
100
100
  "--color-syntax-background": "light-dark(#fafafa, #0a0a0a)",
101
101
  "--color-background-surface": "light-dark(#ffffff, #262626)",
102
102
  "--color-background-body": "light-dark(#f1f1f1, #1b1b1b)",
@@ -309,7 +309,7 @@ export const neutralTheme = {
309
309
  "color": "#171717"
310
310
  },
311
311
  "variant:error": {
312
- "backgroundColor": "light-dark(#e33f4a, #ff705d)",
312
+ "backgroundColor": "light-dark(#c9303a, #ff705d)",
313
313
  "color": "light-dark(#ffffff, #171717)"
314
314
  },
315
315
  "variant:red": {
@@ -361,7 +361,7 @@ export const neutralTheme = {
361
361
  "backgroundColor": "#ffce2f"
362
362
  },
363
363
  "variant:error": {
364
- "backgroundColor": "light-dark(#e33f4a, #ff705d)"
364
+ "backgroundColor": "light-dark(#c9303a, #ff705d)"
365
365
  },
366
366
  "variant:accent": {
367
367
  "backgroundColor": "light-dark(#0074e2, #6d9cfe)"
@@ -409,7 +409,7 @@ export const neutralTheme = {
409
409
  "--color-warning": "#ffce2f"
410
410
  },
411
411
  "variant:error": {
412
- "--color-error": "#e33f4a"
412
+ "--color-error": "#c9303a"
413
413
  }
414
414
  },
415
415
  "card": {
@@ -2,8 +2,8 @@
2
2
  * @generated by `astryx theme build` — do not edit manually.
3
3
  * Source: src/neutralTheme.ts
4
4
  * Command: astryx theme build src/neutralTheme.ts --out dist/theme.css
5
- * CLI: @astryxdesign/cli@0.4.7
6
- * Core: @astryxdesign/core@0.4.7
5
+ * CLI: @astryxdesign/cli@0.5.0
6
+ * Core: @astryxdesign/core@0.5.0
7
7
  */
8
8
 
9
9
  // Generated by astryx theme build
@@ -1 +1 @@
1
- {"version":3,"file":"neutralTheme.d.ts","sourceRoot":"","sources":["../src/neutralTheme.ts"],"names":[],"mappings":"AA0DA,eAAO,MAAM,YAAY,iDAukBvB,CAAC"}
1
+ {"version":3,"file":"neutralTheme.d.ts","sourceRoot":"","sources":["../src/neutralTheme.ts"],"names":[],"mappings":"AA6DA,eAAO,MAAM,YAAY,iDA2kBvB,CAAC"}
package/dist/source.js CHANGED
@@ -94,8 +94,10 @@ var neutralSyntax = (0, import_theme.defineSyntaxTheme)({
94
94
  // yellow
95
95
  property: ["#005348", "#83dac9"],
96
96
  // teal
97
- punctuation: ["#a3a3a3", "#525252"],
98
- // neutral
97
+ // #a3a3a3/#525252 (this pair's own disabled-text tone) failed WCAG AA
98
+ // against the syntax background: 2.42:1 light, 2.53:1 dark. #5386.
99
+ punctuation: ["#6e6e6e", "#a0a0a0"],
100
+ // neutral, 4.89:1 / 7.57:1
99
101
  background: ["#fafafa", "#0a0a0a"]
100
102
  }
101
103
  });
@@ -437,10 +439,14 @@ var neutralTheme = (0, import_theme.defineTheme)({
437
439
  color: "#171717"
438
440
  },
439
441
  "variant:error": {
440
- // Light: T55 #e33f4a (palette saturated stop)
442
+ // Light: T58 #c9303a. The T55 stop #e33f4a pairs with white at only
443
+ // 4.14:1 — the label is 12px/500, so AA wants 4.5, not the 3:1
444
+ // large-text allowance. One tonal step down holds the hue
445
+ // (OKLCH H 21.9 -> 22.8, C 0.200 -> 0.189) and reaches 5.29:1.
441
446
  // Dark : T60 stop from dark-mode tonal palette of Tailwind red-600
442
- // source #dc2626 (kept on H=27 alarm-red rather than coral)
443
- backgroundColor: "light-dark(#e33f4a, #ff705d)",
447
+ // source #dc2626 (kept on H=27 alarm-red rather than coral).
448
+ // Dark text on it is 6.60:1 and unchanged.
449
+ backgroundColor: "light-dark(#c9303a, #ff705d)",
444
450
  color: "light-dark(#ffffff, #171717)"
445
451
  },
446
452
  // Categorical — bg + text reference the per-hue tokens, so behavior
@@ -503,7 +509,7 @@ var neutralTheme = (0, import_theme.defineTheme)({
503
509
  //
504
510
  // success → badge success bg (green T45 / dark-ramp T60)
505
511
  // warning → badge warning bg (yellow T85, same hex both modes)
506
- // error → badge error bg (red T55 / dark-ramp T60)
512
+ // error → badge error bg (red T58 / dark-ramp T60)
507
513
  // accent → badge info bg (blue T50 / dark-ramp T60) — the
508
514
  // StatusDot "accent" is the info/attention color, so it
509
515
  // pairs with the info badge rather than --color-accent
@@ -518,7 +524,7 @@ var neutralTheme = (0, import_theme.defineTheme)({
518
524
  statusdot: {
519
525
  "variant:success": { backgroundColor: "light-dark(#198100, #64af4c)" },
520
526
  "variant:warning": { backgroundColor: "#ffce2f" },
521
- "variant:error": { backgroundColor: "light-dark(#e33f4a, #ff705d)" },
527
+ "variant:error": { backgroundColor: "light-dark(#c9303a, #ff705d)" },
522
528
  "variant:accent": { backgroundColor: "light-dark(#0074e2, #6d9cfe)" }
523
529
  },
524
530
  // =========================================================================
@@ -610,8 +616,8 @@ var neutralTheme = (0, import_theme.defineTheme)({
610
616
  "--color-warning": "#ffce2f"
611
617
  },
612
618
  "variant:error": {
613
- // Red T55 saturated stop (= variant:error badge bg)
614
- "--color-error": "#e33f4a"
619
+ // Red T58 saturated stop (= variant:error badge bg)
620
+ "--color-error": "#c9303a"
615
621
  }
616
622
  },
617
623
  // =========================================================================
package/dist/source.mjs CHANGED
@@ -1,9 +1,74 @@
1
+ // src/neutralTheme.ts
2
+ import { defineTheme, defineSyntaxTheme } from "@astryxdesign/core/theme";
3
+
4
+ // src/icons.tsx
1
5
  import {
2
- neutralIconRegistry
3
- } from "./chunk-5EOEL66W.mjs";
6
+ X,
7
+ ChevronDown,
8
+ ChevronLeft,
9
+ ChevronRight,
10
+ ChevronsLeft,
11
+ ChevronsRight,
12
+ Check,
13
+ CheckCircle,
14
+ XCircle,
15
+ AlertTriangle,
16
+ Info,
17
+ Calendar,
18
+ Clock,
19
+ ExternalLink,
20
+ Menu,
21
+ MoreHorizontal,
22
+ Search,
23
+ ArrowUp,
24
+ ArrowDown,
25
+ ArrowUpDown,
26
+ Filter,
27
+ EyeOff,
28
+ Columns,
29
+ Copy,
30
+ CheckCheck,
31
+ Wrench,
32
+ Square,
33
+ Mic
34
+ } from "lucide-react";
35
+ import { jsx } from "react/jsx-runtime";
36
+ var iconProps = {
37
+ size: "1em",
38
+ "aria-hidden": true
39
+ };
40
+ var neutralIconRegistry = {
41
+ close: /* @__PURE__ */ jsx(X, { ...iconProps }),
42
+ chevronDown: /* @__PURE__ */ jsx(ChevronDown, { ...iconProps }),
43
+ chevronLeft: /* @__PURE__ */ jsx(ChevronLeft, { ...iconProps }),
44
+ chevronRight: /* @__PURE__ */ jsx(ChevronRight, { ...iconProps }),
45
+ chevronsLeft: /* @__PURE__ */ jsx(ChevronsLeft, { ...iconProps }),
46
+ chevronsRight: /* @__PURE__ */ jsx(ChevronsRight, { ...iconProps }),
47
+ check: /* @__PURE__ */ jsx(Check, { ...iconProps }),
48
+ success: /* @__PURE__ */ jsx(CheckCircle, { ...iconProps }),
49
+ error: /* @__PURE__ */ jsx(XCircle, { ...iconProps }),
50
+ warning: /* @__PURE__ */ jsx(AlertTriangle, { ...iconProps }),
51
+ info: /* @__PURE__ */ jsx(Info, { ...iconProps }),
52
+ calendar: /* @__PURE__ */ jsx(Calendar, { ...iconProps }),
53
+ clock: /* @__PURE__ */ jsx(Clock, { ...iconProps }),
54
+ externalLink: /* @__PURE__ */ jsx(ExternalLink, { ...iconProps }),
55
+ menu: /* @__PURE__ */ jsx(Menu, { ...iconProps }),
56
+ moreHorizontal: /* @__PURE__ */ jsx(MoreHorizontal, { ...iconProps }),
57
+ search: /* @__PURE__ */ jsx(Search, { ...iconProps }),
58
+ arrowUp: /* @__PURE__ */ jsx(ArrowUp, { ...iconProps }),
59
+ arrowDown: /* @__PURE__ */ jsx(ArrowDown, { ...iconProps }),
60
+ arrowsUpDown: /* @__PURE__ */ jsx(ArrowUpDown, { ...iconProps }),
61
+ funnel: /* @__PURE__ */ jsx(Filter, { ...iconProps }),
62
+ eyeSlash: /* @__PURE__ */ jsx(EyeOff, { ...iconProps }),
63
+ viewColumns: /* @__PURE__ */ jsx(Columns, { ...iconProps }),
64
+ copy: /* @__PURE__ */ jsx(Copy, { ...iconProps }),
65
+ checkDouble: /* @__PURE__ */ jsx(CheckCheck, { ...iconProps }),
66
+ wrench: /* @__PURE__ */ jsx(Wrench, { ...iconProps }),
67
+ stop: /* @__PURE__ */ jsx(Square, { ...iconProps }),
68
+ microphone: /* @__PURE__ */ jsx(Mic, { ...iconProps })
69
+ };
4
70
 
5
71
  // src/neutralTheme.ts
6
- import { defineTheme, defineSyntaxTheme } from "@astryxdesign/core/theme";
7
72
  var neutralSyntax = defineSyntaxTheme({
8
73
  name: "xds-neutral",
9
74
  tokens: {
@@ -31,8 +96,10 @@ var neutralSyntax = defineSyntaxTheme({
31
96
  // yellow
32
97
  property: ["#005348", "#83dac9"],
33
98
  // teal
34
- punctuation: ["#a3a3a3", "#525252"],
35
- // neutral
99
+ // #a3a3a3/#525252 (this pair's own disabled-text tone) failed WCAG AA
100
+ // against the syntax background: 2.42:1 light, 2.53:1 dark. #5386.
101
+ punctuation: ["#6e6e6e", "#a0a0a0"],
102
+ // neutral, 4.89:1 / 7.57:1
36
103
  background: ["#fafafa", "#0a0a0a"]
37
104
  }
38
105
  });
@@ -374,10 +441,14 @@ var neutralTheme = defineTheme({
374
441
  color: "#171717"
375
442
  },
376
443
  "variant:error": {
377
- // Light: T55 #e33f4a (palette saturated stop)
444
+ // Light: T58 #c9303a. The T55 stop #e33f4a pairs with white at only
445
+ // 4.14:1 — the label is 12px/500, so AA wants 4.5, not the 3:1
446
+ // large-text allowance. One tonal step down holds the hue
447
+ // (OKLCH H 21.9 -> 22.8, C 0.200 -> 0.189) and reaches 5.29:1.
378
448
  // Dark : T60 stop from dark-mode tonal palette of Tailwind red-600
379
- // source #dc2626 (kept on H=27 alarm-red rather than coral)
380
- backgroundColor: "light-dark(#e33f4a, #ff705d)",
449
+ // source #dc2626 (kept on H=27 alarm-red rather than coral).
450
+ // Dark text on it is 6.60:1 and unchanged.
451
+ backgroundColor: "light-dark(#c9303a, #ff705d)",
381
452
  color: "light-dark(#ffffff, #171717)"
382
453
  },
383
454
  // Categorical — bg + text reference the per-hue tokens, so behavior
@@ -440,7 +511,7 @@ var neutralTheme = defineTheme({
440
511
  //
441
512
  // success → badge success bg (green T45 / dark-ramp T60)
442
513
  // warning → badge warning bg (yellow T85, same hex both modes)
443
- // error → badge error bg (red T55 / dark-ramp T60)
514
+ // error → badge error bg (red T58 / dark-ramp T60)
444
515
  // accent → badge info bg (blue T50 / dark-ramp T60) — the
445
516
  // StatusDot "accent" is the info/attention color, so it
446
517
  // pairs with the info badge rather than --color-accent
@@ -455,7 +526,7 @@ var neutralTheme = defineTheme({
455
526
  statusdot: {
456
527
  "variant:success": { backgroundColor: "light-dark(#198100, #64af4c)" },
457
528
  "variant:warning": { backgroundColor: "#ffce2f" },
458
- "variant:error": { backgroundColor: "light-dark(#e33f4a, #ff705d)" },
529
+ "variant:error": { backgroundColor: "light-dark(#c9303a, #ff705d)" },
459
530
  "variant:accent": { backgroundColor: "light-dark(#0074e2, #6d9cfe)" }
460
531
  },
461
532
  // =========================================================================
@@ -547,8 +618,8 @@ var neutralTheme = defineTheme({
547
618
  "--color-warning": "#ffce2f"
548
619
  },
549
620
  "variant:error": {
550
- // Red T55 saturated stop (= variant:error badge bg)
551
- "--color-error": "#e33f4a"
621
+ // Red T58 saturated stop (= variant:error badge bg)
622
+ "--color-error": "#c9303a"
552
623
  }
553
624
  },
554
625
  // =========================================================================
package/dist/theme.css CHANGED
@@ -2,8 +2,8 @@
2
2
  * @generated by `astryx theme build` — do not edit manually.
3
3
  * Source: src/neutralTheme.ts
4
4
  * Command: astryx theme build src/neutralTheme.ts --out dist/theme.css
5
- * CLI: @astryxdesign/cli@0.4.7
6
- * Core: @astryxdesign/core@0.4.7
5
+ * CLI: @astryxdesign/cli@0.5.0
6
+ * Core: @astryxdesign/core@0.5.0
7
7
  */
8
8
 
9
9
  @layer reset {
@@ -77,6 +77,67 @@
77
77
  }
78
78
  }
79
79
 
80
+ @layer astryx-base {
81
+ :root {
82
+ --color-data-categorical-blue: light-dark(#0171E3, #0171E3);
83
+ --color-data-categorical-orange: light-dark(#EB6E00, #EB6E00);
84
+ --color-data-categorical-purple: light-dark(#6B1EFD, #6B1EFD);
85
+ --color-data-categorical-green: light-dark(#0B991F, #0B991F);
86
+ --color-data-categorical-pink: light-dark(#F351C0, #F351C0);
87
+ --color-data-categorical-cyan: light-dark(#0171A4, #0171A4);
88
+ --color-data-categorical-red: light-dark(#F5394F, #F5394F);
89
+ --color-data-categorical-teal: light-dark(#08A3A3, #08A3A3);
90
+ --color-data-categorical-brown: light-dark(#965E03, #965E03);
91
+ --color-data-categorical-indigo: light-dark(#6F8AFF, #6F8AFF);
92
+ --color-data-neutral: light-dark(#8494A3, #8C939B);
93
+ --color-data-blue-5: light-dark(#02165E, #02165E);
94
+ --color-data-blue-4: light-dark(#004CBC, #004CBC);
95
+ --color-data-blue-3: light-dark(#2694FE, #2694FE);
96
+ --color-data-blue-2: light-dark(#78BEFF, #78BEFF);
97
+ --color-data-blue-1: light-dark(#DBECFF, #DBECFF);
98
+ --color-data-shamrock-5: light-dark(#0B603D, #0B603D);
99
+ --color-data-shamrock-4: light-dark(#138546, #138546);
100
+ --color-data-shamrock-3: light-dark(#24BB5E, #24BB5E);
101
+ --color-data-shamrock-2: light-dark(#8EF7AA, #8EF7AA);
102
+ --color-data-shamrock-1: light-dark(#D6FEE4, #D6FEE4);
103
+ --color-data-orange-5: light-dark(#A13F04, #A13F04);
104
+ --color-data-orange-4: light-dark(#D66100, #D66100);
105
+ --color-data-orange-3: light-dark(#FD9537, #FD9537);
106
+ --color-data-orange-2: light-dark(#FDB876, #FDB876);
107
+ --color-data-orange-1: light-dark(#FFE6CF, #FFE6CF);
108
+ --color-data-pink-5: light-dark(#8E1073, #8E1073);
109
+ --color-data-pink-4: light-dark(#D123A1, #D123A1);
110
+ --color-data-pink-3: light-dark(#F989D3, #F989D3);
111
+ --color-data-pink-2: light-dark(#FEADE3, #FEADE3);
112
+ --color-data-pink-1: light-dark(#FCE3F4, #FCE3F4);
113
+ --color-data-purple-5: light-dark(#3E0697, #3E0697);
114
+ --color-data-purple-4: light-dark(#6B1EFD, #6B1EFD);
115
+ --color-data-purple-3: light-dark(#9081FF, #9081FF);
116
+ --color-data-purple-2: light-dark(#B3B0FE, #B3B0FE);
117
+ --color-data-purple-1: light-dark(#E8E8FB, #E8E8FB);
118
+ --color-data-red-5: light-dark(#9D0519, #9D0519);
119
+ --color-data-red-4: light-dark(#D31130, #D31130);
120
+ --color-data-red-3: light-dark(#FB7D87, #FB7D87);
121
+ --color-data-red-2: light-dark(#FFB2B8, #FFB2B8);
122
+ --color-data-red-1: light-dark(#FEE4E6, #FEE4E6);
123
+ --color-data-teal-5: light-dark(#08767D, #08767D);
124
+ --color-data-teal-4: light-dark(#0C9293, #0C9293);
125
+ --color-data-teal-3: light-dark(#0DB7AF, #0DB7AF);
126
+ --color-data-teal-2: light-dark(#6CE6D8, #6CE6D8);
127
+ --color-data-teal-1: light-dark(#D7FCF8, #D7FCF8);
128
+ --color-data-yellow-5: light-dark(#8A5001, #8A5001);
129
+ --color-data-yellow-4: light-dark(#D69804, #D69804);
130
+ --color-data-yellow-3: light-dark(#FBCE03, #FBCE03);
131
+ --color-data-yellow-2: light-dark(#FCEC85, #FCEC85);
132
+ --color-data-yellow-1: light-dark(#FDF6BA, #FDF6BA);
133
+ --color-data-gray-5: light-dark(#25363F, #333338);
134
+ --color-data-gray-4: light-dark(#5D6C7B, #666A72);
135
+ --color-data-gray-3: light-dark(#AFB9C4, #B2B8BE);
136
+ --color-data-gray-2: light-dark(#CCD3DB, #D0D3D6);
137
+ --color-data-gray-1: light-dark(#F1F4F7, #F2F4F6);
138
+ }
139
+ }
140
+
80
141
  @layer astryx-theme {
81
142
  :root { color-scheme: light dark; }
82
143
  html[data-theme="light"] { color-scheme: light; }
@@ -162,7 +223,7 @@
162
223
  --color-syntax-tag: light-dark(#89001a, #ffaeaa);
163
224
  --color-syntax-attribute: light-dark(#584400, #eec12f);
164
225
  --color-syntax-property: light-dark(#005348, #83dac9);
165
- --color-syntax-punctuation: light-dark(#a3a3a3, #525252);
226
+ --color-syntax-punctuation: light-dark(#6e6e6e, #a0a0a0);
166
227
  --color-syntax-background: light-dark(#fafafa, #0a0a0a);
167
228
  --color-background-surface: light-dark(#ffffff, #262626);
168
229
  --color-background-body: light-dark(#f1f1f1, #1b1b1b);
@@ -390,7 +451,7 @@
390
451
  }
391
452
 
392
453
  .astryx-badge.error {
393
- background-color: light-dark(#e33f4a, #ff705d);
454
+ background-color: light-dark(#c9303a, #ff705d);
394
455
  color: light-dark(#ffffff, #171717);
395
456
  }
396
457
 
@@ -453,7 +514,7 @@
453
514
  }
454
515
 
455
516
  .astryx-statusdot.error {
456
- background-color: light-dark(#e33f4a, #ff705d);
517
+ background-color: light-dark(#c9303a, #ff705d);
457
518
  }
458
519
 
459
520
  .astryx-statusdot.accent {
@@ -506,7 +567,7 @@
506
567
  }
507
568
 
508
569
  .astryx-progressbar.error {
509
- --color-error: #e33f4a;
570
+ --color-error: #c9303a;
510
571
  }
511
572
 
512
573
  .astryx-card {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/theme-neutral",
3
- "version": "0.4.7",
3
+ "version": "0.5.0-canary.009bcb3",
4
4
  "displayName": "Neutral Theme",
5
5
  "private": false,
6
6
  "description": "Restrained warm grays. Minimal and quiet, so the content stays the focus.",
@@ -49,11 +49,11 @@
49
49
  "lucide-react": "^1.18.0"
50
50
  },
51
51
  "peerDependencies": {
52
- "@astryxdesign/core": "0.4.7",
52
+ "@astryxdesign/core": "0.5.0-canary.009bcb3",
53
53
  "react": ">=19"
54
54
  },
55
55
  "devDependencies": {
56
- "@astryxdesign/cli": "0.4.7",
56
+ "@astryxdesign/cli": "0.5.0-canary.009bcb3",
57
57
  "rimraf": "^6.0.1"
58
58
  },
59
59
  "module": "./dist/source.mjs",
@@ -24,7 +24,8 @@
24
24
  * icon = T30 / T80
25
25
  * text = T30 / T80
26
26
  *
27
- * All 9 saturated badge values pass WCAG AA (5.6–9.6 contrast range).
27
+ * All 9 saturated badge values pass WCAG AA against their label (>= 4.5:1);
28
+ * `scripts/check-badge-contrast.test.mjs` holds every theme to that.
28
29
  *
29
30
  * Only overrides tokens that differ from the defaults.
30
31
  */
@@ -51,7 +52,9 @@ const neutralSyntax = defineSyntaxTheme({
51
52
  tag: ['#89001a', '#ffaeaa'], // red
52
53
  attribute: ['#584400', '#eec12f'], // yellow
53
54
  property: ['#005348', '#83dac9'], // teal
54
- punctuation: ['#a3a3a3', '#525252'], // neutral
55
+ // #a3a3a3/#525252 (this pair's own disabled-text tone) failed WCAG AA
56
+ // against the syntax background: 2.42:1 light, 2.53:1 dark. #5386.
57
+ punctuation: ['#6e6e6e', '#a0a0a0'], // neutral, 4.89:1 / 7.57:1
55
58
  background: ['#fafafa', '#0a0a0a'],
56
59
  },
57
60
  });
@@ -432,10 +435,14 @@ export const neutralTheme = defineTheme({
432
435
  color: '#171717',
433
436
  },
434
437
  'variant:error': {
435
- // Light: T55 #e33f4a (palette saturated stop)
438
+ // Light: T58 #c9303a. The T55 stop #e33f4a pairs with white at only
439
+ // 4.14:1 — the label is 12px/500, so AA wants 4.5, not the 3:1
440
+ // large-text allowance. One tonal step down holds the hue
441
+ // (OKLCH H 21.9 -> 22.8, C 0.200 -> 0.189) and reaches 5.29:1.
436
442
  // Dark : T60 stop from dark-mode tonal palette of Tailwind red-600
437
- // source #dc2626 (kept on H=27 alarm-red rather than coral)
438
- backgroundColor: 'light-dark(#e33f4a, #ff705d)',
443
+ // source #dc2626 (kept on H=27 alarm-red rather than coral).
444
+ // Dark text on it is 6.60:1 and unchanged.
445
+ backgroundColor: 'light-dark(#c9303a, #ff705d)',
439
446
  color: 'light-dark(#ffffff, #171717)',
440
447
  },
441
448
 
@@ -500,7 +507,7 @@ export const neutralTheme = defineTheme({
500
507
  //
501
508
  // success → badge success bg (green T45 / dark-ramp T60)
502
509
  // warning → badge warning bg (yellow T85, same hex both modes)
503
- // error → badge error bg (red T55 / dark-ramp T60)
510
+ // error → badge error bg (red T58 / dark-ramp T60)
504
511
  // accent → badge info bg (blue T50 / dark-ramp T60) — the
505
512
  // StatusDot "accent" is the info/attention color, so it
506
513
  // pairs with the info badge rather than --color-accent
@@ -515,7 +522,7 @@ export const neutralTheme = defineTheme({
515
522
  statusdot: {
516
523
  'variant:success': {backgroundColor: 'light-dark(#198100, #64af4c)'},
517
524
  'variant:warning': {backgroundColor: '#ffce2f'},
518
- 'variant:error': {backgroundColor: 'light-dark(#e33f4a, #ff705d)'},
525
+ 'variant:error': {backgroundColor: 'light-dark(#c9303a, #ff705d)'},
519
526
  'variant:accent': {backgroundColor: 'light-dark(#0074e2, #6d9cfe)'},
520
527
  },
521
528
 
@@ -611,8 +618,8 @@ export const neutralTheme = defineTheme({
611
618
  '--color-warning': '#ffce2f',
612
619
  },
613
620
  'variant:error': {
614
- // Red T55 saturated stop (= variant:error badge bg)
615
- '--color-error': '#e33f4a',
621
+ // Red T58 saturated stop (= variant:error badge bg)
622
+ '--color-error': '#c9303a',
616
623
  },
617
624
  },
618
625
 
@@ -1,70 +0,0 @@
1
- // src/icons.tsx
2
- import {
3
- X,
4
- ChevronDown,
5
- ChevronLeft,
6
- ChevronRight,
7
- ChevronsLeft,
8
- ChevronsRight,
9
- Check,
10
- CheckCircle,
11
- XCircle,
12
- AlertTriangle,
13
- Info,
14
- Calendar,
15
- Clock,
16
- ExternalLink,
17
- Menu,
18
- MoreHorizontal,
19
- Search,
20
- ArrowUp,
21
- ArrowDown,
22
- ArrowUpDown,
23
- Filter,
24
- EyeOff,
25
- Columns,
26
- Copy,
27
- CheckCheck,
28
- Wrench,
29
- Square,
30
- Mic
31
- } from "lucide-react";
32
- import { jsx } from "react/jsx-runtime";
33
- var iconProps = {
34
- size: "1em",
35
- "aria-hidden": true
36
- };
37
- var neutralIconRegistry = {
38
- close: /* @__PURE__ */ jsx(X, { ...iconProps }),
39
- chevronDown: /* @__PURE__ */ jsx(ChevronDown, { ...iconProps }),
40
- chevronLeft: /* @__PURE__ */ jsx(ChevronLeft, { ...iconProps }),
41
- chevronRight: /* @__PURE__ */ jsx(ChevronRight, { ...iconProps }),
42
- chevronsLeft: /* @__PURE__ */ jsx(ChevronsLeft, { ...iconProps }),
43
- chevronsRight: /* @__PURE__ */ jsx(ChevronsRight, { ...iconProps }),
44
- check: /* @__PURE__ */ jsx(Check, { ...iconProps }),
45
- success: /* @__PURE__ */ jsx(CheckCircle, { ...iconProps }),
46
- error: /* @__PURE__ */ jsx(XCircle, { ...iconProps }),
47
- warning: /* @__PURE__ */ jsx(AlertTriangle, { ...iconProps }),
48
- info: /* @__PURE__ */ jsx(Info, { ...iconProps }),
49
- calendar: /* @__PURE__ */ jsx(Calendar, { ...iconProps }),
50
- clock: /* @__PURE__ */ jsx(Clock, { ...iconProps }),
51
- externalLink: /* @__PURE__ */ jsx(ExternalLink, { ...iconProps }),
52
- menu: /* @__PURE__ */ jsx(Menu, { ...iconProps }),
53
- moreHorizontal: /* @__PURE__ */ jsx(MoreHorizontal, { ...iconProps }),
54
- search: /* @__PURE__ */ jsx(Search, { ...iconProps }),
55
- arrowUp: /* @__PURE__ */ jsx(ArrowUp, { ...iconProps }),
56
- arrowDown: /* @__PURE__ */ jsx(ArrowDown, { ...iconProps }),
57
- arrowsUpDown: /* @__PURE__ */ jsx(ArrowUpDown, { ...iconProps }),
58
- funnel: /* @__PURE__ */ jsx(Filter, { ...iconProps }),
59
- eyeSlash: /* @__PURE__ */ jsx(EyeOff, { ...iconProps }),
60
- viewColumns: /* @__PURE__ */ jsx(Columns, { ...iconProps }),
61
- copy: /* @__PURE__ */ jsx(Copy, { ...iconProps }),
62
- checkDouble: /* @__PURE__ */ jsx(CheckCheck, { ...iconProps }),
63
- wrench: /* @__PURE__ */ jsx(Wrench, { ...iconProps }),
64
- stop: /* @__PURE__ */ jsx(Square, { ...iconProps }),
65
- microphone: /* @__PURE__ */ jsx(Mic, { ...iconProps })
66
- };
67
-
68
- export {
69
- neutralIconRegistry
70
- };
package/dist/icons.js DELETED
@@ -1,65 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/icons.tsx
21
- var icons_exports = {};
22
- __export(icons_exports, {
23
- neutralIconRegistry: () => neutralIconRegistry
24
- });
25
- module.exports = __toCommonJS(icons_exports);
26
- var import_lucide_react = require("lucide-react");
27
- var import_jsx_runtime = require("react/jsx-runtime");
28
- var iconProps = {
29
- size: "1em",
30
- "aria-hidden": true
31
- };
32
- var neutralIconRegistry = {
33
- close: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { ...iconProps }),
34
- chevronDown: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDown, { ...iconProps }),
35
- chevronLeft: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronLeft, { ...iconProps }),
36
- chevronRight: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronRight, { ...iconProps }),
37
- chevronsLeft: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronsLeft, { ...iconProps }),
38
- chevronsRight: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronsRight, { ...iconProps }),
39
- check: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { ...iconProps }),
40
- success: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle, { ...iconProps }),
41
- error: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.XCircle, { ...iconProps }),
42
- warning: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.AlertTriangle, { ...iconProps }),
43
- info: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Info, { ...iconProps }),
44
- calendar: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Calendar, { ...iconProps }),
45
- clock: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Clock, { ...iconProps }),
46
- externalLink: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ExternalLink, { ...iconProps }),
47
- menu: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Menu, { ...iconProps }),
48
- moreHorizontal: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.MoreHorizontal, { ...iconProps }),
49
- search: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Search, { ...iconProps }),
50
- arrowUp: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowUp, { ...iconProps }),
51
- arrowDown: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowDown, { ...iconProps }),
52
- arrowsUpDown: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowUpDown, { ...iconProps }),
53
- funnel: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Filter, { ...iconProps }),
54
- eyeSlash: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.EyeOff, { ...iconProps }),
55
- viewColumns: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Columns, { ...iconProps }),
56
- copy: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Copy, { ...iconProps }),
57
- checkDouble: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCheck, { ...iconProps }),
58
- wrench: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Wrench, { ...iconProps }),
59
- stop: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Square, { ...iconProps }),
60
- microphone: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Mic, { ...iconProps })
61
- };
62
- // Annotate the CommonJS export names for ESM import in node:
63
- 0 && (module.exports = {
64
- neutralIconRegistry
65
- });