@flikk/ui 1.0.0-beta.13 → 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.
Files changed (283) hide show
  1. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
  2. package/dist/components/ai/PromptInput/PromptInput.js +4 -2
  3. package/dist/components/ai/PromptInput/VoiceRecorder.js +1 -1
  4. package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +4 -4
  5. package/dist/components/ai/StreamingResponse/StreamingResponse.js +6 -0
  6. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.js +3 -14
  7. package/dist/components/ai/index.d.ts +0 -5
  8. package/dist/components/ai/index.js +8 -4
  9. package/dist/components/charts/DonutChart/DonutChart.js +1 -1
  10. package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +1 -1
  11. package/dist/components/charts/FunnelChart/FunnelChart.js +2 -2
  12. package/dist/components/charts/shared/ChartLegend/ChartLegend.types.d.ts +13 -1
  13. package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +1 -1
  14. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.types.d.ts +13 -2
  15. package/dist/components/core/Accordion/AccordionItem.js +1 -1
  16. package/dist/components/core/Accordion/AccordionTrigger.js +1 -1
  17. package/dist/components/core/Alert/Alert.animations.d.ts +11 -0
  18. package/dist/components/core/Alert/Alert.animations.js +44 -0
  19. package/dist/components/core/Alert/Alert.js +16 -3
  20. package/dist/components/core/Avatar/Avatar.js +12 -7
  21. package/dist/components/core/Avatar/Avatar.theme.d.ts +4 -6
  22. package/dist/components/core/Avatar/Avatar.theme.js +22 -12
  23. package/dist/components/core/Avatar/Avatar.types.d.ts +9 -0
  24. package/dist/components/core/AvatarGroup/AvatarGroup.animations.js +2 -2
  25. package/dist/components/core/AvatarGroup/AvatarGroup.js +1 -2
  26. package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +1 -1
  27. package/dist/components/core/Badge/Badge.animations.js +1 -1
  28. package/dist/components/core/Badge/Badge.js +26 -50
  29. package/dist/components/core/Badge/Badge.theme.js +49 -63
  30. package/dist/components/core/Badge/Badge.types.d.ts +6 -30
  31. package/dist/components/core/Button/Button.js +2 -2
  32. package/dist/components/core/Button/Button.ripple.js +1 -1
  33. package/dist/components/core/Button/Button.theme.d.ts +1 -1
  34. package/dist/components/core/Button/Button.theme.js +5 -5
  35. package/dist/components/core/Button/Button.types.d.ts +1 -1
  36. package/dist/components/core/ButtonGroup/ButtonGroup.theme.js +6 -6
  37. package/dist/components/core/ButtonGroup/ButtonGroupText.js +1 -3
  38. package/dist/components/core/Calendar/Calendar.js +29 -3
  39. package/dist/components/core/Calendar/Calendar.theme.js +11 -7
  40. package/dist/components/core/Calendar/Calendar.types.d.ts +3 -0
  41. package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +2 -2
  42. package/dist/components/core/Carousel/CarouselBody.js +0 -1
  43. package/dist/components/core/CommandPalette/CommandItem.js +1 -1
  44. package/dist/components/core/CommandPalette/CommandPalette.js +6 -4
  45. package/dist/components/core/CommandPalette/CommandPalette.theme.js +1 -0
  46. package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +6 -0
  47. package/dist/components/core/ContextMenu/ContextMenu.js +5 -4
  48. package/dist/components/core/ContextMenu/ContextMenuTrigger.js +5 -6
  49. package/dist/components/core/Drawer/Drawer.d.ts +1 -1
  50. package/dist/components/core/Drawer/Drawer.js +25 -2
  51. package/dist/components/core/Drawer/Drawer.theme.js +2 -2
  52. package/dist/components/core/Drawer/Drawer.types.d.ts +6 -0
  53. package/dist/components/core/Drawer/DrawerHeader.js +1 -1
  54. package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
  55. package/dist/components/core/Dropdown/Dropdown.js +5 -1
  56. package/dist/components/core/Dropdown/Dropdown.types.d.ts +1 -0
  57. package/dist/components/core/Dropdown/DropdownItem.js +1 -1
  58. package/dist/components/core/Dropdown/DropdownMenu.js +4 -4
  59. package/dist/components/core/Dropdown/DropdownSection.js +1 -1
  60. package/dist/components/core/Dropdown/DropdownSeparator.js +1 -1
  61. package/dist/components/core/Dropdown/DropdownTrigger.d.ts +6 -1
  62. package/dist/components/core/Dropdown/DropdownTrigger.js +10 -8
  63. package/dist/components/core/Kbd/Kbd.theme.js +3 -3
  64. package/dist/components/core/Link/Link.js +4 -2
  65. package/dist/components/core/Message/Message.d.ts +9 -0
  66. package/dist/components/core/Message/Message.js +44 -3
  67. package/dist/components/core/Message/Message.theme.js +22 -0
  68. package/dist/components/core/Message/Message.types.d.ts +115 -0
  69. package/dist/components/core/Message/MessageAudio.d.ts +8 -0
  70. package/dist/components/core/Message/MessageAudio.js +11 -0
  71. package/dist/components/core/Message/MessageContext.d.ts +3 -1
  72. package/dist/components/core/Message/MessageDateDivider.d.ts +6 -0
  73. package/dist/components/core/Message/MessageDateDivider.js +10 -0
  74. package/dist/components/core/Message/MessageFile.d.ts +9 -0
  75. package/dist/components/core/Message/MessageFile.js +15 -0
  76. package/dist/components/core/Message/MessageImage.d.ts +11 -0
  77. package/dist/components/core/Message/MessageImage.js +13 -0
  78. package/dist/components/core/Message/MessageLink.d.ts +10 -0
  79. package/dist/components/core/Message/MessageLink.js +15 -0
  80. package/dist/components/core/Message/MessageReactions.d.ts +8 -0
  81. package/dist/components/core/Message/MessageReactions.js +12 -0
  82. package/dist/components/core/Message/MessageReply.d.ts +8 -0
  83. package/dist/components/core/Message/MessageReply.js +10 -0
  84. package/dist/components/core/Message/MessageSenderName.d.ts +6 -0
  85. package/dist/components/core/Message/MessageSenderName.js +10 -0
  86. package/dist/components/core/Message/MessageStatusIndicator.d.ts +9 -0
  87. package/dist/components/core/Message/MessageStatusIndicator.js +45 -0
  88. package/dist/components/core/Message/index.d.ts +19 -1
  89. package/dist/components/core/Modal/Modal.animations.d.ts +1 -0
  90. package/dist/components/core/Modal/Modal.animations.js +14 -11
  91. package/dist/components/core/Modal/ModalHeader.js +1 -1
  92. package/dist/components/core/NavItem/NavItem.js +100 -52
  93. package/dist/components/core/NavItem/NavItem.theme.js +6 -3
  94. package/dist/components/core/NavItem/NavItem.types.d.ts +44 -30
  95. package/dist/components/core/NavItem/index.d.ts +1 -1
  96. package/dist/components/core/Pagination/Pagination.theme.js +1 -1
  97. package/dist/components/core/Pill/Pill.theme.js +1 -1
  98. package/dist/components/core/Popover/Popover.d.ts +1 -1
  99. package/dist/components/core/Popover/PopoverBody.js +2 -2
  100. package/dist/components/core/Popover/PopoverTrigger.d.ts +1 -1
  101. package/dist/components/core/Popover/PopoverTrigger.js +11 -11
  102. package/dist/components/core/Progress/Progress.d.ts +9 -8
  103. package/dist/components/core/Progress/Progress.js +16 -16
  104. package/dist/components/core/Progress/Progress.theme.js +5 -16
  105. package/dist/components/core/Progress/Progress.types.d.ts +2 -20
  106. package/dist/components/core/Progress/index.d.ts +1 -1
  107. package/dist/components/core/ScrollArea/ScrollArea.js +49 -7
  108. package/dist/components/core/ScrollArea/ScrollArea.types.d.ts +12 -3
  109. package/dist/components/core/ScrollArea/index.d.ts +1 -1
  110. package/dist/components/core/Segmented/SegmentedItem.js +1 -1
  111. package/dist/components/core/Sidebar/Sidebar.d.ts +11 -1
  112. package/dist/components/core/Sidebar/Sidebar.js +51 -17
  113. package/dist/components/core/Sidebar/Sidebar.theme.js +9 -7
  114. package/dist/components/core/Sidebar/Sidebar.types.d.ts +57 -0
  115. package/dist/components/core/Sidebar/SidebarContent.js +3 -1
  116. package/dist/components/core/Sidebar/SidebarContext.d.ts +14 -0
  117. package/dist/components/core/Sidebar/SidebarContext.js +63 -11
  118. package/dist/components/core/Sidebar/SidebarFooter.js +3 -1
  119. package/dist/components/core/Sidebar/SidebarHeader.js +6 -2
  120. package/dist/components/core/Sidebar/SidebarMobileTrigger.d.ts +3 -0
  121. package/dist/components/core/Sidebar/SidebarMobileTrigger.js +29 -0
  122. package/dist/components/core/Sidebar/SidebarNav.js +3 -2
  123. package/dist/components/core/Sidebar/SidebarNavGroup.js +4 -2
  124. package/dist/components/core/Sidebar/SidebarToggle.js +2 -1
  125. package/dist/components/core/Sidebar/SidebarUserProfile.d.ts +3 -0
  126. package/dist/components/core/Sidebar/SidebarUserProfile.js +35 -0
  127. package/dist/components/core/Sidebar/index.d.ts +3 -1
  128. package/dist/components/core/SocialIcon/SocialIcon.js +1 -1
  129. package/dist/components/core/Sortable/Sortable.js +2 -2
  130. package/dist/components/core/Sortable/Sortable.theme.js +1 -1
  131. package/dist/components/core/Sortable/Sortable.types.d.ts +7 -5
  132. package/dist/components/core/Tabs/Tabs.theme.d.ts +1 -1
  133. package/dist/components/core/Tabs/Tabs.theme.js +3 -3
  134. package/dist/components/core/Tabs/TabsBody.js +1 -1
  135. package/dist/components/core/Tabs/TabsTrigger.js +1 -1
  136. package/dist/components/core/Tag/Tag.js +2 -2
  137. package/dist/components/core/Toast/Toast.d.ts +2 -2
  138. package/dist/components/core/Toast/Toast.js +30 -21
  139. package/dist/components/core/Toast/Toast.theme.js +4 -9
  140. package/dist/components/core/Toast/Toast.types.d.ts +4 -21
  141. package/dist/components/core/Toast/index.d.ts +1 -1
  142. package/dist/components/core/Tooltip/Tooltip.js +1 -1
  143. package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
  144. package/dist/components/core/index.js +11 -0
  145. package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +2 -2
  146. package/dist/components/data-display/GanttChart/GanttToolbar.js +1 -1
  147. package/dist/components/data-display/Table/Table.types.d.ts +8 -8
  148. package/dist/components/effects/CustomCursor/CustomCursor.js +2 -2
  149. package/dist/components/effects/GlassSurface/GlassSurface.d.ts +1 -1
  150. package/dist/components/effects/GlassSurface/GlassSurface.js +12 -4
  151. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.d.ts +39 -0
  152. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.js +98 -0
  153. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.d.ts +3 -0
  154. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +104 -0
  155. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.types.d.ts +30 -0
  156. package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.d.ts +3 -0
  157. package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +36 -0
  158. package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.d.ts +3 -0
  159. package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +36 -0
  160. package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.d.ts +3 -0
  161. package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +37 -0
  162. package/dist/components/effects/InteractiveCharacters/hooks/useBlink.d.ts +14 -0
  163. package/dist/components/effects/InteractiveCharacters/hooks/useBlink.js +41 -0
  164. package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.d.ts +25 -0
  165. package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.js +84 -0
  166. package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.d.ts +18 -0
  167. package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.js +35 -0
  168. package/dist/components/effects/InteractiveCharacters/index.d.ts +2 -0
  169. package/dist/components/effects/MorphingText/MorphingText.d.ts +1 -1
  170. package/dist/components/effects/MorphingText/MorphingText.js +6 -5
  171. package/dist/components/effects/Neumorphic/InsetCircleButton.d.ts +9 -0
  172. package/dist/components/effects/Neumorphic/InsetCircleButton.js +10 -0
  173. package/dist/components/effects/Neumorphic/InsetPill.d.ts +7 -0
  174. package/dist/components/effects/Neumorphic/InsetPill.js +7 -0
  175. package/dist/components/effects/Neumorphic/index.d.ts +4 -0
  176. package/dist/components/effects/NoiseOverlay/NoiseOverlay.d.ts +1 -1
  177. package/dist/components/effects/NoiseOverlay/NoiseOverlay.js +4 -4
  178. package/dist/components/effects/Overlay/Overlay.js +6 -4
  179. package/dist/components/effects/PageTransition/PageTransition.animations.d.ts +8 -0
  180. package/dist/components/effects/PageTransition/PageTransition.animations.js +53 -0
  181. package/dist/components/effects/PageTransition/PageTransition.d.ts +3 -0
  182. package/dist/components/effects/PageTransition/PageTransition.js +71 -0
  183. package/dist/components/effects/PageTransition/PageTransition.types.d.ts +15 -0
  184. package/dist/components/effects/PageTransition/index.d.ts +2 -0
  185. package/dist/components/effects/index.d.ts +6 -0
  186. package/dist/components/effects/index.js +4 -0
  187. package/dist/components/forms/Checkbox/Checkbox.animations.d.ts +14 -0
  188. package/dist/components/forms/Checkbox/Checkbox.animations.js +53 -0
  189. package/dist/components/forms/Checkbox/Checkbox.js +4 -2
  190. package/dist/components/forms/Checkbox/Checkbox.theme.js +3 -3
  191. package/dist/components/forms/ColorPicker/ColorPicker.types.d.ts +1 -1
  192. package/dist/components/forms/ColorPicker/ColorPickerBody.js +3 -3
  193. package/dist/components/forms/Combobox/Combobox.js +5 -3
  194. package/dist/components/forms/DatePicker/DatePickerBody.js +1 -1
  195. package/dist/components/forms/DateRangePicker/DateRangePicker.animations.d.ts +1 -0
  196. package/dist/components/forms/DateRangePicker/DateRangePicker.d.ts +37 -0
  197. package/dist/components/forms/DateRangePicker/DateRangePicker.js +110 -0
  198. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.d.ts +5 -0
  199. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +52 -0
  200. package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +154 -0
  201. package/dist/components/forms/DateRangePicker/DateRangePickerBody.d.ts +6 -0
  202. package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +208 -0
  203. package/dist/components/forms/DateRangePicker/DateRangePickerPresets.d.ts +6 -0
  204. package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +41 -0
  205. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.d.ts +6 -0
  206. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +32 -0
  207. package/dist/components/forms/DateRangePicker/dateRangePresets.d.ts +5 -0
  208. package/dist/components/forms/DateRangePicker/dateRangePresets.js +59 -0
  209. package/dist/components/forms/DateRangePicker/index.d.ts +4 -0
  210. package/dist/components/forms/FileUpload/FileUploadProgress.animations.d.ts +36 -0
  211. package/dist/components/forms/FileUpload/FileUploadProgress.animations.js +22 -0
  212. package/dist/components/forms/FileUpload/FileUploadProgress.d.ts +3 -0
  213. package/dist/components/forms/FileUpload/FileUploadProgress.js +111 -0
  214. package/dist/components/forms/FileUpload/FileUploadProgress.theme.d.ts +19 -0
  215. package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +27 -0
  216. package/dist/components/forms/FileUpload/FileUploadProgress.types.d.ts +33 -0
  217. package/dist/components/forms/FileUpload/index.d.ts +3 -0
  218. package/dist/components/forms/Input/Input.js +8 -13
  219. package/dist/components/forms/Input/Input.types.d.ts +6 -0
  220. package/dist/components/forms/InputAddress/InputAddress.theme.js +1 -1
  221. package/dist/components/forms/InputCounter/InputCounter.js +1 -1
  222. package/dist/components/forms/InputCreditCard/InputCreditCard.theme.js +1 -1
  223. package/dist/components/forms/InputOTP/InputOTP.theme.js +1 -1
  224. package/dist/components/forms/Radio/Radio.animations.d.ts +10 -0
  225. package/dist/components/forms/Radio/Radio.animations.js +33 -0
  226. package/dist/components/forms/Radio/Radio.js +11 -2
  227. package/dist/components/forms/Radio/Radio.theme.js +3 -3
  228. package/dist/components/forms/RichTextEditor/RichTextEditor.js +23 -14
  229. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +2 -2
  230. package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +11 -0
  231. package/dist/components/forms/Select/Select.d.ts +1 -1
  232. package/dist/components/forms/Select/Select.js +7 -7
  233. package/dist/components/forms/Select/Select.types.d.ts +3 -3
  234. package/dist/components/forms/SelectableCard/SelectableCard.js +1 -1
  235. package/dist/components/forms/Slider/Slider.theme.js +1 -1
  236. package/dist/components/forms/Switch/Switch.theme.js +3 -3
  237. package/dist/components/forms/forms.theme.js +1 -1
  238. package/dist/components/forms/index.d.ts +6 -0
  239. package/dist/components/forms/index.js +8 -0
  240. package/dist/hooks/index.d.ts +1 -0
  241. package/dist/hooks/useMediaQuery.d.ts +5 -0
  242. package/dist/hooks/useMediaQuery.js +21 -0
  243. package/dist/index.js +23 -0
  244. package/dist/styles.css +1 -1
  245. package/dist/utils/dateUtils.js +56 -5
  246. package/dist/utils/formatUtils.d.ts +10 -0
  247. package/dist/utils/formatUtils.js +24 -0
  248. package/dist/utils/index.d.ts +1 -1
  249. package/package.json +12 -4
  250. package/src/global.scss +320 -39
  251. package/src/styles/theme.css +151 -62
  252. package/src/theme-plugin.css +13 -0
  253. package/dist/components/ai/ApprovalCard/ApprovalCard.d.ts +0 -3
  254. package/dist/components/ai/ApprovalCard/ApprovalCard.js +0 -16
  255. package/dist/components/ai/ApprovalCard/ApprovalCard.theme.d.ts +0 -13
  256. package/dist/components/ai/ApprovalCard/ApprovalCard.theme.js +0 -15
  257. package/dist/components/ai/ApprovalCard/ApprovalCard.types.d.ts +0 -43
  258. package/dist/components/ai/ApprovalCard/index.d.ts +0 -2
  259. package/dist/components/ai/MessageHistory/MessageHistory.d.ts +0 -18
  260. package/dist/components/ai/MessageHistory/MessageHistory.js +0 -98
  261. package/dist/components/ai/MessageHistory/MessageHistory.theme.d.ts +0 -2
  262. package/dist/components/ai/MessageHistory/MessageHistory.theme.js +0 -8
  263. package/dist/components/ai/MessageHistory/MessageHistory.types.d.ts +0 -94
  264. package/dist/components/ai/MessageHistory/index.d.ts +0 -3
  265. package/dist/icons/Icon.d.ts +0 -24
  266. package/dist/icons/Icon.js +0 -30
  267. package/dist/icons/Index.d.ts +0 -16
  268. package/dist/icons/core/ChevronUpDown.d.ts +0 -1
  269. package/dist/icons/core/ChevronUpDown.js +0 -7
  270. package/dist/icons/core/DollarIcon.d.ts +0 -1
  271. package/dist/icons/core/DollarIcon.js +0 -5
  272. package/dist/icons/core/LockIcon.d.ts +0 -1
  273. package/dist/icons/core/LockIcon.js +0 -5
  274. package/dist/icons/core/MinusIcon.d.ts +0 -1
  275. package/dist/icons/core/MinusIcon.js +0 -7
  276. package/dist/icons/core/PlusIcon.d.ts +0 -1
  277. package/dist/icons/core/PlusIcon.js +0 -7
  278. package/dist/icons/core/SearchIcon.d.ts +0 -1
  279. package/dist/icons/core/SearchIcon.js +0 -7
  280. package/dist/icons/core/TickIcon.d.ts +0 -1
  281. package/dist/icons/core/TickIcon.js +0 -5
  282. package/dist/icons/core/User.d.ts +0 -1
  283. package/dist/utils/useClickOutside.d.ts +0 -1
@@ -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(MinusIcon, { className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center opacity-100 stroke-neutral-600 transition-opacity duration-200", size === "sm" ? "size-3" : "size-4"), strokeWidth: 3 })), isChecked && !indeterminate && (jsx(CheckIcon, { className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center opacity-100 stroke-white transition-opacity duration-200", size === "sm" ? "size-3" : "size-4"), strokeWidth: 3 }))] }), (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))] }))] }));
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-secondary)] " +
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-700)] dark:disabled:border-[var(--color-neutral-600)] " +
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)]/80 -mt-0.5 mb-1",
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: string;
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: 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 props to avoid type conflicts with Framer Motion
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 dropdownStyle = theme.dropdownStyle ||
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 Combobox = React__default.forwardRef(ComboboxInner);
400
- Combobox.displayName = "Combobox";
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)] dark:border-[var(--color-neutral-700)]", children: [jsx("div", { className: "text-base text-[var(--color-text-secondary)] dark:text-[var(--color-neutral-400)]", 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" })] })] })] })) : (
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,5 @@
1
+ import { DateRangePickerTheme } from "./DateRangePicker.types";
2
+ /**
3
+ * DateRangePicker theme — mirrors DatePicker theme with added checkmark style
4
+ */
5
+ export declare const dateRangePickerTheme: DateRangePickerTheme;
@@ -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
+ }
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import { DateRangePickerBodyProps } from "./DateRangePicker.types";
3
+ /**
4
+ * DateRangePicker Body Component — dual calendars + presets sidebar + footer
5
+ */
6
+ export declare const DateRangePickerBody: React.FC<DateRangePickerBodyProps>;