@flikk/ui 1.0.0-beta.29 → 1.0.0-beta.30

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 (762) hide show
  1. package/CHANGELOG.md +1184 -0
  2. package/dist/components/ai/CodeBlock/CodeBlock.js +21 -4
  3. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +0 -1
  4. package/dist/components/ai/CodeBlock/CodeBlock.types.d.ts +0 -2
  5. package/dist/components/ai/CodeBlock/LanguageIcon.js +1 -0
  6. package/dist/components/ai/PromptInput/PromptInput.js +13 -9
  7. package/dist/components/ai/PromptInput/PromptInput.theme.js +19 -2
  8. package/dist/components/ai/PromptInput/VoiceRecorder.d.ts +1 -0
  9. package/dist/components/ai/PromptInput/VoiceRecorder.js +154 -7
  10. package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.js +1 -0
  11. package/dist/components/ai/StreamingResponse/AnimatedText.js +1 -0
  12. package/dist/components/ai/StreamingResponse/ErrorDisplay.js +1 -0
  13. package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +1 -0
  14. package/dist/components/ai/StreamingResponse/StreamingCursor.d.ts +2 -2
  15. package/dist/components/ai/StreamingResponse/StreamingCursor.js +14 -3
  16. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.d.ts +2 -2
  17. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.js +17 -11
  18. package/dist/components/ai/StreamingResponse/StreamingResponse.js +3 -3
  19. package/dist/components/ai/StreamingResponse/WordAnimationContext.js +3 -1
  20. package/dist/components/ai/TokenCounter/TokenCounter.js +1 -0
  21. package/dist/components/ai/index.d.ts +2 -2
  22. package/dist/components/ai/index.js +4 -5
  23. package/dist/components/canvas/Background.js +3 -2
  24. package/dist/components/canvas/CanvasToolbar.js +3 -2
  25. package/dist/components/canvas/Edge.d.ts +2 -5
  26. package/dist/components/canvas/Edge.js +18 -2
  27. package/dist/components/canvas/EdgeLayer.d.ts +2 -1
  28. package/dist/components/canvas/EdgeLayer.js +20 -10
  29. package/dist/components/canvas/Handle.js +3 -2
  30. package/dist/components/canvas/MiniMap.js +1 -0
  31. package/dist/components/canvas/NodeCanvas.js +19 -15
  32. package/dist/components/canvas/NodeCanvas.types.d.ts +5 -1
  33. package/dist/components/canvas/NodeControls.js +3 -2
  34. package/dist/components/canvas/NodeRenderer.d.ts +4 -1
  35. package/dist/components/canvas/NodeRenderer.js +18 -9
  36. package/dist/components/canvas/changes.test.d.ts +1 -0
  37. package/dist/components/canvas/context/CanvasContext.d.ts +10 -1
  38. package/dist/components/canvas/context/CanvasContext.js +27 -7
  39. package/dist/components/canvas/context/ConnectionContext.js +1 -0
  40. package/dist/components/canvas/context/HandleRegistry.js +1 -0
  41. package/dist/components/canvas/context/InteractionContext.js +1 -0
  42. package/dist/components/canvas/context/NodeIdContext.js +1 -0
  43. package/dist/components/canvas/hooks/useConnection.js +1 -0
  44. package/dist/components/canvas/hooks/useMarquee.js +1 -0
  45. package/dist/components/canvas/hooks/useNodeDrag.js +3 -2
  46. package/dist/components/canvas/hooks/usePanZoom.js +7 -1
  47. package/dist/components/canvas/hooks/useViewport.js +1 -0
  48. package/dist/components/canvas/layout.test.d.ts +1 -0
  49. package/dist/components/canvas/utils.test.d.ts +1 -0
  50. package/dist/components/charts/ActivityRings/ActivityRings.js +28 -17
  51. package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +2 -3
  52. package/dist/components/charts/ActivityRings/ActivityRings.types.js +2 -1
  53. package/dist/components/charts/AreaChart/AreaChart.js +170 -157
  54. package/dist/components/charts/BarChart/BarChart.js +114 -124
  55. package/dist/components/charts/ChartContainer.d.ts +7 -0
  56. package/dist/components/charts/ChartContainer.js +10 -7
  57. package/dist/components/charts/{shared/BarRenderer → ComboChart}/BarRenderer.d.ts +3 -1
  58. package/dist/components/charts/{shared/BarRenderer → ComboChart}/BarRenderer.js +137 -102
  59. package/dist/components/charts/{shared/BarRenderer → ComboChart}/BarRenderer.types.d.ts +17 -5
  60. package/dist/components/charts/ComboChart/ComboChart.js +26 -9
  61. package/dist/components/charts/ComboChart/ComboChart.types.d.ts +2 -2
  62. package/dist/components/charts/ComboChart/ComboChart.types.js +4 -0
  63. package/dist/components/charts/ComboChart/ComboChartCanvas.d.ts +98 -0
  64. package/dist/components/charts/{shared/ChartContainer/ChartContainer.js → ComboChart/ComboChartCanvas.js} +41 -44
  65. package/dist/components/charts/{shared/ChartContainer/ChartContainer.types.d.ts → ComboChart/ComboChartCanvas.types.d.ts} +23 -3
  66. package/dist/components/charts/{shared/LineRenderer → ComboChart}/LineRenderer.d.ts +3 -1
  67. package/dist/components/charts/{shared/LineRenderer → ComboChart}/LineRenderer.js +27 -14
  68. package/dist/components/charts/{shared/LineRenderer → ComboChart}/LineRenderer.types.d.ts +11 -5
  69. package/dist/components/charts/DonutChart/DonutChart.js +2 -1
  70. package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +8 -22
  71. package/dist/components/charts/DonutChart/donut-utils.js +1 -0
  72. package/dist/components/charts/FunnelChart/FunnelChart.animations.js +1 -48
  73. package/dist/components/charts/FunnelChart/FunnelChart.d.ts +3 -4
  74. package/dist/components/charts/FunnelChart/FunnelChart.js +306 -358
  75. package/dist/components/charts/Heatmap/Heatmap.js +29 -36
  76. package/dist/components/charts/Heatmap/HeatmapCell.js +1 -0
  77. package/dist/components/charts/LineChart/LineChart.js +163 -132
  78. package/dist/components/charts/LineChart/LineChart.types.d.ts +1 -1
  79. package/dist/components/charts/RadarChart/RadarChart.js +10 -2
  80. package/dist/components/charts/RadarChart/RadarChart.theme.js +0 -8
  81. package/dist/components/charts/RadarChart/RadarChart.types.d.ts +0 -8
  82. package/dist/components/charts/ScatterPlot/ScatterPlot.js +12 -3
  83. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.d.ts +0 -4
  84. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +0 -5
  85. package/dist/components/charts/StackedBarChart/StackedBarChart.js +79 -42
  86. package/dist/components/charts/StackedBarChart/StackedBarChart.types.d.ts +2 -2
  87. package/dist/components/charts/StackedBarChart/StackedBarChart.types.js +3 -0
  88. package/dist/components/charts/hooks/index.d.ts +1 -1
  89. package/dist/components/charts/hooks/useChartAccessibility.js +1 -0
  90. package/dist/components/charts/hooks/useChartDimensions.js +1 -0
  91. package/dist/components/charts/hooks/useChartScales.js +1 -1
  92. package/dist/components/charts/hooks/useChartTheme.js +1 -0
  93. package/dist/components/charts/hooks/useChartValidation.d.ts +0 -8
  94. package/dist/components/charts/hooks/useChartValidation.js +1 -0
  95. package/dist/components/charts/hooks/useTooltipPosition.js +1 -0
  96. package/dist/components/charts/index.d.ts +3 -3
  97. package/dist/components/charts/index.js +1 -3
  98. package/dist/components/charts/shared/ChartCrosshair/ChartCrosshair.js +5 -12
  99. package/dist/components/charts/shared/ChartErrorBoundary/ChartErrorBoundary.js +1 -0
  100. package/dist/components/charts/shared/ChartLegend/ChartLegend.d.ts +5 -2
  101. package/dist/components/charts/shared/ChartLegend/ChartLegend.js +15 -22
  102. package/dist/components/charts/shared/ChartLegend/ChartLegend.types.d.ts +6 -23
  103. package/dist/components/charts/shared/ChartLegend/index.d.ts +2 -3
  104. package/dist/components/charts/shared/ChartMarker/ChartMarker.js +1 -0
  105. package/dist/components/charts/shared/ChartText/ChartText.js +1 -0
  106. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.js +4 -13
  107. package/dist/components/charts/shared/index.d.ts +0 -7
  108. package/dist/components/charts/theme/chart.theme.js +6 -0
  109. package/dist/components/charts/types/chart.types.d.ts +15 -0
  110. package/dist/components/charts/utils/animation-utils.d.ts +95 -0
  111. package/dist/components/charts/utils/animation-utils.js +150 -2
  112. package/dist/components/charts/utils/bar-emphasis.d.ts +80 -0
  113. package/dist/components/charts/utils/bar-emphasis.js +69 -0
  114. package/dist/components/charts/utils/chart-validation.js +7 -0
  115. package/dist/components/core/Accordion/Accordion.d.ts +3 -3
  116. package/dist/components/core/Accordion/Accordion.js +21 -17
  117. package/dist/components/core/Accordion/Accordion.types.d.ts +35 -1
  118. package/dist/components/core/Accordion/AccordionBody.js +2 -1
  119. package/dist/components/core/Accordion/AccordionContext.d.ts +3 -0
  120. package/dist/components/core/Accordion/AccordionContext.js +15 -0
  121. package/dist/components/core/Accordion/AccordionItem.js +12 -8
  122. package/dist/components/core/Accordion/AccordionTrigger.js +7 -4
  123. package/dist/components/core/Accordion/index.d.ts +2 -2
  124. package/dist/components/core/Alert/Alert.animations.js +1 -0
  125. package/dist/components/core/Alert/Alert.js +4 -4
  126. package/dist/components/core/Alert/Alert.theme.js +0 -5
  127. package/dist/components/core/Alert/Alert.types.d.ts +0 -8
  128. package/dist/components/core/Alert/index.d.ts +1 -1
  129. package/dist/components/core/AlertDialog/AlertDialog.js +15 -1
  130. package/dist/components/core/Avatar/Avatar.js +58 -14
  131. package/dist/components/core/Avatar/Avatar.types.d.ts +26 -1
  132. package/dist/components/core/AvatarGroup/AvatarGroup.animations.js +1 -0
  133. package/dist/components/core/AvatarGroup/AvatarGroup.js +1 -0
  134. package/dist/components/core/Badge/Badge.animations.js +1 -0
  135. package/dist/components/core/Badge/Badge.js +6 -6
  136. package/dist/components/core/Badge/Badge.theme.js +32 -28
  137. package/dist/components/core/Badge/Badge.types.d.ts +12 -1
  138. package/dist/components/core/Breadcrumbs/Breadcrumbs.js +8 -2
  139. package/dist/components/core/Button/Button.js +23 -17
  140. package/dist/components/core/Button/Button.ripple.js +1 -4
  141. package/dist/components/core/Button/Button.theme.d.ts +0 -2
  142. package/dist/components/core/Button/Button.theme.js +16 -92
  143. package/dist/components/core/Button/Button.types.d.ts +5 -6
  144. package/dist/components/core/Calendar/Calendar.animations.js +1 -0
  145. package/dist/components/core/Calendar/Calendar.js +87 -4
  146. package/dist/components/core/Calendar/CalendarMini/CalendarMini.animations.js +1 -0
  147. package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +3 -1
  148. package/dist/components/core/Card/Card.js +9 -2
  149. package/dist/components/core/Card/Card.theme.js +3 -1
  150. package/dist/components/core/Card/Card.types.d.ts +8 -0
  151. package/dist/components/core/CardStack/CardStack.js +1 -0
  152. package/dist/components/core/Carousel/Carousel.js +1 -0
  153. package/dist/components/core/Carousel/CarouselBody.js +5 -2
  154. package/dist/components/core/Carousel/CarouselContext.js +1 -0
  155. package/dist/components/core/Carousel/CarouselNext.js +1 -0
  156. package/dist/components/core/Carousel/CarouselPrevious.js +1 -0
  157. package/dist/components/core/CommandPalette/CommandItem.js +1 -0
  158. package/dist/components/core/CommandPalette/CommandPalette.animations.js +1 -0
  159. package/dist/components/core/CommandPalette/CommandPalette.js +55 -11
  160. package/dist/components/core/CommandPalette/CommandPalette.theme.js +3 -1
  161. package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +8 -0
  162. package/dist/components/core/ContextMenu/ContextMenu.js +27 -5
  163. package/dist/components/core/ContextMenu/ContextMenu.theme.js +8 -7
  164. package/dist/components/core/ContextMenu/ContextMenu.types.d.ts +17 -0
  165. package/dist/components/core/ContextMenu/ContextMenuBody.js +11 -5
  166. package/dist/components/core/ContextMenu/ContextMenuContext.js +1 -0
  167. package/dist/components/core/ContextMenu/ContextMenuItem.js +17 -7
  168. package/dist/components/core/ContextMenu/ContextMenuLabel.js +1 -0
  169. package/dist/components/core/ContextMenu/ContextMenuSeparator.js +1 -0
  170. package/dist/components/core/ContextMenu/ContextMenuSub.js +4 -3
  171. package/dist/components/core/ContextMenu/ContextMenuSubBody.js +7 -3
  172. package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +3 -2
  173. package/dist/components/core/ContextMenu/ContextMenuTrigger.js +8 -0
  174. package/dist/components/core/DotSeparator/DotSeparator.js +1 -0
  175. package/dist/components/core/DragDrop/DragDrop.js +50 -31
  176. package/dist/components/core/Drawer/Drawer.animations.js +9 -8
  177. package/dist/components/core/Drawer/Drawer.d.ts +3 -3
  178. package/dist/components/core/Drawer/Drawer.js +14 -15
  179. package/dist/components/core/Drawer/Drawer.theme.js +8 -6
  180. package/dist/components/core/Drawer/Drawer.types.d.ts +8 -0
  181. package/dist/components/core/Drawer/DrawerBody.js +2 -1
  182. package/dist/components/core/Drawer/DrawerContext.d.ts +3 -0
  183. package/dist/components/core/Drawer/DrawerContext.js +15 -0
  184. package/dist/components/core/Drawer/DrawerFooter.js +2 -1
  185. package/dist/components/core/Drawer/DrawerHeader.js +3 -2
  186. package/dist/components/core/Drawer/DrawerSubtitle.js +2 -1
  187. package/dist/components/core/Drawer/DrawerTitle.js +2 -1
  188. package/dist/components/core/Dropdown/Dropdown.js +23 -9
  189. package/dist/components/core/Dropdown/Dropdown.theme.js +4 -3
  190. package/dist/components/core/Dropdown/Dropdown.types.d.ts +8 -0
  191. package/dist/components/core/Dropdown/DropdownContext.js +1 -0
  192. package/dist/components/core/Dropdown/DropdownItem.js +1 -0
  193. package/dist/components/core/Dropdown/DropdownMenu.js +22 -22
  194. package/dist/components/core/Dropdown/DropdownSection.js +1 -0
  195. package/dist/components/core/Dropdown/DropdownSeparator.js +1 -0
  196. package/dist/components/core/Dropdown/DropdownTrigger.js +21 -1
  197. package/dist/components/core/HeroCard/HeroCard.js +1 -0
  198. package/dist/components/core/HeroCard/HeroCard.theme.js +1 -1
  199. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.js +11 -2
  200. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.js +2 -2
  201. package/dist/components/core/Link/Link.d.ts +1 -1
  202. package/dist/components/core/Link/Link.js +58 -29
  203. package/dist/components/core/Link/Link.types.d.ts +25 -8
  204. package/dist/components/core/Masonry/Masonry.js +87 -75
  205. package/dist/components/core/Masonry/Masonry.theme.js +10 -4
  206. package/dist/components/core/MenuItem/MenuItem.js +17 -1
  207. package/dist/components/core/MenuItem/MenuItem.theme.js +6 -2
  208. package/dist/components/core/Message/Message.js +2 -1
  209. package/dist/components/core/Message/MessageActions.js +1 -0
  210. package/dist/components/core/Message/MessageAudio.js +2 -1
  211. package/dist/components/core/Message/MessageAvatar.js +1 -0
  212. package/dist/components/core/Message/MessageBody.js +1 -0
  213. package/dist/components/core/Message/MessageContext.js +1 -0
  214. package/dist/components/core/Message/MessageFile.js +1 -0
  215. package/dist/components/core/Message/MessageImage.js +1 -0
  216. package/dist/components/core/Message/MessageList.js +1 -0
  217. package/dist/components/core/Message/MessageReactions.js +1 -0
  218. package/dist/components/core/Message/MessageStatusIndicator.js +3 -2
  219. package/dist/components/core/Message/MessageTimestamp.js +1 -0
  220. package/dist/components/core/Message/TypeWriter.d.ts +1 -1
  221. package/dist/components/core/Message/TypeWriter.js +74 -9
  222. package/dist/components/core/Modal/Modal.animations.d.ts +1 -1
  223. package/dist/components/core/Modal/Modal.animations.js +10 -25
  224. package/dist/components/core/Modal/Modal.d.ts +3 -5
  225. package/dist/components/core/Modal/Modal.js +15 -15
  226. package/dist/components/core/Modal/Modal.theme.js +7 -5
  227. package/dist/components/core/Modal/Modal.types.d.ts +8 -0
  228. package/dist/components/core/Modal/ModalBody.js +2 -1
  229. package/dist/components/core/Modal/ModalContext.d.ts +3 -0
  230. package/dist/components/core/Modal/ModalContext.js +16 -0
  231. package/dist/components/core/Modal/ModalFooter.js +3 -2
  232. package/dist/components/core/Modal/ModalHeader.js +3 -2
  233. package/dist/components/core/Modal/ModalSubtitle.js +2 -1
  234. package/dist/components/core/Modal/ModalTitle.js +2 -1
  235. package/dist/components/core/ModalStack/ModalStack.animations.js +1 -0
  236. package/dist/components/core/ModalStack/ModalStack.js +2 -1
  237. package/dist/components/core/ModalStack/ModalStackModal.js +18 -10
  238. package/dist/components/core/NavItem/NavItem.js +15 -3
  239. package/dist/components/core/OfflineIndicator/OfflineIndicator.js +1 -0
  240. package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +1 -1
  241. package/dist/components/core/PageHeading/PageHeading.js +8 -3
  242. package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
  243. package/dist/components/core/PageHeading/PageHeading.types.d.ts +12 -1
  244. package/dist/components/core/PageHeading/PageHeadingBackButton.js +3 -2
  245. package/dist/components/core/Pagination/Pagination.js +8 -2
  246. package/dist/components/core/Pagination/Pagination.theme.d.ts +2 -10
  247. package/dist/components/core/Pagination/Pagination.types.d.ts +11 -1
  248. package/dist/components/core/Pill/Pill.animations.js +2 -11
  249. package/dist/components/core/Pill/Pill.js +14 -5
  250. package/dist/components/core/Pill/Pill.theme.js +8 -8
  251. package/dist/components/core/Popover/Popover.js +6 -5
  252. package/dist/components/core/Popover/Popover.theme.js +4 -2
  253. package/dist/components/core/Popover/Popover.types.d.ts +8 -0
  254. package/dist/components/core/Popover/PopoverBody.js +19 -21
  255. package/dist/components/core/Popover/PopoverContext.js +1 -0
  256. package/dist/components/core/Popover/PopoverTrigger.js +1 -0
  257. package/dist/components/core/Progress/Progress.js +1 -0
  258. package/dist/components/core/Rating/Rating.js +13 -5
  259. package/dist/components/core/ScrollArea/ScrollArea.js +1 -0
  260. package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.d.ts +1 -0
  261. package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.js +14 -3
  262. package/dist/components/core/ScrollArea/smooth/SnapPointDetector.js +1 -0
  263. package/dist/components/core/ScrollArea/smooth/useSmoothScroll.js +1 -0
  264. package/dist/components/core/Segmented/Segmented.js +3 -2
  265. package/dist/components/core/Segmented/SegmentedItem.js +2 -1
  266. package/dist/components/core/Separator/Separator.js +1 -0
  267. package/dist/components/core/Sidebar/Sidebar.js +1 -0
  268. package/dist/components/core/Sidebar/SidebarCard.js +1 -0
  269. package/dist/components/core/Sidebar/SidebarContent.js +1 -0
  270. package/dist/components/core/Sidebar/SidebarContext.js +1 -0
  271. package/dist/components/core/Sidebar/SidebarFooter.js +1 -0
  272. package/dist/components/core/Sidebar/SidebarHeader.js +1 -0
  273. package/dist/components/core/Sidebar/SidebarLogo.js +1 -0
  274. package/dist/components/core/Sidebar/SidebarMobileTrigger.js +1 -0
  275. package/dist/components/core/Sidebar/SidebarNav.js +3 -1
  276. package/dist/components/core/Sidebar/SidebarNavGroup.js +1 -0
  277. package/dist/components/core/Sidebar/SidebarSearch.js +1 -0
  278. package/dist/components/core/Sidebar/SidebarToggle.js +1 -0
  279. package/dist/components/core/Sidebar/SidebarUserProfile.js +1 -0
  280. package/dist/components/core/SlidingNumber/SlidingNumber.js +3 -1
  281. package/dist/components/core/Sortable/Sortable.animations.js +1 -0
  282. package/dist/components/core/Sortable/Sortable.js +1 -0
  283. package/dist/components/core/Spinner/Spinner.js +1 -0
  284. package/dist/components/core/Tabs/Tabs.animations.js +1 -0
  285. package/dist/components/core/Tabs/Tabs.js +1 -0
  286. package/dist/components/core/Tabs/Tabs.theme.js +3 -3
  287. package/dist/components/core/Tabs/TabsBody.js +1 -0
  288. package/dist/components/core/Tabs/TabsContext.js +1 -0
  289. package/dist/components/core/Tabs/TabsList.js +1 -0
  290. package/dist/components/core/Tabs/TabsTrigger.js +34 -10
  291. package/dist/components/core/Tag/Tag.js +2 -1
  292. package/dist/components/core/Tag/Tag.theme.js +2 -2
  293. package/dist/components/core/Toast/Toast.animations.d.ts +3 -2
  294. package/dist/components/core/Toast/Toast.animations.js +20 -17
  295. package/dist/components/core/Toast/Toast.js +42 -20
  296. package/dist/components/core/Toast/Toast.theme.js +5 -8
  297. package/dist/components/core/Toast/Toast.types.d.ts +30 -20
  298. package/dist/components/core/Toast/ToastProvider.js +5 -1
  299. package/dist/components/core/Toast/index.d.ts +1 -1
  300. package/dist/components/core/Toast/useToast.js +5 -6
  301. package/dist/components/core/Tooltip/Tooltip.animations.js +19 -53
  302. package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
  303. package/dist/components/core/Tooltip/Tooltip.js +39 -18
  304. package/dist/components/core/Tooltip/Tooltip.theme.js +4 -2
  305. package/dist/components/core/Tooltip/Tooltip.types.d.ts +8 -0
  306. package/dist/components/core/Tree/Tree.animations.d.ts +1 -2
  307. package/dist/components/core/Tree/Tree.animations.js +20 -58
  308. package/dist/components/core/Tree/Tree.js +7 -5
  309. package/dist/components/data-display/DescriptionList/DescriptionList.js +1 -0
  310. package/dist/components/data-display/Feed/Feed.js +1 -0
  311. package/dist/components/data-display/GanttChart/GanttChart.d.ts +2 -3
  312. package/dist/components/data-display/GanttChart/GanttChart.js +5 -21
  313. package/dist/components/data-display/GanttChart/GanttChartContext.d.ts +5 -0
  314. package/dist/components/data-display/GanttChart/GanttChartContext.js +26 -0
  315. package/dist/components/data-display/GanttChart/GanttChartPanel.js +2 -1
  316. package/dist/components/data-display/GanttChart/GanttDependencyArrows.js +2 -1
  317. package/dist/components/data-display/GanttChart/GanttGroupBar.js +2 -1
  318. package/dist/components/data-display/GanttChart/GanttMilestone.js +2 -1
  319. package/dist/components/data-display/GanttChart/GanttSplitter.js +2 -1
  320. package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +2 -1
  321. package/dist/components/data-display/GanttChart/GanttTableHeader.js +2 -1
  322. package/dist/components/data-display/GanttChart/GanttTablePanel.js +2 -1
  323. package/dist/components/data-display/GanttChart/GanttTableTaskRow.js +2 -1
  324. package/dist/components/data-display/GanttChart/GanttTaskBar.js +2 -1
  325. package/dist/components/data-display/GanttChart/GanttTaskContextMenu.js +2 -1
  326. package/dist/components/data-display/GanttChart/GanttTimelineGrid.js +2 -1
  327. package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +2 -1
  328. package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -1
  329. package/dist/components/data-display/GanttChart/hooks/useGanttDates.js +1 -0
  330. package/dist/components/data-display/GanttChart/hooks/useGanttDrag.js +1 -0
  331. package/dist/components/data-display/GanttChart/hooks/useGanttLayout.js +1 -0
  332. package/dist/components/data-display/GanttChart/hooks/useGanttScrollSync.js +1 -0
  333. package/dist/components/data-display/KPI/KPI.js +1 -0
  334. package/dist/components/data-display/Metric/Metric.js +2 -2
  335. package/dist/components/data-display/Metric/Metric.theme.js +2 -14
  336. package/dist/components/data-display/Metric/Metric.types.d.ts +1 -3
  337. package/dist/components/data-display/Table/Table.animations.js +1 -0
  338. package/dist/components/data-display/Table/Table.d.ts +2 -7
  339. package/dist/components/data-display/Table/Table.js +14 -14
  340. package/dist/components/data-display/Table/Table.types.d.ts +2 -0
  341. package/dist/components/data-display/Table/TableActions.js +3 -2
  342. package/dist/components/data-display/Table/TableActionsMenu.js +1 -0
  343. package/dist/components/data-display/Table/TableBody.js +1 -0
  344. package/dist/components/data-display/Table/TableCell.d.ts +1 -1
  345. package/dist/components/data-display/Table/TableCell.js +8 -3
  346. package/dist/components/data-display/Table/TableColumnManager.js +1 -0
  347. package/dist/components/data-display/Table/TableContext.d.ts +11 -0
  348. package/dist/components/data-display/Table/TableContext.js +21 -0
  349. package/dist/components/data-display/Table/TableDeclarative.js +3 -2
  350. package/dist/components/data-display/Table/TableFilter.js +9 -5
  351. package/dist/components/data-display/Table/TableHeader.js +2 -1
  352. package/dist/components/data-display/Table/TablePagination.js +1 -0
  353. package/dist/components/data-display/Table/TableRow.js +1 -0
  354. package/dist/components/data-display/Table/TableSelectionHeader.js +4 -2
  355. package/dist/components/data-display/Table/hooks/useTableColumns.js +1 -0
  356. package/dist/components/data-display/Table/hooks/useTableExpansion.js +1 -0
  357. package/dist/components/data-display/Table/hooks/useTableFilter.js +1 -0
  358. package/dist/components/data-display/Table/hooks/useTablePagination.js +1 -0
  359. package/dist/components/data-display/Table/hooks/useTableSelection.js +1 -0
  360. package/dist/components/data-display/Table/index.js +1 -2
  361. package/dist/components/data-display/Timeline/Timeline.animations.js +1 -0
  362. package/dist/components/data-display/Timeline/Timeline.d.ts +2 -2
  363. package/dist/components/data-display/Timeline/Timeline.js +5 -10
  364. package/dist/components/data-display/Timeline/Timeline.theme.d.ts +2 -24
  365. package/dist/components/data-display/Timeline/Timeline.types.d.ts +25 -1
  366. package/dist/components/data-display/Timeline/TimelineContent.js +2 -1
  367. package/dist/components/data-display/Timeline/TimelineContext.d.ts +3 -0
  368. package/dist/components/data-display/Timeline/TimelineContext.js +16 -0
  369. package/dist/components/data-display/Timeline/TimelineItem.js +5 -4
  370. package/dist/components/data-display/Timeline/TimelineMarker.js +2 -1
  371. package/dist/components/effects/AIOrb/hooks/useOrbState.js +1 -0
  372. package/dist/components/effects/AIOrb/variants/Aura/Aura.js +13 -4
  373. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.d.ts +7 -0
  374. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.impl.d.ts +3 -0
  375. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.impl.js +176 -0
  376. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.js +29 -161
  377. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.d.ts +8 -0
  378. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.impl.d.ts +3 -0
  379. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.impl.js +140 -0
  380. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.js +29 -127
  381. package/dist/components/effects/Animated/Animated.d.ts +2 -2
  382. package/dist/components/effects/Animated/Animated.js +5 -6
  383. package/dist/components/effects/Animated/AnimatedContext.d.ts +3 -0
  384. package/dist/components/effects/Animated/AnimatedContext.js +12 -0
  385. package/dist/components/effects/Animated/AnimatedItem.js +2 -1
  386. package/dist/components/effects/Aurora/Aurora.js +27 -5
  387. package/dist/components/effects/ColorPanels/ColorPanels.d.ts +8 -0
  388. package/dist/components/effects/ColorPanels/ColorPanels.js +66 -0
  389. package/dist/components/effects/ColorPanels/ColorPanels.shaders.d.ts +12 -0
  390. package/dist/components/effects/ColorPanels/ColorPanels.shaders.js +218 -0
  391. package/dist/components/effects/ColorPanels/ColorPanels.types.d.ts +29 -0
  392. package/dist/components/effects/ColorPanels/ColorPanels.types.js +3 -0
  393. package/dist/components/effects/ColorPanels/index.d.ts +2 -0
  394. package/dist/components/effects/CustomCursor/CustomCursor.js +1 -0
  395. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +0 -2
  396. package/dist/components/effects/Dithering/Dithering.d.ts +10 -0
  397. package/dist/components/effects/Dithering/Dithering.js +62 -0
  398. package/dist/components/effects/Dithering/Dithering.shaders.d.ts +11 -0
  399. package/dist/components/effects/Dithering/Dithering.shaders.js +166 -0
  400. package/dist/components/effects/Dithering/Dithering.types.d.ts +31 -0
  401. package/dist/components/effects/Dithering/Dithering.types.js +17 -0
  402. package/dist/components/effects/Dithering/index.d.ts +3 -0
  403. package/dist/components/effects/DotPattern/DotPattern.js +1 -0
  404. package/dist/components/effects/FlutedGlass/FlutedGlass.d.ts +9 -0
  405. package/dist/components/effects/FlutedGlass/FlutedGlass.js +80 -0
  406. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.d.ts +12 -0
  407. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.js +335 -0
  408. package/dist/components/effects/FlutedGlass/FlutedGlass.types.d.ts +61 -0
  409. package/dist/components/effects/FlutedGlass/FlutedGlass.types.js +16 -0
  410. package/dist/components/effects/FlutedGlass/index.d.ts +3 -0
  411. package/dist/components/effects/GemSmoke/GemSmoke.d.ts +8 -0
  412. package/dist/components/effects/GemSmoke/GemSmoke.js +70 -0
  413. package/dist/components/effects/GemSmoke/GemSmoke.shaders.d.ts +18 -0
  414. package/dist/components/effects/GemSmoke/GemSmoke.shaders.js +181 -0
  415. package/dist/components/effects/GemSmoke/GemSmoke.types.d.ts +37 -0
  416. package/dist/components/effects/GemSmoke/GemSmoke.types.js +10 -0
  417. package/dist/components/effects/GemSmoke/index.d.ts +3 -0
  418. package/dist/components/effects/GlassEffect/GlassEffect.js +1 -1
  419. package/dist/components/effects/GlassSurface/GlassSurface.js +2 -16
  420. package/dist/components/effects/GodRays/GodRays.d.ts +8 -0
  421. package/dist/components/effects/GodRays/GodRays.js +68 -0
  422. package/dist/components/effects/GodRays/GodRays.shaders.d.ts +10 -0
  423. package/dist/components/effects/GodRays/GodRays.shaders.js +128 -0
  424. package/dist/components/effects/GodRays/GodRays.types.d.ts +25 -0
  425. package/dist/components/effects/GodRays/GodRays.types.js +3 -0
  426. package/dist/components/effects/GodRays/index.d.ts +2 -0
  427. package/dist/components/effects/GradientMesh/GradientMesh.d.ts +9 -0
  428. package/dist/components/effects/GradientMesh/GradientMesh.js +56 -0
  429. package/dist/components/effects/GradientMesh/GradientMesh.shaders.d.ts +15 -0
  430. package/dist/components/effects/GradientMesh/GradientMesh.shaders.js +127 -0
  431. package/dist/components/effects/GradientMesh/GradientMesh.types.d.ts +17 -0
  432. package/dist/components/effects/GradientMesh/GradientMesh.types.js +3 -0
  433. package/dist/components/effects/GradientMesh/index.d.ts +2 -0
  434. package/dist/components/effects/GrainGradient/GrainGradient.d.ts +9 -0
  435. package/dist/components/effects/GrainGradient/GrainGradient.js +62 -0
  436. package/dist/components/effects/GrainGradient/GrainGradient.shaders.d.ts +17 -0
  437. package/dist/components/effects/GrainGradient/GrainGradient.shaders.js +168 -0
  438. package/dist/components/effects/GrainGradient/GrainGradient.types.d.ts +26 -0
  439. package/dist/components/effects/GrainGradient/GrainGradient.types.js +9 -0
  440. package/dist/components/effects/GrainGradient/index.d.ts +3 -0
  441. package/dist/components/effects/GridPattern/GridPattern.js +1 -0
  442. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.d.ts +10 -0
  443. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.js +78 -0
  444. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.d.ts +22 -0
  445. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.js +239 -0
  446. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.types.d.ts +52 -0
  447. package/dist/components/effects/HalftoneCmyk/index.d.ts +2 -0
  448. package/dist/components/effects/HalftoneDots/HalftoneDots.d.ts +9 -0
  449. package/dist/components/effects/HalftoneDots/HalftoneDots.js +68 -0
  450. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.d.ts +13 -0
  451. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.js +296 -0
  452. package/dist/components/effects/HalftoneDots/HalftoneDots.types.d.ts +43 -0
  453. package/dist/components/effects/HalftoneDots/HalftoneDots.types.js +12 -0
  454. package/dist/components/effects/HalftoneDots/index.d.ts +3 -0
  455. package/dist/components/effects/ImageDithering/ImageDithering.d.ts +9 -0
  456. package/dist/components/effects/ImageDithering/ImageDithering.js +68 -0
  457. package/dist/components/effects/ImageDithering/ImageDithering.shaders.d.ts +12 -0
  458. package/dist/components/effects/ImageDithering/ImageDithering.shaders.js +117 -0
  459. package/dist/components/effects/ImageDithering/ImageDithering.types.d.ts +30 -0
  460. package/dist/components/effects/ImageDithering/ImageDithering.types.js +8 -0
  461. package/dist/components/effects/ImageDithering/index.d.ts +3 -0
  462. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +1 -0
  463. package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +1 -0
  464. package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +1 -0
  465. package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +1 -0
  466. package/dist/components/effects/InteractiveCharacters/hooks/useBlink.js +1 -0
  467. package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.js +1 -0
  468. package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.js +1 -0
  469. package/dist/components/effects/LiquidMetal/LiquidMetal.d.ts +9 -0
  470. package/dist/components/effects/LiquidMetal/LiquidMetal.js +61 -0
  471. package/dist/components/effects/LiquidMetal/LiquidMetal.shaders.d.ts +19 -0
  472. package/dist/components/effects/LiquidMetal/LiquidMetal.shaders.js +202 -0
  473. package/dist/components/effects/LiquidMetal/LiquidMetal.types.d.ts +34 -0
  474. package/dist/components/effects/LiquidMetal/LiquidMetal.types.js +9 -0
  475. package/dist/components/effects/LiquidMetal/index.d.ts +3 -0
  476. package/dist/components/effects/MagneticElement/MagneticElement.js +1 -0
  477. package/dist/components/effects/MeshGradient/MeshGradient.d.ts +25 -0
  478. package/dist/components/effects/MeshGradient/MeshGradient.js +47 -0
  479. package/dist/components/effects/MeshGradient/MeshGradient.types.d.ts +40 -0
  480. package/dist/components/effects/MeshGradient/MeshGradient.utils.d.ts +83 -0
  481. package/dist/components/effects/MeshGradient/MeshGradient.utils.js +112 -0
  482. package/dist/components/effects/MeshGradient/index.d.ts +4 -0
  483. package/dist/components/effects/Metaballs/Metaballs.d.ts +8 -0
  484. package/dist/components/effects/Metaballs/Metaballs.js +59 -0
  485. package/dist/components/effects/Metaballs/Metaballs.shaders.d.ts +10 -0
  486. package/dist/components/effects/Metaballs/Metaballs.shaders.js +102 -0
  487. package/dist/components/effects/Metaballs/Metaballs.types.d.ts +16 -0
  488. package/dist/components/effects/Metaballs/Metaballs.types.js +3 -0
  489. package/dist/components/effects/Metaballs/index.d.ts +2 -0
  490. package/dist/components/effects/Neumorphic/InsetCircleButton.js +1 -0
  491. package/dist/components/effects/Neumorphic/InsetPill.js +1 -0
  492. package/dist/components/effects/NoiseOverlay/NoiseOverlay.js +1 -0
  493. package/dist/components/effects/Overlay/Overlay.js +1 -0
  494. package/dist/components/effects/PaperTexture/PaperTexture.d.ts +9 -0
  495. package/dist/components/effects/PaperTexture/PaperTexture.js +61 -0
  496. package/dist/components/effects/PaperTexture/PaperTexture.shaders.d.ts +22 -0
  497. package/dist/components/effects/PaperTexture/PaperTexture.shaders.js +145 -0
  498. package/dist/components/effects/PaperTexture/PaperTexture.types.d.ts +19 -0
  499. package/dist/components/effects/PaperTexture/index.d.ts +2 -0
  500. package/dist/components/effects/Particles/Particles.js +1 -0
  501. package/dist/components/effects/Particles/Particles.scene.js +1 -0
  502. package/dist/components/effects/Preloader/Preloader.js +1 -0
  503. package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.js +1 -0
  504. package/dist/components/effects/PulsingBorder/PulsingBorder.d.ts +27 -0
  505. package/dist/components/effects/PulsingBorder/PulsingBorder.js +174 -0
  506. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.d.ts +14 -0
  507. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.js +258 -0
  508. package/dist/components/effects/PulsingBorder/PulsingBorder.types.d.ts +75 -0
  509. package/dist/components/effects/PulsingBorder/PulsingBorder.types.js +3 -0
  510. package/dist/components/effects/PulsingBorder/index.d.ts +2 -0
  511. package/dist/components/effects/ScrollReveal/ScrollReveal.js +1 -0
  512. package/dist/components/effects/Shimmer/Shimmer.d.ts +21 -0
  513. package/dist/components/effects/Shimmer/Shimmer.js +44 -0
  514. package/dist/components/effects/Shimmer/Shimmer.types.d.ts +49 -0
  515. package/dist/components/effects/Shimmer/index.d.ts +2 -0
  516. package/dist/components/effects/SmokeRing/SmokeRing.d.ts +8 -0
  517. package/dist/components/effects/SmokeRing/SmokeRing.js +62 -0
  518. package/dist/components/effects/SmokeRing/SmokeRing.shaders.d.ts +14 -0
  519. package/dist/components/effects/SmokeRing/SmokeRing.shaders.js +130 -0
  520. package/dist/components/effects/SmokeRing/SmokeRing.types.d.ts +22 -0
  521. package/dist/components/effects/SmokeRing/SmokeRing.types.js +3 -0
  522. package/dist/components/effects/SmokeRing/index.d.ts +2 -0
  523. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.d.ts +9 -0
  524. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.js +59 -0
  525. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.d.ts +14 -0
  526. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.js +129 -0
  527. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.d.ts +23 -0
  528. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.js +3 -0
  529. package/dist/components/effects/StaticGradientMesh/index.d.ts +2 -0
  530. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.d.ts +9 -0
  531. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.js +66 -0
  532. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.shaders.d.ts +13 -0
  533. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.shaders.js +169 -0
  534. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.types.d.ts +29 -0
  535. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.types.js +3 -0
  536. package/dist/components/effects/StaticRadialGradient/index.d.ts +2 -0
  537. package/dist/components/effects/StripePattern/StripePattern.js +1 -0
  538. package/dist/components/effects/TiltCard/TiltCard.glow.js +1 -0
  539. package/dist/components/effects/TiltCard/TiltCard.js +1 -0
  540. package/dist/components/effects/Water/Water.d.ts +9 -0
  541. package/dist/components/effects/Water/Water.js +65 -0
  542. package/dist/components/effects/Water/Water.shaders.d.ts +11 -0
  543. package/dist/components/effects/Water/Water.shaders.js +123 -0
  544. package/dist/components/effects/Water/Water.types.d.ts +25 -0
  545. package/dist/components/effects/Water/index.d.ts +2 -0
  546. package/dist/components/effects/index.d.ts +40 -0
  547. package/dist/components/effects/index.js +21 -0
  548. package/dist/components/effects/{AIOrb/variants/Aura → shared/ShaderCanvas}/ShaderCanvas.d.ts +4 -8
  549. package/dist/components/effects/{AIOrb/variants/Aura → shared/ShaderCanvas}/ShaderCanvas.js +109 -3
  550. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.types.d.ts +18 -0
  551. package/dist/components/effects/shared/ShaderCanvas/index.d.ts +2 -0
  552. package/dist/components/effects/shared/bayerMatrices.glsl.d.ts +10 -0
  553. package/dist/components/effects/shared/bayerMatrices.glsl.js +44 -0
  554. package/dist/components/effects/shared/imageUV.glsl.d.ts +12 -0
  555. package/dist/components/effects/shared/imageUV.glsl.js +26 -0
  556. package/dist/components/effects/shared/index.d.ts +7 -0
  557. package/dist/components/effects/shared/resolveShaderColor.d.ts +13 -0
  558. package/dist/components/effects/shared/resolveShaderColor.js +62 -0
  559. package/dist/components/effects/shared/resolveShaderColor.test.d.ts +1 -0
  560. package/dist/components/effects/shared/shaderNoise.glsl.d.ts +34 -0
  561. package/dist/components/effects/shared/shaderNoise.glsl.js +84 -0
  562. package/dist/components/forms/Checkbox/Checkbox.animations.js +1 -0
  563. package/dist/components/forms/Checkbox/Checkbox.js +8 -8
  564. package/dist/components/forms/Checkbox/Checkbox.theme.js +5 -4
  565. package/dist/components/forms/Checkbox/CheckboxContext.js +1 -0
  566. package/dist/components/forms/Checkbox/CheckboxGroup.js +4 -1
  567. package/dist/components/forms/ColorPicker/ColorPicker.js +21 -5
  568. package/dist/components/forms/ColorPicker/ColorPicker.types.d.ts +8 -0
  569. package/dist/components/forms/ColorPicker/ColorPicker2DCanvas.js +1 -0
  570. package/dist/components/forms/ColorPicker/ColorPickerBody.js +3 -2
  571. package/dist/components/forms/ColorPicker/ColorPickerContext.js +1 -0
  572. package/dist/components/forms/ColorPicker/ColorPickerEyeDropper.js +1 -0
  573. package/dist/components/forms/ColorPicker/ColorPickerFormatSelector.js +1 -0
  574. package/dist/components/forms/ColorPicker/ColorPickerGradient.js +1 -0
  575. package/dist/components/forms/ColorPicker/ColorPickerHeader.js +1 -0
  576. package/dist/components/forms/ColorPicker/ColorPickerImage.js +1 -0
  577. package/dist/components/forms/ColorPicker/ColorPickerInput.js +1 -0
  578. package/dist/components/forms/ColorPicker/ColorPickerPresets.js +1 -0
  579. package/dist/components/forms/ColorPicker/ColorPickerSavedColors.js +1 -0
  580. package/dist/components/forms/ColorPicker/ColorPickerSliders.js +1 -0
  581. package/dist/components/forms/ColorPicker/ColorPickerSwatch.js +1 -0
  582. package/dist/components/forms/ColorPicker/ColorPickerTrigger.js +17 -2
  583. package/dist/components/forms/Combobox/Combobox.js +81 -37
  584. package/dist/components/forms/Combobox/Combobox.types.d.ts +8 -0
  585. package/dist/components/forms/DatePicker/DatePicker.animations.js +1 -0
  586. package/dist/components/forms/DatePicker/DatePicker.d.ts +3 -27
  587. package/dist/components/forms/DatePicker/DatePicker.js +5 -4
  588. package/dist/components/forms/DatePicker/DatePicker.theme.js +5 -5
  589. package/dist/components/forms/DatePicker/DatePicker.types.d.ts +15 -0
  590. package/dist/components/forms/DatePicker/DatePickerBody.js +26 -21
  591. package/dist/components/forms/DatePicker/DatePickerContext.d.ts +29 -0
  592. package/dist/components/forms/DatePicker/DatePickerContext.js +6 -0
  593. package/dist/components/forms/DatePicker/DatePickerPresets.js +2 -1
  594. package/dist/components/forms/DatePicker/DatePickerTrigger.js +2 -1
  595. package/dist/components/forms/DateRangePicker/DateRangePicker.d.ts +3 -23
  596. package/dist/components/forms/DateRangePicker/DateRangePicker.js +18 -7
  597. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +2 -2
  598. package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +21 -0
  599. package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +18 -13
  600. package/dist/components/forms/DateRangePicker/DateRangePickerContext.d.ts +24 -0
  601. package/dist/components/forms/DateRangePicker/DateRangePickerContext.js +5 -0
  602. package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +2 -1
  603. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +2 -1
  604. package/dist/components/forms/FileUpload/FileUpload.js +2 -1
  605. package/dist/components/forms/FileUpload/FileUploadProgress.js +4 -3
  606. package/dist/components/forms/Input/Input.js +7 -3
  607. package/dist/components/forms/Input/Input.theme.js +11 -5
  608. package/dist/components/forms/Input/Input.types.d.ts +6 -0
  609. package/dist/components/forms/Input/index.d.ts +1 -0
  610. package/dist/components/forms/Input/inputMasks.d.ts +24 -0
  611. package/dist/components/forms/Input/inputMasks.js +61 -5
  612. package/dist/components/forms/InputAddress/InputAddress.d.ts +5 -0
  613. package/dist/components/forms/InputAddress/InputAddress.js +95 -13
  614. package/dist/components/forms/InputAddress/InputAddress.theme.js +4 -4
  615. package/dist/components/forms/InputAddress/InputAddress.types.d.ts +8 -2
  616. package/dist/components/forms/InputAddress/index.d.ts +1 -1
  617. package/dist/components/forms/InputCounter/InputCounter.js +63 -44
  618. package/dist/components/forms/InputCounter/InputCounter.types.d.ts +6 -0
  619. package/dist/components/forms/InputCreditCard/InputCreditCard.js +9 -3
  620. package/dist/components/forms/InputCreditCard/InputCreditCard.theme.js +4 -4
  621. package/dist/components/forms/InputCreditCard/InputCreditCard.types.d.ts +5 -1
  622. package/dist/components/forms/InputCreditCard/index.d.ts +1 -0
  623. package/dist/components/forms/InputDate/InputDate.js +1 -0
  624. package/dist/components/forms/InputOTP/InputOTP.js +21 -9
  625. package/dist/components/forms/InputOTP/InputOTP.types.d.ts +7 -1
  626. package/dist/components/forms/InputTag/InputTag.js +65 -21
  627. package/dist/components/forms/InputTag/InputTag.theme.js +2 -1
  628. package/dist/components/forms/InputTag/InputTag.types.d.ts +8 -0
  629. package/dist/components/forms/Mention/Mention.js +12 -5
  630. package/dist/components/forms/Mention/Mention.theme.js +2 -1
  631. package/dist/components/forms/Mention/Mention.types.d.ts +8 -0
  632. package/dist/components/forms/Mention/Mention.utils.js +1 -0
  633. package/dist/components/forms/Radio/Radio.animations.js +1 -0
  634. package/dist/components/forms/Radio/Radio.js +5 -1
  635. package/dist/components/forms/Radio/Radio.theme.js +9 -7
  636. package/dist/components/forms/Radio/RadioContext.js +1 -0
  637. package/dist/components/forms/Radio/RadioGroup.js +4 -1
  638. package/dist/components/forms/RichTextEditor/RichTextEditor.animations.js +1 -0
  639. package/dist/components/forms/RichTextEditor/RichTextEditor.js +70 -60
  640. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +3 -2
  641. package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +14 -0
  642. package/dist/components/forms/Select/Select.animations.js +17 -25
  643. package/dist/components/forms/Select/Select.d.ts +3 -1
  644. package/dist/components/forms/Select/Select.js +55 -21
  645. package/dist/components/forms/Select/Select.theme.js +2 -2
  646. package/dist/components/forms/Select/Select.types.d.ts +28 -1
  647. package/dist/components/forms/Select/useSelectState.js +7 -0
  648. package/dist/components/forms/SelectableCard/SelectableCard.js +1 -0
  649. package/dist/components/forms/SelectableCard/SelectableCardContext.js +1 -0
  650. package/dist/components/forms/SelectableCard/SelectableCardGroup.js +1 -0
  651. package/dist/components/forms/Signature/Signature.js +13 -3
  652. package/dist/components/forms/Signature/Signature.types.d.ts +6 -0
  653. package/dist/components/forms/Slider/Slider.js +2 -1
  654. package/dist/components/forms/Switch/Switch.js +9 -2
  655. package/dist/components/forms/Switch/Switch.theme.js +5 -3
  656. package/dist/components/forms/Textarea/Textarea.js +7 -3
  657. package/dist/components/forms/Textarea/Textarea.types.d.ts +6 -0
  658. package/dist/components/forms/TimePicker/TimePicker.d.ts +2 -12
  659. package/dist/components/forms/TimePicker/TimePicker.js +8 -5
  660. package/dist/components/forms/TimePicker/TimePicker.theme.js +4 -5
  661. package/dist/components/forms/TimePicker/TimePicker.types.d.ts +15 -0
  662. package/dist/components/forms/TimePicker/TimePickerContent.js +12 -7
  663. package/dist/components/forms/TimePicker/TimePickerContext.d.ts +15 -0
  664. package/dist/components/forms/TimePicker/TimePickerContext.js +6 -0
  665. package/dist/components/forms/TimePicker/TimePickerTrigger.js +18 -4
  666. package/dist/components/forms/TimePicker/WheelColumn.js +1 -0
  667. package/dist/components/forms/TimePicker/useWheelPicker.js +1 -0
  668. package/dist/components/forms/forms.theme.d.ts +1 -0
  669. package/dist/components/forms/forms.theme.js +55 -18
  670. package/dist/components/forms/index.d.ts +1 -0
  671. package/dist/components/forms/index.js +6 -2
  672. package/dist/components/generative/GenerativeView.js +1 -0
  673. package/dist/components/generative/actions.test.d.ts +1 -0
  674. package/dist/components/generative/registry.js +24 -6
  675. package/dist/components/generative/schema.generated.js +450 -35
  676. package/dist/components/generative/streaming.test.d.ts +1 -0
  677. package/dist/components/generative/tools.test.d.ts +1 -0
  678. package/dist/components/generative/useGenerativeStream.js +1 -0
  679. package/dist/components/generative/validate.d.ts +1 -1
  680. package/dist/components/generative/validate.js +121 -29
  681. package/dist/components/generative/validate.test.d.ts +1 -0
  682. package/dist/components/layout/AppShell/AppShell.js +1 -0
  683. package/dist/components/layout/AppShell/AppShellContext.js +1 -0
  684. package/dist/components/layout/AppShell/AppShellMain.js +1 -0
  685. package/dist/components/layout/AppShell/AppShellRightPanel.js +1 -0
  686. package/dist/components/layout/AppShell/AppShellSidebar.js +1 -0
  687. package/dist/components/layout/FormLayout/FormLayout.js +1 -1
  688. package/dist/components/layout/FormLayout/FormLayoutSection.js +1 -0
  689. package/dist/components/layout/Grid/Grid.d.ts +1 -1
  690. package/dist/components/layout/Grid/Grid.js +11 -3
  691. package/dist/components/layout/Grid/Grid.types.d.ts +15 -1
  692. package/dist/components/layout/Grid/index.d.ts +1 -1
  693. package/dist/components/layout/Section/Section.js +1 -0
  694. package/dist/components/layout/Stack/Stack.d.ts +1 -1
  695. package/dist/components/layout/Stack/Stack.js +11 -3
  696. package/dist/components/layout/Stack/Stack.types.d.ts +9 -2
  697. package/dist/components/layout/index.d.ts +0 -1
  698. package/dist/components/layout/index.js +0 -2
  699. package/dist/generative.schema.json +450 -35
  700. package/dist/hooks/useClickOutside.js +1 -0
  701. package/dist/hooks/useDarkMode.js +1 -0
  702. package/dist/hooks/useFocusTrap.js +1 -0
  703. package/dist/hooks/useIsClient.js +1 -0
  704. package/dist/hooks/useMediaQuery.js +1 -0
  705. package/dist/hooks/useNetworkStatus.d.ts +0 -4
  706. package/dist/hooks/useNetworkStatus.js +2 -5
  707. package/dist/hooks/useOverlay.js +1 -0
  708. package/dist/hooks/useScaleBackground.js +1 -0
  709. package/dist/hooks/useSelectPortal.js +1 -0
  710. package/dist/hooks/useSlidingNumber.js +1 -0
  711. package/dist/hooks/useStreamingSSE.d.ts +0 -5
  712. package/dist/hooks/useStreamingSSE.js +1 -5
  713. package/dist/hooks/useTypewriter.js +1 -0
  714. package/dist/index.d.ts +1 -0
  715. package/dist/index.js +189 -180
  716. package/dist/registry.json +1945 -681
  717. package/dist/styles.css +1 -1
  718. package/dist/test/render.d.ts +11 -0
  719. package/dist/test/setup.d.ts +1 -0
  720. package/dist/theme/SurfaceContext.d.ts +98 -0
  721. package/dist/theme/SurfaceContext.js +114 -0
  722. package/dist/theme/ThemeContext.js +19 -0
  723. package/dist/theme/animations.d.ts +75 -0
  724. package/dist/theme/animations.js +132 -0
  725. package/dist/theme/index.d.ts +5 -0
  726. package/dist/tools.json +458 -35
  727. package/dist/utils/actionQueue.d.ts +0 -4
  728. package/dist/utils/actionQueue.js +1 -4
  729. package/dist/utils/cn.js +21 -1
  730. package/dist/utils/colorUtils.d.ts +31 -1
  731. package/dist/utils/colorUtils.js +49 -4
  732. package/dist/utils/dateUtils.js +21 -16
  733. package/dist/utils/index.d.ts +1 -1
  734. package/dist/utils/performanceMonitor.js +1 -0
  735. package/dist/utils/smoothScrollUtils.js +1 -0
  736. package/package.json +23 -5
  737. package/src/global.scss +87 -0
  738. package/src/styles/theme.css +263 -156
  739. package/dist/components/charts/shared/BarRenderer/index.d.ts +0 -3
  740. package/dist/components/charts/shared/ChartContainer/ChartContainer.d.ts +0 -85
  741. package/dist/components/charts/shared/ChartContainer/index.d.ts +0 -3
  742. package/dist/components/charts/shared/ChartLegend/ChartLegendContent.d.ts +0 -7
  743. package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +0 -18
  744. package/dist/components/charts/shared/LineRenderer/index.d.ts +0 -2
  745. package/dist/components/core/Popover/Popover.animations.js +0 -13
  746. package/dist/components/layout/PageLayout/PageLayout.d.ts +0 -7
  747. package/dist/components/layout/PageLayout/PageLayout.js +0 -51
  748. package/dist/components/layout/PageLayout/PageLayout.theme.d.ts +0 -3
  749. package/dist/components/layout/PageLayout/PageLayout.theme.js +0 -39
  750. package/dist/components/layout/PageLayout/PageLayout.types.d.ts +0 -84
  751. package/dist/components/layout/PageLayout/PageLayoutContent.d.ts +0 -3
  752. package/dist/components/layout/PageLayout/PageLayoutContent.js +0 -14
  753. package/dist/components/layout/PageLayout/PageLayoutHeader.d.ts +0 -3
  754. package/dist/components/layout/PageLayout/PageLayoutHeader.js +0 -12
  755. package/dist/components/layout/PageLayout/PageLayoutSidebar.d.ts +0 -3
  756. package/dist/components/layout/PageLayout/PageLayoutSidebar.js +0 -14
  757. package/dist/components/layout/PageLayout/index.d.ts +0 -3
  758. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.d.ts +0 -0
  759. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.theme.d.ts +0 -0
  760. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.theme.js +0 -0
  761. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.types.d.ts +0 -0
  762. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/index.d.ts +0 -0
@@ -1,152 +1,214 @@
1
+ "use client";
1
2
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useId, useRef, useState, useCallback, useMemo } from 'react';
3
- import { AnimatePresence, motion } from 'motion/react';
3
+ import { useRef, useId, useState, useCallback, useMemo } from 'react';
4
+ import { useReducedMotion, AnimatePresence, motion } from 'motion/react';
4
5
  import { cn } from '../../../utils/cn.js';
5
6
  import { funnelChartTheme } from './FunnelChart.theme.js';
6
- import { labelVariants, badgeVariants, summaryVariants, segmentVariants, verticalSegmentVariants } from './FunnelChart.animations.js';
7
+ import { summaryVariants, labelVariants, badgeVariants } from './FunnelChart.animations.js';
7
8
  import { ChartTooltip } from '../shared/ChartTooltip/ChartTooltip.js';
8
9
  import { Badge } from '../../core/Badge/Badge.js';
9
10
  import { useTooltipPosition } from '../hooks/useTooltipPosition.js';
11
+ import { useChartDimensions } from '../hooks/useChartDimensions.js';
10
12
 
13
+ const sanitizeSvgId = (value) => value.replace(/[^a-zA-Z0-9_-]/g, "");
14
+ const resolveColor = (color, fallback) => {
15
+ if (!color)
16
+ return fallback;
17
+ if (!color.startsWith("var(") &&
18
+ !color.startsWith("#") &&
19
+ !color.startsWith("rgb") &&
20
+ !color.startsWith("hsl") &&
21
+ color.includes("-")) {
22
+ return `var(--color-${color})`;
23
+ }
24
+ return color;
25
+ };
11
26
  /**
12
- * FunnelChart Component
13
- *
14
- * Displays conversion funnel data with trapezoid shapes showing progressive dropoff.
15
- * Features animations, keyboard navigation, and accessibility support.
27
+ * Displays conversion funnel data with trapezoid shapes showing progressive
28
+ * dropoff. The render keeps the chart surface focused: stage-level detail lives
29
+ * in labels/tooltips while conversion and dropoff badges appear on focus.
16
30
  */
17
- const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true, showValues = true, showLabels = true, showDropoff = false, showConversionRate = true, showSummary = true, colors, theme: themeOverrides, className, orientation = "horizontal", curved = true, useGradient = true, fillOpacity = 0.8, onStageClick, formatValue, labelPosition = "top", summaryPosition = "top-right", animate = true, onStageFocus, ...props }) => {
31
+ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true, showValues = true, showLabels = true, showDropoff = false, showConversionRate = true, showSummary = true, colors, theme: themeOverrides, className, orientation = "horizontal", curved = true, useGradient = true, fillOpacity = 0.85, onStageClick, formatValue, labelPosition = "top", summaryPosition = "top-right", animate = true, onStageFocus, ...props }) => {
18
32
  const theme = { ...funnelChartTheme, ...(themeOverrides || {}) };
19
33
  const chartColors = colors || theme.colors || funnelChartTheme.colors;
20
- const chartId = useId();
21
- const containerRef = useRef(null);
22
- // Use the shared tooltip positioning hook
34
+ const rootRef = useRef(null);
35
+ const chartRef = useRef(null);
36
+ const { dimensions, measured } = useChartDimensions(chartRef);
37
+ const shouldReduceMotion = useReducedMotion();
38
+ const shouldAnimate = animate && !shouldReduceMotion;
39
+ const chartId = sanitizeSvgId(useId());
23
40
  const { tooltipData, tooltipRef, handleMouseEnter: tooltipMouseEnter, handleMouseMove: tooltipMouseMove, handleMouseLeave: tooltipMouseLeave, } = useTooltipPosition({
24
- containerRef,
41
+ containerRef: rootRef,
25
42
  });
26
- // Hover state for dimming non-hovered segments
27
43
  const [hoveredIndex, setHoveredIndex] = useState(null);
28
- // Keyboard focus state
29
- const [focusedIndex, setFocusedIndex] = useState(null);
30
- // Format value helper
44
+ const [focusedIndex, setFocusedIndex] = useState(0);
45
+ const activeIndex = hoveredIndex !== null && hoveredIndex !== void 0 ? hoveredIndex : focusedIndex;
31
46
  const formatDisplayValue = useCallback((value) => {
32
- if (formatValue) {
47
+ if (formatValue)
33
48
  return formatValue(value);
34
- }
35
49
  return value.toLocaleString();
36
50
  }, [formatValue]);
37
51
  const maxValue = useMemo(() => {
38
- if (data.length === 0)
52
+ if (!data.length)
39
53
  return 0;
40
- return Math.max(...data.map((d) => d.value));
54
+ return Math.max(...data.map((d) => Number.isFinite(d.value) ? d.value : 0));
41
55
  }, [data]);
42
56
  const stages = useMemo(() => {
43
- var _a;
44
- if (data.length === 0 || maxValue === 0) {
57
+ if (!data.length || maxValue <= 0)
45
58
  return [];
46
- }
47
- const baseColor = ((_a = data[0]) === null || _a === void 0 ? void 0 : _a.color) || chartColors[0];
48
59
  return data.map((item, index) => {
49
- const percentage = (item.value / maxValue) * 100;
50
- const prevValue = index > 0 ? data[index - 1].value : 0;
60
+ const safeValue = Number.isFinite(item.value) ? Math.max(0, item.value) : 0;
61
+ const percentage = (safeValue / maxValue) * 100;
62
+ const prevValue = index > 0 ? Math.max(0, data[index - 1].value) : 0;
51
63
  const dropoff = index > 0 && prevValue > 0
52
- ? ((prevValue - item.value) / prevValue) * 100
64
+ ? ((prevValue - safeValue) / prevValue) * 100
53
65
  : 0;
54
- const conversionRate = index > 0 && prevValue > 0 ? (item.value / prevValue) * 100 : 100;
55
- const usersLost = index > 0 ? prevValue - item.value : 0;
56
- const opacityRange = 0.8;
57
- const minOpacity = 0.4;
58
- const stageOpacity = minOpacity + opacityRange * (index / Math.max(1, data.length - 1));
66
+ const conversionRate = index > 0 && prevValue > 0 ? (safeValue / prevValue) * 100 : 100;
67
+ const usersLost = index > 0 ? Math.max(0, prevValue - safeValue) : 0;
68
+ const color = resolveColor(item.color, chartColors[index % chartColors.length] || "var(--color-primary)");
59
69
  return {
60
70
  ...item,
71
+ value: safeValue,
61
72
  percentage,
62
73
  dropoff,
63
74
  conversionRate,
64
75
  usersLost,
65
- color: baseColor,
66
- opacity: stageOpacity,
76
+ color,
77
+ opacity: Math.max(0.54, 0.96 - index * 0.08),
67
78
  gradientId: `funnel-gradient-${chartId}-${index}`,
68
79
  };
69
80
  });
70
81
  }, [data, maxValue, chartColors, chartId]);
71
82
  const containerHeight = typeof height === "number" ? `${height}px` : height;
72
83
  const containerWidth = typeof width === "number" ? `${width}px` : width;
73
- // Return empty state if no valid data
74
84
  if (stages.length === 0) {
75
- return (jsx("div", { className: cn(theme.baseStyle, className), style: { width: containerWidth, height: containerHeight }, role: "img", "aria-label": "Empty funnel chart - no data available", ...props, children: jsx("div", { className: "flex items-center justify-center h-full text-[var(--color-text-muted)] text-base", children: "No data available" }) }));
85
+ return (jsx("div", { className: cn(theme.baseStyle, "justify-center text-[var(--color-text-muted)]", className), style: { width: containerWidth, height: containerHeight }, role: "img", "aria-label": "Empty funnel chart - no data available", ...props, children: jsx("span", { children: "No data available" }) }));
76
86
  }
77
- const viewBoxWidth = 150;
78
- const viewBoxHeight = 100;
79
- const stageHeight = viewBoxHeight / stages.length;
80
- const stageWidth = viewBoxWidth / stages.length;
81
- const verticalPadding = 5;
82
- const availableThickness = viewBoxHeight - verticalPadding * 2;
83
- const minThickness = 3;
87
+ const hasTopSummary = showSummary && summaryPosition !== "none" && summaryPosition.startsWith("top");
88
+ const hasBottomSummary = showSummary && summaryPosition !== "none" && summaryPosition.startsWith("bottom");
89
+ const plotMargin = {
90
+ top: orientation === "horizontal" && labelPosition === "top" ? 46 : 18,
91
+ right: orientation === "vertical" && (showConversionRate || showDropoff) ? 82 : 24,
92
+ bottom: orientation === "horizontal" && labelPosition === "bottom" ? 46 : 18,
93
+ left: orientation === "vertical" && (showConversionRate || showDropoff) ? 82 : 24,
94
+ };
95
+ const innerWidth = Math.max(0, dimensions.width - plotMargin.left - plotMargin.right);
96
+ const innerHeight = Math.max(0, dimensions.height - plotMargin.top - plotMargin.bottom);
97
+ const stageWidth = stages.length > 0 ? innerWidth / stages.length : 0;
98
+ const stageHeight = stages.length > 0 ? innerHeight / stages.length : 0;
99
+ const minThickness = orientation === "horizontal" ? 18 : 24;
100
+ const availableThickness = orientation === "horizontal" ? innerHeight : innerWidth;
84
101
  const getThickness = (percentage) => {
85
102
  if (!percentage)
86
103
  return minThickness;
87
104
  return Math.max(minThickness, (percentage / 100) * availableThickness);
88
105
  };
89
- const generateHorizontalFunnelPath = (index) => {
106
+ const getHorizontalBoundaryPoint = (boundaryIndex, edge) => {
107
+ const boundedIndex = Math.max(0, Math.min(stages.length, boundaryIndex));
108
+ const stageIndex = Math.min(boundedIndex, stages.length - 1);
109
+ const thickness = getThickness(stages[stageIndex].percentage);
110
+ const centerY = plotMargin.top + innerHeight / 2;
111
+ return {
112
+ x: plotMargin.left + boundedIndex * stageWidth,
113
+ y: edge === "top" ? centerY - thickness / 2 : centerY + thickness / 2,
114
+ };
115
+ };
116
+ const getSmoothHorizontalCurve = (index, edge) => {
117
+ const p0 = getHorizontalBoundaryPoint(index - 1, edge);
118
+ const p1 = getHorizontalBoundaryPoint(index, edge);
119
+ const p2 = getHorizontalBoundaryPoint(index + 1, edge);
120
+ const p3 = getHorizontalBoundaryPoint(index + 2, edge);
121
+ const smoothing = 0.22;
122
+ return {
123
+ start: p1,
124
+ end: p2,
125
+ cp1: {
126
+ x: p1.x + (p2.x - p0.x) * smoothing,
127
+ y: p1.y + (p2.y - p0.y) * smoothing,
128
+ },
129
+ cp2: {
130
+ x: p2.x - (p3.x - p1.x) * smoothing,
131
+ y: p2.y - (p3.y - p1.y) * smoothing,
132
+ },
133
+ };
134
+ };
135
+ const getHorizontalGeometry = (index) => {
90
136
  const stage = stages[index];
91
137
  const nextStage = stages[index + 1] || stage;
92
- const xStart = index * stageWidth;
138
+ const xStart = plotMargin.left + index * stageWidth;
93
139
  const xEnd = xStart + stageWidth;
94
140
  const startThickness = getThickness(stage.percentage);
95
141
  const endThickness = getThickness(nextStage.percentage);
96
- const centerY = viewBoxHeight / 2;
142
+ const centerY = plotMargin.top + innerHeight / 2;
97
143
  const startTop = centerY - startThickness / 2;
98
144
  const startBottom = centerY + startThickness / 2;
99
145
  const endTop = centerY - endThickness / 2;
100
146
  const endBottom = centerY + endThickness / 2;
101
- if (!curved) {
102
- return `
103
- M ${xStart} ${startTop}
104
- L ${xEnd} ${endTop}
105
- L ${xEnd} ${endBottom}
106
- L ${xStart} ${startBottom}
107
- Z
108
- `;
109
- }
110
- const dx = xEnd - xStart;
111
- const controlDistance = dx * 0.025;
112
- const topCp1x = xStart + controlDistance;
113
- const topCp1y = startTop;
114
- const topCp2x = xEnd - controlDistance;
115
- const topCp2y = endTop;
116
- const bottomCp1x = xEnd - controlDistance;
117
- const bottomCp1y = endBottom;
118
- const bottomCp2x = xStart + controlDistance;
119
- const bottomCp2y = startBottom;
120
- return `
121
- M ${xStart} ${startTop}
122
- C ${topCp1x} ${topCp1y}, ${topCp2x} ${topCp2y}, ${xEnd} ${endTop}
123
- L ${xEnd} ${endBottom}
124
- C ${bottomCp1x} ${bottomCp1y}, ${bottomCp2x} ${bottomCp2y}, ${xStart} ${startBottom}
125
- Z
126
- `;
147
+ const path = curved
148
+ ? (() => {
149
+ const topCurve = getSmoothHorizontalCurve(index, "top");
150
+ const bottomCurve = getSmoothHorizontalCurve(index, "bottom");
151
+ return `
152
+ M ${topCurve.start.x} ${topCurve.start.y}
153
+ C ${topCurve.cp1.x} ${topCurve.cp1.y}, ${topCurve.cp2.x} ${topCurve.cp2.y}, ${topCurve.end.x} ${topCurve.end.y}
154
+ L ${bottomCurve.end.x} ${bottomCurve.end.y}
155
+ C ${bottomCurve.cp2.x} ${bottomCurve.cp2.y}, ${bottomCurve.cp1.x} ${bottomCurve.cp1.y}, ${bottomCurve.start.x} ${bottomCurve.start.y}
156
+ Z
157
+ `;
158
+ })()
159
+ : `
160
+ M ${xStart} ${startTop}
161
+ L ${xEnd} ${endTop}
162
+ L ${xEnd} ${endBottom}
163
+ L ${xStart} ${startBottom}
164
+ Z
165
+ `;
166
+ return {
167
+ path,
168
+ centerX: xStart + stageWidth / 2,
169
+ centerY,
170
+ boundaryX: xStart,
171
+ boundaryY: centerY,
172
+ labelWidth: Math.max(72, stageWidth - 16),
173
+ labelFitsInside: Math.min(startThickness, endThickness) >= 48 && stageWidth >= 92,
174
+ };
127
175
  };
128
- const generateVerticalFunnelPath = (index) => {
176
+ const getVerticalGeometry = (index) => {
129
177
  const stage = stages[index];
130
178
  const nextStage = stages[index + 1] || stage;
131
- const y = index * stageHeight;
132
- const topWidth = stage.percentage;
133
- const bottomWidth = nextStage.percentage;
134
- const leftOffset = (100 - topWidth) / 2;
135
- const rightOffset = 100 - leftOffset;
136
- const nextLeftOffset = (100 - bottomWidth) / 2;
137
- const nextRightOffset = 100 - nextLeftOffset;
138
- return `
139
- M ${leftOffset} ${y}
140
- L ${rightOffset} ${y}
141
- L ${nextRightOffset} ${y + stageHeight}
142
- L ${nextLeftOffset} ${y + stageHeight}
143
- Z
144
- `;
179
+ const yStart = plotMargin.top + index * stageHeight;
180
+ const yEnd = yStart + stageHeight;
181
+ const topWidth = getThickness(stage.percentage);
182
+ const bottomWidth = getThickness(nextStage.percentage);
183
+ const centerX = plotMargin.left + innerWidth / 2;
184
+ const topLeft = centerX - topWidth / 2;
185
+ const topRight = centerX + topWidth / 2;
186
+ const bottomLeft = centerX - bottomWidth / 2;
187
+ const bottomRight = centerX + bottomWidth / 2;
188
+ return {
189
+ path: `
190
+ M ${topLeft} ${yStart}
191
+ L ${topRight} ${yStart}
192
+ L ${bottomRight} ${yEnd}
193
+ L ${bottomLeft} ${yEnd}
194
+ Z
195
+ `,
196
+ centerX,
197
+ centerY: yStart + stageHeight / 2,
198
+ boundaryX: centerX,
199
+ boundaryY: yStart,
200
+ labelWidth: Math.max(96, Math.min(topWidth, bottomWidth) - 18),
201
+ labelFitsInside: Math.min(topWidth, bottomWidth) >= 132 && stageHeight >= 56,
202
+ };
145
203
  };
146
- // Tooltip handlers
147
- const handleMouseEnter = (e, stage, index) => {
148
- // Build series data for the tooltip
149
- const seriesItems = [
204
+ const geometries = stages.map((_, index) => orientation === "horizontal"
205
+ ? getHorizontalGeometry(index)
206
+ : getVerticalGeometry(index));
207
+ const overallConversion = stages.length > 1 && stages[0].value > 0
208
+ ? ((stages[stages.length - 1].value / stages[0].value) * 100).toFixed(1)
209
+ : "100";
210
+ const buildTooltipContent = (stage, index) => {
211
+ const series = [
150
212
  {
151
213
  key: "value",
152
214
  label: "Value",
@@ -155,13 +217,12 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
155
217
  },
156
218
  {
157
219
  key: "percentage",
158
- label: "Of Total",
220
+ label: "Of total",
159
221
  value: `${stage.percentage.toFixed(1)}%`,
160
222
  },
161
223
  ];
162
- // Add conversion and lost info for non-first stages
163
224
  if (index > 0) {
164
- seriesItems.push({
225
+ series.push({
165
226
  key: "conversion",
166
227
  label: "Conversion",
167
228
  value: `${stage.conversionRate.toFixed(1)}%`,
@@ -169,293 +230,180 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
169
230
  ? "var(--color-success)"
170
231
  : "var(--color-warning)",
171
232
  });
172
- seriesItems.push({
233
+ series.push({
173
234
  key: "lost",
174
235
  label: "Lost",
175
236
  value: formatDisplayValue(stage.usersLost),
176
237
  color: "var(--color-danger)",
177
238
  });
178
239
  }
179
- const tooltipContent = {
240
+ return {
180
241
  category: stage.name,
181
- series: seriesItems,
242
+ series,
182
243
  };
183
- tooltipMouseEnter(e, tooltipContent);
184
- setHoveredIndex(index);
185
244
  };
186
- const handleMouseMove = (e) => {
187
- tooltipMouseMove(e);
245
+ const handleMouseEnter = (e, stage, index) => {
246
+ const geometry = geometries[index];
247
+ tooltipMouseEnter(e, buildTooltipContent(stage, index), {
248
+ x: geometry.centerX,
249
+ y: geometry.centerY,
250
+ dimensions,
251
+ });
252
+ setHoveredIndex(index);
188
253
  };
189
254
  const handleMouseLeave = () => {
190
255
  tooltipMouseLeave();
191
256
  setHoveredIndex(null);
192
257
  };
193
258
  const handleClick = (stage, index) => {
194
- if (onStageClick) {
195
- onStageClick(stage, index);
196
- }
259
+ onStageClick === null || onStageClick === void 0 ? void 0 : onStageClick(stage, index);
197
260
  };
198
- // Keyboard navigation handlers
199
- const handleKeyDown = (e, stage, index) => {
200
- var _a, _b, _c, _d;
201
- const isHorizontal = orientation === "horizontal";
202
- const nextKey = isHorizontal ? "ArrowRight" : "ArrowDown";
203
- const prevKey = isHorizontal ? "ArrowLeft" : "ArrowUp";
204
- switch (e.key) {
205
- case nextKey:
206
- e.preventDefault();
207
- if (index < stages.length - 1) {
208
- setFocusedIndex(index + 1);
209
- const nextButton = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-stage-index="${index + 1}"]`);
210
- nextButton === null || nextButton === void 0 ? void 0 : nextButton.focus();
211
- }
212
- break;
213
- case prevKey:
214
- e.preventDefault();
215
- if (index > 0) {
216
- setFocusedIndex(index - 1);
217
- const prevButton = (_b = containerRef.current) === null || _b === void 0 ? void 0 : _b.querySelector(`[data-stage-index="${index - 1}"]`);
218
- prevButton === null || prevButton === void 0 ? void 0 : prevButton.focus();
219
- }
220
- break;
221
- case "Enter":
222
- case " ":
223
- e.preventDefault();
224
- handleClick(stage, index);
225
- break;
226
- case "Home":
227
- e.preventDefault();
228
- setFocusedIndex(0);
229
- const firstButton = (_c = containerRef.current) === null || _c === void 0 ? void 0 : _c.querySelector('[data-stage-index="0"]');
230
- firstButton === null || firstButton === void 0 ? void 0 : firstButton.focus();
231
- break;
232
- case "End":
233
- e.preventDefault();
234
- const lastIndex = stages.length - 1;
235
- setFocusedIndex(lastIndex);
236
- const lastButton = (_d = containerRef.current) === null || _d === void 0 ? void 0 : _d.querySelector(`[data-stage-index="${lastIndex}"]`);
237
- lastButton === null || lastButton === void 0 ? void 0 : lastButton.focus();
238
- break;
261
+ const handleKeyDown = (e) => {
262
+ const nextKey = orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
263
+ const prevKey = orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
264
+ if (e.key === nextKey) {
265
+ e.preventDefault();
266
+ setFocusedIndex((index) => Math.min(stages.length - 1, index + 1));
267
+ return;
239
268
  }
240
- };
241
- const handleFocus = (stage, index) => {
242
- setFocusedIndex(index);
243
- setHoveredIndex(index);
244
- onStageFocus === null || onStageFocus === void 0 ? void 0 : onStageFocus(stage, index);
245
- };
246
- const handleBlur = () => {
247
- setFocusedIndex(null);
248
- setHoveredIndex(null);
249
- };
250
- // Get summary position classes
251
- const getSummaryPositionClasses = (position) => {
252
- switch (position) {
253
- case "top-right":
254
- return "top-2 right-2";
255
- case "top-left":
256
- return "top-2 left-2";
257
- case "bottom-right":
258
- return "bottom-2 right-2";
259
- case "bottom-left":
260
- return "bottom-2 left-2";
261
- default:
262
- return "top-2 right-2";
269
+ if (e.key === prevKey) {
270
+ e.preventDefault();
271
+ setFocusedIndex((index) => Math.max(0, index - 1));
272
+ return;
263
273
  }
264
- };
265
- // Get label vertical position
266
- const getLabelTopPosition = (position) => {
267
- switch (position) {
268
- case "top":
269
- return "0";
270
- case "bottom":
271
- return "auto";
272
- case "inside":
273
- return "50%";
274
- default:
275
- return "0";
274
+ if (e.key === "Home") {
275
+ e.preventDefault();
276
+ setFocusedIndex(0);
277
+ return;
276
278
  }
277
- };
278
- const getLabelBottomPosition = (position) => {
279
- switch (position) {
280
- case "bottom":
281
- return "0";
282
- default:
283
- return "auto";
279
+ if (e.key === "End") {
280
+ e.preventDefault();
281
+ setFocusedIndex(stages.length - 1);
282
+ return;
283
+ }
284
+ if (e.key === "Enter" || e.key === " ") {
285
+ e.preventDefault();
286
+ handleClick(stages[focusedIndex], focusedIndex);
284
287
  }
285
288
  };
286
- // Calculate overall conversion
287
- const overallConversion = stages.length > 1
288
- ? ((stages[stages.length - 1].value / stages[0].value) * 100).toFixed(1)
289
- : "100";
290
- // Animation props based on animate flag
291
- const getAnimationProps = (index) => {
292
- if (!animate) {
293
- return {};
289
+ const renderSummary = () => {
290
+ if (!showSummary || summaryPosition === "none" || stages.length <= 1) {
291
+ return null;
294
292
  }
295
- return {
296
- variants: orientation === "horizontal"
297
- ? segmentVariants
298
- : verticalSegmentVariants,
299
- initial: "hidden",
300
- animate: "visible",
301
- exit: "exit",
302
- custom: index,
303
- };
293
+ return (jsxs(motion.div, { className: cn("flex w-full items-center justify-between gap-4 rounded-md border border-[var(--color-border)] bg-[var(--color-background)] px-3 py-2 shadow-sm", summaryPosition.endsWith("left") ? "text-left" : "text-right"), ...(shouldAnimate
294
+ ? {
295
+ variants: summaryVariants,
296
+ initial: "hidden",
297
+ animate: "visible",
298
+ }
299
+ : {}), children: [jsxs("div", { children: [jsx("div", { className: "text-sm text-[var(--color-text-secondary)]", children: "Overall conversion" }), jsxs("div", { className: "text-lg font-semibold text-[var(--color-text-primary)]", children: [overallConversion, "%"] })] }), jsxs("div", { className: "text-sm text-[var(--color-text-muted)]", children: [formatDisplayValue(stages[0].value), " to", " ", formatDisplayValue(stages[stages.length - 1].value)] })] }));
300
+ };
301
+ const renderStageLabel = (stage, index) => {
302
+ if (!showLabels || labelPosition === "tooltip-only" || !measured)
303
+ return null;
304
+ const geometry = geometries[index];
305
+ const isInside = labelPosition === "inside" ||
306
+ (orientation === "vertical" && geometry.labelFitsInside);
307
+ const shouldShowInside = isInside && geometry.labelFitsInside;
308
+ const top = orientation === "horizontal"
309
+ ? shouldShowInside
310
+ ? geometry.centerY
311
+ : labelPosition === "bottom"
312
+ ? dimensions.height - 30
313
+ : 12
314
+ : geometry.centerY;
315
+ const left = orientation === "vertical" && !shouldShowInside
316
+ ? plotMargin.left + innerWidth + 14
317
+ : geometry.centerX;
318
+ return (jsxs(motion.div, { className: "absolute pointer-events-none text-center", style: {
319
+ left,
320
+ top,
321
+ width: Math.min(geometry.labelWidth, 180),
322
+ transform: shouldShowInside
323
+ ? "translate(-50%, -50%)"
324
+ : orientation === "vertical"
325
+ ? "translateY(-50%)"
326
+ : "translateX(-50%)",
327
+ }, ...(shouldAnimate
328
+ ? {
329
+ variants: labelVariants,
330
+ initial: "hidden",
331
+ animate: "visible",
332
+ custom: index,
333
+ }
334
+ : {}), children: [jsx("div", { className: cn("truncate text-sm font-semibold leading-5", shouldShowInside
335
+ ? "text-white drop-shadow-md"
336
+ : "text-[var(--color-text-primary)]"), title: stage.name, children: stage.name }), (showValues || showPercentages) && (jsxs("div", { className: cn("truncate text-xs leading-4", shouldShowInside
337
+ ? "text-white/90 drop-shadow-md"
338
+ : "text-[var(--color-text-secondary)]"), children: [showValues && formatDisplayValue(stage.value), showValues && showPercentages && " / ", showPercentages && `${stage.percentage.toFixed(0)}%`] }))] }, `label-${stage.name}`));
339
+ };
340
+ const renderActiveBadge = () => {
341
+ const index = activeIndex;
342
+ if (!measured || index <= 0 || index >= stages.length)
343
+ return null;
344
+ const stage = stages[index];
345
+ const geometry = geometries[index];
346
+ const isGoodConversion = stage.conversionRate >= 50;
347
+ return (jsxs(motion.div, { className: "absolute pointer-events-none", style: {
348
+ left: orientation === "horizontal"
349
+ ? geometry.boundaryX
350
+ : plotMargin.left + 8,
351
+ top: orientation === "horizontal"
352
+ ? geometry.boundaryY
353
+ : geometry.boundaryY,
354
+ transform: orientation === "horizontal"
355
+ ? "translate(-50%, -50%)"
356
+ : "translateY(-50%)",
357
+ }, ...(shouldAnimate
358
+ ? {
359
+ variants: badgeVariants,
360
+ initial: "hidden",
361
+ animate: "visible",
362
+ custom: index,
363
+ }
364
+ : {}), children: [showConversionRate && (jsxs(Badge, { color: isGoodConversion ? "success" : "warning", variant: "soft", size: "sm", pill: true, children: [stage.conversionRate.toFixed(1), "%"] })), showDropoff && (jsxs("div", { className: "mt-1 text-center text-xs font-medium text-[var(--color-danger)]", children: ["-", Math.max(0, stage.dropoff).toFixed(1), "%"] }))] }, `active-badge-${stage.name}`));
304
365
  };
305
- return (jsxs("div", { ref: containerRef, className: cn(theme.baseStyle, "relative", className), style: { width: containerWidth, height: containerHeight }, role: "img", "aria-label": `Conversion funnel chart with ${stages.length} stages. Overall conversion: ${overallConversion}%`, ...props, children: [jsxs("svg", { viewBox: `0 0 ${viewBoxWidth} ${viewBoxHeight}`, width: "100%", height: "100%", preserveAspectRatio: "none", "aria-hidden": "true", children: [useGradient && (jsx("defs", { children: stages.map((stage) => {
306
- const centerOpacity = stage.opacity || 0.5;
307
- const edgeOpacity = Math.max(0.2, centerOpacity - 0.3);
308
- return (jsxs("linearGradient", { id: stage.gradientId, x1: "0%", y1: "0%", x2: "0%", y2: "100%", children: [jsx("stop", { offset: "0%", stopColor: stage.color, stopOpacity: edgeOpacity }), jsx("stop", { offset: "50%", stopColor: stage.color, stopOpacity: centerOpacity }), jsx("stop", { offset: "100%", stopColor: stage.color, stopOpacity: edgeOpacity })] }, stage.gradientId));
309
- }) })), jsx(AnimatePresence, { children: stages.map((stage, index) => {
310
- const path = orientation === "horizontal"
311
- ? generateHorizontalFunnelPath(index)
312
- : generateVerticalFunnelPath(index);
313
- const fill = useGradient
314
- ? `url(#${stage.gradientId})`
315
- : stage.color;
316
- const computedFillOpacity = useGradient ? 1 : fillOpacity;
317
- // Dim non-hovered segments when one is hovered
318
- const isDimmed = hoveredIndex !== null && hoveredIndex !== index;
319
- const segmentOpacity = isDimmed ? 0.4 : computedFillOpacity;
320
- const transformOrigin = orientation === "horizontal"
321
- ? `${((index * stageWidth + stageWidth / 2) / viewBoxWidth) * 100}% 50%`
322
- : `50% ${((index * stageHeight + stageHeight / 2) / viewBoxHeight) *
323
- 100}%`;
324
- return (jsx(motion.path, { d: path, fill: fill, fillOpacity: segmentOpacity, stroke: "rgba(255, 255, 255, 0.8)", strokeWidth: "0.5", className: "cursor-pointer outline-none", style: { transformOrigin }, ...getAnimationProps(index), whileHover: animate ? { scale: 1.02 } : undefined, transition: { duration: 0.2 } }, stage.name));
325
- }) })] }), stages.map((stage, index) => {
326
- const widthPercent = (stageWidth / viewBoxWidth) * 100;
327
- const heightPercent = (stageHeight / viewBoxHeight) * 100;
328
- return (jsx("button", { "data-stage-index": index, className: "absolute bg-transparent border-0 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 rounded", style: {
329
- left: orientation === "horizontal"
330
- ? `${((index * stageWidth) / viewBoxWidth) * 100}%`
331
- : "10%",
332
- top: orientation === "vertical"
333
- ? `${((index * stageHeight) / viewBoxHeight) * 100}%`
334
- : "20%",
335
- width: orientation === "horizontal" ? `${widthPercent}%` : "80%",
336
- height: orientation === "horizontal" ? "60%" : `${heightPercent}%`,
337
- }, onMouseEnter: (e) => handleMouseEnter(e, stage, index), onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, onClick: () => handleClick(stage, index), onKeyDown: (e) => handleKeyDown(e, stage, index), onFocus: () => handleFocus(stage, index), onBlur: handleBlur, "aria-label": `${stage.name}: ${formatDisplayValue(stage.value)} (${stage.percentage.toFixed(0)}% of total)${index > 0
338
- ? `. Conversion from previous: ${stage.conversionRate.toFixed(1)}%`
339
- : ""}`, tabIndex: index === 0 ? 0 : -1 }, `interactive-${stage.name}`));
340
- }), orientation === "horizontal" &&
341
- showLabels &&
342
- labelPosition !== "tooltip-only" &&
343
- stages.map((stage, index) => {
344
- const leftPercent = ((index * stageWidth + stageWidth / 2) / viewBoxWidth) * 100;
345
- return (jsxs(motion.div, { className: "absolute pointer-events-none", style: {
346
- left: `${leftPercent}%`,
347
- top: getLabelTopPosition(labelPosition),
348
- bottom: getLabelBottomPosition(labelPosition),
349
- transform: labelPosition === "inside"
350
- ? "translate(-50%, -50%)"
351
- : "translateX(-50%)",
352
- }, ...(animate
353
- ? {
354
- variants: labelVariants,
355
- initial: "hidden",
356
- animate: "visible",
357
- custom: index,
358
- }
359
- : {}), children: [jsx("div", { className: cn("text-base font-semibold whitespace-nowrap", labelPosition === "inside"
360
- ? "text-white drop-shadow-md"
361
- : "text-[var(--color-text-primary)]"), children: stage.name }), (showValues || showPercentages) && (jsxs("div", { className: cn("text-sm whitespace-nowrap", labelPosition === "inside"
362
- ? "text-white/90 drop-shadow-md"
363
- : "text-[var(--color-text-secondary)]"), children: [showValues && formatDisplayValue(stage.value), showValues && showPercentages && " • ", showPercentages && `${stage.percentage.toFixed(0)}%`] }))] }, `label-${stage.name}`));
364
- }), orientation === "vertical" &&
365
- showLabels &&
366
- labelPosition !== "tooltip-only" &&
367
- stages.map((stage, index) => {
368
- const topPercent = ((index * stageHeight + stageHeight / 2) / viewBoxHeight) * 100;
369
- return (jsxs(motion.div, { className: "absolute left-1/2 pointer-events-none", style: {
370
- top: `${topPercent}%`,
371
- transform: "translate(-50%, -50%)",
372
- }, ...(animate
373
- ? {
374
- variants: labelVariants,
375
- initial: "hidden",
376
- animate: "visible",
377
- custom: index,
378
- }
379
- : {}), children: [jsx("div", { className: "text-base font-semibold text-white drop-shadow-md whitespace-nowrap text-center", children: stage.name }), (showValues || showPercentages) && (jsxs("div", { className: "text-sm text-white/90 drop-shadow-md whitespace-nowrap text-center", children: [showValues && formatDisplayValue(stage.value), showValues && showPercentages && " • ", showPercentages && `${stage.percentage.toFixed(0)}%`] }))] }, `label-${stage.name}`));
380
- }), orientation === "horizontal" &&
381
- showDropoff &&
382
- stages.map((stage, index) => {
383
- if (index === 0)
384
- return null;
385
- const leftPercent = ((index * stageWidth) / viewBoxWidth) * 100;
386
- return (jsx(motion.div, { className: "absolute pointer-events-none", style: {
387
- left: `${leftPercent}%`,
388
- bottom: "4px",
389
- transform: "translateX(-50%)",
390
- }, ...(animate
391
- ? {
392
- variants: badgeVariants,
393
- initial: "hidden",
394
- animate: "visible",
395
- custom: index,
396
- }
397
- : {}), children: jsxs("span", { className: "text-sm text-[var(--color-danger)] font-medium", children: ["-", stage.dropoff.toFixed(1), "%"] }) }, `dropoff-${stage.name}`));
398
- }), orientation === "vertical" &&
399
- showDropoff &&
400
- stages.map((stage, index) => {
401
- if (index === 0)
402
- return null;
403
- const topPercent = ((index * stageHeight) / viewBoxHeight) * 100;
404
- return (jsx(motion.div, { className: "absolute right-2 pointer-events-none", style: {
405
- top: `${topPercent}%`,
406
- transform: "translateY(-50%)",
407
- }, ...(animate
408
- ? {
409
- variants: badgeVariants,
410
- initial: "hidden",
411
- animate: "visible",
412
- custom: index,
413
- }
414
- : {}), children: jsxs("span", { className: "text-sm text-[var(--color-danger)] font-medium", children: ["-", stage.dropoff.toFixed(1), "%"] }) }, `dropoff-${stage.name}`));
415
- }), orientation === "horizontal" &&
416
- showConversionRate &&
417
- stages.map((stage, index) => {
418
- if (index === 0)
419
- return null;
420
- const leftPercent = ((index * stageWidth) / viewBoxWidth) * 100;
421
- const isGoodConversion = stage.conversionRate >= 50;
422
- return (jsx(motion.div, { className: "absolute pointer-events-none", style: {
423
- left: `${leftPercent}%`,
424
- top: "50%",
425
- transform: "translate(-50%, -50%)",
426
- }, ...(animate
427
- ? {
428
- variants: badgeVariants,
429
- initial: "hidden",
430
- animate: "visible",
431
- custom: index,
432
- }
433
- : {}), children: jsxs(Badge, { color: isGoodConversion ? "success" : "warning", variant: "soft", size: "sm", pill: true, children: ["\u2193 ", stage.conversionRate.toFixed(1), "%"] }) }, `conversion-${stage.name}`));
434
- }), orientation === "vertical" &&
435
- showConversionRate &&
436
- stages.map((stage, index) => {
437
- if (index === 0)
438
- return null;
439
- const topPercent = ((index * stageHeight) / viewBoxHeight) * 100;
440
- const isGoodConversion = stage.conversionRate >= 50;
441
- return (jsx(motion.div, { className: "absolute left-2 pointer-events-none", style: {
442
- top: `${topPercent}%`,
443
- transform: "translateY(-50%)",
444
- }, ...(animate
445
- ? {
446
- variants: badgeVariants,
447
- initial: "hidden",
448
- animate: "visible",
449
- custom: index,
450
- }
451
- : {}), children: jsxs(Badge, { color: isGoodConversion ? "success" : "warning", variant: "soft", size: "sm", pill: true, children: [stage.conversionRate.toFixed(0), "%"] }) }, `conversion-${stage.name}`));
452
- }), showSummary && summaryPosition !== "none" && stages.length > 1 && (jsxs(motion.div, { className: cn("absolute bg-[var(--color-background)] rounded-lg shadow-sm border border-[var(--color-border)] px-3 py-2 pointer-events-none", getSummaryPositionClasses(summaryPosition)), ...(animate
453
- ? {
454
- variants: summaryVariants,
455
- initial: "hidden",
456
- animate: "visible",
457
- }
458
- : {}), children: [jsx("div", { className: "text-sm text-[var(--color-text-secondary)] mb-1", children: "Overall Conversion" }), jsxs("div", { className: "text-xl font-bold text-[var(--color-text-primary)]", children: [overallConversion, "%"] }), jsxs("div", { className: "text-sm text-[var(--color-text-muted)] mt-1", children: [formatDisplayValue(stages[0].value), " \u2192", " ", formatDisplayValue(stages[stages.length - 1].value)] })] })), jsx(ChartTooltip, { active: !!tooltipData, position: tooltipData ? { x: tooltipData.x, y: tooltipData.y } : { x: 0, y: 0 }, tooltipRef: tooltipRef, content: tooltipData === null || tooltipData === void 0 ? void 0 : tooltipData.content, chartType: "area" })] }));
366
+ return (jsxs("div", { ref: rootRef, className: cn(theme.baseStyle, "gap-3", className), style: { width: containerWidth, height: containerHeight }, role: "img", "aria-label": `Conversion funnel chart with ${stages.length} stages. Overall conversion: ${overallConversion}%`, tabIndex: 0, onKeyDown: handleKeyDown, ...props, children: [hasTopSummary && renderSummary(), jsxs("div", { ref: chartRef, className: "relative min-h-0 w-full flex-1", children: [jsxs("svg", { viewBox: `0 0 ${dimensions.width} ${dimensions.height}`, width: "100%", height: "100%", "aria-hidden": "true", className: "block overflow-visible", children: [jsx("defs", { children: useGradient &&
367
+ stages.map((stage) => {
368
+ const centerOpacity = Math.min(0.98, stage.opacity);
369
+ const edgeOpacity = Math.max(0.26, centerOpacity - 0.34);
370
+ return (jsxs("linearGradient", { id: stage.gradientId, gradientUnits: "objectBoundingBox", x1: orientation === "horizontal" ? "0" : "0.5", y1: orientation === "horizontal" ? "0.5" : "0", x2: orientation === "horizontal" ? "1" : "0.5", y2: orientation === "horizontal" ? "0.5" : "1", children: [jsx("stop", { offset: "0%", stopColor: stage.color, stopOpacity: centerOpacity }), jsx("stop", { offset: "70%", stopColor: stage.color, stopOpacity: Math.max(edgeOpacity, centerOpacity - 0.12) }), jsx("stop", { offset: "100%", stopColor: stage.color, stopOpacity: edgeOpacity })] }, stage.gradientId));
371
+ }) }), jsx(AnimatePresence, { children: measured &&
372
+ stages.map((stage, index) => {
373
+ const geometry = geometries[index];
374
+ const fill = useGradient
375
+ ? `url(#${stage.gradientId})`
376
+ : stage.color;
377
+ const isActive = activeIndex === index;
378
+ const isDimmed = hoveredIndex !== null && hoveredIndex !== index;
379
+ return (jsx(motion.path, { d: geometry.path, fill: fill, fillOpacity: useGradient ? 1 : fillOpacity, stroke: isActive
380
+ ? stage.color
381
+ : "var(--color-surface)", strokeWidth: isActive ? 1.5 : 1, strokeLinejoin: "round", vectorEffect: "non-scaling-stroke", className: "cursor-pointer outline-none transition-colors duration-200", initial: shouldAnimate
382
+ ? {
383
+ opacity: 0,
384
+ scaleX: orientation === "horizontal" ? 0.84 : 1,
385
+ scaleY: orientation === "vertical" ? 0.84 : 1,
386
+ }
387
+ : false, animate: {
388
+ opacity: isDimmed ? 0.36 : 1,
389
+ scaleX: 1,
390
+ scaleY: 1,
391
+ }, exit: shouldAnimate ? { opacity: 0 } : undefined, transition: {
392
+ delay: shouldAnimate ? index * 0.06 : 0,
393
+ duration: shouldAnimate ? 0.36 : 0,
394
+ ease: "easeOut",
395
+ }, style: {
396
+ transformOrigin: orientation === "horizontal"
397
+ ? `${geometry.centerX}px ${geometry.centerY}px`
398
+ : `${geometry.centerX}px ${geometry.centerY}px`,
399
+ filter: isActive
400
+ ? "drop-shadow(0 8px 14px rgb(0 0 0 / 0.14))"
401
+ : undefined,
402
+ }, onMouseEnter: (e) => handleMouseEnter(e, stage, index), onMouseMove: tooltipMouseMove, onMouseLeave: handleMouseLeave, onFocus: () => {
403
+ setFocusedIndex(index);
404
+ onStageFocus === null || onStageFocus === void 0 ? void 0 : onStageFocus(stage, index);
405
+ }, onClick: () => handleClick(stage, index) }, stage.name));
406
+ }) })] }), stages.map(renderStageLabel), renderActiveBadge()] }), hasBottomSummary && renderSummary(), jsx(ChartTooltip, { active: !!tooltipData, position: tooltipData ? { x: tooltipData.x, y: tooltipData.y } : { x: 0, y: 0 }, tooltipRef: tooltipRef, content: tooltipData === null || tooltipData === void 0 ? void 0 : tooltipData.content })] }));
459
407
  };
460
408
  FunnelChart.displayName = "FunnelChart";
461
409