@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,57 @@
1
+ import { RadioCard } from "@chakra-ui/react"
2
+ import { Fragment, forwardRef } from "react"
3
+
4
+ interface RadioCardItemProps extends RadioCard.ItemProps {
5
+ icon?: React.ReactElement
6
+ label?: React.ReactNode
7
+ description?: React.ReactNode
8
+ addon?: React.ReactNode
9
+ indicator?: React.ReactNode | null
10
+ indicatorPlacement?: "start" | "end" | "inside"
11
+ inputProps?: React.InputHTMLAttributes<HTMLInputElement>
12
+ }
13
+
14
+ export const RadioCardItem = forwardRef<HTMLInputElement, RadioCardItemProps>(
15
+ function RadioCardItem(props, ref) {
16
+ const {
17
+ inputProps,
18
+ label,
19
+ description,
20
+ addon,
21
+ icon,
22
+ indicator = <RadioCard.ItemIndicator />,
23
+ indicatorPlacement = "end",
24
+ ...rest
25
+ } = props
26
+
27
+ const hasContent = label || description || icon
28
+ const ContentWrapper = indicator ? RadioCard.ItemContent : Fragment
29
+
30
+ return (
31
+ <RadioCard.Item {...rest}>
32
+ <RadioCard.ItemHiddenInput ref={ref} {...inputProps} />
33
+ <RadioCard.ItemControl>
34
+ {indicatorPlacement === "start" && indicator}
35
+ {hasContent && (
36
+ <ContentWrapper>
37
+ {icon}
38
+ {label && <RadioCard.ItemText>{label}</RadioCard.ItemText>}
39
+ {description && (
40
+ <RadioCard.ItemDescription>
41
+ {description}
42
+ </RadioCard.ItemDescription>
43
+ )}
44
+ {indicatorPlacement === "inside" && indicator}
45
+ </ContentWrapper>
46
+ )}
47
+ {indicatorPlacement === "end" && indicator}
48
+ </RadioCard.ItemControl>
49
+ {addon && <RadioCard.ItemAddon>{addon}</RadioCard.ItemAddon>}
50
+ </RadioCard.Item>
51
+ )
52
+ },
53
+ )
54
+
55
+ export const RadioCardRoot = RadioCard.Root
56
+ export const RadioCardLabel = RadioCard.Label
57
+ export const RadioCardItemIndicator = RadioCard.ItemIndicator
@@ -0,0 +1,24 @@
1
+ import { RadioGroup as ChakraRadioGroup } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface RadioProps extends ChakraRadioGroup.ItemProps {
5
+ rootRef?: React.Ref<HTMLDivElement>
6
+ inputProps?: React.InputHTMLAttributes<HTMLInputElement>
7
+ }
8
+
9
+ export const Radio = forwardRef<HTMLInputElement, RadioProps>(
10
+ function Radio(props, ref) {
11
+ const { children, inputProps, rootRef, ...rest } = props
12
+ return (
13
+ <ChakraRadioGroup.Item ref={rootRef} {...rest}>
14
+ <ChakraRadioGroup.ItemHiddenInput ref={ref} {...inputProps} />
15
+ <ChakraRadioGroup.ItemIndicator />
16
+ {children && (
17
+ <ChakraRadioGroup.ItemText>{children}</ChakraRadioGroup.ItemText>
18
+ )}
19
+ </ChakraRadioGroup.Item>
20
+ )
21
+ },
22
+ )
23
+
24
+ export const RadioGroup = ChakraRadioGroup.Root
@@ -0,0 +1,27 @@
1
+ import { RatingGroup } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface RatingProps extends RatingGroup.RootProps {
5
+ icon?: React.ReactElement
6
+ count?: number
7
+ label?: React.ReactNode
8
+ }
9
+
10
+ export const Rating = forwardRef<HTMLDivElement, RatingProps>(
11
+ function Rating(props, ref) {
12
+ const { icon, count = 5, label, ...rest } = props
13
+ return (
14
+ <RatingGroup.Root ref={ref} count={count} {...rest}>
15
+ {label && <RatingGroup.Label>{label}</RatingGroup.Label>}
16
+ <RatingGroup.HiddenInput />
17
+ <RatingGroup.Control>
18
+ {Array.from({ length: count }).map((_, index) => (
19
+ <RatingGroup.Item key={index} index={index + 1}>
20
+ <RatingGroup.ItemIndicator icon={icon} />
21
+ </RatingGroup.Item>
22
+ ))}
23
+ </RatingGroup.Control>
24
+ </RatingGroup.Root>
25
+ )
26
+ },
27
+ )
@@ -0,0 +1,47 @@
1
+ "use client"
2
+
3
+ import { For, SegmentGroup } from "@chakra-ui/react"
4
+ import { forwardRef, useMemo } from "react"
5
+
6
+ interface Item {
7
+ value: string
8
+ label: React.ReactNode
9
+ disabled?: boolean
10
+ }
11
+
12
+ export interface SegmentedControlProps extends SegmentGroup.RootProps {
13
+ items: Array<string | Item>
14
+ }
15
+
16
+ function normalize(items: Array<string | Item>): Item[] {
17
+ return items.map((item) => {
18
+ if (typeof item === "string") return { value: item, label: item }
19
+ return item
20
+ })
21
+ }
22
+
23
+ export const SegmentedControl = forwardRef<
24
+ HTMLDivElement,
25
+ SegmentedControlProps
26
+ >(function SegmentedControl(props, ref) {
27
+ const { items, ...rest } = props
28
+ const data = useMemo(() => normalize(items), [items])
29
+
30
+ return (
31
+ <SegmentGroup.Root ref={ref} {...rest}>
32
+ <SegmentGroup.Indicator />
33
+ <For each={data}>
34
+ {(item) => (
35
+ <SegmentGroup.Item
36
+ key={item.value}
37
+ value={item.value}
38
+ disabled={item.disabled}
39
+ >
40
+ <SegmentGroup.ItemText>{item.label}</SegmentGroup.ItemText>
41
+ <SegmentGroup.ItemHiddenInput />
42
+ </SegmentGroup.Item>
43
+ )}
44
+ </For>
45
+ </SegmentGroup.Root>
46
+ )
47
+ })
@@ -0,0 +1,44 @@
1
+ import type {
2
+ SkeletonProps as ChakraSkeletonProps,
3
+ CircleProps,
4
+ } from "@chakra-ui/react"
5
+ import { Skeleton as ChakraSkeleton, Circle, Stack } from "@chakra-ui/react"
6
+ import { forwardRef } from "react"
7
+
8
+ export interface SkeletonCircleProps extends ChakraSkeletonProps {
9
+ size?: CircleProps["size"]
10
+ }
11
+
12
+ export const SkeletonCircle = (props: SkeletonCircleProps) => {
13
+ const { size, ...rest } = props
14
+ return (
15
+ <Circle size={size} asChild>
16
+ <ChakraSkeleton {...rest} />
17
+ </Circle>
18
+ )
19
+ }
20
+
21
+ export interface SkeletonTextProps extends ChakraSkeletonProps {
22
+ noOfLines?: number
23
+ }
24
+
25
+ export const SkeletonText = forwardRef<HTMLDivElement, SkeletonTextProps>(
26
+ function SkeletonText(props, ref) {
27
+ const { noOfLines = 3, gap, ...rest } = props
28
+ return (
29
+ <Stack gap={gap} width="full" ref={ref}>
30
+ {Array.from({ length: noOfLines }).map((_, index) => (
31
+ <ChakraSkeleton
32
+ height="4"
33
+ key={index}
34
+ {...props}
35
+ _last={{ maxW: "80%" }}
36
+ {...rest}
37
+ />
38
+ ))}
39
+ </Stack>
40
+ )
41
+ },
42
+ )
43
+
44
+ export const Skeleton = ChakraSkeleton
@@ -0,0 +1,53 @@
1
+ import { Slider as ChakraSlider } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface SliderProps extends ChakraSlider.RootProps {
5
+ marks?: Array<number | { value: number; label: React.ReactNode }>
6
+ label?: React.ReactNode
7
+ }
8
+
9
+ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
10
+ function Slider(props, ref) {
11
+ const { marks: marksProp, label, ...rest } = props
12
+ const value = props.defaultValue ?? props.value
13
+
14
+ const marks = marksProp?.map((mark) => {
15
+ if (typeof mark === "number") return { value: mark, label: undefined }
16
+ return mark
17
+ })
18
+
19
+ const hasMarkLabel = !!marks?.some((mark) => mark.label)
20
+
21
+ return (
22
+ <ChakraSlider.Root ref={ref} thumbAlignment="center" {...rest}>
23
+ {label && (
24
+ <ChakraSlider.Label fontWeight="medium">{label}</ChakraSlider.Label>
25
+ )}
26
+ <ChakraSlider.Control mb={hasMarkLabel ? "4" : undefined}>
27
+ <ChakraSlider.Track>
28
+ <ChakraSlider.Range />
29
+ </ChakraSlider.Track>
30
+ {value?.map((_, index) => (
31
+ <ChakraSlider.Thumb key={index} index={index}>
32
+ <ChakraSlider.HiddenInput />
33
+ </ChakraSlider.Thumb>
34
+ ))}
35
+ </ChakraSlider.Control>
36
+ {marks?.length && (
37
+ <ChakraSlider.MarkerGroup>
38
+ {marks.map((mark, index) => {
39
+ const value = typeof mark === "number" ? mark : mark.value
40
+ const label = typeof mark === "number" ? undefined : mark.label
41
+ return (
42
+ <ChakraSlider.Marker key={index} value={value}>
43
+ <ChakraSlider.MarkerIndicator />
44
+ {label}
45
+ </ChakraSlider.Marker>
46
+ )
47
+ })}
48
+ </ChakraSlider.MarkerGroup>
49
+ )}
50
+ </ChakraSlider.Root>
51
+ )
52
+ },
53
+ )
@@ -0,0 +1,75 @@
1
+ import {
2
+ Badge,
3
+ type BadgeProps,
4
+ Stat as ChakraStat,
5
+ FormatNumber,
6
+ IconButton,
7
+ } from "@chakra-ui/react"
8
+ import { ToggleTip } from "compositions/ui/toggle-tip"
9
+ import { forwardRef } from "react"
10
+ import { HiOutlineInformationCircle } from "react-icons/hi"
11
+
12
+ interface StatLabelProps extends ChakraStat.LabelProps {
13
+ info?: React.ReactNode
14
+ }
15
+
16
+ export const StatLabel = forwardRef<HTMLDivElement, StatLabelProps>(
17
+ function StatLabel(props, ref) {
18
+ const { info, children, ...rest } = props
19
+ return (
20
+ <ChakraStat.Label {...rest} ref={ref}>
21
+ {children}
22
+ {info && (
23
+ <ToggleTip content={info}>
24
+ <IconButton variant="ghost" aria-label="info" size="2xs">
25
+ <HiOutlineInformationCircle />
26
+ </IconButton>
27
+ </ToggleTip>
28
+ )}
29
+ </ChakraStat.Label>
30
+ )
31
+ },
32
+ )
33
+
34
+ interface StatValueTextProps extends ChakraStat.ValueTextProps {
35
+ value?: number
36
+ formatOptions?: Intl.NumberFormatOptions
37
+ }
38
+
39
+ export const StatValueText = forwardRef<HTMLDivElement, StatValueTextProps>(
40
+ function StatValueText(props, ref) {
41
+ const { value, formatOptions, children, ...rest } = props
42
+ return (
43
+ <ChakraStat.ValueText {...rest} ref={ref}>
44
+ {children ||
45
+ (value != null && <FormatNumber value={value} {...formatOptions} />)}
46
+ </ChakraStat.ValueText>
47
+ )
48
+ },
49
+ )
50
+
51
+ export const StatUpTrend = forwardRef<HTMLDivElement, BadgeProps>(
52
+ function StatUpTrend(props, ref) {
53
+ return (
54
+ <Badge colorPalette="green" gap="0" {...props} ref={ref}>
55
+ <ChakraStat.UpIndicator />
56
+ {props.children}
57
+ </Badge>
58
+ )
59
+ },
60
+ )
61
+
62
+ export const StatDownTrend = forwardRef<HTMLDivElement, BadgeProps>(
63
+ function StatDownTrend(props, ref) {
64
+ return (
65
+ <Badge colorPalette="red" gap="0" {...props} ref={ref}>
66
+ <ChakraStat.DownIndicator />
67
+ {props.children}
68
+ </Badge>
69
+ )
70
+ },
71
+ )
72
+
73
+ export const StatRoot = ChakraStat.Root
74
+ export const StatHelpText = ChakraStat.HelpText
75
+ export const StatValueUnit = ChakraStat.ValueUnit
@@ -0,0 +1,29 @@
1
+ import type { ColorPalette } from "@chakra-ui/react"
2
+ import { Status as ChakraStatus } from "@chakra-ui/react"
3
+ import { forwardRef } from "react"
4
+
5
+ type StatusValue = "success" | "error" | "warning" | "info"
6
+
7
+ export interface StatusProps extends ChakraStatus.RootProps {
8
+ value?: StatusValue
9
+ }
10
+
11
+ const statusMap: Record<StatusValue, ColorPalette> = {
12
+ success: "green",
13
+ error: "red",
14
+ warning: "orange",
15
+ info: "blue",
16
+ }
17
+
18
+ export const Status = forwardRef<HTMLDivElement, StatusProps>(
19
+ function Status(props, ref) {
20
+ const { children, value = "info", ...rest } = props
21
+ const colorPalette = rest.colorPalette ?? statusMap[value]
22
+ return (
23
+ <ChakraStatus.Root ref={ref} {...rest} colorPalette={colorPalette}>
24
+ <ChakraStatus.Indicator />
25
+ {children}
26
+ </ChakraStatus.Root>
27
+ )
28
+ },
29
+ )
@@ -0,0 +1,49 @@
1
+ import { HStack, IconButton, NumberInput } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+ import { LuMinus, LuPlus } from "react-icons/lu"
4
+
5
+ export interface StepperInputProps extends NumberInput.RootProps {
6
+ label?: React.ReactNode
7
+ }
8
+
9
+ export const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(
10
+ function StepperInput(props, ref) {
11
+ const { label, ...rest } = props
12
+ return (
13
+ <NumberInput.Root {...rest} unstyled ref={ref}>
14
+ {label && <NumberInput.Label>{label}</NumberInput.Label>}
15
+ <HStack gap="2">
16
+ <DecrementTrigger />
17
+ <NumberInput.ValueText textAlign="center" fontSize="lg" minW="3ch" />
18
+ <IncrementTrigger />
19
+ </HStack>
20
+ </NumberInput.Root>
21
+ )
22
+ },
23
+ )
24
+
25
+ const DecrementTrigger = forwardRef<
26
+ HTMLButtonElement,
27
+ NumberInput.DecrementTriggerProps
28
+ >(function DecrementTrigger(props, ref) {
29
+ return (
30
+ <NumberInput.DecrementTrigger {...props} asChild ref={ref}>
31
+ <IconButton variant="outline" size="sm">
32
+ <LuMinus />
33
+ </IconButton>
34
+ </NumberInput.DecrementTrigger>
35
+ )
36
+ })
37
+
38
+ const IncrementTrigger = forwardRef<
39
+ HTMLButtonElement,
40
+ NumberInput.IncrementTriggerProps
41
+ >(function IncrementTrigger(props, ref) {
42
+ return (
43
+ <NumberInput.IncrementTrigger {...props} asChild ref={ref}>
44
+ <IconButton variant="outline" size="sm">
45
+ <LuPlus />
46
+ </IconButton>
47
+ </NumberInput.IncrementTrigger>
48
+ )
49
+ })
@@ -0,0 +1,39 @@
1
+ import { Tag as ChakraTag } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface TagProps extends ChakraTag.RootProps {
5
+ startElement?: React.ReactNode
6
+ endElement?: React.ReactNode
7
+ onClose?: VoidFunction
8
+ closable?: boolean
9
+ }
10
+
11
+ export const Tag = forwardRef<HTMLSpanElement, TagProps>(
12
+ function Tag(props, ref) {
13
+ const {
14
+ startElement,
15
+ endElement,
16
+ onClose,
17
+ closable = !!onClose,
18
+ children,
19
+ ...rest
20
+ } = props
21
+
22
+ return (
23
+ <ChakraTag.Root ref={ref} {...rest}>
24
+ {startElement && (
25
+ <ChakraTag.StartElement>{startElement}</ChakraTag.StartElement>
26
+ )}
27
+ <ChakraTag.Label>{children}</ChakraTag.Label>
28
+ {endElement && (
29
+ <ChakraTag.EndElement>{endElement}</ChakraTag.EndElement>
30
+ )}
31
+ {closable && (
32
+ <ChakraTag.EndElement>
33
+ <ChakraTag.CloseTrigger onClick={onClose} />
34
+ </ChakraTag.EndElement>
35
+ )}
36
+ </ChakraTag.Root>
37
+ )
38
+ },
39
+ )
@@ -0,0 +1,17 @@
1
+ import { Timeline as ChakraTimeline } from "@chakra-ui/react"
2
+
3
+ export const TimelineRoot = ChakraTimeline.Root
4
+ export const TimelineContent = ChakraTimeline.Content
5
+ export const TimelineItem = ChakraTimeline.Item
6
+ export const TimelineIndicator = ChakraTimeline.Indicator
7
+ export const TimelineTitle = ChakraTimeline.Title
8
+ export const TimelineDescription = ChakraTimeline.Description
9
+
10
+ export const TimelineConnector = (props: ChakraTimeline.IndicatorProps) => {
11
+ return (
12
+ <ChakraTimeline.Connector>
13
+ <ChakraTimeline.Separator />
14
+ <ChakraTimeline.Indicator {...props} />
15
+ </ChakraTimeline.Connector>
16
+ )
17
+ }
@@ -0,0 +1,43 @@
1
+ "use client"
2
+
3
+ import {
4
+ Toaster as ChakraToaster,
5
+ Portal,
6
+ Spinner,
7
+ Stack,
8
+ Toast,
9
+ createToaster,
10
+ } from "@chakra-ui/react"
11
+
12
+ export const toaster = createToaster({
13
+ placement: "bottom-end",
14
+ pauseOnPageIdle: true,
15
+ })
16
+
17
+ export const Toaster = () => {
18
+ return (
19
+ <Portal>
20
+ <ChakraToaster toaster={toaster} insetInline={{ mdDown: "4" }}>
21
+ {(toast) => (
22
+ <Toast.Root width={{ md: "sm" }}>
23
+ {toast.type === "loading" ? (
24
+ <Spinner size="sm" color="blue.solid" />
25
+ ) : (
26
+ <Toast.Indicator />
27
+ )}
28
+ <Stack gap="1" flex="1" maxWidth="100%">
29
+ {toast.title && <Toast.Title>{toast.title}</Toast.Title>}
30
+ {toast.description && (
31
+ <Toast.Description>{toast.description}</Toast.Description>
32
+ )}
33
+ </Stack>
34
+ {toast.action && (
35
+ <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>
36
+ )}
37
+ {toast.meta?.closable && <Toast.CloseTrigger />}
38
+ </Toast.Root>
39
+ )}
40
+ </ChakraToaster>
41
+ </Portal>
42
+ )
43
+ }
@@ -0,0 +1,62 @@
1
+ import { Popover as ChakraPopover, IconButton, Portal } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+ import { HiOutlineInformationCircle } from "react-icons/hi"
4
+
5
+ export interface ToggleTipProps extends ChakraPopover.RootProps {
6
+ showArrow?: boolean
7
+ portalled?: boolean
8
+ portalRef?: React.RefObject<HTMLElement>
9
+ content?: React.ReactNode
10
+ }
11
+
12
+ export const ToggleTip = forwardRef<HTMLDivElement, ToggleTipProps>(
13
+ function ToggleTip(props, ref) {
14
+ const {
15
+ showArrow,
16
+ children,
17
+ portalled = true,
18
+ content,
19
+ portalRef,
20
+ ...rest
21
+ } = props
22
+
23
+ return (
24
+ <ChakraPopover.Root
25
+ {...rest}
26
+ positioning={{ ...rest.positioning, gutter: 4 }}
27
+ >
28
+ <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>
29
+ <Portal disabled={!portalled} container={portalRef}>
30
+ <ChakraPopover.Positioner>
31
+ <ChakraPopover.Content
32
+ width="auto"
33
+ px="2"
34
+ py="1"
35
+ textStyle="xs"
36
+ rounded="sm"
37
+ ref={ref}
38
+ >
39
+ {showArrow && (
40
+ <ChakraPopover.Arrow>
41
+ <ChakraPopover.ArrowTip />
42
+ </ChakraPopover.Arrow>
43
+ )}
44
+ {content}
45
+ </ChakraPopover.Content>
46
+ </ChakraPopover.Positioner>
47
+ </Portal>
48
+ </ChakraPopover.Root>
49
+ )
50
+ },
51
+ )
52
+
53
+ export const InfoTip = (props: Partial<ToggleTipProps>) => {
54
+ const { children, ...rest } = props
55
+ return (
56
+ <ToggleTip content={children} {...rest}>
57
+ <IconButton variant="ghost" aria-label="info" size="2xs">
58
+ <HiOutlineInformationCircle />
59
+ </IconButton>
60
+ </ToggleTip>
61
+ )
62
+ }
@@ -0,0 +1,46 @@
1
+ import { Tooltip as ChakraTooltip, Portal } from "@chakra-ui/react"
2
+ import { forwardRef } from "react"
3
+
4
+ export interface TooltipProps extends ChakraTooltip.RootProps {
5
+ showArrow?: boolean
6
+ portalled?: boolean
7
+ portalRef?: React.RefObject<HTMLElement>
8
+ content: React.ReactNode
9
+ contentProps?: ChakraTooltip.ContentProps
10
+ disabled?: boolean
11
+ }
12
+
13
+ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
14
+ function Tooltip(props, ref) {
15
+ const {
16
+ showArrow,
17
+ children,
18
+ disabled,
19
+ portalled,
20
+ content,
21
+ contentProps,
22
+ portalRef,
23
+ ...rest
24
+ } = props
25
+
26
+ if (disabled) return children
27
+
28
+ return (
29
+ <ChakraTooltip.Root {...rest}>
30
+ <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>
31
+ <Portal disabled={!portalled} container={portalRef}>
32
+ <ChakraTooltip.Positioner>
33
+ <ChakraTooltip.Content ref={ref} {...contentProps}>
34
+ {showArrow && (
35
+ <ChakraTooltip.Arrow>
36
+ <ChakraTooltip.ArrowTip />
37
+ </ChakraTooltip.Arrow>
38
+ )}
39
+ {content}
40
+ </ChakraTooltip.Content>
41
+ </ChakraTooltip.Positioner>
42
+ </Portal>
43
+ </ChakraTooltip.Root>
44
+ )
45
+ },
46
+ )
package/src/index.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  export * from '@saas-ui/core'
2
- export * from '@saas-ui/hooks'
3
- export * from '@saas-ui/theme'
4
- export * from '@saas-ui/nprogress'
5
- export * from '@saas-ui/modals'
6
- export * from '@saas-ui/data-table'
7
- export * from '@saas-ui/hotkeys'
8
- export * from '@saas-ui/forms'
2
+
3
+ export { defaultSystem, defaultConfig } from './preset.ts'
4
+ export { createSystem } from '@chakra-ui/react'
5
+
6
+ export { SuiProvider, SuiContext, useLink, useSui } from './provider/index.ts'
7
+ export type { SuiContextValue, SuiProviderProps } from './provider/index.ts'
package/src/preset.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { createSystem, defaultBaseConfig, mergeConfigs } from '@chakra-ui/react'
2
+
3
+ import { defaultThemeConfig } from './theme'
4
+
5
+ export const defaultConfig = mergeConfigs(defaultBaseConfig, defaultThemeConfig)
6
+
7
+ export const defaultSystem = createSystem(defaultConfig)
8
+
9
+ export { defaultSystem as system }
@@ -0,0 +1,4 @@
1
+ export { SuiContext, SuiProvider, useSui } from './sui-provider'
2
+ export type { SuiContextValue, SuiProviderProps } from './sui-provider'
3
+
4
+ export { useLink } from './use-link'