sonance-brand-mcp 1.3.1 → 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 +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 +1776 -7
- package/package.json +1 -1
|
@@ -150,7 +150,7 @@ const MenubarCheckboxItem = React.forwardRef<
|
|
|
150
150
|
checked={checked}
|
|
151
151
|
{...props}
|
|
152
152
|
>
|
|
153
|
-
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
153
|
+
<span id="menubar-checkbox-item-span" className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
154
154
|
<MenubarPrimitive.ItemIndicator>
|
|
155
155
|
<Check className="h-4 w-4" />
|
|
156
156
|
</MenubarPrimitive.ItemIndicator>
|
|
@@ -174,7 +174,7 @@ const MenubarRadioItem = React.forwardRef<
|
|
|
174
174
|
)}
|
|
175
175
|
{...props}
|
|
176
176
|
>
|
|
177
|
-
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
177
|
+
<span id="menubar-radio-item-span" className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
178
178
|
<MenubarPrimitive.ItemIndicator>
|
|
179
179
|
<Circle className="h-2 w-2 fill-current" />
|
|
180
180
|
</MenubarPrimitive.ItemIndicator>
|
|
@@ -219,11 +219,7 @@ const MenubarShortcut = ({
|
|
|
219
219
|
...props
|
|
220
220
|
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
221
221
|
return (
|
|
222
|
-
<span
|
|
223
|
-
className={cn(
|
|
224
|
-
"ml-auto text-xs tracking-widest text-foreground-muted",
|
|
225
|
-
className
|
|
226
|
-
)}
|
|
222
|
+
<span id="menubar-shortcut-span" data-sonance-name="menubar"
|
|
227
223
|
{...props}
|
|
228
224
|
/>
|
|
229
225
|
);
|
|
@@ -39,7 +39,7 @@ export const Default: Story = {
|
|
|
39
39
|
<Navbar>
|
|
40
40
|
<NavbarContent>
|
|
41
41
|
<NavbarBrand>
|
|
42
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
42
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
43
43
|
</NavbarBrand>
|
|
44
44
|
<NavbarItems>
|
|
45
45
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
@@ -47,7 +47,7 @@ export const Default: Story = {
|
|
|
47
47
|
<NavbarItem href="#">About</NavbarItem>
|
|
48
48
|
<NavbarItem href="#">Contact</NavbarItem>
|
|
49
49
|
</NavbarItems>
|
|
50
|
-
<Button size="sm">Sign In</Button>
|
|
50
|
+
<Button id="nav-button" size="sm">Sign In</Button>
|
|
51
51
|
</NavbarContent>
|
|
52
52
|
</Navbar>
|
|
53
53
|
),
|
|
@@ -58,14 +58,14 @@ export const Dark: Story = {
|
|
|
58
58
|
<Navbar variant="dark">
|
|
59
59
|
<NavbarContent>
|
|
60
60
|
<NavbarBrand>
|
|
61
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
61
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
62
62
|
</NavbarBrand>
|
|
63
63
|
<NavbarItems>
|
|
64
64
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
65
65
|
<NavbarItem href="#">Products</NavbarItem>
|
|
66
66
|
<NavbarItem href="#">About</NavbarItem>
|
|
67
67
|
</NavbarItems>
|
|
68
|
-
<Button size="sm" variant="inverted">Sign In</Button>
|
|
68
|
+
<Button id="nav-button-inverted" size="sm" variant="inverted">Sign In</Button>
|
|
69
69
|
</NavbarContent>
|
|
70
70
|
</Navbar>
|
|
71
71
|
),
|
|
@@ -77,14 +77,14 @@ export const Transparent: Story = {
|
|
|
77
77
|
<Navbar variant="transparent" className="text-white">
|
|
78
78
|
<NavbarContent>
|
|
79
79
|
<NavbarBrand>
|
|
80
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
80
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
81
81
|
</NavbarBrand>
|
|
82
82
|
<NavbarItems>
|
|
83
83
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
84
84
|
<NavbarItem href="#">Products</NavbarItem>
|
|
85
85
|
<NavbarItem href="#">About</NavbarItem>
|
|
86
86
|
</NavbarItems>
|
|
87
|
-
<Button size="sm" variant="inverted">Sign In</Button>
|
|
87
|
+
<Button id="nav-button-inverted" size="sm" variant="inverted">Sign In</Button>
|
|
88
88
|
</NavbarContent>
|
|
89
89
|
</Navbar>
|
|
90
90
|
</div>
|
|
@@ -97,18 +97,18 @@ export const Blur: Story = {
|
|
|
97
97
|
<Navbar variant="blur">
|
|
98
98
|
<NavbarContent>
|
|
99
99
|
<NavbarBrand>
|
|
100
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
100
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
101
101
|
</NavbarBrand>
|
|
102
102
|
<NavbarItems>
|
|
103
103
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
104
104
|
<NavbarItem href="#">Products</NavbarItem>
|
|
105
105
|
<NavbarItem href="#">About</NavbarItem>
|
|
106
106
|
</NavbarItems>
|
|
107
|
-
<Button size="sm">Sign In</Button>
|
|
107
|
+
<Button id="nav-button" size="sm">Sign In</Button>
|
|
108
108
|
</NavbarContent>
|
|
109
109
|
</Navbar>
|
|
110
110
|
<div className="p-8 text-white">
|
|
111
|
-
<p>Content behind the blurred navbar</p>
|
|
111
|
+
<p id="nav-p-content-behind-the-b">Content behind the blurred navbar</p>
|
|
112
112
|
</div>
|
|
113
113
|
</div>
|
|
114
114
|
),
|
|
@@ -117,14 +117,14 @@ export const Blur: Story = {
|
|
|
117
117
|
export const Responsive: Story = {
|
|
118
118
|
render: () => (
|
|
119
119
|
<ResponsiveNavbar
|
|
120
|
-
brand={<span className="text-xl font-semibold">Sonance</span>}
|
|
120
|
+
brand={<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>}
|
|
121
121
|
items={[
|
|
122
122
|
{ label: 'Home', href: '#', active: true },
|
|
123
123
|
{ label: 'Products', href: '#' },
|
|
124
124
|
{ label: 'About', href: '#' },
|
|
125
125
|
{ label: 'Contact', href: '#' },
|
|
126
126
|
]}
|
|
127
|
-
actions={<Button size="sm">Sign In</Button>}
|
|
127
|
+
actions={<Button id="responsive-button" size="sm">Sign In</Button>}
|
|
128
128
|
/>
|
|
129
129
|
),
|
|
130
130
|
};
|
|
@@ -135,7 +135,7 @@ export const WithLogo: Story = {
|
|
|
135
135
|
<NavbarContent>
|
|
136
136
|
<NavbarBrand>
|
|
137
137
|
<div className="w-8 h-8 bg-primary rounded" />
|
|
138
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
138
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
139
139
|
</NavbarBrand>
|
|
140
140
|
<NavbarItems>
|
|
141
141
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
@@ -143,8 +143,8 @@ export const WithLogo: Story = {
|
|
|
143
143
|
<NavbarItem href="#">Support</NavbarItem>
|
|
144
144
|
</NavbarItems>
|
|
145
145
|
<div className="flex items-center gap-2">
|
|
146
|
-
<Button size="sm" variant="ghost">Log In</Button>
|
|
147
|
-
<Button size="sm">Sign Up</Button>
|
|
146
|
+
<Button id="nav-button-ghost" size="sm" variant="ghost">Log In</Button>
|
|
147
|
+
<Button id="nav-button" size="sm">Sign Up</Button>
|
|
148
148
|
</div>
|
|
149
149
|
</NavbarContent>
|
|
150
150
|
</Navbar>
|
|
@@ -157,46 +157,46 @@ export const ResponsiveMatrix: Story = {
|
|
|
157
157
|
<div className="space-y-8">
|
|
158
158
|
{/* Mobile */}
|
|
159
159
|
<div>
|
|
160
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
160
|
+
<h4 id="nav-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
161
161
|
<div className="w-[375px] border border-dashed border-border overflow-hidden">
|
|
162
162
|
<ResponsiveNavbar
|
|
163
|
-
brand={<span className="text-lg font-semibold">Sonance</span>}
|
|
163
|
+
brand={<span id="responsive-matrix-span-sonance" className="text-lg font-semibold">Sonance</span>}
|
|
164
164
|
items={[
|
|
165
165
|
{ label: 'Home', href: '#', active: true },
|
|
166
166
|
{ label: 'Products', href: '#' },
|
|
167
167
|
{ label: 'About', href: '#' },
|
|
168
168
|
]}
|
|
169
|
-
actions={<Button size="sm">Sign In</Button>}
|
|
169
|
+
actions={<Button id="responsive-matrix-button" size="sm">Sign In</Button>}
|
|
170
170
|
/>
|
|
171
171
|
</div>
|
|
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 overflow-hidden">
|
|
177
177
|
<Navbar>
|
|
178
178
|
<NavbarContent>
|
|
179
179
|
<NavbarBrand>
|
|
180
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
180
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
181
181
|
</NavbarBrand>
|
|
182
182
|
<NavbarItems>
|
|
183
183
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
184
184
|
<NavbarItem href="#">Products</NavbarItem>
|
|
185
185
|
<NavbarItem href="#">About</NavbarItem>
|
|
186
186
|
</NavbarItems>
|
|
187
|
-
<Button size="sm">Sign In</Button>
|
|
187
|
+
<Button id="nav-button" size="sm">Sign In</Button>
|
|
188
188
|
</NavbarContent>
|
|
189
189
|
</Navbar>
|
|
190
190
|
</div>
|
|
191
191
|
</div>
|
|
192
192
|
{/* Desktop */}
|
|
193
193
|
<div>
|
|
194
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
194
|
+
<h4 id="nav-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
195
195
|
<div className="w-[1280px] border border-dashed border-border overflow-hidden">
|
|
196
196
|
<Navbar>
|
|
197
197
|
<NavbarContent>
|
|
198
198
|
<NavbarBrand>
|
|
199
|
-
<span className="text-xl font-semibold">Sonance</span>
|
|
199
|
+
<span id="nav-span-sonance" className="text-xl font-semibold">Sonance</span>
|
|
200
200
|
</NavbarBrand>
|
|
201
201
|
<NavbarItems>
|
|
202
202
|
<NavbarItem href="#" active>Home</NavbarItem>
|
|
@@ -206,8 +206,8 @@ export const ResponsiveMatrix: Story = {
|
|
|
206
206
|
<NavbarItem href="#">Contact</NavbarItem>
|
|
207
207
|
</NavbarItems>
|
|
208
208
|
<div className="flex items-center gap-2">
|
|
209
|
-
<Button size="sm" variant="ghost">Log In</Button>
|
|
210
|
-
<Button size="sm">Sign Up</Button>
|
|
209
|
+
<Button id="nav-button-ghost" size="sm" variant="ghost">Log In</Button>
|
|
210
|
+
<Button id="nav-button" size="sm">Sign Up</Button>
|
|
211
211
|
</div>
|
|
212
212
|
</NavbarContent>
|
|
213
213
|
</Navbar>
|
|
@@ -20,15 +20,7 @@ export const Navbar = forwardRef<HTMLElement, NavbarProps>(
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
return (
|
|
23
|
-
<nav
|
|
24
|
-
ref={ref}
|
|
25
|
-
className={cn(
|
|
26
|
-
"w-full px-6 py-4",
|
|
27
|
-
variantClasses[variant],
|
|
28
|
-
sticky && "sticky top-0 z-40",
|
|
29
|
-
bordered && variant !== "dark" && variant !== "transparent" && "border-b border-border",
|
|
30
|
-
className
|
|
31
|
-
)}
|
|
23
|
+
<nav data-sonance-name="navbar"
|
|
32
24
|
{...props}
|
|
33
25
|
>
|
|
34
26
|
{children}
|
|
@@ -53,7 +45,7 @@ export const NavbarContent = forwardRef<
|
|
|
53
45
|
return (
|
|
54
46
|
<div
|
|
55
47
|
ref={ref}
|
|
56
|
-
className={cn("flex items-center gap-6", justifyClasses[justify], className)}
|
|
48
|
+
className={cn("flex items-center gap-6", justifyClasses[justify], className)} data-sonance-name="navbar"
|
|
57
49
|
{...props}
|
|
58
50
|
/>
|
|
59
51
|
);
|
|
@@ -67,7 +59,7 @@ export const NavbarBrand = forwardRef<
|
|
|
67
59
|
>(({ className, ...props }, ref) => (
|
|
68
60
|
<div
|
|
69
61
|
ref={ref}
|
|
70
|
-
className={cn("flex items-center gap-2 shrink-0", className)}
|
|
62
|
+
className={cn("flex items-center gap-2 shrink-0", className)} data-sonance-name="navbar"
|
|
71
63
|
{...props}
|
|
72
64
|
/>
|
|
73
65
|
));
|
|
@@ -80,7 +72,7 @@ export const NavbarItems = forwardRef<
|
|
|
80
72
|
>(({ className, ...props }, ref) => (
|
|
81
73
|
<div
|
|
82
74
|
ref={ref}
|
|
83
|
-
className={cn("hidden md:flex items-center gap-6", className)}
|
|
75
|
+
className={cn("hidden md:flex items-center gap-6", className)} data-sonance-name="navbar"
|
|
84
76
|
{...props}
|
|
85
77
|
/>
|
|
86
78
|
));
|
|
@@ -94,12 +86,13 @@ interface NavbarItemProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>
|
|
|
94
86
|
export const NavbarItem = forwardRef<HTMLAnchorElement, NavbarItemProps>(
|
|
95
87
|
({ className, active, ...props }, ref) => (
|
|
96
88
|
<a
|
|
89
|
+
id="navbar-item-a"
|
|
97
90
|
ref={ref}
|
|
98
91
|
className={cn(
|
|
99
92
|
"text-sm font-normal transition-opacity",
|
|
100
93
|
active ? "opacity-100 font-medium" : "opacity-85 hover:opacity-100",
|
|
101
94
|
className
|
|
102
|
-
)}
|
|
95
|
+
)} data-sonance-name="navbar"
|
|
103
96
|
{...props}
|
|
104
97
|
/>
|
|
105
98
|
)
|
|
@@ -116,7 +109,7 @@ interface NavbarMobileToggleProps {
|
|
|
116
109
|
|
|
117
110
|
export function NavbarMobileToggle({ isOpen, onToggle, className }: NavbarMobileToggleProps) {
|
|
118
111
|
return (
|
|
119
|
-
<button
|
|
112
|
+
<button data-sonance-name="navbar"
|
|
120
113
|
type="button"
|
|
121
114
|
onClick={onToggle}
|
|
122
115
|
className={cn("md:hidden p-2 -m-2", className)}
|
|
@@ -193,6 +186,7 @@ export function ResponsiveNavbar({
|
|
|
193
186
|
<NavbarMobileMenu isOpen={mobileMenuOpen}>
|
|
194
187
|
{items.map((item) => (
|
|
195
188
|
<a
|
|
189
|
+
id="nav-a"
|
|
196
190
|
key={item.href}
|
|
197
191
|
href={item.href}
|
|
198
192
|
className={cn(
|
|
@@ -69,15 +69,16 @@ const ListItem = React.forwardRef<
|
|
|
69
69
|
<li>
|
|
70
70
|
<NavigationMenuLink asChild>
|
|
71
71
|
<a
|
|
72
|
+
id="nav-a"
|
|
72
73
|
ref={ref}
|
|
73
74
|
className={cn(
|
|
74
75
|
"block select-none space-y-1 rounded-sm p-3 leading-none no-underline outline-none transition-colors hover:bg-secondary-hover hover:text-foreground focus:bg-secondary-hover focus:text-foreground",
|
|
75
76
|
className
|
|
76
|
-
)}
|
|
77
|
+
)} data-sonance-name="navigation-menu.stories"
|
|
77
78
|
{...props}
|
|
78
79
|
>
|
|
79
80
|
<div className="text-sm font-medium leading-none">{title}</div>
|
|
80
|
-
<p className="line-clamp-2 text-sm leading-snug text-foreground-muted">
|
|
81
|
+
<p id="nav-p-children" className="line-clamp-2 text-sm leading-snug text-foreground-muted">
|
|
81
82
|
{children}
|
|
82
83
|
</p>
|
|
83
84
|
</a>
|
|
@@ -98,13 +99,14 @@ export const Default: Story = {
|
|
|
98
99
|
<li className="row-span-3">
|
|
99
100
|
<NavigationMenuLink asChild>
|
|
100
101
|
<a
|
|
102
|
+
id="nav-a"
|
|
101
103
|
className="flex h-full w-full select-none flex-col justify-end rounded-sm bg-gradient-to-b from-secondary-hover/50 to-secondary-hover p-6 no-underline outline-none focus:shadow-md"
|
|
102
104
|
href="#"
|
|
103
105
|
>
|
|
104
106
|
<div className="mb-2 mt-4 text-lg font-medium">
|
|
105
107
|
Sonance
|
|
106
108
|
</div>
|
|
107
|
-
<p className="text-sm leading-tight text-foreground-muted">
|
|
109
|
+
<p id="nav-p-premium-architectura" className="text-sm leading-tight text-foreground-muted">
|
|
108
110
|
Premium architectural speakers and outdoor audio solutions.
|
|
109
111
|
</p>
|
|
110
112
|
</a>
|
|
@@ -139,7 +141,7 @@ export const Default: Story = {
|
|
|
139
141
|
</NavigationMenuContent>
|
|
140
142
|
</NavigationMenuItem>
|
|
141
143
|
<NavigationMenuItem>
|
|
142
|
-
<a href="#">
|
|
144
|
+
<a id="nav-a" href="#">
|
|
143
145
|
<NavigationMenuLink className={navigationMenuTriggerStyle()}>
|
|
144
146
|
Documentation
|
|
145
147
|
</NavigationMenuLink>
|
|
@@ -155,28 +157,28 @@ export const Simple: Story = {
|
|
|
155
157
|
<NavigationMenu>
|
|
156
158
|
<NavigationMenuList>
|
|
157
159
|
<NavigationMenuItem>
|
|
158
|
-
<a href="#">
|
|
160
|
+
<a id="nav-a" href="#">
|
|
159
161
|
<NavigationMenuLink className={navigationMenuTriggerStyle()}>
|
|
160
162
|
Products
|
|
161
163
|
</NavigationMenuLink>
|
|
162
164
|
</a>
|
|
163
165
|
</NavigationMenuItem>
|
|
164
166
|
<NavigationMenuItem>
|
|
165
|
-
<a href="#">
|
|
167
|
+
<a id="nav-a" href="#">
|
|
166
168
|
<NavigationMenuLink className={navigationMenuTriggerStyle()}>
|
|
167
169
|
Solutions
|
|
168
170
|
</NavigationMenuLink>
|
|
169
171
|
</a>
|
|
170
172
|
</NavigationMenuItem>
|
|
171
173
|
<NavigationMenuItem>
|
|
172
|
-
<a href="#">
|
|
174
|
+
<a id="nav-a" href="#">
|
|
173
175
|
<NavigationMenuLink className={navigationMenuTriggerStyle()}>
|
|
174
176
|
Support
|
|
175
177
|
</NavigationMenuLink>
|
|
176
178
|
</a>
|
|
177
179
|
</NavigationMenuItem>
|
|
178
180
|
<NavigationMenuItem>
|
|
179
|
-
<a href="#">
|
|
181
|
+
<a id="nav-a" href="#">
|
|
180
182
|
<NavigationMenuLink className={navigationMenuTriggerStyle()}>
|
|
181
183
|
About
|
|
182
184
|
</NavigationMenuLink>
|
|
@@ -224,7 +226,7 @@ export const ProductsMenu: Story = {
|
|
|
224
226
|
</NavigationMenuContent>
|
|
225
227
|
</NavigationMenuItem>
|
|
226
228
|
<NavigationMenuItem>
|
|
227
|
-
<a href="#">
|
|
229
|
+
<a id="nav-a" href="#">
|
|
228
230
|
<NavigationMenuLink className={navigationMenuTriggerStyle()}>
|
|
229
231
|
View All
|
|
230
232
|
</NavigationMenuLink>
|
|
@@ -84,7 +84,7 @@ const NavigationMenuViewport = React.forwardRef<
|
|
|
84
84
|
React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
|
|
85
85
|
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>
|
|
86
86
|
>(({ className, ...props }, ref) => (
|
|
87
|
-
<div className={cn("absolute left-0 top-full flex justify-center")}>
|
|
87
|
+
<div data-sonance-name="navigation-menu" className={cn("absolute left-0 top-full flex justify-center")}>
|
|
88
88
|
<NavigationMenuPrimitive.Viewport
|
|
89
89
|
className={cn(
|
|
90
90
|
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-sm border border-border bg-card text-foreground shadow-lg",
|
|
@@ -157,7 +157,7 @@ export const Controlled: Story = {
|
|
|
157
157
|
render: () => {
|
|
158
158
|
const [value, setValue] = useState(10);
|
|
159
159
|
return (
|
|
160
|
-
<div className="w-48 space-y-4">
|
|
160
|
+
<div data-sonance-name="number-input.stories" className="w-48 space-y-4">
|
|
161
161
|
<NumberInput
|
|
162
162
|
label="Controlled Input"
|
|
163
163
|
value={value}
|
|
@@ -165,7 +165,7 @@ export const Controlled: Story = {
|
|
|
165
165
|
min={0}
|
|
166
166
|
max={20}
|
|
167
167
|
/>
|
|
168
|
-
<p className="text-sm text-foreground-muted">
|
|
168
|
+
<p id="controlled-p-current-value-value" className="text-sm text-foreground-muted">
|
|
169
169
|
Current value: {value}
|
|
170
170
|
</p>
|
|
171
171
|
<div className="flex gap-2">
|
|
@@ -211,8 +211,8 @@ export const QuantitySelector: Story = {
|
|
|
211
211
|
|
|
212
212
|
return (
|
|
213
213
|
<div className="p-4 border border-border w-80">
|
|
214
|
-
<h3 className="font-medium text-foreground">VP66 TL In-Wall Speaker</h3>
|
|
215
|
-
<p className="text-sm text-foreground-muted mt-1">${pricePerUnit.toFixed(2)} each</p>
|
|
214
|
+
<h3 id="quantity-selector-h3-vp66-tl-inwall-speak" className="font-medium text-foreground">VP66 TL In-Wall Speaker</h3>
|
|
215
|
+
<p id="quantity-selector-p-priceperunittofixed2" className="text-sm text-foreground-muted mt-1">${pricePerUnit.toFixed(2)} each</p>
|
|
216
216
|
<div className="mt-4">
|
|
217
217
|
<NumberInput
|
|
218
218
|
label="Quantity"
|
|
@@ -223,8 +223,8 @@ export const QuantitySelector: Story = {
|
|
|
223
223
|
/>
|
|
224
224
|
</div>
|
|
225
225
|
<div className="mt-4 pt-4 border-t border-border flex justify-between items-center">
|
|
226
|
-
<span className="text-sm text-foreground-muted">Total:</span>
|
|
227
|
-
<span className="text-lg font-medium text-foreground">
|
|
226
|
+
<span id="quantity-selector-span-total" className="text-sm text-foreground-muted">Total:</span>
|
|
227
|
+
<span id="quantity-selector-span-totaltofixed2" className="text-lg font-medium text-foreground">
|
|
228
228
|
${total.toFixed(2)}
|
|
229
229
|
</span>
|
|
230
230
|
</div>
|
|
@@ -239,11 +239,11 @@ export const StateMatrix: Story = {
|
|
|
239
239
|
const states: NumberInputState[] = ['default', 'hover', 'focus', 'error', 'disabled'];
|
|
240
240
|
return (
|
|
241
241
|
<div className="space-y-6 w-48">
|
|
242
|
-
<h3 className="text-sm font-medium text-foreground-muted">NumberInput States</h3>
|
|
242
|
+
<h3 id="state-matrix-h3-numberinput-states" className="text-sm font-medium text-foreground-muted">NumberInput States</h3>
|
|
243
243
|
<div className="space-y-4">
|
|
244
244
|
{states.map((state) => (
|
|
245
245
|
<div key={state}>
|
|
246
|
-
<span className="text-xs font-medium text-foreground-muted uppercase">{state}</span>
|
|
246
|
+
<span id="state-matrix-span-state" className="text-xs font-medium text-foreground-muted uppercase">{state}</span>
|
|
247
247
|
<NumberInput
|
|
248
248
|
state={state}
|
|
249
249
|
defaultValue={5}
|
|
@@ -263,14 +263,14 @@ export const ResponsiveMatrix: Story = {
|
|
|
263
263
|
<div className="space-y-8">
|
|
264
264
|
{/* Mobile */}
|
|
265
265
|
<div>
|
|
266
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
266
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
267
267
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
268
268
|
<NumberInput label="Quantity" defaultValue={1} min={1} max={10} />
|
|
269
269
|
</div>
|
|
270
270
|
</div>
|
|
271
271
|
{/* Tablet */}
|
|
272
272
|
<div>
|
|
273
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
273
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
274
274
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
275
275
|
<div className="grid grid-cols-2 gap-4">
|
|
276
276
|
<NumberInput label="Quantity" defaultValue={5} />
|
|
@@ -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-4 gap-4">
|
|
286
286
|
<NumberInput label="Default" defaultValue={5} />
|
|
@@ -134,7 +134,7 @@ export const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(
|
|
|
134
134
|
: inputValue;
|
|
135
135
|
|
|
136
136
|
return (
|
|
137
|
-
<div className={cn("w-full", className)}>
|
|
137
|
+
<div data-sonance-name="number-input" className={cn("w-full", className)}>
|
|
138
138
|
{label && (
|
|
139
139
|
<label className="mb-2 block text-xs font-medium uppercase tracking-widest text-foreground-muted">
|
|
140
140
|
{label}
|
|
@@ -196,7 +196,7 @@ export const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(
|
|
|
196
196
|
</button>
|
|
197
197
|
)}
|
|
198
198
|
</div>
|
|
199
|
-
{error && <p className="mt-1 text-sm text-error">{error}</p>}
|
|
199
|
+
{error && <p id="p-error" className="mt-1 text-sm text-error">{error}</p>}
|
|
200
200
|
</div>
|
|
201
201
|
);
|
|
202
202
|
}
|
|
@@ -218,7 +218,7 @@ export function Stepper({ size = "md", className, ...props }: StepperProps) {
|
|
|
218
218
|
|
|
219
219
|
return (
|
|
220
220
|
<NumberInput
|
|
221
|
-
{...props}
|
|
221
|
+
data-sonance-name="number-input" {...props}
|
|
222
222
|
className={cn(sizeClasses[size], className)}
|
|
223
223
|
/>
|
|
224
224
|
);
|
|
@@ -37,7 +37,7 @@ export const Default: Story = {
|
|
|
37
37
|
render: () => {
|
|
38
38
|
const [page, setPage] = useState(1);
|
|
39
39
|
return (
|
|
40
|
-
<Pagination
|
|
40
|
+
<Pagination data-sonance-name="pagination.stories"
|
|
41
41
|
currentPage={page}
|
|
42
42
|
totalPages={10}
|
|
43
43
|
onPageChange={setPage}
|
|
@@ -131,7 +131,7 @@ export const BothStyles: Story = {
|
|
|
131
131
|
return (
|
|
132
132
|
<div className="space-y-8">
|
|
133
133
|
<div>
|
|
134
|
-
<p className="text-xs text-foreground-muted mb-2">Full Pagination</p>
|
|
134
|
+
<p id="both-styles-p-full-pagination" className="text-xs text-foreground-muted mb-2">Full Pagination</p>
|
|
135
135
|
<Pagination
|
|
136
136
|
currentPage={page}
|
|
137
137
|
totalPages={20}
|
|
@@ -139,7 +139,7 @@ export const BothStyles: Story = {
|
|
|
139
139
|
/>
|
|
140
140
|
</div>
|
|
141
141
|
<div>
|
|
142
|
-
<p className="text-xs text-foreground-muted mb-2">Compact Pagination</p>
|
|
142
|
+
<p id="both-styles-p-compact-pagination" className="text-xs text-foreground-muted mb-2">Compact Pagination</p>
|
|
143
143
|
<CompactPagination
|
|
144
144
|
currentPage={page}
|
|
145
145
|
totalPages={20}
|
|
@@ -186,7 +186,7 @@ export const TableExample: Story = {
|
|
|
186
186
|
</table>
|
|
187
187
|
</div>
|
|
188
188
|
<div className="flex items-center justify-between">
|
|
189
|
-
<p className="text-sm text-foreground-muted">
|
|
189
|
+
<p id="table-example-p-showing-page-1-items" className="text-sm text-foreground-muted">
|
|
190
190
|
Showing {(page - 1) * itemsPerPage + 1} to{' '}
|
|
191
191
|
{Math.min(page * itemsPerPage, items.length)} of {items.length} results
|
|
192
192
|
</p>
|
|
@@ -207,19 +207,19 @@ export const StateMatrix: Story = {
|
|
|
207
207
|
const states: PaginationButtonState[] = ['default', 'hover', 'focus', 'active', 'disabled'];
|
|
208
208
|
return (
|
|
209
209
|
<div className="space-y-6">
|
|
210
|
-
<h3 className="text-sm font-medium text-foreground-muted">PaginationButton States</h3>
|
|
211
|
-
<p className="text-xs text-foreground-muted">States are demonstrated via the Pagination component's active and disabled props.</p>
|
|
210
|
+
<h3 id="state-matrix-h3-paginationbutton-sta" className="text-sm font-medium text-foreground-muted">PaginationButton States</h3>
|
|
211
|
+
<p id="state-matrix-p-states-are-demonstra" className="text-xs text-foreground-muted">States are demonstrated via the Pagination component's active and disabled props.</p>
|
|
212
212
|
<div className="space-y-4">
|
|
213
213
|
<div>
|
|
214
|
-
<span className="text-xs font-medium text-foreground-muted uppercase">Default + Active</span>
|
|
214
|
+
<span id="state-matrix-span-default-active" className="text-xs font-medium text-foreground-muted uppercase">Default + Active</span>
|
|
215
215
|
<Pagination currentPage={3} totalPages={5} onPageChange={() => {}} />
|
|
216
216
|
</div>
|
|
217
217
|
<div>
|
|
218
|
-
<span className="text-xs font-medium text-foreground-muted uppercase">First Page (prev disabled)</span>
|
|
218
|
+
<span id="state-matrix-span-first-page-prev-disa" className="text-xs font-medium text-foreground-muted uppercase">First Page (prev disabled)</span>
|
|
219
219
|
<Pagination currentPage={1} totalPages={5} onPageChange={() => {}} />
|
|
220
220
|
</div>
|
|
221
221
|
<div>
|
|
222
|
-
<span className="text-xs font-medium text-foreground-muted uppercase">Last Page (next disabled)</span>
|
|
222
|
+
<span id="state-matrix-span-last-page-next-disab" className="text-xs font-medium text-foreground-muted uppercase">Last Page (next disabled)</span>
|
|
223
223
|
<Pagination currentPage={5} totalPages={5} onPageChange={() => {}} />
|
|
224
224
|
</div>
|
|
225
225
|
</div>
|
|
@@ -239,7 +239,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
239
239
|
<div className="space-y-8">
|
|
240
240
|
{/* Mobile */}
|
|
241
241
|
<div>
|
|
242
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
242
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
243
243
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
244
244
|
<CompactPagination
|
|
245
245
|
currentPage={mobilePage}
|
|
@@ -250,7 +250,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
250
250
|
</div>
|
|
251
251
|
{/* Tablet */}
|
|
252
252
|
<div>
|
|
253
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
253
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
254
254
|
<div className="w-[768px] border border-dashed border-border p-4 flex justify-center">
|
|
255
255
|
<Pagination
|
|
256
256
|
currentPage={tabletPage}
|
|
@@ -261,9 +261,9 @@ export const ResponsiveMatrix: Story = {
|
|
|
261
261
|
</div>
|
|
262
262
|
{/* Desktop */}
|
|
263
263
|
<div>
|
|
264
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
264
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
265
265
|
<div className="w-[1280px] border border-dashed border-border p-4 flex items-center justify-between">
|
|
266
|
-
<p className="text-sm text-foreground-muted">
|
|
266
|
+
<p id="responsive-matrix-p-showing-91100-of-500" className="text-sm text-foreground-muted">
|
|
267
267
|
Showing 91-100 of 500 results
|
|
268
268
|
</p>
|
|
269
269
|
<Pagination
|
|
@@ -83,7 +83,7 @@ export function Pagination({
|
|
|
83
83
|
const canGoNext = currentPage < totalPages;
|
|
84
84
|
|
|
85
85
|
return (
|
|
86
|
-
<nav
|
|
86
|
+
<nav data-sonance-name="pagination"
|
|
87
87
|
role="navigation"
|
|
88
88
|
aria-label="Pagination"
|
|
89
89
|
className={cn("flex items-center gap-1", className)}
|
|
@@ -101,7 +101,7 @@ export function Pagination({
|
|
|
101
101
|
{pages.map((page, index) => {
|
|
102
102
|
if (page === "ellipsis") {
|
|
103
103
|
return (
|
|
104
|
-
<span
|
|
104
|
+
<span id="pagination-span" data-sonance-name="pagination"
|
|
105
105
|
key={`ellipsis-${index}`}
|
|
106
106
|
className="flex h-9 w-9 items-center justify-center text-foreground-muted"
|
|
107
107
|
>
|
|
@@ -162,7 +162,7 @@ const PaginationButton = forwardRef<HTMLButtonElement, PaginationButtonProps>(
|
|
|
162
162
|
: "bg-transparent text-foreground border-border hover:bg-secondary-hover",
|
|
163
163
|
getButtonStateStyles(state),
|
|
164
164
|
className
|
|
165
|
-
)}
|
|
165
|
+
)} data-sonance-name="pagination"
|
|
166
166
|
{...props}
|
|
167
167
|
>
|
|
168
168
|
{children}
|
|
@@ -197,9 +197,9 @@ export function CompactPagination({
|
|
|
197
197
|
<ChevronLeft className="h-4 w-4" />
|
|
198
198
|
</PaginationButton>
|
|
199
199
|
|
|
200
|
-
<span className="text-sm text-foreground-secondary">
|
|
201
|
-
Page <span className="font-medium text-foreground">{currentPage}</span> of{" "}
|
|
202
|
-
<span className="font-medium text-foreground">{totalPages}</span>
|
|
200
|
+
<span id="compact-pagination-span" className="text-sm text-foreground-secondary">
|
|
201
|
+
Page <span id="compact-pagination-span-currentpage" className="font-medium text-foreground">{currentPage}</span> of{" "}
|
|
202
|
+
<span id="compact-pagination-span-totalpages" className="font-medium text-foreground">{totalPages}</span>
|
|
203
203
|
</span>
|
|
204
204
|
|
|
205
205
|
<PaginationButton
|