doom-design-system 0.1.7 → 0.1.8
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/README.md +23 -20
- package/dist/DesignSystemProvider.d.ts +1 -0
- package/dist/DesignSystemProvider.js +3 -4
- package/dist/components/Accordion/Accordion.js +5 -63
- package/dist/components/Accordion/Accordion.module.css +69 -0
- package/dist/components/ActionRow/ActionRow.js +3 -28
- package/dist/components/ActionRow/ActionRow.module.css +24 -0
- package/dist/components/Alert/Alert.js +3 -58
- package/dist/components/Alert/Alert.module.css +77 -0
- package/dist/components/Avatar/Avatar.js +3 -45
- package/dist/components/Avatar/Avatar.module.css +67 -0
- package/dist/components/Badge/Badge.d.ts +1 -1
- package/dist/components/Badge/Badge.js +4 -42
- package/dist/components/Badge/Badge.module.css +31 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.js +6 -38
- package/dist/components/Breadcrumbs/Breadcrumbs.module.css +34 -0
- package/dist/components/Button/Button.d.ts +1 -1
- package/dist/components/Button/Button.js +5 -129
- package/dist/components/Button/Button.module.css +112 -0
- package/dist/components/Card/Card.d.ts +1 -1
- package/dist/components/Card/Card.js +4 -13
- package/dist/components/Card/Card.module.css +8 -0
- package/dist/components/Drawer/Drawer.js +5 -71
- package/dist/components/Drawer/Drawer.module.css +75 -0
- package/dist/components/Dropdown/Dropdown.d.ts +2 -1
- package/dist/components/Dropdown/Dropdown.js +6 -39
- package/dist/components/Dropdown/Dropdown.module.css +33 -0
- package/dist/components/Form/Form.d.ts +4 -9
- package/dist/components/Form/Form.js +9 -43
- package/dist/components/Form/Form.module.css +41 -0
- package/dist/components/Input/Input.js +3 -59
- package/dist/components/Input/Input.module.css +86 -0
- package/dist/components/Label/Label.d.ts +1 -1
- package/dist/components/Label/Label.js +4 -23
- package/dist/components/Label/Label.module.css +16 -0
- package/dist/components/Layout/Layout.d.ts +2 -2
- package/dist/components/Layout/Layout.js +5 -20
- package/dist/components/Layout/Layout.module.css +7 -0
- package/dist/components/Link/Link.d.ts +2 -1
- package/dist/components/Link/Link.js +4 -62
- package/dist/components/Link/Link.module.css +48 -0
- package/dist/components/Modal/Modal.js +9 -52
- package/dist/components/Modal/Modal.module.css +57 -0
- package/dist/components/Page/Page.js +3 -23
- package/dist/components/Page/Page.module.css +23 -0
- package/dist/components/Pagination/Pagination.js +4 -42
- package/dist/components/Pagination/Pagination.module.css +43 -0
- package/dist/components/Popover/Popover.js +21 -26
- package/dist/components/Popover/Popover.module.css +19 -0
- package/dist/components/ProgressBar/ProgressBar.js +7 -37
- package/dist/components/ProgressBar/ProgressBar.module.css +31 -0
- package/dist/components/RadioGroup/RadioGroup.js +4 -79
- package/dist/components/RadioGroup/RadioGroup.module.css +81 -0
- package/dist/components/Select/Select.js +6 -80
- package/dist/components/Select/Select.module.css +89 -0
- package/dist/components/Sheet/Sheet.js +5 -56
- package/dist/components/Sheet/Sheet.module.css +64 -0
- package/dist/components/Skeleton/Skeleton.js +4 -49
- package/dist/components/Skeleton/Skeleton.module.css +29 -0
- package/dist/components/Slider/Slider.js +3 -140
- package/dist/components/Slider/Slider.module.css +130 -0
- package/dist/components/SplitButton/SplitButton.d.ts +2 -1
- package/dist/components/SplitButton/SplitButton.js +6 -82
- package/dist/components/SplitButton/SplitButton.module.css +79 -0
- package/dist/components/Switch/Switch.js +3 -54
- package/dist/components/Switch/Switch.module.css +64 -0
- package/dist/components/Table/Table.d.ts +1 -1
- package/dist/components/Table/Table.js +13 -109
- package/dist/components/Table/Table.module.css +111 -0
- package/dist/components/Tabs/Tabs.js +7 -56
- package/dist/components/Tabs/Tabs.module.css +65 -0
- package/dist/components/Text/Text.js +4 -106
- package/dist/components/Text/Text.module.css +123 -0
- package/dist/components/Textarea/Textarea.d.ts +1 -1
- package/dist/components/Textarea/Textarea.js +16 -20
- package/dist/components/Textarea/Textarea.module.css +23 -0
- package/dist/components/Toast/Toast.js +3 -67
- package/dist/components/Toast/Toast.module.css +87 -0
- package/dist/components/Tooltip/Tooltip.js +3 -19
- package/dist/components/Tooltip/Tooltip.module.css +17 -0
- package/dist/styles/globals.css +999 -0
- package/dist/styles/themes/ThemeProvider.js +4 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -5
- package/dist/styles/index.d.ts +0 -3
- package/dist/styles/index.js +0 -3
- package/dist/styles/mixins.d.ts +0 -3
- package/dist/styles/mixins.js +0 -25
- package/dist/styles/reset.d.ts +0 -1
- package/dist/styles/reset.js +0 -29
- package/dist/styles/theme.d.ts +0 -1
- package/dist/styles/theme.js +0 -11
- package/dist/styles/utilities.d.ts +0 -1
- package/dist/styles/utilities.js +0 -184
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
.badge {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
padding: 0.25rem 0.75rem;
|
|
5
|
+
border-radius: var(--radius-pill);
|
|
6
|
+
font-size: 0.75rem;
|
|
7
|
+
font-weight: 700;
|
|
8
|
+
text-transform: uppercase;
|
|
9
|
+
border: 2px solid var(--card-border);
|
|
10
|
+
box-shadow: 2px 2px 0px 0px var(--card-border);
|
|
11
|
+
}
|
|
12
|
+
.badge.primary {
|
|
13
|
+
background-color: var(--primary);
|
|
14
|
+
color: var(--primary-foreground);
|
|
15
|
+
}
|
|
16
|
+
.badge.success {
|
|
17
|
+
background-color: var(--success);
|
|
18
|
+
color: var(--card-bg);
|
|
19
|
+
}
|
|
20
|
+
.badge.warning {
|
|
21
|
+
background-color: var(--warning);
|
|
22
|
+
color: var(--card-bg);
|
|
23
|
+
}
|
|
24
|
+
.badge.error {
|
|
25
|
+
background-color: var(--error);
|
|
26
|
+
color: var(--card-bg);
|
|
27
|
+
}
|
|
28
|
+
.badge.secondary {
|
|
29
|
+
background-color: var(--secondary);
|
|
30
|
+
color: var(--secondary-foreground);
|
|
31
|
+
}
|
|
@@ -1,46 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import
|
|
4
|
-
import { Link } from '../Link';
|
|
5
|
-
|
|
6
|
-
display: flex;
|
|
7
|
-
align-items: center;
|
|
8
|
-
font-size: var(--text-sm);
|
|
9
|
-
color: var(--muted-foreground);
|
|
10
|
-
`;
|
|
11
|
-
const BreadcrumbList = styled.ol `
|
|
12
|
-
display: flex;
|
|
13
|
-
flex-wrap: wrap;
|
|
14
|
-
align-items: center;
|
|
15
|
-
padding: 0;
|
|
16
|
-
margin: 0;
|
|
17
|
-
list-style: none;
|
|
18
|
-
gap: 0.5rem;
|
|
19
|
-
`;
|
|
20
|
-
const BreadcrumbLi = styled.li `
|
|
21
|
-
display: inline-flex;
|
|
22
|
-
align-items: center;
|
|
23
|
-
gap: 0.5rem;
|
|
24
|
-
|
|
25
|
-
&:not(:last-child)::after {
|
|
26
|
-
/* Separator */
|
|
27
|
-
content: '/';
|
|
28
|
-
margin-left: 0.25rem;
|
|
29
|
-
color: var(--muted-foreground);
|
|
30
|
-
opacity: 0.5;
|
|
31
|
-
font-weight: 700;
|
|
32
|
-
}
|
|
33
|
-
`;
|
|
34
|
-
const CurrentPage = styled.span `
|
|
35
|
-
font-weight: 700;
|
|
36
|
-
color: var(--foreground);
|
|
37
|
-
`;
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { Link } from '../Link/Link';
|
|
5
|
+
import styles from './Breadcrumbs.module.css';
|
|
38
6
|
export function Breadcrumbs({ children, className }) {
|
|
39
|
-
return (_jsx(
|
|
7
|
+
return (_jsx("nav", { "aria-label": "breadcrumb", className: clsx(styles.nav, className), children: _jsx("ol", { className: styles.list, children: children }) }));
|
|
40
8
|
}
|
|
41
9
|
export function BreadcrumbItem({ href, isCurrent, children }) {
|
|
42
10
|
if (isCurrent) {
|
|
43
|
-
return (_jsx(
|
|
11
|
+
return (_jsx("li", { className: styles.li, "aria-current": "page", children: _jsx("span", { className: styles.currentPage, children: children }) }));
|
|
44
12
|
}
|
|
45
|
-
return (_jsx(
|
|
13
|
+
return (_jsx("li", { className: styles.li, children: href ? (_jsx(Link, { href: href, variant: "default", style: { fontSize: 'inherit' }, children: children })) : (_jsx("span", { children: children })) }));
|
|
46
14
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.nav {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
font-size: var(--text-sm);
|
|
5
|
+
color: var(--muted-foreground);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.list {
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-wrap: wrap;
|
|
11
|
+
align-items: center;
|
|
12
|
+
padding: 0;
|
|
13
|
+
margin: 0;
|
|
14
|
+
list-style: none;
|
|
15
|
+
gap: 0.5rem;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.li {
|
|
19
|
+
display: inline-flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
gap: 0.5rem;
|
|
22
|
+
}
|
|
23
|
+
.li:not(:last-child)::after {
|
|
24
|
+
content: "/";
|
|
25
|
+
margin-left: 0.25rem;
|
|
26
|
+
color: var(--muted-foreground);
|
|
27
|
+
opacity: 0.5;
|
|
28
|
+
font-weight: 700;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.currentPage {
|
|
32
|
+
font-weight: 700;
|
|
33
|
+
color: var(--foreground);
|
|
34
|
+
}
|
|
@@ -5,5 +5,5 @@ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
|
5
5
|
variant?: ButtonVariant;
|
|
6
6
|
size?: ButtonSize;
|
|
7
7
|
}
|
|
8
|
-
export declare function Button({ children, variant, size, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function Button({ children, variant, size, className, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
9
9
|
export {};
|
|
@@ -11,134 +11,10 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
const StyledButton = styled.button `
|
|
17
|
-
--btn-focus-border: var(--primary);
|
|
18
|
-
--btn-focus-shadow: var(--shadow-primary);
|
|
19
|
-
|
|
20
|
-
display: inline-flex;
|
|
21
|
-
align-items: center;
|
|
22
|
-
justify-content: center;
|
|
23
|
-
border-radius: var(--radius);
|
|
24
|
-
font-weight: 700;
|
|
25
|
-
text-transform: uppercase;
|
|
26
|
-
letter-spacing: 0.05em;
|
|
27
|
-
transition:
|
|
28
|
-
transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1),
|
|
29
|
-
box-shadow 0.2s cubic-bezier(0.34, 1.56, 0.64, 1),
|
|
30
|
-
background-color 0.2s ease,
|
|
31
|
-
color 0.2s ease,
|
|
32
|
-
border-color 0.2s ease;
|
|
33
|
-
cursor: pointer;
|
|
34
|
-
border: var(--border-width) solid var(--card-border);
|
|
35
|
-
box-shadow: var(--shadow-hard);
|
|
36
|
-
background-color: var(--card-bg);
|
|
37
|
-
color: var(--foreground);
|
|
38
|
-
font-size: var(--text-base);
|
|
39
|
-
position: relative;
|
|
40
|
-
|
|
41
|
-
&:hover {
|
|
42
|
-
transform: translate(-2px, -2px);
|
|
43
|
-
box-shadow: var(--shadow-hover);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
&:focus {
|
|
47
|
-
outline: none;
|
|
48
|
-
box-shadow: 7px 7px 0px 0px var(--btn-focus-shadow);
|
|
49
|
-
transform: translate(-2px, -2px);
|
|
50
|
-
border-color: var(--btn-focus-border);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
&:active {
|
|
54
|
-
transition: none;
|
|
55
|
-
transform: translate(2px, 2px);
|
|
56
|
-
box-shadow: none;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
&:disabled {
|
|
60
|
-
opacity: 0.6;
|
|
61
|
-
cursor: not-allowed;
|
|
62
|
-
transform: none;
|
|
63
|
-
box-shadow: var(--shadow-hard);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/* Variants */
|
|
67
|
-
${props => props.variant === 'primary' && css `
|
|
68
|
-
/* Contrast Override */
|
|
69
|
-
--btn-focus-border: var(--card-border);
|
|
70
|
-
--btn-focus-shadow: #000000;
|
|
71
|
-
|
|
72
|
-
background-color: var(--primary);
|
|
73
|
-
color: var(--primary-foreground);
|
|
74
|
-
&:hover {
|
|
75
|
-
filter: brightness(1.1);
|
|
76
|
-
}
|
|
77
|
-
`}
|
|
78
|
-
|
|
79
|
-
${props => props.variant === 'secondary' && css `
|
|
80
|
-
/* Contrast Override */
|
|
81
|
-
--btn-focus-border: var(--card-border);
|
|
82
|
-
--btn-focus-shadow: #000000;
|
|
83
|
-
|
|
84
|
-
background-color: var(--secondary);
|
|
85
|
-
color: var(--secondary-foreground);
|
|
86
|
-
&:hover {
|
|
87
|
-
filter: brightness(1.1);
|
|
88
|
-
}
|
|
89
|
-
`}
|
|
90
|
-
|
|
91
|
-
${props => props.variant === 'success' && css `
|
|
92
|
-
/* Contrast Override */
|
|
93
|
-
--btn-focus-border: var(--card-border);
|
|
94
|
-
--btn-focus-shadow: #000000;
|
|
95
|
-
|
|
96
|
-
background-color: var(--success);
|
|
97
|
-
color: var(--card-bg);
|
|
98
|
-
&:hover {
|
|
99
|
-
filter: brightness(1.1);
|
|
100
|
-
}
|
|
101
|
-
`}
|
|
102
|
-
|
|
103
|
-
${props => props.variant === 'outline' && css `
|
|
104
|
-
background-color: transparent;
|
|
105
|
-
`}
|
|
106
|
-
|
|
107
|
-
${props => props.variant === 'ghost' && css `
|
|
108
|
-
background-color: transparent;
|
|
109
|
-
border-color: transparent;
|
|
110
|
-
box-shadow: none;
|
|
111
|
-
&:hover, &:focus {
|
|
112
|
-
background-color: color-mix(in srgb, var(--primary), transparent 90%);
|
|
113
|
-
color: var(--primary);
|
|
114
|
-
transform: none;
|
|
115
|
-
box-shadow: none;
|
|
116
|
-
border-color: transparent;
|
|
117
|
-
outline: none;
|
|
118
|
-
}
|
|
119
|
-
&:active {
|
|
120
|
-
transform: scale(0.95);
|
|
121
|
-
transition: none;
|
|
122
|
-
}
|
|
123
|
-
`}
|
|
124
|
-
|
|
125
|
-
/* Sizes */
|
|
126
|
-
${props => props.size === 'sm' && css `
|
|
127
|
-
padding: 0.25rem 0.5rem;
|
|
128
|
-
font-size: var(--text-sm);
|
|
129
|
-
`}
|
|
130
|
-
|
|
131
|
-
${props => props.size === 'md' && css `
|
|
132
|
-
padding: 0.75rem 1.5rem;
|
|
133
|
-
font-size: var(--text-base);
|
|
134
|
-
`}
|
|
135
|
-
|
|
136
|
-
${props => props.size === 'lg' && css `
|
|
137
|
-
padding: 1rem 2rem;
|
|
138
|
-
font-size: var(--text-lg);
|
|
139
|
-
`}
|
|
140
|
-
`;
|
|
14
|
+
import clsx from 'clsx';
|
|
15
|
+
import styles from './Button.module.css';
|
|
141
16
|
export function Button(_a) {
|
|
142
|
-
var { children, variant = 'primary', size = 'md' } = _a, props = __rest(_a, ["children", "variant", "size"]);
|
|
143
|
-
|
|
17
|
+
var { children, variant = 'primary', size = 'md', className } = _a, props = __rest(_a, ["children", "variant", "size", "className"]);
|
|
18
|
+
const buttonClass = clsx(styles.button, styles[variant], styles[size], className);
|
|
19
|
+
return (_jsx("button", Object.assign({ className: buttonClass }, props, { children: children })));
|
|
144
20
|
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
.button {
|
|
2
|
+
--btn-focus-border: var(--primary);
|
|
3
|
+
--btn-focus-shadow: var(--shadow-primary);
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
justify-content: center;
|
|
7
|
+
border-radius: var(--radius);
|
|
8
|
+
font-weight: 700;
|
|
9
|
+
text-transform: uppercase;
|
|
10
|
+
letter-spacing: 0.05em;
|
|
11
|
+
transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
border: var(--border-width) solid var(--card-border);
|
|
14
|
+
box-shadow: var(--shadow-hard);
|
|
15
|
+
background-color: var(--card-bg);
|
|
16
|
+
color: var(--foreground);
|
|
17
|
+
font-size: var(--text-base);
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
.button:hover {
|
|
21
|
+
transform: translate(-2px, -2px);
|
|
22
|
+
box-shadow: var(--shadow-hover);
|
|
23
|
+
}
|
|
24
|
+
.button:focus {
|
|
25
|
+
outline: none;
|
|
26
|
+
box-shadow: 7px 7px 0px 0px var(--btn-focus-shadow);
|
|
27
|
+
transform: translate(-2px, -2px);
|
|
28
|
+
border-color: var(--btn-focus-border);
|
|
29
|
+
}
|
|
30
|
+
.button:active {
|
|
31
|
+
transition: none;
|
|
32
|
+
transform: translate(2px, 2px);
|
|
33
|
+
box-shadow: none;
|
|
34
|
+
}
|
|
35
|
+
.button:disabled {
|
|
36
|
+
opacity: 0.6;
|
|
37
|
+
cursor: not-allowed;
|
|
38
|
+
transform: none;
|
|
39
|
+
box-shadow: var(--shadow-hard);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Variants */
|
|
43
|
+
.primary {
|
|
44
|
+
/* Contrast Override */
|
|
45
|
+
--btn-focus-border: var(--card-border);
|
|
46
|
+
--btn-focus-shadow: #000000;
|
|
47
|
+
background-color: var(--primary);
|
|
48
|
+
color: var(--primary-foreground);
|
|
49
|
+
}
|
|
50
|
+
.primary:hover {
|
|
51
|
+
filter: brightness(1.1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.secondary {
|
|
55
|
+
/* Contrast Override */
|
|
56
|
+
--btn-focus-border: var(--card-border);
|
|
57
|
+
--btn-focus-shadow: #000000;
|
|
58
|
+
background-color: var(--secondary);
|
|
59
|
+
color: var(--secondary-foreground);
|
|
60
|
+
}
|
|
61
|
+
.secondary:hover {
|
|
62
|
+
filter: brightness(1.1);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.success {
|
|
66
|
+
/* Contrast Override */
|
|
67
|
+
--btn-focus-border: var(--card-border);
|
|
68
|
+
--btn-focus-shadow: #000000;
|
|
69
|
+
background-color: var(--success);
|
|
70
|
+
color: var(--card-bg);
|
|
71
|
+
}
|
|
72
|
+
.success:hover {
|
|
73
|
+
filter: brightness(1.1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.outline {
|
|
77
|
+
background-color: transparent;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.ghost {
|
|
81
|
+
background-color: transparent;
|
|
82
|
+
border-color: transparent;
|
|
83
|
+
box-shadow: none;
|
|
84
|
+
}
|
|
85
|
+
.ghost:hover, .ghost:focus {
|
|
86
|
+
background-color: color-mix(in srgb, var(--primary), transparent 90%);
|
|
87
|
+
color: var(--primary);
|
|
88
|
+
transform: none;
|
|
89
|
+
box-shadow: none;
|
|
90
|
+
border-color: transparent;
|
|
91
|
+
outline: none;
|
|
92
|
+
}
|
|
93
|
+
.ghost:active {
|
|
94
|
+
transform: scale(0.95);
|
|
95
|
+
transition: none;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Sizes */
|
|
99
|
+
.sm {
|
|
100
|
+
padding: 0.25rem 0.5rem;
|
|
101
|
+
font-size: var(--text-sm);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.md {
|
|
105
|
+
padding: 0.75rem 1.5rem;
|
|
106
|
+
font-size: var(--text-base);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.lg {
|
|
110
|
+
padding: 1rem 2rem;
|
|
111
|
+
font-size: var(--text-lg);
|
|
112
|
+
}
|
|
@@ -4,5 +4,5 @@ interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
4
4
|
as?: React.ElementType;
|
|
5
5
|
disabled?: boolean;
|
|
6
6
|
}
|
|
7
|
-
export declare function Card({ children, className, as, ...props }: CardProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function Card({ children, className, as: Component, ...props }: CardProps): import("react/jsx-runtime").JSX.Element;
|
|
8
8
|
export {};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
'use client';
|
|
3
|
-
'use client';
|
|
4
2
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
5
3
|
var t = {};
|
|
6
4
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -13,16 +11,9 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
13
11
|
return t;
|
|
14
12
|
};
|
|
15
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
background-color: var(--card-bg);
|
|
19
|
-
border: var(--border-width) solid var(--card-border);
|
|
20
|
-
border-radius: var(--radius);
|
|
21
|
-
padding: var(--spacing-lg);
|
|
22
|
-
box-shadow: var(--shadow-hard);
|
|
23
|
-
min-width: 0; /* Safe default for grid/flex items */
|
|
24
|
-
`;
|
|
14
|
+
import clsx from 'clsx';
|
|
15
|
+
import styles from './Card.module.css';
|
|
25
16
|
export function Card(_a) {
|
|
26
|
-
var { children, className, as } = _a, props = __rest(_a, ["children", "className", "as"]);
|
|
27
|
-
return (_jsx(
|
|
17
|
+
var { children, className, as: Component = 'div' } = _a, props = __rest(_a, ["children", "className", "as"]);
|
|
18
|
+
return (_jsx(Component, Object.assign({ className: clsx(styles.card, className) }, props, { children: children })));
|
|
28
19
|
}
|
|
@@ -1,77 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import
|
|
3
|
+
import clsx from 'clsx';
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
|
-
import styled from '@emotion/styled';
|
|
6
5
|
import { X } from 'lucide-react';
|
|
7
|
-
import { Button } from '../Button';
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
position: fixed;
|
|
11
|
-
inset: 0;
|
|
12
|
-
background-color: rgba(0, 0, 0, var(--overlay-opacity));
|
|
13
|
-
backdrop-filter: blur(4px);
|
|
14
|
-
opacity: ${props => props.isOpen ? 1 : 0};
|
|
15
|
-
transition: opacity 0.2s ease-in-out;
|
|
16
|
-
pointer-events: ${props => props.isOpen ? 'auto' : 'none'};
|
|
17
|
-
z-index: var(--z-dropdown);
|
|
18
|
-
`;
|
|
19
|
-
const Panel = styled.div `
|
|
20
|
-
position: fixed;
|
|
21
|
-
background-color: var(--card-bg);
|
|
22
|
-
box-shadow: ${props => props.side === 'left'
|
|
23
|
-
? '8px 0px 0px 0px var(--card-border)'
|
|
24
|
-
: '-8px 0px 0px 0px var(--card-border)'};
|
|
25
|
-
z-index: var(--z-modal);
|
|
26
|
-
display: flex;
|
|
27
|
-
flex-direction: column;
|
|
28
|
-
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
|
|
29
|
-
|
|
30
|
-
top: 0;
|
|
31
|
-
bottom: 0;
|
|
32
|
-
${props => props.side}: 0;
|
|
33
|
-
width: 100%;
|
|
34
|
-
max-width: 400px;
|
|
35
|
-
|
|
36
|
-
${props => props.side === 'left' ? `
|
|
37
|
-
border-top-right-radius: var(--radius);
|
|
38
|
-
border-bottom-right-radius: var(--radius);
|
|
39
|
-
` : `
|
|
40
|
-
border-top-left-radius: var(--radius);
|
|
41
|
-
border-bottom-left-radius: var(--radius);
|
|
42
|
-
`}
|
|
43
|
-
|
|
44
|
-
visibility: ${props => props.isOpen ? 'visible' : 'hidden'};
|
|
45
|
-
|
|
46
|
-
transform: ${props => {
|
|
47
|
-
if (props.isOpen)
|
|
48
|
-
return 'translateX(0)';
|
|
49
|
-
return props.side === 'right' ? 'translateX(100%)' : 'translateX(-100%)';
|
|
50
|
-
}};
|
|
51
|
-
`;
|
|
52
|
-
const Header = styled(Flex) `
|
|
53
|
-
padding: var(--spacing-lg);
|
|
54
|
-
border-bottom-width: var(--border-width);
|
|
55
|
-
border-bottom-style: solid;
|
|
56
|
-
border-bottom-color: var(--card-border);
|
|
57
|
-
`;
|
|
58
|
-
const Title = styled.h2 `
|
|
59
|
-
margin: 0;
|
|
60
|
-
font-family: var(--font-heading);
|
|
61
|
-
font-size: var(--text-xl);
|
|
62
|
-
font-weight: 700;
|
|
63
|
-
`;
|
|
64
|
-
const Content = styled.div `
|
|
65
|
-
flex: 1;
|
|
66
|
-
padding: var(--spacing-lg);
|
|
67
|
-
overflow-y: auto;
|
|
68
|
-
`;
|
|
69
|
-
const Footer = styled(Flex) `
|
|
70
|
-
padding: var(--spacing-lg);
|
|
71
|
-
border-top-width: var(--border-width);
|
|
72
|
-
border-top-style: solid;
|
|
73
|
-
border-top-color: var(--card-border);
|
|
74
|
-
`;
|
|
6
|
+
import { Button } from '../Button/Button';
|
|
7
|
+
import styles from './Drawer.module.css';
|
|
8
|
+
import { useEffect, useState } from 'react';
|
|
75
9
|
export function Drawer({ isOpen, onClose, title, side = 'right', children, footer, className }) {
|
|
76
10
|
const [mounted, setMounted] = useState(false);
|
|
77
11
|
useEffect(() => {
|
|
@@ -97,5 +31,5 @@ export function Drawer({ isOpen, onClose, title, side = 'right', children, foote
|
|
|
97
31
|
}, [isOpen, onClose]);
|
|
98
32
|
if (!mounted)
|
|
99
33
|
return null;
|
|
100
|
-
return createPortal(_jsxs(_Fragment, { children: [_jsx(
|
|
34
|
+
return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: clsx(styles.overlay, isOpen && styles.open), onClick: onClose, "aria-hidden": "true" }), _jsxs("div", { className: clsx(styles.panel, styles[side], isOpen && styles.open, className), role: "dialog", "aria-modal": "true", children: [_jsxs("div", { className: styles.header, children: [_jsx("h2", { className: styles.title, children: title }), _jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, "aria-label": "Close drawer", children: _jsx(X, { size: 24 }) })] }), _jsx("div", { className: styles.content, children: children }), footer && _jsx("div", { className: styles.footer, children: footer })] })] }), document.body);
|
|
101
35
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
.overlay {
|
|
2
|
+
position: fixed;
|
|
3
|
+
inset: 0;
|
|
4
|
+
background-color: rgba(0, 0, 0, var(--overlay-opacity));
|
|
5
|
+
backdrop-filter: blur(4px);
|
|
6
|
+
opacity: 0;
|
|
7
|
+
transition: opacity 0.2s ease-in-out;
|
|
8
|
+
pointer-events: none;
|
|
9
|
+
z-index: var(--z-dropdown);
|
|
10
|
+
}
|
|
11
|
+
.overlay.open {
|
|
12
|
+
opacity: 1;
|
|
13
|
+
pointer-events: auto;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.panel {
|
|
17
|
+
position: fixed;
|
|
18
|
+
background-color: var(--card-bg);
|
|
19
|
+
z-index: var(--z-modal);
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
|
|
23
|
+
top: 0;
|
|
24
|
+
bottom: 0;
|
|
25
|
+
width: 100%;
|
|
26
|
+
max-width: 400px;
|
|
27
|
+
visibility: hidden;
|
|
28
|
+
}
|
|
29
|
+
.panel.left {
|
|
30
|
+
left: 0;
|
|
31
|
+
box-shadow: 8px 0px 0px 0px var(--card-border);
|
|
32
|
+
border-top-right-radius: var(--radius);
|
|
33
|
+
border-bottom-right-radius: var(--radius);
|
|
34
|
+
transform: translateX(-100%);
|
|
35
|
+
}
|
|
36
|
+
.panel.right {
|
|
37
|
+
right: 0;
|
|
38
|
+
box-shadow: -8px 0px 0px 0px var(--card-border);
|
|
39
|
+
border-top-left-radius: var(--radius);
|
|
40
|
+
border-bottom-left-radius: var(--radius);
|
|
41
|
+
transform: translateX(100%);
|
|
42
|
+
}
|
|
43
|
+
.panel.open {
|
|
44
|
+
visibility: visible;
|
|
45
|
+
transform: translateX(0);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.header {
|
|
49
|
+
padding: var(--spacing-lg);
|
|
50
|
+
border-bottom: var(--border-width) solid var(--card-border);
|
|
51
|
+
display: flex;
|
|
52
|
+
justify-content: space-between;
|
|
53
|
+
align-items: center;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.title {
|
|
57
|
+
margin: 0;
|
|
58
|
+
font-family: var(--font-heading);
|
|
59
|
+
font-size: var(--text-xl);
|
|
60
|
+
font-weight: 700;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.content {
|
|
64
|
+
flex: 1;
|
|
65
|
+
padding: var(--spacing-lg);
|
|
66
|
+
overflow-y: auto;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.footer {
|
|
70
|
+
padding: var(--spacing-lg);
|
|
71
|
+
border-top: var(--border-width) solid var(--card-border);
|
|
72
|
+
display: flex;
|
|
73
|
+
justify-content: flex-end;
|
|
74
|
+
gap: var(--spacing-md);
|
|
75
|
+
}
|
|
@@ -6,6 +6,7 @@ interface DropdownProps {
|
|
|
6
6
|
triggerLabel: string;
|
|
7
7
|
items: DropdownItemType[];
|
|
8
8
|
variant?: 'primary' | 'secondary';
|
|
9
|
+
className?: string;
|
|
9
10
|
}
|
|
10
|
-
export declare function Dropdown({ triggerLabel, items, variant }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function Dropdown({ triggerLabel, items, variant, className }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
11
12
|
export {};
|
|
@@ -1,46 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { Button } from '../Button/Button';
|
|
5
|
+
import { Popover } from '../Popover/Popover';
|
|
6
|
+
import styles from './Dropdown.module.css';
|
|
3
7
|
import { useState } from 'react';
|
|
4
|
-
|
|
5
|
-
import { Button, Popover } from '../..';
|
|
6
|
-
const StyledDropdownMenu = styled.div `
|
|
7
|
-
background: var(--card-bg);
|
|
8
|
-
border: var(--border-width) solid var(--primary);
|
|
9
|
-
border-radius: var(--radius);
|
|
10
|
-
box-shadow: var(--shadow-hover);
|
|
11
|
-
min-width: 200px;
|
|
12
|
-
overflow: hidden;
|
|
13
|
-
display: flex;
|
|
14
|
-
flex-direction: column;
|
|
15
|
-
gap: 0.25rem;
|
|
16
|
-
padding: 0.25rem;
|
|
17
|
-
`;
|
|
18
|
-
const DropdownItem = styled.button `
|
|
19
|
-
text-align: left;
|
|
20
|
-
padding: 0.75rem 1rem;
|
|
21
|
-
background: transparent;
|
|
22
|
-
border: none;
|
|
23
|
-
color: var(--foreground);
|
|
24
|
-
cursor: pointer;
|
|
25
|
-
border-radius: calc(var(--radius) - 2px);
|
|
26
|
-
font-size: var(--text-base);
|
|
27
|
-
transition: background-color 0.2s;
|
|
28
|
-
|
|
29
|
-
&:hover {
|
|
30
|
-
background-color: color-mix(in srgb, var(--primary), transparent 85%);
|
|
31
|
-
color: var(--primary);
|
|
32
|
-
}
|
|
33
|
-
`;
|
|
34
|
-
// Create a styled version of Button to handle the active state locally
|
|
35
|
-
const TriggerButton = styled(Button) `
|
|
36
|
-
&[aria-expanded="true"] {
|
|
37
|
-
transform: translate(-2px, -2px);
|
|
38
|
-
box-shadow: var(--shadow-hover);
|
|
39
|
-
}
|
|
40
|
-
`;
|
|
41
|
-
export function Dropdown({ triggerLabel, items, variant = 'primary' }) {
|
|
8
|
+
export function Dropdown({ triggerLabel, items, variant = 'primary', className }) {
|
|
42
9
|
const [isOpen, setIsOpen] = useState(false);
|
|
43
|
-
return (_jsx(Popover, { isOpen: isOpen, onClose: () => setIsOpen(false), placement: "bottom-start", trigger: _jsxs(
|
|
10
|
+
return (_jsx(Popover, { isOpen: isOpen, onClose: () => setIsOpen(false), placement: "bottom-start", trigger: _jsxs(Button, { variant: variant, onClick: () => setIsOpen(!isOpen), "aria-expanded": isOpen, className: clsx(styles.trigger, className), children: [triggerLabel, " ", _jsx("span", { style: { marginLeft: '0.5rem', fontSize: '0.8em' }, children: "\u25BC" })] }), content: _jsx("div", { className: styles.menu, children: items.map((item, index) => (_jsx("button", { className: styles.item, onClick: () => {
|
|
44
11
|
item.onClick();
|
|
45
12
|
setIsOpen(false);
|
|
46
13
|
}, children: item.label }, index))) }) }));
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
.menu {
|
|
2
|
+
background: var(--card-bg);
|
|
3
|
+
border: var(--border-width) solid var(--primary);
|
|
4
|
+
border-radius: var(--radius);
|
|
5
|
+
box-shadow: var(--shadow-hover);
|
|
6
|
+
min-width: 200px;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
gap: 0.25rem;
|
|
11
|
+
padding: 0.25rem;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.item {
|
|
15
|
+
text-align: left;
|
|
16
|
+
padding: 0.75rem 1rem;
|
|
17
|
+
background: transparent;
|
|
18
|
+
border: none;
|
|
19
|
+
color: var(--foreground);
|
|
20
|
+
cursor: pointer;
|
|
21
|
+
border-radius: calc(var(--radius) - 2px);
|
|
22
|
+
font-size: var(--text-base);
|
|
23
|
+
transition: background-color 0.2s;
|
|
24
|
+
}
|
|
25
|
+
.item:hover {
|
|
26
|
+
background-color: color-mix(in srgb, var(--primary), transparent 85%);
|
|
27
|
+
color: var(--primary);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.trigger[aria-expanded=true] {
|
|
31
|
+
transform: translate(-2px, -2px);
|
|
32
|
+
box-shadow: var(--shadow-hover);
|
|
33
|
+
}
|