sonance-brand-mcp 1.3.1 → 1.3.3
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 +7 -7
- package/dist/assets/components/alert-dialog.tsx +2 -1
- 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 +4 -1
- 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 +4 -4
- 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 +6 -6
- package/dist/assets/components/carousel.tsx +10 -8
- package/dist/assets/components/chart.tsx +5 -5
- 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 -16
- package/dist/assets/components/code.stories.tsx +24 -24
- package/dist/assets/components/code.tsx +7 -14
- package/dist/assets/components/collapsible.stories.tsx +3 -3
- package/dist/assets/components/command.stories.tsx +14 -14
- package/dist/assets/components/command.tsx +4 -3
- package/dist/assets/components/context-menu.stories.tsx +1 -1
- package/dist/assets/components/context-menu.tsx +3 -7
- 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 +4 -8
- package/dist/assets/components/drawer.stories.tsx +32 -31
- package/dist/assets/components/drawer.tsx +7 -6
- package/dist/assets/components/dropdown-menu.tsx +3 -7
- 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 +12 -10
- package/dist/assets/components/hover-card.tsx +1 -1
- 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 +5 -5
- 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.tsx +3 -7
- 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 +11 -9
- package/dist/assets/components/navigation-menu.tsx +1 -1
- 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 +23 -23
- package/dist/assets/components/resizable.tsx +1 -1
- package/dist/assets/components/scroll-area.stories.tsx +15 -15
- package/dist/assets/components/scroll-area.tsx +1 -1
- package/dist/assets/components/scroll-shadow.stories.tsx +17 -17
- package/dist/assets/components/scroll-shadow.tsx +2 -2
- package/dist/assets/components/select.stories.tsx +20 -19
- package/dist/assets/components/select.tsx +10 -6
- package/dist/assets/components/separator.tsx +1 -1
- package/dist/assets/components/sheet.tsx +3 -7
- package/dist/assets/components/sidebar.stories.tsx +30 -30
- package/dist/assets/components/sidebar.tsx +24 -27
- 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.tsx +1 -1
- package/dist/assets/components/toggle.tsx +1 -1
- package/dist/assets/components/tooltip.stories.tsx +49 -27
- package/dist/assets/components/tooltip.tsx +1 -1
- 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 +9 -0
- package/dist/assets/styles/brand-overrides.css +37 -0
- package/dist/index.js +1882 -7
- package/package.json +1 -1
|
@@ -134,20 +134,20 @@ export const ProductSpecs: Story = {
|
|
|
134
134
|
<AccordionContent>
|
|
135
135
|
<div className="space-y-2 text-sm">
|
|
136
136
|
<div className="flex justify-between">
|
|
137
|
-
<span className="text-foreground-muted">Frequency Response</span>
|
|
138
|
-
<span>50Hz - 20kHz</span>
|
|
137
|
+
<span id="product-specs-span-frequency-response" className="text-foreground-muted">Frequency Response</span>
|
|
138
|
+
<span id="product-specs-span-50hz-20khz">50Hz - 20kHz</span>
|
|
139
139
|
</div>
|
|
140
140
|
<div className="flex justify-between">
|
|
141
|
-
<span className="text-foreground-muted">Impedance</span>
|
|
142
|
-
<span>8 Ohms</span>
|
|
141
|
+
<span id="product-specs-span-impedance" className="text-foreground-muted">Impedance</span>
|
|
142
|
+
<span id="product-specs-span-8-ohms">8 Ohms</span>
|
|
143
143
|
</div>
|
|
144
144
|
<div className="flex justify-between">
|
|
145
|
-
<span className="text-foreground-muted">Power Handling</span>
|
|
146
|
-
<span>100W RMS</span>
|
|
145
|
+
<span id="product-specs-span-power-handling" className="text-foreground-muted">Power Handling</span>
|
|
146
|
+
<span id="product-specs-span-100w-rms">100W RMS</span>
|
|
147
147
|
</div>
|
|
148
148
|
<div className="flex justify-between">
|
|
149
|
-
<span className="text-foreground-muted">Sensitivity</span>
|
|
150
|
-
<span>89dB @ 1W/1m</span>
|
|
149
|
+
<span id="product-specs-span-sensitivity" className="text-foreground-muted">Sensitivity</span>
|
|
150
|
+
<span id="product-specs-span-89db-1w1m">89dB @ 1W/1m</span>
|
|
151
151
|
</div>
|
|
152
152
|
</div>
|
|
153
153
|
</AccordionContent>
|
|
@@ -157,20 +157,20 @@ export const ProductSpecs: Story = {
|
|
|
157
157
|
<AccordionContent>
|
|
158
158
|
<div className="space-y-2 text-sm">
|
|
159
159
|
<div className="flex justify-between">
|
|
160
|
-
<span className="text-foreground-muted">Height</span>
|
|
161
|
-
<span>8.5"</span>
|
|
160
|
+
<span id="product-specs-span-height" className="text-foreground-muted">Height</span>
|
|
161
|
+
<span id="product-specs-span-85quot">8.5"</span>
|
|
162
162
|
</div>
|
|
163
163
|
<div className="flex justify-between">
|
|
164
|
-
<span className="text-foreground-muted">Width</span>
|
|
165
|
-
<span>10.5"</span>
|
|
164
|
+
<span id="product-specs-span-width" className="text-foreground-muted">Width</span>
|
|
165
|
+
<span id="product-specs-span-105quot">10.5"</span>
|
|
166
166
|
</div>
|
|
167
167
|
<div className="flex justify-between">
|
|
168
|
-
<span className="text-foreground-muted">Depth</span>
|
|
169
|
-
<span>3.8"</span>
|
|
168
|
+
<span id="product-specs-span-depth" className="text-foreground-muted">Depth</span>
|
|
169
|
+
<span id="product-specs-span-38quot">3.8"</span>
|
|
170
170
|
</div>
|
|
171
171
|
<div className="flex justify-between">
|
|
172
|
-
<span className="text-foreground-muted">Weight</span>
|
|
173
|
-
<span>4.2 lbs</span>
|
|
172
|
+
<span id="product-specs-span-weight" className="text-foreground-muted">Weight</span>
|
|
173
|
+
<span id="product-specs-span-42-lbs">4.2 lbs</span>
|
|
174
174
|
</div>
|
|
175
175
|
</div>
|
|
176
176
|
</AccordionContent>
|
|
@@ -197,7 +197,7 @@ export const SettingsPanel: Story = {
|
|
|
197
197
|
<AccordionItem value="appearance">
|
|
198
198
|
<AccordionTrigger className="px-4">Appearance</AccordionTrigger>
|
|
199
199
|
<AccordionContent className="px-4">
|
|
200
|
-
<p className="text-foreground-muted mb-4">
|
|
200
|
+
<p id="settings-panel-p-customize-how-the-ap" className="text-foreground-muted mb-4">
|
|
201
201
|
Customize how the application looks on your device.
|
|
202
202
|
</p>
|
|
203
203
|
<div className="flex gap-4">
|
|
@@ -210,7 +210,7 @@ export const SettingsPanel: Story = {
|
|
|
210
210
|
<AccordionItem value="notifications">
|
|
211
211
|
<AccordionTrigger className="px-4">Notifications</AccordionTrigger>
|
|
212
212
|
<AccordionContent className="px-4">
|
|
213
|
-
<p className="text-foreground-muted">
|
|
213
|
+
<p id="settings-panel-p-configure-how-you-re" className="text-foreground-muted">
|
|
214
214
|
Configure how you receive notifications and alerts.
|
|
215
215
|
</p>
|
|
216
216
|
</AccordionContent>
|
|
@@ -218,7 +218,7 @@ export const SettingsPanel: Story = {
|
|
|
218
218
|
<AccordionItem value="privacy">
|
|
219
219
|
<AccordionTrigger className="px-4">Privacy & Security</AccordionTrigger>
|
|
220
220
|
<AccordionContent className="px-4">
|
|
221
|
-
<p className="text-foreground-muted">
|
|
221
|
+
<p id="settings-panel-p-manage-your-privacy-" className="text-foreground-muted">
|
|
222
222
|
Manage your privacy settings and security preferences.
|
|
223
223
|
</p>
|
|
224
224
|
</AccordionContent>
|
|
@@ -233,8 +233,8 @@ export const StateMatrix: Story = {
|
|
|
233
233
|
render: () => {
|
|
234
234
|
const states: AccordionTriggerState[] = ['default', 'hover', 'focus', 'expanded', 'disabled'];
|
|
235
235
|
return (
|
|
236
|
-
<div className="space-y-6 w-96">
|
|
237
|
-
<h3 className="text-sm font-medium text-foreground-muted">AccordionTrigger States</h3>
|
|
236
|
+
<div data-sonance-name="accordion.stories" className="space-y-6 w-96">
|
|
237
|
+
<h3 id="state-matrix-h3-accordiontrigger-sta" className="text-sm font-medium text-foreground-muted">AccordionTrigger States</h3>
|
|
238
238
|
<div className="space-y-2">
|
|
239
239
|
{states.map((state) => (
|
|
240
240
|
<Accordion key={state} type="single" collapsible className="w-full">
|
|
@@ -256,7 +256,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
256
256
|
<div className="space-y-8">
|
|
257
257
|
{/* Mobile */}
|
|
258
258
|
<div>
|
|
259
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
259
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
260
260
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
261
261
|
<Accordion type="single" collapsible defaultValue="item-1" className="w-full">
|
|
262
262
|
<AccordionItem value="item-1">
|
|
@@ -272,15 +272,15 @@ export const ResponsiveMatrix: Story = {
|
|
|
272
272
|
</div>
|
|
273
273
|
{/* Tablet */}
|
|
274
274
|
<div>
|
|
275
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
275
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
276
276
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
277
277
|
<Accordion type="single" collapsible defaultValue="specs" className="w-full">
|
|
278
278
|
<AccordionItem value="specs">
|
|
279
279
|
<AccordionTrigger>Technical Specifications</AccordionTrigger>
|
|
280
280
|
<AccordionContent>
|
|
281
281
|
<div className="grid grid-cols-2 gap-4 text-sm">
|
|
282
|
-
<div className="flex justify-between"><span className="text-foreground-muted">Frequency</span><span>50Hz - 20kHz</span></div>
|
|
283
|
-
<div className="flex justify-between"><span className="text-foreground-muted">Impedance</span><span>8 Ohms</span></div>
|
|
282
|
+
<div className="flex justify-between"><span id="responsive-matrix-span-frequency" className="text-foreground-muted">Frequency</span><span id="responsive-matrix-span-50hz-20khz">50Hz - 20kHz</span></div>
|
|
283
|
+
<div className="flex justify-between"><span id="responsive-matrix-span-impedance" className="text-foreground-muted">Impedance</span><span id="responsive-matrix-span-8-ohms">8 Ohms</span></div>
|
|
284
284
|
</div>
|
|
285
285
|
</AccordionContent>
|
|
286
286
|
</AccordionItem>
|
|
@@ -293,7 +293,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
293
293
|
</div>
|
|
294
294
|
{/* Desktop */}
|
|
295
295
|
<div>
|
|
296
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
296
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
297
297
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
298
298
|
<Accordion type="multiple" defaultValue={['item-1']} className="w-full">
|
|
299
299
|
{faqItems.map((item) => (
|
|
@@ -65,7 +65,7 @@ export function Accordion({
|
|
|
65
65
|
|
|
66
66
|
return (
|
|
67
67
|
<AccordionContext.Provider value={{ openItems, toggleItem, type }}>
|
|
68
|
-
<div className={cn("w-full divide-y divide-border border-y border-border", className)}>
|
|
68
|
+
<div data-sonance-name="accordion" className={cn("w-full divide-y divide-border border-y border-border", className)}>
|
|
69
69
|
{children}
|
|
70
70
|
</div>
|
|
71
71
|
</AccordionContext.Provider>
|
|
@@ -113,7 +113,7 @@ export const AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerPr
|
|
|
113
113
|
const isDisabled = disabled || state === "disabled";
|
|
114
114
|
|
|
115
115
|
return (
|
|
116
|
-
<button
|
|
116
|
+
<button data-sonance-name="accordion"
|
|
117
117
|
ref={ref}
|
|
118
118
|
type="button"
|
|
119
119
|
onClick={() => !isDisabled && accordionContext.toggleItem(itemContext.value)}
|
|
@@ -161,7 +161,7 @@ export const AccordionContent = forwardRef<
|
|
|
161
161
|
itemContext.isOpen ? "pb-4" : "h-0",
|
|
162
162
|
className
|
|
163
163
|
)}
|
|
164
|
-
aria-hidden={!itemContext.isOpen}
|
|
164
|
+
aria-hidden={!itemContext.isOpen} data-sonance-name="accordion"
|
|
165
165
|
{...props}
|
|
166
166
|
>
|
|
167
167
|
{itemContext.isOpen && children}
|
|
@@ -28,7 +28,7 @@ export const Default: Story = {
|
|
|
28
28
|
render: () => (
|
|
29
29
|
<AlertDialog>
|
|
30
30
|
<AlertDialogTrigger asChild>
|
|
31
|
-
<Button variant="secondary">Delete Account</Button>
|
|
31
|
+
<Button id="default-button-secondary" variant="secondary">Delete Account</Button>
|
|
32
32
|
</AlertDialogTrigger>
|
|
33
33
|
<AlertDialogContent>
|
|
34
34
|
<AlertDialogHeader>
|
|
@@ -51,7 +51,7 @@ export const Destructive: Story = {
|
|
|
51
51
|
render: () => (
|
|
52
52
|
<AlertDialog>
|
|
53
53
|
<AlertDialogTrigger asChild>
|
|
54
|
-
<Button variant="primary">Delete Project</Button>
|
|
54
|
+
<Button id="destructive-button-primary" variant="primary">Delete Project</Button>
|
|
55
55
|
</AlertDialogTrigger>
|
|
56
56
|
<AlertDialogContent>
|
|
57
57
|
<AlertDialogHeader>
|
|
@@ -77,7 +77,7 @@ export const ConfirmAction: Story = {
|
|
|
77
77
|
render: () => (
|
|
78
78
|
<AlertDialog>
|
|
79
79
|
<AlertDialogTrigger asChild>
|
|
80
|
-
<Button>Publish Changes</Button>
|
|
80
|
+
<Button id="confirm-action-button">Publish Changes</Button>
|
|
81
81
|
</AlertDialogTrigger>
|
|
82
82
|
<AlertDialogContent>
|
|
83
83
|
<AlertDialogHeader>
|
|
@@ -101,7 +101,7 @@ export const WithLongContent: Story = {
|
|
|
101
101
|
render: () => (
|
|
102
102
|
<AlertDialog>
|
|
103
103
|
<AlertDialogTrigger asChild>
|
|
104
|
-
<Button variant="secondary">View Terms</Button>
|
|
104
|
+
<Button id="with-long-content-button-secondary" variant="secondary">View Terms</Button>
|
|
105
105
|
</AlertDialogTrigger>
|
|
106
106
|
<AlertDialogContent>
|
|
107
107
|
<AlertDialogHeader>
|
|
@@ -112,19 +112,19 @@ export const WithLongContent: Story = {
|
|
|
112
112
|
</AlertDialogDescription>
|
|
113
113
|
</AlertDialogHeader>
|
|
114
114
|
<div className="max-h-[200px] overflow-y-auto text-sm text-foreground-secondary border border-border rounded-sm p-4 my-4">
|
|
115
|
-
<p className="mb-4">
|
|
115
|
+
<p id="with-long-content-p-lorem-ipsum-dolor-si" className="mb-4">
|
|
116
116
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
|
|
117
117
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
|
|
118
118
|
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
|
119
119
|
aliquip ex ea commodo consequat.
|
|
120
120
|
</p>
|
|
121
|
-
<p className="mb-4">
|
|
121
|
+
<p id="with-long-content-p-duis-aute-irure-dolo" className="mb-4">
|
|
122
122
|
Duis aute irure dolor in reprehenderit in voluptate velit esse
|
|
123
123
|
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
|
|
124
124
|
cupidatat non proident, sunt in culpa qui officia deserunt mollit
|
|
125
125
|
anim id est laborum.
|
|
126
126
|
</p>
|
|
127
|
-
<p>
|
|
127
|
+
<p id="with-long-content-p-sed-ut-perspiciatis-">
|
|
128
128
|
Sed ut perspiciatis unde omnis iste natus error sit voluptatem
|
|
129
129
|
accusantium doloremque laudantium, totam rem aperiam, eaque ipsa
|
|
130
130
|
quae ab illo inventore veritatis et quasi architecto beatae vitae
|
|
@@ -48,6 +48,7 @@ const AlertDialogHeader = ({
|
|
|
48
48
|
...props
|
|
49
49
|
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
50
50
|
<div
|
|
51
|
+
data-sonance-name="alert-dialog"
|
|
51
52
|
className={cn(
|
|
52
53
|
"flex flex-col space-y-2 text-center sm:text-left",
|
|
53
54
|
className
|
|
@@ -65,7 +66,7 @@ const AlertDialogFooter = ({
|
|
|
65
66
|
className={cn(
|
|
66
67
|
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
67
68
|
className
|
|
68
|
-
)}
|
|
69
|
+
)} data-sonance-name="alert-dialog"
|
|
69
70
|
{...props}
|
|
70
71
|
/>
|
|
71
72
|
);
|
|
@@ -160,7 +160,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
160
160
|
<div className="space-y-8">
|
|
161
161
|
{/* Mobile */}
|
|
162
162
|
<div>
|
|
163
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
163
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
164
164
|
<div className="w-[375px] border border-dashed border-border p-4 space-y-4">
|
|
165
165
|
<Alert variant="success" title="Success">
|
|
166
166
|
Your changes have been saved.
|
|
@@ -172,7 +172,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
172
172
|
</div>
|
|
173
173
|
{/* Tablet */}
|
|
174
174
|
<div>
|
|
175
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
175
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
176
176
|
<div className="w-[768px] border border-dashed border-border p-4 space-y-4">
|
|
177
177
|
<Alert variant="info" title="Information">
|
|
178
178
|
A new version is available. Please refresh to update.
|
|
@@ -184,7 +184,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
184
184
|
</div>
|
|
185
185
|
{/* Desktop */}
|
|
186
186
|
<div>
|
|
187
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
187
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
188
188
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
189
189
|
<div className="grid grid-cols-2 gap-4">
|
|
190
190
|
<Alert variant="success" title="Success">Operation completed successfully.</Alert>
|
|
@@ -44,6 +44,7 @@ export const Alert = forwardRef<HTMLDivElement, AlertProps>(
|
|
|
44
44
|
|
|
45
45
|
return (
|
|
46
46
|
<div
|
|
47
|
+
data-sonance-name="alert"
|
|
47
48
|
ref={ref}
|
|
48
49
|
role="alert"
|
|
49
50
|
className={cn(alertVariants({ variant }), className)}
|
|
@@ -52,12 +53,12 @@ export const Alert = forwardRef<HTMLDivElement, AlertProps>(
|
|
|
52
53
|
<Icon className="h-5 w-5 shrink-0" />
|
|
53
54
|
<div className="flex-1">
|
|
54
55
|
{title && (
|
|
55
|
-
<h5 className="mb-1 font-medium leading-none tracking-tight">
|
|
56
|
+
<h5 id="icon-h5-title" className="mb-1 font-medium leading-none tracking-tight">
|
|
56
57
|
{title}
|
|
57
58
|
</h5>
|
|
58
59
|
)}
|
|
59
60
|
{children && (
|
|
60
|
-
<div className={cn("text-sm", variant === "default" && "text-foreground-secondary")}>
|
|
61
|
+
<div data-sonance-name="alert" className={cn("text-sm", variant === "default" && "text-foreground-secondary")}>
|
|
61
62
|
{children}
|
|
62
63
|
</div>
|
|
63
64
|
)}
|
|
@@ -68,7 +69,7 @@ export const Alert = forwardRef<HTMLDivElement, AlertProps>(
|
|
|
68
69
|
className="shrink-0 rounded-sm p-1 opacity-70 transition-opacity hover:opacity-100"
|
|
69
70
|
>
|
|
70
71
|
<X className="h-4 w-4" />
|
|
71
|
-
<span className="sr-only">Close</span>
|
|
72
|
+
<span id="icon-span-close" className="sr-only">Close</span>
|
|
72
73
|
</button>
|
|
73
74
|
)}
|
|
74
75
|
</div>
|
|
@@ -18,6 +18,7 @@ export const Default: Story = {
|
|
|
18
18
|
<div className="w-[450px]">
|
|
19
19
|
<AspectRatio ratio={16 / 9} className="bg-secondary-hover rounded-sm overflow-hidden">
|
|
20
20
|
<img
|
|
21
|
+
id="default-photo-by-drew-beamer"
|
|
21
22
|
src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800&dpr=2&q=80"
|
|
22
23
|
alt="Photo by Drew Beamer"
|
|
23
24
|
className="h-full w-full object-cover"
|
|
@@ -32,6 +33,7 @@ export const Square: Story = {
|
|
|
32
33
|
<div className="w-[300px]">
|
|
33
34
|
<AspectRatio ratio={1} className="bg-secondary-hover rounded-sm overflow-hidden">
|
|
34
35
|
<img
|
|
36
|
+
id="square-photo-by-drew-beamer"
|
|
35
37
|
src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800&dpr=2&q=80"
|
|
36
38
|
alt="Photo by Drew Beamer"
|
|
37
39
|
className="h-full w-full object-cover"
|
|
@@ -46,6 +48,7 @@ export const Portrait: Story = {
|
|
|
46
48
|
<div className="w-[250px]">
|
|
47
49
|
<AspectRatio ratio={3 / 4} className="bg-secondary-hover rounded-sm overflow-hidden">
|
|
48
50
|
<img
|
|
51
|
+
id="portrait-photo-by-drew-beamer"
|
|
49
52
|
src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800&dpr=2&q=80"
|
|
50
53
|
alt="Photo by Drew Beamer"
|
|
51
54
|
className="h-full w-full object-cover"
|
|
@@ -59,7 +62,7 @@ export const WithPlaceholder: Story = {
|
|
|
59
62
|
render: () => (
|
|
60
63
|
<div className="w-[450px]">
|
|
61
64
|
<AspectRatio ratio={16 / 9} className="bg-secondary-hover rounded-sm flex items-center justify-center">
|
|
62
|
-
<span className="text-foreground-muted text-sm">16:9 Aspect Ratio</span>
|
|
65
|
+
<span id="with-placeholder-span-169-aspect-ratio" className="text-foreground-muted text-sm">16:9 Aspect Ratio</span>
|
|
63
66
|
</AspectRatio>
|
|
64
67
|
</div>
|
|
65
68
|
),
|
|
@@ -149,7 +149,7 @@ export const AllowCustomValue: Story = {
|
|
|
149
149
|
render: () => {
|
|
150
150
|
const [value, setValue] = useState('');
|
|
151
151
|
return (
|
|
152
|
-
<div className="w-80 space-y-4">
|
|
152
|
+
<div data-sonance-name="autocomplete.stories" className="w-80 space-y-4">
|
|
153
153
|
<Autocomplete
|
|
154
154
|
label="Product or Custom Entry"
|
|
155
155
|
options={productOptions}
|
|
@@ -157,7 +157,7 @@ export const AllowCustomValue: Story = {
|
|
|
157
157
|
allowCustomValue
|
|
158
158
|
onValueChange={setValue}
|
|
159
159
|
/>
|
|
160
|
-
<p className="text-sm text-foreground-muted">
|
|
160
|
+
<p id="allow-custom-value-p-selected-value-none" className="text-sm text-foreground-muted">
|
|
161
161
|
Selected: {value || 'None'}
|
|
162
162
|
</p>
|
|
163
163
|
</div>
|
|
@@ -181,8 +181,8 @@ export const ControlledExample: Story = {
|
|
|
181
181
|
placeholder="Search products..."
|
|
182
182
|
/>
|
|
183
183
|
<div className="text-sm text-foreground-muted space-y-1">
|
|
184
|
-
<p>Selected value: {value || 'None'}</p>
|
|
185
|
-
<p>Input text: {input || 'Empty'}</p>
|
|
184
|
+
<p id="controlled-example-p-selected-value-value">Selected value: {value || 'None'}</p>
|
|
185
|
+
<p id="controlled-example-p-input-text-input-emp">Input text: {input || 'Empty'}</p>
|
|
186
186
|
</div>
|
|
187
187
|
<button
|
|
188
188
|
onClick={() => setValue('')}
|
|
@@ -226,11 +226,11 @@ export const StateMatrix: Story = {
|
|
|
226
226
|
const states: AutocompleteState[] = ['default', 'hover', 'focus', 'open', 'error', 'disabled'];
|
|
227
227
|
return (
|
|
228
228
|
<div className="space-y-6 w-80">
|
|
229
|
-
<h3 className="text-sm font-medium text-foreground-muted">Autocomplete States</h3>
|
|
229
|
+
<h3 id="state-matrix-h3-autocomplete-states" className="text-sm font-medium text-foreground-muted">Autocomplete States</h3>
|
|
230
230
|
<div className="grid grid-cols-1 gap-4">
|
|
231
231
|
{states.map((state) => (
|
|
232
232
|
<div key={state} className="flex items-center gap-4">
|
|
233
|
-
<span className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
|
|
233
|
+
<span id="state-matrix-span-state" className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
|
|
234
234
|
<Autocomplete
|
|
235
235
|
state={state}
|
|
236
236
|
options={productOptions}
|
|
@@ -251,7 +251,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
251
251
|
<div className="space-y-8">
|
|
252
252
|
{/* Mobile */}
|
|
253
253
|
<div>
|
|
254
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
254
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
255
255
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
256
256
|
<Autocomplete
|
|
257
257
|
label="Product"
|
|
@@ -262,7 +262,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
262
262
|
</div>
|
|
263
263
|
{/* Tablet */}
|
|
264
264
|
<div>
|
|
265
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
265
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
266
266
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
267
267
|
<div className="grid grid-cols-2 gap-4">
|
|
268
268
|
<Autocomplete
|
|
@@ -280,7 +280,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
280
280
|
</div>
|
|
281
281
|
{/* Desktop */}
|
|
282
282
|
<div>
|
|
283
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
283
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
284
284
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
285
285
|
<div className="grid grid-cols-3 gap-4">
|
|
286
286
|
<Autocomplete
|
|
@@ -173,7 +173,7 @@ export function Autocomplete({
|
|
|
173
173
|
}, [selectedOption]);
|
|
174
174
|
|
|
175
175
|
return (
|
|
176
|
-
<div ref={containerRef} className={cn("w-full", className)}>
|
|
176
|
+
<div data-sonance-name="autocomplete" ref={containerRef} className={cn("w-full", className)}>
|
|
177
177
|
{label && (
|
|
178
178
|
<label className="mb-2 block text-xs font-medium uppercase tracking-widest text-foreground-muted">
|
|
179
179
|
{label}
|
|
@@ -248,7 +248,7 @@ export function Autocomplete({
|
|
|
248
248
|
<div>
|
|
249
249
|
<div className="text-sm">{option.label}</div>
|
|
250
250
|
{option.description && (
|
|
251
|
-
<div className={cn(
|
|
251
|
+
<div data-sonance-name="autocomplete" className={cn(
|
|
252
252
|
"text-xs mt-0.5",
|
|
253
253
|
option.value === value ? "text-primary-foreground/70" : "text-foreground-muted"
|
|
254
254
|
)}>
|
|
@@ -263,7 +263,7 @@ export function Autocomplete({
|
|
|
263
263
|
</div>
|
|
264
264
|
)}
|
|
265
265
|
</div>
|
|
266
|
-
{error && <p className="mt-1 text-sm text-error">{error}</p>}
|
|
266
|
+
{error && <p id="p-error" className="mt-1 text-sm text-error">{error}</p>}
|
|
267
267
|
</div>
|
|
268
268
|
);
|
|
269
269
|
}
|
|
@@ -115,20 +115,20 @@ export const ResponsiveMatrix: Story = {
|
|
|
115
115
|
<div className="space-y-8">
|
|
116
116
|
{/* Mobile */}
|
|
117
117
|
<div>
|
|
118
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
118
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
119
119
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
120
120
|
<div className="flex items-center gap-4">
|
|
121
121
|
<Avatar size="md" src="https://i.pravatar.cc/150?img=1" />
|
|
122
122
|
<div>
|
|
123
|
-
<p className="text-sm font-medium">John Doe</p>
|
|
124
|
-
<p className="text-xs text-foreground-muted">john@example.com</p>
|
|
123
|
+
<p id="responsive-matrix-p-john-doe" className="text-sm font-medium">John Doe</p>
|
|
124
|
+
<p id="responsive-matrix-p-johnexamplecom" className="text-xs text-foreground-muted">john@example.com</p>
|
|
125
125
|
</div>
|
|
126
126
|
</div>
|
|
127
127
|
</div>
|
|
128
128
|
</div>
|
|
129
129
|
{/* Tablet */}
|
|
130
130
|
<div>
|
|
131
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
131
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
132
132
|
<div className="w-[768px] border border-dashed border-border p-4 flex justify-between items-center">
|
|
133
133
|
<div className="flex items-end gap-4">
|
|
134
134
|
<Avatar size="sm" fallback="SM" />
|
|
@@ -146,7 +146,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
146
146
|
</div>
|
|
147
147
|
{/* Desktop */}
|
|
148
148
|
<div>
|
|
149
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
149
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
150
150
|
<div className="w-[1280px] border border-dashed border-border p-4 flex justify-between items-center">
|
|
151
151
|
<div className="flex items-end gap-4">
|
|
152
152
|
<Avatar size="xs" fallback="XS" />
|
|
@@ -63,7 +63,7 @@ const Avatar = React.forwardRef<
|
|
|
63
63
|
<AvatarImage src={src} alt={alt} />
|
|
64
64
|
<AvatarFallback>
|
|
65
65
|
{initials ? (
|
|
66
|
-
<span className="font-medium text-foreground-muted">{initials}</span>
|
|
66
|
+
<span id="avatar-span-initials" className="font-medium text-foreground-muted">{initials}</span>
|
|
67
67
|
) : (
|
|
68
68
|
<User className="h-1/2 w-1/2 text-foreground-muted" />
|
|
69
69
|
)}
|
|
@@ -126,20 +126,20 @@ function AvatarGroup({ children, max, size = "md", className }: AvatarGroupProps
|
|
|
126
126
|
const excess = max ? Math.max(0, avatars.length - max) : 0;
|
|
127
127
|
|
|
128
128
|
return (
|
|
129
|
-
<div className={cn("flex -space-x-2", className)}>
|
|
129
|
+
<div data-sonance-name="avatar" className={cn("flex -space-x-2", className)}>
|
|
130
130
|
{displayAvatars.map((avatar, index) => (
|
|
131
131
|
<div key={index} className="ring-2 ring-background rounded-full">
|
|
132
132
|
{avatar}
|
|
133
133
|
</div>
|
|
134
134
|
))}
|
|
135
135
|
{excess > 0 && (
|
|
136
|
-
<div
|
|
136
|
+
<div data-sonance-name="avatar"
|
|
137
137
|
className={cn(
|
|
138
138
|
avatarVariants({ size, shape: "circle" }),
|
|
139
139
|
"ring-2 ring-background bg-background-tertiary"
|
|
140
140
|
)}
|
|
141
141
|
>
|
|
142
|
-
<span className="text-xs font-medium text-foreground-muted">+{excess}</span>
|
|
142
|
+
<span id="avatar-group-span-excess" className="text-xs font-medium text-foreground-muted">+{excess}</span>
|
|
143
143
|
</div>
|
|
144
144
|
)}
|
|
145
145
|
</div>
|
|
@@ -129,19 +129,19 @@ export const StatusExamples: Story = {
|
|
|
129
129
|
<div className="space-y-4">
|
|
130
130
|
<div className="flex items-center gap-2">
|
|
131
131
|
<Badge variant="success">Active</Badge>
|
|
132
|
-
<span className="text-foreground-secondary">User account is active</span>
|
|
132
|
+
<span id="status-examples-span-user-account-is-acti" className="text-foreground-secondary">User account is active</span>
|
|
133
133
|
</div>
|
|
134
134
|
<div className="flex items-center gap-2">
|
|
135
135
|
<Badge variant="warning">Pending</Badge>
|
|
136
|
-
<span className="text-foreground-secondary">Awaiting approval</span>
|
|
136
|
+
<span id="status-examples-span-awaiting-approval" className="text-foreground-secondary">Awaiting approval</span>
|
|
137
137
|
</div>
|
|
138
138
|
<div className="flex items-center gap-2">
|
|
139
139
|
<Badge variant="error">Suspended</Badge>
|
|
140
|
-
<span className="text-foreground-secondary">Account suspended</span>
|
|
140
|
+
<span id="status-examples-span-account-suspended" className="text-foreground-secondary">Account suspended</span>
|
|
141
141
|
</div>
|
|
142
142
|
<div className="flex items-center gap-2">
|
|
143
143
|
<Badge variant="info">New</Badge>
|
|
144
|
-
<span className="text-foreground-secondary">Recently added</span>
|
|
144
|
+
<span id="status-examples-span-recently-added" className="text-foreground-secondary">Recently added</span>
|
|
145
145
|
</div>
|
|
146
146
|
</div>
|
|
147
147
|
),
|
|
@@ -180,15 +180,15 @@ export const CountBadges: Story = {
|
|
|
180
180
|
render: () => (
|
|
181
181
|
<div className="flex items-center gap-6">
|
|
182
182
|
<div className="relative">
|
|
183
|
-
<span className="text-foreground">Notifications</span>
|
|
183
|
+
<span id="count-badges-span-notifications" className="text-foreground">Notifications</span>
|
|
184
184
|
<Badge variant="error" size="sm" className="absolute -top-2 -right-6">3</Badge>
|
|
185
185
|
</div>
|
|
186
186
|
<div className="relative">
|
|
187
|
-
<span className="text-foreground">Messages</span>
|
|
187
|
+
<span id="count-badges-span-messages" className="text-foreground">Messages</span>
|
|
188
188
|
<Badge variant="primary" size="sm" className="absolute -top-2 -right-6">12</Badge>
|
|
189
189
|
</div>
|
|
190
190
|
<div className="relative">
|
|
191
|
-
<span className="text-foreground">Cart</span>
|
|
191
|
+
<span id="count-badges-span-cart" className="text-foreground">Cart</span>
|
|
192
192
|
<Badge variant="info" size="sm" className="absolute -top-2 -right-4">5</Badge>
|
|
193
193
|
</div>
|
|
194
194
|
</div>
|
|
@@ -201,7 +201,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
201
201
|
<div className="space-y-8">
|
|
202
202
|
{/* Mobile */}
|
|
203
203
|
<div>
|
|
204
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
204
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
205
205
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
206
206
|
<div className="flex flex-wrap gap-2">
|
|
207
207
|
<Badge variant="primary">Primary</Badge>
|
|
@@ -214,7 +214,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
214
214
|
</div>
|
|
215
215
|
{/* Tablet */}
|
|
216
216
|
<div>
|
|
217
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
217
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
218
218
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
219
219
|
<div className="flex items-center gap-4">
|
|
220
220
|
<div className="flex gap-2">
|
|
@@ -232,7 +232,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
232
232
|
</div>
|
|
233
233
|
{/* Desktop */}
|
|
234
234
|
<div>
|
|
235
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
235
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
236
236
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
237
237
|
<div className="flex items-center justify-between">
|
|
238
238
|
<div className="flex gap-2">
|
|
@@ -34,7 +34,7 @@ interface BadgeProps
|
|
|
34
34
|
|
|
35
35
|
export function Badge({ className, variant, size, ...props }: BadgeProps) {
|
|
36
36
|
return (
|
|
37
|
-
<span className={cn(badgeVariants({ variant, size }), className)} {...props} />
|
|
37
|
+
<span id="badge-span" data-sonance-name="badge" className={cn(badgeVariants({ variant, size }), className)} {...props} />
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -45,7 +45,7 @@ interface ChipProps extends BadgeProps {
|
|
|
45
45
|
|
|
46
46
|
export function Chip({ className, variant, size, onClose, children, ...props }: ChipProps) {
|
|
47
47
|
return (
|
|
48
|
-
<span className={cn(badgeVariants({ variant, size }), "gap-1", className)} {...props}>
|
|
48
|
+
<span id="chip-span" className={cn(badgeVariants({ variant, size }), "gap-1", className)} data-sonance-name="badge" {...props}>
|
|
49
49
|
{children}
|
|
50
50
|
{onClose && (
|
|
51
51
|
<button
|
|
@@ -55,7 +55,7 @@ export function Chip({ className, variant, size, onClose, children, ...props }:
|
|
|
55
55
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
56
56
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
57
57
|
</svg>
|
|
58
|
-
<span className="sr-only">Remove</span>
|
|
58
|
+
<span id="chip-span-remove" className="sr-only">Remove</span>
|
|
59
59
|
</button>
|
|
60
60
|
)}
|
|
61
61
|
</span>
|