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

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 (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
+ // }