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
@@ -25,7 +25,7 @@ type Story = StoryObj<typeof meta>;
25
25
 
26
26
  export const InlineDefault: Story = {
27
27
  render: () => (
28
- <p className="text-foreground-secondary">
28
+ <p id="inline-default-p" className="text-foreground-secondary">
29
29
  Use the <Code>npm install</Code> command to install dependencies.
30
30
  </p>
31
31
  ),
@@ -33,7 +33,7 @@ export const InlineDefault: Story = {
33
33
 
34
34
  export const InlinePrimary: Story = {
35
35
  render: () => (
36
- <p className="text-foreground-secondary">
36
+ <p id="inline-primary-p" className="text-foreground-secondary">
37
37
  The <Code variant="primary">useState</Code> hook is used for managing state in React.
38
38
  </p>
39
39
  ),
@@ -79,7 +79,7 @@ export function Counter() {
79
79
  const [count, setCount] = useState(0);
80
80
 
81
81
  return (
82
- <button onClick={() => setCount(count + 1)}>
82
+ <button data-sonance-name="code.stories" onClick={() => setCount(count + 1)}>
83
83
  Count: {count}
84
84
  </button>
85
85
  );
@@ -104,7 +104,7 @@ export function Counter() {
104
104
  return (
105
105
  <div>
106
106
  <button onClick={decrement}>-</button>
107
- <span>{count}</span>
107
+ <span id="counter-span-count">{count}</span>
108
108
  <button onClick={increment}>+</button>
109
109
  </div>
110
110
  );
@@ -131,15 +131,15 @@ export const InstallCommands: Story = {
131
131
  render: () => (
132
132
  <div className="space-y-4">
133
133
  <div>
134
- <p className="text-xs text-foreground-muted mb-2">npm</p>
134
+ <p id="install-commands-p-npm" className="text-xs text-foreground-muted mb-2">npm</p>
135
135
  <Snippet text="npm install @sonance/ui" />
136
136
  </div>
137
137
  <div>
138
- <p className="text-xs text-foreground-muted mb-2">pnpm</p>
138
+ <p id="install-commands-p-pnpm" className="text-xs text-foreground-muted mb-2">pnpm</p>
139
139
  <Snippet text="pnpm add @sonance/ui" />
140
140
  </div>
141
141
  <div>
142
- <p className="text-xs text-foreground-muted mb-2">yarn</p>
142
+ <p id="install-commands-p-yarn" className="text-xs text-foreground-muted mb-2">yarn</p>
143
143
  <Snippet text="yarn add @sonance/ui" />
144
144
  </div>
145
145
  </div>
@@ -149,9 +149,9 @@ export const InstallCommands: Story = {
149
149
  export const DocumentationExample: Story = {
150
150
  render: () => (
151
151
  <div className="max-w-2xl space-y-6">
152
- <h2 className="text-xl font-semibold text-foreground">Button Component</h2>
152
+ <h2 id="documentation-example-h2-button-component" className="text-xl font-semibold text-foreground">Button Component</h2>
153
153
 
154
- <p className="text-foreground-secondary">
154
+ <p id="documentation-example-p" className="text-foreground-secondary">
155
155
  Import the <Code>Button</Code> component from the UI library:
156
156
  </p>
157
157
 
@@ -162,16 +162,16 @@ export const DocumentationExample: Story = {
162
162
 
163
163
  export function MyComponent() {
164
164
  return (
165
- <Button variant="primary" size="lg">
165
+ <Button id="my-component-button-primary" variant="primary" size="lg">
166
166
  Click me
167
167
  </Button>
168
168
  );
169
169
  }`}
170
170
  />
171
171
 
172
- <h3 className="text-lg font-medium text-foreground">Props</h3>
172
+ <h3 id="my-component-h3-props" className="text-lg font-medium text-foreground">Props</h3>
173
173
 
174
- <p className="text-foreground-secondary">
174
+ <p id="my-component-p" className="text-foreground-secondary">
175
175
  The <Code variant="primary">variant</Code> prop accepts{' '}
176
176
  <Code>primary</Code>, <Code>secondary</Code>, <Code>ghost</Code>, or{' '}
177
177
  <Code>inverted</Code>.
@@ -184,14 +184,14 @@ export const AllExamples: Story = {
184
184
  render: () => (
185
185
  <div className="space-y-8 max-w-2xl">
186
186
  <div>
187
- <h3 className="text-sm font-medium text-foreground mb-2">Inline Code</h3>
188
- <p className="text-foreground-secondary">
187
+ <h3 id="all-examples-h3-inline-code" className="text-sm font-medium text-foreground mb-2">Inline Code</h3>
188
+ <p id="all-examples-p" className="text-foreground-secondary">
189
189
  Default: <Code>const x = 1</Code> | Primary: <Code variant="primary">useState</Code>
190
190
  </p>
191
191
  </div>
192
192
 
193
193
  <div>
194
- <h3 className="text-sm font-medium text-foreground mb-2">Code Block</h3>
194
+ <h3 id="all-examples-h3-code-block" className="text-sm font-medium text-foreground mb-2">Code Block</h3>
195
195
  <CodeBlock
196
196
  code={`const greeting = "Hello, World!";
197
197
  console.log(greeting);`}
@@ -199,7 +199,7 @@ console.log(greeting);`}
199
199
  </div>
200
200
 
201
201
  <div>
202
- <h3 className="text-sm font-medium text-foreground mb-2">Snippet</h3>
202
+ <h3 id="all-examples-h3-snippet" className="text-sm font-medium text-foreground mb-2">Snippet</h3>
203
203
  <Snippet text="npm install @sonance/ui" />
204
204
  </div>
205
205
  </div>
@@ -212,9 +212,9 @@ export const ResponsiveMatrix: Story = {
212
212
  <div className="space-y-8">
213
213
  {/* Mobile */}
214
214
  <div>
215
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
215
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
216
216
  <div className="w-[375px] border border-dashed border-border p-4 space-y-4">
217
- <p className="text-foreground-secondary text-sm">
217
+ <p id="responsive-matrix-p" className="text-foreground-secondary text-sm">
218
218
  Use <Code>npm install</Code> to install.
219
219
  </p>
220
220
  <Snippet text="npm install @sonance/ui" />
@@ -222,13 +222,13 @@ export const ResponsiveMatrix: Story = {
222
222
  </div>
223
223
  {/* Tablet */}
224
224
  <div>
225
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
225
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
226
226
  <div className="w-[768px] border border-dashed border-border p-4">
227
227
  <CodeBlock
228
228
  code={`import { Button } from '@sonance/ui';
229
229
 
230
230
  export function App() {
231
- return <Button>Click me</Button>;
231
+ return <Button id="app-button">Click me</Button>;
232
232
  }`}
233
233
  language="tsx"
234
234
  />
@@ -236,7 +236,7 @@ export function App() {
236
236
  </div>
237
237
  {/* Desktop */}
238
238
  <div>
239
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
239
+ <h4 id="app-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
240
240
  <div className="w-[1280px] border border-dashed border-border p-4">
241
241
  <CodeBlock
242
242
  filename="component.tsx"
@@ -250,9 +250,9 @@ export function ContactForm() {
250
250
 
251
251
  return (
252
252
  <Card>
253
- <Input label="Name" value={name} onChange={(e) => setName(e.target.value)} />
254
- <Input label="Email" value={email} onChange={(e) => setEmail(e.target.value)} />
255
- <Button>Submit</Button>
253
+ <Input id="contact-form-input" label="Name" value={name} onChange={(e) => setName(e.target.value)} />
254
+ <Input id="contact-form-input" label="Email" value={email} onChange={(e) => setEmail(e.target.value)} />
255
+ <Button id="contact-form-button">Submit</Button>
256
256
  </Card>
257
257
  );
258
258
  }`}
@@ -17,14 +17,7 @@ export const Code = forwardRef<HTMLElement, CodeProps>(
17
17
  };
18
18
 
19
19
  return (
20
- <code
21
- ref={ref}
22
- className={cn(
23
- "px-1 py-0.5 font-mono text-xs sm:text-sm rounded-sm",
24
- "break-words",
25
- variantClasses[variant],
26
- className
27
- )}
20
+ <code data-sonance-name="code"
28
21
  {...props}
29
22
  />
30
23
  );
@@ -62,12 +55,12 @@ export function CodeBlock({
62
55
  const lines = code.split("\n");
63
56
 
64
57
  return (
65
- <div className={cn("relative group w-full max-w-full overflow-hidden", className)}>
58
+ <div data-sonance-name="code" className={cn("relative group w-full max-w-full overflow-hidden", className)}>
66
59
  {filename && (
67
60
  <div className="flex items-center justify-between px-3 sm:px-4 py-2 border-b border-border bg-background-tertiary">
68
- <span className="text-xs font-medium text-foreground-muted truncate">{filename}</span>
61
+ <span id="code-block-span-filename" className="text-xs font-medium text-foreground-muted truncate">{filename}</span>
69
62
  {language && (
70
- <span className="text-xs uppercase tracking-wider text-foreground-subtle flex-shrink-0 ml-2">
63
+ <span id="code-block-span-language" className="text-xs uppercase tracking-wider text-foreground-subtle flex-shrink-0 ml-2">
71
64
  {language}
72
65
  </span>
73
66
  )}
@@ -91,10 +84,10 @@ export function CodeBlock({
91
84
  highlightLines.includes(index + 1) && "bg-primary/10 -mx-3 sm:-mx-4 px-3 sm:px-4"
92
85
  )}
93
86
  >
94
- <span className="mr-3 sm:mr-4 inline-block w-6 sm:w-8 select-none text-right text-foreground-subtle">
87
+ <span id="code-block-span-index-1" className="mr-3 sm:mr-4 inline-block w-6 sm:w-8 select-none text-right text-foreground-subtle">
95
88
  {index + 1}
96
89
  </span>
97
- <span>{line}</span>
90
+ <span id="code-block-span-line">{line}</span>
98
91
  </div>
99
92
  ))
100
93
  ) : (
@@ -156,7 +149,7 @@ export function Snippet({
156
149
  className
157
150
  )}
158
151
  >
159
- {symbol && <span className="text-foreground-muted flex-shrink-0">{symbol}</span>}
152
+ {symbol && <span id="snippet-span-symbol" className="text-foreground-muted flex-shrink-0">{symbol}</span>}
160
153
  <code className="text-foreground truncate">{text}</code>
161
154
  {!hideCopyButton && (
162
155
  <button
@@ -22,13 +22,13 @@ function CollapsibleDemo() {
22
22
  const [isOpen, setIsOpen] = useState(false);
23
23
 
24
24
  return (
25
- <Collapsible
25
+ <Collapsible data-sonance-name="collapsible.stories"
26
26
  open={isOpen}
27
27
  onOpenChange={setIsOpen}
28
28
  className="w-[350px] space-y-2"
29
29
  >
30
30
  <div className="flex items-center justify-between space-x-4 px-4">
31
- <h4 className="text-sm font-medium text-foreground">
31
+ <h4 id="collapsible-demo-h4-peduarte-starred-3-r" className="text-sm font-medium text-foreground">
32
32
  @peduarte starred 3 repositories
33
33
  </h4>
34
34
  <CollapsibleTrigger asChild>
@@ -39,7 +39,7 @@ function CollapsibleDemo() {
39
39
  isOpen && "rotate-180"
40
40
  )}
41
41
  />
42
- <span className="sr-only">Toggle</span>
42
+ <span id="collapsible-demo-span-toggle" className="sr-only">Toggle</span>
43
43
  </button>
44
44
  </CollapsibleTrigger>
45
45
  </div>
@@ -43,32 +43,32 @@ export const Default: Story = {
43
43
  <CommandGroup heading="Suggestions">
44
44
  <CommandItem>
45
45
  <Calendar className="mr-2 h-4 w-4" />
46
- <span>Calendar</span>
46
+ <span id="default-span-calendar">Calendar</span>
47
47
  </CommandItem>
48
48
  <CommandItem>
49
49
  <Smile className="mr-2 h-4 w-4" />
50
- <span>Search Emoji</span>
50
+ <span id="default-span-search-emoji">Search Emoji</span>
51
51
  </CommandItem>
52
52
  <CommandItem>
53
53
  <Calculator className="mr-2 h-4 w-4" />
54
- <span>Calculator</span>
54
+ <span id="default-span-calculator">Calculator</span>
55
55
  </CommandItem>
56
56
  </CommandGroup>
57
57
  <CommandSeparator />
58
58
  <CommandGroup heading="Settings">
59
59
  <CommandItem>
60
60
  <User className="mr-2 h-4 w-4" />
61
- <span>Profile</span>
61
+ <span id="default-span-profile">Profile</span>
62
62
  <CommandShortcut>⌘P</CommandShortcut>
63
63
  </CommandItem>
64
64
  <CommandItem>
65
65
  <CreditCard className="mr-2 h-4 w-4" />
66
- <span>Billing</span>
66
+ <span id="default-span-billing">Billing</span>
67
67
  <CommandShortcut>⌘B</CommandShortcut>
68
68
  </CommandItem>
69
69
  <CommandItem>
70
70
  <Settings className="mr-2 h-4 w-4" />
71
- <span>Settings</span>
71
+ <span id="default-span-settings">Settings</span>
72
72
  <CommandShortcut>⌘S</CommandShortcut>
73
73
  </CommandItem>
74
74
  </CommandGroup>
@@ -94,10 +94,10 @@ function CommandDialogDemo() {
94
94
 
95
95
  return (
96
96
  <>
97
- <p className="text-sm text-foreground-muted">
97
+ <p id="command-dialog-demo-p" className="text-sm text-foreground-muted">
98
98
  Press{" "}
99
99
  <kbd className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-card px-1.5 font-mono text-[10px] font-medium text-foreground-muted opacity-100">
100
- <span className="text-xs">⌘</span>K
100
+ <span id="command-dialog-demo-span" className="text-xs">⌘</span>K
101
101
  </kbd>
102
102
  </p>
103
103
  <CommandDialog open={open} onOpenChange={setOpen}>
@@ -107,32 +107,32 @@ function CommandDialogDemo() {
107
107
  <CommandGroup heading="Suggestions">
108
108
  <CommandItem>
109
109
  <Calendar className="mr-2 h-4 w-4" />
110
- <span>Calendar</span>
110
+ <span id="command-dialog-demo-span-calendar">Calendar</span>
111
111
  </CommandItem>
112
112
  <CommandItem>
113
113
  <Smile className="mr-2 h-4 w-4" />
114
- <span>Search Emoji</span>
114
+ <span id="command-dialog-demo-span-search-emoji">Search Emoji</span>
115
115
  </CommandItem>
116
116
  <CommandItem>
117
117
  <Calculator className="mr-2 h-4 w-4" />
118
- <span>Calculator</span>
118
+ <span id="command-dialog-demo-span-calculator">Calculator</span>
119
119
  </CommandItem>
120
120
  </CommandGroup>
121
121
  <CommandSeparator />
122
122
  <CommandGroup heading="Settings">
123
123
  <CommandItem>
124
124
  <User className="mr-2 h-4 w-4" />
125
- <span>Profile</span>
125
+ <span id="command-dialog-demo-span-profile">Profile</span>
126
126
  <CommandShortcut>⌘P</CommandShortcut>
127
127
  </CommandItem>
128
128
  <CommandItem>
129
129
  <CreditCard className="mr-2 h-4 w-4" />
130
- <span>Billing</span>
130
+ <span id="command-dialog-demo-span-billing">Billing</span>
131
131
  <CommandShortcut>⌘B</CommandShortcut>
132
132
  </CommandItem>
133
133
  <CommandItem>
134
134
  <Settings className="mr-2 h-4 w-4" />
135
- <span>Settings</span>
135
+ <span id="command-dialog-demo-span-settings">Settings</span>
136
136
  <CommandShortcut>⌘S</CommandShortcut>
137
137
  </CommandItem>
138
138
  </CommandGroup>
@@ -19,7 +19,7 @@ const Command = React.forwardRef<
19
19
  className={cn(
20
20
  "flex h-full w-full flex-col overflow-hidden rounded-sm bg-card text-foreground",
21
21
  className
22
- )}
22
+ )} data-sonance-name="command"
23
23
  {...props}
24
24
  />
25
25
  ));
@@ -37,7 +37,7 @@ const CommandDialog = ({ children, open, onOpenChange }: CommandDialogProps) =>
37
37
  }, [onOpenChange]);
38
38
 
39
39
  return (
40
- <Dialog open={open ?? false} onClose={handleClose}>
40
+ <Dialog data-sonance-name="command" open={open ?? false} onClose={handleClose}>
41
41
  <DialogContent className="overflow-hidden p-0 shadow-lg" showClose={false}>
42
42
  <DialogTitle className="sr-only">Command Menu</DialogTitle>
43
43
  <Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-foreground-muted [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
@@ -146,10 +146,11 @@ const CommandShortcut = ({
146
146
  }: React.HTMLAttributes<HTMLSpanElement>) => {
147
147
  return (
148
148
  <span
149
+ id="command-shortcut-span"
149
150
  className={cn(
150
151
  "ml-auto text-xs tracking-widest text-foreground-muted",
151
152
  className
152
- )}
153
+ )} data-sonance-name="command"
153
154
  {...props}
154
155
  />
155
156
  );
@@ -128,7 +128,7 @@ export const FileContextMenu: Story = {
128
128
  <ContextMenu>
129
129
  <ContextMenuTrigger className="flex h-[100px] w-[200px] flex-col items-center justify-center gap-2 rounded-sm border border-border bg-card p-4">
130
130
  <div className="h-12 w-12 rounded-sm bg-secondary-hover" />
131
- <span className="text-sm text-foreground">Document.pdf</span>
131
+ <span id="file-context-menu-span-documentpdf" className="text-sm text-foreground">Document.pdf</span>
132
132
  </ContextMenuTrigger>
133
133
  <ContextMenuContent className="w-48">
134
134
  <ContextMenuItem>
@@ -117,7 +117,7 @@ const ContextMenuCheckboxItem = React.forwardRef<
117
117
  checked={checked}
118
118
  {...props}
119
119
  >
120
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
120
+ <span id="context-menu-checkbox-item-span" className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
121
121
  <ContextMenuPrimitive.ItemIndicator>
122
122
  <Check className="h-4 w-4" />
123
123
  </ContextMenuPrimitive.ItemIndicator>
@@ -142,7 +142,7 @@ const ContextMenuRadioItem = React.forwardRef<
142
142
  )}
143
143
  {...props}
144
144
  >
145
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
145
+ <span id="context-menu-radio-item-span" className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
146
146
  <ContextMenuPrimitive.ItemIndicator>
147
147
  <Circle className="h-2 w-2 fill-current" />
148
148
  </ContextMenuPrimitive.ItemIndicator>
@@ -187,11 +187,7 @@ const ContextMenuShortcut = ({
187
187
  ...props
188
188
  }: React.HTMLAttributes<HTMLSpanElement>) => {
189
189
  return (
190
- <span
191
- className={cn(
192
- "ml-auto text-xs tracking-widest text-foreground-muted",
193
- className
194
- )}
190
+ <span id="context-menu-shortcut-span" data-sonance-name="context-menu"
195
191
  {...props}
196
192
  />
197
193
  );
@@ -59,13 +59,13 @@ export const Default: Story = {
59
59
  render: () => {
60
60
  const [date, setDate] = useState<Date | undefined>(undefined);
61
61
  return (
62
- <div className="w-64">
62
+ <div data-sonance-name="date-input.stories" className="w-64">
63
63
  <DateInput
64
64
  value={date}
65
65
  onValueChange={setDate}
66
66
  />
67
67
  {date && (
68
- <p className="mt-2 text-sm text-foreground-muted">
68
+ <p id="default-p-selected-datetolocal" className="mt-2 text-sm text-foreground-muted">
69
69
  Selected: {date.toLocaleDateString()}
70
70
  </p>
71
71
  )}
@@ -196,8 +196,8 @@ export const FormExample: Story = {
196
196
  error={hasError ? "End date must be after start date" : undefined}
197
197
  />
198
198
  <div className="text-sm text-foreground-muted">
199
- {startDate && <p>Start: {startDate.toLocaleDateString()}</p>}
200
- {endDate && <p>End: {endDate.toLocaleDateString()}</p>}
199
+ {startDate && <p id="form-example-p-start-startdatetoloc">Start: {startDate.toLocaleDateString()}</p>}
200
+ {endDate && <p id="form-example-p-end-enddatetolocaled">End: {endDate.toLocaleDateString()}</p>}
201
201
  </div>
202
202
  </div>
203
203
  );
@@ -222,11 +222,11 @@ export const StateMatrix: Story = {
222
222
  const states: DateInputState[] = ['default', 'hover', 'focus', 'error', 'disabled'];
223
223
  return (
224
224
  <div className="space-y-6 w-64">
225
- <h3 className="text-sm font-medium text-foreground-muted">DateInput States</h3>
225
+ <h3 id="state-matrix-h3-dateinput-states" className="text-sm font-medium text-foreground-muted">DateInput States</h3>
226
226
  <div className="space-y-4">
227
227
  {states.map((state) => (
228
228
  <div key={state}>
229
- <span className="text-xs font-medium text-foreground-muted uppercase">{state}</span>
229
+ <span id="state-matrix-span-state" className="text-xs font-medium text-foreground-muted uppercase">{state}</span>
230
230
  <DateInput
231
231
  state={state}
232
232
  placeholder="MM/DD/YYYY"
@@ -246,14 +246,14 @@ export const ResponsiveMatrix: Story = {
246
246
  <div className="space-y-8">
247
247
  {/* Mobile */}
248
248
  <div>
249
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
249
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
250
250
  <div className="w-[375px] border border-dashed border-border p-4">
251
251
  <DateInput label="Date of Birth" placeholder="MM/DD/YYYY" />
252
252
  </div>
253
253
  </div>
254
254
  {/* Tablet */}
255
255
  <div>
256
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
256
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
257
257
  <div className="w-[768px] border border-dashed border-border p-4">
258
258
  <div className="grid grid-cols-2 gap-4">
259
259
  <DateInput label="Start Date" placeholder="MM/DD/YYYY" />
@@ -263,7 +263,7 @@ export const ResponsiveMatrix: Story = {
263
263
  </div>
264
264
  {/* Desktop */}
265
265
  <div>
266
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
266
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
267
267
  <div className="w-[1280px] border border-dashed border-border p-4">
268
268
  <div className="grid grid-cols-4 gap-4">
269
269
  <DateInput label="Default" placeholder="MM/DD/YYYY" />
@@ -98,7 +98,7 @@ export const DateInput = forwardRef<HTMLInputElement, DateInputProps>(
98
98
  };
99
99
 
100
100
  return (
101
- <div className={cn("w-full", className)}>
101
+ <div data-sonance-name="date-input" className={cn("w-full", className)}>
102
102
  {label && (
103
103
  <label className="mb-2 block text-xs font-medium uppercase tracking-widest text-foreground-muted">
104
104
  {label}
@@ -125,7 +125,7 @@ export const DateInput = forwardRef<HTMLInputElement, DateInputProps>(
125
125
  />
126
126
  <CalendarIcon className="absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-foreground-muted" />
127
127
  </div>
128
- {error && <p className="mt-1 text-sm text-error">{error}</p>}
128
+ {error && <p id="p-error" className="mt-1 text-sm text-error">{error}</p>}
129
129
  </div>
130
130
  );
131
131
  }
@@ -60,7 +60,7 @@ export const Default: Story = {
60
60
  render: () => {
61
61
  const [date, setDate] = useState<Date | undefined>(undefined);
62
62
  return (
63
- <div className="w-72">
63
+ <div data-sonance-name="date-picker.stories" className="w-72">
64
64
  <DatePicker
65
65
  value={date}
66
66
  onValueChange={setDate}
@@ -134,7 +134,7 @@ export const WithMinMaxDates: Story = {
134
134
  minDate={addDays(today, 1)}
135
135
  maxDate={addDays(today, 30)}
136
136
  />
137
- <p className="text-xs text-foreground-muted">
137
+ <p id="with-min-max-dates-p-delivery-available-w" className="text-xs text-foreground-muted">
138
138
  Delivery available within 1-30 days from today
139
139
  </p>
140
140
  </div>
@@ -237,7 +237,7 @@ export const FormExample: Story = {
237
237
 
238
238
  return (
239
239
  <div className="space-y-4 w-72">
240
- <h3 className="text-sm font-medium">Book Your Stay</h3>
240
+ <h3 id="form-example-h3-book-your-stay" className="text-sm font-medium">Book Your Stay</h3>
241
241
  <DatePicker
242
242
  label="Check-in"
243
243
  placeholder="Select check-in date"
@@ -254,7 +254,7 @@ export const FormExample: Story = {
254
254
  error={checkOutError}
255
255
  />
256
256
  {checkIn && checkOut && !checkOutError && (
257
- <p className="text-sm text-foreground-muted">
257
+ <p id="form-example-p-mathceilcheckoutgett" className="text-sm text-foreground-muted">
258
258
  {Math.ceil((checkOut.getTime() - checkIn.getTime()) / (1000 * 60 * 60 * 24))} nights
259
259
  </p>
260
260
  )}
@@ -281,11 +281,11 @@ export const StateMatrix: Story = {
281
281
  const states: DatePickerState[] = ['default', 'hover', 'focus', 'open', 'error', 'disabled'];
282
282
  return (
283
283
  <div className="space-y-6 w-72">
284
- <h3 className="text-sm font-medium text-foreground-muted">DatePicker States</h3>
284
+ <h3 id="state-matrix-h3-datepicker-states" className="text-sm font-medium text-foreground-muted">DatePicker States</h3>
285
285
  <div className="grid grid-cols-1 gap-4">
286
286
  {states.map((state) => (
287
287
  <div key={state} className="flex items-center gap-4">
288
- <span className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
288
+ <span id="state-matrix-span-state" className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
289
289
  <DatePicker
290
290
  state={state}
291
291
  placeholder="Select date"
@@ -305,14 +305,14 @@ export const ResponsiveMatrix: Story = {
305
305
  <div className="space-y-8">
306
306
  {/* Mobile */}
307
307
  <div>
308
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
308
+ <h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
309
309
  <div className="w-[375px] border border-dashed border-border p-4">
310
310
  <DatePicker label="Appointment Date" placeholder="Select date" />
311
311
  </div>
312
312
  </div>
313
313
  {/* Tablet */}
314
314
  <div>
315
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
315
+ <h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
316
316
  <div className="w-[768px] border border-dashed border-border p-4">
317
317
  <div className="grid grid-cols-2 gap-4">
318
318
  <DatePicker label="Check-in" placeholder="Select date" />
@@ -322,7 +322,7 @@ export const ResponsiveMatrix: Story = {
322
322
  </div>
323
323
  {/* Desktop */}
324
324
  <div>
325
- <h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
325
+ <h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
326
326
  <div className="w-[1280px] border border-dashed border-border p-4">
327
327
  <div className="grid grid-cols-4 gap-4">
328
328
  <DatePicker label="Default" placeholder="Select date" />
@@ -93,7 +93,7 @@ export function DatePicker({
93
93
  };
94
94
 
95
95
  return (
96
- <div ref={containerRef} className={cn("relative w-full", className)}>
96
+ <div data-sonance-name="date-picker" ref={containerRef} className={cn("relative w-full", className)}>
97
97
  {label && (
98
98
  <label className="mb-2 block text-xs font-medium uppercase tracking-widest text-foreground-muted">
99
99
  {label}
@@ -113,7 +113,7 @@ export function DatePicker({
113
113
  getStateStyles(state)
114
114
  )}
115
115
  >
116
- <span className={value ? "text-foreground" : "text-input-placeholder"}>
116
+ <span id="span-value-formatvalue-da" className={value ? "text-foreground" : "text-input-placeholder"}>
117
117
  {value ? format(value, dateFormat) : placeholder}
118
118
  </span>
119
119
  <CalendarIcon className="h-4 w-4 text-foreground-muted" />
@@ -131,7 +131,7 @@ export function DatePicker({
131
131
  </div>
132
132
  )}
133
133
 
134
- {error && <p className="mt-1 text-sm text-error">{error}</p>}
134
+ {error && <p id="p-error" className="mt-1 text-sm text-error">{error}</p>}
135
135
  </div>
136
136
  );
137
137
  }