@flikk/ui 1.0.0-beta.14 → 1.0.0-beta.15
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/CodeBlock/CodeBlock.theme.js +1 -1
- package/dist/components/ai/PromptInput/PromptInput.js +3 -1
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +4 -4
- package/dist/components/ai/StreamingResponse/StreamingResponse.js +6 -0
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.js +3 -14
- package/dist/components/ai/index.d.ts +0 -5
- package/dist/components/ai/index.js +8 -4
- package/dist/components/charts/DonutChart/DonutChart.js +1 -1
- package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +1 -1
- package/dist/components/charts/shared/ChartLegend/ChartLegend.types.d.ts +13 -1
- package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +1 -1
- package/dist/components/charts/shared/ChartTooltip/ChartTooltip.types.d.ts +13 -2
- package/dist/components/core/Accordion/AccordionItem.js +1 -1
- package/dist/components/core/Accordion/AccordionTrigger.js +1 -1
- package/dist/components/core/Alert/Alert.animations.d.ts +11 -0
- package/dist/components/core/Alert/Alert.animations.js +44 -0
- package/dist/components/core/Alert/Alert.js +16 -3
- package/dist/components/core/Avatar/Avatar.js +12 -7
- package/dist/components/core/Avatar/Avatar.theme.d.ts +4 -6
- package/dist/components/core/Avatar/Avatar.theme.js +22 -12
- package/dist/components/core/Avatar/Avatar.types.d.ts +9 -0
- package/dist/components/core/AvatarGroup/AvatarGroup.animations.js +2 -2
- package/dist/components/core/AvatarGroup/AvatarGroup.js +1 -2
- package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +1 -1
- package/dist/components/core/Badge/Badge.animations.js +1 -1
- package/dist/components/core/Badge/Badge.js +23 -47
- package/dist/components/core/Badge/Badge.theme.js +48 -62
- package/dist/components/core/Badge/Badge.types.d.ts +5 -29
- package/dist/components/core/Button/Button.js +2 -2
- package/dist/components/core/Button/Button.theme.js +2 -2
- package/dist/components/core/ButtonGroup/ButtonGroup.theme.js +6 -6
- package/dist/components/core/ButtonGroup/ButtonGroupText.js +1 -3
- package/dist/components/core/Calendar/Calendar.js +29 -3
- package/dist/components/core/Calendar/Calendar.theme.js +11 -7
- package/dist/components/core/Calendar/Calendar.types.d.ts +3 -0
- package/dist/components/core/Carousel/CarouselBody.js +0 -1
- package/dist/components/core/CommandPalette/CommandItem.js +1 -1
- package/dist/components/core/CommandPalette/CommandPalette.js +6 -4
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +1 -0
- package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +6 -0
- package/dist/components/core/ContextMenu/ContextMenu.js +5 -4
- package/dist/components/core/ContextMenu/ContextMenuTrigger.js +5 -6
- package/dist/components/core/Drawer/Drawer.d.ts +1 -1
- package/dist/components/core/Drawer/Drawer.js +25 -2
- package/dist/components/core/Drawer/Drawer.theme.js +2 -2
- package/dist/components/core/Drawer/Drawer.types.d.ts +6 -0
- package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
- package/dist/components/core/Dropdown/Dropdown.js +5 -1
- package/dist/components/core/Dropdown/Dropdown.types.d.ts +1 -0
- package/dist/components/core/Dropdown/DropdownItem.js +1 -1
- package/dist/components/core/Dropdown/DropdownMenu.js +4 -4
- package/dist/components/core/Dropdown/DropdownSection.js +1 -1
- package/dist/components/core/Dropdown/DropdownSeparator.js +1 -1
- package/dist/components/core/Dropdown/DropdownTrigger.d.ts +6 -1
- package/dist/components/core/Dropdown/DropdownTrigger.js +10 -8
- package/dist/components/core/Kbd/Kbd.theme.js +3 -3
- package/dist/components/core/Link/Link.js +3 -1
- package/dist/components/core/Message/Message.d.ts +9 -0
- package/dist/components/core/Message/Message.js +44 -3
- package/dist/components/core/Message/Message.theme.js +22 -0
- package/dist/components/core/Message/Message.types.d.ts +115 -0
- package/dist/components/core/Message/MessageAudio.d.ts +8 -0
- package/dist/components/core/Message/MessageAudio.js +11 -0
- package/dist/components/core/Message/MessageContext.d.ts +3 -1
- package/dist/components/core/Message/MessageDateDivider.d.ts +6 -0
- package/dist/components/core/Message/MessageDateDivider.js +10 -0
- package/dist/components/core/Message/MessageFile.d.ts +9 -0
- package/dist/components/core/Message/MessageFile.js +15 -0
- package/dist/components/core/Message/MessageImage.d.ts +11 -0
- package/dist/components/core/Message/MessageImage.js +13 -0
- package/dist/components/core/Message/MessageLink.d.ts +10 -0
- package/dist/components/core/Message/MessageLink.js +15 -0
- package/dist/components/core/Message/MessageReactions.d.ts +8 -0
- package/dist/components/core/Message/MessageReactions.js +12 -0
- package/dist/components/core/Message/MessageReply.d.ts +8 -0
- package/dist/components/core/Message/MessageReply.js +10 -0
- package/dist/components/core/Message/MessageSenderName.d.ts +6 -0
- package/dist/components/core/Message/MessageSenderName.js +10 -0
- package/dist/components/core/Message/MessageStatusIndicator.d.ts +9 -0
- package/dist/components/core/Message/MessageStatusIndicator.js +45 -0
- package/dist/components/core/Message/index.d.ts +19 -1
- package/dist/components/core/Modal/Modal.animations.d.ts +1 -0
- package/dist/components/core/Modal/Modal.animations.js +14 -11
- package/dist/components/core/Pagination/Pagination.theme.js +1 -1
- package/dist/components/core/Popover/Popover.d.ts +1 -1
- package/dist/components/core/Popover/PopoverBody.js +2 -2
- package/dist/components/core/Popover/PopoverTrigger.d.ts +1 -1
- package/dist/components/core/Popover/PopoverTrigger.js +11 -11
- package/dist/components/core/Progress/Progress.d.ts +9 -8
- package/dist/components/core/Progress/Progress.js +16 -16
- package/dist/components/core/Progress/Progress.theme.js +5 -16
- package/dist/components/core/Progress/Progress.types.d.ts +2 -20
- package/dist/components/core/Progress/index.d.ts +1 -1
- package/dist/components/core/ScrollArea/ScrollArea.js +49 -7
- package/dist/components/core/ScrollArea/ScrollArea.types.d.ts +12 -3
- package/dist/components/core/ScrollArea/index.d.ts +1 -1
- package/dist/components/core/Segmented/SegmentedItem.js +1 -1
- package/dist/components/core/Sidebar/Sidebar.js +2 -1
- package/dist/components/core/Sidebar/SidebarMobileTrigger.js +2 -1
- package/dist/components/core/Sidebar/SidebarToggle.js +2 -1
- package/dist/components/core/Sidebar/SidebarUserProfile.js +1 -1
- package/dist/components/core/SocialIcon/SocialIcon.js +1 -1
- package/dist/components/core/Sortable/Sortable.js +2 -2
- package/dist/components/core/Sortable/Sortable.theme.js +1 -1
- package/dist/components/core/Sortable/Sortable.types.d.ts +7 -5
- package/dist/components/core/Tabs/TabsBody.js +1 -1
- package/dist/components/core/Tabs/TabsTrigger.js +1 -1
- package/dist/components/core/Tag/Tag.js +2 -2
- package/dist/components/core/Toast/Toast.d.ts +2 -2
- package/dist/components/core/Toast/Toast.js +30 -21
- package/dist/components/core/Toast/Toast.theme.js +4 -9
- package/dist/components/core/Toast/Toast.types.d.ts +4 -21
- package/dist/components/core/Toast/index.d.ts +1 -1
- package/dist/components/core/Tooltip/Tooltip.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/index.js +9 -0
- package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +2 -2
- package/dist/components/data-display/Table/Table.types.d.ts +8 -8
- package/dist/components/effects/CustomCursor/CustomCursor.js +2 -2
- package/dist/components/effects/GlassSurface/GlassSurface.d.ts +1 -1
- package/dist/components/effects/GlassSurface/GlassSurface.js +12 -4
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.d.ts +39 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.js +98 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +104 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.types.d.ts +30 -0
- package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +36 -0
- package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +36 -0
- package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +37 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useBlink.d.ts +14 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useBlink.js +41 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.d.ts +25 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.js +84 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.d.ts +18 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.js +35 -0
- package/dist/components/effects/InteractiveCharacters/index.d.ts +2 -0
- package/dist/components/effects/MorphingText/MorphingText.d.ts +1 -1
- package/dist/components/effects/MorphingText/MorphingText.js +6 -5
- package/dist/components/effects/Neumorphic/InsetCircleButton.d.ts +9 -0
- package/dist/components/effects/Neumorphic/InsetCircleButton.js +10 -0
- package/dist/components/effects/Neumorphic/InsetPill.d.ts +7 -0
- package/dist/components/effects/Neumorphic/InsetPill.js +7 -0
- package/dist/components/effects/Neumorphic/index.d.ts +4 -0
- package/dist/components/effects/NoiseOverlay/NoiseOverlay.d.ts +1 -1
- package/dist/components/effects/NoiseOverlay/NoiseOverlay.js +4 -4
- package/dist/components/effects/Overlay/Overlay.js +6 -4
- package/dist/components/effects/PageTransition/PageTransition.animations.d.ts +8 -0
- package/dist/components/effects/PageTransition/PageTransition.animations.js +53 -0
- package/dist/components/effects/PageTransition/PageTransition.d.ts +3 -0
- package/dist/components/effects/PageTransition/PageTransition.js +71 -0
- package/dist/components/effects/PageTransition/PageTransition.types.d.ts +15 -0
- package/dist/components/effects/PageTransition/index.d.ts +2 -0
- package/dist/components/effects/index.d.ts +6 -0
- package/dist/components/effects/index.js +4 -0
- package/dist/components/forms/Checkbox/Checkbox.animations.d.ts +14 -0
- package/dist/components/forms/Checkbox/Checkbox.animations.js +53 -0
- package/dist/components/forms/Checkbox/Checkbox.js +4 -2
- package/dist/components/forms/Checkbox/Checkbox.theme.js +3 -3
- package/dist/components/forms/ColorPicker/ColorPicker.types.d.ts +1 -1
- package/dist/components/forms/ColorPicker/ColorPickerBody.js +3 -3
- package/dist/components/forms/Combobox/Combobox.js +5 -3
- package/dist/components/forms/DatePicker/DatePickerBody.js +1 -1
- package/dist/components/forms/DateRangePicker/DateRangePicker.animations.d.ts +1 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.d.ts +37 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.js +110 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.d.ts +5 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +52 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +154 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerBody.d.ts +6 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +208 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerPresets.d.ts +6 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +41 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.d.ts +6 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +32 -0
- package/dist/components/forms/DateRangePicker/dateRangePresets.d.ts +5 -0
- package/dist/components/forms/DateRangePicker/dateRangePresets.js +59 -0
- package/dist/components/forms/DateRangePicker/index.d.ts +4 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.animations.d.ts +36 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.animations.js +22 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.d.ts +3 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.js +111 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.d.ts +19 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +27 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.types.d.ts +33 -0
- package/dist/components/forms/FileUpload/index.d.ts +3 -0
- package/dist/components/forms/Input/Input.js +8 -13
- package/dist/components/forms/Input/Input.types.d.ts +6 -0
- package/dist/components/forms/InputAddress/InputAddress.theme.js +1 -1
- package/dist/components/forms/InputCounter/InputCounter.js +1 -1
- package/dist/components/forms/InputCreditCard/InputCreditCard.theme.js +1 -1
- package/dist/components/forms/InputOTP/InputOTP.theme.js +1 -1
- package/dist/components/forms/Radio/Radio.animations.d.ts +10 -0
- package/dist/components/forms/Radio/Radio.animations.js +33 -0
- package/dist/components/forms/Radio/Radio.js +11 -2
- package/dist/components/forms/Radio/Radio.theme.js +3 -3
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +13 -4
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +2 -2
- package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +11 -0
- package/dist/components/forms/Select/Select.d.ts +1 -1
- package/dist/components/forms/Select/Select.js +7 -7
- package/dist/components/forms/Select/Select.types.d.ts +3 -3
- package/dist/components/forms/SelectableCard/SelectableCard.js +1 -1
- package/dist/components/forms/Slider/Slider.theme.js +1 -1
- package/dist/components/forms/Switch/Switch.theme.js +3 -3
- package/dist/components/forms/forms.theme.js +1 -1
- package/dist/components/forms/index.d.ts +6 -0
- package/dist/components/forms/index.js +8 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useMediaQuery.d.ts +5 -0
- package/dist/hooks/useMediaQuery.js +21 -0
- package/dist/index.js +21 -0
- package/dist/styles.css +1 -1
- package/dist/utils/dateUtils.js +56 -5
- package/dist/utils/formatUtils.d.ts +10 -0
- package/dist/utils/formatUtils.js +24 -0
- package/dist/utils/index.d.ts +1 -1
- package/package.json +12 -4
- package/src/global.scss +319 -39
- package/src/styles/theme.css +105 -16
- package/src/theme-plugin.css +13 -0
- package/dist/components/ai/ApprovalCard/ApprovalCard.d.ts +0 -3
- package/dist/components/ai/ApprovalCard/ApprovalCard.js +0 -16
- package/dist/components/ai/ApprovalCard/ApprovalCard.theme.d.ts +0 -13
- package/dist/components/ai/ApprovalCard/ApprovalCard.theme.js +0 -15
- package/dist/components/ai/ApprovalCard/ApprovalCard.types.d.ts +0 -43
- package/dist/components/ai/ApprovalCard/index.d.ts +0 -2
- package/dist/components/ai/MessageHistory/MessageHistory.d.ts +0 -18
- package/dist/components/ai/MessageHistory/MessageHistory.js +0 -98
- package/dist/components/ai/MessageHistory/MessageHistory.theme.d.ts +0 -2
- package/dist/components/ai/MessageHistory/MessageHistory.theme.js +0 -8
- package/dist/components/ai/MessageHistory/MessageHistory.types.d.ts +0 -94
- package/dist/components/ai/MessageHistory/index.d.ts +0 -3
- package/dist/icons/Icon.d.ts +0 -24
- package/dist/icons/Icon.js +0 -30
- package/dist/icons/Index.d.ts +0 -16
- package/dist/icons/core/ChevronUpDown.d.ts +0 -1
- package/dist/icons/core/ChevronUpDown.js +0 -7
- package/dist/icons/core/DollarIcon.d.ts +0 -1
- package/dist/icons/core/DollarIcon.js +0 -5
- package/dist/icons/core/LockIcon.d.ts +0 -1
- package/dist/icons/core/LockIcon.js +0 -5
- package/dist/icons/core/MinusIcon.d.ts +0 -1
- package/dist/icons/core/MinusIcon.js +0 -7
- package/dist/icons/core/PlusIcon.d.ts +0 -1
- package/dist/icons/core/PlusIcon.js +0 -7
- package/dist/icons/core/SearchIcon.d.ts +0 -1
- package/dist/icons/core/SearchIcon.js +0 -7
- package/dist/icons/core/TickIcon.d.ts +0 -1
- package/dist/icons/core/TickIcon.js +0 -5
- package/dist/icons/core/User.d.ts +0 -1
- package/dist/utils/useClickOutside.d.ts +0 -1
|
@@ -30,3 +30,9 @@ export { ScrollReveal } from "./ScrollReveal";
|
|
|
30
30
|
export type { ScrollRevealProps, ScrollRevealPreset } from "./ScrollReveal";
|
|
31
31
|
export { StickyScroll } from "./StickyScroll";
|
|
32
32
|
export type { StickyScrollProps, StickyScrollSection, } from "./StickyScroll";
|
|
33
|
+
export { PageTransition } from "./PageTransition";
|
|
34
|
+
export type { PageTransitionProps, PageTransitionDirection, } from "./PageTransition";
|
|
35
|
+
export { InteractiveCharacters } from "./InteractiveCharacters";
|
|
36
|
+
export type { InteractiveCharactersProps, CharacterState, CharacterSize, } from "./InteractiveCharacters";
|
|
37
|
+
export { InsetCircleButton, InsetPill } from "./Neumorphic";
|
|
38
|
+
export type { InsetCircleButtonProps, InsetPillProps, } from "./Neumorphic";
|
|
@@ -14,3 +14,7 @@ export { Spotlight } from './Spotlight/Spotlight.js';
|
|
|
14
14
|
export { ParallaxSection } from './ParallaxSection/ParallaxSection.js';
|
|
15
15
|
export { ScrollReveal } from './ScrollReveal/ScrollReveal.js';
|
|
16
16
|
export { StickyScroll } from './StickyScroll/StickyScroll.js';
|
|
17
|
+
export { PageTransition } from './PageTransition/PageTransition.js';
|
|
18
|
+
export { InteractiveCharacters } from './InteractiveCharacters/InteractiveCharacters.js';
|
|
19
|
+
export { InsetCircleButton } from './Neumorphic/InsetCircleButton.js';
|
|
20
|
+
export { InsetPill } from './Neumorphic/InsetPill.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Variants } from "motion/react";
|
|
2
|
+
/**
|
|
3
|
+
* Checkmark SVG path draw-on animation
|
|
4
|
+
* Animates pathLength from 0 → 1 for a smooth draw effect
|
|
5
|
+
*/
|
|
6
|
+
export declare const checkmarkVariants: Variants;
|
|
7
|
+
/**
|
|
8
|
+
* Indeterminate dash draw-on animation
|
|
9
|
+
*/
|
|
10
|
+
export declare const indeterminateVariants: Variants;
|
|
11
|
+
/**
|
|
12
|
+
* Reduced motion variants — instant opacity toggle, no path draw
|
|
13
|
+
*/
|
|
14
|
+
export declare const reducedMotionVariants: Variants;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const smoothEase = [0.65, 0, 0.35, 1];
|
|
2
|
+
/**
|
|
3
|
+
* Checkmark SVG path draw-on animation
|
|
4
|
+
* Animates pathLength from 0 → 1 for a smooth draw effect
|
|
5
|
+
*/
|
|
6
|
+
const checkmarkVariants = {
|
|
7
|
+
unchecked: {
|
|
8
|
+
pathLength: 0,
|
|
9
|
+
opacity: 0,
|
|
10
|
+
transition: {
|
|
11
|
+
pathLength: { duration: 0.15, ease: smoothEase },
|
|
12
|
+
opacity: { duration: 0.1, ease: "easeOut" },
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
checked: {
|
|
16
|
+
pathLength: 1,
|
|
17
|
+
opacity: 1,
|
|
18
|
+
transition: {
|
|
19
|
+
pathLength: { duration: 0.2, ease: smoothEase },
|
|
20
|
+
opacity: { duration: 0.05, ease: "easeOut" },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Indeterminate dash draw-on animation
|
|
26
|
+
*/
|
|
27
|
+
const indeterminateVariants = {
|
|
28
|
+
unchecked: {
|
|
29
|
+
pathLength: 0,
|
|
30
|
+
opacity: 0,
|
|
31
|
+
transition: {
|
|
32
|
+
pathLength: { duration: 0.1, ease: smoothEase },
|
|
33
|
+
opacity: { duration: 0.08, ease: "easeOut" },
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
checked: {
|
|
37
|
+
pathLength: 1,
|
|
38
|
+
opacity: 1,
|
|
39
|
+
transition: {
|
|
40
|
+
pathLength: { duration: 0.15, ease: smoothEase },
|
|
41
|
+
opacity: { duration: 0.05, ease: "easeOut" },
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Reduced motion variants — instant opacity toggle, no path draw
|
|
47
|
+
*/
|
|
48
|
+
const reducedMotionVariants = {
|
|
49
|
+
unchecked: { opacity: 0 },
|
|
50
|
+
checked: { opacity: 1 },
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export { checkmarkVariants, indeterminateVariants, reducedMotionVariants };
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React__default, { useId, useState, useRef, useEffect } from 'react';
|
|
3
|
+
import { useReducedMotion, AnimatePresence, motion } from 'motion/react';
|
|
3
4
|
import { checkboxTheme } from './Checkbox.theme.js';
|
|
4
5
|
import { formLabelTheme } from '../FormLabel/FormLabel.theme.js';
|
|
5
|
-
import { MinusIcon, CheckIcon } from '@heroicons/react/24/outline';
|
|
6
6
|
import { cn } from '../../../utils/cn.js';
|
|
7
7
|
import { useCheckboxGroupContext } from './CheckboxContext.js';
|
|
8
8
|
import { CheckboxGroup } from './CheckboxGroup.js';
|
|
9
|
+
import { reducedMotionVariants, indeterminateVariants, checkmarkVariants } from './Checkbox.animations.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Checkbox component for selecting one or more options
|
|
@@ -13,6 +14,7 @@ import { CheckboxGroup } from './CheckboxGroup.js';
|
|
|
13
14
|
const CheckboxComponent = React__default.forwardRef(({ id: idProp, name: nameProp, value, checked: controlledChecked, indeterminate = false, onChange, label, description, state: stateProp = "default", size: sizeProp = "md", className, ...restProps }, ref) => {
|
|
14
15
|
var _a, _b, _c, _d;
|
|
15
16
|
const autoId = useId();
|
|
17
|
+
const shouldReduceMotion = useReducedMotion();
|
|
16
18
|
const groupContext = useCheckboxGroupContext();
|
|
17
19
|
// Resolve props from group context or individual props
|
|
18
20
|
const id = idProp !== null && idProp !== void 0 ? idProp : autoId;
|
|
@@ -57,7 +59,7 @@ const CheckboxComponent = React__default.forwardRef(({ id: idProp, name: namePro
|
|
|
57
59
|
ref(node);
|
|
58
60
|
else if (ref)
|
|
59
61
|
ref.current = node;
|
|
60
|
-
}, type: "checkbox", id: id, name: name, value: value, checked: isChecked, onChange: handleChange, disabled: isDisabled, "aria-describedby": description ? `${id}-description` : undefined, "data-state": isDisabled ? "disabled" : "default", className: cn(checkboxTheme.inputStyle, checkboxTheme.sizes[size], indeterminate && "bg-neutral-200") }), indeterminate && (jsx(
|
|
62
|
+
}, type: "checkbox", id: id, name: name, value: value, checked: isChecked, onChange: handleChange, disabled: isDisabled, "aria-describedby": description ? `${id}-description` : undefined, "data-state": isDisabled ? "disabled" : "default", className: cn(checkboxTheme.inputStyle, checkboxTheme.sizes[size], indeterminate && "bg-neutral-200") }), jsxs(AnimatePresence, { mode: "wait", children: [indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-neutral-600", size === "sm" ? "size-3" : "size-4"), children: jsx(motion.path, { d: "M3.5 8 L12.5 8", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", variants: shouldReduceMotion ? reducedMotionVariants : indeterminateVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "indeterminate")), isChecked && !indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-white", size === "sm" ? "size-3" : "size-4"), children: jsx(motion.path, { d: "M3.5 8.5 L6.5 11.5 L12.5 4.5", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", variants: shouldReduceMotion ? reducedMotionVariants : checkmarkVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "checkmark"))] })] }), (label || description) && (jsxs("label", { htmlFor: id, className: cn("cursor-pointer", isDisabled && "cursor-not-allowed"), children: [label && (typeof label === 'string' ? (jsx("span", { className: cn(formLabelTheme.baseStyle, formLabelTheme.stateStyles[state], "mb-0"), children: label })) : (label)), description && (typeof description === 'string' ? (jsx("div", { id: `${id}-description`, className: checkboxTheme.descriptionStyle, children: description })) : (description))] }))] }));
|
|
61
63
|
});
|
|
62
64
|
CheckboxComponent.displayName = "Checkbox";
|
|
63
65
|
const Checkbox = Object.assign(CheckboxComponent, {
|
|
@@ -10,7 +10,7 @@ const checkboxTheme = {
|
|
|
10
10
|
// Default state - light
|
|
11
11
|
"border-[var(--color-border)] bg-[var(--color-surface)] " +
|
|
12
12
|
// Default state - dark
|
|
13
|
-
"dark:bg-[var(--color-background-
|
|
13
|
+
"dark:bg-[var(--color-background-tertiary)] " +
|
|
14
14
|
// Checked state - light
|
|
15
15
|
"checked:border-[var(--color-primary)] checked:bg-[var(--color-primary)] " +
|
|
16
16
|
// Checked state - dark
|
|
@@ -27,7 +27,7 @@ const checkboxTheme = {
|
|
|
27
27
|
"disabled:bg-[var(--color-background-disabled)] disabled:checked:outline-0 " +
|
|
28
28
|
"data-[state=disabled]:border-[var(--color-border)] data-[state=disabled]:bg-[var(--color-background-disabled)] data-[state=disabled]:cursor-not-allowed " +
|
|
29
29
|
// Disabled state - dark
|
|
30
|
-
"dark:disabled:bg-[var(--color-neutral-
|
|
30
|
+
"dark:disabled:bg-[var(--color-neutral-800)] dark:disabled:border-[var(--color-neutral-600)] " +
|
|
31
31
|
"dark:data-[state=disabled]:bg-[var(--color-neutral-700)] dark:data-[state=disabled]:border-[var(--color-neutral-600)]",
|
|
32
32
|
// Description text - light and dark
|
|
33
33
|
descriptionStyle: "text-base mt-0.5 " + "text-[var(--color-text-secondary)]/80 " + " ",
|
|
@@ -38,7 +38,7 @@ const checkboxTheme = {
|
|
|
38
38
|
// Group styles
|
|
39
39
|
groupStyle: "flex flex-col gap-1.5",
|
|
40
40
|
groupHorizontalStyle: "flex-row flex-wrap gap-x-6 gap-y-3",
|
|
41
|
-
groupDescriptionStyle: "text-base text-[var(--color-text-secondary)]
|
|
41
|
+
groupDescriptionStyle: "text-base text-[var(--color-text-secondary)] -mt-0.5 mb-1",
|
|
42
42
|
groupErrorStyle: "text-base text-[var(--color-danger)] mt-1.5",
|
|
43
43
|
groupItemsStyle: "flex flex-col gap-3",
|
|
44
44
|
};
|
|
@@ -95,7 +95,7 @@ export interface ColorPickerContextValue {
|
|
|
95
95
|
isOpen: boolean;
|
|
96
96
|
setIsOpen: (open: boolean) => void;
|
|
97
97
|
triggerRef: React.RefObject<HTMLElement>;
|
|
98
|
-
placement:
|
|
98
|
+
placement: import("../../../hooks/useSelectPortal").SelectPlacement;
|
|
99
99
|
offset: number;
|
|
100
100
|
showAlpha: boolean;
|
|
101
101
|
showEyeDropper: boolean;
|
|
@@ -26,7 +26,7 @@ const ColorPickerBody = ({ children, className, portal = true, animation = true,
|
|
|
26
26
|
const { position, cssVariables } = useSelectPortal({
|
|
27
27
|
triggerRef,
|
|
28
28
|
isOpen: isOpen || false,
|
|
29
|
-
placement
|
|
29
|
+
placement,
|
|
30
30
|
offset: offset || 4,
|
|
31
31
|
autoWidth: false,
|
|
32
32
|
});
|
|
@@ -52,8 +52,8 @@ const ColorPickerBody = ({ children, className, portal = true, animation = true,
|
|
|
52
52
|
document.addEventListener('keydown', handleEscape);
|
|
53
53
|
return () => document.removeEventListener('keydown', handleEscape);
|
|
54
54
|
}, [isOpen, setIsOpen, triggerRef]);
|
|
55
|
-
// Extract DOM
|
|
56
|
-
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, ...domProps } = rest;
|
|
55
|
+
// Extract DOM event handler props that conflict with Framer Motion
|
|
56
|
+
const { onAnimationStart: _onAnimationStart, onAnimationEnd: _onAnimationEnd, onDrag: _onDrag, onDragStart: _onDragStart, onDragEnd: _onDragEnd, ...domProps } = rest;
|
|
57
57
|
const content = (jsx(AnimatePresence, { children: isOpen && (jsx(motion.div, { ref: contentRef, role: "dialog", "aria-label": "Color picker", className: cn('fixed z-50', theme.contentStyle, className), style: {
|
|
58
58
|
...cssVariables,
|
|
59
59
|
top: `${position.top}px`,
|
|
@@ -95,7 +95,8 @@ const ComboboxOptions = ({ isOpen, onClose, triggerRef, portal, placement, offse
|
|
|
95
95
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
96
96
|
}, [isOpen, onClose, portal, contentRef, optionsRef, triggerRef]);
|
|
97
97
|
// Theme can come from Select's theme (optionsContainerStyle) or Combobox's theme (dropdownStyle)
|
|
98
|
-
const
|
|
98
|
+
const comboboxThemeRef = theme;
|
|
99
|
+
const dropdownStyle = comboboxThemeRef.dropdownStyle ||
|
|
99
100
|
theme.optionsContainerStyle ||
|
|
100
101
|
comboboxTheme.dropdownStyle;
|
|
101
102
|
const optionStyle = theme.optionStyle || comboboxTheme.optionStyle;
|
|
@@ -396,7 +397,8 @@ const ComboboxInner = ({ options, value, onChange, placeholder = "Search...", la
|
|
|
396
397
|
? `${comboboxId}-option-${customFilteredOptions[highlightedIndex].id}`
|
|
397
398
|
: undefined, "aria-autocomplete": "list", "aria-invalid": isInvalid, autoComplete: "off", className: cn(inputClasses, sizeClasses, iconStartPadding, showClearButton && "pr-8", inputClassName), value: searchValue, onChange: handleInputChange, onFocus: handleInputFocus, onKeyDown: handleKeyDown, placeholder: placeholder, disabled: isDisabled, required: required }), hasLeftIcon && (jsx("div", { className: theme.iconStartStyle, children: iconStart })), showClearButton && (jsx("button", { type: "button", className: theme.clearButtonStyle, onClick: handleClear, "aria-label": "Clear selection", tabIndex: -1, children: jsx(XMarkIcon, { className: theme.clearIconStyle }) }))] }) }), jsx(ComboboxOptions, { isOpen: isOpen, onClose: () => setIsOpen(false), triggerRef: wrapperRef, portal: portal, placement: placement, offset: offset, emptyMessage: emptyMessage, className: dropdownClassName })] }), helperText && (jsx("p", { className: cn(helperTextClasses, helperTextStateClasses), children: helperText })), name && (jsx("input", { type: "hidden", name: name, value: value !== undefined ? String(value) : "" }))] }) }));
|
|
398
399
|
};
|
|
399
|
-
const
|
|
400
|
-
|
|
400
|
+
const ComboboxForwarded = React__default.forwardRef(ComboboxInner);
|
|
401
|
+
ComboboxForwarded.displayName = "Combobox";
|
|
402
|
+
const Combobox = ComboboxForwarded;
|
|
401
403
|
|
|
402
404
|
export { Combobox };
|
|
@@ -213,7 +213,7 @@ const DatePickerBody = ({ isOpen, className, onClose, portal = true, placement =
|
|
|
213
213
|
const adjustedLeft = new Date(newDate);
|
|
214
214
|
adjustedLeft.setMonth(adjustedLeft.getMonth() - 1);
|
|
215
215
|
setLeftCalendarDate(adjustedLeft);
|
|
216
|
-
}, onNavigatePrev: null, onNavigateNext: handleNavigateNext, minDate: minDate, maxDate: maxDate, isDateDisabled: isDateDisabled, showToday: showToday, selectTodayByDefault: false, weekdays: weekdays, months: months, yearRange: yearRange, size: "md" }) })] })) }), jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-t border-[var(--color-border)]
|
|
216
|
+
}, onNavigatePrev: null, onNavigateNext: handleNavigateNext, minDate: minDate, maxDate: maxDate, isDateDisabled: isDateDisabled, showToday: showToday, selectTodayByDefault: false, weekdays: weekdays, months: months, yearRange: yearRange, size: "md" }) })] })) }), jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-t border-[var(--color-border)]", children: [jsx("div", { className: "text-sm text-[var(--color-text-muted", children: formatRangeDisplay(tempRange) }), jsxs("div", { className: "flex items-center gap-2", children: [jsx(Button, { variant: "outline", color: "neutral", size: "sm", onClick: handleCancel, children: "Cancel" }), jsx(Button, { variant: "filled", size: "sm", onClick: handleApply, disabled: !(tempRange === null || tempRange === void 0 ? void 0 : tempRange.start) || !(tempRange === null || tempRange === void 0 ? void 0 : tempRange.end), children: "Apply" })] })] })] })) : (
|
|
217
217
|
// Single calendar for single mode
|
|
218
218
|
jsx("div", { className: "flex-1 p-4", children: children || (jsx(Calendar, { mode: "single", value: selectedValue, onChange: (value) => {
|
|
219
219
|
handleDateSelect(value);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createDropdownAnimations } from "../DatePicker/DatePicker.animations";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { DateRangePickerProps, DateRangePickerState, DateRangePickerSize, DateRangePickerTheme, DateRange } from "./DateRangePicker.types";
|
|
3
|
+
import { DateRangePickerTrigger } from "./DateRangePickerTrigger";
|
|
4
|
+
import { DateRangePickerBody } from "./DateRangePickerBody";
|
|
5
|
+
import { DateRangePickerPresets } from "./DateRangePickerPresets";
|
|
6
|
+
interface DateRangePickerContextType {
|
|
7
|
+
isOpen: boolean;
|
|
8
|
+
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
9
|
+
selectedRange: DateRange | undefined;
|
|
10
|
+
handleRangeSelect: (range: DateRange) => void;
|
|
11
|
+
minDate?: Date;
|
|
12
|
+
maxDate?: Date;
|
|
13
|
+
isDateDisabled?: (date: Date) => boolean;
|
|
14
|
+
showToday?: boolean;
|
|
15
|
+
weekdays?: string[];
|
|
16
|
+
months?: string[];
|
|
17
|
+
yearRange?: {
|
|
18
|
+
start: number;
|
|
19
|
+
end: number;
|
|
20
|
+
};
|
|
21
|
+
size: DateRangePickerSize;
|
|
22
|
+
state: DateRangePickerState;
|
|
23
|
+
theme: DateRangePickerTheme;
|
|
24
|
+
triggerRef: React.RefObject<HTMLButtonElement | null>;
|
|
25
|
+
contentRef: React.RefObject<HTMLDivElement | null>;
|
|
26
|
+
}
|
|
27
|
+
export declare const DateRangePickerContext: React.Context<DateRangePickerContextType | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* DateRangePicker Component — dedicated range picker with presets and dual calendars
|
|
30
|
+
*/
|
|
31
|
+
declare const DateRangePickerComponent: React.ForwardRefExoticComponent<DateRangePickerProps & React.RefAttributes<HTMLDivElement>>;
|
|
32
|
+
declare const DateRangePickerWithCompounds: typeof DateRangePickerComponent & {
|
|
33
|
+
Trigger: typeof DateRangePickerTrigger;
|
|
34
|
+
Body: typeof DateRangePickerBody;
|
|
35
|
+
Presets: typeof DateRangePickerPresets;
|
|
36
|
+
};
|
|
37
|
+
export { DateRangePickerTrigger, DateRangePickerBody, DateRangePickerPresets, DateRangePickerWithCompounds as DateRangePicker, };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import React__default, { createContext, useState, useRef, useEffect, useCallback, useMemo } from 'react';
|
|
3
|
+
import { dateRangePickerTheme } from './DateRangePicker.theme.js';
|
|
4
|
+
import { DEFAULT_DATE_RANGE_PRESETS } from './dateRangePresets.js';
|
|
5
|
+
import { FormLabel } from '../FormLabel/FormLabel.js';
|
|
6
|
+
import { DateRangePickerTrigger } from './DateRangePickerTrigger.js';
|
|
7
|
+
import { DateRangePickerBody } from './DateRangePickerBody.js';
|
|
8
|
+
import { DateRangePickerPresets } from './DateRangePickerPresets.js';
|
|
9
|
+
import { cn } from '../../../utils/cn.js';
|
|
10
|
+
import { formatDateCustom } from '../../../utils/dateUtils.js';
|
|
11
|
+
|
|
12
|
+
const DateRangePickerContext = createContext(undefined);
|
|
13
|
+
/**
|
|
14
|
+
* Format date for display
|
|
15
|
+
*/
|
|
16
|
+
const formatDate = (date, formatString, options = {
|
|
17
|
+
year: "numeric",
|
|
18
|
+
month: "short",
|
|
19
|
+
day: "numeric",
|
|
20
|
+
}) => {
|
|
21
|
+
if (formatString) {
|
|
22
|
+
return formatDateCustom(date, formatString);
|
|
23
|
+
}
|
|
24
|
+
return date.toLocaleDateString(undefined, options);
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Format date range for display
|
|
28
|
+
*/
|
|
29
|
+
const formatDateRange = (range, formatString, options) => {
|
|
30
|
+
if (!range.start && !range.end)
|
|
31
|
+
return "";
|
|
32
|
+
if (range.start && !range.end)
|
|
33
|
+
return formatDate(range.start, formatString, options);
|
|
34
|
+
if (!range.start && range.end)
|
|
35
|
+
return formatDate(range.end, formatString, options);
|
|
36
|
+
return `${formatDate(range.start, formatString, options)} - ${formatDate(range.end, formatString, options)}`;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* DateRangePicker Component — dedicated range picker with presets and dual calendars
|
|
40
|
+
*/
|
|
41
|
+
const DateRangePickerComponent = React__default.forwardRef(({ id, name, size = "md", state = "default", value, defaultValue, placeholder = "Select date range...", disabled = false, required = false, label, helperText, onChange, onFocus, onBlur, presets = DEFAULT_DATE_RANGE_PRESETS, showPresets = true, minDate, maxDate, isDateDisabled, showToday = true, weekdays, months, dateFormat, formatString, yearRange, className = "", wrapperClassName = "", portal = true, placement = "bottom-start", offset = 4, ...rest }, ref) => {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
const theme = { ...dateRangePickerTheme };
|
|
44
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
45
|
+
const [selectedRange, setSelectedRange] = useState(value || defaultValue);
|
|
46
|
+
const triggerRef = useRef(null);
|
|
47
|
+
const contentRef = useRef(null);
|
|
48
|
+
// Sync controlled value
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (value !== undefined) {
|
|
51
|
+
setSelectedRange(value);
|
|
52
|
+
}
|
|
53
|
+
}, [value]);
|
|
54
|
+
const handleRangeSelect = useCallback((newRange) => {
|
|
55
|
+
setSelectedRange(newRange);
|
|
56
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(newRange);
|
|
57
|
+
}, [onChange]);
|
|
58
|
+
const handleButtonClick = useCallback(() => {
|
|
59
|
+
if (!disabled) {
|
|
60
|
+
setIsOpen((prev) => !prev);
|
|
61
|
+
}
|
|
62
|
+
}, [disabled]);
|
|
63
|
+
const displayValue = selectedRange
|
|
64
|
+
? formatDateRange(selectedRange, formatString, dateFormat)
|
|
65
|
+
: placeholder;
|
|
66
|
+
const generatedId = React__default.useId();
|
|
67
|
+
const pickerId = id || generatedId;
|
|
68
|
+
return (jsx(DateRangePickerContext.Provider, { value: useMemo(() => ({
|
|
69
|
+
isOpen,
|
|
70
|
+
setIsOpen,
|
|
71
|
+
selectedRange,
|
|
72
|
+
handleRangeSelect,
|
|
73
|
+
minDate,
|
|
74
|
+
maxDate,
|
|
75
|
+
isDateDisabled,
|
|
76
|
+
showToday,
|
|
77
|
+
weekdays,
|
|
78
|
+
months,
|
|
79
|
+
yearRange,
|
|
80
|
+
size,
|
|
81
|
+
state,
|
|
82
|
+
theme,
|
|
83
|
+
triggerRef,
|
|
84
|
+
contentRef,
|
|
85
|
+
}), [
|
|
86
|
+
isOpen,
|
|
87
|
+
selectedRange,
|
|
88
|
+
handleRangeSelect,
|
|
89
|
+
minDate,
|
|
90
|
+
maxDate,
|
|
91
|
+
isDateDisabled,
|
|
92
|
+
showToday,
|
|
93
|
+
weekdays,
|
|
94
|
+
months,
|
|
95
|
+
yearRange,
|
|
96
|
+
size,
|
|
97
|
+
state,
|
|
98
|
+
theme,
|
|
99
|
+
]), children: jsxs("div", { ref: ref, className: cn(theme.containerStyle, wrapperClassName), ...rest, children: [label && (jsx(FormLabel, { htmlFor: pickerId, required: required, children: label })), jsx(DateRangePickerTrigger, { id: pickerId, disabled: disabled, isOpen: isOpen, state: state, size: size, onClick: handleButtonClick, onFocus: onFocus, onBlur: onBlur, className: className, children: jsx("span", { className: cn("block truncate", selectedRange && (selectedRange.start || selectedRange.end)
|
|
100
|
+
? theme.valueTextStyle
|
|
101
|
+
: theme.placeholderTextStyle), children: displayValue }) }), jsx(DateRangePickerBody, { isOpen: isOpen, onClose: () => setIsOpen(false), portal: portal, placement: placement, offset: offset, presets: presets, showPresets: showPresets }), helperText && (jsx("p", { className: cn(theme.helperTextStyle, theme.helperTextStates[state]), children: helperText })), name && selectedRange && (jsxs(Fragment, { children: [jsx("input", { type: "hidden", name: `${name}[start]`, value: ((_a = selectedRange.start) === null || _a === void 0 ? void 0 : _a.toISOString()) || "" }), jsx("input", { type: "hidden", name: `${name}[end]`, value: ((_b = selectedRange.end) === null || _b === void 0 ? void 0 : _b.toISOString()) || "" })] }))] }) }));
|
|
102
|
+
});
|
|
103
|
+
DateRangePickerComponent.displayName = "DateRangePicker";
|
|
104
|
+
// Compound component
|
|
105
|
+
const DateRangePickerWithCompounds = DateRangePickerComponent;
|
|
106
|
+
DateRangePickerWithCompounds.Trigger = DateRangePickerTrigger;
|
|
107
|
+
DateRangePickerWithCompounds.Body = DateRangePickerBody;
|
|
108
|
+
DateRangePickerWithCompounds.Presets = DateRangePickerPresets;
|
|
109
|
+
|
|
110
|
+
export { DateRangePickerWithCompounds as DateRangePicker, DateRangePickerBody, DateRangePickerContext, DateRangePickerPresets, DateRangePickerTrigger };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { formsBaseTheme } from '../forms.theme.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* DateRangePicker theme — mirrors DatePicker theme with added checkmark style
|
|
5
|
+
*/
|
|
6
|
+
const dateRangePickerTheme = {
|
|
7
|
+
containerStyle: formsBaseTheme.wrapperStyle,
|
|
8
|
+
baseStyle: formsBaseTheme.inputGroupBaseStyle + " justify-between cursor-pointer",
|
|
9
|
+
triggerButtonStyle: "w-full cursor-pointer bg-white dark:bg-[var(--color-neutral-900)]",
|
|
10
|
+
placeholderTextStyle: "text-[var(--color-text-placeholder)]",
|
|
11
|
+
valueTextStyle: "text-[var(--color-text-primary)]",
|
|
12
|
+
triggerSizes: {
|
|
13
|
+
sm: `${formsBaseTheme.sizes.sm.text} ${formsBaseTheme.sizes.sm.padding} ${formsBaseTheme.sizes.sm.height}`,
|
|
14
|
+
md: `${formsBaseTheme.sizes.md.text} ${formsBaseTheme.sizes.md.padding} ${formsBaseTheme.sizes.md.height}`,
|
|
15
|
+
lg: `${formsBaseTheme.sizes.lg.text} ${formsBaseTheme.sizes.lg.padding} ${formsBaseTheme.sizes.lg.height}`,
|
|
16
|
+
},
|
|
17
|
+
triggerStates: formsBaseTheme.states,
|
|
18
|
+
triggerHoverStates: formsBaseTheme.hoverStates,
|
|
19
|
+
triggerFocusStates: formsBaseTheme.focusStates,
|
|
20
|
+
iconEndStyle: formsBaseTheme.iconStyles.right,
|
|
21
|
+
iconEndPadding: formsBaseTheme.iconStyles.padding.right,
|
|
22
|
+
bodyStyle: "flex flex-col sm:flex-row w-fit max-w-[calc(100vw-2rem)] sm:max-w-none bg-white border border-[var(--color-border)] rounded-[var(--popover-radius)] shadow-lg p-0 overflow-hidden z-[1000] fixed " +
|
|
23
|
+
"dark:bg-[var(--color-neutral-900)] dark:border-[var(--color-neutral-700)]",
|
|
24
|
+
presetsContainerStyle: "hidden sm:flex flex-col gap-1 p-3 sm:border-r border-[var(--color-border)] bg-[var(--color-neutral-50)] sm:min-w-[180px] " +
|
|
25
|
+
"dark:bg-[var(--color-neutral-800)] ",
|
|
26
|
+
presetButtonStyle: "w-full text-left px-3 py-2 text-base font-medium rounded-[calc(var(--radius-base)*0.75)] transition-colors cursor-pointer " +
|
|
27
|
+
"flex items-center justify-between gap-2 " +
|
|
28
|
+
"text-[var(--color-text-secondary)] hover:bg-white hover:text-[var(--color-text-primary)] " +
|
|
29
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 " +
|
|
30
|
+
"data-[active=true]:bg-white data-[active=true]:text-[var(--color-text-primary)] data-[active=true]:font-medium " +
|
|
31
|
+
"dark:hover:bg-[var(--color-neutral-700)] " +
|
|
32
|
+
"dark:data-[active=true]:bg-[var(--color-neutral-700)] dark:data-[active=true]:text-[var(--color-neutral-100)] " +
|
|
33
|
+
"dark:focus-visible:ring-offset-[var(--color-neutral-800)]",
|
|
34
|
+
presetCheckmarkStyle: "size-4 text-[var(--color-primary)] shrink-0",
|
|
35
|
+
mobilePresetsContainerStyle: "sm:hidden px-3 pt-3 pb-1",
|
|
36
|
+
mobilePresetButtonStyle: "whitespace-nowrap px-3 py-1.5 text-sm font-medium rounded-full transition-colors cursor-pointer shrink-0 " +
|
|
37
|
+
"bg-[var(--color-background-secondary)] text-[var(--color-text-secondary)] " +
|
|
38
|
+
"hover:bg-[var(--color-background-tertiary)] hover:text-[var(--color-text-primary)] " +
|
|
39
|
+
"data-[active=true]:bg-[var(--color-primary-50)] data-[active=true]:text-[var(--color-primary)] " +
|
|
40
|
+
"dark:bg-[var(--color-neutral-800)] dark:text-[var(--color-neutral-300)] " +
|
|
41
|
+
"dark:hover:bg-[var(--color-neutral-700)] " +
|
|
42
|
+
"dark:data-[active=true]:bg-[var(--color-primary-950)] dark:data-[active=true]:text-[var(--color-primary-300)]",
|
|
43
|
+
mobileRangeDisplayStyle: "sm:hidden text-sm text-center py-2 text-[var(--color-text-secondary)] dark:text-[var(--color-neutral-400)]",
|
|
44
|
+
helperTextStyle: formsBaseTheme.helperText,
|
|
45
|
+
helperTextStates: {
|
|
46
|
+
default: "text-[var(--color-text-muted)] dark:text-[var(--color-neutral-400)]",
|
|
47
|
+
disabled: "text-[var(--color-text-disabled)] dark:text-[var(--color-neutral-600)]",
|
|
48
|
+
invalid: "text-[var(--color-danger)] dark:text-[var(--color-danger-400)]",
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { dateRangePickerTheme };
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { DateRange } from "../../core/Calendar/Calendar.types";
|
|
3
|
+
export type { DateRange };
|
|
4
|
+
/**
|
|
5
|
+
* Size variants for DateRangePicker
|
|
6
|
+
*/
|
|
7
|
+
export type DateRangePickerSize = "sm" | "md" | "lg";
|
|
8
|
+
/**
|
|
9
|
+
* State variants for DateRangePicker
|
|
10
|
+
*/
|
|
11
|
+
export type DateRangePickerState = "default" | "disabled" | "invalid";
|
|
12
|
+
/**
|
|
13
|
+
* Placement options for DateRangePicker popover
|
|
14
|
+
*/
|
|
15
|
+
export type DateRangePickerPlacement = "bottom-start" | "bottom-end" | "top-start" | "top-end";
|
|
16
|
+
/**
|
|
17
|
+
* Preset for quick date range selection
|
|
18
|
+
*/
|
|
19
|
+
export interface DateRangePreset {
|
|
20
|
+
label: string;
|
|
21
|
+
getValue: () => DateRange;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Main DateRangePicker component props
|
|
25
|
+
* Always operates on DateRange — no single date mode
|
|
26
|
+
*/
|
|
27
|
+
export interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" | "onFocus" | "onBlur"> {
|
|
28
|
+
/** Unique identifier */
|
|
29
|
+
id?: string;
|
|
30
|
+
/** Form field name */
|
|
31
|
+
name?: string;
|
|
32
|
+
/** Size variant */
|
|
33
|
+
size?: DateRangePickerSize;
|
|
34
|
+
/** State variant */
|
|
35
|
+
state?: DateRangePickerState;
|
|
36
|
+
/** The selected date range (controlled mode) */
|
|
37
|
+
value?: DateRange;
|
|
38
|
+
/** Default selected date range (uncontrolled mode) */
|
|
39
|
+
defaultValue?: DateRange;
|
|
40
|
+
/** Placeholder text when no range selected */
|
|
41
|
+
placeholder?: string;
|
|
42
|
+
/** Whether the field is disabled */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Whether the field is required */
|
|
45
|
+
required?: boolean;
|
|
46
|
+
/** Label for the field */
|
|
47
|
+
label?: string;
|
|
48
|
+
/** Helper text below the field */
|
|
49
|
+
helperText?: string;
|
|
50
|
+
/** Callback fired when a range is applied */
|
|
51
|
+
onChange?: (range: DateRange | null) => void;
|
|
52
|
+
/** Array of preset date ranges */
|
|
53
|
+
presets?: DateRangePreset[];
|
|
54
|
+
/** Whether to show presets sidebar (default: true) */
|
|
55
|
+
showPresets?: boolean;
|
|
56
|
+
/** Focus event handler */
|
|
57
|
+
onFocus?: (event: React.FocusEvent<HTMLButtonElement>) => void;
|
|
58
|
+
/** Blur event handler */
|
|
59
|
+
onBlur?: (event: React.FocusEvent<HTMLButtonElement>) => void;
|
|
60
|
+
/** Minimum selectable date */
|
|
61
|
+
minDate?: Date;
|
|
62
|
+
/** Maximum selectable date */
|
|
63
|
+
maxDate?: Date;
|
|
64
|
+
/** Function to determine if a specific date should be disabled */
|
|
65
|
+
isDateDisabled?: (date: Date) => boolean;
|
|
66
|
+
/** Whether to highlight today's date (default: true) */
|
|
67
|
+
showToday?: boolean;
|
|
68
|
+
/** Custom weekday labels */
|
|
69
|
+
weekdays?: string[];
|
|
70
|
+
/** Custom month names */
|
|
71
|
+
months?: string[];
|
|
72
|
+
/** Format for displaying selected date (Intl API) */
|
|
73
|
+
dateFormat?: Intl.DateTimeFormatOptions;
|
|
74
|
+
/** Custom format string (e.g., 'DD MMM YYYY') - takes precedence over dateFormat */
|
|
75
|
+
formatString?: string;
|
|
76
|
+
/** Year range for the year dropdown */
|
|
77
|
+
yearRange?: {
|
|
78
|
+
start: number;
|
|
79
|
+
end: number;
|
|
80
|
+
};
|
|
81
|
+
/** Additional class name for trigger button */
|
|
82
|
+
className?: string;
|
|
83
|
+
/** Additional class name for wrapper */
|
|
84
|
+
wrapperClassName?: string;
|
|
85
|
+
/** Whether to use portal rendering (default: true) */
|
|
86
|
+
portal?: boolean;
|
|
87
|
+
/** Popover placement */
|
|
88
|
+
placement?: DateRangePickerPlacement;
|
|
89
|
+
/** Offset from trigger element */
|
|
90
|
+
offset?: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* DateRangePicker trigger button props
|
|
94
|
+
*/
|
|
95
|
+
export interface DateRangePickerTriggerProps {
|
|
96
|
+
id?: string;
|
|
97
|
+
disabled?: boolean;
|
|
98
|
+
isOpen?: boolean;
|
|
99
|
+
state?: DateRangePickerState;
|
|
100
|
+
size?: DateRangePickerSize;
|
|
101
|
+
className?: string;
|
|
102
|
+
onClick?: () => void;
|
|
103
|
+
onFocus?: (event: React.FocusEvent<HTMLButtonElement>) => void;
|
|
104
|
+
onBlur?: (event: React.FocusEvent<HTMLButtonElement>) => void;
|
|
105
|
+
children?: React.ReactNode;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* DateRangePicker body props
|
|
109
|
+
*/
|
|
110
|
+
export interface DateRangePickerBodyProps {
|
|
111
|
+
isOpen?: boolean;
|
|
112
|
+
className?: string;
|
|
113
|
+
onClose?: () => void;
|
|
114
|
+
portal?: boolean;
|
|
115
|
+
placement?: DateRangePickerPlacement;
|
|
116
|
+
offset?: number;
|
|
117
|
+
presets?: DateRangePreset[];
|
|
118
|
+
showPresets?: boolean;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* DateRangePicker presets props
|
|
122
|
+
*/
|
|
123
|
+
export interface DateRangePickerPresetsProps {
|
|
124
|
+
presets: DateRangePreset[];
|
|
125
|
+
className?: string;
|
|
126
|
+
tempRange?: DateRange;
|
|
127
|
+
setTempRange?: React.Dispatch<React.SetStateAction<DateRange | undefined>>;
|
|
128
|
+
onPresetSelect?: (range: DateRange) => void;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Theme interface for DateRangePicker (flat structure following library pattern)
|
|
132
|
+
*/
|
|
133
|
+
export interface DateRangePickerTheme {
|
|
134
|
+
containerStyle: string;
|
|
135
|
+
baseStyle: string;
|
|
136
|
+
triggerButtonStyle: string;
|
|
137
|
+
placeholderTextStyle: string;
|
|
138
|
+
valueTextStyle: string;
|
|
139
|
+
triggerSizes: Record<DateRangePickerSize, string>;
|
|
140
|
+
triggerStates: Record<DateRangePickerState, string>;
|
|
141
|
+
triggerHoverStates: Record<DateRangePickerState, string>;
|
|
142
|
+
triggerFocusStates: Record<DateRangePickerState, string>;
|
|
143
|
+
iconEndStyle: string;
|
|
144
|
+
iconEndPadding: string;
|
|
145
|
+
bodyStyle: string;
|
|
146
|
+
presetsContainerStyle: string;
|
|
147
|
+
presetButtonStyle: string;
|
|
148
|
+
presetCheckmarkStyle: string;
|
|
149
|
+
mobilePresetsContainerStyle: string;
|
|
150
|
+
mobilePresetButtonStyle: string;
|
|
151
|
+
mobileRangeDisplayStyle: string;
|
|
152
|
+
helperTextStyle: string;
|
|
153
|
+
helperTextStates: Record<DateRangePickerState, string>;
|
|
154
|
+
}
|