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
|
@@ -173,7 +173,7 @@ export function Autocomplete({
|
|
|
173
173
|
}, [selectedOption]);
|
|
174
174
|
|
|
175
175
|
return (
|
|
176
|
-
<div ref={containerRef} className={cn("w-full", className)}>
|
|
176
|
+
<div data-sonance-name="autocomplete" ref={containerRef} className={cn("w-full", className)}>
|
|
177
177
|
{label && (
|
|
178
178
|
<label className="mb-2 block text-xs font-medium uppercase tracking-widest text-foreground-muted">
|
|
179
179
|
{label}
|
|
@@ -248,7 +248,7 @@ export function Autocomplete({
|
|
|
248
248
|
<div>
|
|
249
249
|
<div className="text-sm">{option.label}</div>
|
|
250
250
|
{option.description && (
|
|
251
|
-
<div className={cn(
|
|
251
|
+
<div data-sonance-name="autocomplete" className={cn(
|
|
252
252
|
"text-xs mt-0.5",
|
|
253
253
|
option.value === value ? "text-primary-foreground/70" : "text-foreground-muted"
|
|
254
254
|
)}>
|
|
@@ -263,7 +263,7 @@ export function Autocomplete({
|
|
|
263
263
|
</div>
|
|
264
264
|
)}
|
|
265
265
|
</div>
|
|
266
|
-
{error && <p className="mt-1 text-sm text-error">{error}</p>}
|
|
266
|
+
{error && <p id="p-error" className="mt-1 text-sm text-error">{error}</p>}
|
|
267
267
|
</div>
|
|
268
268
|
);
|
|
269
269
|
}
|
|
@@ -115,20 +115,20 @@ export const ResponsiveMatrix: Story = {
|
|
|
115
115
|
<div className="space-y-8">
|
|
116
116
|
{/* Mobile */}
|
|
117
117
|
<div>
|
|
118
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
118
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
119
119
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
120
120
|
<div className="flex items-center gap-4">
|
|
121
121
|
<Avatar size="md" src="https://i.pravatar.cc/150?img=1" />
|
|
122
122
|
<div>
|
|
123
|
-
<p className="text-sm font-medium">John Doe</p>
|
|
124
|
-
<p className="text-xs text-foreground-muted">john@example.com</p>
|
|
123
|
+
<p id="responsive-matrix-p-john-doe" className="text-sm font-medium">John Doe</p>
|
|
124
|
+
<p id="responsive-matrix-p-johnexamplecom" className="text-xs text-foreground-muted">john@example.com</p>
|
|
125
125
|
</div>
|
|
126
126
|
</div>
|
|
127
127
|
</div>
|
|
128
128
|
</div>
|
|
129
129
|
{/* Tablet */}
|
|
130
130
|
<div>
|
|
131
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
131
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
132
132
|
<div className="w-[768px] border border-dashed border-border p-4 flex justify-between items-center">
|
|
133
133
|
<div className="flex items-end gap-4">
|
|
134
134
|
<Avatar size="sm" fallback="SM" />
|
|
@@ -146,7 +146,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
146
146
|
</div>
|
|
147
147
|
{/* Desktop */}
|
|
148
148
|
<div>
|
|
149
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
149
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
150
150
|
<div className="w-[1280px] border border-dashed border-border p-4 flex justify-between items-center">
|
|
151
151
|
<div className="flex items-end gap-4">
|
|
152
152
|
<Avatar size="xs" fallback="XS" />
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
2
5
|
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
6
|
import { User } from "lucide-react";
|
|
4
7
|
import { cn } from "@/lib/utils";
|
|
@@ -27,15 +30,21 @@ const avatarVariants = cva(
|
|
|
27
30
|
);
|
|
28
31
|
|
|
29
32
|
interface AvatarProps
|
|
30
|
-
extends React.
|
|
33
|
+
extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,
|
|
31
34
|
VariantProps<typeof avatarVariants> {
|
|
32
35
|
src?: string;
|
|
33
36
|
alt?: string;
|
|
34
37
|
fallback?: string;
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
const Avatar = React.forwardRef<
|
|
41
|
+
React.ElementRef<typeof AvatarPrimitive.Root>,
|
|
42
|
+
AvatarProps
|
|
43
|
+
>(({ className, size, shape, src, alt, fallback, children, ...props }, ref) => {
|
|
44
|
+
// Logic for legacy props (src/fallback)
|
|
45
|
+
const showLegacy = (src || fallback) && React.Children.count(children) === 0;
|
|
46
|
+
|
|
47
|
+
if (showLegacy) {
|
|
39
48
|
const initials = fallback
|
|
40
49
|
? fallback
|
|
41
50
|
.split(" ")
|
|
@@ -46,28 +55,62 @@ export const Avatar = forwardRef<HTMLDivElement, AvatarProps>(
|
|
|
46
55
|
: null;
|
|
47
56
|
|
|
48
57
|
return (
|
|
49
|
-
<
|
|
58
|
+
<AvatarPrimitive.Root
|
|
50
59
|
ref={ref}
|
|
51
60
|
className={cn(avatarVariants({ size, shape }), className)}
|
|
52
61
|
{...props}
|
|
53
62
|
>
|
|
54
|
-
{src
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
<User className="h-1/2 w-1/2 text-foreground-muted" />
|
|
64
|
-
)}
|
|
65
|
-
</div>
|
|
63
|
+
<AvatarImage src={src} alt={alt} />
|
|
64
|
+
<AvatarFallback>
|
|
65
|
+
{initials ? (
|
|
66
|
+
<span id="avatar-span-initials" className="font-medium text-foreground-muted">{initials}</span>
|
|
67
|
+
) : (
|
|
68
|
+
<User className="h-1/2 w-1/2 text-foreground-muted" />
|
|
69
|
+
)}
|
|
70
|
+
</AvatarFallback>
|
|
71
|
+
</AvatarPrimitive.Root>
|
|
66
72
|
);
|
|
67
73
|
}
|
|
68
|
-
);
|
|
69
74
|
|
|
70
|
-
|
|
75
|
+
// Modern composable usage
|
|
76
|
+
return (
|
|
77
|
+
<AvatarPrimitive.Root
|
|
78
|
+
ref={ref}
|
|
79
|
+
className={cn(avatarVariants({ size, shape }), className)}
|
|
80
|
+
{...props}
|
|
81
|
+
>
|
|
82
|
+
{children}
|
|
83
|
+
</AvatarPrimitive.Root>
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
87
|
+
|
|
88
|
+
const AvatarImage = React.forwardRef<
|
|
89
|
+
React.ElementRef<typeof AvatarPrimitive.Image>,
|
|
90
|
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
|
|
91
|
+
>(({ className, ...props }, ref) => (
|
|
92
|
+
<AvatarPrimitive.Image
|
|
93
|
+
ref={ref}
|
|
94
|
+
className={cn("aspect-square h-full w-full object-cover", className)}
|
|
95
|
+
{...props}
|
|
96
|
+
/>
|
|
97
|
+
));
|
|
98
|
+
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
99
|
+
|
|
100
|
+
const AvatarFallback = React.forwardRef<
|
|
101
|
+
React.ElementRef<typeof AvatarPrimitive.Fallback>,
|
|
102
|
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
|
|
103
|
+
>(({ className, ...props }, ref) => (
|
|
104
|
+
<AvatarPrimitive.Fallback
|
|
105
|
+
ref={ref}
|
|
106
|
+
className={cn(
|
|
107
|
+
"flex h-full w-full items-center justify-center rounded-full bg-muted",
|
|
108
|
+
className
|
|
109
|
+
)}
|
|
110
|
+
{...props}
|
|
111
|
+
/>
|
|
112
|
+
));
|
|
113
|
+
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
71
114
|
|
|
72
115
|
// Avatar Group
|
|
73
116
|
interface AvatarGroupProps {
|
|
@@ -77,29 +120,30 @@ interface AvatarGroupProps {
|
|
|
77
120
|
className?: string;
|
|
78
121
|
}
|
|
79
122
|
|
|
80
|
-
|
|
123
|
+
function AvatarGroup({ children, max, size = "md", className }: AvatarGroupProps) {
|
|
81
124
|
const avatars = Array.isArray(children) ? children : [children];
|
|
82
125
|
const displayAvatars = max ? avatars.slice(0, max) : avatars;
|
|
83
126
|
const excess = max ? Math.max(0, avatars.length - max) : 0;
|
|
84
127
|
|
|
85
128
|
return (
|
|
86
|
-
<div className={cn("flex -space-x-2", className)}>
|
|
129
|
+
<div data-sonance-name="avatar" className={cn("flex -space-x-2", className)}>
|
|
87
130
|
{displayAvatars.map((avatar, index) => (
|
|
88
131
|
<div key={index} className="ring-2 ring-background rounded-full">
|
|
89
132
|
{avatar}
|
|
90
133
|
</div>
|
|
91
134
|
))}
|
|
92
135
|
{excess > 0 && (
|
|
93
|
-
<div
|
|
136
|
+
<div data-sonance-name="avatar"
|
|
94
137
|
className={cn(
|
|
95
138
|
avatarVariants({ size, shape: "circle" }),
|
|
96
139
|
"ring-2 ring-background bg-background-tertiary"
|
|
97
140
|
)}
|
|
98
141
|
>
|
|
99
|
-
<span className="text-xs font-medium text-foreground-muted">+{excess}</span>
|
|
142
|
+
<span id="avatar-group-span-excess" className="text-xs font-medium text-foreground-muted">+{excess}</span>
|
|
100
143
|
</div>
|
|
101
144
|
)}
|
|
102
145
|
</div>
|
|
103
146
|
);
|
|
104
147
|
}
|
|
105
148
|
|
|
149
|
+
export { Avatar, AvatarImage, AvatarFallback, AvatarGroup };
|
|
@@ -129,19 +129,19 @@ export const StatusExamples: Story = {
|
|
|
129
129
|
<div className="space-y-4">
|
|
130
130
|
<div className="flex items-center gap-2">
|
|
131
131
|
<Badge variant="success">Active</Badge>
|
|
132
|
-
<span className="text-foreground-secondary">User account is active</span>
|
|
132
|
+
<span id="status-examples-span-user-account-is-acti" className="text-foreground-secondary">User account is active</span>
|
|
133
133
|
</div>
|
|
134
134
|
<div className="flex items-center gap-2">
|
|
135
135
|
<Badge variant="warning">Pending</Badge>
|
|
136
|
-
<span className="text-foreground-secondary">Awaiting approval</span>
|
|
136
|
+
<span id="status-examples-span-awaiting-approval" className="text-foreground-secondary">Awaiting approval</span>
|
|
137
137
|
</div>
|
|
138
138
|
<div className="flex items-center gap-2">
|
|
139
139
|
<Badge variant="error">Suspended</Badge>
|
|
140
|
-
<span className="text-foreground-secondary">Account suspended</span>
|
|
140
|
+
<span id="status-examples-span-account-suspended" className="text-foreground-secondary">Account suspended</span>
|
|
141
141
|
</div>
|
|
142
142
|
<div className="flex items-center gap-2">
|
|
143
143
|
<Badge variant="info">New</Badge>
|
|
144
|
-
<span className="text-foreground-secondary">Recently added</span>
|
|
144
|
+
<span id="status-examples-span-recently-added" className="text-foreground-secondary">Recently added</span>
|
|
145
145
|
</div>
|
|
146
146
|
</div>
|
|
147
147
|
),
|
|
@@ -180,15 +180,15 @@ export const CountBadges: Story = {
|
|
|
180
180
|
render: () => (
|
|
181
181
|
<div className="flex items-center gap-6">
|
|
182
182
|
<div className="relative">
|
|
183
|
-
<span className="text-foreground">Notifications</span>
|
|
183
|
+
<span id="count-badges-span-notifications" className="text-foreground">Notifications</span>
|
|
184
184
|
<Badge variant="error" size="sm" className="absolute -top-2 -right-6">3</Badge>
|
|
185
185
|
</div>
|
|
186
186
|
<div className="relative">
|
|
187
|
-
<span className="text-foreground">Messages</span>
|
|
187
|
+
<span id="count-badges-span-messages" className="text-foreground">Messages</span>
|
|
188
188
|
<Badge variant="primary" size="sm" className="absolute -top-2 -right-6">12</Badge>
|
|
189
189
|
</div>
|
|
190
190
|
<div className="relative">
|
|
191
|
-
<span className="text-foreground">Cart</span>
|
|
191
|
+
<span id="count-badges-span-cart" className="text-foreground">Cart</span>
|
|
192
192
|
<Badge variant="info" size="sm" className="absolute -top-2 -right-4">5</Badge>
|
|
193
193
|
</div>
|
|
194
194
|
</div>
|
|
@@ -201,7 +201,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
201
201
|
<div className="space-y-8">
|
|
202
202
|
{/* Mobile */}
|
|
203
203
|
<div>
|
|
204
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
204
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
205
205
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
206
206
|
<div className="flex flex-wrap gap-2">
|
|
207
207
|
<Badge variant="primary">Primary</Badge>
|
|
@@ -214,7 +214,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
214
214
|
</div>
|
|
215
215
|
{/* Tablet */}
|
|
216
216
|
<div>
|
|
217
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
217
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
218
218
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
219
219
|
<div className="flex items-center gap-4">
|
|
220
220
|
<div className="flex gap-2">
|
|
@@ -232,7 +232,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
232
232
|
</div>
|
|
233
233
|
{/* Desktop */}
|
|
234
234
|
<div>
|
|
235
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
235
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
236
236
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
237
237
|
<div className="flex items-center justify-between">
|
|
238
238
|
<div className="flex gap-2">
|
|
@@ -34,7 +34,7 @@ interface BadgeProps
|
|
|
34
34
|
|
|
35
35
|
export function Badge({ className, variant, size, ...props }: BadgeProps) {
|
|
36
36
|
return (
|
|
37
|
-
<span className={cn(badgeVariants({ variant, size }), className)} {...props} />
|
|
37
|
+
<span id="badge-span" data-sonance-name="badge" className={cn(badgeVariants({ variant, size }), className)} {...props} />
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -45,7 +45,7 @@ interface ChipProps extends BadgeProps {
|
|
|
45
45
|
|
|
46
46
|
export function Chip({ className, variant, size, onClose, children, ...props }: ChipProps) {
|
|
47
47
|
return (
|
|
48
|
-
<span className={cn(badgeVariants({ variant, size }), "gap-1", className)} {...props}>
|
|
48
|
+
<span id="chip-span" className={cn(badgeVariants({ variant, size }), "gap-1", className)} data-sonance-name="badge" {...props}>
|
|
49
49
|
{children}
|
|
50
50
|
{onClose && (
|
|
51
51
|
<button
|
|
@@ -55,7 +55,7 @@ export function Chip({ className, variant, size, onClose, children, ...props }:
|
|
|
55
55
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
56
56
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
57
57
|
</svg>
|
|
58
|
-
<span className="sr-only">Remove</span>
|
|
58
|
+
<span id="chip-span-remove" className="sr-only">Remove</span>
|
|
59
59
|
</button>
|
|
60
60
|
)}
|
|
61
61
|
</span>
|
|
@@ -61,7 +61,7 @@ export const WithIcons: Story = {
|
|
|
61
61
|
|
|
62
62
|
export const CustomSeparator: Story = {
|
|
63
63
|
args: {
|
|
64
|
-
separator: <span className="text-foreground-muted">/</span>,
|
|
64
|
+
separator: <span id="custom-separator-span" className="text-foreground-muted">/</span>,
|
|
65
65
|
items: [
|
|
66
66
|
{ label: 'Home', href: '#' },
|
|
67
67
|
{ label: 'Category', href: '#' },
|
|
@@ -89,7 +89,7 @@ export const AllExamples: Story = {
|
|
|
89
89
|
render: () => (
|
|
90
90
|
<div className="space-y-6">
|
|
91
91
|
<div>
|
|
92
|
-
<p className="text-xs text-foreground-muted mb-2">Simple</p>
|
|
92
|
+
<p id="all-examples-p-simple" className="text-xs text-foreground-muted mb-2">Simple</p>
|
|
93
93
|
<Breadcrumbs
|
|
94
94
|
items={[
|
|
95
95
|
{ label: 'Home', href: '#' },
|
|
@@ -98,7 +98,7 @@ export const AllExamples: Story = {
|
|
|
98
98
|
/>
|
|
99
99
|
</div>
|
|
100
100
|
<div>
|
|
101
|
-
<p className="text-xs text-foreground-muted mb-2">With Home Icon</p>
|
|
101
|
+
<p id="all-examples-p-with-home-icon" className="text-xs text-foreground-muted mb-2">With Home Icon</p>
|
|
102
102
|
<Breadcrumbs
|
|
103
103
|
showHome
|
|
104
104
|
items={[
|
|
@@ -108,7 +108,7 @@ export const AllExamples: Story = {
|
|
|
108
108
|
/>
|
|
109
109
|
</div>
|
|
110
110
|
<div>
|
|
111
|
-
<p className="text-xs text-foreground-muted mb-2">Deep Navigation</p>
|
|
111
|
+
<p id="all-examples-p-deep-navigation" className="text-xs text-foreground-muted mb-2">Deep Navigation</p>
|
|
112
112
|
<Breadcrumbs
|
|
113
113
|
items={[
|
|
114
114
|
{ label: 'Level 1', href: '#' },
|
|
@@ -128,7 +128,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
128
128
|
<div className="space-y-8">
|
|
129
129
|
{/* Mobile */}
|
|
130
130
|
<div>
|
|
131
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
131
|
+
<h4 id="responsive-matrix-h4-mobile-375px" className="text-xs uppercase text-foreground-muted mb-2">Mobile (375px)</h4>
|
|
132
132
|
<div className="w-[375px] border border-dashed border-border p-4">
|
|
133
133
|
<Breadcrumbs
|
|
134
134
|
items={[
|
|
@@ -140,7 +140,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
140
140
|
</div>
|
|
141
141
|
{/* Tablet */}
|
|
142
142
|
<div>
|
|
143
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
143
|
+
<h4 id="responsive-matrix-h4-tablet-768px" className="text-xs uppercase text-foreground-muted mb-2">Tablet (768px)</h4>
|
|
144
144
|
<div className="w-[768px] border border-dashed border-border p-4">
|
|
145
145
|
<Breadcrumbs
|
|
146
146
|
showHome
|
|
@@ -155,7 +155,7 @@ export const ResponsiveMatrix: Story = {
|
|
|
155
155
|
</div>
|
|
156
156
|
{/* Desktop */}
|
|
157
157
|
<div>
|
|
158
|
-
<h4 className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
158
|
+
<h4 id="responsive-matrix-h4-desktop-1280px" className="text-xs uppercase text-foreground-muted mb-2">Desktop (1280px)</h4>
|
|
159
159
|
<div className="w-[1280px] border border-dashed border-border p-4">
|
|
160
160
|
<Breadcrumbs
|
|
161
161
|
showHome
|
|
@@ -34,20 +34,21 @@ export function Breadcrumbs({
|
|
|
34
34
|
: items;
|
|
35
35
|
|
|
36
36
|
return (
|
|
37
|
-
<nav aria-label="Breadcrumb" className={cn("flex items-center", className)}>
|
|
37
|
+
<nav data-sonance-name="breadcrumbs" aria-label="Breadcrumb" className={cn("flex items-center", className)}>
|
|
38
38
|
<ol className="flex items-center gap-2">
|
|
39
39
|
{allItems.map((item, index) => {
|
|
40
40
|
const isLast = index === allItems.length - 1;
|
|
41
41
|
|
|
42
42
|
return (
|
|
43
|
-
<li key={index} className="flex items-center gap-2">
|
|
43
|
+
<li data-sonance-name="breadcrumbs" key={index} className="flex items-center gap-2">
|
|
44
44
|
{index > 0 && (
|
|
45
|
-
<span className="text-foreground-muted" aria-hidden="true">
|
|
45
|
+
<span id="nav-span-separatorelement" className="text-foreground-muted" aria-hidden="true">
|
|
46
46
|
{separatorElement}
|
|
47
47
|
</span>
|
|
48
48
|
)}
|
|
49
49
|
{isLast ? (
|
|
50
50
|
<span
|
|
51
|
+
id="breadcrumbs-span-itemicon-itemlabel"
|
|
51
52
|
className="flex items-center gap-1.5 text-sm font-medium text-foreground"
|
|
52
53
|
aria-current="page"
|
|
53
54
|
>
|
|
@@ -56,6 +57,7 @@ export function Breadcrumbs({
|
|
|
56
57
|
</span>
|
|
57
58
|
) : (
|
|
58
59
|
<a
|
|
60
|
+
id="breadcrumbs-a"
|
|
59
61
|
href={item.href}
|
|
60
62
|
className={cn(
|
|
61
63
|
"flex items-center gap-1.5 text-sm text-foreground-muted",
|
|
@@ -81,7 +83,7 @@ export const BreadcrumbList = forwardRef<
|
|
|
81
83
|
>(({ className, ...props }, ref) => (
|
|
82
84
|
<ol
|
|
83
85
|
ref={ref}
|
|
84
|
-
className={cn("flex items-center gap-2 flex-wrap", className)}
|
|
86
|
+
className={cn("flex items-center gap-2 flex-wrap", className)} data-sonance-name="breadcrumbs"
|
|
85
87
|
{...props}
|
|
86
88
|
/>
|
|
87
89
|
));
|
|
@@ -94,7 +96,7 @@ export const BreadcrumbItem = forwardRef<
|
|
|
94
96
|
>(({ className, ...props }, ref) => (
|
|
95
97
|
<li
|
|
96
98
|
ref={ref}
|
|
97
|
-
className={cn("flex items-center gap-2", className)}
|
|
99
|
+
className={cn("flex items-center gap-2", className)} data-sonance-name="breadcrumbs"
|
|
98
100
|
{...props}
|
|
99
101
|
/>
|
|
100
102
|
));
|
|
@@ -106,11 +108,12 @@ export const BreadcrumbLink = forwardRef<
|
|
|
106
108
|
React.AnchorHTMLAttributes<HTMLAnchorElement>
|
|
107
109
|
>(({ className, ...props }, ref) => (
|
|
108
110
|
<a
|
|
111
|
+
id="breadcrumb-link-a"
|
|
109
112
|
ref={ref}
|
|
110
113
|
className={cn(
|
|
111
114
|
"text-sm text-foreground-muted hover:text-foreground transition-colors",
|
|
112
115
|
className
|
|
113
|
-
)}
|
|
116
|
+
)} data-sonance-name="breadcrumbs"
|
|
114
117
|
{...props}
|
|
115
118
|
/>
|
|
116
119
|
));
|
|
@@ -122,9 +125,10 @@ export const BreadcrumbPage = forwardRef<
|
|
|
122
125
|
React.HTMLAttributes<HTMLSpanElement>
|
|
123
126
|
>(({ className, ...props }, ref) => (
|
|
124
127
|
<span
|
|
128
|
+
id="breadcrumb-page-span"
|
|
125
129
|
ref={ref}
|
|
126
130
|
aria-current="page"
|
|
127
|
-
className={cn("text-sm font-medium text-foreground", className)}
|
|
131
|
+
className={cn("text-sm font-medium text-foreground", className)} data-sonance-name="breadcrumbs"
|
|
128
132
|
{...props}
|
|
129
133
|
/>
|
|
130
134
|
));
|
|
@@ -136,9 +140,10 @@ export const BreadcrumbSeparator = forwardRef<
|
|
|
136
140
|
React.HTMLAttributes<HTMLSpanElement>
|
|
137
141
|
>(({ className, children, ...props }, ref) => (
|
|
138
142
|
<span
|
|
143
|
+
id="breadcrumb-separator-span"
|
|
139
144
|
ref={ref}
|
|
140
145
|
aria-hidden="true"
|
|
141
|
-
className={cn("text-foreground-muted", className)}
|
|
146
|
+
className={cn("text-foreground-muted", className)} data-sonance-name="breadcrumbs"
|
|
142
147
|
{...props}
|
|
143
148
|
>
|
|
144
149
|
{children || <ChevronRight className="h-4 w-4" />}
|