tharaday 0.1.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/.gitignore +30 -0
- package/.prettierrc.json +10 -0
- package/.storybook/main.ts +8 -0
- package/.storybook/preview.ts +50 -0
- package/.versionrc.json +6 -0
- package/README.md +73 -0
- package/dist/components/Accordion/Accordion.d.ts +2 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +14 -0
- package/dist/components/Accordion/Accordion.types.d.ts +18 -0
- package/dist/components/Avatar/Avatar.d.ts +2 -0
- package/dist/components/Avatar/Avatar.stories.d.ts +14 -0
- package/dist/components/Avatar/Avatar.types.d.ts +10 -0
- package/dist/components/Badge/Badge.d.ts +2 -0
- package/dist/components/Badge/Badge.stories.d.ts +33 -0
- package/dist/components/Badge/Badge.types.d.ts +9 -0
- package/dist/components/Box/Box.d.ts +2 -0
- package/dist/components/Box/Box.stories.d.ts +38 -0
- package/dist/components/Box/Box.types.d.ts +49 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +3 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.stories.d.ts +13 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts +11 -0
- package/dist/components/Button/Button.d.ts +2 -0
- package/dist/components/Button/Button.stories.d.ts +22 -0
- package/dist/components/Button/Button.types.d.ts +12 -0
- package/dist/components/Card/Card.d.ts +5 -0
- package/dist/components/Card/Card.stories.d.ts +27 -0
- package/dist/components/Card/Card.types.d.ts +15 -0
- package/dist/components/Checkbox/Checkbox.d.ts +2 -0
- package/dist/components/Checkbox/Checkbox.stories.d.ts +17 -0
- package/dist/components/Checkbox/Checkbox.types.d.ts +6 -0
- package/dist/components/Dropdown/Dropdown.d.ts +2 -0
- package/dist/components/Dropdown/Dropdown.stories.d.ts +12 -0
- package/dist/components/Dropdown/Dropdown.types.d.ts +24 -0
- package/dist/components/Header/Header.d.ts +2 -0
- package/dist/components/Header/Header.stories.d.ts +18 -0
- package/dist/components/Header/Header.types.d.ts +14 -0
- package/dist/components/Input/Input.d.ts +2 -0
- package/dist/components/Input/Input.stories.d.ts +29 -0
- package/dist/components/Input/Input.types.d.ts +8 -0
- package/dist/components/Loader/Loader.d.ts +2 -0
- package/dist/components/Loader/Loader.stories.d.ts +25 -0
- package/dist/components/Loader/Loader.types.d.ts +8 -0
- package/dist/components/Modal/Modal.d.ts +2 -0
- package/dist/components/Modal/Modal.stories.d.ts +22 -0
- package/dist/components/Modal/Modal.types.d.ts +12 -0
- package/dist/components/NavBar/NavBar.d.ts +6 -0
- package/dist/components/NavBar/NavBar.stories.d.ts +8 -0
- package/dist/components/NavBar/NavBar.types.d.ts +34 -0
- package/dist/components/Notification/Notification.d.ts +2 -0
- package/dist/components/Notification/Notification.stories.d.ts +26 -0
- package/dist/components/Notification/Notification.types.d.ts +8 -0
- package/dist/components/Pagination/Pagination.d.ts +2 -0
- package/dist/components/Pagination/Pagination.stories.d.ts +21 -0
- package/dist/components/Pagination/Pagination.types.d.ts +34 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +2 -0
- package/dist/components/ProgressBar/ProgressBar.stories.d.ts +32 -0
- package/dist/components/ProgressBar/ProgressBar.types.d.ts +12 -0
- package/dist/components/RadioButton/RadioButton.d.ts +2 -0
- package/dist/components/RadioButton/RadioButton.stories.d.ts +30 -0
- package/dist/components/RadioButton/RadioButton.types.d.ts +8 -0
- package/dist/components/Select/Select.d.ts +2 -0
- package/dist/components/Select/Select.stories.d.ts +29 -0
- package/dist/components/Select/Select.types.d.ts +15 -0
- package/dist/components/Skeleton/Skeleton.d.ts +2 -0
- package/dist/components/Skeleton/Skeleton.stories.d.ts +15 -0
- package/dist/components/Skeleton/Skeleton.types.d.ts +8 -0
- package/dist/components/Stepper/Step.d.ts +2 -0
- package/dist/components/Stepper/Step.types.d.ts +17 -0
- package/dist/components/Stepper/Stepper.d.ts +2 -0
- package/dist/components/Stepper/Stepper.stories.d.ts +15 -0
- package/dist/components/Stepper/Stepper.types.d.ts +13 -0
- package/dist/components/Stepper/stepper.utils.d.ts +3 -0
- package/dist/components/Switch/Switch.d.ts +2 -0
- package/dist/components/Switch/Switch.stories.d.ts +16 -0
- package/dist/components/Switch/Switch.types.d.ts +5 -0
- package/dist/components/Table/Table.d.ts +8 -0
- package/dist/components/Table/Table.stories.d.ts +27 -0
- package/dist/components/Table/Table.types.d.ts +17 -0
- package/dist/components/Tabs/Tabs.d.ts +2 -0
- package/dist/components/Tabs/Tabs.stories.d.ts +14 -0
- package/dist/components/Tabs/Tabs.types.d.ts +16 -0
- package/dist/components/Text/Text.d.ts +2 -0
- package/dist/components/Text/Text.stories.d.ts +35 -0
- package/dist/components/Text/Text.types.d.ts +21 -0
- package/dist/components/Textarea/Textarea.d.ts +2 -0
- package/dist/components/Textarea/Textarea.stories.d.ts +29 -0
- package/dist/components/Textarea/Textarea.types.d.ts +9 -0
- package/dist/components/Tooltip/Tooltip.d.ts +2 -0
- package/dist/components/Tooltip/Tooltip.stories.d.ts +10 -0
- package/dist/components/Tooltip/Tooltip.types.d.ts +12 -0
- package/dist/ds.css +1 -0
- package/dist/ds.js +1930 -0
- package/dist/ds.umd.cjs +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/layouts/AppLayout/AppLayout.d.ts +8 -0
- package/dist/layouts/AppLayout/AppLayout.stories.d.ts +19 -0
- package/dist/layouts/AppLayout/AppLayout.types.d.ts +50 -0
- package/dist/layouts/AuthLayout/AuthLayout.d.ts +2 -0
- package/dist/layouts/AuthLayout/AuthLayout.stories.d.ts +12 -0
- package/dist/layouts/AuthLayout/AuthLayout.types.d.ts +7 -0
- package/dist/layouts/DashboardLayout/DashboardLayout.d.ts +2 -0
- package/dist/layouts/DashboardLayout/DashboardLayout.stories.d.ts +17 -0
- package/dist/layouts/DashboardLayout/DashboardLayout.types.d.ts +15 -0
- package/dist/layouts/SettingsLayout/SettingsLayout.d.ts +2 -0
- package/dist/layouts/SettingsLayout/SettingsLayout.stories.d.ts +17 -0
- package/dist/layouts/SettingsLayout/SettingsLayout.types.d.ts +14 -0
- package/eslint.config.js +45 -0
- package/package.json +100 -0
- package/src/components/Accordion/Accordion.module.css +158 -0
- package/src/components/Accordion/Accordion.stories.tsx +133 -0
- package/src/components/Accordion/Accordion.tsx +68 -0
- package/src/components/Accordion/Accordion.types.ts +21 -0
- package/src/components/Avatar/Avatar.module.css +58 -0
- package/src/components/Avatar/Avatar.stories.tsx +41 -0
- package/src/components/Avatar/Avatar.tsx +64 -0
- package/src/components/Avatar/Avatar.types.ts +12 -0
- package/src/components/Badge/Badge.module.css +98 -0
- package/src/components/Badge/Badge.stories.tsx +108 -0
- package/src/components/Badge/Badge.tsx +22 -0
- package/src/components/Badge/Badge.types.ts +11 -0
- package/src/components/Box/Box.module.css +638 -0
- package/src/components/Box/Box.stories.tsx +109 -0
- package/src/components/Box/Box.tsx +95 -0
- package/src/components/Box/Box.types.ts +65 -0
- package/src/components/Breadcrumbs/Breadcrumbs.module.css +41 -0
- package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +40 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +54 -0
- package/src/components/Breadcrumbs/Breadcrumbs.types.ts +13 -0
- package/src/components/Button/Button.module.css +247 -0
- package/src/components/Button/Button.stories.tsx +93 -0
- package/src/components/Button/Button.tsx +31 -0
- package/src/components/Button/Button.types.ts +14 -0
- package/src/components/Card/Card.module.css +112 -0
- package/src/components/Card/Card.stories.tsx +86 -0
- package/src/components/Card/Card.tsx +70 -0
- package/src/components/Card/Card.types.ts +20 -0
- package/src/components/Checkbox/Checkbox.module.css +88 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +65 -0
- package/src/components/Checkbox/Checkbox.tsx +57 -0
- package/src/components/Checkbox/Checkbox.types.ts +7 -0
- package/src/components/Dropdown/Dropdown.module.css +140 -0
- package/src/components/Dropdown/Dropdown.stories.tsx +86 -0
- package/src/components/Dropdown/Dropdown.tsx +251 -0
- package/src/components/Dropdown/Dropdown.types.ts +27 -0
- package/src/components/Header/Header.module.css +38 -0
- package/src/components/Header/Header.stories.tsx +53 -0
- package/src/components/Header/Header.tsx +49 -0
- package/src/components/Header/Header.types.ts +15 -0
- package/src/components/Input/Input.module.css +87 -0
- package/src/components/Input/Input.stories.tsx +101 -0
- package/src/components/Input/Input.tsx +41 -0
- package/src/components/Input/Input.types.ts +10 -0
- package/src/components/Loader/Loader.module.css +49 -0
- package/src/components/Loader/Loader.stories.tsx +75 -0
- package/src/components/Loader/Loader.tsx +15 -0
- package/src/components/Loader/Loader.types.ts +9 -0
- package/src/components/Modal/Modal.module.css +88 -0
- package/src/components/Modal/Modal.stories.tsx +94 -0
- package/src/components/Modal/Modal.tsx +115 -0
- package/src/components/Modal/Modal.types.ts +13 -0
- package/src/components/NavBar/NavBar.module.css +77 -0
- package/src/components/NavBar/NavBar.stories.tsx +55 -0
- package/src/components/NavBar/NavBar.tsx +50 -0
- package/src/components/NavBar/NavBar.types.ts +36 -0
- package/src/components/Notification/Notification.module.css +72 -0
- package/src/components/Notification/Notification.stories.tsx +81 -0
- package/src/components/Notification/Notification.tsx +34 -0
- package/src/components/Notification/Notification.types.ts +10 -0
- package/src/components/Pagination/Pagination.module.css +31 -0
- package/src/components/Pagination/Pagination.stories.tsx +128 -0
- package/src/components/Pagination/Pagination.tsx +245 -0
- package/src/components/Pagination/Pagination.types.ts +37 -0
- package/src/components/ProgressBar/ProgressBar.module.css +67 -0
- package/src/components/ProgressBar/ProgressBar.stories.tsx +91 -0
- package/src/components/ProgressBar/ProgressBar.tsx +49 -0
- package/src/components/ProgressBar/ProgressBar.types.ts +13 -0
- package/src/components/RadioButton/RadioButton.module.css +162 -0
- package/src/components/RadioButton/RadioButton.stories.tsx +114 -0
- package/src/components/RadioButton/RadioButton.tsx +43 -0
- package/src/components/RadioButton/RadioButton.types.ts +10 -0
- package/src/components/Select/Select.module.css +88 -0
- package/src/components/Select/Select.stories.tsx +99 -0
- package/src/components/Select/Select.tsx +51 -0
- package/src/components/Select/Select.types.ts +18 -0
- package/src/components/Skeleton/Skeleton.module.css +71 -0
- package/src/components/Skeleton/Skeleton.stories.tsx +54 -0
- package/src/components/Skeleton/Skeleton.tsx +32 -0
- package/src/components/Skeleton/Skeleton.types.ts +10 -0
- package/src/components/Stepper/Step.module.css +162 -0
- package/src/components/Stepper/Step.tsx +62 -0
- package/src/components/Stepper/Step.types.ts +19 -0
- package/src/components/Stepper/Stepper.module.css +39 -0
- package/src/components/Stepper/Stepper.stories.tsx +88 -0
- package/src/components/Stepper/Stepper.tsx +47 -0
- package/src/components/Stepper/Stepper.types.ts +16 -0
- package/src/components/Stepper/stepper.utils.ts +41 -0
- package/src/components/Switch/Switch.module.css +74 -0
- package/src/components/Switch/Switch.stories.tsx +56 -0
- package/src/components/Switch/Switch.tsx +36 -0
- package/src/components/Switch/Switch.types.ts +6 -0
- package/src/components/Table/Table.module.css +78 -0
- package/src/components/Table/Table.stories.tsx +124 -0
- package/src/components/Table/Table.tsx +75 -0
- package/src/components/Table/Table.types.ts +29 -0
- package/src/components/Tabs/Tabs.module.css +74 -0
- package/src/components/Tabs/Tabs.stories.tsx +48 -0
- package/src/components/Tabs/Tabs.tsx +113 -0
- package/src/components/Tabs/Tabs.types.ts +18 -0
- package/src/components/Text/Text.module.css +126 -0
- package/src/components/Text/Text.stories.tsx +128 -0
- package/src/components/Text/Text.tsx +50 -0
- package/src/components/Text/Text.types.ts +43 -0
- package/src/components/Textarea/Textarea.module.css +82 -0
- package/src/components/Textarea/Textarea.stories.tsx +99 -0
- package/src/components/Textarea/Textarea.tsx +43 -0
- package/src/components/Textarea/Textarea.types.ts +11 -0
- package/src/components/Tooltip/Tooltip.module.css +125 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +68 -0
- package/src/components/Tooltip/Tooltip.tsx +87 -0
- package/src/components/Tooltip/Tooltip.types.ts +14 -0
- package/src/index.ts +132 -0
- package/src/layouts/AppLayout/AppLayout.module.css +17 -0
- package/src/layouts/AppLayout/AppLayout.stories.tsx +124 -0
- package/src/layouts/AppLayout/AppLayout.tsx +46 -0
- package/src/layouts/AppLayout/AppLayout.types.ts +50 -0
- package/src/layouts/AuthLayout/AuthLayout.module.css +49 -0
- package/src/layouts/AuthLayout/AuthLayout.stories.tsx +109 -0
- package/src/layouts/AuthLayout/AuthLayout.tsx +27 -0
- package/src/layouts/AuthLayout/AuthLayout.types.tsx +8 -0
- package/src/layouts/DashboardLayout/DashboardLayout.module.css +37 -0
- package/src/layouts/DashboardLayout/DashboardLayout.stories.tsx +144 -0
- package/src/layouts/DashboardLayout/DashboardLayout.tsx +41 -0
- package/src/layouts/DashboardLayout/DashboardLayout.types.tsx +14 -0
- package/src/layouts/SettingsLayout/SettingsLayout.module.css +39 -0
- package/src/layouts/SettingsLayout/SettingsLayout.stories.tsx +103 -0
- package/src/layouts/SettingsLayout/SettingsLayout.tsx +37 -0
- package/src/layouts/SettingsLayout/SettingsLayout.types.tsx +13 -0
- package/src/styles/ds.css +12 -0
- package/src/styles/semantic.css +56 -0
- package/src/styles/themes/dark.css +58 -0
- package/src/styles/themes/light.css +58 -0
- package/src/styles/themes/retro.css +58 -0
- package/src/styles/tokens.css +138 -0
- package/tsconfig.app.json +28 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +26 -0
- package/vite.config.ts +33 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
|
|
3
|
+
import styles from './Box.module.css';
|
|
4
|
+
import type { BoxProps } from './Box.types.ts';
|
|
5
|
+
|
|
6
|
+
export const Box = ({
|
|
7
|
+
children,
|
|
8
|
+
as: Component = 'div',
|
|
9
|
+
display,
|
|
10
|
+
padding,
|
|
11
|
+
paddingX,
|
|
12
|
+
paddingY,
|
|
13
|
+
paddingTop,
|
|
14
|
+
paddingBottom,
|
|
15
|
+
paddingLeft,
|
|
16
|
+
paddingRight,
|
|
17
|
+
m,
|
|
18
|
+
mx,
|
|
19
|
+
my,
|
|
20
|
+
mt,
|
|
21
|
+
mb,
|
|
22
|
+
ml,
|
|
23
|
+
mr,
|
|
24
|
+
gap,
|
|
25
|
+
flexDirection,
|
|
26
|
+
alignItems,
|
|
27
|
+
justifyContent,
|
|
28
|
+
flexWrap,
|
|
29
|
+
flexGrow,
|
|
30
|
+
flexShrink,
|
|
31
|
+
flex,
|
|
32
|
+
fullWidth,
|
|
33
|
+
textAlign,
|
|
34
|
+
width,
|
|
35
|
+
height,
|
|
36
|
+
gridTemplateColumns,
|
|
37
|
+
backgroundColor,
|
|
38
|
+
border,
|
|
39
|
+
borderBottom,
|
|
40
|
+
borderColor,
|
|
41
|
+
borderRadius,
|
|
42
|
+
className,
|
|
43
|
+
style,
|
|
44
|
+
...props
|
|
45
|
+
}: BoxProps) => {
|
|
46
|
+
const boxStyles = {
|
|
47
|
+
...style,
|
|
48
|
+
flexGrow,
|
|
49
|
+
flexShrink,
|
|
50
|
+
flex,
|
|
51
|
+
width,
|
|
52
|
+
height,
|
|
53
|
+
gridTemplateColumns,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<Component
|
|
58
|
+
className={clsx(
|
|
59
|
+
styles.box,
|
|
60
|
+
display && styles[`display-${display}`],
|
|
61
|
+
textAlign && styles[`textAlign-${textAlign}`],
|
|
62
|
+
padding !== undefined && styles[`p-${padding}`],
|
|
63
|
+
paddingX !== undefined && styles[`px-${paddingX}`],
|
|
64
|
+
paddingY !== undefined && styles[`py-${paddingY}`],
|
|
65
|
+
paddingTop !== undefined && styles[`pt-${paddingTop}`],
|
|
66
|
+
paddingBottom !== undefined && styles[`pb-${paddingBottom}`],
|
|
67
|
+
paddingLeft !== undefined && styles[`pl-${paddingLeft}`],
|
|
68
|
+
paddingRight !== undefined && styles[`pr-${paddingRight}`],
|
|
69
|
+
m !== undefined && styles[`m-${m}`],
|
|
70
|
+
mx !== undefined && styles[`mx-${mx}`],
|
|
71
|
+
my !== undefined && styles[`my-${my}`],
|
|
72
|
+
mt !== undefined && styles[`mt-${mt}`],
|
|
73
|
+
mb !== undefined && styles[`mb-${mb}`],
|
|
74
|
+
ml !== undefined && styles[`ml-${ml}`],
|
|
75
|
+
mr !== undefined && styles[`mr-${mr}`],
|
|
76
|
+
gap !== undefined && styles[`gap-${gap}`],
|
|
77
|
+
flexDirection && styles[`flexDirection-${flexDirection}`],
|
|
78
|
+
alignItems && styles[`alignItems-${alignItems}`],
|
|
79
|
+
justifyContent && styles[`justifyContent-${justifyContent}`],
|
|
80
|
+
flexWrap && styles[`flexWrap-${flexWrap}`],
|
|
81
|
+
backgroundColor && styles[`bg-${backgroundColor}`],
|
|
82
|
+
border && styles.border,
|
|
83
|
+
borderBottom && styles.borderBottom,
|
|
84
|
+
borderColor && styles[`borderColor-${borderColor}`],
|
|
85
|
+
borderRadius && styles[`borderRadius-${borderRadius}`],
|
|
86
|
+
fullWidth && styles.fullWidth,
|
|
87
|
+
className
|
|
88
|
+
)}
|
|
89
|
+
style={boxStyles}
|
|
90
|
+
{...props}
|
|
91
|
+
>
|
|
92
|
+
{children}
|
|
93
|
+
</Component>
|
|
94
|
+
);
|
|
95
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode, ElementType } from 'react';
|
|
2
|
+
|
|
3
|
+
export type BoxPadding = 0 | 1 | 2 | 3 | 4 | 6 | 8 | 12 | 14;
|
|
4
|
+
export type BoxMargin = 0 | 1 | 2 | 3 | 4 | 6 | 8 | 12 | 14;
|
|
5
|
+
export type BoxGap = 0 | 1 | 2 | 3 | 4 | 6 | 8 | 12 | 14;
|
|
6
|
+
export type BoxDisplay = 'block' | 'flex' | 'inline-flex' | 'grid' | 'inline-block' | 'none';
|
|
7
|
+
export type BoxFlexDirection = 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
|
8
|
+
export type BoxAlignItems = 'stretch' | 'flex-start' | 'center' | 'flex-end' | 'baseline';
|
|
9
|
+
export type BoxJustifyContent =
|
|
10
|
+
| 'flex-start'
|
|
11
|
+
| 'center'
|
|
12
|
+
| 'flex-end'
|
|
13
|
+
| 'space-between'
|
|
14
|
+
| 'space-around'
|
|
15
|
+
| 'space-evenly';
|
|
16
|
+
|
|
17
|
+
export type BoxBackgroundColor =
|
|
18
|
+
| 'none'
|
|
19
|
+
| 'main'
|
|
20
|
+
| 'subtle'
|
|
21
|
+
| 'info-subtle'
|
|
22
|
+
| 'success-subtle'
|
|
23
|
+
| 'warning-subtle'
|
|
24
|
+
| 'danger-subtle';
|
|
25
|
+
export type BoxBorderColor = 'main' | 'subtle' | 'danger' | 'warning' | 'success' | 'info';
|
|
26
|
+
export type BoxBorderRadius = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'full';
|
|
27
|
+
|
|
28
|
+
export interface BoxProps extends HTMLAttributes<HTMLElement> {
|
|
29
|
+
children?: ReactNode;
|
|
30
|
+
as?: ElementType;
|
|
31
|
+
display?: BoxDisplay;
|
|
32
|
+
padding?: BoxPadding;
|
|
33
|
+
paddingX?: BoxPadding;
|
|
34
|
+
paddingY?: BoxPadding;
|
|
35
|
+
paddingTop?: BoxPadding;
|
|
36
|
+
paddingBottom?: BoxPadding;
|
|
37
|
+
paddingLeft?: BoxPadding;
|
|
38
|
+
paddingRight?: BoxPadding;
|
|
39
|
+
m?: BoxMargin;
|
|
40
|
+
mx?: BoxMargin;
|
|
41
|
+
my?: BoxMargin;
|
|
42
|
+
mt?: BoxMargin;
|
|
43
|
+
mb?: BoxMargin;
|
|
44
|
+
ml?: BoxMargin;
|
|
45
|
+
mr?: BoxMargin;
|
|
46
|
+
gap?: BoxGap;
|
|
47
|
+
flexDirection?: BoxFlexDirection;
|
|
48
|
+
alignItems?: BoxAlignItems;
|
|
49
|
+
justifyContent?: BoxJustifyContent;
|
|
50
|
+
className?: string;
|
|
51
|
+
flexWrap?: 'nowrap' | 'wrap' | 'wrap-reverse';
|
|
52
|
+
flexGrow?: number | string;
|
|
53
|
+
flexShrink?: number | string;
|
|
54
|
+
flex?: number | string;
|
|
55
|
+
fullWidth?: boolean;
|
|
56
|
+
textAlign?: 'left' | 'center' | 'right' | 'justify';
|
|
57
|
+
width?: string | number;
|
|
58
|
+
height?: string | number;
|
|
59
|
+
gridTemplateColumns?: string;
|
|
60
|
+
backgroundColor?: BoxBackgroundColor;
|
|
61
|
+
border?: boolean;
|
|
62
|
+
borderBottom?: boolean;
|
|
63
|
+
borderColor?: BoxBorderColor;
|
|
64
|
+
borderRadius?: BoxBorderRadius;
|
|
65
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
font-family: var(--ds-font-family-base);
|
|
3
|
+
font-size: var(--ds-font-size-sm);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.list {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-wrap: wrap;
|
|
9
|
+
align-items: center;
|
|
10
|
+
list-style: none;
|
|
11
|
+
padding: 0;
|
|
12
|
+
margin: 0;
|
|
13
|
+
gap: var(--ds-space-2);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.item {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.link {
|
|
22
|
+
color: var(--ds-text-2);
|
|
23
|
+
text-decoration: none;
|
|
24
|
+
transition: color var(--ds-transition-fast);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.link:hover:not(.current) {
|
|
28
|
+
color: var(--ds-info);
|
|
29
|
+
text-decoration: underline;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.current {
|
|
33
|
+
color: var(--ds-text-1);
|
|
34
|
+
font-weight: var(--ds-font-weight-medium);
|
|
35
|
+
cursor: default;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.separator {
|
|
39
|
+
color: var(--ds-text-2);
|
|
40
|
+
user-select: none;
|
|
41
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
|
|
3
|
+
import { Breadcrumbs, BreadcrumbItem } from './Breadcrumbs.tsx';
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: 'Components/Breadcrumbs',
|
|
7
|
+
component: Breadcrumbs,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'centered',
|
|
11
|
+
},
|
|
12
|
+
} satisfies Meta<typeof Breadcrumbs>;
|
|
13
|
+
|
|
14
|
+
export default meta;
|
|
15
|
+
type Story = StoryObj<typeof meta>;
|
|
16
|
+
|
|
17
|
+
export const Default: Story = {
|
|
18
|
+
args: {},
|
|
19
|
+
render: (args) => (
|
|
20
|
+
<Breadcrumbs {...args}>
|
|
21
|
+
<BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
22
|
+
<BreadcrumbItem href="/components">Components</BreadcrumbItem>
|
|
23
|
+
<BreadcrumbItem isCurrent>Breadcrumbs</BreadcrumbItem>
|
|
24
|
+
</Breadcrumbs>
|
|
25
|
+
),
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const CustomSeparator: Story = {
|
|
29
|
+
args: {
|
|
30
|
+
separator: '>',
|
|
31
|
+
},
|
|
32
|
+
render: (args) => (
|
|
33
|
+
<Breadcrumbs {...args}>
|
|
34
|
+
<BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
35
|
+
<BreadcrumbItem href="/projects">Projects</BreadcrumbItem>
|
|
36
|
+
<BreadcrumbItem href="/projects/123">Project Details</BreadcrumbItem>
|
|
37
|
+
<BreadcrumbItem isCurrent>Settings</BreadcrumbItem>
|
|
38
|
+
</Breadcrumbs>
|
|
39
|
+
),
|
|
40
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import { Children, Fragment } from 'react';
|
|
3
|
+
|
|
4
|
+
import styles from './Breadcrumbs.module.css';
|
|
5
|
+
import type { BreadcrumbsProps, BreadcrumbItemProps } from './Breadcrumbs.types.ts';
|
|
6
|
+
|
|
7
|
+
export const BreadcrumbItem = ({
|
|
8
|
+
href,
|
|
9
|
+
isCurrent,
|
|
10
|
+
children,
|
|
11
|
+
className,
|
|
12
|
+
...props
|
|
13
|
+
}: BreadcrumbItemProps) => {
|
|
14
|
+
const Component = href && !isCurrent ? 'a' : 'span';
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<li className={styles.item}>
|
|
18
|
+
<Component
|
|
19
|
+
href={href}
|
|
20
|
+
className={clsx(styles.link, isCurrent && styles.current, className)}
|
|
21
|
+
aria-current={isCurrent ? 'page' : undefined}
|
|
22
|
+
{...props}
|
|
23
|
+
>
|
|
24
|
+
{children}
|
|
25
|
+
</Component>
|
|
26
|
+
</li>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const Breadcrumbs = ({
|
|
31
|
+
children,
|
|
32
|
+
separator = '/',
|
|
33
|
+
className,
|
|
34
|
+
...props
|
|
35
|
+
}: BreadcrumbsProps) => {
|
|
36
|
+
const items = Children.toArray(children);
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<nav aria-label="Breadcrumbs" className={clsx(styles.root, className)} {...props}>
|
|
40
|
+
<ol className={styles.list}>
|
|
41
|
+
{items.map((item, index) => (
|
|
42
|
+
<Fragment key={index}>
|
|
43
|
+
{item}
|
|
44
|
+
{index < items.length - 1 && (
|
|
45
|
+
<li className={styles.separator} aria-hidden="true">
|
|
46
|
+
{separator}
|
|
47
|
+
</li>
|
|
48
|
+
)}
|
|
49
|
+
</Fragment>
|
|
50
|
+
))}
|
|
51
|
+
</ol>
|
|
52
|
+
</nav>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode, AnchorHTMLAttributes, HTMLAttributes } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
separator?: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface BreadcrumbItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
10
|
+
href?: string;
|
|
11
|
+
isCurrent?: boolean;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
/* 1. Base Reset & Layout */
|
|
3
|
+
all: unset; /* Remove default browser styling */
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-content: center;
|
|
8
|
+
cursor: pointer;
|
|
9
|
+
user-select: none;
|
|
10
|
+
gap: var(--ds-space-2);
|
|
11
|
+
|
|
12
|
+
/* 2. Typography & Shape */
|
|
13
|
+
font-family: var(--ds-font-family-base);
|
|
14
|
+
font-weight: var(--ds-font-weight-medium);
|
|
15
|
+
border-radius: var(--ds-radius-md);
|
|
16
|
+
text-align: center;
|
|
17
|
+
white-space: nowrap;
|
|
18
|
+
|
|
19
|
+
/* 3. Global Transitions */
|
|
20
|
+
transition:
|
|
21
|
+
background-color var(--ds-transition-fast),
|
|
22
|
+
color var(--ds-transition-fast),
|
|
23
|
+
border-color var(--ds-transition-fast),
|
|
24
|
+
box-shadow var(--ds-transition-fast),
|
|
25
|
+
transform var(--ds-transition-fast);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Size Mapping - 5 Size Scale */
|
|
29
|
+
|
|
30
|
+
/* Extra Small: For tight UI like compact headers or tables */
|
|
31
|
+
.xs {
|
|
32
|
+
height: var(--ds-space-6); /* 24px */
|
|
33
|
+
padding: 0 var(--ds-space-2);
|
|
34
|
+
font-size: var(--ds-font-size-xs);
|
|
35
|
+
gap: var(--ds-space-1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Small: Standard secondary action size */
|
|
39
|
+
.sm {
|
|
40
|
+
height: var(--ds-space-8); /* 32px */
|
|
41
|
+
padding: 0 var(--ds-space-3);
|
|
42
|
+
font-size: var(--ds-font-size-xs);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Medium: The default size for most UI */
|
|
46
|
+
.md {
|
|
47
|
+
height: calc(var(--ds-space-4) * 2.5); /* 40px */
|
|
48
|
+
padding: 0 var(--ds-space-4);
|
|
49
|
+
font-size: var(--ds-font-size-sm);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Large: Primary page actions */
|
|
53
|
+
.lg {
|
|
54
|
+
height: var(--ds-space-12); /* 48px */
|
|
55
|
+
padding: 0 var(--ds-space-6);
|
|
56
|
+
font-size: var(--ds-font-size-base);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Extra Large: Large hero sections or mobile-first primary buttons */
|
|
60
|
+
.xl {
|
|
61
|
+
height: var(--ds-space-14); /* 56px */
|
|
62
|
+
padding: 0 var(--ds-space-8);
|
|
63
|
+
font-size: var(--ds-font-size-lg);
|
|
64
|
+
font-weight: var(--ds-font-weight-bold);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Variant Mapping ... */
|
|
68
|
+
|
|
69
|
+
/* Solid: The main call to action */
|
|
70
|
+
.solid {
|
|
71
|
+
background-color: var(--ds-neutral);
|
|
72
|
+
color: var(--ds-text-on-brand);
|
|
73
|
+
}
|
|
74
|
+
.solid:hover:not(:disabled) {
|
|
75
|
+
background-color: var(--ds-neutral-hover);
|
|
76
|
+
}
|
|
77
|
+
.solid:active:not(:disabled) {
|
|
78
|
+
background-color: var(--ds-neutral-active);
|
|
79
|
+
transform: translateY(0.0625rem);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.solid.success {
|
|
83
|
+
background-color: var(--ds-success);
|
|
84
|
+
}
|
|
85
|
+
.solid.success:hover:not(:disabled) {
|
|
86
|
+
background-color: var(--ds-success-hover);
|
|
87
|
+
}
|
|
88
|
+
.solid.success:active:not(:disabled) {
|
|
89
|
+
background-color: var(--ds-success-active);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.solid.warning {
|
|
93
|
+
background-color: var(--ds-warning);
|
|
94
|
+
}
|
|
95
|
+
.solid.warning:hover:not(:disabled) {
|
|
96
|
+
background-color: var(--ds-warning-hover);
|
|
97
|
+
}
|
|
98
|
+
.solid.warning:active:not(:disabled) {
|
|
99
|
+
background-color: var(--ds-warning-active);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.solid.danger {
|
|
103
|
+
background-color: var(--ds-danger);
|
|
104
|
+
}
|
|
105
|
+
.solid.danger:hover:not(:disabled) {
|
|
106
|
+
background-color: var(--ds-danger-hover);
|
|
107
|
+
}
|
|
108
|
+
.solid.danger:active:not(:disabled) {
|
|
109
|
+
background-color: var(--ds-danger-active);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.solid.info {
|
|
113
|
+
background-color: var(--ds-info);
|
|
114
|
+
}
|
|
115
|
+
.solid.info:hover:not(:disabled) {
|
|
116
|
+
background-color: var(--ds-info-hover);
|
|
117
|
+
}
|
|
118
|
+
.solid.info:active:not(:disabled) {
|
|
119
|
+
background-color: var(--ds-info-active);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* Outline: Outline or subtle background */
|
|
123
|
+
.outline {
|
|
124
|
+
background-color: transparent;
|
|
125
|
+
color: var(--ds-neutral);
|
|
126
|
+
border: 1px solid var(--ds-neutral);
|
|
127
|
+
}
|
|
128
|
+
.outline:hover:not(:disabled) {
|
|
129
|
+
background-color: var(--ds-neutral-hover);
|
|
130
|
+
color: var(--ds-text-on-brand);
|
|
131
|
+
border-color: var(--ds-neutral-hover);
|
|
132
|
+
}
|
|
133
|
+
.outline:active:not(:disabled) {
|
|
134
|
+
background-color: var(--ds-neutral-active);
|
|
135
|
+
color: var(--ds-text-on-brand);
|
|
136
|
+
border-color: var(--ds-neutral-active);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.outline.success {
|
|
140
|
+
color: var(--ds-success);
|
|
141
|
+
border-color: var(--ds-success);
|
|
142
|
+
}
|
|
143
|
+
.outline.success:hover:not(:disabled) {
|
|
144
|
+
background-color: var(--ds-success-hover);
|
|
145
|
+
border-color: var(--ds-success-hover);
|
|
146
|
+
}
|
|
147
|
+
.outline.success:active:not(:disabled) {
|
|
148
|
+
background-color: var(--ds-success-active);
|
|
149
|
+
border-color: var(--ds-success-active);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.outline.warning {
|
|
153
|
+
color: var(--ds-warning);
|
|
154
|
+
border-color: var(--ds-warning);
|
|
155
|
+
}
|
|
156
|
+
.outline.warning:hover:not(:disabled) {
|
|
157
|
+
background-color: var(--ds-warning-hover);
|
|
158
|
+
border-color: var(--ds-warning-hover);
|
|
159
|
+
}
|
|
160
|
+
.outline.warning:active:not(:disabled) {
|
|
161
|
+
background-color: var(--ds-warning-active);
|
|
162
|
+
border-color: var(--ds-warning-active);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.outline.danger {
|
|
166
|
+
color: var(--ds-danger);
|
|
167
|
+
border-color: var(--ds-danger);
|
|
168
|
+
}
|
|
169
|
+
.outline.danger:hover:not(:disabled) {
|
|
170
|
+
background-color: var(--ds-danger-hover);
|
|
171
|
+
border-color: var(--ds-danger-hover);
|
|
172
|
+
}
|
|
173
|
+
.outline.danger:active:not(:disabled) {
|
|
174
|
+
background-color: var(--ds-danger-active);
|
|
175
|
+
border-color: var(--ds-danger-active);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.outline.info {
|
|
179
|
+
color: var(--ds-info);
|
|
180
|
+
border-color: var(--ds-info);
|
|
181
|
+
}
|
|
182
|
+
.outline.info:hover:not(:disabled) {
|
|
183
|
+
background-color: var(--ds-info-hover);
|
|
184
|
+
border-color: var(--ds-info-hover);
|
|
185
|
+
}
|
|
186
|
+
.outline.info:active:not(:disabled) {
|
|
187
|
+
background-color: var(--ds-info-active);
|
|
188
|
+
border-color: var(--ds-info-active);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Subtle: Minimalist, used in toolbars */
|
|
192
|
+
.subtle {
|
|
193
|
+
background-color: transparent;
|
|
194
|
+
color: var(--ds-neutral);
|
|
195
|
+
}
|
|
196
|
+
.subtle:hover:not(:disabled) {
|
|
197
|
+
background-color: var(--ds-surface-1);
|
|
198
|
+
}
|
|
199
|
+
.subtle:active:not(:disabled) {
|
|
200
|
+
background-color: var(--ds-surface-1);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.subtle.success {
|
|
204
|
+
color: var(--ds-success);
|
|
205
|
+
}
|
|
206
|
+
.subtle.success:hover:not(:disabled) {
|
|
207
|
+
background-color: var(--ds-success-subtle);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.subtle.warning {
|
|
211
|
+
color: var(--ds-warning);
|
|
212
|
+
}
|
|
213
|
+
.subtle.warning:hover:not(:disabled) {
|
|
214
|
+
background-color: var(--ds-warning-subtle);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.subtle.danger {
|
|
218
|
+
color: var(--ds-danger);
|
|
219
|
+
}
|
|
220
|
+
.subtle.danger:hover:not(:disabled) {
|
|
221
|
+
background-color: var(--ds-danger-subtle);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.subtle.info {
|
|
225
|
+
color: var(--ds-info);
|
|
226
|
+
}
|
|
227
|
+
.subtle.info:hover:not(:disabled) {
|
|
228
|
+
background-color: var(--ds-info-subtle);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* --- Global States --- */
|
|
232
|
+
.root:focus-visible {
|
|
233
|
+
outline: none;
|
|
234
|
+
box-shadow:
|
|
235
|
+
0 0 0 2px var(--ds-ring-offset),
|
|
236
|
+
0 0 0 4px var(--ds-ring);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.root:disabled {
|
|
240
|
+
opacity: 0.5;
|
|
241
|
+
cursor: not-allowed;
|
|
242
|
+
filter: grayscale(0.8);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.fullWidth {
|
|
246
|
+
width: 100%;
|
|
247
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { fn } from 'storybook/test';
|
|
3
|
+
|
|
4
|
+
import { Button } from './Button.tsx';
|
|
5
|
+
import { Box } from '../Box/Box.tsx';
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: 'Components/Button',
|
|
9
|
+
component: Button,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'centered',
|
|
12
|
+
},
|
|
13
|
+
tags: ['autodocs'],
|
|
14
|
+
args: { onClick: fn() },
|
|
15
|
+
} satisfies Meta<typeof Button>;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
export const Solid: Story = {
|
|
21
|
+
args: {
|
|
22
|
+
variant: 'solid',
|
|
23
|
+
children: 'Button',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const Subtle: Story = {
|
|
28
|
+
args: {
|
|
29
|
+
variant: 'subtle',
|
|
30
|
+
children: 'Button',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const Outline: Story = {
|
|
35
|
+
args: {
|
|
36
|
+
variant: 'outline',
|
|
37
|
+
children: 'Button',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const ExtraSmall: Story = {
|
|
42
|
+
args: {
|
|
43
|
+
size: 'xs',
|
|
44
|
+
children: 'Button',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const Small: Story = {
|
|
49
|
+
args: {
|
|
50
|
+
size: 'sm',
|
|
51
|
+
children: 'Button',
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const Large: Story = {
|
|
56
|
+
args: {
|
|
57
|
+
size: 'lg',
|
|
58
|
+
children: 'Button',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const ExtraLarge: Story = {
|
|
63
|
+
args: {
|
|
64
|
+
size: 'xl',
|
|
65
|
+
children: 'Button',
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const All: Story = {
|
|
70
|
+
name: 'Gallery',
|
|
71
|
+
render: () => (
|
|
72
|
+
<Box display="flex" flexDirection="column" gap={8}>
|
|
73
|
+
{(['solid', 'subtle', 'outline'] as const).map((variant) => (
|
|
74
|
+
<Box key={variant} display="flex" flexDirection="column" gap={4}>
|
|
75
|
+
<Box as="h3" m={0} style={{ textTransform: 'capitalize' }}>
|
|
76
|
+
{variant}
|
|
77
|
+
</Box>
|
|
78
|
+
<Box display="flex" flexWrap="wrap" gap={4}>
|
|
79
|
+
{(['neutral', 'success', 'warning', 'danger', 'info'] as const).map((intent) => (
|
|
80
|
+
<Box key={intent} display="flex" gap={2} alignItems="center">
|
|
81
|
+
{(['xs', 'sm', 'md', 'lg', 'xl'] as const).map((size) => (
|
|
82
|
+
<Button key={size} variant={variant} intent={intent} size={size}>
|
|
83
|
+
Button
|
|
84
|
+
</Button>
|
|
85
|
+
))}
|
|
86
|
+
</Box>
|
|
87
|
+
))}
|
|
88
|
+
</Box>
|
|
89
|
+
</Box>
|
|
90
|
+
))}
|
|
91
|
+
</Box>
|
|
92
|
+
),
|
|
93
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
|
|
3
|
+
import styles from './Button.module.css';
|
|
4
|
+
import type { ButtonProps } from './Button.types.ts';
|
|
5
|
+
|
|
6
|
+
export const Button = ({
|
|
7
|
+
size = 'md',
|
|
8
|
+
variant = 'outline',
|
|
9
|
+
intent = 'neutral',
|
|
10
|
+
fullWidth = false,
|
|
11
|
+
className,
|
|
12
|
+
children,
|
|
13
|
+
...props
|
|
14
|
+
}: ButtonProps) => {
|
|
15
|
+
return (
|
|
16
|
+
<button
|
|
17
|
+
type="button"
|
|
18
|
+
className={clsx(
|
|
19
|
+
styles.root,
|
|
20
|
+
styles[size],
|
|
21
|
+
styles[variant],
|
|
22
|
+
styles[intent],
|
|
23
|
+
fullWidth && styles.fullWidth,
|
|
24
|
+
className
|
|
25
|
+
)}
|
|
26
|
+
{...props}
|
|
27
|
+
>
|
|
28
|
+
{children}
|
|
29
|
+
</button>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ButtonHTMLAttributes } from 'react';
|
|
2
|
+
|
|
3
|
+
export type ButtonVariant = 'solid' | 'subtle' | 'outline';
|
|
4
|
+
export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
5
|
+
export type ButtonIntent = 'neutral' | 'success' | 'warning' | 'danger' | 'info';
|
|
6
|
+
|
|
7
|
+
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
8
|
+
variant?: ButtonVariant;
|
|
9
|
+
size?: ButtonSize;
|
|
10
|
+
intent?: ButtonIntent;
|
|
11
|
+
isLoading?: boolean;
|
|
12
|
+
fullWidth?: boolean;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|