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.
- package/README.md +92 -0
- package/dist/components/ai/PromptInput/PromptInput.js +23 -15
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.d.ts +27 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.js +62 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.d.ts +10 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +12 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.types.d.ts +53 -0
- package/dist/components/ai/PromptSuggestions/index.d.ts +4 -2
- package/dist/components/ai/index.d.ts +2 -12
- package/dist/components/charts/ActivityRings/ActivityRings.js +70 -58
- package/dist/components/charts/ActivityRings/ActivityRings.theme.js +0 -1
- package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +17 -0
- package/dist/components/charts/BarChart/BarChart.js +8 -4
- package/dist/components/charts/BarChart/BarChart.types.d.ts +14 -0
- package/dist/components/charts/DonutChart/DonutChart.js +11 -8
- package/dist/components/charts/DonutChart/DonutChart.theme.d.ts +3 -0
- package/dist/components/charts/DonutChart/DonutChart.theme.js +5 -4
- package/dist/components/charts/DonutChart/donut-utils.d.ts +5 -0
- package/dist/components/charts/DonutChart/donut-utils.js +26 -1
- package/dist/components/charts/Heatmap/Heatmap.theme.js +2 -2
- package/dist/components/charts/shared/ChartAxis/XAxis.d.ts +2 -2
- package/dist/components/charts/shared/ChartAxis/XAxis.js +4 -4
- package/dist/components/charts/shared/ChartAxis/YAxis.d.ts +2 -2
- package/dist/components/charts/shared/ChartAxis/YAxis.js +8 -7
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +1 -1
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +2 -2
- package/dist/components/charts/theme/chart.theme.d.ts +1 -1
- package/dist/components/charts/theme/chart.theme.js +39 -39
- package/dist/components/core/Accordion/Accordion.d.ts +1 -1
- package/dist/components/core/Accordion/Accordion.js +2 -2
- package/dist/components/core/Accordion/Accordion.types.d.ts +8 -0
- package/dist/components/core/Badge/Badge.js +11 -15
- package/dist/components/core/Badge/Badge.theme.js +7 -21
- package/dist/components/core/Badge/Badge.types.d.ts +9 -1
- package/dist/components/core/Button/Button.js +2 -2
- package/dist/components/core/Button/Button.theme.js +1 -1
- package/dist/components/core/Button/Button.types.d.ts +8 -0
- package/dist/components/core/Card/Card.js +8 -2
- package/dist/components/core/Card/Card.theme.js +1 -1
- package/dist/components/core/Card/Card.types.d.ts +24 -1
- package/dist/components/core/Drawer/Drawer.d.ts +1 -1
- package/dist/components/core/Drawer/Drawer.js +10 -40
- package/dist/components/core/Drawer/Drawer.theme.js +2 -1
- package/dist/components/core/Drawer/Drawer.types.d.ts +8 -0
- package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
- package/dist/components/core/Dropdown/Dropdown.js +2 -2
- package/dist/components/core/Dropdown/Dropdown.types.d.ts +8 -0
- package/dist/components/core/Metric/Metric.d.ts +1 -1
- package/dist/components/core/Metric/Metric.js +9 -5
- package/dist/components/core/Metric/Metric.theme.d.ts +1 -1
- package/dist/components/core/Metric/Metric.theme.js +38 -28
- package/dist/components/core/Metric/Metric.types.d.ts +27 -8
- package/dist/components/core/Modal/Modal.d.ts +1 -1
- package/dist/components/core/Modal/Modal.js +17 -40
- package/dist/components/core/Modal/Modal.theme.js +8 -3
- package/dist/components/core/Modal/Modal.types.d.ts +18 -0
- package/dist/components/core/Modal/index.d.ts +1 -1
- package/dist/components/core/Notification/Notification.js +2 -0
- package/dist/components/core/Pill/Pill.d.ts +6 -11
- package/dist/components/core/Pill/Pill.theme.d.ts +2 -2
- package/dist/components/core/Pill/Pill.types.d.ts +9 -22
- package/dist/components/core/Pill/index.d.ts +1 -1
- package/dist/components/core/Popover/Popover.d.ts +1 -1
- package/dist/components/core/Popover/Popover.js +2 -2
- package/dist/components/core/Popover/Popover.types.d.ts +8 -0
- package/dist/components/core/Progress/Progress.d.ts +28 -0
- package/dist/components/core/Progress/Progress.js +114 -0
- package/dist/components/core/Progress/Progress.theme.d.ts +5 -0
- package/dist/components/core/Progress/Progress.theme.js +33 -0
- package/dist/components/core/Progress/Progress.types.d.ts +92 -0
- package/dist/components/core/Progress/index.d.ts +2 -0
- package/dist/components/core/Table/Table.animations.d.ts +5 -16
- package/dist/components/core/Table/Table.animations.js +46 -0
- package/dist/components/core/Table/Table.d.ts +0 -27
- package/dist/components/core/Table/Table.js +58 -156
- package/dist/components/core/Table/Table.theme.js +28 -19
- package/dist/components/core/Table/Table.types.d.ts +95 -8
- package/dist/components/core/Table/Table.utils.d.ts +7 -0
- package/dist/components/core/Table/Table.utils.js +11 -1
- package/dist/components/core/Table/{components/TableActions/TableActions.d.ts → TableActions.d.ts} +3 -3
- package/dist/components/core/Table/{components/TableActions/TableActions.js → TableActions.js} +14 -24
- package/dist/components/core/Table/{components/TableActions/TableActionsMenu.d.ts → TableActionsMenu.d.ts} +1 -1
- package/dist/components/core/Table/{components/TableActions/TableActionsMenu.js → TableActionsMenu.js} +4 -4
- package/dist/components/core/Table/{components/core/TableBody.d.ts → TableBody.d.ts} +1 -1
- package/dist/components/core/Table/{components/core/TableBody.js → TableBody.js} +14 -20
- package/dist/components/core/Table/{components/core/TableCell.d.ts → TableCell.d.ts} +1 -9
- package/dist/components/core/Table/{components/core/TableCell.js → TableCell.js} +5 -13
- package/dist/components/core/Table/TableColumnManager.d.ts +3 -0
- package/dist/components/core/Table/TableColumnManager.js +34 -0
- package/dist/components/core/Table/{components/DeclarativeComponents.d.ts → TableDeclarative.d.ts} +1 -1
- package/dist/components/core/Table/{components/DeclarativeComponents.js → TableDeclarative.js} +6 -56
- package/dist/components/core/Table/TableFilter.d.ts +3 -0
- package/dist/components/core/Table/TableFilter.js +122 -0
- package/dist/components/core/Table/{components/core/TableHeader.d.ts → TableHeader.d.ts} +1 -1
- package/dist/components/core/Table/{components/core/TableHeader.js → TableHeader.js} +15 -29
- package/dist/components/core/Table/TablePagination.d.ts +7 -0
- package/dist/components/core/Table/{components/TablePagination/TablePagination.js → TablePagination.js} +5 -16
- package/dist/components/core/Table/TableRow.d.ts +8 -0
- package/dist/components/core/Table/TableRow.js +45 -0
- package/dist/components/core/Table/TableSelectionHeader.d.ts +7 -0
- package/dist/components/core/Table/{components/TableSelectionHeader/TableSelectionHeader.js → TableSelectionHeader.js} +4 -5
- package/dist/components/core/Table/hooks/index.d.ts +10 -0
- package/dist/components/core/Table/hooks/useTableColumns.d.ts +16 -0
- package/dist/components/core/Table/hooks/useTableColumns.js +67 -0
- package/dist/components/core/Table/hooks/useTableExpansion.d.ts +8 -0
- package/dist/components/core/Table/hooks/useTableExpansion.js +15 -0
- package/dist/components/core/Table/hooks/useTableFilter.d.ts +12 -0
- package/dist/components/core/Table/hooks/useTableFilter.js +37 -0
- package/dist/components/core/Table/hooks/useTablePagination.d.ts +12 -0
- package/dist/components/core/Table/hooks/useTablePagination.js +13 -0
- package/dist/components/core/Table/hooks/useTableSelection.d.ts +17 -0
- package/dist/components/core/Table/hooks/useTableSelection.js +40 -0
- package/dist/components/core/Table/index.d.ts +9 -8
- package/dist/components/core/Table/index.js +7 -5
- package/dist/components/core/Tabs/Tabs.js +2 -2
- package/dist/components/core/Tabs/Tabs.types.d.ts +8 -0
- package/dist/components/core/Tag/Tag.animations.d.ts +3 -0
- package/dist/components/core/Tag/Tag.animations.js +31 -0
- package/dist/components/core/Tag/Tag.d.ts +14 -0
- package/dist/components/core/Tag/Tag.js +45 -0
- package/dist/components/core/Tag/Tag.theme.d.ts +2 -0
- package/dist/components/core/Tag/Tag.theme.js +21 -0
- package/dist/components/core/Tag/Tag.types.d.ts +40 -0
- package/dist/components/core/Tag/index.d.ts +3 -0
- package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
- package/dist/components/core/Tooltip/Tooltip.js +3 -3
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.types.d.ts +17 -0
- package/dist/components/core/index.d.ts +2 -1
- package/dist/components/core/index.js +12 -5
- package/dist/components/effects/CustomCursor/CustomCursor.d.ts +0 -13
- package/dist/components/effects/CustomCursor/CustomCursor.js +26 -2
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +12 -1
- package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +14 -1
- package/dist/components/forms/Combobox/Combobox.d.ts +25 -0
- package/dist/components/forms/Combobox/Combobox.js +412 -0
- package/dist/components/forms/Combobox/Combobox.theme.d.ts +6 -0
- package/dist/components/forms/Combobox/Combobox.theme.js +60 -0
- package/dist/components/forms/Combobox/Combobox.types.d.ts +111 -0
- package/dist/components/forms/Combobox/index.d.ts +3 -0
- package/dist/components/forms/FileUpload/FileUpload.js +2 -0
- package/dist/components/forms/Input/Input.js +25 -28
- package/dist/components/forms/Input/inputMasks.d.ts +15 -0
- package/dist/components/forms/Input/inputMasks.js +72 -1
- package/dist/components/forms/InputTag/InputTag.d.ts +40 -0
- package/dist/components/forms/InputTag/InputTag.js +491 -0
- package/dist/components/forms/InputTag/InputTag.theme.d.ts +2 -0
- package/dist/components/forms/InputTag/InputTag.theme.js +16 -0
- package/dist/components/forms/InputTag/InputTag.types.d.ts +107 -0
- package/dist/components/forms/InputTag/index.d.ts +3 -0
- package/dist/components/forms/Select/Select.d.ts +101 -2
- package/dist/components/forms/Select/Select.js +128 -132
- package/dist/components/forms/Select/Select.theme.js +10 -14
- package/dist/components/forms/Select/Select.types.d.ts +6 -2
- package/dist/components/forms/Select/index.d.ts +7 -4
- package/dist/components/forms/Select/useSelectState.d.ts +66 -0
- package/dist/components/forms/Select/useSelectState.js +134 -0
- package/dist/components/forms/SelectExpand/SelectExpand.animations.d.ts +20 -0
- package/dist/components/forms/SelectExpand/SelectExpand.animations.js +74 -0
- package/dist/components/forms/SelectExpand/SelectExpand.d.ts +9 -0
- package/dist/components/forms/SelectExpand/SelectExpand.js +223 -0
- package/dist/components/forms/SelectExpand/SelectExpand.theme.d.ts +5 -0
- package/dist/components/forms/SelectExpand/SelectExpand.theme.js +74 -0
- package/dist/components/forms/SelectExpand/SelectExpand.types.d.ts +126 -0
- package/dist/components/forms/SelectExpand/index.d.ts +4 -0
- package/dist/components/forms/Switch/Switch.js +3 -3
- package/dist/components/forms/Switch/Switch.theme.d.ts +1 -1
- package/dist/components/forms/Switch/Switch.theme.js +2 -2
- package/dist/components/forms/TimePicker/TimePicker.animations.d.ts +0 -46
- package/dist/components/forms/TimePicker/TimePicker.d.ts +15 -6
- package/dist/components/forms/TimePicker/TimePicker.js +285 -124
- package/dist/components/forms/TimePicker/TimePicker.theme.d.ts +1 -1
- package/dist/components/forms/TimePicker/TimePicker.theme.js +39 -22
- package/dist/components/forms/TimePicker/TimePicker.types.d.ts +88 -34
- package/dist/components/forms/TimePicker/TimePickerContent.d.ts +7 -10
- package/dist/components/forms/TimePicker/TimePickerContent.js +149 -16
- package/dist/components/forms/TimePicker/TimePickerTrigger.d.ts +3 -3
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +22 -19
- package/dist/components/forms/TimePicker/WheelColumn.d.ts +14 -0
- package/dist/components/forms/TimePicker/WheelColumn.js +90 -0
- package/dist/components/forms/TimePicker/index.d.ts +4 -1
- package/dist/components/forms/TimePicker/useWheelPicker.d.ts +37 -0
- package/dist/components/forms/TimePicker/useWheelPicker.js +138 -0
- package/dist/components/forms/forms.theme.d.ts +14 -0
- package/dist/components/forms/forms.theme.js +31 -0
- package/dist/components/forms/index.d.ts +9 -3
- package/dist/components/forms/index.js +73 -2
- package/dist/hooks/index.d.ts +0 -4
- package/dist/icons/Icon.d.ts +7 -0
- package/dist/icons/Icon.js +6 -2
- package/dist/index.js +21 -19
- package/dist/styles.css +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/optimisticErrors.js +1 -70
- package/package.json +1 -1
- package/dist/components/ai/EditingIndicator/EditingIndicator.animations.d.ts +0 -31
- package/dist/components/ai/EditingIndicator/EditingIndicator.animations.js +0 -115
- package/dist/components/ai/EditingIndicator/EditingIndicator.d.ts +0 -35
- package/dist/components/ai/EditingIndicator/EditingIndicator.js +0 -94
- package/dist/components/ai/EditingIndicator/EditingIndicator.theme.d.ts +0 -2
- package/dist/components/ai/EditingIndicator/EditingIndicator.theme.js +0 -13
- package/dist/components/ai/EditingIndicator/EditingIndicator.types.d.ts +0 -54
- package/dist/components/ai/EditingIndicator/index.d.ts +0 -9
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.d.ts +0 -3
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.js +0 -126
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.d.ts +0 -2
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.js +0 -8
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.types.d.ts +0 -45
- package/dist/components/ai/GenerativeRenderer/index.d.ts +0 -3
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.d.ts +0 -17
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.js +0 -56
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.d.ts +0 -38
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.js +0 -110
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.d.ts +0 -2
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.js +0 -13
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.types.d.ts +0 -53
- package/dist/components/ai/PresenceIndicator/index.d.ts +0 -8
- package/dist/components/ai/PresenceProvider/PresenceContext.d.ts +0 -24
- package/dist/components/ai/PresenceProvider/PresenceContext.js +0 -34
- package/dist/components/ai/PresenceProvider/PresenceProvider.d.ts +0 -32
- package/dist/components/ai/PresenceProvider/PresenceProvider.js +0 -321
- package/dist/components/ai/PresenceProvider/PresenceProvider.types.d.ts +0 -140
- package/dist/components/ai/PresenceProvider/adapters/MockAdapter.d.ts +0 -102
- package/dist/components/ai/PresenceProvider/adapters/MockAdapter.js +0 -331
- package/dist/components/ai/PresenceProvider/adapters/PresenceAdapter.d.ts +0 -93
- package/dist/components/ai/PresenceProvider/adapters/SupabaseAdapter.d.ts +0 -134
- package/dist/components/ai/PresenceProvider/adapters/WebSocketAdapter.d.ts +0 -149
- package/dist/components/ai/PresenceProvider/adapters/index.d.ts +0 -11
- package/dist/components/ai/PresenceProvider/index.d.ts +0 -10
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.d.ts +0 -27
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.js +0 -61
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.types.d.ts +0 -65
- package/dist/components/ai/VersionSlider/VersionSlider.d.ts +0 -3
- package/dist/components/ai/VersionSlider/VersionSlider.js +0 -97
- package/dist/components/ai/VersionSlider/VersionSlider.theme.d.ts +0 -2
- package/dist/components/ai/VersionSlider/VersionSlider.theme.js +0 -18
- package/dist/components/ai/VersionSlider/VersionSlider.types.d.ts +0 -77
- package/dist/components/ai/VersionSlider/index.d.ts +0 -3
- package/dist/components/core/Pill/Pill.animations.js +0 -25
- package/dist/components/core/Pill/Pill.js +0 -145
- package/dist/components/core/Pill/Pill.theme.js +0 -65
- package/dist/components/core/RetryBoundary/RetryBoundary.d.ts +0 -35
- package/dist/components/core/RetryBoundary/RetryBoundary.js +0 -154
- package/dist/components/core/RetryBoundary/RetryBoundary.theme.d.ts +0 -2
- package/dist/components/core/RetryBoundary/RetryBoundary.theme.js +0 -7
- package/dist/components/core/RetryBoundary/RetryBoundary.types.d.ts +0 -51
- package/dist/components/core/RetryBoundary/index.d.ts +0 -3
- package/dist/components/core/Table/components/TableActions/TableActions.types.d.ts +0 -40
- package/dist/components/core/Table/components/TableActions/index.d.ts +0 -3
- package/dist/components/core/Table/components/TableActionsMenu.d.ts +0 -6
- package/dist/components/core/Table/components/TablePagination/TablePagination.d.ts +0 -17
- package/dist/components/core/Table/components/TablePagination/TablePagination.types.d.ts +0 -21
- package/dist/components/core/Table/components/TablePagination/index.d.ts +0 -2
- package/dist/components/core/Table/components/TableSelectionHeader/TableSelectionHeader.d.ts +0 -15
- package/dist/components/core/Table/components/TableSelectionHeader/index.d.ts +0 -3
- package/dist/components/core/Table/components/core/TableRow.d.ts +0 -3
- package/dist/components/core/Table/components/core/TableRow.js +0 -44
- package/dist/components/core/Table/components/core/index.d.ts +0 -4
- package/dist/components/forms/OptimisticForm/OptimisticForm.d.ts +0 -33
- package/dist/components/forms/OptimisticForm/OptimisticForm.js +0 -87
- package/dist/components/forms/OptimisticForm/OptimisticForm.theme.d.ts +0 -2
- package/dist/components/forms/OptimisticForm/OptimisticForm.theme.js +0 -8
- package/dist/components/forms/OptimisticForm/OptimisticForm.types.d.ts +0 -74
- package/dist/components/forms/OptimisticForm/index.d.ts +0 -3
- package/dist/hooks/useOptimisticMutation.d.ts +0 -109
- package/dist/hooks/useOptimisticMutation.js +0 -171
- package/dist/hooks/usePresence.d.ts +0 -88
- package/dist/utils/presenceUtils.d.ts +0 -66
- 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
|
-
|
|
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-
|
|
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.
|
|
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,
|
|
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 {
|
|
6
|
-
import {
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
|
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
|
-
|
|
59
|
-
|
|
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
|
|
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.
|
|
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,
|
|
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 {
|
|
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
|
-
//
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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-
|
|
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';
|