@drivenets/design-system 0.0.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.
Files changed (242) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +201 -0
  3. package/dist/index.cjs +5394 -0
  4. package/dist/index.css +1 -0
  5. package/dist/index.d.cts +9157 -0
  6. package/dist/index.d.cts.map +1 -0
  7. package/dist/index.d.ts +9157 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +5335 -0
  10. package/dist/index.js.map +1 -0
  11. package/package.json +104 -0
  12. package/src/components/ds-alert-banner/ds-alert-banner.module.scss +116 -0
  13. package/src/components/ds-alert-banner/ds-alert-banner.tsx +115 -0
  14. package/src/components/ds-alert-banner/ds-alert-banner.types.tsx +47 -0
  15. package/src/components/ds-alert-banner/index.tsx +2 -0
  16. package/src/components/ds-breadcrumb/ds-breadcrumb.module.scss +99 -0
  17. package/src/components/ds-breadcrumb/ds-breadcrumb.tsx +94 -0
  18. package/src/components/ds-breadcrumb/ds-breadcrumb.types.tsx +32 -0
  19. package/src/components/ds-breadcrumb/index.tsx +2 -0
  20. package/src/components/ds-button/ds-button.tsx +12 -0
  21. package/src/components/ds-button/ds-button.types.ts +6 -0
  22. package/src/components/ds-button/index.ts +2 -0
  23. package/src/components/ds-button/versions/ds-button-legacy/ds-button-legacy.module.scss +257 -0
  24. package/src/components/ds-button/versions/ds-button-legacy/ds-button-legacy.tsx +34 -0
  25. package/src/components/ds-button/versions/ds-button-legacy/ds-button-legacy.types.ts +41 -0
  26. package/src/components/ds-button/versions/ds-button-legacy/index.ts +2 -0
  27. package/src/components/ds-button/versions/ds-button-new/ds-button-new.module.scss +580 -0
  28. package/src/components/ds-button/versions/ds-button-new/ds-button-new.tsx +49 -0
  29. package/src/components/ds-button/versions/ds-button-new/ds-button-new.types.ts +41 -0
  30. package/src/components/ds-button/versions/ds-button-new/index.ts +2 -0
  31. package/src/components/ds-checkbox/ds-checkbox.module.scss +130 -0
  32. package/src/components/ds-checkbox/ds-checkbox.tsx +55 -0
  33. package/src/components/ds-checkbox/ds-checkbox.types.tsx +27 -0
  34. package/src/components/ds-checkbox/index.tsx +2 -0
  35. package/src/components/ds-chip/ds-chip.module.scss +71 -0
  36. package/src/components/ds-chip/ds-chip.tsx +73 -0
  37. package/src/components/ds-chip/ds-chip.types.tsx +46 -0
  38. package/src/components/ds-chip/index.tsx +2 -0
  39. package/src/components/ds-chip-group/ds-chip-group.module.scss +59 -0
  40. package/src/components/ds-chip-group/ds-chip-group.tsx +122 -0
  41. package/src/components/ds-chip-group/ds-chip-group.types.ts +52 -0
  42. package/src/components/ds-chip-group/hooks/use-chip-row-calculation.ts +76 -0
  43. package/src/components/ds-chip-group/index.ts +2 -0
  44. package/src/components/ds-confirmation/ds-confirmation.module.scss +58 -0
  45. package/src/components/ds-confirmation/ds-confirmation.tsx +121 -0
  46. package/src/components/ds-confirmation/ds-confirmation.types.tsx +28 -0
  47. package/src/components/ds-confirmation/index.ts +2 -0
  48. package/src/components/ds-dialog/ds-dialog.module.scss +50 -0
  49. package/src/components/ds-dialog/ds-dialog.tsx +70 -0
  50. package/src/components/ds-dialog/ds-dialog.types.tsx +48 -0
  51. package/src/components/ds-dialog/index.tsx +2 -0
  52. package/src/components/ds-drawer/ds-drawer.module.scss +212 -0
  53. package/src/components/ds-drawer/ds-drawer.tsx +160 -0
  54. package/src/components/ds-drawer/ds-drawer.types.tsx +54 -0
  55. package/src/components/ds-drawer/index.ts +2 -0
  56. package/src/components/ds-dropdown-menu/ds-dropdown-menu.module.scss +123 -0
  57. package/src/components/ds-dropdown-menu/ds-dropdown-menu.tsx +396 -0
  58. package/src/components/ds-dropdown-menu/ds-dropdown-menu.types.tsx +262 -0
  59. package/src/components/ds-dropdown-menu/index.tsx +2 -0
  60. package/src/components/ds-expandable-text-input/ds-expandable-text-input.module.scss +70 -0
  61. package/src/components/ds-expandable-text-input/ds-expandable-text-input.tsx +106 -0
  62. package/src/components/ds-expandable-text-input/ds-expandable-text-input.types.tsx +19 -0
  63. package/src/components/ds-expandable-text-input/index.ts +2 -0
  64. package/src/components/ds-file-upload/components/file-upload/file-upload.module.scss +90 -0
  65. package/src/components/ds-file-upload/components/file-upload/file-upload.tsx +106 -0
  66. package/src/components/ds-file-upload/components/file-upload/file-upload.types.tsx +94 -0
  67. package/src/components/ds-file-upload/components/file-upload/index.ts +2 -0
  68. package/src/components/ds-file-upload/components/file-upload-item/file-upload-item.module.scss +125 -0
  69. package/src/components/ds-file-upload/components/file-upload-item/file-upload-item.tsx +143 -0
  70. package/src/components/ds-file-upload/components/file-upload-item/file-upload-item.types.tsx +26 -0
  71. package/src/components/ds-file-upload/components/file-upload-item/index.ts +2 -0
  72. package/src/components/ds-file-upload/ds-file-upload-api.types.ts +38 -0
  73. package/src/components/ds-file-upload/ds-file-upload.tsx +46 -0
  74. package/src/components/ds-file-upload/ds-file-upload.types.tsx +54 -0
  75. package/src/components/ds-file-upload/errors/file-upload-errors.ts +27 -0
  76. package/src/components/ds-file-upload/hooks/index.ts +2 -0
  77. package/src/components/ds-file-upload/hooks/use-file-upload.ts +350 -0
  78. package/src/components/ds-file-upload/index.ts +7 -0
  79. package/src/components/ds-file-upload/types/accept-types.ts +106 -0
  80. package/src/components/ds-file-upload/utils/accept-utils.ts +25 -0
  81. package/src/components/ds-file-upload/utils/constants.ts +21 -0
  82. package/src/components/ds-file-upload/utils/file-factory.ts +18 -0
  83. package/src/components/ds-file-upload/utils/format-file-size.ts +15 -0
  84. package/src/components/ds-file-upload/utils/generate-helper-text.ts +39 -0
  85. package/src/components/ds-file-upload/utils/get-error-message.ts +17 -0
  86. package/src/components/ds-file-upload/utils/is-file-equal.ts +8 -0
  87. package/src/components/ds-form-control/ds-form-control.module.scss +135 -0
  88. package/src/components/ds-form-control/ds-form-control.tsx +94 -0
  89. package/src/components/ds-form-control/ds-form-control.types.tsx +58 -0
  90. package/src/components/ds-form-control/index.tsx +2 -0
  91. package/src/components/ds-grid/ds-grid.module.scss +0 -0
  92. package/src/components/ds-grid/ds-grid.tsx +43 -0
  93. package/src/components/ds-grid/ds-grid.types.ts +55 -0
  94. package/src/components/ds-grid/index.ts +2 -0
  95. package/src/components/ds-icon/ds-icon.module.scss +25 -0
  96. package/src/components/ds-icon/ds-icon.tsx +33 -0
  97. package/src/components/ds-icon/ds-icon.types.ts +53 -0
  98. package/src/components/ds-icon/index.ts +2 -0
  99. package/src/components/ds-icon/material-icons.ts +6203 -0
  100. package/src/components/ds-modal/ds-modal.module.scss +100 -0
  101. package/src/components/ds-modal/ds-modal.tsx +136 -0
  102. package/src/components/ds-modal/ds-modal.types.tsx +44 -0
  103. package/src/components/ds-modal/index.tsx +2 -0
  104. package/src/components/ds-number-input/ds-number-input.module.scss +15 -0
  105. package/src/components/ds-number-input/ds-number-input.tsx +74 -0
  106. package/src/components/ds-number-input/ds-number-input.types.tsx +76 -0
  107. package/src/components/ds-number-input/index.tsx +2 -0
  108. package/src/components/ds-panel/ds-panel.module.scss +95 -0
  109. package/src/components/ds-panel/ds-panel.tsx +46 -0
  110. package/src/components/ds-panel/ds-panel.types.ts +17 -0
  111. package/src/components/ds-panel/index.tsx +2 -0
  112. package/src/components/ds-password-input/ds-password-input.module.scss +10 -0
  113. package/src/components/ds-password-input/ds-password-input.tsx +67 -0
  114. package/src/components/ds-password-input/ds-password-input.types.tsx +62 -0
  115. package/src/components/ds-password-input/index.tsx +2 -0
  116. package/src/components/ds-popover/ds-popover.module.scss +23 -0
  117. package/src/components/ds-popover/ds-popover.tsx +33 -0
  118. package/src/components/ds-popover/ds-popover.types.tsx +24 -0
  119. package/src/components/ds-popover/index.tsx +2 -0
  120. package/src/components/ds-radio-group/ds-radio-group.module.scss +138 -0
  121. package/src/components/ds-radio-group/ds-radio-group.tsx +115 -0
  122. package/src/components/ds-radio-group/ds-radio-group.types.tsx +93 -0
  123. package/src/components/ds-radio-group/index.tsx +2 -0
  124. package/src/components/ds-select/ds-select.module.scss +66 -0
  125. package/src/components/ds-select/ds-select.tsx +239 -0
  126. package/src/components/ds-select/ds-select.types.tsx +80 -0
  127. package/src/components/ds-select/index.tsx +2 -0
  128. package/src/components/ds-select/select-items-chips.tsx +56 -0
  129. package/src/components/ds-smart-tabs/ds-smart-tabs.module.scss +69 -0
  130. package/src/components/ds-smart-tabs/ds-smart-tabs.tsx +113 -0
  131. package/src/components/ds-smart-tabs/ds-smart-tabs.types.tsx +74 -0
  132. package/src/components/ds-smart-tabs/index.tsx +2 -0
  133. package/src/components/ds-spinner/ds-spinner.module.scss +39 -0
  134. package/src/components/ds-spinner/ds-spinner.tsx +51 -0
  135. package/src/components/ds-spinner/ds-spinner.types.tsx +20 -0
  136. package/src/components/ds-spinner/index.tsx +2 -0
  137. package/src/components/ds-status-badge/ds-status-badge.module.scss +79 -0
  138. package/src/components/ds-status-badge/ds-status-badge.tsx +42 -0
  139. package/src/components/ds-status-badge/ds-status-badge.types.tsx +46 -0
  140. package/src/components/ds-status-badge/index.tsx +2 -0
  141. package/src/components/ds-stepper/components/ds-step-content.tsx +32 -0
  142. package/src/components/ds-stepper/components/ds-step-description.tsx +6 -0
  143. package/src/components/ds-stepper/components/ds-step-label.tsx +6 -0
  144. package/src/components/ds-stepper/components/ds-step-next-button.tsx +13 -0
  145. package/src/components/ds-stepper/components/ds-step.tsx +59 -0
  146. package/src/components/ds-stepper/ds-stepper.module.scss +134 -0
  147. package/src/components/ds-stepper/ds-stepper.tsx +34 -0
  148. package/src/components/ds-stepper/ds-stepper.types.ts +12 -0
  149. package/src/components/ds-stepper/hooks/use-stepper.ts +20 -0
  150. package/src/components/ds-stepper/hooks/use-steps.ts +18 -0
  151. package/src/components/ds-stepper/index.tsx +6 -0
  152. package/src/components/ds-system-status/ds-system-status.module.scss +87 -0
  153. package/src/components/ds-system-status/ds-system-status.tsx +33 -0
  154. package/src/components/ds-system-status/ds-system-status.types.tsx +37 -0
  155. package/src/components/ds-system-status/index.tsx +10 -0
  156. package/src/components/ds-table/components/core-table/core-table.module.scss +32 -0
  157. package/src/components/ds-table/components/core-table/core-table.tsx +83 -0
  158. package/src/components/ds-table/components/core-table/index.ts +1 -0
  159. package/src/components/ds-table/components/ds-table-bulk-actions/ds-table-bulk-actions.module.scss +115 -0
  160. package/src/components/ds-table/components/ds-table-bulk-actions/ds-table-bulk-actions.tsx +70 -0
  161. package/src/components/ds-table/components/ds-table-bulk-actions/ds-table-bulk-actions.types.ts +41 -0
  162. package/src/components/ds-table/components/ds-table-bulk-actions/index.ts +2 -0
  163. package/src/components/ds-table/components/ds-table-cell/ds-table-cell.module.scss +53 -0
  164. package/src/components/ds-table/components/ds-table-cell/ds-table-cell.tsx +95 -0
  165. package/src/components/ds-table/components/ds-table-cell/ds-table-cell.types.ts +67 -0
  166. package/src/components/ds-table/components/ds-table-cell/index.ts +2 -0
  167. package/src/components/ds-table/components/ds-table-header/ds-table-header.module.scss +81 -0
  168. package/src/components/ds-table/components/ds-table-header/ds-table-header.tsx +99 -0
  169. package/src/components/ds-table/components/ds-table-header/ds-table-header.types.ts +11 -0
  170. package/src/components/ds-table/components/ds-table-header/index.ts +2 -0
  171. package/src/components/ds-table/components/ds-table-row/ds-table-row.module.scss +137 -0
  172. package/src/components/ds-table/components/ds-table-row/ds-table-row.tsx +205 -0
  173. package/src/components/ds-table/components/ds-table-row/ds-table-row.types.ts +22 -0
  174. package/src/components/ds-table/components/ds-table-row/index.ts +2 -0
  175. package/src/components/ds-table/context/ds-table-context.tsx +39 -0
  176. package/src/components/ds-table/ds-table.module.scss +60 -0
  177. package/src/components/ds-table/ds-table.tsx +312 -0
  178. package/src/components/ds-table/ds-table.types.ts +377 -0
  179. package/src/components/ds-table/filters/adapters/create-checkbox-filter-adapter.tsx +116 -0
  180. package/src/components/ds-table/filters/adapters/create-dual-range-filter-adapter.tsx +171 -0
  181. package/src/components/ds-table/filters/adapters/create-filter-adapter.ts +131 -0
  182. package/src/components/ds-table/filters/adapters/index.ts +12 -0
  183. package/src/components/ds-table/filters/components/checkbox-filter/checkbox-filter.tsx +43 -0
  184. package/src/components/ds-table/filters/components/checkbox-filter/index.ts +2 -0
  185. package/src/components/ds-table/filters/components/range-filter/index.ts +2 -0
  186. package/src/components/ds-table/filters/components/range-filter/range-filter.module.scss +25 -0
  187. package/src/components/ds-table/filters/components/range-filter/range-filter.tsx +79 -0
  188. package/src/components/ds-table/filters/hooks/index.ts +1 -0
  189. package/src/components/ds-table/filters/hooks/use-table-filters.ts +234 -0
  190. package/src/components/ds-table/filters/index.ts +50 -0
  191. package/src/components/ds-table/filters/types/filter-adapter.types.ts +111 -0
  192. package/src/components/ds-table/hooks/use-drag-and-drop.tsx +107 -0
  193. package/src/components/ds-table/index.ts +4 -0
  194. package/src/components/ds-table/styles/_variables.scss +17 -0
  195. package/src/components/ds-table/styles/shared/ds-table-shared.module.scss +16 -0
  196. package/src/components/ds-table/utils/column-styling.ts +30 -0
  197. package/src/components/ds-table/utils/create-columns-grid-template.ts +23 -0
  198. package/src/components/ds-table/utils/merge-refs.ts +15 -0
  199. package/src/components/ds-table/utils/story-data-generator.ts +91 -0
  200. package/src/components/ds-text-input/ds-text-input.module.scss +27 -0
  201. package/src/components/ds-text-input/ds-text-input.tsx +75 -0
  202. package/src/components/ds-text-input/ds-text-input.types.tsx +110 -0
  203. package/src/components/ds-text-input/index.ts +2 -0
  204. package/src/components/ds-textarea/ds-textarea.module.scss +5 -0
  205. package/src/components/ds-textarea/ds-textarea.tsx +49 -0
  206. package/src/components/ds-textarea/ds-textarea.types.tsx +67 -0
  207. package/src/components/ds-textarea/index.tsx +2 -0
  208. package/src/components/ds-toast/ds-toast-context.tsx +79 -0
  209. package/src/components/ds-toast/ds-toast.module.scss +134 -0
  210. package/src/components/ds-toast/ds-toast.tsx +54 -0
  211. package/src/components/ds-toast/ds-toast.types.tsx +53 -0
  212. package/src/components/ds-toast/index.ts +3 -0
  213. package/src/components/ds-tooltip/ds-tooltip.module.scss +19 -0
  214. package/src/components/ds-tooltip/ds-tooltip.tsx +33 -0
  215. package/src/components/ds-tooltip/ds-tooltip.types.tsx +12 -0
  216. package/src/components/ds-tooltip/index.tsx +2 -0
  217. package/src/components/ds-typography/ds-typography.config.ts +32 -0
  218. package/src/components/ds-typography/ds-typography.module.scss +93 -0
  219. package/src/components/ds-typography/ds-typography.tsx +27 -0
  220. package/src/components/ds-typography/ds-typography.types.tsx +27 -0
  221. package/src/components/ds-typography/index.tsx +2 -0
  222. package/src/components/ds-vertical-tabs/ds-vertical-tabs.module.scss +60 -0
  223. package/src/components/ds-vertical-tabs/ds-vertical-tabs.tsx +80 -0
  224. package/src/components/ds-vertical-tabs/ds-vertical-tabs.types.ts +69 -0
  225. package/src/components/ds-vertical-tabs/index.ts +7 -0
  226. package/src/index.ts +34 -0
  227. package/src/styles/_colors.scss +65 -0
  228. package/src/styles/_grid.scss +111 -0
  229. package/src/styles/_mixin.scss +1 -0
  230. package/src/styles/_reset.scss +38 -0
  231. package/src/styles/_root.scss +390 -0
  232. package/src/styles/_scrollbars.scss +41 -0
  233. package/src/styles/_spacing.scss +47 -0
  234. package/src/styles/_typography.scss +301 -0
  235. package/src/styles/_utilities.scss +33 -0
  236. package/src/styles/_variables.scss +44 -0
  237. package/src/styles/mixins/_bounding-box.scss +53 -0
  238. package/src/styles/mixins/_list.scss +74 -0
  239. package/src/styles/shared/_dropdown.scss +89 -0
  240. package/src/styles/shared/_input.scss +365 -0
  241. package/src/styles/shared/_modal.scss +123 -0
  242. package/src/styles/styles.scss +12 -0
@@ -0,0 +1,160 @@
1
+ import { type CSSProperties, type ReactNode, Fragment } from 'react';
2
+ import { Dialog } from '@ark-ui/react/dialog';
3
+ import { Portal } from '@ark-ui/react/portal';
4
+ import classNames from 'classnames';
5
+ import type { DsDrawerProps } from './ds-drawer.types';
6
+ import styles from './ds-drawer.module.scss';
7
+ import { DsIcon } from '../ds-icon';
8
+ import { DsTypography } from '../ds-typography';
9
+
10
+ /**
11
+ * Composable drawer component.
12
+ * Supports grid-based sizing, flexible positioning, and compound components.
13
+ * Use columns prop to control drawer width (1-12 grid columns).
14
+ */
15
+ const DsDrawer = ({
16
+ open,
17
+ onOpenChange,
18
+ columns = 4,
19
+ position = 'end',
20
+ backdrop = false,
21
+ closeOnEscape = true,
22
+ closeOnInteractOutside = false,
23
+ portal = false,
24
+ style,
25
+ className,
26
+ children,
27
+ }: DsDrawerProps) => {
28
+ const handleOpenChange = (details: { open: boolean }) => {
29
+ onOpenChange(details.open);
30
+ };
31
+ const Wrapper = portal ? Portal : Fragment;
32
+
33
+ return (
34
+ <Dialog.Root
35
+ open={open}
36
+ onOpenChange={handleOpenChange}
37
+ modal={backdrop}
38
+ closeOnEscape={closeOnEscape}
39
+ closeOnInteractOutside={closeOnInteractOutside}
40
+ preventScroll={backdrop}
41
+ >
42
+ <Wrapper>
43
+ {backdrop && <Dialog.Backdrop className={styles.backdrop} />}
44
+ <Dialog.Positioner className={styles.positioner}>
45
+ <Dialog.Content
46
+ style={style}
47
+ className={classNames(
48
+ styles.drawer,
49
+ styles[`cols-${String(columns)}`],
50
+ styles[`position-${position}`],
51
+ className,
52
+ )}
53
+ >
54
+ <div className={styles.content}>{children}</div>
55
+ </Dialog.Content>
56
+ </Dialog.Positioner>
57
+ </Wrapper>
58
+ </Dialog.Root>
59
+ );
60
+ };
61
+
62
+ const Header = ({
63
+ style,
64
+ className,
65
+ children,
66
+ }: {
67
+ style?: CSSProperties;
68
+ className?: string;
69
+ children: ReactNode;
70
+ }) => (
71
+ <div style={style} className={classNames(styles.header, className)}>
72
+ {children}
73
+ </div>
74
+ );
75
+
76
+ const Title = ({
77
+ style,
78
+ className,
79
+ children,
80
+ }: {
81
+ style?: CSSProperties;
82
+ className?: string;
83
+ children: ReactNode;
84
+ }) => (
85
+ <Dialog.Title className={classNames(styles.title, className)} style={style} asChild>
86
+ <DsTypography variant="heading3">{children}</DsTypography>
87
+ </Dialog.Title>
88
+ );
89
+
90
+ const CloseTrigger = ({ style, className }: { style?: CSSProperties; className?: string }) => (
91
+ <Dialog.CloseTrigger style={style} className={classNames(styles.closeTrigger, className)}>
92
+ <DsIcon icon="close" size="small" />
93
+ </Dialog.CloseTrigger>
94
+ );
95
+
96
+ const Toolbar = ({
97
+ style,
98
+ className,
99
+ children,
100
+ }: {
101
+ style?: CSSProperties;
102
+ className?: string;
103
+ children: ReactNode;
104
+ }) => (
105
+ <div style={style} className={classNames(styles.toolbar, className)}>
106
+ {children}
107
+ </div>
108
+ );
109
+
110
+ const Body = ({
111
+ style,
112
+ className,
113
+ children,
114
+ }: {
115
+ style?: CSSProperties;
116
+ className?: string;
117
+ children: ReactNode;
118
+ }) => (
119
+ <div style={style} className={classNames(styles.body, className)}>
120
+ {children}
121
+ </div>
122
+ );
123
+
124
+ const Footer = ({
125
+ style,
126
+ className,
127
+ children,
128
+ }: {
129
+ style?: CSSProperties;
130
+ className?: string;
131
+ children: ReactNode;
132
+ }) => (
133
+ <div style={style} className={classNames(styles.footer, className)}>
134
+ {children}
135
+ </div>
136
+ );
137
+
138
+ const Actions = ({
139
+ style,
140
+ className,
141
+ children,
142
+ }: {
143
+ style?: CSSProperties;
144
+ className?: string;
145
+ children: ReactNode;
146
+ }) => (
147
+ <div style={style} className={classNames(styles.actions, className)}>
148
+ {children}
149
+ </div>
150
+ );
151
+
152
+ DsDrawer.Header = Header;
153
+ DsDrawer.Title = Title;
154
+ DsDrawer.CloseTrigger = CloseTrigger;
155
+ DsDrawer.Toolbar = Toolbar;
156
+ DsDrawer.Body = Body;
157
+ DsDrawer.Footer = Footer;
158
+ DsDrawer.Actions = Actions;
159
+
160
+ export default DsDrawer;
@@ -0,0 +1,54 @@
1
+ import type { CSSProperties, ReactNode } from 'react';
2
+ import type { UseDialogProps as DialogProps } from '@ark-ui/react/dialog';
3
+
4
+ /**
5
+ * Available positions for the drawer
6
+ */
7
+ export type DsDrawerPosition = 'start' | 'end';
8
+ /**
9
+ * Available column sizes for drawer width
10
+ */
11
+ export type DsDrawerColumns = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
12
+
13
+ export interface DsDrawerProps extends Pick<DialogProps, 'closeOnEscape' | 'closeOnInteractOutside'> {
14
+ /**
15
+ * Whether the drawer is open
16
+ */
17
+ open: boolean;
18
+ /**
19
+ * Callback when the drawer open state changes
20
+ */
21
+ onOpenChange: (open: boolean) => void;
22
+ /**
23
+ * Number of grid columns the drawer should span (1-12)
24
+ * @default 4
25
+ */
26
+ columns?: DsDrawerColumns;
27
+ /**
28
+ * Position of the drawer
29
+ * @default 'end'
30
+ */
31
+ position?: DsDrawerPosition;
32
+ /**
33
+ * Whether to show backdrop overlay
34
+ * @default false
35
+ */
36
+ backdrop?: boolean;
37
+ /**
38
+ * Whether to append the drawer to the body instead of rendering in place
39
+ * @default false
40
+ */
41
+ portal?: boolean;
42
+ /**
43
+ * Additional CSS styles
44
+ */
45
+ style?: CSSProperties;
46
+ /**
47
+ * Additional CSS class names
48
+ */
49
+ className?: string;
50
+ /**
51
+ * Children components
52
+ */
53
+ children: ReactNode;
54
+ }
@@ -0,0 +1,2 @@
1
+ export { default as DsDrawer } from './ds-drawer';
2
+ export type { DsDrawerProps, DsDrawerPosition, DsDrawerColumns } from './ds-drawer.types';
@@ -0,0 +1,123 @@
1
+ @use '../../styles/typography';
2
+ @use '../../styles/shared/dropdown';
3
+
4
+ .content {
5
+ @include dropdown.dropdown-content;
6
+ display: flex;
7
+ flex-direction: column;
8
+ max-height: var(--available-height, 400px);
9
+ overflow-y: auto;
10
+ width: auto;
11
+
12
+ &:focus-visible {
13
+ outline-offset: 2px;
14
+ }
15
+
16
+ &[hidden] {
17
+ display: none;
18
+ }
19
+ }
20
+
21
+ .header {
22
+ position: sticky;
23
+ top: 0;
24
+ z-index: 1;
25
+ padding: var(--spacing-3xs);
26
+ border-bottom: 1px solid var(--color-border-secondary);
27
+ background-color: var(--color-background);
28
+ }
29
+
30
+ .item {
31
+ @include dropdown.dropdown-item;
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--spacing-xs);
35
+
36
+ &.selected {
37
+ .indicator {
38
+ display: flex;
39
+ min-width: var(--icon-width-medium);
40
+ margin-left: auto;
41
+ }
42
+
43
+ &:hover {
44
+ .indicator {
45
+ color: var(--color-background-selected);
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ .itemIcon {
52
+ flex-shrink: 0;
53
+ }
54
+
55
+ .label {
56
+ flex: 1;
57
+ }
58
+
59
+ .separator {
60
+ height: 1px;
61
+ background-color: var(--color-border-secondary);
62
+ margin: var(--spacing-4xs) var(--spacing-xs);
63
+ }
64
+
65
+ .actions {
66
+ position: sticky;
67
+ bottom: -1px;
68
+ z-index: 1;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: flex-end;
72
+ gap: var(--spacing-xs);
73
+ padding: var(--spacing-3xs) var(--spacing-xs);
74
+ border-top: 1px solid var(--color-border-secondary);
75
+ background-color: var(--color-background);
76
+ }
77
+
78
+ .groupLabel {
79
+ display: flex;
80
+ align-items: center;
81
+ padding: var(--spacing-3xs) var(--spacing-xs);
82
+ background-color: var(--color-background);
83
+ outline-offset: -1px;
84
+
85
+ &Collapsible {
86
+ justify-content: space-between;
87
+ width: 100%;
88
+ text-align: left;
89
+ cursor: pointer;
90
+ border: none;
91
+ transition: background-color 0.15s ease;
92
+
93
+ &:hover {
94
+ background-color: var(--color-background-action-hover-weak);
95
+ }
96
+ }
97
+ }
98
+
99
+ .groupLabelIcon {
100
+ flex-shrink: 0;
101
+
102
+ &Rotated {
103
+ transform: rotate(180deg);
104
+ transition: transform 0.2s ease-in-out;
105
+ }
106
+ }
107
+
108
+ /** Legacy classes */
109
+ .contentLegacy {
110
+ @include dropdown.dropdown-content;
111
+ min-width: 200px;
112
+ width: var(--radix-select-trigger-width);
113
+ }
114
+
115
+ .viewportLegacy {
116
+ @include dropdown.dropdown-viewport;
117
+ }
118
+
119
+ .itemLegacy {
120
+ @include dropdown.dropdown-item;
121
+ @include typography.p-special;
122
+ @include typography.ellipsis;
123
+ }