@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,26 @@
1
+ import { forwardRef } from 'react'
2
+
3
+ import { Checkbox as ChakraCheckbox } from '@chakra-ui/react'
4
+
5
+ export interface CheckboxProps extends ChakraCheckbox.RootProps {
6
+ icon?: React.ReactNode
7
+ inputProps?: React.InputHTMLAttributes<HTMLInputElement>
8
+ rootRef?: React.Ref<HTMLLabelElement>
9
+ }
10
+
11
+ export const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
12
+ function Checkbox(props, ref) {
13
+ const { icon, children, inputProps, rootRef, ...rest } = props
14
+ return (
15
+ <ChakraCheckbox.Root ref={rootRef} {...rest}>
16
+ <ChakraCheckbox.HiddenInput ref={ref} {...inputProps} />
17
+ <ChakraCheckbox.Control>
18
+ {icon || <ChakraCheckbox.Indicator />}
19
+ </ChakraCheckbox.Control>
20
+ {children != null && (
21
+ <ChakraCheckbox.Label>{children}</ChakraCheckbox.Label>
22
+ )}
23
+ </ChakraCheckbox.Root>
24
+ )
25
+ },
26
+ )
@@ -0,0 +1,2 @@
1
+ export { Checkbox } from './checkbox.tsx'
2
+ export type { CheckboxProps } from './checkbox.tsx'
@@ -0,0 +1,12 @@
1
+ import React from 'react'
2
+
3
+ import { CloseButton } from './close-button.tsx'
4
+
5
+ export default {
6
+ title: 'Components/CloseButton',
7
+ component: CloseButton,
8
+ }
9
+
10
+ export const Default = {
11
+ args: {},
12
+ }
@@ -0,0 +1,18 @@
1
+ import { forwardRef } from 'react'
2
+
3
+ import type { ButtonProps } from '@chakra-ui/react'
4
+ import { IconButton as ChakraIconButton } from '@chakra-ui/react'
5
+
6
+ import { CloseIcon } from '../icons/icons.tsx'
7
+
8
+ export interface CloseButtonProps extends ButtonProps {}
9
+
10
+ export const CloseButton = forwardRef<HTMLButtonElement, CloseButtonProps>(
11
+ function CloseButton(props, ref) {
12
+ return (
13
+ <ChakraIconButton variant="ghost" aria-label="Close" ref={ref} {...props}>
14
+ {props.children ?? <CloseIcon />}
15
+ </ChakraIconButton>
16
+ )
17
+ },
18
+ )
@@ -0,0 +1,2 @@
1
+ export { CloseButton } from './close-button.tsx'
2
+ export type { CloseButtonProps } from './close-button.tsx'
@@ -0,0 +1,17 @@
1
+ import { defineRecipe } from '@chakra-ui/react'
2
+
3
+ export const commandRecipe = defineRecipe({
4
+ className: 'sui-command',
5
+ base: {
6
+ display: 'inline-flex',
7
+ gap: 1,
8
+ '[role=tooltip] > &': {
9
+ ms: 1,
10
+ _before: {
11
+ content: '"•"',
12
+ me: 1,
13
+ fontSize: 'xs',
14
+ },
15
+ },
16
+ },
17
+ })
@@ -0,0 +1,47 @@
1
+ import React from 'react'
2
+
3
+ import { Button, Center, Tooltip, VStack } from '@chakra-ui/react'
4
+
5
+ import { Command } from './command'
6
+
7
+ export default {
8
+ title: 'Components/Command',
9
+ decorators: [
10
+ (Story: any) => (
11
+ <Center height="100%">
12
+ <Story />
13
+ </Center>
14
+ ),
15
+ ],
16
+ }
17
+
18
+ export const Basic = {
19
+ render: () => (
20
+ <VStack>
21
+ <Command>shift+X</Command>
22
+ <Command>A then B</Command>
23
+ <Command>alt or option</Command>
24
+ </VStack>
25
+ ),
26
+ }
27
+
28
+ export const TooltipCommand = {
29
+ render: () => (
30
+ <Tooltip.Root>
31
+ <Tooltip.Trigger>
32
+ <Button>Inbox</Button>
33
+ </Tooltip.Trigger>
34
+ <Tooltip.Positioner>
35
+ <Tooltip.Content>
36
+ <Tooltip.Arrow>
37
+ <Tooltip.ArrowTip />
38
+ </Tooltip.Arrow>
39
+
40
+ <>
41
+ Inbox <Command>G then I</Command>
42
+ </>
43
+ </Tooltip.Content>
44
+ </Tooltip.Positioner>
45
+ </Tooltip.Root>
46
+ ),
47
+ }
@@ -0,0 +1,50 @@
1
+ import * as React from 'react'
2
+
3
+ import { Kbd } from '@chakra-ui/react'
4
+ import {
5
+ type HTMLChakraProps,
6
+ type RecipeProps,
7
+ UnstyledProp,
8
+ createRecipeContext,
9
+ } from '@chakra-ui/react'
10
+
11
+ const { withContext } = createRecipeContext({
12
+ key: 'command',
13
+ })
14
+
15
+ export interface CommandBaseProps extends RecipeProps<'span'>, UnstyledProp {}
16
+
17
+ export interface CommandProps
18
+ extends HTMLChakraProps<'span', CommandBaseProps> {}
19
+
20
+ const Key: React.FC<HTMLChakraProps<'span'>> = ({ children }) => {
21
+ if (typeof children !== 'string') {
22
+ return <>{children}</>
23
+ }
24
+
25
+ if (['then', 'or', '+'].includes(children)) {
26
+ return <span>{children}</span>
27
+ }
28
+
29
+ return <Kbd>{children}</Kbd>
30
+ }
31
+
32
+ export const Command: React.FC<HTMLChakraProps<'span'>> = (props) => {
33
+ const { children, ...rest } = props
34
+
35
+ if (typeof children !== 'string') {
36
+ return <>{children}</>
37
+ }
38
+
39
+ const keys = children.split(/\s|\+/)
40
+
41
+ return (
42
+ <CommandRoot {...rest}>
43
+ {keys.map((key) => (
44
+ <Key key={key}>{key}</Key>
45
+ ))}
46
+ </CommandRoot>
47
+ )
48
+ }
49
+
50
+ const CommandRoot = withContext('span')
@@ -0,0 +1 @@
1
+ export { Command } from './command'
@@ -0,0 +1,67 @@
1
+ import { forwardRef } from 'react'
2
+
3
+ import { Dialog as ChakraDialog, Portal } from '@chakra-ui/react'
4
+
5
+ import { CloseButton } from '#components/close-button'
6
+
7
+ export { DialogContext } from '@ark-ui/react/dialog'
8
+
9
+ export interface DialogContentProps extends ChakraDialog.ContentProps {
10
+ portalled?: boolean
11
+ portalRef?: React.RefObject<HTMLElement>
12
+ backdrop?: boolean
13
+ }
14
+
15
+ export const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(
16
+ function DialogContent(props, ref) {
17
+ const {
18
+ children,
19
+ portalled = true,
20
+ portalRef,
21
+ backdrop = true,
22
+ ...rest
23
+ } = props
24
+
25
+ return (
26
+ <Portal disabled={!portalled} container={portalRef}>
27
+ {backdrop && <ChakraDialog.Backdrop />}
28
+ <ChakraDialog.Positioner>
29
+ <ChakraDialog.Content ref={ref} {...rest} asChild={false}>
30
+ {children}
31
+ </ChakraDialog.Content>
32
+ </ChakraDialog.Positioner>
33
+ </Portal>
34
+ )
35
+ },
36
+ )
37
+
38
+ export const DialogCloseTrigger = forwardRef<
39
+ HTMLButtonElement,
40
+ ChakraDialog.CloseTriggerProps
41
+ >(function DialogCloseTrigger(props, ref) {
42
+ return (
43
+ <ChakraDialog.CloseTrigger
44
+ position="absolute"
45
+ top="2"
46
+ insetEnd="2"
47
+ {...props}
48
+ asChild
49
+ >
50
+ <CloseButton size="sm" ref={ref}>
51
+ {props.children}
52
+ </CloseButton>
53
+ </ChakraDialog.CloseTrigger>
54
+ )
55
+ })
56
+
57
+ export type DialogRootProps = ChakraDialog.RootProps
58
+
59
+ export const DialogRoot = ChakraDialog.Root
60
+ export const DialogFooter = ChakraDialog.Footer
61
+ export const DialogHeader = ChakraDialog.Header
62
+ export const DialogBody = ChakraDialog.Body
63
+ export const DialogBackdrop = ChakraDialog.Backdrop
64
+ export const DialogTitle = ChakraDialog.Title
65
+ export const DialogDescription = ChakraDialog.Description
66
+ export const DialogTrigger = ChakraDialog.Trigger
67
+ export const DialogActionTrigger = ChakraDialog.ActionTrigger
@@ -0,0 +1 @@
1
+ export * as Dialog from './namespace.ts'
@@ -0,0 +1,18 @@
1
+ export {
2
+ DialogRoot as Root,
3
+ DialogContent as Content,
4
+ DialogCloseTrigger as CloseTrigger,
5
+ DialogHeader as Header,
6
+ DialogBody as Body,
7
+ DialogFooter as Footer,
8
+ DialogActionTrigger as ActionTrigger,
9
+ DialogBackdrop as Backdrop,
10
+ DialogDescription as Description,
11
+ DialogTitle as Title,
12
+ DialogTrigger as Trigger,
13
+ DialogContext as Context,
14
+ } from './dialog.tsx'
15
+ export type {
16
+ DialogContentProps as ContentProps,
17
+ DialogRootProps as RootProps,
18
+ } from './dialog.tsx'
@@ -0,0 +1,57 @@
1
+ import { forwardRef } from 'react'
2
+
3
+ import { DialogContext } from '@ark-ui/react/dialog'
4
+ import { Drawer as ChakraDrawer, Portal } from '@chakra-ui/react'
5
+
6
+ import { CloseButton } from '#components/close-button'
7
+
8
+ export interface DrawerContentProps extends ChakraDrawer.ContentProps {
9
+ portalled?: boolean
10
+ portalRef?: React.RefObject<HTMLElement>
11
+ offset?: ChakraDrawer.ContentProps['padding']
12
+ }
13
+
14
+ export const DrawerContent = forwardRef<HTMLDivElement, DrawerContentProps>(
15
+ function DrawerContent(props, ref) {
16
+ const { children, portalled = true, portalRef, offset, ...rest } = props
17
+ return (
18
+ <Portal disabled={!portalled} container={portalRef}>
19
+ <ChakraDrawer.Positioner padding={offset}>
20
+ <ChakraDrawer.Content ref={ref} {...rest} asChild={false}>
21
+ {children}
22
+ </ChakraDrawer.Content>
23
+ </ChakraDrawer.Positioner>
24
+ </Portal>
25
+ )
26
+ },
27
+ )
28
+
29
+ export const DrawerCloseTrigger = forwardRef<
30
+ HTMLButtonElement,
31
+ ChakraDrawer.CloseTriggerProps
32
+ >(function DrawerCloseTrigger(props, ref) {
33
+ return (
34
+ <ChakraDrawer.CloseTrigger
35
+ position="absolute"
36
+ top="2"
37
+ insetEnd="2"
38
+ {...props}
39
+ asChild
40
+ >
41
+ <CloseButton size="sm" ref={ref} />
42
+ </ChakraDrawer.CloseTrigger>
43
+ )
44
+ })
45
+
46
+ export const DrawerTrigger = ChakraDrawer.Trigger
47
+ export const DrawerRoot = ChakraDrawer.Root
48
+ export const DrawerFooter = ChakraDrawer.Footer
49
+ export const DrawerHeader = ChakraDrawer.Header
50
+ export const DrawerBody = ChakraDrawer.Body
51
+ export const DrawerBackdrop = ChakraDrawer.Backdrop
52
+ export const DrawerDescription = ChakraDrawer.Description
53
+ export const DrawerTitle = ChakraDrawer.Title
54
+ export const DrawerActionTrigger = ChakraDrawer.ActionTrigger
55
+ export const DrawerContext = DialogContext
56
+
57
+ export type DrawerRootProps = ChakraDrawer.RootProps
@@ -0,0 +1,3 @@
1
+ import * as Drawer from './namespace.ts'
2
+
3
+ export { Drawer }
@@ -0,0 +1,19 @@
1
+ export {
2
+ DrawerRoot as Root,
3
+ DrawerContent as Content,
4
+ DrawerCloseTrigger as CloseTrigger,
5
+ DrawerHeader as Header,
6
+ DrawerBody as Body,
7
+ DrawerFooter as Footer,
8
+ DrawerActionTrigger as ActionTrigger,
9
+ DrawerBackdrop as Backdrop,
10
+ DrawerDescription as Description,
11
+ DrawerTitle as Title,
12
+ DrawerTrigger as Trigger,
13
+ DrawerContext as Context,
14
+ } from './drawer.tsx'
15
+
16
+ export type {
17
+ DrawerContentProps as ContentProps,
18
+ DrawerRootProps as RootProps,
19
+ } from './drawer.tsx'
@@ -0,0 +1,113 @@
1
+ import { defineSlotRecipe } from '@chakra-ui/react'
2
+
3
+ export const gridListSlotRecipe = defineSlotRecipe({
4
+ className: 'sui-grid-list',
5
+ slots: ['root', 'item', 'header', 'icon'],
6
+ base: {
7
+ root: {
8
+ py: 2,
9
+ position: 'relative',
10
+ },
11
+ item: {
12
+ display: 'flex',
13
+ flexDirection: 'row',
14
+ alignItems: 'center',
15
+ justifyContent: 'space-between',
16
+ flex: 1,
17
+ cursor: 'pointer',
18
+ userSelect: 'none',
19
+ transitionProperty: 'common',
20
+ transitionDuration: 'normal',
21
+ borderRadius: 'inherit',
22
+ outline: 'none',
23
+ _hover: {
24
+ bg: 'blackAlpha.50',
25
+ _dark: {
26
+ bg: 'whiteAlpha.50',
27
+ },
28
+ },
29
+ _focusVisible: {
30
+ boxShadow: 'outline',
31
+ },
32
+ _focus: {
33
+ bg: 'blackAlpha.50',
34
+ _dark: {
35
+ bg: 'whiteAlpha.50',
36
+ },
37
+ },
38
+ _active: {
39
+ bg: 'blackAlpha.100',
40
+ _dark: {
41
+ bg: 'whiteAlpha.100',
42
+ },
43
+ },
44
+ _disabled: {
45
+ cursor: 'inherit',
46
+ opacity: 0.5,
47
+ _hover: {
48
+ bg: 'transparent',
49
+ _dark: {
50
+ bg: 'transparent',
51
+ },
52
+ },
53
+ _active: {
54
+ bg: 'transparent',
55
+ _dark: {
56
+ bg: 'transparent',
57
+ },
58
+ },
59
+ },
60
+ },
61
+ header: {
62
+ display: 'flex',
63
+ flexDirection: 'row',
64
+ position: 'sticky',
65
+ fontSize: 'md',
66
+ fontWeight: 'semibold',
67
+ color: 'muted',
68
+ },
69
+ icon: {
70
+ display: 'flex',
71
+ flexShrink: 0,
72
+ },
73
+ },
74
+ variants: {
75
+ size: {
76
+ sm: {
77
+ root: {
78
+ fontSize: 'sm',
79
+ },
80
+ item: {
81
+ py: 1,
82
+ px: 1,
83
+ },
84
+ header: {
85
+ py: 1,
86
+ px: 1,
87
+ },
88
+ cell: {
89
+ px: 1,
90
+ },
91
+ },
92
+ md: {
93
+ root: {
94
+ fontSize: 'md',
95
+ },
96
+ item: {
97
+ py: 2,
98
+ px: 2,
99
+ },
100
+ header: {
101
+ py: 2,
102
+ px: 2,
103
+ },
104
+ cell: {
105
+ px: 2,
106
+ },
107
+ },
108
+ },
109
+ },
110
+ defaultVariants: {
111
+ size: 'md',
112
+ },
113
+ })
@@ -0,0 +1,57 @@
1
+ import { defineRecipe } from '@chakra-ui/react'
2
+
3
+ export const iconBadgeRecipe = defineRecipe({
4
+ className: 'sui-icon-badge',
5
+ base: {
6
+ display: 'inline-flex',
7
+ alignItems: 'center',
8
+ justifyContent: 'center',
9
+ },
10
+ variants: {
11
+ variant: {
12
+ outline: {
13
+ borderWidth: '1px',
14
+ borderColor: 'colorPalette.subtle',
15
+ color: 'colorPalette.fg',
16
+ },
17
+ solid: {
18
+ bg: 'colorPalette.solid',
19
+ color: 'white',
20
+ },
21
+ subtle: {
22
+ bg: 'colorPalette.subtle',
23
+ color: 'colorPalette.fg',
24
+ },
25
+ },
26
+ size: {
27
+ sm: {
28
+ borderRadius: 'sm',
29
+ fontSize: '0.9em',
30
+ w: 6,
31
+ h: 6,
32
+ },
33
+ md: {
34
+ borderRadius: 'md',
35
+ fontSize: '1.1em',
36
+ w: 8,
37
+ h: 8,
38
+ },
39
+ lg: {
40
+ borderRadius: 'md',
41
+ fontSize: '1.3em',
42
+ w: 10,
43
+ h: 10,
44
+ },
45
+ xl: {
46
+ borderRadius: 'md',
47
+ fontSize: '1.5em',
48
+ w: 12,
49
+ h: 12,
50
+ },
51
+ },
52
+ },
53
+ defaultVariants: {
54
+ variant: 'outline',
55
+ size: 'md',
56
+ },
57
+ })
@@ -0,0 +1,38 @@
1
+ import { Meta, StoryObj } from '@storybook/react'
2
+ import { LuUser } from 'react-icons/lu'
3
+
4
+ import { IconBadge } from './index.ts'
5
+
6
+ export default {
7
+ title: 'Components/IconBadge',
8
+ component: IconBadge,
9
+ } as Meta
10
+
11
+ type Story = StoryObj<typeof IconBadge>
12
+
13
+ export const Default: Story = {
14
+ args: {
15
+ icon: <LuUser />,
16
+ },
17
+ }
18
+
19
+ export const SolidVariant: Story = {
20
+ args: {
21
+ variant: 'solid',
22
+ icon: <LuUser />,
23
+ },
24
+ }
25
+
26
+ export const SubtleVariant: Story = {
27
+ args: {
28
+ variant: 'subtle',
29
+ icon: <LuUser />,
30
+ },
31
+ }
32
+
33
+ export const Rounded: Story = {
34
+ args: {
35
+ borderRadius: 'full',
36
+ icon: <LuUser />,
37
+ },
38
+ }
@@ -0,0 +1,59 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { cloneElement, isValidElement } from 'react'
5
+
6
+ import {
7
+ type HTMLChakraProps,
8
+ RecipeProps,
9
+ chakra,
10
+ useRecipe,
11
+ } from '@chakra-ui/react'
12
+ import { cx } from '@saas-ui/core/utils'
13
+
14
+ ////////////////////////////////////////////////////////////////////////////////////
15
+
16
+ export interface IconBadgeProps
17
+ extends HTMLChakraProps<'div'>,
18
+ RecipeProps<'iconBadge'> {
19
+ /**
20
+ * The icon to display
21
+ */
22
+ icon: React.ReactNode
23
+
24
+ /**
25
+ * A11y: A label that describes the icon
26
+ */
27
+ 'aria-label'?: string
28
+ }
29
+
30
+ export const IconBadge = React.forwardRef<HTMLDivElement, IconBadgeProps>(
31
+ (props, ref) => {
32
+ const { icon, children, ...rest } = props
33
+ const recipe = useRecipe({ key: 'iconBadge', recipe: props.recipe })
34
+ const [variantProps, localProps] = recipe.splitVariantProps(rest)
35
+ const styles = recipe(variantProps)
36
+
37
+ /**
38
+ * Passing the icon as prop or children should work
39
+ */
40
+ const element = icon || children
41
+ const _children = isValidElement(element)
42
+ ? cloneElement(element as any, {
43
+ 'aria-hidden': true,
44
+ focusable: false,
45
+ })
46
+ : null
47
+
48
+ return (
49
+ <chakra.div
50
+ ref={ref}
51
+ {...localProps}
52
+ css={[styles, props.css]}
53
+ className={cx(recipe.className, props.className)}
54
+ >
55
+ {_children}
56
+ </chakra.div>
57
+ )
58
+ },
59
+ )
@@ -0,0 +1,2 @@
1
+ export { IconBadge } from './icon-badge'
2
+ export type { IconBadgeProps } from './icon-badge'
@@ -0,0 +1,41 @@
1
+ import type { IconProps } from '@chakra-ui/react'
2
+ import { createIcon as _createIcon } from '@chakra-ui/react'
3
+
4
+ interface CreateIconOptions {
5
+ /**
6
+ * The icon `svg` viewBox
7
+ * @default "0 0 24 24"
8
+ */
9
+ viewBox?: string
10
+ /**
11
+ * The `svg` path or group element
12
+ * @type React.ReactElement | React.ReactElement[]
13
+ */
14
+ path?: React.ReactElement | React.ReactElement[]
15
+ /**
16
+ * If the `svg` has a single path, simply copy the path's `d` attribute
17
+ */
18
+ d?: string
19
+ /**
20
+ * The display name useful in the dev tools
21
+ */
22
+ displayName?: string
23
+ /**
24
+ * Default props automatically passed to the component; overwriteable
25
+ */
26
+ defaultProps?: IconProps
27
+ }
28
+
29
+ export const createIcon = (props: CreateIconOptions) => {
30
+ return _createIcon({
31
+ viewBox: '0 0 24 24',
32
+ defaultProps: {
33
+ fill: 'none',
34
+ stroke: 'currentColor',
35
+ strokeWidth: '2',
36
+ strokeLinecap: 'round',
37
+ strokeLinejoin: 'round',
38
+ },
39
+ ...props,
40
+ })
41
+ }