@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,5 +1,5 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { createContext, useContext, useState, useCallback, useMemo } from 'react';
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';
3
3
 
4
4
  const SidebarContext = createContext(null);
5
5
  const useSidebarContext = () => {
@@ -7,32 +7,84 @@ const useSidebarContext = () => {
7
7
  // Return null if not in sidebar context (allows NavItem to work elsewhere)
8
8
  return context;
9
9
  };
10
- const SidebarProvider = ({ children, defaultCollapsed = false, collapsed: controlledCollapsed, onCollapsedChange, width = {}, side = 'left', variant = 'sidebar', }) => {
10
+ const AccordionNavContext = createContext(null);
11
+ const useAccordionNavContext = () => useContext(AccordionNavContext);
12
+ const AccordionNavProvider = ({ children, accordion = false }) => {
13
+ const [openId, setOpenId] = useState(null);
14
+ const register = useCallback((id) => {
15
+ setOpenId(id);
16
+ }, []);
17
+ const unregister = useCallback((id) => {
18
+ setOpenId(prev => (prev === id ? null : prev));
19
+ }, []);
20
+ const value = useMemo(() => ({ openId, register, unregister }), [openId, register, unregister]);
21
+ if (!accordion)
22
+ return jsx(Fragment, { children: children });
23
+ return (jsx(AccordionNavContext.Provider, { value: value, children: children }));
24
+ };
25
+ const SidebarProvider = ({ children, defaultCollapsed = false, collapsed: controlledCollapsed, onCollapsedChange, mobileBreakpoint = 1024, mobileOpen: controlledMobileOpen, onMobileOpenChange, width = {}, side = 'left', variant = 'sidebar', }) => {
11
26
  const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);
12
- // Determine if component is controlled
13
- const isControlled = controlledCollapsed !== undefined;
14
- const collapsed = isControlled ? controlledCollapsed : internalCollapsed;
27
+ const [internalMobileOpen, setInternalMobileOpen] = useState(false);
28
+ const [isMobile, setIsMobile] = useState(false);
29
+ // Detect mobile breakpoint
30
+ useEffect(() => {
31
+ if (typeof window === 'undefined')
32
+ return;
33
+ const mql = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
34
+ const handler = (e) => {
35
+ setIsMobile(e.matches);
36
+ if (!e.matches) {
37
+ setInternalMobileOpen(false);
38
+ onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false);
39
+ }
40
+ };
41
+ handler(mql);
42
+ mql.addEventListener('change', handler);
43
+ return () => mql.removeEventListener('change', handler);
44
+ }, [mobileBreakpoint, onMobileOpenChange]);
45
+ // Collapsed state
46
+ const isCollapsedControlled = controlledCollapsed !== undefined;
47
+ const collapsed = isCollapsedControlled ? controlledCollapsed : internalCollapsed;
15
48
  const setCollapsed = useCallback((newCollapsed) => {
16
- if (!isControlled) {
49
+ if (!isCollapsedControlled) {
17
50
  setInternalCollapsed(newCollapsed);
18
51
  }
19
52
  onCollapsedChange === null || onCollapsedChange === void 0 ? void 0 : onCollapsedChange(newCollapsed);
20
- }, [isControlled, onCollapsedChange]);
53
+ }, [isCollapsedControlled, onCollapsedChange]);
21
54
  const toggleCollapsed = useCallback(() => {
22
55
  setCollapsed(!collapsed);
23
56
  }, [collapsed, setCollapsed]);
57
+ // Mobile open state
58
+ const isMobileOpenControlled = controlledMobileOpen !== undefined;
59
+ const isMobileOpen = isMobileOpenControlled ? controlledMobileOpen : internalMobileOpen;
60
+ const setMobileOpen = useCallback((open) => {
61
+ if (!isMobileOpenControlled) {
62
+ setInternalMobileOpen(open);
63
+ }
64
+ onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(open);
65
+ }, [isMobileOpenControlled, onMobileOpenChange]);
66
+ // Lock body scroll when mobile overlay is open
67
+ useEffect(() => {
68
+ if (isMobile && isMobileOpen) {
69
+ document.body.style.overflow = 'hidden';
70
+ return () => { document.body.style.overflow = ''; };
71
+ }
72
+ }, [isMobile, isMobileOpen]);
24
73
  const contextValue = useMemo(() => ({
25
74
  collapsed,
26
75
  setCollapsed,
27
76
  toggleCollapsed,
28
77
  width: {
29
78
  expanded: width.expanded || 280,
30
- collapsed: width.collapsed || 80,
79
+ collapsed: width.collapsed || 64,
31
80
  },
32
81
  side,
33
82
  variant,
34
- }), [collapsed, setCollapsed, toggleCollapsed, width.expanded, width.collapsed, side, variant]);
83
+ isMobileOpen,
84
+ setMobileOpen,
85
+ isMobile,
86
+ }), [collapsed, setCollapsed, toggleCollapsed, width.expanded, width.collapsed, side, variant, isMobileOpen, setMobileOpen, isMobile]);
35
87
  return (jsx(SidebarContext.Provider, { value: contextValue, children: children }));
36
88
  };
37
89
 
38
- export { SidebarProvider, useSidebarContext };
90
+ export { AccordionNavProvider, SidebarProvider, useAccordionNavContext, useSidebarContext };
@@ -6,7 +6,9 @@ import { useSidebarContext } from './SidebarContext.js';
6
6
  const SidebarFooter = React__default.forwardRef(({ children, className, ...props }, ref) => {
7
7
  const sidebarContext = useSidebarContext();
8
8
  const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
9
- return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-t border-[var(--color-border)] bg-[var(--color-background)] transition-all duration-200", collapsed ? "p-2 flex justify-center" : "p-4", className), ...props, children: children }));
9
+ const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
10
+ const isCollapsedView = collapsed && !isMobile;
11
+ return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-t border-[var(--color-border)] transition-all duration-200", isCollapsedView ? "p-2 flex justify-center" : "p-4", className), ...props, children: children }));
10
12
  });
11
13
  SidebarFooter.displayName = "SidebarFooter";
12
14
 
@@ -1,17 +1,21 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
+ import { XMarkIcon } from '@heroicons/react/24/outline';
3
4
  import { cn } from '../../../utils/cn.js';
4
5
  import { useSidebarContext } from './SidebarContext.js';
5
6
  import { SidebarToggle } from './SidebarToggle.js';
7
+ import { Button } from '../Button/Button.js';
6
8
 
7
9
  const SidebarHeader = React__default.forwardRef(({ logo, showToggle = true, customToggle, children, className, ...props }, ref) => {
8
10
  const sidebarContext = useSidebarContext();
9
11
  const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
12
+ const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
13
+ const isMobileOpen = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobileOpen) || false;
10
14
  // If children are provided, use them instead of default layout
11
15
  if (children) {
12
- return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-b border-gray-200 bg-white", className), ...props, children: children }));
16
+ return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-b border-[var(--color-border)]", className), ...props, children: children }));
13
17
  }
14
- return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between flex-shrink-0 h-16 border-b border-[var(--color-border)] bg-[var(--color-background)] transition-all duration-200", collapsed ? "px-3" : "px-4", className), ...props, children: [jsx("div", { className: cn("flex items-center min-w-0 transition-all duration-200", collapsed ? "flex-shrink-0" : "flex-1"), children: logo }), showToggle && (jsx("div", { className: "flex-shrink-0", children: customToggle || jsx(SidebarToggle, {}) }))] }));
18
+ return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between flex-shrink-0 h-16 border-b border-[var(--color-border)] transition-all duration-200", collapsed && !isMobile ? "px-3" : "px-4", className), ...props, children: [jsx("div", { className: cn("flex items-center min-w-0 transition-all duration-200", collapsed && !isMobile ? "flex-shrink-0" : "flex-1"), children: logo }), isMobile && isMobileOpen && (jsx(Button, { variant: "soft", size: "sm", className: "size-8 p-0", onClick: () => sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.setMobileOpen(false), "aria-label": "Close navigation", children: jsx(XMarkIcon, { className: "size-5" }) })), !isMobile && showToggle && (jsx("div", { className: "flex-shrink-0", children: customToggle || jsx(SidebarToggle, {}) }))] }));
15
19
  });
16
20
  SidebarHeader.displayName = "SidebarHeader";
17
21
 
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import { SidebarMobileTriggerProps } from "./Sidebar.types";
3
+ export declare const SidebarMobileTrigger: React.ForwardRefExoticComponent<SidebarMobileTriggerProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,29 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import React__default from 'react';
3
+ import { Bars3Icon } from '@heroicons/react/24/outline';
4
+ import { cn } from '../../../utils/cn.js';
5
+ import { useSidebarContext } from './SidebarContext.js';
6
+ import { Button } from '../Button/Button.js';
7
+
8
+ const SidebarMobileTrigger = React__default.forwardRef(({ icon, className, onClick, ...props }, ref) => {
9
+ const sidebarContext = useSidebarContext();
10
+ if (!sidebarContext) {
11
+ if (process.env.NODE_ENV !== "production") {
12
+ console.warn("SidebarMobileTrigger must be used within a Sidebar component");
13
+ }
14
+ return null;
15
+ }
16
+ const { isMobile, setMobileOpen } = sidebarContext;
17
+ // Only render on mobile
18
+ if (!isMobile)
19
+ return null;
20
+ const handleClick = (e) => {
21
+ setMobileOpen(true);
22
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
23
+ };
24
+ const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, color: _color, ...buttonProps } = props;
25
+ return (jsx(Button, { ref: ref, variant: "soft", size: "sm", className: cn("size-9 p-0", className), onClick: handleClick, "aria-label": "Open navigation menu", ...buttonProps, children: icon || jsx(Bars3Icon, { className: "size-5" }) }));
26
+ });
27
+ SidebarMobileTrigger.displayName = "SidebarMobileTrigger";
28
+
29
+ export { SidebarMobileTrigger };
@@ -1,9 +1,10 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
3
  import { cn } from '../../../utils/cn.js';
4
+ import { AccordionNavProvider } from './SidebarContext.js';
4
5
 
5
- const SidebarNav = React__default.forwardRef(({ children, className, ...props }, ref) => {
6
- return (jsx("nav", { ref: ref, className: cn('flex-1 space-y-1 p-4', className), role: "navigation", ...props, children: children }));
6
+ const SidebarNav = React__default.forwardRef(({ accordion = false, children, className, ...props }, ref) => {
7
+ return (jsx("nav", { ref: ref, className: cn('flex-1 space-y-1 p-4', className), role: "navigation", ...props, children: jsx(AccordionNavProvider, { accordion: accordion, children: children }) }));
7
8
  });
8
9
  SidebarNav.displayName = 'SidebarNav';
9
10
 
@@ -6,8 +6,10 @@ import { useSidebarContext } from './SidebarContext.js';
6
6
  const SidebarNavGroup = React__default.forwardRef(({ title, showTitleWhenCollapsed = false, children, className, ...props }, ref) => {
7
7
  const sidebarContext = useSidebarContext();
8
8
  const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
9
- const showTitle = title && (!collapsed || showTitleWhenCollapsed);
10
- return (jsxs("div", { ref: ref, className: cn("space-y-1", className), ...props, children: [showTitle && (jsx("div", { className: "px-2 py-2", children: jsx("h3", { className: "text-sm font-semibold text-[var(--color-text-muted)] uppercase tracking-wider", children: title }) })), collapsed && !showTitleWhenCollapsed && (jsx("div", { className: "h-px bg-[var(--color-border)] mx-2 my-2" })), jsx("div", { className: "space-y-1", children: children })] }));
9
+ const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
10
+ const isCollapsedView = collapsed && !isMobile;
11
+ const showTitle = title && (!isCollapsedView || showTitleWhenCollapsed);
12
+ return (jsxs("div", { ref: ref, className: cn("space-y-1", className), ...props, children: [showTitle && (jsx("div", { className: "px-2 py-2", children: jsx("h3", { className: "text-sm font-semibold text-[var(--color-text-muted)] uppercase tracking-wider", children: title }) })), isCollapsedView && !showTitleWhenCollapsed && (jsx("div", { className: "h-px bg-[var(--color-border)] mx-2 my-2" })), jsx("div", { className: "space-y-1", children: children })] }));
11
13
  });
12
14
  SidebarNavGroup.displayName = "SidebarNavGroup";
13
15
 
@@ -19,7 +19,8 @@ const SidebarToggle = React__default.forwardRef(({ expandIcon, collapseIcon, cla
19
19
  toggleCollapsed();
20
20
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
21
21
  };
22
- return (jsx(Button, { ref: ref, variant: "ghost", size: "sm", className: cn("size-8 p-0", className), onClick: handleClick, "aria-label": collapsed ? "Expand sidebar" : "Collapse sidebar", title: collapsed ? "Expand sidebar" : "Collapse sidebar", ...props, children: jsx(motion.div, { initial: false, animate: { rotate: collapsed ? 180 : 0 }, transition: { duration: 0.2 }, children: collapsed
22
+ const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, color: _color, ...buttonProps } = props;
23
+ return (jsx(Button, { ref: ref, variant: "soft", size: "sm", className: cn("size-8 p-0", className), onClick: handleClick, "aria-label": collapsed ? "Expand sidebar" : "Collapse sidebar", title: collapsed ? "Expand sidebar" : "Collapse sidebar", ...buttonProps, children: jsx(motion.div, { initial: false, animate: { rotate: collapsed ? 180 : 0 }, transition: { duration: 0.2 }, children: collapsed
23
24
  ? expandIcon || jsx(ChevronRightIcon, { className: "size-4" })
24
25
  : collapseIcon || jsx(ChevronLeftIcon, { className: "size-4" }) }) }));
25
26
  });
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import { SidebarUserProfileProps } from "./Sidebar.types";
3
+ export declare const SidebarUserProfile: React.ForwardRefExoticComponent<SidebarUserProfileProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,35 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import React__default from 'react';
3
+ import { cn } from '../../../utils/cn.js';
4
+ import { useSidebarContext } from './SidebarContext.js';
5
+ import { Avatar } from '../Avatar/Avatar.js';
6
+ import { Tooltip } from '../Tooltip/Tooltip.js';
7
+ import '../Tooltip/Tooltip.animations.js';
8
+
9
+ const statusColors = {
10
+ online: "bg-[var(--color-success)]",
11
+ offline: "bg-[var(--color-background-quaternary)]",
12
+ away: "bg-[var(--color-warning)]",
13
+ busy: "bg-[var(--color-danger)]",
14
+ };
15
+ const SidebarUserProfile = React__default.forwardRef(({ name, email, avatar, status, dropdownContent, className, onClick, ...props }, ref) => {
16
+ const sidebarContext = useSidebarContext();
17
+ const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
18
+ const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
19
+ const isCollapsedView = collapsed && !isMobile;
20
+ const avatarElement = (jsxs("div", { className: "relative flex-shrink-0", children: [jsx(Avatar, { src: avatar, name: name, size: "sm" }), status && (jsx("span", { className: cn("absolute -bottom-0.5 -right-0.5 size-3 rounded-full ring-2 ring-[var(--color-background)]", statusColors[status]), "aria-label": `Status: ${status}` }))] }));
21
+ const content = (jsxs("div", { ref: ref, className: cn("flex items-center gap-3 rounded-[var(--radius-base)] cursor-pointer transition-colors duration-150 hover:bg-[var(--color-background-secondary)]", isCollapsedView ? "justify-center p-2" : "px-3 py-2", className), role: "button", tabIndex: 0, onClick: onClick, onKeyDown: (e) => {
22
+ if ((e.key === "Enter" || e.key === " ") && onClick) {
23
+ e.preventDefault();
24
+ e.currentTarget.click();
25
+ }
26
+ }, ...props, children: [avatarElement, !isCollapsedView && (jsxs("div", { className: "flex-1 min-w-0", children: [jsx("div", { className: "text-sm font-medium text-[var(--color-text-primary)] truncate", children: name }), email && (jsx("div", { className: "text-xs text-[var(--color-text-muted)] truncate", children: email }))] }))] }));
27
+ // Tooltip when collapsed
28
+ if (isCollapsedView) {
29
+ return (jsx(Tooltip, { content: name, placement: "right", children: content }));
30
+ }
31
+ return content;
32
+ });
33
+ SidebarUserProfile.displayName = "SidebarUserProfile";
34
+
35
+ export { SidebarUserProfile };
@@ -6,5 +6,7 @@ export { SidebarNav } from "./SidebarNav";
6
6
  export { SidebarNavGroup } from "./SidebarNavGroup";
7
7
  export { SidebarSubmenu } from "./SidebarSubmenu";
8
8
  export { SidebarToggle } from "./SidebarToggle";
9
+ export { SidebarMobileTrigger } from "./SidebarMobileTrigger";
10
+ export { SidebarUserProfile } from "./SidebarUserProfile";
9
11
  export { useSidebarContext } from "./SidebarContext";
10
- export type { SidebarProps, SidebarHeaderProps, SidebarContentProps, SidebarFooterProps, SidebarNavProps, SidebarNavGroupProps, SidebarToggleProps, SidebarSide, SidebarVariant, SidebarContextValue, SidebarTheme, SidebarThemeOverrides, } from "./Sidebar.types";
12
+ export type { SidebarProps, SidebarHeaderProps, SidebarContentProps, SidebarFooterProps, SidebarNavProps, SidebarNavGroupProps, SidebarToggleProps, SidebarMobileTriggerProps, SidebarUserProfileProps, SidebarUserStatus, SidebarSide, SidebarVariant, SidebarContextValue, SidebarTheme, SidebarThemeOverrides, } from "./Sidebar.types";
@@ -22,7 +22,7 @@ const SocialIcon = React__default.forwardRef(({ icon, size = 'md', colorMode = '
22
22
  const fill = colorMode === 'brand' ? platform.brandColor : 'currentColor';
23
23
  return (jsx("svg", { ref: ref, xmlns: "http://www.w3.org/2000/svg", viewBox: platform.viewBox, width: resolvedSize, height: resolvedSize, fill: fill, role: "img", "aria-label": `${platform.label} icon`, "data-icon": icon, "data-color-mode": colorMode, "data-size": size, className: cn(theme.baseStyle, className), ...props, children: platform.shapes.map((shape, i) => {
24
24
  var _a;
25
- return (jsx("path", { d: shape.d, fill: (_a = shape.fill) !== null && _a !== void 0 ? _a : undefined }, i));
25
+ return (jsx("path", { d: shape.d, fill: colorMode === 'brand' ? ((_a = shape.fill) !== null && _a !== void 0 ? _a : undefined) : undefined }, i));
26
26
  }) }));
27
27
  });
28
28
  SocialIcon.displayName = 'SocialIcon';
@@ -154,7 +154,7 @@ const SortableItem = React__default.forwardRef(({ id, children, className, theme
154
154
  context.setDraggedItemContent(children);
155
155
  const items = Array.from(context.itemRefs.current.entries());
156
156
  const currentIndex = items.findIndex(([itemId]) => itemId === id);
157
- (_a = context.onSortDragStart) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value }, {});
157
+ (_a = context.onSortDragStart) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value });
158
158
  }, [disabled, id, children, context, value]);
159
159
  const handleDragEnd = useCallback(() => {
160
160
  var _a;
@@ -164,7 +164,7 @@ const SortableItem = React__default.forwardRef(({ id, children, className, theme
164
164
  context.setDropPosition(null);
165
165
  const items = Array.from(context.itemRefs.current.entries());
166
166
  const currentIndex = items.findIndex(([itemId]) => itemId === id);
167
- (_a = context.onSortDragEnd) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value }, {});
167
+ (_a = context.onSortDragEnd) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value });
168
168
  }, [id, context, value]);
169
169
  const handlePointerDown = useCallback((event) => {
170
170
  if (disabled) {
@@ -1,7 +1,7 @@
1
1
  const sortableTheme = {
2
2
  containerStyle: "relative list-none",
3
3
  itemStyle: "relative cursor-move select-none relative focus-within:z-10 list-none",
4
- dragHandleStyle: "cursor-grab active:cursor-grabbing p-1 text-gray-400 hover:text-gray-600 flex items-center justify-center rounded transition-colors duration-200",
4
+ dragHandleStyle: "cursor-grab active:cursor-grabbing p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] flex items-center justify-center rounded transition-colors duration-200",
5
5
  };
6
6
 
7
7
  export { sortableTheme };
@@ -1,9 +1,11 @@
1
- import { HTMLAttributes, ReactNode, DragEvent } from 'react';
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
2
  export interface SortableData {
3
3
  id: string;
4
4
  index: number;
5
5
  data?: string | number | Record<string, unknown>;
6
6
  }
7
+ /** Event type for sort drag callbacks - may be a native event, React event, or absent (keyboard-initiated) */
8
+ export type SortableEvent = React.KeyboardEvent<HTMLDivElement> | Event | undefined;
7
9
  export interface SortableTheme {
8
10
  containerStyle: string;
9
11
  itemStyle: string;
@@ -28,9 +30,9 @@ export interface SortableProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onD
28
30
  /** Show drag handles */
29
31
  showDragHandle?: boolean;
30
32
  /** Called when drag starts */
31
- onSortDragStart?: (data: SortableData, event: DragEvent<HTMLDivElement>) => void;
33
+ onSortDragStart?: (data: SortableData, event?: SortableEvent) => void;
32
34
  /** Called when drag ends */
33
- onSortDragEnd?: (data: SortableData, event: DragEvent<HTMLDivElement>) => void;
35
+ onSortDragEnd?: (data: SortableData, event?: SortableEvent) => void;
34
36
  /** Optional array of values for Reorder.Group - auto-extracted from children if not provided */
35
37
  values?: (string | number)[];
36
38
  }
@@ -53,8 +55,8 @@ export interface SortableContextValue {
53
55
  showDragHandle: boolean;
54
56
  theme: SortableTheme;
55
57
  onReorder: (fromIndex: number, toIndex: number) => void;
56
- onSortDragStart?: (data: SortableData, event: DragEvent<HTMLDivElement>) => void;
57
- onSortDragEnd?: (data: SortableData, event: DragEvent<HTMLDivElement>) => void;
58
+ onSortDragStart?: (data: SortableData, event?: SortableEvent) => void;
59
+ onSortDragEnd?: (data: SortableData, event?: SortableEvent) => void;
58
60
  draggedItem: string | null;
59
61
  setDraggedItem: (id: string | null) => void;
60
62
  dropPosition: {
@@ -1,4 +1,4 @@
1
- import { TabsSize } from './Tabs.types';
1
+ import { TabsSize } from "./Tabs.types";
2
2
  /**
3
3
  * Clean theme structure for Tabs components
4
4
  */
@@ -7,11 +7,11 @@ const tabsTheme = {
7
7
  // TabsList styles with proper design tokens
8
8
  listStyle: "relative inline-flex items-center flex-row border-b border-[var(--color-border)] gap-2",
9
9
  // TabsTrigger base styles - no individual borders, underline will be handled separately
10
- triggerStyle: "relative inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-300 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] data-[state=active]:text-[var(--color-primary)]",
10
+ triggerStyle: "relative inline-flex items-center justify-center whitespace-nowrap font-semibold transition-all duration-300 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] data-[state=active]:text-[var(--color-primary)]",
11
11
  // TabsTrigger size variants using CSS variables where applicable
12
12
  triggerSizes: {
13
- sm: "px-2 py-1.5 text-base gap-1",
14
- md: "px-2 py-2 text-base gap-1",
13
+ sm: "px-2 py-1.5 text-base",
14
+ md: "px-2 py-2 text-base",
15
15
  },
16
16
  // TabsBody styles with proper CSS variables
17
17
  bodyStyle: "focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2",
@@ -14,7 +14,7 @@ const TabsBody = React__default.forwardRef(({ value, forceMount = false, childre
14
14
  const shouldReduceMotion = useReducedMotion();
15
15
  // Check if we're in Storybook and should disable animations
16
16
  const isInStorybook = typeof window !== 'undefined' && window.__STORYBOOK_DISABLE_ANIMATIONS__;
17
- const shouldDisableAnimations = !!shouldReduceMotion || isInStorybook;
17
+ const shouldDisableAnimations = !!shouldReduceMotion || !!isInStorybook;
18
18
  const isSelected = value === selectedValue;
19
19
  const shouldRender = forceMount || isSelected;
20
20
  // Compute animation variants without a global cache (HMR-safe)
@@ -14,7 +14,7 @@ const TabsTrigger = React__default.forwardRef(({ value, disabled = false, childr
14
14
  const shouldReduceMotion = useReducedMotion();
15
15
  // Check if we're in Storybook and should disable animations
16
16
  const isInStorybook = typeof window !== 'undefined' && window.__STORYBOOK_DISABLE_ANIMATIONS__;
17
- const shouldDisableAnimations = !!shouldReduceMotion || isInStorybook;
17
+ const shouldDisableAnimations = !!shouldReduceMotion || !!isInStorybook;
18
18
  // Memoize derived state flags for performance
19
19
  const derivedState = useMemo(() => ({
20
20
  isSelected: value === selectedValue,
@@ -47,10 +47,10 @@ const Tag = React__default.forwardRef(({ children, size = "md", removable = true
47
47
  // Avatar takes precedence over startContent
48
48
  const renderLeadingContent = () => {
49
49
  if (avatar) {
50
- return (jsx(Avatar, { src: avatar.src, name: avatar.name, fallback: avatar.fallback, initialsCount: avatar.initialsCount, className: cn(theme.avatarSizes[size], "rounded-full border-0") }));
50
+ return (jsx("span", { className: cn("inline-flex items-center justify-center shrink-0 overflow-hidden rounded-full", theme.avatarSizes[size]), children: jsx(Avatar, { src: avatar.src, name: avatar.name, fallback: avatar.fallback, initialsCount: avatar.initialsCount, size: "xs", className: "!size-full border-0 rounded-full" }) }));
51
51
  }
52
52
  if (startContent) {
53
- return (jsx("span", { className: cn("inline-flex items-center", theme.startContentSizes[size]), children: startContent }));
53
+ return (jsx("span", { className: cn("inline-flex items-center justify-center shrink-0", theme.startContentSizes[size]), children: startContent }));
54
54
  }
55
55
  return null;
56
56
  };
@@ -1,3 +1,3 @@
1
- import React from 'react';
2
- import { ToastProps } from './Toast.types';
1
+ import React from "react";
2
+ import { ToastProps } from "./Toast.types";
3
3
  export declare const Toast: React.ForwardRefExoticComponent<ToastProps & React.RefAttributes<HTMLDivElement>>;
@@ -5,14 +5,18 @@ import { cn } from '../../../utils/cn.js';
5
5
  import { toastTheme } from './Toast.theme.js';
6
6
  import { toastAnimations, getToastStackingAnimation } from './Toast.animations.js';
7
7
  import { ArrowPathIcon, InformationCircleIcon, XMarkIcon } from '@heroicons/react/24/solid';
8
+ import { Button } from '../Button/Button.js';
8
9
 
9
- const Toast = React__default.forwardRef(({ toast, className, theme: customTheme = {}, // Deprecated - kept for backward compatibility
10
- onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouseLeave, onHeightChange, expandedOffset, darkMode = false, ...props }, ref) => {
10
+ const isToastAction = (action) => typeof action === "object" &&
11
+ action !== null &&
12
+ "label" in action &&
13
+ "onClick" in action;
14
+ const Toast = React__default.forwardRef(({ toast, className, onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouseLeave, onHeightChange, expandedOffset, darkMode = false, ...props }, ref) => {
11
15
  var _a;
12
16
  const internalRef = useRef(null);
13
17
  const setRefs = useCallback((node) => {
14
18
  internalRef.current = node;
15
- if (typeof ref === 'function') {
19
+ if (typeof ref === "function") {
16
20
  ref(node);
17
21
  }
18
22
  else if (ref) {
@@ -20,11 +24,9 @@ onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouse
20
24
  }
21
25
  }, [ref]);
22
26
  const shouldReduceMotion = useReducedMotion();
23
- const { id, variant = 'default', state = 'default', title, subtitle, icon, action, duration = 5000, dismissible = true, } = toast;
24
- const isTextOnly = !subtitle && !action;
25
- const defaultIcon = state === 'loading'
26
- ? (jsx(motion.div, { animate: { rotate: 360 }, transition: { repeat: Infinity, duration: 1, ease: "linear" }, children: jsx(ArrowPathIcon, { className: "w-5 h-5" }) }))
27
- : jsx(InformationCircleIcon, { className: "w-5 h-5" });
27
+ const { id, variant = "default", state = "default", title, subtitle, icon, action, children, duration = 5000, dismissible = true, } = toast;
28
+ const isTextOnly = !subtitle && !action && !children;
29
+ const defaultIcon = state === "loading" ? (jsx(motion.div, { animate: { rotate: 360 }, transition: { repeat: Infinity, duration: 1, ease: "linear" }, children: jsx(ArrowPathIcon, { className: "w-5 h-5" }) })) : (jsx(InformationCircleIcon, { className: "w-5 h-5" }));
28
30
  const resolvedIcon = icon || defaultIcon;
29
31
  // Auto-dismiss after duration
30
32
  useEffect(() => {
@@ -46,9 +48,11 @@ onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouse
46
48
  onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(id);
47
49
  };
48
50
  const handleActionClick = () => {
49
- action === null || action === void 0 ? void 0 : action.onClick();
50
- if (dismissible) {
51
- handleDismiss();
51
+ if (isToastAction(action)) {
52
+ action.onClick();
53
+ if (dismissible) {
54
+ handleDismiss();
55
+ }
52
56
  }
53
57
  };
54
58
  const stackingStyle = getToastStackingAnimation(index, totalToasts, isExpanded, expandedOffset);
@@ -58,31 +62,36 @@ onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouse
58
62
  opacity: (_a = stackingStyle.opacity) !== null && _a !== void 0 ? _a : 1,
59
63
  y: (_b = stackingStyle.y) !== null && _b !== void 0 ? _b : 0,
60
64
  scale: (_c = stackingStyle.scale) !== null && _c !== void 0 ? _c : 1,
61
- zIndex: (_d = stackingStyle.zIndex) !== null && _d !== void 0 ? _d : 1
65
+ zIndex: (_d = stackingStyle.zIndex) !== null && _d !== void 0 ? _d : 1,
62
66
  });
63
- }, [stackingStyle.opacity, stackingStyle.y, stackingStyle.scale, stackingStyle.zIndex]);
67
+ }, [
68
+ stackingStyle.opacity,
69
+ stackingStyle.y,
70
+ stackingStyle.scale,
71
+ stackingStyle.zIndex,
72
+ ]);
64
73
  const styleValue = useMemo(() => {
65
74
  var _a;
66
75
  return ({
67
76
  zIndex: (_a = stackingStyle.zIndex) !== null && _a !== void 0 ? _a : 1,
68
- position: (index > 0 ? 'absolute' : 'relative'),
77
+ position: (index > 0
78
+ ? "absolute"
79
+ : "relative"),
69
80
  top: index > 0 ? 0 : undefined,
70
81
  left: index > 0 ? 0 : undefined,
71
- width: index > 0 ? '100%' : undefined,
82
+ width: index > 0 ? "100%" : undefined,
72
83
  });
73
84
  }, [stackingStyle.zIndex, index]);
74
85
  const toastNode = (jsxs(motion.div, { ref: setRefs, layout: true, initial: shouldReduceMotion ? false : toastAnimations.initial, animate: animateValue, exit: shouldReduceMotion
75
86
  ? { ...toastAnimations.exit, transition: { duration: 0 } }
76
- : toastAnimations.exit, transition: shouldReduceMotion ? { duration: 0 } : toastAnimations.transition, className: cn(toastTheme.baseStyle, isTextOnly && 'items-center', ((_a = toastTheme.variants) === null || _a === void 0 ? void 0 : _a[variant]) || "", 'pointer-events-auto', index > 0 && !isExpanded && 'absolute top-0 left-0', className), style: styleValue, role: "alert", "aria-live": "polite", children: [jsx("div", { className: isTextOnly ? toastTheme.iconCenteredStyle : toastTheme.iconStyle, children: resolvedIcon }), jsxs("div", { className: "flex-1 min-w-0", children: [title && (typeof title === 'string'
77
- ? jsx("div", { className: isTextOnly ? toastTheme.textOnlyStyle : toastTheme.titleStyle, children: title })
78
- : title), subtitle && (typeof subtitle === 'string'
79
- ? jsx("div", { className: toastTheme.subtitleStyle, children: subtitle })
80
- : subtitle), action && (jsx("div", { className: "mt-2", children: jsx("button", { type: "button", className: toastTheme.actionStyle, onClick: handleActionClick, children: action.label }) }))] }), dismissible && (jsx("button", { type: "button", className: isTextOnly ? toastTheme.closeButtonCenteredStyle : toastTheme.closeButtonStyle, onClick: handleDismiss, "aria-label": "Dismiss notification", children: jsx(XMarkIcon, { className: "w-4 h-4" }) }))] }));
87
+ : toastAnimations.exit, transition: shouldReduceMotion ? { duration: 0 } : toastAnimations.transition, className: cn(toastTheme.baseStyle, isTextOnly && "items-center", ((_a = toastTheme.variants) === null || _a === void 0 ? void 0 : _a[variant]) || "", "pointer-events-auto", index > 0 && !isExpanded && "absolute top-0 left-0", className), style: styleValue, role: "alert", "aria-live": "polite", children: [jsx("div", { className: cn(toastTheme.iconStyle, !isTextOnly && "mt-0.5"), children: resolvedIcon }), jsxs("div", { className: "flex-1 min-w-0", children: [title &&
88
+ (typeof title === "string" ? (jsx("div", { className: cn(toastTheme.titleStyle, !isTextOnly && "font-semibold"), children: title })) : (title)), subtitle &&
89
+ (typeof subtitle === "string" ? (jsx("div", { className: toastTheme.subtitleStyle, children: subtitle })) : (subtitle)), action && (jsx("div", { className: "mt-4", children: isToastAction(action) ? (jsx(Button, { variant: "link", color: "primary", onClick: handleActionClick, children: action.label })) : (action) })), children] }), dismissible && (jsx("button", { type: "button", className: cn(toastTheme.closeButtonStyle, !isTextOnly && "mt-0.5"), onClick: handleDismiss, "aria-label": "Dismiss notification", children: jsx(XMarkIcon, { className: "size-5" }) }))] }));
81
90
  if (darkMode) {
82
91
  return jsx("div", { className: "dark", children: toastNode });
83
92
  }
84
93
  return toastNode;
85
94
  });
86
- Toast.displayName = 'Toast';
95
+ Toast.displayName = "Toast";
87
96
 
88
97
  export { Toast };
@@ -6,15 +6,10 @@ const toastTheme = {
6
6
  default: "border border-[var(--color-border)] dark:border-white/10",
7
7
  glass: "glass-effect",
8
8
  },
9
- iconStyle: "flex-shrink-0 size-5 mt-0.5",
10
- iconCenteredStyle: "flex-shrink-0 size-5",
11
- titleStyle: "font-semibold text-base",
12
- textOnlyStyle: "text-base",
13
- subtitleStyle: "text-base mt-0.5 opacity-60",
14
- actionStyle: "text-sm font-medium px-2 py-1 rounded border bg-white/80 hover:bg-white transition-colors cursor-pointer " +
15
- "dark:bg-white/10 dark:border-white/20 dark:hover:bg-white/20 dark:text-white",
16
- closeButtonStyle: "absolute top-2 right-2 flex-shrink-0 w-4 h-4 opacity-70 hover:opacity-100 transition-opacity cursor-pointer",
17
- closeButtonCenteredStyle: "flex-shrink-0 w-4 h-4 opacity-70 hover:opacity-100 transition-opacity cursor-pointer",
9
+ iconStyle: "flex-shrink-0",
10
+ titleStyle: "text-base text-[var(--color-text-primary)]",
11
+ subtitleStyle: "text-base mt-1 text-[var(--color-text-secondary)]",
12
+ closeButtonStyle: "flex-shrink-0 size-5 opacity-70 hover:opacity-100 transition-opacity cursor-pointer",
18
13
  containerStyle: "fixed z-50 pointer-events-none",
19
14
  };
20
15
 
@@ -16,28 +16,11 @@ export interface ToastTheme {
16
16
  baseStyle: string;
17
17
  variants: Record<ToastVariant, string>;
18
18
  iconStyle: string;
19
- iconCenteredStyle: string;
20
19
  titleStyle: string;
21
- textOnlyStyle: string;
22
20
  subtitleStyle: string;
23
- actionStyle: string;
24
21
  closeButtonStyle: string;
25
- closeButtonCenteredStyle: string;
26
22
  containerStyle: string;
27
23
  }
28
- export interface ToastThemeOverrides {
29
- baseStyle?: string;
30
- variants?: Partial<Record<ToastVariant, string>>;
31
- iconStyle?: string;
32
- iconCenteredStyle?: string;
33
- titleStyle?: string;
34
- textOnlyStyle?: string;
35
- subtitleStyle?: string;
36
- actionStyle?: string;
37
- closeButtonStyle?: string;
38
- closeButtonCenteredStyle?: string;
39
- containerStyle?: string;
40
- }
41
24
  export interface ToastData {
42
25
  id: string;
43
26
  variant?: ToastVariant;
@@ -45,7 +28,8 @@ export interface ToastData {
45
28
  title?: ReactNode;
46
29
  subtitle?: ReactNode;
47
30
  icon?: ReactNode;
48
- action?: ToastAction;
31
+ action?: ToastAction | ReactNode;
32
+ children?: ReactNode;
49
33
  duration?: number;
50
34
  dismissible?: boolean;
51
35
  onDismiss?: () => void;
@@ -55,8 +39,6 @@ export interface ToastProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"
55
39
  toast: ToastData;
56
40
  /** Custom class name */
57
41
  className?: string;
58
- /** Theme overrides (deprecated - use className for customization) */
59
- theme?: ToastThemeOverrides;
60
42
  /** Callback when toast is dismissed */
61
43
  onDismiss?: (id: string) => void;
62
44
  /** Index of toast in the stack */
@@ -102,7 +84,8 @@ export interface UseToastOptions {
102
84
  state?: ToastState;
103
85
  duration?: number;
104
86
  dismissible?: boolean;
105
- action?: ToastAction;
87
+ action?: ToastAction | ReactNode;
88
+ children?: ReactNode;
106
89
  icon?: ReactNode;
107
90
  }
108
91
  export interface UseToastReturn {
@@ -1,5 +1,5 @@
1
1
  export { Toast } from './Toast';
2
2
  export { ToastProvider, useToastContext } from './ToastProvider';
3
3
  export { useToast } from './useToast';
4
- export type { ToastProps, ToastData, ToastProviderProps, ToastTheme, ToastThemeOverrides, ToastVariant, UseToastReturn, UseToastOptions, } from './Toast.types';
4
+ export type { ToastProps, ToastData, ToastProviderProps, ToastTheme, ToastVariant, UseToastReturn, UseToastOptions, } from './Toast.types';
5
5
  export { toastTheme } from './Toast.theme';
@@ -55,7 +55,7 @@ const Tooltip = ({ content, children, placement = "top", delay = 300, disabled =
55
55
  const { position, cssVariables, contentRef: portalContentRef} = useSelectPortal({
56
56
  triggerRef,
57
57
  isOpen: isVisible,
58
- placement: placement, // TooltipPlacement matches SelectPlacement subset
58
+ placement: placement,
59
59
  offset,
60
60
  autoWidth: true,
61
61
  });