astryx-dracula 0.5.1 → 0.6.2

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.
Files changed (108) hide show
  1. package/BRAND.md +3 -3
  2. package/README.md +7 -4
  3. package/USAGE.md +49 -49
  4. package/astryx-dracula.d.ts +2 -2
  5. package/astryx-dracula.js +25 -9
  6. package/astryx-dracula.variants.d.ts +2 -2
  7. package/icons.mjs +4 -0
  8. package/icons.tsx +8 -0
  9. package/package.json +22 -17
  10. package/shared/chaptered-doc.tsx +1 -2
  11. package/shared/chart-hues.ts +21 -6
  12. package/shared/chart-legend.tsx +2 -2
  13. package/shared/data-bar.tsx +2 -2
  14. package/shared/settings-data.ts +0 -6
  15. package/shared/settings-rows.tsx +1 -23
  16. package/templates/ai-chat-landing.template.mjs +1 -0
  17. package/templates/ai-chat-landing.tsx +24 -2
  18. package/templates/ai-chat.template.mjs +1 -0
  19. package/templates/ai-chat.tsx +4 -2
  20. package/templates/blank.template.mjs +1 -0
  21. package/templates/blank.tsx +4 -2
  22. package/templates/centered-hero.template.mjs +1 -0
  23. package/templates/centered-hero.tsx +5 -3
  24. package/templates/classic-gallery.template.mjs +1 -0
  25. package/templates/classic-gallery.tsx +4 -2
  26. package/templates/contact-form.template.mjs +1 -0
  27. package/templates/contact-form.tsx +4 -2
  28. package/templates/dashboard-portfolio.template.mjs +1 -0
  29. package/templates/dashboard-portfolio.tsx +4 -2
  30. package/templates/dashboard.template.mjs +1 -0
  31. package/templates/dashboard.tsx +4 -2
  32. package/templates/detail-page.template.mjs +1 -0
  33. package/templates/detail-page.tsx +16 -16
  34. package/templates/documentation-design.template.mjs +1 -0
  35. package/templates/documentation-design.tsx +5 -3
  36. package/templates/documentation-technical.template.mjs +1 -0
  37. package/templates/documentation-technical.tsx +4 -2
  38. package/templates/documentation.template.mjs +1 -0
  39. package/templates/documentation.tsx +4 -2
  40. package/templates/editor.template.mjs +1 -0
  41. package/templates/editor.tsx +4 -2
  42. package/templates/file-explorer.template.mjs +1 -0
  43. package/templates/file-explorer.tsx +4 -2
  44. package/templates/form-two-column.template.mjs +1 -0
  45. package/templates/form-two-column.tsx +8 -2
  46. package/templates/gallery-hero.template.mjs +1 -0
  47. package/templates/gallery-hero.tsx +4 -2
  48. package/templates/ide.template.mjs +1 -0
  49. package/templates/ide.tsx +11 -6
  50. package/templates/incident-console.template.mjs +1 -0
  51. package/templates/incident-console.tsx +122 -80
  52. package/templates/kanban-board.template.mjs +1 -0
  53. package/templates/kanban-board.tsx +6 -4
  54. package/templates/library.template.mjs +1 -0
  55. package/templates/library.tsx +4 -2
  56. package/templates/login-card.template.mjs +1 -0
  57. package/templates/login-card.tsx +4 -2
  58. package/templates/login-split.template.mjs +1 -0
  59. package/templates/login-split.tsx +5 -2
  60. package/templates/login-sso.template.mjs +1 -0
  61. package/templates/login-sso.tsx +4 -2
  62. package/templates/login.template.mjs +1 -0
  63. package/templates/login.tsx +4 -2
  64. package/templates/messaging-shell.template.mjs +1 -0
  65. package/templates/messaging-shell.tsx +6 -2
  66. package/templates/mixed-gallery.template.mjs +1 -0
  67. package/templates/mixed-gallery.tsx +4 -2
  68. package/templates/payment-form.template.mjs +1 -0
  69. package/templates/payment-form.tsx +5 -3
  70. package/templates/product-detail.template.mjs +1 -0
  71. package/templates/product-detail.tsx +9 -2
  72. package/templates/product-gallery.template.mjs +1 -0
  73. package/templates/product-gallery.tsx +4 -2
  74. package/templates/product-tour.template.mjs +1 -0
  75. package/templates/product-tour.tsx +13 -10
  76. package/templates/settings-dialog.template.mjs +1 -0
  77. package/templates/settings-dialog.tsx +5 -3
  78. package/templates/settings-sidebar.template.mjs +1 -0
  79. package/templates/settings-sidebar.tsx +6 -4
  80. package/templates/settings.template.mjs +1 -0
  81. package/templates/settings.tsx +6 -10
  82. package/templates/shell-nav.template.mjs +1 -0
  83. package/templates/shell-nav.tsx +24 -26
  84. package/templates/shell-side-nav.template.mjs +1 -0
  85. package/templates/shell-side-nav.tsx +23 -18
  86. package/templates/shell-top-nav.template.mjs +1 -0
  87. package/templates/shell-top-nav.tsx +4 -2
  88. package/templates/side-gallery.template.mjs +1 -0
  89. package/templates/side-gallery.tsx +4 -2
  90. package/templates/table-grouped.template.mjs +1 -0
  91. package/templates/table-grouped.tsx +5 -3
  92. package/templates/table-page-chart.template.mjs +1 -0
  93. package/templates/table-page-chart.tsx +4 -2
  94. package/templates/table-page-heatmap-status.template.mjs +1 -0
  95. package/templates/table-page-heatmap-status.tsx +4 -2
  96. package/templates/table-page-shoe-store-heatmap.template.mjs +1 -0
  97. package/templates/table-page-shoe-store-heatmap.tsx +4 -2
  98. package/templates/table-page.template.mjs +1 -0
  99. package/templates/table-page.tsx +4 -2
  100. package/templates/table.template.mjs +1 -0
  101. package/templates/table.tsx +4 -2
  102. package/templates/tech-report.template.mjs +1 -0
  103. package/templates/tech-report.tsx +10 -8
  104. package/templates/theme-showcase.template.mjs +1 -0
  105. package/templates/theme-showcase.tsx +23 -17
  106. package/theme.css +35 -77
  107. package/theme.css.d.ts +9 -0
  108. package/tokens.css +38 -42
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // TN"Nocturne" + (S[p6] > V[g10] > (Ctr > V[g4 a=center] > Hd"Little haunts"[level=1 type=display-2] + Tx"We believe"[t=body]) + (G[c={min:200,max:3} g4] > (C[p0] > AR + V[g2 a=center] > Bd + Hd"Product"[level=2] + Tx"Description"[t=body] + (H[g2] > NI + B"Add to cart"))*3)) + (V[g8] > (C[p0] > Hd"Night Owl AI"[level=2]) + (G[c={min:200} g4] > (GS[c=3] > C > T) + (GS[c=1] > C > Hd"Revenue"[level=2])))
2
+ // XLE (canonical structure of the tree below; the CLI had no XLE validator
3
+ // after `astryx layout` was removed in 0.7.0, so this is a reading aid and a
4
+ // human drift check — update it with the file, never alone):
5
+ // V[g=0] > (V[g=0] > (V[g=0] > (TN"Nocturne" > ((TNI"Shop" + TNI"New In" + TNI"Stories" + TNI"Help") + (H[g=2 a=center] > (H[g=0.5] > B.ghost"Search" + B.ghost"Account" + B.ghost"Cart") + B.primary"Sign in"))) + (S.transparent[p=6] > V[g=10 mw=880] > (Ctr > V[g=4 a=center mw=560] > Hd"Little haunts"[level=1 t=display-2] + Tx"We believe"[t=body]) + (G[c={min:200,max:3} g=4] > (C[p=0 h=100%] > (V[g=0 h=100%] > (AR[ratio=1] > Scene{SceneFrame}) + (V[g=2 a=center p=4] > Bd.cyan"New" + Hd"Moonphase Watch"[level=2] + Tx"Description"[t=body] + (H[g=2 a=center] > NI"Quantity" + B.secondary"Add to cart"))))*3)))) + (V[g=0 p=6] > (V[g=8] > ((C[p=0] > (H[g=3 j=between a=center] > Hd"Night Owl AI"[level=2] + (H[g=1 a=center] > B.ghost"Export conversation" + B.ghost"Close chat")) + D + (V[g=0] > ChML > (ChSM"Today" + (ChM > ChB{ChatMessageBubble}"Where's my order?") + (ChM > (V[g=3] > Tx"Body"[t=body] + Tx"Body"[t=body])) + (ChM > ChB{ChatMessageBubble}"Can you show me the full details?") + (ChM > (V[g=3] > Tx"Body"[t=body] + (C[p=3] > (V[g=1] > LI{Item}*4)))))) + (V[g=0] > (H[g=1 a=center wrap] > B.secondary*3)) + (V[g=0] > ChC"Ask Night Owl..."))) + (G[c={min:200} g=4] > (GS[c=3] > (C[p=0] > (H[g=3 j=between a=center] > Hd"Inventory"[level=2] + B.primary"Add item") + D + (H[g=3 j=between a=center] > (H[g=2 a=center] > TI"Search inventory" + (OFL[g=2] > SE{Selector}*3)) + (H[g=1 a=center] > B.ghost"List view" + B.ghost"Grid view")) + (V[g=0] > Bn.warning"2 items are running low") + (V[g=0] > T[density=spacious dv=rows hover] > (TR > THC + THC"Item" + THC"Available" + THC"Location" + THC"Tags" + THC) + (TR > (TC > CB) + (TC > (H[g=3 a=center] > Sw{ProductSwatch} + (V[g=0] > Tx"Moonphase Watch"[t=body] + Tx"Steel case, moonphase dial"[t=supporting]))) + TC"42" + TC"Roost 3" + (TC > Bd) + (TC > MM))*6))) + (GS[c=1] > (C[p=4 h=100%] > (V[g=4 h=100%] > Hd"Revenue"[level=2] + (G[c=2 g=3] > (V[g=0] > Tx"18K"[t=display-3] + Tx"Monthly revenue"[t=supporting]) + (V[g=0] > Tx"+12%"[t=display-3] + Tx"Order growth"[t=supporting])) + D + (H[g=3 j=between a=center] > Hd"Activity"[level=3] + Lk"See all") + (V[g=1] > LI{Item}*5)))))))
4
6
 
5
7
  /**
6
8
  * Theme Showcase — the storefront page each theme is previewed against, and the only template that is deliberately shell-less: it paints its o (Frame/responsive/container: see XLE header above.)
@@ -70,15 +72,7 @@ const PRODUCT_COLUMNS = { minWidth: 200, max: 3 } as const;
70
72
 
71
73
  /** Categorical badge variants usable for showcase product/inventory tags. */
72
74
  export type ShowcaseBadgeVariant =
73
- | "blue"
74
- | "cyan"
75
- | "green"
76
- | "orange"
77
- | "pink"
78
- | "purple"
79
- | "red"
80
- | "teal"
81
- | "yellow";
75
+ "blue" | "cyan" | "green" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow";
82
76
 
83
77
  export interface ProductSpec {
84
78
  name: string;
@@ -291,7 +285,7 @@ function StorePreview({ products, isMobile }: { products: ProductSpec[]; isMobil
291
285
  // 40px was too tight on themes with larger padding /
292
286
  // bigger type scale (e.g. Matcha, Y2K), clipping the
293
287
  // value.
294
- style={{ minWidth: 64, flexShrink: 0 }}
288
+ controlStyle={{ minWidth: 64, flexShrink: 0 }}
295
289
  />
296
290
  <Button
297
291
  label="Add to cart"
@@ -536,7 +530,7 @@ const ACTIVITY: ActivityRow[] = [
536
530
 
537
531
  function formatAmount(amount: number): string {
538
532
  const sign = amount < 0 ? "−" : "+";
539
- return sign + "$" + Math.abs(amount).toLocaleString();
533
+ return `${sign}$${Math.abs(amount).toLocaleString()}`;
540
534
  }
541
535
 
542
536
  function LatestActivityCard({ isMobile }: { isMobile: boolean }) {
@@ -587,7 +581,11 @@ function LatestActivityCard({ isMobile }: { isMobile: boolean }) {
587
581
  overflow: "hidden",
588
582
  maskImage: "linear-gradient(to bottom, black calc(100% - 48px), transparent)",
589
583
  WebkitMaskImage: "linear-gradient(to bottom, black calc(100% - 48px), transparent)",
590
- marginInline: "calc(var(--spacing-2) * -1)",
584
+ // Cancel the Item inline inset with the inset ITSELF: core
585
+ // publishes it as --_item-inset-inline (0.6.7), and it
586
+ // tracks density and theme overrides. A literal spacing
587
+ // step silently stops matching when either moves.
588
+ marginInline: "calc(-1 * var(--_item-inset-inline))",
591
589
  }}
592
590
  >
593
591
  {/* The sign travels in the string (formatAmount prefixes U+2212), so
@@ -730,7 +728,7 @@ const LOW_STOCK_THRESHOLD = 25;
730
728
  function SelectCell({ row }: { row: InventoryRow }) {
731
729
  return (
732
730
  <CheckboxInput
733
- label={"Select " + row.name}
731
+ label={`Select ${row.name}`}
734
732
  isLabelHidden
735
733
  value={row.selected}
736
734
  onChange={() => {}}
@@ -887,7 +885,7 @@ function InventoryCard({ inventory }: { inventory: InventoryRow[] }) {
887
885
  value=""
888
886
  onChange={() => {}}
889
887
  startIcon={<Search size={16} />}
890
- style={{ flex: 1, minWidth: 0, maxWidth: 240 }}
888
+ controlStyle={{ flex: 1, minWidth: 0, maxWidth: 240 }}
891
889
  />
892
890
  <OverflowList
893
891
  gap={2}
@@ -949,7 +947,15 @@ function InventoryCard({ inventory }: { inventory: InventoryRow[] }) {
949
947
 
950
948
  {lowStockCount > 0 && (
951
949
  <VStack gap={0} paddingInline={6} paddingBlockEnd={4}>
952
- <Banner status="warning" title={lowStockCount + " items are running low"} />
950
+ <Banner
951
+ status="warning"
952
+ // Core 0.7.0 stopped deriving the live-region role from
953
+ // `status`, so this banner states its own. It appears when
954
+ // the count crosses the threshold, and a screen reader must
955
+ // hear it.
956
+ role="status"
957
+ title={`${lowStockCount} items are running low`}
958
+ />
953
959
  </VStack>
954
960
  )}
955
961
 
package/theme.css CHANGED
@@ -2,10 +2,12 @@
2
2
  * @generated by `astryx theme build` — do not edit manually.
3
3
  * Source: astryx-theme.ts
4
4
  * Command: astryx theme build astryx-theme.ts --out theme.css
5
- * CLI: @astryxdesign/cli@0.6.3
6
- * Core: @astryxdesign/core@0.6.3
5
+ * CLI: @astryxdesign/cli@0.7.2
6
+ * Core: @astryxdesign/core@0.7.2
7
7
  */
8
8
 
9
+ @layer reset, astryx-base, astryx-theme;
10
+
9
11
  @layer reset {
10
12
  @scope ([data-astryx-theme="astryx-dracula"]) to ([data-astryx-theme]) {
11
13
  :where(h1, h2, h3, h4, h5, h6) {
@@ -77,67 +79,6 @@
77
79
  }
78
80
  }
79
81
 
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
-
141
82
  @layer astryx-theme {
142
83
  :root { color-scheme: light dark; }
143
84
  html[data-theme="light"] { color-scheme: light; }
@@ -225,6 +166,11 @@
225
166
  --color-syntax-property: #F8F8F2;
226
167
  --color-syntax-punctuation: #F8F8F2;
227
168
  --color-syntax-background: #282A36;
169
+ --color-syntax-added: #50FA7B26;
170
+ --color-syntax-removed: #FF555526;
171
+ --color-syntax-diff-header: #44475A;
172
+ --color-syntax-added-marker: #50FA7B;
173
+ --color-syntax-removed-marker: #FF5555;
228
174
  --radius-inner: 4px;
229
175
  --radius-element: 5px;
230
176
  --radius-container: 5px;
@@ -602,31 +548,31 @@
602
548
  border-color: var(--color-error);
603
549
  }
604
550
 
605
- .astryx-statusdot[data-variant="info"] {
551
+ .astryx-status-dot[data-variant="info"] {
606
552
  background-color: #8BE9FD;
607
553
  }
608
554
 
609
- .astryx-progressbar-fill[data-variant="accent"] {
555
+ .astryx-progress-bar-fill[data-variant="accent"] {
610
556
  background-color: #BD93F9;
611
557
  }
612
558
 
613
- .astryx-progressbar-fill[data-variant="success"] {
559
+ .astryx-progress-bar-fill[data-variant="success"] {
614
560
  background-color: #50FA7B;
615
561
  }
616
562
 
617
- .astryx-progressbar-fill[data-variant="warning"] {
563
+ .astryx-progress-bar-fill[data-variant="warning"] {
618
564
  background-color: #F1FA8C;
619
565
  }
620
566
 
621
- .astryx-progressbar-fill[data-variant="error"] {
567
+ .astryx-progress-bar-fill[data-variant="error"] {
622
568
  background-color: #FF5555;
623
569
  }
624
570
 
625
- .astryx-progressbar-fill[data-variant="neutral"] {
571
+ .astryx-progress-bar-fill[data-variant="neutral"] {
626
572
  background-color: var(--color-progress-value);
627
573
  }
628
574
 
629
- .astryx-progressbar-fill[data-variant="disabled"] {
575
+ .astryx-progress-bar-fill[data-variant="disabled"] {
630
576
  background-color: var(--color-progress-value);
631
577
  }
632
578
 
@@ -642,15 +588,15 @@
642
588
  --color-error: #FF5555;
643
589
  }
644
590
 
645
- .astryx-textarea[data-status="success"] {
591
+ .astryx-text-area[data-status="success"] {
646
592
  --color-success: #50FA7B;
647
593
  }
648
594
 
649
- .astryx-textarea[data-status="warning"] {
595
+ .astryx-text-area[data-status="warning"] {
650
596
  --color-warning: #F1FA8C;
651
597
  }
652
598
 
653
- .astryx-textarea[data-status="error"] {
599
+ .astryx-text-area[data-status="error"] {
654
600
  --color-error: #FF5555;
655
601
  }
656
602
 
@@ -702,6 +648,10 @@
702
648
  --color-error: #FF5555;
703
649
  }
704
650
 
651
+ .astryx-selector[data-variant="secondary"] {
652
+ font-weight: var(--font-weight-normal);
653
+ }
654
+
705
655
  .astryx-multi-selector[data-status="success"] {
706
656
  --color-success: #50FA7B;
707
657
  }
@@ -714,6 +664,10 @@
714
664
  --color-error: #FF5555;
715
665
  }
716
666
 
667
+ .astryx-multi-selector[data-variant="secondary"] {
668
+ font-weight: var(--font-weight-normal);
669
+ }
670
+
717
671
  .astryx-typeahead[data-status="success"] {
718
672
  --color-success: #50FA7B;
719
673
  }
@@ -770,7 +724,11 @@
770
724
  box-shadow: var(--shadow-low);
771
725
  }
772
726
 
773
- .astryx-hovercard {
727
+ .astryx-hover-card {
728
+ background-color: var(--color-background-popover);
729
+ }
730
+
731
+ .astryx-drawer {
774
732
  background-color: var(--color-background-popover);
775
733
  }
776
734
 
@@ -855,9 +813,9 @@
855
813
 
856
814
  [data-astryx-media="light"] {
857
815
  color-scheme: light;
858
- --color-text-primary: var(--color-on-light);
859
- --color-icon-primary: var(--color-on-light);
860
- --color-accent: var(--color-on-light);
816
+ --color-text-primary: light-dark(#F8F8F2, #F8F8F2);
817
+ --color-icon-primary: light-dark(#F8F8F2, #F8F8F2);
818
+ --color-accent: light-dark(#BD93F9, #BD93F9);
861
819
  }
862
820
  }
863
821
  }
package/theme.css.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @generated by `astryx theme build` — do not edit manually.
3
+ * Source: astryx-theme.ts
4
+ * Command: astryx theme build astryx-theme.ts --out theme.css
5
+ * CLI: @astryxdesign/cli@0.7.2
6
+ * Core: @astryxdesign/core@0.7.2
7
+ */
8
+
9
+ export {};
package/tokens.css CHANGED
@@ -8,13 +8,16 @@
8
8
  * paragraph #B0B3C4 and base-muted #8288A6 are same-hue lifts, #4C5067
9
9
  * (subdue) is chrome only and never text, and theme.css adds #FFD5CC as the
10
10
  * pale inverted error surface. Do not revert any of them to spec hexes.
11
- * Two categorical data hues are deliberately ABSENT from the list below, do not
12
- * re-add them: `brown` (was byte-identical to orange, and a categorical series
13
- * set is a palette where distinctness IS the contract) and `purple` (purple
14
- * means tappable, never data). The purple ban is a MODULE rule —
15
- * `shared/chart-hues.ts` is purple-free by construction — so the SEQUENTIAL
16
- * `--color-data-purple-1..5` ramp below SURVIVES and is sanctioned; only the
17
- * categorical half is revoked. Rationale lives in astryx-theme.ts.
11
+ * Two categorical data hues are excluded from the CHART palette: `brown` (was
12
+ * byte-identical to orange, and a categorical series set is a palette where
13
+ * distinctness IS the contract) and `purple` (purple means tappable, never
14
+ * data). That exclusion is a MODULE rule — `shared/chart-hues.ts` is
15
+ * purple-free by construction — so the SEQUENTIAL `--color-data-purple-1..5`
16
+ * ramp below SURVIVES and is sanctioned. The two TOKENS are still defined
17
+ * below, on-brand, because core 0.7.x moved the canonical data-colour defaults
18
+ * out of CSS entirely: a theme that wants a name to exist must author it, and
19
+ * this one authors it on-palette so nothing off-brand can ship. Rationale
20
+ * lives in astryx-theme.ts.
18
21
  * `--color-data-teal-1..5` derives off `--color-data-categorical-teal` (#A4FFFF,
19
22
  * an ANSI bright, not a spec token) rather than spec Cyan #8BE9FD; provenance
20
23
  * fix only, nothing renders the ramp today (HeatScale is shamrock).
@@ -276,6 +279,8 @@ body {
276
279
  --color-data-categorical-red: #ff5555;
277
280
  --color-data-categorical-teal: #a4ffff;
278
281
  --color-data-categorical-indigo: #d6acff;
282
+ --color-data-categorical-purple: #bd93f9;
283
+ --color-data-categorical-brown: #ffb86c;
279
284
  --color-data-neutral: #8c939b;
280
285
  --color-data-purple-5: hsl(264.71 89.47% 28%);
281
286
  --color-data-purple-4: hsl(264.71 89.47% 44%);
@@ -343,6 +348,32 @@ body {
343
348
  --color-tag-cyan: #8be9fd;
344
349
  --color-tag-yellow: #f1fa8c;
345
350
  --color-tag-green: #50fa7b;
351
+ /* Syntax theme, mirrored from astryx-theme.ts's draculaSyntax map. Core
352
+ * 0.7.x emits NO --color-syntax-* defaults in CSS — the canonical values
353
+ * live in JS only — and core's highlighter uses them with no fallback, so
354
+ * a plain-CSS consumer that imports this file without theme.css would
355
+ * render an UNHIGHLIGHTED CodeBlock. These 19 slots close that gap; the
356
+ * five diff slots are the 0.7.1 diff layer and derive from Dracula's
357
+ * green/red rather than being Dracula spec tokens. */
358
+ --color-syntax-keyword: #ff79c6;
359
+ --color-syntax-string: #f1fa8c;
360
+ --color-syntax-comment: #6272a4;
361
+ --color-syntax-number: #ffb86c;
362
+ --color-syntax-function: #50fa7b;
363
+ --color-syntax-type: #8be9fd;
364
+ --color-syntax-variable: #f8f8f2;
365
+ --color-syntax-operator: #ff79c6;
366
+ --color-syntax-constant: #bd93f9;
367
+ --color-syntax-tag: #ff79c6;
368
+ --color-syntax-attribute: #50fa7b;
369
+ --color-syntax-property: #f8f8f2;
370
+ --color-syntax-punctuation: #f8f8f2;
371
+ --color-syntax-background: #282a36;
372
+ --color-syntax-added: #50fa7b26;
373
+ --color-syntax-removed: #ff555526;
374
+ --color-syntax-diff-header: #44475a;
375
+ --color-syntax-added-marker: #50fa7b;
376
+ --color-syntax-removed-marker: #ff5555;
346
377
  --color-tag-purple: #bd93f9;
347
378
  /* Renamed in 0.3.0 from `tag-blue`, which held this same #BD93F9. Dracula
348
379
  * has no blue; Purple is what the rest of the kit already uses for a fourth
@@ -418,41 +449,6 @@ body {
418
449
  }
419
450
  }
420
451
 
421
- /* A resizable SideNav reports exactly 1px of horizontal overflow: the resize
422
- * handle renders 1px wider than its own box, and the side-nav panel scrolls
423
- * both axes, so a permanent horizontal scrollbar paints under the rail even
424
- * though nothing overflows visually. Clip the offending pixel on the handle
425
- * itself rather than on the panel: a collapsed rail renders its child popovers
426
- * as descendants of that panel, and they only escape the clip because their
427
- * root happens to be position:fixed. Clipping the panel would break them the
428
- * day an ancestor gains a transform. The handle contains nothing but its pill,
429
- * which sits inside its box, so clipping it costs nothing. Needed until the
430
- * resize handle stops reporting the extra pixel. Re-verified against
431
- * @astryxdesign/core 0.3.0: without the clip the hit area's half-pixel inline
432
- * shift leaves content at 300.5px in a 300px rail, and the LayoutPanel
433
- * (overflow:auto on both axes) reports scrollWidth 301 > 300 — the permanent
434
- * bar is back. Keep. */
435
- .astryx-app-shell-sidenav .astryx-resize-handle {
436
- overflow: hidden;
437
- }
438
-
439
- /* Astryx leaves the resize handle's drag surface translated -50% along the
440
- * block axis without ever positioning it at top:50%, so it spans only the TOP
441
- * HALF of the rail: the pointer reads col-resize and dragging works above the
442
- * midpoint, and nothing at all happens below it, even though the pill is drawn
443
- * straddling that boundary. The pill sibling carries a correct top:50%, which
444
- * is exactly what the drag surface is missing. Re-verified against
445
- * @astryxdesign/core 0.3.0: hitAreaHorizontal is still top:0/bottom:0 while
446
- * hitAreaOffsetX translates Y by -50%, so without this the drag surface spans
447
- * [-50%,+50%] of the rail and the bottom half is dead (elementFromPoint hits
448
- * the handle, which has no pointer handler). Upstream workaround; drop it if
449
- * the component starts positioning its own hit area. */
450
- .astryx-app-shell-sidenav .astryx-resize-handle > :not(.astryx-resize-handle-pill) {
451
- top: 50%;
452
- bottom: auto;
453
- height: 100%;
454
- }
455
-
456
452
  /* Everything below this line is UNLAYERED on purpose, and that is load-bearing,
457
453
  * not a style choice. Unlayered author rules beat every core LAYER regardless of
458
454
  * specificity — verified in Chromium against the declared order