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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +7 -154
  2. package/dist/index.cjs +8461 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +26 -0
  5. package/dist/index.d.ts +25 -7
  6. package/dist/index.js +8415 -35
  7. package/dist/index.js.map +1 -1
  8. package/package.json +24 -21
  9. package/src/components/accordion.tsx +47 -0
  10. package/src/components/action-bar.tsx +40 -0
  11. package/src/components/alert.tsx +51 -0
  12. package/src/components/app-shell/app-shell.recipe.ts +52 -0
  13. package/src/components/app-shell/app-shell.stories.tsx +51 -0
  14. package/src/components/app-shell/app-shell.tsx +94 -0
  15. package/src/components/app-shell/index.ts +3 -0
  16. package/src/components/avatar.tsx +74 -0
  17. package/src/components/blockquote.tsx +31 -0
  18. package/src/components/breadcrumbs/breadcrumb.stories.tsx +17 -0
  19. package/src/components/breadcrumbs/breadcrumb.tsx +36 -0
  20. package/src/components/breadcrumbs/index.ts +1 -0
  21. package/src/components/breadcrumbs/namespace.ts +8 -0
  22. package/src/components/button/button.recipe.ts +182 -0
  23. package/src/components/button/button.stories.tsx +99 -0
  24. package/src/components/button/button.tsx +55 -0
  25. package/src/components/button/index.ts +2 -0
  26. package/src/components/checkbox/checkbox.tsx +26 -0
  27. package/src/components/checkbox/index.ts +2 -0
  28. package/src/components/checkbox-card.tsx +57 -0
  29. package/src/components/checkbox.tsx +25 -0
  30. package/src/components/clipboard.tsx +107 -0
  31. package/src/components/close-button/close-button.stories.tsx +12 -0
  32. package/src/components/close-button/close-button.tsx +18 -0
  33. package/src/components/close-button/index.ts +2 -0
  34. package/src/components/color-mode.tsx +65 -0
  35. package/src/components/command/command.recipe.ts +17 -0
  36. package/src/components/command/command.stories.tsx +47 -0
  37. package/src/components/command/command.tsx +50 -0
  38. package/src/components/command/index.ts +1 -0
  39. package/src/components/data-list.tsx +37 -0
  40. package/src/components/dialog/dialog.tsx +66 -0
  41. package/src/components/dialog/index.ts +1 -0
  42. package/src/components/dialog/namespace.ts +18 -0
  43. package/src/components/drawer/drawer.tsx +56 -0
  44. package/src/components/drawer/index.ts +3 -0
  45. package/src/components/drawer/namespace.ts +19 -0
  46. package/src/components/empty-state.tsx +34 -0
  47. package/src/components/field.tsx +33 -0
  48. package/src/components/file-button.tsx +166 -0
  49. package/src/components/grid-list/grid-list.recipe.ts +113 -0
  50. package/src/components/hover-card.tsx +35 -0
  51. package/src/components/icon-badge/icon-badge.recipe.ts +57 -0
  52. package/src/components/icon-badge/icon-badge.stories.tsx +38 -0
  53. package/src/components/icon-badge/icon-badge.tsx +59 -0
  54. package/src/components/icon-badge/index.ts +2 -0
  55. package/src/components/icons/create-icon.tsx +41 -0
  56. package/src/components/icons/icons.tsx +121 -0
  57. package/src/components/icons/index.ts +1 -0
  58. package/src/components/input-group/index.ts +1 -0
  59. package/src/components/input-group/input-group.tsx +46 -0
  60. package/src/components/link/index.ts +2 -0
  61. package/src/components/link/link.stories.tsx +17 -0
  62. package/src/components/link/link.test.tsx +33 -0
  63. package/src/components/link/link.tsx +27 -0
  64. package/src/components/link-button.tsx +12 -0
  65. package/src/components/loading-overlay/index.ts +1 -0
  66. package/src/components/loading-overlay/loading-overlay.recipe.ts +61 -0
  67. package/src/components/loading-overlay/loading-overlay.stories.tsx +68 -0
  68. package/src/components/loading-overlay/loading-overlay.tsx +54 -0
  69. package/src/components/loading-overlay/namespace.ts +7 -0
  70. package/src/components/menu.tsx +108 -0
  71. package/src/components/native-select.tsx +57 -0
  72. package/src/components/navbar/index.ts +1 -0
  73. package/src/components/navbar/namespace.ts +9 -0
  74. package/src/components/navbar/navbar.recipe.ts +109 -0
  75. package/src/components/navbar/navbar.stories.tsx +435 -0
  76. package/src/components/navbar/navbar.test.tsx +49 -0
  77. package/src/components/navbar/navbar.tsx +39 -0
  78. package/src/components/number-input/index.ts +2 -0
  79. package/src/components/number-input/number-input.tsx +41 -0
  80. package/src/components/pagination.tsx +207 -0
  81. package/src/components/password-input/index.ts +2 -0
  82. package/src/components/password-input/password-input.tsx +98 -0
  83. package/src/components/persona/index.ts +2 -0
  84. package/src/components/persona/namespace.ts +18 -0
  85. package/src/components/persona/persona-primitive.tsx +220 -0
  86. package/src/components/persona/persona.recipe.ts +94 -0
  87. package/src/components/persona/persona.stories.tsx +101 -0
  88. package/src/components/persona/persona.tsx +143 -0
  89. package/src/components/pin-input/index.ts +2 -0
  90. package/src/components/pin-input/pin-input.tsx +36 -0
  91. package/src/components/popover.tsx +58 -0
  92. package/src/components/progress-circle.tsx +37 -0
  93. package/src/components/progress.tsx +40 -0
  94. package/src/components/prose.tsx +264 -0
  95. package/src/components/provider.tsx +12 -0
  96. package/src/components/radio/index.ts +2 -0
  97. package/src/components/radio/radio.tsx +27 -0
  98. package/src/components/radio-card.tsx +57 -0
  99. package/src/components/radio.tsx +24 -0
  100. package/src/components/rating.tsx +27 -0
  101. package/src/components/search-input/index.ts +2 -0
  102. package/src/components/search-input/search-input.stories.tsx +63 -0
  103. package/src/components/search-input/search-input.tsx +134 -0
  104. package/src/components/segmented-control.tsx +47 -0
  105. package/src/components/select/index.ts +1 -0
  106. package/src/components/select/namespace.ts +18 -0
  107. package/src/components/select/select.tsx +135 -0
  108. package/src/components/sidebar/index.ts +7 -0
  109. package/src/components/sidebar/namespace.ts +27 -0
  110. package/src/components/sidebar/sidebar-item.recipe.ts +65 -0
  111. package/src/components/sidebar/sidebar.recipe.ts +237 -0
  112. package/src/components/sidebar/sidebar.stories.tsx +903 -0
  113. package/src/components/sidebar/sidebar.tsx +204 -0
  114. package/src/components/skeleton.tsx +44 -0
  115. package/src/components/slider.tsx +53 -0
  116. package/src/components/spinner/index.ts +2 -0
  117. package/src/components/spinner/spinner.stories.tsx +19 -0
  118. package/src/components/spinner/spinner.tsx +21 -0
  119. package/src/components/stat.tsx +75 -0
  120. package/src/components/status.tsx +29 -0
  121. package/src/components/stepper-input.tsx +49 -0
  122. package/src/components/steps/index.ts +1 -0
  123. package/src/components/steps/namespace.ts +16 -0
  124. package/src/components/steps/steps.tsx +82 -0
  125. package/src/components/switch/index.ts +3 -0
  126. package/src/components/switch/switch.tsx +39 -0
  127. package/src/components/tag.tsx +39 -0
  128. package/src/components/timeline.tsx +17 -0
  129. package/src/components/toaster.tsx +43 -0
  130. package/src/components/toggle-tip.tsx +62 -0
  131. package/src/components/tooltip.tsx +46 -0
  132. package/src/index.ts +6 -7
  133. package/src/preset.ts +9 -0
  134. package/src/provider/index.ts +4 -0
  135. package/src/provider/sui-provider.tsx +34 -0
  136. package/src/provider/use-link.test.tsx +60 -0
  137. package/src/provider/use-link.tsx +13 -0
  138. package/src/theme/animation-styles.ts +53 -0
  139. package/src/theme/breakpoints.ts +11 -0
  140. package/src/theme/conditions.ts +26 -0
  141. package/src/theme/fluid-font-sizes.ts +65 -0
  142. package/src/theme/global-css.ts +94 -0
  143. package/src/theme/index.ts +72 -0
  144. package/src/theme/layer-styles.ts +116 -0
  145. package/src/theme/recipes/chakra/accordion.ts +145 -0
  146. package/src/theme/recipes/chakra/action-bar.ts +62 -0
  147. package/src/theme/recipes/chakra/alert.ts +157 -0
  148. package/src/theme/recipes/chakra/avatar.ts +141 -0
  149. package/src/theme/recipes/chakra/badge.ts +67 -0
  150. package/src/theme/recipes/chakra/blockquote.ts +83 -0
  151. package/src/theme/recipes/chakra/breadcrumb.ts +94 -0
  152. package/src/theme/recipes/chakra/card.ts +99 -0
  153. package/src/theme/recipes/chakra/checkbox-card.ts +212 -0
  154. package/src/theme/recipes/chakra/checkbox.ts +70 -0
  155. package/src/theme/recipes/chakra/checkmark.ts +83 -0
  156. package/src/theme/recipes/chakra/code.ts +17 -0
  157. package/src/theme/recipes/chakra/collapsible.ts +20 -0
  158. package/src/theme/recipes/chakra/container.ts +26 -0
  159. package/src/theme/recipes/chakra/data-list.ts +80 -0
  160. package/src/theme/recipes/chakra/dialog.ts +225 -0
  161. package/src/theme/recipes/chakra/drawer.ts +201 -0
  162. package/src/theme/recipes/chakra/editable.ts +88 -0
  163. package/src/theme/recipes/chakra/empty-state.ts +88 -0
  164. package/src/theme/recipes/chakra/field.ts +68 -0
  165. package/src/theme/recipes/chakra/fieldset.ts +62 -0
  166. package/src/theme/recipes/chakra/file-upload.ts +96 -0
  167. package/src/theme/recipes/chakra/heading.ts +27 -0
  168. package/src/theme/recipes/chakra/hover-card.ts +68 -0
  169. package/src/theme/recipes/chakra/icon.ts +30 -0
  170. package/src/theme/recipes/chakra/input-addon.ts +40 -0
  171. package/src/theme/recipes/chakra/input.ts +96 -0
  172. package/src/theme/recipes/chakra/kbd.ts +60 -0
  173. package/src/theme/recipes/chakra/link.ts +37 -0
  174. package/src/theme/recipes/chakra/list.ts +67 -0
  175. package/src/theme/recipes/chakra/mark.ts +27 -0
  176. package/src/theme/recipes/chakra/menu.ts +124 -0
  177. package/src/theme/recipes/chakra/native-select.ts +140 -0
  178. package/src/theme/recipes/chakra/number-input.ts +115 -0
  179. package/src/theme/recipes/chakra/pin-input.ts +27 -0
  180. package/src/theme/recipes/chakra/popover.ts +86 -0
  181. package/src/theme/recipes/chakra/progress-circle.ts +94 -0
  182. package/src/theme/recipes/chakra/progress.ts +127 -0
  183. package/src/theme/recipes/chakra/radio-card.ts +220 -0
  184. package/src/theme/recipes/chakra/radio-group.ts +72 -0
  185. package/src/theme/recipes/chakra/radiomark.ts +107 -0
  186. package/src/theme/recipes/chakra/rating-group.ts +94 -0
  187. package/src/theme/recipes/chakra/segment-group.ts +117 -0
  188. package/src/theme/recipes/chakra/select.ts +282 -0
  189. package/src/theme/recipes/chakra/separator.ts +51 -0
  190. package/src/theme/recipes/chakra/skeleton.ts +53 -0
  191. package/src/theme/recipes/chakra/skip-nav-link.ts +34 -0
  192. package/src/theme/recipes/chakra/slider.ts +178 -0
  193. package/src/theme/recipes/chakra/spinner.ts +32 -0
  194. package/src/theme/recipes/chakra/stat.ts +79 -0
  195. package/src/theme/recipes/chakra/status.ts +48 -0
  196. package/src/theme/recipes/chakra/steps.ts +218 -0
  197. package/src/theme/recipes/chakra/switch.ts +167 -0
  198. package/src/theme/recipes/chakra/table.ts +172 -0
  199. package/src/theme/recipes/chakra/tabs.ts +280 -0
  200. package/src/theme/recipes/chakra/tag.ts +131 -0
  201. package/src/theme/recipes/chakra/textarea.ts +88 -0
  202. package/src/theme/recipes/chakra/timeline.ts +138 -0
  203. package/src/theme/recipes/chakra/toast.ts +96 -0
  204. package/src/theme/recipes/chakra/tooltip.ts +40 -0
  205. package/src/theme/recipes.ts +46 -0
  206. package/src/theme/semantic-tokens/colors.ts +403 -0
  207. package/src/theme/semantic-tokens/radii.ts +7 -0
  208. package/src/theme/semantic-tokens/shadows.ts +52 -0
  209. package/src/theme/slot-recipes.ts +104 -0
  210. package/src/theme/text-styles.ts +39 -0
  211. package/src/theme/tokens/animations.ts +8 -0
  212. package/src/theme/tokens/aspect-ratios.ts +10 -0
  213. package/src/theme/tokens/blurs.ts +12 -0
  214. package/src/theme/tokens/borders.ts +9 -0
  215. package/src/theme/tokens/colors.ts +177 -0
  216. package/src/theme/tokens/cursor.ts +12 -0
  217. package/src/theme/tokens/durations.ts +11 -0
  218. package/src/theme/tokens/easings.ts +10 -0
  219. package/src/theme/tokens/font-sizes.ts +20 -0
  220. package/src/theme/tokens/font-weights.ts +13 -0
  221. package/src/theme/tokens/fonts.ts +15 -0
  222. package/src/theme/tokens/keyframes.ts +173 -0
  223. package/src/theme/tokens/letter-spacing.ts +9 -0
  224. package/src/theme/tokens/line-heights.ts +19 -0
  225. package/src/theme/tokens/radius.ts +18 -0
  226. package/src/theme/tokens/sizes.ts +71 -0
  227. package/src/theme/tokens/spacing.ts +38 -0
  228. package/src/theme/tokens/z-indices.ts +34 -0
  229. package/src/theme/utils.ts +46 -0
  230. package/dist/index.d.mts +0 -8
  231. package/dist/index.mjs +0 -11
  232. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,101 @@
1
+ import * as React from 'react'
2
+
3
+ import { Container, VStack } from '@chakra-ui/react'
4
+ import { FiMinus, FiPhone } from 'react-icons/fi'
5
+
6
+ import { Persona } from './persona.tsx'
7
+
8
+ export default {
9
+ title: 'Components/Persona',
10
+ decorators: [
11
+ (Story: any) => (
12
+ <Container mt="40px">
13
+ <Story />
14
+ </Container>
15
+ ),
16
+ ],
17
+ }
18
+
19
+ const persona = {
20
+ name: 'Elliot Alderson',
21
+ presence: 'online',
22
+ secondaryLabel: 'Mr Robot',
23
+ tertiaryLabel: 'Away for lunch',
24
+ }
25
+
26
+ export const Basic = () => (
27
+ <>
28
+ <VStack gap="8">
29
+ <Persona {...persona} presence="online" size="xs" />
30
+
31
+ <Persona {...persona} presence="online" size="sm" />
32
+
33
+ <Persona {...persona} presence="online" size="md" />
34
+
35
+ <Persona {...persona} presence="online" size="lg" />
36
+
37
+ <Persona {...persona} presence="online" size="xl" />
38
+ </VStack>
39
+ </>
40
+ )
41
+
42
+ export const HideDetails = () => (
43
+ <>
44
+ <VStack gap="8">
45
+ <Persona {...persona} hideDetails presence="offline" />
46
+ </VStack>
47
+ </>
48
+ )
49
+
50
+ export const BadgeIcon = () => (
51
+ <>
52
+ <VStack gap="8">
53
+ <Persona
54
+ {...persona}
55
+ presenceIcon={<FiMinus size="0.4em" />}
56
+ size="xl"
57
+ presence="busy"
58
+ />
59
+ </VStack>
60
+ </>
61
+ )
62
+
63
+ export const LabelWithIcon = () => (
64
+ <>
65
+ <VStack gap="8">
66
+ <Persona
67
+ {...persona}
68
+ presence="busy"
69
+ secondaryLabel={
70
+ <>
71
+ <FiPhone /> On a call
72
+ </>
73
+ }
74
+ />
75
+ </VStack>
76
+ </>
77
+ )
78
+
79
+ export const OutOfOffice = () => (
80
+ <>
81
+ <VStack gap="8">
82
+ <Persona {...persona} presence="offline" size="xs" isOutOfOffice />
83
+ <Persona {...persona} presence="online" isOutOfOffice />
84
+ <Persona {...persona} presence="away" size="xl" isOutOfOffice />
85
+ </VStack>
86
+ </>
87
+ )
88
+
89
+ export const Overflow = () => (
90
+ <>
91
+ <VStack gap="8">
92
+ <Persona
93
+ {...persona}
94
+ secondaryLabel="This is a very long text and should overflow."
95
+ presence="offline"
96
+ isOutOfOffice
97
+ maxW="200px"
98
+ />
99
+ </VStack>
100
+ </>
101
+ )
@@ -0,0 +1,143 @@
1
+ import * as React from 'react'
2
+
3
+ import * as PersonaPrimitive from './namespace.ts'
4
+
5
+ interface PersonaOptions {
6
+ /**
7
+ * The name of the person in the avatar.
8
+ *
9
+ * - if `src` has loaded, the name will be used as the `alt` attribute of the `img`
10
+ * - If `src` is not loaded, the name will be used to create the initials
11
+ */
12
+ name?: string
13
+ /**
14
+ * The presence status of the person
15
+ *
16
+ * If set will add an AvatarBadge with color configured in `Presence`
17
+ * Default presence options:
18
+ * - online
19
+ * - offline
20
+ * - busy
21
+ * - dnd
22
+ * - away
23
+ */
24
+ presence?: PersonaPrimitive.Presence
25
+ /**
26
+ * The icon shown in the AvatarBadge
27
+ */
28
+ presenceIcon?: React.ReactNode
29
+ /**
30
+ * Indicates that a person is out of office. Changes the presence badge style.
31
+ */
32
+ isOutOfOffice?: boolean
33
+ /**
34
+ * Primary label of the persona, defaults to the name
35
+ */
36
+ label?: React.ReactNode
37
+ /**
38
+ * Secondary label, usually the role of the person
39
+ * Only visible from md size and up.
40
+ */
41
+ secondaryLabel?: React.ReactNode
42
+ /**
43
+ * Tertiary label, usually the status of the person.
44
+ * Only visible from lg size and up.
45
+ */
46
+ tertiaryLabel?: React.ReactNode
47
+ /**
48
+ * Hide the persona details next to the avatar.
49
+ */
50
+ hideDetails?: boolean
51
+ }
52
+
53
+ export interface PersonaProps
54
+ extends PersonaOptions,
55
+ PersonaPrimitive.AvatarProps,
56
+ PersonaPrimitive.RootProps {}
57
+
58
+ /**
59
+ * The wrapper component that handles default composition.
60
+ *
61
+ * @see Docs https://saas-ui.dev/docs/components/data-display/persona
62
+ */
63
+ export const Persona = React.forwardRef<HTMLDivElement, PersonaProps>(
64
+ (props, ref) => {
65
+ const {
66
+ name,
67
+ presence,
68
+ presenceIcon,
69
+ isOutOfOffice,
70
+ label,
71
+ secondaryLabel,
72
+ tertiaryLabel,
73
+ size,
74
+ hideDetails,
75
+ children,
76
+ /** Avatar props */
77
+ getInitials,
78
+ icon,
79
+ loading,
80
+ onError,
81
+ src,
82
+ srcSet,
83
+ ...rest
84
+ } = props
85
+
86
+ return (
87
+ <PersonaPrimitive.Root
88
+ ref={ref}
89
+ outOfOffice={isOutOfOffice}
90
+ presence={presence}
91
+ size={size}
92
+ {...rest}
93
+ >
94
+ <PersonaPrimitive.Avatar
95
+ name={name}
96
+ size={size}
97
+ getInitials={getInitials}
98
+ icon={icon}
99
+ loading={loading}
100
+ onError={onError}
101
+ src={src}
102
+ srcSet={srcSet}
103
+ >
104
+ <PersonaPrimitive.PresenceBadge>
105
+ {presenceIcon}
106
+ </PersonaPrimitive.PresenceBadge>
107
+ </PersonaPrimitive.Avatar>
108
+
109
+ {!hideDetails && (
110
+ <PersonaPrimitive.Details>
111
+ <PersonaPrimitive.Label>{label || name}</PersonaPrimitive.Label>
112
+ {secondaryLabel && (
113
+ <PersonaPrimitive.SecondaryLabel>
114
+ {secondaryLabel}
115
+ </PersonaPrimitive.SecondaryLabel>
116
+ )}
117
+ {tertiaryLabel && (
118
+ <PersonaPrimitive.TertiaryLabel>
119
+ {tertiaryLabel}
120
+ </PersonaPrimitive.TertiaryLabel>
121
+ )}
122
+ {children}
123
+ </PersonaPrimitive.Details>
124
+ )}
125
+ </PersonaPrimitive.Root>
126
+ )
127
+ },
128
+ )
129
+
130
+ Persona.displayName = 'Persona'
131
+
132
+ export interface PersonaAvatarProps
133
+ extends Omit<
134
+ PersonaProps,
135
+ 'hideDetails' | 'label' | 'secondaryLabel' | 'tertiaryLabel' | 'children'
136
+ > {}
137
+
138
+ export const PersonaAvatar = React.forwardRef<
139
+ HTMLDivElement,
140
+ PersonaAvatarProps
141
+ >(function PersonaAvatar(props, ref) {
142
+ return <Persona ref={ref} {...props} hideDetails />
143
+ })
@@ -0,0 +1,2 @@
1
+ export { PinInput } from './pin-input.tsx'
2
+ export type { PinInputProps } from './pin-input.tsx'
@@ -0,0 +1,36 @@
1
+ import { forwardRef } from 'react'
2
+
3
+ import { PinInput as ChakraPinInput, Group } from '@chakra-ui/react'
4
+
5
+ export interface PinInputProps extends ChakraPinInput.RootProps {
6
+ rootRef?: React.Ref<HTMLDivElement>
7
+ pinLength?: number
8
+ inputProps?: React.InputHTMLAttributes<HTMLInputElement>
9
+ attached?: boolean
10
+ }
11
+
12
+ export const PinInput = forwardRef<HTMLInputElement, PinInputProps>(
13
+ function PinInput(props, ref) {
14
+ const {
15
+ pinLength = 4,
16
+ inputProps,
17
+ rootRef,
18
+ attached,
19
+ gap = attached ? 0 : 2,
20
+ ...rest
21
+ } = props
22
+
23
+ return (
24
+ <ChakraPinInput.Root ref={rootRef} {...rest}>
25
+ <ChakraPinInput.HiddenInput ref={ref} {...inputProps} />
26
+ <ChakraPinInput.Control>
27
+ <Group attached={attached} gap={gap}>
28
+ {Array.from({ length: pinLength }).map((_, index) => (
29
+ <ChakraPinInput.Input key={index} index={index} />
30
+ ))}
31
+ </Group>
32
+ </ChakraPinInput.Control>
33
+ </ChakraPinInput.Root>
34
+ )
35
+ },
36
+ )
@@ -0,0 +1,58 @@
1
+ import { Popover as ChakraPopover, Portal } from "@chakra-ui/react"
2
+ import { CloseButton } from "compositions/ui/close-button"
3
+ import { forwardRef } from "react"
4
+
5
+ interface PopoverContentProps extends ChakraPopover.ContentProps {
6
+ portalled?: boolean
7
+ portalRef?: React.RefObject<HTMLElement>
8
+ }
9
+
10
+ export const PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(
11
+ function PopoverContent(props, ref) {
12
+ const { portalled = true, portalRef, ...rest } = props
13
+ return (
14
+ <Portal disabled={!portalled} container={portalRef}>
15
+ <ChakraPopover.Positioner>
16
+ <ChakraPopover.Content ref={ref} {...rest} />
17
+ </ChakraPopover.Positioner>
18
+ </Portal>
19
+ )
20
+ },
21
+ )
22
+
23
+ export const PopoverArrow = forwardRef<
24
+ HTMLDivElement,
25
+ ChakraPopover.ArrowProps
26
+ >(function PopoverArrow(props, ref) {
27
+ return (
28
+ <ChakraPopover.Arrow {...props} ref={ref}>
29
+ <ChakraPopover.ArrowTip />
30
+ </ChakraPopover.Arrow>
31
+ )
32
+ })
33
+
34
+ export const PopoverCloseTrigger = forwardRef<
35
+ HTMLButtonElement,
36
+ ChakraPopover.CloseTriggerProps
37
+ >(function PopoverCloseTrigger(props, ref) {
38
+ return (
39
+ <ChakraPopover.CloseTrigger
40
+ position="absolute"
41
+ top="1"
42
+ insetEnd="1"
43
+ {...props}
44
+ asChild
45
+ ref={ref}
46
+ >
47
+ <CloseButton size="sm" />
48
+ </ChakraPopover.CloseTrigger>
49
+ )
50
+ })
51
+
52
+ export const PopoverTitle = ChakraPopover.Title
53
+ export const PopoverDescription = ChakraPopover.Description
54
+ export const PopoverFooter = ChakraPopover.Footer
55
+ export const PopoverHeader = ChakraPopover.Header
56
+ export const PopoverRoot = ChakraPopover.Root
57
+ export const PopoverBody = ChakraPopover.Body
58
+ export const PopoverTrigger = ChakraPopover.Trigger
@@ -0,0 +1,37 @@
1
+ import type { SystemStyleObject } from "@chakra-ui/react"
2
+ import {
3
+ AbsoluteCenter,
4
+ ProgressCircle as ChakraProgressCircle,
5
+ } from "@chakra-ui/react"
6
+ import { forwardRef } from "react"
7
+
8
+ export const ProgressCircleRoot = ChakraProgressCircle.Root
9
+
10
+ interface ProgressCircleRingProps extends ChakraProgressCircle.CircleProps {
11
+ trackColor?: SystemStyleObject["stroke"]
12
+ cap?: SystemStyleObject["strokeLinecap"]
13
+ }
14
+
15
+ export const ProgressCircleRing = forwardRef<
16
+ SVGSVGElement,
17
+ ProgressCircleRingProps
18
+ >(function ProgressCircleRing(props, ref) {
19
+ const { trackColor, cap, color, ...rest } = props
20
+ return (
21
+ <ChakraProgressCircle.Circle {...rest} ref={ref}>
22
+ <ChakraProgressCircle.Track stroke={trackColor} />
23
+ <ChakraProgressCircle.Range stroke={color} strokeLinecap={cap} />
24
+ </ChakraProgressCircle.Circle>
25
+ )
26
+ })
27
+
28
+ export const ProgressCircleValueText = forwardRef<
29
+ HTMLDivElement,
30
+ ChakraProgressCircle.ValueTextProps
31
+ >(function ProgressCircleValueText(props, ref) {
32
+ return (
33
+ <AbsoluteCenter>
34
+ <ChakraProgressCircle.ValueText {...props} ref={ref} />
35
+ </AbsoluteCenter>
36
+ )
37
+ })
@@ -0,0 +1,40 @@
1
+ import { Progress as ChakraProgress, IconButton } from "@chakra-ui/react"
2
+ import { ToggleTip } from "compositions/ui/toggle-tip"
3
+ import { forwardRef } from "react"
4
+ import { HiOutlineInformationCircle } from "react-icons/hi"
5
+
6
+ export const ProgressBar = forwardRef<
7
+ HTMLDivElement,
8
+ ChakraProgress.TrackProps
9
+ >(function ProgressBar(props, ref) {
10
+ return (
11
+ <ChakraProgress.Track {...props} ref={ref}>
12
+ <ChakraProgress.Range />
13
+ </ChakraProgress.Track>
14
+ )
15
+ })
16
+
17
+ export const ProgressRoot = ChakraProgress.Root
18
+ export const ProgressValueText = ChakraProgress.ValueText
19
+
20
+ export interface ProgressLabelProps extends ChakraProgress.LabelProps {
21
+ info?: React.ReactNode
22
+ }
23
+
24
+ export const ProgressLabel = forwardRef<HTMLDivElement, ProgressLabelProps>(
25
+ function ProgressLabel(props, ref) {
26
+ const { children, info, ...rest } = props
27
+ return (
28
+ <ChakraProgress.Label {...rest} ref={ref}>
29
+ {children}
30
+ {info && (
31
+ <ToggleTip content={info}>
32
+ <IconButton variant="ghost" aria-label="info" size="2xs" ms="1">
33
+ <HiOutlineInformationCircle />
34
+ </IconButton>
35
+ </ToggleTip>
36
+ )}
37
+ </ChakraProgress.Label>
38
+ )
39
+ },
40
+ )
@@ -0,0 +1,264 @@
1
+ "use client"
2
+
3
+ import { chakra } from "@chakra-ui/react"
4
+
5
+ export const Prose = chakra("div", {
6
+ base: {
7
+ color: "fg.muted",
8
+ maxWidth: "65ch",
9
+ fontSize: "sm",
10
+ lineHeight: "1.7em",
11
+ "& p": {
12
+ marginTop: "1em",
13
+ marginBottom: "1em",
14
+ },
15
+ "& blockquote": {
16
+ marginTop: "1.285em",
17
+ marginBottom: "1.285em",
18
+ paddingInline: "1.285em",
19
+ borderInlineStartWidth: "0.25em",
20
+ },
21
+ "& a": {
22
+ color: "fg",
23
+ textDecoration: "underline",
24
+ textUnderlineOffset: "3px",
25
+ textDecorationThickness: "2px",
26
+ textDecorationColor: "border.muted",
27
+ fontWeight: "500",
28
+ },
29
+ "& strong": {
30
+ fontWeight: "600",
31
+ },
32
+ "& a strong": {
33
+ color: "inherit",
34
+ },
35
+ "& h1": {
36
+ fontSize: "2.15em",
37
+ letterSpacing: "-0.02em",
38
+ marginTop: "0",
39
+ marginBottom: "0.8em",
40
+ lineHeight: "1.2em",
41
+ },
42
+ "& h2": {
43
+ fontSize: "1.4em",
44
+ letterSpacing: "-0.02em",
45
+ marginTop: "1.6em",
46
+ marginBottom: "0.8em",
47
+ lineHeight: "1.4em",
48
+ },
49
+ "& h3": {
50
+ fontSize: "1.285em",
51
+ letterSpacing: "-0.01em",
52
+ marginTop: "1.5em",
53
+ marginBottom: "0.4em",
54
+ lineHeight: "1.5em",
55
+ },
56
+ "& h4": {
57
+ marginTop: "1.4em",
58
+ marginBottom: "0.5em",
59
+ letterSpacing: "-0.01em",
60
+ lineHeight: "1.5em",
61
+ },
62
+ "& img": {
63
+ marginTop: "1.7em",
64
+ marginBottom: "1.7em",
65
+ borderRadius: "lg",
66
+ boxShadow: "inset",
67
+ },
68
+ "& picture": {
69
+ marginTop: "1.7em",
70
+ marginBottom: "1.7em",
71
+ },
72
+ "& picture > img": {
73
+ marginTop: "0",
74
+ marginBottom: "0",
75
+ },
76
+ "& video": {
77
+ marginTop: "1.7em",
78
+ marginBottom: "1.7em",
79
+ },
80
+ "& kbd": {
81
+ fontSize: "0.85em",
82
+ borderRadius: "xs",
83
+ paddingTop: "0.15em",
84
+ paddingBottom: "0.15em",
85
+ paddingInlineEnd: "0.35em",
86
+ paddingInlineStart: "0.35em",
87
+ fontFamily: "inherit",
88
+ color: "fg.muted",
89
+ "--shadow": "colors.border",
90
+ boxShadow: "0 0 0 1px var(--shadow),0 1px 0 1px var(--shadow)",
91
+ },
92
+ "& code": {
93
+ fontSize: "0.925em",
94
+ letterSpacing: "-0.01em",
95
+ borderRadius: "md",
96
+ borderWidth: "1px",
97
+ padding: "0.25em",
98
+ },
99
+ "& pre code": {
100
+ fontSize: "inherit",
101
+ letterSpacing: "inherit",
102
+ borderWidth: "inherit",
103
+ padding: "0",
104
+ },
105
+ "& h2 code": {
106
+ fontSize: "0.9em",
107
+ },
108
+ "& h3 code": {
109
+ fontSize: "0.8em",
110
+ },
111
+ "& pre": {
112
+ backgroundColor: "bg.subtle",
113
+ marginTop: "1.6em",
114
+ marginBottom: "1.6em",
115
+ borderRadius: "md",
116
+ fontSize: "0.9em",
117
+ paddingTop: "0.65em",
118
+ paddingBottom: "0.65em",
119
+ paddingInlineEnd: "1em",
120
+ paddingInlineStart: "1em",
121
+ overflowX: "auto",
122
+ fontWeight: "400",
123
+ },
124
+ "& ol": {
125
+ marginTop: "1em",
126
+ marginBottom: "1em",
127
+ paddingInlineStart: "1.5em",
128
+ },
129
+ "& ul": {
130
+ marginTop: "1em",
131
+ marginBottom: "1em",
132
+ paddingInlineStart: "1.5em",
133
+ },
134
+ "& li": {
135
+ marginTop: "0.285em",
136
+ marginBottom: "0.285em",
137
+ },
138
+ "& ol > li": {
139
+ paddingInlineStart: "0.4em",
140
+ listStyleType: "decimal",
141
+ "&::marker": {
142
+ color: "fg.muted",
143
+ },
144
+ },
145
+ "& ul > li": {
146
+ paddingInlineStart: "0.4em",
147
+ listStyleType: "disc",
148
+ "&::marker": {
149
+ color: "fg.muted",
150
+ },
151
+ },
152
+ "& > ul > li p": {
153
+ marginTop: "0.5em",
154
+ marginBottom: "0.5em",
155
+ },
156
+ "& > ul > li > p:first-of-type": {
157
+ marginTop: "1em",
158
+ },
159
+ "& > ul > li > p:last-of-type": {
160
+ marginBottom: "1em",
161
+ },
162
+ "& > ol > li > p:first-of-type": {
163
+ marginTop: "1em",
164
+ },
165
+ "& > ol > li > p:last-of-type": {
166
+ marginBottom: "1em",
167
+ },
168
+ "& ul ul, ul ol, ol ul, ol ol": {
169
+ marginTop: "0.5em",
170
+ marginBottom: "0.5em",
171
+ },
172
+ "& dl": {
173
+ marginTop: "1em",
174
+ marginBottom: "1em",
175
+ },
176
+ "& dt": {
177
+ fontWeight: "600",
178
+ marginTop: "1em",
179
+ },
180
+ "& dd": {
181
+ marginTop: "0.285em",
182
+ paddingInlineStart: "1.5em",
183
+ },
184
+ "& hr": {
185
+ marginTop: "2.25em",
186
+ marginBottom: "2.25em",
187
+ },
188
+ "& :is(h1,h2,h3,h4,h5,hr) + *": {
189
+ marginTop: "0",
190
+ },
191
+ "& table": {
192
+ width: "100%",
193
+ tableLayout: "auto",
194
+ textAlign: "start",
195
+ lineHeight: "1.5em",
196
+ marginTop: "2em",
197
+ marginBottom: "2em",
198
+ },
199
+ "& thead": {
200
+ borderBottomWidth: "1px",
201
+ color: "fg",
202
+ },
203
+ "& tbody tr": {
204
+ borderBottomWidth: "1px",
205
+ borderBottomColor: "border",
206
+ },
207
+ "& thead th": {
208
+ paddingInlineEnd: "1em",
209
+ paddingBottom: "0.65em",
210
+ paddingInlineStart: "1em",
211
+ fontWeight: "medium",
212
+ textAlign: "start",
213
+ },
214
+ "& thead th:first-of-type": {
215
+ paddingInlineStart: "0",
216
+ },
217
+ "& thead th:last-of-type": {
218
+ paddingInlineEnd: "0",
219
+ },
220
+ "& tbody td, tfoot td": {
221
+ paddingTop: "0.65em",
222
+ paddingInlineEnd: "1em",
223
+ paddingBottom: "0.65em",
224
+ paddingInlineStart: "1em",
225
+ },
226
+ "& tbody td:first-of-type, tfoot td:first-of-type": {
227
+ paddingInlineStart: "0",
228
+ },
229
+ "& tbody td:last-of-type, tfoot td:last-of-type": {
230
+ paddingInlineEnd: "0",
231
+ },
232
+ "& figure": {
233
+ marginTop: "1.625em",
234
+ marginBottom: "1.625em",
235
+ },
236
+ "& figure > *": {
237
+ marginTop: "0",
238
+ marginBottom: "0",
239
+ },
240
+ "& figcaption": {
241
+ fontSize: "0.85em",
242
+ lineHeight: "1.25em",
243
+ marginTop: "0.85em",
244
+ color: "fg.muted",
245
+ },
246
+ "& h1, h2, h3, h4": {
247
+ color: "fg",
248
+ fontWeight: "600",
249
+ },
250
+ },
251
+ variants: {
252
+ size: {
253
+ md: {
254
+ fontSize: "sm",
255
+ },
256
+ lg: {
257
+ fontSize: "md",
258
+ },
259
+ },
260
+ },
261
+ defaultVariants: {
262
+ size: "md",
263
+ },
264
+ })
@@ -0,0 +1,12 @@
1
+ "use client"
2
+
3
+ import { ChakraProvider, defaultSystem } from "@chakra-ui/react"
4
+ import { ColorModeProvider } from "compositions/ui/color-mode"
5
+
6
+ export function Provider(props: React.PropsWithChildren) {
7
+ return (
8
+ <ChakraProvider value={defaultSystem}>
9
+ <ColorModeProvider>{props.children}</ColorModeProvider>
10
+ </ChakraProvider>
11
+ )
12
+ }
@@ -0,0 +1,2 @@
1
+ export { Radio, RadioGroup } from './radio'
2
+ export type { RadioProps, RadioGroupProps } from './radio'