sonance-brand-mcp 1.2.5 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) 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 +142 -0
  11. package/dist/assets/components/alert-dialog.tsx +143 -0
  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 +70 -0
  15. package/dist/assets/components/aspect-ratio.tsx +8 -0
  16. package/dist/assets/components/autocomplete.stories.tsx +9 -9
  17. package/dist/assets/components/autocomplete.tsx +3 -3
  18. package/dist/assets/components/avatar.stories.tsx +5 -5
  19. package/dist/assets/components/avatar.tsx +67 -23
  20. package/dist/assets/components/badge.stories.tsx +10 -10
  21. package/dist/assets/components/badge.tsx +3 -3
  22. package/dist/assets/components/breadcrumbs.stories.tsx +7 -7
  23. package/dist/assets/components/breadcrumbs.tsx +13 -8
  24. package/dist/assets/components/button.stories.tsx +74 -74
  25. package/dist/assets/components/button.tsx +2 -0
  26. package/dist/assets/components/calendar.stories.tsx +11 -11
  27. package/dist/assets/components/calendar.tsx +4 -4
  28. package/dist/assets/components/card.stories.tsx +22 -22
  29. package/dist/assets/components/card.tsx +7 -3
  30. package/dist/assets/components/carousel.stories.tsx +158 -0
  31. package/dist/assets/components/carousel.tsx +264 -0
  32. package/dist/assets/components/chart.stories.tsx +376 -0
  33. package/dist/assets/components/chart.tsx +384 -0
  34. package/dist/assets/components/checkbox-group.stories.tsx +6 -6
  35. package/dist/assets/components/checkbox-group.tsx +3 -3
  36. package/dist/assets/components/checkbox.stories.tsx +23 -20
  37. package/dist/assets/components/checkbox.tsx +13 -6
  38. package/dist/assets/components/code.stories.tsx +24 -24
  39. package/dist/assets/components/code.tsx +22 -27
  40. package/dist/assets/components/collapsible.stories.tsx +128 -0
  41. package/dist/assets/components/collapsible.tsx +10 -0
  42. package/dist/assets/components/command.stories.tsx +183 -0
  43. package/dist/assets/components/command.tsx +171 -0
  44. package/dist/assets/components/context-menu.stories.tsx +159 -0
  45. package/dist/assets/components/context-menu.tsx +214 -0
  46. package/dist/assets/components/date-input.stories.tsx +9 -9
  47. package/dist/assets/components/date-input.tsx +2 -2
  48. package/dist/assets/components/date-picker.stories.tsx +9 -9
  49. package/dist/assets/components/date-picker.tsx +3 -3
  50. package/dist/assets/components/date-range-picker.stories.tsx +12 -12
  51. package/dist/assets/components/date-range-picker.tsx +3 -3
  52. package/dist/assets/components/dialog.stories.tsx +40 -40
  53. package/dist/assets/components/dialog.tsx +8 -12
  54. package/dist/assets/components/divider.stories.tsx +30 -30
  55. package/dist/assets/components/divider.tsx +34 -35
  56. package/dist/assets/components/drawer.stories.tsx +32 -31
  57. package/dist/assets/components/drawer.tsx +7 -6
  58. package/dist/assets/components/dropdown-menu.tsx +213 -0
  59. package/dist/assets/components/dropdown.stories.tsx +12 -12
  60. package/dist/assets/components/dropdown.tsx +5 -5
  61. package/dist/assets/components/form.stories.tsx +30 -29
  62. package/dist/assets/components/form.tsx +5 -5
  63. package/dist/assets/components/hover-card.stories.tsx +115 -0
  64. package/dist/assets/components/hover-card.tsx +35 -0
  65. package/dist/assets/components/image.stories.tsx +48 -25
  66. package/dist/assets/components/image.tsx +8 -5
  67. package/dist/assets/components/input-otp.stories.tsx +15 -15
  68. package/dist/assets/components/input-otp.tsx +5 -5
  69. package/dist/assets/components/input.stories.tsx +30 -25
  70. package/dist/assets/components/input.tsx +7 -4
  71. package/dist/assets/components/kbd.stories.tsx +34 -34
  72. package/dist/assets/components/kbd.tsx +9 -9
  73. package/dist/assets/components/link.stories.tsx +36 -36
  74. package/dist/assets/components/link.tsx +4 -0
  75. package/dist/assets/components/listbox.stories.tsx +5 -5
  76. package/dist/assets/components/listbox.tsx +4 -4
  77. package/dist/assets/components/menubar.stories.tsx +208 -0
  78. package/dist/assets/components/menubar.tsx +247 -0
  79. package/dist/assets/components/navbar.stories.tsx +24 -24
  80. package/dist/assets/components/navbar.tsx +8 -14
  81. package/dist/assets/components/navigation-menu.stories.tsx +239 -0
  82. package/dist/assets/components/navigation-menu.tsx +135 -0
  83. package/dist/assets/components/number-input.stories.tsx +11 -11
  84. package/dist/assets/components/number-input.tsx +3 -3
  85. package/dist/assets/components/pagination.stories.tsx +13 -13
  86. package/dist/assets/components/pagination.tsx +6 -6
  87. package/dist/assets/components/popover.stories.tsx +35 -35
  88. package/dist/assets/components/popover.tsx +98 -15
  89. package/dist/assets/components/progress.stories.tsx +5 -5
  90. package/dist/assets/components/progress.tsx +5 -5
  91. package/dist/assets/components/radio-group.stories.tsx +7 -7
  92. package/dist/assets/components/radio-group.tsx +3 -3
  93. package/dist/assets/components/range-calendar.stories.tsx +18 -18
  94. package/dist/assets/components/range-calendar.tsx +3 -3
  95. package/dist/assets/components/resizable.stories.tsx +197 -0
  96. package/dist/assets/components/resizable.tsx +47 -0
  97. package/dist/assets/components/scroll-area.stories.tsx +123 -0
  98. package/dist/assets/components/scroll-area.tsx +48 -0
  99. package/dist/assets/components/scroll-shadow.stories.tsx +17 -17
  100. package/dist/assets/components/scroll-shadow.tsx +31 -9
  101. package/dist/assets/components/select.stories.tsx +20 -19
  102. package/dist/assets/components/select.tsx +10 -6
  103. package/dist/assets/components/separator.tsx +32 -0
  104. package/dist/assets/components/sheet.tsx +137 -0
  105. package/dist/assets/components/sidebar.stories.tsx +351 -0
  106. package/dist/assets/components/sidebar.tsx +757 -0
  107. package/dist/assets/components/skeleton.stories.tsx +3 -3
  108. package/dist/assets/components/skeleton.tsx +2 -2
  109. package/dist/assets/components/slider.stories.tsx +6 -6
  110. package/dist/assets/components/slider.tsx +3 -3
  111. package/dist/assets/components/spacer.stories.tsx +11 -11
  112. package/dist/assets/components/spacer.tsx +2 -2
  113. package/dist/assets/components/spinner.stories.tsx +8 -8
  114. package/dist/assets/components/spinner.tsx +5 -5
  115. package/dist/assets/components/switch.stories.tsx +24 -20
  116. package/dist/assets/components/switch.tsx +14 -6
  117. package/dist/assets/components/table.stories.tsx +7 -7
  118. package/dist/assets/components/table.tsx +8 -8
  119. package/dist/assets/components/tabs.stories.tsx +37 -37
  120. package/dist/assets/components/tabs.tsx +3 -3
  121. package/dist/assets/components/textarea.stories.tsx +13 -12
  122. package/dist/assets/components/textarea.tsx +3 -3
  123. package/dist/assets/components/theme-toggle.stories.tsx +31 -30
  124. package/dist/assets/components/theme-toggle.tsx +2 -2
  125. package/dist/assets/components/time-input.stories.tsx +16 -16
  126. package/dist/assets/components/time-input.tsx +2 -2
  127. package/dist/assets/components/toast.stories.tsx +8 -5
  128. package/dist/assets/components/toast.tsx +6 -6
  129. package/dist/assets/components/toggle-group.stories.tsx +153 -0
  130. package/dist/assets/components/toggle-group.tsx +61 -0
  131. package/dist/assets/components/toggle.stories.tsx +77 -0
  132. package/dist/assets/components/toggle.tsx +46 -0
  133. package/dist/assets/components/tooltip.stories.tsx +49 -27
  134. package/dist/assets/components/tooltip.tsx +23 -90
  135. package/dist/assets/components/user.stories.tsx +23 -23
  136. package/dist/assets/components/user.tsx +7 -4
  137. package/dist/assets/dev-tools/SonanceDevTools.tsx +4201 -0
  138. package/dist/assets/dev-tools/index.ts +10 -0
  139. package/dist/assets/globals.css +39 -0
  140. package/dist/assets/logos/40th-anniversary/Sonance_40_Logo_CMYK_BEAM_BLUE_40_AND_BEAM_DARK.png +0 -0
  141. package/dist/assets/logos/Sonance logo dark mode.png +0 -0
  142. package/dist/assets/logos/Sonance logo light mode.png +0 -0
  143. package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_2C_Light_RGB_05162025.png +0 -0
  144. package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_3C_Dark_RGB_05162025.png +0 -0
  145. package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_White_RGB_05162025.png +0 -0
  146. package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Dark_RGB.png +0 -0
  147. package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Light_RGB.png +0 -0
  148. package/dist/assets/logos/james/James_Logo_Black_CMYK.png +0 -0
  149. package/dist/assets/logos/james/James_Logo_Black_RGB.png +0 -0
  150. package/dist/assets/logos/james/James_Logo_LtGray_CMYK.png +0 -0
  151. package/dist/assets/logos/james/James_Logo_LtGray_RGB.png +0 -0
  152. package/dist/assets/logos/james/James_Logo_Polished_RGB.png +0 -0
  153. package/dist/assets/logos/james/James_Logo_Reverse_CMYK.png +0 -0
  154. package/dist/assets/logos/james/James_Logo_Reverse_RGB.png +0 -0
  155. package/dist/assets/logos/james/James_Logo_White_CMYK.png +0 -0
  156. package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Dark_RGB.png +0 -0
  157. package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Light_RGB.png +0 -0
  158. package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Dark_RGB.png +0 -0
  159. package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Light_RGB.png +0 -0
  160. package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Reverse_RGB.png +0 -0
  161. package/dist/assets/logos/my-sonance/My.Sonance_Logo_Black_RGB.png +0 -0
  162. package/dist/assets/logos/my-sonance/My.Sonance_Logo_Reverse_RGB.png +0 -0
  163. package/dist/assets/logos/sonance/Sonance_Logo_2C_Dark_RGB.png +0 -0
  164. package/dist/assets/logos/sonance/Sonance_Logo_2C_Light_RGB.png +0 -0
  165. package/dist/assets/logos/sonance/Sonance_Logo_2C_Reverse_RGB.png +0 -0
  166. package/dist/assets/logos/sonance/Sonance_Logo_Black_RGB.png +0 -0
  167. package/dist/assets/logos/sonance/Sonance_Logo_Grayscale_RGB.png +0 -0
  168. package/dist/assets/logos/sonance/Sonance_Logo_Reverse_RGB.png +0 -0
  169. package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Dark_CMYK.png +0 -0
  170. package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Light_CMYK.png +0 -0
  171. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Dark_RGB.png +0 -0
  172. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Light_RGB.png +0 -0
  173. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Reverse_RGB.png +0 -0
  174. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Black_RGB.png +0 -0
  175. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Grayscale_RGB.png +0 -0
  176. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Reverse_RGB.png +0 -0
  177. package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Dark.png +0 -0
  178. package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Light.png +0 -0
  179. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Dark.png +0 -0
  180. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Light.png +0 -0
  181. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Dark.png +0 -0
  182. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Light.png +0 -0
  183. package/dist/assets/logos/trufig/TrufigLogo_Black.png +0 -0
  184. package/dist/assets/logos/trufig/TrufigLogo_Light.png +0 -0
  185. package/dist/assets/logos/trufig/TrufigWatermark_Black.png +0 -0
  186. package/dist/assets/logos/trufig/TrufigWatermark_Light.png +0 -0
  187. package/dist/assets/styles/brand-overrides.css +37 -0
  188. package/dist/index.js +2055 -15
  189. package/package.json +1 -1
@@ -173,7 +173,7 @@ export function Autocomplete({
173
173
  }, [selectedOption]);
174
174
 
175
175
  return (
176
- <div ref={containerRef} className={cn("w-full", className)}>
176
+ <div data-sonance-name="autocomplete" ref={containerRef} className={cn("w-full", className)}>
177
177
  {label && (
178
178
  <label className="mb-2 block text-xs font-medium uppercase tracking-widest text-foreground-muted">
179
179
  {label}
@@ -248,7 +248,7 @@ export function Autocomplete({
248
248
  <div>
249
249
  <div className="text-sm">{option.label}</div>
250
250
  {option.description && (
251
- <div className={cn(
251
+ <div data-sonance-name="autocomplete" className={cn(
252
252
  "text-xs mt-0.5",
253
253
  option.value === value ? "text-primary-foreground/70" : "text-foreground-muted"
254
254
  )}>
@@ -263,7 +263,7 @@ export function Autocomplete({
263
263
  </div>
264
264
  )}
265
265
  </div>
266
- {error && <p className="mt-1 text-sm text-error">{error}</p>}
266
+ {error && <p id="p-error" className="mt-1 text-sm text-error">{error}</p>}
267
267
  </div>
268
268
  );
269
269
  }
@@ -115,20 +115,20 @@ export const ResponsiveMatrix: Story = {
115
115
  <div className="space-y-8">
116
116
  {/* Mobile */}
117
117
  <div>
118
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
118
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
119
119
  <div className="w-[375px] border border-dashed border-border p-4">
120
120
  <div className="flex items-center gap-4">
121
121
  <Avatar size="md" src="https://i.pravatar.cc/150?img=1" />
122
122
  <div>
123
- <p className="text-sm font-medium">John Doe</p>
124
- <p className="text-xs text-foreground-muted">john@example.com</p>
123
+ <p id="responsive-matrix-p-john-doe" className="text-sm font-medium">John Doe</p>
124
+ <p id="responsive-matrix-p-johnexamplecom" className="text-xs text-foreground-muted">john@example.com</p>
125
125
  </div>
126
126
  </div>
127
127
  </div>
128
128
  </div>
129
129
  {/* Tablet */}
130
130
  <div>
131
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
131
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
132
132
  <div className="w-[768px] border border-dashed border-border p-4 flex justify-between items-center">
133
133
  <div className="flex items-end gap-4">
134
134
  <Avatar size="sm" fallback="SM" />
@@ -146,7 +146,7 @@ export const ResponsiveMatrix: Story = {
146
146
  </div>
147
147
  {/* Desktop */}
148
148
  <div>
149
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
149
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
150
150
  <div className="w-[1280px] border border-dashed border-border p-4 flex justify-between items-center">
151
151
  <div className="flex items-end gap-4">
152
152
  <Avatar size="xs" fallback="XS" />
@@ -1,4 +1,7 @@
1
- import { forwardRef } from "react";
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
2
5
  import { cva, type VariantProps } from "class-variance-authority";
3
6
  import { User } from "lucide-react";
4
7
  import { cn } from "@/lib/utils";
@@ -27,15 +30,21 @@ const avatarVariants = cva(
27
30
  );
28
31
 
29
32
  interface AvatarProps
30
- extends React.HTMLAttributes<HTMLDivElement>,
33
+ extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,
31
34
  VariantProps<typeof avatarVariants> {
32
35
  src?: string;
33
36
  alt?: string;
34
37
  fallback?: string;
35
38
  }
36
39
 
37
- export const Avatar = forwardRef<HTMLDivElement, AvatarProps>(
38
- ({ className, size, shape, src, alt, fallback, ...props }, ref) => {
40
+ const Avatar = React.forwardRef<
41
+ React.ElementRef<typeof AvatarPrimitive.Root>,
42
+ AvatarProps
43
+ >(({ className, size, shape, src, alt, fallback, children, ...props }, ref) => {
44
+ // Logic for legacy props (src/fallback)
45
+ const showLegacy = (src || fallback) && React.Children.count(children) === 0;
46
+
47
+ if (showLegacy) {
39
48
  const initials = fallback
40
49
  ? fallback
41
50
  .split(" ")
@@ -46,28 +55,62 @@ export const Avatar = forwardRef<HTMLDivElement, AvatarProps>(
46
55
  : null;
47
56
 
48
57
  return (
49
- <div
58
+ <AvatarPrimitive.Root
50
59
  ref={ref}
51
60
  className={cn(avatarVariants({ size, shape }), className)}
52
61
  {...props}
53
62
  >
54
- {src ? (
55
- <img
56
- src={src}
57
- alt={alt || "Avatar"}
58
- className="h-full w-full object-cover"
59
- />
60
- ) : initials ? (
61
- <span className="font-medium text-foreground-muted">{initials}</span>
62
- ) : (
63
- <User className="h-1/2 w-1/2 text-foreground-muted" />
64
- )}
65
- </div>
63
+ <AvatarImage src={src} alt={alt} />
64
+ <AvatarFallback>
65
+ {initials ? (
66
+ <span id="avatar-span-initials" className="font-medium text-foreground-muted">{initials}</span>
67
+ ) : (
68
+ <User className="h-1/2 w-1/2 text-foreground-muted" />
69
+ )}
70
+ </AvatarFallback>
71
+ </AvatarPrimitive.Root>
66
72
  );
67
73
  }
68
- );
69
74
 
70
- Avatar.displayName = "Avatar";
75
+ // Modern composable usage
76
+ return (
77
+ <AvatarPrimitive.Root
78
+ ref={ref}
79
+ className={cn(avatarVariants({ size, shape }), className)}
80
+ {...props}
81
+ >
82
+ {children}
83
+ </AvatarPrimitive.Root>
84
+ );
85
+ });
86
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
87
+
88
+ const AvatarImage = React.forwardRef<
89
+ React.ElementRef<typeof AvatarPrimitive.Image>,
90
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
91
+ >(({ className, ...props }, ref) => (
92
+ <AvatarPrimitive.Image
93
+ ref={ref}
94
+ className={cn("aspect-square h-full w-full object-cover", className)}
95
+ {...props}
96
+ />
97
+ ));
98
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
99
+
100
+ const AvatarFallback = React.forwardRef<
101
+ React.ElementRef<typeof AvatarPrimitive.Fallback>,
102
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
103
+ >(({ className, ...props }, ref) => (
104
+ <AvatarPrimitive.Fallback
105
+ ref={ref}
106
+ className={cn(
107
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
108
+ className
109
+ )}
110
+ {...props}
111
+ />
112
+ ));
113
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
71
114
 
72
115
  // Avatar Group
73
116
  interface AvatarGroupProps {
@@ -77,29 +120,30 @@ interface AvatarGroupProps {
77
120
  className?: string;
78
121
  }
79
122
 
80
- export function AvatarGroup({ children, max, size = "md", className }: AvatarGroupProps) {
123
+ function AvatarGroup({ children, max, size = "md", className }: AvatarGroupProps) {
81
124
  const avatars = Array.isArray(children) ? children : [children];
82
125
  const displayAvatars = max ? avatars.slice(0, max) : avatars;
83
126
  const excess = max ? Math.max(0, avatars.length - max) : 0;
84
127
 
85
128
  return (
86
- <div className={cn("flex -space-x-2", className)}>
129
+ <div data-sonance-name="avatar" className={cn("flex -space-x-2", className)}>
87
130
  {displayAvatars.map((avatar, index) => (
88
131
  <div key={index} className="ring-2 ring-background rounded-full">
89
132
  {avatar}
90
133
  </div>
91
134
  ))}
92
135
  {excess > 0 && (
93
- <div
136
+ <div data-sonance-name="avatar"
94
137
  className={cn(
95
138
  avatarVariants({ size, shape: "circle" }),
96
139
  "ring-2 ring-background bg-background-tertiary"
97
140
  )}
98
141
  >
99
- <span className="text-xs font-medium text-foreground-muted">+{excess}</span>
142
+ <span id="avatar-group-span-excess" className="text-xs font-medium text-foreground-muted">+{excess}</span>
100
143
  </div>
101
144
  )}
102
145
  </div>
103
146
  );
104
147
  }
105
148
 
149
+ export { Avatar, AvatarImage, AvatarFallback, AvatarGroup };
@@ -129,19 +129,19 @@ export const StatusExamples: Story = {
129
129
  <div className="space-y-4">
130
130
  <div className="flex items-center gap-2">
131
131
  <Badge variant="success">Active</Badge>
132
- <span className="text-foreground-secondary">User account is active</span>
132
+ <span id="status-examples-span-user-account-is-acti" className="text-foreground-secondary">User account is active</span>
133
133
  </div>
134
134
  <div className="flex items-center gap-2">
135
135
  <Badge variant="warning">Pending</Badge>
136
- <span className="text-foreground-secondary">Awaiting approval</span>
136
+ <span id="status-examples-span-awaiting-approval" className="text-foreground-secondary">Awaiting approval</span>
137
137
  </div>
138
138
  <div className="flex items-center gap-2">
139
139
  <Badge variant="error">Suspended</Badge>
140
- <span className="text-foreground-secondary">Account suspended</span>
140
+ <span id="status-examples-span-account-suspended" className="text-foreground-secondary">Account suspended</span>
141
141
  </div>
142
142
  <div className="flex items-center gap-2">
143
143
  <Badge variant="info">New</Badge>
144
- <span className="text-foreground-secondary">Recently added</span>
144
+ <span id="status-examples-span-recently-added" className="text-foreground-secondary">Recently added</span>
145
145
  </div>
146
146
  </div>
147
147
  ),
@@ -180,15 +180,15 @@ export const CountBadges: Story = {
180
180
  render: () => (
181
181
  <div className="flex items-center gap-6">
182
182
  <div className="relative">
183
- <span className="text-foreground">Notifications</span>
183
+ <span id="count-badges-span-notifications" className="text-foreground">Notifications</span>
184
184
  <Badge variant="error" size="sm" className="absolute -top-2 -right-6">3</Badge>
185
185
  </div>
186
186
  <div className="relative">
187
- <span className="text-foreground">Messages</span>
187
+ <span id="count-badges-span-messages" className="text-foreground">Messages</span>
188
188
  <Badge variant="primary" size="sm" className="absolute -top-2 -right-6">12</Badge>
189
189
  </div>
190
190
  <div className="relative">
191
- <span className="text-foreground">Cart</span>
191
+ <span id="count-badges-span-cart" className="text-foreground">Cart</span>
192
192
  <Badge variant="info" size="sm" className="absolute -top-2 -right-4">5</Badge>
193
193
  </div>
194
194
  </div>
@@ -201,7 +201,7 @@ export const ResponsiveMatrix: Story = {
201
201
  <div className="space-y-8">
202
202
  {/* Mobile */}
203
203
  <div>
204
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
204
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
205
205
  <div className="w-[375px] border border-dashed border-border p-4">
206
206
  <div className="flex flex-wrap gap-2">
207
207
  <Badge variant="primary">Primary</Badge>
@@ -214,7 +214,7 @@ export const ResponsiveMatrix: Story = {
214
214
  </div>
215
215
  {/* Tablet */}
216
216
  <div>
217
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
217
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
218
218
  <div className="w-[768px] border border-dashed border-border p-4">
219
219
  <div className="flex items-center gap-4">
220
220
  <div className="flex gap-2">
@@ -232,7 +232,7 @@ export const ResponsiveMatrix: Story = {
232
232
  </div>
233
233
  {/* Desktop */}
234
234
  <div>
235
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
235
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
236
236
  <div className="w-[1280px] border border-dashed border-border p-4">
237
237
  <div className="flex items-center justify-between">
238
238
  <div className="flex gap-2">
@@ -34,7 +34,7 @@ interface BadgeProps
34
34
 
35
35
  export function Badge({ className, variant, size, ...props }: BadgeProps) {
36
36
  return (
37
- <span className={cn(badgeVariants({ variant, size }), className)} {...props} />
37
+ <span id="badge-span" data-sonance-name="badge" className={cn(badgeVariants({ variant, size }), className)} {...props} />
38
38
  );
39
39
  }
40
40
 
@@ -45,7 +45,7 @@ interface ChipProps extends BadgeProps {
45
45
 
46
46
  export function Chip({ className, variant, size, onClose, children, ...props }: ChipProps) {
47
47
  return (
48
- <span className={cn(badgeVariants({ variant, size }), "gap-1", className)} {...props}>
48
+ <span id="chip-span" className={cn(badgeVariants({ variant, size }), "gap-1", className)} data-sonance-name="badge" {...props}>
49
49
  {children}
50
50
  {onClose && (
51
51
  <button
@@ -55,7 +55,7 @@ export function Chip({ className, variant, size, onClose, children, ...props }:
55
55
  <svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
56
56
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
57
57
  </svg>
58
- <span className="sr-only">Remove</span>
58
+ <span id="chip-span-remove" className="sr-only">Remove</span>
59
59
  </button>
60
60
  )}
61
61
  </span>
@@ -61,7 +61,7 @@ export const WithIcons: Story = {
61
61
 
62
62
  export const CustomSeparator: Story = {
63
63
  args: {
64
- separator: <span className="text-foreground-muted">/</span>,
64
+ separator: <span id="custom-separator-span" className="text-foreground-muted">/</span>,
65
65
  items: [
66
66
  { label: 'Home', href: '#' },
67
67
  { label: 'Category', href: '#' },
@@ -89,7 +89,7 @@ export const AllExamples: Story = {
89
89
  render: () => (
90
90
  <div className="space-y-6">
91
91
  <div>
92
- <p className="text-xs text-foreground-muted mb-2">Simple</p>
92
+ <p id="all-examples-p-simple" className="text-xs text-foreground-muted mb-2">Simple</p>
93
93
  <Breadcrumbs
94
94
  items={[
95
95
  { label: 'Home', href: '#' },
@@ -98,7 +98,7 @@ export const AllExamples: Story = {
98
98
  />
99
99
  </div>
100
100
  <div>
101
- <p className="text-xs text-foreground-muted mb-2">With Home Icon</p>
101
+ <p id="all-examples-p-with-home-icon" className="text-xs text-foreground-muted mb-2">With Home Icon</p>
102
102
  <Breadcrumbs
103
103
  showHome
104
104
  items={[
@@ -108,7 +108,7 @@ export const AllExamples: Story = {
108
108
  />
109
109
  </div>
110
110
  <div>
111
- <p className="text-xs text-foreground-muted mb-2">Deep Navigation</p>
111
+ <p id="all-examples-p-deep-navigation" className="text-xs text-foreground-muted mb-2">Deep Navigation</p>
112
112
  <Breadcrumbs
113
113
  items={[
114
114
  { label: 'Level 1', href: '#' },
@@ -128,7 +128,7 @@ export const ResponsiveMatrix: Story = {
128
128
  <div className="space-y-8">
129
129
  {/* Mobile */}
130
130
  <div>
131
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
131
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
132
132
  <div className="w-[375px] border border-dashed border-border p-4">
133
133
  <Breadcrumbs
134
134
  items={[
@@ -140,7 +140,7 @@ export const ResponsiveMatrix: Story = {
140
140
  </div>
141
141
  {/* Tablet */}
142
142
  <div>
143
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
143
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
144
144
  <div className="w-[768px] border border-dashed border-border p-4">
145
145
  <Breadcrumbs
146
146
  showHome
@@ -155,7 +155,7 @@ export const ResponsiveMatrix: Story = {
155
155
  </div>
156
156
  {/* Desktop */}
157
157
  <div>
158
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
158
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
159
159
  <div className="w-[1280px] border border-dashed border-border p-4">
160
160
  <Breadcrumbs
161
161
  showHome
@@ -34,20 +34,21 @@ export function Breadcrumbs({
34
34
  : items;
35
35
 
36
36
  return (
37
- <nav aria-label="Breadcrumb" className={cn("flex items-center", className)}>
37
+ <nav data-sonance-name="breadcrumbs" aria-label="Breadcrumb" className={cn("flex items-center", className)}>
38
38
  <ol className="flex items-center gap-2">
39
39
  {allItems.map((item, index) => {
40
40
  const isLast = index === allItems.length - 1;
41
41
 
42
42
  return (
43
- <li key={index} className="flex items-center gap-2">
43
+ <li data-sonance-name="breadcrumbs" key={index} className="flex items-center gap-2">
44
44
  {index > 0 && (
45
- <span className="text-foreground-muted" aria-hidden="true">
45
+ <span id="nav-span-separatorelement" className="text-foreground-muted" aria-hidden="true">
46
46
  {separatorElement}
47
47
  </span>
48
48
  )}
49
49
  {isLast ? (
50
50
  <span
51
+ id="breadcrumbs-span-itemicon-itemlabel"
51
52
  className="flex items-center gap-1.5 text-sm font-medium text-foreground"
52
53
  aria-current="page"
53
54
  >
@@ -56,6 +57,7 @@ export function Breadcrumbs({
56
57
  </span>
57
58
  ) : (
58
59
  <a
60
+ id="breadcrumbs-a"
59
61
  href={item.href}
60
62
  className={cn(
61
63
  "flex items-center gap-1.5 text-sm text-foreground-muted",
@@ -81,7 +83,7 @@ export const BreadcrumbList = forwardRef<
81
83
  >(({ className, ...props }, ref) => (
82
84
  <ol
83
85
  ref={ref}
84
- className={cn("flex items-center gap-2 flex-wrap", className)}
86
+ className={cn("flex items-center gap-2 flex-wrap", className)} data-sonance-name="breadcrumbs"
85
87
  {...props}
86
88
  />
87
89
  ));
@@ -94,7 +96,7 @@ export const BreadcrumbItem = forwardRef<
94
96
  >(({ className, ...props }, ref) => (
95
97
  <li
96
98
  ref={ref}
97
- className={cn("flex items-center gap-2", className)}
99
+ className={cn("flex items-center gap-2", className)} data-sonance-name="breadcrumbs"
98
100
  {...props}
99
101
  />
100
102
  ));
@@ -106,11 +108,12 @@ export const BreadcrumbLink = forwardRef<
106
108
  React.AnchorHTMLAttributes<HTMLAnchorElement>
107
109
  >(({ className, ...props }, ref) => (
108
110
  <a
111
+ id="breadcrumb-link-a"
109
112
  ref={ref}
110
113
  className={cn(
111
114
  "text-sm text-foreground-muted hover:text-foreground transition-colors",
112
115
  className
113
- )}
116
+ )} data-sonance-name="breadcrumbs"
114
117
  {...props}
115
118
  />
116
119
  ));
@@ -122,9 +125,10 @@ export const BreadcrumbPage = forwardRef<
122
125
  React.HTMLAttributes<HTMLSpanElement>
123
126
  >(({ className, ...props }, ref) => (
124
127
  <span
128
+ id="breadcrumb-page-span"
125
129
  ref={ref}
126
130
  aria-current="page"
127
- className={cn("text-sm font-medium text-foreground", className)}
131
+ className={cn("text-sm font-medium text-foreground", className)} data-sonance-name="breadcrumbs"
128
132
  {...props}
129
133
  />
130
134
  ));
@@ -136,9 +140,10 @@ export const BreadcrumbSeparator = forwardRef<
136
140
  React.HTMLAttributes<HTMLSpanElement>
137
141
  >(({ className, children, ...props }, ref) => (
138
142
  <span
143
+ id="breadcrumb-separator-span"
139
144
  ref={ref}
140
145
  aria-hidden="true"
141
- className={cn("text-foreground-muted", className)}
146
+ className={cn("text-foreground-muted", className)} data-sonance-name="breadcrumbs"
142
147
  {...props}
143
148
  >
144
149
  {children || <ChevronRight className="h-4 w-4" />}