sonance-brand-mcp 1.2.5 → 1.3.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/dist/assets/api/sonance-analyze/route.ts +1116 -0
- package/dist/assets/api/sonance-assets/route.ts +113 -0
- package/dist/assets/api/sonance-components/route.ts +41 -0
- package/dist/assets/api/sonance-inject-id/route.ts +363 -0
- package/dist/assets/api/sonance-save-logo/route.ts +426 -0
- package/dist/assets/api/sonance-theme/route.ts +106 -0
- package/dist/assets/brand-system.ts +1265 -0
- package/dist/assets/components/accordion.stories.tsx +26 -26
- package/dist/assets/components/accordion.tsx +3 -3
- package/dist/assets/components/alert-dialog.stories.tsx +142 -0
- package/dist/assets/components/alert-dialog.tsx +143 -0
- package/dist/assets/components/alert.stories.tsx +3 -3
- package/dist/assets/components/alert.tsx +4 -3
- package/dist/assets/components/aspect-ratio.stories.tsx +70 -0
- package/dist/assets/components/aspect-ratio.tsx +8 -0
- package/dist/assets/components/autocomplete.stories.tsx +9 -9
- package/dist/assets/components/autocomplete.tsx +3 -3
- package/dist/assets/components/avatar.stories.tsx +5 -5
- package/dist/assets/components/avatar.tsx +67 -23
- package/dist/assets/components/badge.stories.tsx +10 -10
- package/dist/assets/components/badge.tsx +3 -3
- package/dist/assets/components/breadcrumbs.stories.tsx +7 -7
- package/dist/assets/components/breadcrumbs.tsx +13 -8
- package/dist/assets/components/button.stories.tsx +74 -74
- package/dist/assets/components/button.tsx +2 -0
- package/dist/assets/components/calendar.stories.tsx +11 -11
- package/dist/assets/components/calendar.tsx +4 -4
- package/dist/assets/components/card.stories.tsx +22 -22
- package/dist/assets/components/card.tsx +7 -3
- package/dist/assets/components/carousel.stories.tsx +158 -0
- package/dist/assets/components/carousel.tsx +264 -0
- package/dist/assets/components/chart.stories.tsx +376 -0
- package/dist/assets/components/chart.tsx +384 -0
- package/dist/assets/components/checkbox-group.stories.tsx +6 -6
- package/dist/assets/components/checkbox-group.tsx +3 -3
- package/dist/assets/components/checkbox.stories.tsx +23 -20
- package/dist/assets/components/checkbox.tsx +13 -6
- package/dist/assets/components/code.stories.tsx +24 -24
- package/dist/assets/components/code.tsx +22 -27
- package/dist/assets/components/collapsible.stories.tsx +128 -0
- package/dist/assets/components/collapsible.tsx +10 -0
- package/dist/assets/components/command.stories.tsx +183 -0
- package/dist/assets/components/command.tsx +171 -0
- package/dist/assets/components/context-menu.stories.tsx +159 -0
- package/dist/assets/components/context-menu.tsx +214 -0
- package/dist/assets/components/date-input.stories.tsx +9 -9
- package/dist/assets/components/date-input.tsx +2 -2
- package/dist/assets/components/date-picker.stories.tsx +9 -9
- package/dist/assets/components/date-picker.tsx +3 -3
- package/dist/assets/components/date-range-picker.stories.tsx +12 -12
- package/dist/assets/components/date-range-picker.tsx +3 -3
- package/dist/assets/components/dialog.stories.tsx +40 -40
- package/dist/assets/components/dialog.tsx +8 -12
- package/dist/assets/components/divider.stories.tsx +30 -30
- package/dist/assets/components/divider.tsx +34 -35
- package/dist/assets/components/drawer.stories.tsx +32 -31
- package/dist/assets/components/drawer.tsx +7 -6
- package/dist/assets/components/dropdown-menu.tsx +213 -0
- package/dist/assets/components/dropdown.stories.tsx +12 -12
- package/dist/assets/components/dropdown.tsx +5 -5
- package/dist/assets/components/form.stories.tsx +30 -29
- package/dist/assets/components/form.tsx +5 -5
- package/dist/assets/components/hover-card.stories.tsx +115 -0
- package/dist/assets/components/hover-card.tsx +35 -0
- package/dist/assets/components/image.stories.tsx +48 -25
- package/dist/assets/components/image.tsx +8 -5
- package/dist/assets/components/input-otp.stories.tsx +15 -15
- package/dist/assets/components/input-otp.tsx +5 -5
- package/dist/assets/components/input.stories.tsx +30 -25
- package/dist/assets/components/input.tsx +7 -4
- package/dist/assets/components/kbd.stories.tsx +34 -34
- package/dist/assets/components/kbd.tsx +9 -9
- package/dist/assets/components/link.stories.tsx +36 -36
- package/dist/assets/components/link.tsx +4 -0
- package/dist/assets/components/listbox.stories.tsx +5 -5
- package/dist/assets/components/listbox.tsx +4 -4
- package/dist/assets/components/menubar.stories.tsx +208 -0
- package/dist/assets/components/menubar.tsx +247 -0
- package/dist/assets/components/navbar.stories.tsx +24 -24
- package/dist/assets/components/navbar.tsx +8 -14
- package/dist/assets/components/navigation-menu.stories.tsx +239 -0
- package/dist/assets/components/navigation-menu.tsx +135 -0
- package/dist/assets/components/number-input.stories.tsx +11 -11
- package/dist/assets/components/number-input.tsx +3 -3
- package/dist/assets/components/pagination.stories.tsx +13 -13
- package/dist/assets/components/pagination.tsx +6 -6
- package/dist/assets/components/popover.stories.tsx +35 -35
- package/dist/assets/components/popover.tsx +98 -15
- package/dist/assets/components/progress.stories.tsx +5 -5
- package/dist/assets/components/progress.tsx +5 -5
- package/dist/assets/components/radio-group.stories.tsx +7 -7
- package/dist/assets/components/radio-group.tsx +3 -3
- package/dist/assets/components/range-calendar.stories.tsx +18 -18
- package/dist/assets/components/range-calendar.tsx +3 -3
- package/dist/assets/components/resizable.stories.tsx +197 -0
- package/dist/assets/components/resizable.tsx +47 -0
- package/dist/assets/components/scroll-area.stories.tsx +123 -0
- package/dist/assets/components/scroll-area.tsx +48 -0
- package/dist/assets/components/scroll-shadow.stories.tsx +17 -17
- package/dist/assets/components/scroll-shadow.tsx +31 -9
- package/dist/assets/components/select.stories.tsx +20 -19
- package/dist/assets/components/select.tsx +10 -6
- package/dist/assets/components/separator.tsx +32 -0
- package/dist/assets/components/sheet.tsx +137 -0
- package/dist/assets/components/sidebar.stories.tsx +351 -0
- package/dist/assets/components/sidebar.tsx +757 -0
- package/dist/assets/components/skeleton.stories.tsx +3 -3
- package/dist/assets/components/skeleton.tsx +2 -2
- package/dist/assets/components/slider.stories.tsx +6 -6
- package/dist/assets/components/slider.tsx +3 -3
- package/dist/assets/components/spacer.stories.tsx +11 -11
- package/dist/assets/components/spacer.tsx +2 -2
- package/dist/assets/components/spinner.stories.tsx +8 -8
- package/dist/assets/components/spinner.tsx +5 -5
- package/dist/assets/components/switch.stories.tsx +24 -20
- package/dist/assets/components/switch.tsx +14 -6
- package/dist/assets/components/table.stories.tsx +7 -7
- package/dist/assets/components/table.tsx +8 -8
- package/dist/assets/components/tabs.stories.tsx +37 -37
- package/dist/assets/components/tabs.tsx +3 -3
- package/dist/assets/components/textarea.stories.tsx +13 -12
- package/dist/assets/components/textarea.tsx +3 -3
- package/dist/assets/components/theme-toggle.stories.tsx +31 -30
- package/dist/assets/components/theme-toggle.tsx +2 -2
- package/dist/assets/components/time-input.stories.tsx +16 -16
- package/dist/assets/components/time-input.tsx +2 -2
- package/dist/assets/components/toast.stories.tsx +8 -5
- package/dist/assets/components/toast.tsx +6 -6
- package/dist/assets/components/toggle-group.stories.tsx +153 -0
- package/dist/assets/components/toggle-group.tsx +61 -0
- package/dist/assets/components/toggle.stories.tsx +77 -0
- package/dist/assets/components/toggle.tsx +46 -0
- package/dist/assets/components/tooltip.stories.tsx +49 -27
- package/dist/assets/components/tooltip.tsx +23 -90
- package/dist/assets/components/user.stories.tsx +23 -23
- package/dist/assets/components/user.tsx +7 -4
- package/dist/assets/dev-tools/SonanceDevTools.tsx +4201 -0
- package/dist/assets/dev-tools/index.ts +10 -0
- package/dist/assets/globals.css +39 -0
- package/dist/assets/logos/40th-anniversary/Sonance_40_Logo_CMYK_BEAM_BLUE_40_AND_BEAM_DARK.png +0 -0
- package/dist/assets/logos/Sonance logo dark mode.png +0 -0
- package/dist/assets/logos/Sonance logo light mode.png +0 -0
- package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_2C_Light_RGB_05162025.png +0 -0
- package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_3C_Dark_RGB_05162025.png +0 -0
- package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_White_RGB_05162025.png +0 -0
- package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Dark_RGB.png +0 -0
- package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Light_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_Black_CMYK.png +0 -0
- package/dist/assets/logos/james/James_Logo_Black_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_LtGray_CMYK.png +0 -0
- package/dist/assets/logos/james/James_Logo_LtGray_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_Polished_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_Reverse_CMYK.png +0 -0
- package/dist/assets/logos/james/James_Logo_Reverse_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_White_CMYK.png +0 -0
- package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Dark_RGB.png +0 -0
- package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Light_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Dark_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Light_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Reverse_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_Black_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_2C_Dark_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_2C_Light_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_2C_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_Black_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_Grayscale_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Dark_CMYK.png +0 -0
- package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Light_CMYK.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Dark_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Light_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Black_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Grayscale_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Dark.png +0 -0
- package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Light.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Dark.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Light.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Dark.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Light.png +0 -0
- package/dist/assets/logos/trufig/TrufigLogo_Black.png +0 -0
- package/dist/assets/logos/trufig/TrufigLogo_Light.png +0 -0
- package/dist/assets/logos/trufig/TrufigWatermark_Black.png +0 -0
- package/dist/assets/logos/trufig/TrufigWatermark_Light.png +0 -0
- package/dist/assets/styles/brand-overrides.css +37 -0
- package/dist/index.js +2055 -15
- package/package.json +1 -1
|
@@ -29,10 +29,10 @@ export const Default: Story = {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
return (
|
|
32
|
-
<Form onSubmit={handleSubmit} className="w-80 space-y-4">
|
|
32
|
+
<Form data-sonance-name="form.stories" onSubmit={handleSubmit} className="w-80 space-y-4">
|
|
33
33
|
<FormField name="email">
|
|
34
34
|
<FormLabel>Email</FormLabel>
|
|
35
|
-
<Input name="email" type="email" placeholder="Enter your email" />
|
|
35
|
+
<Input id="default-input-email" name="email" type="email" placeholder="Enter your email" />
|
|
36
36
|
</FormField>
|
|
37
37
|
<FormSubmit>Subscribe</FormSubmit>
|
|
38
38
|
</Form>
|
|
@@ -75,13 +75,13 @@ export const WithValidation: Story = {
|
|
|
75
75
|
>
|
|
76
76
|
<FormField name="email">
|
|
77
77
|
<FormLabel required>Email</FormLabel>
|
|
78
|
-
<Input name="email" type="email" placeholder="you@example.com" />
|
|
78
|
+
<Input id="with-validation-input-email" name="email" type="email" placeholder="you@example.com" />
|
|
79
79
|
<FormMessage />
|
|
80
80
|
</FormField>
|
|
81
81
|
|
|
82
82
|
<FormField name="password">
|
|
83
83
|
<FormLabel required>Password</FormLabel>
|
|
84
|
-
<Input name="password" type="password" placeholder="Enter password" />
|
|
84
|
+
<Input id="with-validation-input-password" name="password" type="password" placeholder="Enter password" />
|
|
85
85
|
<FormDescription>Must be at least 8 characters</FormDescription>
|
|
86
86
|
<FormMessage />
|
|
87
87
|
</FormField>
|
|
@@ -121,13 +121,13 @@ export const ContactForm: Story = {
|
|
|
121
121
|
<div className="grid grid-cols-2 gap-4">
|
|
122
122
|
<FormField name="name">
|
|
123
123
|
<FormLabel required>Name</FormLabel>
|
|
124
|
-
<Input name="name" placeholder="Your name" />
|
|
124
|
+
<Input id="contact-form-input-name" name="name" placeholder="Your name" />
|
|
125
125
|
<FormMessage />
|
|
126
126
|
</FormField>
|
|
127
127
|
|
|
128
128
|
<FormField name="email">
|
|
129
129
|
<FormLabel required>Email</FormLabel>
|
|
130
|
-
<Input name="email" type="email" placeholder="you@example.com" />
|
|
130
|
+
<Input id="contact-form-input-email" name="email" type="email" placeholder="you@example.com" />
|
|
131
131
|
<FormMessage />
|
|
132
132
|
</FormField>
|
|
133
133
|
</div>
|
|
@@ -135,6 +135,7 @@ export const ContactForm: Story = {
|
|
|
135
135
|
<FormField name="subject">
|
|
136
136
|
<FormLabel required>Subject</FormLabel>
|
|
137
137
|
<Select
|
|
138
|
+
id="contact-form-select-select-a-topic"
|
|
138
139
|
placeholder="Select a topic"
|
|
139
140
|
options={[
|
|
140
141
|
{ value: 'sales', label: 'Sales Inquiry' },
|
|
@@ -148,7 +149,7 @@ export const ContactForm: Story = {
|
|
|
148
149
|
|
|
149
150
|
<FormField name="message">
|
|
150
151
|
<FormLabel required>Message</FormLabel>
|
|
151
|
-
<Textarea name="message" placeholder="How can we help?" rows={4} />
|
|
152
|
+
<Textarea id="contact-form-textarea-message" name="message" placeholder="How can we help?" rows={4} />
|
|
152
153
|
<FormMessage />
|
|
153
154
|
</FormField>
|
|
154
155
|
|
|
@@ -201,38 +202,38 @@ export const RegistrationForm: Story = {
|
|
|
201
202
|
<div className="grid grid-cols-2 gap-4">
|
|
202
203
|
<FormField name="firstName">
|
|
203
204
|
<FormLabel required>First Name</FormLabel>
|
|
204
|
-
<Input name="firstName" placeholder="John" />
|
|
205
|
+
<Input id="registration-form-input-firstname" name="firstName" placeholder="John" />
|
|
205
206
|
<FormMessage />
|
|
206
207
|
</FormField>
|
|
207
208
|
|
|
208
209
|
<FormField name="lastName">
|
|
209
210
|
<FormLabel required>Last Name</FormLabel>
|
|
210
|
-
<Input name="lastName" placeholder="Doe" />
|
|
211
|
+
<Input id="registration-form-input-lastname" name="lastName" placeholder="Doe" />
|
|
211
212
|
<FormMessage />
|
|
212
213
|
</FormField>
|
|
213
214
|
</div>
|
|
214
215
|
|
|
215
216
|
<FormField name="email">
|
|
216
217
|
<FormLabel required>Email</FormLabel>
|
|
217
|
-
<Input name="email" type="email" placeholder="john@example.com" />
|
|
218
|
+
<Input id="registration-form-input-email" name="email" type="email" placeholder="john@example.com" />
|
|
218
219
|
<FormMessage />
|
|
219
220
|
</FormField>
|
|
220
221
|
|
|
221
222
|
<FormField name="password">
|
|
222
223
|
<FormLabel required>Password</FormLabel>
|
|
223
|
-
<Input name="password" type="password" />
|
|
224
|
+
<Input id="registration-form-input-password" name="password" type="password" />
|
|
224
225
|
<FormDescription>Minimum 8 characters</FormDescription>
|
|
225
226
|
<FormMessage />
|
|
226
227
|
</FormField>
|
|
227
228
|
|
|
228
229
|
<FormField name="confirmPassword">
|
|
229
230
|
<FormLabel required>Confirm Password</FormLabel>
|
|
230
|
-
<Input name="confirmPassword" type="password" />
|
|
231
|
+
<Input id="registration-form-input-confirmpassword" name="confirmPassword" type="password" />
|
|
231
232
|
<FormMessage />
|
|
232
233
|
</FormField>
|
|
233
234
|
|
|
234
235
|
<FormField name="terms">
|
|
235
|
-
<Checkbox name="terms" value="accepted" label="I accept the terms and conditions" />
|
|
236
|
+
<Checkbox id="registration-form-checkbox-terms" name="terms" value="accepted" label="I accept the terms and conditions" />
|
|
236
237
|
<FormMessage />
|
|
237
238
|
</FormField>
|
|
238
239
|
|
|
@@ -247,25 +248,25 @@ export const ComponentsShowcase: Story = {
|
|
|
247
248
|
render: () => (
|
|
248
249
|
<div className="w-80 space-y-6">
|
|
249
250
|
<div>
|
|
250
|
-
<h4 className="text-sm font-medium mb-2">FormLabel</h4>
|
|
251
|
+
<h4 id="components-showcase-h4-formlabel" className="text-sm font-medium mb-2">FormLabel</h4>
|
|
251
252
|
<FormLabel>Regular Label</FormLabel>
|
|
252
253
|
<FormLabel required>Required Label</FormLabel>
|
|
253
254
|
</div>
|
|
254
255
|
|
|
255
256
|
<div>
|
|
256
|
-
<h4 className="text-sm font-medium mb-2">FormDescription</h4>
|
|
257
|
+
<h4 id="components-showcase-h4-formdescription" className="text-sm font-medium mb-2">FormDescription</h4>
|
|
257
258
|
<FormDescription>
|
|
258
259
|
This is helper text that provides additional context for the field.
|
|
259
260
|
</FormDescription>
|
|
260
261
|
</div>
|
|
261
262
|
|
|
262
263
|
<div>
|
|
263
|
-
<h4 className="text-sm font-medium mb-2">FormMessage (Error)</h4>
|
|
264
|
+
<h4 id="components-showcase-h4-formmessage-error" className="text-sm font-medium mb-2">FormMessage (Error)</h4>
|
|
264
265
|
<FormMessage>This field is required</FormMessage>
|
|
265
266
|
</div>
|
|
266
267
|
|
|
267
268
|
<div>
|
|
268
|
-
<h4 className="text-sm font-medium mb-2">FormSubmit</h4>
|
|
269
|
+
<h4 id="components-showcase-h4-formsubmit" className="text-sm font-medium mb-2">FormSubmit</h4>
|
|
269
270
|
<FormSubmit>Submit Button</FormSubmit>
|
|
270
271
|
</div>
|
|
271
272
|
</div>
|
|
@@ -285,7 +286,7 @@ export const AsyncSubmission: Story = {
|
|
|
285
286
|
<Form onSubmit={handleSubmit} className="w-80 space-y-4">
|
|
286
287
|
<FormField name="data">
|
|
287
288
|
<FormLabel>Data</FormLabel>
|
|
288
|
-
<Input name="data" placeholder="Enter something" />
|
|
289
|
+
<Input id="async-submission-input-data" name="data" placeholder="Enter something" />
|
|
289
290
|
<FormDescription>
|
|
290
291
|
The submit button shows loading state during submission
|
|
291
292
|
</FormDescription>
|
|
@@ -302,12 +303,12 @@ export const ResponsiveMatrix: Story = {
|
|
|
302
303
|
<div className="space-y-8">
|
|
303
304
|
{/* Mobile */}
|
|
304
305
|
<div>
|
|
305
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
306
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
306
307
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
307
308
|
<Form className="space-y-4">
|
|
308
309
|
<FormField name="email">
|
|
309
310
|
<FormLabel>Email</FormLabel>
|
|
310
|
-
<Input name="email" type="email" placeholder="you@example.com" />
|
|
311
|
+
<Input id="responsive-matrix-input-email" name="email" type="email" placeholder="you@example.com" />
|
|
311
312
|
</FormField>
|
|
312
313
|
<FormSubmit className="w-full">Subscribe</FormSubmit>
|
|
313
314
|
</Form>
|
|
@@ -315,22 +316,22 @@ export const ResponsiveMatrix: Story = {
|
|
|
315
316
|
</div>
|
|
316
317
|
{/* Tablet */}
|
|
317
318
|
<div>
|
|
318
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
319
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
319
320
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
320
321
|
<Form className="space-y-4">
|
|
321
322
|
<div className="grid grid-cols-2 gap-4">
|
|
322
323
|
<FormField name="firstName">
|
|
323
324
|
<FormLabel>First Name</FormLabel>
|
|
324
|
-
<Input name="firstName" placeholder="John" />
|
|
325
|
+
<Input id="responsive-matrix-input-firstname" name="firstName" placeholder="John" />
|
|
325
326
|
</FormField>
|
|
326
327
|
<FormField name="lastName">
|
|
327
328
|
<FormLabel>Last Name</FormLabel>
|
|
328
|
-
<Input name="lastName" placeholder="Doe" />
|
|
329
|
+
<Input id="responsive-matrix-input-lastname" name="lastName" placeholder="Doe" />
|
|
329
330
|
</FormField>
|
|
330
331
|
</div>
|
|
331
332
|
<FormField name="email">
|
|
332
333
|
<FormLabel>Email</FormLabel>
|
|
333
|
-
<Input name="email" type="email" placeholder="john@example.com" />
|
|
334
|
+
<Input id="responsive-matrix-input-email" name="email" type="email" placeholder="john@example.com" />
|
|
334
335
|
</FormField>
|
|
335
336
|
<FormSubmit>Submit</FormSubmit>
|
|
336
337
|
</Form>
|
|
@@ -338,29 +339,29 @@ export const ResponsiveMatrix: Story = {
|
|
|
338
339
|
</div>
|
|
339
340
|
{/* Desktop */}
|
|
340
341
|
<div>
|
|
341
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
342
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
342
343
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
343
344
|
<Form className="space-y-4 max-w-2xl">
|
|
344
345
|
<div className="grid grid-cols-3 gap-4">
|
|
345
346
|
<FormField name="firstName">
|
|
346
347
|
<FormLabel required>First Name</FormLabel>
|
|
347
|
-
<Input name="firstName" placeholder="John" />
|
|
348
|
+
<Input id="responsive-matrix-input-firstname" name="firstName" placeholder="John" />
|
|
348
349
|
<FormMessage />
|
|
349
350
|
</FormField>
|
|
350
351
|
<FormField name="lastName">
|
|
351
352
|
<FormLabel required>Last Name</FormLabel>
|
|
352
|
-
<Input name="lastName" placeholder="Doe" />
|
|
353
|
+
<Input id="responsive-matrix-input-lastname" name="lastName" placeholder="Doe" />
|
|
353
354
|
<FormMessage />
|
|
354
355
|
</FormField>
|
|
355
356
|
<FormField name="email">
|
|
356
357
|
<FormLabel required>Email</FormLabel>
|
|
357
|
-
<Input name="email" type="email" placeholder="john@example.com" />
|
|
358
|
+
<Input id="responsive-matrix-input-email" name="email" type="email" placeholder="john@example.com" />
|
|
358
359
|
<FormMessage />
|
|
359
360
|
</FormField>
|
|
360
361
|
</div>
|
|
361
362
|
<FormField name="message">
|
|
362
363
|
<FormLabel>Message</FormLabel>
|
|
363
|
-
<Textarea name="message" placeholder="How can we help?" rows={3} />
|
|
364
|
+
<Textarea id="responsive-matrix-textarea-message" name="message" placeholder="How can we help?" rows={3} />
|
|
364
365
|
<FormDescription>Optional message</FormDescription>
|
|
365
366
|
</FormField>
|
|
366
367
|
<FormSubmit>Send Message</FormSubmit>
|
|
@@ -126,9 +126,9 @@ interface FormLabelProps {
|
|
|
126
126
|
|
|
127
127
|
export function FormLabel({ children, required, className }: FormLabelProps) {
|
|
128
128
|
return (
|
|
129
|
-
<label className={cn("block text-xs font-medium uppercase tracking-widest text-foreground-muted", className)}>
|
|
129
|
+
<label data-sonance-name="form" className={cn("block text-xs font-medium uppercase tracking-widest text-foreground-muted", className)}>
|
|
130
130
|
{children}
|
|
131
|
-
{required && <span className="text-error ml-0.5">*</span>}
|
|
131
|
+
{required && <span id="form-label-span" className="text-error ml-0.5">*</span>}
|
|
132
132
|
</label>
|
|
133
133
|
);
|
|
134
134
|
}
|
|
@@ -141,7 +141,7 @@ interface FormDescriptionProps {
|
|
|
141
141
|
|
|
142
142
|
export function FormDescription({ children, className }: FormDescriptionProps) {
|
|
143
143
|
return (
|
|
144
|
-
<p className={cn("text-sm text-foreground-muted", className)}>{children}</p>
|
|
144
|
+
<p id="form-description-p-children" data-sonance-name="form" className={cn("text-sm text-foreground-muted", className)}>{children}</p>
|
|
145
145
|
);
|
|
146
146
|
}
|
|
147
147
|
|
|
@@ -158,7 +158,7 @@ export function FormMessage({ children, className }: FormMessageProps) {
|
|
|
158
158
|
if (!message) return null;
|
|
159
159
|
|
|
160
160
|
return (
|
|
161
|
-
<p className={cn("text-sm text-error", className)}>{message}</p>
|
|
161
|
+
<p id="form-message-p-message" className={cn("text-sm text-error", className)}>{message}</p>
|
|
162
162
|
);
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -180,7 +180,7 @@ export function FormSubmit({ children, className, disabled, ...props }: FormSubm
|
|
|
180
180
|
"transition-colors hover:bg-primary-hover",
|
|
181
181
|
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
182
182
|
className
|
|
183
|
-
)}
|
|
183
|
+
)} data-sonance-name="form"
|
|
184
184
|
{...props}
|
|
185
185
|
>
|
|
186
186
|
{form.isSubmitting ? "Submitting..." : children}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { CalendarDays } from "lucide-react";
|
|
3
|
+
import { HoverCard, HoverCardContent, HoverCardTrigger } from "./hover-card";
|
|
4
|
+
import { Avatar } from "./avatar";
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof HoverCard> = {
|
|
7
|
+
title: "Components/Overlays/HoverCard",
|
|
8
|
+
component: HoverCard,
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: "centered",
|
|
11
|
+
},
|
|
12
|
+
tags: ["autodocs"],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default meta;
|
|
16
|
+
type Story = StoryObj<typeof HoverCard>;
|
|
17
|
+
|
|
18
|
+
export const Default: Story = {
|
|
19
|
+
render: () => (
|
|
20
|
+
<HoverCard>
|
|
21
|
+
<HoverCardTrigger asChild>
|
|
22
|
+
<a
|
|
23
|
+
id="default-a"
|
|
24
|
+
href="#"
|
|
25
|
+
className="text-sm font-medium text-primary underline underline-offset-4"
|
|
26
|
+
>
|
|
27
|
+
@sonance
|
|
28
|
+
</a>
|
|
29
|
+
</HoverCardTrigger>
|
|
30
|
+
<HoverCardContent className="w-80">
|
|
31
|
+
<div className="flex justify-between space-x-4">
|
|
32
|
+
<Avatar
|
|
33
|
+
fallback="Sonance"
|
|
34
|
+
size="md"
|
|
35
|
+
/>
|
|
36
|
+
<div className="space-y-1">
|
|
37
|
+
<h4 id="default-h4-sonance" className="text-sm font-medium text-foreground">@sonance</h4>
|
|
38
|
+
<p id="default-p-premium-architectura" className="text-sm text-foreground-secondary">
|
|
39
|
+
Premium architectural speakers and outdoor audio solutions.
|
|
40
|
+
</p>
|
|
41
|
+
<div className="flex items-center pt-2">
|
|
42
|
+
<CalendarDays className="mr-2 h-4 w-4 opacity-70" />{" "}
|
|
43
|
+
<span id="default-span-joined-december-2021" className="text-xs text-foreground-muted">
|
|
44
|
+
Joined December 2021
|
|
45
|
+
</span>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</HoverCardContent>
|
|
50
|
+
</HoverCard>
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const ProductPreview: Story = {
|
|
55
|
+
render: () => (
|
|
56
|
+
<HoverCard>
|
|
57
|
+
<HoverCardTrigger asChild>
|
|
58
|
+
<button className="text-sm font-medium underline underline-offset-4">
|
|
59
|
+
View Sonance Landscape Series
|
|
60
|
+
</button>
|
|
61
|
+
</HoverCardTrigger>
|
|
62
|
+
<HoverCardContent className="w-80">
|
|
63
|
+
<div className="space-y-3">
|
|
64
|
+
<div className="h-32 rounded-sm bg-secondary-hover flex items-center justify-center">
|
|
65
|
+
<span id="product-preview-span-product-image" className="text-foreground-muted text-xs">Product Image</span>
|
|
66
|
+
</div>
|
|
67
|
+
<div className="space-y-1">
|
|
68
|
+
<h4 id="product-preview-h4-landscape-series" className="text-sm font-medium text-foreground">
|
|
69
|
+
Landscape Series
|
|
70
|
+
</h4>
|
|
71
|
+
<p id="product-preview-p-outdoor-speakers-des" className="text-sm text-foreground-secondary">
|
|
72
|
+
Outdoor speakers designed to blend seamlessly into your landscape
|
|
73
|
+
while delivering exceptional audio quality.
|
|
74
|
+
</p>
|
|
75
|
+
<p id="product-preview-p-starting-at-599" className="text-xs text-foreground-muted pt-1">
|
|
76
|
+
Starting at $599
|
|
77
|
+
</p>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</HoverCardContent>
|
|
81
|
+
</HoverCard>
|
|
82
|
+
),
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const LinkPreview: Story = {
|
|
86
|
+
render: () => (
|
|
87
|
+
<p id="link-preview-p" className="text-sm text-foreground-secondary">
|
|
88
|
+
Learn more about our{" "}
|
|
89
|
+
<HoverCard>
|
|
90
|
+
<HoverCardTrigger asChild>
|
|
91
|
+
<a
|
|
92
|
+
id="link-preview-a"
|
|
93
|
+
href="#"
|
|
94
|
+
className="font-medium text-foreground underline underline-offset-4"
|
|
95
|
+
>
|
|
96
|
+
installation services
|
|
97
|
+
</a>
|
|
98
|
+
</HoverCardTrigger>
|
|
99
|
+
<HoverCardContent>
|
|
100
|
+
<div className="space-y-2">
|
|
101
|
+
<h4 id="link-preview-h4-professional-install" className="text-sm font-medium text-foreground">
|
|
102
|
+
Professional Installation
|
|
103
|
+
</h4>
|
|
104
|
+
<p id="link-preview-p-our-certified-integr" className="text-sm text-foreground-secondary">
|
|
105
|
+
Our certified integrators ensure your audio system is installed
|
|
106
|
+
correctly for optimal performance.
|
|
107
|
+
</p>
|
|
108
|
+
</div>
|
|
109
|
+
</HoverCardContent>
|
|
110
|
+
</HoverCard>{" "}
|
|
111
|
+
for your home.
|
|
112
|
+
</p>
|
|
113
|
+
),
|
|
114
|
+
};
|
|
115
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
const HoverCard = HoverCardPrimitive.Root;
|
|
8
|
+
const HoverCardTrigger = HoverCardPrimitive.Trigger;
|
|
9
|
+
|
|
10
|
+
const HoverCardContent = React.forwardRef<
|
|
11
|
+
React.ElementRef<typeof HoverCardPrimitive.Content>,
|
|
12
|
+
React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
|
|
13
|
+
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
|
|
14
|
+
<HoverCardPrimitive.Content data-sonance-name="hover-card"
|
|
15
|
+
ref={ref}
|
|
16
|
+
align={align}
|
|
17
|
+
sideOffset={sideOffset}
|
|
18
|
+
className={cn(
|
|
19
|
+
"z-50 w-64 rounded-sm border border-border bg-card p-4 text-foreground shadow-md outline-none",
|
|
20
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
21
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
22
|
+
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
23
|
+
"data-[side=bottom]:slide-in-from-top-2",
|
|
24
|
+
"data-[side=left]:slide-in-from-right-2",
|
|
25
|
+
"data-[side=right]:slide-in-from-left-2",
|
|
26
|
+
"data-[side=top]:slide-in-from-bottom-2",
|
|
27
|
+
className
|
|
28
|
+
)}
|
|
29
|
+
{...props}
|
|
30
|
+
/>
|
|
31
|
+
));
|
|
32
|
+
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
|
|
33
|
+
|
|
34
|
+
export { HoverCard, HoverCardTrigger, HoverCardContent };
|
|
35
|
+
|