@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.
- package/CHANGELOG.md +12 -0
- package/dist/components/app-shell/index.d.cts +1 -1
- package/dist/components/app-shell/index.d.ts +1 -1
- package/dist/components/navbar/index.d.cts +3 -3
- package/dist/components/navbar/index.d.ts +3 -3
- package/dist/components/persona/index.d.cts +1 -1
- package/dist/components/persona/index.d.ts +1 -1
- package/dist/components/sidebar/index.d.cts +12 -12
- package/dist/components/sidebar/index.d.ts +12 -12
- package/dist/index.cjs +2 -12
- package/dist/index.js +2 -12
- package/package.json +4 -6
- package/src/components/app-shell/app-shell.recipe.ts +0 -52
- package/src/components/app-shell/app-shell.stories.tsx +0 -51
- package/src/components/app-shell/app-shell.tsx +0 -94
- package/src/components/app-shell/index.ts +0 -3
- package/src/components/breadcrumbs/breadcrumb.stories.tsx +0 -17
- package/src/components/breadcrumbs/breadcrumb.tsx +0 -36
- package/src/components/breadcrumbs/index.ts +0 -1
- package/src/components/breadcrumbs/namespace.ts +0 -8
- package/src/components/button/button.recipe.ts +0 -182
- package/src/components/button/button.stories.tsx +0 -99
- package/src/components/button/button.tsx +0 -55
- package/src/components/button/index.ts +0 -2
- package/src/components/checkbox/checkbox.tsx +0 -26
- package/src/components/checkbox/index.ts +0 -2
- package/src/components/close-button/close-button.stories.tsx +0 -12
- package/src/components/close-button/close-button.tsx +0 -18
- package/src/components/close-button/index.ts +0 -2
- package/src/components/command/command.recipe.ts +0 -17
- package/src/components/command/command.stories.tsx +0 -47
- package/src/components/command/command.tsx +0 -50
- package/src/components/command/index.ts +0 -1
- package/src/components/dialog/dialog.tsx +0 -67
- package/src/components/dialog/index.ts +0 -1
- package/src/components/dialog/namespace.ts +0 -18
- package/src/components/drawer/drawer.tsx +0 -57
- package/src/components/drawer/index.ts +0 -3
- package/src/components/drawer/namespace.ts +0 -19
- package/src/components/grid-list/grid-list.recipe.ts +0 -113
- package/src/components/icon-badge/icon-badge.recipe.ts +0 -57
- package/src/components/icon-badge/icon-badge.stories.tsx +0 -38
- package/src/components/icon-badge/icon-badge.tsx +0 -59
- package/src/components/icon-badge/index.ts +0 -2
- package/src/components/icons/create-icon.tsx +0 -41
- package/src/components/icons/icons.tsx +0 -119
- package/src/components/icons/index.ts +0 -1
- package/src/components/input-group/index.ts +0 -1
- package/src/components/input-group/input-group.tsx +0 -46
- package/src/components/link/index.ts +0 -2
- package/src/components/link/link.stories.tsx +0 -17
- package/src/components/link/link.test.tsx +0 -33
- package/src/components/link/link.tsx +0 -27
- package/src/components/loading-overlay/index.ts +0 -1
- package/src/components/loading-overlay/loading-overlay.recipe.ts +0 -61
- package/src/components/loading-overlay/loading-overlay.stories.tsx +0 -68
- package/src/components/loading-overlay/loading-overlay.tsx +0 -54
- package/src/components/loading-overlay/namespace.ts +0 -7
- package/src/components/navbar/index.ts +0 -1
- package/src/components/navbar/namespace.ts +0 -9
- package/src/components/navbar/navbar.recipe.ts +0 -109
- package/src/components/navbar/navbar.stories.tsx +0 -435
- package/src/components/navbar/navbar.test.tsx +0 -49
- package/src/components/navbar/navbar.tsx +0 -39
- package/src/components/number-input/index.ts +0 -2
- package/src/components/number-input/number-input.tsx +0 -41
- package/src/components/password-input/index.ts +0 -2
- package/src/components/password-input/password-input.tsx +0 -93
- package/src/components/persona/index.ts +0 -2
- package/src/components/persona/namespace.ts +0 -18
- package/src/components/persona/persona-primitive.tsx +0 -220
- package/src/components/persona/persona.recipe.ts +0 -94
- package/src/components/persona/persona.stories.tsx +0 -101
- package/src/components/persona/persona.tsx +0 -142
- package/src/components/pin-input/index.ts +0 -2
- package/src/components/pin-input/pin-input.tsx +0 -36
- package/src/components/radio/index.ts +0 -2
- package/src/components/radio/radio.tsx +0 -27
- package/src/components/search-input/index.ts +0 -2
- package/src/components/search-input/search-input.stories.tsx +0 -63
- package/src/components/search-input/search-input.tsx +0 -134
- package/src/components/select/index.ts +0 -1
- package/src/components/select/namespace.ts +0 -18
- package/src/components/select/select.tsx +0 -135
- package/src/components/sidebar/index.ts +0 -7
- package/src/components/sidebar/namespace.ts +0 -27
- package/src/components/sidebar/sidebar-item.recipe.ts +0 -65
- package/src/components/sidebar/sidebar.recipe.ts +0 -237
- package/src/components/sidebar/sidebar.stories.tsx +0 -903
- package/src/components/sidebar/sidebar.tsx +0 -208
- package/src/components/spinner/index.ts +0 -2
- package/src/components/spinner/spinner.stories.tsx +0 -19
- package/src/components/spinner/spinner.tsx +0 -21
- package/src/components/steps/index.ts +0 -1
- package/src/components/steps/namespace.ts +0 -16
- package/src/components/steps/steps.tsx +0 -82
- package/src/components/switch/index.ts +0 -3
- package/src/components/switch/switch.tsx +0 -39
- package/src/compositions/accordion.tsx +0 -47
- package/src/compositions/action-bar.tsx +0 -40
- package/src/compositions/alert.tsx +0 -51
- package/src/compositions/avatar.tsx +0 -74
- package/src/compositions/blockquote.tsx +0 -31
- package/src/compositions/checkbox-card.tsx +0 -57
- package/src/compositions/checkbox.tsx +0 -25
- package/src/compositions/clipboard.tsx +0 -107
- package/src/compositions/color-mode.tsx +0 -65
- package/src/compositions/data-list.tsx +0 -37
- package/src/compositions/empty-state.tsx +0 -34
- package/src/compositions/field.tsx +0 -33
- package/src/compositions/file-button.tsx +0 -166
- package/src/compositions/hover-card.tsx +0 -35
- package/src/compositions/link-button.tsx +0 -12
- package/src/compositions/menu.tsx +0 -108
- package/src/compositions/native-select.tsx +0 -57
- package/src/compositions/pagination.tsx +0 -207
- package/src/compositions/popover.tsx +0 -58
- package/src/compositions/progress-circle.tsx +0 -37
- package/src/compositions/progress.tsx +0 -40
- package/src/compositions/prose.tsx +0 -264
- package/src/compositions/provider.tsx +0 -12
- package/src/compositions/radio-card.tsx +0 -57
- package/src/compositions/radio.tsx +0 -24
- package/src/compositions/rating.tsx +0 -27
- package/src/compositions/segmented-control.tsx +0 -47
- package/src/compositions/skeleton.tsx +0 -44
- package/src/compositions/slider.tsx +0 -53
- package/src/compositions/stat.tsx +0 -75
- package/src/compositions/status.tsx +0 -29
- package/src/compositions/stepper-input.tsx +0 -49
- package/src/compositions/tag.tsx +0 -39
- package/src/compositions/timeline.tsx +0 -17
- package/src/compositions/toaster.tsx +0 -43
- package/src/compositions/toggle-tip.tsx +0 -62
- package/src/compositions/tooltip.tsx +0 -46
- package/src/index.ts +0 -7
- package/src/preset.ts +0 -9
- package/src/provider/index.ts +0 -4
- package/src/provider/sui-provider.tsx +0 -34
- package/src/provider/use-link.test.tsx +0 -60
- package/src/provider/use-link.tsx +0 -13
- package/src/styled-system/create-recipe-context.tsx +0 -91
- package/src/styled-system/create-slot-recipe-context.tsx +0 -188
- package/src/styled-system/empty.ts +0 -7
- package/src/styled-system/factory.types.ts +0 -11
- package/src/theme/animation-styles.ts +0 -53
- package/src/theme/breakpoints.ts +0 -11
- package/src/theme/conditions.ts +0 -26
- package/src/theme/fluid-font-sizes.ts +0 -65
- package/src/theme/global-css.ts +0 -94
- package/src/theme/index.ts +0 -72
- package/src/theme/layer-styles.ts +0 -116
- package/src/theme/recipes/chakra/accordion.ts +0 -145
- package/src/theme/recipes/chakra/action-bar.ts +0 -62
- package/src/theme/recipes/chakra/alert.ts +0 -157
- package/src/theme/recipes/chakra/avatar.ts +0 -141
- package/src/theme/recipes/chakra/badge.ts +0 -67
- package/src/theme/recipes/chakra/blockquote.ts +0 -83
- package/src/theme/recipes/chakra/breadcrumb.ts +0 -94
- package/src/theme/recipes/chakra/card.ts +0 -99
- package/src/theme/recipes/chakra/checkbox-card.ts +0 -212
- package/src/theme/recipes/chakra/checkbox.ts +0 -70
- package/src/theme/recipes/chakra/checkmark.ts +0 -83
- package/src/theme/recipes/chakra/code.ts +0 -17
- package/src/theme/recipes/chakra/collapsible.ts +0 -20
- package/src/theme/recipes/chakra/container.ts +0 -26
- package/src/theme/recipes/chakra/data-list.ts +0 -80
- package/src/theme/recipes/chakra/dialog.ts +0 -225
- package/src/theme/recipes/chakra/drawer.ts +0 -201
- package/src/theme/recipes/chakra/editable.ts +0 -88
- package/src/theme/recipes/chakra/empty-state.ts +0 -88
- package/src/theme/recipes/chakra/field.ts +0 -68
- package/src/theme/recipes/chakra/fieldset.ts +0 -62
- package/src/theme/recipes/chakra/file-upload.ts +0 -96
- package/src/theme/recipes/chakra/heading.ts +0 -27
- package/src/theme/recipes/chakra/hover-card.ts +0 -68
- package/src/theme/recipes/chakra/icon.ts +0 -30
- package/src/theme/recipes/chakra/input-addon.ts +0 -40
- package/src/theme/recipes/chakra/input.ts +0 -96
- package/src/theme/recipes/chakra/kbd.ts +0 -60
- package/src/theme/recipes/chakra/link.ts +0 -37
- package/src/theme/recipes/chakra/list.ts +0 -67
- package/src/theme/recipes/chakra/mark.ts +0 -27
- package/src/theme/recipes/chakra/menu.ts +0 -124
- package/src/theme/recipes/chakra/native-select.ts +0 -140
- package/src/theme/recipes/chakra/number-input.ts +0 -115
- package/src/theme/recipes/chakra/pin-input.ts +0 -27
- package/src/theme/recipes/chakra/popover.ts +0 -86
- package/src/theme/recipes/chakra/progress-circle.ts +0 -94
- package/src/theme/recipes/chakra/progress.ts +0 -127
- package/src/theme/recipes/chakra/radio-card.ts +0 -220
- package/src/theme/recipes/chakra/radio-group.ts +0 -72
- package/src/theme/recipes/chakra/radiomark.ts +0 -107
- package/src/theme/recipes/chakra/rating-group.ts +0 -94
- package/src/theme/recipes/chakra/segment-group.ts +0 -117
- package/src/theme/recipes/chakra/select.ts +0 -282
- package/src/theme/recipes/chakra/separator.ts +0 -51
- package/src/theme/recipes/chakra/skeleton.ts +0 -53
- package/src/theme/recipes/chakra/skip-nav-link.ts +0 -34
- package/src/theme/recipes/chakra/slider.ts +0 -178
- package/src/theme/recipes/chakra/spinner.ts +0 -32
- package/src/theme/recipes/chakra/stat.ts +0 -79
- package/src/theme/recipes/chakra/status.ts +0 -48
- package/src/theme/recipes/chakra/steps.ts +0 -218
- package/src/theme/recipes/chakra/switch.ts +0 -167
- package/src/theme/recipes/chakra/table.ts +0 -172
- package/src/theme/recipes/chakra/tabs.ts +0 -280
- package/src/theme/recipes/chakra/tag.ts +0 -131
- package/src/theme/recipes/chakra/textarea.ts +0 -88
- package/src/theme/recipes/chakra/timeline.ts +0 -138
- package/src/theme/recipes/chakra/toast.ts +0 -96
- package/src/theme/recipes/chakra/tooltip.ts +0 -40
- package/src/theme/recipes.ts +0 -46
- package/src/theme/semantic-tokens/colors.ts +0 -403
- package/src/theme/semantic-tokens/radii.ts +0 -7
- package/src/theme/semantic-tokens/shadows.ts +0 -52
- package/src/theme/slot-recipes.ts +0 -104
- package/src/theme/text-styles.ts +0 -39
- package/src/theme/tokens/animations.ts +0 -8
- package/src/theme/tokens/aspect-ratios.ts +0 -10
- package/src/theme/tokens/blurs.ts +0 -12
- package/src/theme/tokens/borders.ts +0 -9
- package/src/theme/tokens/colors.ts +0 -177
- package/src/theme/tokens/cursor.ts +0 -12
- package/src/theme/tokens/durations.ts +0 -11
- package/src/theme/tokens/easings.ts +0 -10
- package/src/theme/tokens/font-sizes.ts +0 -20
- package/src/theme/tokens/font-weights.ts +0 -13
- package/src/theme/tokens/fonts.ts +0 -15
- package/src/theme/tokens/keyframes.ts +0 -173
- package/src/theme/tokens/letter-spacing.ts +0 -9
- package/src/theme/tokens/line-heights.ts +0 -19
- package/src/theme/tokens/radius.ts +0 -18
- package/src/theme/tokens/sizes.ts +0 -71
- package/src/theme/tokens/spacing.ts +0 -38
- package/src/theme/tokens/z-indices.ts +0 -34
- 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,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,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,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
|
-
}
|