doom-design-system 0.1.7 → 0.1.9

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.
Files changed (94) hide show
  1. package/README.md +23 -20
  2. package/dist/DesignSystemProvider.d.ts +1 -0
  3. package/dist/DesignSystemProvider.js +3 -4
  4. package/dist/components/Accordion/Accordion.js +5 -63
  5. package/dist/components/Accordion/Accordion.module.css +69 -0
  6. package/dist/components/ActionRow/ActionRow.js +3 -28
  7. package/dist/components/ActionRow/ActionRow.module.css +24 -0
  8. package/dist/components/Alert/Alert.js +3 -58
  9. package/dist/components/Alert/Alert.module.css +77 -0
  10. package/dist/components/Avatar/Avatar.js +3 -45
  11. package/dist/components/Avatar/Avatar.module.css +67 -0
  12. package/dist/components/Badge/Badge.d.ts +1 -1
  13. package/dist/components/Badge/Badge.js +4 -42
  14. package/dist/components/Badge/Badge.module.css +31 -0
  15. package/dist/components/Breadcrumbs/Breadcrumbs.js +6 -38
  16. package/dist/components/Breadcrumbs/Breadcrumbs.module.css +34 -0
  17. package/dist/components/Button/Button.d.ts +1 -1
  18. package/dist/components/Button/Button.js +5 -129
  19. package/dist/components/Button/Button.module.css +112 -0
  20. package/dist/components/Card/Card.d.ts +1 -1
  21. package/dist/components/Card/Card.js +4 -13
  22. package/dist/components/Card/Card.module.css +8 -0
  23. package/dist/components/Drawer/Drawer.js +5 -71
  24. package/dist/components/Drawer/Drawer.module.css +75 -0
  25. package/dist/components/Dropdown/Dropdown.d.ts +2 -1
  26. package/dist/components/Dropdown/Dropdown.js +6 -39
  27. package/dist/components/Dropdown/Dropdown.module.css +33 -0
  28. package/dist/components/Form/Form.d.ts +4 -9
  29. package/dist/components/Form/Form.js +9 -43
  30. package/dist/components/Form/Form.module.css +41 -0
  31. package/dist/components/Input/Input.js +3 -59
  32. package/dist/components/Input/Input.module.css +86 -0
  33. package/dist/components/Label/Label.d.ts +1 -1
  34. package/dist/components/Label/Label.js +4 -23
  35. package/dist/components/Label/Label.module.css +16 -0
  36. package/dist/components/Layout/Layout.d.ts +2 -2
  37. package/dist/components/Layout/Layout.js +5 -20
  38. package/dist/components/Layout/Layout.module.css +7 -0
  39. package/dist/components/Link/Link.d.ts +2 -1
  40. package/dist/components/Link/Link.js +4 -62
  41. package/dist/components/Link/Link.module.css +48 -0
  42. package/dist/components/Modal/Modal.js +9 -52
  43. package/dist/components/Modal/Modal.module.css +57 -0
  44. package/dist/components/Page/Page.js +3 -23
  45. package/dist/components/Page/Page.module.css +23 -0
  46. package/dist/components/Pagination/Pagination.js +4 -42
  47. package/dist/components/Pagination/Pagination.module.css +43 -0
  48. package/dist/components/Popover/Popover.js +21 -26
  49. package/dist/components/Popover/Popover.module.css +19 -0
  50. package/dist/components/ProgressBar/ProgressBar.js +7 -37
  51. package/dist/components/ProgressBar/ProgressBar.module.css +31 -0
  52. package/dist/components/RadioGroup/RadioGroup.js +4 -79
  53. package/dist/components/RadioGroup/RadioGroup.module.css +81 -0
  54. package/dist/components/Select/Select.js +6 -80
  55. package/dist/components/Select/Select.module.css +89 -0
  56. package/dist/components/Sheet/Sheet.js +5 -56
  57. package/dist/components/Sheet/Sheet.module.css +64 -0
  58. package/dist/components/Skeleton/Skeleton.js +4 -49
  59. package/dist/components/Skeleton/Skeleton.module.css +29 -0
  60. package/dist/components/Slider/Slider.js +3 -140
  61. package/dist/components/Slider/Slider.module.css +130 -0
  62. package/dist/components/SplitButton/SplitButton.d.ts +2 -1
  63. package/dist/components/SplitButton/SplitButton.js +6 -82
  64. package/dist/components/SplitButton/SplitButton.module.css +79 -0
  65. package/dist/components/Switch/Switch.js +3 -54
  66. package/dist/components/Switch/Switch.module.css +64 -0
  67. package/dist/components/Table/Table.d.ts +1 -1
  68. package/dist/components/Table/Table.js +13 -109
  69. package/dist/components/Table/Table.module.css +111 -0
  70. package/dist/components/Tabs/Tabs.js +7 -56
  71. package/dist/components/Tabs/Tabs.module.css +65 -0
  72. package/dist/components/Text/Text.js +4 -106
  73. package/dist/components/Text/Text.module.css +123 -0
  74. package/dist/components/Textarea/Textarea.d.ts +1 -1
  75. package/dist/components/Textarea/Textarea.js +16 -20
  76. package/dist/components/Textarea/Textarea.module.css +23 -0
  77. package/dist/components/Toast/Toast.js +3 -67
  78. package/dist/components/Toast/Toast.module.css +87 -0
  79. package/dist/components/Tooltip/Tooltip.js +3 -19
  80. package/dist/components/Tooltip/Tooltip.module.css +17 -0
  81. package/dist/styles/globals.css +788 -0
  82. package/dist/styles/themes/ThemeProvider.js +4 -9
  83. package/dist/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +8 -5
  85. package/dist/styles/index.d.ts +0 -3
  86. package/dist/styles/index.js +0 -3
  87. package/dist/styles/mixins.d.ts +0 -3
  88. package/dist/styles/mixins.js +0 -25
  89. package/dist/styles/reset.d.ts +0 -1
  90. package/dist/styles/reset.js +0 -29
  91. package/dist/styles/theme.d.ts +0 -1
  92. package/dist/styles/theme.js +0 -11
  93. package/dist/styles/utilities.d.ts +0 -1
  94. 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 styled from '@emotion/styled';
4
- import { Link } from '../Link';
5
- const BreadcrumbNav = styled.nav `
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(BreadcrumbNav, { "aria-label": "breadcrumb", className: className, children: _jsx(BreadcrumbList, { children: children }) }));
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(BreadcrumbLi, { "aria-current": "page", children: _jsx(CurrentPage, { children: children }) }));
11
+ return (_jsx("li", { className: styles.li, "aria-current": "page", children: _jsx("span", { className: styles.currentPage, children: children }) }));
44
12
  }
45
- return (_jsx(BreadcrumbLi, { children: href ? (_jsx(Link, { href: href, variant: "default", style: { fontSize: 'inherit' }, children: children })) : (_jsx("span", { children: children })) }));
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 styled from '@emotion/styled';
15
- import { css } from '@emotion/react';
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
- return (_jsx(StyledButton, Object.assign({ variant: variant, size: size }, props, { children: children })));
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 styled from '@emotion/styled';
17
- const StyledCard = styled.div `
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(StyledCard, Object.assign({ as: as, className: className }, props, { children: children })));
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
  }
@@ -0,0 +1,8 @@
1
+ .card {
2
+ background-color: var(--card-bg);
3
+ border: var(--border-width) solid var(--card-border);
4
+ border-radius: var(--radius);
5
+ padding: var(--spacing-lg);
6
+ box-shadow: var(--shadow-hard);
7
+ min-width: 0; /* Safe default for grid/flex items */
8
+ }
@@ -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 { useEffect, useState } from 'react';
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 { Flex } from '../Layout';
9
- const Overlay = styled.div `
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(Overlay, { isOpen: isOpen, onClick: onClose, "aria-hidden": "true" }), _jsxs(Panel, { isOpen: isOpen, side: side, role: "dialog", "aria-modal": "true", className: className, children: [_jsxs(Header, { align: "center", justify: "space-between", children: [_jsx(Title, { children: title }), _jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, "aria-label": "Close drawer", children: _jsx(X, { size: 24 }) })] }), _jsx(Content, { children: children }), footer && _jsx(Footer, { justify: "flex-end", gap: "var(--spacing-md)", children: footer })] })] }), document.body);
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
- import styled from '@emotion/styled';
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(TriggerButton, { variant: variant, onClick: () => setIsOpen(!isOpen), "aria-expanded": isOpen, children: [triggerLabel, " ", _jsx("span", { style: { marginLeft: '0.5rem', fontSize: '0.8em' }, children: "\u25BC" })] }), content: _jsx(StyledDropdownMenu, { children: items.map((item, index) => (_jsx(DropdownItem, { onClick: () => {
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
+ }