astryx-dracula 0.5.0 → 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.
- package/BRAND.md +3 -3
- package/README.md +7 -4
- package/USAGE.md +49 -49
- package/astryx-dracula.d.ts +2 -2
- package/astryx-dracula.js +25 -9
- package/astryx-dracula.variants.d.ts +2 -2
- package/astryx.integration.mjs +1 -1
- package/icons.mjs +21 -17
- package/icons.tsx +69 -62
- package/package.json +125 -120
- package/shared/auth-chrome-config.ts +6 -6
- package/shared/auth-chrome.tsx +143 -144
- package/shared/auth-copy.ts +14 -14
- package/shared/chaptered-doc-config.ts +48 -51
- package/shared/chaptered-doc.tsx +267 -289
- package/shared/chart-hues.ts +25 -10
- package/shared/chart-labels.tsx +31 -30
- package/shared/chart-legend.tsx +55 -56
- package/shared/chart-panel-style.ts +3 -3
- package/shared/data-bar.tsx +97 -102
- package/shared/format-money.ts +1 -1
- package/shared/gallery-image.ts +6 -6
- package/shared/login-demo.ts +1 -1
- package/shared/metric-card.tsx +101 -105
- package/shared/metric-delta.tsx +28 -27
- package/shared/order-desk.tsx +205 -216
- package/shared/revenue-chart.tsx +145 -165
- package/shared/scene-castle.tsx +206 -291
- package/shared/scene-frame.tsx +33 -32
- package/shared/scene-hues.ts +17 -17
- package/shared/scene-tile.tsx +88 -92
- package/shared/settings-data.ts +119 -125
- package/shared/settings-rows.tsx +122 -159
- package/shared/sparkline.tsx +75 -88
- package/shared/sso-icons.tsx +10 -22
- package/shared/stars.tsx +16 -25
- package/templates/ai-chat-landing.template.mjs +5 -4
- package/templates/ai-chat-landing.tsx +473 -460
- package/templates/ai-chat.template.mjs +5 -4
- package/templates/ai-chat.tsx +543 -612
- package/templates/blank.template.mjs +5 -4
- package/templates/blank.tsx +18 -14
- package/templates/centered-hero.template.mjs +5 -4
- package/templates/centered-hero.tsx +55 -68
- package/templates/classic-gallery.template.mjs +5 -4
- package/templates/classic-gallery.tsx +97 -104
- package/templates/contact-form.template.mjs +5 -4
- package/templates/contact-form.tsx +247 -282
- package/templates/dashboard-portfolio.template.mjs +5 -4
- package/templates/dashboard-portfolio.tsx +717 -548
- package/templates/dashboard.template.mjs +5 -4
- package/templates/dashboard.tsx +596 -567
- package/templates/detail-page.template.mjs +5 -4
- package/templates/detail-page.tsx +546 -603
- package/templates/documentation-design.template.mjs +5 -4
- package/templates/documentation-design.tsx +231 -243
- package/templates/documentation-technical.template.mjs +5 -4
- package/templates/documentation-technical.tsx +236 -239
- package/templates/documentation.template.mjs +5 -4
- package/templates/documentation.tsx +267 -279
- package/templates/editor.template.mjs +5 -4
- package/templates/editor.tsx +844 -877
- package/templates/file-explorer.template.mjs +5 -4
- package/templates/file-explorer.tsx +566 -590
- package/templates/form-two-column.template.mjs +5 -4
- package/templates/form-two-column.tsx +195 -210
- package/templates/gallery-hero.template.mjs +5 -4
- package/templates/gallery-hero.tsx +93 -114
- package/templates/ide.template.mjs +5 -4
- package/templates/ide.tsx +407 -453
- package/templates/incident-console.template.mjs +5 -4
- package/templates/incident-console.tsx +593 -575
- package/templates/kanban-board.template.mjs +5 -4
- package/templates/kanban-board.tsx +665 -683
- package/templates/library.template.mjs +5 -4
- package/templates/library.tsx +409 -430
- package/templates/login-card.template.mjs +5 -4
- package/templates/login-card.tsx +63 -72
- package/templates/login-split.template.mjs +5 -4
- package/templates/login-split.tsx +192 -193
- package/templates/login-sso.template.mjs +5 -4
- package/templates/login-sso.tsx +257 -258
- package/templates/login.template.mjs +5 -4
- package/templates/login.tsx +53 -49
- package/templates/messaging-shell.template.mjs +5 -4
- package/templates/messaging-shell.tsx +556 -574
- package/templates/mixed-gallery.template.mjs +5 -4
- package/templates/mixed-gallery.tsx +60 -58
- package/templates/payment-form.template.mjs +5 -4
- package/templates/payment-form.tsx +882 -991
- package/templates/product-detail.template.mjs +5 -4
- package/templates/product-detail.tsx +261 -272
- package/templates/product-gallery.template.mjs +5 -4
- package/templates/product-gallery.tsx +126 -137
- package/templates/product-tour.template.mjs +5 -4
- package/templates/product-tour.tsx +741 -773
- package/templates/settings-dialog.template.mjs +5 -4
- package/templates/settings-dialog.tsx +688 -717
- package/templates/settings-sidebar.template.mjs +5 -4
- package/templates/settings-sidebar.tsx +762 -807
- package/templates/settings.template.mjs +5 -4
- package/templates/settings.tsx +289 -304
- package/templates/shell-nav.template.mjs +5 -4
- package/templates/shell-nav.tsx +212 -219
- package/templates/shell-side-nav.template.mjs +5 -4
- package/templates/shell-side-nav.tsx +135 -157
- package/templates/shell-top-nav.template.mjs +5 -4
- package/templates/shell-top-nav.tsx +182 -203
- package/templates/side-gallery.template.mjs +5 -4
- package/templates/side-gallery.tsx +85 -90
- package/templates/table-grouped.template.mjs +5 -4
- package/templates/table-grouped.tsx +1000 -1053
- package/templates/table-page-chart.template.mjs +5 -4
- package/templates/table-page-chart.tsx +400 -398
- package/templates/table-page-heatmap-status.template.mjs +5 -4
- package/templates/table-page-heatmap-status.tsx +483 -512
- package/templates/table-page-shoe-store-heatmap.template.mjs +5 -4
- package/templates/table-page-shoe-store-heatmap.tsx +748 -746
- package/templates/table-page.template.mjs +5 -4
- package/templates/table-page.tsx +396 -405
- package/templates/table.template.mjs +5 -4
- package/templates/table.tsx +92 -93
- package/templates/tech-report.template.mjs +5 -4
- package/templates/tech-report.tsx +1316 -1304
- package/templates/theme-showcase.template.mjs +5 -4
- package/templates/theme-showcase.tsx +871 -951
- package/theme.css +35 -77
- package/theme.css.d.ts +9 -0
- package/tokens.css +373 -380
|
@@ -1,315 +1,280 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
// XLE (canonical structure
|
|
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
|
+
// Ctr > V[a=center] > S.transparent[p=6] > V[g=6] > (V[g=2 a=center] > Hd"Let's brew after dark"[level=1 t=display-2] + 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"[req] + TI"Email"[req]) + (G[c={min:260} g=4] > TI"Company"[req] + TI"Phone"[req])) + D + (V[g=4] > Hd"Your project"[level=2] + (Fd"What are you going for?"[req] > (H[g=2] > Tk"Goal"*10)) + SE{Selector}"When are you thinking?" + SE{Selector}"Ballpark budget?" + (RL"How did you hear about us?" > RLI*5) + TA"Anything else?" + CB"I'm a budget decision-maker") + (V[g=3] > B.primary"Send it into the night" + (Tx[t=supporting] > Lk"Privacy Policy"))
|
|
4
6
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {Center} from
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
7
|
+
import { Button } from "@astryxdesign/core/Button";
|
|
8
|
+
import { Card } from "@astryxdesign/core/Card";
|
|
9
|
+
import { Center } from "@astryxdesign/core/Center";
|
|
10
|
+
import { CheckboxInput } from "@astryxdesign/core/CheckboxInput";
|
|
11
|
+
import { Divider } from "@astryxdesign/core/Divider";
|
|
12
|
+
import { Field } from "@astryxdesign/core/Field";
|
|
13
|
+
import { Grid } from "@astryxdesign/core/Grid";
|
|
14
|
+
import { Icon } from "@astryxdesign/core/Icon";
|
|
15
|
+
import { HStack, VStack } from "@astryxdesign/core/Layout";
|
|
16
|
+
import { Link } from "@astryxdesign/core/Link";
|
|
17
|
+
import { RadioList, RadioListItem } from "@astryxdesign/core/RadioList";
|
|
18
|
+
import { Section } from "@astryxdesign/core/Section";
|
|
19
|
+
import { Selector } from "@astryxdesign/core/Selector";
|
|
20
|
+
import { Heading, Text } from "@astryxdesign/core/Text";
|
|
21
|
+
import { TextArea } from "@astryxdesign/core/TextArea";
|
|
22
|
+
import { TextInput } from "@astryxdesign/core/TextInput";
|
|
23
|
+
import { Token } from "@astryxdesign/core/Token";
|
|
24
|
+
import { Check, Hand, Rocket, SlidersHorizontal } from "lucide-react";
|
|
25
|
+
import { useState } from "react";
|
|
24
26
|
|
|
25
27
|
const CAMPAIGN_GOALS = [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
"Brand Awareness",
|
|
29
|
+
"Product Sampling",
|
|
30
|
+
"Product Launch",
|
|
31
|
+
"Event Promotion",
|
|
32
|
+
"Retail / In-Store",
|
|
33
|
+
"Trade Show",
|
|
34
|
+
"Influencer Activation",
|
|
35
|
+
"Community Building",
|
|
36
|
+
"Seasonal Campaign",
|
|
37
|
+
"Other",
|
|
36
38
|
];
|
|
37
39
|
|
|
38
40
|
const LAUNCH_OPTIONS = [
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
"Within 30 days",
|
|
42
|
+
"1\u20133 months",
|
|
43
|
+
"3\u20136 months",
|
|
44
|
+
"6\u201312 months",
|
|
45
|
+
"12+ months",
|
|
44
46
|
];
|
|
45
47
|
|
|
46
48
|
const BUDGET_OPTIONS = [
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
"Under $5K/mo",
|
|
50
|
+
"$5K\u2013$15K/mo",
|
|
51
|
+
"$15K\u2013$50K/mo",
|
|
52
|
+
"$50K\u2013$100K/mo",
|
|
53
|
+
"$100K+/mo",
|
|
52
54
|
];
|
|
53
55
|
|
|
54
56
|
const WHY_US = [
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
{
|
|
58
|
+
icon: Rocket,
|
|
59
|
+
title: "We ship before sunrise",
|
|
60
|
+
description: "We cut through the fog and land the work before dawn.",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
icon: SlidersHorizontal,
|
|
64
|
+
title: "We tune around you",
|
|
65
|
+
description: "Every dial set to what you're trying to summon.",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
icon: Hand,
|
|
69
|
+
title: "We answer after dark",
|
|
70
|
+
description: "A dedicated coven that knows your brand and haunts your roadmap.",
|
|
71
|
+
},
|
|
70
72
|
];
|
|
71
73
|
|
|
72
74
|
/**
|
|
73
75
|
* Contact Form — lead capture form template
|
|
74
76
|
*/
|
|
75
77
|
export default function ContactForm() {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
const [fullName, setFullName] = useState("");
|
|
79
|
+
const [email, setEmail] = useState("");
|
|
80
|
+
const [company, setCompany] = useState("");
|
|
81
|
+
const [phone, setPhone] = useState("");
|
|
82
|
+
const [goals, setGoals] = useState<string[]>([]);
|
|
83
|
+
const [timeline, setTimeline] = useState("");
|
|
84
|
+
const [budget, setBudget] = useState("");
|
|
85
|
+
const [message, setMessage] = useState("");
|
|
86
|
+
const [hearAboutUs, setHearAboutUs] = useState("");
|
|
87
|
+
const [isDecider, setIsDecider] = useState(false);
|
|
88
|
+
const [submitted, setSubmitted] = useState(false);
|
|
87
89
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
90
|
+
const errors = submitted
|
|
91
|
+
? {
|
|
92
|
+
fullName: !fullName.trim() ? "Required" : undefined,
|
|
93
|
+
email: !email.trim() ? "Required" : undefined,
|
|
94
|
+
company: !company.trim() ? "Required" : undefined,
|
|
95
|
+
phone: !phone.trim() ? "Required" : undefined,
|
|
96
|
+
goals: goals.length === 0 ? "Pick at least one" : undefined,
|
|
97
|
+
timeline: !timeline ? "Required" : undefined,
|
|
98
|
+
budget: !budget ? "Required" : undefined,
|
|
99
|
+
}
|
|
100
|
+
: {};
|
|
99
101
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
prev.includes(goal) ? prev.filter(g => g !== goal) : [...prev, goal],
|
|
103
|
-
);
|
|
102
|
+
const toggleGoal = (goal: string) =>
|
|
103
|
+
setGoals((prev) => (prev.includes(goal) ? prev.filter((g) => g !== goal) : [...prev, goal]));
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
105
|
+
return (
|
|
106
|
+
<Center axis="horizontal">
|
|
107
|
+
<VStack hAlign="center" width="100%">
|
|
108
|
+
<Section maxWidth={800} width="100%" padding={6} variant="transparent">
|
|
109
|
+
<VStack gap={6}>
|
|
110
|
+
{/* Header */}
|
|
111
|
+
<VStack gap={2} hAlign="center" style={{ textAlign: "center" }}>
|
|
112
|
+
<Heading level={1} type="display-2">
|
|
113
|
+
Let's brew after dark
|
|
114
|
+
</Heading>
|
|
115
|
+
<Text type="body" color="secondary">
|
|
116
|
+
Tell us a bit about what you're summoning, and the coven would love to help it
|
|
117
|
+
take flight.
|
|
118
|
+
</Text>
|
|
119
|
+
</VStack>
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
121
|
+
{/* Why work with us */}
|
|
122
|
+
<VStack gap={4}>
|
|
123
|
+
<Heading level={2}>Why work with us</Heading>
|
|
124
|
+
<Grid columns={{ minWidth: 200 }} gap={4}>
|
|
125
|
+
{WHY_US.map((item) => (
|
|
126
|
+
<Card key={item.title}>
|
|
127
|
+
<VStack gap={3}>
|
|
128
|
+
<Icon icon={item.icon} size="lg" color="secondary" />
|
|
129
|
+
<VStack gap={1}>
|
|
130
|
+
<Heading level={3}>{item.title}</Heading>
|
|
131
|
+
<Text type="body" color="secondary">
|
|
132
|
+
{item.description}
|
|
133
|
+
</Text>
|
|
134
|
+
</VStack>
|
|
135
|
+
</VStack>
|
|
136
|
+
</Card>
|
|
137
|
+
))}
|
|
138
|
+
</Grid>
|
|
139
|
+
</VStack>
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
/>
|
|
183
|
-
<TextInput
|
|
184
|
-
label="Phone"
|
|
185
|
-
isRequired
|
|
186
|
-
placeholder="Phone number"
|
|
187
|
-
value={phone}
|
|
188
|
-
onChange={setPhone}
|
|
189
|
-
status={
|
|
190
|
-
errors.phone
|
|
191
|
-
? {type: 'error', message: errors.phone}
|
|
192
|
-
: undefined
|
|
193
|
-
}
|
|
194
|
-
/>
|
|
195
|
-
</Grid>
|
|
196
|
-
</VStack>
|
|
141
|
+
{/* Your details */}
|
|
142
|
+
<VStack gap={4}>
|
|
143
|
+
<Heading level={2}>Your details</Heading>
|
|
144
|
+
<Grid columns={{ minWidth: 260 }} gap={4}>
|
|
145
|
+
<TextInput
|
|
146
|
+
label="Full name"
|
|
147
|
+
isRequired
|
|
148
|
+
placeholder="Full name"
|
|
149
|
+
value={fullName}
|
|
150
|
+
onChange={setFullName}
|
|
151
|
+
status={errors.fullName ? { type: "error", message: errors.fullName } : undefined}
|
|
152
|
+
/>
|
|
153
|
+
<TextInput
|
|
154
|
+
label="Email"
|
|
155
|
+
isRequired
|
|
156
|
+
placeholder="you@company.com"
|
|
157
|
+
value={email}
|
|
158
|
+
onChange={setEmail}
|
|
159
|
+
status={errors.email ? { type: "error", message: errors.email } : undefined}
|
|
160
|
+
/>
|
|
161
|
+
</Grid>
|
|
162
|
+
<Grid columns={{ minWidth: 260 }} gap={4}>
|
|
163
|
+
<TextInput
|
|
164
|
+
label="Company"
|
|
165
|
+
isRequired
|
|
166
|
+
placeholder="Company"
|
|
167
|
+
value={company}
|
|
168
|
+
onChange={setCompany}
|
|
169
|
+
status={errors.company ? { type: "error", message: errors.company } : undefined}
|
|
170
|
+
/>
|
|
171
|
+
<TextInput
|
|
172
|
+
label="Phone"
|
|
173
|
+
isRequired
|
|
174
|
+
placeholder="Phone number"
|
|
175
|
+
value={phone}
|
|
176
|
+
onChange={setPhone}
|
|
177
|
+
status={errors.phone ? { type: "error", message: errors.phone } : undefined}
|
|
178
|
+
/>
|
|
179
|
+
</Grid>
|
|
180
|
+
</VStack>
|
|
197
181
|
|
|
198
|
-
|
|
182
|
+
<Divider />
|
|
199
183
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
) : undefined
|
|
230
|
-
}
|
|
231
|
-
description={isSelected ? 'Selected' : undefined}
|
|
232
|
-
onClick={() => toggleGoal(goal)}
|
|
233
|
-
/>
|
|
234
|
-
);
|
|
235
|
-
})}
|
|
236
|
-
</HStack>
|
|
237
|
-
</Field>
|
|
184
|
+
{/* Your project */}
|
|
185
|
+
<VStack gap={4}>
|
|
186
|
+
<Heading level={2}>Your project</Heading>
|
|
187
|
+
<Field
|
|
188
|
+
label="What are you going for?"
|
|
189
|
+
inputID="campaign-goals"
|
|
190
|
+
labelID="campaign-goals-label"
|
|
191
|
+
isGroupLabel
|
|
192
|
+
isRequired
|
|
193
|
+
status={errors.goals ? { type: "error", message: errors.goals } : undefined}
|
|
194
|
+
>
|
|
195
|
+
<HStack gap={2} wrap="wrap" role="group" aria-labelledby="campaign-goals-label">
|
|
196
|
+
{CAMPAIGN_GOALS.map((goal) => {
|
|
197
|
+
const isSelected = goals.includes(goal);
|
|
198
|
+
return (
|
|
199
|
+
<Token
|
|
200
|
+
key={goal}
|
|
201
|
+
label={goal}
|
|
202
|
+
color={isSelected ? "yellow" : "default"}
|
|
203
|
+
icon={
|
|
204
|
+
isSelected ? <Icon icon={Check} size="xsm" color="inherit" /> : undefined
|
|
205
|
+
}
|
|
206
|
+
description={isSelected ? "Selected" : undefined}
|
|
207
|
+
onClick={() => toggleGoal(goal)}
|
|
208
|
+
/>
|
|
209
|
+
);
|
|
210
|
+
})}
|
|
211
|
+
</HStack>
|
|
212
|
+
</Field>
|
|
238
213
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
? {type: 'error', message: errors.timeline}
|
|
249
|
-
: undefined
|
|
250
|
-
}
|
|
251
|
-
/>
|
|
214
|
+
<Selector
|
|
215
|
+
label="When are you thinking?"
|
|
216
|
+
isRequired
|
|
217
|
+
placeholder="When are you thinking of launching?"
|
|
218
|
+
options={LAUNCH_OPTIONS}
|
|
219
|
+
value={timeline}
|
|
220
|
+
onChange={setTimeline}
|
|
221
|
+
status={errors.timeline ? { type: "error", message: errors.timeline } : undefined}
|
|
222
|
+
/>
|
|
252
223
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
? {type: 'error', message: errors.budget}
|
|
263
|
-
: undefined
|
|
264
|
-
}
|
|
265
|
-
/>
|
|
224
|
+
<Selector
|
|
225
|
+
label="Ballpark budget?"
|
|
226
|
+
isRequired
|
|
227
|
+
placeholder="What's your rough monthly budget?"
|
|
228
|
+
options={BUDGET_OPTIONS}
|
|
229
|
+
value={budget}
|
|
230
|
+
onChange={setBudget}
|
|
231
|
+
status={errors.budget ? { type: "error", message: errors.budget } : undefined}
|
|
232
|
+
/>
|
|
266
233
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
234
|
+
<RadioList
|
|
235
|
+
label="How did you hear about us?"
|
|
236
|
+
value={hearAboutUs}
|
|
237
|
+
onChange={setHearAboutUs}
|
|
238
|
+
>
|
|
239
|
+
<RadioListItem label="Social media" value="social" />
|
|
240
|
+
<RadioListItem label="Word of mouth" value="word-of-mouth" />
|
|
241
|
+
<RadioListItem label="Search engine" value="search" />
|
|
242
|
+
<RadioListItem label="Event or conference" value="event" />
|
|
243
|
+
<RadioListItem label="Other" value="other" />
|
|
244
|
+
</RadioList>
|
|
277
245
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
246
|
+
<TextArea
|
|
247
|
+
label="Anything else?"
|
|
248
|
+
placeholder="Tell us whatever else is on your mind…"
|
|
249
|
+
value={message}
|
|
250
|
+
onChange={setMessage}
|
|
251
|
+
/>
|
|
284
252
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
253
|
+
<CheckboxInput
|
|
254
|
+
label="I'm a budget decision-maker"
|
|
255
|
+
value={isDecider}
|
|
256
|
+
onChange={setIsDecider}
|
|
257
|
+
/>
|
|
258
|
+
</VStack>
|
|
291
259
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
</VStack>
|
|
313
|
-
</Center>
|
|
314
|
-
);
|
|
260
|
+
{/* Submit */}
|
|
261
|
+
<VStack gap={3}>
|
|
262
|
+
<Button
|
|
263
|
+
label="Send it into the night"
|
|
264
|
+
variant="primary"
|
|
265
|
+
onClick={() => setSubmitted(true)}
|
|
266
|
+
/>
|
|
267
|
+
<Text type="supporting" color="secondary">
|
|
268
|
+
By submitting you agree to our{" "}
|
|
269
|
+
<Link href="#/templates/contact-form" type="supporting" hasUnderline>
|
|
270
|
+
Privacy Policy
|
|
271
|
+
</Link>
|
|
272
|
+
.
|
|
273
|
+
</Text>
|
|
274
|
+
</VStack>
|
|
275
|
+
</VStack>
|
|
276
|
+
</Section>
|
|
277
|
+
</VStack>
|
|
278
|
+
</Center>
|
|
279
|
+
);
|
|
315
280
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export default {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
type: "page",
|
|
3
|
+
name: "Portfolio Dashboard",
|
|
4
|
+
description: "Holdings chart, market cards, and trending table",
|
|
5
|
+
keywords: ["portfolio", "holdings", "wealth", "investment", "positions", "dashboard"],
|
|
6
|
+
category: "dashboard",
|
|
6
7
|
};
|