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
@@ -1,97 +1,30 @@
1
- "use client";
1
+ "use client"
2
2
 
3
- import { useState, useRef, useEffect } from "react";
4
- import { cn } from "@/lib/utils";
3
+ import * as React from "react"
4
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip"
5
5
 
6
- type TooltipPosition = "top" | "bottom" | "left" | "right";
6
+ import { cn } from "@/lib/utils"
7
7
 
8
- interface TooltipProps {
9
- content: React.ReactNode;
10
- children: React.ReactNode;
11
- /** @deprecated Use `side` instead */
12
- position?: TooltipPosition;
13
- side?: TooltipPosition;
14
- delay?: number;
15
- className?: string;
16
- }
8
+ const TooltipProvider = TooltipPrimitive.Provider
17
9
 
18
- export function Tooltip({
19
- content,
20
- children,
21
- position,
22
- side = "top",
23
- delay = 200,
24
- className,
25
- }: TooltipProps) {
26
- // Support both `position` (legacy) and `side` (preferred)
27
- const resolvedPosition = position ?? side;
28
- const [isVisible, setIsVisible] = useState(false);
29
- const timeoutRef = useRef<NodeJS.Timeout | null>(null);
10
+ const Tooltip = TooltipPrimitive.Root
30
11
 
31
- const showTooltip = () => {
32
- timeoutRef.current = setTimeout(() => {
33
- setIsVisible(true);
34
- }, delay);
35
- };
12
+ const TooltipTrigger = TooltipPrimitive.Trigger
36
13
 
37
- const hideTooltip = () => {
38
- if (timeoutRef.current) {
39
- clearTimeout(timeoutRef.current);
40
- }
41
- setIsVisible(false);
42
- };
43
-
44
- useEffect(() => {
45
- return () => {
46
- if (timeoutRef.current) {
47
- clearTimeout(timeoutRef.current);
48
- }
49
- };
50
- }, []);
51
-
52
- const positionClasses: Record<TooltipPosition, string> = {
53
- top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
54
- bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
55
- left: "right-full top-1/2 -translate-y-1/2 mr-2",
56
- right: "left-full top-1/2 -translate-y-1/2 ml-2",
57
- };
58
-
59
- const arrowClasses: Record<TooltipPosition, string> = {
60
- top: "top-full left-1/2 -translate-x-1/2 border-t-sonance-charcoal border-x-transparent border-b-transparent",
61
- bottom: "bottom-full left-1/2 -translate-x-1/2 border-b-sonance-charcoal border-x-transparent border-t-transparent",
62
- left: "left-full top-1/2 -translate-y-1/2 border-l-sonance-charcoal border-y-transparent border-r-transparent",
63
- right: "right-full top-1/2 -translate-y-1/2 border-r-sonance-charcoal border-y-transparent border-l-transparent",
64
- };
65
-
66
- return (
67
- <div
68
- className="relative inline-block"
69
- onMouseEnter={showTooltip}
70
- onMouseLeave={hideTooltip}
71
- onFocus={showTooltip}
72
- onBlur={hideTooltip}
73
- >
74
- {children}
75
- {isVisible && (
76
- <div
77
- role="tooltip"
78
- className={cn(
79
- "absolute z-50 px-3 py-1.5 text-xs font-medium text-white bg-sonance-charcoal whitespace-nowrap",
80
- "animate-in fade-in zoom-in-95 duration-150",
81
- positionClasses[resolvedPosition],
82
- className
83
- )}
84
- >
85
- {content}
86
- <span
87
- className={cn(
88
- "absolute border-4",
89
- arrowClasses[resolvedPosition]
90
- )}
91
- />
92
- </div>
93
- )}
94
- </div>
95
- );
96
- }
14
+ const TooltipContent = React.forwardRef<
15
+ React.ElementRef<typeof TooltipPrimitive.Content>,
16
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
17
+ >(({ className, sideOffset = 4, ...props }, ref) => (
18
+ <TooltipPrimitive.Content data-sonance-name="tooltip"
19
+ ref={ref}
20
+ sideOffset={sideOffset}
21
+ className={cn(
22
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
23
+ className
24
+ )}
25
+ {...props}
26
+ />
27
+ ))
28
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName
97
29
 
30
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -43,15 +43,15 @@ export const Sizes: Story = {
43
43
  render: () => (
44
44
  <div className="space-y-4">
45
45
  <div>
46
- <p className="text-xs text-foreground-muted mb-2">Small</p>
46
+ <p id="sizes-p-small" className="text-xs text-foreground-muted mb-2">Small</p>
47
47
  <User name="John Doe" description="Designer" size="sm" />
48
48
  </div>
49
49
  <div>
50
- <p className="text-xs text-foreground-muted mb-2">Medium (default)</p>
50
+ <p id="sizes-p-medium-default" className="text-xs text-foreground-muted mb-2">Medium (default)</p>
51
51
  <User name="John Doe" description="Designer" size="md" />
52
52
  </div>
53
53
  <div>
54
- <p className="text-xs text-foreground-muted mb-2">Large</p>
54
+ <p id="sizes-p-large" className="text-xs text-foreground-muted mb-2">Large</p>
55
55
  <User name="John Doe" description="Designer" size="lg" />
56
56
  </div>
57
57
  </div>
@@ -79,7 +79,7 @@ export const Card: Story = {
79
79
  name="Sarah Wilson"
80
80
  description="sarah@sonance.com"
81
81
  avatarSrc="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop"
82
- actions={<Button size="sm" variant="secondary">Follow</Button>}
82
+ actions={<Button id="card-button-secondary" size="sm" variant="secondary">Follow</Button>}
83
83
  />
84
84
  </div>
85
85
  ),
@@ -91,7 +91,7 @@ export const CardVariations: Story = {
91
91
  <UserCard
92
92
  name="David Lee"
93
93
  description="Architect"
94
- actions={<Button size="sm" variant="secondary">Message</Button>}
94
+ actions={<Button id="card-variations-button-secondary" size="sm" variant="secondary">Message</Button>}
95
95
  />
96
96
  <UserCard
97
97
  name="Emily Chen"
@@ -99,8 +99,8 @@ export const CardVariations: Story = {
99
99
  avatarSrc="https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=100&h=100&fit=crop"
100
100
  actions={
101
101
  <div className="flex gap-2">
102
- <Button size="sm" variant="ghost">Ignore</Button>
103
- <Button size="sm">Accept</Button>
102
+ <Button id="card-variations-button-ghost" size="sm" variant="ghost">Ignore</Button>
103
+ <Button id="card-variations-button" size="sm">Accept</Button>
104
104
  </div>
105
105
  }
106
106
  />
@@ -138,17 +138,17 @@ export const ListWithActions: Story = {
138
138
  name="Alice Brown"
139
139
  description="Project Manager"
140
140
  avatarSrc="https://images.unsplash.com/photo-1580489944761-15a19d654956?w=100&h=100&fit=crop"
141
- actions={<Button size="sm" variant="ghost">Remove</Button>}
141
+ actions={<Button id="list-with-actions-button-ghost" size="sm" variant="ghost">Remove</Button>}
142
142
  />
143
143
  <UserListItem
144
144
  name="Bob Johnson"
145
145
  description="Developer"
146
- actions={<Button size="sm" variant="ghost">Remove</Button>}
146
+ actions={<Button id="list-with-actions-button-ghost" size="sm" variant="ghost">Remove</Button>}
147
147
  />
148
148
  <UserListItem
149
149
  name="Carol White"
150
150
  description="Designer"
151
- actions={<Button size="sm" variant="ghost">Remove</Button>}
151
+ actions={<Button id="list-with-actions-button-ghost" size="sm" variant="ghost">Remove</Button>}
152
152
  />
153
153
  </div>
154
154
  ),
@@ -164,8 +164,8 @@ export const TeamList: Story = {
164
164
  ];
165
165
 
166
166
  return (
167
- <div className="w-80">
168
- <h3 className="text-sm font-medium text-foreground mb-4">Leadership Team</h3>
167
+ <div data-sonance-name="user.stories" className="w-80">
168
+ <h3 id="team-list-h3-leadership-team" className="text-sm font-medium text-foreground mb-4">Leadership Team</h3>
169
169
  <div className="space-y-3">
170
170
  {team.map((member) => (
171
171
  <User
@@ -185,22 +185,22 @@ export const AllVariants: Story = {
185
185
  render: () => (
186
186
  <div className="space-y-8">
187
187
  <div>
188
- <h3 className="text-sm font-medium text-foreground mb-4">User Component</h3>
188
+ <h3 id="all-variants-h3-user-component" className="text-sm font-medium text-foreground mb-4">User Component</h3>
189
189
  <User name="Alex Johnson" description="Product Designer" />
190
190
  </div>
191
191
 
192
192
  <div>
193
- <h3 className="text-sm font-medium text-foreground mb-4">User Card</h3>
193
+ <h3 id="all-variants-h3-user-card" className="text-sm font-medium text-foreground mb-4">User Card</h3>
194
194
  <UserCard
195
195
  name="Sarah Wilson"
196
196
  description="sarah@sonance.com"
197
- actions={<Button size="sm" variant="secondary">Follow</Button>}
197
+ actions={<Button id="all-variants-button-secondary" size="sm" variant="secondary">Follow</Button>}
198
198
  className="w-80"
199
199
  />
200
200
  </div>
201
201
 
202
202
  <div>
203
- <h3 className="text-sm font-medium text-foreground mb-4">User List Items</h3>
203
+ <h3 id="all-variants-h3-user-list-items" className="text-sm font-medium text-foreground mb-4">User List Items</h3>
204
204
  <div className="w-80 border border-border">
205
205
  <UserListItem name="Chris Taylor" description="chris@example.com" />
206
206
  <UserListItem name="Sam Anderson" description="sam@example.com" selected />
@@ -217,32 +217,32 @@ export const ResponsiveMatrix: Story = {
217
217
  <div className="space-y-8">
218
218
  {/* Mobile */}
219
219
  <div>
220
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
220
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
221
221
  <div className="w-[375px] border border-dashed border-border p-4">
222
222
  <User name="John Doe" description="Product Designer" size="md" />
223
223
  </div>
224
224
  </div>
225
225
  {/* Tablet */}
226
226
  <div>
227
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
227
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
228
228
  <div className="w-[768px] border border-dashed border-border p-4">
229
229
  <div className="grid grid-cols-2 gap-4">
230
230
  <UserCard
231
231
  name="Sarah Wilson"
232
232
  description="sarah@sonance.com"
233
- actions={<Button size="sm" variant="secondary">Follow</Button>}
233
+ actions={<Button id="responsive-matrix-button-secondary" size="sm" variant="secondary">Follow</Button>}
234
234
  />
235
235
  <UserCard
236
236
  name="James Miller"
237
237
  description="james@sonance.com"
238
- actions={<Button size="sm" variant="secondary">Follow</Button>}
238
+ actions={<Button id="responsive-matrix-button-secondary" size="sm" variant="secondary">Follow</Button>}
239
239
  />
240
240
  </div>
241
241
  </div>
242
242
  </div>
243
243
  {/* Desktop */}
244
244
  <div>
245
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
245
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
246
246
  <div className="w-[1280px] border border-dashed border-border p-4">
247
247
  <div className="grid grid-cols-3 gap-4">
248
248
  <div className="border border-border">
@@ -256,8 +256,8 @@ export const ResponsiveMatrix: Story = {
256
256
  avatarSrc="https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=100&h=100&fit=crop"
257
257
  actions={
258
258
  <div className="flex gap-2">
259
- <Button size="sm" variant="ghost">Ignore</Button>
260
- <Button size="sm">Accept</Button>
259
+ <Button id="responsive-matrix-button-ghost" size="sm" variant="ghost">Ignore</Button>
260
+ <Button id="responsive-matrix-button" size="sm">Accept</Button>
261
261
  </div>
262
262
  }
263
263
  />
@@ -40,9 +40,9 @@ export const User = forwardRef<HTMLDivElement, UserProps>(
40
40
  };
41
41
 
42
42
  return (
43
- <div
43
+ <div data-sonance-name="user"
44
44
  ref={ref}
45
- className={cn(userVariants({ size }), className)}
45
+ className={cn(userVariants({ size }), className)}
46
46
  {...props}
47
47
  >
48
48
  <Avatar
@@ -52,6 +52,7 @@ export const User = forwardRef<HTMLDivElement, UserProps>(
52
52
  />
53
53
  <div className="flex flex-col min-w-0">
54
54
  <span
55
+ id="user-span-name"
55
56
  className={cn(
56
57
  "font-medium text-foreground truncate",
57
58
  nameSizeClasses[size || "md"]
@@ -61,6 +62,7 @@ export const User = forwardRef<HTMLDivElement, UserProps>(
61
62
  </span>
62
63
  {description && (
63
64
  <span
65
+ id="user-span-description"
64
66
  className={cn(
65
67
  "text-foreground-muted truncate",
66
68
  descSizeClasses[size || "md"]
@@ -96,7 +98,7 @@ export function UserCard({
96
98
  className,
97
99
  }: UserCardProps) {
98
100
  return (
99
- <div
101
+ <div data-sonance-name="user"
100
102
  className={cn(
101
103
  "flex items-center justify-between gap-4 p-4",
102
104
  "border border-border bg-card",
@@ -151,9 +153,10 @@ export function UserListItem({
151
153
  size="sm"
152
154
  />
153
155
  <div className="flex flex-col min-w-0">
154
- <span className="text-sm font-medium truncate">{name}</span>
156
+ <span id="user-list-item-span-name" className="text-sm font-medium truncate">{name}</span>
155
157
  {description && (
156
158
  <span
159
+ id="user-list-item-span-description"
157
160
  className={cn(
158
161
  "text-xs truncate",
159
162
  selected ? "text-primary-foreground/70" : "text-foreground-muted"