astryx-dracula 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/BRAND.md +30 -18
  2. package/README.md +22 -11
  3. package/USAGE.md +29 -10
  4. package/astryx-dracula.js +19 -13
  5. package/astryx-dracula.variants.d.ts +15 -0
  6. package/package.json +59 -17
  7. package/shared/auth-chrome-config.ts +18 -0
  8. package/shared/auth-chrome.tsx +25 -0
  9. package/shared/auth-copy.ts +22 -0
  10. package/shared/chaptered-doc-config.ts +92 -0
  11. package/shared/chaptered-doc.tsx +332 -0
  12. package/shared/chart-hues.ts +27 -0
  13. package/shared/chart-labels.tsx +44 -0
  14. package/shared/chart-legend.tsx +100 -0
  15. package/shared/chart-panel-style.ts +13 -0
  16. package/shared/data-bar.tsx +160 -0
  17. package/shared/gallery-image.ts +20 -0
  18. package/shared/login-demo.ts +7 -0
  19. package/shared/metric-delta.tsx +36 -0
  20. package/shared/order-desk.tsx +273 -0
  21. package/shared/revenue-chart.tsx +174 -0
  22. package/shared/scene-castle.tsx +322 -0
  23. package/shared/scene-frame.tsx +88 -0
  24. package/shared/scene-hues.ts +49 -0
  25. package/shared/scene-tile.tsx +128 -0
  26. package/shared/settings-data.ts +125 -0
  27. package/shared/settings-rows.tsx +179 -0
  28. package/shared/sparkline.tsx +94 -0
  29. package/shared/sso-icons.tsx +30 -0
  30. package/templates/ai-chat-landing.tsx +67 -32
  31. package/templates/ai-chat.tsx +41 -20
  32. package/templates/blank.tsx +5 -2
  33. package/templates/centered-hero.tsx +15 -124
  34. package/templates/classic-gallery.tsx +21 -65
  35. package/templates/contact-form.tsx +62 -40
  36. package/templates/dashboard-portfolio.tsx +146 -227
  37. package/templates/dashboard.tsx +123 -121
  38. package/templates/detail-page.tsx +101 -95
  39. package/templates/documentation-design.template.mjs +1 -1
  40. package/templates/documentation-design.tsx +85 -96
  41. package/templates/documentation-technical.template.mjs +1 -1
  42. package/templates/documentation-technical.tsx +33 -21
  43. package/templates/documentation.template.mjs +1 -1
  44. package/templates/documentation.tsx +54 -74
  45. package/templates/editor.tsx +119 -89
  46. package/templates/file-explorer.tsx +133 -84
  47. package/templates/form-two-column.tsx +62 -124
  48. package/templates/gallery-hero.tsx +17 -171
  49. package/templates/ide.tsx +27 -21
  50. package/templates/incident-console.tsx +105 -69
  51. package/templates/kanban-board.tsx +100 -41
  52. package/templates/library.template.mjs +2 -2
  53. package/templates/library.tsx +38 -41
  54. package/templates/login-card.tsx +59 -86
  55. package/templates/login-split.tsx +88 -128
  56. package/templates/login-sso.tsx +107 -68
  57. package/templates/login.tsx +108 -52
  58. package/templates/messaging-shell.tsx +172 -143
  59. package/templates/mixed-gallery.tsx +31 -130
  60. package/templates/payment-form.tsx +369 -289
  61. package/templates/product-detail.tsx +40 -57
  62. package/templates/product-gallery.tsx +31 -40
  63. package/templates/product-tour.template.mjs +6 -0
  64. package/templates/product-tour.tsx +916 -0
  65. package/templates/settings-dialog.tsx +145 -286
  66. package/templates/settings-sidebar.tsx +179 -267
  67. package/templates/settings.tsx +42 -13
  68. package/templates/shell-nav.tsx +32 -23
  69. package/templates/shell-side-nav.tsx +30 -19
  70. package/templates/shell-top-nav.tsx +81 -43
  71. package/templates/side-gallery.tsx +39 -93
  72. package/templates/table-grouped.tsx +63 -33
  73. package/templates/table-page-chart.tsx +24 -297
  74. package/templates/table-page-heatmap-status.tsx +157 -91
  75. package/templates/table-page-shoe-store-heatmap.tsx +19 -288
  76. package/templates/table-page.tsx +24 -6
  77. package/templates/table.tsx +24 -7
  78. package/templates/tech-report.template.mjs +6 -0
  79. package/templates/tech-report.tsx +1486 -0
  80. package/templates/theme-showcase.template.mjs +1 -1
  81. package/templates/theme-showcase.tsx +313 -249
  82. package/theme.css +76 -14
  83. package/tokens.css +425 -30
@@ -1,4 +1,6 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // XLE (canonical structure, validated with `bunx astryx layout check`):
3
+ // Ctr > V[a=center] > S.transparent[p=6] > V[g=6] > (V[g=2 a=center] > Hd"Let's brew after dark"[level=1] + Tx"Tell us a bit"[t=body]) + (V[g=4] > Hd"Why work with us"[level=2] + (G[c={min:200} g=4] > (C > V[g=3] > Ic + (V[g=1] > Hd"Title"[level=3] + Tx"Desc"[t=body]))*3)) + (V[g=4] > Hd"Your details"[level=2] + (G[c={min:260} g=4] > TI"Full name" + TI"Email") + (G[c={min:260} g=4] > TI"Company" + TI"Phone")) + D + (V[g=4] > Hd"Your project"[level=2] + (Fd"Goals"[req] > (H[g=2] > Tk"Goal"*10)) + SE"Timeline" + SE"Budget" + (RL"Source" > RLI*5) + TA"Notes" + CB"Decision maker") + (V[g=3] > B.primary"Send it into the night" + (H[j=center g=1] > Tx[t=supporting] > Lk"Privacy Policy"))
2
4
 
3
5
  import {useState} from 'react';
4
6
  import {VStack, HStack} from '@astryxdesign/core/Layout';
@@ -7,7 +9,7 @@ import {Section} from '@astryxdesign/core/Section';
7
9
  import {Grid} from '@astryxdesign/core/Grid';
8
10
  import {Card} from '@astryxdesign/core/Card';
9
11
  import {Button} from '@astryxdesign/core/Button';
10
- import {Text} from '@astryxdesign/core/Text';
12
+ import {Text, Heading} from '@astryxdesign/core/Text';
11
13
  import {Icon} from '@astryxdesign/core/Icon';
12
14
  import {TextInput} from '@astryxdesign/core/TextInput';
13
15
  import {Selector} from '@astryxdesign/core/Selector';
@@ -17,8 +19,8 @@ import {Token} from '@astryxdesign/core/Token';
17
19
  import {RadioList, RadioListItem} from '@astryxdesign/core/RadioList';
18
20
  import {TextArea} from '@astryxdesign/core/TextArea';
19
21
  import {Divider} from '@astryxdesign/core/Divider';
20
- import {Banner} from '@astryxdesign/core/Banner';
21
- import {Rocket, SlidersHorizontal, Hand} from 'lucide-react';
22
+ import {Field} from '@astryxdesign/core/Field';
23
+ import {Rocket, SlidersHorizontal, Hand, Check} from 'lucide-react';
22
24
 
23
25
  const CAMPAIGN_GOALS = [
24
26
  'Brand Awareness',
@@ -103,36 +105,30 @@ export default function ContactForm() {
103
105
  return (
104
106
  <Center axis="horizontal">
105
107
  <VStack hAlign="center" width="100%">
106
- <Section
107
- maxWidth={800}
108
- width="100%"
109
- padding={6}
110
- paddingBlock={10}
111
- variant="section">
108
+ <Section maxWidth={800} width="100%" padding={6} variant="transparent">
112
109
  <VStack gap={6}>
113
110
  {/* Header */}
114
111
  <VStack gap={2} hAlign="center" style={{textAlign: 'center'}}>
115
- <Text type="display-1" weight="bold">
112
+ <Heading level={1} type="display-2">
116
113
  Let&apos;s brew after dark
117
- </Text>
114
+ </Heading>
118
115
  <Text type="body" color="secondary">
119
- Tell us a bit about what you&apos;re summoning — the coven
116
+ Tell us a bit about what you&apos;re summoning, and the coven
120
117
  would love to help it take flight.
121
118
  </Text>
122
119
  </VStack>
123
120
 
124
121
  {/* Why work with us */}
125
- <VStack gap={5}>
122
+ <VStack gap={4}>
123
+ <Heading level={2}>Why work with us</Heading>
126
124
  <Grid columns={{minWidth: 200}} gap={4}>
127
125
  {WHY_US.map(item => (
128
126
  <Card key={item.title}>
129
127
  <VStack gap={3}>
130
- <Icon icon={item.icon} size="lg" color="accent" />
128
+ <Icon icon={item.icon} size="lg" color="secondary" />
131
129
  <VStack gap={1}>
132
- <Text type="body" weight="bold">
133
- {item.title}
134
- </Text>
135
- <Text type="supporting" color="secondary">
130
+ <Heading level={3}>{item.title}</Heading>
131
+ <Text type="body" color="secondary">
136
132
  {item.description}
137
133
  </Text>
138
134
  </VStack>
@@ -143,11 +139,13 @@ export default function ContactForm() {
143
139
  </VStack>
144
140
 
145
141
  {/* Your details */}
146
- <VStack gap={5}>
142
+ <VStack gap={4}>
143
+ <Heading level={2}>Your details</Heading>
147
144
  <Grid columns={{minWidth: 260}} gap={4}>
148
145
  <TextInput
149
- label="Full Name"
150
- placeholder="Full Name"
146
+ label="Full name"
147
+ isRequired
148
+ placeholder="Full name"
151
149
  value={fullName}
152
150
  onChange={setFullName}
153
151
  status={
@@ -158,6 +156,7 @@ export default function ContactForm() {
158
156
  />
159
157
  <TextInput
160
158
  label="Email"
159
+ isRequired
161
160
  placeholder="you@company.com"
162
161
  value={email}
163
162
  onChange={setEmail}
@@ -171,6 +170,7 @@ export default function ContactForm() {
171
170
  <Grid columns={{minWidth: 260}} gap={4}>
172
171
  <TextInput
173
172
  label="Company"
173
+ isRequired
174
174
  placeholder="Company"
175
175
  value={company}
176
176
  onChange={setCompany}
@@ -182,6 +182,7 @@ export default function ContactForm() {
182
182
  />
183
183
  <TextInput
184
184
  label="Phone"
185
+ isRequired
185
186
  placeholder="Phone number"
186
187
  value={phone}
187
188
  onChange={setPhone}
@@ -197,26 +198,47 @@ export default function ContactForm() {
197
198
  <Divider />
198
199
 
199
200
  {/* Your project */}
200
- <VStack gap={5}>
201
- <VStack gap={2}>
202
- <Text type="label" color="secondary">
203
- What are you going for?
204
- </Text>
205
- <HStack gap={2} wrap="wrap">
206
- {CAMPAIGN_GOALS.map(goal => (
207
- <Token
208
- key={goal}
209
- label={goal}
210
- color={goals.includes(goal) ? 'yellow' : 'default'}
211
- onClick={() => toggleGoal(goal)}
212
- />
213
- ))}
201
+ <VStack gap={4}>
202
+ <Heading level={2}>Your project</Heading>
203
+ <Field
204
+ label="What are you going for?"
205
+ inputID="campaign-goals"
206
+ labelID="campaign-goals-label"
207
+ isGroupLabel
208
+ isRequired
209
+ status={
210
+ errors.goals
211
+ ? {type: 'error', message: errors.goals}
212
+ : undefined
213
+ }>
214
+ <HStack
215
+ gap={2}
216
+ wrap="wrap"
217
+ role="group"
218
+ aria-labelledby="campaign-goals-label">
219
+ {CAMPAIGN_GOALS.map(goal => {
220
+ const isSelected = goals.includes(goal);
221
+ return (
222
+ <Token
223
+ key={goal}
224
+ label={goal}
225
+ color={isSelected ? 'yellow' : 'default'}
226
+ icon={
227
+ isSelected ? (
228
+ <Icon icon={Check} size="xsm" color="inherit" />
229
+ ) : undefined
230
+ }
231
+ description={isSelected ? 'Selected' : undefined}
232
+ onClick={() => toggleGoal(goal)}
233
+ />
234
+ );
235
+ })}
214
236
  </HStack>
215
- {errors.goals && <Banner status="error" title={errors.goals} />}
216
- </VStack>
237
+ </Field>
217
238
 
218
239
  <Selector
219
240
  label="When are you thinking?"
241
+ isRequired
220
242
  placeholder="When are you thinking of launching?"
221
243
  options={LAUNCH_OPTIONS}
222
244
  value={timeline}
@@ -230,6 +252,7 @@ export default function ContactForm() {
230
252
 
231
253
  <Selector
232
254
  label="Ballpark budget?"
255
+ isRequired
233
256
  placeholder="What's your rough monthly budget?"
234
257
  options={BUDGET_OPTIONS}
235
258
  value={budget}
@@ -254,7 +277,7 @@ export default function ContactForm() {
254
277
 
255
278
  <TextArea
256
279
  label="Anything else?"
257
- placeholder="Tell us whatever else is on your mind..."
280
+ placeholder="Tell us whatever else is on your mind…"
258
281
  value={message}
259
282
  onChange={setMessage}
260
283
  />
@@ -269,9 +292,8 @@ export default function ContactForm() {
269
292
  {/* Submit */}
270
293
  <VStack gap={3}>
271
294
  <Button
272
- label="Submit"
295
+ label="Send it into the night"
273
296
  variant="primary"
274
- size="lg"
275
297
  onClick={() => setSubmitted(true)}
276
298
  />
277
299
  <HStack gap={1} hAlign="center">