@flikk/ui 1.0.0-beta.3 → 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 (1296) hide show
  1. package/CHANGELOG.md +1184 -0
  2. package/README.md +52 -0
  3. package/dist/bg/1.webp +0 -0
  4. package/dist/bg/10.webp +0 -0
  5. package/dist/bg/11.webp +0 -0
  6. package/dist/bg/12.webp +0 -0
  7. package/dist/bg/13.webp +0 -0
  8. package/dist/bg/14.webp +0 -0
  9. package/dist/bg/15.webp +0 -0
  10. package/dist/bg/16.webp +0 -0
  11. package/dist/bg/17.webp +0 -0
  12. package/dist/bg/18.webp +0 -0
  13. package/dist/bg/19.webp +0 -0
  14. package/dist/bg/2.webp +0 -0
  15. package/dist/bg/20.webp +0 -0
  16. package/dist/bg/21.webp +0 -0
  17. package/dist/bg/22.webp +0 -0
  18. package/dist/bg/3.webp +0 -0
  19. package/dist/bg/4.webp +0 -0
  20. package/dist/bg/5.webp +0 -0
  21. package/dist/bg/6.webp +0 -0
  22. package/dist/bg/7.webp +0 -0
  23. package/dist/bg/8.webp +0 -0
  24. package/dist/bg/9.webp +0 -0
  25. package/dist/components/ai/CodeBlock/CodeBlock.js +21 -4
  26. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +3 -4
  27. package/dist/components/ai/CodeBlock/CodeBlock.types.d.ts +0 -2
  28. package/dist/components/ai/CodeBlock/LanguageIcon.js +1 -0
  29. package/dist/components/ai/PromptInput/PromptInput.animations.d.ts +25 -0
  30. package/dist/components/ai/PromptInput/PromptInput.animations.js +61 -0
  31. package/dist/components/ai/PromptInput/PromptInput.js +110 -149
  32. package/dist/components/ai/PromptInput/PromptInput.theme.js +24 -3
  33. package/dist/components/ai/PromptInput/PromptInput.types.d.ts +49 -1
  34. package/dist/components/ai/PromptInput/VoiceRecorder.d.ts +11 -0
  35. package/dist/components/ai/PromptInput/VoiceRecorder.js +328 -0
  36. package/dist/components/ai/PromptInput/VoiceRecorder.types.d.ts +17 -0
  37. package/dist/components/ai/PromptInput/index.d.ts +1 -0
  38. package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.js +1 -0
  39. package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.theme.js +4 -4
  40. package/dist/components/ai/StreamingResponse/AnimatedText.js +4 -3
  41. package/dist/components/ai/StreamingResponse/ErrorDisplay.js +1 -0
  42. package/dist/components/ai/StreamingResponse/MarkdownRenderer.d.ts +5 -2
  43. package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +60 -35
  44. package/dist/components/ai/StreamingResponse/StreamingCursor.d.ts +4 -5
  45. package/dist/components/ai/StreamingResponse/StreamingCursor.js +14 -10
  46. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.d.ts +9 -2
  47. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.js +37 -12
  48. package/dist/components/ai/StreamingResponse/StreamingResponse.js +11 -4
  49. package/dist/components/ai/StreamingResponse/StreamingResponse.types.d.ts +9 -7
  50. package/dist/components/ai/StreamingResponse/WordAnimationContext.d.ts +27 -0
  51. package/dist/components/ai/StreamingResponse/WordAnimationContext.js +136 -0
  52. package/dist/components/ai/StreamingResponse/index.d.ts +3 -1
  53. package/dist/components/ai/TokenCounter/TokenCounter.js +1 -0
  54. package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
  55. package/dist/components/ai/index.d.ts +2 -9
  56. package/dist/components/ai/index.js +11 -8
  57. package/dist/components/canvas/Background.d.ts +19 -0
  58. package/dist/components/canvas/Background.js +24 -0
  59. package/dist/components/canvas/BaseNode.d.ts +15 -0
  60. package/dist/components/canvas/BaseNode.js +20 -0
  61. package/dist/components/canvas/CanvasToolbar.d.ts +34 -0
  62. package/dist/components/canvas/CanvasToolbar.js +35 -0
  63. package/dist/components/canvas/Edge.d.ts +32 -0
  64. package/dist/components/canvas/Edge.js +113 -0
  65. package/dist/components/canvas/EdgeLayer.d.ts +19 -0
  66. package/dist/components/canvas/EdgeLayer.js +121 -0
  67. package/dist/components/canvas/Handle.d.ts +11 -0
  68. package/dist/components/canvas/Handle.js +64 -0
  69. package/dist/components/canvas/MiniMap.d.ts +22 -0
  70. package/dist/components/canvas/MiniMap.js +106 -0
  71. package/dist/components/canvas/NodeCanvas.d.ts +10 -0
  72. package/dist/components/canvas/NodeCanvas.js +481 -0
  73. package/dist/components/canvas/NodeCanvas.theme.d.ts +7 -0
  74. package/dist/components/canvas/NodeCanvas.theme.js +9 -0
  75. package/dist/components/canvas/NodeCanvas.types.d.ts +191 -0
  76. package/dist/components/canvas/NodeControls.d.ts +25 -0
  77. package/dist/components/canvas/NodeControls.js +41 -0
  78. package/dist/components/canvas/NodeRenderer.d.ts +22 -0
  79. package/dist/components/canvas/NodeRenderer.js +126 -0
  80. package/dist/components/canvas/changes.d.ts +11 -0
  81. package/dist/components/canvas/changes.js +76 -0
  82. package/dist/components/canvas/changes.test.d.ts +1 -0
  83. package/dist/components/canvas/context/CanvasContext.d.ts +41 -0
  84. package/dist/components/canvas/context/CanvasContext.js +34 -0
  85. package/dist/components/canvas/context/ConnectionContext.d.ts +33 -0
  86. package/dist/components/canvas/context/ConnectionContext.js +14 -0
  87. package/dist/components/canvas/context/HandleRegistry.d.ts +24 -0
  88. package/dist/components/canvas/context/HandleRegistry.js +16 -0
  89. package/dist/components/canvas/context/InteractionContext.d.ts +18 -0
  90. package/dist/components/canvas/context/InteractionContext.js +15 -0
  91. package/dist/components/canvas/context/NodeIdContext.d.ts +3 -0
  92. package/dist/components/canvas/context/NodeIdContext.js +16 -0
  93. package/dist/components/canvas/hooks/useConnection.d.ts +17 -0
  94. package/dist/components/canvas/hooks/useConnection.js +30 -0
  95. package/dist/components/canvas/hooks/useMarquee.d.ts +25 -0
  96. package/dist/components/canvas/hooks/useMarquee.js +92 -0
  97. package/dist/components/canvas/hooks/useNodeDrag.d.ts +23 -0
  98. package/dist/components/canvas/hooks/useNodeDrag.js +111 -0
  99. package/dist/components/canvas/hooks/usePanZoom.d.ts +30 -0
  100. package/dist/components/canvas/hooks/usePanZoom.js +195 -0
  101. package/dist/components/canvas/hooks/useViewport.d.ts +21 -0
  102. package/dist/components/canvas/hooks/useViewport.js +36 -0
  103. package/dist/components/canvas/index.d.ts +14 -0
  104. package/dist/components/canvas/index.js +12 -0
  105. package/dist/components/canvas/layout.d.ts +22 -0
  106. package/dist/components/canvas/layout.js +67 -0
  107. package/dist/components/canvas/layout.test.d.ts +1 -0
  108. package/dist/components/canvas/utils.d.ts +4 -0
  109. package/dist/components/canvas/utils.js +16 -0
  110. package/dist/components/canvas/utils.test.d.ts +1 -0
  111. package/dist/components/charts/ActivityRings/ActivityRings.js +28 -17
  112. package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +2 -3
  113. package/dist/components/charts/ActivityRings/ActivityRings.types.js +2 -1
  114. package/dist/components/charts/AreaChart/AreaChart.js +222 -174
  115. package/dist/components/charts/AreaChart/AreaChart.types.d.ts +6 -6
  116. package/dist/components/charts/AreaChart/AreaChart.types.js +1 -0
  117. package/dist/components/charts/BarChart/BarChart.js +228 -174
  118. package/dist/components/charts/BarChart/BarChart.types.d.ts +5 -5
  119. package/dist/components/charts/BarChart/BarChart.types.js +1 -0
  120. package/dist/components/charts/ChartContainer.d.ts +7 -0
  121. package/dist/components/charts/ChartContainer.js +11 -8
  122. package/dist/components/charts/{shared/BarRenderer → ComboChart}/BarRenderer.d.ts +3 -1
  123. package/dist/components/charts/{shared/BarRenderer → ComboChart}/BarRenderer.js +137 -102
  124. package/dist/components/charts/{shared/BarRenderer → ComboChart}/BarRenderer.types.d.ts +17 -5
  125. package/dist/components/charts/ComboChart/ComboChart.js +27 -10
  126. package/dist/components/charts/ComboChart/ComboChart.types.d.ts +5 -5
  127. package/dist/components/charts/ComboChart/ComboChart.types.js +4 -0
  128. package/dist/components/charts/ComboChart/ComboChartCanvas.d.ts +98 -0
  129. package/dist/components/charts/{shared/ChartContainer/ChartContainer.js → ComboChart/ComboChartCanvas.js} +41 -44
  130. package/dist/components/charts/{shared/ChartContainer/ChartContainer.types.d.ts → ComboChart/ComboChartCanvas.types.d.ts} +23 -3
  131. package/dist/components/charts/{shared/LineRenderer → ComboChart}/LineRenderer.d.ts +3 -1
  132. package/dist/components/charts/{shared/LineRenderer → ComboChart}/LineRenderer.js +27 -14
  133. package/dist/components/charts/{shared/LineRenderer → ComboChart}/LineRenderer.types.d.ts +11 -5
  134. package/dist/components/charts/DonutChart/DonutChart.js +3 -2
  135. package/dist/components/charts/DonutChart/DonutChart.theme.js +1 -1
  136. package/dist/components/charts/DonutChart/DonutChart.types.d.ts +1 -2
  137. package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +10 -24
  138. package/dist/components/charts/DonutChart/MultiSegmentDonutChart.types.d.ts +1 -2
  139. package/dist/components/charts/DonutChart/donut-utils.js +1 -0
  140. package/dist/components/charts/FunnelChart/FunnelChart.animations.js +1 -48
  141. package/dist/components/charts/FunnelChart/FunnelChart.d.ts +3 -4
  142. package/dist/components/charts/FunnelChart/FunnelChart.js +306 -358
  143. package/dist/components/charts/Heatmap/Heatmap.js +29 -36
  144. package/dist/components/charts/Heatmap/HeatmapCell.js +2 -1
  145. package/dist/components/charts/Heatmap/HeatmapLegend.js +1 -1
  146. package/dist/components/charts/LineChart/LineChart.js +201 -154
  147. package/dist/components/charts/LineChart/LineChart.types.d.ts +6 -6
  148. package/dist/components/charts/RadarChart/RadarChart.js +10 -2
  149. package/dist/components/charts/RadarChart/RadarChart.theme.js +5 -10
  150. package/dist/components/charts/RadarChart/RadarChart.types.d.ts +0 -8
  151. package/dist/components/charts/ScatterPlot/ScatterPlot.js +71 -72
  152. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.d.ts +0 -4
  153. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +10 -6
  154. package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +5 -11
  155. package/dist/components/charts/StackedBarChart/StackedBarChart.js +105 -68
  156. package/dist/components/charts/StackedBarChart/StackedBarChart.types.d.ts +5 -5
  157. package/dist/components/charts/StackedBarChart/StackedBarChart.types.js +3 -0
  158. package/dist/components/charts/hooks/index.d.ts +3 -1
  159. package/dist/components/charts/hooks/useChartAccessibility.js +1 -0
  160. package/dist/components/charts/hooks/useChartDimensions.d.ts +29 -0
  161. package/dist/components/charts/hooks/useChartDimensions.js +43 -0
  162. package/dist/components/charts/hooks/useChartScales.js +1 -1
  163. package/dist/components/charts/hooks/useChartTheme.js +1 -0
  164. package/dist/components/charts/hooks/useChartValidation.d.ts +0 -8
  165. package/dist/components/charts/hooks/useChartValidation.js +1 -0
  166. package/dist/components/charts/hooks/useTooltipPosition.js +1 -0
  167. package/dist/components/charts/index.d.ts +3 -3
  168. package/dist/components/charts/index.js +1 -3
  169. package/dist/components/charts/shared/ChartCrosshair/ChartCrosshair.js +5 -12
  170. package/dist/components/charts/shared/ChartErrorBoundary/ChartErrorBoundary.js +2 -1
  171. package/dist/components/charts/shared/ChartLegend/ChartLegend.d.ts +5 -2
  172. package/dist/components/charts/shared/ChartLegend/ChartLegend.js +15 -22
  173. package/dist/components/charts/shared/ChartLegend/ChartLegend.types.d.ts +7 -12
  174. package/dist/components/charts/shared/ChartLegend/index.d.ts +2 -3
  175. package/dist/components/charts/shared/ChartMarker/ChartMarker.js +1 -0
  176. package/dist/components/charts/shared/ChartText/ChartText.js +2 -1
  177. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.js +4 -13
  178. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.theme.js +1 -1
  179. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.types.d.ts +13 -2
  180. package/dist/components/charts/shared/index.d.ts +0 -7
  181. package/dist/components/charts/theme/chart.theme.js +6 -0
  182. package/dist/components/charts/types/chart.types.d.ts +26 -2
  183. package/dist/components/charts/types/chart.types.js +10 -3
  184. package/dist/components/charts/utils/animation-utils.d.ts +95 -0
  185. package/dist/components/charts/utils/animation-utils.js +150 -2
  186. package/dist/components/charts/utils/bar-emphasis.d.ts +80 -0
  187. package/dist/components/charts/utils/bar-emphasis.js +69 -0
  188. package/dist/components/charts/utils/chart-validation.js +7 -0
  189. package/dist/components/core/Accordion/Accordion.animations.d.ts +6 -1
  190. package/dist/components/core/Accordion/Accordion.animations.js +15 -1
  191. package/dist/components/core/Accordion/Accordion.d.ts +4 -4
  192. package/dist/components/core/Accordion/Accordion.js +23 -19
  193. package/dist/components/core/Accordion/Accordion.theme.d.ts +2 -2
  194. package/dist/components/core/Accordion/Accordion.theme.js +6 -6
  195. package/dist/components/core/Accordion/Accordion.types.d.ts +63 -5
  196. package/dist/components/core/Accordion/AccordionBody.d.ts +3 -0
  197. package/dist/components/core/Accordion/{AccordionContent.js → AccordionBody.js} +6 -5
  198. package/dist/components/core/Accordion/AccordionContext.d.ts +3 -0
  199. package/dist/components/core/Accordion/AccordionContext.js +15 -0
  200. package/dist/components/core/Accordion/AccordionItem.js +14 -10
  201. package/dist/components/core/Accordion/AccordionTrigger.js +51 -9
  202. package/dist/components/core/Accordion/index.d.ts +2 -2
  203. package/dist/components/core/Alert/Alert.animations.d.ts +11 -0
  204. package/dist/components/core/Alert/Alert.animations.js +45 -0
  205. package/dist/components/core/Alert/Alert.js +23 -4
  206. package/dist/components/core/Alert/Alert.theme.js +3 -12
  207. package/dist/components/core/Alert/Alert.types.d.ts +6 -13
  208. package/dist/components/core/Alert/index.d.ts +1 -1
  209. package/dist/components/core/AlertDialog/AlertDialog.js +15 -1
  210. package/dist/components/core/Avatar/Avatar.js +79 -22
  211. package/dist/components/core/Avatar/Avatar.theme.d.ts +4 -6
  212. package/dist/components/core/Avatar/Avatar.theme.js +23 -13
  213. package/dist/components/core/Avatar/Avatar.types.d.ts +43 -8
  214. package/dist/components/core/AvatarGroup/AvatarGroup.animations.js +3 -2
  215. package/dist/components/core/AvatarGroup/AvatarGroup.js +7 -3
  216. package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +4 -2
  217. package/dist/components/core/Badge/Badge.animations.js +2 -1
  218. package/dist/components/core/Badge/Badge.d.ts +1 -1
  219. package/dist/components/core/Badge/Badge.js +30 -73
  220. package/dist/components/core/Badge/Badge.theme.js +65 -62
  221. package/dist/components/core/Badge/Badge.types.d.ts +21 -34
  222. package/dist/components/core/Breadcrumbs/Breadcrumbs.js +24 -25
  223. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +2 -2
  224. package/dist/components/core/Breadcrumbs/Breadcrumbs.types.d.ts +1 -1
  225. package/dist/components/core/Button/Button.d.ts +1 -1
  226. package/dist/components/core/Button/Button.js +43 -39
  227. package/dist/components/core/Button/Button.ripple.d.ts +5 -1
  228. package/dist/components/core/Button/Button.ripple.js +29 -22
  229. package/dist/components/core/Button/Button.theme.d.ts +2 -4
  230. package/dist/components/core/Button/Button.theme.js +44 -86
  231. package/dist/components/core/Button/Button.types.d.ts +6 -7
  232. package/dist/components/core/Button/index.d.ts +2 -0
  233. package/dist/components/core/ButtonGroup/ButtonGroup.theme.js +6 -6
  234. package/dist/components/core/ButtonGroup/ButtonGroupText.js +1 -3
  235. package/dist/components/core/Calendar/Calendar.animations.js +1 -0
  236. package/dist/components/core/Calendar/Calendar.js +118 -9
  237. package/dist/components/core/Calendar/Calendar.theme.js +15 -11
  238. package/dist/components/core/Calendar/Calendar.types.d.ts +4 -1
  239. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.types.d.ts +5 -6
  240. package/dist/components/core/Calendar/CalendarMini/CalendarMini.animations.js +1 -0
  241. package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +8 -4
  242. package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +2 -2
  243. package/dist/components/core/Card/Card.d.ts +2 -2
  244. package/dist/components/core/Card/Card.js +17 -6
  245. package/dist/components/core/Card/Card.theme.js +7 -5
  246. package/dist/components/core/Card/Card.types.d.ts +43 -15
  247. package/dist/components/core/Card/CardBody.d.ts +3 -0
  248. package/dist/components/core/Card/CardBody.js +11 -0
  249. package/dist/components/core/Card/CardSubtitle.d.ts +1 -1
  250. package/dist/components/core/Card/CardTitle.d.ts +1 -1
  251. package/dist/components/core/Card/index.d.ts +2 -2
  252. package/dist/components/core/CardStack/CardStack.js +1 -0
  253. package/dist/components/core/Carousel/Carousel.js +5 -4
  254. package/dist/components/core/Carousel/Carousel.types.d.ts +4 -4
  255. package/dist/components/core/Carousel/CarouselBody.d.ts +4 -0
  256. package/dist/components/core/Carousel/{CarouselContent.js → CarouselBody.js} +12 -5
  257. package/dist/components/core/Carousel/CarouselContext.js +1 -0
  258. package/dist/components/core/Carousel/CarouselNext.js +1 -0
  259. package/dist/components/core/Carousel/CarouselPrevious.js +1 -0
  260. package/dist/components/core/Carousel/index.d.ts +2 -1
  261. package/dist/components/core/CommandPalette/CommandItem.js +5 -5
  262. package/dist/components/core/CommandPalette/CommandPalette.animations.js +1 -0
  263. package/dist/components/core/CommandPalette/CommandPalette.js +58 -12
  264. package/dist/components/core/CommandPalette/CommandPalette.theme.js +14 -13
  265. package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +14 -2
  266. package/dist/components/core/ContextMenu/ContextMenu.d.ts +2 -2
  267. package/dist/components/core/ContextMenu/ContextMenu.js +38 -15
  268. package/dist/components/core/ContextMenu/ContextMenu.theme.js +15 -15
  269. package/dist/components/core/ContextMenu/ContextMenu.types.d.ts +19 -2
  270. package/dist/components/core/ContextMenu/ContextMenuBody.d.ts +6 -0
  271. package/dist/components/core/ContextMenu/{ContextMenuContent.js → ContextMenuBody.js} +20 -11
  272. package/dist/components/core/ContextMenu/ContextMenuContext.js +1 -0
  273. package/dist/components/core/ContextMenu/ContextMenuItem.js +18 -8
  274. package/dist/components/core/ContextMenu/ContextMenuLabel.js +1 -0
  275. package/dist/components/core/ContextMenu/ContextMenuSeparator.js +1 -0
  276. package/dist/components/core/ContextMenu/ContextMenuSub.js +4 -3
  277. package/dist/components/core/ContextMenu/ContextMenuSubBody.d.ts +6 -0
  278. package/dist/components/core/ContextMenu/{ContextMenuSubContent.js → ContextMenuSubBody.js} +16 -9
  279. package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +3 -2
  280. package/dist/components/core/ContextMenu/ContextMenuTrigger.js +13 -6
  281. package/dist/components/core/ContextMenu/index.d.ts +1 -1
  282. package/dist/components/core/DotSeparator/DotSeparator.d.ts +3 -0
  283. package/dist/components/core/DotSeparator/DotSeparator.js +20 -0
  284. package/dist/components/core/DotSeparator/DotSeparator.theme.d.ts +2 -0
  285. package/dist/components/core/DotSeparator/DotSeparator.theme.js +10 -0
  286. package/dist/components/core/DotSeparator/DotSeparator.types.d.ts +25 -0
  287. package/dist/components/core/DotSeparator/index.d.ts +3 -0
  288. package/dist/components/core/DragDrop/DragDrop.js +189 -17
  289. package/dist/components/core/DragDrop/DragDrop.types.d.ts +6 -0
  290. package/dist/components/core/Drawer/Drawer.animations.js +14 -12
  291. package/dist/components/core/Drawer/Drawer.d.ts +6 -6
  292. package/dist/components/core/Drawer/Drawer.js +63 -20
  293. package/dist/components/core/Drawer/Drawer.theme.d.ts +2 -0
  294. package/dist/components/core/Drawer/Drawer.theme.js +17 -13
  295. package/dist/components/core/Drawer/Drawer.types.d.ts +24 -6
  296. package/dist/components/core/Drawer/DrawerBody.d.ts +5 -0
  297. package/dist/components/core/Drawer/{DrawerContent.js → DrawerBody.js} +5 -4
  298. package/dist/components/core/Drawer/DrawerContext.d.ts +3 -0
  299. package/dist/components/core/Drawer/DrawerContext.js +15 -0
  300. package/dist/components/core/Drawer/DrawerFooter.js +2 -1
  301. package/dist/components/core/Drawer/DrawerHeader.js +4 -2
  302. package/dist/components/core/Drawer/DrawerSubtitle.js +2 -1
  303. package/dist/components/core/Drawer/DrawerTitle.d.ts +1 -1
  304. package/dist/components/core/Drawer/DrawerTitle.js +4 -3
  305. package/dist/components/core/Drawer/index.d.ts +2 -1
  306. package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
  307. package/dist/components/core/Dropdown/Dropdown.js +28 -10
  308. package/dist/components/core/Dropdown/Dropdown.theme.js +7 -7
  309. package/dist/components/core/Dropdown/Dropdown.types.d.ts +12 -3
  310. package/dist/components/core/Dropdown/DropdownContext.js +1 -0
  311. package/dist/components/core/Dropdown/DropdownItem.js +3 -2
  312. package/dist/components/core/Dropdown/DropdownMenu.js +75 -74
  313. package/dist/components/core/Dropdown/DropdownSection.js +5 -2
  314. package/dist/components/core/Dropdown/DropdownSeparator.js +2 -1
  315. package/dist/components/core/Dropdown/DropdownTrigger.d.ts +6 -1
  316. package/dist/components/core/Dropdown/DropdownTrigger.js +30 -8
  317. package/dist/components/core/Empty/Empty.js +1 -1
  318. package/dist/components/core/Empty/Empty.theme.js +1 -1
  319. package/dist/components/core/HeroCard/HeroCard.d.ts +5 -0
  320. package/dist/components/core/HeroCard/HeroCard.js +100 -0
  321. package/dist/components/core/HeroCard/HeroCard.theme.d.ts +3 -0
  322. package/dist/components/core/HeroCard/HeroCard.theme.js +8 -0
  323. package/dist/components/core/HeroCard/HeroCard.types.d.ts +70 -0
  324. package/dist/components/core/HeroCard/index.d.ts +4 -0
  325. package/dist/components/core/Icon/Icon.d.ts +3 -0
  326. package/dist/components/core/Icon/Icon.js +70 -0
  327. package/dist/components/core/Icon/Icon.theme.d.ts +2 -0
  328. package/dist/components/core/Icon/Icon.theme.js +19 -0
  329. package/dist/components/core/Icon/Icon.types.d.ts +32 -0
  330. package/dist/components/core/Icon/data/fileTypes.d.ts +7 -0
  331. package/dist/components/core/Icon/data/fileTypes.js +30 -0
  332. package/dist/components/core/Icon/data/paymentMethods.d.ts +27 -0
  333. package/dist/components/core/Icon/data/paymentMethods.js +169 -0
  334. package/dist/components/core/Icon/index.d.ts +4 -0
  335. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.d.ts +14 -0
  336. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.js +37 -0
  337. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.d.ts +6 -0
  338. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.js +8 -0
  339. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.types.d.ts +32 -0
  340. package/dist/components/core/ImagePlaceholder/index.d.ts +2 -0
  341. package/dist/components/core/Kbd/Kbd.theme.js +3 -3
  342. package/dist/components/core/Link/Link.d.ts +1 -1
  343. package/dist/components/core/Link/Link.js +60 -29
  344. package/dist/components/core/Link/Link.types.d.ts +26 -9
  345. package/dist/components/core/Masonry/Masonry.js +88 -71
  346. package/dist/components/core/Masonry/Masonry.theme.js +10 -4
  347. package/dist/components/core/MenuItem/MenuItem.js +23 -2
  348. package/dist/components/core/MenuItem/MenuItem.theme.d.ts +6 -0
  349. package/dist/components/core/MenuItem/MenuItem.theme.js +25 -18
  350. package/dist/components/core/MenuItem/MenuItem.types.d.ts +3 -1
  351. package/dist/components/core/Message/Message.d.ts +10 -1
  352. package/dist/components/core/Message/Message.js +49 -7
  353. package/dist/components/core/Message/Message.theme.js +23 -1
  354. package/dist/components/core/Message/Message.types.d.ts +122 -7
  355. package/dist/components/core/Message/MessageActions.js +1 -0
  356. package/dist/components/core/Message/MessageAudio.d.ts +8 -0
  357. package/dist/components/core/Message/MessageAudio.js +12 -0
  358. package/dist/components/core/Message/MessageAvatar.d.ts +2 -2
  359. package/dist/components/core/Message/MessageAvatar.js +4 -3
  360. package/dist/components/core/Message/MessageBody.d.ts +8 -0
  361. package/dist/components/core/Message/{MessageContent.js → MessageBody.js} +4 -3
  362. package/dist/components/core/Message/MessageContext.d.ts +3 -1
  363. package/dist/components/core/Message/MessageContext.js +1 -0
  364. package/dist/components/core/Message/MessageDateDivider.d.ts +6 -0
  365. package/dist/components/core/Message/MessageDateDivider.js +10 -0
  366. package/dist/components/core/Message/MessageFile.d.ts +9 -0
  367. package/dist/components/core/Message/MessageFile.js +16 -0
  368. package/dist/components/core/Message/MessageImage.d.ts +11 -0
  369. package/dist/components/core/Message/MessageImage.js +14 -0
  370. package/dist/components/core/Message/MessageLink.d.ts +10 -0
  371. package/dist/components/core/Message/MessageLink.js +15 -0
  372. package/dist/components/core/Message/MessageList.js +1 -0
  373. package/dist/components/core/Message/MessageReactions.d.ts +8 -0
  374. package/dist/components/core/Message/MessageReactions.js +13 -0
  375. package/dist/components/core/Message/MessageReply.d.ts +8 -0
  376. package/dist/components/core/Message/MessageReply.js +10 -0
  377. package/dist/components/core/Message/MessageSenderName.d.ts +6 -0
  378. package/dist/components/core/Message/MessageSenderName.js +10 -0
  379. package/dist/components/core/Message/MessageStatusIndicator.d.ts +9 -0
  380. package/dist/components/core/Message/MessageStatusIndicator.js +46 -0
  381. package/dist/components/core/Message/MessageTimestamp.js +1 -0
  382. package/dist/components/core/Message/TypeWriter.d.ts +1 -1
  383. package/dist/components/core/Message/TypeWriter.js +74 -9
  384. package/dist/components/core/Message/index.d.ts +21 -1
  385. package/dist/components/core/Modal/Modal.animations.d.ts +1 -0
  386. package/dist/components/core/Modal/Modal.animations.js +20 -30
  387. package/dist/components/core/Modal/Modal.d.ts +4 -6
  388. package/dist/components/core/Modal/Modal.js +21 -22
  389. package/dist/components/core/Modal/Modal.theme.js +9 -11
  390. package/dist/components/core/Modal/Modal.types.d.ts +15 -12
  391. package/dist/components/core/Modal/ModalBody.js +9 -9
  392. package/dist/components/core/Modal/ModalContext.d.ts +3 -0
  393. package/dist/components/core/Modal/ModalContext.js +16 -0
  394. package/dist/components/core/Modal/ModalFooter.js +3 -2
  395. package/dist/components/core/Modal/ModalHeader.js +4 -2
  396. package/dist/components/core/Modal/ModalSubtitle.js +2 -1
  397. package/dist/components/core/Modal/ModalTitle.d.ts +1 -1
  398. package/dist/components/core/Modal/ModalTitle.js +4 -3
  399. package/dist/components/core/Modal/index.d.ts +1 -1
  400. package/dist/components/core/ModalStack/ModalStack.animations.js +1 -0
  401. package/dist/components/core/ModalStack/ModalStack.d.ts +1 -1
  402. package/dist/components/core/ModalStack/ModalStack.js +2 -1
  403. package/dist/components/core/ModalStack/ModalStack.types.d.ts +1 -2
  404. package/dist/components/core/ModalStack/ModalStackModal.d.ts +1 -1
  405. package/dist/components/core/ModalStack/ModalStackModal.js +19 -15
  406. package/dist/components/core/NavItem/NavItem.d.ts +1 -1
  407. package/dist/components/core/NavItem/NavItem.js +272 -78
  408. package/dist/components/core/NavItem/NavItem.theme.js +31 -9
  409. package/dist/components/core/NavItem/NavItem.types.d.ts +51 -59
  410. package/dist/components/core/NavItem/index.d.ts +1 -1
  411. package/dist/components/core/OfflineIndicator/OfflineIndicator.js +1 -0
  412. package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +2 -2
  413. package/dist/components/core/PageHeading/PageHeading.js +8 -3
  414. package/dist/components/core/PageHeading/PageHeading.theme.js +3 -3
  415. package/dist/components/core/PageHeading/PageHeading.types.d.ts +13 -2
  416. package/dist/components/core/PageHeading/PageHeadingBackButton.js +5 -2
  417. package/dist/components/core/Pagination/Pagination.js +9 -3
  418. package/dist/components/core/Pagination/Pagination.theme.d.ts +2 -10
  419. package/dist/components/core/Pagination/Pagination.theme.js +4 -4
  420. package/dist/components/core/Pagination/Pagination.types.d.ts +11 -1
  421. package/dist/components/core/Pill/Pill.animations.js +2 -11
  422. package/dist/components/core/Pill/Pill.js +14 -5
  423. package/dist/components/core/Pill/Pill.theme.js +10 -10
  424. package/dist/components/core/Popover/Popover.d.ts +2 -2
  425. package/dist/components/core/Popover/Popover.js +11 -10
  426. package/dist/components/core/Popover/Popover.theme.d.ts +1 -1
  427. package/dist/components/core/Popover/Popover.theme.js +4 -2
  428. package/dist/components/core/Popover/Popover.types.d.ts +21 -3
  429. package/dist/components/core/Popover/PopoverBody.d.ts +7 -0
  430. package/dist/components/core/Popover/PopoverBody.js +134 -0
  431. package/dist/components/core/Popover/PopoverContext.js +1 -0
  432. package/dist/components/core/Popover/PopoverTrigger.d.ts +1 -1
  433. package/dist/components/core/Popover/PopoverTrigger.js +13 -12
  434. package/dist/components/core/Popover/index.d.ts +4 -3
  435. package/dist/components/core/Progress/Progress.d.ts +9 -8
  436. package/dist/components/core/Progress/Progress.js +18 -17
  437. package/dist/components/core/Progress/Progress.theme.js +6 -14
  438. package/dist/components/core/Progress/Progress.types.d.ts +2 -19
  439. package/dist/components/core/Progress/index.d.ts +1 -1
  440. package/dist/components/core/Rating/Rating.js +13 -5
  441. package/dist/components/core/ScrollArea/ScrollArea.js +294 -12
  442. package/dist/components/core/ScrollArea/ScrollArea.theme.js +1 -1
  443. package/dist/components/core/ScrollArea/ScrollArea.types.d.ts +24 -4
  444. package/dist/components/core/ScrollArea/index.d.ts +1 -1
  445. package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.d.ts +5 -0
  446. package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.js +37 -3
  447. package/dist/components/core/ScrollArea/smooth/SnapPointDetector.js +1 -0
  448. package/dist/components/core/ScrollArea/smooth/useSmoothScroll.js +5 -0
  449. package/dist/components/core/ScrollArea/smooth/useSmoothScroll.types.d.ts +5 -0
  450. package/dist/components/core/Segmented/Segmented.js +21 -19
  451. package/dist/components/core/Segmented/Segmented.theme.js +6 -6
  452. package/dist/components/core/Segmented/SegmentedItem.js +30 -3
  453. package/dist/components/core/Separator/Separator.js +1 -0
  454. package/dist/components/core/Sidebar/Sidebar.d.ts +14 -1
  455. package/dist/components/core/Sidebar/Sidebar.js +95 -21
  456. package/dist/components/core/Sidebar/Sidebar.theme.js +7 -7
  457. package/dist/components/core/Sidebar/Sidebar.types.d.ts +186 -6
  458. package/dist/components/core/Sidebar/SidebarCard.d.ts +25 -0
  459. package/dist/components/core/Sidebar/SidebarCard.js +69 -0
  460. package/dist/components/core/Sidebar/SidebarCard.theme.d.ts +8 -0
  461. package/dist/components/core/Sidebar/SidebarCard.theme.js +18 -0
  462. package/dist/components/core/Sidebar/SidebarContent.js +11 -4
  463. package/dist/components/core/Sidebar/SidebarContext.d.ts +26 -11
  464. package/dist/components/core/Sidebar/SidebarContext.js +87 -11
  465. package/dist/components/core/Sidebar/SidebarFooter.js +5 -4
  466. package/dist/components/core/Sidebar/SidebarHeader.js +15 -4
  467. package/dist/components/core/Sidebar/SidebarLogo.d.ts +3 -0
  468. package/dist/components/core/Sidebar/SidebarLogo.js +49 -0
  469. package/dist/components/core/Sidebar/SidebarMobileTrigger.d.ts +3 -0
  470. package/dist/components/core/Sidebar/SidebarMobileTrigger.js +30 -0
  471. package/dist/components/core/Sidebar/SidebarNav.js +6 -2
  472. package/dist/components/core/Sidebar/SidebarNavGroup.js +6 -5
  473. package/dist/components/core/Sidebar/SidebarSearch.d.ts +22 -0
  474. package/dist/components/core/Sidebar/SidebarSearch.js +136 -0
  475. package/dist/components/core/Sidebar/SidebarToggle.js +9 -4
  476. package/dist/components/core/Sidebar/SidebarUserProfile.d.ts +3 -0
  477. package/dist/components/core/Sidebar/SidebarUserProfile.js +49 -0
  478. package/dist/components/core/Sidebar/index.d.ts +7 -3
  479. package/dist/components/core/Skeleton/Skeleton.js +2 -2
  480. package/dist/components/core/Skeleton/Skeleton.theme.js +1 -1
  481. package/dist/components/core/SlidingNumber/SlidingNumber.js +3 -1
  482. package/dist/components/core/Sortable/Sortable.animations.js +1 -0
  483. package/dist/components/core/Sortable/Sortable.d.ts +1 -1
  484. package/dist/components/core/Sortable/Sortable.js +23 -6
  485. package/dist/components/core/Sortable/Sortable.theme.js +1 -1
  486. package/dist/components/core/Sortable/Sortable.types.d.ts +9 -5
  487. package/dist/components/core/Spinner/Spinner.js +1 -0
  488. package/dist/components/core/Spinner/Spinner.theme.js +4 -6
  489. package/dist/components/core/Spinner/Spinner.types.d.ts +2 -1
  490. package/dist/components/core/Tabs/Tabs.animations.d.ts +2 -2
  491. package/dist/components/core/Tabs/Tabs.animations.js +4 -3
  492. package/dist/components/core/Tabs/Tabs.d.ts +1 -1
  493. package/dist/components/core/Tabs/Tabs.js +15 -7
  494. package/dist/components/core/Tabs/Tabs.theme.d.ts +2 -2
  495. package/dist/components/core/Tabs/Tabs.theme.js +6 -6
  496. package/dist/components/core/Tabs/Tabs.types.d.ts +13 -9
  497. package/dist/components/core/Tabs/TabsBody.d.ts +6 -0
  498. package/dist/components/core/Tabs/{TabsContent.js → TabsBody.js} +15 -12
  499. package/dist/components/core/Tabs/TabsContext.js +1 -0
  500. package/dist/components/core/Tabs/TabsList.js +20 -21
  501. package/dist/components/core/Tabs/TabsTrigger.js +81 -38
  502. package/dist/components/core/Tabs/index.d.ts +2 -2
  503. package/dist/components/core/Tag/Tag.animations.js +0 -13
  504. package/dist/components/core/Tag/Tag.d.ts +2 -2
  505. package/dist/components/core/Tag/Tag.js +47 -5
  506. package/dist/components/core/Tag/Tag.theme.js +19 -6
  507. package/dist/components/core/Tag/Tag.types.d.ts +31 -1
  508. package/dist/components/core/Toast/Toast.animations.d.ts +3 -2
  509. package/dist/components/core/Toast/Toast.animations.js +20 -17
  510. package/dist/components/core/Toast/Toast.d.ts +2 -2
  511. package/dist/components/core/Toast/Toast.js +66 -31
  512. package/dist/components/core/Toast/Toast.theme.js +8 -16
  513. package/dist/components/core/Toast/Toast.types.d.ts +41 -48
  514. package/dist/components/core/Toast/ToastProvider.js +7 -2
  515. package/dist/components/core/Toast/index.d.ts +1 -1
  516. package/dist/components/core/Toast/useToast.js +5 -6
  517. package/dist/components/core/Tooltip/Tooltip.animations.js +19 -53
  518. package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
  519. package/dist/components/core/Tooltip/Tooltip.js +50 -38
  520. package/dist/components/core/Tooltip/Tooltip.theme.js +4 -3
  521. package/dist/components/core/Tooltip/Tooltip.types.d.ts +13 -1
  522. package/dist/components/core/Tree/Tree.animations.d.ts +1 -2
  523. package/dist/components/core/Tree/Tree.animations.js +20 -58
  524. package/dist/components/core/Tree/Tree.js +183 -11
  525. package/dist/components/core/index.d.ts +4 -2
  526. package/dist/components/core/index.js +29 -6
  527. package/dist/components/data-display/DescriptionList/DescriptionList.js +24 -7
  528. package/dist/components/data-display/DescriptionList/DescriptionList.theme.js +10 -3
  529. package/dist/components/data-display/DescriptionList/DescriptionList.types.d.ts +49 -10
  530. package/dist/components/data-display/DescriptionList/index.d.ts +1 -1
  531. package/dist/components/data-display/Feed/Feed.animations.d.ts +40 -0
  532. package/dist/components/data-display/Feed/Feed.animations.js +26 -0
  533. package/dist/components/data-display/Feed/Feed.d.ts +5 -1
  534. package/dist/components/data-display/Feed/Feed.js +114 -55
  535. package/dist/components/data-display/Feed/Feed.theme.js +11 -13
  536. package/dist/components/data-display/Feed/Feed.types.d.ts +66 -34
  537. package/dist/components/data-display/Feed/index.d.ts +1 -1
  538. package/dist/components/data-display/GanttChart/GanttChart.d.ts +3 -4
  539. package/dist/components/data-display/GanttChart/GanttChart.js +36 -25
  540. package/dist/components/data-display/GanttChart/GanttChart.theme.js +19 -17
  541. package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +21 -2
  542. package/dist/components/data-display/GanttChart/GanttChart.utils.js +1 -1
  543. package/dist/components/data-display/GanttChart/GanttChartContext.d.ts +5 -0
  544. package/dist/components/data-display/GanttChart/GanttChartContext.js +26 -0
  545. package/dist/components/data-display/GanttChart/GanttChartPanel.d.ts +1 -1
  546. package/dist/components/data-display/GanttChart/GanttChartPanel.js +5 -4
  547. package/dist/components/data-display/GanttChart/GanttDependencyArrows.js +9 -5
  548. package/dist/components/data-display/GanttChart/GanttGroupBar.js +2 -1
  549. package/dist/components/data-display/GanttChart/GanttMilestone.js +8 -7
  550. package/dist/components/data-display/GanttChart/GanttSplitter.js +17 -2
  551. package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +3 -2
  552. package/dist/components/data-display/GanttChart/GanttTableHeader.js +2 -1
  553. package/dist/components/data-display/GanttChart/GanttTablePanel.js +3 -2
  554. package/dist/components/data-display/GanttChart/GanttTableTaskRow.js +4 -3
  555. package/dist/components/data-display/GanttChart/GanttTaskBar.js +43 -19
  556. package/dist/components/data-display/GanttChart/GanttTaskContextMenu.js +3 -2
  557. package/dist/components/data-display/GanttChart/GanttTimelineGrid.js +4 -2
  558. package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +37 -12
  559. package/dist/components/data-display/GanttChart/GanttToolbar.js +5 -3
  560. package/dist/components/data-display/GanttChart/hooks/useGanttDates.js +1 -0
  561. package/dist/components/data-display/GanttChart/hooks/useGanttDrag.js +4 -2
  562. package/dist/components/data-display/GanttChart/hooks/useGanttLayout.js +1 -0
  563. package/dist/components/data-display/GanttChart/hooks/useGanttScrollSync.js +1 -0
  564. package/dist/components/data-display/GanttChart/index.d.ts +1 -1
  565. package/dist/components/data-display/KPI/KPI.js +14 -3
  566. package/dist/components/data-display/KPI/KPI.theme.js +8 -9
  567. package/dist/components/data-display/KPI/KPI.types.d.ts +5 -4
  568. package/dist/components/data-display/Metric/Metric.js +8 -8
  569. package/dist/components/data-display/Metric/Metric.theme.d.ts +3 -2
  570. package/dist/components/data-display/Metric/Metric.theme.js +39 -65
  571. package/dist/components/data-display/Metric/Metric.types.d.ts +22 -25
  572. package/dist/components/data-display/Table/Table.animations.js +17 -10
  573. package/dist/components/data-display/Table/Table.d.ts +2 -7
  574. package/dist/components/data-display/Table/Table.filterUtils.js +8 -1
  575. package/dist/components/data-display/Table/Table.js +28 -31
  576. package/dist/components/data-display/Table/Table.theme.js +38 -10
  577. package/dist/components/data-display/Table/Table.types.d.ts +37 -8
  578. package/dist/components/data-display/Table/TableActions.js +6 -5
  579. package/dist/components/data-display/Table/TableActionsMenu.js +3 -3
  580. package/dist/components/data-display/Table/TableBody.js +3 -2
  581. package/dist/components/data-display/Table/TableCell.d.ts +1 -1
  582. package/dist/components/data-display/Table/TableCell.js +13 -5
  583. package/dist/components/data-display/Table/TableColumnManager.js +4 -1
  584. package/dist/components/data-display/Table/TableContext.d.ts +11 -0
  585. package/dist/components/data-display/Table/TableContext.js +21 -0
  586. package/dist/components/data-display/Table/TableDeclarative.js +8 -9
  587. package/dist/components/data-display/Table/TableFilter.js +33 -25
  588. package/dist/components/data-display/Table/TableHeader.js +6 -2
  589. package/dist/components/data-display/Table/TablePagination.js +4 -7
  590. package/dist/components/data-display/Table/TableRow.d.ts +1 -1
  591. package/dist/components/data-display/Table/TableRow.js +12 -8
  592. package/dist/components/data-display/Table/TableSelectionHeader.js +5 -3
  593. package/dist/components/data-display/Table/hooks/useTableColumns.js +1 -0
  594. package/dist/components/data-display/Table/hooks/useTableExpansion.js +1 -0
  595. package/dist/components/data-display/Table/hooks/useTableFilter.js +1 -0
  596. package/dist/components/data-display/Table/hooks/useTablePagination.js +1 -0
  597. package/dist/components/data-display/Table/hooks/useTableSelection.js +1 -0
  598. package/dist/components/data-display/Table/index.d.ts +2 -2
  599. package/dist/components/data-display/Table/index.js +2 -2
  600. package/dist/components/data-display/Timeline/Timeline.animations.d.ts +0 -7
  601. package/dist/components/data-display/Timeline/Timeline.animations.js +2 -27
  602. package/dist/components/data-display/Timeline/Timeline.d.ts +2 -2
  603. package/dist/components/data-display/Timeline/Timeline.js +33 -17
  604. package/dist/components/data-display/Timeline/Timeline.theme.d.ts +2 -16
  605. package/dist/components/data-display/Timeline/Timeline.theme.js +14 -8
  606. package/dist/components/data-display/Timeline/Timeline.types.d.ts +70 -27
  607. package/dist/components/data-display/Timeline/Timeline.utils.d.ts +6 -0
  608. package/dist/components/data-display/Timeline/Timeline.utils.js +11 -0
  609. package/dist/components/data-display/Timeline/TimelineContent.js +5 -8
  610. package/dist/components/data-display/Timeline/TimelineContext.d.ts +3 -0
  611. package/dist/components/data-display/Timeline/TimelineContext.js +16 -0
  612. package/dist/components/data-display/Timeline/TimelineItem.js +21 -40
  613. package/dist/components/data-display/Timeline/TimelineMarker.js +12 -9
  614. package/dist/components/data-display/Timeline/index.d.ts +2 -2
  615. package/dist/components/effects/3d/index.d.ts +4 -0
  616. package/dist/components/effects/3d/index.js +2 -0
  617. package/dist/components/effects/AIOrb/AIOrb.d.ts +1 -0
  618. package/dist/components/effects/AIOrb/AIOrb.js +3 -2
  619. package/dist/components/effects/AIOrb/AIOrb.types.d.ts +1 -0
  620. package/dist/components/effects/AIOrb/hooks/index.d.ts +2 -0
  621. package/dist/components/effects/AIOrb/hooks/useOrbState.d.ts +20 -0
  622. package/dist/components/effects/AIOrb/hooks/useOrbState.js +28 -0
  623. package/dist/components/effects/AIOrb/index.d.ts +2 -2
  624. package/dist/components/effects/AIOrb/variants/Aura/Aura.d.ts +3 -0
  625. package/dist/components/effects/AIOrb/variants/Aura/Aura.js +84 -0
  626. package/dist/components/effects/AIOrb/variants/Aura/Aura.shaders.d.ts +28 -0
  627. package/dist/components/effects/AIOrb/variants/Aura/Aura.shaders.js +191 -0
  628. package/dist/components/effects/AIOrb/variants/Aura/Aura.types.d.ts +53 -0
  629. package/dist/components/effects/AIOrb/variants/Aura/index.d.ts +2 -0
  630. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.d.ts +7 -0
  631. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.impl.d.ts +3 -0
  632. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.impl.js +176 -0
  633. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.js +29 -130
  634. package/dist/components/effects/AIOrb/variants/DotSphere/DotSphere.types.d.ts +6 -0
  635. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.d.ts +8 -0
  636. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.impl.d.ts +3 -0
  637. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.impl.js +140 -0
  638. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.js +29 -101
  639. package/dist/components/effects/AIOrb/variants/Liquid/Liquid.types.d.ts +6 -0
  640. package/dist/components/effects/AIOrb/variants/index.d.ts +2 -0
  641. package/dist/components/effects/Animated/Animated.animations.js +29 -10
  642. package/dist/components/effects/Animated/Animated.d.ts +4 -4
  643. package/dist/components/effects/Animated/Animated.js +9 -9
  644. package/dist/components/effects/Animated/AnimatedContext.d.ts +3 -0
  645. package/dist/components/effects/Animated/AnimatedContext.js +12 -0
  646. package/dist/components/effects/Animated/AnimatedItem.d.ts +1 -1
  647. package/dist/components/effects/Animated/AnimatedItem.js +7 -5
  648. package/dist/components/effects/Aurora/Aurora.d.ts +6 -17
  649. package/dist/components/effects/Aurora/Aurora.js +332 -105
  650. package/dist/components/effects/Aurora/Aurora.types.d.ts +6 -0
  651. package/dist/components/effects/ColorPanels/ColorPanels.d.ts +8 -0
  652. package/dist/components/effects/ColorPanels/ColorPanels.js +66 -0
  653. package/dist/components/effects/ColorPanels/ColorPanels.shaders.d.ts +12 -0
  654. package/dist/components/effects/ColorPanels/ColorPanels.shaders.js +218 -0
  655. package/dist/components/effects/ColorPanels/ColorPanels.types.d.ts +29 -0
  656. package/dist/components/effects/ColorPanels/ColorPanels.types.js +3 -0
  657. package/dist/components/effects/ColorPanels/index.d.ts +2 -0
  658. package/dist/components/effects/CustomCursor/CustomCursor.d.ts +4 -4
  659. package/dist/components/effects/CustomCursor/CustomCursor.js +54 -54
  660. package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +5 -4
  661. package/dist/components/effects/Dithering/Dithering.d.ts +10 -0
  662. package/dist/components/effects/Dithering/Dithering.js +62 -0
  663. package/dist/components/effects/Dithering/Dithering.shaders.d.ts +11 -0
  664. package/dist/components/effects/Dithering/Dithering.shaders.js +166 -0
  665. package/dist/components/effects/Dithering/Dithering.types.d.ts +31 -0
  666. package/dist/components/effects/Dithering/Dithering.types.js +17 -0
  667. package/dist/components/effects/Dithering/index.d.ts +3 -0
  668. package/dist/components/effects/DotPattern/DotPattern.js +2 -1
  669. package/dist/components/effects/FlutedGlass/FlutedGlass.d.ts +9 -0
  670. package/dist/components/effects/FlutedGlass/FlutedGlass.js +80 -0
  671. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.d.ts +12 -0
  672. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.js +335 -0
  673. package/dist/components/effects/FlutedGlass/FlutedGlass.types.d.ts +61 -0
  674. package/dist/components/effects/FlutedGlass/FlutedGlass.types.js +16 -0
  675. package/dist/components/effects/FlutedGlass/index.d.ts +3 -0
  676. package/dist/components/effects/GemSmoke/GemSmoke.d.ts +8 -0
  677. package/dist/components/effects/GemSmoke/GemSmoke.js +70 -0
  678. package/dist/components/effects/GemSmoke/GemSmoke.shaders.d.ts +18 -0
  679. package/dist/components/effects/GemSmoke/GemSmoke.shaders.js +181 -0
  680. package/dist/components/effects/GemSmoke/GemSmoke.types.d.ts +37 -0
  681. package/dist/components/effects/GemSmoke/GemSmoke.types.js +10 -0
  682. package/dist/components/effects/GemSmoke/index.d.ts +3 -0
  683. package/dist/components/effects/GlassEffect/GlassEffect.js +1 -1
  684. package/dist/components/effects/GlassSurface/GlassSurface.d.ts +1 -1
  685. package/dist/components/effects/GlassSurface/GlassSurface.js +40 -34
  686. package/dist/components/effects/GlassSurface/GlassSurface.types.d.ts +14 -0
  687. package/dist/components/effects/GodRays/GodRays.d.ts +8 -0
  688. package/dist/components/effects/GodRays/GodRays.js +68 -0
  689. package/dist/components/effects/GodRays/GodRays.shaders.d.ts +10 -0
  690. package/dist/components/effects/GodRays/GodRays.shaders.js +128 -0
  691. package/dist/components/effects/GodRays/GodRays.types.d.ts +25 -0
  692. package/dist/components/effects/GodRays/GodRays.types.js +3 -0
  693. package/dist/components/effects/GodRays/index.d.ts +2 -0
  694. package/dist/components/effects/GradientMesh/GradientMesh.d.ts +9 -0
  695. package/dist/components/effects/GradientMesh/GradientMesh.js +56 -0
  696. package/dist/components/effects/GradientMesh/GradientMesh.shaders.d.ts +15 -0
  697. package/dist/components/effects/GradientMesh/GradientMesh.shaders.js +127 -0
  698. package/dist/components/effects/GradientMesh/GradientMesh.types.d.ts +17 -0
  699. package/dist/components/effects/GradientMesh/GradientMesh.types.js +3 -0
  700. package/dist/components/effects/GradientMesh/index.d.ts +2 -0
  701. package/dist/components/effects/GrainGradient/GrainGradient.d.ts +9 -0
  702. package/dist/components/effects/GrainGradient/GrainGradient.js +62 -0
  703. package/dist/components/effects/GrainGradient/GrainGradient.shaders.d.ts +17 -0
  704. package/dist/components/effects/GrainGradient/GrainGradient.shaders.js +168 -0
  705. package/dist/components/effects/GrainGradient/GrainGradient.types.d.ts +26 -0
  706. package/dist/components/effects/GrainGradient/GrainGradient.types.js +9 -0
  707. package/dist/components/effects/GrainGradient/index.d.ts +3 -0
  708. package/dist/components/effects/GridPattern/GridPattern.js +1 -0
  709. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.d.ts +10 -0
  710. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.js +78 -0
  711. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.d.ts +22 -0
  712. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.js +239 -0
  713. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.types.d.ts +52 -0
  714. package/dist/components/effects/HalftoneCmyk/index.d.ts +2 -0
  715. package/dist/components/effects/HalftoneDots/HalftoneDots.d.ts +9 -0
  716. package/dist/components/effects/HalftoneDots/HalftoneDots.js +68 -0
  717. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.d.ts +13 -0
  718. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.js +296 -0
  719. package/dist/components/effects/HalftoneDots/HalftoneDots.types.d.ts +43 -0
  720. package/dist/components/effects/HalftoneDots/HalftoneDots.types.js +12 -0
  721. package/dist/components/effects/HalftoneDots/index.d.ts +3 -0
  722. package/dist/components/effects/ImageDithering/ImageDithering.d.ts +9 -0
  723. package/dist/components/effects/ImageDithering/ImageDithering.js +68 -0
  724. package/dist/components/effects/ImageDithering/ImageDithering.shaders.d.ts +12 -0
  725. package/dist/components/effects/ImageDithering/ImageDithering.shaders.js +117 -0
  726. package/dist/components/effects/ImageDithering/ImageDithering.types.d.ts +30 -0
  727. package/dist/components/effects/ImageDithering/ImageDithering.types.js +8 -0
  728. package/dist/components/effects/ImageDithering/index.d.ts +3 -0
  729. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.d.ts +39 -0
  730. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.js +98 -0
  731. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.d.ts +3 -0
  732. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +105 -0
  733. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.types.d.ts +30 -0
  734. package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.d.ts +3 -0
  735. package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +46 -0
  736. package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.d.ts +3 -0
  737. package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +46 -0
  738. package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.d.ts +3 -0
  739. package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +48 -0
  740. package/dist/components/effects/InteractiveCharacters/hooks/useBlink.d.ts +14 -0
  741. package/dist/components/effects/InteractiveCharacters/hooks/useBlink.js +42 -0
  742. package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.d.ts +25 -0
  743. package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.js +85 -0
  744. package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.d.ts +18 -0
  745. package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.js +36 -0
  746. package/dist/components/effects/InteractiveCharacters/index.d.ts +2 -0
  747. package/dist/components/effects/LiquidMetal/LiquidMetal.d.ts +9 -0
  748. package/dist/components/effects/LiquidMetal/LiquidMetal.js +61 -0
  749. package/dist/components/effects/LiquidMetal/LiquidMetal.shaders.d.ts +19 -0
  750. package/dist/components/effects/LiquidMetal/LiquidMetal.shaders.js +202 -0
  751. package/dist/components/effects/LiquidMetal/LiquidMetal.types.d.ts +34 -0
  752. package/dist/components/effects/LiquidMetal/LiquidMetal.types.js +9 -0
  753. package/dist/components/effects/LiquidMetal/index.d.ts +3 -0
  754. package/dist/components/effects/MagneticElement/MagneticElement.js +1 -0
  755. package/dist/components/effects/MeshGradient/MeshGradient.d.ts +25 -0
  756. package/dist/components/effects/MeshGradient/MeshGradient.js +47 -0
  757. package/dist/components/effects/MeshGradient/MeshGradient.types.d.ts +40 -0
  758. package/dist/components/effects/MeshGradient/MeshGradient.utils.d.ts +83 -0
  759. package/dist/components/effects/MeshGradient/MeshGradient.utils.js +112 -0
  760. package/dist/components/effects/MeshGradient/index.d.ts +4 -0
  761. package/dist/components/effects/Metaballs/Metaballs.d.ts +8 -0
  762. package/dist/components/effects/Metaballs/Metaballs.js +59 -0
  763. package/dist/components/effects/Metaballs/Metaballs.shaders.d.ts +10 -0
  764. package/dist/components/effects/Metaballs/Metaballs.shaders.js +102 -0
  765. package/dist/components/effects/Metaballs/Metaballs.types.d.ts +16 -0
  766. package/dist/components/effects/Metaballs/Metaballs.types.js +3 -0
  767. package/dist/components/effects/Metaballs/index.d.ts +2 -0
  768. package/dist/components/effects/Neumorphic/InsetCircleButton.d.ts +10 -0
  769. package/dist/components/effects/Neumorphic/InsetCircleButton.js +11 -0
  770. package/dist/components/effects/Neumorphic/InsetPill.d.ts +8 -0
  771. package/dist/components/effects/Neumorphic/InsetPill.js +8 -0
  772. package/dist/components/effects/Neumorphic/index.d.ts +4 -0
  773. package/dist/components/effects/NoiseOverlay/NoiseOverlay.d.ts +1 -1
  774. package/dist/components/effects/NoiseOverlay/NoiseOverlay.js +5 -4
  775. package/dist/components/effects/Overlay/Overlay.js +52 -25
  776. package/dist/components/effects/Overlay/Overlay.theme.js +1 -2
  777. package/dist/components/effects/PaperTexture/PaperTexture.d.ts +9 -0
  778. package/dist/components/effects/PaperTexture/PaperTexture.js +61 -0
  779. package/dist/components/effects/PaperTexture/PaperTexture.shaders.d.ts +22 -0
  780. package/dist/components/effects/PaperTexture/PaperTexture.shaders.js +145 -0
  781. package/dist/components/effects/PaperTexture/PaperTexture.types.d.ts +19 -0
  782. package/dist/components/effects/PaperTexture/index.d.ts +2 -0
  783. package/dist/components/effects/Particles/Particles.js +1 -0
  784. package/dist/components/effects/Particles/Particles.scene.js +1 -0
  785. package/dist/components/effects/Preloader/Preloader.animations.d.ts +23 -0
  786. package/dist/components/effects/Preloader/Preloader.animations.js +150 -0
  787. package/dist/components/effects/Preloader/Preloader.d.ts +3 -0
  788. package/dist/components/effects/Preloader/Preloader.js +120 -0
  789. package/dist/components/effects/Preloader/Preloader.types.d.ts +63 -0
  790. package/dist/components/effects/Preloader/index.d.ts +2 -0
  791. package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.js +26 -14
  792. package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.types.d.ts +2 -0
  793. package/dist/components/effects/PulsingBorder/PulsingBorder.d.ts +27 -0
  794. package/dist/components/effects/PulsingBorder/PulsingBorder.js +174 -0
  795. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.d.ts +14 -0
  796. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.js +258 -0
  797. package/dist/components/effects/PulsingBorder/PulsingBorder.types.d.ts +75 -0
  798. package/dist/components/effects/PulsingBorder/PulsingBorder.types.js +3 -0
  799. package/dist/components/effects/PulsingBorder/index.d.ts +2 -0
  800. package/dist/components/effects/ScrollReveal/ScrollReveal.js +1 -0
  801. package/dist/components/effects/Shimmer/Shimmer.d.ts +21 -0
  802. package/dist/components/effects/Shimmer/Shimmer.js +44 -0
  803. package/dist/components/effects/Shimmer/Shimmer.types.d.ts +49 -0
  804. package/dist/components/effects/Shimmer/index.d.ts +2 -0
  805. package/dist/components/effects/SmokeRing/SmokeRing.d.ts +8 -0
  806. package/dist/components/effects/SmokeRing/SmokeRing.js +62 -0
  807. package/dist/components/effects/SmokeRing/SmokeRing.shaders.d.ts +14 -0
  808. package/dist/components/effects/SmokeRing/SmokeRing.shaders.js +130 -0
  809. package/dist/components/effects/SmokeRing/SmokeRing.types.d.ts +22 -0
  810. package/dist/components/effects/SmokeRing/SmokeRing.types.js +3 -0
  811. package/dist/components/effects/SmokeRing/index.d.ts +2 -0
  812. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.d.ts +9 -0
  813. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.js +59 -0
  814. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.d.ts +14 -0
  815. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.js +129 -0
  816. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.d.ts +23 -0
  817. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.js +3 -0
  818. package/dist/components/effects/StaticGradientMesh/index.d.ts +2 -0
  819. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.d.ts +9 -0
  820. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.js +66 -0
  821. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.shaders.d.ts +13 -0
  822. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.shaders.js +169 -0
  823. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.types.d.ts +29 -0
  824. package/dist/components/effects/StaticRadialGradient/StaticRadialGradient.types.js +3 -0
  825. package/dist/components/effects/StaticRadialGradient/index.d.ts +2 -0
  826. package/dist/components/effects/StripePattern/StripePattern.d.ts +18 -0
  827. package/dist/components/effects/StripePattern/StripePattern.js +55 -0
  828. package/dist/components/effects/StripePattern/StripePattern.types.d.ts +53 -0
  829. package/dist/components/effects/StripePattern/index.d.ts +2 -0
  830. package/dist/components/effects/TiltCard/TiltCard.d.ts +12 -0
  831. package/dist/components/effects/TiltCard/TiltCard.glow.d.ts +28 -0
  832. package/dist/components/effects/TiltCard/TiltCard.glow.js +115 -0
  833. package/dist/components/effects/TiltCard/TiltCard.js +178 -0
  834. package/dist/components/effects/{SpotlightBorder/SpotlightBorder.shaders.d.ts → TiltCard/TiltCard.shaders.d.ts} +1 -1
  835. package/dist/components/effects/{SpotlightBorder/SpotlightBorder.shaders.js → TiltCard/TiltCard.shaders.js} +1 -1
  836. package/dist/components/effects/TiltCard/TiltCard.types.d.ts +88 -0
  837. package/dist/components/effects/TiltCard/index.d.ts +2 -0
  838. package/dist/components/effects/Water/Water.d.ts +9 -0
  839. package/dist/components/effects/Water/Water.js +65 -0
  840. package/dist/components/effects/Water/Water.shaders.d.ts +11 -0
  841. package/dist/components/effects/Water/Water.shaders.js +123 -0
  842. package/dist/components/effects/Water/Water.types.d.ts +25 -0
  843. package/dist/components/effects/Water/index.d.ts +2 -0
  844. package/dist/components/effects/index.d.ts +57 -16
  845. package/dist/components/effects/index.js +30 -8
  846. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.d.ts +13 -0
  847. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.js +255 -0
  848. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.types.d.ts +18 -0
  849. package/dist/components/effects/shared/ShaderCanvas/index.d.ts +2 -0
  850. package/dist/components/effects/shared/bayerMatrices.glsl.d.ts +10 -0
  851. package/dist/components/effects/shared/bayerMatrices.glsl.js +44 -0
  852. package/dist/components/effects/shared/imageUV.glsl.d.ts +12 -0
  853. package/dist/components/effects/shared/imageUV.glsl.js +26 -0
  854. package/dist/components/effects/shared/index.d.ts +7 -0
  855. package/dist/components/effects/shared/resolveShaderColor.d.ts +13 -0
  856. package/dist/components/effects/shared/resolveShaderColor.js +62 -0
  857. package/dist/components/effects/shared/resolveShaderColor.test.d.ts +1 -0
  858. package/dist/components/effects/shared/shaderNoise.glsl.d.ts +34 -0
  859. package/dist/components/effects/shared/shaderNoise.glsl.js +84 -0
  860. package/dist/components/forms/Checkbox/Checkbox.animations.d.ts +14 -0
  861. package/dist/components/forms/Checkbox/Checkbox.animations.js +54 -0
  862. package/dist/components/forms/Checkbox/Checkbox.d.ts +3 -4
  863. package/dist/components/forms/Checkbox/Checkbox.js +54 -12
  864. package/dist/components/forms/Checkbox/Checkbox.theme.js +13 -7
  865. package/dist/components/forms/Checkbox/Checkbox.types.d.ts +36 -8
  866. package/dist/components/forms/Checkbox/CheckboxContext.d.ts +14 -0
  867. package/dist/components/forms/Checkbox/CheckboxContext.js +13 -0
  868. package/dist/components/forms/Checkbox/CheckboxGroup.d.ts +3 -0
  869. package/dist/components/forms/Checkbox/CheckboxGroup.js +48 -0
  870. package/dist/components/forms/Checkbox/index.d.ts +1 -1
  871. package/dist/components/forms/ColorPicker/ColorPicker.d.ts +6 -10
  872. package/dist/components/forms/ColorPicker/ColorPicker.js +150 -27
  873. package/dist/components/forms/ColorPicker/ColorPicker.theme.js +8 -5
  874. package/dist/components/forms/ColorPicker/ColorPicker.types.d.ts +112 -5
  875. package/dist/components/forms/ColorPicker/ColorPicker2DCanvas.js +44 -6
  876. package/dist/components/forms/ColorPicker/ColorPickerBody.d.ts +7 -0
  877. package/dist/components/forms/ColorPicker/{ColorPickerContent.js → ColorPickerBody.js} +17 -14
  878. package/dist/components/forms/ColorPicker/ColorPickerContext.d.ts +4 -0
  879. package/dist/components/forms/ColorPicker/ColorPickerContext.js +13 -0
  880. package/dist/components/forms/ColorPicker/ColorPickerEyeDropper.js +5 -4
  881. package/dist/components/forms/ColorPicker/ColorPickerFormatSelector.js +2 -1
  882. package/dist/components/forms/ColorPicker/ColorPickerGradient.d.ts +7 -0
  883. package/dist/components/forms/ColorPicker/ColorPickerGradient.js +187 -0
  884. package/dist/components/forms/ColorPicker/ColorPickerHeader.d.ts +14 -0
  885. package/dist/components/forms/ColorPicker/ColorPickerHeader.js +32 -0
  886. package/dist/components/forms/ColorPicker/ColorPickerImage.d.ts +6 -0
  887. package/dist/components/forms/ColorPicker/ColorPickerImage.js +155 -0
  888. package/dist/components/forms/ColorPicker/ColorPickerInput.d.ts +0 -4
  889. package/dist/components/forms/ColorPicker/ColorPickerInput.js +54 -61
  890. package/dist/components/forms/ColorPicker/ColorPickerPresets.js +14 -12
  891. package/dist/components/forms/ColorPicker/ColorPickerSavedColors.d.ts +3 -0
  892. package/dist/components/forms/ColorPicker/ColorPickerSavedColors.js +70 -0
  893. package/dist/components/forms/ColorPicker/ColorPickerSliders.d.ts +1 -2
  894. package/dist/components/forms/ColorPicker/ColorPickerSliders.js +85 -23
  895. package/dist/components/forms/ColorPicker/ColorPickerSwatch.d.ts +1 -1
  896. package/dist/components/forms/ColorPicker/ColorPickerSwatch.js +11 -9
  897. package/dist/components/forms/ColorPicker/ColorPickerTrigger.js +22 -3
  898. package/dist/components/forms/ColorPicker/index.d.ts +9 -3
  899. package/dist/components/forms/Combobox/Combobox.js +92 -71
  900. package/dist/components/forms/Combobox/Combobox.theme.js +2 -4
  901. package/dist/components/forms/Combobox/Combobox.types.d.ts +12 -2
  902. package/dist/components/forms/DatePicker/DatePicker.animations.js +1 -0
  903. package/dist/components/forms/DatePicker/DatePicker.d.ts +6 -26
  904. package/dist/components/forms/DatePicker/DatePicker.js +10 -8
  905. package/dist/components/forms/DatePicker/DatePicker.theme.js +11 -18
  906. package/dist/components/forms/DatePicker/DatePicker.types.d.ts +28 -6
  907. package/dist/components/forms/DatePicker/DatePickerBody.d.ts +7 -0
  908. package/dist/components/forms/DatePicker/{DatePickerContent.js → DatePickerBody.js} +32 -54
  909. package/dist/components/forms/DatePicker/DatePickerContext.d.ts +29 -0
  910. package/dist/components/forms/DatePicker/DatePickerContext.js +6 -0
  911. package/dist/components/forms/DatePicker/DatePickerPresets.js +2 -1
  912. package/dist/components/forms/DatePicker/DatePickerTrigger.js +5 -4
  913. package/dist/components/forms/DatePicker/index.d.ts +2 -2
  914. package/dist/components/forms/DateRangePicker/DateRangePicker.animations.d.ts +1 -0
  915. package/dist/components/forms/DateRangePicker/DateRangePicker.d.ts +17 -0
  916. package/dist/components/forms/DateRangePicker/DateRangePicker.js +121 -0
  917. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.d.ts +5 -0
  918. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +45 -0
  919. package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +177 -0
  920. package/dist/components/forms/DateRangePicker/DateRangePickerBody.d.ts +6 -0
  921. package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +186 -0
  922. package/dist/components/forms/DateRangePicker/DateRangePickerContext.d.ts +24 -0
  923. package/dist/components/forms/DateRangePicker/DateRangePickerContext.js +5 -0
  924. package/dist/components/forms/DateRangePicker/DateRangePickerPresets.d.ts +6 -0
  925. package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +42 -0
  926. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.d.ts +6 -0
  927. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +33 -0
  928. package/dist/components/forms/DateRangePicker/dateRangePresets.d.ts +5 -0
  929. package/dist/components/forms/DateRangePicker/dateRangePresets.js +59 -0
  930. package/dist/components/forms/DateRangePicker/index.d.ts +4 -0
  931. package/dist/components/forms/FileUpload/FileUpload.animations.d.ts +29 -0
  932. package/dist/components/forms/FileUpload/FileUpload.animations.js +19 -0
  933. package/dist/components/forms/FileUpload/FileUpload.js +95 -132
  934. package/dist/components/forms/FileUpload/FileUpload.theme.d.ts +2 -10
  935. package/dist/components/forms/FileUpload/FileUpload.theme.js +16 -30
  936. package/dist/components/forms/FileUpload/FileUpload.types.d.ts +41 -10
  937. package/dist/components/forms/FileUpload/FileUploadProgress.animations.d.ts +36 -0
  938. package/dist/components/forms/FileUpload/FileUploadProgress.animations.js +22 -0
  939. package/dist/components/forms/FileUpload/FileUploadProgress.d.ts +3 -0
  940. package/dist/components/forms/FileUpload/FileUploadProgress.js +119 -0
  941. package/dist/components/forms/FileUpload/FileUploadProgress.theme.d.ts +19 -0
  942. package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +27 -0
  943. package/dist/components/forms/FileUpload/FileUploadProgress.types.d.ts +33 -0
  944. package/dist/components/forms/FileUpload/index.d.ts +3 -0
  945. package/dist/components/forms/FormLabel/FormLabel.js +2 -2
  946. package/dist/components/forms/FormLabel/FormLabel.theme.js +1 -1
  947. package/dist/components/forms/Input/Input.js +16 -15
  948. package/dist/components/forms/Input/Input.theme.js +24 -17
  949. package/dist/components/forms/Input/Input.types.d.ts +20 -4
  950. package/dist/components/forms/Input/index.d.ts +1 -0
  951. package/dist/components/forms/Input/inputMasks.d.ts +24 -0
  952. package/dist/components/forms/Input/inputMasks.js +61 -5
  953. package/dist/components/forms/InputAddress/InputAddress.d.ts +6 -1
  954. package/dist/components/forms/InputAddress/InputAddress.js +101 -20
  955. package/dist/components/forms/InputAddress/InputAddress.theme.js +5 -5
  956. package/dist/components/forms/InputAddress/InputAddress.types.d.ts +8 -2
  957. package/dist/components/forms/InputAddress/index.d.ts +1 -1
  958. package/dist/components/forms/InputCounter/InputCounter.d.ts +1 -1
  959. package/dist/components/forms/InputCounter/InputCounter.js +80 -54
  960. package/dist/components/forms/InputCounter/InputCounter.theme.js +1 -1
  961. package/dist/components/forms/InputCounter/InputCounter.types.d.ts +17 -3
  962. package/dist/components/forms/InputCreditCard/InputCreditCard.d.ts +1 -1
  963. package/dist/components/forms/InputCreditCard/InputCreditCard.js +33 -9
  964. package/dist/components/forms/InputCreditCard/InputCreditCard.theme.js +5 -5
  965. package/dist/components/forms/InputCreditCard/InputCreditCard.types.d.ts +9 -0
  966. package/dist/components/forms/InputCreditCard/index.d.ts +1 -0
  967. package/dist/components/forms/InputDate/InputDate.js +1 -0
  968. package/dist/components/forms/InputOTP/InputOTP.js +41 -20
  969. package/dist/components/forms/InputOTP/InputOTP.theme.js +1 -1
  970. package/dist/components/forms/InputOTP/InputOTP.types.d.ts +27 -4
  971. package/dist/components/forms/InputTag/InputTag.js +67 -50
  972. package/dist/components/forms/InputTag/InputTag.theme.js +2 -1
  973. package/dist/components/forms/InputTag/InputTag.types.d.ts +10 -2
  974. package/dist/components/forms/Mention/Mention.d.ts +1 -1
  975. package/dist/components/forms/Mention/Mention.js +505 -199
  976. package/dist/components/forms/Mention/Mention.theme.js +20 -27
  977. package/dist/components/forms/Mention/Mention.types.d.ts +75 -18
  978. package/dist/components/forms/Mention/Mention.utils.d.ts +42 -0
  979. package/dist/components/forms/Mention/Mention.utils.js +314 -0
  980. package/dist/components/forms/Mention/index.d.ts +1 -1
  981. package/dist/components/forms/Radio/Radio.animations.d.ts +10 -0
  982. package/dist/components/forms/Radio/Radio.animations.js +38 -0
  983. package/dist/components/forms/Radio/Radio.d.ts +3 -4
  984. package/dist/components/forms/Radio/Radio.js +45 -5
  985. package/dist/components/forms/Radio/Radio.theme.js +23 -11
  986. package/dist/components/forms/Radio/Radio.types.d.ts +39 -10
  987. package/dist/components/forms/Radio/RadioContext.d.ts +14 -0
  988. package/dist/components/forms/Radio/RadioContext.js +13 -0
  989. package/dist/components/forms/Radio/RadioGroup.d.ts +3 -0
  990. package/dist/components/forms/Radio/RadioGroup.js +44 -0
  991. package/dist/components/forms/Radio/index.d.ts +1 -1
  992. package/dist/components/forms/RichTextEditor/RichTextEditor.animations.js +1 -0
  993. package/dist/components/forms/RichTextEditor/RichTextEditor.d.ts +18 -0
  994. package/dist/components/forms/RichTextEditor/RichTextEditor.js +1268 -254
  995. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.d.ts +53 -1
  996. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +100 -25
  997. package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +69 -5
  998. package/dist/components/forms/RichTextEditor/index.d.ts +2 -2
  999. package/dist/components/forms/Select/Select.animations.js +17 -25
  1000. package/dist/components/forms/Select/Select.d.ts +6 -2
  1001. package/dist/components/forms/Select/Select.js +80 -76
  1002. package/dist/components/forms/Select/Select.theme.js +3 -3
  1003. package/dist/components/forms/Select/Select.types.d.ts +49 -8
  1004. package/dist/components/forms/Select/useSelectState.js +7 -0
  1005. package/dist/components/forms/SelectableCard/SelectableCard.d.ts +1 -1
  1006. package/dist/components/forms/SelectableCard/SelectableCard.js +43 -27
  1007. package/dist/components/forms/SelectableCard/SelectableCard.theme.js +15 -25
  1008. package/dist/components/forms/SelectableCard/SelectableCard.types.d.ts +16 -4
  1009. package/dist/components/forms/SelectableCard/SelectableCardContext.d.ts +1 -0
  1010. package/dist/components/forms/SelectableCard/SelectableCardContext.js +5 -7
  1011. package/dist/components/forms/SelectableCard/SelectableCardGroup.js +32 -10
  1012. package/dist/components/forms/SelectableCard/index.d.ts +1 -1
  1013. package/dist/components/forms/Signature/Signature.js +13 -3
  1014. package/dist/components/forms/Signature/Signature.types.d.ts +9 -3
  1015. package/dist/components/forms/Slider/Slider.js +28 -6
  1016. package/dist/components/forms/Slider/Slider.theme.js +3 -3
  1017. package/dist/components/forms/Slider/Slider.types.d.ts +2 -2
  1018. package/dist/components/forms/Switch/Switch.js +41 -21
  1019. package/dist/components/forms/Switch/Switch.theme.d.ts +36 -6
  1020. package/dist/components/forms/Switch/Switch.theme.js +45 -4
  1021. package/dist/components/forms/Switch/Switch.types.d.ts +36 -8
  1022. package/dist/components/forms/Textarea/Textarea.js +12 -3
  1023. package/dist/components/forms/Textarea/Textarea.types.d.ts +12 -4
  1024. package/dist/components/forms/TimePicker/TimePicker.d.ts +2 -12
  1025. package/dist/components/forms/TimePicker/TimePicker.js +8 -5
  1026. package/dist/components/forms/TimePicker/TimePicker.theme.js +6 -8
  1027. package/dist/components/forms/TimePicker/TimePicker.types.d.ts +21 -2
  1028. package/dist/components/forms/TimePicker/TimePickerContent.js +13 -112
  1029. package/dist/components/forms/TimePicker/TimePickerContext.d.ts +15 -0
  1030. package/dist/components/forms/TimePicker/TimePickerContext.js +6 -0
  1031. package/dist/components/forms/TimePicker/TimePickerTrigger.js +20 -6
  1032. package/dist/components/forms/TimePicker/WheelColumn.js +1 -0
  1033. package/dist/components/forms/TimePicker/useWheelPicker.js +1 -0
  1034. package/dist/components/forms/forms.theme.d.ts +1 -0
  1035. package/dist/components/forms/forms.theme.js +75 -33
  1036. package/dist/components/forms/index.d.ts +11 -11
  1037. package/dist/components/forms/index.js +21 -87
  1038. package/dist/components/generative/GenerativeView.d.ts +21 -0
  1039. package/dist/components/generative/GenerativeView.js +117 -0
  1040. package/dist/components/generative/actions.d.ts +26 -0
  1041. package/dist/components/generative/actions.js +51 -0
  1042. package/dist/components/generative/actions.test.d.ts +1 -0
  1043. package/dist/components/generative/index.d.ts +11 -0
  1044. package/dist/components/generative/index.js +9 -0
  1045. package/dist/components/generative/registry.d.ts +43 -0
  1046. package/dist/components/generative/registry.js +132 -0
  1047. package/dist/components/generative/resolvers.d.ts +35 -0
  1048. package/dist/components/generative/resolvers.js +93 -0
  1049. package/dist/components/generative/schema.generated.d.ts +2 -0
  1050. package/dist/components/generative/schema.generated.js +2054 -0
  1051. package/dist/components/generative/schemaTypes.d.ts +30 -0
  1052. package/dist/components/generative/streaming.d.ts +39 -0
  1053. package/dist/components/generative/streaming.js +283 -0
  1054. package/dist/components/generative/streaming.test.d.ts +1 -0
  1055. package/dist/components/generative/tools.d.ts +21 -0
  1056. package/dist/components/generative/tools.js +54 -0
  1057. package/dist/components/generative/tools.test.d.ts +1 -0
  1058. package/dist/components/generative/types.d.ts +41 -0
  1059. package/dist/components/generative/useGenerativeStream.d.ts +37 -0
  1060. package/dist/components/generative/useGenerativeStream.js +37 -0
  1061. package/dist/components/generative/validate.d.ts +24 -0
  1062. package/dist/components/generative/validate.js +351 -0
  1063. package/dist/components/generative/validate.test.d.ts +1 -0
  1064. package/dist/components/layout/AppShell/AppShell.d.ts +10 -0
  1065. package/dist/components/layout/AppShell/AppShell.js +85 -0
  1066. package/dist/components/layout/AppShell/AppShell.theme.d.ts +3 -0
  1067. package/dist/components/layout/AppShell/AppShell.theme.js +42 -0
  1068. package/dist/components/layout/AppShell/AppShell.types.d.ts +127 -0
  1069. package/dist/components/layout/AppShell/AppShellContext.d.ts +14 -0
  1070. package/dist/components/layout/AppShell/AppShellContext.js +20 -0
  1071. package/dist/components/layout/AppShell/AppShellFooter.d.ts +3 -0
  1072. package/dist/components/layout/AppShell/AppShellFooter.js +12 -0
  1073. package/dist/components/layout/AppShell/AppShellHeader.d.ts +3 -0
  1074. package/dist/components/layout/AppShell/AppShellHeader.js +12 -0
  1075. package/dist/components/layout/AppShell/AppShellMain.d.ts +3 -0
  1076. package/dist/components/layout/AppShell/AppShellMain.js +20 -0
  1077. package/dist/components/layout/AppShell/AppShellRightPanel.d.ts +3 -0
  1078. package/dist/components/layout/AppShell/AppShellRightPanel.js +17 -0
  1079. package/dist/components/layout/AppShell/AppShellSidebar.d.ts +3 -0
  1080. package/dist/components/layout/AppShell/AppShellSidebar.js +17 -0
  1081. package/dist/components/layout/AppShell/AppShellTopbar.d.ts +3 -0
  1082. package/dist/components/layout/AppShell/AppShellTopbar.js +12 -0
  1083. package/dist/components/layout/AppShell/index.d.ts +3 -0
  1084. package/dist/components/layout/FormLayout/FormLayout.d.ts +0 -2
  1085. package/dist/components/layout/FormLayout/FormLayout.js +14 -6
  1086. package/dist/components/layout/FormLayout/FormLayout.theme.js +2 -5
  1087. package/dist/components/layout/FormLayout/FormLayout.types.d.ts +9 -27
  1088. package/dist/components/layout/FormLayout/FormLayoutSection.js +9 -2
  1089. package/dist/components/layout/FormLayout/index.d.ts +1 -1
  1090. package/dist/components/layout/Grid/Grid.d.ts +3 -0
  1091. package/dist/components/layout/Grid/Grid.js +58 -0
  1092. package/dist/components/layout/Grid/Grid.theme.d.ts +2 -0
  1093. package/dist/components/layout/Grid/Grid.theme.js +35 -0
  1094. package/dist/components/layout/Grid/Grid.types.d.ts +71 -0
  1095. package/dist/components/layout/Grid/index.d.ts +3 -0
  1096. package/dist/components/layout/Section/Section.d.ts +3 -0
  1097. package/dist/components/layout/Section/Section.js +19 -0
  1098. package/dist/components/layout/Section/Section.theme.d.ts +2 -0
  1099. package/dist/components/layout/Section/Section.theme.js +10 -0
  1100. package/dist/components/layout/Section/Section.types.d.ts +34 -0
  1101. package/dist/components/layout/Section/index.d.ts +3 -0
  1102. package/dist/components/layout/Stack/Stack.d.ts +3 -0
  1103. package/dist/components/layout/Stack/Stack.js +27 -0
  1104. package/dist/components/layout/Stack/Stack.theme.d.ts +2 -0
  1105. package/dist/components/layout/Stack/Stack.theme.js +10 -0
  1106. package/dist/components/layout/Stack/Stack.types.d.ts +46 -0
  1107. package/dist/components/layout/Stack/index.d.ts +3 -0
  1108. package/dist/components/layout/index.d.ts +4 -1
  1109. package/dist/components/layout/index.js +10 -0
  1110. package/dist/generative.schema.json +2052 -0
  1111. package/dist/hooks/index.d.ts +2 -0
  1112. package/dist/hooks/useClickOutside.d.ts +10 -4
  1113. package/dist/hooks/useClickOutside.js +45 -24
  1114. package/dist/hooks/useDarkMode.d.ts +1 -0
  1115. package/dist/hooks/useDarkMode.js +43 -0
  1116. package/dist/hooks/useFocusTrap.js +1 -0
  1117. package/dist/hooks/useFormStateMachine.d.ts +1 -1
  1118. package/dist/hooks/useIsClient.js +1 -0
  1119. package/dist/hooks/useMediaQuery.d.ts +5 -0
  1120. package/dist/hooks/useMediaQuery.js +22 -0
  1121. package/dist/hooks/useNetworkStatus.d.ts +0 -4
  1122. package/dist/hooks/useNetworkStatus.js +2 -5
  1123. package/dist/hooks/useOverlay.d.ts +2 -0
  1124. package/dist/hooks/useOverlay.js +39 -4
  1125. package/dist/hooks/useScaleBackground.js +6 -2
  1126. package/dist/hooks/useSelectPortal.d.ts +12 -2
  1127. package/dist/hooks/useSelectPortal.js +175 -56
  1128. package/dist/hooks/useSlidingNumber.js +1 -0
  1129. package/dist/hooks/useStreamingSSE.d.ts +0 -5
  1130. package/dist/hooks/useStreamingSSE.js +1 -5
  1131. package/dist/hooks/useTypewriter.js +1 -0
  1132. package/dist/index.d.ts +1 -2
  1133. package/dist/index.js +59 -71
  1134. package/dist/registry.json +11469 -0
  1135. package/dist/shadcn-compat.css +80 -0
  1136. package/dist/styles.css +1 -1
  1137. package/dist/test/render.d.ts +11 -0
  1138. package/dist/test/setup.d.ts +1 -0
  1139. package/dist/theme/SurfaceContext.d.ts +98 -0
  1140. package/dist/theme/SurfaceContext.js +114 -0
  1141. package/dist/theme/ThemeContext.js +19 -0
  1142. package/dist/theme/animations.d.ts +75 -0
  1143. package/dist/theme/animations.js +132 -0
  1144. package/dist/theme/index.d.ts +5 -0
  1145. package/dist/theme.css +24 -0
  1146. package/dist/tools.json +2154 -0
  1147. package/dist/utils/actionQueue.d.ts +0 -4
  1148. package/dist/utils/actionQueue.js +1 -4
  1149. package/dist/utils/cn.js +21 -1
  1150. package/dist/utils/colorUtils.d.ts +53 -0
  1151. package/dist/utils/colorUtils.js +90 -0
  1152. package/dist/utils/dateUtils.js +81 -15
  1153. package/dist/utils/formatUtils.d.ts +10 -0
  1154. package/dist/utils/formatUtils.js +24 -0
  1155. package/dist/utils/index.d.ts +3 -1
  1156. package/dist/utils/paletteGenerator.d.ts +46 -0
  1157. package/dist/utils/performanceMonitor.js +1 -0
  1158. package/dist/utils/smoothScrollUtils.js +1 -0
  1159. package/dist/utils/stateMachine.d.ts +4 -4
  1160. package/package.json +83 -32
  1161. package/src/global.scss +1014 -0
  1162. package/src/styles/theme.css +838 -0
  1163. package/tailwind.preset.cjs +32 -3
  1164. package/dist/components/ai/ApprovalCard/ApprovalCard.d.ts +0 -3
  1165. package/dist/components/ai/ApprovalCard/ApprovalCard.js +0 -15
  1166. package/dist/components/ai/ApprovalCard/ApprovalCard.theme.d.ts +0 -13
  1167. package/dist/components/ai/ApprovalCard/ApprovalCard.theme.js +0 -15
  1168. package/dist/components/ai/ApprovalCard/ApprovalCard.types.d.ts +0 -43
  1169. package/dist/components/ai/ApprovalCard/index.d.ts +0 -2
  1170. package/dist/components/ai/MessageHistory/MessageHistory.d.ts +0 -18
  1171. package/dist/components/ai/MessageHistory/MessageHistory.js +0 -97
  1172. package/dist/components/ai/MessageHistory/MessageHistory.theme.d.ts +0 -2
  1173. package/dist/components/ai/MessageHistory/MessageHistory.theme.js +0 -8
  1174. package/dist/components/ai/MessageHistory/MessageHistory.types.d.ts +0 -94
  1175. package/dist/components/ai/MessageHistory/index.d.ts +0 -3
  1176. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.animations.d.ts +0 -10
  1177. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.animations.js +0 -47
  1178. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.d.ts +0 -20
  1179. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.js +0 -55
  1180. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.theme.d.ts +0 -2
  1181. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.theme.js +0 -20
  1182. package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.types.d.ts +0 -67
  1183. package/dist/components/ai/ThinkingIndicator/index.d.ts +0 -3
  1184. package/dist/components/charts/shared/BarRenderer/index.d.ts +0 -3
  1185. package/dist/components/charts/shared/ChartContainer/ChartContainer.d.ts +0 -85
  1186. package/dist/components/charts/shared/ChartContainer/index.d.ts +0 -3
  1187. package/dist/components/charts/shared/ChartLegend/ChartLegendContent.d.ts +0 -7
  1188. package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +0 -18
  1189. package/dist/components/charts/shared/LineRenderer/index.d.ts +0 -2
  1190. package/dist/components/core/Accordion/AccordionContent.d.ts +0 -3
  1191. package/dist/components/core/Button/Button.animations.d.ts +0 -5
  1192. package/dist/components/core/Card/CardContent.d.ts +0 -3
  1193. package/dist/components/core/Card/CardContent.js +0 -11
  1194. package/dist/components/core/Carousel/CarouselContent.d.ts +0 -4
  1195. package/dist/components/core/ContextMenu/ContextMenuContent.d.ts +0 -6
  1196. package/dist/components/core/ContextMenu/ContextMenuSubContent.d.ts +0 -6
  1197. package/dist/components/core/Drawer/DrawerContent.d.ts +0 -5
  1198. package/dist/components/core/Loader/Loader.d.ts +0 -24
  1199. package/dist/components/core/Loader/Loader.js +0 -57
  1200. package/dist/components/core/Loader/Loader.theme.d.ts +0 -27
  1201. package/dist/components/core/Loader/Loader.theme.js +0 -60
  1202. package/dist/components/core/Loader/Loader.types.d.ts +0 -71
  1203. package/dist/components/core/Loader/index.d.ts +0 -2
  1204. package/dist/components/core/Message/MessageContent.d.ts +0 -8
  1205. package/dist/components/core/Popover/Popover.animations.js +0 -13
  1206. package/dist/components/core/Popover/PopoverContent.d.ts +0 -7
  1207. package/dist/components/core/Popover/PopoverContent.js +0 -136
  1208. package/dist/components/core/Sidebar/SidebarSubmenu.d.ts +0 -7
  1209. package/dist/components/core/Sidebar/SidebarSubmenu.js +0 -12
  1210. package/dist/components/core/SocialIcon/SocialIcon.d.ts +0 -3
  1211. package/dist/components/core/SocialIcon/SocialIcon.js +0 -30
  1212. package/dist/components/core/SocialIcon/SocialIcon.theme.d.ts +0 -2
  1213. package/dist/components/core/SocialIcon/SocialIcon.theme.js +0 -12
  1214. package/dist/components/core/SocialIcon/SocialIcon.types.d.ts +0 -18
  1215. package/dist/components/core/SocialIcon/index.d.ts +0 -2
  1216. package/dist/components/core/Tabs/TabsContent.d.ts +0 -6
  1217. package/dist/components/effects/MorphingText/MorphingText.d.ts +0 -17
  1218. package/dist/components/effects/MorphingText/MorphingText.js +0 -91
  1219. package/dist/components/effects/MorphingText/MorphingText.types.d.ts +0 -18
  1220. package/dist/components/effects/MorphingText/index.d.ts +0 -2
  1221. package/dist/components/effects/ParallaxSection/ParallaxSection.d.ts +0 -26
  1222. package/dist/components/effects/ParallaxSection/ParallaxSection.js +0 -71
  1223. package/dist/components/effects/ParallaxSection/ParallaxSection.types.d.ts +0 -11
  1224. package/dist/components/effects/ParallaxSection/index.d.ts +0 -2
  1225. package/dist/components/effects/Spotlight/Spotlight.d.ts +0 -36
  1226. package/dist/components/effects/Spotlight/Spotlight.js +0 -112
  1227. package/dist/components/effects/Spotlight/Spotlight.types.d.ts +0 -29
  1228. package/dist/components/effects/Spotlight/index.d.ts +0 -2
  1229. package/dist/components/effects/SpotlightBorder/SpotlightBorder.d.ts +0 -18
  1230. package/dist/components/effects/SpotlightBorder/SpotlightBorder.js +0 -214
  1231. package/dist/components/effects/SpotlightBorder/SpotlightBorder.types.d.ts +0 -61
  1232. package/dist/components/effects/SpotlightBorder/index.d.ts +0 -2
  1233. package/dist/components/effects/StickyScroll/StickyScroll.d.ts +0 -30
  1234. package/dist/components/effects/StickyScroll/StickyScroll.js +0 -128
  1235. package/dist/components/effects/StickyScroll/StickyScroll.types.d.ts +0 -19
  1236. package/dist/components/effects/StickyScroll/index.d.ts +0 -2
  1237. package/dist/components/forms/ColorPicker/ColorPickerContent.d.ts +0 -7
  1238. package/dist/components/forms/CronInput/CronInput.d.ts +0 -3
  1239. package/dist/components/forms/CronInput/CronInput.js +0 -107
  1240. package/dist/components/forms/CronInput/CronInput.theme.d.ts +0 -6
  1241. package/dist/components/forms/CronInput/CronInput.theme.js +0 -84
  1242. package/dist/components/forms/CronInput/CronInput.types.d.ts +0 -98
  1243. package/dist/components/forms/CronInput/CronInput.utils.d.ts +0 -67
  1244. package/dist/components/forms/CronInput/CronInput.utils.js +0 -505
  1245. package/dist/components/forms/CronInput/index.d.ts +0 -4
  1246. package/dist/components/forms/DatePicker/DatePickerContent.d.ts +0 -7
  1247. package/dist/components/forms/TransferList/TransferList.animations.d.ts +0 -10
  1248. package/dist/components/forms/TransferList/TransferList.animations.js +0 -32
  1249. package/dist/components/forms/TransferList/TransferList.d.ts +0 -28
  1250. package/dist/components/forms/TransferList/TransferList.js +0 -199
  1251. package/dist/components/forms/TransferList/TransferList.theme.d.ts +0 -6
  1252. package/dist/components/forms/TransferList/TransferList.theme.js +0 -60
  1253. package/dist/components/forms/TransferList/TransferList.types.d.ts +0 -101
  1254. package/dist/components/forms/TransferList/index.d.ts +0 -3
  1255. package/dist/components/layout/FormLayout/FormLayoutBody.d.ts +0 -3
  1256. package/dist/components/layout/FormLayout/FormLayoutBody.js +0 -91
  1257. package/dist/components/layout/FormLayout/FormLayoutHeader.d.ts +0 -3
  1258. package/dist/components/layout/FormLayout/FormLayoutHeader.js +0 -12
  1259. package/dist/components/layout/PageLayout/PageLayout.d.ts +0 -7
  1260. package/dist/components/layout/PageLayout/PageLayout.js +0 -33
  1261. package/dist/components/layout/PageLayout/PageLayout.theme.d.ts +0 -2
  1262. package/dist/components/layout/PageLayout/PageLayout.theme.js +0 -10
  1263. package/dist/components/layout/PageLayout/PageLayout.types.d.ts +0 -39
  1264. package/dist/components/layout/PageLayout/PageLayoutContent.d.ts +0 -3
  1265. package/dist/components/layout/PageLayout/PageLayoutContent.js +0 -12
  1266. package/dist/components/layout/PageLayout/PageLayoutHeader.d.ts +0 -3
  1267. package/dist/components/layout/PageLayout/PageLayoutHeader.js +0 -12
  1268. package/dist/components/layout/PageLayout/PageLayoutSidebar.d.ts +0 -3
  1269. package/dist/components/layout/PageLayout/PageLayoutSidebar.js +0 -12
  1270. package/dist/components/layout/PageLayout/index.d.ts +0 -3
  1271. package/dist/icons/Icon.d.ts +0 -24
  1272. package/dist/icons/Icon.js +0 -30
  1273. package/dist/icons/Index.d.ts +0 -16
  1274. package/dist/icons/core/ChevronUpDown.d.ts +0 -1
  1275. package/dist/icons/core/ChevronUpDown.js +0 -7
  1276. package/dist/icons/core/DollarIcon.d.ts +0 -1
  1277. package/dist/icons/core/DollarIcon.js +0 -5
  1278. package/dist/icons/core/LockIcon.d.ts +0 -1
  1279. package/dist/icons/core/LockIcon.js +0 -5
  1280. package/dist/icons/core/MinusIcon.d.ts +0 -1
  1281. package/dist/icons/core/MinusIcon.js +0 -7
  1282. package/dist/icons/core/PlusIcon.d.ts +0 -1
  1283. package/dist/icons/core/PlusIcon.js +0 -7
  1284. package/dist/icons/core/SearchIcon.d.ts +0 -1
  1285. package/dist/icons/core/SearchIcon.js +0 -7
  1286. package/dist/icons/core/TickIcon.d.ts +0 -1
  1287. package/dist/icons/core/TickIcon.js +0 -5
  1288. package/dist/icons/core/User.d.ts +0 -1
  1289. package/dist/utils/useClickOutside.d.ts +0 -1
  1290. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.d.ts +0 -0
  1291. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.theme.d.ts +0 -0
  1292. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/PromptSuggestion.types.d.ts +0 -0
  1293. /package/dist/components/ai/{PromptSuggestions → PromptSuggestion}/index.d.ts +0 -0
  1294. /package/dist/components/core/{SocialIcon → Icon/data}/platforms.d.ts +0 -0
  1295. /package/dist/components/core/{SocialIcon → Icon/data}/platforms.js +0 -0
  1296. /package/dist/components/effects/{SpotlightBorder/SpotlightBorder.types.js → TiltCard/TiltCard.types.js} +0 -0
@@ -1,38 +1,39 @@
1
+ "use client";
1
2
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import React__default, { useState, useRef, useMemo, useCallback, useEffect } from 'react';
3
+ import React__default, { useState, useCallback, useRef, useMemo, useEffect } from 'react';
3
4
  import { createPortal } from 'react-dom';
4
5
  import { useReducedMotion, AnimatePresence, motion } from 'motion/react';
5
6
  import { FormLabel } from '../FormLabel/FormLabel.js';
6
- import { richTextEditorTheme, colorOptions } from './RichTextEditor.theme.js';
7
+ import { MONO_COLORS, TAILWIND_COLOR_FAMILIES, getTailwindShadeTokens, richTextEditorTheme, resolveTailwindColor } from './RichTextEditor.theme.js';
7
8
  import { floatingToolbarVariants } from './RichTextEditor.animations.js';
8
9
  import { cn } from '../../../utils/cn.js';
9
10
  import { Button } from '../../core/Button/Button.js';
10
- import { ArrowUturnRightIcon, ArrowUturnLeftIcon, Bars3BottomRightIcon, Bars3Icon, Bars3BottomLeftIcon, UnderlineIcon, ItalicIcon, BoldIcon } from '@heroicons/react/24/outline';
11
+ import { ScrollArea } from '../../core/ScrollArea/ScrollArea.js';
12
+ import '../../core/ScrollArea/smooth/SmoothScrollEngine.js';
13
+ import { ArrowUturnRightIcon, ArrowUturnLeftIcon, Bars3BottomRightIcon, Bars3Icon, Bars3BottomLeftIcon, ArrowsRightLeftIcon, ArrowsUpDownIcon, BoldIcon, UnderlineIcon, ItalicIcon } from '@heroicons/react/24/outline';
11
14
  import { useSelectPortal } from '../../../hooks/useSelectPortal.js';
12
15
  import { PaintBrushIcon } from '@heroicons/react/24/solid';
13
16
  import { createDropdownAnimations } from '../Select/Select.animations.js';
14
17
  import { useIsClient } from '../../../hooks/useIsClient.js';
18
+ import { useSurfaceElevation, SurfaceProvider, surfaceClasses } from '../../../theme/SurfaceContext.js';
15
19
 
16
20
  const FONT_SIZE_OPTIONS = [
17
- { key: "xs", label: "XS", value: "0.75rem", px: 12 },
18
- { key: "sm", label: "SM", value: "0.875rem", px: 14 },
19
- { key: "md", label: "MD", value: "1rem", px: 16 },
20
- { key: "lg", label: "LG", value: "1.125rem", px: 18 },
21
- { key: "xl", label: "XL", value: "1.25rem", px: 20 },
22
- { key: "2xl", label: "2XL", value: "1.5rem", px: 24 },
23
- { key: "3xl", label: "3XL", value: "1.875rem", px: 30 },
24
- { key: "4xl", label: "4XL", value: "2.25rem", px: 36 },
21
+ { key: "xs", label: "XS", value: "0.75rem", px: 12, className: "text-xs" },
22
+ { key: "sm", label: "SM", value: "0.875rem", px: 14, className: "text-sm" },
23
+ { key: "md", label: "MD", value: "1rem", px: 16, className: "text-base" },
24
+ { key: "lg", label: "LG", value: "1.125rem", px: 18, className: "text-lg" },
25
+ { key: "xl", label: "XL", value: "1.25rem", px: 20, className: "text-xl" },
26
+ { key: "2xl", label: "2XL", value: "1.5rem", px: 24, className: "text-2xl" },
27
+ { key: "3xl", label: "3XL", value: "1.875rem", px: 30, className: "text-3xl" },
28
+ { key: "4xl", label: "4XL", value: "2.25rem", px: 36, className: "text-4xl" },
29
+ { key: "5xl", label: "5XL", value: "3rem", px: 48, className: "text-5xl" },
30
+ { key: "6xl", label: "6XL", value: "3.75rem", px: 60, className: "text-6xl" },
31
+ { key: "7xl", label: "7XL", value: "4.5rem", px: 72, className: "text-7xl" },
32
+ { key: "8xl", label: "8XL", value: "6rem", px: 96, className: "text-8xl" },
33
+ { key: "9xl", label: "9XL", value: "8rem", px: 128, className: "text-9xl" },
25
34
  ];
26
- const FONT_SIZE_COMMAND_VALUE = {
27
- xs: "1",
28
- sm: "2",
29
- md: "3",
30
- lg: "4",
31
- xl: "5",
32
- "2xl": "6",
33
- "3xl": "7",
34
- "4xl": "7",
35
- };
35
+ /** All font-size class names — used to scrub stale classes when swapping. */
36
+ const FONT_SIZE_CLASSES = FONT_SIZE_OPTIONS.map((o) => o.className);
36
37
  const getFontSizeOption = (key) => { var _a; return (_a = FONT_SIZE_OPTIONS.find((option) => option.key === key)) !== null && _a !== void 0 ? _a : FONT_SIZE_OPTIONS[2]; };
37
38
  const getClosestFontSizeKey = (px) => {
38
39
  let closest = "md";
@@ -46,23 +47,153 @@ const getClosestFontSizeKey = (px) => {
46
47
  });
47
48
  return closest;
48
49
  };
50
+ /**
51
+ * Curated default list of font families shipped with the editor.
52
+ * The `Default` entry clears the inline font-family. The rest are popular
53
+ * Google Fonts chosen for broad weight coverage. Each stack ends in a sensible
54
+ * fallback so text stays readable while the font is loading.
55
+ */
56
+ const DEFAULT_FONT_FAMILY_OPTIONS = [
57
+ { key: "default", label: "Default", stack: "" },
58
+ { key: "inter", label: "Inter", family: "Inter", stack: "'Inter', system-ui, sans-serif" },
59
+ { key: "roboto", label: "Roboto", family: "Roboto", stack: "'Roboto', system-ui, sans-serif" },
60
+ { key: "manrope", label: "Manrope", family: "Manrope", stack: "'Manrope', system-ui, sans-serif" },
61
+ { key: "poppins", label: "Poppins", family: "Poppins", stack: "'Poppins', system-ui, sans-serif" },
62
+ { key: "lora", label: "Lora", family: "Lora", stack: "'Lora', Georgia, serif" },
63
+ { key: "playfair", label: "Playfair Display", family: "Playfair Display", stack: "'Playfair Display', Georgia, serif" },
64
+ { key: "merriweather", label: "Merriweather", family: "Merriweather", stack: "'Merriweather', Georgia, serif" },
65
+ { key: "jetbrains", label: "JetBrains Mono", family: "JetBrains Mono", stack: "'JetBrains Mono', Menlo, monospace" },
66
+ ];
67
+ // Bumped when migrating from raw hex values to Tailwind shade tokens
68
+ // (e.g. "rose-500"). Old hex entries from prior versions are ignored — the
69
+ // picker now applies color via `text-{token}` classes, not via execCommand.
70
+ const RECENT_COLORS_KEY = "flikkui-rte-recent-colors-v2";
71
+ const RECENT_COLORS_LIMIT = 10;
72
+ const DEFAULT_FONT_WEIGHT_REQUEST = [100, 200, 300, 400, 500, 600, 700, 800, 900];
73
+ const loadedGoogleFonts = new Set();
74
+ /**
75
+ * Lazily injects a Google Fonts `<link rel="stylesheet">` for the given family.
76
+ * Idempotent: each family is requested at most once per page lifetime.
77
+ * SSR-safe (no-ops when `document` is undefined).
78
+ *
79
+ * @example
80
+ * import { loadGoogleFont } from "@flikk/ui";
81
+ * loadGoogleFont("Inter");
82
+ */
83
+ const loadGoogleFont = (family, weights = DEFAULT_FONT_WEIGHT_REQUEST) => {
84
+ if (typeof document === "undefined")
85
+ return;
86
+ if (!family)
87
+ return;
88
+ const cacheKey = `${family}:${weights.join(",")}`;
89
+ if (loadedGoogleFonts.has(cacheKey))
90
+ return;
91
+ loadedGoogleFonts.add(cacheKey);
92
+ const familyParam = family.replace(/\s+/g, "+");
93
+ const weightsParam = weights.length > 0 ? `:wght@${weights.join(";")}` : "";
94
+ const href = `https://fonts.googleapis.com/css2?family=${familyParam}${weightsParam}&display=swap`;
95
+ const link = document.createElement("link");
96
+ link.rel = "stylesheet";
97
+ link.href = href;
98
+ link.setAttribute("data-flikkui-font", family);
99
+ document.head.appendChild(link);
100
+ };
101
+ const FONT_WEIGHT_OPTIONS = [
102
+ { key: "thin", label: "Thin", value: "100", weight: 100, className: "font-thin" },
103
+ { key: "extralight", label: "Extra Light", value: "200", weight: 200, className: "font-extralight" },
104
+ { key: "light", label: "Light", value: "300", weight: 300, className: "font-light" },
105
+ { key: "normal", label: "Regular", value: "400", weight: 400, className: "font-normal" },
106
+ { key: "medium", label: "Medium", value: "500", weight: 500, className: "font-medium" },
107
+ { key: "semibold", label: "Semibold", value: "600", weight: 600, className: "font-semibold" },
108
+ { key: "bold", label: "Bold", value: "700", weight: 700, className: "font-bold" },
109
+ { key: "extrabold", label: "Extra Bold", value: "800", weight: 800, className: "font-extrabold" },
110
+ { key: "black", label: "Black", value: "900", weight: 900, className: "font-black" },
111
+ ];
112
+ const FONT_WEIGHT_CLASSES = FONT_WEIGHT_OPTIONS.map((o) => o.className);
113
+ const getFontWeightOption = (key) => { var _a; return (_a = FONT_WEIGHT_OPTIONS.find((option) => option.key === key)) !== null && _a !== void 0 ? _a : FONT_WEIGHT_OPTIONS[3]; };
114
+ const getClosestFontWeightKey = (weight) => {
115
+ let closest = "normal";
116
+ let minDiff = Number.POSITIVE_INFINITY;
117
+ FONT_WEIGHT_OPTIONS.forEach((option) => {
118
+ const diff = Math.abs(option.weight - weight);
119
+ if (diff < minDiff) {
120
+ minDiff = diff;
121
+ closest = option.key;
122
+ }
123
+ });
124
+ return closest;
125
+ };
126
+ const LINE_HEIGHT_OPTIONS = [
127
+ { key: "tight", label: "Tight", value: "1.25", className: "leading-tight" },
128
+ { key: "snug", label: "Snug", value: "1.375", className: "leading-snug" },
129
+ { key: "normal", label: "Normal", value: "1.5", className: "leading-normal" },
130
+ { key: "relaxed", label: "Relaxed", value: "1.625", className: "leading-relaxed" },
131
+ { key: "loose", label: "Loose", value: "2", className: "leading-loose" },
132
+ ];
133
+ const LINE_HEIGHT_CLASSES = LINE_HEIGHT_OPTIONS.map((o) => o.className);
134
+ const getLineHeightOption = (key) => { var _a; return (_a = LINE_HEIGHT_OPTIONS.find((option) => option.key === key)) !== null && _a !== void 0 ? _a : LINE_HEIGHT_OPTIONS[2]; };
135
+ const LETTER_SPACING_OPTIONS = [
136
+ { key: "tighter", label: "Tighter", value: "-0.05em", em: -0.05, className: "tracking-tighter" },
137
+ { key: "tight", label: "Tight", value: "-0.025em", em: -0.025, className: "tracking-tight" },
138
+ { key: "normal", label: "Normal", value: "0em", em: 0, className: "tracking-normal" },
139
+ { key: "wide", label: "Wide", value: "0.025em", em: 0.025, className: "tracking-wide" },
140
+ { key: "wider", label: "Wider", value: "0.05em", em: 0.05, className: "tracking-wider" },
141
+ { key: "widest", label: "Widest", value: "0.1em", em: 0.1, className: "tracking-widest" },
142
+ ];
143
+ const LETTER_SPACING_CLASSES = LETTER_SPACING_OPTIONS.map((o) => o.className);
144
+ /**
145
+ * Every text-color class the picker can apply: `text-white`, `text-black`,
146
+ * and `text-{family}-{shade}` for each Tailwind family/shade. Used both to
147
+ * apply the new color and to scrub stale color classes off ancestor wrappers.
148
+ * Derived once at module load — list size is static.
149
+ */
150
+ const TEXT_COLOR_CLASSES = [
151
+ ...MONO_COLORS.map((c) => `text-${c.token}`),
152
+ ...TAILWIND_COLOR_FAMILIES.flatMap((family) => getTailwindShadeTokens(family).map((token) => `text-${token}`)),
153
+ ];
154
+ /** Returns the active text-color token (e.g. `"rose-500"`) walking up from the
155
+ * given element, or `""` if no `text-{token}` class is found before the editor
156
+ * boundary. */
157
+ const matchTextColorClass = (el, editor) => {
158
+ let n = el;
159
+ while (n && n !== editor) {
160
+ for (let i = 0; i < n.classList.length; i++) {
161
+ const cls = n.classList.item(i);
162
+ if (cls && TEXT_COLOR_CLASSES.includes(cls))
163
+ return cls.slice("text-".length);
164
+ }
165
+ n = n.parentElement;
166
+ }
167
+ return "";
168
+ };
169
+ const getLetterSpacingOption = (key) => { var _a; return (_a = LETTER_SPACING_OPTIONS.find((option) => option.key === key)) !== null && _a !== void 0 ? _a : LETTER_SPACING_OPTIONS[2]; };
49
170
  const DEFAULT_FORMATTING_STATE = {
50
171
  bold: false,
51
172
  italic: false,
52
173
  underline: false,
53
174
  textAlign: "left",
54
175
  fontSize: "md",
55
- textColor: "#000000",
176
+ fontWeight: "normal",
177
+ fontFamily: "default",
178
+ lineHeight: "normal",
179
+ letterSpacing: "normal",
180
+ // Token like "rose-500" / "white" / "black"; "" means inherit (no class
181
+ // applied). The picker now applies color via `text-{token}` classes
182
+ // rather than execCommand("foreColor"), so the state holds tokens.
183
+ textColor: "",
56
184
  };
57
185
  const DEFAULT_TOOLBAR = {
58
186
  show: true,
59
187
  position: "top",
60
188
  tools: [
61
- "bold",
189
+ "fontWeight",
62
190
  "italic",
63
191
  "underline",
64
192
  "separator",
193
+ "fontFamily",
65
194
  "fontSize",
195
+ "lineHeight",
196
+ "letterSpacing",
66
197
  "textColor",
67
198
  "separator",
68
199
  "alignLeft",
@@ -73,19 +204,104 @@ const DEFAULT_TOOLBAR = {
73
204
  "redo",
74
205
  ],
75
206
  };
76
- const RichTextEditor = React__default.forwardRef(({ size = "md", state = "default", className = "", label, labelClassName = "", helperText, helperTextClassName = "", value = "", onChange, placeholder = "Start typing...", id, required, minHeight = 120, maxHeight, toolbar: toolbarProp = DEFAULT_TOOLBAR, theme = {}, ...props }, ref) => {
207
+ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "default", className = "", label, labelClassName = "", helperText, errorMessage, helperTextClassName = "", value = "", onChange, placeholder = "Start typing...", id, required, minHeight = 120, maxHeight, toolbar: toolbarProp = DEFAULT_TOOLBAR, theme = {}, fontFamilies = DEFAULT_FONT_FAMILY_OPTIONS, loadFontsOnDemand = true, sanitize, elevation, lift, ...props }, ref) => {
208
+ // Relative elevation: the floating toolbar (bubble menu) and the toolbar
209
+ // dropdowns lift above their host surface (overlay base = 5) so an editor
210
+ // inside a Popover/Modal still reads its floating chrome as a higher plane.
211
+ const surfaceLevel = useSurfaceElevation({ baseRung: 5, offset: 2, elevation, lift });
77
212
  const [isFocused, setIsFocused] = useState(false);
78
213
  const [showToolbar, setShowToolbar] = useState(false);
79
214
  const [toolbarPosition, setToolbarPosition] = useState({ top: 0, left: 0 });
80
215
  const [formattingState, setFormattingState] = useState(DEFAULT_FORMATTING_STATE);
81
216
  const [showFontSizePicker, setShowFontSizePicker] = useState(false);
217
+ const [showFontWeightPicker, setShowFontWeightPicker] = useState(false);
218
+ const [showFontFamilyPicker, setShowFontFamilyPicker] = useState(false);
219
+ const [showLineHeightPicker, setShowLineHeightPicker] = useState(false);
220
+ const [showLetterSpacingPicker, setShowLetterSpacingPicker] = useState(false);
82
221
  const [showColorPicker, setShowColorPicker] = useState(false);
222
+ // Recently used text colors — persisted to localStorage so they survive reloads.
223
+ const [recentColors, setRecentColors] = useState(() => {
224
+ if (typeof window === "undefined")
225
+ return [];
226
+ try {
227
+ const stored = window.localStorage.getItem(RECENT_COLORS_KEY);
228
+ if (!stored)
229
+ return [];
230
+ const parsed = JSON.parse(stored);
231
+ return Array.isArray(parsed)
232
+ ? parsed.filter((v) => typeof v === "string").slice(0, RECENT_COLORS_LIMIT)
233
+ : [];
234
+ }
235
+ catch (_a) {
236
+ return [];
237
+ }
238
+ });
239
+ const addRecentColor = useCallback((token) => {
240
+ if (!token)
241
+ return;
242
+ setRecentColors((prev) => {
243
+ const next = [token, ...prev.filter((c) => c !== token)].slice(0, RECENT_COLORS_LIMIT);
244
+ if (typeof window !== "undefined") {
245
+ try {
246
+ window.localStorage.setItem(RECENT_COLORS_KEY, JSON.stringify(next));
247
+ }
248
+ catch (_a) {
249
+ // localStorage unavailable (private mode, quota exceeded, etc.) — ignore.
250
+ }
251
+ }
252
+ return next;
253
+ });
254
+ }, []);
83
255
  const shouldReduceMotion = useReducedMotion();
84
256
  const isClient = useIsClient();
257
+ // Built-in basic sanitizer: strips <script> tags and on* event handlers
258
+ const sanitizeHtml = useCallback((html) => {
259
+ if (sanitize)
260
+ return sanitize(html);
261
+ // Basic sanitization — strips script tags and inline event handlers
262
+ return html
263
+ .replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
264
+ .replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, '');
265
+ }, [sanitize]);
85
266
  const editorRef = useRef(null);
86
267
  const toolbarRef = useRef(null);
87
268
  const fontSizeTriggerRef = useRef(null);
269
+ const fontWeightTriggerRef = useRef(null);
270
+ const fontFamilyTriggerRef = useRef(null);
271
+ const lineHeightTriggerRef = useRef(null);
272
+ const letterSpacingTriggerRef = useRef(null);
88
273
  const colorTriggerRef = useRef(null);
274
+ // Single linear history covering ALL mutations: typing, execCommand
275
+ // (bold/italic/foreColor/justify/…), and direct-DOM style ops. Typing is
276
+ // coalesced into one undo entry per ~500 ms run, so users get coarse-grained
277
+ // word-level undo instead of per-keystroke. Discrete style ops always start
278
+ // a fresh entry by passing kind='op'.
279
+ const historyRef = useRef({ undo: [], redo: [], lastPushKind: null, lastPushAt: 0 });
280
+ const HISTORY_LIMIT = 100;
281
+ const TYPING_COALESCE_MS = 500;
282
+ const pushHistory = useCallback((kind = "op") => {
283
+ if (!editorRef.current)
284
+ return;
285
+ const now = Date.now();
286
+ const stack = historyRef.current;
287
+ // Coalesce successive typing events into a single undo entry while the
288
+ // user is mid-word. Skip when the previous push was also typing AND it
289
+ // happened recently — the existing entry already represents this group.
290
+ if (kind === "typing" &&
291
+ stack.lastPushKind === "typing" &&
292
+ now - stack.lastPushAt < TYPING_COALESCE_MS) {
293
+ stack.lastPushAt = now;
294
+ // Any new mutation still invalidates the redo stack.
295
+ stack.redo = [];
296
+ return;
297
+ }
298
+ stack.undo.push(editorRef.current.innerHTML);
299
+ stack.redo = [];
300
+ stack.lastPushKind = kind;
301
+ stack.lastPushAt = now;
302
+ if (stack.undo.length > HISTORY_LIMIT)
303
+ stack.undo.shift();
304
+ }, []);
89
305
  const generatedId = React__default.useId();
90
306
  const editorId = id || generatedId;
91
307
  const themeStyles = useMemo(() => {
@@ -134,6 +350,34 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
134
350
  offset: 6,
135
351
  autoWidth: true,
136
352
  });
353
+ const { position: fontWeightPortalPosition, cssVariables: fontWeightPortalCssVars, contentRef: fontWeightPortalContentRef, isReady: fontWeightPortalReady, isFlipped: fontWeightIsFlipped, } = useSelectPortal({
354
+ triggerRef: fontWeightTriggerRef,
355
+ isOpen: showFontWeightPicker,
356
+ placement: "bottom-start",
357
+ offset: 6,
358
+ autoWidth: true,
359
+ });
360
+ const { position: fontFamilyPortalPosition, cssVariables: fontFamilyPortalCssVars, contentRef: fontFamilyPortalContentRef, isReady: fontFamilyPortalReady, isFlipped: fontFamilyIsFlipped, } = useSelectPortal({
361
+ triggerRef: fontFamilyTriggerRef,
362
+ isOpen: showFontFamilyPicker,
363
+ placement: "bottom-start",
364
+ offset: 6,
365
+ autoWidth: true,
366
+ });
367
+ const { position: lineHeightPortalPosition, cssVariables: lineHeightPortalCssVars, contentRef: lineHeightPortalContentRef, isReady: lineHeightPortalReady, isFlipped: lineHeightIsFlipped, } = useSelectPortal({
368
+ triggerRef: lineHeightTriggerRef,
369
+ isOpen: showLineHeightPicker,
370
+ placement: "bottom-start",
371
+ offset: 6,
372
+ autoWidth: true,
373
+ });
374
+ const { position: letterSpacingPortalPosition, cssVariables: letterSpacingPortalCssVars, contentRef: letterSpacingPortalContentRef, isReady: letterSpacingPortalReady, isFlipped: letterSpacingIsFlipped, } = useSelectPortal({
375
+ triggerRef: letterSpacingTriggerRef,
376
+ isOpen: showLetterSpacingPicker,
377
+ placement: "bottom-start",
378
+ offset: 6,
379
+ autoWidth: true,
380
+ });
137
381
  const { position: colorPortalPosition, cssVariables: colorPortalCssVars, contentRef: colorPortalContentRef, isReady: colorPortalReady, isFlipped: colorIsFlipped, } = useSelectPortal({
138
382
  triggerRef: colorTriggerRef,
139
383
  isOpen: showColorPicker,
@@ -143,6 +387,10 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
143
387
  });
144
388
  const isDisabled = state === "disabled";
145
389
  const isInvalid = state === "invalid";
390
+ // errorMessage takes precedence over helperText while invalid; helperText
391
+ // behavior is unchanged otherwise.
392
+ const displayedMessage = isInvalid && errorMessage ? errorMessage : helperText;
393
+ const messageId = `${editorId}-message`;
146
394
  const getDataState = () => {
147
395
  if (isDisabled)
148
396
  return "disabled";
@@ -157,38 +405,151 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
157
405
  editorRef.current.focus();
158
406
  }
159
407
  }, []);
408
+ const closeAllPickers = useCallback(() => {
409
+ setShowFontSizePicker(false);
410
+ setShowFontWeightPicker(false);
411
+ setShowFontFamilyPicker(false);
412
+ setShowLineHeightPicker(false);
413
+ setShowLetterSpacingPicker(false);
414
+ setShowColorPicker(false);
415
+ }, []);
416
+ const togglePicker = useCallback((which) => {
417
+ setShowFontSizePicker((prev) => (which === "fontSize" ? !prev : false));
418
+ setShowFontWeightPicker((prev) => (which === "fontWeight" ? !prev : false));
419
+ setShowFontFamilyPicker((prev) => (which === "fontFamily" ? !prev : false));
420
+ setShowLineHeightPicker((prev) => (which === "lineHeight" ? !prev : false));
421
+ setShowLetterSpacingPicker((prev) => (which === "letterSpacing" ? !prev : false));
422
+ setShowColorPicker((prev) => (which === "color" ? !prev : false));
423
+ }, []);
160
424
  const getCurrentFontSize = useCallback(() => {
161
425
  if (!editorRef.current)
162
426
  return DEFAULT_FORMATTING_STATE.fontSize;
163
427
  const selection = window.getSelection();
164
- if (!selection || selection.rangeCount === 0) {
165
- const editorComputed = window.getComputedStyle(editorRef.current);
166
- const editorSize = parseFloat(editorComputed.fontSize || "");
167
- return Number.isFinite(editorSize)
168
- ? getClosestFontSizeKey(editorSize)
169
- : DEFAULT_FORMATTING_STATE.fontSize;
170
- }
171
- const range = selection.getRangeAt(0);
172
- let node = range.startContainer;
173
- if (node.nodeType === Node.TEXT_NODE) {
174
- node = node.parentElement;
428
+ let node = null;
429
+ if (selection && selection.rangeCount > 0) {
430
+ node = selection.getRangeAt(0).startContainer;
431
+ if (node && node.nodeType === Node.TEXT_NODE)
432
+ node = node.parentElement;
175
433
  }
434
+ // Walk up looking for a `text-*` class (the size classes also bundle a
435
+ // matching line-height — that's why class-based size is reliable).
176
436
  while (node && node !== editorRef.current) {
177
437
  if (node instanceof HTMLElement) {
178
- const computed = window.getComputedStyle(node);
179
- const size = parseFloat(computed.fontSize || "");
180
- if (Number.isFinite(size)) {
181
- return getClosestFontSizeKey(size);
182
- }
438
+ const match = FONT_SIZE_OPTIONS.find((o) => node && node.classList.contains(o.className));
439
+ if (match)
440
+ return match.key;
183
441
  }
184
442
  node = node ? node.parentNode : null;
185
443
  }
444
+ // No explicit class found — fall back to the editor's computed font-size
445
+ // mapped to the closest preset. Handles initial/no-selection state.
186
446
  const editorComputed = window.getComputedStyle(editorRef.current);
187
447
  const editorSize = parseFloat(editorComputed.fontSize || "");
188
448
  return Number.isFinite(editorSize)
189
449
  ? getClosestFontSizeKey(editorSize)
190
450
  : DEFAULT_FORMATTING_STATE.fontSize;
191
451
  }, []);
452
+ const getCurrentFontFamily = useCallback(() => {
453
+ if (!editorRef.current)
454
+ return "default";
455
+ const selection = window.getSelection();
456
+ let element = null;
457
+ if (selection && selection.rangeCount > 0) {
458
+ let node = selection.getRangeAt(0).startContainer;
459
+ if (node && node.nodeType === Node.TEXT_NODE)
460
+ node = node.parentElement;
461
+ if (node instanceof HTMLElement)
462
+ element = node;
463
+ }
464
+ while (element && editorRef.current.contains(element)) {
465
+ const inline = element.style.fontFamily;
466
+ if (inline) {
467
+ // Match against the first family in the inline stack
468
+ const firstFamily = inline.split(",")[0].trim().replace(/^['"]|['"]$/g, "");
469
+ const match = fontFamilies.find((opt) => {
470
+ if (!opt.family)
471
+ return false;
472
+ return opt.family.toLowerCase() === firstFamily.toLowerCase();
473
+ });
474
+ if (match)
475
+ return match.key;
476
+ }
477
+ element = element.parentElement;
478
+ }
479
+ return "default";
480
+ }, [fontFamilies]);
481
+ const getCurrentFontWeight = useCallback(() => {
482
+ var _a;
483
+ if (!editorRef.current)
484
+ return DEFAULT_FORMATTING_STATE.fontWeight;
485
+ const selection = window.getSelection();
486
+ let node = null;
487
+ if (selection && selection.rangeCount > 0) {
488
+ node = selection.getRangeAt(0).startContainer;
489
+ if (node && node.nodeType === Node.TEXT_NODE)
490
+ node = node.parentElement;
491
+ }
492
+ while (node && node !== editorRef.current) {
493
+ if (node instanceof HTMLElement) {
494
+ const match = FONT_WEIGHT_OPTIONS.find((o) => node && node.classList.contains(o.className));
495
+ if (match)
496
+ return match.key;
497
+ }
498
+ node = node ? node.parentNode : null;
499
+ }
500
+ // Fallback: read computed font-weight (covers <strong>/<b> tags from
501
+ // the Bold toggle which produce semantic markup, not classes).
502
+ const target = (_a = (selection && selection.rangeCount > 0
503
+ ? (selection.getRangeAt(0).startContainer instanceof HTMLElement
504
+ ? selection.getRangeAt(0).startContainer
505
+ : selection.getRangeAt(0).startContainer.parentElement)
506
+ : null)) !== null && _a !== void 0 ? _a : editorRef.current;
507
+ const computed = window.getComputedStyle(target);
508
+ const weight = parseInt(computed.fontWeight, 10);
509
+ return Number.isFinite(weight)
510
+ ? getClosestFontWeightKey(weight)
511
+ : DEFAULT_FORMATTING_STATE.fontWeight;
512
+ }, []);
513
+ const getCurrentLineHeight = useCallback(() => {
514
+ if (!editorRef.current)
515
+ return DEFAULT_FORMATTING_STATE.lineHeight;
516
+ const selection = window.getSelection();
517
+ let element = null;
518
+ if (selection && selection.rangeCount > 0) {
519
+ let node = selection.getRangeAt(0).startContainer;
520
+ if (node && node.nodeType === Node.TEXT_NODE)
521
+ node = node.parentElement;
522
+ if (node instanceof HTMLElement)
523
+ element = node;
524
+ }
525
+ while (element && editorRef.current.contains(element)) {
526
+ const match = LINE_HEIGHT_OPTIONS.find((o) => element && element.classList.contains(o.className));
527
+ if (match)
528
+ return match.key;
529
+ element = element.parentElement;
530
+ }
531
+ return DEFAULT_FORMATTING_STATE.lineHeight;
532
+ }, []);
533
+ const getCurrentLetterSpacing = useCallback(() => {
534
+ if (!editorRef.current)
535
+ return DEFAULT_FORMATTING_STATE.letterSpacing;
536
+ const selection = window.getSelection();
537
+ let element = null;
538
+ if (selection && selection.rangeCount > 0) {
539
+ let node = selection.getRangeAt(0).startContainer;
540
+ if (node && node.nodeType === Node.TEXT_NODE)
541
+ node = node.parentElement;
542
+ if (node instanceof HTMLElement)
543
+ element = node;
544
+ }
545
+ while (element && editorRef.current.contains(element)) {
546
+ const match = LETTER_SPACING_OPTIONS.find((o) => element && element.classList.contains(o.className));
547
+ if (match)
548
+ return match.key;
549
+ element = element.parentElement;
550
+ }
551
+ return DEFAULT_FORMATTING_STATE.letterSpacing;
552
+ }, []);
192
553
  const updateFormattingState = useCallback(() => {
193
554
  if (!editorRef.current || isDisabled) {
194
555
  setFormattingState(DEFAULT_FORMATTING_STATE);
@@ -199,31 +560,61 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
199
560
  let underline = false;
200
561
  let textAlign = "left";
201
562
  let fontSize = DEFAULT_FORMATTING_STATE.fontSize;
563
+ let fontWeight = DEFAULT_FORMATTING_STATE.fontWeight;
564
+ let fontFamily = DEFAULT_FORMATTING_STATE.fontFamily;
565
+ let lineHeight = DEFAULT_FORMATTING_STATE.lineHeight;
566
+ let letterSpacing = DEFAULT_FORMATTING_STATE.letterSpacing;
202
567
  let textColor = DEFAULT_FORMATTING_STATE.textColor;
568
+ // Bold is class-driven — the toolbar Bold button and Weight=Bold
569
+ // dropdown share `font-bold`, so we walk class ancestors and only fall
570
+ // back to computed font-weight when no class is found (covers legacy
571
+ // <strong>/<b> tags from pasted content).
203
572
  try {
204
- bold = document.queryCommandState("bold");
573
+ const sel = window.getSelection();
574
+ let startEl = null;
575
+ if (sel && sel.rangeCount > 0) {
576
+ let node = sel.getRangeAt(0).startContainer;
577
+ if (node && node.nodeType === Node.TEXT_NODE)
578
+ node = node.parentElement;
579
+ if (node instanceof HTMLElement)
580
+ startEl = node;
581
+ }
582
+ const boldClasses = ["font-bold", "font-extrabold", "font-black"];
583
+ const notBoldClasses = ["font-thin", "font-extralight", "font-light", "font-normal", "font-medium", "font-semibold"];
584
+ let n = startEl;
585
+ let boldClassFound = null;
586
+ while (n && n !== editorRef.current) {
587
+ if (boldClasses.some((c) => n.classList.contains(c))) {
588
+ boldClassFound = true;
589
+ break;
590
+ }
591
+ if (notBoldClasses.some((c) => n.classList.contains(c))) {
592
+ boldClassFound = false;
593
+ break;
594
+ }
595
+ n = n.parentElement;
596
+ }
597
+ bold = boldClassFound !== null
598
+ ? boldClassFound
599
+ : startEl
600
+ ? parseInt(window.getComputedStyle(startEl).fontWeight, 10) >= 600
601
+ : false;
205
602
  }
206
603
  catch (error) {
207
604
  if (process.env.NODE_ENV !== 'production') {
208
- console.warn("queryCommandState bold failed", error);
605
+ console.warn("Failed to determine bold state", error);
209
606
  }
210
607
  }
608
+ // Italic and underline route through execCommand and produce semantic
609
+ // <em>/<u> tags, so queryCommandState is the canonical read.
211
610
  try {
212
611
  italic = document.queryCommandState("italic");
213
612
  }
214
- catch (error) {
215
- if (process.env.NODE_ENV !== 'production') {
216
- console.warn("queryCommandState italic failed", error);
217
- }
218
- }
613
+ catch (_a) { }
219
614
  try {
220
615
  underline = document.queryCommandState("underline");
221
616
  }
222
- catch (error) {
223
- if (process.env.NODE_ENV !== 'production') {
224
- console.warn("queryCommandState underline failed", error);
225
- }
226
- }
617
+ catch (_b) { }
227
618
  try {
228
619
  if (document.queryCommandState("justifyCenter")) {
229
620
  textAlign = "center";
@@ -252,14 +643,56 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
252
643
  }
253
644
  }
254
645
  try {
255
- const colorValue = document.queryCommandValue("foreColor");
256
- if (typeof colorValue === "string" && colorValue.trim().length > 0) {
257
- textColor = colorValue;
646
+ fontWeight = getCurrentFontWeight();
647
+ }
648
+ catch (error) {
649
+ if (process.env.NODE_ENV !== 'production') {
650
+ console.warn("Failed to determine font weight", error);
651
+ }
652
+ }
653
+ try {
654
+ fontFamily = getCurrentFontFamily();
655
+ }
656
+ catch (error) {
657
+ if (process.env.NODE_ENV !== 'production') {
658
+ console.warn("Failed to determine font family", error);
659
+ }
660
+ }
661
+ try {
662
+ lineHeight = getCurrentLineHeight();
663
+ }
664
+ catch (error) {
665
+ if (process.env.NODE_ENV !== 'production') {
666
+ console.warn("Failed to determine line height", error);
667
+ }
668
+ }
669
+ try {
670
+ letterSpacing = getCurrentLetterSpacing();
671
+ }
672
+ catch (error) {
673
+ if (process.env.NODE_ENV !== 'production') {
674
+ console.warn("Failed to determine letter spacing", error);
675
+ }
676
+ }
677
+ try {
678
+ // Walk up from the selection's start container to find the nearest
679
+ // ancestor carrying a `text-{token}` class; that token (e.g.
680
+ // "rose-500", "white") is the active color. queryCommandValue is no
681
+ // longer used because color is applied via class swaps, not foreColor.
682
+ const sel = window.getSelection();
683
+ let startEl = null;
684
+ if (sel && sel.rangeCount > 0) {
685
+ let node = sel.getRangeAt(0).startContainer;
686
+ if (node && node.nodeType === Node.TEXT_NODE)
687
+ node = node.parentElement;
688
+ if (node instanceof HTMLElement)
689
+ startEl = node;
258
690
  }
691
+ textColor = matchTextColorClass(startEl, editorRef.current);
259
692
  }
260
693
  catch (error) {
261
694
  if (process.env.NODE_ENV !== 'production') {
262
- console.warn("queryCommandValue foreColor failed", error);
695
+ console.warn("Failed to determine text color", error);
263
696
  }
264
697
  }
265
698
  setFormattingState({
@@ -268,18 +701,39 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
268
701
  underline,
269
702
  textAlign,
270
703
  fontSize,
704
+ fontWeight,
705
+ fontFamily,
706
+ lineHeight,
707
+ letterSpacing,
271
708
  textColor,
272
709
  });
273
- }, [getCurrentFontSize, isDisabled]);
710
+ }, [
711
+ getCurrentFontSize,
712
+ getCurrentFontWeight,
713
+ getCurrentFontFamily,
714
+ getCurrentLineHeight,
715
+ getCurrentLetterSpacing,
716
+ isDisabled,
717
+ ]);
274
718
  const handleContentChange = useCallback(() => {
275
719
  if (!editorRef.current || !onChange)
276
720
  return;
277
- onChange(editorRef.current.innerHTML);
278
- }, [onChange]);
721
+ const raw = editorRef.current.innerHTML;
722
+ const clean = sanitizeHtml(raw);
723
+ // If sanitizer stripped something (e.g. pasted <script> or on*= handlers),
724
+ // reconcile the DOM so what's rendered matches what we emit.
725
+ if (clean !== raw) {
726
+ editorRef.current.innerHTML = clean;
727
+ }
728
+ onChange(clean);
729
+ }, [onChange, sanitizeHtml]);
279
730
  const execEditorCommand = useCallback((command, value) => {
280
731
  if (isDisabled || !editorRef.current)
281
732
  return;
282
733
  focusEditor();
734
+ // Snapshot before mutating so bold/italic/foreColor/justify/… land on
735
+ // the same undo stack as direct-DOM style ops and typing.
736
+ pushHistory("op");
283
737
  try {
284
738
  document.execCommand(command, false, value);
285
739
  }
@@ -292,66 +746,236 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
292
746
  updateFormattingState();
293
747
  handleContentChange();
294
748
  });
295
- }, [focusEditor, handleContentChange, isDisabled, updateFormattingState]);
296
- const normalizeFontSizeSelection = useCallback((sizeKey) => {
749
+ }, [focusEditor, handleContentChange, isDisabled, pushHistory, updateFormattingState]);
750
+ const handleUndo = useCallback((event) => {
751
+ event === null || event === void 0 ? void 0 : event.preventDefault();
752
+ event === null || event === void 0 ? void 0 : event.stopPropagation();
753
+ const stack = historyRef.current;
754
+ if (stack.undo.length === 0 || !editorRef.current)
755
+ return;
756
+ const previous = stack.undo.pop();
757
+ stack.redo.push(editorRef.current.innerHTML);
758
+ // Reset the typing-coalesce window so the next keystroke after an
759
+ // undo always starts a fresh entry.
760
+ stack.lastPushKind = null;
761
+ editorRef.current.innerHTML = sanitizeHtml(previous);
762
+ requestAnimationFrame(() => {
763
+ updateFormattingState();
764
+ handleContentChange();
765
+ });
766
+ }, [handleContentChange, sanitizeHtml, updateFormattingState]);
767
+ const handleRedo = useCallback((event) => {
768
+ event === null || event === void 0 ? void 0 : event.preventDefault();
769
+ event === null || event === void 0 ? void 0 : event.stopPropagation();
770
+ const stack = historyRef.current;
771
+ if (stack.redo.length === 0 || !editorRef.current)
772
+ return;
773
+ const next = stack.redo.pop();
774
+ stack.undo.push(editorRef.current.innerHTML);
775
+ stack.lastPushKind = null;
776
+ editorRef.current.innerHTML = sanitizeHtml(next);
777
+ requestAnimationFrame(() => {
778
+ updateFormattingState();
779
+ handleContentChange();
780
+ });
781
+ }, [handleContentChange, sanitizeHtml, updateFormattingState]);
782
+ const applyStyleToSelection = useCallback((apply) => {
783
+ var _a, _b, _c;
297
784
  if (!editorRef.current)
298
785
  return;
299
- const option = getFontSizeOption(sizeKey);
300
786
  const selection = window.getSelection();
301
787
  if (!selection || selection.rangeCount === 0)
302
788
  return;
303
789
  const range = selection.getRangeAt(0);
304
- const value = option.value;
305
790
  if (selection.isCollapsed) {
306
791
  let node = selection.anchorNode;
307
- if (node && node.nodeType === Node.TEXT_NODE) {
792
+ if (node && node.nodeType === Node.TEXT_NODE)
308
793
  node = node.parentElement;
309
- }
310
794
  while (node && node !== editorRef.current) {
311
795
  if (node instanceof HTMLElement) {
312
- node.style.fontSize = value;
313
- if (node.tagName.toLowerCase() === "font") {
314
- node.removeAttribute("size");
315
- }
796
+ apply(node);
316
797
  break;
317
798
  }
318
799
  node = node.parentElement;
319
800
  }
320
801
  return;
321
802
  }
803
+ // Non-collapsed: try to wrap just the selected range in a styled span so
804
+ // only the selected text changes. surroundContents works when the range
805
+ // doesn't cross element boundaries (the common case for inline selections).
806
+ const span = document.createElement("span");
807
+ apply(span);
808
+ try {
809
+ range.surroundContents(span);
810
+ selection.removeAllRanges();
811
+ const restored = document.createRange();
812
+ restored.selectNodeContents(span);
813
+ selection.addRange(restored);
814
+ return;
815
+ }
816
+ catch (_d) {
817
+ // Range crosses element boundaries — fall through to per-parent walker.
818
+ }
819
+ // Cross-element fallback: split each intersecting text node at the
820
+ // range boundaries so only the selected characters end up wrapped.
821
+ // Collect first — splitText() mutates the tree and breaks live walking.
822
+ const startContainer = range.startContainer;
823
+ const startOffset = range.startOffset;
824
+ const endContainer = range.endContainer;
825
+ const endOffset = range.endOffset;
826
+ const textNodes = [];
322
827
  const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT, {
323
- acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT,
828
+ acceptNode: (n) => range.intersectsNode(n) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT,
324
829
  });
325
- const updated = new Set();
326
830
  let current;
327
- while ((current = walker.nextNode())) {
328
- const parent = current.parentElement;
329
- if (!parent || !editorRef.current.contains(parent))
831
+ while ((current = walker.nextNode()))
832
+ textNodes.push(current);
833
+ const editor = editorRef.current;
834
+ let firstWrap = null;
835
+ let lastWrap = null;
836
+ for (const textNode of textNodes) {
837
+ if (!editor.contains(textNode))
838
+ continue;
839
+ // Trim leading portion when range starts inside this text node
840
+ let target = textNode;
841
+ if (textNode === startContainer && startOffset > 0) {
842
+ target = textNode.splitText(startOffset);
843
+ }
844
+ // Trim trailing portion when range ends inside this text node
845
+ if (textNode === endContainer) {
846
+ const endInTarget = textNode === startContainer ? endOffset - startOffset : endOffset;
847
+ if (endInTarget < target.length) {
848
+ target.splitText(endInTarget);
849
+ }
850
+ }
851
+ // Wrap the precise text fragment in a styled span
852
+ const wrap = document.createElement("span");
853
+ apply(wrap);
854
+ (_a = target.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(wrap, target);
855
+ wrap.appendChild(target);
856
+ if (!firstWrap)
857
+ firstWrap = wrap;
858
+ lastWrap = wrap;
859
+ }
860
+ // Restore the visible selection across the wrapped fragments so the
861
+ // user doesn't have to re-highlight before chaining another action.
862
+ if (firstWrap && lastWrap) {
863
+ selection.removeAllRanges();
864
+ const restored = document.createRange();
865
+ restored.setStartBefore((_b = firstWrap.firstChild) !== null && _b !== void 0 ? _b : firstWrap);
866
+ restored.setEndAfter((_c = lastWrap.lastChild) !== null && _c !== void 0 ? _c : lastWrap);
867
+ selection.addRange(restored);
868
+ }
869
+ }, []);
870
+ /**
871
+ * Strip a redundant class from any element whose every non-whitespace text
872
+ * descendant already sits under a closer descendant carrying a class from
873
+ * the same group. The outer declaration is dead weight at that point —
874
+ * leaving it in place causes nested wrappers to win on properties whose
875
+ * line box height (e.g. `text-7xl`'s `line-height: 1`) is computed from the
876
+ * outer's own font-size, regardless of what the inner element declares.
877
+ * After stripping, span/font wrappers that are now attribute-less are
878
+ * unwrapped so we don't accumulate empty markup over time.
879
+ */
880
+ const flattenClassGroup = useCallback((classes) => {
881
+ if (!editorRef.current || classes.length === 0)
882
+ return;
883
+ const editor = editorRef.current;
884
+ const selector = classes.map((c) => `.${c}`).join(",");
885
+ const candidates = Array.from(editor.querySelectorAll(selector));
886
+ for (const ancestor of candidates) {
887
+ const ancestorClass = classes.find((c) => ancestor.classList.contains(c));
888
+ if (!ancestorClass)
330
889
  continue;
331
- if (updated.has(parent))
890
+ const walker = document.createTreeWalker(ancestor, NodeFilter.SHOW_TEXT);
891
+ let everyTextHasCloser = true;
892
+ let sawAnyText = false;
893
+ let textNode;
894
+ while ((textNode = walker.nextNode())) {
895
+ const data = textNode.data;
896
+ if (!data || !data.trim())
897
+ continue;
898
+ sawAnyText = true;
899
+ let p = textNode.parentElement;
900
+ let foundCloser = false;
901
+ while (p && p !== ancestor) {
902
+ if (classes.some((c) => p.classList.contains(c))) {
903
+ foundCloser = true;
904
+ break;
905
+ }
906
+ p = p.parentElement;
907
+ }
908
+ if (!foundCloser) {
909
+ everyTextHasCloser = false;
910
+ break;
911
+ }
912
+ }
913
+ if (!sawAnyText || !everyTextHasCloser)
332
914
  continue;
333
- parent.style.fontSize = value;
334
- if (parent.tagName.toLowerCase() === "font") {
335
- parent.removeAttribute("size");
915
+ ancestor.classList.remove(ancestorClass);
916
+ if (ancestor.classList.length === 0)
917
+ ancestor.removeAttribute("class");
918
+ const tag = ancestor.tagName.toLowerCase();
919
+ if ((tag === "span" || tag === "font") &&
920
+ ancestor.attributes.length === 0 &&
921
+ ancestor.parentNode) {
922
+ const parent = ancestor.parentNode;
923
+ while (ancestor.firstChild)
924
+ parent.insertBefore(ancestor.firstChild, ancestor);
925
+ parent.removeChild(ancestor);
336
926
  }
337
- updated.add(parent);
338
927
  }
339
928
  }, []);
340
- const handleUndo = useCallback((event) => {
341
- event === null || event === void 0 ? void 0 : event.preventDefault();
342
- event === null || event === void 0 ? void 0 : event.stopPropagation();
343
- execEditorCommand("undo");
344
- }, [execEditorCommand]);
345
- const handleRedo = useCallback((event) => {
346
- event === null || event === void 0 ? void 0 : event.preventDefault();
347
- event === null || event === void 0 ? void 0 : event.stopPropagation();
348
- execEditorCommand("redo");
349
- }, [execEditorCommand]);
929
+ /**
930
+ * Generic class-swap helper. Wraps the selected text in a span carrying
931
+ * `nextClass` (also stripping any sibling class from the same group on
932
+ * that wrap, so we never end up with `text-sm text-7xl`), then runs a
933
+ * flatten pass over the editor to collapse newly-redundant outer wrappers.
934
+ */
935
+ const applyClassSwap = useCallback((group, nextClass) => {
936
+ applyStyleToSelection((el) => {
937
+ for (const cls of group) {
938
+ if (cls !== nextClass)
939
+ el.classList.remove(cls);
940
+ }
941
+ el.classList.add(nextClass);
942
+ });
943
+ flattenClassGroup(group);
944
+ }, [applyStyleToSelection, flattenClassGroup]);
350
945
  const handleBold = useCallback((event) => {
351
946
  event === null || event === void 0 ? void 0 : event.preventDefault();
352
947
  event === null || event === void 0 ? void 0 : event.stopPropagation();
353
- execEditorCommand("bold");
354
- }, [execEditorCommand]);
948
+ if (isDisabled || !editorRef.current)
949
+ return;
950
+ focusEditor();
951
+ const selection = window.getSelection();
952
+ if (!selection || selection.rangeCount === 0)
953
+ return;
954
+ pushHistory();
955
+ // Bold lives in the font-weight class group: ON → font-bold,
956
+ // OFF → font-normal. The toolbar Bold button and the Weight=Bold
957
+ // dropdown entry share the same underlying class, so they stay in
958
+ // sync automatically — toggling one lights up the other.
959
+ const next = formattingState.bold ? "font-normal" : "font-bold";
960
+ applyClassSwap(FONT_WEIGHT_CLASSES, next);
961
+ requestAnimationFrame(() => {
962
+ updateFormattingState();
963
+ handleContentChange();
964
+ });
965
+ }, [
966
+ applyClassSwap,
967
+ focusEditor,
968
+ formattingState.bold,
969
+ handleContentChange,
970
+ isDisabled,
971
+ pushHistory,
972
+ updateFormattingState,
973
+ ]);
974
+ // Italic and underline route through execCommand because it produces
975
+ // semantic <em>/<u> tags, handles toggle-on/off (including unwrap) without
976
+ // a hand-rolled negation-class scheme, and the editor's CSS already
977
+ // styles those tags via descendant selectors. execEditorCommand
978
+ // pre-snapshots history so undo/redo ordering is preserved.
355
979
  const handleItalic = useCallback((event) => {
356
980
  event === null || event === void 0 ? void 0 : event.preventDefault();
357
981
  event === null || event === void 0 ? void 0 : event.stopPropagation();
@@ -366,47 +990,264 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
366
990
  if (isDisabled || !editorRef.current)
367
991
  return;
368
992
  focusEditor();
369
- try {
370
- document.execCommand("styleWithCSS", false, "true");
993
+ const option = getFontSizeOption(sizeKey);
994
+ const selection = window.getSelection();
995
+ if (!selection || selection.rangeCount === 0) {
996
+ closeAllPickers();
997
+ return;
371
998
  }
372
- catch (error) {
373
- if (process.env.NODE_ENV !== 'production') {
374
- console.warn("styleWithCSS command failed", error);
999
+ pushHistory();
1000
+ // Tailwind's `text-*` utilities bundle font-size + a matching
1001
+ // line-height in one rule, so swapping the size class swaps both —
1002
+ // no separate flattening pass needed for the line-height.
1003
+ applyClassSwap(FONT_SIZE_CLASSES, option.className);
1004
+ requestAnimationFrame(() => {
1005
+ updateFormattingState();
1006
+ handleContentChange();
1007
+ });
1008
+ closeAllPickers();
1009
+ }, [
1010
+ applyClassSwap,
1011
+ closeAllPickers,
1012
+ focusEditor,
1013
+ handleContentChange,
1014
+ isDisabled,
1015
+ pushHistory,
1016
+ updateFormattingState,
1017
+ ]);
1018
+ const applyToBlockAncestors = useCallback((apply) => {
1019
+ if (!editorRef.current)
1020
+ return;
1021
+ const selection = window.getSelection();
1022
+ if (!selection || selection.rangeCount === 0)
1023
+ return;
1024
+ const editor = editorRef.current;
1025
+ // Normalize: ensure no text node or inline element is a *direct*
1026
+ // child of the editor. Otherwise `findBlock` would fall back to the
1027
+ // editor itself, and any class set on it would live on the live DOM
1028
+ // but never serialize through `editor.innerHTML` — line-height
1029
+ // changes would silently disappear from saved HTML. Wrap each
1030
+ // contiguous run of inline-or-text top-level children in a fresh
1031
+ // `<div>`. Idempotent: blocks that are already block-level are left
1032
+ // alone, so calling this on every block-level mutation is cheap.
1033
+ const isInlineChild = (node) => {
1034
+ if (node.nodeType === Node.TEXT_NODE)
1035
+ return true;
1036
+ if (node instanceof HTMLElement) {
1037
+ const d = window.getComputedStyle(node).display;
1038
+ return d === "inline" || d === "inline-block";
1039
+ }
1040
+ return false;
1041
+ };
1042
+ const groups = [];
1043
+ let currentGroup = null;
1044
+ for (const child of Array.from(editor.childNodes)) {
1045
+ if (isInlineChild(child)) {
1046
+ if (!currentGroup) {
1047
+ currentGroup = [];
1048
+ groups.push(currentGroup);
1049
+ }
1050
+ currentGroup.push(child);
1051
+ }
1052
+ else {
1053
+ currentGroup = null;
375
1054
  }
376
1055
  }
377
- try {
378
- document.execCommand("fontSize", false, FONT_SIZE_COMMAND_VALUE[sizeKey]);
1056
+ for (const group of groups) {
1057
+ if (group.length === 0)
1058
+ continue;
1059
+ const wrap = document.createElement("div");
1060
+ editor.insertBefore(wrap, group[0]);
1061
+ for (const node of group)
1062
+ wrap.appendChild(node);
379
1063
  }
380
- catch (error) {
381
- if (process.env.NODE_ENV !== 'production') {
382
- console.warn("fontSize command failed", error);
1064
+ // Re-read range after potential mutations — Range objects survive
1065
+ // moves but offsets into reparented text nodes stay valid, so
1066
+ // `selection.getRangeAt(0)` still points at the same characters.
1067
+ const range = selection.getRangeAt(0);
1068
+ const findBlock = (node) => {
1069
+ let n = node;
1070
+ if (n && n.nodeType === Node.TEXT_NODE)
1071
+ n = n.parentElement;
1072
+ while (n && n !== editor && editor.contains(n)) {
1073
+ if (n instanceof HTMLElement) {
1074
+ const d = window.getComputedStyle(n).display;
1075
+ if (d === "block" || d === "list-item" || d === "table-cell" || d === "flex" || d === "grid") {
1076
+ return n;
1077
+ }
1078
+ }
1079
+ n = n.parentElement;
383
1080
  }
1081
+ // After normalization above, an inline node always has a non-editor
1082
+ // block ancestor; this branch is now only reached for malformed
1083
+ // cases. Returning null is safer than returning the editor (which
1084
+ // wouldn't serialize anyway).
1085
+ return null;
1086
+ };
1087
+ const blocks = new Set();
1088
+ if (selection.isCollapsed) {
1089
+ const block = findBlock(range.startContainer);
1090
+ if (block)
1091
+ blocks.add(block);
384
1092
  }
385
- normalizeFontSizeSelection(sizeKey);
386
- try {
387
- document.execCommand("styleWithCSS", false, "false");
1093
+ else if (range.commonAncestorContainer.nodeType === Node.TEXT_NODE) {
1094
+ const block = findBlock(range.commonAncestorContainer);
1095
+ if (block)
1096
+ blocks.add(block);
388
1097
  }
389
- catch (error) {
390
- // Some browsers do not support toggling this flag; ignore.
1098
+ else {
1099
+ const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT, {
1100
+ acceptNode: (n) => range.intersectsNode(n) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT,
1101
+ });
1102
+ let current;
1103
+ while ((current = walker.nextNode())) {
1104
+ const block = findBlock(current);
1105
+ if (block)
1106
+ blocks.add(block);
1107
+ }
391
1108
  }
1109
+ blocks.forEach((b) => apply(b));
1110
+ }, []);
1111
+ const handleFontFamily = useCallback((key) => {
1112
+ if (isDisabled || !editorRef.current)
1113
+ return;
1114
+ focusEditor();
1115
+ const option = fontFamilies.find((opt) => opt.key === key);
1116
+ if (!option)
1117
+ return;
1118
+ if (loadFontsOnDemand && option.family) {
1119
+ loadGoogleFont(option.family, option.weights);
1120
+ }
1121
+ pushHistory();
1122
+ applyStyleToSelection((el) => {
1123
+ el.style.fontFamily = option.stack;
1124
+ });
392
1125
  requestAnimationFrame(() => {
393
1126
  updateFormattingState();
394
1127
  handleContentChange();
395
1128
  });
396
- setShowFontSizePicker(false);
397
- setShowColorPicker(false);
1129
+ closeAllPickers();
398
1130
  }, [
1131
+ applyStyleToSelection,
1132
+ closeAllPickers,
399
1133
  focusEditor,
1134
+ fontFamilies,
400
1135
  handleContentChange,
401
1136
  isDisabled,
402
- normalizeFontSizeSelection,
1137
+ loadFontsOnDemand,
1138
+ pushHistory,
403
1139
  updateFormattingState,
404
1140
  ]);
405
- const handleTextColor = useCallback((color) => {
406
- execEditorCommand("foreColor", color);
407
- setShowColorPicker(false);
408
- setShowFontSizePicker(false);
409
- }, [execEditorCommand]);
1141
+ const handleFontWeight = useCallback((key) => {
1142
+ if (isDisabled || !editorRef.current)
1143
+ return;
1144
+ focusEditor();
1145
+ const option = getFontWeightOption(key);
1146
+ pushHistory();
1147
+ applyClassSwap(FONT_WEIGHT_CLASSES, option.className);
1148
+ requestAnimationFrame(() => {
1149
+ updateFormattingState();
1150
+ handleContentChange();
1151
+ });
1152
+ closeAllPickers();
1153
+ }, [
1154
+ applyClassSwap,
1155
+ closeAllPickers,
1156
+ focusEditor,
1157
+ handleContentChange,
1158
+ isDisabled,
1159
+ pushHistory,
1160
+ updateFormattingState,
1161
+ ]);
1162
+ const handleLineHeight = useCallback((key) => {
1163
+ if (isDisabled || !editorRef.current)
1164
+ return;
1165
+ focusEditor();
1166
+ const option = getLineHeightOption(key);
1167
+ pushHistory();
1168
+ // Line height is paragraph-level, so swap the `leading-*` class on the
1169
+ // block ancestors that contain the selection rather than wrapping in a
1170
+ // span. Each block carries at most one `leading-*` class — clear any
1171
+ // existing one first, then add the new one.
1172
+ applyToBlockAncestors((el) => {
1173
+ for (const cls of LINE_HEIGHT_CLASSES) {
1174
+ if (cls !== option.className)
1175
+ el.classList.remove(cls);
1176
+ }
1177
+ el.classList.add(option.className);
1178
+ });
1179
+ requestAnimationFrame(() => {
1180
+ updateFormattingState();
1181
+ handleContentChange();
1182
+ });
1183
+ closeAllPickers();
1184
+ }, [
1185
+ applyToBlockAncestors,
1186
+ closeAllPickers,
1187
+ focusEditor,
1188
+ handleContentChange,
1189
+ isDisabled,
1190
+ pushHistory,
1191
+ updateFormattingState,
1192
+ ]);
1193
+ const handleLetterSpacing = useCallback((key) => {
1194
+ if (isDisabled || !editorRef.current)
1195
+ return;
1196
+ focusEditor();
1197
+ const option = getLetterSpacingOption(key);
1198
+ pushHistory();
1199
+ applyClassSwap(LETTER_SPACING_CLASSES, option.className);
1200
+ requestAnimationFrame(() => {
1201
+ updateFormattingState();
1202
+ handleContentChange();
1203
+ });
1204
+ closeAllPickers();
1205
+ }, [
1206
+ applyClassSwap,
1207
+ closeAllPickers,
1208
+ focusEditor,
1209
+ handleContentChange,
1210
+ isDisabled,
1211
+ pushHistory,
1212
+ updateFormattingState,
1213
+ ]);
1214
+ const handleTextColor = useCallback((token) => {
1215
+ if (isDisabled || !editorRef.current || !token)
1216
+ return;
1217
+ focusEditor();
1218
+ const selection = window.getSelection();
1219
+ if (!selection || selection.rangeCount === 0) {
1220
+ closeAllPickers();
1221
+ return;
1222
+ }
1223
+ pushHistory();
1224
+ applyClassSwap(TEXT_COLOR_CLASSES, `text-${token}`);
1225
+ addRecentColor(token);
1226
+ requestAnimationFrame(() => {
1227
+ updateFormattingState();
1228
+ handleContentChange();
1229
+ });
1230
+ closeAllPickers();
1231
+ }, [
1232
+ addRecentColor,
1233
+ applyClassSwap,
1234
+ closeAllPickers,
1235
+ focusEditor,
1236
+ handleContentChange,
1237
+ isDisabled,
1238
+ pushHistory,
1239
+ updateFormattingState,
1240
+ ]);
1241
+ const handleMouseDown = useCallback((event) => {
1242
+ event.preventDefault();
1243
+ focusEditor();
1244
+ }, [focusEditor]);
1245
+ const fontSizeAnimations = useMemo(() => createDropdownAnimations(fontSizeIsFlipped), [fontSizeIsFlipped]);
1246
+ const fontWeightAnimations = useMemo(() => createDropdownAnimations(fontWeightIsFlipped), [fontWeightIsFlipped]);
1247
+ const fontFamilyAnimations = useMemo(() => createDropdownAnimations(fontFamilyIsFlipped), [fontFamilyIsFlipped]);
1248
+ const lineHeightAnimations = useMemo(() => createDropdownAnimations(lineHeightIsFlipped), [lineHeightIsFlipped]);
1249
+ const letterSpacingAnimations = useMemo(() => createDropdownAnimations(letterSpacingIsFlipped), [letterSpacingIsFlipped]);
1250
+ const colorAnimations = useMemo(() => createDropdownAnimations(colorIsFlipped), [colorIsFlipped]);
410
1251
  const handleAlign = useCallback((alignment) => {
411
1252
  const commandMap = {
412
1253
  left: "justifyLeft",
@@ -416,6 +1257,7 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
416
1257
  execEditorCommand(commandMap[alignment]);
417
1258
  }, [execEditorCommand]);
418
1259
  const handleSelection = useCallback(() => {
1260
+ var _a;
419
1261
  if (!editorRef.current || isDisabled)
420
1262
  return;
421
1263
  updateFormattingState();
@@ -437,7 +1279,12 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
437
1279
  setShowToolbar(false);
438
1280
  return;
439
1281
  }
440
- const toolbarWidth = 200;
1282
+ // Measure the actual toolbar width — the floating toolbar grows with
1283
+ // the active control set (font family, font size, …) and a static
1284
+ // 200 px constant clipped it off-canvas at the editor's right edge.
1285
+ // offsetWidth is 0 while the toolbar is unmounted via AnimatePresence;
1286
+ // fall back to a realistic default for the very first frame.
1287
+ const toolbarWidth = ((_a = toolbarRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || 320;
441
1288
  const left = Math.max(10, Math.min(rect.left - editorRect.left + rect.width / 2 - toolbarWidth / 2, editorRect.width - toolbarWidth - 10));
442
1289
  setToolbarPosition({ top: rect.top - editorRect.top - 50, left });
443
1290
  setShowToolbar(true);
@@ -450,11 +1297,42 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
450
1297
  handleContentChange();
451
1298
  updateFormattingState();
452
1299
  };
1300
+ // beforeinput fires synchronously *before* the DOM mutation, so
1301
+ // editorRef.current.innerHTML is still the pre-keystroke snapshot —
1302
+ // exactly what undo needs. Coalescing in pushHistory groups successive
1303
+ // keystrokes into one undo entry per ~500 ms run.
1304
+ const handleBeforeInput = () => {
1305
+ pushHistory("typing");
1306
+ };
1307
+ // Intercept native undo/redo shortcuts so the browser's contentEditable
1308
+ // stack doesn't drift out of sync with our linear history. Without this
1309
+ // the browser would still honor Cmd/Ctrl+Z on its own internal stack.
1310
+ const handleKeyDown = (event) => {
1311
+ const mod = event.metaKey || event.ctrlKey;
1312
+ if (!mod)
1313
+ return;
1314
+ const key = event.key.toLowerCase();
1315
+ if (key === "z") {
1316
+ event.preventDefault();
1317
+ if (event.shiftKey)
1318
+ handleRedo(event);
1319
+ else
1320
+ handleUndo(event);
1321
+ }
1322
+ else if (key === "y" && !event.shiftKey) {
1323
+ event.preventDefault();
1324
+ handleRedo(event);
1325
+ }
1326
+ };
453
1327
  editor.addEventListener("input", handleInput);
1328
+ editor.addEventListener("beforeinput", handleBeforeInput);
1329
+ editor.addEventListener("keydown", handleKeyDown);
454
1330
  return () => {
455
1331
  editor.removeEventListener("input", handleInput);
1332
+ editor.removeEventListener("beforeinput", handleBeforeInput);
1333
+ editor.removeEventListener("keydown", handleKeyDown);
456
1334
  };
457
- }, [handleContentChange, updateFormattingState]);
1335
+ }, [handleContentChange, handleRedo, handleUndo, pushHistory, updateFormattingState]);
458
1336
  useEffect(() => {
459
1337
  const handleSelectionChange = () => {
460
1338
  if (!editorRef.current)
@@ -477,47 +1355,73 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
477
1355
  }, [handleSelection, updateFormattingState]);
478
1356
  useEffect(() => {
479
1357
  const handleClickOutside = (event) => {
480
- var _a, _b, _c, _d;
1358
+ var _a, _b, _c, _d, _e, _f, _g, _h;
481
1359
  const target = event.target;
482
1360
  const isInEditor = (_a = editorRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);
483
1361
  const isInToolbar = (_b = toolbarRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);
484
1362
  const isInFontSizeDropdown = (_c = fontSizePortalContentRef.current) === null || _c === void 0 ? void 0 : _c.contains(target);
485
- const isInColorDropdown = (_d = colorPortalContentRef.current) === null || _d === void 0 ? void 0 : _d.contains(target);
486
- if (!isInEditor && !isInToolbar && !isInFontSizeDropdown && !isInColorDropdown) {
1363
+ const isInFontWeightDropdown = (_d = fontWeightPortalContentRef.current) === null || _d === void 0 ? void 0 : _d.contains(target);
1364
+ const isInFontFamilyDropdown = (_e = fontFamilyPortalContentRef.current) === null || _e === void 0 ? void 0 : _e.contains(target);
1365
+ const isInLineHeightDropdown = (_f = lineHeightPortalContentRef.current) === null || _f === void 0 ? void 0 : _f.contains(target);
1366
+ const isInLetterSpacingDropdown = (_g = letterSpacingPortalContentRef.current) === null || _g === void 0 ? void 0 : _g.contains(target);
1367
+ const isInColorDropdown = (_h = colorPortalContentRef.current) === null || _h === void 0 ? void 0 : _h.contains(target);
1368
+ const isInAnyDropdown = isInFontSizeDropdown ||
1369
+ isInFontWeightDropdown ||
1370
+ isInFontFamilyDropdown ||
1371
+ isInLineHeightDropdown ||
1372
+ isInLetterSpacingDropdown ||
1373
+ isInColorDropdown;
1374
+ if (!isInEditor && !isInToolbar && !isInAnyDropdown) {
487
1375
  if (toolbarConfig.position === "floating") {
488
1376
  setShowToolbar(false);
489
1377
  }
490
- setShowColorPicker(false);
491
- setShowFontSizePicker(false);
492
- }
493
- else if (isInToolbar || isInFontSizeDropdown || isInColorDropdown) {
494
- const colorMatch = target === null || target === void 0 ? void 0 : target.closest("[data-tool=\"textColor\"]");
495
- const isColorRelated = Boolean(colorMatch) || isInColorDropdown;
496
- const fontSizeMatch = target === null || target === void 0 ? void 0 : target.closest("[data-tool=\"fontSize\"]");
497
- const isFontSizeRelated = isInFontSizeDropdown || Boolean(fontSizeMatch);
498
- if (!isColorRelated) {
499
- setShowColorPicker(false);
500
- }
501
- if (!isFontSizeRelated) {
1378
+ closeAllPickers();
1379
+ }
1380
+ else if (isInToolbar || isInAnyDropdown) {
1381
+ const targetEl = target;
1382
+ const isFontSizeRelated = isInFontSizeDropdown || Boolean(targetEl === null || targetEl === void 0 ? void 0 : targetEl.closest('[data-tool="fontSize"]'));
1383
+ const isFontWeightRelated = isInFontWeightDropdown || Boolean(targetEl === null || targetEl === void 0 ? void 0 : targetEl.closest('[data-tool="fontWeight"]'));
1384
+ const isFontFamilyRelated = isInFontFamilyDropdown || Boolean(targetEl === null || targetEl === void 0 ? void 0 : targetEl.closest('[data-tool="fontFamily"]'));
1385
+ const isLineHeightRelated = isInLineHeightDropdown || Boolean(targetEl === null || targetEl === void 0 ? void 0 : targetEl.closest('[data-tool="lineHeight"]'));
1386
+ const isLetterSpacingRelated = isInLetterSpacingDropdown ||
1387
+ Boolean(targetEl === null || targetEl === void 0 ? void 0 : targetEl.closest('[data-tool="letterSpacing"]'));
1388
+ const isColorRelated = isInColorDropdown || Boolean(targetEl === null || targetEl === void 0 ? void 0 : targetEl.closest('[data-tool="textColor"]'));
1389
+ if (!isFontSizeRelated)
502
1390
  setShowFontSizePicker(false);
503
- }
1391
+ if (!isFontWeightRelated)
1392
+ setShowFontWeightPicker(false);
1393
+ if (!isFontFamilyRelated)
1394
+ setShowFontFamilyPicker(false);
1395
+ if (!isLineHeightRelated)
1396
+ setShowLineHeightPicker(false);
1397
+ if (!isLetterSpacingRelated)
1398
+ setShowLetterSpacingPicker(false);
1399
+ if (!isColorRelated)
1400
+ setShowColorPicker(false);
504
1401
  }
505
1402
  else if (isInEditor) {
506
- setShowColorPicker(false);
507
- setShowFontSizePicker(false);
1403
+ closeAllPickers();
508
1404
  }
509
1405
  };
510
1406
  document.addEventListener("mousedown", handleClickOutside);
511
1407
  return () => document.removeEventListener("mousedown", handleClickOutside);
512
- }, [toolbarConfig.position]);
1408
+ }, [closeAllPickers, toolbarConfig.position]);
513
1409
  useEffect(() => {
514
1410
  if (editorRef.current && value !== editorRef.current.innerHTML) {
515
- editorRef.current.innerHTML = value;
1411
+ editorRef.current.innerHTML = sanitizeHtml(value);
1412
+ // External `value` change — flush undo history. Snapshots taken
1413
+ // from the previous document point at HTML that no longer matches
1414
+ // anything reachable via the new value, so leaving them in place
1415
+ // would let Undo restore content from a prior session/document.
1416
+ historyRef.current.undo = [];
1417
+ historyRef.current.redo = [];
1418
+ historyRef.current.lastPushKind = null;
1419
+ historyRef.current.lastPushAt = 0;
516
1420
  updateFormattingState();
517
1421
  }
518
- }, [updateFormattingState, value]);
519
- const renderToolbarTool = (tool, index) => {
520
- var _a, _b;
1422
+ }, [updateFormattingState, value, sanitizeHtml]);
1423
+ const renderToolbarTool = (tool, toolKey) => {
1424
+ var _a;
521
1425
  const isActive = tool === "bold"
522
1426
  ? formattingState.bold
523
1427
  : tool === "italic"
@@ -526,141 +1430,253 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
526
1430
  ? formattingState.underline
527
1431
  : tool === "fontSize"
528
1432
  ? formattingState.fontSize !== DEFAULT_FORMATTING_STATE.fontSize
529
- : tool === "alignLeft"
530
- ? formattingState.textAlign === "left"
531
- : tool === "alignCenter"
532
- ? formattingState.textAlign === "center"
533
- : tool === "alignRight"
534
- ? formattingState.textAlign === "right"
535
- : false;
536
- const isFloatingToolbar = toolbarConfig.position === "floating";
537
- const handleMouseDown = (event) => {
538
- event.preventDefault();
539
- focusEditor();
540
- };
1433
+ : tool === "fontWeight"
1434
+ ? formattingState.fontWeight !== DEFAULT_FORMATTING_STATE.fontWeight
1435
+ : tool === "fontFamily"
1436
+ ? formattingState.fontFamily !== DEFAULT_FORMATTING_STATE.fontFamily
1437
+ : tool === "lineHeight"
1438
+ ? formattingState.lineHeight !== DEFAULT_FORMATTING_STATE.lineHeight
1439
+ : tool === "letterSpacing"
1440
+ ? formattingState.letterSpacing !== DEFAULT_FORMATTING_STATE.letterSpacing
1441
+ : tool === "alignLeft"
1442
+ ? formattingState.textAlign === "left"
1443
+ : tool === "alignCenter"
1444
+ ? formattingState.textAlign === "center"
1445
+ : tool === "alignRight"
1446
+ ? formattingState.textAlign === "right"
1447
+ : false;
541
1448
  switch (tool) {
542
1449
  case "bold":
543
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: handleBold, disabled: isDisabled, "aria-label": "Bold", "aria-pressed": isActive ? "true" : "false", children: jsx(BoldIcon, { className: "w-4 h-4" }) }, index));
1450
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleBold, disabled: isDisabled, "aria-label": "Bold", "aria-pressed": isActive ? "true" : "false", children: jsx(BoldIcon, { className: "size-4" }) }, toolKey));
544
1451
  case "italic":
545
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: handleItalic, disabled: isDisabled, "aria-label": "Italic", "aria-pressed": isActive ? "true" : "false", children: jsx(ItalicIcon, { className: "w-4 h-4" }) }, index));
1452
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleItalic, disabled: isDisabled, "aria-label": "Italic", "aria-pressed": isActive ? "true" : "false", children: jsx(ItalicIcon, { className: "size-4" }) }, toolKey));
546
1453
  case "underline":
547
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: handleUnderline, disabled: isDisabled, "aria-label": "Underline", "aria-pressed": isActive ? "true" : "false", children: jsx(UnderlineIcon, { className: "w-4 h-4" }) }, index));
1454
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleUnderline, disabled: isDisabled, "aria-label": "Underline", "aria-pressed": isActive ? "true" : "false", children: jsx(UnderlineIcon, { className: "size-4" }) }, toolKey));
1455
+ case "fontFamily": {
1456
+ // The `fontFamily` tool is opt-in via toolbar config, but
1457
+ // `fontFamilies` is also a public prop — if a consumer passes an
1458
+ // empty array the dropdown has nothing to show and the trigger
1459
+ // can't compute a current option to display. Skip rendering the
1460
+ // tool entirely in that case rather than crashing on undefined.
1461
+ if (fontFamilies.length === 0) {
1462
+ if (process.env.NODE_ENV !== "production") {
1463
+ console.warn("[RichTextEditor]: `fontFamily` toolbar tool was requested but `fontFamilies` is empty — the tool will not render. Either remove `fontFamily` from toolbar.tools or supply at least one option.");
1464
+ }
1465
+ return null;
1466
+ }
1467
+ const currentOption = (_a = fontFamilies.find((opt) => opt.key === formattingState.fontFamily)) !== null && _a !== void 0 ? _a : fontFamilies[0];
1468
+ const portalStyle = {
1469
+ position: "fixed",
1470
+ top: fontFamilyPortalPosition.top,
1471
+ left: fontFamilyPortalPosition.left,
1472
+ zIndex: 1000,
1473
+ ...fontFamilyPortalCssVars,
1474
+ };
1475
+ const renderedDropdown = isClient
1476
+ ? createPortal(jsx(AnimatePresence, { mode: "wait", children: showFontFamilyPicker && (jsx(motion.div, { ref: (el) => {
1477
+ fontFamilyPortalContentRef.current = el;
1478
+ }, "data-flikkui-portal": "", role: "listbox", className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), themeStyles.dropdownStyle), style: portalStyle, variants: shouldReduceMotion ? undefined : fontFamilyAnimations, initial: "initial", animate: fontFamilyPortalReady ? "visible" : "initial", exit: "exit", children: jsx(SurfaceProvider, { level: surfaceLevel, children: fontFamilies.map((option) => {
1479
+ const selected = option.key === formattingState.fontFamily;
1480
+ return (jsx("button", { className: themeStyles.dropdownItemStyle, "data-active": selected ? "true" : "false", onMouseDown: (event) => {
1481
+ event.preventDefault();
1482
+ focusEditor();
1483
+ }, onClick: (event) => {
1484
+ event.preventDefault();
1485
+ event.stopPropagation();
1486
+ handleFontFamily(option.key);
1487
+ }, role: "option", "aria-selected": selected, children: jsxs("span", { className: "flex items-center justify-between gap-3", children: [jsx("span", { className: "text-sm", style: { fontFamily: option.stack || undefined }, children: option.label }), option.family && (jsx("span", { className: "text-xs text-[var(--color-text-muted)]", children: "Google" }))] }) }, option.key));
1488
+ }) }) })) }), document.body)
1489
+ : null;
1490
+ return (jsxs("div", { className: "relative", "data-tool": "fontFamily", children: [jsx(Button, { ref: fontFamilyTriggerRef, size: "sm", color: "neutral", variant: "soft", className: cn(themeStyles.toolbarButtonStyle, "!justify-start !w-auto px-2 min-w-[4rem] gap-1"), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
1491
+ event.preventDefault();
1492
+ event.stopPropagation();
1493
+ focusEditor();
1494
+ togglePicker("fontFamily");
1495
+ }, disabled: isDisabled, "aria-label": `Font family (${currentOption.label})`, "aria-expanded": showFontFamilyPicker, "aria-haspopup": "listbox", children: jsx("span", { className: "text-sm font-medium truncate text-left max-w-[5.5rem] block", style: { fontFamily: currentOption.stack || undefined }, children: currentOption.label }) }), renderedDropdown] }, toolKey));
1496
+ }
1497
+ case "fontWeight": {
1498
+ const currentOption = getFontWeightOption(formattingState.fontWeight);
1499
+ const portalStyle = {
1500
+ position: "fixed",
1501
+ top: fontWeightPortalPosition.top,
1502
+ left: fontWeightPortalPosition.left,
1503
+ zIndex: 1000,
1504
+ ...fontWeightPortalCssVars,
1505
+ };
1506
+ const renderedDropdown = isClient
1507
+ ? createPortal(jsx(AnimatePresence, { mode: "wait", children: showFontWeightPicker && (jsx(motion.div, { ref: (el) => {
1508
+ fontWeightPortalContentRef.current = el;
1509
+ }, "data-flikkui-portal": "", role: "listbox", className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), themeStyles.dropdownStyle), style: portalStyle, variants: shouldReduceMotion ? undefined : fontWeightAnimations, initial: "initial", animate: fontWeightPortalReady ? "visible" : "initial", exit: "exit", children: jsx(SurfaceProvider, { level: surfaceLevel, children: FONT_WEIGHT_OPTIONS.map((option) => {
1510
+ const selected = option.key === formattingState.fontWeight;
1511
+ return (jsx("button", { className: themeStyles.dropdownItemStyle, "data-active": selected ? "true" : "false", onMouseDown: (event) => {
1512
+ event.preventDefault();
1513
+ focusEditor();
1514
+ }, onClick: (event) => {
1515
+ event.preventDefault();
1516
+ event.stopPropagation();
1517
+ handleFontWeight(option.key);
1518
+ }, role: "option", "aria-selected": selected, children: jsxs("span", { className: "flex items-center justify-between gap-3", children: [jsx("span", { className: "text-sm", style: { fontWeight: option.value }, children: option.label }), jsx("span", { className: "text-sm text-[var(--color-text-muted)]", children: option.value })] }) }, option.key));
1519
+ }) }) })) }), document.body)
1520
+ : null;
1521
+ return (jsxs("div", { className: "relative", "data-tool": "fontWeight", children: [jsx(Button, { ref: fontWeightTriggerRef, size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
1522
+ event.preventDefault();
1523
+ event.stopPropagation();
1524
+ focusEditor();
1525
+ togglePicker("fontWeight");
1526
+ }, disabled: isDisabled, "aria-label": `Font weight (${currentOption.label})`, "aria-expanded": showFontWeightPicker, "aria-haspopup": "listbox", children: jsx(BoldIcon, { className: "w-4 h-4" }) }), renderedDropdown] }, toolKey));
1527
+ }
548
1528
  case "fontSize": {
549
1529
  const currentOption = getFontSizeOption(formattingState.fontSize);
550
- const dropdownClassName = themeStyles.dropdownStyle;
551
- const fontSizeAnimations = createDropdownAnimations(fontSizeIsFlipped);
552
- const dropdownList = (jsx("div", { className: dropdownClassName, role: "listbox", children: FONT_SIZE_OPTIONS.map((option) => (jsx("button", { className: cn(themeStyles.dropdownItemStyle, option.key === formattingState.fontSize
553
- ? "bg-[var(--color-primary-50)] text-[var(--color-primary-900)]"
554
- : undefined), "data-active": option.key === formattingState.fontSize ? "true" : "false", onMouseDown: (event) => {
555
- event.preventDefault();
556
- focusEditor();
557
- }, onClick: (event) => {
558
- event.preventDefault();
559
- event.stopPropagation();
560
- handleFontSize(option.key);
561
- }, role: "option", "aria-selected": option.key === formattingState.fontSize, children: jsxs("span", { className: "flex items-center justify-between gap-3", children: [jsx("span", { className: "uppercase text-xs font-medium", children: option.label }), jsxs("span", { className: "text-xs text-[var(--color-text-muted)]", children: [option.px, "px"] })] }) }, option.key))) }));
562
- let renderedDropdown = null;
563
- if (isFloatingToolbar && isClient) {
564
- const triggerWidth = (_a = fontSizeTriggerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().width;
565
- const computedWidth = fontSizePortalPosition.width || triggerWidth || undefined;
566
- const dropdownStyle = {
567
- position: "fixed",
568
- top: fontSizePortalPosition.top,
569
- left: fontSizePortalPosition.left,
570
- zIndex: 1000,
571
- ...fontSizePortalCssVars,
572
- };
573
- if (computedWidth) {
574
- dropdownStyle.minWidth = computedWidth;
575
- dropdownStyle.width = computedWidth;
576
- }
577
- renderedDropdown = createPortal(jsx(AnimatePresence, { mode: "wait", children: showFontSizePicker && (jsx(motion.div, { ref: (el) => {
1530
+ const portalStyle = {
1531
+ position: "fixed",
1532
+ top: fontSizePortalPosition.top,
1533
+ left: fontSizePortalPosition.left,
1534
+ zIndex: 1000,
1535
+ ...fontSizePortalCssVars,
1536
+ };
1537
+ const renderedDropdown = isClient
1538
+ ? createPortal(jsx(AnimatePresence, { mode: "wait", children: showFontSizePicker && (jsx(motion.div, { ref: (el) => {
578
1539
  fontSizePortalContentRef.current = el;
579
- }, style: dropdownStyle, variants: shouldReduceMotion ? undefined : fontSizeAnimations, initial: "initial", animate: fontSizePortalReady ? "visible" : "initial", exit: "exit", children: dropdownList })) }), document.body);
580
- }
581
- else {
582
- renderedDropdown = showFontSizePicker ? dropdownList : null;
583
- if (!showFontSizePicker) {
584
- fontSizePortalContentRef.current = null;
585
- }
586
- }
587
- return (jsxs("div", { className: "relative", "data-tool": "fontSize", children: [jsx(Button, { ref: fontSizeTriggerRef, size: "sm", color: "neutral", variant: "ghost", className: cn(themeStyles.toolbarButtonStyle, "px-2 min-w-[3rem] gap-1"), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: (event) => {
1540
+ }, "data-flikkui-portal": "", role: "listbox", className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), themeStyles.dropdownStyle), style: portalStyle, variants: shouldReduceMotion ? undefined : fontSizeAnimations, initial: "initial", animate: fontSizePortalReady ? "visible" : "initial", exit: "exit", children: jsx(SurfaceProvider, { level: surfaceLevel, children: FONT_SIZE_OPTIONS.map((option) => {
1541
+ const selected = option.key === formattingState.fontSize;
1542
+ return (jsx("button", { className: themeStyles.dropdownItemStyle, "data-active": selected ? "true" : "false", onMouseDown: (event) => {
1543
+ event.preventDefault();
1544
+ focusEditor();
1545
+ }, onClick: (event) => {
1546
+ event.preventDefault();
1547
+ event.stopPropagation();
1548
+ handleFontSize(option.key);
1549
+ }, role: "option", "aria-selected": selected, children: jsxs("span", { className: "flex items-center justify-between gap-3", children: [jsx("span", { className: "uppercase text-sm font-medium", children: option.label }), jsxs("span", { className: "text-sm text-[var(--color-text-muted)]", children: [option.px, "px"] })] }) }, option.key));
1550
+ }) }) })) }), document.body)
1551
+ : null;
1552
+ return (jsxs("div", { className: "relative", "data-tool": "fontSize", children: [jsx(Button, { ref: fontSizeTriggerRef, size: "sm", color: "neutral", variant: "soft", className: cn(themeStyles.toolbarButtonStyle, "px-2 min-w-[3rem] gap-1"), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
588
1553
  event.preventDefault();
589
1554
  event.stopPropagation();
590
1555
  focusEditor();
591
- setShowFontSizePicker((previous) => !previous);
592
- setShowColorPicker(false);
593
- }, disabled: isDisabled, "aria-label": "Font size", "aria-expanded": showFontSizePicker, "aria-haspopup": "listbox", children: jsx("span", { className: "text-xs font-medium tracking-wide uppercase", children: currentOption.label }) }), toolbarConfig.position === "floating" ? null : renderedDropdown, toolbarConfig.position === "floating" ? renderedDropdown : null] }, index));
594
- }
595
- case "textColor":
596
- {
597
- const colorDropdownClassName = cn(themeStyles.dropdownStyle, themeStyles.colorPickerStyle);
598
- const colorAnimations = createDropdownAnimations(colorIsFlipped);
599
- const colorDropdownList = (jsx("div", { className: cn(colorDropdownClassName, "p-2"), children: colorOptions.map((color) => (jsx("button", { className: themeStyles.colorSwatchStyle, style: { backgroundColor: color.value }, onMouseDown: (event) => {
1556
+ togglePicker("fontSize");
1557
+ }, disabled: isDisabled, "aria-label": "Font size", "aria-expanded": showFontSizePicker, "aria-haspopup": "listbox", children: jsx("span", { className: "text-sm font-medium tracking-wide uppercase", children: currentOption.label }) }), renderedDropdown] }, toolKey));
1558
+ }
1559
+ case "lineHeight": {
1560
+ const currentOption = getLineHeightOption(formattingState.lineHeight);
1561
+ const portalStyle = {
1562
+ position: "fixed",
1563
+ top: lineHeightPortalPosition.top,
1564
+ left: lineHeightPortalPosition.left,
1565
+ zIndex: 1000,
1566
+ ...lineHeightPortalCssVars,
1567
+ };
1568
+ const renderedDropdown = isClient
1569
+ ? createPortal(jsx(AnimatePresence, { mode: "wait", children: showLineHeightPicker && (jsx(motion.div, { ref: (el) => {
1570
+ lineHeightPortalContentRef.current = el;
1571
+ }, "data-flikkui-portal": "", role: "listbox", className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), themeStyles.dropdownStyle), style: portalStyle, variants: shouldReduceMotion ? undefined : lineHeightAnimations, initial: "initial", animate: lineHeightPortalReady ? "visible" : "initial", exit: "exit", children: jsx(SurfaceProvider, { level: surfaceLevel, children: LINE_HEIGHT_OPTIONS.map((option) => {
1572
+ const selected = option.key === formattingState.lineHeight;
1573
+ return (jsx("button", { className: themeStyles.dropdownItemStyle, "data-active": selected ? "true" : "false", onMouseDown: (event) => {
1574
+ event.preventDefault();
1575
+ focusEditor();
1576
+ }, onClick: (event) => {
1577
+ event.preventDefault();
1578
+ event.stopPropagation();
1579
+ handleLineHeight(option.key);
1580
+ }, role: "option", "aria-selected": selected, children: jsxs("span", { className: "flex items-center justify-between gap-3", children: [jsx("span", { className: "text-sm font-medium", children: option.label }), jsx("span", { className: "text-sm text-[var(--color-text-muted)]", children: option.value })] }) }, option.key));
1581
+ }) }) })) }), document.body)
1582
+ : null;
1583
+ return (jsxs("div", { className: "relative", "data-tool": "lineHeight", children: [jsx(Button, { ref: lineHeightTriggerRef, size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
600
1584
  event.preventDefault();
1585
+ event.stopPropagation();
601
1586
  focusEditor();
602
- }, onClick: (event) => {
1587
+ togglePicker("lineHeight");
1588
+ }, disabled: isDisabled, "aria-label": `Line height (${currentOption.label})`, "aria-expanded": showLineHeightPicker, "aria-haspopup": "listbox", children: jsx(ArrowsUpDownIcon, { className: "w-4 h-4" }) }), renderedDropdown] }, toolKey));
1589
+ }
1590
+ case "letterSpacing": {
1591
+ const currentOption = getLetterSpacingOption(formattingState.letterSpacing);
1592
+ const portalStyle = {
1593
+ position: "fixed",
1594
+ top: letterSpacingPortalPosition.top,
1595
+ left: letterSpacingPortalPosition.left,
1596
+ zIndex: 1000,
1597
+ ...letterSpacingPortalCssVars,
1598
+ };
1599
+ const renderedDropdown = isClient
1600
+ ? createPortal(jsx(AnimatePresence, { mode: "wait", children: showLetterSpacingPicker && (jsx(motion.div, { ref: (el) => {
1601
+ letterSpacingPortalContentRef.current = el;
1602
+ }, "data-flikkui-portal": "", role: "listbox", className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), themeStyles.dropdownStyle), style: portalStyle, variants: shouldReduceMotion ? undefined : letterSpacingAnimations, initial: "initial", animate: letterSpacingPortalReady ? "visible" : "initial", exit: "exit", children: jsx(SurfaceProvider, { level: surfaceLevel, children: LETTER_SPACING_OPTIONS.map((option) => {
1603
+ const selected = option.key === formattingState.letterSpacing;
1604
+ return (jsx("button", { className: themeStyles.dropdownItemStyle, "data-active": selected ? "true" : "false", onMouseDown: (event) => {
1605
+ event.preventDefault();
1606
+ focusEditor();
1607
+ }, onClick: (event) => {
1608
+ event.preventDefault();
1609
+ event.stopPropagation();
1610
+ handleLetterSpacing(option.key);
1611
+ }, role: "option", "aria-selected": selected, children: jsxs("span", { className: "flex items-center justify-between gap-3", children: [jsx("span", { className: "text-sm font-medium", children: option.label }), jsx("span", { className: "text-sm text-[var(--color-text-muted)]", children: option.value })] }) }, option.key));
1612
+ }) }) })) }), document.body)
1613
+ : null;
1614
+ return (jsxs("div", { className: "relative", "data-tool": "letterSpacing", children: [jsx(Button, { ref: letterSpacingTriggerRef, size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
603
1615
  event.preventDefault();
604
1616
  event.stopPropagation();
605
- handleTextColor(color.value);
606
- }, "aria-label": `Set text color to ${color.label}` }, color.value))) }));
607
- let renderedColorDropdown = null;
608
- if (isFloatingToolbar && isClient) {
609
- const triggerWidth = (_b = colorTriggerRef.current) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().width;
610
- const computedWidth = colorPortalPosition.width || triggerWidth || undefined;
611
- const dropdownStyle = {
612
- position: "fixed",
613
- top: colorPortalPosition.top,
614
- left: colorPortalPosition.left,
615
- zIndex: 1000,
616
- ...colorPortalCssVars,
617
- };
618
- if (computedWidth) {
619
- dropdownStyle.minWidth = computedWidth;
620
- dropdownStyle.width = computedWidth;
621
- }
622
- renderedColorDropdown = createPortal(jsx(AnimatePresence, { mode: "wait", children: showColorPicker && (jsx(motion.div, { ref: (el) => {
623
- colorPortalContentRef.current = el;
624
- }, style: dropdownStyle, variants: shouldReduceMotion ? undefined : colorAnimations, initial: "initial", animate: colorPortalReady ? "visible" : "initial", exit: "exit", children: colorDropdownList })) }), document.body);
625
- }
626
- else {
627
- renderedColorDropdown = showColorPicker ? colorDropdownList : null;
628
- if (!showColorPicker) {
629
- colorPortalContentRef.current = null;
630
- }
631
- }
632
- return (jsxs("div", { className: "relative", "data-tool": "textColor", children: [jsx(Button, { ref: colorTriggerRef, size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), onMouseDown: handleMouseDown, onClick: (event) => {
633
- event.preventDefault();
634
- event.stopPropagation();
635
- focusEditor();
636
- setShowFontSizePicker(false);
637
- setShowColorPicker((previous) => !previous);
638
- }, disabled: isDisabled, "aria-label": "Text Color", "aria-expanded": showColorPicker, children: jsx(PaintBrushIcon, { className: "w-4 h-4" }) }), isFloatingToolbar ? null : renderedColorDropdown, isFloatingToolbar ? renderedColorDropdown : null] }, index));
639
- }
1617
+ focusEditor();
1618
+ togglePicker("letterSpacing");
1619
+ }, disabled: isDisabled, "aria-label": `Letter spacing (${currentOption.label})`, "aria-expanded": showLetterSpacingPicker, "aria-haspopup": "listbox", children: jsx(ArrowsRightLeftIcon, { className: "w-4 h-4" }) }), renderedDropdown] }, toolKey));
1620
+ }
1621
+ case "textColor": {
1622
+ const portalStyle = {
1623
+ position: "fixed",
1624
+ top: colorPortalPosition.top,
1625
+ left: colorPortalPosition.left,
1626
+ zIndex: 1000,
1627
+ ...colorPortalCssVars,
1628
+ };
1629
+ const currentToken = formattingState.textColor;
1630
+ // `bgValue` paints the swatch (resolved hex/oklch); `token` is the
1631
+ // Tailwind shade fragment (`rose-500`, `white`, …) used to build
1632
+ // the `text-{token}` class applied to the editor content.
1633
+ const renderSwatch = (bgValue, token, label) => {
1634
+ const isActiveSwatch = token === currentToken;
1635
+ return (jsx("button", { className: themeStyles.colorSwatchStyle, style: { backgroundColor: bgValue }, "data-active": isActiveSwatch ? "true" : "false", onMouseDown: (event) => {
1636
+ event.preventDefault();
1637
+ focusEditor();
1638
+ }, onClick: (event) => {
1639
+ event.preventDefault();
1640
+ event.stopPropagation();
1641
+ handleTextColor(token);
1642
+ }, "aria-label": `Set text color to ${label}` }, `swatch-${label}`));
1643
+ };
1644
+ const renderedColorDropdown = isClient
1645
+ ? createPortal(jsx(AnimatePresence, { mode: "wait", children: showColorPicker && (jsx(motion.div, { ref: (el) => {
1646
+ colorPortalContentRef.current = el;
1647
+ }, "data-flikkui-portal": "", className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), themeStyles.dropdownStyle, "!max-h-none !overflow-visible"), style: portalStyle, variants: shouldReduceMotion ? undefined : colorAnimations, initial: "initial", animate: colorPortalReady ? "visible" : "initial", exit: "exit", children: jsx(SurfaceProvider, { level: surfaceLevel, children: jsx(ScrollArea, { type: "none", className: "max-h-[20rem]", children: jsxs("div", { className: themeStyles.colorPickerStyle, children: [recentColors.length > 0 && (jsxs("div", { className: "flex flex-col gap-1 pb-2 mb-1 border-b border-[var(--color-border)]", children: [jsx("span", { className: "text-[11px] font-medium uppercase tracking-wide text-[var(--color-text-muted)]", children: "Recent" }), jsx("div", { className: "flex gap-0.5", children: recentColors.map((token) => renderSwatch(resolveTailwindColor(token), token, `recent ${token}`)) })] })), jsxs("div", { className: "flex flex-col gap-1", children: [jsx("span", { className: "text-[11px] font-medium uppercase tracking-wide text-[var(--color-text-muted)]", children: "Mono" }), jsx("div", { className: "flex gap-0.5", children: MONO_COLORS.map((color) => renderSwatch(color.value, color.token, color.name)) }), jsx("span", { className: "mt-2 text-[11px] font-medium uppercase tracking-wide text-[var(--color-text-muted)]", children: "Spectrum" }), TAILWIND_COLOR_FAMILIES.map((family) => (jsx("div", { className: "flex gap-0.5", children: getTailwindShadeTokens(family).map((token) => renderSwatch(resolveTailwindColor(token), token, token)) }, family)))] })] }) }) }) })) }), document.body)
1648
+ : null;
1649
+ return (jsxs("div", { className: "relative", "data-tool": "textColor", children: [jsx(Button, { ref: colorTriggerRef, size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), onMouseDown: handleMouseDown, onClick: (event) => {
1650
+ event.preventDefault();
1651
+ event.stopPropagation();
1652
+ focusEditor();
1653
+ togglePicker("color");
1654
+ }, disabled: isDisabled, "aria-label": "Text Color", "aria-expanded": showColorPicker, children: jsx(PaintBrushIcon, { className: "w-4 h-4" }) }), renderedColorDropdown] }, toolKey));
1655
+ }
640
1656
  case "alignLeft":
641
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: (event) => {
1657
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
642
1658
  event.preventDefault();
643
1659
  event.stopPropagation();
644
1660
  handleAlign("left");
645
- }, disabled: isDisabled, "aria-label": "Align Left", "aria-pressed": isActive ? "true" : "false", children: jsx(Bars3BottomLeftIcon, { className: "w-4 h-4" }) }, index));
1661
+ }, disabled: isDisabled, "aria-label": "Align Left", "aria-pressed": isActive ? "true" : "false", children: jsx(Bars3BottomLeftIcon, { className: "w-4 h-4" }) }, toolKey));
646
1662
  case "alignCenter":
647
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: (event) => {
1663
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
648
1664
  event.preventDefault();
649
1665
  event.stopPropagation();
650
1666
  handleAlign("center");
651
- }, disabled: isDisabled, "aria-label": "Align Center", "aria-pressed": isActive ? "true" : "false", children: jsx(Bars3Icon, { className: "w-4 h-4" }) }, index));
1667
+ }, disabled: isDisabled, "aria-label": "Align Center", "aria-pressed": isActive ? "true" : "false", children: jsx(Bars3Icon, { className: "w-4 h-4" }) }, toolKey));
652
1668
  case "alignRight":
653
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", "data-pressed": isActive ? "true" : "false", onMouseDown: handleMouseDown, onClick: (event) => {
1669
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: (event) => {
654
1670
  event.preventDefault();
655
1671
  event.stopPropagation();
656
1672
  handleAlign("right");
657
- }, disabled: isDisabled, "aria-label": "Align Right", "aria-pressed": isActive ? "true" : "false", children: jsx(Bars3BottomRightIcon, { className: "w-4 h-4" }) }, index));
1673
+ }, disabled: isDisabled, "aria-label": "Align Right", "aria-pressed": isActive ? "true" : "false", children: jsx(Bars3BottomRightIcon, { className: "w-4 h-4" }) }, toolKey));
658
1674
  case "undo":
659
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), onMouseDown: handleMouseDown, onClick: handleUndo, disabled: isDisabled, "aria-label": "Undo", children: jsx(ArrowUturnLeftIcon, { className: "w-4 h-4" }) }, index));
1675
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), onMouseDown: handleMouseDown, onClick: handleUndo, disabled: isDisabled, "aria-label": "Undo", children: jsx(ArrowUturnLeftIcon, { className: "w-4 h-4" }) }, toolKey));
660
1676
  case "redo":
661
- return (jsx(Button, { size: "sm", color: "neutral", variant: "ghost", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), onMouseDown: handleMouseDown, onClick: handleRedo, disabled: isDisabled, "aria-label": "Redo", children: jsx(ArrowUturnRightIcon, { className: "w-4 h-4" }) }, index));
1677
+ return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), onMouseDown: handleMouseDown, onClick: handleRedo, disabled: isDisabled, "aria-label": "Redo", children: jsx(ArrowUturnRightIcon, { className: "w-4 h-4" }) }, toolKey));
662
1678
  case "separator":
663
- return jsx("div", { className: themeStyles.separatorStyle }, index);
1679
+ return jsx("div", { className: themeStyles.separatorStyle }, toolKey);
664
1680
  default:
665
1681
  return null;
666
1682
  }
@@ -668,14 +1684,13 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
668
1684
  const renderToolbar = () => {
669
1685
  if (!toolbarConfig.show || !toolbarConfig.tools)
670
1686
  return null;
671
- const toolbarClass = cn(themeStyles.toolbarStyle, toolbarConfig.className);
672
- const toolbarContent = (jsx("div", { ref: toolbarRef, className: toolbarClass, children: toolbarConfig.tools.map((tool, index) => renderToolbarTool(tool, index)) }));
1687
+ const tools = toolbarConfig.tools.map((tool, index) => renderToolbarTool(tool, `${tool}-${index}`));
673
1688
  if (toolbarConfig.position === "floating") {
674
- return (jsx(AnimatePresence, { mode: "wait", children: showToolbar && (jsx(motion.div, { variants: shouldReduceMotion ? undefined : floatingToolbarVariants, initial: "initial", animate: "animate", exit: "exit", className: "bg-white/70 backdrop-blur-sm shadow-2xl rounded-xl border border-[var(--color-border)] overflow-hidden", style: { position: "absolute", top: toolbarPosition.top, left: toolbarPosition.left, zIndex: 50 }, children: toolbarContent }, "floating-toolbar")) }));
1689
+ return (jsx(AnimatePresence, { mode: "wait", children: showToolbar && (jsx(motion.div, { ref: toolbarRef, variants: shouldReduceMotion ? undefined : floatingToolbarVariants, initial: "initial", animate: "animate", exit: "exit", className: cn(surfaceClasses(surfaceLevel, { translucent: true }), themeStyles.floatingToolbarStyle, toolbarConfig.className), style: { position: "absolute", top: toolbarPosition.top, left: toolbarPosition.left, zIndex: 50 }, children: jsx(SurfaceProvider, { level: surfaceLevel, children: tools }) }, "floating-toolbar")) }));
675
1690
  }
676
- return toolbarContent;
1691
+ return (jsx("div", { ref: toolbarRef, className: cn(themeStyles.toolbarStyle, toolbarConfig.className), children: tools }));
677
1692
  };
678
- return (jsxs("div", { className: cn(themeStyles.wrapperStyle, className), ...props, children: [label && (jsx("div", { className: "mb-1", children: jsx(FormLabel, { htmlFor: editorId, className: labelClassName, state: state, required: required, children: label }) })), jsxs("div", { className: "relative", children: [jsxs("div", { className: cn(themeStyles.containerStyle, themeStyles.states[state], themeStyles.sizes[size]), "data-state": getDataState(), children: [toolbarConfig.position === "top" && renderToolbar(), jsx("div", { ref: (el) => {
1693
+ return (jsxs("div", { className: cn(themeStyles.wrapperStyle, className), ...props, children: [label && (typeof label === 'string' ? (jsx("div", { className: "mb-1", children: jsx(FormLabel, { htmlFor: editorId, className: labelClassName, state: state, required: required, children: label }) })) : (label)), jsxs("div", { className: "relative", children: [jsxs("div", { className: cn(themeStyles.containerStyle, themeStyles.states[state], themeStyles.sizes[size]), "data-state": getDataState(), children: [toolbarConfig.position === "top" && renderToolbar(), jsx("div", { ref: (el) => {
679
1694
  if (el) {
680
1695
  editorRef.current = el;
681
1696
  if (typeof ref === "function") {
@@ -693,10 +1708,9 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
693
1708
  if (toolbarConfig.position === "floating") {
694
1709
  setShowToolbar(false);
695
1710
  }
696
- setShowColorPicker(false);
697
- setShowFontSizePicker(false);
698
- }, "aria-invalid": isInvalid, "aria-required": required, role: "textbox", "aria-multiline": "true", "aria-label": label || "Rich text editor", suppressContentEditableWarning: true })] }), toolbarConfig.position === "floating" && renderToolbar()] }), helperText && (jsx("div", { className: cn(themeStyles.helperText, helperTextClassName), children: helperText }))] }));
1711
+ closeAllPickers();
1712
+ }, "aria-invalid": isInvalid, "aria-required": required, "aria-describedby": displayedMessage ? messageId : undefined, role: "textbox", "aria-multiline": "true", "aria-label": typeof label === 'string' ? label : "Rich text editor", suppressContentEditableWarning: true })] }), toolbarConfig.position === "floating" && renderToolbar()] }), displayedMessage && (typeof displayedMessage === 'string' ? (jsx("div", { id: messageId, role: isInvalid ? "alert" : undefined, className: cn(themeStyles.helperText, helperTextClassName), children: displayedMessage })) : (displayedMessage))] }));
699
1713
  });
700
1714
  RichTextEditor.displayName = "RichTextEditor";
701
1715
 
702
- export { RichTextEditor };
1716
+ export { DEFAULT_FONT_FAMILY_OPTIONS, RichTextEditor, loadGoogleFont };