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,11 +1,13 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // A[cp=0 @sideNav=(SN > (SNS"Getting started" > (SNI"Introduction"! + SNI"Install")) + (SNS"The brand" > (SNI"Palette" + SNI"Type and shape")) + (SNS"In practice" > (SNI"Components" + SNI"Templates")) + (SNS"Reference" > (SNI"Tokens" + SNI"Migrating")))] > L[h=auto] > (LC[p=8 !scroll] > V[g=8] > (V[g=2] > (H[g=2 a=center] > MNT + Tx[t=supporting]) + Hd"Introduction"[level=1 t=display-2] + Tx"v0.5.1"[t=supporting]) + Tx"Intro"[t=large] + AR + (V[g=8] > (V[g=3] > Hd"What it is"[level=2] + Tx"Body"[t=body] + UL + Cd)*2) + D + (H[j=between] > B.secondary"Previous" + B.secondary"Next")) + (LP[!scroll] > Outline)
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
+ // A[cp=0 h=auto @sideNav=(SN[collapsible header=SideNavHeading] > (SNS"Getting started" > (SNI"Introduction"! + SNI"Install")) + (SNS"The brand" > (SNI"Palette" + SNI"Type and shape")) + (SNS"In practice" > (SNI"Components" + SNI"Templates")) + (SNS"Reference" > (SNI"Tokens" + SNI"Migrating"))))] > L[h=auto] > (LC[p=8 !scroll] > V[g=8] > (V[g=2] > (H[g=2 a=center] > MNT + Tx"Documentation"[t=supporting]) + Hd"Introduction"[level=1 t=display-2] + Tx"astryx-dracula v0.6.2"[t=supporting] + SE{Selector}"On this page") + Tx"astryx-dracula is a pure Dracula brand theme"[t=large] + AR[ratio=16/9] + (V[g=8] > (V[g=3] > Hd"What it is"[level=2] + Tx"Four decisions shape everything else"[t=body] + (UL > LI*4)))*2) + D + (H[g=3 j=between a=center] > SI[fill] + B.secondary"Install")) + (LP[!scroll] > Outline)
4
6
 
5
7
  /**
6
8
  * Product Tour — a chaptered walkthrough of this theme.
7
9
  *
8
- * Frame-first layout (see `bunx astryx docs layout`):
10
+ * Frame-first layout (see `bunx @astryxdesign/cli docs layout`):
9
11
  *
10
12
  * Frame: chapter rail 264 (SideNav) | chapter content (fill) | outline 240
11
13
  *
@@ -251,9 +253,10 @@ import {astryxDraculaTheme} from 'astryx-dracula';
251
253
  code: {
252
254
  language: "bash",
253
255
  title: "shell",
254
- source: `# any of the 45 page ids
255
- bunx astryx template dashboard --package astryx-dracula
256
- bunx astryx template product-tour --package astryx-dracula`,
256
+ source: `# any of the 45 page ids — the path argument is required; without it the
257
+ # CLI prints the template source and writes nothing
258
+ bunx @astryxdesign/cli template dashboard --package astryx-dracula ./src/pages/dashboard.tsx
259
+ bunx @astryxdesign/cli template product-tour --package astryx-dracula ./src/pages/product-tour.tsx`,
257
260
  },
258
261
  },
259
262
  {
@@ -264,12 +267,12 @@ bunx astryx template product-tour --package astryx-dracula`,
264
267
  {
265
268
  key: "xle-headers",
266
269
  heading: "Read the header first",
267
- body: "Every template leads with a one-line structural expression describing the frame it renders, validated by the CLI. Reading that line costs a fraction of reading the file, which makes adapting a page much cheaper than rebuilding it.",
270
+ body: "Every template leads with a one-line structural expression describing the frame it renders. Reading that line costs a fraction of reading the file, which makes adapting a page much cheaper than rebuilding it. The CLI no longer ships a validator for it — `astryx layout` was removed in 0.7.0 — so it is a reading aid and a human drift check: update it with the file, never alone.",
268
271
  code: {
269
272
  language: "bash",
270
273
  title: "shell",
271
- source: `# validate the structure comment against the render
272
- bunx astryx layout check "L > (LC > V[g=4] > Hd\\"Title\\"[level=1])"`,
274
+ source: `# read the structure comment at the top of the template
275
+ head -4 src/pages/dashboard.tsx`,
273
276
  },
274
277
  },
275
278
  ],
@@ -852,7 +855,7 @@ export default function ProductTour() {
852
855
  railHref={SELF_HASH}
853
856
  railIcon={<Icon icon={Sparkles} size="sm" />}
854
857
  eyebrow="Documentation"
855
- badge={() => "astryx-dracula v0.5.1"}
858
+ badge={() => "astryx-dracula v0.6.2"}
856
859
  art={(chapterId) => <ChapterArt chapterId={chapterId} />}
857
860
  />
858
861
  );
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Settings Dialog",
4
4
  description: "Account settings dialog with sidebar sections",
5
+ keywords: ["settings", "dialog", "preferences", "modal", "configuration", "options"],
5
6
  category: "forms",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > LC > Ctr[h=80vh] > B.primary"Open settings"[opens=#settings] ;; Dlg#settings > L > (LP[w=280 divider p=3] > V[g=4] > Tx"Account settings"[t=label] + (UL > LI"Personal information"*8)) + (LC[p=6] > V[g=6] > DH"Account" + SE"Settings section" + (V[g=0] > TabList + (V[g=0] > Hd"Login"[level=3] + (H[j=between a=start] > (V[g=0] > Tx"Password"[weight=semibold] + Tx"Not created"[t=supporting]) + B"Create") + (H[g=3 a=start] > Ic + (V[g=0] > (H[g=2 a=center wrap] > Tx"OS X 10.15.7 Chrome"[weight=semibold] + SD) + Tx"March 30, 2026"[t=supporting])))))
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
+ // L[h=auto] > LC[p=0] > Ctr[h=80vh] > B.primary"Open settings"[opens=#settings] ;; Dlg#settings > L[h=fill] > (LP[w=280 divider p=3] > V[g=4] > Tx"Account settings"[t=label] + (UL[density=spacious edge=flush] > LI"Personal information" + LI"Login & security"! + LI*6)) + (LC[p=6] > V[g=6] > DH"Login & security" + SE{Selector}"Settings section" + (V[g=0 mw=680] > (TL[divider] > Tab"Login"! + Tab"Shared access") + (V[g=8] > (V[g=2] > Hd"Login"[level=3] + (H[j=between a=start] > (V[g=1] > Tx"Password"[weight=semibold] + Tx"Not created"[t=body]) + B.secondary"Create")) + (V[g=2] > Hd"Social accounts"[level=3] + (H[j=between a=start] > (V[g=1] > Tx"Google"[weight=semibold] + Tx"Connected"[t=body]) + B.destructive"Disconnect")) + (V[g=2] > Hd"Device history"[level=3] + (H[g=3 a=start] > Ic + (SI[fill] > V[g=1] > (H[g=2 a=center wrap] > Tx"OS X 10.15.7 · Chrome"[weight=semibold] + SD.success) + Tx"March 30, 2026"[t=supporting]))*3) + (V[g=2] > Hd"Account"[level=3] + (H[j=between a=start] > (V[g=1] > Tx"Deactivate your account"[weight=semibold] + Tx"This action cannot be undone"[t=supporting]) + B.destructive"Deactivate")))))
4
6
 
5
7
  /**
6
8
  * Settings Dialog — account sections inside one modal. Frame: the trigger page, then a Dialog that sizes to (Frame/responsive/container: see XLE header above.)
@@ -189,7 +191,7 @@ export default function SettingsDialog() {
189
191
  <Text type="label" style={sideNavHeading}>
190
192
  Account settings
191
193
  </Text>
192
- <List density="spacious">
194
+ <List density="spacious" edge="flush">
193
195
  {NAV_ITEMS.map((item) => (
194
196
  <ListItem
195
197
  key={item.label}
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Settings Panels",
4
4
  description: "Sidebar sections with account and workspace panels",
5
+ keywords: ["settings", "sidebar", "preferences", "configuration", "options", "account"],
5
6
  category: "forms",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LP[p=0] > V[g=4] > Tx"Account settings"[t=label] + (UL > LI*8) + D + LI"Professional hosting tools") + (LC[p=6] > V[g=0] > (Tbar > B.ghost + Hd"Personal info"[level=1]) + Hd"Personal info"[level=1] + (V[g=0] > (H[j=between a=start] > (V[g=1] > Tx"Legal name"[weight=semibold] + Tx"Vlad Dracul"[t=supporting]) + B.secondary"Edit")*7) + (C.muted > V[g=4] > (H[g=3 a=start] > Ic + (V[g=1] > Tx"Why is info hidden?"[weight=semibold] + Tx[t=supporting]))*3))
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
+ // L[h=fill] > (LP[divider p=0] > V[g=4 paddingBlock=4 paddingInline=3] > Tx"Account settings"[t=label] + (UL[density=spacious edge=flush] > LI*8) + D + (UL[density=spacious edge=flush] > LI"Professional hosting tools")) + (LC[p=6] > V[g=0] > (Tbar[g=2] > B.ghost"Back to Account settings" + Hd"Personal information"[level=1]) + Hd"Personal information"[level=1] + (V[g=0] > (H[j=between a=start] > (V[g=1] > Tx"Legal name"[weight=semibold] + Tx"Vlad Dracul"[t=body]) + B.secondary"Edit")*7 + (H[j=between a=start] > (V[g=1] > Tx"Identity verification"[weight=semibold] + Tx"Verified"[t=body]))) + (C[p=4] > V[g=4] > (H[g=3 a=start] > Ctr[w=48 h=48] > Ic + (V[g=1] > Tx"Why isn't my info shown here?"[weight=semibold] + Tx[t=body]))*3)) ;; L[h=fill] > LC[p=0] > V[g=4 paddingBlock=4 paddingInline=3] > Tx"Account settings"[t=label] + (UL[density=spacious edge=flush] > LI*8) + D + (UL[density=spacious edge=flush] > LI"Professional hosting tools")
4
6
 
5
7
  /**
6
8
  * Settings Panels — account sections with a nav panel and spaced rows. Frame: Layout nav panel (fill) | content column of section views. One (Frame/responsive/container: see XLE header above.)
@@ -131,7 +133,7 @@ export default function SettingsSidebar() {
131
133
  <Text type="label" style={sideNavHeading}>
132
134
  Account settings
133
135
  </Text>
134
- <List density="spacious">
136
+ <List density="spacious" edge="flush">
135
137
  {NAV_ITEMS.map((item) => (
136
138
  <ListItem
137
139
  key={item.label}
@@ -146,7 +148,7 @@ export default function SettingsSidebar() {
146
148
  ))}
147
149
  </List>
148
150
  <Divider />
149
- <List density="spacious">
151
+ <List density="spacious" edge="flush">
150
152
  <ListItem label="Professional hosting tools" startContent={<Icon icon={Wrench} />} />
151
153
  </List>
152
154
  </VStack>
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Settings Form",
4
4
  description: "Single scrolling form with profile sections",
5
+ keywords: ["settings", "preferences", "configuration", "options", "account", "profile"],
5
6
  category: "forms",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > H[a=center wrap] > (SI[fill] > Hd"Settings"[level=1 t=display-2]) + TY"Search") + (LP[w=260 p=2] > UL > LI*6) + (LC[p=6] > V[g=4] > (V[a=center] > TabList) + ((G[c={min:280} g=8] > (V[g=1] > Hd"Basic information"[level=2] + Tx"View and update your details"[t=body]) + (V[g=4] > TI"Username" + TI"Email address" + (H > B.primary"Save"))) + D)*3)
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
+ // L[h=fill] > (LH[divider p=6] > H[a=center wrap] > (SI[fill] > Hd"Settings"[level=1 t=display-2]) + TY"Search coven settings…") + (LP[w=260 p=2] > UL[density=balanced edge=flush] > LI*6) + (LC[p=6] > V[g=4] > (V[a=center] > (TL > Tab"Profile"! + Tab"Account" + Tab"Members" + TabMenu"More")) + (G[c={min:280} g=8] > (V[g=1] > Hd"Basic information"[level=2] + Tx"View and update your crypt details"[t=body]) + (V[g=4] > TI"Username" + TI"First name" + TI"Last name" + TI"Email address" + (H > B.primary"Save"))) + D + (G[c={min:280} g=8] > (V[g=1] > Hd"Change password"[level=2] + Tx"Update your password"[t=body]) + (V[g=4] > TI"Verify current password" + TI"New password" + TI"Confirm password" + (H > B.primary"Save"))) + D + (G[c={min:280} g=8] > (V[g=1] > Hd"Advanced settings"[level=2] + Tx"Configure detailed coven preferences"[t=body]) + (V[g=4] > CB"Data Export Access" + CB"Allow Admin to Add Members" + CB"Enable Two-Factor Authentication" + (H > B.primary"Save"))))
4
6
 
5
7
  /**
6
8
  * Settings — one scrolling page of account sections.
@@ -65,13 +67,7 @@ const settingsSearchSource: SearchSource<SearchableItem> = {
65
67
  // the fields in the right column. Text and check fields share one row shape;
66
68
  // the renderer switches on `kind`.
67
69
  type SettingsTextKey =
68
- | "username"
69
- | "firstName"
70
- | "lastName"
71
- | "email"
72
- | "currentPw"
73
- | "newPw"
74
- | "confirmPw";
70
+ "username" | "firstName" | "lastName" | "email" | "currentPw" | "newPw" | "confirmPw";
75
71
  type SettingsCheckKey = "dataExport" | "adminMembers" | "twoFactor";
76
72
  type SettingsField =
77
73
  | {
@@ -283,7 +279,7 @@ export default function SettingsTemplate() {
283
279
  start={
284
280
  isNarrow ? undefined : (
285
281
  <LayoutPanel hasDivider={false} width={260} padding={2}>
286
- <List density="balanced">
282
+ <List density="balanced" edge="flush">
287
283
  {NAV_ITEMS.map((item) => (
288
284
  <ListItem
289
285
  key={item}
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Shell Nav",
4
4
  description: "Top and side nav app shell with code editor",
5
+ keywords: ["shell", "navigation", "app", "chrome", "layout", "header"],
5
6
  category: "tooling",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // A[cp=0 @topNav=(TN) @sideNav=(SN > TL)] > L > (LH[divider] > H[g=2 wrap] > C.muted[p=0]*3) + (LC[p=6] > V[g=2] > (H[g=3 a=center] > C.muted[p=0] + C.muted[p=0])*3 + C.muted[p=0] + (H[g=3 a=center] > C.muted[p=0] + C.muted[p=0])*4 + C.muted[p=0] + (H[g=3 a=center] > C.muted[p=0] + C.muted[p=0])*5)
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
+ // A[cp=0 @topNav=(TN > (B.ghost"File" + B.ghost"Edit" + B.ghost"View" + B.ghost"Window" + B.ghost"Help") + B.secondary"Search files and commands") @sideNav=(SN > TrL[density=compact])] > L[h=fill] > (LH[divider p=6] > H[g=2 wrap] > Sk[w=132 h=36]*2) + (LC[p=6] > V[g=2] > (H[g=3 a=center] > Sk + Sk)*2 + Sk + (H[g=3 a=center] > Sk + Sk) + Sk)
4
6
  // Note: skeleton placeholders carry no Hd by design (skill skeleton-shell
5
7
  // exemption) — routed pages supply the h1.
6
8
 
@@ -162,34 +164,30 @@ export default function ShellNav() {
162
164
  topNav={
163
165
  <TopNav
164
166
  label="Dracula Studio menu bar"
165
- startContent={
166
- <>
167
- {MENUS.map((menu) => (
168
- <DropdownMenu
169
- key={menu.label}
170
- button={{ label: menu.label, variant: "ghost", size: "sm" }}
171
- hasChevron={false}
172
- menuWidth={MENU_WIDTH}
173
- >
174
- {/* Keyed by the group's first label, not its position:
167
+ startContent={MENUS.map((menu) => (
168
+ <DropdownMenu
169
+ key={menu.label}
170
+ button={{ label: menu.label, variant: "ghost", size: "sm" }}
171
+ hasChevron={false}
172
+ menuWidth={MENU_WIDTH}
173
+ >
174
+ {/* Keyed by the group's first label, not its position:
175
175
  an index key remounts every group when the menu
176
176
  data shifts. `gi` only decides the divider. */}
177
- {menu.groups.map((group, gi) => (
178
- <Fragment key={group[0][0]}>
179
- {gi > 0 && <Divider />}
180
- {group.map(([label, shortcut]) => (
181
- <DropdownMenuItem
182
- key={label}
183
- label={label}
184
- endContent={shortcut ? <Kbd keys={shortcut} /> : undefined}
185
- />
186
- ))}
187
- </Fragment>
177
+ {menu.groups.map((group, gi) => (
178
+ <Fragment key={group[0][0]}>
179
+ {gi > 0 && <Divider />}
180
+ {group.map(([label, shortcut]) => (
181
+ <DropdownMenuItem
182
+ key={label}
183
+ label={label}
184
+ endContent={shortcut ? <Kbd keys={shortcut} /> : undefined}
185
+ />
188
186
  ))}
189
- </DropdownMenu>
187
+ </Fragment>
190
188
  ))}
191
- </>
192
- }
189
+ </DropdownMenu>
190
+ ))}
193
191
  endContent={
194
192
  // A real palette trigger, not a lookalike field: the previous
195
193
  // TextInput swallowed keystrokes while a wrapper div opened the
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Sidebar Shell",
4
4
  description: "Workspace sidebar with conversation list",
5
+ keywords: ["shell", "side nav", "sidebar", "navigation", "app", "layout"],
5
6
  category: "tooling",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // A[cp=0 @sideNav=(SN > SNI"New chat" + SNI"Search" + SNI"Library" + D + (SNI"Personal" > SNI"Full-moon rite planning")*3)] > L > (LC[p=6] > V[g=5] > (H > C.muted[p=0])*4) + (LF > TI"Message Night Owl")
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
+ // A[cp=0 @sideNav=(SN[collapsible header=SideNavHeading] > (SNS > SNI"New chat" + SNI"Search" + SNI"Library") + D + (SNS > SNI"Personal" > (SNI"Full-moon rite planning"! + SNI"Potion recipes for the week" + SNI"Grimoire recommendations")) + (SNS > SNI"Settings" + SNI"Sarah Chen"))] > L[h=fill] > (LC[p=6] > V[g=5] > (H > C.muted[p=0])*4) + (LF > TI"Message Night Owl…")
4
6
  // Note: skeleton placeholders carry no Hd by design (skill skeleton-shell
5
7
  // exemption) — routed pages supply the h1.
6
8
 
@@ -93,22 +95,25 @@ export default function ShellSideNav() {
93
95
  icon={workspace.icon}
94
96
  collapsible={{ defaultIsCollapsed: false }}
95
97
  >
96
- <VStack gap={0.5}>
97
- {workspace.chats.map((chat) => (
98
- // The hover-only MoreMenu was four dead actions unreachable
99
- // by keyboard and touch, so it goes: the status dot stays
100
- // always visible (its label doubles as the tooltip), and
101
- // selecting a conversation switches selection.
102
- <SideNavItem
103
- key={chat.label}
104
- label={chat.label}
105
- href={SELF_HASH}
106
- isSelected={chat.label === selectedChat}
107
- onClick={() => setSelectedChat(chat.label)}
108
- endContent={<StatusDot variant={chat.status} label={chat.statusLabel} />}
109
- />
110
- ))}
111
- </VStack>
98
+ {/* The nested rows are direct children, not wrapped in a
99
+ VStack: core 0.7.2 made nested SideNavItems span the
100
+ full width of the nav list with the indent inside the row,
101
+ and any non-SideNavItem content in between (a VStack is
102
+ exactly that) takes the children out of that flow. */}
103
+ {workspace.chats.map((chat) => (
104
+ // The hover-only MoreMenu was four dead actions unreachable
105
+ // by keyboard and touch, so it goes: the status dot stays
106
+ // always visible (its label doubles as the tooltip), and
107
+ // selecting a conversation switches selection.
108
+ <SideNavItem
109
+ key={chat.label}
110
+ label={chat.label}
111
+ href={SELF_HASH}
112
+ isSelected={chat.label === selectedChat}
113
+ onClick={() => setSelectedChat(chat.label)}
114
+ endContent={<StatusDot variant={chat.status} label={chat.statusLabel} />}
115
+ />
116
+ ))}
112
117
  </SideNavItem>
113
118
  ))}
114
119
  </SideNavSection>
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Storefront Shell",
4
4
  description: "Mega-menu top nav with product grid",
5
+ keywords: ["shell", "top nav", "navigation", "app", "header", "layout"],
5
6
  category: "tooling",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // A[cp=6 @topNav=(TN > TNI"Shop" + TNI"Brands" + TNI"Sale" + TNI"Service")] > Ctr[axis=horizontal] > S[mw=1100 w=100% p=0] > V[g=10] > C.muted[p=0 w=100% h=360] + (V[g=4] > C.muted[p=0 w=200 h=24] + (G[c={min:160} g=4] > (V[g=2] > C.muted[p=0 w=100% h=120] + C.muted[p=0 w=60% h=14])*6))*3
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
+ // A.surface[cp=6 @topNav=(TN > (Hd{TopNavHeading}"Nocturne") + (TNI{TopNavMegaMenu}"Shop" > (TNI{TopNavMegaMenuItem}*4 + C{TopNavMegaMenuFeaturedCard}"The Midnight Edit") + TNI{TopNavMegaMenu}"Brands" > (TNI{TopNavMegaMenuItem}*4 + C{TopNavMegaMenuFeaturedCard}"Meet Studio Mara") + TNI"Sale" + TNI"Service") + (IB"Search products" + B.ghost"Sign in" + B.primary"Checkout"))] > Ctr[axis=horizontal] > S.transparent[mw=1100 w=100% p=0] > V[g=10] > C.muted[p=0 w=100% h=360] + (V[g=4] > C.muted[p=0 w=200 h=24] + (G[c={min:160} g=4] > (V[g=2] > C.muted[p=0 w=100% h=120] + C.muted[p=0 w=60% h=14])*4))*3
4
6
  // Note: skeleton placeholders carry no Hd by design (skill skeleton-shell
5
7
  // exemption) — routed pages supply the h1.
6
8
 
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Side Gallery",
4
4
  description: "Headline, CTA, and image collage side by side",
5
+ keywords: ["gallery", "sidebar", "collection", "grid", "art", "images"],
5
6
  category: "marketing",
6
7
  };
@@ -1,8 +1,10 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
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):
3
5
  // AR*9 is the live count: SCENE_TILE_ALTS has 9 entries and a bare .map renders
4
6
  // all 9, with no slice.
5
- // L > LC[p=6] > G[c={min:280} g8 a=center] > (V[g6] > (V[g3] > Tx"AFTER DARK"[t=supporting] + Hd"Make every night"[level=1] + Tx"The smallest rituals"[t=body]) + B.primary"Explore the night" + (V[g4] > D + (H[g6] > (V > Tx"12k+"[t=display-3] + Tx"Night shots"[t=supporting])*3))) + (G[c3 g3] > AR*9)
7
+ // L[h=fill mw=1400] > LC[p=6] > G[c={min:280} g=8 a=center] > (V[g=6 a=center] > (V[g=3] > Tx"AFTER DARK"[t=supporting] + Hd"Make every night"[level=1] + Tx"The smallest rituals"[t=body]) + B.primary"Explore the night" + (V[g=4] > D + (H[g=6] > (V[g=0] > Tx"12k+"[t=display-3] + Tx"Night shots"[t=supporting])*3))) + (G[c=3 g=3] > AR[ratio=1]*9)
6
8
 
7
9
  import { AspectRatio } from "@astryxdesign/core/AspectRatio";
8
10
  import { Button } from "@astryxdesign/core/Button";
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Grouped Table",
4
4
  description: "Collapsible status sections with detail panel",
5
+ keywords: ["table", "grouped", "rows", "sections", "data", "grouping"],
5
6
  category: "data",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > V[g=4] > (H[j=between a=center] > Hd"Night-shift issues"[level=1] + B.primary"Raise issue"[opens=#raise-issue]) + (H[g=2 a=center] > PS + Po > B.secondary"View options")) + (LC[p=0] > (Tx"Scroll the table sideways to see every column"[t=supporting] + D) + T[hover] > (TR > THC*7) + (TR > TC*7)*4) + (LP > V[g=4] > (H > Tx[t=supporting] + IB"Close panel") + (V[g=1] > Hd[level=2] + Tx[t=body]) + ML + (D + (V[g=2] > Tx"Labels"[t=label] + (H[g=2] > Tk*2)))) ;; Dlg#raise-issue > (DH"Raise issue" + (LC[p=4] > V[g=4] > TI*4) + (LF > H[j=end g=2] > B.secondary"Cancel" + B.primary"Raise issue"))
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
+ // L[h=fill] > (LH[divider p=6] > V[g=4] > (H[g=3 a=center wrap] > (SI[fill] > Hd"Night-shift issues"[level=1 t=display-2]) + B.primary"Raise issue"[opens=#raise-issue]) + (H[g=2 a=center] > (SI[fill] > PS"Filter issues…") + (Po > (B.secondary"View options" + (V[g=4] > RL"Group by" > RLI*5))))) + (LC[p=0] > T[hover density=balanced dv=rows] > (TR > THC*7) + ((TR > TC[colSpan=7] > (H[g=2 a=center] > Ic + Tx"In Progress"[t=body] + Bd.neutral"3")) + (TR > TC*7))*4)) + (LP[divider p=4] > V[g=4] > (H[g=2 a=center] > (SI[fill] > Tx[t=supporting]) + B.ghost"Close panel") + (V[g=1] > Hd[level=2] + Tx[t=body]) + (ML > MLI*6) + (D + (V[g=2] > Tx"Labels"[t=label] + (H[g=2] > Tk*2)))) ;; Dlg#raise-issue > L[h=auto] > (DH"Raise issue" + (LC[p=4] > V[g=4] > TI"Title" + SE{Selector}"Status" + SE{Selector}"Priority" + TI"Project") + (LF[divider] > H[g=2 j=end] > B.secondary"Cancel" + B.primary"Raise issue"))
4
6
 
5
7
  /**
6
8
  * Table Grouped — the night-shift issue tracker: a grouped, collapsible issue table with a PowerSearch bar and a resizable detail inspector. (Frame/responsive/container: see XLE header above.)
@@ -1049,7 +1051,7 @@ export default function TableGrouped() {
1049
1051
  content={
1050
1052
  <LayoutContent padding={4}>
1051
1053
  <VStack gap={4}>
1052
- <TextInput label="Title" placeholder="Issue title" value="" />
1054
+ <TextInput label="Title" placeholder="Issue title" value="" onChange={() => {}} />
1053
1055
  <Selector
1054
1056
  label="Status"
1055
1057
  value="todo"
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Orders with Chart",
4
4
  description: "Revenue area chart over filterable orders",
5
+ keywords: ["table", "chart", "revenue", "orders", "graph", "data", "metrics"],
5
6
  category: "data",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > H[a=center g=2] > (SI[size=fill] > Hd"Matcha Bar"[level=1]) + IB"Filter"[variant=ghost] + IB"Export"[variant=ghost] + B.primary"New order") + (LC[p=3] > V[g=4] > C[p=4] + (T[hover] > (TR > THC"Order" + THC"Product" + THC"Amount" + THC"Customer" + THC"Email" + THC"Status" + THC"Date") + (TR > TC"ORD-1001" + TC"Ceremonial Matcha Latte" + TC"$6" + TC"Sarah Chen" + TC"sarah.chen@acme.co" + (TC > Tk.green"Completed") + TC"2025-01-15")*6))
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
+ // L[h=fill] > (LH[divider p=6] > H[a=center g=2] > (SI[size=fill] > Hd"Matcha Bar"[level=1 t=display-2]) + IB"Filter"[variant=ghost] + IB"Export"[variant=ghost] + B.primary"New order") + (LC[p=3] > V[g=4] > (V[g=3] > RC + Tx"Daily revenue · Jan 1–15"[t=supporting] + (H[g=2 a=center] > Ic + Tx"Revenue"[t=supporting])) + (T[hover density=balanced dv=rows] > (TR > THC"Order" + THC"Product" + THC"Amount" + THC"Customer" + THC"Email" + THC"Status" + THC"Date") + (TR > TC"ORD-1001" + TC"Ceremonial Matcha Latte" + TC"$6" + TC"Sarah Chen" + TC"sarah.chen@acme.co" + (TC > Tk.green"Completed") + TC"2025-01-15")*30))
4
6
 
5
7
  /**
6
8
  * Matcha Bar — order desk: a daily revenue line over the full order log. Frame: page header (title + icon actions) | content column (chart, t (Frame/responsive/container: see XLE header above.)
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Incident Heatmap",
4
4
  description: "Outage heatmap with status table",
5
+ keywords: ["table", "heatmap", "status", "map", "region", "data"],
5
6
  category: "data",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > H[g2 a=center] > Hd"Status"[level=1] + IB"Filter"[variant=ghost] + IB"Export"[variant=ghost] + B.secondary"Refresh") + (LC[p3] > V[g4] > (V[g3] > C[p4] + Tx"Incidents by day and hour"[t=supporting] + (H[g4] > (H[g2] > Tx[t=supporting])*4)) + (T[hover] > (TR > THC"Incident" + THC"Product" + THC"Description" + THC"Started" + THC"Duration" + THC"On-call" + THC"Status" + THC"Date") + (TR > TC"INC-4008" + TC"Business Suite" + TC"Notification delivery delays" + TC"09:15" + TC"ongoing" + TC"Carlos Mendez" + (TC > Tk.red"Ongoing") + TC"2025-01-15")*5))
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
+ // L[h=fill] > (LH[divider p=6] > H[g=2 a=center] > (SI[size=fill] > Hd"Status"[level=1 t=display-2]) + IB"Filter"[variant=ghost] + IB"Export"[variant=ghost] + B.secondary"Refresh") + (LC[p=3] > V[g=4] > (V[g=3] > C[p=4] + (V[g=1] > (H[g=2 a=center] > (H[g=1 a=center] > Sw + Tx"0"[t=supporting])*4) + Tx"Incidents by day and hour · Jan 12–18"[t=supporting])) + (T[hover density=balanced dv=rows] > (TR > THC"Incident" + THC"Product" + THC"Description" + THC"Started" + THC"Duration" + THC"On-call" + THC"Status" + THC"Date") + (TR > TC"INC-4008" + TC"Business Suite" + TC"Notification delivery delays" + TC"09:15" + TC"ongoing" + TC"Carlos Mendez" + (TC > Tk.red"Ongoing") + TC"2025-01-15")*14))
4
6
 
5
7
  /**
6
8
  * Status — the incident heatmap for the week plus the log behind it.
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Shoe Store Sales",
4
4
  description: "Revenue chart over shoe order history",
5
+ keywords: ["table", "heatmap", "store", "retail", "region", "data"],
5
6
  category: "data",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > H[g2 a=center] > Hd"Midnight Kicks"[level=1] + IB"Filter"[variant=ghost] + IB"Export"[variant=ghost] + B.primary"New order") + (LC[p3] > V[g4] > (V[g3] > C[p=4] + Tx"Daily revenue"[t=supporting] + (H[g2 a=center] > Ic + Tx"Revenue"[t=supporting])) + (T[hover] > (TR > THC"Order" + THC"Product" + THC"Amount" + THC"Customer" + THC"Email" + THC"Status" + THC"Date") + (TR > TC"ORD-1001" + TC"Air Max 90" + TC"$130" + TC"Sarah Chen" + TC"sarah.chen@acme.co" + (TC > Tk.green"Completed") + TC"2025-01-12")*5))
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
+ // L[h=fill] > (LH[divider p=6] > H[g=2 a=center] > (SI[size=fill] > Hd"Midnight Kicks"[level=1 t=display-2]) + IB"Filter"[variant=ghost] + IB"Export"[variant=ghost] + B.primary"New order") + (LC[p=3] > V[g=4] > (V[g=3] > RC + Tx"Daily revenue · Jan 1–15"[t=supporting] + (H[g=2 a=center] > Ic + Tx"Revenue"[t=supporting])) + (T[hover density=balanced dv=rows] > (TR > THC"Order" + THC"Product" + THC"Amount" + THC"Customer" + THC"Email" + THC"Status" + THC"Date") + (TR > TC"ORD-1001" + TC"Air Max 90" + TC"$130" + TC"Sarah Chen" + TC"sarah.chen@acme.co" + (TC > Tk.green"Completed") + TC"2025-01-12")*59))
4
6
 
5
7
  /**
6
8
  * Midnight Kicks — sneaker order desk: a daily revenue line over the order log. Frame: page header (title + icon actions) | content column (c (Frame/responsive/container: see XLE header above.)
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Searchable Table",
4
4
  description: "Filterable data table with toolbar actions",
5
+ keywords: ["table", "data", "rows", "listing", "records", "grid"],
5
6
  category: "data",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > H[g=2 a=center] > (SI[fill] > Hd"Familiars"[level=1]) + IB"Filter"[variant=ghost] + IB"Download"[variant=ghost] + B.primary"Add") + (LC[p=3] > V[g=4] > PS + (T[hover] > (TR > THC*3) + (TR > TC*3)*3))
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
+ // L[h=fill] > (LH[divider p=6] > H[g=2 a=center] > (SI[fill] > Hd"Familiars"[level=1 t=display-2]) + IB"Filter"[variant=ghost] + IB"Download"[variant=ghost] + B.primary"Add") + (LC[p=3] > V[g=4] > PS"Search familiars…" + (T[hover density=balanced dv=rows] > (TR > THC"Name" + THC"Biography" + THC"Age") + (TR > TC*3)*38))
4
6
 
5
7
  /**
6
8
  * Familiars — the full roster of the crypt's companions, with a PowerSearch field filter bar above one dense table. (Frame/responsive/container: see XLE header above.)
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Simple Table",
4
4
  description: "Static rows with status badges and actions",
5
+ keywords: ["table", "data", "rows", "listing", "records", "grid"],
5
6
  category: "data",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // L > (LH[divider] > H[a=center j=between] > Hd"Artifacts"[level=1] + B.primary"Add artifact") + (LC > T[hover] > (TR > THC"Name" + THC"Status" + THC"Updated" + THC"Actions") + (TR > TC"Blood Vial" + (TC > SD.success + Tx"Active") + TC"2025-01-15" + (TC > B.secondary"Edit"))*3)
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
+ // L[h=auto] > (LH[divider] > H[a=center j=between] > Hd"Artifacts"[level=1] + B.primary"Add artifact") + (LC > T[hover w=auto] > (TR > THC"Name" + THC"Status" + THC"Updated" + THC"Actions") + (TR > TC"Blood Vial" + (TC > H[g=1 a=center] > SD.success + Tx"Active") + TC"2025-01-15" + (TC > B.secondary"Edit"))*3)
4
6
 
5
7
  import { Button } from "@astryxdesign/core/Button";
6
8
  import { HStack, Layout, LayoutContent, LayoutHeader } from "@astryxdesign/core/Layout";
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Technical Report",
4
4
  description: "Chapter rail, paper walkthrough, and outline",
5
+ keywords: ["technical report", "whitepaper", "research", "spec", "findings", "paper"],
5
6
  category: "docs",
6
7
  };
@@ -1,6 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
- // XLE (canonical structure, validated with `bunx astryx layout check`):
3
- // A[cp=0 @sideNav=(SN > (SNS"Overview" > (SNI"Abstract"! + SNI"Model at a glance")) + (SNS"Architecture" > (SNI"Causal Encoder-Decoder" + SNI"Compressed Sparse Attention 2" + SNI"Single-Pass mHC" + SNI"Engram, DSpark, FP4")) + (SNS"Infrastructure" > (SNI"Training infrastructure" + SNI"Inference system" + SNI"SWA Bounded Replay")) + (SNS"Training and evaluation" > (SNI"Pre-training" + SNI"Post-training" + SNI"Conclusion")))] > L[h=auto] > (LC[p=8 !scroll] > V[g=8] > (V[g=2] > (H[g=2 a=center] > MNT + Tx[t=supporting]) + Hd"Abstract"[level=1 t=display-2] + Tx"Chapter 1 of 12"[t=supporting]) + Tx"Intro"[t=large] + AR + (V[g=8] > (V[g=3] > Hd"The bottleneck"[level=2] + Tx"Body"[t=body] + UL + Cd)*3) + D + (H[j=between] > B.secondary"Previous" + B.secondary"Next") + (Tx[t=supporting] > Lk"Checkpoints")) + (LP[!scroll] > Outline)
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
+ // A[cp=0 h=auto @sideNav=(SN > (SNS"Overview" > (SNI"Abstract"! + SNI"Model at a glance")) + (SNS"Architecture" > (SNI"Causal Encoder-Decoder" + SNI"Compressed Sparse Attention 2" + SNI"Single-Pass mHC" + SNI"Engram, DSpark, FP4")) + (SNS"Infrastructure" > (SNI"Training infrastructure" + SNI"Inference system" + SNI"SWA Bounded Replay")) + (SNS"Training and evaluation" > (SNI"Pre-training" + SNI"Post-training" + SNI"Conclusion")))] > L[h=auto mw=960] > (LC[p=8 !scroll] > V[g=8] > (V[g=2] > (H[g=2 a=center] > MNT + Tx"DeepSeek-V4.1-Flash technical report"[t=supporting]) + Hd"Abstract"[level=1 t=display-2] + Tx"Chapter 1 of 12"[t=supporting]) + Tx"Intro"[t=large] + AR[ratio=16/9] + (V[g=8] > (V[g=3] > Hd"The bottleneck"[level=2] + Tx"Body"[t=body] + UL + Cd)*3) + D + (H[g=3 j=between a=center] > SI[fill] + B.secondary"Model at a glance") + (Tx"Checkpoints and the full report…"[t=supporting] > Lk"huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash")) + (LP[!scroll] > Outline)
4
6
 
5
7
  import { Icon } from "@astryxdesign/core/Icon";
6
8
  import { Link } from "@astryxdesign/core/Link";
@@ -892,9 +894,9 @@ function IndexerScene({ alt }: { alt: string }) {
892
894
  width="276"
893
895
  height="13"
894
896
  rx="2"
895
- fill="var(--color-data-categorical-cyan)"
897
+ fill={"var(--color-data-categorical-cyan, #8BE9FD)"}
896
898
  fillOpacity={0.12}
897
- stroke="var(--color-data-categorical-cyan)"
899
+ stroke={"var(--color-data-categorical-cyan, #8BE9FD)"}
898
900
  strokeOpacity={0.45}
899
901
  />
900
902
  ) : null,
@@ -911,7 +913,7 @@ function IndexerScene({ alt }: { alt: string }) {
911
913
  rx="1"
912
914
  fill={
913
915
  row.picks.includes(cell)
914
- ? "var(--color-data-categorical-green)"
916
+ ? "var(--color-data-categorical-green, #50FA7B)"
915
917
  : "var(--dracula-comment)"
916
918
  }
917
919
  />
@@ -935,7 +937,7 @@ function IndexerScene({ alt }: { alt: string }) {
935
937
  width="8"
936
938
  height="8"
937
939
  rx="1"
938
- fill="var(--color-data-categorical-cyan)"
940
+ fill={"var(--color-data-categorical-cyan, #8BE9FD)"}
939
941
  />
940
942
  <text x="54" y="204">
941
943
  block kept by its top score
@@ -946,7 +948,7 @@ function IndexerScene({ alt }: { alt: string }) {
946
948
  width="8"
947
949
  height="8"
948
950
  rx="1"
949
- fill="var(--color-data-categorical-green)"
951
+ fill={"var(--color-data-categorical-green, #50FA7B)"}
950
952
  />
951
953
  <text x="244" y="204">
952
954
  position in Top-512
@@ -1465,7 +1467,7 @@ export default function TechReport() {
1465
1467
  railHref={SELF_HASH}
1466
1468
  railIcon={<Icon icon={ScrollText} size="sm" />}
1467
1469
  eyebrow="DeepSeek-V4.1-Flash technical report"
1468
- badge={(chapter, index, total) =>
1470
+ badge={(_chapter, index, total) =>
1469
1471
  `Chapter ${index + 1} of ${total} · DeepSeek-AI · research@deepseek.com`
1470
1472
  }
1471
1473
  art={(chapterId) => <ChapterArt chapterId={chapterId} />}
@@ -2,5 +2,6 @@ export default {
2
2
  type: "page",
3
3
  name: "Theme Showcase",
4
4
  description: "Store, checkout, chat, and inventory preview surfaces",
5
+ keywords: ["theme", "tokens", "palette", "typography", "styling", "design system preview"],
5
6
  category: "showcase",
6
7
  };