flikkui 0.2.0-beta.2 → 0.2.0-beta.4
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/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/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 +3 -2
- 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 +12 -16
- 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/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
|
@@ -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';
|
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import { PillProps } from
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { PillProps } from "./Pill.types";
|
|
3
3
|
/**
|
|
4
4
|
* Pill component - Simplified selectable chip for filters and tags
|
|
5
5
|
*
|
|
6
|
-
* A focused
|
|
7
|
-
*
|
|
6
|
+
* A focused component with single outline style. For colorful semantic
|
|
7
|
+
* variations, use Badge instead.
|
|
8
8
|
*
|
|
9
9
|
* @example Basic usage
|
|
10
10
|
* ```tsx
|
|
11
|
-
* <Pill
|
|
11
|
+
* <Pill>Design</Pill>
|
|
12
12
|
* ```
|
|
13
13
|
*
|
|
14
14
|
* @example Selectable filter
|
|
15
15
|
* ```tsx
|
|
16
16
|
* const [selected, setSelected] = useState(false);
|
|
17
|
-
* <Pill
|
|
18
|
-
* variant="primary"
|
|
19
|
-
* selected={selected}
|
|
20
|
-
* onSelect={setSelected}
|
|
21
|
-
* >
|
|
17
|
+
* <Pill selected={selected} onSelect={setSelected}>
|
|
22
18
|
* Frontend
|
|
23
19
|
* </Pill>
|
|
24
20
|
* ```
|
|
@@ -27,7 +23,6 @@ import { PillProps } from './Pill.types';
|
|
|
27
23
|
* ```tsx
|
|
28
24
|
* const [filters, setFilters] = useState(['design']);
|
|
29
25
|
* <Pill
|
|
30
|
-
* variant="primary"
|
|
31
26
|
* selected={filters.includes('design')}
|
|
32
27
|
* onSelect={(selected) => {
|
|
33
28
|
* setFilters(selected
|
|
@@ -2,7 +2,7 @@ import { PillTheme } from "./Pill.types";
|
|
|
2
2
|
/**
|
|
3
3
|
* Default theme for Pill component
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Simple outline style for filter chips and tags.
|
|
6
|
+
* For colorful semantic variations, use Badge instead.
|
|
7
7
|
*/
|
|
8
8
|
export declare const pillTheme: PillTheme;
|