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

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 (343) hide show
  1. package/CHANGELOG.md +13 -148
  2. package/dist/chunk-32JGENDB.js +19 -0
  3. package/dist/chunk-FZW2DYK3.js +19 -0
  4. package/dist/chunk-KHRLZUV4.js +35 -0
  5. package/dist/chunk-KTLWEUNW.js +1 -0
  6. package/dist/chunk-PKI6YH2V.js +31 -0
  7. package/dist/chunk-RTMS5TJN.js +10 -0
  8. package/dist/chunk-VBIVLREP.js +45 -0
  9. package/dist/chunk-VDXTEASE.js +117 -0
  10. package/dist/components/app-shell/index.cjs +68 -0
  11. package/dist/components/app-shell/index.d.cts +30 -0
  12. package/dist/components/app-shell/index.d.ts +30 -0
  13. package/dist/components/app-shell/index.js +45 -0
  14. package/dist/components/breadcrumbs/index.cjs +60 -0
  15. package/dist/components/breadcrumbs/index.d.cts +18 -0
  16. package/dist/components/breadcrumbs/index.d.ts +18 -0
  17. package/dist/components/breadcrumbs/index.js +37 -0
  18. package/dist/components/button/index.cjs +65 -0
  19. package/dist/components/button/index.d.cts +12 -0
  20. package/dist/components/button/index.d.ts +12 -0
  21. package/dist/components/button/index.js +45 -0
  22. package/dist/components/checkbox/index.cjs +45 -0
  23. package/dist/components/checkbox/index.d.cts +11 -0
  24. package/dist/components/checkbox/index.d.ts +11 -0
  25. package/dist/components/checkbox/index.js +20 -0
  26. package/dist/components/close-button/index.cjs +142 -0
  27. package/dist/components/close-button/index.d.cts +8 -0
  28. package/dist/components/close-button/index.d.ts +8 -0
  29. package/dist/components/close-button/index.js +9 -0
  30. package/dist/components/command/index.cjs +56 -0
  31. package/dist/components/command/index.d.cts +6 -0
  32. package/dist/components/command/index.d.ts +6 -0
  33. package/dist/components/command/index.js +33 -0
  34. package/dist/components/dialog/index.cjs +243 -0
  35. package/dist/components/dialog/index.d.cts +27 -0
  36. package/dist/components/dialog/index.d.ts +27 -0
  37. package/dist/components/dialog/index.js +73 -0
  38. package/dist/components/drawer/index.cjs +237 -0
  39. package/dist/components/drawer/index.d.cts +28 -0
  40. package/dist/components/drawer/index.d.ts +28 -0
  41. package/dist/components/drawer/index.js +65 -0
  42. package/dist/components/icon-badge/index.cjs +70 -0
  43. package/dist/components/icon-badge/index.d.cts +16 -0
  44. package/dist/components/icon-badge/index.d.ts +16 -0
  45. package/dist/components/icon-badge/index.js +38 -0
  46. package/dist/components/icons/index.cjs +155 -0
  47. package/dist/components/icons/index.d.cts +19 -0
  48. package/dist/components/icons/index.d.ts +19 -0
  49. package/dist/components/icons/index.js +35 -0
  50. package/dist/components/input-group/index.cjs +56 -0
  51. package/dist/components/input-group/index.d.cts +13 -0
  52. package/dist/components/input-group/index.d.ts +13 -0
  53. package/dist/components/input-group/index.js +8 -0
  54. package/dist/components/link/index.cjs +71 -0
  55. package/dist/components/link/index.d.cts +13 -0
  56. package/dist/components/link/index.d.ts +13 -0
  57. package/dist/components/link/index.js +20 -0
  58. package/dist/components/loading-overlay/index.cjs +1921 -0
  59. package/dist/components/loading-overlay/index.d.cts +13 -0
  60. package/dist/components/loading-overlay/index.d.ts +13 -0
  61. package/dist/components/loading-overlay/index.js +1878 -0
  62. package/dist/components/navbar/index.cjs +65 -0
  63. package/dist/components/navbar/index.d.cts +18 -0
  64. package/dist/components/navbar/index.d.ts +18 -0
  65. package/dist/components/navbar/index.js +42 -0
  66. package/dist/components/number-input/index.cjs +82 -0
  67. package/dist/components/number-input/index.d.cts +13 -0
  68. package/dist/components/number-input/index.d.ts +13 -0
  69. package/dist/components/number-input/index.js +32 -0
  70. package/dist/components/password-input/index.cjs +284 -0
  71. package/dist/components/password-input/index.d.cts +18 -0
  72. package/dist/components/password-input/index.d.ts +18 -0
  73. package/dist/components/password-input/index.js +231 -0
  74. package/dist/components/persona/index.cjs +181 -0
  75. package/dist/components/persona/index.d.cts +93 -0
  76. package/dist/components/persona/index.d.ts +93 -0
  77. package/dist/components/persona/index.js +149 -0
  78. package/dist/components/pin-input/index.cjs +51 -0
  79. package/dist/components/pin-input/index.d.cts +12 -0
  80. package/dist/components/pin-input/index.d.ts +12 -0
  81. package/dist/components/pin-input/index.js +26 -0
  82. package/dist/components/radio/index.cjs +48 -0
  83. package/dist/components/radio/index.d.cts +12 -0
  84. package/dist/components/radio/index.d.ts +12 -0
  85. package/dist/components/radio/index.js +22 -0
  86. package/dist/components/search-input/index.cjs +244 -0
  87. package/dist/components/search-input/index.d.cts +15 -0
  88. package/dist/components/search-input/index.d.ts +15 -0
  89. package/dist/components/search-input/index.js +120 -0
  90. package/dist/components/select/index.cjs +233 -0
  91. package/dist/components/select/index.d.cts +32 -0
  92. package/dist/components/select/index.d.ts +32 -0
  93. package/dist/components/select/index.js +100 -0
  94. package/dist/components/sidebar/index.cjs +134 -0
  95. package/dist/components/sidebar/index.d.cts +85 -0
  96. package/dist/components/sidebar/index.d.ts +85 -0
  97. package/dist/components/sidebar/index.js +108 -0
  98. package/dist/components/spinner/index.cjs +44 -0
  99. package/dist/components/spinner/index.d.cts +10 -0
  100. package/dist/components/spinner/index.d.ts +10 -0
  101. package/dist/components/spinner/index.js +8 -0
  102. package/dist/components/steps/index.cjs +191 -0
  103. package/dist/components/steps/index.d.cts +31 -0
  104. package/dist/components/steps/index.d.ts +31 -0
  105. package/dist/components/steps/index.js +71 -0
  106. package/dist/components/switch/index.cjs +48 -0
  107. package/dist/components/switch/index.d.cts +18 -0
  108. package/dist/components/switch/index.d.ts +18 -0
  109. package/dist/components/switch/index.js +23 -0
  110. package/dist/index.cjs +8460 -0
  111. package/dist/index.d.cts +26 -0
  112. package/dist/index.d.ts +25 -7
  113. package/dist/index.js +8395 -36
  114. package/package.json +26 -22
  115. package/src/components/app-shell/app-shell.recipe.ts +52 -0
  116. package/src/components/app-shell/app-shell.stories.tsx +51 -0
  117. package/src/components/app-shell/app-shell.tsx +94 -0
  118. package/src/components/app-shell/index.ts +3 -0
  119. package/src/components/breadcrumbs/breadcrumb.stories.tsx +17 -0
  120. package/src/components/breadcrumbs/breadcrumb.tsx +36 -0
  121. package/src/components/breadcrumbs/index.ts +1 -0
  122. package/src/components/breadcrumbs/namespace.ts +8 -0
  123. package/src/components/button/button.recipe.ts +182 -0
  124. package/src/components/button/button.stories.tsx +99 -0
  125. package/src/components/button/button.tsx +55 -0
  126. package/src/components/button/index.ts +2 -0
  127. package/src/components/checkbox/checkbox.tsx +26 -0
  128. package/src/components/checkbox/index.ts +2 -0
  129. package/src/components/close-button/close-button.stories.tsx +12 -0
  130. package/src/components/close-button/close-button.tsx +18 -0
  131. package/src/components/close-button/index.ts +2 -0
  132. package/src/components/command/command.recipe.ts +17 -0
  133. package/src/components/command/command.stories.tsx +47 -0
  134. package/src/components/command/command.tsx +50 -0
  135. package/src/components/command/index.ts +1 -0
  136. package/src/components/dialog/dialog.tsx +67 -0
  137. package/src/components/dialog/index.ts +1 -0
  138. package/src/components/dialog/namespace.ts +18 -0
  139. package/src/components/drawer/drawer.tsx +57 -0
  140. package/src/components/drawer/index.ts +3 -0
  141. package/src/components/drawer/namespace.ts +19 -0
  142. package/src/components/grid-list/grid-list.recipe.ts +113 -0
  143. package/src/components/icon-badge/icon-badge.recipe.ts +57 -0
  144. package/src/components/icon-badge/icon-badge.stories.tsx +38 -0
  145. package/src/components/icon-badge/icon-badge.tsx +59 -0
  146. package/src/components/icon-badge/index.ts +2 -0
  147. package/src/components/icons/create-icon.tsx +41 -0
  148. package/src/components/icons/icons.tsx +119 -0
  149. package/src/components/icons/index.ts +1 -0
  150. package/src/components/input-group/index.ts +1 -0
  151. package/src/components/input-group/input-group.tsx +46 -0
  152. package/src/components/link/index.ts +2 -0
  153. package/src/components/link/link.stories.tsx +17 -0
  154. package/src/components/link/link.test.tsx +33 -0
  155. package/src/components/link/link.tsx +27 -0
  156. package/src/components/loading-overlay/index.ts +1 -0
  157. package/src/components/loading-overlay/loading-overlay.recipe.ts +61 -0
  158. package/src/components/loading-overlay/loading-overlay.stories.tsx +68 -0
  159. package/src/components/loading-overlay/loading-overlay.tsx +54 -0
  160. package/src/components/loading-overlay/namespace.ts +7 -0
  161. package/src/components/navbar/index.ts +1 -0
  162. package/src/components/navbar/namespace.ts +9 -0
  163. package/src/components/navbar/navbar.recipe.ts +109 -0
  164. package/src/components/navbar/navbar.stories.tsx +435 -0
  165. package/src/components/navbar/navbar.test.tsx +49 -0
  166. package/src/components/navbar/navbar.tsx +39 -0
  167. package/src/components/number-input/index.ts +2 -0
  168. package/src/components/number-input/number-input.tsx +41 -0
  169. package/src/components/password-input/index.ts +2 -0
  170. package/src/components/password-input/password-input.tsx +93 -0
  171. package/src/components/persona/index.ts +2 -0
  172. package/src/components/persona/namespace.ts +18 -0
  173. package/src/components/persona/persona-primitive.tsx +220 -0
  174. package/src/components/persona/persona.recipe.ts +94 -0
  175. package/src/components/persona/persona.stories.tsx +101 -0
  176. package/src/components/persona/persona.tsx +142 -0
  177. package/src/components/pin-input/index.ts +2 -0
  178. package/src/components/pin-input/pin-input.tsx +36 -0
  179. package/src/components/radio/index.ts +2 -0
  180. package/src/components/radio/radio.tsx +27 -0
  181. package/src/components/search-input/index.ts +2 -0
  182. package/src/components/search-input/search-input.stories.tsx +63 -0
  183. package/src/components/search-input/search-input.tsx +134 -0
  184. package/src/components/select/index.ts +1 -0
  185. package/src/components/select/namespace.ts +18 -0
  186. package/src/components/select/select.tsx +135 -0
  187. package/src/components/sidebar/index.ts +7 -0
  188. package/src/components/sidebar/namespace.ts +27 -0
  189. package/src/components/sidebar/sidebar-item.recipe.ts +65 -0
  190. package/src/components/sidebar/sidebar.recipe.ts +237 -0
  191. package/src/components/sidebar/sidebar.stories.tsx +903 -0
  192. package/src/components/sidebar/sidebar.tsx +208 -0
  193. package/src/components/spinner/index.ts +2 -0
  194. package/src/components/spinner/spinner.stories.tsx +19 -0
  195. package/src/components/spinner/spinner.tsx +21 -0
  196. package/src/components/steps/index.ts +1 -0
  197. package/src/components/steps/namespace.ts +16 -0
  198. package/src/components/steps/steps.tsx +82 -0
  199. package/src/components/switch/index.ts +3 -0
  200. package/src/components/switch/switch.tsx +39 -0
  201. package/src/compositions/accordion.tsx +47 -0
  202. package/src/compositions/action-bar.tsx +40 -0
  203. package/src/compositions/alert.tsx +51 -0
  204. package/src/compositions/avatar.tsx +74 -0
  205. package/src/compositions/blockquote.tsx +31 -0
  206. package/src/compositions/checkbox-card.tsx +57 -0
  207. package/src/compositions/checkbox.tsx +25 -0
  208. package/src/compositions/clipboard.tsx +107 -0
  209. package/src/compositions/color-mode.tsx +65 -0
  210. package/src/compositions/data-list.tsx +37 -0
  211. package/src/compositions/empty-state.tsx +34 -0
  212. package/src/compositions/field.tsx +33 -0
  213. package/src/compositions/file-button.tsx +166 -0
  214. package/src/compositions/hover-card.tsx +35 -0
  215. package/src/compositions/link-button.tsx +12 -0
  216. package/src/compositions/menu.tsx +108 -0
  217. package/src/compositions/native-select.tsx +57 -0
  218. package/src/compositions/pagination.tsx +207 -0
  219. package/src/compositions/popover.tsx +58 -0
  220. package/src/compositions/progress-circle.tsx +37 -0
  221. package/src/compositions/progress.tsx +40 -0
  222. package/src/compositions/prose.tsx +264 -0
  223. package/src/compositions/provider.tsx +12 -0
  224. package/src/compositions/radio-card.tsx +57 -0
  225. package/src/compositions/radio.tsx +24 -0
  226. package/src/compositions/rating.tsx +27 -0
  227. package/src/compositions/segmented-control.tsx +47 -0
  228. package/src/compositions/skeleton.tsx +44 -0
  229. package/src/compositions/slider.tsx +53 -0
  230. package/src/compositions/stat.tsx +75 -0
  231. package/src/compositions/status.tsx +29 -0
  232. package/src/compositions/stepper-input.tsx +49 -0
  233. package/src/compositions/tag.tsx +39 -0
  234. package/src/compositions/timeline.tsx +17 -0
  235. package/src/compositions/toaster.tsx +43 -0
  236. package/src/compositions/toggle-tip.tsx +62 -0
  237. package/src/compositions/tooltip.tsx +46 -0
  238. package/src/index.ts +6 -7
  239. package/src/preset.ts +9 -0
  240. package/src/provider/index.ts +4 -0
  241. package/src/provider/sui-provider.tsx +34 -0
  242. package/src/provider/use-link.test.tsx +60 -0
  243. package/src/provider/use-link.tsx +13 -0
  244. package/src/styled-system/create-recipe-context.tsx +91 -0
  245. package/src/styled-system/create-slot-recipe-context.tsx +188 -0
  246. package/src/styled-system/empty.ts +7 -0
  247. package/src/styled-system/factory.types.ts +11 -0
  248. package/src/theme/animation-styles.ts +53 -0
  249. package/src/theme/breakpoints.ts +11 -0
  250. package/src/theme/conditions.ts +26 -0
  251. package/src/theme/fluid-font-sizes.ts +65 -0
  252. package/src/theme/global-css.ts +94 -0
  253. package/src/theme/index.ts +72 -0
  254. package/src/theme/layer-styles.ts +116 -0
  255. package/src/theme/recipes/chakra/accordion.ts +145 -0
  256. package/src/theme/recipes/chakra/action-bar.ts +62 -0
  257. package/src/theme/recipes/chakra/alert.ts +157 -0
  258. package/src/theme/recipes/chakra/avatar.ts +141 -0
  259. package/src/theme/recipes/chakra/badge.ts +67 -0
  260. package/src/theme/recipes/chakra/blockquote.ts +83 -0
  261. package/src/theme/recipes/chakra/breadcrumb.ts +94 -0
  262. package/src/theme/recipes/chakra/card.ts +99 -0
  263. package/src/theme/recipes/chakra/checkbox-card.ts +212 -0
  264. package/src/theme/recipes/chakra/checkbox.ts +70 -0
  265. package/src/theme/recipes/chakra/checkmark.ts +83 -0
  266. package/src/theme/recipes/chakra/code.ts +17 -0
  267. package/src/theme/recipes/chakra/collapsible.ts +20 -0
  268. package/src/theme/recipes/chakra/container.ts +26 -0
  269. package/src/theme/recipes/chakra/data-list.ts +80 -0
  270. package/src/theme/recipes/chakra/dialog.ts +225 -0
  271. package/src/theme/recipes/chakra/drawer.ts +201 -0
  272. package/src/theme/recipes/chakra/editable.ts +88 -0
  273. package/src/theme/recipes/chakra/empty-state.ts +88 -0
  274. package/src/theme/recipes/chakra/field.ts +68 -0
  275. package/src/theme/recipes/chakra/fieldset.ts +62 -0
  276. package/src/theme/recipes/chakra/file-upload.ts +96 -0
  277. package/src/theme/recipes/chakra/heading.ts +27 -0
  278. package/src/theme/recipes/chakra/hover-card.ts +68 -0
  279. package/src/theme/recipes/chakra/icon.ts +30 -0
  280. package/src/theme/recipes/chakra/input-addon.ts +40 -0
  281. package/src/theme/recipes/chakra/input.ts +96 -0
  282. package/src/theme/recipes/chakra/kbd.ts +60 -0
  283. package/src/theme/recipes/chakra/link.ts +37 -0
  284. package/src/theme/recipes/chakra/list.ts +67 -0
  285. package/src/theme/recipes/chakra/mark.ts +27 -0
  286. package/src/theme/recipes/chakra/menu.ts +124 -0
  287. package/src/theme/recipes/chakra/native-select.ts +140 -0
  288. package/src/theme/recipes/chakra/number-input.ts +115 -0
  289. package/src/theme/recipes/chakra/pin-input.ts +27 -0
  290. package/src/theme/recipes/chakra/popover.ts +86 -0
  291. package/src/theme/recipes/chakra/progress-circle.ts +94 -0
  292. package/src/theme/recipes/chakra/progress.ts +127 -0
  293. package/src/theme/recipes/chakra/radio-card.ts +220 -0
  294. package/src/theme/recipes/chakra/radio-group.ts +72 -0
  295. package/src/theme/recipes/chakra/radiomark.ts +107 -0
  296. package/src/theme/recipes/chakra/rating-group.ts +94 -0
  297. package/src/theme/recipes/chakra/segment-group.ts +117 -0
  298. package/src/theme/recipes/chakra/select.ts +282 -0
  299. package/src/theme/recipes/chakra/separator.ts +51 -0
  300. package/src/theme/recipes/chakra/skeleton.ts +53 -0
  301. package/src/theme/recipes/chakra/skip-nav-link.ts +34 -0
  302. package/src/theme/recipes/chakra/slider.ts +178 -0
  303. package/src/theme/recipes/chakra/spinner.ts +32 -0
  304. package/src/theme/recipes/chakra/stat.ts +79 -0
  305. package/src/theme/recipes/chakra/status.ts +48 -0
  306. package/src/theme/recipes/chakra/steps.ts +218 -0
  307. package/src/theme/recipes/chakra/switch.ts +167 -0
  308. package/src/theme/recipes/chakra/table.ts +172 -0
  309. package/src/theme/recipes/chakra/tabs.ts +280 -0
  310. package/src/theme/recipes/chakra/tag.ts +131 -0
  311. package/src/theme/recipes/chakra/textarea.ts +88 -0
  312. package/src/theme/recipes/chakra/timeline.ts +138 -0
  313. package/src/theme/recipes/chakra/toast.ts +96 -0
  314. package/src/theme/recipes/chakra/tooltip.ts +40 -0
  315. package/src/theme/recipes.ts +46 -0
  316. package/src/theme/semantic-tokens/colors.ts +403 -0
  317. package/src/theme/semantic-tokens/radii.ts +7 -0
  318. package/src/theme/semantic-tokens/shadows.ts +52 -0
  319. package/src/theme/slot-recipes.ts +104 -0
  320. package/src/theme/text-styles.ts +39 -0
  321. package/src/theme/tokens/animations.ts +8 -0
  322. package/src/theme/tokens/aspect-ratios.ts +10 -0
  323. package/src/theme/tokens/blurs.ts +12 -0
  324. package/src/theme/tokens/borders.ts +9 -0
  325. package/src/theme/tokens/colors.ts +177 -0
  326. package/src/theme/tokens/cursor.ts +12 -0
  327. package/src/theme/tokens/durations.ts +11 -0
  328. package/src/theme/tokens/easings.ts +10 -0
  329. package/src/theme/tokens/font-sizes.ts +20 -0
  330. package/src/theme/tokens/font-weights.ts +13 -0
  331. package/src/theme/tokens/fonts.ts +15 -0
  332. package/src/theme/tokens/keyframes.ts +173 -0
  333. package/src/theme/tokens/letter-spacing.ts +9 -0
  334. package/src/theme/tokens/line-heights.ts +19 -0
  335. package/src/theme/tokens/radius.ts +18 -0
  336. package/src/theme/tokens/sizes.ts +71 -0
  337. package/src/theme/tokens/spacing.ts +38 -0
  338. package/src/theme/tokens/z-indices.ts +34 -0
  339. package/src/theme/utils.ts +46 -0
  340. package/dist/index.d.mts +0 -8
  341. package/dist/index.js.map +0 -1
  342. package/dist/index.mjs +0 -11
  343. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,208 @@
1
+ import React from 'react'
2
+
3
+ import type { HTMLChakraProps, SlotRecipeProps } from '@chakra-ui/react'
4
+ import { createSlotRecipeContext } from '@chakra-ui/react'
5
+ import { Sidebar, useSidebar } from '@saas-ui/core/sidebar'
6
+
7
+ const {
8
+ withContext,
9
+ useRecipeResult,
10
+ StylesProvider,
11
+ ClassNamesProvider,
12
+ useStyles: useSidebarStyles,
13
+ } = createSlotRecipeContext({
14
+ key: 'sidebar',
15
+ })
16
+
17
+ export { useSidebar, useSidebarStyles }
18
+
19
+ export interface SidebarProviderProps
20
+ extends Sidebar.ProviderProps,
21
+ Omit<SlotRecipeProps<'sidebar'>, 'mode'> {}
22
+
23
+ export const SidebarProvider = function SidebarProvider(
24
+ props: SidebarProviderProps,
25
+ ) {
26
+ return (
27
+ <Sidebar.Provider {...props}>
28
+ <RecipeProvider {...props}>{props.children}</RecipeProvider>
29
+ </Sidebar.Provider>
30
+ )
31
+ }
32
+
33
+ function RecipeProvider(
34
+ props: SlotRecipeProps<'sidebar'> & { children: React.ReactNode },
35
+ ) {
36
+ const { mode } = useSidebar()
37
+
38
+ const { styles, classNames } = useRecipeResult({
39
+ ...props,
40
+ mode,
41
+ })
42
+
43
+ return (
44
+ <StylesProvider value={styles}>
45
+ <ClassNamesProvider value={classNames}>
46
+ {props.children}
47
+ </ClassNamesProvider>
48
+ </StylesProvider>
49
+ )
50
+ }
51
+
52
+ export interface SidebarRootProps
53
+ extends Sidebar.RootProps,
54
+ HTMLChakraProps<'div'> {}
55
+
56
+ /**
57
+ * Side navigation, commonly used as the primary navigation
58
+ *
59
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
60
+ */
61
+ export const SidebarRoot = withContext<HTMLDivElement, SidebarRootProps>(
62
+ Sidebar.Root,
63
+ 'root',
64
+ )
65
+
66
+ export interface SidebarTriggerProps extends HTMLChakraProps<'button'> {}
67
+
68
+ /**
69
+ * Button that toggles the sidebar visibility.
70
+ *
71
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
72
+ */
73
+ export const SidebarTrigger = withContext<
74
+ HTMLButtonElement,
75
+ SidebarTriggerProps
76
+ >(Sidebar.Trigger, 'trigger', {
77
+ forwardAsChild: true,
78
+ })
79
+
80
+ export interface SidebarFlyoutTriggerProps extends HTMLChakraProps<'button'> {}
81
+
82
+ /**
83
+ * Opens the sidebar when hovering over the trigger.
84
+ *
85
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
86
+ */
87
+ export const SidebarFlyoutTrigger = withContext<
88
+ HTMLButtonElement,
89
+ SidebarFlyoutTriggerProps
90
+ >(Sidebar.FlyoutTrigger, 'flyoutTrigger', {
91
+ forwardAsChild: true,
92
+ })
93
+
94
+ /**
95
+ * Overlay shown when sidebar is open on mobile.
96
+ *
97
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
98
+ */
99
+ export const SidebarBackdrop = withContext<
100
+ HTMLDivElement,
101
+ HTMLChakraProps<'div'>
102
+ >(Sidebar.Backdrop, 'backdrop', {
103
+ forwardAsChild: true,
104
+ })
105
+
106
+ /**
107
+ * Sidebar header section.
108
+ *
109
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
110
+ */
111
+ export const SidebarHeader = withContext<
112
+ HTMLDivElement,
113
+ HTMLChakraProps<'div'>
114
+ >(Sidebar.Header, 'header')
115
+
116
+ /**
117
+ * Sidebar body section, used for the main content of the sidebar.
118
+ *
119
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
120
+ */
121
+ export const SidebarBody = withContext<HTMLDivElement, HTMLChakraProps<'div'>>(
122
+ Sidebar.Body,
123
+ 'body',
124
+ )
125
+
126
+ /**
127
+ * Sidebar footer section.
128
+ *
129
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
130
+ */
131
+ export const SidebarFooter = withContext<
132
+ HTMLDivElement,
133
+ HTMLChakraProps<'div'>
134
+ >(Sidebar.Footer, 'footer')
135
+
136
+ /**
137
+ * Sidebar track section.
138
+ *
139
+ * @see Docs https://saas-ui.dev/docs/components/layout/sidebar
140
+ */
141
+ export const SidebarTrack = withContext<HTMLDivElement, HTMLChakraProps<'div'>>(
142
+ Sidebar.Track,
143
+ 'track',
144
+ {
145
+ forwardAsChild: true,
146
+ },
147
+ )
148
+
149
+ export const SidebarGroup = withContext<HTMLDivElement, HTMLChakraProps<'div'>>(
150
+ Sidebar.Group,
151
+ 'group',
152
+ {
153
+ defaultProps: {
154
+ role: 'group',
155
+ },
156
+ },
157
+ )
158
+
159
+ export const SidebarGroupHeader = withContext<
160
+ HTMLDivElement,
161
+ HTMLChakraProps<'div'>
162
+ >(Sidebar.GroupHeader, 'groupHeader')
163
+
164
+ export const SidebarGroupTitle = withContext<
165
+ HTMLHeadingElement,
166
+ HTMLChakraProps<'h5'>
167
+ >(Sidebar.GroupTitle, 'groupTitle')
168
+
169
+ export const SidebarGroupEndElement = withContext<
170
+ HTMLDivElement,
171
+ HTMLChakraProps<'div'>
172
+ >(Sidebar.GroupEndElement, 'groupEndElement')
173
+
174
+ export const SidebarGroupContent = withContext<
175
+ HTMLDivElement,
176
+ HTMLChakraProps<'div'>
177
+ >(Sidebar.GroupContent, 'groupContent')
178
+
179
+ const {
180
+ withProvider: withItemProvider,
181
+ withContext: withItemContext,
182
+ useStyles: useSidebarItemStyles,
183
+ } = createSlotRecipeContext({
184
+ key: 'sidebarNavItem',
185
+ })
186
+
187
+ export { useSidebarItemStyles }
188
+
189
+ export const SidebarNavItem = withItemProvider<
190
+ HTMLDivElement,
191
+ HTMLChakraProps<'div'>
192
+ >(Sidebar.NavItem, 'item')
193
+
194
+ export interface SidebarNavButtonProps extends Sidebar.NavButtonProps {
195
+ active?: boolean
196
+ }
197
+
198
+ export const SidebarNavButton = withItemContext<
199
+ HTMLButtonElement,
200
+ SidebarNavButtonProps
201
+ >(Sidebar.NavButton, 'button', {
202
+ forwardAsChild: true,
203
+ })
204
+
205
+ export const SidebarNavItemEndElement = withItemContext<
206
+ HTMLDivElement,
207
+ HTMLChakraProps<'div'>
208
+ >(Sidebar.NavItemEndElement, 'endElement')
@@ -0,0 +1,2 @@
1
+ export { Spinner } from './spinner.tsx'
2
+ export type { SpinnerProps } from './spinner.tsx'
@@ -0,0 +1,19 @@
1
+ import React from 'react'
2
+
3
+ import { Spinner } from './spinner.tsx'
4
+
5
+ export default {
6
+ title: 'Components/Spinner',
7
+ component: Spinner,
8
+ }
9
+
10
+ export const Default = {
11
+ args: {},
12
+ }
13
+
14
+ export const RenderingChildren = {
15
+ args: {
16
+ loading: false,
17
+ children: 'Hello world',
18
+ },
19
+ }
@@ -0,0 +1,21 @@
1
+ import { forwardRef } from 'react'
2
+
3
+ import type { SpinnerProps as ChakraSpinnerProps } from '@chakra-ui/react'
4
+ import { Spinner as ChakraSpinner } from '@chakra-ui/react'
5
+
6
+ export interface SpinnerProps extends ChakraSpinnerProps {
7
+ loading?: boolean
8
+ children?: React.ReactNode
9
+ }
10
+
11
+ export const Spinner = forwardRef<HTMLDivElement, SpinnerProps>(
12
+ function Spinner(props, ref) {
13
+ const { loading, children, ...rest } = props
14
+
15
+ if (loading === false) {
16
+ return <>{children}</>
17
+ }
18
+
19
+ return <ChakraSpinner ref={ref} {...rest} />
20
+ },
21
+ )
@@ -0,0 +1 @@
1
+ export * as Steps from './namespace.ts'
@@ -0,0 +1,16 @@
1
+ export {
2
+ StepsRoot as Root,
3
+ StepsItem as Item,
4
+ StepsIndicator as Indicator,
5
+ StepsCompletedContent as CompletedContent,
6
+ StepsContent as Content,
7
+ StepsList as List,
8
+ StepsNextTrigger as NextTrigger,
9
+ StepsPrevTrigger as PrevTrigger,
10
+ } from './steps.tsx'
11
+
12
+ export type {
13
+ StepsRootProps as RootProps,
14
+ StepsItemProps as ItemProps,
15
+ StepsIndicatorProps as IndicatorProps,
16
+ } from './steps.tsx'
@@ -0,0 +1,82 @@
1
+ import { Box, Steps as ChakraSteps } from '@chakra-ui/react'
2
+
3
+ import { CheckIcon } from '../icons'
4
+
5
+ interface StepInfoProps {
6
+ title?: React.ReactNode
7
+ description?: React.ReactNode
8
+ }
9
+
10
+ export interface StepsItemProps
11
+ extends Omit<ChakraSteps.ItemProps, 'title'>,
12
+ StepInfoProps {
13
+ completedIcon?: React.ReactNode
14
+ icon?: React.ReactNode
15
+ }
16
+
17
+ export const StepsItem = (props: StepsItemProps) => {
18
+ const { title, description, completedIcon, icon, ...rest } = props
19
+ return (
20
+ <ChakraSteps.Item {...rest}>
21
+ <ChakraSteps.Trigger>
22
+ <ChakraSteps.Indicator>
23
+ <ChakraSteps.Status
24
+ complete={completedIcon || <CheckIcon />}
25
+ incomplete={icon || <ChakraSteps.Number />}
26
+ />
27
+ </ChakraSteps.Indicator>
28
+ <StepInfo title={title} description={description} />
29
+ </ChakraSteps.Trigger>
30
+ <ChakraSteps.Separator />
31
+ </ChakraSteps.Item>
32
+ )
33
+ }
34
+
35
+ const StepInfo = (props: StepInfoProps) => {
36
+ const { title, description } = props
37
+ if (title && description) {
38
+ return (
39
+ <Box>
40
+ <ChakraSteps.Title>{title}</ChakraSteps.Title>
41
+ <ChakraSteps.Description>{description}</ChakraSteps.Description>
42
+ </Box>
43
+ )
44
+ }
45
+ return (
46
+ <>
47
+ {title && <ChakraSteps.Title>{title}</ChakraSteps.Title>}
48
+ {description && (
49
+ <ChakraSteps.Description>{description}</ChakraSteps.Description>
50
+ )}
51
+ </>
52
+ )
53
+ }
54
+
55
+ export interface StepsIndicatorProps {
56
+ completedIcon: React.ReactNode
57
+ icon?: React.ReactNode
58
+ }
59
+
60
+ export const StepsIndicator = (props: StepsIndicatorProps) => {
61
+ const { icon = <ChakraSteps.Number />, completedIcon } = props
62
+ return (
63
+ <ChakraSteps.Indicator>
64
+ <ChakraSteps.Status complete={completedIcon} incomplete={icon} />
65
+ </ChakraSteps.Indicator>
66
+ )
67
+ }
68
+
69
+ export const StepsList = ChakraSteps.List
70
+
71
+ export type StepsRootProps = ChakraSteps.RootProps
72
+ export const StepsRoot = ChakraSteps.Root
73
+ export const StepsContent = ChakraSteps.Content
74
+ export const StepsCompletedContent = ChakraSteps.CompletedContent
75
+
76
+ export const StepsNextTrigger = (props: ChakraSteps.NextTriggerProps) => {
77
+ return <ChakraSteps.NextTrigger {...props} />
78
+ }
79
+
80
+ export const StepsPrevTrigger = (props: ChakraSteps.PrevTriggerProps) => {
81
+ return <ChakraSteps.PrevTrigger {...props} />
82
+ }
@@ -0,0 +1,3 @@
1
+ export { Switch } from './switch.tsx'
2
+
3
+ export type { SwitchProps } from './switch.tsx'
@@ -0,0 +1,39 @@
1
+ import { Switch as ChakraSwitch } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface SwitchProps extends ChakraSwitch.RootProps {
5
+ inputProps?: React.InputHTMLAttributes<HTMLInputElement>
6
+ rootRef?: React.Ref<HTMLLabelElement>
7
+ trackLabel?: { on: React.ReactNode; off: React.ReactNode }
8
+ thumbLabel?: { on: React.ReactNode; off: React.ReactNode }
9
+ }
10
+
11
+ export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
12
+ function Switch(props, ref) {
13
+ const { inputProps, children, rootRef, trackLabel, thumbLabel, ...rest } =
14
+ props
15
+
16
+ return (
17
+ <ChakraSwitch.Root ref={rootRef} {...rest}>
18
+ <ChakraSwitch.HiddenInput ref={ref} {...inputProps} />
19
+ <ChakraSwitch.Control>
20
+ <ChakraSwitch.Thumb>
21
+ {thumbLabel && (
22
+ <ChakraSwitch.ThumbIndicator fallback={thumbLabel?.off}>
23
+ {thumbLabel?.on}
24
+ </ChakraSwitch.ThumbIndicator>
25
+ )}
26
+ </ChakraSwitch.Thumb>
27
+ {trackLabel && (
28
+ <ChakraSwitch.Indicator fallback={trackLabel.off}>
29
+ {trackLabel.on}
30
+ </ChakraSwitch.Indicator>
31
+ )}
32
+ </ChakraSwitch.Control>
33
+ {children != null && (
34
+ <ChakraSwitch.Label>{children}</ChakraSwitch.Label>
35
+ )}
36
+ </ChakraSwitch.Root>
37
+ )
38
+ },
39
+ )
@@ -0,0 +1,47 @@
1
+ import { Accordion, HStack } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+ import { LuChevronDown } from "react-icons/lu"
4
+
5
+ interface AccordionItemTriggerProps extends Accordion.ItemTriggerProps {
6
+ indicatorPlacement?: "start" | "end"
7
+ }
8
+
9
+ export const AccordionItemTrigger = forwardRef<
10
+ HTMLButtonElement,
11
+ AccordionItemTriggerProps
12
+ >(function AccordionItemTrigger(props, ref) {
13
+ const { children, indicatorPlacement = "end", ...rest } = props
14
+ return (
15
+ <Accordion.ItemTrigger {...rest} ref={ref}>
16
+ {indicatorPlacement === "start" && (
17
+ <Accordion.ItemIndicator rotate={{ base: "-90deg", _open: "0deg" }}>
18
+ <LuChevronDown />
19
+ </Accordion.ItemIndicator>
20
+ )}
21
+ <HStack gap="4" flex="1" textAlign="start" width="full">
22
+ {children}
23
+ </HStack>
24
+ {indicatorPlacement === "end" && (
25
+ <Accordion.ItemIndicator>
26
+ <LuChevronDown />
27
+ </Accordion.ItemIndicator>
28
+ )}
29
+ </Accordion.ItemTrigger>
30
+ )
31
+ })
32
+
33
+ interface AccordionItemContentProps extends Accordion.ItemContentProps {}
34
+
35
+ export const AccordionItemContent = forwardRef<
36
+ HTMLDivElement,
37
+ AccordionItemContentProps
38
+ >(function AccordionItemContent(props, ref) {
39
+ return (
40
+ <Accordion.ItemContent>
41
+ <Accordion.ItemBody {...props} ref={ref} />
42
+ </Accordion.ItemContent>
43
+ )
44
+ })
45
+
46
+ export const AccordionRoot = Accordion.Root
47
+ export const AccordionItem = Accordion.Item
@@ -0,0 +1,40 @@
1
+ import { ActionBar, Portal } from "@chakra-ui/react"
2
+ import { CloseButton } from "compositions/ui/close-button"
3
+ import { forwardRef } from "react"
4
+
5
+ interface ActionBarContentProps extends ActionBar.ContentProps {
6
+ portalled?: boolean
7
+ portalRef?: React.RefObject<HTMLElement>
8
+ }
9
+
10
+ export const ActionBarContent = forwardRef<
11
+ HTMLDivElement,
12
+ ActionBarContentProps
13
+ >(function ActionBarContent(props, ref) {
14
+ const { children, portalled = true, portalRef, ...rest } = props
15
+
16
+ return (
17
+ <Portal disabled={!portalled} container={portalRef}>
18
+ <ActionBar.Positioner>
19
+ <ActionBar.Content ref={ref} {...rest} asChild={false}>
20
+ {children}
21
+ </ActionBar.Content>
22
+ </ActionBar.Positioner>
23
+ </Portal>
24
+ )
25
+ })
26
+
27
+ export const ActionBarCloseTrigger = forwardRef<
28
+ HTMLButtonElement,
29
+ ActionBar.CloseTriggerProps
30
+ >(function ActionBarCloseTrigger(props, ref) {
31
+ return (
32
+ <ActionBar.CloseTrigger {...props} asChild ref={ref}>
33
+ <CloseButton size="sm" />
34
+ </ActionBar.CloseTrigger>
35
+ )
36
+ })
37
+
38
+ export const ActionBarRoot = ActionBar.Root
39
+ export const ActionBarSelectionTrigger = ActionBar.SelectionTrigger
40
+ export const ActionBarSeparator = ActionBar.Separator
@@ -0,0 +1,51 @@
1
+ import { Alert as ChakraAlert } from "@chakra-ui/react"
2
+ import { CloseButton } from "compositions/ui/close-button"
3
+ import { forwardRef } from "react"
4
+
5
+ export interface AlertProps extends Omit<ChakraAlert.RootProps, "title"> {
6
+ startElement?: React.ReactNode
7
+ endElement?: React.ReactNode
8
+ title?: React.ReactNode
9
+ icon?: React.ReactElement
10
+ closable?: boolean
11
+ onClose?: () => void
12
+ }
13
+
14
+ export const Alert = forwardRef<HTMLDivElement, AlertProps>(
15
+ function Alert(props, ref) {
16
+ const {
17
+ title,
18
+ children,
19
+ icon,
20
+ closable,
21
+ onClose,
22
+ startElement,
23
+ endElement,
24
+ ...rest
25
+ } = props
26
+ return (
27
+ <ChakraAlert.Root ref={ref} {...rest}>
28
+ {startElement || <ChakraAlert.Indicator>{icon}</ChakraAlert.Indicator>}
29
+ {children ? (
30
+ <ChakraAlert.Content>
31
+ <ChakraAlert.Title>{title}</ChakraAlert.Title>
32
+ <ChakraAlert.Description>{children}</ChakraAlert.Description>
33
+ </ChakraAlert.Content>
34
+ ) : (
35
+ <ChakraAlert.Title flex="1">{title}</ChakraAlert.Title>
36
+ )}
37
+ {endElement}
38
+ {closable && (
39
+ <CloseButton
40
+ size="sm"
41
+ pos="relative"
42
+ top="-2"
43
+ insetEnd="-2"
44
+ alignSelf="flex-start"
45
+ onClick={onClose}
46
+ />
47
+ )}
48
+ </ChakraAlert.Root>
49
+ )
50
+ },
51
+ )
@@ -0,0 +1,74 @@
1
+ "use client"
2
+
3
+ import type { GroupProps, SlotRecipeProps } from "@chakra-ui/react"
4
+ import { Avatar as ChakraAvatar, Group } from "@chakra-ui/react"
5
+ import { forwardRef } from "react"
6
+
7
+ type ImageProps = React.ImgHTMLAttributes<HTMLImageElement>
8
+
9
+ export interface AvatarProps extends ChakraAvatar.RootProps {
10
+ name?: string
11
+ src?: string
12
+ srcSet?: string
13
+ loading?: ImageProps["loading"]
14
+ icon?: React.ReactElement
15
+ fallback?: React.ReactNode
16
+ }
17
+
18
+ export const Avatar = forwardRef<HTMLDivElement, AvatarProps>(
19
+ function Avatar(props, ref) {
20
+ const { name, src, srcSet, loading, icon, fallback, children, ...rest } =
21
+ props
22
+ return (
23
+ <ChakraAvatar.Root ref={ref} {...rest}>
24
+ <AvatarFallback name={name} icon={icon}>
25
+ {fallback}
26
+ </AvatarFallback>
27
+ <ChakraAvatar.Image src={src} srcSet={srcSet} loading={loading} />
28
+ {children}
29
+ </ChakraAvatar.Root>
30
+ )
31
+ },
32
+ )
33
+
34
+ interface AvatarFallbackProps extends ChakraAvatar.FallbackProps {
35
+ name?: string
36
+ icon?: React.ReactElement
37
+ }
38
+
39
+ const AvatarFallback = forwardRef<HTMLDivElement, AvatarFallbackProps>(
40
+ function AvatarFallback(props, ref) {
41
+ const { name, icon, children, ...rest } = props
42
+ return (
43
+ <ChakraAvatar.Fallback ref={ref} {...rest}>
44
+ {children}
45
+ {name != null && children == null && <>{getInitials(name)}</>}
46
+ {name == null && children == null && (
47
+ <ChakraAvatar.Icon asChild={!!icon}>{icon}</ChakraAvatar.Icon>
48
+ )}
49
+ </ChakraAvatar.Fallback>
50
+ )
51
+ },
52
+ )
53
+
54
+ function getInitials(name: string) {
55
+ const names = name.trim().split(" ")
56
+ const firstName = names[0] != null ? names[0] : ""
57
+ const lastName = names.length > 1 ? names[names.length - 1] : ""
58
+ return firstName && lastName
59
+ ? `${firstName.charAt(0)}${lastName.charAt(0)}`
60
+ : firstName.charAt(0)
61
+ }
62
+
63
+ interface AvatarGroupProps extends GroupProps, SlotRecipeProps<"avatar"> {}
64
+
65
+ export const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(
66
+ function AvatarGroup(props, ref) {
67
+ const { size, variant, borderless, ...rest } = props
68
+ return (
69
+ <ChakraAvatar.PropsProvider value={{ size, variant, borderless }}>
70
+ <Group gap="0" spaceX="-3" ref={ref} {...rest} />
71
+ </ChakraAvatar.PropsProvider>
72
+ )
73
+ },
74
+ )
@@ -0,0 +1,31 @@
1
+ import { Blockquote as ChakraBlockquote } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface BlockquoteProps extends ChakraBlockquote.RootProps {
5
+ cite?: React.ReactNode
6
+ citeUrl?: string
7
+ icon?: React.ReactNode
8
+ showDash?: boolean
9
+ }
10
+
11
+ export const Blockquote = forwardRef<HTMLDivElement, BlockquoteProps>(
12
+ function Blockquote(props, ref) {
13
+ const { children, cite, citeUrl, showDash, icon, ...rest } = props
14
+
15
+ return (
16
+ <ChakraBlockquote.Root ref={ref} {...rest}>
17
+ {icon}
18
+ <ChakraBlockquote.Content cite={citeUrl}>
19
+ {children}
20
+ </ChakraBlockquote.Content>
21
+ {cite && (
22
+ <ChakraBlockquote.Caption>
23
+ {showDash ? <>&mdash;</> : null} <cite>{cite}</cite>
24
+ </ChakraBlockquote.Caption>
25
+ )}
26
+ </ChakraBlockquote.Root>
27
+ )
28
+ },
29
+ )
30
+
31
+ export const BlockquoteIcon = ChakraBlockquote.Icon