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.
Files changed (136) hide show
  1. package/dist/assets/api/sonance-analyze/route.ts +1116 -0
  2. package/dist/assets/api/sonance-assets/route.ts +113 -0
  3. package/dist/assets/api/sonance-components/route.ts +41 -0
  4. package/dist/assets/api/sonance-inject-id/route.ts +363 -0
  5. package/dist/assets/api/sonance-save-logo/route.ts +426 -0
  6. package/dist/assets/api/sonance-theme/route.ts +106 -0
  7. package/dist/assets/brand-system.ts +1265 -0
  8. package/dist/assets/components/accordion.stories.tsx +26 -26
  9. package/dist/assets/components/accordion.tsx +3 -3
  10. package/dist/assets/components/alert-dialog.stories.tsx +7 -7
  11. package/dist/assets/components/alert-dialog.tsx +2 -1
  12. package/dist/assets/components/alert.stories.tsx +3 -3
  13. package/dist/assets/components/alert.tsx +4 -3
  14. package/dist/assets/components/aspect-ratio.stories.tsx +4 -1
  15. package/dist/assets/components/autocomplete.stories.tsx +9 -9
  16. package/dist/assets/components/autocomplete.tsx +3 -3
  17. package/dist/assets/components/avatar.stories.tsx +5 -5
  18. package/dist/assets/components/avatar.tsx +4 -4
  19. package/dist/assets/components/badge.stories.tsx +10 -10
  20. package/dist/assets/components/badge.tsx +3 -3
  21. package/dist/assets/components/breadcrumbs.stories.tsx +7 -7
  22. package/dist/assets/components/breadcrumbs.tsx +13 -8
  23. package/dist/assets/components/button.stories.tsx +74 -74
  24. package/dist/assets/components/button.tsx +2 -0
  25. package/dist/assets/components/calendar.stories.tsx +11 -11
  26. package/dist/assets/components/calendar.tsx +4 -4
  27. package/dist/assets/components/card.stories.tsx +22 -22
  28. package/dist/assets/components/card.tsx +7 -3
  29. package/dist/assets/components/carousel.stories.tsx +6 -6
  30. package/dist/assets/components/carousel.tsx +10 -8
  31. package/dist/assets/components/chart.tsx +5 -5
  32. package/dist/assets/components/checkbox-group.stories.tsx +6 -6
  33. package/dist/assets/components/checkbox-group.tsx +3 -3
  34. package/dist/assets/components/checkbox.stories.tsx +23 -20
  35. package/dist/assets/components/checkbox.tsx +13 -16
  36. package/dist/assets/components/code.stories.tsx +24 -24
  37. package/dist/assets/components/code.tsx +7 -14
  38. package/dist/assets/components/collapsible.stories.tsx +3 -3
  39. package/dist/assets/components/command.stories.tsx +14 -14
  40. package/dist/assets/components/command.tsx +4 -3
  41. package/dist/assets/components/context-menu.stories.tsx +1 -1
  42. package/dist/assets/components/context-menu.tsx +3 -7
  43. package/dist/assets/components/date-input.stories.tsx +9 -9
  44. package/dist/assets/components/date-input.tsx +2 -2
  45. package/dist/assets/components/date-picker.stories.tsx +9 -9
  46. package/dist/assets/components/date-picker.tsx +3 -3
  47. package/dist/assets/components/date-range-picker.stories.tsx +12 -12
  48. package/dist/assets/components/date-range-picker.tsx +3 -3
  49. package/dist/assets/components/dialog.stories.tsx +40 -40
  50. package/dist/assets/components/dialog.tsx +8 -12
  51. package/dist/assets/components/divider.stories.tsx +30 -30
  52. package/dist/assets/components/divider.tsx +4 -8
  53. package/dist/assets/components/drawer.stories.tsx +32 -31
  54. package/dist/assets/components/drawer.tsx +7 -6
  55. package/dist/assets/components/dropdown-menu.tsx +3 -7
  56. package/dist/assets/components/dropdown.stories.tsx +12 -12
  57. package/dist/assets/components/dropdown.tsx +5 -5
  58. package/dist/assets/components/form.stories.tsx +30 -29
  59. package/dist/assets/components/form.tsx +5 -5
  60. package/dist/assets/components/hover-card.stories.tsx +12 -10
  61. package/dist/assets/components/hover-card.tsx +1 -1
  62. package/dist/assets/components/image.stories.tsx +48 -25
  63. package/dist/assets/components/image.tsx +8 -5
  64. package/dist/assets/components/input-otp.stories.tsx +15 -15
  65. package/dist/assets/components/input-otp.tsx +5 -5
  66. package/dist/assets/components/input.stories.tsx +30 -25
  67. package/dist/assets/components/input.tsx +7 -4
  68. package/dist/assets/components/kbd.stories.tsx +34 -34
  69. package/dist/assets/components/kbd.tsx +5 -5
  70. package/dist/assets/components/link.stories.tsx +36 -36
  71. package/dist/assets/components/link.tsx +4 -0
  72. package/dist/assets/components/listbox.stories.tsx +5 -5
  73. package/dist/assets/components/listbox.tsx +4 -4
  74. package/dist/assets/components/menubar.tsx +3 -7
  75. package/dist/assets/components/navbar.stories.tsx +24 -24
  76. package/dist/assets/components/navbar.tsx +8 -14
  77. package/dist/assets/components/navigation-menu.stories.tsx +11 -9
  78. package/dist/assets/components/navigation-menu.tsx +1 -1
  79. package/dist/assets/components/number-input.stories.tsx +11 -11
  80. package/dist/assets/components/number-input.tsx +3 -3
  81. package/dist/assets/components/pagination.stories.tsx +13 -13
  82. package/dist/assets/components/pagination.tsx +6 -6
  83. package/dist/assets/components/popover.stories.tsx +35 -35
  84. package/dist/assets/components/popover.tsx +98 -15
  85. package/dist/assets/components/progress.stories.tsx +5 -5
  86. package/dist/assets/components/progress.tsx +5 -5
  87. package/dist/assets/components/radio-group.stories.tsx +7 -7
  88. package/dist/assets/components/radio-group.tsx +3 -3
  89. package/dist/assets/components/range-calendar.stories.tsx +18 -18
  90. package/dist/assets/components/range-calendar.tsx +3 -3
  91. package/dist/assets/components/resizable.stories.tsx +23 -23
  92. package/dist/assets/components/resizable.tsx +1 -1
  93. package/dist/assets/components/scroll-area.stories.tsx +15 -15
  94. package/dist/assets/components/scroll-area.tsx +1 -1
  95. package/dist/assets/components/scroll-shadow.stories.tsx +17 -17
  96. package/dist/assets/components/scroll-shadow.tsx +2 -2
  97. package/dist/assets/components/select.stories.tsx +20 -19
  98. package/dist/assets/components/select.tsx +10 -6
  99. package/dist/assets/components/separator.tsx +1 -1
  100. package/dist/assets/components/sheet.tsx +3 -7
  101. package/dist/assets/components/sidebar.stories.tsx +30 -30
  102. package/dist/assets/components/sidebar.tsx +24 -27
  103. package/dist/assets/components/skeleton.stories.tsx +3 -3
  104. package/dist/assets/components/skeleton.tsx +2 -2
  105. package/dist/assets/components/slider.stories.tsx +6 -6
  106. package/dist/assets/components/slider.tsx +3 -3
  107. package/dist/assets/components/spacer.stories.tsx +11 -11
  108. package/dist/assets/components/spacer.tsx +2 -2
  109. package/dist/assets/components/spinner.stories.tsx +8 -8
  110. package/dist/assets/components/spinner.tsx +5 -5
  111. package/dist/assets/components/switch.stories.tsx +24 -20
  112. package/dist/assets/components/switch.tsx +14 -6
  113. package/dist/assets/components/table.stories.tsx +7 -7
  114. package/dist/assets/components/table.tsx +8 -8
  115. package/dist/assets/components/tabs.stories.tsx +37 -37
  116. package/dist/assets/components/tabs.tsx +3 -3
  117. package/dist/assets/components/textarea.stories.tsx +13 -12
  118. package/dist/assets/components/textarea.tsx +3 -3
  119. package/dist/assets/components/theme-toggle.stories.tsx +31 -30
  120. package/dist/assets/components/theme-toggle.tsx +2 -2
  121. package/dist/assets/components/time-input.stories.tsx +16 -16
  122. package/dist/assets/components/time-input.tsx +2 -2
  123. package/dist/assets/components/toast.stories.tsx +8 -5
  124. package/dist/assets/components/toast.tsx +6 -6
  125. package/dist/assets/components/toggle-group.tsx +1 -1
  126. package/dist/assets/components/toggle.tsx +1 -1
  127. package/dist/assets/components/tooltip.stories.tsx +49 -27
  128. package/dist/assets/components/tooltip.tsx +1 -1
  129. package/dist/assets/components/user.stories.tsx +23 -23
  130. package/dist/assets/components/user.tsx +7 -4
  131. package/dist/assets/dev-tools/SonanceDevTools.tsx +4201 -0
  132. package/dist/assets/dev-tools/index.ts +10 -0
  133. package/dist/assets/globals.css +9 -0
  134. package/dist/assets/styles/brand-overrides.css +37 -0
  135. package/dist/index.js +1776 -7
  136. package/package.json +1 -1
@@ -71,7 +71,7 @@ export const Default: Story = {
71
71
  <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
72
72
  S
73
73
  </div>
74
- <span className="font-medium text-foreground">Sonance</span>
74
+ <span id="default-span-sonance" className="font-medium text-foreground">Sonance</span>
75
75
  </div>
76
76
  </SidebarHeader>
77
77
  <SidebarContent>
@@ -82,9 +82,9 @@ export const Default: Story = {
82
82
  {mainNavItems.map((item) => (
83
83
  <SidebarMenuItem key={item.label}>
84
84
  <SidebarMenuButton asChild>
85
- <a href={item.href}>
85
+ <a id="default-a" href={item.href}>
86
86
  <item.icon />
87
- <span>{item.label}</span>
87
+ <span id="default-span-itemlabel">{item.label}</span>
88
88
  </a>
89
89
  </SidebarMenuButton>
90
90
  </SidebarMenuItem>
@@ -107,8 +107,8 @@ export const Default: Story = {
107
107
  {productItems.map((item) => (
108
108
  <SidebarMenuItem key={item.label}>
109
109
  <SidebarMenuButton asChild isActive={item.isActive}>
110
- <a href={item.href}>
111
- <span>{item.label}</span>
110
+ <a id="default-a" href={item.href}>
111
+ <span id="default-span-itemlabel">{item.label}</span>
112
112
  </a>
113
113
  </SidebarMenuButton>
114
114
  </SidebarMenuItem>
@@ -124,7 +124,7 @@ export const Default: Story = {
124
124
  <SidebarMenuItem>
125
125
  <SidebarMenuButton>
126
126
  <Avatar fallback="John Doe" size="sm" />
127
- <span>John Doe</span>
127
+ <span id="default-span-john-doe">John Doe</span>
128
128
  </SidebarMenuButton>
129
129
  </SidebarMenuItem>
130
130
  </SidebarMenu>
@@ -134,10 +134,10 @@ export const Default: Story = {
134
134
  <SidebarInset>
135
135
  <header className="flex h-14 items-center gap-4 border-b border-border px-4">
136
136
  <SidebarTrigger />
137
- <h1 className="text-lg font-medium">Dashboard</h1>
137
+ <h1 id="header-h1-dashboard" className="text-lg font-medium">Dashboard</h1>
138
138
  </header>
139
139
  <div className="flex-1 p-6">
140
- <p className="text-foreground-secondary">
140
+ <p id="header-p-main-content-area-pr" className="text-foreground-secondary">
141
141
  Main content area. Press ⌘B to toggle the sidebar.
142
142
  </p>
143
143
  </div>
@@ -157,7 +157,7 @@ export const WithSearch: Story = {
157
157
  <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
158
158
  S
159
159
  </div>
160
- <span className="font-medium text-foreground">Sonance</span>
160
+ <span id="with-search-span-sonance" className="font-medium text-foreground">Sonance</span>
161
161
  </div>
162
162
  <div className="relative px-2">
163
163
  <Search className="absolute left-4 top-1/2 h-4 w-4 -translate-y-1/2 text-foreground-muted" />
@@ -172,9 +172,9 @@ export const WithSearch: Story = {
172
172
  {mainNavItems.map((item) => (
173
173
  <SidebarMenuItem key={item.label}>
174
174
  <SidebarMenuButton asChild tooltip={item.label}>
175
- <a href={item.href}>
175
+ <a id="with-search-a" href={item.href}>
176
176
  <item.icon />
177
- <span>{item.label}</span>
177
+ <span id="with-search-span-itemlabel">{item.label}</span>
178
178
  </a>
179
179
  </SidebarMenuButton>
180
180
  </SidebarMenuItem>
@@ -188,10 +188,10 @@ export const WithSearch: Story = {
188
188
  <SidebarInset>
189
189
  <header className="flex h-14 items-center gap-4 border-b border-border px-4">
190
190
  <SidebarTrigger />
191
- <h1 className="text-lg font-medium">Search Example</h1>
191
+ <h1 id="header-h1-search-example" className="text-lg font-medium">Search Example</h1>
192
192
  </header>
193
193
  <div className="flex-1 p-6">
194
- <p className="text-foreground-secondary">
194
+ <p id="header-p-this-sidebar-include" className="text-foreground-secondary">
195
195
  This sidebar includes a search input in the header.
196
196
  </p>
197
197
  </div>
@@ -211,7 +211,7 @@ export const WithSubMenu: Story = {
211
211
  <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
212
212
  S
213
213
  </div>
214
- <span className="font-medium text-foreground">Sonance</span>
214
+ <span id="with-sub-menu-span-sonance" className="font-medium text-foreground">Sonance</span>
215
215
  </div>
216
216
  </SidebarHeader>
217
217
  <SidebarContent>
@@ -222,9 +222,9 @@ export const WithSubMenu: Story = {
222
222
  <Collapsible asChild defaultOpen>
223
223
  <SidebarMenuItem>
224
224
  <SidebarMenuButton asChild>
225
- <a href="#">
225
+ <a id="with-sub-menu-a" href="#">
226
226
  <Home />
227
- <span>Architectural</span>
227
+ <span id="with-sub-menu-span-architectural">Architectural</span>
228
228
  </a>
229
229
  </SidebarMenuButton>
230
230
  <CollapsibleTrigger asChild>
@@ -236,17 +236,17 @@ export const WithSubMenu: Story = {
236
236
  <SidebarMenuSub>
237
237
  <SidebarMenuSubItem>
238
238
  <SidebarMenuSubButton asChild>
239
- <a href="#">In-Ceiling</a>
239
+ <a id="with-sub-menu-a" href="#">In-Ceiling</a>
240
240
  </SidebarMenuSubButton>
241
241
  </SidebarMenuSubItem>
242
242
  <SidebarMenuSubItem>
243
243
  <SidebarMenuSubButton asChild isActive>
244
- <a href="#">In-Wall</a>
244
+ <a id="with-sub-menu-a" href="#">In-Wall</a>
245
245
  </SidebarMenuSubButton>
246
246
  </SidebarMenuSubItem>
247
247
  <SidebarMenuSubItem>
248
248
  <SidebarMenuSubButton asChild>
249
- <a href="#">Invisible</a>
249
+ <a id="with-sub-menu-a" href="#">Invisible</a>
250
250
  </SidebarMenuSubButton>
251
251
  </SidebarMenuSubItem>
252
252
  </SidebarMenuSub>
@@ -255,9 +255,9 @@ export const WithSubMenu: Story = {
255
255
  </Collapsible>
256
256
  <SidebarMenuItem>
257
257
  <SidebarMenuButton asChild>
258
- <a href="#">
258
+ <a id="with-sub-menu-a" href="#">
259
259
  <Users />
260
- <span>Outdoor</span>
260
+ <span id="with-sub-menu-span-outdoor">Outdoor</span>
261
261
  </a>
262
262
  </SidebarMenuButton>
263
263
  </SidebarMenuItem>
@@ -270,13 +270,13 @@ export const WithSubMenu: Story = {
270
270
  <SidebarMenuItem>
271
271
  <SidebarMenuButton>
272
272
  <Plus />
273
- <span>Add Product</span>
273
+ <span id="with-sub-menu-span-add-product">Add Product</span>
274
274
  </SidebarMenuButton>
275
275
  </SidebarMenuItem>
276
276
  <SidebarMenuItem>
277
277
  <SidebarMenuButton>
278
278
  <LogOut />
279
- <span>Logout</span>
279
+ <span id="with-sub-menu-span-logout">Logout</span>
280
280
  </SidebarMenuButton>
281
281
  </SidebarMenuItem>
282
282
  </SidebarMenu>
@@ -286,10 +286,10 @@ export const WithSubMenu: Story = {
286
286
  <SidebarInset>
287
287
  <header className="flex h-14 items-center gap-4 border-b border-border px-4">
288
288
  <SidebarTrigger />
289
- <h1 className="text-lg font-medium">With Sub Menu</h1>
289
+ <h1 id="header-h1-with-sub-menu" className="text-lg font-medium">With Sub Menu</h1>
290
290
  </header>
291
291
  <div className="flex-1 p-6">
292
- <p className="text-foreground-secondary">
292
+ <p id="header-p-this-sidebar-include" className="text-foreground-secondary">
293
293
  This sidebar includes expandable sub-menus.
294
294
  </p>
295
295
  </div>
@@ -309,7 +309,7 @@ export const Floating: Story = {
309
309
  <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
310
310
  S
311
311
  </div>
312
- <span className="font-medium text-foreground">Sonance</span>
312
+ <span id="floating-span-sonance" className="font-medium text-foreground">Sonance</span>
313
313
  </div>
314
314
  </SidebarHeader>
315
315
  <SidebarContent>
@@ -320,9 +320,9 @@ export const Floating: Story = {
320
320
  {mainNavItems.map((item) => (
321
321
  <SidebarMenuItem key={item.label}>
322
322
  <SidebarMenuButton asChild>
323
- <a href={item.href}>
323
+ <a id="floating-a" href={item.href}>
324
324
  <item.icon />
325
- <span>{item.label}</span>
325
+ <span id="floating-span-itemlabel">{item.label}</span>
326
326
  </a>
327
327
  </SidebarMenuButton>
328
328
  </SidebarMenuItem>
@@ -336,10 +336,10 @@ export const Floating: Story = {
336
336
  <SidebarInset>
337
337
  <header className="flex h-14 items-center gap-4 border-b border-border px-4">
338
338
  <SidebarTrigger />
339
- <h1 className="text-lg font-medium">Floating Variant</h1>
339
+ <h1 id="header-h1-floating-variant" className="text-lg font-medium">Floating Variant</h1>
340
340
  </header>
341
341
  <div className="flex-1 p-6">
342
- <p className="text-foreground-secondary">
342
+ <p id="header-p-the-floating-variant" className="text-foreground-secondary">
343
343
  The floating variant adds rounded corners and a shadow to the sidebar.
344
344
  </p>
345
345
  </div>
@@ -141,7 +141,7 @@ const SidebarProvider = React.forwardRef<
141
141
  "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar-background",
142
142
  className
143
143
  )}
144
- ref={ref}
144
+ ref={ref} data-sonance-name="sidebar"
145
145
  {...props}
146
146
  >
147
147
  {children}
@@ -176,12 +176,7 @@ const Sidebar = React.forwardRef<
176
176
 
177
177
  if (collapsible === "none") {
178
178
  return (
179
- <div
180
- className={cn(
181
- "flex h-full w-[--sidebar-width] flex-col bg-sidebar-background text-sidebar-foreground",
182
- className
183
- )}
184
- ref={ref}
179
+ <div data-sonance-name="sidebar"
185
180
  {...props}
186
181
  >
187
182
  {children}
@@ -191,7 +186,7 @@ const Sidebar = React.forwardRef<
191
186
 
192
187
  if (isMobile) {
193
188
  return (
194
- <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
189
+ <Sheet open={openMobile} onOpenChange={setOpenMobile} data-sonance-name="sidebar" {...props}>
195
190
  <SheetContent
196
191
  data-sidebar="sidebar"
197
192
  data-mobile="true"
@@ -210,7 +205,7 @@ const Sidebar = React.forwardRef<
210
205
  }
211
206
 
212
207
  return (
213
- <div
208
+ <div data-sonance-name="sidebar"
214
209
  ref={ref}
215
210
  className="group peer hidden md:block text-sidebar-foreground"
216
211
  data-state={state}
@@ -240,7 +235,7 @@ const Sidebar = React.forwardRef<
240
235
  ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
241
236
  : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l bg-sidebar-background",
242
237
  className
243
- )}
238
+ )} data-sonance-name="sidebar"
244
239
  {...props}
245
240
  >
246
241
  <div
@@ -264,6 +259,7 @@ const SidebarTrigger = React.forwardRef<
264
259
 
265
260
  return (
266
261
  <Button
262
+ id="sidebar-trigger-button-ghost"
267
263
  ref={ref}
268
264
  data-sidebar="trigger"
269
265
  variant="ghost"
@@ -276,7 +272,7 @@ const SidebarTrigger = React.forwardRef<
276
272
  {...props}
277
273
  >
278
274
  <PanelLeft />
279
- <span className="sr-only">Toggle Sidebar</span>
275
+ <span id="sidebar-trigger-span-toggle-sidebar" className="sr-only">Toggle Sidebar</span>
280
276
  </Button>
281
277
  )
282
278
  })
@@ -304,7 +300,7 @@ const SidebarRail = React.forwardRef<
304
300
  "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
305
301
  "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
306
302
  className
307
- )}
303
+ )} data-sonance-name="sidebar"
308
304
  {...props}
309
305
  />
310
306
  )
@@ -322,7 +318,7 @@ const SidebarInset = React.forwardRef<
322
318
  "relative flex min-h-svh flex-1 flex-col bg-background",
323
319
  "peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
324
320
  className
325
- )}
321
+ )} data-sonance-name="sidebar"
326
322
  {...props}
327
323
  />
328
324
  )
@@ -335,12 +331,13 @@ const SidebarInput = React.forwardRef<
335
331
  >(({ className, ...props }, ref) => {
336
332
  return (
337
333
  <Input
334
+ id="sidebar-input-input-sidebar"
338
335
  ref={ref}
339
336
  data-sidebar="input"
340
337
  className={cn(
341
338
  "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
342
339
  className
343
- )}
340
+ )} data-sonance-name="sidebar"
344
341
  {...props}
345
342
  />
346
343
  )
@@ -355,7 +352,7 @@ const SidebarHeader = React.forwardRef<
355
352
  <div
356
353
  ref={ref}
357
354
  data-sidebar="header"
358
- className={cn("flex flex-col gap-2 p-2", className)}
355
+ className={cn("flex flex-col gap-2 p-2", className)} data-sonance-name="sidebar"
359
356
  {...props}
360
357
  />
361
358
  )
@@ -370,7 +367,7 @@ const SidebarFooter = React.forwardRef<
370
367
  <div
371
368
  ref={ref}
372
369
  data-sidebar="footer"
373
- className={cn("flex flex-col gap-2 p-2", className)}
370
+ className={cn("flex flex-col gap-2 p-2", className)} data-sonance-name="sidebar"
374
371
  {...props}
375
372
  />
376
373
  )
@@ -385,7 +382,7 @@ const SidebarSeparator = React.forwardRef<
385
382
  <Separator
386
383
  ref={ref}
387
384
  data-sidebar="separator"
388
- className={cn("mx-2 w-auto bg-sidebar-border", className)}
385
+ className={cn("mx-2 w-auto bg-sidebar-border", className)} data-sonance-name="sidebar"
389
386
  {...props}
390
387
  />
391
388
  )
@@ -403,7 +400,7 @@ const SidebarContent = React.forwardRef<
403
400
  className={cn(
404
401
  "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden group-data-[collapsible=icon]:gap-0",
405
402
  className
406
- )}
403
+ )} data-sonance-name="sidebar"
407
404
  {...props}
408
405
  />
409
406
  )
@@ -418,7 +415,7 @@ const SidebarGroup = React.forwardRef<
418
415
  <div
419
416
  ref={ref}
420
417
  data-sidebar="group"
421
- className={cn("relative flex w-full min-w-0 flex-col p-2 group-data-[collapsible=icon]:py-0", className)}
418
+ className={cn("relative flex w-full min-w-0 flex-col p-2 group-data-[collapsible=icon]:py-0", className)} data-sonance-name="sidebar"
422
419
  {...props}
423
420
  />
424
421
  )
@@ -476,7 +473,7 @@ const SidebarGroupContent = React.forwardRef<
476
473
  <div
477
474
  ref={ref}
478
475
  data-sidebar="group-content"
479
- className={cn("w-full text-sm", className)}
476
+ className={cn("w-full text-sm", className)} data-sonance-name="sidebar"
480
477
  {...props}
481
478
  />
482
479
  ))
@@ -489,7 +486,7 @@ const SidebarMenu = React.forwardRef<
489
486
  <ul
490
487
  ref={ref}
491
488
  data-sidebar="menu"
492
- className={cn("flex w-full min-w-0 flex-col gap-1", className)}
489
+ className={cn("flex w-full min-w-0 flex-col gap-1", className)} data-sonance-name="sidebar"
493
490
  {...props}
494
491
  />
495
492
  ))
@@ -502,7 +499,7 @@ const SidebarMenuItem = React.forwardRef<
502
499
  <li
503
500
  ref={ref}
504
501
  data-sidebar="menu-item"
505
- className={cn("group/menu-item relative", className)}
502
+ className={cn("group/menu-item relative", className)} data-sonance-name="sidebar"
506
503
  {...props}
507
504
  />
508
505
  ))
@@ -559,7 +556,7 @@ const SidebarMenuButton = React.forwardRef<
559
556
  data-sidebar="menu-button"
560
557
  data-size={size}
561
558
  data-active={isActive}
562
- className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
559
+ className={cn(sidebarMenuButtonVariants({ variant, size }), className)} data-sonance-name="sidebar"
563
560
  {...props}
564
561
  />
565
562
  )
@@ -635,7 +632,7 @@ const SidebarMenuBadge = React.forwardRef<
635
632
  "peer-data-[size=lg]/menu-button:top-2.5",
636
633
  "group-data-[collapsible=icon]:hidden",
637
634
  className
638
- )}
635
+ )} data-sonance-name="sidebar"
639
636
  {...props}
640
637
  />
641
638
  ))
@@ -656,7 +653,7 @@ const SidebarMenuSkeleton = React.forwardRef<
656
653
  <div
657
654
  ref={ref}
658
655
  data-sidebar="menu-skeleton"
659
- className={cn("rounded-sm h-8 flex gap-2 px-2 items-center", className)}
656
+ className={cn("rounded-sm h-8 flex gap-2 px-2 items-center", className)} data-sonance-name="sidebar"
660
657
  {...props}
661
658
  >
662
659
  {showIcon && (
@@ -690,7 +687,7 @@ const SidebarMenuSub = React.forwardRef<
690
687
  "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
691
688
  "group-data-[collapsible=icon]:hidden",
692
689
  className
693
- )}
690
+ )} data-sonance-name="sidebar"
694
691
  {...props}
695
692
  />
696
693
  ))
@@ -699,7 +696,7 @@ SidebarMenuSub.displayName = "SidebarMenuSub"
699
696
  const SidebarMenuSubItem = React.forwardRef<
700
697
  HTMLLIElement,
701
698
  React.ComponentProps<"li">
702
- >(({ ...props }, ref) => <li ref={ref} {...props} />)
699
+ >(({ ...props }, ref) => <li ref={ref} data-sonance-name="sidebar" {...props} />)
703
700
  SidebarMenuSubItem.displayName = "SidebarMenuSubItem"
704
701
 
705
702
  const SidebarMenuSubButton = React.forwardRef<
@@ -132,7 +132,7 @@ export const ResponsiveMatrix: Story = {
132
132
  <div className="space-y-8">
133
133
  {/* Mobile */}
134
134
  <div>
135
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
135
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
136
136
  <div className="w-[375px] border border-dashed border-border p-4 space-y-4">
137
137
  <div className="flex items-center gap-4">
138
138
  <SkeletonAvatar size="md" />
@@ -146,7 +146,7 @@ export const ResponsiveMatrix: Story = {
146
146
  </div>
147
147
  {/* Tablet */}
148
148
  <div>
149
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
149
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
150
150
  <div className="w-[768px] border border-dashed border-border p-4">
151
151
  <div className="grid grid-cols-2 gap-4">
152
152
  <SkeletonCard />
@@ -156,7 +156,7 @@ export const ResponsiveMatrix: Story = {
156
156
  </div>
157
157
  {/* Desktop */}
158
158
  <div>
159
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
159
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
160
160
  <div className="w-[1280px] border border-dashed border-border p-4">
161
161
  <SkeletonTable rows={4} columns={5} />
162
162
  </div>
@@ -22,6 +22,7 @@ export function Skeleton({
22
22
 
23
23
  return (
24
24
  <div
25
+ data-sonance-name="skeleton"
25
26
  className={cn(
26
27
  "animate-pulse bg-background-secondary",
27
28
  variantClasses[variant],
@@ -40,7 +41,7 @@ export function Skeleton({
40
41
  // Preset skeleton components
41
42
  export function SkeletonText({ lines = 3, className }: { lines?: number; className?: string }) {
42
43
  return (
43
- <div className={cn("space-y-2", className)}>
44
+ <div data-sonance-name="skeleton" className={cn("space-y-2", className)}>
44
45
  {Array.from({ length: lines }).map((_, i) => (
45
46
  <Skeleton
46
47
  key={i}
@@ -111,4 +112,3 @@ export function SkeletonTable({
111
112
  </div>
112
113
  );
113
114
  }
114
-
@@ -91,12 +91,12 @@ export const StateMatrix: Story = {
91
91
  render: () => {
92
92
  const states: SliderState[] = ['default', 'hover', 'focus', 'active', 'disabled'];
93
93
  return (
94
- <div className="space-y-6 w-80">
95
- <h3 className="text-sm font-medium text-foreground-muted">Slider States</h3>
94
+ <div data-sonance-name="slider.stories" className="space-y-6 w-80">
95
+ <h3 id="state-matrix-h3-slider-states" className="text-sm font-medium text-foreground-muted">Slider States</h3>
96
96
  <div className="space-y-6">
97
97
  {states.map((state) => (
98
98
  <div key={state} className="flex items-center gap-4">
99
- <span className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
99
+ <span id="state-matrix-span-state" className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
100
100
  <Slider state={state} defaultValue={50} label={state} />
101
101
  </div>
102
102
  ))}
@@ -112,7 +112,7 @@ export const ResponsiveMatrix: Story = {
112
112
  <div className="space-y-8">
113
113
  {/* Mobile */}
114
114
  <div>
115
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
115
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
116
116
  <div className="w-[375px] border border-dashed border-border p-4 space-y-6">
117
117
  <Slider label="Volume" showValue defaultValue={75} />
118
118
  <Slider label="Brightness" showValue defaultValue={50} />
@@ -120,7 +120,7 @@ export const ResponsiveMatrix: Story = {
120
120
  </div>
121
121
  {/* Tablet */}
122
122
  <div>
123
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
123
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
124
124
  <div className="w-[768px] border border-dashed border-border p-4">
125
125
  <div className="grid grid-cols-2 gap-8">
126
126
  <Slider label="Bass" showValue defaultValue={60} />
@@ -130,7 +130,7 @@ export const ResponsiveMatrix: Story = {
130
130
  </div>
131
131
  {/* Desktop */}
132
132
  <div>
133
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
133
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
134
134
  <div className="w-[1280px] border border-dashed border-border p-4">
135
135
  <div className="grid grid-cols-4 gap-8">
136
136
  <Slider label="Volume" showValue defaultValue={80} />
@@ -134,7 +134,7 @@ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
134
134
  };
135
135
 
136
136
  return (
137
- <div ref={ref} className={cn("w-full", className)}>
137
+ <div data-sonance-name="slider" ref={ref} className={cn("w-full", className)}>
138
138
  {(label || showValue) && (
139
139
  <div className="mb-3 flex items-center justify-between">
140
140
  {label && (
@@ -143,7 +143,7 @@ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
143
143
  </label>
144
144
  )}
145
145
  {showValue && (
146
- <span className="text-sm font-medium text-foreground">{value}</span>
146
+ <span id="span-value" className="text-sm font-medium text-foreground">{value}</span>
147
147
  )}
148
148
  </div>
149
149
  )}
@@ -170,7 +170,7 @@ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
170
170
  style={{ width: `${percentage}%` }}
171
171
  />
172
172
  {/* Thumb */}
173
- <div
173
+ <div data-sonance-name="slider"
174
174
  className={cn(
175
175
  "absolute top-1/2 h-5 w-5 -translate-x-1/2 -translate-y-1/2 rounded-full",
176
176
  "border-2 border-primary bg-background shadow-sm transition-all",
@@ -66,7 +66,7 @@ export const PresetSizes: Story = {
66
66
  export const FlexSpacerExample: Story = {
67
67
  render: () => (
68
68
  <div className="flex items-center border border-border p-4 w-96">
69
- <span className="text-foreground font-medium">Logo</span>
69
+ <span id="flex-spacer-example-span-logo" className="text-foreground font-medium">Logo</span>
70
70
  <FlexSpacer />
71
71
  <button className="px-3 py-1 text-sm text-foreground-muted hover:text-foreground">About</button>
72
72
  <Spacer x={2} />
@@ -80,11 +80,11 @@ export const FlexSpacerExample: Story = {
80
80
  export const CardLayout: Story = {
81
81
  render: () => (
82
82
  <div className="border border-border p-6 w-80">
83
- <h3 className="text-lg font-medium text-foreground">Card Title</h3>
83
+ <h3 id="card-layout-h3-card-title" className="text-lg font-medium text-foreground">Card Title</h3>
84
84
  <SpacerXS />
85
- <p className="text-sm text-foreground-muted">A subtitle or meta information</p>
85
+ <p id="card-layout-p-a-subtitle-or-meta-i" className="text-sm text-foreground-muted">A subtitle or meta information</p>
86
86
  <SpacerMD />
87
- <p className="text-foreground-secondary">
87
+ <p id="card-layout-p-this-is-the-main-con" className="text-foreground-secondary">
88
88
  This is the main content of the card. Notice how spacers provide consistent rhythm between elements.
89
89
  </p>
90
90
  <SpacerLG />
@@ -100,7 +100,7 @@ export const CardLayout: Story = {
100
100
  export const ResponsiveSpacing: Story = {
101
101
  render: () => (
102
102
  <div className="space-y-4">
103
- <p className="text-xs text-foreground-muted">
103
+ <p id="responsive-spacing-p-spacer-uses-a-4px-ba" className="text-xs text-foreground-muted">
104
104
  Spacer uses a 4px base unit. y=1 is 4px, y=4 is 16px, etc.
105
105
  </p>
106
106
  <div className="border border-dashed border-border p-4 w-64">
@@ -121,7 +121,7 @@ export const ResponsiveSpacing: Story = {
121
121
  export const FormLayout: Story = {
122
122
  render: () => (
123
123
  <form className="w-80 border border-border p-6">
124
- <h2 className="text-lg font-medium text-foreground">Contact Form</h2>
124
+ <h2 id="form-layout-h2-contact-form" className="text-lg font-medium text-foreground">Contact Form</h2>
125
125
  <SpacerMD />
126
126
 
127
127
  <label className="block text-sm font-medium text-foreground">Name</label>
@@ -170,7 +170,7 @@ export const ResponsiveMatrix: Story = {
170
170
  <div className="space-y-8">
171
171
  {/* Mobile */}
172
172
  <div>
173
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
173
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
174
174
  <div className="w-[375px] border border-dashed border-border p-4">
175
175
  <div className="p-2 bg-primary text-primary-foreground text-center text-sm">Header</div>
176
176
  <SpacerMD />
@@ -181,10 +181,10 @@ export const ResponsiveMatrix: Story = {
181
181
  </div>
182
182
  {/* Tablet */}
183
183
  <div>
184
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
184
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
185
185
  <div className="w-[768px] border border-dashed border-border p-4">
186
186
  <div className="flex items-center">
187
- <span className="text-foreground font-medium">Logo</span>
187
+ <span id="responsive-matrix-span-logo" className="text-foreground font-medium">Logo</span>
188
188
  <FlexSpacer />
189
189
  <button className="px-3 py-1 text-sm text-foreground-muted">About</button>
190
190
  <Spacer x={2} />
@@ -196,10 +196,10 @@ export const ResponsiveMatrix: Story = {
196
196
  </div>
197
197
  {/* Desktop */}
198
198
  <div>
199
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
199
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
200
200
  <div className="w-[1280px] border border-dashed border-border p-4">
201
201
  <div className="flex items-center">
202
- <span className="text-foreground font-medium">Sonance</span>
202
+ <span id="responsive-matrix-span-sonance" className="text-foreground font-medium">Sonance</span>
203
203
  <Spacer x={8} />
204
204
  <button className="px-3 py-1 text-sm text-foreground-muted">Products</button>
205
205
  <Spacer x={4} />
@@ -36,7 +36,7 @@ export function Spacer({ x, y, className }: SpacerProps) {
36
36
  }
37
37
 
38
38
  return (
39
- <div
39
+ <div data-sonance-name="spacer"
40
40
  className={cn("shrink-0", className)}
41
41
  style={style}
42
42
  aria-hidden="true"
@@ -46,7 +46,7 @@ export function Spacer({ x, y, className }: SpacerProps) {
46
46
 
47
47
  // Common preset spacers
48
48
  export function SpacerXS() {
49
- return <Spacer y={2} />;
49
+ return <Spacer data-sonance-name="spacer" y={2} />;
50
50
  }
51
51
 
52
52
  export function SpacerSM() {