@neynar/ui 0.1.1 → 0.1.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/components/ui/accordion.d.ts +1 -25
- package/dist/components/ui/accordion.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.d.ts +240 -46
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert.d.ts +73 -11
- package/dist/components/ui/alert.d.ts.map +1 -1
- package/dist/components/ui/aspect-ratio.d.ts +44 -10
- package/dist/components/ui/aspect-ratio.d.ts.map +1 -1
- package/dist/components/ui/avatar.d.ts +117 -33
- package/dist/components/ui/avatar.d.ts.map +1 -1
- package/dist/components/ui/badge.d.ts +50 -71
- package/dist/components/ui/badge.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts +231 -49
- package/dist/components/ui/breadcrumb.d.ts.map +1 -1
- package/dist/components/ui/button.d.ts +189 -71
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/calendar.d.ts +197 -40
- package/dist/components/ui/calendar.d.ts.map +1 -1
- package/dist/components/ui/card.d.ts +7 -22
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/carousel.d.ts +369 -99
- package/dist/components/ui/carousel.d.ts.map +1 -1
- package/dist/components/ui/chart.d.ts.map +1 -1
- package/dist/components/ui/checkbox.d.ts +110 -38
- package/dist/components/ui/checkbox.d.ts.map +1 -1
- package/dist/components/ui/collapsible.d.ts +246 -61
- package/dist/components/ui/collapsible.d.ts.map +1 -1
- package/dist/components/ui/combobox.d.ts +207 -159
- package/dist/components/ui/combobox.d.ts.map +1 -1
- package/dist/components/ui/command.d.ts +336 -67
- package/dist/components/ui/command.d.ts.map +1 -1
- package/dist/components/ui/container.d.ts +159 -64
- package/dist/components/ui/container.d.ts.map +1 -1
- package/dist/components/ui/context-menu.d.ts +321 -39
- package/dist/components/ui/context-menu.d.ts.map +1 -1
- package/dist/components/ui/date-picker.d.ts +113 -86
- package/dist/components/ui/date-picker.d.ts.map +1 -1
- package/dist/components/ui/dialog.d.ts +106 -25
- package/dist/components/ui/dialog.d.ts.map +1 -1
- package/dist/components/ui/drawer.d.ts +388 -59
- package/dist/components/ui/drawer.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.d.ts +521 -74
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/empty-state.d.ts +148 -76
- package/dist/components/ui/empty-state.d.ts.map +1 -1
- package/dist/components/ui/hover-card.d.ts +253 -34
- package/dist/components/ui/hover-card.d.ts.map +1 -1
- package/dist/components/ui/input.d.ts +143 -44
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/label.d.ts +0 -8
- package/dist/components/ui/label.d.ts.map +1 -1
- package/dist/components/ui/menubar.d.ts +288 -46
- package/dist/components/ui/menubar.d.ts.map +1 -1
- package/dist/components/ui/navigation-menu.d.ts +444 -127
- package/dist/components/ui/navigation-menu.d.ts.map +1 -1
- package/dist/components/ui/pagination.d.ts +342 -66
- package/dist/components/ui/pagination.d.ts.map +1 -1
- package/dist/components/ui/popover.d.ts +0 -8
- package/dist/components/ui/popover.d.ts.map +1 -1
- package/dist/components/ui/progress.d.ts +88 -30
- package/dist/components/ui/progress.d.ts.map +1 -1
- package/dist/components/ui/radio-group.d.ts +189 -45
- package/dist/components/ui/radio-group.d.ts.map +1 -1
- package/dist/components/ui/resizable.d.ts +178 -62
- package/dist/components/ui/resizable.d.ts.map +1 -1
- package/dist/components/ui/scroll-area.d.ts +180 -21
- package/dist/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/components/ui/select.d.ts +382 -60
- package/dist/components/ui/select.d.ts.map +1 -1
- package/dist/components/ui/separator.d.ts +52 -39
- package/dist/components/ui/separator.d.ts.map +1 -1
- package/dist/components/ui/sheet.d.ts +144 -27
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/sidebar.d.ts +81 -31
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/skeleton.d.ts +94 -32
- package/dist/components/ui/skeleton.d.ts.map +1 -1
- package/dist/components/ui/slider.d.ts +37 -31
- package/dist/components/ui/slider.d.ts.map +1 -1
- package/dist/components/ui/sonner.d.ts +280 -46
- package/dist/components/ui/sonner.d.ts.map +1 -1
- package/dist/components/ui/stack.d.ts +289 -148
- package/dist/components/ui/stack.d.ts.map +1 -1
- package/dist/components/ui/stories/aspect-ratio.stories.d.ts +1 -2
- package/dist/components/ui/stories/aspect-ratio.stories.d.ts.map +1 -1
- package/dist/components/ui/stories/container.stories.d.ts +2 -3
- package/dist/components/ui/stories/container.stories.d.ts.map +1 -1
- package/dist/components/ui/stories/empty-state.stories.d.ts +2 -2
- package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -2
- package/dist/components/ui/stories/scroll-area.stories.d.ts.map +1 -1
- package/dist/components/ui/stories/stack.stories.d.ts +1 -1
- package/dist/components/ui/stories/text-field.stories.d.ts +7 -1
- package/dist/components/ui/stories/text-field.stories.d.ts.map +1 -1
- package/dist/components/ui/switch.d.ts +44 -38
- package/dist/components/ui/switch.d.ts.map +1 -1
- package/dist/components/ui/table.d.ts +33 -0
- package/dist/components/ui/table.d.ts.map +1 -1
- package/dist/components/ui/tabs.d.ts +4 -22
- package/dist/components/ui/tabs.d.ts.map +1 -1
- package/dist/components/ui/text-field.d.ts +170 -84
- package/dist/components/ui/text-field.d.ts.map +1 -1
- package/dist/components/ui/textarea.d.ts +106 -29
- package/dist/components/ui/textarea.d.ts.map +1 -1
- package/dist/components/ui/theme-toggle.d.ts +190 -65
- package/dist/components/ui/theme-toggle.d.ts.map +1 -1
- package/dist/components/ui/theme.d.ts +107 -23
- package/dist/components/ui/theme.d.ts.map +1 -1
- package/dist/components/ui/toggle-group.d.ts +143 -67
- package/dist/components/ui/toggle-group.d.ts.map +1 -1
- package/dist/components/ui/toggle.d.ts +118 -30
- package/dist/components/ui/toggle.d.ts.map +1 -1
- package/dist/components/ui/tooltip.d.ts +152 -28
- package/dist/components/ui/tooltip.d.ts.map +1 -1
- package/dist/components/ui/typography.d.ts +452 -134
- package/dist/components/ui/typography.d.ts.map +1 -1
- package/dist/index.js +9388 -8281
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/llms.txt +173 -3
- package/package.json +5 -2
- package/src/components/ui/accordion.tsx +112 -27
- package/src/components/ui/alert-dialog.tsx +401 -46
- package/src/components/ui/alert.tsx +114 -11
- package/src/components/ui/aspect-ratio.tsx +69 -14
- package/src/components/ui/avatar.tsx +179 -33
- package/src/components/ui/badge.tsx +74 -75
- package/src/components/ui/breadcrumb.tsx +335 -50
- package/src/components/ui/button.tsx +198 -90
- package/src/components/ui/calendar.tsx +867 -43
- package/src/components/ui/card.tsx +140 -33
- package/src/components/ui/carousel.tsx +529 -98
- package/src/components/ui/chart.tsx +222 -1
- package/src/components/ui/checkbox.tsx +176 -38
- package/src/components/ui/collapsible.tsx +321 -67
- package/src/components/ui/combobox.tsx +284 -83
- package/src/components/ui/command.tsx +527 -67
- package/src/components/ui/container.tsx +217 -65
- package/src/components/ui/context-menu.tsx +716 -51
- package/src/components/ui/date-picker.tsx +228 -38
- package/src/components/ui/dialog.tsx +270 -33
- package/src/components/ui/drawer.tsx +546 -67
- package/src/components/ui/dropdown-menu.tsx +657 -74
- package/src/components/ui/empty-state.tsx +241 -82
- package/src/components/ui/hover-card.tsx +328 -39
- package/src/components/ui/input.tsx +207 -44
- package/src/components/ui/label.tsx +98 -8
- package/src/components/ui/menubar.tsx +587 -54
- package/src/components/ui/navigation-menu.tsx +557 -128
- package/src/components/ui/pagination.tsx +561 -79
- package/src/components/ui/popover.tsx +119 -8
- package/src/components/ui/progress.tsx +131 -29
- package/src/components/ui/radio-group.tsx +260 -51
- package/src/components/ui/resizable.tsx +289 -63
- package/src/components/ui/scroll-area.tsx +377 -66
- package/src/components/ui/select.tsx +545 -60
- package/src/components/ui/separator.tsx +146 -40
- package/src/components/ui/sheet.tsx +348 -31
- package/src/components/ui/sidebar.tsx +471 -29
- package/src/components/ui/skeleton.tsx +114 -32
- package/src/components/ui/slider.tsx +77 -31
- package/src/components/ui/sonner.tsx +574 -46
- package/src/components/ui/stack.tsx +423 -101
- package/src/components/ui/switch.tsx +78 -39
- package/src/components/ui/table.tsx +170 -4
- package/src/components/ui/tabs.tsx +108 -22
- package/src/components/ui/text-field.tsx +226 -81
- package/src/components/ui/textarea.tsx +180 -29
- package/src/components/ui/theme-toggle.tsx +313 -65
- package/src/components/ui/theme.tsx +117 -23
- package/src/components/ui/toggle-group.tsx +280 -69
- package/src/components/ui/toggle.tsx +124 -35
- package/src/components/ui/tooltip.tsx +239 -29
- package/src/components/ui/typography.tsx +1115 -165
|
@@ -31,6 +31,366 @@ const SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
|
31
31
|
const SIDEBAR_WIDTH_ICON = "3rem";
|
|
32
32
|
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Context props for sidebar state management (Documentation only - NOT used in component implementation)
|
|
36
|
+
* These types are for documentation generation and should not replace inferred context types
|
|
37
|
+
*/
|
|
38
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
39
|
+
type SidebarContextDocsProps = {
|
|
40
|
+
/** Current visual state of the sidebar */
|
|
41
|
+
state: "expanded" | "collapsed";
|
|
42
|
+
/** Whether sidebar is open on desktop */
|
|
43
|
+
open: boolean;
|
|
44
|
+
/** Function to control desktop sidebar open state */
|
|
45
|
+
setOpen: (open: boolean) => void;
|
|
46
|
+
/** Whether sidebar is open on mobile (sheet overlay) */
|
|
47
|
+
openMobile: boolean;
|
|
48
|
+
/** Function to control mobile sidebar open state */
|
|
49
|
+
setOpenMobile: (open: boolean) => void;
|
|
50
|
+
/** Whether current viewport is considered mobile */
|
|
51
|
+
isMobile: boolean;
|
|
52
|
+
/** Function to toggle sidebar state (responsive) */
|
|
53
|
+
toggleSidebar: () => void;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Props for SidebarProvider component (Documentation only - NOT used in component implementation)
|
|
58
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
59
|
+
*/
|
|
60
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
61
|
+
type SidebarProviderDocsProps = {
|
|
62
|
+
/** Initial open state when uncontrolled @default true */
|
|
63
|
+
defaultOpen?: boolean;
|
|
64
|
+
/** Controlled open state (makes component controlled) */
|
|
65
|
+
open?: boolean;
|
|
66
|
+
/** Callback fired when open state changes */
|
|
67
|
+
onOpenChange?: (open: boolean) => void;
|
|
68
|
+
/** Child components */
|
|
69
|
+
children?: React.ReactNode;
|
|
70
|
+
} & React.ComponentProps<"div">;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Props for Sidebar component (Documentation only - NOT used in component implementation)
|
|
74
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
75
|
+
*/
|
|
76
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
77
|
+
type SidebarDocsProps = {
|
|
78
|
+
/**
|
|
79
|
+
* Which side of the screen the sidebar appears on @default "left"
|
|
80
|
+
*
|
|
81
|
+
* Controls the horizontal positioning and slide direction of the sidebar.
|
|
82
|
+
* Affects the direction of collapse animations and the positioning of
|
|
83
|
+
* the interactive rail component.
|
|
84
|
+
*/
|
|
85
|
+
side?: "left" | "right";
|
|
86
|
+
/** Visual appearance variant @default "sidebar" */
|
|
87
|
+
variant?: "sidebar" | "floating" | "inset";
|
|
88
|
+
/** Collapse behavior mode @default "offcanvas" */
|
|
89
|
+
collapsible?: "offcanvas" | "icon" | "none";
|
|
90
|
+
/** Additional CSS classes */
|
|
91
|
+
className?: string;
|
|
92
|
+
/** Sidebar content components */
|
|
93
|
+
children?: React.ReactNode;
|
|
94
|
+
} & React.ComponentProps<"div">;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Props for SidebarTrigger component (Documentation only - NOT used in component implementation)
|
|
98
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
99
|
+
*/
|
|
100
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
101
|
+
type SidebarTriggerDocsProps = {
|
|
102
|
+
/** Additional CSS classes */
|
|
103
|
+
className?: string;
|
|
104
|
+
/** Additional click handler called before toggle */
|
|
105
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
106
|
+
} & Omit<React.ComponentProps<typeof Button>, "onClick">;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Props for SidebarRail component (Documentation only - NOT used in component implementation)
|
|
110
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
111
|
+
*/
|
|
112
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
113
|
+
type SidebarRailDocsProps = {
|
|
114
|
+
/** Additional CSS classes */
|
|
115
|
+
className?: string;
|
|
116
|
+
} & React.ComponentProps<"button">;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Props for SidebarInset component (Documentation only - NOT used in component implementation)
|
|
120
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
121
|
+
*/
|
|
122
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
123
|
+
type SidebarInsetDocsProps = {
|
|
124
|
+
/** Additional CSS classes */
|
|
125
|
+
className?: string;
|
|
126
|
+
} & React.ComponentProps<"main">;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Props for SidebarInput component (Documentation only - NOT used in component implementation)
|
|
130
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
131
|
+
*/
|
|
132
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
133
|
+
type SidebarInputDocsProps = {
|
|
134
|
+
/** Additional CSS classes */
|
|
135
|
+
className?: string;
|
|
136
|
+
} & React.ComponentProps<typeof Input>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Props for SidebarHeader component (Documentation only - NOT used in component implementation)
|
|
140
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
141
|
+
*/
|
|
142
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
143
|
+
type SidebarHeaderDocsProps = {
|
|
144
|
+
/** Additional CSS classes */
|
|
145
|
+
className?: string;
|
|
146
|
+
} & React.ComponentProps<"div">;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Props for SidebarFooter component (Documentation only - NOT used in component implementation)
|
|
150
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
151
|
+
*/
|
|
152
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
153
|
+
type SidebarFooterDocsProps = {
|
|
154
|
+
/** Additional CSS classes */
|
|
155
|
+
className?: string;
|
|
156
|
+
} & React.ComponentProps<"div">;
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Props for SidebarSeparator component (Documentation only - NOT used in component implementation)
|
|
160
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
161
|
+
*/
|
|
162
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
163
|
+
type SidebarSeparatorDocsProps = {
|
|
164
|
+
/** Additional CSS classes */
|
|
165
|
+
className?: string;
|
|
166
|
+
} & React.ComponentProps<typeof Separator>;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Props for SidebarContent component (Documentation only - NOT used in component implementation)
|
|
170
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
171
|
+
*/
|
|
172
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
173
|
+
type SidebarContentDocsProps = {
|
|
174
|
+
/** Additional CSS classes */
|
|
175
|
+
className?: string;
|
|
176
|
+
} & React.ComponentProps<"div">;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Props for SidebarGroup component (Documentation only - NOT used in component implementation)
|
|
180
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
181
|
+
*/
|
|
182
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
183
|
+
type SidebarGroupDocsProps = {
|
|
184
|
+
/** Additional CSS classes */
|
|
185
|
+
className?: string;
|
|
186
|
+
} & React.ComponentProps<"div">;
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Props for SidebarGroupLabel component (Documentation only - NOT used in component implementation)
|
|
190
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
191
|
+
*/
|
|
192
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
193
|
+
type SidebarGroupLabelDocsProps = {
|
|
194
|
+
/** Additional CSS classes */
|
|
195
|
+
className?: string;
|
|
196
|
+
/**
|
|
197
|
+
* Render as child element using Radix UI Slot composition pattern @default false
|
|
198
|
+
*
|
|
199
|
+
* When true, the component will not render its default element,
|
|
200
|
+
* instead merging its props with its immediate child. This enables
|
|
201
|
+
* composition with custom elements (like Link components) while
|
|
202
|
+
* preserving the component's behavior and styling.
|
|
203
|
+
*/
|
|
204
|
+
asChild?: boolean;
|
|
205
|
+
} & React.ComponentProps<"div">;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Props for SidebarGroupAction component (Documentation only - NOT used in component implementation)
|
|
209
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
210
|
+
*/
|
|
211
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
212
|
+
type SidebarGroupActionDocsProps = {
|
|
213
|
+
/** Additional CSS classes */
|
|
214
|
+
className?: string;
|
|
215
|
+
/**
|
|
216
|
+
* Render as child element using Radix UI Slot composition pattern @default false
|
|
217
|
+
*
|
|
218
|
+
* When true, the component will not render its default element,
|
|
219
|
+
* instead merging its props with its immediate child. This enables
|
|
220
|
+
* composition with custom elements (like Link components) while
|
|
221
|
+
* preserving the component's behavior and styling.
|
|
222
|
+
*/
|
|
223
|
+
asChild?: boolean;
|
|
224
|
+
} & React.ComponentProps<"button">;
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Props for SidebarGroupContent component (Documentation only - NOT used in component implementation)
|
|
228
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
229
|
+
*/
|
|
230
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
231
|
+
type SidebarGroupContentDocsProps = {
|
|
232
|
+
/** Additional CSS classes */
|
|
233
|
+
className?: string;
|
|
234
|
+
} & React.ComponentProps<"div">;
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Props for SidebarMenu component (Documentation only - NOT used in component implementation)
|
|
238
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
239
|
+
*/
|
|
240
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
241
|
+
type SidebarMenuDocsProps = {
|
|
242
|
+
/** Additional CSS classes */
|
|
243
|
+
className?: string;
|
|
244
|
+
} & React.ComponentProps<"ul">;
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Props for SidebarMenuItem component (Documentation only - NOT used in component implementation)
|
|
248
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
249
|
+
*/
|
|
250
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
251
|
+
type SidebarMenuItemDocsProps = {
|
|
252
|
+
/** Additional CSS classes */
|
|
253
|
+
className?: string;
|
|
254
|
+
} & React.ComponentProps<"li">;
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Props for SidebarMenuButton component (Documentation only - NOT used in component implementation)
|
|
258
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
259
|
+
*/
|
|
260
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
261
|
+
type SidebarMenuButtonDocsProps = {
|
|
262
|
+
/**
|
|
263
|
+
* Render as child element using Radix UI Slot composition pattern @default false
|
|
264
|
+
*
|
|
265
|
+
* When true, the component will not render its default element,
|
|
266
|
+
* instead merging its props with its immediate child. This enables
|
|
267
|
+
* composition with custom elements (like Link components) while
|
|
268
|
+
* preserving the component's behavior and styling.
|
|
269
|
+
*/
|
|
270
|
+
asChild?: boolean;
|
|
271
|
+
/** Whether this menu item is currently active @default false */
|
|
272
|
+
isActive?: boolean;
|
|
273
|
+
/** Visual appearance variant @default "default" */
|
|
274
|
+
variant?: "default" | "outline";
|
|
275
|
+
/** Button size variant @default "default" */
|
|
276
|
+
size?: "default" | "sm" | "lg";
|
|
277
|
+
/**
|
|
278
|
+
* Tooltip content shown when sidebar is collapsed to icon mode
|
|
279
|
+
*
|
|
280
|
+
* Can be either a string for simple text or a full TooltipContent props object
|
|
281
|
+
* for advanced configuration. Tooltip is automatically shown/hidden based on
|
|
282
|
+
* sidebar state and is never displayed on mobile devices.
|
|
283
|
+
*
|
|
284
|
+
* @example Simple string tooltip
|
|
285
|
+
* ```tsx
|
|
286
|
+
* <SidebarMenuButton tooltip=\"Dashboard\">
|
|
287
|
+
* <Home />Dashboard
|
|
288
|
+
* </SidebarMenuButton>
|
|
289
|
+
* ```
|
|
290
|
+
*
|
|
291
|
+
* @example Advanced tooltip with props
|
|
292
|
+
* ```tsx
|
|
293
|
+
* <SidebarMenuButton tooltip={{
|
|
294
|
+
* children: \"Go to Dashboard\",
|
|
295
|
+
* side: \"right\",
|
|
296
|
+
* sideOffset: 10
|
|
297
|
+
* }}>
|
|
298
|
+
* <Home />Dashboard
|
|
299
|
+
* </SidebarMenuButton>
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
303
|
+
/** Additional CSS classes */
|
|
304
|
+
className?: string;
|
|
305
|
+
} & React.ComponentProps<"button">;
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Props for SidebarMenuAction component (Documentation only - NOT used in component implementation)
|
|
309
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
310
|
+
*/
|
|
311
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
312
|
+
type SidebarMenuActionDocsProps = {
|
|
313
|
+
/** Additional CSS classes */
|
|
314
|
+
className?: string;
|
|
315
|
+
/**
|
|
316
|
+
* Render as child element using Radix UI Slot composition pattern @default false
|
|
317
|
+
*
|
|
318
|
+
* When true, the component will not render its default element,
|
|
319
|
+
* instead merging its props with its immediate child. This enables
|
|
320
|
+
* composition with custom elements (like Link components) while
|
|
321
|
+
* preserving the component's behavior and styling.
|
|
322
|
+
*/
|
|
323
|
+
asChild?: boolean;
|
|
324
|
+
/** Only show button on menu item hover @default false */
|
|
325
|
+
showOnHover?: boolean;
|
|
326
|
+
} & React.ComponentProps<"button">;
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Props for SidebarMenuBadge component (Documentation only - NOT used in component implementation)
|
|
330
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
331
|
+
*/
|
|
332
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
333
|
+
type SidebarMenuBadgeDocsProps = {
|
|
334
|
+
/** Additional CSS classes */
|
|
335
|
+
className?: string;
|
|
336
|
+
} & React.ComponentProps<"div">;
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Props for SidebarMenuSkeleton component (Documentation only - NOT used in component implementation)
|
|
340
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
341
|
+
*/
|
|
342
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
343
|
+
type SidebarMenuSkeletonDocsProps = {
|
|
344
|
+
/** Additional CSS classes */
|
|
345
|
+
className?: string;
|
|
346
|
+
/** Whether to show icon placeholder @default false */
|
|
347
|
+
showIcon?: boolean;
|
|
348
|
+
} & React.ComponentProps<"div">;
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Props for SidebarMenuSub component (Documentation only - NOT used in component implementation)
|
|
352
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
353
|
+
*/
|
|
354
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
355
|
+
type SidebarMenuSubDocsProps = {
|
|
356
|
+
/** Additional CSS classes */
|
|
357
|
+
className?: string;
|
|
358
|
+
} & React.ComponentProps<"ul">;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Props for SidebarMenuSubItem component (Documentation only - NOT used in component implementation)
|
|
362
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
363
|
+
*/
|
|
364
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
365
|
+
type SidebarMenuSubItemDocsProps = {
|
|
366
|
+
/** Additional CSS classes */
|
|
367
|
+
className?: string;
|
|
368
|
+
} & React.ComponentProps<"li">;
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Props for SidebarMenuSubButton component (Documentation only - NOT used in component implementation)
|
|
372
|
+
* These types are for documentation generation and should not replace React.ComponentProps inferred types
|
|
373
|
+
*/
|
|
374
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
375
|
+
type SidebarMenuSubButtonDocsProps = {
|
|
376
|
+
/**
|
|
377
|
+
* Render as child element using Radix UI Slot composition pattern @default false
|
|
378
|
+
*
|
|
379
|
+
* When true, the component will not render its default element,
|
|
380
|
+
* instead merging its props with its immediate child. This enables
|
|
381
|
+
* composition with custom elements (like Link components) while
|
|
382
|
+
* preserving the component's behavior and styling.
|
|
383
|
+
*/
|
|
384
|
+
asChild?: boolean;
|
|
385
|
+
/** Button size variant @default "md" */
|
|
386
|
+
size?: "sm" | "md";
|
|
387
|
+
/** Whether this submenu item is currently active @default false */
|
|
388
|
+
isActive?: boolean;
|
|
389
|
+
/** Additional CSS classes */
|
|
390
|
+
className?: string;
|
|
391
|
+
} & React.ComponentProps<"a">;
|
|
392
|
+
|
|
393
|
+
// Internal context type (inferred from implementation)
|
|
34
394
|
type SidebarContextProps = {
|
|
35
395
|
state: "expanded" | "collapsed";
|
|
36
396
|
open: boolean;
|
|
@@ -175,11 +535,12 @@ function SidebarProvider({
|
|
|
175
535
|
style,
|
|
176
536
|
children,
|
|
177
537
|
...props
|
|
178
|
-
}:
|
|
538
|
+
}: {
|
|
179
539
|
defaultOpen?: boolean;
|
|
180
540
|
open?: boolean;
|
|
181
541
|
onOpenChange?: (open: boolean) => void;
|
|
182
|
-
|
|
542
|
+
children?: React.ReactNode;
|
|
543
|
+
} & React.ComponentProps<"div">) {
|
|
183
544
|
const isMobile = useIsMobile();
|
|
184
545
|
const [openMobile, setOpenMobile] = React.useState(false);
|
|
185
546
|
|
|
@@ -394,11 +755,13 @@ function Sidebar({
|
|
|
394
755
|
className,
|
|
395
756
|
children,
|
|
396
757
|
...props
|
|
397
|
-
}:
|
|
758
|
+
}: {
|
|
398
759
|
side?: "left" | "right";
|
|
399
760
|
variant?: "sidebar" | "floating" | "inset";
|
|
400
761
|
collapsible?: "offcanvas" | "icon" | "none";
|
|
401
|
-
|
|
762
|
+
className?: string;
|
|
763
|
+
children?: React.ReactNode;
|
|
764
|
+
} & React.ComponentProps<"div">) {
|
|
402
765
|
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
|
|
403
766
|
|
|
404
767
|
if (collapsible === "none") {
|
|
@@ -536,7 +899,10 @@ function SidebarTrigger({
|
|
|
536
899
|
className,
|
|
537
900
|
onClick,
|
|
538
901
|
...props
|
|
539
|
-
}:
|
|
902
|
+
}: {
|
|
903
|
+
className?: string;
|
|
904
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
905
|
+
} & Omit<React.ComponentProps<typeof Button>, "onClick">) {
|
|
540
906
|
const { toggleSidebar } = useSidebar();
|
|
541
907
|
|
|
542
908
|
return (
|
|
@@ -590,7 +956,12 @@ function SidebarTrigger({
|
|
|
590
956
|
* @see {@link SidebarTrigger} - Alternative toggle button
|
|
591
957
|
* @since 1.0.0
|
|
592
958
|
*/
|
|
593
|
-
function SidebarRail({
|
|
959
|
+
function SidebarRail({
|
|
960
|
+
className,
|
|
961
|
+
...props
|
|
962
|
+
}: {
|
|
963
|
+
className?: string;
|
|
964
|
+
} & React.ComponentProps<"button">) {
|
|
594
965
|
const { toggleSidebar } = useSidebar();
|
|
595
966
|
|
|
596
967
|
return (
|
|
@@ -666,7 +1037,12 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
|
|
|
666
1037
|
* @see {@link SidebarProvider} - Required context provider
|
|
667
1038
|
* @since 1.0.0
|
|
668
1039
|
*/
|
|
669
|
-
function SidebarInset({
|
|
1040
|
+
function SidebarInset({
|
|
1041
|
+
className,
|
|
1042
|
+
...props
|
|
1043
|
+
}: {
|
|
1044
|
+
className?: string;
|
|
1045
|
+
} & React.ComponentProps<"main">) {
|
|
670
1046
|
return (
|
|
671
1047
|
<main
|
|
672
1048
|
data-slot="sidebar-inset"
|
|
@@ -725,7 +1101,9 @@ function SidebarInset({ className, ...props }: React.ComponentProps<"main">) {
|
|
|
725
1101
|
function SidebarInput({
|
|
726
1102
|
className,
|
|
727
1103
|
...props
|
|
728
|
-
}:
|
|
1104
|
+
}: {
|
|
1105
|
+
className?: string;
|
|
1106
|
+
} & React.ComponentProps<typeof Input>) {
|
|
729
1107
|
return (
|
|
730
1108
|
<Input
|
|
731
1109
|
data-slot="sidebar-input"
|
|
@@ -797,7 +1175,12 @@ function SidebarInput({
|
|
|
797
1175
|
* @see {@link SidebarContent} - Main scrollable content area
|
|
798
1176
|
* @since 1.0.0
|
|
799
1177
|
*/
|
|
800
|
-
function SidebarHeader({
|
|
1178
|
+
function SidebarHeader({
|
|
1179
|
+
className,
|
|
1180
|
+
...props
|
|
1181
|
+
}: {
|
|
1182
|
+
className?: string;
|
|
1183
|
+
} & React.ComponentProps<"div">) {
|
|
801
1184
|
return (
|
|
802
1185
|
<div
|
|
803
1186
|
data-slot="sidebar-header"
|
|
@@ -860,7 +1243,12 @@ function SidebarHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
860
1243
|
* @see {@link SidebarContent} - Main content area
|
|
861
1244
|
* @since 1.0.0
|
|
862
1245
|
*/
|
|
863
|
-
function SidebarFooter({
|
|
1246
|
+
function SidebarFooter({
|
|
1247
|
+
className,
|
|
1248
|
+
...props
|
|
1249
|
+
}: {
|
|
1250
|
+
className?: string;
|
|
1251
|
+
} & React.ComponentProps<"div">) {
|
|
864
1252
|
return (
|
|
865
1253
|
<div
|
|
866
1254
|
data-slot="sidebar-footer"
|
|
@@ -925,7 +1313,9 @@ function SidebarFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
925
1313
|
function SidebarSeparator({
|
|
926
1314
|
className,
|
|
927
1315
|
...props
|
|
928
|
-
}:
|
|
1316
|
+
}: {
|
|
1317
|
+
className?: string;
|
|
1318
|
+
} & React.ComponentProps<typeof Separator>) {
|
|
929
1319
|
return (
|
|
930
1320
|
<Separator
|
|
931
1321
|
data-slot="sidebar-separator"
|
|
@@ -1000,7 +1390,12 @@ function SidebarSeparator({
|
|
|
1000
1390
|
* @see {@link SidebarMenu} - Menu container component
|
|
1001
1391
|
* @since 1.0.0
|
|
1002
1392
|
*/
|
|
1003
|
-
function SidebarContent({
|
|
1393
|
+
function SidebarContent({
|
|
1394
|
+
className,
|
|
1395
|
+
...props
|
|
1396
|
+
}: {
|
|
1397
|
+
className?: string;
|
|
1398
|
+
} & React.ComponentProps<"div">) {
|
|
1004
1399
|
return (
|
|
1005
1400
|
<div
|
|
1006
1401
|
data-slot="sidebar-content"
|
|
@@ -1064,7 +1459,12 @@ function SidebarContent({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
1064
1459
|
* @see {@link SidebarGroupContent} - Group content container
|
|
1065
1460
|
* @since 1.0.0
|
|
1066
1461
|
*/
|
|
1067
|
-
function SidebarGroup({
|
|
1462
|
+
function SidebarGroup({
|
|
1463
|
+
className,
|
|
1464
|
+
...props
|
|
1465
|
+
}: {
|
|
1466
|
+
className?: string;
|
|
1467
|
+
} & React.ComponentProps<"div">) {
|
|
1068
1468
|
return (
|
|
1069
1469
|
<div
|
|
1070
1470
|
data-slot="sidebar-group"
|
|
@@ -1126,7 +1526,10 @@ function SidebarGroupLabel({
|
|
|
1126
1526
|
className,
|
|
1127
1527
|
asChild = false,
|
|
1128
1528
|
...props
|
|
1129
|
-
}:
|
|
1529
|
+
}: {
|
|
1530
|
+
className?: string;
|
|
1531
|
+
asChild?: boolean;
|
|
1532
|
+
} & React.ComponentProps<"div">) {
|
|
1130
1533
|
const Comp = asChild ? Slot : "div";
|
|
1131
1534
|
|
|
1132
1535
|
return (
|
|
@@ -1200,7 +1603,10 @@ function SidebarGroupAction({
|
|
|
1200
1603
|
className,
|
|
1201
1604
|
asChild = false,
|
|
1202
1605
|
...props
|
|
1203
|
-
}:
|
|
1606
|
+
}: {
|
|
1607
|
+
className?: string;
|
|
1608
|
+
asChild?: boolean;
|
|
1609
|
+
} & React.ComponentProps<"button">) {
|
|
1204
1610
|
const Comp = asChild ? Slot : "button";
|
|
1205
1611
|
|
|
1206
1612
|
return (
|
|
@@ -1279,7 +1685,9 @@ function SidebarGroupAction({
|
|
|
1279
1685
|
function SidebarGroupContent({
|
|
1280
1686
|
className,
|
|
1281
1687
|
...props
|
|
1282
|
-
}:
|
|
1688
|
+
}: {
|
|
1689
|
+
className?: string;
|
|
1690
|
+
} & React.ComponentProps<"div">) {
|
|
1283
1691
|
return (
|
|
1284
1692
|
<div
|
|
1285
1693
|
data-slot="sidebar-group-content"
|
|
@@ -1353,7 +1761,12 @@ function SidebarGroupContent({
|
|
|
1353
1761
|
* @see {@link SidebarMenuButton} - Interactive menu button
|
|
1354
1762
|
* @since 1.0.0
|
|
1355
1763
|
*/
|
|
1356
|
-
function SidebarMenu({
|
|
1764
|
+
function SidebarMenu({
|
|
1765
|
+
className,
|
|
1766
|
+
...props
|
|
1767
|
+
}: {
|
|
1768
|
+
className?: string;
|
|
1769
|
+
} & React.ComponentProps<"ul">) {
|
|
1357
1770
|
return (
|
|
1358
1771
|
<ul
|
|
1359
1772
|
data-slot="sidebar-menu"
|
|
@@ -1436,7 +1849,12 @@ function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) {
|
|
|
1436
1849
|
* @see {@link SidebarMenuBadge} - Badge indicator component
|
|
1437
1850
|
* @since 1.0.0
|
|
1438
1851
|
*/
|
|
1439
|
-
function SidebarMenuItem({
|
|
1852
|
+
function SidebarMenuItem({
|
|
1853
|
+
className,
|
|
1854
|
+
...props
|
|
1855
|
+
}: {
|
|
1856
|
+
className?: string;
|
|
1857
|
+
} & React.ComponentProps<"li">) {
|
|
1440
1858
|
return (
|
|
1441
1859
|
<li
|
|
1442
1860
|
data-slot="sidebar-menu-item"
|
|
@@ -1447,6 +1865,16 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
|
|
|
1447
1865
|
);
|
|
1448
1866
|
}
|
|
1449
1867
|
|
|
1868
|
+
/**
|
|
1869
|
+
* SidebarMenuButton variant configuration for visual appearances and sizes
|
|
1870
|
+
*
|
|
1871
|
+
* @variant default - Standard menu button with subtle hover states
|
|
1872
|
+
* @variant outline - Button with border background that highlights on interaction
|
|
1873
|
+
*
|
|
1874
|
+
* @size default - Standard button height (h-8) with text-sm
|
|
1875
|
+
* @size sm - Compact button height (h-7) with text-xs for dense layouts
|
|
1876
|
+
* @size lg - Large button height (h-12) with text-sm, collapses to icon padding when sidebar is collapsed
|
|
1877
|
+
*/
|
|
1450
1878
|
const sidebarMenuButtonVariants = cva(
|
|
1451
1879
|
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
|
1452
1880
|
{
|
|
@@ -1573,11 +2001,13 @@ function SidebarMenuButton({
|
|
|
1573
2001
|
tooltip,
|
|
1574
2002
|
className,
|
|
1575
2003
|
...props
|
|
1576
|
-
}:
|
|
2004
|
+
}: {
|
|
1577
2005
|
asChild?: boolean;
|
|
1578
2006
|
isActive?: boolean;
|
|
1579
2007
|
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
1580
|
-
|
|
2008
|
+
className?: string;
|
|
2009
|
+
} & VariantProps<typeof sidebarMenuButtonVariants> &
|
|
2010
|
+
React.ComponentProps<"button">) {
|
|
1581
2011
|
const Comp = asChild ? Slot : "button";
|
|
1582
2012
|
const { isMobile, state } = useSidebar();
|
|
1583
2013
|
|
|
@@ -1694,10 +2124,11 @@ function SidebarMenuAction({
|
|
|
1694
2124
|
asChild = false,
|
|
1695
2125
|
showOnHover = false,
|
|
1696
2126
|
...props
|
|
1697
|
-
}:
|
|
2127
|
+
}: {
|
|
2128
|
+
className?: string;
|
|
1698
2129
|
asChild?: boolean;
|
|
1699
2130
|
showOnHover?: boolean;
|
|
1700
|
-
}) {
|
|
2131
|
+
} & React.ComponentProps<"button">) {
|
|
1701
2132
|
const Comp = asChild ? Slot : "button";
|
|
1702
2133
|
|
|
1703
2134
|
return (
|
|
@@ -1789,7 +2220,9 @@ function SidebarMenuAction({
|
|
|
1789
2220
|
function SidebarMenuBadge({
|
|
1790
2221
|
className,
|
|
1791
2222
|
...props
|
|
1792
|
-
}:
|
|
2223
|
+
}: {
|
|
2224
|
+
className?: string;
|
|
2225
|
+
} & React.ComponentProps<"div">) {
|
|
1793
2226
|
return (
|
|
1794
2227
|
<div
|
|
1795
2228
|
data-slot="sidebar-menu-badge"
|
|
@@ -1884,9 +2317,10 @@ function SidebarMenuSkeleton({
|
|
|
1884
2317
|
className,
|
|
1885
2318
|
showIcon = false,
|
|
1886
2319
|
...props
|
|
1887
|
-
}:
|
|
2320
|
+
}: {
|
|
2321
|
+
className?: string;
|
|
1888
2322
|
showIcon?: boolean;
|
|
1889
|
-
}) {
|
|
2323
|
+
} & React.ComponentProps<"div">) {
|
|
1890
2324
|
// Random width between 50 to 90%.
|
|
1891
2325
|
const width = `${Math.floor(Math.random() * 40) + 50}%`;
|
|
1892
2326
|
|
|
@@ -1995,7 +2429,12 @@ function SidebarMenuSkeleton({
|
|
|
1995
2429
|
* @see {@link SidebarMenuItem} - Parent menu item
|
|
1996
2430
|
* @since 1.0.0
|
|
1997
2431
|
*/
|
|
1998
|
-
function SidebarMenuSub({
|
|
2432
|
+
function SidebarMenuSub({
|
|
2433
|
+
className,
|
|
2434
|
+
...props
|
|
2435
|
+
}: {
|
|
2436
|
+
className?: string;
|
|
2437
|
+
} & React.ComponentProps<"ul">) {
|
|
1999
2438
|
return (
|
|
2000
2439
|
<ul
|
|
2001
2440
|
data-slot="sidebar-menu-sub"
|
|
@@ -2059,7 +2498,9 @@ function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">) {
|
|
|
2059
2498
|
function SidebarMenuSubItem({
|
|
2060
2499
|
className,
|
|
2061
2500
|
...props
|
|
2062
|
-
}:
|
|
2501
|
+
}: {
|
|
2502
|
+
className?: string;
|
|
2503
|
+
} & React.ComponentProps<"li">) {
|
|
2063
2504
|
return (
|
|
2064
2505
|
<li
|
|
2065
2506
|
data-slot="sidebar-menu-sub-item"
|
|
@@ -2157,11 +2598,12 @@ function SidebarMenuSubButton({
|
|
|
2157
2598
|
isActive = false,
|
|
2158
2599
|
className,
|
|
2159
2600
|
...props
|
|
2160
|
-
}:
|
|
2601
|
+
}: {
|
|
2161
2602
|
asChild?: boolean;
|
|
2162
2603
|
size?: "sm" | "md";
|
|
2163
2604
|
isActive?: boolean;
|
|
2164
|
-
|
|
2605
|
+
className?: string;
|
|
2606
|
+
} & React.ComponentProps<"a">) {
|
|
2165
2607
|
const Comp = asChild ? Slot : "a";
|
|
2166
2608
|
|
|
2167
2609
|
return (
|