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
@@ -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&apos;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&apos;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