flikkui 0.2.0-beta.1 → 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/README.md +12 -539
- package/dist/components/ai/PromptInput/PromptInput.js +94 -4
- 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 +67 -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 +68 -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 +62 -63
- 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
|
@@ -3,17 +3,16 @@ import React from "react";
|
|
|
3
3
|
* Pill component props
|
|
4
4
|
*
|
|
5
5
|
* A simplified, focused component for filters, tags, and selectable chips.
|
|
6
|
-
*
|
|
6
|
+
* Single outline style - use Badge for colorful semantic variations.
|
|
7
7
|
*
|
|
8
8
|
* @example Basic usage
|
|
9
9
|
* ```tsx
|
|
10
|
-
* <Pill
|
|
10
|
+
* <Pill>Design</Pill>
|
|
11
11
|
* ```
|
|
12
12
|
*
|
|
13
13
|
* @example Selectable filter
|
|
14
14
|
* ```tsx
|
|
15
15
|
* <Pill
|
|
16
|
-
* variant="primary"
|
|
17
16
|
* selected={isSelected}
|
|
18
17
|
* onSelect={setIsSelected}
|
|
19
18
|
* >
|
|
@@ -24,10 +23,6 @@ import React from "react";
|
|
|
24
23
|
export interface PillProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "onChange" | "onSelect" | "onAnimationStart" | "onDragStart" | "onDragEnd" | "onDrag"> {
|
|
25
24
|
/** Content to display inside the pill */
|
|
26
25
|
children: React.ReactNode;
|
|
27
|
-
/** Visual style variant (filled, outline, soft) */
|
|
28
|
-
variant?: PillVariant;
|
|
29
|
-
/** Semantic color (primary, success, danger, etc.) */
|
|
30
|
-
color?: PillColor;
|
|
31
26
|
/** Size of the pill */
|
|
32
27
|
size?: PillSize;
|
|
33
28
|
/**
|
|
@@ -53,14 +48,6 @@ export interface PillProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "
|
|
|
53
48
|
/** Theme overrides for component styling */
|
|
54
49
|
theme?: PillThemeOverrides;
|
|
55
50
|
}
|
|
56
|
-
/**
|
|
57
|
-
* Pill visual variants (appearance)
|
|
58
|
-
*/
|
|
59
|
-
export type PillVariant = "filled" | "outline" | "soft";
|
|
60
|
-
/**
|
|
61
|
-
* Pill semantic colors (intent)
|
|
62
|
-
*/
|
|
63
|
-
export type PillColor = "neutral" | "primary" | "success" | "warning" | "danger";
|
|
64
51
|
/**
|
|
65
52
|
* Pill size variants
|
|
66
53
|
*/
|
|
@@ -72,12 +59,12 @@ export type PillSize = "sm" | "md" | "lg";
|
|
|
72
59
|
* the shadcn approach where className prop takes highest priority.
|
|
73
60
|
*/
|
|
74
61
|
export interface PillThemeOverrides {
|
|
75
|
-
/**
|
|
62
|
+
/** Base style - structure and default colors */
|
|
76
63
|
baseStyle?: string;
|
|
77
|
-
/**
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
|
|
64
|
+
/** Hover state - applied when interactive and NOT selected */
|
|
65
|
+
hoverStyle?: string;
|
|
66
|
+
/** Selected state - applied when selected */
|
|
67
|
+
selectedStyle?: string;
|
|
81
68
|
/** Size-specific styles */
|
|
82
69
|
sizes?: Partial<Record<PillSize, string>>;
|
|
83
70
|
/** Icon sizes for iconStart and CheckIcon */
|
|
@@ -88,8 +75,8 @@ export interface PillThemeOverrides {
|
|
|
88
75
|
*/
|
|
89
76
|
export interface PillTheme {
|
|
90
77
|
baseStyle: string;
|
|
91
|
-
|
|
92
|
-
|
|
78
|
+
hoverStyle: string;
|
|
79
|
+
selectedStyle: string;
|
|
93
80
|
sizes: Record<PillSize, string>;
|
|
94
81
|
iconSizes: Record<PillSize, string>;
|
|
95
82
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { PopoverRootProps as PopoverProps } from "./Popover.types";
|
|
3
|
-
export declare const Popover: (({ children, className, isOpen: controlledIsOpen, defaultIsOpen, onOpenChange, placement, offset, triggerType, closeOnClickOutside, closeOnEsc, preventClose, hasBackdrop, theme: themeOverrides, ...props }: PopoverProps) => React.JSX.Element) & {
|
|
3
|
+
export declare const Popover: (({ children, className, isOpen: controlledIsOpen, defaultIsOpen, onOpenChange, placement, offset, triggerType, closeOnClickOutside, closeOnEsc, preventClose, hasBackdrop, theme: themeOverrides, darkMode, ...props }: PopoverProps) => React.JSX.Element) & {
|
|
4
4
|
Trigger: React.ForwardRefExoticComponent<Omit<import("./Popover.types").PopoverTriggerProps, "ref"> & React.RefAttributes<any>>;
|
|
5
5
|
Content: React.ForwardRefExoticComponent<import("./Popover.types").PopoverContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
6
6
|
};
|
|
@@ -21,7 +21,7 @@ import { popoverTheme } from './Popover.theme.js';
|
|
|
21
21
|
* </Popover>
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
|
-
const PopoverRoot = ({ children, className, isOpen: controlledIsOpen, defaultIsOpen = false, onOpenChange, placement = "bottom", offset = 8, triggerType = "click", closeOnClickOutside = true, closeOnEsc = true, preventClose = false, hasBackdrop = false, theme: themeOverrides, ...props }) => {
|
|
24
|
+
const PopoverRoot = ({ children, className, isOpen: controlledIsOpen, defaultIsOpen = false, onOpenChange, placement = "bottom", offset = 8, triggerType = "click", closeOnClickOutside = true, closeOnEsc = true, preventClose = false, hasBackdrop = false, theme: themeOverrides, darkMode = false, ...props }) => {
|
|
25
25
|
// State for uncontrolled mode
|
|
26
26
|
const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState(defaultIsOpen);
|
|
27
27
|
// Determine if controlled or uncontrolled
|
|
@@ -58,7 +58,7 @@ const PopoverRoot = ({ children, className, isOpen: controlledIsOpen, defaultIsO
|
|
|
58
58
|
theme,
|
|
59
59
|
};
|
|
60
60
|
return (React__default.createElement(PopoverContext.Provider, { value: contextValue },
|
|
61
|
-
React__default.createElement("div", { className: cn("popover", className), "data-state": isOpen ? "open" : "closed", "data-backdrop": hasBackdrop ? "true" : "false", ...props }, children)));
|
|
61
|
+
React__default.createElement("div", { className: cn("popover", darkMode && "dark", className), "data-state": isOpen ? "open" : "closed", "data-backdrop": hasBackdrop ? "true" : "false", ...props }, children)));
|
|
62
62
|
};
|
|
63
63
|
// Export as a unified component
|
|
64
64
|
const Popover = Object.assign(PopoverRoot, {
|
|
@@ -29,6 +29,14 @@ export interface PopoverRootProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
29
29
|
preventClose?: boolean;
|
|
30
30
|
hasBackdrop?: boolean;
|
|
31
31
|
theme?: Partial<PopoverTheme>;
|
|
32
|
+
/**
|
|
33
|
+
* Force dark mode styling for the component. Use when placing the component
|
|
34
|
+
* on a dark background while the page is in light mode. This applies the
|
|
35
|
+
* 'dark' class to the container, making text, borders, and other elements
|
|
36
|
+
* use light colors for visibility.
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
darkMode?: boolean;
|
|
32
40
|
}
|
|
33
41
|
export interface PopoverTriggerProps {
|
|
34
42
|
children: React.ReactElement;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ProgressProps } from "./Progress.types";
|
|
3
|
+
/**
|
|
4
|
+
* Progress component - Linear progress bar for tracking completion
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Determinate mode: Shows specific progress value (0-100)
|
|
8
|
+
* - Indeterminate mode: Animated loading state when value is undefined
|
|
9
|
+
* - Multiple sizes and semantic colors
|
|
10
|
+
* - Flexible label positioning (right, top, bottom, inside)
|
|
11
|
+
* - Respects reduced motion preferences
|
|
12
|
+
* - Full className override support
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Determinate progress
|
|
16
|
+
* <Progress value={60} color="primary" />
|
|
17
|
+
*
|
|
18
|
+
* // With label
|
|
19
|
+
* <Progress value={75} showLabel labelPosition="right" />
|
|
20
|
+
*
|
|
21
|
+
* // Indeterminate (loading)
|
|
22
|
+
* <Progress color="primary" />
|
|
23
|
+
*
|
|
24
|
+
* // Custom label format
|
|
25
|
+
* <Progress value={50} showLabel formatLabel={(pct) => `${pct}% complete`} />
|
|
26
|
+
*/
|
|
27
|
+
declare const Progress: React.FC<ProgressProps>;
|
|
28
|
+
export { Progress };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React__default, { useMemo } from 'react';
|
|
2
|
+
import { useReducedMotion, motion } from 'motion/react';
|
|
3
|
+
import { progressTheme } from './Progress.theme.js';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Progress component - Linear progress bar for tracking completion
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Determinate mode: Shows specific progress value (0-100)
|
|
11
|
+
* - Indeterminate mode: Animated loading state when value is undefined
|
|
12
|
+
* - Multiple sizes and semantic colors
|
|
13
|
+
* - Flexible label positioning (right, top, bottom, inside)
|
|
14
|
+
* - Respects reduced motion preferences
|
|
15
|
+
* - Full className override support
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // Determinate progress
|
|
19
|
+
* <Progress value={60} color="primary" />
|
|
20
|
+
*
|
|
21
|
+
* // With label
|
|
22
|
+
* <Progress value={75} showLabel labelPosition="right" />
|
|
23
|
+
*
|
|
24
|
+
* // Indeterminate (loading)
|
|
25
|
+
* <Progress color="primary" />
|
|
26
|
+
*
|
|
27
|
+
* // Custom label format
|
|
28
|
+
* <Progress value={50} showLabel formatLabel={(pct) => `${pct}% complete`} />
|
|
29
|
+
*/
|
|
30
|
+
const Progress = ({ value, size = "md", color = "primary", showLabel = false, labelPosition = "right", formatLabel, animated = true, trackClassName, fillClassName, className, theme: customTheme, ...props }) => {
|
|
31
|
+
const shouldReduceMotion = useReducedMotion();
|
|
32
|
+
// Merge custom theme with default theme
|
|
33
|
+
const theme = useMemo(() => {
|
|
34
|
+
if (!customTheme)
|
|
35
|
+
return progressTheme;
|
|
36
|
+
return {
|
|
37
|
+
...progressTheme,
|
|
38
|
+
...customTheme,
|
|
39
|
+
sizes: { ...progressTheme.sizes, ...customTheme.sizes },
|
|
40
|
+
colors: { ...progressTheme.colors, ...customTheme.colors },
|
|
41
|
+
};
|
|
42
|
+
}, [customTheme]);
|
|
43
|
+
// Calculate percentage (clamped to 0-100)
|
|
44
|
+
const percentage = useMemo(() => {
|
|
45
|
+
if (value === undefined || value === null)
|
|
46
|
+
return 0;
|
|
47
|
+
return Math.min(Math.max(Math.round(value), 0), 100);
|
|
48
|
+
}, [value]);
|
|
49
|
+
// Determine if this is indeterminate mode
|
|
50
|
+
const isIndeterminate = value === undefined || value === null;
|
|
51
|
+
// Format the label
|
|
52
|
+
const label = useMemo(() => {
|
|
53
|
+
if (formatLabel)
|
|
54
|
+
return formatLabel(percentage);
|
|
55
|
+
return `${percentage}%`;
|
|
56
|
+
}, [percentage, formatLabel]);
|
|
57
|
+
// Determine if animation should be applied
|
|
58
|
+
const shouldAnimate = animated && !shouldReduceMotion;
|
|
59
|
+
// Get container layout based on label position
|
|
60
|
+
const containerLayoutClass = useMemo(() => {
|
|
61
|
+
if (!showLabel || isIndeterminate)
|
|
62
|
+
return "";
|
|
63
|
+
switch (labelPosition) {
|
|
64
|
+
case "top":
|
|
65
|
+
return "flex flex-col gap-1.5";
|
|
66
|
+
case "bottom":
|
|
67
|
+
return "flex flex-col-reverse gap-1.5";
|
|
68
|
+
case "right":
|
|
69
|
+
return "flex items-center gap-3";
|
|
70
|
+
case "inside":
|
|
71
|
+
return "";
|
|
72
|
+
default:
|
|
73
|
+
return "";
|
|
74
|
+
}
|
|
75
|
+
}, [showLabel, labelPosition, isIndeterminate]);
|
|
76
|
+
// Render label element
|
|
77
|
+
const renderLabel = () => {
|
|
78
|
+
if (!showLabel || isIndeterminate)
|
|
79
|
+
return null;
|
|
80
|
+
if (labelPosition === "inside") {
|
|
81
|
+
// Only show inside label for lg size (enough height)
|
|
82
|
+
if (size !== "lg")
|
|
83
|
+
return null;
|
|
84
|
+
return React__default.createElement("span", { className: theme.insideLabelStyle }, label);
|
|
85
|
+
}
|
|
86
|
+
return (React__default.createElement("span", { className: cn(theme.labelStyle, labelPosition === "top" || labelPosition === "bottom"
|
|
87
|
+
? "text-left"
|
|
88
|
+
: "") }, label));
|
|
89
|
+
};
|
|
90
|
+
// Track element with optional fill
|
|
91
|
+
const renderTrack = () => (React__default.createElement("div", { className: cn(theme.trackStyle, theme.sizes[size], "relative", trackClassName) },
|
|
92
|
+
isIndeterminate ? (
|
|
93
|
+
// Indeterminate animation
|
|
94
|
+
React__default.createElement("div", { className: cn(theme.fillStyle, theme.colors[color], "w-1/3", theme.indeterminateStyle, fillClassName) })) : shouldAnimate ? (
|
|
95
|
+
// Animated determinate progress with spring animation
|
|
96
|
+
React__default.createElement(motion.div, { className: cn(theme.fillStyle, theme.colors[color], fillClassName), initial: { width: 0 }, animate: { width: `${percentage}%` }, transition: {
|
|
97
|
+
type: "spring",
|
|
98
|
+
stiffness: 100,
|
|
99
|
+
damping: 20,
|
|
100
|
+
mass: 0.5,
|
|
101
|
+
} })) : (
|
|
102
|
+
// Static determinate progress
|
|
103
|
+
React__default.createElement("div", { className: cn(theme.fillStyle, theme.colors[color], fillClassName), style: { width: `${percentage}%` } })),
|
|
104
|
+
showLabel && labelPosition === "inside" && size === "lg" && !isIndeterminate && (React__default.createElement("span", { className: theme.insideLabelStyle }, label))));
|
|
105
|
+
return (React__default.createElement("div", { className: cn(theme.containerStyle, containerLayoutClass, className), role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": isIndeterminate ? undefined : percentage, "aria-label": isIndeterminate ? "Loading" : `${percentage}% complete`, ...props },
|
|
106
|
+
labelPosition === "top" && renderLabel(),
|
|
107
|
+
labelPosition === "right" ? (React__default.createElement(React__default.Fragment, null,
|
|
108
|
+
React__default.createElement("div", { className: "flex-1" }, renderTrack()),
|
|
109
|
+
renderLabel())) : (renderTrack()),
|
|
110
|
+
labelPosition === "bottom" && renderLabel()));
|
|
111
|
+
};
|
|
112
|
+
Progress.displayName = "Progress";
|
|
113
|
+
|
|
114
|
+
export { Progress };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default theme configuration for Progress component
|
|
3
|
+
*/
|
|
4
|
+
const progressTheme = {
|
|
5
|
+
// Container styles
|
|
6
|
+
containerStyle: "w-full",
|
|
7
|
+
// Track (background) styles
|
|
8
|
+
trackStyle: "relative w-full rounded-full bg-[var(--color-background-tertiary)] overflow-hidden",
|
|
9
|
+
// Fill (progress bar) styles
|
|
10
|
+
fillStyle: "h-full rounded-full",
|
|
11
|
+
// Label text styles
|
|
12
|
+
labelStyle: "text-sm font-medium text-[var(--color-text-secondary)] tabular-nums min-w-[2.5rem] text-right",
|
|
13
|
+
// Inside label styles (when label is positioned inside the bar)
|
|
14
|
+
insideLabelStyle: "absolute inset-0 flex items-center justify-center text-xs font-medium text-white tabular-nums",
|
|
15
|
+
// Size variants for track height
|
|
16
|
+
sizes: {
|
|
17
|
+
sm: "h-1.5",
|
|
18
|
+
md: "h-2.5",
|
|
19
|
+
lg: "h-4",
|
|
20
|
+
},
|
|
21
|
+
// Color variants for the fill
|
|
22
|
+
colors: {
|
|
23
|
+
neutral: "bg-[var(--color-neutral-400)] dark:bg-[var(--color-neutral-500)]",
|
|
24
|
+
primary: "bg-[var(--color-primary)] dark:bg-[var(--color-primary-400)]",
|
|
25
|
+
success: "bg-[var(--color-success)] dark:bg-[var(--color-success-400)]",
|
|
26
|
+
warning: "bg-[var(--color-warning)] dark:bg-[var(--color-warning-400)]",
|
|
27
|
+
danger: "bg-[var(--color-danger)] dark:bg-[var(--color-danger-400)]",
|
|
28
|
+
},
|
|
29
|
+
// Indeterminate animation styles
|
|
30
|
+
indeterminateStyle: "animate-[progress-indeterminate_1.5s_ease-in-out_infinite]",
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { progressTheme };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type ProgressSize = "sm" | "md" | "lg";
|
|
3
|
+
export type ProgressColor = "neutral" | "primary" | "success" | "warning" | "danger";
|
|
4
|
+
export type ProgressLabelPosition = "right" | "top" | "bottom" | "inside";
|
|
5
|
+
/**
|
|
6
|
+
* Theme configuration for Progress component
|
|
7
|
+
*/
|
|
8
|
+
export interface ProgressTheme {
|
|
9
|
+
/** Outer container styles */
|
|
10
|
+
containerStyle: string;
|
|
11
|
+
/** Track (background) styles */
|
|
12
|
+
trackStyle: string;
|
|
13
|
+
/** Fill (progress bar) styles */
|
|
14
|
+
fillStyle: string;
|
|
15
|
+
/** Label text styles */
|
|
16
|
+
labelStyle: string;
|
|
17
|
+
/** Inside label styles (when label is inside the bar) */
|
|
18
|
+
insideLabelStyle: string;
|
|
19
|
+
/** Size variants for the track height */
|
|
20
|
+
sizes: Record<ProgressSize, string>;
|
|
21
|
+
/** Color variants for the fill */
|
|
22
|
+
colors: Record<ProgressColor, string>;
|
|
23
|
+
/** Indeterminate animation styles */
|
|
24
|
+
indeterminateStyle: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Theme overrides for Progress component
|
|
28
|
+
*/
|
|
29
|
+
export interface ProgressThemeOverrides {
|
|
30
|
+
containerStyle?: string;
|
|
31
|
+
trackStyle?: string;
|
|
32
|
+
fillStyle?: string;
|
|
33
|
+
labelStyle?: string;
|
|
34
|
+
insideLabelStyle?: string;
|
|
35
|
+
sizes?: Partial<Record<ProgressSize, string>>;
|
|
36
|
+
colors?: Partial<Record<ProgressColor, string>>;
|
|
37
|
+
indeterminateStyle?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ProgressProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
40
|
+
/**
|
|
41
|
+
* Progress value from 0 to 100.
|
|
42
|
+
* If undefined, the progress bar will be in indeterminate mode.
|
|
43
|
+
*/
|
|
44
|
+
value?: number;
|
|
45
|
+
/**
|
|
46
|
+
* The size of the progress bar
|
|
47
|
+
* @default 'md'
|
|
48
|
+
*/
|
|
49
|
+
size?: ProgressSize;
|
|
50
|
+
/**
|
|
51
|
+
* The semantic color of the progress bar
|
|
52
|
+
* @default 'primary'
|
|
53
|
+
*/
|
|
54
|
+
color?: ProgressColor;
|
|
55
|
+
/**
|
|
56
|
+
* Whether to show the percentage label
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
showLabel?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Position of the label
|
|
62
|
+
* @default 'right'
|
|
63
|
+
*/
|
|
64
|
+
labelPosition?: ProgressLabelPosition;
|
|
65
|
+
/**
|
|
66
|
+
* Custom label formatter function
|
|
67
|
+
* @param percentage - The current percentage value (0-100)
|
|
68
|
+
* @returns The formatted label string
|
|
69
|
+
*/
|
|
70
|
+
formatLabel?: (percentage: number) => string;
|
|
71
|
+
/**
|
|
72
|
+
* Whether to animate value changes
|
|
73
|
+
* @default true
|
|
74
|
+
*/
|
|
75
|
+
animated?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Additional class name for the track (background) element
|
|
78
|
+
*/
|
|
79
|
+
trackClassName?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Additional class name for the fill (progress) element
|
|
82
|
+
*/
|
|
83
|
+
fillClassName?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Additional class name for the container
|
|
86
|
+
*/
|
|
87
|
+
className?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Component-level theme overrides
|
|
90
|
+
*/
|
|
91
|
+
theme?: ProgressThemeOverrides;
|
|
92
|
+
}
|
|
@@ -11,7 +11,7 @@ import { TabsContent } from './TabsContent.js';
|
|
|
11
11
|
* Uses compound component pattern with Tabs.List, Tabs.Trigger, and Tabs.Content
|
|
12
12
|
* Supports optional Framer Motion animations and comprehensive accessibility
|
|
13
13
|
*/
|
|
14
|
-
const TabsComponent = React__default.forwardRef(({ value, defaultValue, onValueChange, orientation = "horizontal", size = "md", disabled = false, children, className, ...props }, ref) => {
|
|
14
|
+
const TabsComponent = React__default.forwardRef(({ value, defaultValue, onValueChange, orientation = "horizontal", size = "md", disabled = false, children, className, darkMode = false, ...props }, ref) => {
|
|
15
15
|
const [currentValue, setCurrentValue] = useState(value || defaultValue || "");
|
|
16
16
|
// Track trigger elements for underline positioning
|
|
17
17
|
const triggerRefs = useRef(new Map());
|
|
@@ -74,7 +74,7 @@ const TabsComponent = React__default.forwardRef(({ value, defaultValue, onValueC
|
|
|
74
74
|
disabledStyle: disabled ? "opacity-50 cursor-not-allowed pointer-events-none" : "",
|
|
75
75
|
}), [disabled]);
|
|
76
76
|
return (React__default.createElement(TabsContext.Provider, { value: contextValue },
|
|
77
|
-
React__default.createElement("div", { ref: ref, className: cn(themeClasses.baseStyle, themeClasses.disabledStyle, className // User overrides take precedence
|
|
77
|
+
React__default.createElement("div", { ref: ref, className: cn(themeClasses.baseStyle, themeClasses.disabledStyle, darkMode && "dark", className // User overrides take precedence
|
|
78
78
|
), "data-orientation": orientation, "data-size": size, "data-disabled": disabled, role: "tablist" // Add semantic role for screen readers
|
|
79
79
|
, "aria-orientation": orientation, ...props }, children)));
|
|
80
80
|
});
|
|
@@ -48,6 +48,14 @@ export interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'o
|
|
|
48
48
|
disabled?: boolean;
|
|
49
49
|
/** Children components - typically Tabs.List and Tabs.Content components */
|
|
50
50
|
children?: React.ReactNode;
|
|
51
|
+
/**
|
|
52
|
+
* Force dark mode styling for the component. Use when placing the component
|
|
53
|
+
* on a dark background while the page is in light mode. This applies the
|
|
54
|
+
* 'dark' class to the container, making text, borders, and other elements
|
|
55
|
+
* use light colors for visibility.
|
|
56
|
+
* @default false
|
|
57
|
+
*/
|
|
58
|
+
darkMode?: boolean;
|
|
51
59
|
}
|
|
52
60
|
/**
|
|
53
61
|
* TabsList component props - container for tab trigger buttons
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const tagVariants = {
|
|
2
|
+
initial: {
|
|
3
|
+
scale: 0,
|
|
4
|
+
opacity: 0,
|
|
5
|
+
},
|
|
6
|
+
animate: {
|
|
7
|
+
scale: 1,
|
|
8
|
+
opacity: 1,
|
|
9
|
+
transition: {
|
|
10
|
+
type: "spring",
|
|
11
|
+
stiffness: 500,
|
|
12
|
+
damping: 25,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
exit: {
|
|
16
|
+
scale: 0,
|
|
17
|
+
opacity: 0,
|
|
18
|
+
transition: {
|
|
19
|
+
type: "spring",
|
|
20
|
+
stiffness: 500,
|
|
21
|
+
damping: 30,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const tagLayoutTransition = {
|
|
26
|
+
type: "spring",
|
|
27
|
+
stiffness: 500,
|
|
28
|
+
damping: 30,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export { tagLayoutTransition, tagVariants };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { TagProps } from "./Tag.types";
|
|
3
|
+
/**
|
|
4
|
+
* Tag component for displaying removable labels or keywords.
|
|
5
|
+
*
|
|
6
|
+
* @component
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <Tag onRemove={() => handleRemove('tag1')}>JavaScript</Tag>
|
|
10
|
+
* <Tag size="sm" removable={false}>Read Only</Tag>
|
|
11
|
+
* <Tag disabled>Disabled Tag</Tag>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const Tag: React.ForwardRefExoticComponent<TagProps & React.RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { motion } from 'motion/react';
|
|
3
|
+
import { XMarkIcon } from '@heroicons/react/24/outline';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
import { tagTheme } from './Tag.theme.js';
|
|
6
|
+
import { tagVariants, tagLayoutTransition } from './Tag.animations.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Tag component for displaying removable labels or keywords.
|
|
10
|
+
*
|
|
11
|
+
* @component
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <Tag onRemove={() => handleRemove('tag1')}>JavaScript</Tag>
|
|
15
|
+
* <Tag size="sm" removable={false}>Read Only</Tag>
|
|
16
|
+
* <Tag disabled>Disabled Tag</Tag>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
const Tag = React__default.forwardRef(({ children, size = "md", removable = true, onRemove, disabled = false, className, theme: customTheme, ...props }, ref) => {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
// Merge default theme with custom theme overrides
|
|
22
|
+
const theme = {
|
|
23
|
+
baseStyle: (_a = customTheme === null || customTheme === void 0 ? void 0 : customTheme.baseStyle) !== null && _a !== void 0 ? _a : tagTheme.baseStyle,
|
|
24
|
+
sizes: { ...tagTheme.sizes, ...customTheme === null || customTheme === void 0 ? void 0 : customTheme.sizes },
|
|
25
|
+
disabledStyle: (_b = customTheme === null || customTheme === void 0 ? void 0 : customTheme.disabledStyle) !== null && _b !== void 0 ? _b : tagTheme.disabledStyle,
|
|
26
|
+
removeButtonStyle: (_c = customTheme === null || customTheme === void 0 ? void 0 : customTheme.removeButtonStyle) !== null && _c !== void 0 ? _c : tagTheme.removeButtonStyle,
|
|
27
|
+
removeIconSizes: {
|
|
28
|
+
...tagTheme.removeIconSizes,
|
|
29
|
+
...customTheme === null || customTheme === void 0 ? void 0 : customTheme.removeIconSizes,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const handleRemove = (e) => {
|
|
33
|
+
e.stopPropagation();
|
|
34
|
+
if (!disabled && onRemove) {
|
|
35
|
+
onRemove();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
return (React__default.createElement(motion.span, { ref: ref, className: cn(theme.baseStyle, theme.sizes[size], disabled && theme.disabledStyle, className), layout: true, transition: tagLayoutTransition, variants: tagVariants, initial: "initial", animate: "animate", exit: "exit", "data-size": size, "data-disabled": disabled ? "true" : "false", "data-removable": removable ? "true" : "false", ...props },
|
|
39
|
+
children,
|
|
40
|
+
removable && onRemove && !disabled && (React__default.createElement("button", { type: "button", onClick: handleRemove, className: theme.removeButtonStyle, "aria-label": `Remove ${typeof children === "string" ? children : "tag"}` },
|
|
41
|
+
React__default.createElement(XMarkIcon, { className: theme.removeIconSizes[size] })))));
|
|
42
|
+
});
|
|
43
|
+
Tag.displayName = "Tag";
|
|
44
|
+
|
|
45
|
+
export { Tag };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const tagTheme = {
|
|
2
|
+
baseStyle: "inline-flex items-center gap-1 font-medium rounded-full " +
|
|
3
|
+
"bg-[var(--color-background-secondary)] border border-[var(--color-border)] " +
|
|
4
|
+
"text-[var(--color-text-primary)]",
|
|
5
|
+
sizes: {
|
|
6
|
+
sm: "text-xs px-2 py-0.5 pr-0.5",
|
|
7
|
+
md: "text-sm px-2.5 py-0.5 pr-0.5",
|
|
8
|
+
},
|
|
9
|
+
disabledStyle: "opacity-50 cursor-not-allowed",
|
|
10
|
+
removeButtonStyle: "inline-flex items-center justify-center rounded-full p-1 " +
|
|
11
|
+
"hover:bg-[var(--color-background-quaternary)] " +
|
|
12
|
+
"text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] " +
|
|
13
|
+
"transition-all duration-300 cursor-pointer focus:outline-none " +
|
|
14
|
+
"focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
15
|
+
removeIconSizes: {
|
|
16
|
+
sm: "size-3",
|
|
17
|
+
md: "size-3.5",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { tagTheme };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Tag component props
|
|
4
|
+
*/
|
|
5
|
+
export interface TagProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "onRemove" | "onDrag" | "onDragEnd" | "onDragStart" | "onAnimationStart"> {
|
|
6
|
+
/** The content of the tag */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** The size of the tag */
|
|
9
|
+
size?: TagSize;
|
|
10
|
+
/** Whether to show the remove button (default: true) */
|
|
11
|
+
removable?: boolean;
|
|
12
|
+
/** Callback when the remove button is clicked */
|
|
13
|
+
onRemove?: () => void;
|
|
14
|
+
/** Whether the tag is disabled */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** Additional class name for the tag */
|
|
17
|
+
className?: string;
|
|
18
|
+
/** Theme overrides */
|
|
19
|
+
theme?: TagThemeOverrides;
|
|
20
|
+
}
|
|
21
|
+
export type TagSize = "sm" | "md";
|
|
22
|
+
export interface TagTheme {
|
|
23
|
+
/** Base styles for the tag container */
|
|
24
|
+
baseStyle: string;
|
|
25
|
+
/** Size-specific styles */
|
|
26
|
+
sizes: Record<TagSize, string>;
|
|
27
|
+
/** Disabled state style */
|
|
28
|
+
disabledStyle: string;
|
|
29
|
+
/** Remove button style */
|
|
30
|
+
removeButtonStyle: string;
|
|
31
|
+
/** Remove icon sizes for each tag size */
|
|
32
|
+
removeIconSizes: Record<TagSize, string>;
|
|
33
|
+
}
|
|
34
|
+
export interface TagThemeOverrides {
|
|
35
|
+
baseStyle?: string;
|
|
36
|
+
sizes?: Partial<Record<TagSize, string>>;
|
|
37
|
+
disabledStyle?: string;
|
|
38
|
+
removeButtonStyle?: string;
|
|
39
|
+
removeIconSizes?: Partial<Record<TagSize, string>>;
|
|
40
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { TooltipProps } from "./Tooltip.types";
|
|
3
3
|
declare const Tooltip: {
|
|
4
|
-
({ content, children, placement, delay, disabled, className, maxWidth, minWidth, showOnFocus, wrapText, id, theme: themeOverrides, "aria-label": ariaLabel, role, }: TooltipProps): React.JSX.Element;
|
|
4
|
+
({ content, children, placement, delay, disabled, className, maxWidth, minWidth, showOnFocus, wrapText, id, theme: themeOverrides, "aria-label": ariaLabel, role, offset, darkMode, }: TooltipProps): React.JSX.Element;
|
|
5
5
|
displayName: string;
|
|
6
6
|
};
|
|
7
7
|
export { Tooltip };
|
|
@@ -35,7 +35,7 @@ const useDarkMode = () => {
|
|
|
35
35
|
}, []);
|
|
36
36
|
return isDark;
|
|
37
37
|
};
|
|
38
|
-
const Tooltip = ({ content, children, placement = "top", delay = 300, disabled = false, className, maxWidth = "360px", minWidth = "fit-content", showOnFocus = true, wrapText = false, id, theme: themeOverrides, "aria-label": ariaLabel, role = "tooltip", }) => {
|
|
38
|
+
const Tooltip = ({ content, children, placement = "top", delay = 300, disabled = false, className, maxWidth = "360px", minWidth = "fit-content", showOnFocus = true, wrapText = false, id, theme: themeOverrides, "aria-label": ariaLabel, role = "tooltip", offset = 8, darkMode = false, }) => {
|
|
39
39
|
const [isVisible, setIsVisible] = useState(false);
|
|
40
40
|
const tooltipRef = useRef(null);
|
|
41
41
|
const triggerRef = useRef(null);
|
|
@@ -53,7 +53,7 @@ const Tooltip = ({ content, children, placement = "top", delay = 300, disabled =
|
|
|
53
53
|
triggerRef,
|
|
54
54
|
isOpen: isVisible,
|
|
55
55
|
placement: placement, // TooltipPlacement matches SelectPlacement subset
|
|
56
|
-
offset
|
|
56
|
+
offset,
|
|
57
57
|
autoWidth: true,
|
|
58
58
|
});
|
|
59
59
|
// Event handlers - simplified timer management
|
|
@@ -123,7 +123,7 @@ const Tooltip = ({ content, children, placement = "top", delay = 300, disabled =
|
|
|
123
123
|
return (React__default.createElement("div", { className: "relative inline-block", ref: triggerRef, ...triggerHandlers, tabIndex: showOnFocus ? 0 : undefined, "aria-describedby": isVisible && id ? id : undefined },
|
|
124
124
|
children,
|
|
125
125
|
typeof document !== "undefined" &&
|
|
126
|
-
createPortal(React__default.createElement("div", { className: isDarkMode ? "dark" : undefined }, tooltipContent), document.body)));
|
|
126
|
+
createPortal(React__default.createElement("div", { className: darkMode || isDarkMode ? "dark" : undefined }, tooltipContent), document.body)));
|
|
127
127
|
};
|
|
128
128
|
// Set display name for dev tools and Storybook
|
|
129
129
|
Tooltip.displayName = "Tooltip";
|