@saas-ui/react 2.11.2 → 3.0.0-alpha.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. package/CHANGELOG.md +7 -154
  2. package/dist/index.cjs +8461 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +26 -0
  5. package/dist/index.d.ts +25 -7
  6. package/dist/index.js +8415 -35
  7. package/dist/index.js.map +1 -1
  8. package/package.json +24 -21
  9. package/src/components/accordion.tsx +47 -0
  10. package/src/components/action-bar.tsx +40 -0
  11. package/src/components/alert.tsx +51 -0
  12. package/src/components/app-shell/app-shell.recipe.ts +52 -0
  13. package/src/components/app-shell/app-shell.stories.tsx +51 -0
  14. package/src/components/app-shell/app-shell.tsx +94 -0
  15. package/src/components/app-shell/index.ts +3 -0
  16. package/src/components/avatar.tsx +74 -0
  17. package/src/components/blockquote.tsx +31 -0
  18. package/src/components/breadcrumbs/breadcrumb.stories.tsx +17 -0
  19. package/src/components/breadcrumbs/breadcrumb.tsx +36 -0
  20. package/src/components/breadcrumbs/index.ts +1 -0
  21. package/src/components/breadcrumbs/namespace.ts +8 -0
  22. package/src/components/button/button.recipe.ts +182 -0
  23. package/src/components/button/button.stories.tsx +99 -0
  24. package/src/components/button/button.tsx +55 -0
  25. package/src/components/button/index.ts +2 -0
  26. package/src/components/checkbox/checkbox.tsx +26 -0
  27. package/src/components/checkbox/index.ts +2 -0
  28. package/src/components/checkbox-card.tsx +57 -0
  29. package/src/components/checkbox.tsx +25 -0
  30. package/src/components/clipboard.tsx +107 -0
  31. package/src/components/close-button/close-button.stories.tsx +12 -0
  32. package/src/components/close-button/close-button.tsx +18 -0
  33. package/src/components/close-button/index.ts +2 -0
  34. package/src/components/color-mode.tsx +65 -0
  35. package/src/components/command/command.recipe.ts +17 -0
  36. package/src/components/command/command.stories.tsx +47 -0
  37. package/src/components/command/command.tsx +50 -0
  38. package/src/components/command/index.ts +1 -0
  39. package/src/components/data-list.tsx +37 -0
  40. package/src/components/dialog/dialog.tsx +66 -0
  41. package/src/components/dialog/index.ts +1 -0
  42. package/src/components/dialog/namespace.ts +18 -0
  43. package/src/components/drawer/drawer.tsx +56 -0
  44. package/src/components/drawer/index.ts +3 -0
  45. package/src/components/drawer/namespace.ts +19 -0
  46. package/src/components/empty-state.tsx +34 -0
  47. package/src/components/field.tsx +33 -0
  48. package/src/components/file-button.tsx +166 -0
  49. package/src/components/grid-list/grid-list.recipe.ts +113 -0
  50. package/src/components/hover-card.tsx +35 -0
  51. package/src/components/icon-badge/icon-badge.recipe.ts +57 -0
  52. package/src/components/icon-badge/icon-badge.stories.tsx +38 -0
  53. package/src/components/icon-badge/icon-badge.tsx +59 -0
  54. package/src/components/icon-badge/index.ts +2 -0
  55. package/src/components/icons/create-icon.tsx +41 -0
  56. package/src/components/icons/icons.tsx +121 -0
  57. package/src/components/icons/index.ts +1 -0
  58. package/src/components/input-group/index.ts +1 -0
  59. package/src/components/input-group/input-group.tsx +46 -0
  60. package/src/components/link/index.ts +2 -0
  61. package/src/components/link/link.stories.tsx +17 -0
  62. package/src/components/link/link.test.tsx +33 -0
  63. package/src/components/link/link.tsx +27 -0
  64. package/src/components/link-button.tsx +12 -0
  65. package/src/components/loading-overlay/index.ts +1 -0
  66. package/src/components/loading-overlay/loading-overlay.recipe.ts +61 -0
  67. package/src/components/loading-overlay/loading-overlay.stories.tsx +68 -0
  68. package/src/components/loading-overlay/loading-overlay.tsx +54 -0
  69. package/src/components/loading-overlay/namespace.ts +7 -0
  70. package/src/components/menu.tsx +108 -0
  71. package/src/components/native-select.tsx +57 -0
  72. package/src/components/navbar/index.ts +1 -0
  73. package/src/components/navbar/namespace.ts +9 -0
  74. package/src/components/navbar/navbar.recipe.ts +109 -0
  75. package/src/components/navbar/navbar.stories.tsx +435 -0
  76. package/src/components/navbar/navbar.test.tsx +49 -0
  77. package/src/components/navbar/navbar.tsx +39 -0
  78. package/src/components/number-input/index.ts +2 -0
  79. package/src/components/number-input/number-input.tsx +41 -0
  80. package/src/components/pagination.tsx +207 -0
  81. package/src/components/password-input/index.ts +2 -0
  82. package/src/components/password-input/password-input.tsx +98 -0
  83. package/src/components/persona/index.ts +2 -0
  84. package/src/components/persona/namespace.ts +18 -0
  85. package/src/components/persona/persona-primitive.tsx +220 -0
  86. package/src/components/persona/persona.recipe.ts +94 -0
  87. package/src/components/persona/persona.stories.tsx +101 -0
  88. package/src/components/persona/persona.tsx +143 -0
  89. package/src/components/pin-input/index.ts +2 -0
  90. package/src/components/pin-input/pin-input.tsx +36 -0
  91. package/src/components/popover.tsx +58 -0
  92. package/src/components/progress-circle.tsx +37 -0
  93. package/src/components/progress.tsx +40 -0
  94. package/src/components/prose.tsx +264 -0
  95. package/src/components/provider.tsx +12 -0
  96. package/src/components/radio/index.ts +2 -0
  97. package/src/components/radio/radio.tsx +27 -0
  98. package/src/components/radio-card.tsx +57 -0
  99. package/src/components/radio.tsx +24 -0
  100. package/src/components/rating.tsx +27 -0
  101. package/src/components/search-input/index.ts +2 -0
  102. package/src/components/search-input/search-input.stories.tsx +63 -0
  103. package/src/components/search-input/search-input.tsx +134 -0
  104. package/src/components/segmented-control.tsx +47 -0
  105. package/src/components/select/index.ts +1 -0
  106. package/src/components/select/namespace.ts +18 -0
  107. package/src/components/select/select.tsx +135 -0
  108. package/src/components/sidebar/index.ts +7 -0
  109. package/src/components/sidebar/namespace.ts +27 -0
  110. package/src/components/sidebar/sidebar-item.recipe.ts +65 -0
  111. package/src/components/sidebar/sidebar.recipe.ts +237 -0
  112. package/src/components/sidebar/sidebar.stories.tsx +903 -0
  113. package/src/components/sidebar/sidebar.tsx +204 -0
  114. package/src/components/skeleton.tsx +44 -0
  115. package/src/components/slider.tsx +53 -0
  116. package/src/components/spinner/index.ts +2 -0
  117. package/src/components/spinner/spinner.stories.tsx +19 -0
  118. package/src/components/spinner/spinner.tsx +21 -0
  119. package/src/components/stat.tsx +75 -0
  120. package/src/components/status.tsx +29 -0
  121. package/src/components/stepper-input.tsx +49 -0
  122. package/src/components/steps/index.ts +1 -0
  123. package/src/components/steps/namespace.ts +16 -0
  124. package/src/components/steps/steps.tsx +82 -0
  125. package/src/components/switch/index.ts +3 -0
  126. package/src/components/switch/switch.tsx +39 -0
  127. package/src/components/tag.tsx +39 -0
  128. package/src/components/timeline.tsx +17 -0
  129. package/src/components/toaster.tsx +43 -0
  130. package/src/components/toggle-tip.tsx +62 -0
  131. package/src/components/tooltip.tsx +46 -0
  132. package/src/index.ts +6 -7
  133. package/src/preset.ts +9 -0
  134. package/src/provider/index.ts +4 -0
  135. package/src/provider/sui-provider.tsx +34 -0
  136. package/src/provider/use-link.test.tsx +60 -0
  137. package/src/provider/use-link.tsx +13 -0
  138. package/src/theme/animation-styles.ts +53 -0
  139. package/src/theme/breakpoints.ts +11 -0
  140. package/src/theme/conditions.ts +26 -0
  141. package/src/theme/fluid-font-sizes.ts +65 -0
  142. package/src/theme/global-css.ts +94 -0
  143. package/src/theme/index.ts +72 -0
  144. package/src/theme/layer-styles.ts +116 -0
  145. package/src/theme/recipes/chakra/accordion.ts +145 -0
  146. package/src/theme/recipes/chakra/action-bar.ts +62 -0
  147. package/src/theme/recipes/chakra/alert.ts +157 -0
  148. package/src/theme/recipes/chakra/avatar.ts +141 -0
  149. package/src/theme/recipes/chakra/badge.ts +67 -0
  150. package/src/theme/recipes/chakra/blockquote.ts +83 -0
  151. package/src/theme/recipes/chakra/breadcrumb.ts +94 -0
  152. package/src/theme/recipes/chakra/card.ts +99 -0
  153. package/src/theme/recipes/chakra/checkbox-card.ts +212 -0
  154. package/src/theme/recipes/chakra/checkbox.ts +70 -0
  155. package/src/theme/recipes/chakra/checkmark.ts +83 -0
  156. package/src/theme/recipes/chakra/code.ts +17 -0
  157. package/src/theme/recipes/chakra/collapsible.ts +20 -0
  158. package/src/theme/recipes/chakra/container.ts +26 -0
  159. package/src/theme/recipes/chakra/data-list.ts +80 -0
  160. package/src/theme/recipes/chakra/dialog.ts +225 -0
  161. package/src/theme/recipes/chakra/drawer.ts +201 -0
  162. package/src/theme/recipes/chakra/editable.ts +88 -0
  163. package/src/theme/recipes/chakra/empty-state.ts +88 -0
  164. package/src/theme/recipes/chakra/field.ts +68 -0
  165. package/src/theme/recipes/chakra/fieldset.ts +62 -0
  166. package/src/theme/recipes/chakra/file-upload.ts +96 -0
  167. package/src/theme/recipes/chakra/heading.ts +27 -0
  168. package/src/theme/recipes/chakra/hover-card.ts +68 -0
  169. package/src/theme/recipes/chakra/icon.ts +30 -0
  170. package/src/theme/recipes/chakra/input-addon.ts +40 -0
  171. package/src/theme/recipes/chakra/input.ts +96 -0
  172. package/src/theme/recipes/chakra/kbd.ts +60 -0
  173. package/src/theme/recipes/chakra/link.ts +37 -0
  174. package/src/theme/recipes/chakra/list.ts +67 -0
  175. package/src/theme/recipes/chakra/mark.ts +27 -0
  176. package/src/theme/recipes/chakra/menu.ts +124 -0
  177. package/src/theme/recipes/chakra/native-select.ts +140 -0
  178. package/src/theme/recipes/chakra/number-input.ts +115 -0
  179. package/src/theme/recipes/chakra/pin-input.ts +27 -0
  180. package/src/theme/recipes/chakra/popover.ts +86 -0
  181. package/src/theme/recipes/chakra/progress-circle.ts +94 -0
  182. package/src/theme/recipes/chakra/progress.ts +127 -0
  183. package/src/theme/recipes/chakra/radio-card.ts +220 -0
  184. package/src/theme/recipes/chakra/radio-group.ts +72 -0
  185. package/src/theme/recipes/chakra/radiomark.ts +107 -0
  186. package/src/theme/recipes/chakra/rating-group.ts +94 -0
  187. package/src/theme/recipes/chakra/segment-group.ts +117 -0
  188. package/src/theme/recipes/chakra/select.ts +282 -0
  189. package/src/theme/recipes/chakra/separator.ts +51 -0
  190. package/src/theme/recipes/chakra/skeleton.ts +53 -0
  191. package/src/theme/recipes/chakra/skip-nav-link.ts +34 -0
  192. package/src/theme/recipes/chakra/slider.ts +178 -0
  193. package/src/theme/recipes/chakra/spinner.ts +32 -0
  194. package/src/theme/recipes/chakra/stat.ts +79 -0
  195. package/src/theme/recipes/chakra/status.ts +48 -0
  196. package/src/theme/recipes/chakra/steps.ts +218 -0
  197. package/src/theme/recipes/chakra/switch.ts +167 -0
  198. package/src/theme/recipes/chakra/table.ts +172 -0
  199. package/src/theme/recipes/chakra/tabs.ts +280 -0
  200. package/src/theme/recipes/chakra/tag.ts +131 -0
  201. package/src/theme/recipes/chakra/textarea.ts +88 -0
  202. package/src/theme/recipes/chakra/timeline.ts +138 -0
  203. package/src/theme/recipes/chakra/toast.ts +96 -0
  204. package/src/theme/recipes/chakra/tooltip.ts +40 -0
  205. package/src/theme/recipes.ts +46 -0
  206. package/src/theme/semantic-tokens/colors.ts +403 -0
  207. package/src/theme/semantic-tokens/radii.ts +7 -0
  208. package/src/theme/semantic-tokens/shadows.ts +52 -0
  209. package/src/theme/slot-recipes.ts +104 -0
  210. package/src/theme/text-styles.ts +39 -0
  211. package/src/theme/tokens/animations.ts +8 -0
  212. package/src/theme/tokens/aspect-ratios.ts +10 -0
  213. package/src/theme/tokens/blurs.ts +12 -0
  214. package/src/theme/tokens/borders.ts +9 -0
  215. package/src/theme/tokens/colors.ts +177 -0
  216. package/src/theme/tokens/cursor.ts +12 -0
  217. package/src/theme/tokens/durations.ts +11 -0
  218. package/src/theme/tokens/easings.ts +10 -0
  219. package/src/theme/tokens/font-sizes.ts +20 -0
  220. package/src/theme/tokens/font-weights.ts +13 -0
  221. package/src/theme/tokens/fonts.ts +15 -0
  222. package/src/theme/tokens/keyframes.ts +173 -0
  223. package/src/theme/tokens/letter-spacing.ts +9 -0
  224. package/src/theme/tokens/line-heights.ts +19 -0
  225. package/src/theme/tokens/radius.ts +18 -0
  226. package/src/theme/tokens/sizes.ts +71 -0
  227. package/src/theme/tokens/spacing.ts +38 -0
  228. package/src/theme/tokens/z-indices.ts +34 -0
  229. package/src/theme/utils.ts +46 -0
  230. package/dist/index.d.mts +0 -8
  231. package/dist/index.mjs +0 -11
  232. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,903 @@
1
+ import * as React from 'react'
2
+
3
+ import {
4
+ Badge,
5
+ Box,
6
+ Breadcrumb,
7
+ Collapsible,
8
+ Flex,
9
+ HStack,
10
+ Icon,
11
+ IconButton,
12
+ Menu,
13
+ Portal,
14
+ Skeleton as SkeletonPrimitive,
15
+ type SkeletonProps,
16
+ Spacer,
17
+ Stack,
18
+ Text,
19
+ } from '@chakra-ui/react'
20
+ import { SaasUIIcon } from '@saas-ui/assets'
21
+ import type { Meta, StoryObj } from '@storybook/react'
22
+ import { atom, useAtom } from 'jotai'
23
+ import {
24
+ RiAddLine,
25
+ RiArrowRightSFill,
26
+ RiCloseLine,
27
+ RiFolderFill,
28
+ RiInbox2Fill,
29
+ RiOrganizationChart,
30
+ RiSearchLine,
31
+ RiSideBarLine,
32
+ RiSidebarFoldLine,
33
+ } from 'react-icons/ri'
34
+
35
+ import { AppShell } from '../app-shell/index.ts'
36
+ import { PersonaAvatar } from '../persona/persona.tsx'
37
+ import { Sidebar, useSidebar } from './index.ts'
38
+ import { SidebarNavItemEndElement } from './sidebar.tsx'
39
+
40
+ export interface SkeletonTextProps extends SkeletonProps {
41
+ noOfLines?: number
42
+ }
43
+
44
+ const Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(
45
+ function Skeleton(props, ref) {
46
+ return (
47
+ <SkeletonPrimitive ref={ref} variant="none" bg="bg.subtle" {...props} />
48
+ )
49
+ },
50
+ )
51
+
52
+ const SkeletonText = React.forwardRef<HTMLDivElement, SkeletonTextProps>(
53
+ function SkeletonText(props, ref) {
54
+ const { noOfLines = 3, gap, ...rest } = props
55
+ return (
56
+ <Stack gap={gap} width="full" ref={ref}>
57
+ {Array.from({ length: noOfLines }).map((_, index) => (
58
+ <SkeletonPrimitive
59
+ height="4"
60
+ key={index}
61
+ _last={{ maxW: '80%' }}
62
+ variant="none"
63
+ bg="bg.subtle"
64
+ {...rest}
65
+ />
66
+ ))}
67
+ </Stack>
68
+ )
69
+ },
70
+ )
71
+
72
+ const modeAtom = atom<'flyout' | 'collapsible'>('collapsible')
73
+
74
+ function SidebarLayout(props: { children: React.ReactElement }) {
75
+ const [mode, setMode] = useAtom(modeAtom)
76
+
77
+ return (
78
+ <Sidebar.Provider mode={mode}>
79
+ <AppShell sidebar={props.children}>
80
+ <Stack height="full" flex="1" boxShadow="sm">
81
+ <HStack
82
+ px="4"
83
+ minH="12"
84
+ alignItems="center"
85
+ borderBottomWidth="1px"
86
+ gap="2"
87
+ >
88
+ <Sidebar.Trigger asChild>
89
+ <IconButton
90
+ variant="ghost"
91
+ aria-label="Toggle sidebar"
92
+ _open={{
93
+ display: 'none',
94
+ }}
95
+ onClick={() =>
96
+ setMode(mode === 'flyout' ? 'collapsible' : mode)
97
+ }
98
+ >
99
+ <RiSideBarLine />
100
+ </IconButton>
101
+ </Sidebar.Trigger>
102
+
103
+ <Breadcrumb.Root>
104
+ <Breadcrumb.List>
105
+ <Breadcrumb.Item>
106
+ <Breadcrumb.Link>Inbox</Breadcrumb.Link>
107
+ </Breadcrumb.Item>
108
+ <Breadcrumb.Separator />
109
+ <Breadcrumb.Item>
110
+ <Breadcrumb.CurrentLink>Saas UI</Breadcrumb.CurrentLink>
111
+ </Breadcrumb.Item>
112
+ </Breadcrumb.List>
113
+ </Breadcrumb.Root>
114
+ </HStack>
115
+
116
+ <Box flex="1" overflow="auto" px="4" py="4">
117
+ <HStack gap="4">
118
+ <Box flex="1">
119
+ <Skeleton height="100px" />
120
+ <SkeletonText noOfLines={6} />
121
+ </Box>
122
+
123
+ <Box flex="1">
124
+ <Skeleton height="100px" />
125
+ <SkeletonText noOfLines={6} />
126
+ </Box>
127
+ </HStack>
128
+ </Box>
129
+ </Stack>
130
+ </AppShell>
131
+ </Sidebar.Provider>
132
+ )
133
+ }
134
+
135
+ export default {
136
+ title: 'Components/Sidebar',
137
+ parameters: { layout: 'fullscreen' },
138
+ component: Sidebar.Root,
139
+ decorators: [
140
+ (Story) => (
141
+ <SidebarLayout>
142
+ <Story />
143
+ </SidebarLayout>
144
+ ),
145
+ ],
146
+ } as Meta
147
+
148
+ function WorkspaceMenu() {
149
+ return (
150
+ <Sidebar.NavItem>
151
+ <Menu.Root>
152
+ <Menu.Trigger asChild>
153
+ <Sidebar.NavButton>
154
+ <Flex
155
+ boxSize="5"
156
+ p="5px"
157
+ rounded="full"
158
+ bg="bg.inverted"
159
+ alignItems="center"
160
+ justifyContent="center"
161
+ >
162
+ <SaasUIIcon color="white" />
163
+ </Flex>
164
+ Saas.js
165
+ </Sidebar.NavButton>
166
+ </Menu.Trigger>
167
+ <Menu.Positioner>
168
+ <Menu.Content>
169
+ <Menu.Item value="account">Account</Menu.Item>
170
+ <Menu.Item value="settings">Workspace settings</Menu.Item>
171
+ <Menu.Separator />
172
+ <Menu.Root>
173
+ <Menu.TriggerItem>Switch workspace</Menu.TriggerItem>
174
+
175
+ <Portal>
176
+ <Menu.Positioner>
177
+ <Menu.Content>
178
+ <Menu.Item value="saasjs">Saas.js</Menu.Item>
179
+ <Menu.Item value="acme">ACME</Menu.Item>
180
+ <Menu.Separator />
181
+ <Menu.Item value="create">Create new workspace</Menu.Item>
182
+ </Menu.Content>
183
+ </Menu.Positioner>
184
+ </Portal>
185
+ </Menu.Root>
186
+ <Menu.Item value="signout">Sign out</Menu.Item>
187
+ </Menu.Content>
188
+ </Menu.Positioner>
189
+ </Menu.Root>
190
+ </Sidebar.NavItem>
191
+ )
192
+ }
193
+
194
+ type Story = StoryObj<typeof Sidebar.Root>
195
+
196
+ export const Default: Story = {
197
+ render: (props) => {
198
+ const [mode, setMode] = useAtom(modeAtom)
199
+
200
+ return (
201
+ <>
202
+ <Sidebar.FlyoutTrigger />
203
+ <Sidebar.Root {...props}>
204
+ <Sidebar.Header direction="row">
205
+ <WorkspaceMenu />
206
+ <Spacer />
207
+ <IconButton variant="ghost" rounded="full">
208
+ <RiSearchLine />
209
+ </IconButton>
210
+ {mode === 'collapsible' && (
211
+ <Sidebar.Trigger asChild>
212
+ <IconButton
213
+ variant="ghost"
214
+ aria-label="Toggle sidebar"
215
+ rounded="full"
216
+ >
217
+ <RiSidebarFoldLine />
218
+ </IconButton>
219
+ </Sidebar.Trigger>
220
+ )}
221
+ </Sidebar.Header>
222
+ <Sidebar.Body flex="1" overflowY="auto">
223
+ <Sidebar.Group>
224
+ <Sidebar.GroupContent>
225
+ <Sidebar.NavItem>
226
+ <Sidebar.NavButton active>
227
+ <RiInbox2Fill />
228
+ Inbox
229
+ <Spacer />
230
+ <Badge bg="none" px="2">
231
+ 12
232
+ </Badge>
233
+ </Sidebar.NavButton>
234
+ </Sidebar.NavItem>
235
+ <Sidebar.NavItem>
236
+ <Sidebar.NavButton>
237
+ <RiFolderFill />
238
+ Projects
239
+ </Sidebar.NavButton>
240
+ </Sidebar.NavItem>
241
+ <Sidebar.NavItem>
242
+ <Sidebar.NavButton>
243
+ <RiOrganizationChart />
244
+ Workflows
245
+ </Sidebar.NavButton>
246
+ </Sidebar.NavItem>
247
+ </Sidebar.GroupContent>
248
+ </Sidebar.Group>
249
+
250
+ <Collapsible.Root asChild defaultOpen>
251
+ <Sidebar.Group>
252
+ <Sidebar.GroupHeader>
253
+ <Collapsible.Trigger asChild>
254
+ <Sidebar.GroupTitle>
255
+ Favourites{' '}
256
+ <Icon
257
+ ms="1"
258
+ transition="transform"
259
+ _groupOpen={{ transform: 'rotate(90deg)' }}
260
+ >
261
+ <RiArrowRightSFill />
262
+ </Icon>
263
+ </Sidebar.GroupTitle>
264
+ </Collapsible.Trigger>
265
+
266
+ <Sidebar.GroupEndElement>
267
+ <IconButton
268
+ variant="ghost"
269
+ aria-label="Add to favourites"
270
+ size="xs"
271
+ opacity="0"
272
+ _groupHover={{ opacity: 0.6, _hover: { opacity: 1 } }}
273
+ >
274
+ <RiAddLine />
275
+ </IconButton>
276
+ </Sidebar.GroupEndElement>
277
+ </Sidebar.GroupHeader>
278
+ <Collapsible.Content>
279
+ <Sidebar.GroupContent>
280
+ <Sidebar.NavItem>
281
+ <Sidebar.NavButton>
282
+ <Text>🌟</Text>
283
+ Chakra v3
284
+ <Spacer />
285
+ <IconButton
286
+ variant="ghost"
287
+ aria-label="Remove from favourites"
288
+ title="Remove from favourites"
289
+ size="xs"
290
+ opacity="0"
291
+ _parentHover={{
292
+ opacity: 0.6,
293
+ _hover: { opacity: 1 },
294
+ }}
295
+ >
296
+ <RiCloseLine />
297
+ </IconButton>
298
+ </Sidebar.NavButton>
299
+ </Sidebar.NavItem>
300
+ <Sidebar.NavItem>
301
+ <Sidebar.NavButton>
302
+ <Text>🎨</Text>
303
+ Design systems
304
+ <Spacer />
305
+ <IconButton
306
+ variant="ghost"
307
+ aria-label="Remove from favourites"
308
+ title="Remove from favourites"
309
+ size="xs"
310
+ opacity="0"
311
+ _parentHover={{
312
+ opacity: 0.6,
313
+ _hover: { opacity: 1 },
314
+ }}
315
+ >
316
+ <RiCloseLine />
317
+ </IconButton>
318
+ </Sidebar.NavButton>
319
+ </Sidebar.NavItem>
320
+ </Sidebar.GroupContent>
321
+ </Collapsible.Content>
322
+ </Sidebar.Group>
323
+ </Collapsible.Root>
324
+ </Sidebar.Body>
325
+ <Sidebar.Footer></Sidebar.Footer>
326
+
327
+ <Sidebar.Track
328
+ onClick={() =>
329
+ setMode(mode === 'flyout' ? 'collapsible' : 'flyout')
330
+ }
331
+ />
332
+ </Sidebar.Root>
333
+ <Sidebar.Backdrop />
334
+ </>
335
+ )
336
+ },
337
+ }
338
+
339
+ // export const WithLinks = Template.bind({})
340
+ // WithLinks.args = {
341
+ // children: (
342
+ // <>
343
+ // <SidebarSection flex="1" overflowY="auto">
344
+ // <NavItem isActive>Home</NavItem>
345
+ // <NavItem>Users</NavItem>
346
+ // <NavItem>Settings</NavItem>
347
+ // </SidebarSection>
348
+ // </>
349
+ // ),
350
+ // }
351
+
352
+ // export const WithFeatherIcons = Template.bind({})
353
+ // WithFeatherIcons.args = {
354
+ // children: (
355
+ // <>
356
+ // <SidebarSection flex="1" overflowY="auto">
357
+ // <NavItem icon={<FiHome />} isActive>
358
+ // Home
359
+ // </NavItem>
360
+ // <NavItem icon={<FiUsers />}>Users</NavItem>
361
+ // <NavItem icon={<FiSettings />}>Settings</NavItem>
362
+ // </SidebarSection>
363
+ // </>
364
+ // ),
365
+ // }
366
+
367
+ // export const WithFaIcons = Template.bind({})
368
+ // WithFaIcons.args = {
369
+ // children: (
370
+ // <>
371
+ // <SidebarSection flex="1" overflowY="auto">
372
+ // <NavItem icon={<FaHome />} isActive>
373
+ // Home
374
+ // </NavItem>
375
+ // <NavItem icon={<FaUsers />}>Users</NavItem>
376
+ // <NavItem icon={<FaCog />}>Settings</NavItem>
377
+ // </SidebarSection>
378
+ // </>
379
+ // ),
380
+ // }
381
+
382
+ // export const WithHorizontalNav = Template.bind({})
383
+ // WithHorizontalNav.args = {
384
+ // children: (
385
+ // <>
386
+ // <SidebarSection ps="6" pe="4" direction="row">
387
+ // <Logo width="24px" />
388
+ // <Spacer />
389
+ // <Menu>
390
+ // <MenuButton as={IconButton} variant="ghost">
391
+ // <PersonaAvatar presence="online" size="xs" />
392
+ // </MenuButton>
393
+ // <MenuList>
394
+ // <MenuItem>Sign out</MenuItem>
395
+ // </MenuList>
396
+ // </Menu>
397
+ // </SidebarSection>
398
+ // <SidebarSection flex="1" overflowY="auto">
399
+ // <NavItem icon={<FiHome />} isActive>
400
+ // Home
401
+ // </NavItem>
402
+ // <NavItem icon={<FiUsers />}>Users</NavItem>
403
+ // <NavItem icon={<FiSettings />}>Settings</NavItem>
404
+ // </SidebarSection>
405
+ // </>
406
+ // ),
407
+ // }
408
+
409
+ // export const WithCollapsibleGroup = Template.bind({})
410
+ // WithCollapsibleGroup.args = {
411
+ // children: (
412
+ // <>
413
+ // <SidebarSection px="4" direction="row">
414
+ // <Logo width="24px" />
415
+ // <Spacer />
416
+ // <Menu>
417
+ // <MenuButton as={IconButton} variant="ghost">
418
+ // <PersonaAvatar presence="online" size="xs" />
419
+ // </MenuButton>
420
+ // <MenuList>
421
+ // <MenuItem>Sign out</MenuItem>
422
+ // </MenuList>
423
+ // </Menu>
424
+ // </SidebarSection>
425
+ // <SidebarSection flex="1" overflowY="auto">
426
+ // <NavGroup>
427
+ // <NavItem icon={<FiHome />} isActive>
428
+ // Home
429
+ // </NavItem>
430
+ // <NavItem icon={<FiUsers />}>Users</NavItem>
431
+ // <NavItem icon={<FiSettings />}>Settings</NavItem>
432
+ // </NavGroup>
433
+
434
+ // <NavGroup title="Tags" isCollapsible>
435
+ // <NavItem icon={<FiHash />}>Design system</NavItem>
436
+ // <NavItem icon={<FiHash />}>Framework</NavItem>
437
+ // <NavItem inset={5} icon={<FiHash />}>
438
+ // Chakra UI
439
+ // </NavItem>
440
+ // <NavItem inset={5} icon={<FiHash />}>
441
+ // React
442
+ // </NavItem>
443
+ // </NavGroup>
444
+ // </SidebarSection>
445
+ // </>
446
+ // ),
447
+ // }
448
+
449
+ // const NavItemBadge = (props: BadgeProps) => (
450
+ // <Badge bg="none" fontWeight="normal" rounded="md" ms="auto" {...props} />
451
+ // )
452
+
453
+ // export const WithBadge = Template.bind({})
454
+ // WithBadge.args = {
455
+ // children: (
456
+ // <>
457
+ // <SidebarSection px="4" direction="row">
458
+ // <Logo width="24px" />
459
+ // <Spacer />
460
+ // <Menu>
461
+ // <MenuButton as={IconButton} variant="ghost">
462
+ // <PersonaAvatar presence="online" size="xs" />
463
+ // </MenuButton>
464
+ // <MenuList>
465
+ // <MenuItem>Sign out</MenuItem>
466
+ // </MenuList>
467
+ // </Menu>
468
+ // </SidebarSection>
469
+ // <SidebarSection flex="1" overflowY="auto">
470
+ // <NavGroup>
471
+ // <NavItem icon={<FiHome />} isActive>
472
+ // Home
473
+ // </NavItem>
474
+ // <NavItem icon={<FiUsers />}>Users</NavItem>
475
+ // <NavItem icon={<FiSettings />}>Settings</NavItem>
476
+ // </NavGroup>
477
+
478
+ // <NavGroup title="Tags" isCollapsible>
479
+ // <NavItem icon={<FiHash />}>
480
+ // <Text>Design System</Text>
481
+ // <NavItemBadge>1</NavItemBadge>
482
+ // </NavItem>
483
+ // <NavItem icon={<FiHash />}>Framework</NavItem>
484
+ // <NavItem inset={5} icon={<FiHash />}>
485
+ // <Text>Chakra UI</Text>
486
+ // <NavItemBadge>32</NavItemBadge>
487
+ // </NavItem>
488
+ // <NavItem inset={5} icon={<FiHash />}>
489
+ // <Text>React</Text>
490
+ // <NavItemBadge>100</NavItemBadge>
491
+ // </NavItem>
492
+ // </NavGroup>
493
+ // </SidebarSection>
494
+ // </>
495
+ // ),
496
+ // }
497
+
498
+ // export const WithSubtleLinks = Template.bind({})
499
+ // WithSubtleLinks.args = {
500
+ // children: (
501
+ // <>
502
+ // <SidebarSection px="4" direction="row">
503
+ // <Logo width="24px" />
504
+ // <Spacer />
505
+ // <Menu>
506
+ // <MenuButton as={IconButton} variant="ghost">
507
+ // <PersonaAvatar presence="online" size="xs" />
508
+ // </MenuButton>
509
+ // <MenuList>
510
+ // <MenuItem>Sign out</MenuItem>
511
+ // </MenuList>
512
+ // </Menu>
513
+ // </SidebarSection>
514
+ // <SidebarSection flex="1" overflowY="auto">
515
+ // <NavGroup>
516
+ // <NavItem variant="subtle" icon={<FiHome />} isActive>
517
+ // Home
518
+ // </NavItem>
519
+ // <NavItem variant="subtle" icon={<FiUsers />}>
520
+ // Users
521
+ // </NavItem>
522
+ // <NavItem variant="subtle" icon={<FiSettings />}>
523
+ // Settings
524
+ // </NavItem>
525
+ // </NavGroup>
526
+
527
+ // <NavGroup title="Tags" isCollapsible>
528
+ // <NavItem icon={<FiHash />}>Design system</NavItem>
529
+ // <NavItem icon={<FiHash />}>Framework</NavItem>
530
+ // <NavItem inset={5} icon={<FiHash />}>
531
+ // Chakra UI
532
+ // </NavItem>
533
+ // <NavItem inset={5} icon={<FiHash />}>
534
+ // React
535
+ // </NavItem>
536
+ // </NavGroup>
537
+ // </SidebarSection>
538
+ // </>
539
+ // ),
540
+ // }
541
+
542
+ // export const WithSolidLinks = Template.bind({})
543
+ // WithSolidLinks.args = {
544
+ // children: (
545
+ // <>
546
+ // <SidebarSection px="4" direction="row">
547
+ // <Logo width="24px" />
548
+ // <Spacer />
549
+ // <Menu>
550
+ // <MenuButton as={IconButton} variant="ghost">
551
+ // <PersonaAvatar presence="online" size="xs" />
552
+ // </MenuButton>
553
+ // <MenuList>
554
+ // <MenuItem>Sign out</MenuItem>
555
+ // </MenuList>
556
+ // </Menu>
557
+ // </SidebarSection>
558
+ // <SidebarSection flex="1" overflowY="auto">
559
+ // <NavGroup>
560
+ // <NavItem icon={<FiHome />} isActive>
561
+ // Home
562
+ // </NavItem>
563
+ // <NavItem icon={<FiUsers />}>Users</NavItem>
564
+ // <NavItem icon={<FiSettings />}>Settings</NavItem>
565
+ // </NavGroup>
566
+
567
+ // <NavGroup title="Tags" isCollapsible>
568
+ // <NavItem icon={<FiHash />}>Design system</NavItem>
569
+ // <NavItem icon={<FiHash />}>Framework</NavItem>
570
+ // <NavItem inset={5} icon={<FiHash />}>
571
+ // Chakra UI
572
+ // </NavItem>
573
+ // <NavItem inset={5} icon={<FiHash />}>
574
+ // React
575
+ // </NavItem>
576
+ // </NavGroup>
577
+ // </SidebarSection>
578
+ // </>
579
+ // ),
580
+ // }
581
+
582
+ // export const VariantCompact = Template.bind({})
583
+ // VariantCompact.args = {
584
+ // variant: 'compact',
585
+ // children: (
586
+ // <>
587
+ // <SidebarSection alignItems="center">
588
+ // <Logo width="24px" color="primary.500" />
589
+ // </SidebarSection>
590
+ // <SidebarSection>
591
+ // <Nav>
592
+ // <NavItem icon={<FiHome size="1.2em" />} isActive>
593
+ // Home
594
+ // </NavItem>
595
+ // <NavItem icon={<FiUsers size="1.2em" />}>Users</NavItem>
596
+ // <NavItem icon={<FiSettings size="1.2em" />}>Settings</NavItem>
597
+ // </Nav>
598
+ // </SidebarSection>
599
+ // </>
600
+ // ),
601
+ // }
602
+
603
+ // export const VariantCompactColor = Template.bind({})
604
+ // VariantCompactColor.args = {
605
+ // variant: 'compact',
606
+ // colorScheme: 'purple',
607
+ // children: (
608
+ // <>
609
+ // <SidebarSection alignItems="center" px="2">
610
+ // <Logo width="24px" color="white" />
611
+ // </SidebarSection>
612
+ // <SidebarSection px="3">
613
+ // <Nav>
614
+ // <NavItem icon={<FiHome size="1.2em" color="white" />} isActive>
615
+ // Home
616
+ // </NavItem>
617
+ // <NavItem icon={<FiUsers size="1.2em" color="white" />}>Users</NavItem>
618
+ // <NavItem icon={<FiSettings size="1.2em" color="white" />}>
619
+ // Settings
620
+ // </NavItem>
621
+ // </Nav>
622
+ // </SidebarSection>
623
+ // </>
624
+ // ),
625
+ // }
626
+
627
+ // export const VariantCompactResponsive = Template.bind({})
628
+ // VariantCompactResponsive.args = {
629
+ // variant: { base: 'compact' },
630
+ // toggleBreakpoint: false,
631
+ // colorScheme: 'purple',
632
+ // children: (
633
+ // <>
634
+ // <SidebarSection alignItems="center">
635
+ // <Logo width="24px" color="white" />
636
+ // </SidebarSection>
637
+ // <SidebarSection>
638
+ // <NavGroup>
639
+ // <NavItem
640
+ // icon={<FiHome size="1.2em" color="whiteAlpha.800" />}
641
+ // color="white"
642
+ // size="sm"
643
+ // isActive
644
+ // >
645
+ // Home
646
+ // </NavItem>
647
+ // <NavItem
648
+ // icon={<FiUsers size="1.2em" color="whiteAlpha.800" />}
649
+ // color="white"
650
+ // size="sm"
651
+ // >
652
+ // Users
653
+ // </NavItem>
654
+ // <NavItem
655
+ // icon={<FiSettings size="1.2em" color="whiteAlpha.800" />}
656
+ // color="white"
657
+ // size="sm"
658
+ // >
659
+ // Settings
660
+ // </NavItem>
661
+ // </NavGroup>
662
+ // </SidebarSection>
663
+ // </>
664
+ // ),
665
+ // }
666
+
667
+ // export const VariantCompactNavGroup = Template.bind({})
668
+ // VariantCompactNavGroup.args = {
669
+ // variant: 'compact',
670
+ // colorScheme: 'purple',
671
+ // children: (
672
+ // <>
673
+ // <SidebarSection alignItems="center">
674
+ // <Logo width="24px" color="white" />
675
+ // </SidebarSection>
676
+ // <SidebarSection>
677
+ // <NavGroup title="Users">
678
+ // <NavItem
679
+ // icon={<FiHome size="1.2em" color="whiteAlpha.800" />}
680
+ // color="white"
681
+ // size="sm"
682
+ // isActive
683
+ // >
684
+ // Home
685
+ // </NavItem>
686
+ // <NavItem
687
+ // icon={<FiUsers size="1.2em" color="whiteAlpha.800" />}
688
+ // color="white"
689
+ // size="sm"
690
+ // >
691
+ // Users
692
+ // </NavItem>
693
+ // <NavItem
694
+ // icon={<FiSettings size="1.2em" color="whiteAlpha.800" />}
695
+ // color="white"
696
+ // size="sm"
697
+ // >
698
+ // Settings
699
+ // </NavItem>
700
+ // </NavGroup>
701
+ // </SidebarSection>
702
+ // </>
703
+ // ),
704
+ // }
705
+
706
+ // export const DoubleSidebar = () => {
707
+ // const disclosure = useDisclosure({
708
+ // defaultIsOpen: true,
709
+ // })
710
+
711
+ // return (
712
+ // <AppShell
713
+ // sidebar={
714
+ // <Flex alignItems="stretch" overflow="hidden" height="full">
715
+ // <DarkMode>
716
+ // <Sidebar
717
+ // variant="compact"
718
+ // colorScheme="purple"
719
+ // border="0"
720
+ // zIndex="3"
721
+ // position="relative"
722
+ // >
723
+ // <SidebarSection alignItems="center">
724
+ // <Logo width="24px" color="white" mb="1" />
725
+ // </SidebarSection>
726
+
727
+ // <SidebarSection flex="1">
728
+ // <NavGroup>
729
+ // <NavItem
730
+ // icon={<FiUsers size="1.2em" />}
731
+ // isActive
732
+ // onClick={(e) => {
733
+ // e.preventDefault()
734
+ // disclosure.onToggle()
735
+ // }}
736
+ // >
737
+ // Users
738
+ // </NavItem>
739
+ // <NavItem
740
+ // icon={<FiSettings size="1.2em" />}
741
+ // onClick={(e) => {
742
+ // e.preventDefault()
743
+ // disclosure.onClose()
744
+ // }}
745
+ // >
746
+ // Settings
747
+ // </NavItem>
748
+ // </NavGroup>
749
+
750
+ // <Spacer />
751
+
752
+ // <Menu>
753
+ // <MenuButton as={Button} variant="ghost" px="0">
754
+ // <PersonaAvatar presence="online" size="xs" />
755
+ // </MenuButton>
756
+ // <MenuList>
757
+ // <MenuItem>Sign out</MenuItem>
758
+ // </MenuList>
759
+ // </Menu>
760
+ // </SidebarSection>
761
+ // </Sidebar>
762
+ // </DarkMode>
763
+ // <Flex position="relative">
764
+ // <Sidebar
765
+ // isOpen={disclosure.isOpen}
766
+ // onClose={disclosure.onClose}
767
+ // onOpen={disclosure.onOpen}
768
+ // toggleBreakpoint={false}
769
+ // zIndex={2}
770
+ // height="100%"
771
+ // >
772
+ // <SidebarSection px="5" direction="row">
773
+ // <Heading size="sm" py="2">
774
+ // Users
775
+ // </Heading>
776
+ // <Spacer />
777
+ // </SidebarSection>
778
+
779
+ // <SidebarSection flex="1" overflowY="auto">
780
+ // <NavGroup>
781
+ // <NavItem icon={<FiHome />} isActive>
782
+ // All users
783
+ // </NavItem>
784
+ // <NavItem icon={<FiStar />}>Favourite users</NavItem>
785
+ // </NavGroup>
786
+ // <NavGroup title="Tags" isCollapsible>
787
+ // <NavItem icon={<FiHash />}>Design system</NavItem>
788
+ // <NavItem icon={<FiHash />}>Framework</NavItem>
789
+ // <NavItem inset={5} icon={<FiHash />}>
790
+ // Chakra UI
791
+ // </NavItem>
792
+ // <NavItem inset={5} icon={<FiHash />}>
793
+ // React
794
+ // </NavItem>
795
+ // </NavGroup>
796
+ // </SidebarSection>
797
+ // <SidebarOverlay zIndex="1" />
798
+ // </Sidebar>
799
+ // </Flex>
800
+ // </Flex>
801
+ // }
802
+ // >
803
+ // <Box />
804
+ // </AppShell>
805
+ // )
806
+ // }
807
+
808
+ // export function CustomToggle() {
809
+ // const { isOpen, onOpen, onClose, onToggle } = useDisclosure({
810
+ // defaultIsOpen: true,
811
+ // })
812
+
813
+ // return (
814
+ // <>
815
+ // <Sidebar
816
+ // isOpen={isOpen}
817
+ // onOpen={onOpen}
818
+ // onClose={onClose}
819
+ // toggleBreakpoint={false}
820
+ // spacing="2"
821
+ // height="100vh"
822
+ // >
823
+ // <SidebarSection direction="row">
824
+ // <Box h="8">
825
+ // <IconButton
826
+ // onClick={onToggle}
827
+ // position="fixed"
828
+ // left="3"
829
+ // zIndex="modal"
830
+ // aria-label={isOpen ? 'Close' : 'Open'}
831
+ // icon={isOpen ? <FiSquare /> : <FiSidebar />}
832
+ // />
833
+ // </Box>
834
+ // </SidebarSection>
835
+
836
+ // <SidebarSection flex="1" overflowY="auto">
837
+ // <NavGroup>
838
+ // <NavItem icon={<FiHome />} isActive>
839
+ // All users
840
+ // </NavItem>
841
+ // <NavItem icon={<FiStar />}>Favourite users</NavItem>
842
+ // </NavGroup>
843
+ // <NavGroup title="Tags" isCollapsible>
844
+ // <NavItem icon={<FiHash />}>Design system</NavItem>
845
+ // <NavItem icon={<FiHash />}>Framework</NavItem>
846
+ // <NavItem inset={5} icon={<FiHash />}>
847
+ // Chakra UI
848
+ // </NavItem>
849
+ // <NavItem inset={5} icon={<FiHash />}>
850
+ // React
851
+ // </NavItem>
852
+ // </NavGroup>
853
+ // </SidebarSection>
854
+ // <SidebarOverlay zIndex="1" />
855
+ // </Sidebar>
856
+ // </>
857
+ // )
858
+ // }
859
+
860
+ // export function ToggleVariant() {
861
+ // const { isOpen, onToggle } = useDisclosure({
862
+ // defaultIsOpen: true,
863
+ // })
864
+
865
+ // return (
866
+ // <AppShell
867
+ // sidebar={
868
+ // <Sidebar
869
+ // toggleBreakpoint={false}
870
+ // variant={isOpen ? 'default' : 'compact'}
871
+ // transition="width"
872
+ // transitionDuration="normal"
873
+ // width={isOpen ? '280px' : '14'}
874
+ // minWidth="auto"
875
+ // >
876
+ // <SidebarSection direction={isOpen ? 'row' : 'column'} height="32px">
877
+ // <Logo width="24px" mb="1" display={isOpen ? 'block' : 'none'} />
878
+ // <Spacer />
879
+ // <IconButton
880
+ // onClick={onToggle}
881
+ // variant="ghost"
882
+ // size="sm"
883
+ // icon={isOpen ? <FiChevronsLeft /> : <FiChevronsRight />}
884
+ // aria-label="Toggle Sidebar"
885
+ // />
886
+ // </SidebarSection>
887
+
888
+ // <SidebarSection flex="1" overflowY="auto" overflowX="hidden">
889
+ // <NavGroup>
890
+ // <NavItem icon={<FiHome size="1.1em" />} isActive>
891
+ // All users
892
+ // </NavItem>
893
+ // <NavItem icon={<FiStar size="1.1em" />}>Favourite users</NavItem>
894
+ // </NavGroup>
895
+ // </SidebarSection>
896
+ // <SidebarOverlay zIndex="1" />
897
+ // </Sidebar>
898
+ // }
899
+ // >
900
+ // <Box />
901
+ // </AppShell>
902
+ // )
903
+ // }