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

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 (237) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/components/app-shell/index.d.cts +1 -1
  3. package/dist/components/app-shell/index.d.ts +1 -1
  4. package/dist/components/navbar/index.d.cts +3 -3
  5. package/dist/components/navbar/index.d.ts +3 -3
  6. package/dist/components/persona/index.d.cts +1 -1
  7. package/dist/components/persona/index.d.ts +1 -1
  8. package/dist/components/sidebar/index.d.cts +12 -12
  9. package/dist/components/sidebar/index.d.ts +12 -12
  10. package/dist/index.cjs +2 -12
  11. package/dist/index.js +2 -12
  12. package/package.json +4 -6
  13. package/src/components/app-shell/app-shell.recipe.ts +0 -52
  14. package/src/components/app-shell/app-shell.stories.tsx +0 -51
  15. package/src/components/app-shell/app-shell.tsx +0 -94
  16. package/src/components/app-shell/index.ts +0 -3
  17. package/src/components/breadcrumbs/breadcrumb.stories.tsx +0 -17
  18. package/src/components/breadcrumbs/breadcrumb.tsx +0 -36
  19. package/src/components/breadcrumbs/index.ts +0 -1
  20. package/src/components/breadcrumbs/namespace.ts +0 -8
  21. package/src/components/button/button.recipe.ts +0 -182
  22. package/src/components/button/button.stories.tsx +0 -99
  23. package/src/components/button/button.tsx +0 -55
  24. package/src/components/button/index.ts +0 -2
  25. package/src/components/checkbox/checkbox.tsx +0 -26
  26. package/src/components/checkbox/index.ts +0 -2
  27. package/src/components/close-button/close-button.stories.tsx +0 -12
  28. package/src/components/close-button/close-button.tsx +0 -18
  29. package/src/components/close-button/index.ts +0 -2
  30. package/src/components/command/command.recipe.ts +0 -17
  31. package/src/components/command/command.stories.tsx +0 -47
  32. package/src/components/command/command.tsx +0 -50
  33. package/src/components/command/index.ts +0 -1
  34. package/src/components/dialog/dialog.tsx +0 -67
  35. package/src/components/dialog/index.ts +0 -1
  36. package/src/components/dialog/namespace.ts +0 -18
  37. package/src/components/drawer/drawer.tsx +0 -57
  38. package/src/components/drawer/index.ts +0 -3
  39. package/src/components/drawer/namespace.ts +0 -19
  40. package/src/components/grid-list/grid-list.recipe.ts +0 -113
  41. package/src/components/icon-badge/icon-badge.recipe.ts +0 -57
  42. package/src/components/icon-badge/icon-badge.stories.tsx +0 -38
  43. package/src/components/icon-badge/icon-badge.tsx +0 -59
  44. package/src/components/icon-badge/index.ts +0 -2
  45. package/src/components/icons/create-icon.tsx +0 -41
  46. package/src/components/icons/icons.tsx +0 -119
  47. package/src/components/icons/index.ts +0 -1
  48. package/src/components/input-group/index.ts +0 -1
  49. package/src/components/input-group/input-group.tsx +0 -46
  50. package/src/components/link/index.ts +0 -2
  51. package/src/components/link/link.stories.tsx +0 -17
  52. package/src/components/link/link.test.tsx +0 -33
  53. package/src/components/link/link.tsx +0 -27
  54. package/src/components/loading-overlay/index.ts +0 -1
  55. package/src/components/loading-overlay/loading-overlay.recipe.ts +0 -61
  56. package/src/components/loading-overlay/loading-overlay.stories.tsx +0 -68
  57. package/src/components/loading-overlay/loading-overlay.tsx +0 -54
  58. package/src/components/loading-overlay/namespace.ts +0 -7
  59. package/src/components/navbar/index.ts +0 -1
  60. package/src/components/navbar/namespace.ts +0 -9
  61. package/src/components/navbar/navbar.recipe.ts +0 -109
  62. package/src/components/navbar/navbar.stories.tsx +0 -435
  63. package/src/components/navbar/navbar.test.tsx +0 -49
  64. package/src/components/navbar/navbar.tsx +0 -39
  65. package/src/components/number-input/index.ts +0 -2
  66. package/src/components/number-input/number-input.tsx +0 -41
  67. package/src/components/password-input/index.ts +0 -2
  68. package/src/components/password-input/password-input.tsx +0 -93
  69. package/src/components/persona/index.ts +0 -2
  70. package/src/components/persona/namespace.ts +0 -18
  71. package/src/components/persona/persona-primitive.tsx +0 -220
  72. package/src/components/persona/persona.recipe.ts +0 -94
  73. package/src/components/persona/persona.stories.tsx +0 -101
  74. package/src/components/persona/persona.tsx +0 -142
  75. package/src/components/pin-input/index.ts +0 -2
  76. package/src/components/pin-input/pin-input.tsx +0 -36
  77. package/src/components/radio/index.ts +0 -2
  78. package/src/components/radio/radio.tsx +0 -27
  79. package/src/components/search-input/index.ts +0 -2
  80. package/src/components/search-input/search-input.stories.tsx +0 -63
  81. package/src/components/search-input/search-input.tsx +0 -134
  82. package/src/components/select/index.ts +0 -1
  83. package/src/components/select/namespace.ts +0 -18
  84. package/src/components/select/select.tsx +0 -135
  85. package/src/components/sidebar/index.ts +0 -7
  86. package/src/components/sidebar/namespace.ts +0 -27
  87. package/src/components/sidebar/sidebar-item.recipe.ts +0 -65
  88. package/src/components/sidebar/sidebar.recipe.ts +0 -237
  89. package/src/components/sidebar/sidebar.stories.tsx +0 -903
  90. package/src/components/sidebar/sidebar.tsx +0 -208
  91. package/src/components/spinner/index.ts +0 -2
  92. package/src/components/spinner/spinner.stories.tsx +0 -19
  93. package/src/components/spinner/spinner.tsx +0 -21
  94. package/src/components/steps/index.ts +0 -1
  95. package/src/components/steps/namespace.ts +0 -16
  96. package/src/components/steps/steps.tsx +0 -82
  97. package/src/components/switch/index.ts +0 -3
  98. package/src/components/switch/switch.tsx +0 -39
  99. package/src/compositions/accordion.tsx +0 -47
  100. package/src/compositions/action-bar.tsx +0 -40
  101. package/src/compositions/alert.tsx +0 -51
  102. package/src/compositions/avatar.tsx +0 -74
  103. package/src/compositions/blockquote.tsx +0 -31
  104. package/src/compositions/checkbox-card.tsx +0 -57
  105. package/src/compositions/checkbox.tsx +0 -25
  106. package/src/compositions/clipboard.tsx +0 -107
  107. package/src/compositions/color-mode.tsx +0 -65
  108. package/src/compositions/data-list.tsx +0 -37
  109. package/src/compositions/empty-state.tsx +0 -34
  110. package/src/compositions/field.tsx +0 -33
  111. package/src/compositions/file-button.tsx +0 -166
  112. package/src/compositions/hover-card.tsx +0 -35
  113. package/src/compositions/link-button.tsx +0 -12
  114. package/src/compositions/menu.tsx +0 -108
  115. package/src/compositions/native-select.tsx +0 -57
  116. package/src/compositions/pagination.tsx +0 -207
  117. package/src/compositions/popover.tsx +0 -58
  118. package/src/compositions/progress-circle.tsx +0 -37
  119. package/src/compositions/progress.tsx +0 -40
  120. package/src/compositions/prose.tsx +0 -264
  121. package/src/compositions/provider.tsx +0 -12
  122. package/src/compositions/radio-card.tsx +0 -57
  123. package/src/compositions/radio.tsx +0 -24
  124. package/src/compositions/rating.tsx +0 -27
  125. package/src/compositions/segmented-control.tsx +0 -47
  126. package/src/compositions/skeleton.tsx +0 -44
  127. package/src/compositions/slider.tsx +0 -53
  128. package/src/compositions/stat.tsx +0 -75
  129. package/src/compositions/status.tsx +0 -29
  130. package/src/compositions/stepper-input.tsx +0 -49
  131. package/src/compositions/tag.tsx +0 -39
  132. package/src/compositions/timeline.tsx +0 -17
  133. package/src/compositions/toaster.tsx +0 -43
  134. package/src/compositions/toggle-tip.tsx +0 -62
  135. package/src/compositions/tooltip.tsx +0 -46
  136. package/src/index.ts +0 -7
  137. package/src/preset.ts +0 -9
  138. package/src/provider/index.ts +0 -4
  139. package/src/provider/sui-provider.tsx +0 -34
  140. package/src/provider/use-link.test.tsx +0 -60
  141. package/src/provider/use-link.tsx +0 -13
  142. package/src/styled-system/create-recipe-context.tsx +0 -91
  143. package/src/styled-system/create-slot-recipe-context.tsx +0 -188
  144. package/src/styled-system/empty.ts +0 -7
  145. package/src/styled-system/factory.types.ts +0 -11
  146. package/src/theme/animation-styles.ts +0 -53
  147. package/src/theme/breakpoints.ts +0 -11
  148. package/src/theme/conditions.ts +0 -26
  149. package/src/theme/fluid-font-sizes.ts +0 -65
  150. package/src/theme/global-css.ts +0 -94
  151. package/src/theme/index.ts +0 -72
  152. package/src/theme/layer-styles.ts +0 -116
  153. package/src/theme/recipes/chakra/accordion.ts +0 -145
  154. package/src/theme/recipes/chakra/action-bar.ts +0 -62
  155. package/src/theme/recipes/chakra/alert.ts +0 -157
  156. package/src/theme/recipes/chakra/avatar.ts +0 -141
  157. package/src/theme/recipes/chakra/badge.ts +0 -67
  158. package/src/theme/recipes/chakra/blockquote.ts +0 -83
  159. package/src/theme/recipes/chakra/breadcrumb.ts +0 -94
  160. package/src/theme/recipes/chakra/card.ts +0 -99
  161. package/src/theme/recipes/chakra/checkbox-card.ts +0 -212
  162. package/src/theme/recipes/chakra/checkbox.ts +0 -70
  163. package/src/theme/recipes/chakra/checkmark.ts +0 -83
  164. package/src/theme/recipes/chakra/code.ts +0 -17
  165. package/src/theme/recipes/chakra/collapsible.ts +0 -20
  166. package/src/theme/recipes/chakra/container.ts +0 -26
  167. package/src/theme/recipes/chakra/data-list.ts +0 -80
  168. package/src/theme/recipes/chakra/dialog.ts +0 -225
  169. package/src/theme/recipes/chakra/drawer.ts +0 -201
  170. package/src/theme/recipes/chakra/editable.ts +0 -88
  171. package/src/theme/recipes/chakra/empty-state.ts +0 -88
  172. package/src/theme/recipes/chakra/field.ts +0 -68
  173. package/src/theme/recipes/chakra/fieldset.ts +0 -62
  174. package/src/theme/recipes/chakra/file-upload.ts +0 -96
  175. package/src/theme/recipes/chakra/heading.ts +0 -27
  176. package/src/theme/recipes/chakra/hover-card.ts +0 -68
  177. package/src/theme/recipes/chakra/icon.ts +0 -30
  178. package/src/theme/recipes/chakra/input-addon.ts +0 -40
  179. package/src/theme/recipes/chakra/input.ts +0 -96
  180. package/src/theme/recipes/chakra/kbd.ts +0 -60
  181. package/src/theme/recipes/chakra/link.ts +0 -37
  182. package/src/theme/recipes/chakra/list.ts +0 -67
  183. package/src/theme/recipes/chakra/mark.ts +0 -27
  184. package/src/theme/recipes/chakra/menu.ts +0 -124
  185. package/src/theme/recipes/chakra/native-select.ts +0 -140
  186. package/src/theme/recipes/chakra/number-input.ts +0 -115
  187. package/src/theme/recipes/chakra/pin-input.ts +0 -27
  188. package/src/theme/recipes/chakra/popover.ts +0 -86
  189. package/src/theme/recipes/chakra/progress-circle.ts +0 -94
  190. package/src/theme/recipes/chakra/progress.ts +0 -127
  191. package/src/theme/recipes/chakra/radio-card.ts +0 -220
  192. package/src/theme/recipes/chakra/radio-group.ts +0 -72
  193. package/src/theme/recipes/chakra/radiomark.ts +0 -107
  194. package/src/theme/recipes/chakra/rating-group.ts +0 -94
  195. package/src/theme/recipes/chakra/segment-group.ts +0 -117
  196. package/src/theme/recipes/chakra/select.ts +0 -282
  197. package/src/theme/recipes/chakra/separator.ts +0 -51
  198. package/src/theme/recipes/chakra/skeleton.ts +0 -53
  199. package/src/theme/recipes/chakra/skip-nav-link.ts +0 -34
  200. package/src/theme/recipes/chakra/slider.ts +0 -178
  201. package/src/theme/recipes/chakra/spinner.ts +0 -32
  202. package/src/theme/recipes/chakra/stat.ts +0 -79
  203. package/src/theme/recipes/chakra/status.ts +0 -48
  204. package/src/theme/recipes/chakra/steps.ts +0 -218
  205. package/src/theme/recipes/chakra/switch.ts +0 -167
  206. package/src/theme/recipes/chakra/table.ts +0 -172
  207. package/src/theme/recipes/chakra/tabs.ts +0 -280
  208. package/src/theme/recipes/chakra/tag.ts +0 -131
  209. package/src/theme/recipes/chakra/textarea.ts +0 -88
  210. package/src/theme/recipes/chakra/timeline.ts +0 -138
  211. package/src/theme/recipes/chakra/toast.ts +0 -96
  212. package/src/theme/recipes/chakra/tooltip.ts +0 -40
  213. package/src/theme/recipes.ts +0 -46
  214. package/src/theme/semantic-tokens/colors.ts +0 -403
  215. package/src/theme/semantic-tokens/radii.ts +0 -7
  216. package/src/theme/semantic-tokens/shadows.ts +0 -52
  217. package/src/theme/slot-recipes.ts +0 -104
  218. package/src/theme/text-styles.ts +0 -39
  219. package/src/theme/tokens/animations.ts +0 -8
  220. package/src/theme/tokens/aspect-ratios.ts +0 -10
  221. package/src/theme/tokens/blurs.ts +0 -12
  222. package/src/theme/tokens/borders.ts +0 -9
  223. package/src/theme/tokens/colors.ts +0 -177
  224. package/src/theme/tokens/cursor.ts +0 -12
  225. package/src/theme/tokens/durations.ts +0 -11
  226. package/src/theme/tokens/easings.ts +0 -10
  227. package/src/theme/tokens/font-sizes.ts +0 -20
  228. package/src/theme/tokens/font-weights.ts +0 -13
  229. package/src/theme/tokens/fonts.ts +0 -15
  230. package/src/theme/tokens/keyframes.ts +0 -173
  231. package/src/theme/tokens/letter-spacing.ts +0 -9
  232. package/src/theme/tokens/line-heights.ts +0 -19
  233. package/src/theme/tokens/radius.ts +0 -18
  234. package/src/theme/tokens/sizes.ts +0 -71
  235. package/src/theme/tokens/spacing.ts +0 -38
  236. package/src/theme/tokens/z-indices.ts +0 -34
  237. package/src/theme/utils.ts +0 -46
@@ -1,57 +0,0 @@
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
@@ -1,24 +0,0 @@
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
@@ -1,27 +0,0 @@
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
- )
@@ -1,47 +0,0 @@
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
- })
@@ -1,44 +0,0 @@
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
@@ -1,53 +0,0 @@
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
- )
@@ -1,75 +0,0 @@
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
@@ -1,29 +0,0 @@
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
- )
@@ -1,49 +0,0 @@
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
- })
@@ -1,39 +0,0 @@
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
- )
@@ -1,17 +0,0 @@
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
- }
@@ -1,43 +0,0 @@
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
- }
@@ -1,62 +0,0 @@
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
- }
@@ -1,46 +0,0 @@
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 DELETED
@@ -1,7 +0,0 @@
1
- export * from '@saas-ui/core'
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 DELETED
@@ -1,9 +0,0 @@
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 }
@@ -1,4 +0,0 @@
1
- export { SuiContext, SuiProvider, useSui } from './sui-provider'
2
- export type { SuiContextValue, SuiProviderProps } from './sui-provider'
3
-
4
- export { useLink } from './use-link'
@@ -1,34 +0,0 @@
1
- import * as React from 'react'
2
-
3
- import { ChakraProvider, ChakraProviderProps } from '@chakra-ui/react'
4
-
5
- export interface SuiContextValue {
6
- linkComponent?: React.ElementType<any>
7
- }
8
-
9
- export const SuiContext = React.createContext<SuiContextValue>({})
10
-
11
- export interface SuiProviderProps extends ChakraProviderProps {
12
- linkComponent?: React.ElementType<any>
13
- children: React.ReactNode
14
- onError?: (error: Error, errorInfo: React.ErrorInfo) => void
15
- }
16
-
17
- export function SuiProvider(props: SuiProviderProps) {
18
- const { linkComponent, onError, children, ...rest } = props
19
-
20
- const context = React.useMemo(
21
- () => ({
22
- linkComponent,
23
- }),
24
- [],
25
- )
26
-
27
- return (
28
- <SuiContext.Provider value={context}>
29
- <ChakraProvider {...rest}>{children}</ChakraProvider>
30
- </SuiContext.Provider>
31
- )
32
- }
33
-
34
- export const useSui = (): SuiContextValue => React.useContext(SuiContext)