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

Sign up to get free protection for your applications and to get access to all the features.
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
- }