flikkui 0.2.0-beta.2 → 0.2.0-beta.5

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 (269) hide show
  1. package/README.md +92 -0
  2. package/dist/components/ai/PromptInput/PromptInput.js +23 -15
  3. package/dist/components/ai/PromptSuggestions/PromptSuggestion.d.ts +27 -0
  4. package/dist/components/ai/PromptSuggestions/PromptSuggestion.js +62 -0
  5. package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.d.ts +10 -0
  6. package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +12 -0
  7. package/dist/components/ai/PromptSuggestions/PromptSuggestion.types.d.ts +53 -0
  8. package/dist/components/ai/PromptSuggestions/index.d.ts +4 -2
  9. package/dist/components/ai/index.d.ts +2 -12
  10. package/dist/components/charts/ActivityRings/ActivityRings.js +70 -58
  11. package/dist/components/charts/ActivityRings/ActivityRings.theme.js +0 -1
  12. package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +17 -0
  13. package/dist/components/charts/BarChart/BarChart.js +8 -4
  14. package/dist/components/charts/BarChart/BarChart.types.d.ts +14 -0
  15. package/dist/components/charts/DonutChart/DonutChart.js +11 -8
  16. package/dist/components/charts/DonutChart/DonutChart.theme.d.ts +3 -0
  17. package/dist/components/charts/DonutChart/DonutChart.theme.js +5 -4
  18. package/dist/components/charts/DonutChart/donut-utils.d.ts +5 -0
  19. package/dist/components/charts/DonutChart/donut-utils.js +26 -1
  20. package/dist/components/charts/Heatmap/Heatmap.theme.js +2 -2
  21. package/dist/components/charts/shared/ChartAxis/XAxis.d.ts +2 -2
  22. package/dist/components/charts/shared/ChartAxis/XAxis.js +4 -4
  23. package/dist/components/charts/shared/ChartAxis/YAxis.d.ts +2 -2
  24. package/dist/components/charts/shared/ChartAxis/YAxis.js +8 -7
  25. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +1 -1
  26. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +2 -2
  27. package/dist/components/charts/theme/chart.theme.d.ts +1 -1
  28. package/dist/components/charts/theme/chart.theme.js +39 -39
  29. package/dist/components/core/Accordion/Accordion.d.ts +1 -1
  30. package/dist/components/core/Accordion/Accordion.js +2 -2
  31. package/dist/components/core/Accordion/Accordion.types.d.ts +8 -0
  32. package/dist/components/core/Badge/Badge.js +11 -15
  33. package/dist/components/core/Badge/Badge.theme.js +7 -21
  34. package/dist/components/core/Badge/Badge.types.d.ts +9 -1
  35. package/dist/components/core/Button/Button.js +2 -2
  36. package/dist/components/core/Button/Button.theme.js +1 -1
  37. package/dist/components/core/Button/Button.types.d.ts +8 -0
  38. package/dist/components/core/Card/Card.js +8 -2
  39. package/dist/components/core/Card/Card.theme.js +1 -1
  40. package/dist/components/core/Card/Card.types.d.ts +24 -1
  41. package/dist/components/core/Drawer/Drawer.d.ts +1 -1
  42. package/dist/components/core/Drawer/Drawer.js +10 -40
  43. package/dist/components/core/Drawer/Drawer.theme.js +2 -1
  44. package/dist/components/core/Drawer/Drawer.types.d.ts +8 -0
  45. package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
  46. package/dist/components/core/Dropdown/Dropdown.js +2 -2
  47. package/dist/components/core/Dropdown/Dropdown.types.d.ts +8 -0
  48. package/dist/components/core/Metric/Metric.d.ts +1 -1
  49. package/dist/components/core/Metric/Metric.js +9 -5
  50. package/dist/components/core/Metric/Metric.theme.d.ts +1 -1
  51. package/dist/components/core/Metric/Metric.theme.js +38 -28
  52. package/dist/components/core/Metric/Metric.types.d.ts +27 -8
  53. package/dist/components/core/Modal/Modal.d.ts +1 -1
  54. package/dist/components/core/Modal/Modal.js +17 -40
  55. package/dist/components/core/Modal/Modal.theme.js +8 -3
  56. package/dist/components/core/Modal/Modal.types.d.ts +18 -0
  57. package/dist/components/core/Modal/index.d.ts +1 -1
  58. package/dist/components/core/Notification/Notification.js +2 -0
  59. package/dist/components/core/Pill/Pill.d.ts +6 -11
  60. package/dist/components/core/Pill/Pill.theme.d.ts +2 -2
  61. package/dist/components/core/Pill/Pill.types.d.ts +9 -22
  62. package/dist/components/core/Pill/index.d.ts +1 -1
  63. package/dist/components/core/Popover/Popover.d.ts +1 -1
  64. package/dist/components/core/Popover/Popover.js +2 -2
  65. package/dist/components/core/Popover/Popover.types.d.ts +8 -0
  66. package/dist/components/core/Progress/Progress.d.ts +28 -0
  67. package/dist/components/core/Progress/Progress.js +114 -0
  68. package/dist/components/core/Progress/Progress.theme.d.ts +5 -0
  69. package/dist/components/core/Progress/Progress.theme.js +33 -0
  70. package/dist/components/core/Progress/Progress.types.d.ts +92 -0
  71. package/dist/components/core/Progress/index.d.ts +2 -0
  72. package/dist/components/core/Table/Table.animations.d.ts +5 -16
  73. package/dist/components/core/Table/Table.animations.js +46 -0
  74. package/dist/components/core/Table/Table.d.ts +0 -27
  75. package/dist/components/core/Table/Table.js +58 -156
  76. package/dist/components/core/Table/Table.theme.js +28 -19
  77. package/dist/components/core/Table/Table.types.d.ts +95 -8
  78. package/dist/components/core/Table/Table.utils.d.ts +7 -0
  79. package/dist/components/core/Table/Table.utils.js +11 -1
  80. package/dist/components/core/Table/{components/TableActions/TableActions.d.ts → TableActions.d.ts} +3 -3
  81. package/dist/components/core/Table/{components/TableActions/TableActions.js → TableActions.js} +14 -24
  82. package/dist/components/core/Table/{components/TableActions/TableActionsMenu.d.ts → TableActionsMenu.d.ts} +1 -1
  83. package/dist/components/core/Table/{components/TableActions/TableActionsMenu.js → TableActionsMenu.js} +4 -4
  84. package/dist/components/core/Table/{components/core/TableBody.d.ts → TableBody.d.ts} +1 -1
  85. package/dist/components/core/Table/{components/core/TableBody.js → TableBody.js} +14 -20
  86. package/dist/components/core/Table/{components/core/TableCell.d.ts → TableCell.d.ts} +1 -9
  87. package/dist/components/core/Table/{components/core/TableCell.js → TableCell.js} +5 -13
  88. package/dist/components/core/Table/TableColumnManager.d.ts +3 -0
  89. package/dist/components/core/Table/TableColumnManager.js +34 -0
  90. package/dist/components/core/Table/{components/DeclarativeComponents.d.ts → TableDeclarative.d.ts} +1 -1
  91. package/dist/components/core/Table/{components/DeclarativeComponents.js → TableDeclarative.js} +6 -56
  92. package/dist/components/core/Table/TableFilter.d.ts +3 -0
  93. package/dist/components/core/Table/TableFilter.js +122 -0
  94. package/dist/components/core/Table/{components/core/TableHeader.d.ts → TableHeader.d.ts} +1 -1
  95. package/dist/components/core/Table/{components/core/TableHeader.js → TableHeader.js} +15 -29
  96. package/dist/components/core/Table/TablePagination.d.ts +7 -0
  97. package/dist/components/core/Table/{components/TablePagination/TablePagination.js → TablePagination.js} +5 -16
  98. package/dist/components/core/Table/TableRow.d.ts +8 -0
  99. package/dist/components/core/Table/TableRow.js +45 -0
  100. package/dist/components/core/Table/TableSelectionHeader.d.ts +7 -0
  101. package/dist/components/core/Table/{components/TableSelectionHeader/TableSelectionHeader.js → TableSelectionHeader.js} +4 -5
  102. package/dist/components/core/Table/hooks/index.d.ts +10 -0
  103. package/dist/components/core/Table/hooks/useTableColumns.d.ts +16 -0
  104. package/dist/components/core/Table/hooks/useTableColumns.js +67 -0
  105. package/dist/components/core/Table/hooks/useTableExpansion.d.ts +8 -0
  106. package/dist/components/core/Table/hooks/useTableExpansion.js +15 -0
  107. package/dist/components/core/Table/hooks/useTableFilter.d.ts +12 -0
  108. package/dist/components/core/Table/hooks/useTableFilter.js +37 -0
  109. package/dist/components/core/Table/hooks/useTablePagination.d.ts +12 -0
  110. package/dist/components/core/Table/hooks/useTablePagination.js +13 -0
  111. package/dist/components/core/Table/hooks/useTableSelection.d.ts +17 -0
  112. package/dist/components/core/Table/hooks/useTableSelection.js +40 -0
  113. package/dist/components/core/Table/index.d.ts +9 -8
  114. package/dist/components/core/Table/index.js +7 -5
  115. package/dist/components/core/Tabs/Tabs.js +2 -2
  116. package/dist/components/core/Tabs/Tabs.types.d.ts +8 -0
  117. package/dist/components/core/Tag/Tag.animations.d.ts +3 -0
  118. package/dist/components/core/Tag/Tag.animations.js +31 -0
  119. package/dist/components/core/Tag/Tag.d.ts +14 -0
  120. package/dist/components/core/Tag/Tag.js +45 -0
  121. package/dist/components/core/Tag/Tag.theme.d.ts +2 -0
  122. package/dist/components/core/Tag/Tag.theme.js +21 -0
  123. package/dist/components/core/Tag/Tag.types.d.ts +40 -0
  124. package/dist/components/core/Tag/index.d.ts +3 -0
  125. package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
  126. package/dist/components/core/Tooltip/Tooltip.js +3 -3
  127. package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
  128. package/dist/components/core/Tooltip/Tooltip.types.d.ts +17 -0
  129. package/dist/components/core/index.d.ts +2 -1
  130. package/dist/components/core/index.js +12 -5
  131. package/dist/components/effects/CustomCursor/CustomCursor.d.ts +0 -13
  132. package/dist/components/effects/CustomCursor/CustomCursor.js +26 -2
  133. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +12 -1
  134. package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +14 -1
  135. package/dist/components/forms/Combobox/Combobox.d.ts +25 -0
  136. package/dist/components/forms/Combobox/Combobox.js +412 -0
  137. package/dist/components/forms/Combobox/Combobox.theme.d.ts +6 -0
  138. package/dist/components/forms/Combobox/Combobox.theme.js +60 -0
  139. package/dist/components/forms/Combobox/Combobox.types.d.ts +111 -0
  140. package/dist/components/forms/Combobox/index.d.ts +3 -0
  141. package/dist/components/forms/FileUpload/FileUpload.js +2 -0
  142. package/dist/components/forms/Input/Input.js +25 -28
  143. package/dist/components/forms/Input/inputMasks.d.ts +15 -0
  144. package/dist/components/forms/Input/inputMasks.js +72 -1
  145. package/dist/components/forms/InputTag/InputTag.d.ts +40 -0
  146. package/dist/components/forms/InputTag/InputTag.js +491 -0
  147. package/dist/components/forms/InputTag/InputTag.theme.d.ts +2 -0
  148. package/dist/components/forms/InputTag/InputTag.theme.js +16 -0
  149. package/dist/components/forms/InputTag/InputTag.types.d.ts +107 -0
  150. package/dist/components/forms/InputTag/index.d.ts +3 -0
  151. package/dist/components/forms/Select/Select.d.ts +101 -2
  152. package/dist/components/forms/Select/Select.js +128 -132
  153. package/dist/components/forms/Select/Select.theme.js +10 -14
  154. package/dist/components/forms/Select/Select.types.d.ts +6 -2
  155. package/dist/components/forms/Select/index.d.ts +7 -4
  156. package/dist/components/forms/Select/useSelectState.d.ts +66 -0
  157. package/dist/components/forms/Select/useSelectState.js +134 -0
  158. package/dist/components/forms/SelectExpand/SelectExpand.animations.d.ts +20 -0
  159. package/dist/components/forms/SelectExpand/SelectExpand.animations.js +74 -0
  160. package/dist/components/forms/SelectExpand/SelectExpand.d.ts +9 -0
  161. package/dist/components/forms/SelectExpand/SelectExpand.js +223 -0
  162. package/dist/components/forms/SelectExpand/SelectExpand.theme.d.ts +5 -0
  163. package/dist/components/forms/SelectExpand/SelectExpand.theme.js +74 -0
  164. package/dist/components/forms/SelectExpand/SelectExpand.types.d.ts +126 -0
  165. package/dist/components/forms/SelectExpand/index.d.ts +4 -0
  166. package/dist/components/forms/Switch/Switch.js +3 -3
  167. package/dist/components/forms/Switch/Switch.theme.d.ts +1 -1
  168. package/dist/components/forms/Switch/Switch.theme.js +2 -2
  169. package/dist/components/forms/TimePicker/TimePicker.animations.d.ts +0 -46
  170. package/dist/components/forms/TimePicker/TimePicker.d.ts +15 -6
  171. package/dist/components/forms/TimePicker/TimePicker.js +285 -124
  172. package/dist/components/forms/TimePicker/TimePicker.theme.d.ts +1 -1
  173. package/dist/components/forms/TimePicker/TimePicker.theme.js +39 -22
  174. package/dist/components/forms/TimePicker/TimePicker.types.d.ts +88 -34
  175. package/dist/components/forms/TimePicker/TimePickerContent.d.ts +7 -10
  176. package/dist/components/forms/TimePicker/TimePickerContent.js +149 -16
  177. package/dist/components/forms/TimePicker/TimePickerTrigger.d.ts +3 -3
  178. package/dist/components/forms/TimePicker/TimePickerTrigger.js +22 -19
  179. package/dist/components/forms/TimePicker/WheelColumn.d.ts +14 -0
  180. package/dist/components/forms/TimePicker/WheelColumn.js +90 -0
  181. package/dist/components/forms/TimePicker/index.d.ts +4 -1
  182. package/dist/components/forms/TimePicker/useWheelPicker.d.ts +37 -0
  183. package/dist/components/forms/TimePicker/useWheelPicker.js +138 -0
  184. package/dist/components/forms/forms.theme.d.ts +14 -0
  185. package/dist/components/forms/forms.theme.js +31 -0
  186. package/dist/components/forms/index.d.ts +9 -3
  187. package/dist/components/forms/index.js +73 -2
  188. package/dist/hooks/index.d.ts +0 -4
  189. package/dist/icons/Icon.d.ts +7 -0
  190. package/dist/icons/Icon.js +6 -2
  191. package/dist/index.js +21 -19
  192. package/dist/styles.css +1 -1
  193. package/dist/utils/index.d.ts +0 -1
  194. package/dist/utils/optimisticErrors.js +1 -70
  195. package/package.json +1 -1
  196. package/dist/components/ai/EditingIndicator/EditingIndicator.animations.d.ts +0 -31
  197. package/dist/components/ai/EditingIndicator/EditingIndicator.animations.js +0 -115
  198. package/dist/components/ai/EditingIndicator/EditingIndicator.d.ts +0 -35
  199. package/dist/components/ai/EditingIndicator/EditingIndicator.js +0 -94
  200. package/dist/components/ai/EditingIndicator/EditingIndicator.theme.d.ts +0 -2
  201. package/dist/components/ai/EditingIndicator/EditingIndicator.theme.js +0 -13
  202. package/dist/components/ai/EditingIndicator/EditingIndicator.types.d.ts +0 -54
  203. package/dist/components/ai/EditingIndicator/index.d.ts +0 -9
  204. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.d.ts +0 -3
  205. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.js +0 -126
  206. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.d.ts +0 -2
  207. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.js +0 -8
  208. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.types.d.ts +0 -45
  209. package/dist/components/ai/GenerativeRenderer/index.d.ts +0 -3
  210. package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.d.ts +0 -17
  211. package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.js +0 -56
  212. package/dist/components/ai/PresenceIndicator/PresenceIndicator.d.ts +0 -38
  213. package/dist/components/ai/PresenceIndicator/PresenceIndicator.js +0 -110
  214. package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.d.ts +0 -2
  215. package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.js +0 -13
  216. package/dist/components/ai/PresenceIndicator/PresenceIndicator.types.d.ts +0 -53
  217. package/dist/components/ai/PresenceIndicator/index.d.ts +0 -8
  218. package/dist/components/ai/PresenceProvider/PresenceContext.d.ts +0 -24
  219. package/dist/components/ai/PresenceProvider/PresenceContext.js +0 -34
  220. package/dist/components/ai/PresenceProvider/PresenceProvider.d.ts +0 -32
  221. package/dist/components/ai/PresenceProvider/PresenceProvider.js +0 -321
  222. package/dist/components/ai/PresenceProvider/PresenceProvider.types.d.ts +0 -140
  223. package/dist/components/ai/PresenceProvider/adapters/MockAdapter.d.ts +0 -102
  224. package/dist/components/ai/PresenceProvider/adapters/MockAdapter.js +0 -331
  225. package/dist/components/ai/PresenceProvider/adapters/PresenceAdapter.d.ts +0 -93
  226. package/dist/components/ai/PresenceProvider/adapters/SupabaseAdapter.d.ts +0 -134
  227. package/dist/components/ai/PresenceProvider/adapters/WebSocketAdapter.d.ts +0 -149
  228. package/dist/components/ai/PresenceProvider/adapters/index.d.ts +0 -11
  229. package/dist/components/ai/PresenceProvider/index.d.ts +0 -10
  230. package/dist/components/ai/PromptSuggestions/PromptSuggestions.d.ts +0 -27
  231. package/dist/components/ai/PromptSuggestions/PromptSuggestions.js +0 -61
  232. package/dist/components/ai/PromptSuggestions/PromptSuggestions.types.d.ts +0 -65
  233. package/dist/components/ai/VersionSlider/VersionSlider.d.ts +0 -3
  234. package/dist/components/ai/VersionSlider/VersionSlider.js +0 -97
  235. package/dist/components/ai/VersionSlider/VersionSlider.theme.d.ts +0 -2
  236. package/dist/components/ai/VersionSlider/VersionSlider.theme.js +0 -18
  237. package/dist/components/ai/VersionSlider/VersionSlider.types.d.ts +0 -77
  238. package/dist/components/ai/VersionSlider/index.d.ts +0 -3
  239. package/dist/components/core/Pill/Pill.animations.js +0 -25
  240. package/dist/components/core/Pill/Pill.js +0 -145
  241. package/dist/components/core/Pill/Pill.theme.js +0 -65
  242. package/dist/components/core/RetryBoundary/RetryBoundary.d.ts +0 -35
  243. package/dist/components/core/RetryBoundary/RetryBoundary.js +0 -154
  244. package/dist/components/core/RetryBoundary/RetryBoundary.theme.d.ts +0 -2
  245. package/dist/components/core/RetryBoundary/RetryBoundary.theme.js +0 -7
  246. package/dist/components/core/RetryBoundary/RetryBoundary.types.d.ts +0 -51
  247. package/dist/components/core/RetryBoundary/index.d.ts +0 -3
  248. package/dist/components/core/Table/components/TableActions/TableActions.types.d.ts +0 -40
  249. package/dist/components/core/Table/components/TableActions/index.d.ts +0 -3
  250. package/dist/components/core/Table/components/TableActionsMenu.d.ts +0 -6
  251. package/dist/components/core/Table/components/TablePagination/TablePagination.d.ts +0 -17
  252. package/dist/components/core/Table/components/TablePagination/TablePagination.types.d.ts +0 -21
  253. package/dist/components/core/Table/components/TablePagination/index.d.ts +0 -2
  254. package/dist/components/core/Table/components/TableSelectionHeader/TableSelectionHeader.d.ts +0 -15
  255. package/dist/components/core/Table/components/TableSelectionHeader/index.d.ts +0 -3
  256. package/dist/components/core/Table/components/core/TableRow.d.ts +0 -3
  257. package/dist/components/core/Table/components/core/TableRow.js +0 -44
  258. package/dist/components/core/Table/components/core/index.d.ts +0 -4
  259. package/dist/components/forms/OptimisticForm/OptimisticForm.d.ts +0 -33
  260. package/dist/components/forms/OptimisticForm/OptimisticForm.js +0 -87
  261. package/dist/components/forms/OptimisticForm/OptimisticForm.theme.d.ts +0 -2
  262. package/dist/components/forms/OptimisticForm/OptimisticForm.theme.js +0 -8
  263. package/dist/components/forms/OptimisticForm/OptimisticForm.types.d.ts +0 -74
  264. package/dist/components/forms/OptimisticForm/index.d.ts +0 -3
  265. package/dist/hooks/useOptimisticMutation.d.ts +0 -109
  266. package/dist/hooks/useOptimisticMutation.js +0 -171
  267. package/dist/hooks/usePresence.d.ts +0 -88
  268. package/dist/utils/presenceUtils.d.ts +0 -66
  269. package/dist/utils/presenceUtils.js +0 -107
@@ -7,12 +7,18 @@ import { CardDescription } from './CardDescription.js';
7
7
  import { CardContent } from './CardContent.js';
8
8
  import { CardFooter } from './CardFooter.js';
9
9
 
10
- const CardRoot = React__default.forwardRef(({ children, className, theme: customTheme = {}, ...props }, ref) => {
10
+ const CardRoot = React__default.forwardRef(({ children, className, theme: customTheme = {}, title, description, footer, darkMode = false, ...props }, ref) => {
11
11
  const theme = {
12
12
  ...cardTheme,
13
13
  ...customTheme,
14
14
  };
15
- return (React__default.createElement("div", { ref: ref, className: cn(theme.baseStyle, className), ...props }, children));
15
+ const hasHeader = title || description;
16
+ return (React__default.createElement("div", { ref: ref, className: cn(theme.baseStyle, darkMode && "dark", className), ...props },
17
+ hasHeader && (React__default.createElement("div", { className: theme.headerStyle },
18
+ title && React__default.createElement("div", { className: theme.titleStyle }, title),
19
+ description && React__default.createElement("div", { className: theme.descriptionStyle }, description))),
20
+ hasHeader ? (React__default.createElement("div", { className: theme.contentStyle }, children)) : (children),
21
+ footer && React__default.createElement("div", { className: theme.footerStyle }, footer)));
16
22
  });
17
23
  CardRoot.displayName = 'Card';
18
24
  // Create compound component with proper typing
@@ -1,5 +1,5 @@
1
1
  const cardTheme = {
2
- baseStyle: "rounded-xl overflow-hidden bg-[var(--color-background)] border border-[var(--color-border)] shadow-xs ",
2
+ baseStyle: "rounded-xl overflow-hidden bg-white border border-[var(--color-border)] shadow-xs dark:bg-[var(--color-background-secondary)]",
3
3
  headerStyle: "flex flex-col space-y-1.5 p-4",
4
4
  titleStyle: "text-base font-semibold leading-none text-[var(--color-text-primary)]",
5
5
  descriptionStyle: "text-sm text-[var(--color-text-muted)]",
@@ -15,7 +15,7 @@ export interface CardThemeOverrides {
15
15
  contentStyle?: string;
16
16
  footerStyle?: string;
17
17
  }
18
- export interface CardProps extends HTMLAttributes<HTMLDivElement> {
18
+ export interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
19
19
  /**
20
20
  * The content to be displayed inside the card
21
21
  */
@@ -28,6 +28,29 @@ export interface CardProps extends HTMLAttributes<HTMLDivElement> {
28
28
  * Component-level theme overrides
29
29
  */
30
30
  theme?: CardThemeOverrides;
31
+ /**
32
+ * Card title - auto-generates header when provided
33
+ * Use this for simple cards instead of Card.Header/Card.Title
34
+ */
35
+ title?: ReactNode;
36
+ /**
37
+ * Card description - displayed below title in auto-generated header
38
+ * Use this for simple cards instead of Card.Header/Card.Description
39
+ */
40
+ description?: ReactNode;
41
+ /**
42
+ * Card footer content - auto-generates footer when provided
43
+ * Use this for simple cards instead of Card.Footer
44
+ */
45
+ footer?: ReactNode;
46
+ /**
47
+ * Force dark mode styling for the component. Use when placing the component
48
+ * on a dark background while the page is in light mode. This applies the
49
+ * 'dark' class to the container, making text, borders, and other elements
50
+ * use light colors for visibility.
51
+ * @default false
52
+ */
53
+ darkMode?: boolean;
31
54
  }
32
55
  export interface CardComponent extends ForwardRefExoticComponent<CardProps & RefAttributes<HTMLDivElement>> {
33
56
  Header: ForwardRefExoticComponent<CardHeaderProps & RefAttributes<HTMLDivElement>>;
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { DrawerProps, DrawerContextValue } from "./Drawer.types";
3
3
  export declare const useDrawerContext: () => DrawerContextValue;
4
4
  export declare const Drawer: {
5
- ({ isOpen, onClose, position, size, closeOnOverlayClick, closeOnEsc, showCloseButton, children, className, theme: themeOverrides, ...props }: DrawerProps): React.ReactPortal;
5
+ ({ isOpen, onClose, position, size, closeOnOverlayClick, closeOnEsc, showCloseButton, children, className, theme: themeOverrides, ...props }: DrawerProps): React.JSX.Element;
6
6
  displayName: string;
7
7
  } & {
8
8
  Header: {
@@ -1,9 +1,8 @@
1
- import React__default, { createContext, useCallback, useEffect, useContext } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { AnimatePresence, motion } from 'motion/react';
1
+ import React__default, { createContext, useContext } from 'react';
4
2
  import { cn } from '../../../utils/cn.js';
5
- import { drawerTheme, drawerSizeVariants, drawerPositionVariantsFullWidth, drawerPositionVariantsWithMargin } from './Drawer.theme.js';
6
- import { drawerOverlayAnimations, getDrawerContentAnimations } from './Drawer.animations.js';
3
+ import { Overlay } from '../../effects/Overlay/Overlay.js';
4
+ import { drawerSizeVariants, drawerPositionVariantsFullWidth, drawerPositionVariantsWithMargin, drawerTheme } from './Drawer.theme.js';
5
+ import { getDrawerContentAnimations, drawerOverlayAnimations } from './Drawer.animations.js';
7
6
  import { DrawerHeader } from './DrawerHeader.js';
8
7
  import { DrawerContent } from './DrawerContent.js';
9
8
  import { DrawerFooter } from './DrawerFooter.js';
@@ -17,30 +16,6 @@ const useDrawerContext = () => {
17
16
  return ctx;
18
17
  };
19
18
  const DrawerRoot = ({ isOpen, onClose, position = "right", size = "md", closeOnOverlayClick = true, closeOnEsc = true, showCloseButton = true, children, className, theme: themeOverrides, ...props }) => {
20
- // Handle ESC key
21
- const handleEscKey = useCallback((event) => {
22
- if (event.key === "Escape" && closeOnEsc) {
23
- onClose();
24
- }
25
- }, [closeOnEsc, onClose]);
26
- // Handle overlay click
27
- const handleOverlayClick = useCallback((event) => {
28
- if (event.target === event.currentTarget && closeOnOverlayClick) {
29
- onClose();
30
- }
31
- }, [closeOnOverlayClick, onClose]);
32
- // Setup event listeners
33
- useEffect(() => {
34
- if (isOpen) {
35
- document.addEventListener("keydown", handleEscKey);
36
- // Prevent body scroll
37
- document.body.style.overflow = "hidden";
38
- return () => {
39
- document.removeEventListener("keydown", handleEscKey);
40
- document.body.style.overflow = "unset";
41
- };
42
- }
43
- }, [isOpen, handleEscKey]);
44
19
  // Merge theme with overrides
45
20
  const theme = {
46
21
  ...drawerTheme,
@@ -66,17 +41,12 @@ const DrawerRoot = ({ isOpen, onClose, position = "right", size = "md", closeOnO
66
41
  const positionVariant = size === "full"
67
42
  ? drawerPositionVariantsFullWidth[position]
68
43
  : drawerPositionVariantsWithMargin[position];
69
- // Detect dark mode from document
70
- const isDarkMode = typeof document !== "undefined" &&
71
- (document.documentElement.classList.contains("dark") ||
72
- document.body.classList.contains("dark") ||
73
- document.querySelector(".dark") !== null);
74
- const drawerContent = (React__default.createElement(DrawerContext.Provider, { value: contextValue },
75
- React__default.createElement(AnimatePresence, null, isOpen && (React__default.createElement(motion.div, { className: cn(isDarkMode && "dark", theme.overlay), onClick: handleOverlayClick, variants: drawerOverlayAnimations, initial: "initial", animate: "animate", exit: "exit" },
76
- React__default.createElement(motion.div, { className: cn(theme.container, positionVariant, size !== "full" && sizeVariant, className), variants: getDrawerContentAnimations(position), initial: "initial", animate: "animate", exit: "exit", onClick: (e) => e.stopPropagation(), ...props },
77
- React__default.createElement("div", { className: cn(theme.content) }, children)))))));
78
- // Render in portal
79
- return createPortal(drawerContent, document.body);
44
+ return (React__default.createElement(Overlay, { isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "none", contentClassName: cn(theme.container, positionVariant, size !== "full" && sizeVariant, className), animations: {
45
+ overlay: drawerOverlayAnimations,
46
+ content: getDrawerContentAnimations(position),
47
+ }, ...props },
48
+ React__default.createElement(DrawerContext.Provider, { value: contextValue },
49
+ React__default.createElement("div", { className: theme.content }, children))));
80
50
  };
81
51
  DrawerRoot.displayName = "Drawer";
82
52
  // Attach compound subcomponents
@@ -1,5 +1,6 @@
1
1
  const drawerTheme = {
2
- overlay: "fixed inset-0 bg-[var(--overlay-bg)] backdrop-blur-[var(--overlay-blur)] z-50",
2
+ // Note: overlay styling is now handled by the shared Overlay component
3
+ overlay: "",
3
4
  container: "fixed bg-[var(--color-background)] shadow-2xl shadow-black/30 " +
4
5
  "border border-[var(--color-border)] ring-6 ring-white/20 " +
5
6
  "flex flex-col overflow-hidden rounded-2xl " +
@@ -40,6 +40,14 @@ export interface DrawerProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
40
40
  children: React.ReactNode;
41
41
  className?: string;
42
42
  theme?: DrawerThemeOverrides;
43
+ /**
44
+ * Force dark mode styling for the component. Use when placing the component
45
+ * on a dark background while the page is in light mode. This applies the
46
+ * 'dark' class to the container, making text, borders, and other elements
47
+ * use light colors for visibility.
48
+ * @default false
49
+ */
50
+ darkMode?: boolean;
43
51
  }
44
52
  export interface DrawerHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
45
53
  children: React.ReactNode;
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { DropdownProps } from "./Dropdown.types";
3
3
  export declare const Dropdown: {
4
- ({ children, className, isOpen: controlledIsOpen, defaultIsOpen, onOpenChange, placement, offset, closeOnSelect, disabledKeys, selectedKeys: controlledSelectedKeys, defaultSelectedKeys, selectionMode, onAction, onSelectionChange, theme: themeOverrides, ...props }: DropdownProps): React.JSX.Element;
4
+ ({ children, className, isOpen: controlledIsOpen, defaultIsOpen, onOpenChange, placement, offset, closeOnSelect, disabledKeys, selectedKeys: controlledSelectedKeys, defaultSelectedKeys, selectionMode, onAction, onSelectionChange, theme: themeOverrides, darkMode, ...props }: DropdownProps): React.JSX.Element;
5
5
  displayName: string;
6
6
  } & {
7
7
  Trigger: {
@@ -25,7 +25,7 @@ import { dropdownTheme } from './Dropdown.theme.js';
25
25
  * </Dropdown>
26
26
  * ```
27
27
  */
28
- const DropdownRoot = ({ children, className, isOpen: controlledIsOpen, defaultIsOpen = false, onOpenChange, placement = "bottom-start", offset = 4, closeOnSelect = true, disabledKeys = [], selectedKeys: controlledSelectedKeys, defaultSelectedKeys = [], selectionMode = "none", onAction, onSelectionChange, theme: themeOverrides, ...props }) => {
28
+ const DropdownRoot = ({ children, className, isOpen: controlledIsOpen, defaultIsOpen = false, onOpenChange, placement = "bottom-start", offset = 4, closeOnSelect = true, disabledKeys = [], selectedKeys: controlledSelectedKeys, defaultSelectedKeys = [], selectionMode = "none", onAction, onSelectionChange, theme: themeOverrides, darkMode = false, ...props }) => {
29
29
  // State for uncontrolled open
30
30
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState(defaultIsOpen);
31
31
  // State for uncontrolled selection
@@ -78,7 +78,7 @@ const DropdownRoot = ({ children, className, isOpen: controlledIsOpen, defaultIs
78
78
  theme,
79
79
  };
80
80
  return (React__default.createElement(DropdownContext.Provider, { value: contextValue },
81
- React__default.createElement("div", { className: cn("dropdown", className), "data-state": isOpen ? "open" : "closed", ...props }, children)));
81
+ React__default.createElement("div", { className: cn("dropdown", darkMode && "dark", className), "data-state": isOpen ? "open" : "closed", ...props }, children)));
82
82
  };
83
83
  DropdownRoot.displayName = "Dropdown";
84
84
  // Export as a unified component with sub-components
@@ -32,6 +32,14 @@ export interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {
32
32
  onAction?: (key: string) => void;
33
33
  onSelectionChange?: (keys: string[]) => void;
34
34
  theme?: Partial<DropdownTheme>;
35
+ /**
36
+ * Force dark mode styling for the component. Use when placing the component
37
+ * on a dark background while the page is in light mode. This applies the
38
+ * 'dark' class to the container, making text, borders, and other elements
39
+ * use light colors for visibility.
40
+ * @default false
41
+ */
42
+ darkMode?: boolean;
35
43
  }
36
44
  export interface DropdownTriggerProps {
37
45
  children: React.ReactElement;
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
2
  import { MetricProps } from "./Metric.types";
3
- export default function Metric({ value, label, description, trendValue, trendDirection, trendChart, size, color, icon, noBorder, className, ...props }: MetricProps): React.JSX.Element;
3
+ export default function Metric({ value, label, description, trendValue, trendDirection, trendChart, size, variant, color, icon, className, ...props }: MetricProps): React.JSX.Element;
@@ -4,21 +4,25 @@ import { metricTheme } from './Metric.theme.js';
4
4
  import { Badge } from '../Badge/Badge.js';
5
5
  import { ArrowTrendingUpIcon, ArrowTrendingDownIcon } from '@heroicons/react/24/outline';
6
6
 
7
- function Metric({ value, label, description, trendValue, trendDirection = "up", trendChart, size = "md", color = "primary", icon, noBorder = false, className, ...props }) {
7
+ function Metric({ value, label, description, trendValue, trendDirection = "up", trendChart, size = "md", variant = "filled", color = "primary", icon, className, ...props }) {
8
+ var _a;
8
9
  const trendIcon = trendDirection === "up" ? (React__default.createElement(ArrowTrendingUpIcon, { className: "size-3.5", strokeWidth: 2.5 })) : (React__default.createElement(ArrowTrendingDownIcon, { className: "size-3.5", strokeWidth: 2.5 }));
9
10
  const sizeStyles = metricTheme.sizes[size];
10
- return (React__default.createElement("div", { className: cn(metricTheme.baseStyle, metricTheme.colorStyles[color], sizeStyles.container, noBorder && "border-transparent", className), "data-color": color, "data-size": size, ...props },
11
+ const variantStyles = metricTheme.variants[variant];
12
+ const variantColorStyles = metricTheme.variantColors[variant] || "";
13
+ const iconStyles = ((_a = metricTheme.iconContainerVariantColors[variant]) === null || _a === void 0 ? void 0 : _a[color]) || "";
14
+ return (React__default.createElement("div", { className: cn(metricTheme.baseStyle, variantStyles, variantColorStyles, sizeStyles.container, className), "data-size": size, ...props },
11
15
  React__default.createElement("div", { className: "flex flex-col gap-3 " },
12
16
  React__default.createElement("div", { className: cn("flex items-start gap-3", sizeStyles.contentPadding) },
13
- icon && (React__default.createElement("div", { className: cn(metricTheme.iconContainerStyle, metricTheme.iconContainerColorStyles[color], sizeStyles.iconContainer), "data-color": color }, icon)),
17
+ icon && (React__default.createElement("div", { className: cn(metricTheme.iconContainerStyle, iconStyles, sizeStyles.iconContainer) }, icon)),
14
18
  React__default.createElement("div", { className: "flex flex-col flex-1" },
15
19
  React__default.createElement("div", { className: cn(metricTheme.labelStyle, sizeStyles.label) }, label),
16
20
  React__default.createElement("div", { className: "flex items-center gap-2" },
17
21
  React__default.createElement("div", { className: cn(metricTheme.valueStyle, sizeStyles.value) }, value),
18
22
  trendValue && (React__default.createElement("div", { className: "flex items-center gap-1" },
19
23
  React__default.createElement("div", { className: cn("rounded-full p-1 flex flex-shrink-0 w-fit h-fit", trendDirection === "up"
20
- ? "bg-[var(--color-success-100)] text-[var(--color-success)]"
21
- : "bg-[var(--color-danger-100)] text-[var(--color-danger)]") }, trendIcon),
24
+ ? "bg-[var(--color-success-100)] text-[var(--color-success)] dark:bg-[var(--color-success-100)]/20"
25
+ : "bg-[var(--color-danger-100)] text-[var(--color-danger)] dark:bg-[var(--color-danger-100)]/20") }, trendIcon),
22
26
  React__default.createElement(Badge, { color: trendDirection === "up" ? "success" : "danger", variant: "ghost", className: cn("!bg-transparent p-0 font-semibold !gap-1 !ring-0", trendDirection === "up"
23
27
  ? "!text-[var(--color-success)]"
24
28
  : "!text-[var(--color-danger)]") }, trendValue)))),
@@ -1,6 +1,6 @@
1
1
  import { MetricTheme } from "./Metric.types";
2
2
  /**
3
3
  * Default theme for the Metric component
4
- * Following Button component pattern with data attributes
4
+ * Uses variant-first color organization for reliable dark mode support
5
5
  */
6
6
  export declare const metricTheme: MetricTheme;
@@ -1,35 +1,45 @@
1
1
  /**
2
2
  * Default theme for the Metric component
3
- * Following Button component pattern with data attributes
3
+ * Uses variant-first color organization for reliable dark mode support
4
4
  */
5
5
  const metricTheme = {
6
- // Base container styles
7
- baseStyle: "rounded-2xl glass-effect transition-colors duration-200 overflow-hidden",
8
- // Container border colors
9
- colorStyles: {
10
- // neutral: 'data-[color=neutral]:border-[var(--color-border)]',
11
- // primary: 'data-[color=primary]:border-[var(--color-border)]',
12
- // success: 'data-[color=success]:border-[var(--color-border)]',
13
- // warning: 'data-[color=warning]:border-[var(--color-border)]',
14
- // danger: 'data-[color=danger]:border-[var(--color-border)]',
15
- neutral: "",
16
- primary: "",
17
- success: "",
18
- warning: "",
19
- danger: "",
6
+ // Base container styles (shared across all variants)
7
+ baseStyle: "rounded-2xl transition-colors duration-200 overflow-hidden",
8
+ // Visual style variants (structure only, no colors)
9
+ variants: {
10
+ filled: "border border-[var(--color-border)]",
11
+ glass: "glass-effect",
20
12
  },
21
- // Icon container colors - applied directly with data attributes
22
- iconContainerColorStyles: {
23
- neutral: "data-[color=neutral]:bg-gray-100 " +
24
- "data-[color=neutral]:text-[var(--color-text-primary)]",
25
- primary: "data-[color=primary]:bg-[var(--color-primary-100)] " +
26
- "data-[color=primary]:text-[var(--color-primary)] data-[color=primary]:shadow-blue-500/20",
27
- success: "data-[color=success]:bg-[var(--color-success-50)] " +
28
- "data-[color=success]:text-[var(--color-success)] data-[color=success]:shadow-green-500/20",
29
- warning: "data-[color=warning]:bg-[var(--color-warning-50)] " +
30
- "data-[color=warning]:text-[var(--color-warning)] data-[color=warning]:shadow-yellow-500/20",
31
- danger: "data-[color=danger]:bg-[var(--color-danger-50)] " +
32
- "data-[color=danger]:text-[var(--color-danger)] data-[color=danger]:shadow-rose-400/20",
13
+ // Container background styles per variant (color only applies to icon)
14
+ variantColors: {
15
+ filled: "bg-white dark:bg-transparent",
16
+ glass: "",
17
+ },
18
+ // Icon container styles organized PER VARIANT (color applies to icon)
19
+ iconContainerVariantColors: {
20
+ filled: {
21
+ neutral: "bg-white text-[var(--color-text-primary)] border border-[var(--color-border)] " +
22
+ "dark:bg-[var(--color-background-secondary)] dark:border-0",
23
+ primary: "bg-white text-[var(--color-primary)] border border-[var(--color-border)] " +
24
+ "dark:bg-[var(--color-background-secondary)] dark:border-0",
25
+ success: "bg-white text-[var(--color-success)] border border-[var(--color-border)] " +
26
+ "dark:bg-[var(--color-background-secondary)] dark:border-0",
27
+ warning: "bg-white text-[var(--color-warning)] border border-[var(--color-border)] " +
28
+ "dark:bg-[var(--color-background-secondary)] dark:border-0",
29
+ danger: "bg-white text-[var(--color-danger)] border border-[var(--color-border)] " +
30
+ "dark:bg-[var(--color-background-secondary)] dark:border-0",
31
+ },
32
+ glass: {
33
+ neutral: "glass-effect-1 !ring-0 text-[var(--color-text-primary)]",
34
+ primary: "glass-effect-2 !ring-0 shadow-lg shadow-blue-500/10 text-[var(--color-primary)] " +
35
+ "dark:text-[var(--color-primary-400)]",
36
+ success: "glass-effect-2 !ring-0 shadow-lg shadow-green-500/10 text-[var(--color-success)] " +
37
+ "dark:text-[var(--color-success-400)]",
38
+ warning: "glass-effect-2 !ring-0 shadow-lg shadow-yellow-500/10 text-[var(--color-warning)] " +
39
+ "dark:text-[var(--color-warning-400)]",
40
+ danger: "glass-effect-2 !ring-0 shadow-lg shadow-rose-500/10 text-[var(--color-danger)] " +
41
+ "dark:text-[var(--color-danger-400)]",
42
+ },
33
43
  },
34
44
  // Size variants for container and sub-elements
35
45
  sizes: {
@@ -62,7 +72,7 @@ const metricTheme = {
62
72
  labelStyle: "font-semibold text-[var(--color-text-secondary)] mb-1",
63
73
  valueStyle: "font-bold text-[var(--color-text-primary)] tracking-tight",
64
74
  descriptionStyle: "text-[var(--color-text-secondary)]/80",
65
- iconContainerStyle: "rounded-full flex items-center justify-center flex-shrink-0 p-3.5 border-t glass-effect !to-transparent !ring-0 shadow-lg",
75
+ iconContainerStyle: "rounded-full flex items-center justify-center flex-shrink-0 p-3.5",
66
76
  };
67
77
 
68
78
  export { metricTheme };
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  export type MetricSize = 'sm' | 'md' | 'lg';
3
3
  export type MetricColor = 'neutral' | 'primary' | 'success' | 'warning' | 'danger';
4
+ export type MetricVariant = 'filled' | 'glass';
4
5
  export type TrendDirection = 'up' | 'down';
5
6
  export interface MetricProps extends React.HTMLAttributes<HTMLDivElement> {
6
7
  /**
@@ -34,6 +35,11 @@ export interface MetricProps extends React.HTMLAttributes<HTMLDivElement> {
34
35
  * @default 'md'
35
36
  */
36
37
  size?: MetricSize;
38
+ /**
39
+ * Visual style variant
40
+ * @default 'filled'
41
+ */
42
+ variant?: MetricVariant;
37
43
  /**
38
44
  * Semantic color for icon and accents
39
45
  * @default 'primary'
@@ -43,11 +49,6 @@ export interface MetricProps extends React.HTMLAttributes<HTMLDivElement> {
43
49
  * Optional icon to display
44
50
  */
45
51
  icon?: React.ReactNode;
46
- /**
47
- * Remove border from container
48
- * @default false
49
- */
50
- noBorder?: boolean;
51
52
  /**
52
53
  * Custom className for styling overrides
53
54
  */
@@ -55,8 +56,9 @@ export interface MetricProps extends React.HTMLAttributes<HTMLDivElement> {
55
56
  }
56
57
  export interface MetricTheme {
57
58
  baseStyle: string;
58
- colorStyles: Record<MetricColor, string>;
59
- iconContainerColorStyles: Record<MetricColor, string>;
59
+ variants: Record<MetricVariant, string>;
60
+ variantColors: Record<MetricVariant, string>;
61
+ iconContainerVariantColors: Record<MetricVariant, Record<MetricColor, string>>;
60
62
  sizes: Record<MetricSize, {
61
63
  container: string;
62
64
  contentPadding: string;
@@ -70,4 +72,21 @@ export interface MetricTheme {
70
72
  descriptionStyle: string;
71
73
  iconContainerStyle: string;
72
74
  }
73
- export type MetricThemeOverrides = Partial<MetricTheme>;
75
+ export interface MetricThemeOverrides {
76
+ baseStyle?: string;
77
+ variants?: Partial<Record<MetricVariant, string>>;
78
+ variantColors?: Partial<Record<MetricVariant, string>>;
79
+ iconContainerVariantColors?: Partial<Record<MetricVariant, Partial<Record<MetricColor, string>>>>;
80
+ sizes?: Partial<Record<MetricSize, Partial<{
81
+ container: string;
82
+ contentPadding: string;
83
+ iconContainer: string;
84
+ label: string;
85
+ value: string;
86
+ description: string;
87
+ }>>>;
88
+ labelStyle?: string;
89
+ valueStyle?: string;
90
+ descriptionStyle?: string;
91
+ iconContainerStyle?: string;
92
+ }
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { ModalProps, ModalContextValue } from "./Modal.types";
3
3
  export declare const useModalContext: () => ModalContextValue;
4
4
  export declare const Modal: {
5
- ({ isOpen, onClose, size, closeOnOverlayClick, closeOnEsc, showCloseButton, children, className, theme: themeOverrides, ...props }: ModalProps): React.ReactPortal;
5
+ ({ isOpen, onClose, size, variant, closeOnOverlayClick, closeOnEsc, showCloseButton, children, className, theme: themeOverrides, ...props }: ModalProps): React.JSX.Element;
6
6
  displayName: string;
7
7
  } & {
8
8
  Header: {
@@ -1,9 +1,8 @@
1
- import React__default, { createContext, useState, useCallback, useEffect, useContext } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { AnimatePresence, motion } from 'motion/react';
1
+ import React__default, { createContext, useState, useEffect, useContext } from 'react';
4
2
  import { cn } from '../../../utils/cn.js';
3
+ import { Overlay } from '../../effects/Overlay/Overlay.js';
5
4
  import { modalTheme, modalSizeVariants } from './Modal.theme.js';
6
- import { modalOverlayAnimations, modalContentAnimations } from './Modal.animations.js';
5
+ import { modalContentAnimations, modalOverlayAnimations } from './Modal.animations.js';
7
6
  import { ModalHeader } from './ModalHeader.js';
8
7
  import { ModalTitle } from './ModalTitle.js';
9
8
  import { ModalDescription } from './ModalDescription.js';
@@ -18,41 +17,24 @@ const useModalContext = () => {
18
17
  throw new Error("Modal compound components must be used within <Modal>");
19
18
  return ctx;
20
19
  };
21
- const ModalRoot = ({ isOpen, onClose, size = "md", closeOnOverlayClick = true, closeOnEsc = true, showCloseButton = true, children, className, theme: themeOverrides, ...props }) => {
20
+ const ModalRoot = ({ isOpen, onClose, size = "md", variant = "default", closeOnOverlayClick = true, closeOnEsc = true, showCloseButton = true, children, className, theme: themeOverrides, ...props }) => {
21
+ var _a;
22
22
  // State for tracking if modal body is scrollable
23
23
  const [isBodyScrollable, setIsBodyScrollable] = useState(false);
24
- // Handle ESC key
25
- const handleEscKey = useCallback((event) => {
26
- if (event.key === "Escape" && closeOnEsc) {
27
- onClose();
28
- }
29
- }, [closeOnEsc, onClose]);
30
- // Handle overlay click
31
- const handleOverlayClick = useCallback((event) => {
32
- if (event.target === event.currentTarget && closeOnOverlayClick) {
33
- onClose();
34
- }
35
- }, [closeOnOverlayClick, onClose]);
36
- // Setup event listeners
24
+ // Reset scroll state when modal closes
37
25
  useEffect(() => {
38
- if (isOpen) {
39
- document.addEventListener("keydown", handleEscKey);
40
- // Prevent body scroll
41
- document.body.style.overflow = "hidden";
42
- return () => {
43
- document.removeEventListener("keydown", handleEscKey);
44
- document.body.style.overflow = "unset";
45
- };
46
- }
47
- else {
48
- // Reset scroll state when modal closes
26
+ if (!isOpen) {
49
27
  setIsBodyScrollable(false);
50
28
  }
51
- }, [isOpen, handleEscKey]);
29
+ }, [isOpen]);
52
30
  // Merge theme with overrides
53
31
  const theme = {
54
32
  ...modalTheme,
55
33
  ...(themeOverrides || {}),
34
+ containerVariants: {
35
+ ...modalTheme.containerVariants,
36
+ ...((themeOverrides === null || themeOverrides === void 0 ? void 0 : themeOverrides.containerVariants) || {}),
37
+ },
56
38
  };
57
39
  // Context value
58
40
  const contextValue = {
@@ -66,16 +48,11 @@ const ModalRoot = ({ isOpen, onClose, size = "md", closeOnOverlayClick = true, c
66
48
  isBodyScrollable,
67
49
  setIsBodyScrollable,
68
50
  };
69
- // Detect dark mode from document
70
- const isDarkMode = typeof document !== "undefined" &&
71
- (document.documentElement.classList.contains("dark") ||
72
- document.body.classList.contains("dark") ||
73
- document.querySelector(".dark") !== null);
74
- const modalContent = (React__default.createElement(ModalContext.Provider, { value: contextValue },
75
- React__default.createElement(AnimatePresence, null, isOpen && (React__default.createElement(motion.div, { className: cn(isDarkMode && "dark", theme.overlay), onClick: handleOverlayClick, variants: modalOverlayAnimations, initial: "initial", animate: "animate", exit: "exit" },
76
- React__default.createElement(motion.div, { className: cn(theme.container, modalSizeVariants[size], className), variants: modalContentAnimations, initial: "initial", animate: "animate", exit: "exit", ...props }, children))))));
77
- // Render in portal
78
- return createPortal(modalContent, document.body);
51
+ return (React__default.createElement(Overlay, { isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "center", contentClassName: cn(theme.container, (_a = theme.containerVariants) === null || _a === void 0 ? void 0 : _a[variant], modalSizeVariants[size], className), animations: {
52
+ overlay: modalOverlayAnimations,
53
+ content: modalContentAnimations,
54
+ }, ...props },
55
+ React__default.createElement(ModalContext.Provider, { value: contextValue }, children)));
79
56
  };
80
57
  ModalRoot.displayName = "Modal";
81
58
  // Attach compound subcomponents
@@ -1,10 +1,15 @@
1
1
  const modalTheme = {
2
- overlay: "fixed inset-0 bg-[var(--overlay-bg)] backdrop-blur-[var(--overlay-blur)] z-50 flex items-center justify-center",
3
- container: "relative glass-effect-2 w-full max-h-[calc(100vh-2rem)] !bg-[var(--color-background)]/90 rounded-[var(--modal-rounded)] shadow-2xl shadow-black/30 !ring-4 !ring-white/10 flex flex-col my-4 min-h-0 overflow-hidden ",
2
+ // Note: overlay styling is now handled by the shared Overlay component
3
+ overlay: "",
4
+ container: "relative w-full max-h-[calc(100vh-2rem)] rounded-[var(--modal-rounded)] shadow-2xl shadow-black/30 flex flex-col my-4 min-h-0 overflow-hidden",
5
+ containerVariants: {
6
+ default: "bg-white !ring-4 !ring-white/10 dark:bg-[var(--color-background-secondary)]",
7
+ translucent: "bg-gradient-to-b from-white/90 to-white/70 backdrop-blur-xl ring-4 ring-white/20 border-t border-white dark:border-white/20 dark:from-neutral-900/80 dark:to-neutral-900/60 dark:ring-neutral-500/20 ",
8
+ },
4
9
  header: "flex items-start justify-between p-6 pb-0 shrink-0 border-b border-transparent gap-6 relative",
5
10
  headerContent: "flex flex-col items-start gap-2 flex-1",
6
11
  title: "text-base leading-6 font-semibold text-[var(--color-text-primary)]",
7
- description: "text-sm text-[var(--color-text-muted)] mt-0.5",
12
+ description: "text-sm text-[var(--color-text-secondary)] mt-0.5",
8
13
  body: "flex-1 overflow-y-auto p-6 pb-3",
9
14
  footer: "flex items-center justify-end gap-2 p-6 py-3 border-t border-transparent",
10
15
  };
@@ -1,8 +1,10 @@
1
1
  import React from "react";
2
2
  export type ModalSize = "sm" | "md" | "lg" | "xl" | "full";
3
+ export type ModalVariant = "default" | "translucent";
3
4
  export interface ModalTheme {
4
5
  overlay: string;
5
6
  container: string;
7
+ containerVariants: Record<ModalVariant, string>;
6
8
  header: string;
7
9
  headerContent: string;
8
10
  title: string;
@@ -13,6 +15,7 @@ export interface ModalTheme {
13
15
  export interface ModalThemeOverrides {
14
16
  overlay?: string;
15
17
  container?: string;
18
+ containerVariants?: Partial<Record<ModalVariant, string>>;
16
19
  header?: string;
17
20
  headerContent?: string;
18
21
  title?: string;
@@ -35,12 +38,27 @@ export interface ModalProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "
35
38
  isOpen: boolean;
36
39
  onClose: () => void;
37
40
  size?: ModalSize;
41
+ /**
42
+ * Visual variant of the modal container.
43
+ * - `default`: Solid background with subtle ring
44
+ * - `translucent`: Frosted glass effect with reduced opacity and backdrop blur
45
+ * @default "default"
46
+ */
47
+ variant?: ModalVariant;
38
48
  closeOnOverlayClick?: boolean;
39
49
  closeOnEsc?: boolean;
40
50
  showCloseButton?: boolean;
41
51
  children: React.ReactNode;
42
52
  className?: string;
43
53
  theme?: ModalThemeOverrides;
54
+ /**
55
+ * Force dark mode styling for the component. Use when placing the component
56
+ * on a dark background while the page is in light mode. This applies the
57
+ * 'dark' class to the container, making text, borders, and other elements
58
+ * use light colors for visibility.
59
+ * @default false
60
+ */
61
+ darkMode?: boolean;
44
62
  }
45
63
  export interface ModalHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
46
64
  children: React.ReactNode;
@@ -1,2 +1,2 @@
1
1
  export { Modal } from "./Modal";
2
- export type { ModalProps, ModalSize, ModalThemeOverrides } from "./Modal.types";
2
+ export type { ModalProps, ModalSize, ModalVariant, ModalThemeOverrides } from "./Modal.types";
@@ -37,6 +37,7 @@ import '../Modal/Modal.js';
37
37
  import '../Pagination/Pagination.js';
38
38
  import '../Popover/Popover.js';
39
39
  import '../Popover/PopoverContext.js';
40
+ import '../Progress/Progress.js';
40
41
  import '../ProgressiveBlur/ProgressiveBlur.js';
41
42
  import '../Segmented/Segmented.js';
42
43
  import '../Skeleton/Skeleton.js';
@@ -50,6 +51,7 @@ import '../Tabs/TabsContext.js';
50
51
  import '../Tooltip/Tooltip.js';
51
52
  import '../Tooltip/Tooltip.animations.js';
52
53
  import '../Tree/Tree.js';
54
+ import '../Tag/Tag.js';
53
55
  import '../Alert/Alert.js';
54
56
  import '../Toast/Toast.js';
55
57
  import '../Toast/ToastProvider.js';