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.
- package/dist/assets/api/sonance-analyze/route.ts +1116 -0
- package/dist/assets/api/sonance-assets/route.ts +113 -0
- package/dist/assets/api/sonance-components/route.ts +41 -0
- package/dist/assets/api/sonance-inject-id/route.ts +363 -0
- package/dist/assets/api/sonance-save-logo/route.ts +426 -0
- package/dist/assets/api/sonance-theme/route.ts +106 -0
- package/dist/assets/brand-system.ts +1265 -0
- package/dist/assets/components/accordion.stories.tsx +26 -26
- package/dist/assets/components/accordion.tsx +3 -3
- package/dist/assets/components/alert-dialog.stories.tsx +142 -0
- package/dist/assets/components/alert-dialog.tsx +143 -0
- package/dist/assets/components/alert.stories.tsx +3 -3
- package/dist/assets/components/alert.tsx +4 -3
- package/dist/assets/components/aspect-ratio.stories.tsx +70 -0
- package/dist/assets/components/aspect-ratio.tsx +8 -0
- package/dist/assets/components/autocomplete.stories.tsx +9 -9
- package/dist/assets/components/autocomplete.tsx +3 -3
- package/dist/assets/components/avatar.stories.tsx +5 -5
- package/dist/assets/components/avatar.tsx +67 -23
- package/dist/assets/components/badge.stories.tsx +10 -10
- package/dist/assets/components/badge.tsx +3 -3
- package/dist/assets/components/breadcrumbs.stories.tsx +7 -7
- package/dist/assets/components/breadcrumbs.tsx +13 -8
- package/dist/assets/components/button.stories.tsx +74 -74
- package/dist/assets/components/button.tsx +2 -0
- package/dist/assets/components/calendar.stories.tsx +11 -11
- package/dist/assets/components/calendar.tsx +4 -4
- package/dist/assets/components/card.stories.tsx +22 -22
- package/dist/assets/components/card.tsx +7 -3
- package/dist/assets/components/carousel.stories.tsx +158 -0
- package/dist/assets/components/carousel.tsx +264 -0
- package/dist/assets/components/chart.stories.tsx +376 -0
- package/dist/assets/components/chart.tsx +384 -0
- package/dist/assets/components/checkbox-group.stories.tsx +6 -6
- package/dist/assets/components/checkbox-group.tsx +3 -3
- package/dist/assets/components/checkbox.stories.tsx +23 -20
- package/dist/assets/components/checkbox.tsx +13 -6
- package/dist/assets/components/code.stories.tsx +24 -24
- package/dist/assets/components/code.tsx +22 -27
- package/dist/assets/components/collapsible.stories.tsx +128 -0
- package/dist/assets/components/collapsible.tsx +10 -0
- package/dist/assets/components/command.stories.tsx +183 -0
- package/dist/assets/components/command.tsx +171 -0
- package/dist/assets/components/context-menu.stories.tsx +159 -0
- package/dist/assets/components/context-menu.tsx +214 -0
- package/dist/assets/components/date-input.stories.tsx +9 -9
- package/dist/assets/components/date-input.tsx +2 -2
- package/dist/assets/components/date-picker.stories.tsx +9 -9
- package/dist/assets/components/date-picker.tsx +3 -3
- package/dist/assets/components/date-range-picker.stories.tsx +12 -12
- package/dist/assets/components/date-range-picker.tsx +3 -3
- package/dist/assets/components/dialog.stories.tsx +40 -40
- package/dist/assets/components/dialog.tsx +8 -12
- package/dist/assets/components/divider.stories.tsx +30 -30
- package/dist/assets/components/divider.tsx +34 -35
- package/dist/assets/components/drawer.stories.tsx +32 -31
- package/dist/assets/components/drawer.tsx +7 -6
- package/dist/assets/components/dropdown-menu.tsx +213 -0
- package/dist/assets/components/dropdown.stories.tsx +12 -12
- package/dist/assets/components/dropdown.tsx +5 -5
- package/dist/assets/components/form.stories.tsx +30 -29
- package/dist/assets/components/form.tsx +5 -5
- package/dist/assets/components/hover-card.stories.tsx +115 -0
- package/dist/assets/components/hover-card.tsx +35 -0
- package/dist/assets/components/image.stories.tsx +48 -25
- package/dist/assets/components/image.tsx +8 -5
- package/dist/assets/components/input-otp.stories.tsx +15 -15
- package/dist/assets/components/input-otp.tsx +5 -5
- package/dist/assets/components/input.stories.tsx +30 -25
- package/dist/assets/components/input.tsx +7 -4
- package/dist/assets/components/kbd.stories.tsx +34 -34
- package/dist/assets/components/kbd.tsx +9 -9
- package/dist/assets/components/link.stories.tsx +36 -36
- package/dist/assets/components/link.tsx +4 -0
- package/dist/assets/components/listbox.stories.tsx +5 -5
- package/dist/assets/components/listbox.tsx +4 -4
- package/dist/assets/components/menubar.stories.tsx +208 -0
- package/dist/assets/components/menubar.tsx +247 -0
- package/dist/assets/components/navbar.stories.tsx +24 -24
- package/dist/assets/components/navbar.tsx +8 -14
- package/dist/assets/components/navigation-menu.stories.tsx +239 -0
- package/dist/assets/components/navigation-menu.tsx +135 -0
- package/dist/assets/components/number-input.stories.tsx +11 -11
- package/dist/assets/components/number-input.tsx +3 -3
- package/dist/assets/components/pagination.stories.tsx +13 -13
- package/dist/assets/components/pagination.tsx +6 -6
- package/dist/assets/components/popover.stories.tsx +35 -35
- package/dist/assets/components/popover.tsx +98 -15
- package/dist/assets/components/progress.stories.tsx +5 -5
- package/dist/assets/components/progress.tsx +5 -5
- package/dist/assets/components/radio-group.stories.tsx +7 -7
- package/dist/assets/components/radio-group.tsx +3 -3
- package/dist/assets/components/range-calendar.stories.tsx +18 -18
- package/dist/assets/components/range-calendar.tsx +3 -3
- package/dist/assets/components/resizable.stories.tsx +197 -0
- package/dist/assets/components/resizable.tsx +47 -0
- package/dist/assets/components/scroll-area.stories.tsx +123 -0
- package/dist/assets/components/scroll-area.tsx +48 -0
- package/dist/assets/components/scroll-shadow.stories.tsx +17 -17
- package/dist/assets/components/scroll-shadow.tsx +31 -9
- package/dist/assets/components/select.stories.tsx +20 -19
- package/dist/assets/components/select.tsx +10 -6
- package/dist/assets/components/separator.tsx +32 -0
- package/dist/assets/components/sheet.tsx +137 -0
- package/dist/assets/components/sidebar.stories.tsx +351 -0
- package/dist/assets/components/sidebar.tsx +757 -0
- package/dist/assets/components/skeleton.stories.tsx +3 -3
- package/dist/assets/components/skeleton.tsx +2 -2
- package/dist/assets/components/slider.stories.tsx +6 -6
- package/dist/assets/components/slider.tsx +3 -3
- package/dist/assets/components/spacer.stories.tsx +11 -11
- package/dist/assets/components/spacer.tsx +2 -2
- package/dist/assets/components/spinner.stories.tsx +8 -8
- package/dist/assets/components/spinner.tsx +5 -5
- package/dist/assets/components/switch.stories.tsx +24 -20
- package/dist/assets/components/switch.tsx +14 -6
- package/dist/assets/components/table.stories.tsx +7 -7
- package/dist/assets/components/table.tsx +8 -8
- package/dist/assets/components/tabs.stories.tsx +37 -37
- package/dist/assets/components/tabs.tsx +3 -3
- package/dist/assets/components/textarea.stories.tsx +13 -12
- package/dist/assets/components/textarea.tsx +3 -3
- package/dist/assets/components/theme-toggle.stories.tsx +31 -30
- package/dist/assets/components/theme-toggle.tsx +2 -2
- package/dist/assets/components/time-input.stories.tsx +16 -16
- package/dist/assets/components/time-input.tsx +2 -2
- package/dist/assets/components/toast.stories.tsx +8 -5
- package/dist/assets/components/toast.tsx +6 -6
- package/dist/assets/components/toggle-group.stories.tsx +153 -0
- package/dist/assets/components/toggle-group.tsx +61 -0
- package/dist/assets/components/toggle.stories.tsx +77 -0
- package/dist/assets/components/toggle.tsx +46 -0
- package/dist/assets/components/tooltip.stories.tsx +49 -27
- package/dist/assets/components/tooltip.tsx +23 -90
- package/dist/assets/components/user.stories.tsx +23 -23
- package/dist/assets/components/user.tsx +7 -4
- package/dist/assets/dev-tools/SonanceDevTools.tsx +4201 -0
- package/dist/assets/dev-tools/index.ts +10 -0
- package/dist/assets/globals.css +39 -0
- package/dist/assets/logos/40th-anniversary/Sonance_40_Logo_CMYK_BEAM_BLUE_40_AND_BEAM_DARK.png +0 -0
- package/dist/assets/logos/Sonance logo dark mode.png +0 -0
- package/dist/assets/logos/Sonance logo light mode.png +0 -0
- package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_2C_Light_RGB_05162025.png +0 -0
- package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_3C_Dark_RGB_05162025.png +0 -0
- package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_White_RGB_05162025.png +0 -0
- package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Dark_RGB.png +0 -0
- package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Light_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_Black_CMYK.png +0 -0
- package/dist/assets/logos/james/James_Logo_Black_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_LtGray_CMYK.png +0 -0
- package/dist/assets/logos/james/James_Logo_LtGray_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_Polished_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_Reverse_CMYK.png +0 -0
- package/dist/assets/logos/james/James_Logo_Reverse_RGB.png +0 -0
- package/dist/assets/logos/james/James_Logo_White_CMYK.png +0 -0
- package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Dark_RGB.png +0 -0
- package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Light_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Dark_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Light_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Reverse_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_Black_RGB.png +0 -0
- package/dist/assets/logos/my-sonance/My.Sonance_Logo_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_2C_Dark_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_2C_Light_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_2C_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_Black_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_Grayscale_RGB.png +0 -0
- package/dist/assets/logos/sonance/Sonance_Logo_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Dark_CMYK.png +0 -0
- package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Light_CMYK.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Dark_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Light_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Black_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Grayscale_RGB.png +0 -0
- package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Reverse_RGB.png +0 -0
- package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Dark.png +0 -0
- package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Light.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Dark.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Light.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Dark.png +0 -0
- package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Light.png +0 -0
- package/dist/assets/logos/trufig/TrufigLogo_Black.png +0 -0
- package/dist/assets/logos/trufig/TrufigLogo_Light.png +0 -0
- package/dist/assets/logos/trufig/TrufigWatermark_Black.png +0 -0
- package/dist/assets/logos/trufig/TrufigWatermark_Light.png +0 -0
- package/dist/assets/styles/brand-overrides.css +37 -0
- package/dist/index.js +2055 -15
- package/package.json +1 -1
|
@@ -132,7 +132,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
132
132
|
<div className="space-y-8">
|
|
133
133
|
{/* Mobile */}
|
|
134
134
|
<div>
|
|
135
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
135
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
136
136
|
<div className="w-[375px] border border-dashed border-border p-4 space-y-4">
|
|
137
137
|
<div className="flex items-center gap-4">
|
|
138
138
|
<SkeletonAvatar size="md" />
|
|
@@ -146,7 +146,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
146
146
|
</div>
|
|
147
147
|
{/* Tablet */}
|
|
148
148
|
<div>
|
|
149
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
149
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
150
150
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
151
151
|
<div className="grid grid-cols-2 gap-4">
|
|
152
152
|
<SkeletonCard />
|
|
@@ -156,7 +156,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
156
156
|
</div>
|
|
157
157
|
{/* Desktop */}
|
|
158
158
|
<div>
|
|
159
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
159
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
160
160
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
161
161
|
<SkeletonTable rows={4} columns={5} />
|
|
162
162
|
</div>
|
|
@@ -22,6 +22,7 @@ export function Skeleton({
|
|
|
22
22
|
|
|
23
23
|
return (
|
|
24
24
|
<div
|
|
25
|
+
data-sonance-name="skeleton"
|
|
25
26
|
className={cn(
|
|
26
27
|
"animate-pulse bg-background-secondary",
|
|
27
28
|
variantClasses[variant],
|
|
@@ -40,7 +41,7 @@ export function Skeleton({
|
|
|
40
41
|
// Preset skeleton components
|
|
41
42
|
export function SkeletonText({ lines = 3, className }: { lines?: number; className?: string }) {
|
|
42
43
|
return (
|
|
43
|
-
<div className={cn("space-y-2", className)}>
|
|
44
|
+
<div data-sonance-name="skeleton" className={cn("space-y-2", className)}>
|
|
44
45
|
{Array.from({ length: lines }).map((_, i) => (
|
|
45
46
|
<Skeleton
|
|
46
47
|
key={i}
|
|
@@ -111,4 +112,3 @@ export function SkeletonTable({
|
|
|
111
112
|
</div>
|
|
112
113
|
);
|
|
113
114
|
}
|
|
114
|
-
|
|
@@ -91,12 +91,12 @@ export const StateMatrix: Story = {
|
|
|
91
91
|
render: () => {
|
|
92
92
|
const states: SliderState[] = ['default', 'hover', 'focus', 'active', 'disabled'];
|
|
93
93
|
return (
|
|
94
|
-
<div className="space-y-6 w-80">
|
|
95
|
-
<h3 className="text-sm font-medium text-foreground-muted">Slider States</h3>
|
|
94
|
+
<div data-sonance-name="slider.stories" className="space-y-6 w-80">
|
|
95
|
+
<h3 id="state-matrix-h3-slider-states" className="text-sm font-medium text-foreground-muted">Slider States</h3>
|
|
96
96
|
<div className="space-y-6">
|
|
97
97
|
{states.map((state) => (
|
|
98
98
|
<div key={state} className="flex items-center gap-4">
|
|
99
|
-
<span className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
|
|
99
|
+
<span id="state-matrix-span-state" className="text-xs font-medium text-foreground-muted uppercase w-20">{state}</span>
|
|
100
100
|
<Slider state={state} defaultValue={50} label={state} />
|
|
101
101
|
</div>
|
|
102
102
|
))}
|
|
@@ -112,7 +112,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
112
112
|
<div className="space-y-8">
|
|
113
113
|
{/* Mobile */}
|
|
114
114
|
<div>
|
|
115
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
115
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
116
116
|
<div className="w-[375px] border border-dashed border-border p-4 space-y-6">
|
|
117
117
|
<Slider label="Volume" showValue defaultValue={75} />
|
|
118
118
|
<Slider label="Brightness" showValue defaultValue={50} />
|
|
@@ -120,7 +120,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
120
120
|
</div>
|
|
121
121
|
{/* Tablet */}
|
|
122
122
|
<div>
|
|
123
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
123
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
124
124
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
125
125
|
<div className="grid grid-cols-2 gap-8">
|
|
126
126
|
<Slider label="Bass" showValue defaultValue={60} />
|
|
@@ -130,7 +130,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
130
130
|
</div>
|
|
131
131
|
{/* Desktop */}
|
|
132
132
|
<div>
|
|
133
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
133
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
134
134
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
135
135
|
<div className="grid grid-cols-4 gap-8">
|
|
136
136
|
<Slider label="Volume" showValue defaultValue={80} />
|
|
@@ -134,7 +134,7 @@ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
|
|
|
134
134
|
};
|
|
135
135
|
|
|
136
136
|
return (
|
|
137
|
-
<div ref={ref} className={cn("w-full", className)}>
|
|
137
|
+
<div data-sonance-name="slider" ref={ref} className={cn("w-full", className)}>
|
|
138
138
|
{(label || showValue) && (
|
|
139
139
|
<div className="mb-3 flex items-center justify-between">
|
|
140
140
|
{label && (
|
|
@@ -143,7 +143,7 @@ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
|
|
|
143
143
|
</label>
|
|
144
144
|
)}
|
|
145
145
|
{showValue && (
|
|
146
|
-
<span className="text-sm font-medium text-foreground">{value}</span>
|
|
146
|
+
<span id="span-value" className="text-sm font-medium text-foreground">{value}</span>
|
|
147
147
|
)}
|
|
148
148
|
</div>
|
|
149
149
|
)}
|
|
@@ -170,7 +170,7 @@ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
|
|
|
170
170
|
style={{ width: `${percentage}%` }}
|
|
171
171
|
/>
|
|
172
172
|
{/* Thumb */}
|
|
173
|
-
<div
|
|
173
|
+
<div data-sonance-name="slider"
|
|
174
174
|
className={cn(
|
|
175
175
|
"absolute top-1/2 h-5 w-5 -translate-x-1/2 -translate-y-1/2 rounded-full",
|
|
176
176
|
"border-2 border-primary bg-background shadow-sm transition-all",
|
|
@@ -66,7 +66,7 @@ export const PresetSizes: Story = {
|
|
|
66
66
|
export const FlexSpacerExample: Story = {
|
|
67
67
|
render: () => (
|
|
68
68
|
<div className="flex items-center border border-border p-4 w-96">
|
|
69
|
-
<span className="text-foreground font-medium">Logo</span>
|
|
69
|
+
<span id="flex-spacer-example-span-logo" className="text-foreground font-medium">Logo</span>
|
|
70
70
|
<FlexSpacer />
|
|
71
71
|
<button className="px-3 py-1 text-sm text-foreground-muted hover:text-foreground">About</button>
|
|
72
72
|
<Spacer x={2} />
|
|
@@ -80,11 +80,11 @@ export const FlexSpacerExample: Story = {
|
|
|
80
80
|
export const CardLayout: Story = {
|
|
81
81
|
render: () => (
|
|
82
82
|
<div className="border border-border p-6 w-80">
|
|
83
|
-
<h3 className="text-lg font-medium text-foreground">Card Title</h3>
|
|
83
|
+
<h3 id="card-layout-h3-card-title" className="text-lg font-medium text-foreground">Card Title</h3>
|
|
84
84
|
<SpacerXS />
|
|
85
|
-
<p className="text-sm text-foreground-muted">A subtitle or meta information</p>
|
|
85
|
+
<p id="card-layout-p-a-subtitle-or-meta-i" className="text-sm text-foreground-muted">A subtitle or meta information</p>
|
|
86
86
|
<SpacerMD />
|
|
87
|
-
<p className="text-foreground-secondary">
|
|
87
|
+
<p id="card-layout-p-this-is-the-main-con" className="text-foreground-secondary">
|
|
88
88
|
This is the main content of the card. Notice how spacers provide consistent rhythm between elements.
|
|
89
89
|
</p>
|
|
90
90
|
<SpacerLG />
|
|
@@ -100,7 +100,7 @@ export const CardLayout: Story = {
|
|
|
100
100
|
export const ResponsiveSpacing: Story = {
|
|
101
101
|
render: () => (
|
|
102
102
|
<div className="space-y-4">
|
|
103
|
-
<p className="text-xs text-foreground-muted">
|
|
103
|
+
<p id="responsive-spacing-p-spacer-uses-a-4px-ba" className="text-xs text-foreground-muted">
|
|
104
104
|
Spacer uses a 4px base unit. y=1 is 4px, y=4 is 16px, etc.
|
|
105
105
|
</p>
|
|
106
106
|
<div className="border border-dashed border-border p-4 w-64">
|
|
@@ -121,7 +121,7 @@ export const ResponsiveSpacing: Story = {
|
|
|
121
121
|
export const FormLayout: Story = {
|
|
122
122
|
render: () => (
|
|
123
123
|
<form className="w-80 border border-border p-6">
|
|
124
|
-
<h2 className="text-lg font-medium text-foreground">Contact Form</h2>
|
|
124
|
+
<h2 id="form-layout-h2-contact-form" className="text-lg font-medium text-foreground">Contact Form</h2>
|
|
125
125
|
<SpacerMD />
|
|
126
126
|
|
|
127
127
|
<label className="block text-sm font-medium text-foreground">Name</label>
|
|
@@ -170,7 +170,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
170
170
|
<div className="space-y-8">
|
|
171
171
|
{/* Mobile */}
|
|
172
172
|
<div>
|
|
173
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
173
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
174
174
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
175
175
|
<div className="p-2 bg-primary text-primary-foreground text-center text-sm">Header</div>
|
|
176
176
|
<SpacerMD />
|
|
@@ -181,10 +181,10 @@ export const ResponsiveMatrix: Story = {
|
|
|
181
181
|
</div>
|
|
182
182
|
{/* Tablet */}
|
|
183
183
|
<div>
|
|
184
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
184
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
185
185
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
186
186
|
<div className="flex items-center">
|
|
187
|
-
<span className="text-foreground font-medium">Logo</span>
|
|
187
|
+
<span id="responsive-matrix-span-logo" className="text-foreground font-medium">Logo</span>
|
|
188
188
|
<FlexSpacer />
|
|
189
189
|
<button className="px-3 py-1 text-sm text-foreground-muted">About</button>
|
|
190
190
|
<Spacer x={2} />
|
|
@@ -196,10 +196,10 @@ export const ResponsiveMatrix: Story = {
|
|
|
196
196
|
</div>
|
|
197
197
|
{/* Desktop */}
|
|
198
198
|
<div>
|
|
199
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
199
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
200
200
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
201
201
|
<div className="flex items-center">
|
|
202
|
-
<span className="text-foreground font-medium">Sonance</span>
|
|
202
|
+
<span id="responsive-matrix-span-sonance" className="text-foreground font-medium">Sonance</span>
|
|
203
203
|
<Spacer x={8} />
|
|
204
204
|
<button className="px-3 py-1 text-sm text-foreground-muted">Products</button>
|
|
205
205
|
<Spacer x={4} />
|
|
@@ -36,7 +36,7 @@ export function Spacer({ x, y, className }: SpacerProps) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
return (
|
|
39
|
-
<div
|
|
39
|
+
<div data-sonance-name="spacer"
|
|
40
40
|
className={cn("shrink-0", className)}
|
|
41
41
|
style={style}
|
|
42
42
|
aria-hidden="true"
|
|
@@ -46,7 +46,7 @@ export function Spacer({ x, y, className }: SpacerProps) {
|
|
|
46
46
|
|
|
47
47
|
// Common preset spacers
|
|
48
48
|
export function SpacerXS() {
|
|
49
|
-
return <Spacer y={2} />;
|
|
49
|
+
return <Spacer data-sonance-name="spacer" y={2} />;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export function SpacerSM() {
|
|
@@ -76,11 +76,11 @@ export const LoadingStates: Story = {
|
|
|
76
76
|
<div className="space-y-8">
|
|
77
77
|
<div className="flex items-center gap-4">
|
|
78
78
|
<Spinner size="sm" />
|
|
79
|
-
<span className="text-foreground-secondary">Loading content...</span>
|
|
79
|
+
<span id="loading-states-span-loading-content" className="text-foreground-secondary">Loading content...</span>
|
|
80
80
|
</div>
|
|
81
81
|
<div className="flex items-center gap-4">
|
|
82
82
|
<DotsSpinner />
|
|
83
|
-
<span className="text-foreground-secondary">Processing...</span>
|
|
83
|
+
<span id="loading-states-span-processing" className="text-foreground-secondary">Processing...</span>
|
|
84
84
|
</div>
|
|
85
85
|
<div className="text-center p-8 border border-border rounded">
|
|
86
86
|
<Spinner size="lg" label="Loading data" />
|
|
@@ -93,7 +93,7 @@ export const ButtonLoading: Story = {
|
|
|
93
93
|
render: () => (
|
|
94
94
|
<button className="inline-flex items-center gap-2 bg-primary text-primary-foreground px-6 py-3">
|
|
95
95
|
<Spinner size="sm" />
|
|
96
|
-
<span>Processing...</span>
|
|
96
|
+
<span id="button-loading-span-processing">Processing...</span>
|
|
97
97
|
</button>
|
|
98
98
|
),
|
|
99
99
|
};
|
|
@@ -104,7 +104,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
104
104
|
<div className="space-y-8">
|
|
105
105
|
{/* Mobile */}
|
|
106
106
|
<div>
|
|
107
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
107
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
108
108
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
109
109
|
<div className="text-center p-8 border border-border rounded">
|
|
110
110
|
<Spinner size="md" label="Loading..." />
|
|
@@ -113,7 +113,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
113
113
|
</div>
|
|
114
114
|
{/* Tablet */}
|
|
115
115
|
<div>
|
|
116
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
116
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
117
117
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
118
118
|
<div className="flex justify-center items-center gap-8">
|
|
119
119
|
<Spinner size="sm" label="Small" />
|
|
@@ -124,12 +124,12 @@ export const ResponsiveMatrix: Story = {
|
|
|
124
124
|
</div>
|
|
125
125
|
{/* Desktop */}
|
|
126
126
|
<div>
|
|
127
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
127
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
128
128
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
129
129
|
<div className="flex justify-between items-center">
|
|
130
130
|
<div className="flex items-center gap-4">
|
|
131
131
|
<Spinner size="sm" />
|
|
132
|
-
<span className="text-foreground-secondary">Loading content...</span>
|
|
132
|
+
<span id="responsive-matrix-span-loading-content" className="text-foreground-secondary">Loading content...</span>
|
|
133
133
|
</div>
|
|
134
134
|
<div className="flex items-center gap-8">
|
|
135
135
|
<Spinner size="sm" />
|
|
@@ -139,7 +139,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
139
139
|
</div>
|
|
140
140
|
<div className="flex items-center gap-4">
|
|
141
141
|
<DotsSpinner />
|
|
142
|
-
<span className="text-foreground-secondary">Processing...</span>
|
|
142
|
+
<span id="responsive-matrix-span-processing" className="text-foreground-secondary">Processing...</span>
|
|
143
143
|
</div>
|
|
144
144
|
</div>
|
|
145
145
|
</div>
|
|
@@ -15,7 +15,7 @@ export function Spinner({ size = "md", className, label }: SpinnerProps) {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
|
-
<div className={cn("inline-flex flex-col items-center gap-2", className)}>
|
|
18
|
+
<div data-sonance-name="spinner" className={cn("inline-flex flex-col items-center gap-2", className)}>
|
|
19
19
|
<div
|
|
20
20
|
role="status"
|
|
21
21
|
aria-label={label || "Loading"}
|
|
@@ -25,9 +25,9 @@ export function Spinner({ size = "md", className, label }: SpinnerProps) {
|
|
|
25
25
|
)}
|
|
26
26
|
/>
|
|
27
27
|
{label && (
|
|
28
|
-
<span className="text-xs font-medium text-foreground-muted">{label}</span>
|
|
28
|
+
<span id="spinner-span-label" className="text-xs font-medium text-foreground-muted">{label}</span>
|
|
29
29
|
)}
|
|
30
|
-
<span className="sr-only">{label || "Loading..."}</span>
|
|
30
|
+
<span id="spinner-span-label-loading" className="sr-only">{label || "Loading..."}</span>
|
|
31
31
|
</div>
|
|
32
32
|
);
|
|
33
33
|
}
|
|
@@ -52,7 +52,7 @@ export function DotsSpinner({ size = "md", className }: DotsSpinnerProps) {
|
|
|
52
52
|
};
|
|
53
53
|
|
|
54
54
|
return (
|
|
55
|
-
<div
|
|
55
|
+
<div data-sonance-name="spinner"
|
|
56
56
|
role="status"
|
|
57
57
|
aria-label="Loading"
|
|
58
58
|
className={cn("inline-flex items-center", gapSizes[size], className)}
|
|
@@ -70,7 +70,7 @@ export function DotsSpinner({ size = "md", className }: DotsSpinnerProps) {
|
|
|
70
70
|
}}
|
|
71
71
|
/>
|
|
72
72
|
))}
|
|
73
|
-
<span className="sr-only">Loading...</span>
|
|
73
|
+
<span id="dots-spinner-span-loading" className="sr-only">Loading...</span>
|
|
74
74
|
</div>
|
|
75
75
|
);
|
|
76
76
|
}
|
|
@@ -84,11 +84,11 @@ export const DisabledChecked: Story = {
|
|
|
84
84
|
export const AllStates: Story = {
|
|
85
85
|
render: () => (
|
|
86
86
|
<div className="space-y-4">
|
|
87
|
-
<Switch label="Off" />
|
|
88
|
-
<Switch label="On" defaultChecked />
|
|
89
|
-
<Switch label="With description" description="Additional context for this setting" />
|
|
90
|
-
<Switch label="Disabled" disabled />
|
|
91
|
-
<Switch label="Disabled on" disabled defaultChecked />
|
|
87
|
+
<Switch id="all-states-switch" label="Off" />
|
|
88
|
+
<Switch id="all-states-switch" label="On" defaultChecked />
|
|
89
|
+
<Switch id="all-states-switch" label="With description" description="Additional context for this setting" />
|
|
90
|
+
<Switch id="all-states-switch" label="Disabled" disabled />
|
|
91
|
+
<Switch id="all-states-switch" label="Disabled on" disabled defaultChecked />
|
|
92
92
|
</div>
|
|
93
93
|
),
|
|
94
94
|
};
|
|
@@ -97,21 +97,24 @@ export const AllStates: Story = {
|
|
|
97
97
|
export const SettingsExample: Story = {
|
|
98
98
|
render: () => (
|
|
99
99
|
<div className="space-y-6 w-96">
|
|
100
|
-
<h3 className="text-lg font-medium text-foreground">Settings</h3>
|
|
100
|
+
<h3 id="settings-example-h3-settings" className="text-lg font-medium text-foreground">Settings</h3>
|
|
101
101
|
<div className="space-y-4 divide-y divide-divider">
|
|
102
102
|
<Switch
|
|
103
|
+
id="settings-example-switch"
|
|
103
104
|
label="Push notifications"
|
|
104
105
|
description="Receive push notifications on your device"
|
|
105
106
|
defaultChecked
|
|
106
107
|
/>
|
|
107
108
|
<div className="pt-4">
|
|
108
109
|
<Switch
|
|
110
|
+
id="settings-example-switch"
|
|
109
111
|
label="Email digest"
|
|
110
112
|
description="Weekly summary of your activity"
|
|
111
113
|
/>
|
|
112
114
|
</div>
|
|
113
115
|
<div className="pt-4">
|
|
114
116
|
<Switch
|
|
117
|
+
id="settings-example-switch"
|
|
115
118
|
label="Auto-update"
|
|
116
119
|
description="Automatically install updates"
|
|
117
120
|
defaultChecked
|
|
@@ -119,6 +122,7 @@ export const SettingsExample: Story = {
|
|
|
119
122
|
</div>
|
|
120
123
|
<div className="pt-4">
|
|
121
124
|
<Switch
|
|
125
|
+
id="settings-example-switch"
|
|
122
126
|
label="Analytics"
|
|
123
127
|
description="Help improve the product with usage data"
|
|
124
128
|
/>
|
|
@@ -134,34 +138,34 @@ export const ResponsiveMatrix: Story = {
|
|
|
134
138
|
<div className="space-y-8">
|
|
135
139
|
{/* Mobile */}
|
|
136
140
|
<div>
|
|
137
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
141
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
138
142
|
<div className="w-[375px] border border-dashed border-border p-4 space-y-4">
|
|
139
|
-
<Switch label="Dark mode" description="Enable dark theme" />
|
|
140
|
-
<Switch label="Notifications" defaultChecked />
|
|
141
|
-
<Switch label="Auto-save" defaultChecked />
|
|
143
|
+
<Switch id="responsive-matrix-switch" label="Dark mode" description="Enable dark theme" />
|
|
144
|
+
<Switch id="responsive-matrix-switch" label="Notifications" defaultChecked />
|
|
145
|
+
<Switch id="responsive-matrix-switch" label="Auto-save" defaultChecked />
|
|
142
146
|
</div>
|
|
143
147
|
</div>
|
|
144
148
|
{/* Tablet */}
|
|
145
149
|
<div>
|
|
146
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
150
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
147
151
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
148
152
|
<div className="grid grid-cols-2 gap-4">
|
|
149
|
-
<Switch label="Email notifications" description="Receive email updates" defaultChecked />
|
|
150
|
-
<Switch label="Push notifications" description="Mobile app alerts" />
|
|
151
|
-
<Switch label="Weekly digest" description="Summary of activity" defaultChecked />
|
|
152
|
-
<Switch label="Marketing emails" description="Product announcements" />
|
|
153
|
+
<Switch id="responsive-matrix-switch" label="Email notifications" description="Receive email updates" defaultChecked />
|
|
154
|
+
<Switch id="responsive-matrix-switch" label="Push notifications" description="Mobile app alerts" />
|
|
155
|
+
<Switch id="responsive-matrix-switch" label="Weekly digest" description="Summary of activity" defaultChecked />
|
|
156
|
+
<Switch id="responsive-matrix-switch" label="Marketing emails" description="Product announcements" />
|
|
153
157
|
</div>
|
|
154
158
|
</div>
|
|
155
159
|
</div>
|
|
156
160
|
{/* Desktop */}
|
|
157
161
|
<div>
|
|
158
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
162
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
159
163
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
160
164
|
<div className="grid grid-cols-4 gap-4">
|
|
161
|
-
<Switch label="Off" />
|
|
162
|
-
<Switch label="On" defaultChecked />
|
|
163
|
-
<Switch label="Disabled" disabled />
|
|
164
|
-
<Switch label="Disabled on" disabled defaultChecked />
|
|
165
|
+
<Switch id="responsive-matrix-switch" label="Off" />
|
|
166
|
+
<Switch id="responsive-matrix-switch" label="On" defaultChecked />
|
|
167
|
+
<Switch id="responsive-matrix-switch" label="Disabled" disabled />
|
|
168
|
+
<Switch id="responsive-matrix-switch" label="Disabled on" disabled defaultChecked />
|
|
165
169
|
</div>
|
|
166
170
|
</div>
|
|
167
171
|
</div>
|
|
@@ -27,16 +27,20 @@ const getTrackStateStyles = (state?: SwitchState) => {
|
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
|
|
30
|
-
({ className, label, description, id, state, disabled, checked, ...props }, ref) => {
|
|
30
|
+
({ className, label, description, id, state, disabled, checked, defaultChecked, onChange, style, ...props }, ref) => {
|
|
31
31
|
const uniqueId = useId();
|
|
32
32
|
const inputId = id || `switch-${uniqueId}`;
|
|
33
33
|
const isDisabled = disabled || state === "disabled";
|
|
34
|
-
|
|
34
|
+
|
|
35
|
+
// Determine if we're in controlled mode
|
|
36
|
+
const isControlled = checked !== undefined || onChange !== undefined;
|
|
37
|
+
const isCheckedForState = state === "checked";
|
|
35
38
|
|
|
36
39
|
return (
|
|
37
|
-
<div className="flex items-start gap-3">
|
|
40
|
+
<div data-sonance-name="switch" className="flex items-start gap-3">
|
|
38
41
|
<label
|
|
39
42
|
htmlFor={inputId}
|
|
43
|
+
style={style}
|
|
40
44
|
className={cn(
|
|
41
45
|
"relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full",
|
|
42
46
|
"border border-border bg-input transition-colors duration-200",
|
|
@@ -52,11 +56,15 @@ export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
|
|
|
52
56
|
id={inputId}
|
|
53
57
|
ref={ref}
|
|
54
58
|
disabled={isDisabled}
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
{...(isControlled
|
|
60
|
+
? { checked: checked || isCheckedForState, onChange }
|
|
61
|
+
: { defaultChecked: defaultChecked || isCheckedForState }
|
|
62
|
+
)}
|
|
63
|
+
className="peer sr-only" data-sonance-name="switch"
|
|
57
64
|
{...props}
|
|
58
65
|
/>
|
|
59
66
|
<span
|
|
67
|
+
id="switch-span"
|
|
60
68
|
className={cn(
|
|
61
69
|
"pointer-events-none absolute left-0.5 h-5 w-5 rounded-full bg-foreground-muted shadow-sm",
|
|
62
70
|
"transition-transform duration-200",
|
|
@@ -76,7 +84,7 @@ export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
|
|
|
76
84
|
</label>
|
|
77
85
|
)}
|
|
78
86
|
{description && (
|
|
79
|
-
<p className="text-xs text-foreground-muted">{description}</p>
|
|
87
|
+
<p id="switch-p-description" className="text-xs text-foreground-muted">{description}</p>
|
|
80
88
|
)}
|
|
81
89
|
</div>
|
|
82
90
|
)}
|
|
@@ -163,7 +163,7 @@ export const WithCheckboxes: Story = {
|
|
|
163
163
|
<TableHeader>
|
|
164
164
|
<TableRow>
|
|
165
165
|
<TableHead className="w-12">
|
|
166
|
-
<Checkbox />
|
|
166
|
+
<Checkbox id="with-checkboxes-checkbox" />
|
|
167
167
|
</TableHead>
|
|
168
168
|
<TableHead>Product</TableHead>
|
|
169
169
|
<TableHead>Category</TableHead>
|
|
@@ -174,7 +174,7 @@ export const WithCheckboxes: Story = {
|
|
|
174
174
|
{products.map((product) => (
|
|
175
175
|
<TableRow key={product.id}>
|
|
176
176
|
<TableCell>
|
|
177
|
-
<Checkbox />
|
|
177
|
+
<Checkbox id="with-checkboxes-checkbox" />
|
|
178
178
|
</TableCell>
|
|
179
179
|
<TableCell className="font-medium">{product.name}</TableCell>
|
|
180
180
|
<TableCell>{product.category}</TableCell>
|
|
@@ -241,7 +241,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
241
241
|
<div className="space-y-8">
|
|
242
242
|
{/* Mobile */}
|
|
243
243
|
<div>
|
|
244
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
244
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
245
245
|
<div className="w-[375px] border border-dashed border-border p-2 overflow-x-auto">
|
|
246
246
|
<Table>
|
|
247
247
|
<TableHeader>
|
|
@@ -263,7 +263,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
263
263
|
</div>
|
|
264
264
|
{/* Tablet */}
|
|
265
265
|
<div>
|
|
266
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
266
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
267
267
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
268
268
|
<Table>
|
|
269
269
|
<TableHeader>
|
|
@@ -287,12 +287,12 @@ export const ResponsiveMatrix: Story = {
|
|
|
287
287
|
</div>
|
|
288
288
|
{/* Desktop */}
|
|
289
289
|
<div>
|
|
290
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
290
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
291
291
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
292
292
|
<Table>
|
|
293
293
|
<TableHeader>
|
|
294
294
|
<TableRow>
|
|
295
|
-
<TableHead className="w-12"><Checkbox /></TableHead>
|
|
295
|
+
<TableHead className="w-12"><Checkbox id="responsive-matrix-checkbox" /></TableHead>
|
|
296
296
|
<TableHead>Product</TableHead>
|
|
297
297
|
<TableHead>Category</TableHead>
|
|
298
298
|
<TableHead>Status</TableHead>
|
|
@@ -302,7 +302,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
302
302
|
<TableBody>
|
|
303
303
|
{products.map((product) => (
|
|
304
304
|
<TableRow key={product.id}>
|
|
305
|
-
<TableCell><Checkbox /></TableCell>
|
|
305
|
+
<TableCell><Checkbox id="responsive-matrix-checkbox" /></TableCell>
|
|
306
306
|
<TableCell className="font-medium">{product.name}</TableCell>
|
|
307
307
|
<TableCell>{product.category}</TableCell>
|
|
308
308
|
<TableCell>
|
|
@@ -8,7 +8,7 @@ export const Table = forwardRef<
|
|
|
8
8
|
<div className="w-full overflow-auto">
|
|
9
9
|
<table
|
|
10
10
|
ref={ref}
|
|
11
|
-
className={cn("w-full caption-bottom text-sm", className)}
|
|
11
|
+
className={cn("w-full caption-bottom text-sm", className)} data-sonance-name="table"
|
|
12
12
|
{...props}
|
|
13
13
|
/>
|
|
14
14
|
</div>
|
|
@@ -20,7 +20,7 @@ export const TableHeader = forwardRef<
|
|
|
20
20
|
HTMLTableSectionElement,
|
|
21
21
|
React.HTMLAttributes<HTMLTableSectionElement>
|
|
22
22
|
>(({ className, ...props }, ref) => (
|
|
23
|
-
<thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />
|
|
23
|
+
<thead ref={ref} className={cn("[&_tr]:border-b", className)} data-sonance-name="table" {...props} />
|
|
24
24
|
));
|
|
25
25
|
|
|
26
26
|
TableHeader.displayName = "TableHeader";
|
|
@@ -31,7 +31,7 @@ export const TableBody = forwardRef<
|
|
|
31
31
|
>(({ className, ...props }, ref) => (
|
|
32
32
|
<tbody
|
|
33
33
|
ref={ref}
|
|
34
|
-
className={cn("[&_tr:last-child]:border-0", className)}
|
|
34
|
+
className={cn("[&_tr:last-child]:border-0", className)} data-sonance-name="table"
|
|
35
35
|
{...props}
|
|
36
36
|
/>
|
|
37
37
|
));
|
|
@@ -47,7 +47,7 @@ export const TableFooter = forwardRef<
|
|
|
47
47
|
className={cn(
|
|
48
48
|
"border-t border-border bg-background-secondary font-medium",
|
|
49
49
|
className
|
|
50
|
-
)}
|
|
50
|
+
)} data-sonance-name="table"
|
|
51
51
|
{...props}
|
|
52
52
|
/>
|
|
53
53
|
));
|
|
@@ -65,7 +65,7 @@ export const TableRow = forwardRef<
|
|
|
65
65
|
"hover:bg-card-hover",
|
|
66
66
|
"data-[state=selected]:bg-secondary-hover",
|
|
67
67
|
className
|
|
68
|
-
)}
|
|
68
|
+
)} data-sonance-name="table"
|
|
69
69
|
{...props}
|
|
70
70
|
/>
|
|
71
71
|
));
|
|
@@ -83,7 +83,7 @@ export const TableHead = forwardRef<
|
|
|
83
83
|
"text-xs uppercase tracking-widest",
|
|
84
84
|
"[&:has([role=checkbox])]:pr-0",
|
|
85
85
|
className
|
|
86
|
-
)}
|
|
86
|
+
)} data-sonance-name="table"
|
|
87
87
|
{...props}
|
|
88
88
|
/>
|
|
89
89
|
));
|
|
@@ -100,7 +100,7 @@ export const TableCell = forwardRef<
|
|
|
100
100
|
"p-4 align-middle text-foreground",
|
|
101
101
|
"[&:has([role=checkbox])]:pr-0",
|
|
102
102
|
className
|
|
103
|
-
)}
|
|
103
|
+
)} data-sonance-name="table"
|
|
104
104
|
{...props}
|
|
105
105
|
/>
|
|
106
106
|
));
|
|
@@ -113,7 +113,7 @@ export const TableCaption = forwardRef<
|
|
|
113
113
|
>(({ className, ...props }, ref) => (
|
|
114
114
|
<caption
|
|
115
115
|
ref={ref}
|
|
116
|
-
className={cn("mt-4 text-sm text-foreground-muted", className)}
|
|
116
|
+
className={cn("mt-4 text-sm text-foreground-muted", className)} data-sonance-name="table"
|
|
117
117
|
{...props}
|
|
118
118
|
/>
|
|
119
119
|
));
|