@saas-ui/react 2.11.2 → 3.0.0-alpha.1
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 +13 -148
- package/dist/chunk-32JGENDB.js +19 -0
- package/dist/chunk-FZW2DYK3.js +19 -0
- package/dist/chunk-KHRLZUV4.js +35 -0
- package/dist/chunk-KTLWEUNW.js +1 -0
- package/dist/chunk-PKI6YH2V.js +31 -0
- package/dist/chunk-RTMS5TJN.js +10 -0
- package/dist/chunk-VBIVLREP.js +45 -0
- package/dist/chunk-VDXTEASE.js +117 -0
- package/dist/components/app-shell/index.cjs +68 -0
- package/dist/components/app-shell/index.d.cts +30 -0
- package/dist/components/app-shell/index.d.ts +30 -0
- package/dist/components/app-shell/index.js +45 -0
- package/dist/components/breadcrumbs/index.cjs +60 -0
- package/dist/components/breadcrumbs/index.d.cts +18 -0
- package/dist/components/breadcrumbs/index.d.ts +18 -0
- package/dist/components/breadcrumbs/index.js +37 -0
- package/dist/components/button/index.cjs +65 -0
- package/dist/components/button/index.d.cts +12 -0
- package/dist/components/button/index.d.ts +12 -0
- package/dist/components/button/index.js +45 -0
- package/dist/components/checkbox/index.cjs +45 -0
- package/dist/components/checkbox/index.d.cts +11 -0
- package/dist/components/checkbox/index.d.ts +11 -0
- package/dist/components/checkbox/index.js +20 -0
- package/dist/components/close-button/index.cjs +142 -0
- package/dist/components/close-button/index.d.cts +8 -0
- package/dist/components/close-button/index.d.ts +8 -0
- package/dist/components/close-button/index.js +9 -0
- package/dist/components/command/index.cjs +56 -0
- package/dist/components/command/index.d.cts +6 -0
- package/dist/components/command/index.d.ts +6 -0
- package/dist/components/command/index.js +33 -0
- package/dist/components/dialog/index.cjs +243 -0
- package/dist/components/dialog/index.d.cts +27 -0
- package/dist/components/dialog/index.d.ts +27 -0
- package/dist/components/dialog/index.js +73 -0
- package/dist/components/drawer/index.cjs +237 -0
- package/dist/components/drawer/index.d.cts +28 -0
- package/dist/components/drawer/index.d.ts +28 -0
- package/dist/components/drawer/index.js +65 -0
- package/dist/components/icon-badge/index.cjs +70 -0
- package/dist/components/icon-badge/index.d.cts +16 -0
- package/dist/components/icon-badge/index.d.ts +16 -0
- package/dist/components/icon-badge/index.js +38 -0
- package/dist/components/icons/index.cjs +155 -0
- package/dist/components/icons/index.d.cts +19 -0
- package/dist/components/icons/index.d.ts +19 -0
- package/dist/components/icons/index.js +35 -0
- package/dist/components/input-group/index.cjs +56 -0
- package/dist/components/input-group/index.d.cts +13 -0
- package/dist/components/input-group/index.d.ts +13 -0
- package/dist/components/input-group/index.js +8 -0
- package/dist/components/link/index.cjs +71 -0
- package/dist/components/link/index.d.cts +13 -0
- package/dist/components/link/index.d.ts +13 -0
- package/dist/components/link/index.js +20 -0
- package/dist/components/loading-overlay/index.cjs +1921 -0
- package/dist/components/loading-overlay/index.d.cts +13 -0
- package/dist/components/loading-overlay/index.d.ts +13 -0
- package/dist/components/loading-overlay/index.js +1878 -0
- package/dist/components/navbar/index.cjs +65 -0
- package/dist/components/navbar/index.d.cts +18 -0
- package/dist/components/navbar/index.d.ts +18 -0
- package/dist/components/navbar/index.js +42 -0
- package/dist/components/number-input/index.cjs +82 -0
- package/dist/components/number-input/index.d.cts +13 -0
- package/dist/components/number-input/index.d.ts +13 -0
- package/dist/components/number-input/index.js +32 -0
- package/dist/components/password-input/index.cjs +284 -0
- package/dist/components/password-input/index.d.cts +18 -0
- package/dist/components/password-input/index.d.ts +18 -0
- package/dist/components/password-input/index.js +231 -0
- package/dist/components/persona/index.cjs +181 -0
- package/dist/components/persona/index.d.cts +93 -0
- package/dist/components/persona/index.d.ts +93 -0
- package/dist/components/persona/index.js +149 -0
- package/dist/components/pin-input/index.cjs +51 -0
- package/dist/components/pin-input/index.d.cts +12 -0
- package/dist/components/pin-input/index.d.ts +12 -0
- package/dist/components/pin-input/index.js +26 -0
- package/dist/components/radio/index.cjs +48 -0
- package/dist/components/radio/index.d.cts +12 -0
- package/dist/components/radio/index.d.ts +12 -0
- package/dist/components/radio/index.js +22 -0
- package/dist/components/search-input/index.cjs +244 -0
- package/dist/components/search-input/index.d.cts +15 -0
- package/dist/components/search-input/index.d.ts +15 -0
- package/dist/components/search-input/index.js +120 -0
- package/dist/components/select/index.cjs +233 -0
- package/dist/components/select/index.d.cts +32 -0
- package/dist/components/select/index.d.ts +32 -0
- package/dist/components/select/index.js +100 -0
- package/dist/components/sidebar/index.cjs +134 -0
- package/dist/components/sidebar/index.d.cts +85 -0
- package/dist/components/sidebar/index.d.ts +85 -0
- package/dist/components/sidebar/index.js +108 -0
- package/dist/components/spinner/index.cjs +44 -0
- package/dist/components/spinner/index.d.cts +10 -0
- package/dist/components/spinner/index.d.ts +10 -0
- package/dist/components/spinner/index.js +8 -0
- package/dist/components/steps/index.cjs +191 -0
- package/dist/components/steps/index.d.cts +31 -0
- package/dist/components/steps/index.d.ts +31 -0
- package/dist/components/steps/index.js +71 -0
- package/dist/components/switch/index.cjs +48 -0
- package/dist/components/switch/index.d.cts +18 -0
- package/dist/components/switch/index.d.ts +18 -0
- package/dist/components/switch/index.js +23 -0
- package/dist/index.cjs +8460 -0
- package/dist/index.d.cts +26 -0
- package/dist/index.d.ts +25 -7
- package/dist/index.js +8395 -36
- package/package.json +26 -22
- package/src/components/app-shell/app-shell.recipe.ts +52 -0
- package/src/components/app-shell/app-shell.stories.tsx +51 -0
- package/src/components/app-shell/app-shell.tsx +94 -0
- package/src/components/app-shell/index.ts +3 -0
- package/src/components/breadcrumbs/breadcrumb.stories.tsx +17 -0
- package/src/components/breadcrumbs/breadcrumb.tsx +36 -0
- package/src/components/breadcrumbs/index.ts +1 -0
- package/src/components/breadcrumbs/namespace.ts +8 -0
- package/src/components/button/button.recipe.ts +182 -0
- package/src/components/button/button.stories.tsx +99 -0
- package/src/components/button/button.tsx +55 -0
- package/src/components/button/index.ts +2 -0
- package/src/components/checkbox/checkbox.tsx +26 -0
- package/src/components/checkbox/index.ts +2 -0
- package/src/components/close-button/close-button.stories.tsx +12 -0
- package/src/components/close-button/close-button.tsx +18 -0
- package/src/components/close-button/index.ts +2 -0
- package/src/components/command/command.recipe.ts +17 -0
- package/src/components/command/command.stories.tsx +47 -0
- package/src/components/command/command.tsx +50 -0
- package/src/components/command/index.ts +1 -0
- package/src/components/dialog/dialog.tsx +67 -0
- package/src/components/dialog/index.ts +1 -0
- package/src/components/dialog/namespace.ts +18 -0
- package/src/components/drawer/drawer.tsx +57 -0
- package/src/components/drawer/index.ts +3 -0
- package/src/components/drawer/namespace.ts +19 -0
- package/src/components/grid-list/grid-list.recipe.ts +113 -0
- package/src/components/icon-badge/icon-badge.recipe.ts +57 -0
- package/src/components/icon-badge/icon-badge.stories.tsx +38 -0
- package/src/components/icon-badge/icon-badge.tsx +59 -0
- package/src/components/icon-badge/index.ts +2 -0
- package/src/components/icons/create-icon.tsx +41 -0
- package/src/components/icons/icons.tsx +119 -0
- package/src/components/icons/index.ts +1 -0
- package/src/components/input-group/index.ts +1 -0
- package/src/components/input-group/input-group.tsx +46 -0
- package/src/components/link/index.ts +2 -0
- package/src/components/link/link.stories.tsx +17 -0
- package/src/components/link/link.test.tsx +33 -0
- package/src/components/link/link.tsx +27 -0
- package/src/components/loading-overlay/index.ts +1 -0
- package/src/components/loading-overlay/loading-overlay.recipe.ts +61 -0
- package/src/components/loading-overlay/loading-overlay.stories.tsx +68 -0
- package/src/components/loading-overlay/loading-overlay.tsx +54 -0
- package/src/components/loading-overlay/namespace.ts +7 -0
- package/src/components/navbar/index.ts +1 -0
- package/src/components/navbar/namespace.ts +9 -0
- package/src/components/navbar/navbar.recipe.ts +109 -0
- package/src/components/navbar/navbar.stories.tsx +435 -0
- package/src/components/navbar/navbar.test.tsx +49 -0
- package/src/components/navbar/navbar.tsx +39 -0
- package/src/components/number-input/index.ts +2 -0
- package/src/components/number-input/number-input.tsx +41 -0
- package/src/components/password-input/index.ts +2 -0
- package/src/components/password-input/password-input.tsx +93 -0
- package/src/components/persona/index.ts +2 -0
- package/src/components/persona/namespace.ts +18 -0
- package/src/components/persona/persona-primitive.tsx +220 -0
- package/src/components/persona/persona.recipe.ts +94 -0
- package/src/components/persona/persona.stories.tsx +101 -0
- package/src/components/persona/persona.tsx +142 -0
- package/src/components/pin-input/index.ts +2 -0
- package/src/components/pin-input/pin-input.tsx +36 -0
- package/src/components/radio/index.ts +2 -0
- package/src/components/radio/radio.tsx +27 -0
- package/src/components/search-input/index.ts +2 -0
- package/src/components/search-input/search-input.stories.tsx +63 -0
- package/src/components/search-input/search-input.tsx +134 -0
- package/src/components/select/index.ts +1 -0
- package/src/components/select/namespace.ts +18 -0
- package/src/components/select/select.tsx +135 -0
- package/src/components/sidebar/index.ts +7 -0
- package/src/components/sidebar/namespace.ts +27 -0
- package/src/components/sidebar/sidebar-item.recipe.ts +65 -0
- package/src/components/sidebar/sidebar.recipe.ts +237 -0
- package/src/components/sidebar/sidebar.stories.tsx +903 -0
- package/src/components/sidebar/sidebar.tsx +208 -0
- package/src/components/spinner/index.ts +2 -0
- package/src/components/spinner/spinner.stories.tsx +19 -0
- package/src/components/spinner/spinner.tsx +21 -0
- package/src/components/steps/index.ts +1 -0
- package/src/components/steps/namespace.ts +16 -0
- package/src/components/steps/steps.tsx +82 -0
- package/src/components/switch/index.ts +3 -0
- package/src/components/switch/switch.tsx +39 -0
- package/src/compositions/accordion.tsx +47 -0
- package/src/compositions/action-bar.tsx +40 -0
- package/src/compositions/alert.tsx +51 -0
- package/src/compositions/avatar.tsx +74 -0
- package/src/compositions/blockquote.tsx +31 -0
- package/src/compositions/checkbox-card.tsx +57 -0
- package/src/compositions/checkbox.tsx +25 -0
- package/src/compositions/clipboard.tsx +107 -0
- package/src/compositions/color-mode.tsx +65 -0
- package/src/compositions/data-list.tsx +37 -0
- package/src/compositions/empty-state.tsx +34 -0
- package/src/compositions/field.tsx +33 -0
- package/src/compositions/file-button.tsx +166 -0
- package/src/compositions/hover-card.tsx +35 -0
- package/src/compositions/link-button.tsx +12 -0
- package/src/compositions/menu.tsx +108 -0
- package/src/compositions/native-select.tsx +57 -0
- package/src/compositions/pagination.tsx +207 -0
- package/src/compositions/popover.tsx +58 -0
- package/src/compositions/progress-circle.tsx +37 -0
- package/src/compositions/progress.tsx +40 -0
- package/src/compositions/prose.tsx +264 -0
- package/src/compositions/provider.tsx +12 -0
- package/src/compositions/radio-card.tsx +57 -0
- package/src/compositions/radio.tsx +24 -0
- package/src/compositions/rating.tsx +27 -0
- package/src/compositions/segmented-control.tsx +47 -0
- package/src/compositions/skeleton.tsx +44 -0
- package/src/compositions/slider.tsx +53 -0
- package/src/compositions/stat.tsx +75 -0
- package/src/compositions/status.tsx +29 -0
- package/src/compositions/stepper-input.tsx +49 -0
- package/src/compositions/tag.tsx +39 -0
- package/src/compositions/timeline.tsx +17 -0
- package/src/compositions/toaster.tsx +43 -0
- package/src/compositions/toggle-tip.tsx +62 -0
- package/src/compositions/tooltip.tsx +46 -0
- package/src/index.ts +6 -7
- package/src/preset.ts +9 -0
- package/src/provider/index.ts +4 -0
- package/src/provider/sui-provider.tsx +34 -0
- package/src/provider/use-link.test.tsx +60 -0
- package/src/provider/use-link.tsx +13 -0
- package/src/styled-system/create-recipe-context.tsx +91 -0
- package/src/styled-system/create-slot-recipe-context.tsx +188 -0
- package/src/styled-system/empty.ts +7 -0
- package/src/styled-system/factory.types.ts +11 -0
- package/src/theme/animation-styles.ts +53 -0
- package/src/theme/breakpoints.ts +11 -0
- package/src/theme/conditions.ts +26 -0
- package/src/theme/fluid-font-sizes.ts +65 -0
- package/src/theme/global-css.ts +94 -0
- package/src/theme/index.ts +72 -0
- package/src/theme/layer-styles.ts +116 -0
- package/src/theme/recipes/chakra/accordion.ts +145 -0
- package/src/theme/recipes/chakra/action-bar.ts +62 -0
- package/src/theme/recipes/chakra/alert.ts +157 -0
- package/src/theme/recipes/chakra/avatar.ts +141 -0
- package/src/theme/recipes/chakra/badge.ts +67 -0
- package/src/theme/recipes/chakra/blockquote.ts +83 -0
- package/src/theme/recipes/chakra/breadcrumb.ts +94 -0
- package/src/theme/recipes/chakra/card.ts +99 -0
- package/src/theme/recipes/chakra/checkbox-card.ts +212 -0
- package/src/theme/recipes/chakra/checkbox.ts +70 -0
- package/src/theme/recipes/chakra/checkmark.ts +83 -0
- package/src/theme/recipes/chakra/code.ts +17 -0
- package/src/theme/recipes/chakra/collapsible.ts +20 -0
- package/src/theme/recipes/chakra/container.ts +26 -0
- package/src/theme/recipes/chakra/data-list.ts +80 -0
- package/src/theme/recipes/chakra/dialog.ts +225 -0
- package/src/theme/recipes/chakra/drawer.ts +201 -0
- package/src/theme/recipes/chakra/editable.ts +88 -0
- package/src/theme/recipes/chakra/empty-state.ts +88 -0
- package/src/theme/recipes/chakra/field.ts +68 -0
- package/src/theme/recipes/chakra/fieldset.ts +62 -0
- package/src/theme/recipes/chakra/file-upload.ts +96 -0
- package/src/theme/recipes/chakra/heading.ts +27 -0
- package/src/theme/recipes/chakra/hover-card.ts +68 -0
- package/src/theme/recipes/chakra/icon.ts +30 -0
- package/src/theme/recipes/chakra/input-addon.ts +40 -0
- package/src/theme/recipes/chakra/input.ts +96 -0
- package/src/theme/recipes/chakra/kbd.ts +60 -0
- package/src/theme/recipes/chakra/link.ts +37 -0
- package/src/theme/recipes/chakra/list.ts +67 -0
- package/src/theme/recipes/chakra/mark.ts +27 -0
- package/src/theme/recipes/chakra/menu.ts +124 -0
- package/src/theme/recipes/chakra/native-select.ts +140 -0
- package/src/theme/recipes/chakra/number-input.ts +115 -0
- package/src/theme/recipes/chakra/pin-input.ts +27 -0
- package/src/theme/recipes/chakra/popover.ts +86 -0
- package/src/theme/recipes/chakra/progress-circle.ts +94 -0
- package/src/theme/recipes/chakra/progress.ts +127 -0
- package/src/theme/recipes/chakra/radio-card.ts +220 -0
- package/src/theme/recipes/chakra/radio-group.ts +72 -0
- package/src/theme/recipes/chakra/radiomark.ts +107 -0
- package/src/theme/recipes/chakra/rating-group.ts +94 -0
- package/src/theme/recipes/chakra/segment-group.ts +117 -0
- package/src/theme/recipes/chakra/select.ts +282 -0
- package/src/theme/recipes/chakra/separator.ts +51 -0
- package/src/theme/recipes/chakra/skeleton.ts +53 -0
- package/src/theme/recipes/chakra/skip-nav-link.ts +34 -0
- package/src/theme/recipes/chakra/slider.ts +178 -0
- package/src/theme/recipes/chakra/spinner.ts +32 -0
- package/src/theme/recipes/chakra/stat.ts +79 -0
- package/src/theme/recipes/chakra/status.ts +48 -0
- package/src/theme/recipes/chakra/steps.ts +218 -0
- package/src/theme/recipes/chakra/switch.ts +167 -0
- package/src/theme/recipes/chakra/table.ts +172 -0
- package/src/theme/recipes/chakra/tabs.ts +280 -0
- package/src/theme/recipes/chakra/tag.ts +131 -0
- package/src/theme/recipes/chakra/textarea.ts +88 -0
- package/src/theme/recipes/chakra/timeline.ts +138 -0
- package/src/theme/recipes/chakra/toast.ts +96 -0
- package/src/theme/recipes/chakra/tooltip.ts +40 -0
- package/src/theme/recipes.ts +46 -0
- package/src/theme/semantic-tokens/colors.ts +403 -0
- package/src/theme/semantic-tokens/radii.ts +7 -0
- package/src/theme/semantic-tokens/shadows.ts +52 -0
- package/src/theme/slot-recipes.ts +104 -0
- package/src/theme/text-styles.ts +39 -0
- package/src/theme/tokens/animations.ts +8 -0
- package/src/theme/tokens/aspect-ratios.ts +10 -0
- package/src/theme/tokens/blurs.ts +12 -0
- package/src/theme/tokens/borders.ts +9 -0
- package/src/theme/tokens/colors.ts +177 -0
- package/src/theme/tokens/cursor.ts +12 -0
- package/src/theme/tokens/durations.ts +11 -0
- package/src/theme/tokens/easings.ts +10 -0
- package/src/theme/tokens/font-sizes.ts +20 -0
- package/src/theme/tokens/font-weights.ts +13 -0
- package/src/theme/tokens/fonts.ts +15 -0
- package/src/theme/tokens/keyframes.ts +173 -0
- package/src/theme/tokens/letter-spacing.ts +9 -0
- package/src/theme/tokens/line-heights.ts +19 -0
- package/src/theme/tokens/radius.ts +18 -0
- package/src/theme/tokens/sizes.ts +71 -0
- package/src/theme/tokens/spacing.ts +38 -0
- package/src/theme/tokens/z-indices.ts +34 -0
- package/src/theme/utils.ts +46 -0
- package/dist/index.d.mts +0 -8
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -11
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import type { HTMLChakraProps, SlotRecipeProps } from '@chakra-ui/react'
|
|
4
|
+
import { createSlotRecipeContext } from '@chakra-ui/react'
|
|
5
|
+
import { Sidebar, useSidebar } from '@saas-ui/core/sidebar'
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
withContext,
|
|
9
|
+
useRecipeResult,
|
|
10
|
+
StylesProvider,
|
|
11
|
+
ClassNamesProvider,
|
|
12
|
+
useStyles: useSidebarStyles,
|
|
13
|
+
} = createSlotRecipeContext({
|
|
14
|
+
key: 'sidebar',
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
export { useSidebar, useSidebarStyles }
|
|
18
|
+
|
|
19
|
+
export interface SidebarProviderProps
|
|
20
|
+
extends Sidebar.ProviderProps,
|
|
21
|
+
Omit<SlotRecipeProps<'sidebar'>, 'mode'> {}
|
|
22
|
+
|
|
23
|
+
export const SidebarProvider = function SidebarProvider(
|
|
24
|
+
props: SidebarProviderProps,
|
|
25
|
+
) {
|
|
26
|
+
return (
|
|
27
|
+
<Sidebar.Provider {...props}>
|
|
28
|
+
<RecipeProvider {...props}>{props.children}</RecipeProvider>
|
|
29
|
+
</Sidebar.Provider>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function RecipeProvider(
|
|
34
|
+
props: SlotRecipeProps<'sidebar'> & { children: React.ReactNode },
|
|
35
|
+
) {
|
|
36
|
+
const { mode } = useSidebar()
|
|
37
|
+
|
|
38
|
+
const { styles, classNames } = useRecipeResult({
|
|
39
|
+
...props,
|
|
40
|
+
mode,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<StylesProvider value={styles}>
|
|
45
|
+
<ClassNamesProvider value={classNames}>
|
|
46
|
+
{props.children}
|
|
47
|
+
</ClassNamesProvider>
|
|
48
|
+
</StylesProvider>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface SidebarRootProps
|
|
53
|
+
extends Sidebar.RootProps,
|
|
54
|
+
HTMLChakraProps<'div'> {}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Side navigation, commonly used as the primary navigation
|
|
58
|
+
*
|
|
59
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
60
|
+
*/
|
|
61
|
+
export const SidebarRoot = withContext<HTMLDivElement, SidebarRootProps>(
|
|
62
|
+
Sidebar.Root,
|
|
63
|
+
'root',
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
export interface SidebarTriggerProps extends HTMLChakraProps<'button'> {}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Button that toggles the sidebar visibility.
|
|
70
|
+
*
|
|
71
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
72
|
+
*/
|
|
73
|
+
export const SidebarTrigger = withContext<
|
|
74
|
+
HTMLButtonElement,
|
|
75
|
+
SidebarTriggerProps
|
|
76
|
+
>(Sidebar.Trigger, 'trigger', {
|
|
77
|
+
forwardAsChild: true,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
export interface SidebarFlyoutTriggerProps extends HTMLChakraProps<'button'> {}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Opens the sidebar when hovering over the trigger.
|
|
84
|
+
*
|
|
85
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
86
|
+
*/
|
|
87
|
+
export const SidebarFlyoutTrigger = withContext<
|
|
88
|
+
HTMLButtonElement,
|
|
89
|
+
SidebarFlyoutTriggerProps
|
|
90
|
+
>(Sidebar.FlyoutTrigger, 'flyoutTrigger', {
|
|
91
|
+
forwardAsChild: true,
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Overlay shown when sidebar is open on mobile.
|
|
96
|
+
*
|
|
97
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
98
|
+
*/
|
|
99
|
+
export const SidebarBackdrop = withContext<
|
|
100
|
+
HTMLDivElement,
|
|
101
|
+
HTMLChakraProps<'div'>
|
|
102
|
+
>(Sidebar.Backdrop, 'backdrop', {
|
|
103
|
+
forwardAsChild: true,
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Sidebar header section.
|
|
108
|
+
*
|
|
109
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
110
|
+
*/
|
|
111
|
+
export const SidebarHeader = withContext<
|
|
112
|
+
HTMLDivElement,
|
|
113
|
+
HTMLChakraProps<'div'>
|
|
114
|
+
>(Sidebar.Header, 'header')
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Sidebar body section, used for the main content of the sidebar.
|
|
118
|
+
*
|
|
119
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
120
|
+
*/
|
|
121
|
+
export const SidebarBody = withContext<HTMLDivElement, HTMLChakraProps<'div'>>(
|
|
122
|
+
Sidebar.Body,
|
|
123
|
+
'body',
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Sidebar footer section.
|
|
128
|
+
*
|
|
129
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
130
|
+
*/
|
|
131
|
+
export const SidebarFooter = withContext<
|
|
132
|
+
HTMLDivElement,
|
|
133
|
+
HTMLChakraProps<'div'>
|
|
134
|
+
>(Sidebar.Footer, 'footer')
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Sidebar track section.
|
|
138
|
+
*
|
|
139
|
+
* @see Docs https://saas-ui.dev/docs/components/layout/sidebar
|
|
140
|
+
*/
|
|
141
|
+
export const SidebarTrack = withContext<HTMLDivElement, HTMLChakraProps<'div'>>(
|
|
142
|
+
Sidebar.Track,
|
|
143
|
+
'track',
|
|
144
|
+
{
|
|
145
|
+
forwardAsChild: true,
|
|
146
|
+
},
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
export const SidebarGroup = withContext<HTMLDivElement, HTMLChakraProps<'div'>>(
|
|
150
|
+
Sidebar.Group,
|
|
151
|
+
'group',
|
|
152
|
+
{
|
|
153
|
+
defaultProps: {
|
|
154
|
+
role: 'group',
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
export const SidebarGroupHeader = withContext<
|
|
160
|
+
HTMLDivElement,
|
|
161
|
+
HTMLChakraProps<'div'>
|
|
162
|
+
>(Sidebar.GroupHeader, 'groupHeader')
|
|
163
|
+
|
|
164
|
+
export const SidebarGroupTitle = withContext<
|
|
165
|
+
HTMLHeadingElement,
|
|
166
|
+
HTMLChakraProps<'h5'>
|
|
167
|
+
>(Sidebar.GroupTitle, 'groupTitle')
|
|
168
|
+
|
|
169
|
+
export const SidebarGroupEndElement = withContext<
|
|
170
|
+
HTMLDivElement,
|
|
171
|
+
HTMLChakraProps<'div'>
|
|
172
|
+
>(Sidebar.GroupEndElement, 'groupEndElement')
|
|
173
|
+
|
|
174
|
+
export const SidebarGroupContent = withContext<
|
|
175
|
+
HTMLDivElement,
|
|
176
|
+
HTMLChakraProps<'div'>
|
|
177
|
+
>(Sidebar.GroupContent, 'groupContent')
|
|
178
|
+
|
|
179
|
+
const {
|
|
180
|
+
withProvider: withItemProvider,
|
|
181
|
+
withContext: withItemContext,
|
|
182
|
+
useStyles: useSidebarItemStyles,
|
|
183
|
+
} = createSlotRecipeContext({
|
|
184
|
+
key: 'sidebarNavItem',
|
|
185
|
+
})
|
|
186
|
+
|
|
187
|
+
export { useSidebarItemStyles }
|
|
188
|
+
|
|
189
|
+
export const SidebarNavItem = withItemProvider<
|
|
190
|
+
HTMLDivElement,
|
|
191
|
+
HTMLChakraProps<'div'>
|
|
192
|
+
>(Sidebar.NavItem, 'item')
|
|
193
|
+
|
|
194
|
+
export interface SidebarNavButtonProps extends Sidebar.NavButtonProps {
|
|
195
|
+
active?: boolean
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export const SidebarNavButton = withItemContext<
|
|
199
|
+
HTMLButtonElement,
|
|
200
|
+
SidebarNavButtonProps
|
|
201
|
+
>(Sidebar.NavButton, 'button', {
|
|
202
|
+
forwardAsChild: true,
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
export const SidebarNavItemEndElement = withItemContext<
|
|
206
|
+
HTMLDivElement,
|
|
207
|
+
HTMLChakraProps<'div'>
|
|
208
|
+
>(Sidebar.NavItemEndElement, 'endElement')
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import { Spinner } from './spinner.tsx'
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: 'Components/Spinner',
|
|
7
|
+
component: Spinner,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const Default = {
|
|
11
|
+
args: {},
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const RenderingChildren = {
|
|
15
|
+
args: {
|
|
16
|
+
loading: false,
|
|
17
|
+
children: 'Hello world',
|
|
18
|
+
},
|
|
19
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { forwardRef } from 'react'
|
|
2
|
+
|
|
3
|
+
import type { SpinnerProps as ChakraSpinnerProps } from '@chakra-ui/react'
|
|
4
|
+
import { Spinner as ChakraSpinner } from '@chakra-ui/react'
|
|
5
|
+
|
|
6
|
+
export interface SpinnerProps extends ChakraSpinnerProps {
|
|
7
|
+
loading?: boolean
|
|
8
|
+
children?: React.ReactNode
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const Spinner = forwardRef<HTMLDivElement, SpinnerProps>(
|
|
12
|
+
function Spinner(props, ref) {
|
|
13
|
+
const { loading, children, ...rest } = props
|
|
14
|
+
|
|
15
|
+
if (loading === false) {
|
|
16
|
+
return <>{children}</>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return <ChakraSpinner ref={ref} {...rest} />
|
|
20
|
+
},
|
|
21
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as Steps from './namespace.ts'
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export {
|
|
2
|
+
StepsRoot as Root,
|
|
3
|
+
StepsItem as Item,
|
|
4
|
+
StepsIndicator as Indicator,
|
|
5
|
+
StepsCompletedContent as CompletedContent,
|
|
6
|
+
StepsContent as Content,
|
|
7
|
+
StepsList as List,
|
|
8
|
+
StepsNextTrigger as NextTrigger,
|
|
9
|
+
StepsPrevTrigger as PrevTrigger,
|
|
10
|
+
} from './steps.tsx'
|
|
11
|
+
|
|
12
|
+
export type {
|
|
13
|
+
StepsRootProps as RootProps,
|
|
14
|
+
StepsItemProps as ItemProps,
|
|
15
|
+
StepsIndicatorProps as IndicatorProps,
|
|
16
|
+
} from './steps.tsx'
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Box, Steps as ChakraSteps } from '@chakra-ui/react'
|
|
2
|
+
|
|
3
|
+
import { CheckIcon } from '../icons'
|
|
4
|
+
|
|
5
|
+
interface StepInfoProps {
|
|
6
|
+
title?: React.ReactNode
|
|
7
|
+
description?: React.ReactNode
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface StepsItemProps
|
|
11
|
+
extends Omit<ChakraSteps.ItemProps, 'title'>,
|
|
12
|
+
StepInfoProps {
|
|
13
|
+
completedIcon?: React.ReactNode
|
|
14
|
+
icon?: React.ReactNode
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const StepsItem = (props: StepsItemProps) => {
|
|
18
|
+
const { title, description, completedIcon, icon, ...rest } = props
|
|
19
|
+
return (
|
|
20
|
+
<ChakraSteps.Item {...rest}>
|
|
21
|
+
<ChakraSteps.Trigger>
|
|
22
|
+
<ChakraSteps.Indicator>
|
|
23
|
+
<ChakraSteps.Status
|
|
24
|
+
complete={completedIcon || <CheckIcon />}
|
|
25
|
+
incomplete={icon || <ChakraSteps.Number />}
|
|
26
|
+
/>
|
|
27
|
+
</ChakraSteps.Indicator>
|
|
28
|
+
<StepInfo title={title} description={description} />
|
|
29
|
+
</ChakraSteps.Trigger>
|
|
30
|
+
<ChakraSteps.Separator />
|
|
31
|
+
</ChakraSteps.Item>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const StepInfo = (props: StepInfoProps) => {
|
|
36
|
+
const { title, description } = props
|
|
37
|
+
if (title && description) {
|
|
38
|
+
return (
|
|
39
|
+
<Box>
|
|
40
|
+
<ChakraSteps.Title>{title}</ChakraSteps.Title>
|
|
41
|
+
<ChakraSteps.Description>{description}</ChakraSteps.Description>
|
|
42
|
+
</Box>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
return (
|
|
46
|
+
<>
|
|
47
|
+
{title && <ChakraSteps.Title>{title}</ChakraSteps.Title>}
|
|
48
|
+
{description && (
|
|
49
|
+
<ChakraSteps.Description>{description}</ChakraSteps.Description>
|
|
50
|
+
)}
|
|
51
|
+
</>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface StepsIndicatorProps {
|
|
56
|
+
completedIcon: React.ReactNode
|
|
57
|
+
icon?: React.ReactNode
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const StepsIndicator = (props: StepsIndicatorProps) => {
|
|
61
|
+
const { icon = <ChakraSteps.Number />, completedIcon } = props
|
|
62
|
+
return (
|
|
63
|
+
<ChakraSteps.Indicator>
|
|
64
|
+
<ChakraSteps.Status complete={completedIcon} incomplete={icon} />
|
|
65
|
+
</ChakraSteps.Indicator>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const StepsList = ChakraSteps.List
|
|
70
|
+
|
|
71
|
+
export type StepsRootProps = ChakraSteps.RootProps
|
|
72
|
+
export const StepsRoot = ChakraSteps.Root
|
|
73
|
+
export const StepsContent = ChakraSteps.Content
|
|
74
|
+
export const StepsCompletedContent = ChakraSteps.CompletedContent
|
|
75
|
+
|
|
76
|
+
export const StepsNextTrigger = (props: ChakraSteps.NextTriggerProps) => {
|
|
77
|
+
return <ChakraSteps.NextTrigger {...props} />
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const StepsPrevTrigger = (props: ChakraSteps.PrevTriggerProps) => {
|
|
81
|
+
return <ChakraSteps.PrevTrigger {...props} />
|
|
82
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Switch as ChakraSwitch } from "@chakra-ui/react"
|
|
2
|
+
import { forwardRef } from "react"
|
|
3
|
+
|
|
4
|
+
export interface SwitchProps extends ChakraSwitch.RootProps {
|
|
5
|
+
inputProps?: React.InputHTMLAttributes<HTMLInputElement>
|
|
6
|
+
rootRef?: React.Ref<HTMLLabelElement>
|
|
7
|
+
trackLabel?: { on: React.ReactNode; off: React.ReactNode }
|
|
8
|
+
thumbLabel?: { on: React.ReactNode; off: React.ReactNode }
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const Switch = forwardRef<HTMLInputElement, SwitchProps>(
|
|
12
|
+
function Switch(props, ref) {
|
|
13
|
+
const { inputProps, children, rootRef, trackLabel, thumbLabel, ...rest } =
|
|
14
|
+
props
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<ChakraSwitch.Root ref={rootRef} {...rest}>
|
|
18
|
+
<ChakraSwitch.HiddenInput ref={ref} {...inputProps} />
|
|
19
|
+
<ChakraSwitch.Control>
|
|
20
|
+
<ChakraSwitch.Thumb>
|
|
21
|
+
{thumbLabel && (
|
|
22
|
+
<ChakraSwitch.ThumbIndicator fallback={thumbLabel?.off}>
|
|
23
|
+
{thumbLabel?.on}
|
|
24
|
+
</ChakraSwitch.ThumbIndicator>
|
|
25
|
+
)}
|
|
26
|
+
</ChakraSwitch.Thumb>
|
|
27
|
+
{trackLabel && (
|
|
28
|
+
<ChakraSwitch.Indicator fallback={trackLabel.off}>
|
|
29
|
+
{trackLabel.on}
|
|
30
|
+
</ChakraSwitch.Indicator>
|
|
31
|
+
)}
|
|
32
|
+
</ChakraSwitch.Control>
|
|
33
|
+
{children != null && (
|
|
34
|
+
<ChakraSwitch.Label>{children}</ChakraSwitch.Label>
|
|
35
|
+
)}
|
|
36
|
+
</ChakraSwitch.Root>
|
|
37
|
+
)
|
|
38
|
+
},
|
|
39
|
+
)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Accordion, HStack } from "@chakra-ui/react"
|
|
2
|
+
import { forwardRef } from "react"
|
|
3
|
+
import { LuChevronDown } from "react-icons/lu"
|
|
4
|
+
|
|
5
|
+
interface AccordionItemTriggerProps extends Accordion.ItemTriggerProps {
|
|
6
|
+
indicatorPlacement?: "start" | "end"
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const AccordionItemTrigger = forwardRef<
|
|
10
|
+
HTMLButtonElement,
|
|
11
|
+
AccordionItemTriggerProps
|
|
12
|
+
>(function AccordionItemTrigger(props, ref) {
|
|
13
|
+
const { children, indicatorPlacement = "end", ...rest } = props
|
|
14
|
+
return (
|
|
15
|
+
<Accordion.ItemTrigger {...rest} ref={ref}>
|
|
16
|
+
{indicatorPlacement === "start" && (
|
|
17
|
+
<Accordion.ItemIndicator rotate={{ base: "-90deg", _open: "0deg" }}>
|
|
18
|
+
<LuChevronDown />
|
|
19
|
+
</Accordion.ItemIndicator>
|
|
20
|
+
)}
|
|
21
|
+
<HStack gap="4" flex="1" textAlign="start" width="full">
|
|
22
|
+
{children}
|
|
23
|
+
</HStack>
|
|
24
|
+
{indicatorPlacement === "end" && (
|
|
25
|
+
<Accordion.ItemIndicator>
|
|
26
|
+
<LuChevronDown />
|
|
27
|
+
</Accordion.ItemIndicator>
|
|
28
|
+
)}
|
|
29
|
+
</Accordion.ItemTrigger>
|
|
30
|
+
)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
interface AccordionItemContentProps extends Accordion.ItemContentProps {}
|
|
34
|
+
|
|
35
|
+
export const AccordionItemContent = forwardRef<
|
|
36
|
+
HTMLDivElement,
|
|
37
|
+
AccordionItemContentProps
|
|
38
|
+
>(function AccordionItemContent(props, ref) {
|
|
39
|
+
return (
|
|
40
|
+
<Accordion.ItemContent>
|
|
41
|
+
<Accordion.ItemBody {...props} ref={ref} />
|
|
42
|
+
</Accordion.ItemContent>
|
|
43
|
+
)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
export const AccordionRoot = Accordion.Root
|
|
47
|
+
export const AccordionItem = Accordion.Item
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ActionBar, Portal } from "@chakra-ui/react"
|
|
2
|
+
import { CloseButton } from "compositions/ui/close-button"
|
|
3
|
+
import { forwardRef } from "react"
|
|
4
|
+
|
|
5
|
+
interface ActionBarContentProps extends ActionBar.ContentProps {
|
|
6
|
+
portalled?: boolean
|
|
7
|
+
portalRef?: React.RefObject<HTMLElement>
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const ActionBarContent = forwardRef<
|
|
11
|
+
HTMLDivElement,
|
|
12
|
+
ActionBarContentProps
|
|
13
|
+
>(function ActionBarContent(props, ref) {
|
|
14
|
+
const { children, portalled = true, portalRef, ...rest } = props
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Portal disabled={!portalled} container={portalRef}>
|
|
18
|
+
<ActionBar.Positioner>
|
|
19
|
+
<ActionBar.Content ref={ref} {...rest} asChild={false}>
|
|
20
|
+
{children}
|
|
21
|
+
</ActionBar.Content>
|
|
22
|
+
</ActionBar.Positioner>
|
|
23
|
+
</Portal>
|
|
24
|
+
)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
export const ActionBarCloseTrigger = forwardRef<
|
|
28
|
+
HTMLButtonElement,
|
|
29
|
+
ActionBar.CloseTriggerProps
|
|
30
|
+
>(function ActionBarCloseTrigger(props, ref) {
|
|
31
|
+
return (
|
|
32
|
+
<ActionBar.CloseTrigger {...props} asChild ref={ref}>
|
|
33
|
+
<CloseButton size="sm" />
|
|
34
|
+
</ActionBar.CloseTrigger>
|
|
35
|
+
)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
export const ActionBarRoot = ActionBar.Root
|
|
39
|
+
export const ActionBarSelectionTrigger = ActionBar.SelectionTrigger
|
|
40
|
+
export const ActionBarSeparator = ActionBar.Separator
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Alert as ChakraAlert } from "@chakra-ui/react"
|
|
2
|
+
import { CloseButton } from "compositions/ui/close-button"
|
|
3
|
+
import { forwardRef } from "react"
|
|
4
|
+
|
|
5
|
+
export interface AlertProps extends Omit<ChakraAlert.RootProps, "title"> {
|
|
6
|
+
startElement?: React.ReactNode
|
|
7
|
+
endElement?: React.ReactNode
|
|
8
|
+
title?: React.ReactNode
|
|
9
|
+
icon?: React.ReactElement
|
|
10
|
+
closable?: boolean
|
|
11
|
+
onClose?: () => void
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const Alert = forwardRef<HTMLDivElement, AlertProps>(
|
|
15
|
+
function Alert(props, ref) {
|
|
16
|
+
const {
|
|
17
|
+
title,
|
|
18
|
+
children,
|
|
19
|
+
icon,
|
|
20
|
+
closable,
|
|
21
|
+
onClose,
|
|
22
|
+
startElement,
|
|
23
|
+
endElement,
|
|
24
|
+
...rest
|
|
25
|
+
} = props
|
|
26
|
+
return (
|
|
27
|
+
<ChakraAlert.Root ref={ref} {...rest}>
|
|
28
|
+
{startElement || <ChakraAlert.Indicator>{icon}</ChakraAlert.Indicator>}
|
|
29
|
+
{children ? (
|
|
30
|
+
<ChakraAlert.Content>
|
|
31
|
+
<ChakraAlert.Title>{title}</ChakraAlert.Title>
|
|
32
|
+
<ChakraAlert.Description>{children}</ChakraAlert.Description>
|
|
33
|
+
</ChakraAlert.Content>
|
|
34
|
+
) : (
|
|
35
|
+
<ChakraAlert.Title flex="1">{title}</ChakraAlert.Title>
|
|
36
|
+
)}
|
|
37
|
+
{endElement}
|
|
38
|
+
{closable && (
|
|
39
|
+
<CloseButton
|
|
40
|
+
size="sm"
|
|
41
|
+
pos="relative"
|
|
42
|
+
top="-2"
|
|
43
|
+
insetEnd="-2"
|
|
44
|
+
alignSelf="flex-start"
|
|
45
|
+
onClick={onClose}
|
|
46
|
+
/>
|
|
47
|
+
)}
|
|
48
|
+
</ChakraAlert.Root>
|
|
49
|
+
)
|
|
50
|
+
},
|
|
51
|
+
)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import type { GroupProps, SlotRecipeProps } from "@chakra-ui/react"
|
|
4
|
+
import { Avatar as ChakraAvatar, Group } from "@chakra-ui/react"
|
|
5
|
+
import { forwardRef } from "react"
|
|
6
|
+
|
|
7
|
+
type ImageProps = React.ImgHTMLAttributes<HTMLImageElement>
|
|
8
|
+
|
|
9
|
+
export interface AvatarProps extends ChakraAvatar.RootProps {
|
|
10
|
+
name?: string
|
|
11
|
+
src?: string
|
|
12
|
+
srcSet?: string
|
|
13
|
+
loading?: ImageProps["loading"]
|
|
14
|
+
icon?: React.ReactElement
|
|
15
|
+
fallback?: React.ReactNode
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const Avatar = forwardRef<HTMLDivElement, AvatarProps>(
|
|
19
|
+
function Avatar(props, ref) {
|
|
20
|
+
const { name, src, srcSet, loading, icon, fallback, children, ...rest } =
|
|
21
|
+
props
|
|
22
|
+
return (
|
|
23
|
+
<ChakraAvatar.Root ref={ref} {...rest}>
|
|
24
|
+
<AvatarFallback name={name} icon={icon}>
|
|
25
|
+
{fallback}
|
|
26
|
+
</AvatarFallback>
|
|
27
|
+
<ChakraAvatar.Image src={src} srcSet={srcSet} loading={loading} />
|
|
28
|
+
{children}
|
|
29
|
+
</ChakraAvatar.Root>
|
|
30
|
+
)
|
|
31
|
+
},
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
interface AvatarFallbackProps extends ChakraAvatar.FallbackProps {
|
|
35
|
+
name?: string
|
|
36
|
+
icon?: React.ReactElement
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const AvatarFallback = forwardRef<HTMLDivElement, AvatarFallbackProps>(
|
|
40
|
+
function AvatarFallback(props, ref) {
|
|
41
|
+
const { name, icon, children, ...rest } = props
|
|
42
|
+
return (
|
|
43
|
+
<ChakraAvatar.Fallback ref={ref} {...rest}>
|
|
44
|
+
{children}
|
|
45
|
+
{name != null && children == null && <>{getInitials(name)}</>}
|
|
46
|
+
{name == null && children == null && (
|
|
47
|
+
<ChakraAvatar.Icon asChild={!!icon}>{icon}</ChakraAvatar.Icon>
|
|
48
|
+
)}
|
|
49
|
+
</ChakraAvatar.Fallback>
|
|
50
|
+
)
|
|
51
|
+
},
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
function getInitials(name: string) {
|
|
55
|
+
const names = name.trim().split(" ")
|
|
56
|
+
const firstName = names[0] != null ? names[0] : ""
|
|
57
|
+
const lastName = names.length > 1 ? names[names.length - 1] : ""
|
|
58
|
+
return firstName && lastName
|
|
59
|
+
? `${firstName.charAt(0)}${lastName.charAt(0)}`
|
|
60
|
+
: firstName.charAt(0)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface AvatarGroupProps extends GroupProps, SlotRecipeProps<"avatar"> {}
|
|
64
|
+
|
|
65
|
+
export const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(
|
|
66
|
+
function AvatarGroup(props, ref) {
|
|
67
|
+
const { size, variant, borderless, ...rest } = props
|
|
68
|
+
return (
|
|
69
|
+
<ChakraAvatar.PropsProvider value={{ size, variant, borderless }}>
|
|
70
|
+
<Group gap="0" spaceX="-3" ref={ref} {...rest} />
|
|
71
|
+
</ChakraAvatar.PropsProvider>
|
|
72
|
+
)
|
|
73
|
+
},
|
|
74
|
+
)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Blockquote as ChakraBlockquote } from "@chakra-ui/react"
|
|
2
|
+
import { forwardRef } from "react"
|
|
3
|
+
|
|
4
|
+
export interface BlockquoteProps extends ChakraBlockquote.RootProps {
|
|
5
|
+
cite?: React.ReactNode
|
|
6
|
+
citeUrl?: string
|
|
7
|
+
icon?: React.ReactNode
|
|
8
|
+
showDash?: boolean
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const Blockquote = forwardRef<HTMLDivElement, BlockquoteProps>(
|
|
12
|
+
function Blockquote(props, ref) {
|
|
13
|
+
const { children, cite, citeUrl, showDash, icon, ...rest } = props
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<ChakraBlockquote.Root ref={ref} {...rest}>
|
|
17
|
+
{icon}
|
|
18
|
+
<ChakraBlockquote.Content cite={citeUrl}>
|
|
19
|
+
{children}
|
|
20
|
+
</ChakraBlockquote.Content>
|
|
21
|
+
{cite && (
|
|
22
|
+
<ChakraBlockquote.Caption>
|
|
23
|
+
{showDash ? <>—</> : null} <cite>{cite}</cite>
|
|
24
|
+
</ChakraBlockquote.Caption>
|
|
25
|
+
)}
|
|
26
|
+
</ChakraBlockquote.Root>
|
|
27
|
+
)
|
|
28
|
+
},
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
export const BlockquoteIcon = ChakraBlockquote.Icon
|