sonance-brand-mcp 1.2.5 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/dist/assets/api/sonance-analyze/route.ts +1116 -0
  2. package/dist/assets/api/sonance-assets/route.ts +113 -0
  3. package/dist/assets/api/sonance-components/route.ts +41 -0
  4. package/dist/assets/api/sonance-inject-id/route.ts +363 -0
  5. package/dist/assets/api/sonance-save-logo/route.ts +426 -0
  6. package/dist/assets/api/sonance-theme/route.ts +106 -0
  7. package/dist/assets/brand-system.ts +1265 -0
  8. package/dist/assets/components/accordion.stories.tsx +26 -26
  9. package/dist/assets/components/accordion.tsx +3 -3
  10. package/dist/assets/components/alert-dialog.stories.tsx +142 -0
  11. package/dist/assets/components/alert-dialog.tsx +143 -0
  12. package/dist/assets/components/alert.stories.tsx +3 -3
  13. package/dist/assets/components/alert.tsx +4 -3
  14. package/dist/assets/components/aspect-ratio.stories.tsx +70 -0
  15. package/dist/assets/components/aspect-ratio.tsx +8 -0
  16. package/dist/assets/components/autocomplete.stories.tsx +9 -9
  17. package/dist/assets/components/autocomplete.tsx +3 -3
  18. package/dist/assets/components/avatar.stories.tsx +5 -5
  19. package/dist/assets/components/avatar.tsx +67 -23
  20. package/dist/assets/components/badge.stories.tsx +10 -10
  21. package/dist/assets/components/badge.tsx +3 -3
  22. package/dist/assets/components/breadcrumbs.stories.tsx +7 -7
  23. package/dist/assets/components/breadcrumbs.tsx +13 -8
  24. package/dist/assets/components/button.stories.tsx +74 -74
  25. package/dist/assets/components/button.tsx +2 -0
  26. package/dist/assets/components/calendar.stories.tsx +11 -11
  27. package/dist/assets/components/calendar.tsx +4 -4
  28. package/dist/assets/components/card.stories.tsx +22 -22
  29. package/dist/assets/components/card.tsx +7 -3
  30. package/dist/assets/components/carousel.stories.tsx +158 -0
  31. package/dist/assets/components/carousel.tsx +264 -0
  32. package/dist/assets/components/chart.stories.tsx +376 -0
  33. package/dist/assets/components/chart.tsx +384 -0
  34. package/dist/assets/components/checkbox-group.stories.tsx +6 -6
  35. package/dist/assets/components/checkbox-group.tsx +3 -3
  36. package/dist/assets/components/checkbox.stories.tsx +23 -20
  37. package/dist/assets/components/checkbox.tsx +13 -6
  38. package/dist/assets/components/code.stories.tsx +24 -24
  39. package/dist/assets/components/code.tsx +22 -27
  40. package/dist/assets/components/collapsible.stories.tsx +128 -0
  41. package/dist/assets/components/collapsible.tsx +10 -0
  42. package/dist/assets/components/command.stories.tsx +183 -0
  43. package/dist/assets/components/command.tsx +171 -0
  44. package/dist/assets/components/context-menu.stories.tsx +159 -0
  45. package/dist/assets/components/context-menu.tsx +214 -0
  46. package/dist/assets/components/date-input.stories.tsx +9 -9
  47. package/dist/assets/components/date-input.tsx +2 -2
  48. package/dist/assets/components/date-picker.stories.tsx +9 -9
  49. package/dist/assets/components/date-picker.tsx +3 -3
  50. package/dist/assets/components/date-range-picker.stories.tsx +12 -12
  51. package/dist/assets/components/date-range-picker.tsx +3 -3
  52. package/dist/assets/components/dialog.stories.tsx +40 -40
  53. package/dist/assets/components/dialog.tsx +8 -12
  54. package/dist/assets/components/divider.stories.tsx +30 -30
  55. package/dist/assets/components/divider.tsx +34 -35
  56. package/dist/assets/components/drawer.stories.tsx +32 -31
  57. package/dist/assets/components/drawer.tsx +7 -6
  58. package/dist/assets/components/dropdown-menu.tsx +213 -0
  59. package/dist/assets/components/dropdown.stories.tsx +12 -12
  60. package/dist/assets/components/dropdown.tsx +5 -5
  61. package/dist/assets/components/form.stories.tsx +30 -29
  62. package/dist/assets/components/form.tsx +5 -5
  63. package/dist/assets/components/hover-card.stories.tsx +115 -0
  64. package/dist/assets/components/hover-card.tsx +35 -0
  65. package/dist/assets/components/image.stories.tsx +48 -25
  66. package/dist/assets/components/image.tsx +8 -5
  67. package/dist/assets/components/input-otp.stories.tsx +15 -15
  68. package/dist/assets/components/input-otp.tsx +5 -5
  69. package/dist/assets/components/input.stories.tsx +30 -25
  70. package/dist/assets/components/input.tsx +7 -4
  71. package/dist/assets/components/kbd.stories.tsx +34 -34
  72. package/dist/assets/components/kbd.tsx +9 -9
  73. package/dist/assets/components/link.stories.tsx +36 -36
  74. package/dist/assets/components/link.tsx +4 -0
  75. package/dist/assets/components/listbox.stories.tsx +5 -5
  76. package/dist/assets/components/listbox.tsx +4 -4
  77. package/dist/assets/components/menubar.stories.tsx +208 -0
  78. package/dist/assets/components/menubar.tsx +247 -0
  79. package/dist/assets/components/navbar.stories.tsx +24 -24
  80. package/dist/assets/components/navbar.tsx +8 -14
  81. package/dist/assets/components/navigation-menu.stories.tsx +239 -0
  82. package/dist/assets/components/navigation-menu.tsx +135 -0
  83. package/dist/assets/components/number-input.stories.tsx +11 -11
  84. package/dist/assets/components/number-input.tsx +3 -3
  85. package/dist/assets/components/pagination.stories.tsx +13 -13
  86. package/dist/assets/components/pagination.tsx +6 -6
  87. package/dist/assets/components/popover.stories.tsx +35 -35
  88. package/dist/assets/components/popover.tsx +98 -15
  89. package/dist/assets/components/progress.stories.tsx +5 -5
  90. package/dist/assets/components/progress.tsx +5 -5
  91. package/dist/assets/components/radio-group.stories.tsx +7 -7
  92. package/dist/assets/components/radio-group.tsx +3 -3
  93. package/dist/assets/components/range-calendar.stories.tsx +18 -18
  94. package/dist/assets/components/range-calendar.tsx +3 -3
  95. package/dist/assets/components/resizable.stories.tsx +197 -0
  96. package/dist/assets/components/resizable.tsx +47 -0
  97. package/dist/assets/components/scroll-area.stories.tsx +123 -0
  98. package/dist/assets/components/scroll-area.tsx +48 -0
  99. package/dist/assets/components/scroll-shadow.stories.tsx +17 -17
  100. package/dist/assets/components/scroll-shadow.tsx +31 -9
  101. package/dist/assets/components/select.stories.tsx +20 -19
  102. package/dist/assets/components/select.tsx +10 -6
  103. package/dist/assets/components/separator.tsx +32 -0
  104. package/dist/assets/components/sheet.tsx +137 -0
  105. package/dist/assets/components/sidebar.stories.tsx +351 -0
  106. package/dist/assets/components/sidebar.tsx +757 -0
  107. package/dist/assets/components/skeleton.stories.tsx +3 -3
  108. package/dist/assets/components/skeleton.tsx +2 -2
  109. package/dist/assets/components/slider.stories.tsx +6 -6
  110. package/dist/assets/components/slider.tsx +3 -3
  111. package/dist/assets/components/spacer.stories.tsx +11 -11
  112. package/dist/assets/components/spacer.tsx +2 -2
  113. package/dist/assets/components/spinner.stories.tsx +8 -8
  114. package/dist/assets/components/spinner.tsx +5 -5
  115. package/dist/assets/components/switch.stories.tsx +24 -20
  116. package/dist/assets/components/switch.tsx +14 -6
  117. package/dist/assets/components/table.stories.tsx +7 -7
  118. package/dist/assets/components/table.tsx +8 -8
  119. package/dist/assets/components/tabs.stories.tsx +37 -37
  120. package/dist/assets/components/tabs.tsx +3 -3
  121. package/dist/assets/components/textarea.stories.tsx +13 -12
  122. package/dist/assets/components/textarea.tsx +3 -3
  123. package/dist/assets/components/theme-toggle.stories.tsx +31 -30
  124. package/dist/assets/components/theme-toggle.tsx +2 -2
  125. package/dist/assets/components/time-input.stories.tsx +16 -16
  126. package/dist/assets/components/time-input.tsx +2 -2
  127. package/dist/assets/components/toast.stories.tsx +8 -5
  128. package/dist/assets/components/toast.tsx +6 -6
  129. package/dist/assets/components/toggle-group.stories.tsx +153 -0
  130. package/dist/assets/components/toggle-group.tsx +61 -0
  131. package/dist/assets/components/toggle.stories.tsx +77 -0
  132. package/dist/assets/components/toggle.tsx +46 -0
  133. package/dist/assets/components/tooltip.stories.tsx +49 -27
  134. package/dist/assets/components/tooltip.tsx +23 -90
  135. package/dist/assets/components/user.stories.tsx +23 -23
  136. package/dist/assets/components/user.tsx +7 -4
  137. package/dist/assets/dev-tools/SonanceDevTools.tsx +4201 -0
  138. package/dist/assets/dev-tools/index.ts +10 -0
  139. package/dist/assets/globals.css +39 -0
  140. package/dist/assets/logos/40th-anniversary/Sonance_40_Logo_CMYK_BEAM_BLUE_40_AND_BEAM_DARK.png +0 -0
  141. package/dist/assets/logos/Sonance logo dark mode.png +0 -0
  142. package/dist/assets/logos/Sonance logo light mode.png +0 -0
  143. package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_2C_Light_RGB_05162025.png +0 -0
  144. package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_3C_Dark_RGB_05162025.png +0 -0
  145. package/dist/assets/logos/blaze/BlazeBySonance_Logo_Lockup_White_RGB_05162025.png +0 -0
  146. package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Dark_RGB.png +0 -0
  147. package/dist/assets/logos/iport/IPORT_Sonance_LockUp_2C_Light_RGB.png +0 -0
  148. package/dist/assets/logos/james/James_Logo_Black_CMYK.png +0 -0
  149. package/dist/assets/logos/james/James_Logo_Black_RGB.png +0 -0
  150. package/dist/assets/logos/james/James_Logo_LtGray_CMYK.png +0 -0
  151. package/dist/assets/logos/james/James_Logo_LtGray_RGB.png +0 -0
  152. package/dist/assets/logos/james/James_Logo_Polished_RGB.png +0 -0
  153. package/dist/assets/logos/james/James_Logo_Reverse_CMYK.png +0 -0
  154. package/dist/assets/logos/james/James_Logo_Reverse_RGB.png +0 -0
  155. package/dist/assets/logos/james/James_Logo_White_CMYK.png +0 -0
  156. package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Dark_RGB.png +0 -0
  157. package/dist/assets/logos/life-is-better/Sonance_LifeisBetter_Light_RGB.png +0 -0
  158. package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Dark_RGB.png +0 -0
  159. package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Light_RGB.png +0 -0
  160. package/dist/assets/logos/my-sonance/My.Sonance_Logo_2C_Reverse_RGB.png +0 -0
  161. package/dist/assets/logos/my-sonance/My.Sonance_Logo_Black_RGB.png +0 -0
  162. package/dist/assets/logos/my-sonance/My.Sonance_Logo_Reverse_RGB.png +0 -0
  163. package/dist/assets/logos/sonance/Sonance_Logo_2C_Dark_RGB.png +0 -0
  164. package/dist/assets/logos/sonance/Sonance_Logo_2C_Light_RGB.png +0 -0
  165. package/dist/assets/logos/sonance/Sonance_Logo_2C_Reverse_RGB.png +0 -0
  166. package/dist/assets/logos/sonance/Sonance_Logo_Black_RGB.png +0 -0
  167. package/dist/assets/logos/sonance/Sonance_Logo_Grayscale_RGB.png +0 -0
  168. package/dist/assets/logos/sonance/Sonance_Logo_Reverse_RGB.png +0 -0
  169. package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Dark_CMYK.png +0 -0
  170. package/dist/assets/logos/sonance-academy/SonanceAcademy_Logo_Light_CMYK.png +0 -0
  171. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Dark_RGB.png +0 -0
  172. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Light_RGB.png +0 -0
  173. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_3C_Reverse_RGB.png +0 -0
  174. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Black_RGB.png +0 -0
  175. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Grayscale_RGB.png +0 -0
  176. package/dist/assets/logos/sonance-iport/Sonance_IPORT_LockUp_Reverse_RGB.png +0 -0
  177. package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Dark.png +0 -0
  178. package/dist/assets/logos/sonance-james/Sonance_James_Lockup_Light.png +0 -0
  179. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Dark.png +0 -0
  180. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_LockupStacked_Light.png +0 -0
  181. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Dark.png +0 -0
  182. package/dist/assets/logos/sonance-james-iport/Sonance_James_IPORT_Lockup_Light.png +0 -0
  183. package/dist/assets/logos/trufig/TrufigLogo_Black.png +0 -0
  184. package/dist/assets/logos/trufig/TrufigLogo_Light.png +0 -0
  185. package/dist/assets/logos/trufig/TrufigWatermark_Black.png +0 -0
  186. package/dist/assets/logos/trufig/TrufigWatermark_Light.png +0 -0
  187. package/dist/assets/styles/brand-overrides.css +37 -0
  188. package/dist/index.js +2055 -15
  189. package/package.json +1 -1
@@ -0,0 +1,351 @@
1
+ "use client";
2
+
3
+ import type { Meta, StoryObj } from "@storybook/react";
4
+ import {
5
+ Home,
6
+ Settings,
7
+ Users,
8
+ HelpCircle,
9
+ Search,
10
+ ChevronDown,
11
+ LogOut,
12
+ Plus,
13
+ } from "lucide-react";
14
+ import {
15
+ Sidebar,
16
+ SidebarContent,
17
+ SidebarFooter,
18
+ SidebarGroup,
19
+ SidebarGroupContent,
20
+ SidebarGroupLabel,
21
+ SidebarHeader,
22
+ SidebarInput,
23
+ SidebarMenu,
24
+ SidebarMenuButton,
25
+ SidebarMenuItem,
26
+ SidebarMenuSub,
27
+ SidebarMenuSubButton,
28
+ SidebarMenuSubItem,
29
+ SidebarProvider,
30
+ SidebarRail,
31
+ SidebarSeparator,
32
+ SidebarTrigger,
33
+ SidebarInset,
34
+ } from "./sidebar";
35
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./collapsible";
36
+ import { Avatar } from "./avatar";
37
+
38
+ const meta: Meta<typeof Sidebar> = {
39
+ title: "Components/Layout/Sidebar",
40
+ component: Sidebar,
41
+ parameters: {
42
+ layout: "fullscreen",
43
+ },
44
+ tags: ["autodocs"],
45
+ };
46
+
47
+ export default meta;
48
+ type Story = StoryObj<typeof Sidebar>;
49
+
50
+ const mainNavItems = [
51
+ { icon: Home, label: "Dashboard", href: "#" },
52
+ { icon: Users, label: "Customers", href: "#" },
53
+ { icon: Settings, label: "Settings", href: "#" },
54
+ { icon: HelpCircle, label: "Help", href: "#" },
55
+ ];
56
+
57
+ const productItems = [
58
+ { label: "Architectural", href: "#", isActive: true },
59
+ { label: "Outdoor", href: "#" },
60
+ { label: "Invisible Series", href: "#" },
61
+ { label: "Amplifiers", href: "#" },
62
+ ];
63
+
64
+ export const Default: Story = {
65
+ render: () => (
66
+ <SidebarProvider>
67
+ <div className="flex min-h-[600px] w-full">
68
+ <Sidebar>
69
+ <SidebarHeader>
70
+ <div className="flex items-center gap-2 px-2 py-1">
71
+ <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
72
+ S
73
+ </div>
74
+ <span id="default-span-sonance" className="font-medium text-foreground">Sonance</span>
75
+ </div>
76
+ </SidebarHeader>
77
+ <SidebarContent>
78
+ <SidebarGroup>
79
+ <SidebarGroupLabel>Navigation</SidebarGroupLabel>
80
+ <SidebarGroupContent>
81
+ <SidebarMenu>
82
+ {mainNavItems.map((item) => (
83
+ <SidebarMenuItem key={item.label}>
84
+ <SidebarMenuButton asChild>
85
+ <a id="default-a" href={item.href}>
86
+ <item.icon />
87
+ <span id="default-span-itemlabel">{item.label}</span>
88
+ </a>
89
+ </SidebarMenuButton>
90
+ </SidebarMenuItem>
91
+ ))}
92
+ </SidebarMenu>
93
+ </SidebarGroupContent>
94
+ </SidebarGroup>
95
+ <SidebarSeparator />
96
+ <SidebarGroup>
97
+ <Collapsible defaultOpen className="group/collapsible">
98
+ <SidebarGroupLabel asChild>
99
+ <CollapsibleTrigger className="flex w-full items-center">
100
+ Products
101
+ <ChevronDown className="ml-auto h-4 w-4 transition-transform group-data-[state=open]/collapsible:rotate-180" />
102
+ </CollapsibleTrigger>
103
+ </SidebarGroupLabel>
104
+ <CollapsibleContent>
105
+ <SidebarGroupContent>
106
+ <SidebarMenu>
107
+ {productItems.map((item) => (
108
+ <SidebarMenuItem key={item.label}>
109
+ <SidebarMenuButton asChild isActive={item.isActive}>
110
+ <a id="default-a" href={item.href}>
111
+ <span id="default-span-itemlabel">{item.label}</span>
112
+ </a>
113
+ </SidebarMenuButton>
114
+ </SidebarMenuItem>
115
+ ))}
116
+ </SidebarMenu>
117
+ </SidebarGroupContent>
118
+ </CollapsibleContent>
119
+ </Collapsible>
120
+ </SidebarGroup>
121
+ </SidebarContent>
122
+ <SidebarFooter>
123
+ <SidebarMenu>
124
+ <SidebarMenuItem>
125
+ <SidebarMenuButton>
126
+ <Avatar fallback="John Doe" size="sm" />
127
+ <span id="default-span-john-doe">John Doe</span>
128
+ </SidebarMenuButton>
129
+ </SidebarMenuItem>
130
+ </SidebarMenu>
131
+ </SidebarFooter>
132
+ <SidebarRail />
133
+ </Sidebar>
134
+ <SidebarInset>
135
+ <header className="flex h-14 items-center gap-4 border-b border-border px-4">
136
+ <SidebarTrigger />
137
+ <h1 id="header-h1-dashboard" className="text-lg font-medium">Dashboard</h1>
138
+ </header>
139
+ <div className="flex-1 p-6">
140
+ <p id="header-p-main-content-area-pr" className="text-foreground-secondary">
141
+ Main content area. Press ⌘B to toggle the sidebar.
142
+ </p>
143
+ </div>
144
+ </SidebarInset>
145
+ </div>
146
+ </SidebarProvider>
147
+ ),
148
+ };
149
+
150
+ export const WithSearch: Story = {
151
+ render: () => (
152
+ <SidebarProvider>
153
+ <div className="flex min-h-[600px] w-full">
154
+ <Sidebar>
155
+ <SidebarHeader>
156
+ <div className="flex items-center gap-2 px-2 py-1">
157
+ <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
158
+ S
159
+ </div>
160
+ <span id="with-search-span-sonance" className="font-medium text-foreground">Sonance</span>
161
+ </div>
162
+ <div className="relative px-2">
163
+ <Search className="absolute left-4 top-1/2 h-4 w-4 -translate-y-1/2 text-foreground-muted" />
164
+ <SidebarInput placeholder="Search..." className="pl-8" />
165
+ </div>
166
+ </SidebarHeader>
167
+ <SidebarContent>
168
+ <SidebarGroup>
169
+ <SidebarGroupLabel>Main</SidebarGroupLabel>
170
+ <SidebarGroupContent>
171
+ <SidebarMenu>
172
+ {mainNavItems.map((item) => (
173
+ <SidebarMenuItem key={item.label}>
174
+ <SidebarMenuButton asChild tooltip={item.label}>
175
+ <a id="with-search-a" href={item.href}>
176
+ <item.icon />
177
+ <span id="with-search-span-itemlabel">{item.label}</span>
178
+ </a>
179
+ </SidebarMenuButton>
180
+ </SidebarMenuItem>
181
+ ))}
182
+ </SidebarMenu>
183
+ </SidebarGroupContent>
184
+ </SidebarGroup>
185
+ </SidebarContent>
186
+ <SidebarRail />
187
+ </Sidebar>
188
+ <SidebarInset>
189
+ <header className="flex h-14 items-center gap-4 border-b border-border px-4">
190
+ <SidebarTrigger />
191
+ <h1 id="header-h1-search-example" className="text-lg font-medium">Search Example</h1>
192
+ </header>
193
+ <div className="flex-1 p-6">
194
+ <p id="header-p-this-sidebar-include" className="text-foreground-secondary">
195
+ This sidebar includes a search input in the header.
196
+ </p>
197
+ </div>
198
+ </SidebarInset>
199
+ </div>
200
+ </SidebarProvider>
201
+ ),
202
+ };
203
+
204
+ export const WithSubMenu: Story = {
205
+ render: () => (
206
+ <SidebarProvider>
207
+ <div className="flex min-h-[600px] w-full">
208
+ <Sidebar>
209
+ <SidebarHeader>
210
+ <div className="flex items-center gap-2 px-2 py-1">
211
+ <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
212
+ S
213
+ </div>
214
+ <span id="with-sub-menu-span-sonance" className="font-medium text-foreground">Sonance</span>
215
+ </div>
216
+ </SidebarHeader>
217
+ <SidebarContent>
218
+ <SidebarGroup>
219
+ <SidebarGroupLabel>Products</SidebarGroupLabel>
220
+ <SidebarGroupContent>
221
+ <SidebarMenu>
222
+ <Collapsible asChild defaultOpen>
223
+ <SidebarMenuItem>
224
+ <SidebarMenuButton asChild>
225
+ <a id="with-sub-menu-a" href="#">
226
+ <Home />
227
+ <span id="with-sub-menu-span-architectural">Architectural</span>
228
+ </a>
229
+ </SidebarMenuButton>
230
+ <CollapsibleTrigger asChild>
231
+ <SidebarMenuButton className="ml-auto">
232
+ <ChevronDown className="h-4 w-4 transition-transform group-data-[state=open]:rotate-180" />
233
+ </SidebarMenuButton>
234
+ </CollapsibleTrigger>
235
+ <CollapsibleContent>
236
+ <SidebarMenuSub>
237
+ <SidebarMenuSubItem>
238
+ <SidebarMenuSubButton asChild>
239
+ <a id="with-sub-menu-a" href="#">In-Ceiling</a>
240
+ </SidebarMenuSubButton>
241
+ </SidebarMenuSubItem>
242
+ <SidebarMenuSubItem>
243
+ <SidebarMenuSubButton asChild isActive>
244
+ <a id="with-sub-menu-a" href="#">In-Wall</a>
245
+ </SidebarMenuSubButton>
246
+ </SidebarMenuSubItem>
247
+ <SidebarMenuSubItem>
248
+ <SidebarMenuSubButton asChild>
249
+ <a id="with-sub-menu-a" href="#">Invisible</a>
250
+ </SidebarMenuSubButton>
251
+ </SidebarMenuSubItem>
252
+ </SidebarMenuSub>
253
+ </CollapsibleContent>
254
+ </SidebarMenuItem>
255
+ </Collapsible>
256
+ <SidebarMenuItem>
257
+ <SidebarMenuButton asChild>
258
+ <a id="with-sub-menu-a" href="#">
259
+ <Users />
260
+ <span id="with-sub-menu-span-outdoor">Outdoor</span>
261
+ </a>
262
+ </SidebarMenuButton>
263
+ </SidebarMenuItem>
264
+ </SidebarMenu>
265
+ </SidebarGroupContent>
266
+ </SidebarGroup>
267
+ </SidebarContent>
268
+ <SidebarFooter>
269
+ <SidebarMenu>
270
+ <SidebarMenuItem>
271
+ <SidebarMenuButton>
272
+ <Plus />
273
+ <span id="with-sub-menu-span-add-product">Add Product</span>
274
+ </SidebarMenuButton>
275
+ </SidebarMenuItem>
276
+ <SidebarMenuItem>
277
+ <SidebarMenuButton>
278
+ <LogOut />
279
+ <span id="with-sub-menu-span-logout">Logout</span>
280
+ </SidebarMenuButton>
281
+ </SidebarMenuItem>
282
+ </SidebarMenu>
283
+ </SidebarFooter>
284
+ <SidebarRail />
285
+ </Sidebar>
286
+ <SidebarInset>
287
+ <header className="flex h-14 items-center gap-4 border-b border-border px-4">
288
+ <SidebarTrigger />
289
+ <h1 id="header-h1-with-sub-menu" className="text-lg font-medium">With Sub Menu</h1>
290
+ </header>
291
+ <div className="flex-1 p-6">
292
+ <p id="header-p-this-sidebar-include" className="text-foreground-secondary">
293
+ This sidebar includes expandable sub-menus.
294
+ </p>
295
+ </div>
296
+ </SidebarInset>
297
+ </div>
298
+ </SidebarProvider>
299
+ ),
300
+ };
301
+
302
+ export const Floating: Story = {
303
+ render: () => (
304
+ <SidebarProvider>
305
+ <div className="flex min-h-[600px] w-full bg-background-secondary p-4">
306
+ <Sidebar variant="floating">
307
+ <SidebarHeader>
308
+ <div className="flex items-center gap-2 px-2 py-1">
309
+ <div className="flex h-8 w-8 items-center justify-center rounded-sm bg-primary text-primary-foreground font-medium">
310
+ S
311
+ </div>
312
+ <span id="floating-span-sonance" className="font-medium text-foreground">Sonance</span>
313
+ </div>
314
+ </SidebarHeader>
315
+ <SidebarContent>
316
+ <SidebarGroup>
317
+ <SidebarGroupLabel>Navigation</SidebarGroupLabel>
318
+ <SidebarGroupContent>
319
+ <SidebarMenu>
320
+ {mainNavItems.map((item) => (
321
+ <SidebarMenuItem key={item.label}>
322
+ <SidebarMenuButton asChild>
323
+ <a id="floating-a" href={item.href}>
324
+ <item.icon />
325
+ <span id="floating-span-itemlabel">{item.label}</span>
326
+ </a>
327
+ </SidebarMenuButton>
328
+ </SidebarMenuItem>
329
+ ))}
330
+ </SidebarMenu>
331
+ </SidebarGroupContent>
332
+ </SidebarGroup>
333
+ </SidebarContent>
334
+ <SidebarRail />
335
+ </Sidebar>
336
+ <SidebarInset>
337
+ <header className="flex h-14 items-center gap-4 border-b border-border px-4">
338
+ <SidebarTrigger />
339
+ <h1 id="header-h1-floating-variant" className="text-lg font-medium">Floating Variant</h1>
340
+ </header>
341
+ <div className="flex-1 p-6">
342
+ <p id="header-p-the-floating-variant" className="text-foreground-secondary">
343
+ The floating variant adds rounded corners and a shadow to the sidebar.
344
+ </p>
345
+ </div>
346
+ </SidebarInset>
347
+ </div>
348
+ </SidebarProvider>
349
+ ),
350
+ };
351
+