@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,220 +0,0 @@
1
- import React, { forwardRef } from 'react'
2
-
3
- import {
4
- Avatar,
5
- type AvatarRootProps,
6
- HTMLChakraProps,
7
- type ImageProps,
8
- SlotRecipeProps,
9
- chakra,
10
- createSlotRecipeContext,
11
- } from '@chakra-ui/react'
12
- import { dataAttr } from '@saas-ui/core/utils'
13
-
14
- const {
15
- useStyles: usePersonaStyles,
16
- withProvider,
17
- withContext,
18
- } = createSlotRecipeContext({
19
- key: 'persona',
20
- })
21
-
22
- export { usePersonaStyles }
23
-
24
- export type Presence = 'online' | 'offline' | 'busy' | 'dnd' | 'away'
25
-
26
- interface PresenceConfig {
27
- label: string
28
- color: string
29
- }
30
-
31
- export type PresenceOptions<P extends string = Presence> = Record<
32
- P,
33
- PresenceConfig
34
- >
35
-
36
- /**
37
- * The presence configuration object.
38
- *
39
- * Default presence values: online, offline, busy, dnd, away
40
- *
41
- * You can overwrite colors in the theme semantic tokens.
42
- * theme.semanticTokens.colors['presence.online'] = 'cyan.500'
43
- *
44
- * Or add a custom presence value
45
- * theme.semanticTokens.colors['presence.vacay'] = 'blue.500'
46
- *
47
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
48
- */
49
- export const defaultPresenceOptions: PresenceOptions = {
50
- online: {
51
- label: 'Online',
52
- color: 'presence.online',
53
- },
54
- offline: {
55
- label: 'Offline',
56
- color: 'presence.offline',
57
- },
58
- busy: {
59
- label: 'Busy',
60
- color: 'presence.busy',
61
- },
62
- dnd: {
63
- label: 'Do-not-disturb',
64
- color: 'presence.dnd',
65
- },
66
- away: {
67
- label: 'Away',
68
- color: 'presence.away',
69
- },
70
- }
71
-
72
- export interface PersonaRootProps
73
- extends HTMLChakraProps<'div'>,
74
- SlotRecipeProps<'persona'> {
75
- /**
76
- * Indicates that a person is out of office. Changes the presence badge style.
77
- */
78
- outOfOffice?: boolean
79
- /**
80
- * The presence status of the person
81
- */
82
- presence?: Presence
83
- }
84
-
85
- /**
86
- * The root component that provides context and styles.
87
- *
88
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
89
- */
90
- export const PersonaRoot = withProvider<HTMLDivElement, PersonaRootProps>(
91
- forwardRef((props, ref) => {
92
- const { outOfOffice, presence, ...rest } = props
93
-
94
- return (
95
- <chakra.div
96
- ref={ref}
97
- {...rest}
98
- data-out-of-office={dataAttr(outOfOffice)}
99
- data-presence={presence}
100
- css={[
101
- presence
102
- ? {
103
- '--persona-presence': `colors.presence.${presence}`,
104
- }
105
- : undefined,
106
- rest.css,
107
- ]}
108
- />
109
- )
110
- }),
111
- 'root',
112
- )
113
-
114
- interface PersonaAvatarOptions {
115
- /**
116
- * The name of the person in the avatar.
117
- *
118
- * - if `src` has loaded, the name will be used as the `alt` attribute of the `img`
119
- * - If `src` is not loaded, the name will be used to create the initials
120
- */
121
- name?: string
122
- }
123
-
124
- export interface PersonaAvatarProps
125
- extends PersonaAvatarOptions,
126
- AvatarRootProps {
127
- src?: string
128
- srcSet?: string
129
- loading?: ImageProps['loading']
130
- icon?: React.ReactElement
131
- fallback?: React.ReactNode
132
- getInitials?: (name?: string | null) => string | null
133
- }
134
-
135
- /**
136
- * An avatar with optional status badge.
137
- *
138
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
139
- */
140
- export const PersonaAvatar = forwardRef<HTMLDivElement, PersonaAvatarProps>(
141
- (props, ref) => {
142
- const {
143
- name,
144
- getInitials = (name?: string | null) => name?.[0],
145
- icon,
146
- loading,
147
- onError,
148
- src,
149
- srcSet,
150
- children,
151
- ...rest
152
- } = props
153
-
154
- return (
155
- <Avatar.Root ref={ref} {...rest}>
156
- <Avatar.Fallback>{getInitials(name)}</Avatar.Fallback>
157
- <Avatar.Image
158
- src={src}
159
- srcSet={srcSet}
160
- loading={loading}
161
- onError={onError}
162
- />
163
- {children}
164
- </Avatar.Root>
165
- )
166
- },
167
- )
168
-
169
- export interface PersonaPresenceBadgeProps extends HTMLChakraProps<'span'> {}
170
-
171
- export const PersonaPresenceBadge = withContext<
172
- HTMLSpanElement,
173
- PersonaPresenceBadgeProps
174
- >('span', 'presence')
175
-
176
- export interface PersonaDetailsProps extends HTMLChakraProps<'div'> {}
177
-
178
- /**
179
- * Wrapper component for the labels.
180
- *
181
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
182
- */
183
- export const PersonaDetails = withContext<HTMLDivElement, PersonaDetailsProps>(
184
- 'div',
185
- 'details',
186
- )
187
-
188
- export interface PersonaLabelProps extends HTMLChakraProps<'span'> {}
189
-
190
- /**
191
- * The main label, usually a name.
192
- *
193
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
194
- */
195
- export const PersonaLabel = withContext<HTMLSpanElement, PersonaLabelProps>(
196
- 'span',
197
- 'label',
198
- )
199
-
200
- PersonaLabel.displayName = 'PersonaLabel'
201
-
202
- /**
203
- * The secondary label, usually the role of a person.
204
- *
205
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
206
- */
207
- export const PersonaSecondaryLabel = withContext<
208
- HTMLSpanElement,
209
- PersonaLabelProps
210
- >('span', 'secondaryLabel')
211
-
212
- /**
213
- * The tertiary label, typically a status message.
214
- *
215
- * @see Docs https://saas-ui.dev/docs/components/data-display/persona
216
- */
217
- export const PersonaTertiaryLabel = withContext<
218
- HTMLSpanElement,
219
- PersonaLabelProps
220
- >('span', 'tertiaryLabel')
@@ -1,94 +0,0 @@
1
- import { defineSlotRecipe, defineStyle } from '@chakra-ui/react'
2
-
3
- const baseStyleLabel = defineStyle({
4
- overflow: 'hidden',
5
- whiteSpace: 'nowrap',
6
- textOverflow: 'ellipsis',
7
- minW: 0,
8
- })
9
-
10
- export const personaSlotRecipe = defineSlotRecipe({
11
- className: 'sui-persona',
12
- slots: [
13
- 'root',
14
- 'avatar',
15
- 'presence',
16
- 'details',
17
- 'label',
18
- 'secondaryLabel',
19
- 'tertiaryLabel',
20
- ],
21
- base: {
22
- root: {
23
- display: 'flex',
24
- flexDirection: 'row',
25
- alignItems: 'center',
26
- },
27
- presence: {
28
- display: 'flex',
29
- alignItems: 'center',
30
- justifyContent: 'center',
31
- position: 'absolute',
32
- bottom: 0,
33
- right: 0,
34
- boxSize: '1em',
35
- transform: 'translate(15%, 15%)',
36
- borderWidth: '0.15em',
37
- borderRadius: '50%',
38
- borderColor: 'bg.panel',
39
- bg: 'var(--persona-presence)',
40
- },
41
- details: {
42
- display: 'flex',
43
- flexDirection: 'column',
44
- minW: 0,
45
- lineHeight: 'short',
46
- },
47
- label: baseStyleLabel,
48
- secondaryLabel: {
49
- ...baseStyleLabel,
50
- color: 'fg.muted',
51
- },
52
- tertiaryLabel: {
53
- ...baseStyleLabel,
54
- color: 'fg.muted',
55
- },
56
- },
57
- variants: {
58
- size: {
59
- xs: {
60
- details: { ms: 2 },
61
- label: { fontSize: 'xs' },
62
- secondaryLabel: { display: 'none' },
63
- tertiaryLabel: { display: 'none' },
64
- },
65
- sm: {
66
- details: { ms: 2 },
67
- label: { fontSize: 'sm' },
68
- secondaryLabel: { fontSize: 'xs' },
69
- tertiaryLabel: { display: 'none' },
70
- },
71
- md: {
72
- details: { ms: 2 },
73
- label: { fontSize: 'sm' },
74
- secondaryLabel: { fontSize: 'xs' },
75
- tertiaryLabel: { display: 'none' },
76
- },
77
- lg: {
78
- details: { ms: 3 },
79
- label: { fontSize: 'md' },
80
- secondaryLabel: { fontSize: 'sm' },
81
- tertiaryLabel: { fontSize: 'sm' },
82
- },
83
- xl: {
84
- details: { ms: 4 },
85
- label: { fontSize: 'lg' },
86
- secondaryLabel: { fontSize: 'md' },
87
- tertiaryLabel: { fontSize: 'md' },
88
- },
89
- },
90
- },
91
- defaultVariants: {
92
- size: 'md',
93
- },
94
- })
@@ -1,101 +0,0 @@
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
- )
@@ -1,142 +0,0 @@
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
- {...rest}
92
- >
93
- <PersonaPrimitive.Avatar
94
- name={name}
95
- size={size}
96
- getInitials={getInitials}
97
- icon={icon}
98
- loading={loading}
99
- onError={onError}
100
- src={src}
101
- srcSet={srcSet}
102
- >
103
- <PersonaPrimitive.PresenceBadge>
104
- {presenceIcon}
105
- </PersonaPrimitive.PresenceBadge>
106
- </PersonaPrimitive.Avatar>
107
-
108
- {!hideDetails && (
109
- <PersonaPrimitive.Details>
110
- <PersonaPrimitive.Label>{label || name}</PersonaPrimitive.Label>
111
- {secondaryLabel && (
112
- <PersonaPrimitive.SecondaryLabel>
113
- {secondaryLabel}
114
- </PersonaPrimitive.SecondaryLabel>
115
- )}
116
- {tertiaryLabel && (
117
- <PersonaPrimitive.TertiaryLabel>
118
- {tertiaryLabel}
119
- </PersonaPrimitive.TertiaryLabel>
120
- )}
121
- {children}
122
- </PersonaPrimitive.Details>
123
- )}
124
- </PersonaPrimitive.Root>
125
- )
126
- },
127
- )
128
-
129
- Persona.displayName = 'Persona'
130
-
131
- export interface PersonaAvatarProps
132
- extends Omit<
133
- PersonaProps,
134
- 'hideDetails' | 'label' | 'secondaryLabel' | 'tertiaryLabel' | 'children'
135
- > {}
136
-
137
- export const PersonaAvatar = React.forwardRef<
138
- HTMLDivElement,
139
- PersonaAvatarProps
140
- >(function PersonaAvatar(props, ref) {
141
- return <Persona ref={ref} {...props} hideDetails />
142
- })
@@ -1,2 +0,0 @@
1
- export { PinInput } from './pin-input.tsx'
2
- export type { PinInputProps } from './pin-input.tsx'
@@ -1,36 +0,0 @@
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
- )
@@ -1,2 +0,0 @@
1
- export { Radio, RadioGroup } from './radio'
2
- export type { RadioProps, RadioGroupProps } from './radio'
@@ -1,27 +0,0 @@
1
- import { forwardRef } from 'react'
2
-
3
- import { RadioGroup as ChakraRadioGroup } from '@chakra-ui/react'
4
-
5
- export interface RadioProps extends ChakraRadioGroup.ItemProps {
6
- rootRef?: React.Ref<HTMLDivElement>
7
- inputProps?: React.InputHTMLAttributes<HTMLInputElement>
8
- }
9
-
10
- export const Radio = forwardRef<HTMLInputElement, RadioProps>(
11
- function Radio(props, ref) {
12
- const { children, inputProps, rootRef, ...rest } = props
13
- return (
14
- <ChakraRadioGroup.Item ref={rootRef} {...rest}>
15
- <ChakraRadioGroup.ItemHiddenInput ref={ref} {...inputProps} />
16
- <ChakraRadioGroup.ItemIndicator />
17
- {children && (
18
- <ChakraRadioGroup.ItemText>{children}</ChakraRadioGroup.ItemText>
19
- )}
20
- </ChakraRadioGroup.Item>
21
- )
22
- },
23
- )
24
-
25
- export type RadioGroupProps = ChakraRadioGroup.RootProps
26
-
27
- export const RadioGroup = ChakraRadioGroup.Root
@@ -1,2 +0,0 @@
1
- export { SearchInput } from './search-input.tsx'
2
- export type { SearchInputProps } from './search-input.tsx'
@@ -1,63 +0,0 @@
1
- import React, { useState } from 'react'
2
-
3
- import { Container, Stack } from '@chakra-ui/react'
4
- import { StoryObj } from '@storybook/react'
5
- import { RiCloseLine, RiSearch2Line } from 'react-icons/ri'
6
-
7
- import { SearchInput, SearchInputProps } from './search-input'
8
-
9
- export default {
10
- title: 'Components/SearchInput',
11
- component: SearchInput,
12
- decorators: [
13
- (Story: any) => (
14
- <Container mt="40px">
15
- <Story />
16
- </Container>
17
- ),
18
- ],
19
- }
20
-
21
- type Story = StoryObj<SearchInputProps>
22
-
23
- export const Basic: Story = {}
24
-
25
- export const Sizes: Story = {
26
- render: () => {
27
- return (
28
- <Stack>
29
- <SearchInput size="lg" />
30
- <SearchInput size="md" />
31
- <SearchInput size="sm" />
32
- <SearchInput size="xs" />
33
- </Stack>
34
- )
35
- },
36
- }
37
-
38
- export const Disabled: Story = {
39
- args: {
40
- disabled: true,
41
- },
42
- }
43
-
44
- export const CustomIcons: Story = {
45
- args: {
46
- icon: <RiSearch2Line />,
47
- resetIcon: <RiCloseLine />,
48
- },
49
- }
50
-
51
- export const Controlled: Story = {
52
- render: (props: any) => {
53
- const [value, setValue] = useState('')
54
- return (
55
- <SearchInput
56
- value={value}
57
- onChange={({ target }) => setValue(target.value)}
58
- onReset={() => setValue('')}
59
- {...props}
60
- />
61
- )
62
- },
63
- }