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

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 (418) hide show
  1. package/dist/bg/1.webp +0 -0
  2. package/dist/bg/10.webp +0 -0
  3. package/dist/bg/11.webp +0 -0
  4. package/dist/bg/12.webp +0 -0
  5. package/dist/bg/13.webp +0 -0
  6. package/dist/bg/14.webp +0 -0
  7. package/dist/bg/15.webp +0 -0
  8. package/dist/bg/16.webp +0 -0
  9. package/dist/bg/17.webp +0 -0
  10. package/dist/bg/18.webp +0 -0
  11. package/dist/bg/19.webp +0 -0
  12. package/dist/bg/2.webp +0 -0
  13. package/dist/bg/20.webp +0 -0
  14. package/dist/bg/21.webp +0 -0
  15. package/dist/bg/22.webp +0 -0
  16. package/dist/bg/3.webp +0 -0
  17. package/dist/bg/4.webp +0 -0
  18. package/dist/bg/5.webp +0 -0
  19. package/dist/bg/6.webp +0 -0
  20. package/dist/bg/7.webp +0 -0
  21. package/dist/bg/8.webp +0 -0
  22. package/dist/bg/9.webp +0 -0
  23. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
  24. package/dist/components/ai/PromptInput/PromptInput.js +7 -140
  25. package/dist/components/ai/PromptInput/VoiceRecorder.js +0 -85
  26. package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
  27. package/dist/components/canvas/Background.d.ts +19 -0
  28. package/dist/components/canvas/Background.js +23 -0
  29. package/dist/components/canvas/BaseNode.d.ts +15 -0
  30. package/dist/components/canvas/BaseNode.js +20 -0
  31. package/dist/components/canvas/CanvasToolbar.d.ts +34 -0
  32. package/dist/components/canvas/CanvasToolbar.js +34 -0
  33. package/dist/components/canvas/Edge.d.ts +35 -0
  34. package/dist/components/canvas/Edge.js +97 -0
  35. package/dist/components/canvas/EdgeLayer.d.ts +18 -0
  36. package/dist/components/canvas/EdgeLayer.js +111 -0
  37. package/dist/components/canvas/Handle.d.ts +11 -0
  38. package/dist/components/canvas/Handle.js +63 -0
  39. package/dist/components/canvas/MiniMap.d.ts +22 -0
  40. package/dist/components/canvas/MiniMap.js +105 -0
  41. package/dist/components/canvas/NodeCanvas.d.ts +10 -0
  42. package/dist/components/canvas/NodeCanvas.js +477 -0
  43. package/dist/components/canvas/NodeCanvas.theme.d.ts +7 -0
  44. package/dist/components/canvas/NodeCanvas.theme.js +9 -0
  45. package/dist/components/canvas/NodeCanvas.types.d.ts +187 -0
  46. package/dist/components/canvas/NodeControls.d.ts +25 -0
  47. package/dist/components/canvas/NodeControls.js +40 -0
  48. package/dist/components/canvas/NodeRenderer.d.ts +19 -0
  49. package/dist/components/canvas/NodeRenderer.js +117 -0
  50. package/dist/components/canvas/changes.d.ts +11 -0
  51. package/dist/components/canvas/changes.js +76 -0
  52. package/dist/components/canvas/context/CanvasContext.d.ts +32 -0
  53. package/dist/components/canvas/context/CanvasContext.js +14 -0
  54. package/dist/components/canvas/context/ConnectionContext.d.ts +33 -0
  55. package/dist/components/canvas/context/ConnectionContext.js +13 -0
  56. package/dist/components/canvas/context/HandleRegistry.d.ts +24 -0
  57. package/dist/components/canvas/context/HandleRegistry.js +15 -0
  58. package/dist/components/canvas/context/InteractionContext.d.ts +18 -0
  59. package/dist/components/canvas/context/InteractionContext.js +14 -0
  60. package/dist/components/canvas/context/NodeIdContext.d.ts +3 -0
  61. package/dist/components/canvas/context/NodeIdContext.js +15 -0
  62. package/dist/components/canvas/hooks/useConnection.d.ts +17 -0
  63. package/dist/components/canvas/hooks/useConnection.js +29 -0
  64. package/dist/components/canvas/hooks/useMarquee.d.ts +25 -0
  65. package/dist/components/canvas/hooks/useMarquee.js +91 -0
  66. package/dist/components/canvas/hooks/useNodeDrag.d.ts +23 -0
  67. package/dist/components/canvas/hooks/useNodeDrag.js +110 -0
  68. package/dist/components/canvas/hooks/usePanZoom.d.ts +30 -0
  69. package/dist/components/canvas/hooks/usePanZoom.js +189 -0
  70. package/dist/components/canvas/hooks/useViewport.d.ts +21 -0
  71. package/dist/components/canvas/hooks/useViewport.js +35 -0
  72. package/dist/components/canvas/index.d.ts +14 -0
  73. package/dist/components/canvas/index.js +12 -0
  74. package/dist/components/canvas/layout.d.ts +22 -0
  75. package/dist/components/canvas/layout.js +67 -0
  76. package/dist/components/canvas/utils.d.ts +4 -0
  77. package/dist/components/canvas/utils.js +16 -0
  78. package/dist/components/charts/AreaChart/AreaChart.js +136 -101
  79. package/dist/components/charts/AreaChart/AreaChart.types.d.ts +5 -5
  80. package/dist/components/charts/AreaChart/AreaChart.types.js +1 -0
  81. package/dist/components/charts/BarChart/BarChart.js +207 -143
  82. package/dist/components/charts/BarChart/BarChart.types.d.ts +4 -4
  83. package/dist/components/charts/BarChart/BarChart.types.js +1 -0
  84. package/dist/components/charts/ComboChart/ComboChart.types.d.ts +2 -2
  85. package/dist/components/charts/LineChart/LineChart.js +88 -72
  86. package/dist/components/charts/LineChart/LineChart.types.d.ts +3 -3
  87. package/dist/components/charts/RadarChart/RadarChart.js +1 -1
  88. package/dist/components/charts/RadarChart/RadarChart.theme.js +5 -2
  89. package/dist/components/charts/ScatterPlot/ScatterPlot.js +62 -72
  90. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +10 -1
  91. package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +3 -9
  92. package/dist/components/charts/StackedBarChart/StackedBarChart.js +33 -33
  93. package/dist/components/charts/StackedBarChart/StackedBarChart.types.d.ts +2 -2
  94. package/dist/components/charts/hooks/index.d.ts +2 -0
  95. package/dist/components/charts/hooks/useChartDimensions.d.ts +29 -0
  96. package/dist/components/charts/hooks/useChartDimensions.js +42 -0
  97. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.theme.js +1 -1
  98. package/dist/components/charts/types/chart.types.d.ts +11 -2
  99. package/dist/components/charts/types/chart.types.js +10 -3
  100. package/dist/components/core/Avatar/Avatar.js +5 -1
  101. package/dist/components/core/AvatarGroup/AvatarGroup.js +5 -1
  102. package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +4 -2
  103. package/dist/components/core/Badge/Badge.js +1 -1
  104. package/dist/components/core/Badge/Badge.theme.js +16 -15
  105. package/dist/components/core/Button/Button.js +1 -1
  106. package/dist/components/core/Button/Button.theme.js +3 -3
  107. package/dist/components/core/Calendar/Calendar.theme.js +1 -1
  108. package/dist/components/core/Card/Card.js +7 -3
  109. package/dist/components/core/Card/Card.theme.js +3 -3
  110. package/dist/components/core/Card/Card.types.d.ts +27 -2
  111. package/dist/components/core/CommandPalette/CommandItem.js +4 -5
  112. package/dist/components/core/CommandPalette/CommandPalette.js +1 -1
  113. package/dist/components/core/CommandPalette/CommandPalette.theme.js +11 -13
  114. package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +0 -2
  115. package/dist/components/core/ContextMenu/ContextMenu.theme.js +14 -15
  116. package/dist/components/core/ContextMenu/ContextMenuItem.js +1 -1
  117. package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +1 -1
  118. package/dist/components/core/DotSeparator/DotSeparator.d.ts +3 -0
  119. package/dist/components/core/DotSeparator/DotSeparator.js +19 -0
  120. package/dist/components/core/DotSeparator/DotSeparator.theme.d.ts +2 -0
  121. package/dist/components/core/DotSeparator/DotSeparator.theme.js +10 -0
  122. package/dist/components/core/DotSeparator/DotSeparator.types.d.ts +25 -0
  123. package/dist/components/core/DotSeparator/index.d.ts +3 -0
  124. package/dist/components/core/Dropdown/Dropdown.theme.js +5 -6
  125. package/dist/components/core/Dropdown/DropdownItem.js +1 -1
  126. package/dist/components/core/Dropdown/DropdownMenu.js +58 -30
  127. package/dist/components/core/HeroCard/HeroCard.d.ts +5 -0
  128. package/dist/components/core/HeroCard/HeroCard.js +99 -0
  129. package/dist/components/core/HeroCard/HeroCard.theme.d.ts +3 -0
  130. package/dist/components/core/HeroCard/HeroCard.theme.js +8 -0
  131. package/dist/components/core/HeroCard/HeroCard.types.d.ts +70 -0
  132. package/dist/components/core/HeroCard/index.d.ts +4 -0
  133. package/dist/components/core/Kbd/Kbd.theme.js +1 -1
  134. package/dist/components/core/MenuItem/MenuItem.js +5 -2
  135. package/dist/components/core/MenuItem/MenuItem.theme.d.ts +6 -0
  136. package/dist/components/core/MenuItem/MenuItem.theme.js +19 -16
  137. package/dist/components/core/MenuItem/MenuItem.types.d.ts +2 -0
  138. package/dist/components/core/Modal/Modal.d.ts +1 -1
  139. package/dist/components/core/Modal/Modal.js +2 -7
  140. package/dist/components/core/Modal/Modal.theme.js +4 -8
  141. package/dist/components/core/Modal/Modal.types.d.ts +0 -10
  142. package/dist/components/core/Modal/index.d.ts +1 -1
  143. package/dist/components/core/ModalStack/ModalStack.d.ts +1 -1
  144. package/dist/components/core/ModalStack/ModalStack.types.d.ts +1 -2
  145. package/dist/components/core/ModalStack/ModalStackModal.d.ts +1 -1
  146. package/dist/components/core/ModalStack/ModalStackModal.js +2 -7
  147. package/dist/components/core/NavItem/NavItem.js +20 -4
  148. package/dist/components/core/NavItem/NavItem.theme.js +13 -2
  149. package/dist/components/core/PageHeading/PageHeading.theme.js +2 -2
  150. package/dist/components/core/Popover/Popover.theme.js +1 -1
  151. package/dist/components/core/Popover/Popover.types.d.ts +6 -2
  152. package/dist/components/core/Popover/PopoverBody.js +10 -3
  153. package/dist/components/core/ScrollArea/ScrollArea.js +242 -4
  154. package/dist/components/core/ScrollArea/ScrollArea.types.d.ts +12 -1
  155. package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.d.ts +4 -0
  156. package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.js +23 -0
  157. package/dist/components/core/ScrollArea/smooth/useSmoothScroll.js +4 -0
  158. package/dist/components/core/ScrollArea/smooth/useSmoothScroll.types.d.ts +5 -0
  159. package/dist/components/core/Segmented/Segmented.theme.js +2 -2
  160. package/dist/components/core/Sidebar/Sidebar.d.ts +2 -0
  161. package/dist/components/core/Sidebar/Sidebar.js +15 -7
  162. package/dist/components/core/Sidebar/Sidebar.types.d.ts +92 -4
  163. package/dist/components/core/Sidebar/SidebarCard.d.ts +25 -0
  164. package/dist/components/core/Sidebar/SidebarCard.js +68 -0
  165. package/dist/components/core/Sidebar/SidebarCard.theme.d.ts +8 -0
  166. package/dist/components/core/Sidebar/SidebarCard.theme.js +18 -0
  167. package/dist/components/core/Sidebar/SidebarContent.js +5 -1
  168. package/dist/components/core/Sidebar/SidebarContext.js +1 -1
  169. package/dist/components/core/Sidebar/SidebarHeader.js +10 -2
  170. package/dist/components/core/Sidebar/SidebarLogo.js +38 -3
  171. package/dist/components/core/Sidebar/SidebarSearch.d.ts +22 -0
  172. package/dist/components/core/Sidebar/SidebarSearch.js +135 -0
  173. package/dist/components/core/Sidebar/SidebarToggle.js +1 -1
  174. package/dist/components/core/Sidebar/SidebarUserProfile.js +2 -2
  175. package/dist/components/core/Sidebar/index.d.ts +3 -1
  176. package/dist/components/core/Tag/Tag.js +29 -5
  177. package/dist/components/core/Tag/Tag.theme.js +13 -8
  178. package/dist/components/core/Tag/Tag.types.d.ts +7 -0
  179. package/dist/components/core/Tooltip/Tooltip.js +1 -1
  180. package/dist/components/core/Tooltip/Tooltip.theme.js +1 -2
  181. package/dist/components/core/index.d.ts +2 -0
  182. package/dist/components/core/index.js +6 -0
  183. package/dist/components/data-display/DescriptionList/DescriptionList.js +23 -7
  184. package/dist/components/data-display/DescriptionList/DescriptionList.theme.js +10 -3
  185. package/dist/components/data-display/DescriptionList/DescriptionList.types.d.ts +49 -10
  186. package/dist/components/data-display/DescriptionList/index.d.ts +1 -1
  187. package/dist/components/data-display/Feed/Feed.js +28 -5
  188. package/dist/components/data-display/Feed/Feed.theme.js +1 -1
  189. package/dist/components/data-display/Feed/Feed.types.d.ts +32 -1
  190. package/dist/components/data-display/Feed/index.d.ts +1 -1
  191. package/dist/components/data-display/GanttChart/GanttChart.d.ts +1 -1
  192. package/dist/components/data-display/GanttChart/GanttChart.js +31 -4
  193. package/dist/components/data-display/GanttChart/GanttChart.theme.js +19 -17
  194. package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +19 -0
  195. package/dist/components/data-display/GanttChart/GanttChart.utils.js +1 -1
  196. package/dist/components/data-display/GanttChart/GanttChartPanel.d.ts +1 -1
  197. package/dist/components/data-display/GanttChart/GanttChartPanel.js +3 -3
  198. package/dist/components/data-display/GanttChart/GanttDependencyArrows.js +7 -4
  199. package/dist/components/data-display/GanttChart/GanttMilestone.js +5 -5
  200. package/dist/components/data-display/GanttChart/GanttTablePanel.js +1 -1
  201. package/dist/components/data-display/GanttChart/GanttTableTaskRow.js +2 -2
  202. package/dist/components/data-display/GanttChart/GanttTaskBar.js +37 -16
  203. package/dist/components/data-display/GanttChart/GanttTimelineGrid.js +2 -1
  204. package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +35 -11
  205. package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -2
  206. package/dist/components/data-display/GanttChart/hooks/useGanttDrag.js +3 -2
  207. package/dist/components/data-display/GanttChart/index.d.ts +1 -1
  208. package/dist/components/data-display/Metric/Metric.js +8 -8
  209. package/dist/components/data-display/Metric/Metric.theme.d.ts +3 -2
  210. package/dist/components/data-display/Metric/Metric.theme.js +50 -68
  211. package/dist/components/data-display/Metric/Metric.types.d.ts +19 -21
  212. package/dist/components/data-display/Table/Table.js +2 -2
  213. package/dist/components/data-display/Table/Table.theme.js +27 -9
  214. package/dist/components/data-display/Table/Table.types.d.ts +8 -0
  215. package/dist/components/data-display/Table/TableBody.js +2 -2
  216. package/dist/components/data-display/Table/TableCell.js +1 -1
  217. package/dist/components/data-display/Table/TableRow.d.ts +1 -1
  218. package/dist/components/data-display/Table/TableRow.js +9 -2
  219. package/dist/components/data-display/Timeline/Timeline.js +27 -5
  220. package/dist/components/data-display/Timeline/Timeline.theme.d.ts +10 -2
  221. package/dist/components/data-display/Timeline/Timeline.theme.js +14 -8
  222. package/dist/components/data-display/Timeline/Timeline.types.d.ts +48 -16
  223. package/dist/components/data-display/Timeline/Timeline.utils.d.ts +6 -0
  224. package/dist/components/data-display/Timeline/Timeline.utils.js +11 -0
  225. package/dist/components/data-display/Timeline/TimelineItem.js +13 -20
  226. package/dist/components/data-display/Timeline/TimelineMarker.js +10 -8
  227. package/dist/components/data-display/Timeline/index.d.ts +2 -2
  228. package/dist/components/effects/3d/index.d.ts +0 -2
  229. package/dist/components/effects/3d/index.js +0 -1
  230. package/dist/components/effects/Aurora/Aurora.d.ts +6 -17
  231. package/dist/components/effects/Aurora/Aurora.js +297 -131
  232. package/dist/components/effects/Aurora/Aurora.types.d.ts +6 -0
  233. package/dist/components/effects/DotPattern/DotPattern.js +1 -1
  234. package/dist/components/effects/Overlay/Overlay.theme.js +1 -2
  235. package/dist/components/effects/Preloader/Preloader.animations.d.ts +23 -0
  236. package/dist/components/effects/Preloader/Preloader.animations.js +150 -0
  237. package/dist/components/effects/Preloader/Preloader.d.ts +3 -0
  238. package/dist/components/effects/Preloader/Preloader.js +119 -0
  239. package/dist/components/effects/Preloader/Preloader.types.d.ts +63 -0
  240. package/dist/components/effects/Preloader/index.d.ts +2 -0
  241. package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.js +25 -14
  242. package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.types.d.ts +2 -0
  243. package/dist/components/effects/TiltCard/TiltCard.d.ts +12 -0
  244. package/dist/components/effects/TiltCard/TiltCard.glow.d.ts +28 -0
  245. package/dist/components/effects/TiltCard/TiltCard.glow.js +114 -0
  246. package/dist/components/effects/TiltCard/TiltCard.js +177 -0
  247. package/dist/components/effects/{SpotlightBorder/SpotlightBorder.shaders.d.ts → TiltCard/TiltCard.shaders.d.ts} +1 -1
  248. package/dist/components/effects/{SpotlightBorder/SpotlightBorder.shaders.js → TiltCard/TiltCard.shaders.js} +1 -1
  249. package/dist/components/effects/TiltCard/TiltCard.types.d.ts +88 -0
  250. package/dist/components/effects/TiltCard/index.d.ts +2 -0
  251. package/dist/components/effects/index.d.ts +4 -12
  252. package/dist/components/effects/index.js +2 -6
  253. package/dist/components/forms/Checkbox/Checkbox.js +7 -1
  254. package/dist/components/forms/Combobox/Combobox.js +1 -1
  255. package/dist/components/forms/Combobox/Combobox.theme.js +2 -4
  256. package/dist/components/forms/DatePicker/DatePicker.theme.js +11 -18
  257. package/dist/components/forms/DatePicker/DatePickerTrigger.js +1 -1
  258. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +6 -13
  259. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +1 -1
  260. package/dist/components/forms/FileUpload/FileUpload.animations.d.ts +29 -0
  261. package/dist/components/forms/FileUpload/FileUpload.animations.js +19 -0
  262. package/dist/components/forms/FileUpload/FileUpload.js +85 -134
  263. package/dist/components/forms/FileUpload/FileUpload.theme.d.ts +2 -10
  264. package/dist/components/forms/FileUpload/FileUpload.theme.js +16 -30
  265. package/dist/components/forms/FileUpload/FileUpload.types.d.ts +26 -10
  266. package/dist/components/forms/FormLabel/FormLabel.theme.js +1 -1
  267. package/dist/components/forms/Input/Input.theme.js +13 -10
  268. package/dist/components/forms/InputCounter/InputCounter.theme.js +1 -1
  269. package/dist/components/forms/Mention/Mention.js +152 -57
  270. package/dist/components/forms/Mention/Mention.theme.js +16 -23
  271. package/dist/components/forms/Mention/Mention.types.d.ts +12 -12
  272. package/dist/components/forms/Mention/Mention.utils.js +32 -4
  273. package/dist/components/forms/RichTextEditor/RichTextEditor.js +3 -3
  274. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +5 -5
  275. package/dist/components/forms/Select/Select.js +2 -2
  276. package/dist/components/forms/Select/Select.theme.js +3 -3
  277. package/dist/components/forms/Slider/Slider.theme.js +1 -1
  278. package/dist/components/forms/Switch/Switch.js +27 -15
  279. package/dist/components/forms/Switch/Switch.theme.d.ts +36 -6
  280. package/dist/components/forms/Switch/Switch.theme.js +33 -4
  281. package/dist/components/forms/Switch/Switch.types.d.ts +12 -2
  282. package/dist/components/forms/TimePicker/TimePicker.theme.js +1 -2
  283. package/dist/components/forms/TimePicker/TimePickerContent.js +1 -87
  284. package/dist/components/forms/TimePicker/TimePickerTrigger.js +1 -1
  285. package/dist/components/forms/forms.theme.js +21 -16
  286. package/dist/components/forms/index.d.ts +0 -4
  287. package/dist/components/forms/index.js +0 -89
  288. package/dist/components/generative/GenerativeView.d.ts +21 -0
  289. package/dist/components/generative/GenerativeView.js +116 -0
  290. package/dist/components/generative/actions.d.ts +26 -0
  291. package/dist/components/generative/actions.js +51 -0
  292. package/dist/components/generative/index.d.ts +11 -0
  293. package/dist/components/generative/index.js +9 -0
  294. package/dist/components/generative/registry.d.ts +43 -0
  295. package/dist/components/generative/registry.js +114 -0
  296. package/dist/components/generative/resolvers.d.ts +35 -0
  297. package/dist/components/generative/resolvers.js +93 -0
  298. package/dist/components/generative/schema.generated.d.ts +2 -0
  299. package/dist/components/generative/schema.generated.js +1639 -0
  300. package/dist/components/generative/schemaTypes.d.ts +30 -0
  301. package/dist/components/generative/streaming.d.ts +39 -0
  302. package/dist/components/generative/streaming.js +283 -0
  303. package/dist/components/generative/tools.d.ts +21 -0
  304. package/dist/components/generative/tools.js +54 -0
  305. package/dist/components/generative/types.d.ts +41 -0
  306. package/dist/components/generative/useGenerativeStream.d.ts +37 -0
  307. package/dist/components/generative/useGenerativeStream.js +36 -0
  308. package/dist/components/generative/validate.d.ts +24 -0
  309. package/dist/components/generative/validate.js +259 -0
  310. package/dist/components/layout/AppShell/AppShell.d.ts +10 -0
  311. package/dist/components/layout/AppShell/AppShell.js +84 -0
  312. package/dist/components/layout/AppShell/AppShell.theme.d.ts +3 -0
  313. package/dist/components/layout/AppShell/AppShell.theme.js +42 -0
  314. package/dist/components/layout/AppShell/AppShell.types.d.ts +127 -0
  315. package/dist/components/layout/AppShell/AppShellContext.d.ts +14 -0
  316. package/dist/components/layout/AppShell/AppShellContext.js +19 -0
  317. package/dist/components/layout/AppShell/AppShellFooter.d.ts +3 -0
  318. package/dist/components/layout/AppShell/AppShellFooter.js +12 -0
  319. package/dist/components/layout/AppShell/AppShellHeader.d.ts +3 -0
  320. package/dist/components/layout/AppShell/AppShellHeader.js +12 -0
  321. package/dist/components/layout/AppShell/AppShellMain.d.ts +3 -0
  322. package/dist/components/layout/AppShell/AppShellMain.js +19 -0
  323. package/dist/components/layout/AppShell/AppShellRightPanel.d.ts +3 -0
  324. package/dist/components/layout/AppShell/AppShellRightPanel.js +16 -0
  325. package/dist/components/layout/AppShell/AppShellSidebar.d.ts +3 -0
  326. package/dist/components/layout/AppShell/AppShellSidebar.js +16 -0
  327. package/dist/components/layout/AppShell/AppShellTopbar.d.ts +3 -0
  328. package/dist/components/layout/AppShell/AppShellTopbar.js +12 -0
  329. package/dist/components/layout/AppShell/index.d.ts +3 -0
  330. package/dist/components/layout/FormLayout/FormLayout.js +1 -87
  331. package/dist/components/layout/Grid/Grid.d.ts +3 -0
  332. package/dist/components/layout/Grid/Grid.js +50 -0
  333. package/dist/components/layout/Grid/Grid.theme.d.ts +2 -0
  334. package/dist/components/layout/Grid/Grid.theme.js +35 -0
  335. package/dist/components/layout/Grid/Grid.types.d.ts +57 -0
  336. package/dist/components/layout/Grid/index.d.ts +3 -0
  337. package/dist/components/layout/Section/Section.d.ts +3 -0
  338. package/dist/components/layout/Section/Section.js +18 -0
  339. package/dist/components/layout/Section/Section.theme.d.ts +2 -0
  340. package/dist/components/layout/Section/Section.theme.js +10 -0
  341. package/dist/components/layout/Section/Section.types.d.ts +34 -0
  342. package/dist/components/layout/Section/index.d.ts +3 -0
  343. package/dist/components/layout/Stack/Stack.d.ts +3 -0
  344. package/dist/components/layout/Stack/Stack.js +19 -0
  345. package/dist/components/layout/Stack/Stack.theme.d.ts +2 -0
  346. package/dist/components/layout/Stack/Stack.theme.js +10 -0
  347. package/dist/components/layout/Stack/Stack.types.d.ts +39 -0
  348. package/dist/components/layout/Stack/index.d.ts +3 -0
  349. package/dist/components/layout/index.d.ts +4 -0
  350. package/dist/components/layout/index.js +8 -0
  351. package/dist/generative.schema.json +1637 -0
  352. package/dist/hooks/useSelectPortal.d.ts +10 -2
  353. package/dist/hooks/useSelectPortal.js +45 -24
  354. package/dist/index.js +180 -174
  355. package/dist/registry.json +10205 -0
  356. package/dist/styles.css +1 -1
  357. package/dist/tools.json +1731 -0
  358. package/dist/utils/dateUtils.js +11 -1
  359. package/package.json +19 -4
  360. package/src/global.scss +82 -109
  361. package/src/styles/theme.css +707 -474
  362. package/dist/bg/1.jpg +0 -0
  363. package/dist/bg/10.jpg +0 -0
  364. package/dist/bg/11.jpg +0 -0
  365. package/dist/bg/14.jpg +0 -0
  366. package/dist/bg/15.jpg +0 -0
  367. package/dist/bg/16.jpg +0 -0
  368. package/dist/bg/17.jpg +0 -0
  369. package/dist/bg/18.jpg +0 -0
  370. package/dist/bg/19.jpg +0 -0
  371. package/dist/bg/2.jpg +0 -0
  372. package/dist/bg/20.jpg +0 -0
  373. package/dist/bg/21.jpg +0 -0
  374. package/dist/bg/22.jpg +0 -0
  375. package/dist/bg/23.jpg +0 -0
  376. package/dist/bg/24.jpg +0 -0
  377. package/dist/bg/3.jpg +0 -0
  378. package/dist/bg/4.jpg +0 -0
  379. package/dist/bg/5.jpg +0 -0
  380. package/dist/bg/6.jpg +0 -0
  381. package/dist/bg/7.jpg +0 -0
  382. package/dist/bg/8.jpg +0 -0
  383. package/dist/bg/9.jpg +0 -0
  384. package/dist/components/effects/MorphingText/MorphingText.d.ts +0 -17
  385. package/dist/components/effects/MorphingText/MorphingText.js +0 -125
  386. package/dist/components/effects/MorphingText/MorphingText.types.d.ts +0 -18
  387. package/dist/components/effects/MorphingText/index.d.ts +0 -2
  388. package/dist/components/effects/PageTransition/PageTransition.animations.d.ts +0 -8
  389. package/dist/components/effects/PageTransition/PageTransition.animations.js +0 -53
  390. package/dist/components/effects/PageTransition/PageTransition.d.ts +0 -3
  391. package/dist/components/effects/PageTransition/PageTransition.js +0 -82
  392. package/dist/components/effects/PageTransition/PageTransition.types.d.ts +0 -15
  393. package/dist/components/effects/PageTransition/index.d.ts +0 -2
  394. package/dist/components/effects/ParallaxSection/ParallaxSection.d.ts +0 -26
  395. package/dist/components/effects/ParallaxSection/ParallaxSection.js +0 -71
  396. package/dist/components/effects/ParallaxSection/ParallaxSection.types.d.ts +0 -11
  397. package/dist/components/effects/ParallaxSection/index.d.ts +0 -2
  398. package/dist/components/effects/Spotlight/Spotlight.d.ts +0 -36
  399. package/dist/components/effects/Spotlight/Spotlight.js +0 -112
  400. package/dist/components/effects/Spotlight/Spotlight.types.d.ts +0 -29
  401. package/dist/components/effects/Spotlight/index.d.ts +0 -2
  402. package/dist/components/effects/SpotlightBorder/SpotlightBorder.d.ts +0 -18
  403. package/dist/components/effects/SpotlightBorder/SpotlightBorder.js +0 -213
  404. package/dist/components/effects/SpotlightBorder/SpotlightBorder.types.d.ts +0 -61
  405. package/dist/components/effects/SpotlightBorder/index.d.ts +0 -2
  406. package/dist/components/effects/StickyScroll/StickyScroll.d.ts +0 -30
  407. package/dist/components/effects/StickyScroll/StickyScroll.js +0 -128
  408. package/dist/components/effects/StickyScroll/StickyScroll.types.d.ts +0 -19
  409. package/dist/components/effects/StickyScroll/index.d.ts +0 -2
  410. package/dist/components/forms/CronInput/CronInput.d.ts +0 -3
  411. package/dist/components/forms/CronInput/CronInput.js +0 -113
  412. package/dist/components/forms/CronInput/CronInput.theme.d.ts +0 -6
  413. package/dist/components/forms/CronInput/CronInput.theme.js +0 -84
  414. package/dist/components/forms/CronInput/CronInput.types.d.ts +0 -109
  415. package/dist/components/forms/CronInput/CronInput.utils.d.ts +0 -67
  416. package/dist/components/forms/CronInput/CronInput.utils.js +0 -505
  417. package/dist/components/forms/CronInput/index.d.ts +0 -4
  418. /package/dist/components/effects/{SpotlightBorder/SpotlightBorder.types.js → TiltCard/TiltCard.types.js} +0 -0
@@ -1,11 +1,12 @@
1
+ import React__default, { useMemo, useId, useState, useRef, useEffect, useCallback, useLayoutEffect, createElement } from 'react';
1
2
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import React__default, { useMemo, useId, useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
  import { AnimatePresence, motion } from 'motion/react';
5
5
  import { mentionTheme } from './Mention.theme.js';
6
6
  import { cn } from '../../../utils/cn.js';
7
7
  import { Avatar } from '../../core/Avatar/Avatar.js';
8
8
  import { Tag } from '../../core/Tag/Tag.js';
9
+ import { MenuItem } from '../../core/MenuItem/MenuItem.js';
9
10
  import { FormLabel } from '../FormLabel/FormLabel.js';
10
11
  import { useIsClient } from '../../../hooks/useIsClient.js';
11
12
  import { normalizeSegments, setCaretAtOffset, getPlainTextOffset, parseDOMToSegments, serializeSegments, serializeSegmentsMasked, insertMentionIntoSegments, MENTION_ATTR } from './Mention.utils.js';
@@ -74,7 +75,7 @@ const dropdownVariants = {
74
75
  // ---------------------------------------------------------------------------
75
76
  // Mention component
76
77
  // ---------------------------------------------------------------------------
77
- const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions: suggestionsProp, onSearch: onSearchProp, value: controlledValue, defaultValue = "", onChange, onMentionSelect, onMentionsChange, placeholder, size = "md", maxSuggestions = 8, className, wrapperClassName, dropdownClassName, theme: themeOverrides, state = "default", disabled = false, helperText, required, label, renderSuggestion, emptyMessage = "No results found", loading = false, mentionTagSize = "sm", mentionTagClassName, rows = 3, ...props }, ref) => {
78
+ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions: suggestionsProp, onSearch: onSearchProp, value: controlledValue, defaultValue = "", onChange, onMentionSelect, onMentionsChange, placeholder, size = "md", maxSuggestions = 8, className, wrapperClassName, dropdownClassName, theme: themeOverrides, state = "default", disabled = false, helperText, required, label, renderSuggestion, emptyMessage = "No results found", loading = false, mentionTagSize = "sm", mentionTagClassName, mentionTagRemovable = true, rows = 3, style: styleProp, ...props }, ref) => {
78
79
  const theme = useMemo(() => ({ ...mentionTheme, ...(themeOverrides || {}) }), [themeOverrides]);
79
80
  const generatedId = useId();
80
81
  const isDisabled = state === "disabled" || disabled;
@@ -125,6 +126,25 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
125
126
  const dropdownRef = useRef(null);
126
127
  const composingRef = useRef(false);
127
128
  const caretRestoreRef = useRef(null);
129
+ // Bumped on programmatic structural mutations (mention insert/remove) to
130
+ // remount the contentEditable so React rebuilds it from `segments` instead
131
+ // of diffing against a DOM the browser has already restructured. Editing a
132
+ // contentEditable lets the browser delete/merge/move React-owned nodes
133
+ // (e.g. backspacing the space before a chip removes its text span); the
134
+ // next structural reconcile then calls removeChild on a node that is no
135
+ // longer where React's fiber expects it and throws "removeChild ... not a
136
+ // child of this node". A full remount sidesteps the partial diff entirely.
137
+ // NEVER bump on typing — that path reconciles content-only changes safely
138
+ // and must keep the caret/IME composition stable.
139
+ const [editorKey, setEditorKey] = useState(0);
140
+ const lastEditorKeyRef = useRef(0);
141
+ const remountEditor = useCallback(() => setEditorKey((k) => k + 1), []);
142
+ // Mirrors the mention count React currently has committed to the DOM. Used
143
+ // by updateFromDOM to detect when a *browser-handled* edit (range-selection
144
+ // delete, cut, drag) structurally removed a chip — that desyncs React's
145
+ // fiber from the DOM, so the next reconcile must be a full remount, not a
146
+ // partial diff. Synced from `segments` after each commit (below).
147
+ const renderedMentionCountRef = useRef(0);
128
148
  // Track which segment index is "selected" when clicking a mention tag
129
149
  const [selectedMentionIndex, setSelectedMentionIndex] = useState(null);
130
150
  const isClient = useIsClient();
@@ -244,10 +264,22 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
244
264
  }
245
265
  }
246
266
  if (caretRestoreRef.current !== null) {
267
+ // A structural mutation remounts the editable div (see `editorKey`),
268
+ // which drops DOM focus. Re-focus before restoring the caret so the
269
+ // user can keep typing seamlessly after inserting/removing a mention.
270
+ if (editorKey !== lastEditorKeyRef.current && document.activeElement !== el) {
271
+ el.focus({ preventScroll: true });
272
+ }
247
273
  setCaretAtOffset(el, caretRestoreRef.current);
248
274
  caretRestoreRef.current = null;
249
275
  }
276
+ lastEditorKeyRef.current = editorKey;
250
277
  });
278
+ // Keep the committed-mention-count ref in sync so updateFromDOM can detect
279
+ // a browser-removed chip on the next edit (see renderedMentionCountRef).
280
+ useEffect(() => {
281
+ renderedMentionCountRef.current = segments.filter((s) => s.type === "mention").length;
282
+ }, [segments]);
251
283
  // --- Handlers ---
252
284
  const updateFromDOM = useCallback(() => {
253
285
  if (!editableRef.current || composingRef.current)
@@ -260,14 +292,18 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
260
292
  if (offset !== null) {
261
293
  caretRestoreRef.current = offset;
262
294
  }
295
+ // If a browser-handled edit (range-selection delete, cut, drag) removed a
296
+ // chip, the DOM no longer matches React's fiber. A content-only reconcile
297
+ // would then call removeChild on an already-gone node and throw, so force
298
+ // a full remount instead. Pure text edits keep the count stable and
299
+ // reconcile normally — preserving caret/IME.
300
+ const newMentionCount = newSegs.filter((s) => s.type === "mention").length;
301
+ if (newMentionCount !== renderedMentionCountRef.current) {
302
+ remountEditor();
303
+ }
263
304
  setSegments(newSegs);
264
305
  lastSerializedRef.current = serialized;
265
- if (!isControlled) {
266
- onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
267
- }
268
- else {
269
- onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
270
- }
306
+ onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
271
307
  notifyMentionsChange(newSegs);
272
308
  // Detect active mention using masked text (hides @ from existing mentions)
273
309
  if (offset !== null) {
@@ -275,7 +311,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
275
311
  const mention = detectActiveMention(maskedText, offset, triggerChars);
276
312
  setActiveMention(mention);
277
313
  }
278
- }, [isControlled, onChange, triggerChars, notifyMentionsChange]);
314
+ }, [onChange, triggerChars, notifyMentionsChange, remountEditor]);
279
315
  const handleInput = useCallback(() => {
280
316
  setSelectedMentionIndex(null);
281
317
  updateFromDOM();
@@ -312,6 +348,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
312
348
  setSegments(newSegs);
313
349
  setActiveMention(null);
314
350
  setHighlightedIndex(-1);
351
+ remountEditor();
315
352
  onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
316
353
  notifyMentionsChange(newSegs);
317
354
  onMentionSelect === null || onMentionSelect === void 0 ? void 0 : onMentionSelect(suggestion, trigger);
@@ -321,9 +358,51 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
321
358
  onChange,
322
359
  onMentionSelect,
323
360
  notifyMentionsChange,
361
+ remountEditor,
324
362
  ]);
363
+ // Map a mention DOM element back to its segment index. The chips are
364
+ // React-rendered, so we locate the element among all mention nodes and
365
+ // translate that position into the nth "mention" segment.
366
+ const segmentIndexForMentionEl = useCallback((mentionEl) => {
367
+ if (!editableRef.current)
368
+ return -1;
369
+ const allMentions = editableRef.current.querySelectorAll(`[${MENTION_ATTR}]`);
370
+ const domIdx = Array.from(allMentions).indexOf(mentionEl);
371
+ if (domIdx === -1)
372
+ return -1;
373
+ let count = 0;
374
+ for (let i = 0; i < segments.length; i++) {
375
+ if (segments[i].type === "mention") {
376
+ if (count === domIdx)
377
+ return i;
378
+ count++;
379
+ }
380
+ }
381
+ return -1;
382
+ }, [segments]);
383
+ // Remove a mention via the segment model — NEVER by mutating the DOM.
384
+ // The chips are React-owned nodes; calling removeChild() on them directly
385
+ // desyncs React's fiber tree from the DOM and makes the next reconcile
386
+ // throw "removeChild ... not a child of this node". Splicing the segment
387
+ // and letting React drop the node keeps React the sole DOM owner. The
388
+ // caret lands at the gap the mention left (its segment start offset).
389
+ const removeMentionSegment = useCallback((segIndex) => {
390
+ const newSegs = normalizeSegments([
391
+ ...segments.slice(0, segIndex),
392
+ ...segments.slice(segIndex + 1),
393
+ ]);
394
+ caretRestoreRef.current = getOffsetAtSegment(segments, segIndex);
395
+ const serialized = serializeSegments(newSegs);
396
+ lastSerializedRef.current = serialized;
397
+ setSegments(newSegs);
398
+ setSelectedMentionIndex(null);
399
+ setActiveMention(null);
400
+ remountEditor();
401
+ onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
402
+ notifyMentionsChange(newSegs);
403
+ }, [segments, onChange, notifyMentionsChange, remountEditor]);
325
404
  const handleKeyDown = useCallback((e) => {
326
- var _a, _b, _c, _d, _e;
405
+ var _a;
327
406
  // --- Selected mention: delete / replace / deselect ---
328
407
  if (selectedMentionIndex !== null &&
329
408
  ((_a = segments[selectedMentionIndex]) === null || _a === void 0 ? void 0 : _a.type) === "mention") {
@@ -338,6 +417,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
338
417
  lastSerializedRef.current = serialized;
339
418
  setSegments(newSegs);
340
419
  setSelectedMentionIndex(null);
420
+ remountEditor();
341
421
  onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
342
422
  notifyMentionsChange(newSegs);
343
423
  return;
@@ -356,6 +436,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
356
436
  lastSerializedRef.current = serialized;
357
437
  setSegments(newSegs);
358
438
  setSelectedMentionIndex(null);
439
+ remountEditor();
359
440
  onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
360
441
  notifyMentionsChange(newSegs);
361
442
  return;
@@ -408,10 +489,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
408
489
  if (prevSibling &&
409
490
  prevSibling.nodeType === Node.ELEMENT_NODE &&
410
491
  prevSibling.hasAttribute(MENTION_ATTR)) {
411
- e.preventDefault();
412
- (_b = prevSibling.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(prevSibling);
413
- updateFromDOM();
414
- return;
492
+ const segIdx = segmentIndexForMentionEl(prevSibling);
493
+ if (segIdx !== -1) {
494
+ e.preventDefault();
495
+ removeMentionSegment(segIdx);
496
+ return;
497
+ }
415
498
  }
416
499
  }
417
500
  // Case 2: Caret in parent element, child before offset is a mention
@@ -422,10 +505,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
422
505
  if (prevChild &&
423
506
  prevChild.nodeType === Node.ELEMENT_NODE &&
424
507
  prevChild.hasAttribute(MENTION_ATTR)) {
425
- e.preventDefault();
426
- (_c = prevChild.parentNode) === null || _c === void 0 ? void 0 : _c.removeChild(prevChild);
427
- updateFromDOM();
428
- return;
508
+ const segIdx = segmentIndexForMentionEl(prevChild);
509
+ if (segIdx !== -1) {
510
+ e.preventDefault();
511
+ removeMentionSegment(segIdx);
512
+ return;
513
+ }
429
514
  }
430
515
  }
431
516
  }
@@ -445,10 +530,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
445
530
  if (nextSibling &&
446
531
  nextSibling.nodeType === Node.ELEMENT_NODE &&
447
532
  nextSibling.hasAttribute(MENTION_ATTR)) {
448
- e.preventDefault();
449
- (_d = nextSibling.parentNode) === null || _d === void 0 ? void 0 : _d.removeChild(nextSibling);
450
- updateFromDOM();
451
- return;
533
+ const segIdx = segmentIndexForMentionEl(nextSibling);
534
+ if (segIdx !== -1) {
535
+ e.preventDefault();
536
+ removeMentionSegment(segIdx);
537
+ return;
538
+ }
452
539
  }
453
540
  }
454
541
  }
@@ -458,10 +545,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
458
545
  if (nextChild &&
459
546
  nextChild.nodeType === Node.ELEMENT_NODE &&
460
547
  nextChild.hasAttribute(MENTION_ATTR)) {
461
- e.preventDefault();
462
- (_e = nextChild.parentNode) === null || _e === void 0 ? void 0 : _e.removeChild(nextChild);
463
- updateFromDOM();
464
- return;
548
+ const segIdx = segmentIndexForMentionEl(nextChild);
549
+ if (segIdx !== -1) {
550
+ e.preventDefault();
551
+ removeMentionSegment(segIdx);
552
+ return;
553
+ }
465
554
  }
466
555
  }
467
556
  }
@@ -475,7 +564,9 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
475
564
  highlightedIndex,
476
565
  filteredSuggestions,
477
566
  insertMention,
478
- updateFromDOM,
567
+ segmentIndexForMentionEl,
568
+ removeMentionSegment,
569
+ remountEditor,
479
570
  selectedMentionIndex,
480
571
  segments,
481
572
  onChange,
@@ -513,26 +604,9 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
513
604
  setSelectedMentionIndex(null);
514
605
  return;
515
606
  }
516
- // Find which DOM mention this is (nth occurrence)
517
- const allMentions = editableRef.current.querySelectorAll(`[${MENTION_ATTR}]`);
518
- const domIdx = Array.from(allMentions).indexOf(mentionEl);
519
- if (domIdx === -1) {
520
- setSelectedMentionIndex(null);
521
- return;
522
- }
523
- // Map nth DOM mention → segment index
524
- let count = 0;
525
- for (let i = 0; i < segments.length; i++) {
526
- if (segments[i].type === "mention") {
527
- if (count === domIdx) {
528
- setSelectedMentionIndex(i);
529
- return;
530
- }
531
- count++;
532
- }
533
- }
534
- setSelectedMentionIndex(null);
535
- }, [segments]);
607
+ const segIdx = segmentIndexForMentionEl(mentionEl);
608
+ setSelectedMentionIndex(segIdx === -1 ? null : segIdx);
609
+ }, [segmentIndexForMentionEl]);
536
610
  // Scroll highlighted suggestion into view
537
611
  useEffect(() => {
538
612
  if (highlightedIndex >= 0 && dropdownRef.current) {
@@ -552,11 +626,22 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
552
626
  const renderedSegments = useMemo(() => {
553
627
  return segments.map((seg, i) => {
554
628
  if (seg.type === "text") {
555
- return (jsx("span", { "data-segment": "text", children: seg.text || (i === 0 ? "" : "") }, `text-${i}`));
629
+ return (jsx("span", { "data-segment": "text", children: seg.text }, `text-${i}`));
556
630
  }
557
- return (jsx(Tag, { size: mentionTagSize, removable: false, avatar: seg.data.avatar
558
- ? { src: seg.data.avatar, name: seg.data.label }
559
- : undefined, contentEditable: false, className: cn(theme.mentionTagStyle, i === selectedMentionIndex &&
631
+ return (jsx(Tag, { size: mentionTagSize, removable: mentionTagRemovable,
632
+ // Route removal through the segment model (same path as keyboard
633
+ // delete) so React stays the DOM owner and the editor remounts
634
+ // cleanly. stopPropagation in Tag keeps this click from also
635
+ // selecting the chip via the editable's onClick.
636
+ onRemove: () => removeMentionSegment(i), animated: false,
637
+ // Always pass the avatar object (src may be undefined) so the chip
638
+ // shows the initials fallback when no photo is available — matching
639
+ // the suggestion dropdown. Avatar renders the first initial at xs.
640
+ avatar: { src: seg.data.avatar, name: seg.data.label }, contentEditable: false, className: cn(
641
+ // align-middle: avatar vs text-only chips have differing intrinsic
642
+ // heights and an inline-flex baseline is ill-defined, so center on
643
+ // the line's middle to keep every chip level when used inline.
644
+ "align-middle", i === selectedMentionIndex &&
560
645
  "ring-2 ring-[var(--color-primary)] ring-offset-1", mentionTagClassName), [MENTION_ATTR]: seg.data.id,
561
646
  "data-mention-label": seg.data.label,
562
647
  "data-mention-trigger": seg.data.trigger, children: seg.data.label }, `mention-${seg.data.id}-${i}`));
@@ -565,7 +650,8 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
565
650
  segments,
566
651
  mentionTagSize,
567
652
  mentionTagClassName,
568
- theme.mentionTagStyle,
653
+ mentionTagRemovable,
654
+ removeMentionSegment,
569
655
  selectedMentionIndex,
570
656
  ]);
571
657
  // -----------------------------------------------------------------------
@@ -580,10 +666,17 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
580
666
  insertMention(suggestion);
581
667
  }, children: renderSuggestion(suggestion, isHighlighted, triggerChar) }, suggestion.id));
582
668
  }
583
- return (jsxs("div", { role: "option", "aria-selected": isHighlighted, "data-suggestion-index": index, className: cn(theme.suggestionStyle, isHighlighted && theme.suggestionHighlightedStyle), onMouseEnter: () => setHighlightedIndex(index), onMouseDown: (e) => {
669
+ return (jsx(MenuItem, { role: "option", "aria-selected": isHighlighted, "data-suggestion-index": index,
670
+ // Drives MenuItem's selected styling; highlight follows keyboard nav
671
+ // (and hover, via onMouseEnter setting highlightedIndex).
672
+ selected: isHighlighted, startContent: jsx(Avatar, { src: suggestion.avatar, name: suggestion.label, size: "xs", className: "ring-0 border-0" }), subtitle: suggestion.description, onMouseEnter: () => setHighlightedIndex(index),
673
+ // mousedown + preventDefault keeps focus in the contentEditable so
674
+ // selecting a suggestion never blurs the editor (MenuItem's onClick/
675
+ // onActivate path would fire too late, after focus moves).
676
+ onMouseDown: (e) => {
584
677
  e.preventDefault();
585
678
  insertMention(suggestion);
586
- }, children: [jsx(Avatar, { src: suggestion.avatar, name: suggestion.label, size: "xs", className: "ring-0 border-0" }), jsxs("div", { className: "flex flex-col min-w-0", children: [jsx("span", { className: theme.suggestionLabelStyle, children: suggestion.label }), suggestion.description && (jsx("span", { className: theme.suggestionDescriptionStyle, children: suggestion.description }))] })] }, suggestion.id));
679
+ }, children: suggestion.label }, suggestion.id));
587
680
  };
588
681
  // -----------------------------------------------------------------------
589
682
  // Dropdown portal content
@@ -601,11 +694,13 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
601
694
  // Render
602
695
  // -----------------------------------------------------------------------
603
696
  const helperId = `${generatedId}-helper`;
604
- return (jsxs("div", { className: cn(theme.wrapperStyle, wrapperClassName), children: [label && (jsx(FormLabel, { htmlFor: generatedId, state: isDisabled ? "disabled" : isInvalid ? "invalid" : "default", required: required, className: "mb-1.5", children: label })), jsx("div", { ref: wrapperRef, className: cn(theme.inputGroupStyle, isFocused && theme.inputGroupFocusStyle, isInvalid && "border-[var(--color-danger)] ring-1 ring-[var(--color-danger)]"), children: jsx("div", { ref: setEditableRef, id: generatedId, contentEditable: !isDisabled, suppressContentEditableWarning: true, onInput: handleInput, onKeyDown: handleKeyDown, onClick: handleClick, onFocus: handleFocus, onBlur: handleBlur, onPaste: handlePaste, onSelect: handleSelect, onCompositionStart: handleCompositionStart, onCompositionEnd: handleCompositionEnd, role: "textbox", "aria-multiline": "true", "aria-autocomplete": "list", "aria-expanded": isDropdownOpen, "aria-haspopup": "listbox", "aria-placeholder": placeholder, "aria-required": required || undefined, "data-placeholder": placeholder, "aria-disabled": isDisabled || undefined, "aria-invalid": isInvalid || undefined, "aria-describedby": helperText ? helperId : undefined, className: cn(theme.editableStyle, theme.sizes[size], isContentEmpty &&
605
- "before:content-[attr(data-placeholder)] before:text-[var(--color-text-placeholder)] before:pointer-events-none before:absolute dark:before:text-[var(--color-neutral-500)]", isDisabled && "cursor-not-allowed opacity-60", className), style: {
697
+ return (jsxs("div", { className: cn(theme.wrapperStyle, wrapperClassName), children: [label && (jsx(FormLabel, { htmlFor: generatedId, state: isDisabled ? "disabled" : isInvalid ? "invalid" : "default", required: required, className: "mb-1.5", children: label })), jsx("div", { ref: wrapperRef, className: cn(theme.inputGroupStyle, isInvalid && theme.invalidStyle, isFocused &&
698
+ (isInvalid ? theme.invalidFocusStyle : theme.inputGroupFocusStyle)), children: createElement("div", { ...props, key: editorKey, ref: setEditableRef, id: generatedId, contentEditable: !isDisabled, suppressContentEditableWarning: true, onInput: handleInput, onKeyDown: handleKeyDown, onClick: handleClick, onFocus: handleFocus, onBlur: handleBlur, onPaste: handlePaste, onSelect: handleSelect, onCompositionStart: handleCompositionStart, onCompositionEnd: handleCompositionEnd, role: "textbox", "aria-multiline": "true", "aria-autocomplete": "list", "aria-expanded": isDropdownOpen, "aria-haspopup": "listbox", "aria-placeholder": placeholder, "aria-required": required || undefined, "data-placeholder": placeholder, "aria-disabled": isDisabled || undefined, "aria-invalid": isInvalid || undefined, "aria-describedby": helperText ? helperId : undefined, className: cn(theme.editableStyle, theme.sizes[size], isContentEmpty &&
699
+ "before:content-[attr(data-placeholder)] before:text-[var(--color-text-placeholder)] before:pointer-events-none before:absolute", isDisabled && "cursor-not-allowed opacity-60", className), style: {
606
700
  minHeight: rows ? `${rows * 1.5}em` : undefined,
701
+ ...styleProp,
607
702
  position: "relative",
608
- }, ...props, children: renderedSegments }) }), helperText && (jsx("div", { id: helperId, className: cn("text-sm mt-1", isInvalid
703
+ } }, renderedSegments) }), helperText && (jsx("div", { id: helperId, className: cn("text-sm mt-1", isInvalid
609
704
  ? "text-[var(--color-danger)]"
610
705
  : "text-[var(--color-text-muted)]"), children: helperText })), isClient && createPortal(dropdownContent, document.body)] }));
611
706
  });
@@ -10,9 +10,11 @@ const mentionTheme = {
10
10
  // Input group container with outline and focus ring
11
11
  inputGroupStyle: formsBaseTheme.inputGroupBaseStyle,
12
12
  // JS-driven focus ring (applied when editable div is focused)
13
- inputGroupFocusStyle: "shadow-[inset_0_0_0_2px_var(--color-primary-600)] " +
14
- "ring-4 ring-[var(--color-primary)]/10 " +
15
- "dark:shadow-[inset_0_0_0_2px_var(--color-primary-500)] dark:ring-[var(--color-primary-500)]/20",
13
+ inputGroupFocusStyle: formsBaseTheme.focusStates.default,
14
+ // Invalid state — inset box-shadow + danger fill (NOT border/ring; see CLAUDE.md §9)
15
+ invalidStyle: formsBaseTheme.states.invalid,
16
+ // Invalid + focused — danger inset shadow + danger ring glow
17
+ invalidFocusStyle: formsBaseTheme.focusStates.invalid,
16
18
  // Base editable div styles
17
19
  editableStyle: `${formsBaseTheme.controlBaseStyle} whitespace-pre-wrap break-words overflow-y-auto cursor-text`,
18
20
  // Size variants
@@ -21,35 +23,26 @@ const mentionTheme = {
21
23
  md: `${formsBaseTheme.sizes.md.text} ${formsBaseTheme.sizes.md.padding} ${formsBaseTheme.sizes.md.textareaHeight}`,
22
24
  lg: `${formsBaseTheme.sizes.lg.text} ${formsBaseTheme.sizes.lg.padding} ${formsBaseTheme.sizes.lg.textareaHeight}`,
23
25
  },
24
- // Inline mention Tag chip styles
25
- mentionTagStyle: "mx-0.5 align-baseline cursor-default select-none",
26
+ // Inline mention Tag chip styles.
26
27
  // Dropdown container - reuses the shared dropdown styles
27
- dropdownStyle: formsBaseTheme.dropdownStyles.container + " py-1",
28
- // Individual suggestion item
28
+ // p-1 (not py-1) so MenuItem rows' rounded highlight insets evenly on all
29
+ // sides instead of running flush to the container's left/right edges.
30
+ dropdownStyle: formsBaseTheme.dropdownStyles.container + " p-1",
31
+ // Suggestion rows render via the shared MenuItem primitive (avatar →
32
+ // startContent, label → children, description → subtitle). These two styles
33
+ // are only used by the custom `renderSuggestion` escape hatch, which wraps
34
+ // the consumer's node in a plain row that still tracks hover/highlight.
29
35
  suggestionStyle: "relative flex items-center gap-2.5 cursor-pointer select-none py-2 px-3 " +
30
36
  "text-[var(--color-text-primary)] " +
31
37
  "hover:text-[var(--color-primary)] hover:bg-[var(--color-primary-50)]/50 " +
32
38
  "dark:hover:text-[var(--color-primary-400)] dark:hover:bg-[var(--color-primary-400)]/10",
33
- // Highlighted suggestion (keyboard navigation)
39
+ // Highlighted suggestion (keyboard navigation) — custom renderSuggestion path
34
40
  suggestionHighlightedStyle: "text-[var(--color-primary)] bg-[var(--color-primary-50)]/50 " +
35
41
  "dark:text-[var(--color-primary-400)] dark:bg-[var(--color-primary-400)]/10",
36
- // Avatar image
37
- suggestionAvatarStyle: "size-7 rounded-full object-cover shrink-0 " +
38
- "bg-[var(--color-surface-sunken)] dark:bg-[var(--color-neutral-700)]",
39
- // Avatar fallback (initials circle)
40
- suggestionAvatarFallbackStyle: "size-7 rounded-full shrink-0 flex items-center justify-center text-xs font-medium " +
41
- "bg-[var(--color-primary-100)] text-[var(--color-primary-700)] " +
42
- "dark:bg-[var(--color-primary-900)] dark:text-[var(--color-primary-300)]",
43
- // Suggestion label text
44
- suggestionLabelStyle: "text-sm font-medium truncate",
45
- // Suggestion description text
46
- suggestionDescriptionStyle: "text-xs text-[var(--color-text-muted)] truncate " +
47
- "dark:text-[var(--color-neutral-500)]",
48
42
  // Empty state
49
43
  emptyMessageStyle: formsBaseTheme.dropdownStyles.emptyMessage,
50
- // Loading state
51
- loadingStyle: "py-3 px-3 text-center text-[var(--color-text-muted)] " +
52
- "dark:text-[var(--color-neutral-500)]",
44
+ // Loading state (--color-text-muted auto-flips for dark mode)
45
+ loadingStyle: "py-3 px-3 text-center text-[var(--color-text-muted)]",
53
46
  };
54
47
 
55
48
  export { mentionTheme };
@@ -71,26 +71,21 @@ export interface MentionTheme {
71
71
  inputGroupStyle: string;
72
72
  /** JS-driven focus ring style */
73
73
  inputGroupFocusStyle: string;
74
+ /** Invalid state style (inset box-shadow + danger fill) */
75
+ invalidStyle: string;
76
+ /** Invalid + focused style (danger inset shadow + ring glow) */
77
+ invalidFocusStyle: string;
74
78
  /** Base editable div style */
75
79
  editableStyle: string;
76
80
  /** Size variants for the editable div */
77
81
  sizes: Record<MentionSize, string>;
78
- /** Inline mention Tag chip style */
79
- mentionTagStyle: string;
80
82
  /** Dropdown container style */
81
83
  dropdownStyle: string;
82
- /** Individual suggestion item style */
84
+ /** Suggestion row style — used only by the custom `renderSuggestion` path
85
+ * (default rows render via the shared MenuItem primitive). */
83
86
  suggestionStyle: string;
84
- /** Highlighted (keyboard-focused) suggestion style */
87
+ /** Highlighted (keyboard-focused) suggestion style — custom renderSuggestion path */
85
88
  suggestionHighlightedStyle: string;
86
- /** Avatar style inside a suggestion */
87
- suggestionAvatarStyle: string;
88
- /** Avatar fallback (initials) style */
89
- suggestionAvatarFallbackStyle: string;
90
- /** Suggestion label text style */
91
- suggestionLabelStyle: string;
92
- /** Suggestion description text style */
93
- suggestionDescriptionStyle: string;
94
89
  /** Empty state message style */
95
90
  emptyMessageStyle: string;
96
91
  /** Loading state style */
@@ -153,6 +148,11 @@ export interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
153
148
  mentionTagSize?: TagSize;
154
149
  /** Additional className for inline mention Tag chips */
155
150
  mentionTagClassName?: string;
151
+ /**
152
+ * Show a remove (×) button on each inline mention chip so it can be deleted
153
+ * by click as well as by keyboard. Defaults to `true`.
154
+ */
155
+ mentionTagRemovable?: boolean;
156
156
  /** Number of visible text rows (controls min-height) */
157
157
  rows?: number;
158
158
  /** Label rendered above the mention input */
@@ -1,5 +1,23 @@
1
1
  // Data attribute used to identify mention nodes in the DOM
2
2
  const MENTION_ATTR = "data-mention-id";
3
+ /**
4
+ * True when `node` lives inside a mention chip (its avatar/label text nodes),
5
+ * as opposed to being the mention element itself. A TreeWalker descends into a
6
+ * FILTER_ACCEPTed mention element, so without rejecting these inner nodes the
7
+ * offset walkers would count a chip's inner text and land the caret inside it
8
+ * (chips are contentEditable=false). Stops at `container` (the walker root).
9
+ */
10
+ const isInsideMention = (node, container) => {
11
+ let parent = node.parentNode;
12
+ while (parent && parent !== container) {
13
+ if (parent.nodeType === Node.ELEMENT_NODE &&
14
+ parent.hasAttribute(MENTION_ATTR)) {
15
+ return true;
16
+ }
17
+ parent = parent.parentNode;
18
+ }
19
+ return false;
20
+ };
3
21
  /**
4
22
  * Serialize segments to a plain text string.
5
23
  * Mentions become `trigger + label` (e.g. "@Sarah Wilson").
@@ -111,12 +129,17 @@ const getPlainTextOffset = (container) => {
111
129
  let offset = 0;
112
130
  const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, {
113
131
  acceptNode: (node) => {
114
- if (node.nodeType === Node.TEXT_NODE)
115
- return NodeFilter.FILTER_ACCEPT;
132
+ // Mention element: count it atomically (its inner nodes are rejected below)
116
133
  if (node.nodeType === Node.ELEMENT_NODE &&
117
134
  node.hasAttribute(MENTION_ATTR)) {
118
135
  return NodeFilter.FILTER_ACCEPT;
119
136
  }
137
+ // Reject the chip's inner avatar/label nodes so the walker never
138
+ // descends into a mention or counts its inner text twice.
139
+ if (isInsideMention(node, container))
140
+ return NodeFilter.FILTER_REJECT;
141
+ if (node.nodeType === Node.TEXT_NODE)
142
+ return NodeFilter.FILTER_ACCEPT;
120
143
  // Skip non-mention element nodes but traverse their children
121
144
  return NodeFilter.FILTER_SKIP;
122
145
  },
@@ -234,12 +257,17 @@ const setCaretAtOffset = (container, targetOffset) => {
234
257
  let remaining = targetOffset;
235
258
  const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, {
236
259
  acceptNode: (node) => {
237
- if (node.nodeType === Node.TEXT_NODE)
238
- return NodeFilter.FILTER_ACCEPT;
260
+ // Mention element: count it atomically (its inner nodes are rejected below)
239
261
  if (node.nodeType === Node.ELEMENT_NODE &&
240
262
  node.hasAttribute(MENTION_ATTR)) {
241
263
  return NodeFilter.FILTER_ACCEPT;
242
264
  }
265
+ // Reject the chip's inner avatar/label nodes so the caret is never
266
+ // placed inside a mention (chips are contentEditable=false).
267
+ if (isInsideMention(node, container))
268
+ return NodeFilter.FILTER_REJECT;
269
+ if (node.nodeType === Node.TEXT_NODE)
270
+ return NodeFilter.FILTER_ACCEPT;
243
271
  return NodeFilter.FILTER_SKIP;
244
272
  },
245
273
  });
@@ -1437,11 +1437,11 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
1437
1437
  : false;
1438
1438
  switch (tool) {
1439
1439
  case "bold":
1440
- 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: "w-4 h-4" }) }, toolKey));
1440
+ 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));
1441
1441
  case "italic":
1442
- 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: "w-4 h-4" }) }, toolKey));
1442
+ 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));
1443
1443
  case "underline":
1444
- 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: "w-4 h-4" }) }, toolKey));
1444
+ 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));
1445
1445
  case "fontFamily": {
1446
1446
  // The `fontFamily` tool is opt-in via toolbar config, but
1447
1447
  // `fontFamilies` is also a public prop — if a consumer passes an
@@ -97,16 +97,16 @@ const richTextEditorTheme = {
97
97
  // `rounded-t-[var(--form-radius)]` matches the container's radius so the
98
98
  // toolbar's own bg/backdrop-blur respects the top corners — prevents the
99
99
  // 1px bleed past the parent's `overflow-hidden` clip in Safari/Chromium.
100
- toolbarStyle: "flex items-center gap-1 p-1 rounded-t-[var(--form-radius)] border-b border-[var(--color-border)] dark:bg-[var(--color-background-secondary)]",
100
+ toolbarStyle: "flex items-center m-0.5 gap-0.5 p-0.5 rounded-[var(--form-radius)] dark:bg-[var(--color-surface)]/0",
101
101
  // Toolbar styling (floating variant — selection-anchored)
102
- floatingToolbarStyle: "flex items-center gap-1 p-1 rounded-xl border border-[var(--color-border)] bg-white/90 backdrop-blur-sm shadow-real-xl overflow-hidden dark:bg-[var(--color-background-secondary)]/80",
102
+ floatingToolbarStyle: "flex items-center gap-1 p-1 rounded-xl border border-[var(--color-border)] bg-[var(--color-surface-overlay)]/80 backdrop-blur-md shadow-real-xl overflow-hidden",
103
103
  // Toolbar button — single source of truth via data-[state=active]
104
104
  // (aria-pressed remains as proper ARIA on toggle buttons, but styling is decoupled)
105
- toolbarButtonStyle: "inline-flex items-center justify-center size-8 rounded-[calc(var(--radius-base)*0.85)] border border-transparent bg-transparent text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)] transition-colors duration-300 disabled:opacity-50 disabled:cursor-not-allowed data-[state=active]:bg-[var(--color-background-secondary)] data-[state=active]:text-[var(--color-text-primary)] data-[state=active]:border-[var(--color-border)] data-[state=active]:shadow-inner",
105
+ toolbarButtonStyle: "inline-flex items-center justify-center rounded-[calc(var(--radius-base)*0.85)] border border-transparent bg-transparent text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)] transition-colors duration-300 disabled:opacity-50 disabled:cursor-not-allowed data-[state=active]:bg-[var(--color-background-secondary)] data-[state=active]:text-[var(--color-text-primary)] data-[state=active]:border-[var(--color-border)] data-[state=active]:shadow-inner",
106
106
  // Dropdown surface (visual only — positioning handled at use site via portal)
107
- dropdownStyle: "min-w-[120px] max-h-[18rem] overflow-y-auto py-1 bg-white/90 backdrop-blur-md rounded-[var(--form-radius)] shadow-xl ring-1 ring-[var(--color-border)] focus:outline-none",
107
+ dropdownStyle: "min-w-[120px] max-h-[18rem] overflow-y-auto py-1 bg-[var(--color-surface-overlay)]/80 backdrop-blur-md rounded-[var(--form-radius)] shadow-xl ring-1 ring-[var(--color-border)] focus:outline-none",
108
108
  // Dropdown item — uses data-[active=true] for selected state
109
- dropdownItemStyle: "block w-full px-3 py-2 text-left text-sm text-[var(--color-text-primary)] hover:bg-[var(--color-surface-hover)] transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed data-[active=true]:bg-[var(--color-primary-50)] data-[active=true]:text-[var(--color-primary-900)]",
109
+ dropdownItemStyle: "block w-full px-3 py-2 text-left text-sm text-[var(--color-text-primary)] hover:bg-[var(--color-surface-hover)] transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed data-[active=true]:bg-[var(--color-primary-50)] data-[active=true]:text-[var(--color-primary-900)] data-[active=true]:dark:bg-[var(--color-primary-400)]/10 data-[active=true]:dark:text-[var(--color-primary-400)]",
110
110
  // Separator between toolbar sections
111
111
  separatorStyle: "w-px h-6 bg-[var(--color-border)] mx-1",
112
112
  // Color picker layout — column of family rows, plus optional Recent + Mono rows
@@ -96,7 +96,7 @@ const SelectButton = ({ id, disabled, isOpen, state = "default", size = "md", ic
96
96
  // Use either the themed focus state or directly apply the focus classes if the theme is not working
97
97
  const activeFocusState = isOpen
98
98
  ? focusStateStyle ||
99
- "shadow-[inset_0_0_0_2px_var(--color-primary)] ring-4 ring-[var(--color-primary)]/10"
99
+ "shadow-[inset_0_0_0_1px_var(--color-primary)] ring-4 ring-[var(--color-primary)]/10"
100
100
  : "";
101
101
  return (jsxs("div", { className: cn(buttonWrapperStyle, "flex items-stretch"), children: [contentStart && (jsx("div", { "data-slot": "content-start", className: cn(contentSlotStyle, "pr-0 border-r border-[var(--color-border)]"), children: contentStart })), jsxs("button", { ref: buttonRef, id: id, type: "button", className: cn(baseStyle, sizeStyle, stateStyle, hoverStateStyle, activeFocusState, iconStartPadding, iconEndPadding, buttonStyle, "flex-1 min-w-0", className), onClick: onClick, onFocus: onFocus, onBlur: onBlur, disabled: disabled, "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-controls": isOpen && id ? `${id}-listbox` : undefined, "aria-labelledby": ariaLabelledby, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, children: [iconStart && jsx("span", { className: iconStartStyle, children: iconStart }), children, iconEnd && jsx("span", { className: iconEndStyle, children: iconEnd })] }), contentEnd && (jsx("div", { "data-slot": "content-end", className: cn(contentSlotStyle, "pl-0 border-l border-[var(--color-border)]"), children: contentEnd }))] }));
102
102
  };
@@ -287,7 +287,7 @@ const SelectOptions = ({ isOpen, maxHeight = "15rem", className = "", onClose, c
287
287
  } }) })), children] })) }));
288
288
  // Use portal if enabled and client-side - wrap with dark class for dark mode support
289
289
  if (portal && isClient) {
290
- return createPortal(jsx("div", { className: isDarkMode ? "dark" : undefined, children: optionsContent }), document.body);
290
+ return createPortal(jsx("div", { "data-flikkui-portal": "", className: isDarkMode ? "dark" : undefined, children: optionsContent }), document.body);
291
291
  }
292
292
  return optionsContent;
293
293
  };
@@ -11,12 +11,12 @@ const selectTheme = {
11
11
  baseStyle: formsBaseTheme.inputGroupBaseStyle + " items-center justify-between",
12
12
  // Button wrapper style
13
13
  buttonWrapperStyle: "relative w-full",
14
- // Button style - bg-white for light mode only; dark mode bg comes from baseStyle (inputGroupBaseStyle)
15
- buttonStyle: "w-full cursor-pointer bg-white dark:bg-[var(--color-neutral-900)]",
14
+ // Button style - surface flips automatically between light/dark
15
+ buttonStyle: "w-full cursor-pointer bg-[var(--color-surface)]",
16
16
  // Placeholder text style - matches Input placeholder styling
17
17
  placeholderTextStyle: formsBaseTheme.placeholderStyle,
18
18
  // Selected value text style
19
- valueTextStyle: "text-[var(--color-text-primary)] dark:text-[var(--color-neutral-200)]",
19
+ valueTextStyle: "text-[var(--color-text-primary)]",
20
20
  // Size variants - composed from atomic tokens
21
21
  sizes: {
22
22
  sm: `${formsBaseTheme.sizes.sm.text} ${formsBaseTheme.sizes.sm.padding} ${formsBaseTheme.sizes.sm.height}`,