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

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 (295) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/dist/components/ai/AgentStatus/AgentStatus.d.ts +3 -0
  3. package/dist/components/ai/AgentStatus/AgentStatus.js +144 -0
  4. package/dist/components/ai/AgentStatus/AgentStatus.theme.d.ts +2 -0
  5. package/dist/components/ai/AgentStatus/AgentStatus.theme.js +37 -0
  6. package/dist/components/ai/AgentStatus/AgentStatus.types.d.ts +116 -0
  7. package/dist/components/ai/AgentStatus/index.d.ts +3 -0
  8. package/dist/components/ai/CodeBlock/CodeBlock.js +3 -3
  9. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
  10. package/dist/components/ai/PromptInput/PromptInput.js +13 -14
  11. package/dist/components/ai/PromptInput/PromptInput.theme.js +1 -1
  12. package/dist/components/ai/PromptInput/VoiceRecorder.js +3 -3
  13. package/dist/components/ai/Reasoning/Reasoning.d.ts +5 -0
  14. package/dist/components/ai/Reasoning/Reasoning.js +16 -0
  15. package/dist/components/ai/Reasoning/Reasoning.types.d.ts +20 -0
  16. package/dist/components/ai/Reasoning/index.d.ts +2 -0
  17. package/dist/components/ai/SourceCitation/SourceCitation.d.ts +4 -0
  18. package/dist/components/ai/SourceCitation/SourceCitation.js +29 -0
  19. package/dist/components/ai/SourceCitation/SourceCitation.theme.d.ts +2 -0
  20. package/dist/components/ai/SourceCitation/SourceCitation.theme.js +23 -0
  21. package/dist/components/ai/SourceCitation/SourceCitation.types.d.ts +55 -0
  22. package/dist/components/ai/SourceCitation/index.d.ts +3 -0
  23. package/dist/components/ai/StreamingResponse/ErrorDisplay.js +2 -2
  24. package/dist/components/ai/StreamingResponse/StreamingResponse.js +1 -3
  25. package/dist/components/ai/StreamingResponse/StreamingResponse.theme.js +3 -1
  26. package/dist/components/ai/TokenCounter/TokenCounter.js +2 -2
  27. package/dist/components/ai/index.d.ts +3 -0
  28. package/dist/components/ai/index.js +6 -3
  29. package/dist/components/ai/shared/StatusIndicator.d.ts +8 -0
  30. package/dist/components/ai/shared/StatusIndicator.js +34 -0
  31. package/dist/components/canvas/CanvasToolbar.js +2 -2
  32. package/dist/components/canvas/NodeControls.js +2 -2
  33. package/dist/components/canvas/NodeRenderer.js +2 -2
  34. package/dist/components/charts/ActivityRings/ActivityRings.js +2 -2
  35. package/dist/components/charts/AreaChart/AreaChart.js +21 -32
  36. package/dist/components/charts/AreaChart/AreaChart.theme.d.ts +1 -6
  37. package/dist/components/charts/AreaChart/AreaChart.theme.js +7 -19
  38. package/dist/components/charts/AreaChart/AreaChart.types.d.ts +18 -11
  39. package/dist/components/charts/AreaChart/AreaChart.types.js +10 -3
  40. package/dist/components/charts/AreaChart/index.d.ts +1 -1
  41. package/dist/components/charts/BarChart/BarChart.js +9 -28
  42. package/dist/components/charts/BarChart/BarChart.types.d.ts +20 -16
  43. package/dist/components/charts/BarChart/BarChart.types.js +11 -4
  44. package/dist/components/charts/ComboChart/BarRenderer.js +8 -5
  45. package/dist/components/charts/ComboChart/ComboChart.js +11 -24
  46. package/dist/components/charts/ComboChart/ComboChart.types.d.ts +15 -13
  47. package/dist/components/charts/ComboChart/ComboChart.types.js +14 -2
  48. package/dist/components/charts/ComboChart/LineRenderer.js +15 -10
  49. package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.d.ts +16 -0
  50. package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.js +237 -0
  51. package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.types.d.ts +62 -0
  52. package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.types.js +21 -0
  53. package/dist/components/charts/HorizontalBarChart/index.d.ts +3 -0
  54. package/dist/components/charts/LineChart/LineChart.js +9 -26
  55. package/dist/components/charts/LineChart/LineChart.types.d.ts +11 -14
  56. package/dist/components/charts/LineChart/LineChart.types.js +11 -3
  57. package/dist/components/charts/LollipopChart/LollipopChart.d.ts +3 -0
  58. package/dist/components/charts/LollipopChart/LollipopChart.js +361 -0
  59. package/dist/components/charts/LollipopChart/LollipopChart.types.d.ts +42 -0
  60. package/dist/components/charts/LollipopChart/LollipopChart.types.js +12 -0
  61. package/dist/components/charts/LollipopChart/index.d.ts +3 -0
  62. package/dist/components/charts/ScatterPlot/ScatterPlot.js +5 -4
  63. package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +14 -19
  64. package/dist/components/charts/ScatterPlot/ScatterPlot.types.js +9 -2
  65. package/dist/components/charts/StackedBarChart/StackedBarChart.js +150 -132
  66. package/dist/components/charts/StackedBarChart/StackedBarChart.types.d.ts +20 -18
  67. package/dist/components/charts/StackedBarChart/StackedBarChart.types.js +10 -4
  68. package/dist/components/charts/hooks/useChartAccessibility.d.ts +1 -1
  69. package/dist/components/charts/hooks/useChartAccessibility.js +3 -0
  70. package/dist/components/charts/hooks/useTooltipPosition.js +18 -6
  71. package/dist/components/charts/index.d.ts +6 -0
  72. package/dist/components/charts/index.js +6 -0
  73. package/dist/components/charts/shared/ChartAxis/CategoryYAxis.d.ts +14 -0
  74. package/dist/components/charts/shared/ChartAxis/CategoryYAxis.js +35 -0
  75. package/dist/components/charts/shared/ChartAxis/ChartAxis.types.d.ts +69 -8
  76. package/dist/components/charts/shared/ChartAxis/ValueXAxis.d.ts +14 -0
  77. package/dist/components/charts/shared/ChartAxis/ValueXAxis.js +64 -0
  78. package/dist/components/charts/shared/ChartAxis/XAxis.js +1 -1
  79. package/dist/components/charts/shared/ChartAxis/YAxis.js +2 -2
  80. package/dist/components/charts/shared/ChartAxis/index.d.ts +3 -1
  81. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +0 -2
  82. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +1 -1
  83. package/dist/components/charts/shared/ChartGrid/VerticalGrid.d.ts +29 -0
  84. package/dist/components/charts/shared/ChartGrid/VerticalGrid.js +26 -0
  85. package/dist/components/charts/shared/ChartGrid/index.d.ts +2 -0
  86. package/dist/components/charts/shared/ChartMarker/ChartMarker.js +7 -1
  87. package/dist/components/charts/theme/chart.theme.js +18 -23
  88. package/dist/components/charts/types/chart.types.d.ts +9 -5
  89. package/dist/components/charts/types/chart.types.js +1 -7
  90. package/dist/components/charts/utils/animation-utils.js +1 -3
  91. package/dist/components/charts/utils/bar-emphasis.d.ts +32 -3
  92. package/dist/components/charts/utils/bar-emphasis.js +24 -8
  93. package/dist/components/charts/utils/index.d.ts +1 -0
  94. package/dist/components/charts/utils/series-color.d.ts +7 -0
  95. package/dist/components/charts/utils/series-color.js +20 -0
  96. package/dist/components/core/Accordion/Accordion.theme.js +2 -2
  97. package/dist/components/core/Accordion/AccordionTrigger.js +2 -2
  98. package/dist/components/core/Alert/Alert.animations.d.ts +2 -1
  99. package/dist/components/core/Alert/Alert.animations.js +21 -6
  100. package/dist/components/core/Alert/Alert.js +7 -7
  101. package/dist/components/core/Avatar/Avatar.js +50 -42
  102. package/dist/components/core/Avatar/Avatar.theme.d.ts +8 -4
  103. package/dist/components/core/Avatar/Avatar.theme.js +64 -8
  104. package/dist/components/core/Avatar/Avatar.types.d.ts +13 -2
  105. package/dist/components/core/Avatar/index.d.ts +1 -1
  106. package/dist/components/core/AvatarGroup/AvatarGroup.js +6 -8
  107. package/dist/components/core/AvatarGroup/AvatarGroup.theme.d.ts +1 -2
  108. package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +2 -6
  109. package/dist/components/core/AvatarGroup/AvatarGroup.types.d.ts +0 -6
  110. package/dist/components/core/AvatarGroup/index.d.ts +1 -1
  111. package/dist/components/core/Badge/Badge.animations.js +4 -2
  112. package/dist/components/core/Badge/Badge.js +9 -4
  113. package/dist/components/core/Badge/Badge.theme.js +18 -12
  114. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.d.ts +1 -4
  115. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +2 -2
  116. package/dist/components/core/Button/Button.js +9 -17
  117. package/dist/components/core/Button/Button.ripple.js +2 -2
  118. package/dist/components/core/Button/Button.theme.d.ts +2 -0
  119. package/dist/components/core/Button/Button.theme.js +34 -21
  120. package/dist/components/core/Button/Button.types.d.ts +18 -1
  121. package/dist/components/core/Calendar/Calendar.js +20 -5
  122. package/dist/components/core/Calendar/Calendar.theme.js +14 -22
  123. package/dist/components/core/Calendar/Calendar.types.d.ts +0 -1
  124. package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +3 -3
  125. package/dist/components/core/Card/Card.theme.js +12 -4
  126. package/dist/components/core/Card/CardBody.js +1 -1
  127. package/dist/components/core/Card/CardFooter.js +1 -1
  128. package/dist/components/core/Card/CardHeader.js +1 -1
  129. package/dist/components/core/Carousel/CarouselNext.js +2 -2
  130. package/dist/components/core/Carousel/CarouselPrevious.js +2 -2
  131. package/dist/components/core/CommandPalette/CommandPalette.js +5 -4
  132. package/dist/components/core/CommandPalette/CommandPalette.theme.js +3 -7
  133. package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +2 -0
  134. package/dist/components/core/ContextMenu/ContextMenuItem.js +2 -2
  135. package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +2 -2
  136. package/dist/components/core/Drawer/Drawer.theme.js +7 -4
  137. package/dist/components/core/Drawer/DrawerHeader.js +2 -2
  138. package/dist/components/core/Dropdown/Dropdown.theme.js +3 -1
  139. package/dist/components/core/Dropdown/DropdownItem.js +2 -2
  140. package/dist/components/core/Dropdown/DropdownTrigger.js +16 -5
  141. package/dist/components/core/HeroCard/HeroCard.theme.js +5 -2
  142. package/dist/components/core/Kbd/Kbd.theme.js +4 -2
  143. package/dist/components/core/Link/Link.js +6 -4
  144. package/dist/components/core/Message/Message.js +2 -2
  145. package/dist/components/core/Message/Message.theme.js +5 -7
  146. package/dist/components/core/Message/MessageAudio.js +2 -2
  147. package/dist/components/core/Message/MessageFile.js +2 -2
  148. package/dist/components/core/Message/MessageLink.js +2 -2
  149. package/dist/components/core/Message/MessageStatusIndicator.js +5 -5
  150. package/dist/components/core/Modal/Modal.d.ts +1 -1
  151. package/dist/components/core/Modal/Modal.js +2 -2
  152. package/dist/components/core/Modal/Modal.theme.js +9 -4
  153. package/dist/components/core/Modal/ModalHeader.js +2 -2
  154. package/dist/components/core/ModalStack/ModalStackModal.js +2 -2
  155. package/dist/components/core/NavItem/NavItem.js +6 -6
  156. package/dist/components/core/OfflineIndicator/OfflineIndicator.animations.d.ts +22 -0
  157. package/dist/components/core/OfflineIndicator/OfflineIndicator.animations.js +54 -0
  158. package/dist/components/core/OfflineIndicator/OfflineIndicator.js +23 -24
  159. package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +25 -6
  160. package/dist/components/core/OfflineIndicator/OfflineIndicator.types.d.ts +17 -0
  161. package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
  162. package/dist/components/core/PageHeading/PageHeadingBackButton.js +2 -2
  163. package/dist/components/core/Pagination/Pagination.js +3 -3
  164. package/dist/components/core/Pagination/Pagination.theme.js +3 -3
  165. package/dist/components/core/Pill/Pill.js +4 -2
  166. package/dist/components/core/Pill/Pill.theme.js +6 -4
  167. package/dist/components/core/Rating/Rating.js +4 -5
  168. package/dist/components/core/Rating/Rating.theme.js +1 -1
  169. package/dist/components/core/Segmented/Segmented.theme.js +9 -6
  170. package/dist/components/core/Sidebar/Sidebar.types.d.ts +4 -2
  171. package/dist/components/core/Sidebar/SidebarHeader.js +2 -2
  172. package/dist/components/core/Sidebar/SidebarMobileTrigger.js +2 -2
  173. package/dist/components/core/Sidebar/SidebarSearch.js +3 -3
  174. package/dist/components/core/Sidebar/SidebarToggle.js +3 -3
  175. package/dist/components/core/Sidebar/SidebarUserProfile.js +2 -2
  176. package/dist/components/core/Sortable/Sortable.js +2 -2
  177. package/dist/components/core/Tag/Tag.js +2 -2
  178. package/dist/components/core/Tag/Tag.theme.js +4 -2
  179. package/dist/components/core/Toast/Toast.js +3 -3
  180. package/dist/components/core/Toast/Toast.types.d.ts +1 -1
  181. package/dist/components/core/Toast/useToast.js +5 -5
  182. package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
  183. package/dist/components/core/Tooltip/Tooltip.js +42 -10
  184. package/dist/components/core/Tooltip/Tooltip.types.d.ts +25 -0
  185. package/dist/components/core/Tree/Tree.js +2 -2
  186. package/dist/components/core/shared/interaction.animations.d.ts +51 -0
  187. package/dist/components/core/shared/interaction.animations.js +59 -0
  188. package/dist/components/data-display/Feed/Feed.js +2 -2
  189. package/dist/components/data-display/GanttChart/GanttChart.theme.js +1 -1
  190. package/dist/components/data-display/GanttChart/GanttChartPanel.js +2 -2
  191. package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +3 -3
  192. package/dist/components/data-display/GanttChart/GanttTaskContextMenu.js +2 -2
  193. package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -2
  194. package/dist/components/data-display/KPI/KPI.js +2 -2
  195. package/dist/components/data-display/KPI/KPI.theme.js +4 -4
  196. package/dist/components/data-display/Metric/Metric.js +2 -2
  197. package/dist/components/data-display/Metric/Metric.theme.js +25 -8
  198. package/dist/components/data-display/Metric/Metric.types.d.ts +1 -1
  199. package/dist/components/data-display/Table/Table.theme.js +9 -9
  200. package/dist/components/data-display/Table/TableActions.js +2 -2
  201. package/dist/components/data-display/Table/TableActionsMenu.js +1 -1
  202. package/dist/components/data-display/Table/TableColumnManager.js +2 -2
  203. package/dist/components/data-display/Table/TableDeclarative.js +3 -3
  204. package/dist/components/data-display/Table/TableFilter.js +4 -4
  205. package/dist/components/data-display/Table/TableHeader.js +3 -3
  206. package/dist/components/data-display/Table/TableRow.js +2 -2
  207. package/dist/components/data-display/Table/TableSelectionHeader.js +3 -3
  208. package/dist/components/data-display/Timeline/TimelineMarker.js +2 -2
  209. package/dist/components/effects/CustomCursor/CustomCursor.js +2 -2
  210. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +2 -2
  211. package/dist/components/effects/DotPattern/DotPattern.js +6 -0
  212. package/dist/components/effects/DotPattern/DotPattern.types.d.ts +4 -2
  213. package/dist/components/effects/MeshGradient/MeshGradient.utils.d.ts +1 -1
  214. package/dist/components/effects/MeshGradient/MeshGradient.utils.js +1 -1
  215. package/dist/components/forms/Checkbox/Checkbox.js +2 -1
  216. package/dist/components/forms/Checkbox/Checkbox.theme.js +2 -2
  217. package/dist/components/forms/ColorPicker/ColorPickerEyeDropper.js +2 -2
  218. package/dist/components/forms/ColorPicker/ColorPickerGradient.js +2 -2
  219. package/dist/components/forms/ColorPicker/ColorPickerHeader.js +2 -2
  220. package/dist/components/forms/ColorPicker/ColorPickerImage.js +3 -3
  221. package/dist/components/forms/ColorPicker/ColorPickerInput.js +2 -2
  222. package/dist/components/forms/ColorPicker/ColorPickerPresets.js +2 -2
  223. package/dist/components/forms/ColorPicker/ColorPickerSavedColors.js +2 -2
  224. package/dist/components/forms/Combobox/Combobox.js +3 -3
  225. package/dist/components/forms/Combobox/Combobox.theme.js +2 -2
  226. package/dist/components/forms/DatePicker/DatePicker.animations.js +16 -25
  227. package/dist/components/forms/DatePicker/DatePicker.theme.js +2 -2
  228. package/dist/components/forms/DatePicker/DatePickerBody.js +1 -1
  229. package/dist/components/forms/DatePicker/DatePickerTrigger.js +2 -2
  230. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +3 -3
  231. package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +1 -1
  232. package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +2 -2
  233. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +2 -2
  234. package/dist/components/forms/FileUpload/FileUpload.js +4 -4
  235. package/dist/components/forms/FileUpload/FileUpload.theme.js +5 -1
  236. package/dist/components/forms/FileUpload/FileUploadProgress.js +7 -7
  237. package/dist/components/forms/Input/Input.js +6 -7
  238. package/dist/components/forms/Input/Input.theme.js +19 -15
  239. package/dist/components/forms/InputAddress/InputAddress.js +10 -3
  240. package/dist/components/forms/InputCounter/InputCounter.js +3 -3
  241. package/dist/components/forms/InputOTP/InputOTP.d.ts +3 -12
  242. package/dist/components/forms/InputOTP/InputOTP.js +140 -151
  243. package/dist/components/forms/InputOTP/InputOTP.theme.d.ts +5 -1
  244. package/dist/components/forms/InputOTP/InputOTP.theme.js +40 -5
  245. package/dist/components/forms/InputOTP/InputOTP.types.d.ts +45 -2
  246. package/dist/components/forms/InputOTP/index.d.ts +1 -1
  247. package/dist/components/forms/InputTag/InputTag.js +5 -5
  248. package/dist/components/forms/InputTag/InputTag.theme.js +1 -2
  249. package/dist/components/forms/Mention/Mention.theme.js +3 -5
  250. package/dist/components/forms/Radio/Radio.js +3 -2
  251. package/dist/components/forms/Radio/Radio.theme.js +2 -2
  252. package/dist/components/forms/RichTextEditor/RichTextEditor.js +22 -23
  253. package/dist/components/forms/Select/Select.d.ts +5 -1
  254. package/dist/components/forms/Select/Select.js +12 -11
  255. package/dist/components/forms/Select/Select.theme.js +4 -4
  256. package/dist/components/forms/Select/Select.types.d.ts +4 -1
  257. package/dist/components/forms/SelectableCard/SelectableCard.animations.d.ts +1 -2
  258. package/dist/components/forms/SelectableCard/SelectableCard.animations.js +6 -7
  259. package/dist/components/forms/SelectableCard/SelectableCard.js +1 -1
  260. package/dist/components/forms/Signature/Signature.js +1 -1
  261. package/dist/components/forms/Slider/Slider.js +24 -11
  262. package/dist/components/forms/Slider/Slider.theme.js +9 -3
  263. package/dist/components/forms/Switch/Switch.theme.js +1 -1
  264. package/dist/components/forms/TimePicker/TimePicker.theme.js +6 -7
  265. package/dist/components/forms/TimePicker/TimePickerContent.js +1 -1
  266. package/dist/components/forms/TimePicker/TimePickerTrigger.js +3 -3
  267. package/dist/components/forms/forms.theme.js +23 -12
  268. package/dist/components/forms/index.js +1 -1
  269. package/dist/components/generative/registry.js +195 -2
  270. package/dist/components/generative/resolvers.js +16 -16
  271. package/dist/components/generative/schema.generated.js +2687 -379
  272. package/dist/components/layout/Section/Section.theme.js +1 -1
  273. package/dist/generative.schema.json +2687 -379
  274. package/dist/hooks/index.d.ts +2 -0
  275. package/dist/hooks/useElapsedTime.d.ts +28 -0
  276. package/dist/hooks/useElapsedTime.js +37 -0
  277. package/dist/hooks/useSelectPortal.d.ts +10 -2
  278. package/dist/hooks/useSelectPortal.js +6 -3
  279. package/dist/index.js +1 -1
  280. package/dist/registry.json +835 -261
  281. package/dist/shadcn-compat.css +1 -1
  282. package/dist/styles.css +1 -1
  283. package/dist/theme.css +5 -1
  284. package/dist/themes/ember.css +131 -0
  285. package/dist/themes/iris.css +94 -0
  286. package/dist/themes/jade.css +139 -0
  287. package/dist/tools.json +2705 -361
  288. package/dist/utils/colorUtils.d.ts +6 -6
  289. package/dist/utils/colorUtils.js +8 -8
  290. package/package.json +9 -6
  291. package/src/global.scss +15 -4
  292. package/src/styles/theme.css +440 -152
  293. package/tailwind.preset.cjs +52 -34
  294. package/dist/components/core/Pill/Pill.animations.d.ts +0 -32
  295. package/dist/components/core/Pill/Pill.animations.js +0 -16
@@ -4,16 +4,22 @@
4
4
  * Record<Size, string> per sub-element, CSS variables for all theming.
5
5
  */
6
6
  const metricTheme = {
7
- // Base container (shared across all variants). Radius + overflow + resting
8
- // surface come from the Card shell Metric renders into (see Metric.tsx).
9
- baseStyle: "transition-colors duration-200",
7
+ // Base container (shared across all variants). Overflow + resting surface
8
+ // come from the Card shell Metric renders into (see Metric.tsx), but Metric
9
+ // is a compact stat tile, not a freeform Card — it overrides the shell's
10
+ // --card-radius with its own --metric-radius (same "rounded-[...]" utility
11
+ // group, so this wins via source order) rather than inheriting Card's
12
+ // radius verbatim.
13
+ baseStyle: "transition-colors duration-200 rounded-[var(--metric-radius)]",
10
14
  // Visual style variants — container surface + structure.
11
15
  // `filled` adds nothing: it inherits the Card shell's --color-surface-raised.
12
16
  // `ghost` clears that fill (`!` beats Card's bg utility regardless of
13
- // source order) so it sits transparent.
17
+ // source order) and cancels the Card shell's elevation shadow (`shadow-none`
18
+ // is registered in the same tailwind-merge `shadow` group as `shadow-surface-*`
19
+ // in cn.ts, so it reliably overrides it) so it sits fully flush/flat.
14
20
  variants: {
15
21
  filled: "",
16
- ghost: "!bg-transparent overflow-visible",
22
+ ghost: "!bg-transparent overflow-visible shadow-none",
17
23
  },
18
24
  // Icon chip base per variant — classes shared across all colors of that variant
19
25
  iconContainerVariants: {
@@ -22,14 +28,18 @@ const metricTheme = {
22
28
  },
23
29
  // Icon tint per semantic color — shared by every variant (the one thing color drives)
24
30
  iconColors: {
25
- neutral: "text-[var(--color-text-primary)]",
31
+ mono: "text-[var(--color-text-primary)]",
26
32
  primary: "text-[var(--color-primary)] dark:text-[var(--color-primary-400)]",
27
33
  success: "text-[var(--color-success)] dark:text-[var(--color-success-400)]",
28
34
  warning: "text-[var(--color-warning)] dark:text-[var(--color-warning-400)]",
29
35
  danger: "text-[var(--color-danger)] dark:text-[var(--color-danger-400)]",
30
36
  },
31
37
  // Size variants — one Record<Size, string> per sub-element
32
- contentPaddingSizes: { sm: "p-3", md: "p-4", lg: "p-5" },
38
+ contentPaddingSizes: {
39
+ sm: "p-[var(--metric-content-p-sm)]",
40
+ md: "p-[var(--metric-content-p-md)]",
41
+ lg: "p-[var(--metric-content-p-lg)]",
42
+ },
33
43
  iconContainerSizes: { sm: "size-8", md: "size-10", lg: "size-12" },
34
44
  // Heights mirror iconContainerSizes — with an icon, the label box spans the
35
45
  // chip's height and centers its text against it (mb-3 spacing is dropped;
@@ -40,7 +50,14 @@ const metricTheme = {
40
50
  md: "text-sm font-medium tracking-tight",
41
51
  lg: "text-sm font-medium tracking-tight",
42
52
  },
43
- valueSizes: { sm: "text-xl", md: "text-3xl", lg: "text-3xl" },
53
+ // text-[length:...] (not bare text-[var(...)]) is required — Tailwind's
54
+ // arbitrary text-[...] syntax is ambiguous between color/font-size and a
55
+ // bare var() resolves to color, silently no-oping the size change.
56
+ valueSizes: {
57
+ sm: "text-[length:var(--metric-value-size-sm)] leading-[1.4]",
58
+ md: "text-[length:var(--metric-value-size-md)] leading-[1.2]",
59
+ lg: "text-[length:var(--metric-value-size-lg)] leading-[1.2]",
60
+ },
44
61
  subtitleSizes: { sm: "text-xs mt-1", md: "text-xs mt-0.5", lg: "text-sm mt-1" },
45
62
  // Common element styles
46
63
  labelStyle: "font-semibold text-[var(--color-text-secondary)] mb-2",
@@ -12,7 +12,7 @@ export interface MetricProps extends React.HTMLAttributes<HTMLDivElement> {
12
12
  /**
13
13
  * Label describing the metric
14
14
  */
15
- label: React.ReactNode;
15
+ label?: React.ReactNode;
16
16
  /**
17
17
  * Optional subtitle or secondary text
18
18
  */
@@ -11,19 +11,19 @@ const tableTheme = {
11
11
  // border, or by the pagination footer's `border-t` when pagination is shown.
12
12
  // `bordered` is a full grid and keeps its closing edge.
13
13
  variants: {
14
- default: "border-[var(--color-border)] dark:border-[var(--color-neutral-700)] " +
14
+ default: "border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
15
15
  "[&>tbody>tr:last-child>td]:border-b-0 " +
16
16
  "[&_td]:px-3 [&_td]:py-2.5 [&_th]:px-3 [&_th]:py-2.5",
17
- striped: "border-[var(--color-border)] dark:border-[var(--color-neutral-700)] " +
18
- "[&>tbody>tr:nth-child(odd)]:bg-[var(--color-neutral-50)] dark:[&>tbody>tr:nth-child(odd)]:bg-[var(--color-neutral-800)] " +
17
+ striped: "border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
18
+ "[&>tbody>tr:nth-child(odd)]:bg-[var(--color-mono-50)] dark:[&>tbody>tr:nth-child(odd)]:bg-[var(--color-mono-800)] " +
19
19
  "[&>tbody>tr:last-child>td]:border-b-0 " +
20
20
  "[&_td]:px-3 [&_td]:py-2.5 [&_th]:px-3 [&_th]:py-2.5",
21
- bordered: "border-t border-l border-[var(--color-border)] dark:border-[var(--color-neutral-700)] " +
21
+ bordered: "border-t border-l border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
22
22
  "[&_td]:border-b [&_td]:border-r [&_th]:border-b [&_th]:border-r " +
23
23
  "[&_td]:border-[var(--color-border)] [&_th]:border-[var(--color-border)] " +
24
- "dark:[&_td]:border-[var(--color-neutral-700)] dark:[&_th]:border-[var(--color-neutral-700)] " +
24
+ "dark:[&_td]:border-[var(--color-mono-700)] dark:[&_th]:border-[var(--color-mono-700)] " +
25
25
  "[&_td]:px-3 [&_td]:py-2.5 [&_th]:px-3 [&_th]:py-2.5",
26
- compact: "border-[var(--color-border)] dark:border-[var(--color-neutral-700)] " +
26
+ compact: "border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
27
27
  "[&>tbody>tr:last-child>td]:border-b-0 " +
28
28
  "[&_td]:px-3 [&_td]:py-1 [&_th]:px-3 [&_th]:py-1",
29
29
  },
@@ -61,7 +61,7 @@ const tableTheme = {
61
61
  // Row styles — hover and layout only (borders moved to cells)
62
62
  // Light: neutral-50 hover | Dark: neutral-800 hover
63
63
  rowStyle: "group transition-all duration-300 relative " +
64
- "hover:bg-[var(--color-neutral-50)] " +
64
+ "hover:bg-[var(--color-mono-50)] " +
65
65
  "dark:hover:bg-[var(--color-surface-hover)]",
66
66
  // Selected row styles — background is applied per-cell (in TableCell) so that
67
67
  // sticky/frozen columns repaint correctly. The row only carries the left indicator.
@@ -72,8 +72,8 @@ const tableTheme = {
72
72
  frozenColumnStyle: "sticky left-0 z-10",
73
73
  lastFrozenColumnStyle: "sticky right-0 z-10",
74
74
  frozenHeaderStyle: "sticky top-0 z-20 " +
75
- "shadow-lg shadow-[var(--color-neutral-200)]/50 " +
76
- "dark:shadow-[var(--color-neutral-900)]/50",
75
+ "shadow-lg shadow-[var(--color-mono-200)]/50 " +
76
+ "dark:shadow-[var(--color-mono-900)]/50",
77
77
  // Utility controls - Column manager button
78
78
  // Surface-like control; surface/border/hover tokens flip automatically between light/dark
79
79
  columnManagerButton: "inline-flex items-center gap-2 rounded-[calc(var(--radius-base)*0.75)] px-3 py-2 text-sm font-medium " +
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
3
  import { useMemo, useCallback } from 'react';
4
+ import { DotsThree } from '@phosphor-icons/react';
4
5
  import { cn } from '../../../utils/cn.js';
5
6
  import { Dropdown } from '../../core/Dropdown/Dropdown.js';
6
7
  import '../../core/Dropdown/DropdownTrigger.js';
@@ -10,7 +11,6 @@ import '../../core/Dropdown/DropdownSection.js';
10
11
  import '../../core/Dropdown/DropdownSeparator.js';
11
12
  import '../../core/Dropdown/Dropdown.theme.js';
12
13
  import { Button } from '../../core/Button/Button.js';
13
- import { EllipsisHorizontalIcon } from '@heroicons/react/20/solid';
14
14
 
15
15
  /**
16
16
  * TableActions component with smart display logic
@@ -50,7 +50,7 @@ const TableActions = ({ actions, row, maxVisibleActions = 2, className, }) => {
50
50
  });
51
51
  };
52
52
  const renderOverflowMenu = () => {
53
- return (jsxs(Dropdown, { placement: "bottom-end", offset: 4, disabledKeys: disabledKeys, onAction: handleAction, children: [jsx(Dropdown.Trigger, { children: jsx(Button, { color: "neutral", variant: "ghost", size: "sm", iconOnly: true, "aria-label": "More actions", className: "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] !border-none", children: jsx(EllipsisHorizontalIcon, { className: "size-4" }) }) }), jsx(Dropdown.Menu, { "aria-label": "Row actions", children: sortedActions.map((action) => {
53
+ return (jsxs(Dropdown, { placement: "bottom-end", offset: 4, disabledKeys: disabledKeys, onAction: handleAction, children: [jsx(Dropdown.Trigger, { children: jsx(Button, { color: "mono", variant: "ghost", size: "sm", iconOnly: true, "aria-label": "More actions", className: "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] !border-none", children: jsx(DotsThree, { className: "size-4" }) }) }), jsx(Dropdown.Menu, { "aria-label": "Row actions", children: sortedActions.map((action) => {
54
54
  const Icon = action.icon;
55
55
  return (jsx(Dropdown.Item, { itemKey: action.id, isDanger: action.variant === "danger", startContent: jsx(Icon, { className: "size-4" }), children: action.label }, action.id));
56
56
  }) })] }));
@@ -19,7 +19,7 @@ const TableActionsMenu = ({ actions, row, onClose, className, }) => {
19
19
  var _a;
20
20
  const isDisabled = (_a = action.disabled) === null || _a === void 0 ? void 0 : _a.call(action, row);
21
21
  const Icon = action.icon;
22
- return (jsxs(Button, { variant: "ghost", color: action.variant === 'danger' ? 'danger' : 'neutral', size: "sm", onClick: () => handleActionClick(action), disabled: isDisabled, className: "w-full justify-start gap-3", role: "menuitem", "aria-label": action.label, children: [jsx(Icon, { className: "size-4 flex-shrink-0" }), jsx("span", { children: action.label })] }, action.id));
22
+ return (jsxs(Button, { variant: "ghost", color: action.variant === 'danger' ? 'danger' : 'mono', size: "sm", onClick: () => handleActionClick(action), disabled: isDisabled, className: "w-full justify-start gap-3", role: "menuitem", "aria-label": action.label, children: [jsx(Icon, { className: "size-4 flex-shrink-0" }), jsx("span", { children: action.label })] }, action.id));
23
23
  }) }));
24
24
  };
25
25
 
@@ -3,7 +3,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { Popover } from '../../core/Popover/Popover.js';
4
4
  import '../../core/Popover/PopoverContext.js';
5
5
  import '../../core/Popover/PopoverBody.js';
6
- import { Cog6ToothIcon } from '@heroicons/react/24/outline';
6
+ import { Gear } from '@phosphor-icons/react';
7
7
  import { Button } from '../../core/Button/Button.js';
8
8
  import 'react';
9
9
  import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
@@ -19,7 +19,7 @@ function TableColumnManagerComponent({ columns, visibleColumns, columnOrder, onT
19
19
  const displayName = typeof column.header === 'string' ? column.header : column.id;
20
20
  return (jsx(Checkbox, { id: `column-checkbox-${column.id}`, name: `column-${column.id}`, value: column.id, checked: isVisible, onChange: () => onToggleColumn(column.id), "aria-label": `Toggle visibility for ${displayName} column`, label: displayName, state: isLocked ? 'disabled' : 'default' }));
21
21
  };
22
- return (jsxs(Popover, { placement: "bottom-end", offset: 8, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "neutral", variant: "filled", "aria-label": "Manage column visibility", children: [jsx(Cog6ToothIcon, { className: "size-5", "aria-hidden": "true" }), "Manage Columns"] }) }), jsx(Popover.Body, { className: "p-0", children: jsxs("div", { className: "w-64 p-3 overflow-hidden", role: "dialog", "aria-labelledby": "column-manager-title", "aria-describedby": "column-manager-description", "aria-modal": "true", children: [jsx("div", { id: "column-manager-title", className: "text-sm uppercase font-bold mb-3 text-[var(--color-text-placeholder)]", children: "Manage Columns" }), jsx("div", { id: "column-manager-description", className: "sr-only", children: "Use checkboxes to control which columns are visible in the table. Locked columns cannot be hidden." }), jsx("div", { className: "space-y-0.5", role: "group", "aria-label": "Column visibility options", children: onColumnReorder ? (jsx(Sortable, { onReorder: onColumnReorder, showDragHandle: true, className: "space-y-0.5", children: orderedColumns.map((column) => (jsx(SortableItem, { id: column.id, disabled: column.locked === true, className: `hover:bg-[var(--color-surface-hover)] rounded-lg p-1.5 transition-colors ${column.locked ? 'bg-[var(--color-background-secondary)]' : ''}`, children: renderColumnItem(column) }, column.id))) })) : (orderedColumns.map((column) => (jsx("div", { className: `hover:bg-[var(--color-surface-hover)] rounded-lg p-1.5 transition-colors ${column.locked ? 'bg-[var(--color-background-secondary)]' : ''}`, children: renderColumnItem(column) }, column.id)))) }), jsx("div", { className: "mt-3 flex justify-end", children: jsx(Button, { color: "neutral", variant: "filled", className: "w-full", onClick: onResetToDefault, children: "Reset to Default" }) })] }) })] }));
22
+ return (jsxs(Popover, { placement: "bottom-end", offset: 8, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "mono", variant: "filled", "aria-label": "Manage column visibility", children: [jsx(Gear, { className: "size-5", "aria-hidden": "true" }), "Manage Columns"] }) }), jsx(Popover.Body, { className: "p-0", children: jsxs("div", { className: "w-64 p-3 overflow-hidden", role: "dialog", "aria-labelledby": "column-manager-title", "aria-describedby": "column-manager-description", "aria-modal": "true", children: [jsx("div", { id: "column-manager-title", className: "text-sm uppercase font-bold mb-3 text-[var(--color-text-placeholder)]", children: "Manage Columns" }), jsx("div", { id: "column-manager-description", className: "sr-only", children: "Use checkboxes to control which columns are visible in the table. Locked columns cannot be hidden." }), jsx("div", { className: "space-y-0.5", role: "group", "aria-label": "Column visibility options", children: onColumnReorder ? (jsx(Sortable, { onReorder: onColumnReorder, showDragHandle: true, className: "space-y-0.5", children: orderedColumns.map((column) => (jsx(SortableItem, { id: column.id, disabled: column.locked === true, className: `hover:bg-[var(--color-surface-hover)] rounded-lg p-1.5 transition-colors ${column.locked ? 'bg-[var(--color-background-secondary)]' : ''}`, children: renderColumnItem(column) }, column.id))) })) : (orderedColumns.map((column) => (jsx("div", { className: `hover:bg-[var(--color-surface-hover)] rounded-lg p-1.5 transition-colors ${column.locked ? 'bg-[var(--color-background-secondary)]' : ''}`, children: renderColumnItem(column) }, column.id)))) }), jsx("div", { className: "mt-3 flex justify-end", children: jsx(Button, { color: "mono", variant: "filled", className: "w-full", onClick: onResetToDefault, children: "Reset to Default" }) })] }) })] }));
23
23
  }
24
24
  const TableColumnManager = TableColumnManagerComponent;
25
25
 
@@ -4,7 +4,7 @@ import React__default, { useContext } from 'react';
4
4
  import { TableContext } from './TableContext.js';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { alignmentClasses } from './Table.utils.js';
7
- import { ChevronUpIcon, ChevronDownIcon } from '@heroicons/react/16/solid';
7
+ import { CaretUp, CaretDown } from '@phosphor-icons/react';
8
8
 
9
9
  /**
10
10
  * Declarative Table Header component
@@ -58,8 +58,8 @@ const HeaderCellComponent = ({ children, isFrozen = false, isLastFrozen = false,
58
58
  'justify-end': align === 'right',
59
59
  'justify-center': align === 'center',
60
60
  }), children: [children, isSortable && sortDirection && (jsx("span", { className: "ml-1", children: sortDirection === 'asc'
61
- ? jsx(ChevronUpIcon, { className: "size-3.5" })
62
- : jsx(ChevronDownIcon, { className: "size-3.5" }) }))] }) }));
61
+ ? jsx(CaretUp, { className: "size-3.5" })
62
+ : jsx(CaretDown, { className: "size-3.5" }) }))] }) }));
63
63
  };
64
64
  HeaderCellComponent.displayName = 'Table.HeaderCell';
65
65
  const HeaderCell = React__default.memo(HeaderCellComponent);
@@ -11,7 +11,7 @@ import '../../forms/Select/Select.theme.js';
11
11
  import { Popover } from '../../core/Popover/Popover.js';
12
12
  import '../../core/Popover/PopoverContext.js';
13
13
  import '../../core/Popover/PopoverBody.js';
14
- import { FunnelIcon, XMarkIcon, PlusIcon } from '@heroicons/react/24/outline';
14
+ import { Funnel, X, Plus } from '@phosphor-icons/react';
15
15
  import { cn } from '../../../utils/cn.js';
16
16
 
17
17
  /**
@@ -214,7 +214,7 @@ function TableFilter({ columns, filterConfig, onFilterChange, filterLogic: contr
214
214
  return true;
215
215
  return f.value != null && f.value !== "";
216
216
  }).length;
217
- return (jsxs(Popover, { placement: "bottom-end", offset: 8, closeOnClickOutside: false, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "neutral", variant: "outline", "aria-label": "Filter table data", size: "sm", children: [jsx(FunnelIcon, { className: "size-4", "aria-hidden": "true" }), "Filters", appliedFilterCount > 0 && (jsx("span", { className: "ml-1 inline-flex items-center justify-center size-5 rounded-full bg-[var(--color-primary)] text-[var(--color-primary-contrast)] text-sm font-medium", children: appliedFilterCount }))] }) }), jsx(Popover.Body, { className: "p-0 max-w-none", children: jsxs("div", { className: cn("w-[500px] p-3", className), role: "dialog", "aria-labelledby": "table-filter-title", "aria-modal": "true", children: [jsxs("div", { className: "flex items-center justify-between mb-3", children: [jsx("div", { id: "table-filter-title", className: "text-sm uppercase font-bold text-[var(--color-text-placeholder)]", children: "Filters" }), activeFilters.length > 1 && (jsxs("div", { className: "flex items-center gap-0.5 rounded-md bg-[var(--color-surface-sunken)] p-0.5", children: [jsx("button", { type: "button", className: cn("px-2.5 py-0.5 text-sm font-medium rounded transition-colors", filterLogic === "and"
217
+ return (jsxs(Popover, { placement: "bottom-end", offset: 8, closeOnClickOutside: false, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "mono", variant: "outline", "aria-label": "Filter table data", size: "sm", children: [jsx(Funnel, { className: "size-4", "aria-hidden": "true" }), "Filters", appliedFilterCount > 0 && (jsx("span", { className: "ml-1 inline-flex items-center justify-center size-5 rounded-full bg-[var(--color-primary)] text-[var(--color-primary-contrast)] text-sm font-medium", children: appliedFilterCount }))] }) }), jsx(Popover.Body, { className: "p-0 max-w-none", children: jsxs("div", { className: cn("w-[500px] p-3", className), role: "dialog", "aria-labelledby": "table-filter-title", "aria-modal": "true", children: [jsxs("div", { className: "flex items-center justify-between mb-3", children: [jsx("div", { id: "table-filter-title", className: "text-sm uppercase font-bold text-[var(--color-text-placeholder)]", children: "Filters" }), activeFilters.length > 1 && (jsxs("div", { className: "flex items-center gap-0.5 rounded-md bg-[var(--color-surface-sunken)] p-0.5", children: [jsx("button", { type: "button", className: cn("px-2.5 py-0.5 text-sm font-medium rounded transition-colors", filterLogic === "and"
218
218
  ? "bg-[var(--color-background)] text-[var(--color-text-primary)] shadow-sm"
219
219
  : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"), onClick: () => handleSetLogic("and"), children: "AND" }), jsx("button", { type: "button", className: cn("px-2.5 py-0.5 text-sm font-medium rounded transition-colors", filterLogic === "or"
220
220
  ? "bg-[var(--color-background)] text-[var(--color-text-primary)] shadow-sm"
@@ -222,8 +222,8 @@ function TableFilter({ columns, filterConfig, onFilterChange, filterLogic: contr
222
222
  const selectedColumn = getSelectedColumn(filter.columnId);
223
223
  const resolvedType = getResolvedFilterType(selectedColumn);
224
224
  const operatorOptions = getOperatorsForFilterType(resolvedType);
225
- return (jsxs("div", { className: "flex items-center gap-1.5", children: [jsx(Select, { value: filter.columnId, onChange: (value) => handleFilterColumnChange(filter.id, value), options: columnOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(Select, { value: filter.operator, onChange: (value) => handleFilterOperatorChange(filter.id, value), options: operatorOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(FilterValueInput, { filter: filter, column: selectedColumn, filterType: resolvedType, onValueChange: (value) => handleFilterValueChange(filter.id, value) }), jsx(Button, { color: "neutral", variant: "ghost", size: "sm", iconOnly: true, onClick: () => handleRemoveFilter(filter.id), "aria-label": "Remove filter", className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", children: jsx(XMarkIcon, { className: "size-4", strokeWidth: 2.5 }) })] }, filter.id));
226
- }) }), jsxs("div", { className: "mt-3 flex items-center gap-4", children: [jsxs(Link, { color: "neutral", size: "sm", onClick: handleAddFilter, children: [jsx(PlusIcon, { className: "size-4" }), "Add Filter"] }), activeFilters.length > 0 && (jsx(Link, { color: "neutral", size: "sm", onClick: handleClearAll, children: "Clear All" }))] })] }) })] }));
225
+ return (jsxs("div", { className: "flex items-center gap-1.5", children: [jsx(Select, { value: filter.columnId, onChange: (value) => handleFilterColumnChange(filter.id, value), options: columnOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(Select, { value: filter.operator, onChange: (value) => handleFilterOperatorChange(filter.id, value), options: operatorOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(FilterValueInput, { filter: filter, column: selectedColumn, filterType: resolvedType, onValueChange: (value) => handleFilterValueChange(filter.id, value) }), jsx(Button, { color: "mono", variant: "ghost", size: "sm", iconOnly: true, onClick: () => handleRemoveFilter(filter.id), "aria-label": "Remove filter", className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", children: jsx(X, { className: "size-4", weight: "bold" }) })] }, filter.id));
226
+ }) }), jsxs("div", { className: "mt-3 flex items-center gap-4", children: [jsxs(Link, { color: "mono", size: "sm", onClick: handleAddFilter, children: [jsx(Plus, { className: "size-4" }), "Add Filter"] }), activeFilters.length > 0 && (jsx(Link, { color: "mono", size: "sm", onClick: handleClearAll, children: "Clear All" }))] })] }) })] }));
227
227
  }
228
228
 
229
229
  export { TableFilter };
@@ -4,7 +4,7 @@ import { useCallback } from 'react';
4
4
  import { TableCell } from './TableCell.js';
5
5
  import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
6
6
  import { getRowId, UTILITY_COLUMN_WIDTH, UTILITY_COLUMN_ID } from './Table.utils.js';
7
- import { ChevronUpIcon, ChevronDownIcon } from '@heroicons/react/16/solid';
7
+ import { CaretUp, CaretDown } from '@phosphor-icons/react';
8
8
 
9
9
  function TableHeaderComponent({ columns, sortConfig = [], onSortChange, freezeHeader, freezeFirstColumn, freezeLastColumn, expandable, expandedRowRender, selectable, selectionType, selectedRows = [], onSelectionChange, theme, data = [], rowKey, }) {
10
10
  const handleSort = useCallback((columnId) => {
@@ -51,8 +51,8 @@ function TableHeaderComponent({ columns, sortConfig = [], onSortChange, freezeHe
51
51
  const currentSort = sortConfig.find(sort => sort.columnId === column.id);
52
52
  const isSortable = column.sortable && onSortChange;
53
53
  return (jsx(TableCell, { column: column, row: null, rowId: "header", isHeader: true, isFrozen: freezeFirstColumn && index === 0, isLastFrozen: freezeLastColumn && index === columns.length - 1, sortDirection: currentSort === null || currentSort === void 0 ? void 0 : currentSort.direction, theme: theme, children: isSortable ? (jsxs("button", { onClick: () => handleSort(column.id), className: "flex items-center gap-1 w-full text-left hover:text-[var(--color-primary)] transition-colors", "aria-label": `Sort by ${typeof column.header === 'string' ? column.header : column.id}`, children: [column.header, currentSort && (jsx("span", { className: "text-sm", children: currentSort.direction === 'asc'
54
- ? jsx(ChevronUpIcon, { className: "size-3.5" })
55
- : jsx(ChevronDownIcon, { className: "size-3.5" }) }))] })) : (column.header) }, column.id));
54
+ ? jsx(CaretUp, { className: "size-3.5" })
55
+ : jsx(CaretDown, { className: "size-3.5" }) }))] })) : (column.header) }, column.id));
56
56
  })] }) }));
57
57
  }
58
58
  const TableHeader = TableHeaderComponent;
@@ -6,7 +6,7 @@ import { TableCell } from './TableCell.js';
6
6
  import { Button } from '../../core/Button/Button.js';
7
7
  import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
8
8
  import { Radio } from '../../forms/Radio/Radio.js';
9
- import { MinusIcon, PlusIcon } from '@heroicons/react/24/outline';
9
+ import { Minus, Plus } from '@phosphor-icons/react';
10
10
  import { UTILITY_COLUMN_WIDTH, UTILITY_COLUMN_ID } from './Table.utils.js';
11
11
  import { cn } from '../../../utils/cn.js';
12
12
  import { tableExpandAnimations, tableExpandContentAnimations } from './Table.animations.js';
@@ -31,7 +31,7 @@ function TableRowComponent({ row, rowId, columns, onRowClick, expandedRowRender,
31
31
  accessor: () => "",
32
32
  width: UTILITY_COLUMN_WIDTH,
33
33
  }, row: row, rowId: rowId, isSelected: isSelected, theme: theme, children: jsxs("div", { className: "flex items-center gap-2", children: [selectable &&
34
- (selectionType === "checkbox" ? (jsx(Checkbox, { id: `table-checkbox-${rowId}`, name: `table-selection-${rowId}`, value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), onClick: (e) => e.stopPropagation(), "aria-label": "Select row" })) : (jsx("div", { onClick: (e) => e.stopPropagation(), children: jsx(Radio, { id: `table-radio-${rowId}`, name: "table-selection", value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), "aria-label": "Select row" }) }))), expandedRowRender && (jsx(Button, { color: "neutral", variant: "outline", size: "sm", iconOnly: true, onClick: handleExpandClick, "aria-label": isExpanded ? "Collapse row" : "Expand row", children: isExpanded ? (jsx(MinusIcon, { className: "size-4", strokeWidth: 2 })) : (jsx(PlusIcon, { className: "size-4", strokeWidth: 2 })) }))] }) })), columns.map((column, index) => (jsx(TableCell, { column: column, row: row, rowId: rowId, isFrozen: freezeFirstColumn && index === 0, isLastFrozen: freezeLastColumn && index === columns.length - 1, isSelected: isSelected, theme: theme }, column.id)))] }), jsx(AnimatePresence, { initial: false, children: isExpanded && expandedRowRender && (jsx(motion.tr, { initial: "collapsed", animate: "expanded", exit: "collapsed", children: jsx("td", { colSpan: colSpan, className: "p-0 border-b border-[var(--color-border)] dark:border-[var(--color-neutral-700)]", children: jsx(motion.div, { variants: tableExpandAnimations, style: { overflow: "hidden" }, children: jsx(motion.div, { variants: tableExpandContentAnimations, children: expandedRowRender(row) }) }) }) }, `${rowId}-expanded`)) })] }));
34
+ (selectionType === "checkbox" ? (jsx(Checkbox, { id: `table-checkbox-${rowId}`, name: `table-selection-${rowId}`, value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), onClick: (e) => e.stopPropagation(), "aria-label": "Select row" })) : (jsx("div", { onClick: (e) => e.stopPropagation(), children: jsx(Radio, { id: `table-radio-${rowId}`, name: "table-selection", value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), "aria-label": "Select row" }) }))), expandedRowRender && (jsx(Button, { color: "mono", variant: "ghost", size: "sm", iconOnly: true, className: "size-6 min-h-0 p-1", onClick: handleExpandClick, "aria-label": isExpanded ? "Collapse row" : "Expand row", children: isExpanded ? (jsx(Minus, { className: "size-4", weight: "bold" })) : (jsx(Plus, { className: "size-4", weight: "bold" })) }))] }) })), columns.map((column, index) => (jsx(TableCell, { column: column, row: row, rowId: rowId, isFrozen: freezeFirstColumn && index === 0, isLastFrozen: freezeLastColumn && index === columns.length - 1, isSelected: isSelected, theme: theme }, column.id)))] }), jsx(AnimatePresence, { initial: false, children: isExpanded && expandedRowRender && (jsx(motion.tr, { initial: "collapsed", animate: "expanded", exit: "collapsed", children: jsx("td", { colSpan: colSpan, className: "!p-0 border-b border-[var(--color-border)] dark:border-[var(--color-mono-700)]", children: jsx(motion.div, { variants: tableExpandAnimations, style: { overflow: "hidden" }, children: jsx(motion.div, { variants: tableExpandContentAnimations, children: expandedRowRender(row) }) }) }) }, `${rowId}-expanded`)) })] }));
35
35
  }
36
36
  TableRowComponent.displayName = "TableRow";
37
37
  const TableRow = React__default.memo(TableRowComponent);
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { XMarkIcon } from '@heroicons/react/24/outline';
3
+ import { X } from '@phosphor-icons/react';
4
4
  import { Button } from '../../core/Button/Button.js';
5
5
  import 'react';
6
6
  import { Link } from '../../core/Link/Link.js';
@@ -16,8 +16,8 @@ const TableSelectionHeader = ({ selectedCount, totalCount, selectedRows, bulkAct
16
16
  return (jsxs("div", { className: cn("flex items-center justify-between px-3 py-1 rounded-lg shadow-xl bg-[var(--color-surface-raised)] z-10", className), children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("span", { className: "text-[var(--color-text-muted)] text-base border-r border-[var(--color-border)] pr-3", children: selectedCount === totalCount
17
17
  ? `All ${selectedCount} selected`
18
18
  : `${selectedCount} selected` }), bulkActions.length > 0 && (jsx("div", { className: "flex items-center gap-2", children: bulkActions.map((action) => {
19
- return (jsx(Button, { color: "neutral", variant: "filled", onClick: () => action.onClick(selectedRows), className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", size: "sm", children: action.label }, action.id));
20
- }) }))] }), jsxs(Link, { color: "primary", onClick: onClearSelection, "aria-label": "Clear selection", children: [jsx(XMarkIcon, { className: "size-4" }), "Clear"] })] }));
19
+ return (jsx(Button, { color: "mono", variant: "filled", onClick: () => action.onClick(selectedRows), className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", size: "sm", children: action.label }, action.id));
20
+ }) }))] }), jsxs(Link, { color: "primary", onClick: onClearSelection, "aria-label": "Clear selection", children: [jsx(X, { className: "size-4" }), "Clear"] })] }));
21
21
  };
22
22
 
23
23
  export { TableSelectionHeader };
@@ -2,7 +2,7 @@
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import React__default from 'react';
4
4
  import { useReducedMotion, motion } from 'motion/react';
5
- import { CheckIcon } from '@heroicons/react/24/solid';
5
+ import { Check } from '@phosphor-icons/react';
6
6
  import { cn } from '../../../utils/cn.js';
7
7
  import { useTimelineContext } from './TimelineContext.js';
8
8
  import { useTimelineItemContext } from './TimelineItem.js';
@@ -24,7 +24,7 @@ const TimelineMarker = React__default.forwardRef(({ icon, className, ...props },
24
24
  if (icon)
25
25
  return icon;
26
26
  if (status === "completed") {
27
- return jsx(CheckIcon, { className: "w-4 h-4" });
27
+ return jsx(Check, { className: "w-4 h-4" });
28
28
  }
29
29
  if (status === "active") {
30
30
  return (jsx("span", { className: "w-2 h-2 rounded-full bg-[var(--color-primary)]" }));
@@ -2,7 +2,7 @@
2
2
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
3
  import * as React from 'react';
4
4
  import { useMotionValue, AnimatePresence, motion, useReducedMotion, useSpring } from 'motion/react';
5
- import { PaperAirplaneIcon } from '@heroicons/react/20/solid';
5
+ import { PaperPlaneTilt } from '@phosphor-icons/react';
6
6
  import { cn } from '../../../utils/cn.js';
7
7
  import { Avatar } from '../../core/Avatar/Avatar.js';
8
8
  import { customCursorVariants, reducedMotionSpringConfig, defaultSpringConfig } from './CustomCursor.animations.js';
@@ -150,7 +150,7 @@ const CustomCursor = React.forwardRef(({ children, size = "md", color = "primary
150
150
  y.set(cursorPos.y);
151
151
  }, [cursorPos, x, y]);
152
152
  // Default content based on shape
153
- const defaultContent = shape === "arrow" ? (jsx(PaperAirplaneIcon, { className: "w-full h-full rotate-180" })) : (jsx("div", { className: "w-full h-full" }));
153
+ const defaultContent = shape === "arrow" ? (jsx(PaperPlaneTilt, { className: "w-full h-full rotate-180" })) : (jsx("div", { className: "w-full h-full" }));
154
154
  return (jsx(AnimatePresence, { children: isActive && (jsx(motion.div, { ref: cursorRef, "data-slot": "custom-cursor", className: cn(customCursorTheme.baseStyle, customCursorTheme.cursorStyle, customCursorTheme.sizes[size], customCursorTheme.colors[color], customCursorTheme.variants[variant], customCursorTheme.shapes[shape], className), style: { top: y, left: x, ...style }, variants: customCursorVariants, initial: "initial", animate: "animate", exit: "exit", role: "presentation", "aria-hidden": "true", ...props, children: children || defaultContent })) }));
155
155
  });
156
156
  CustomCursor.displayName = "CustomCursor";
@@ -10,7 +10,7 @@ const customCursorTheme = {
10
10
  user: "flex items-center gap-2 rounded-full pl-1 pr-3 py-1 shadow-xl",
11
11
  },
12
12
  cursorFollowColors: {
13
- neutral: "bg-[var(--color-background-secondary)]",
13
+ mono: "bg-[var(--color-background-secondary)]",
14
14
  dark: "bg-[var(--color-text-primary)]",
15
15
  primary: "bg-[var(--color-primary)]",
16
16
  success: "bg-[var(--color-success)]",
@@ -23,7 +23,7 @@ const customCursorTheme = {
23
23
  lg: "w-10 h-10",
24
24
  },
25
25
  colors: {
26
- neutral: "text-[var(--color-background-secondary)]",
26
+ mono: "text-[var(--color-background-secondary)]",
27
27
  dark: "text-[var(--color-text-primary)]",
28
28
  primary: "text-[var(--color-primary)]",
29
29
  success: "text-[var(--color-success)]",
@@ -12,6 +12,12 @@ function buildMaskImage(direction, fadeSize) {
12
12
  if (direction === "radial") {
13
13
  return `radial-gradient(ellipse at center, black ${100 - stop}%, transparent 100%)`;
14
14
  }
15
+ if (direction === "center") {
16
+ // Inverse of "radial": dots fade OUT in the center and stay solid toward
17
+ // the edges (a vignette that keeps the content area behind it clear).
18
+ // Larger fadeSize = larger clear zone in the middle.
19
+ return `radial-gradient(ellipse at center, transparent ${stop}%, black 100%)`;
20
+ }
15
21
  const directionMap = {
16
22
  top: "to top",
17
23
  bottom: "to bottom",
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  /** Direction for the fade gradient mask */
3
- export type DotPatternFadeDirection = "radial" | "top" | "bottom" | "left" | "right";
3
+ export type DotPatternFadeDirection = "radial" | "center" | "top" | "bottom" | "left" | "right";
4
4
  export interface DotPatternProps extends React.HTMLAttributes<HTMLDivElement> {
5
5
  /**
6
6
  * Distance between dots in pixels (center to center).
@@ -25,7 +25,9 @@ export interface DotPatternProps extends React.HTMLAttributes<HTMLDivElement> {
25
25
  fade?: boolean;
26
26
  /**
27
27
  * Direction of the fade gradient.
28
- * - "radial" fades from center outward
28
+ * - "radial" fades the edges out (solid center, transparent edges)
29
+ * - "center" fades the center out (transparent center, solid edges — a
30
+ * vignette that keeps content-area behind it clear)
29
31
  * - "top" | "bottom" | "left" | "right" fades toward that edge
30
32
  * @default "radial"
31
33
  */
@@ -78,6 +78,6 @@ export declare const generateMarble: (seed: string, colors: string[], count: num
78
78
  * mis-reads dark tiles like a teal base with a cream accent.) Pass `threshold`
79
79
  * to bias toward light text on more mid-tones (see `contrastTone`). Map the
80
80
  * result to the theme-stable neutral tokens at the call site, e.g.
81
- * `tone === "dark" ? "var(--color-neutral-950)" : "var(--color-neutral-50)"`.
81
+ * `tone === "dark" ? "var(--color-mono-950)" : "var(--color-mono-50)"`.
82
82
  */
83
83
  export declare const getMeshTextTone: (seed: string, colors: string[], count: number, threshold?: number) => ContrastTone;
@@ -102,7 +102,7 @@ const generateMarble = (seed, colors, count) => {
102
102
  * mis-reads dark tiles like a teal base with a cream accent.) Pass `threshold`
103
103
  * to bias toward light text on more mid-tones (see `contrastTone`). Map the
104
104
  * result to the theme-stable neutral tokens at the call site, e.g.
105
- * `tone === "dark" ? "var(--color-neutral-950)" : "var(--color-neutral-50)"`.
105
+ * `tone === "dark" ? "var(--color-mono-950)" : "var(--color-mono-50)"`.
106
106
  */
107
107
  const getMeshTextTone = (seed, colors, count, threshold) => {
108
108
  const { base } = generateMarble(seed, colors, count);
@@ -8,6 +8,7 @@ import { cn } from '../../../utils/cn.js';
8
8
  import { useCheckboxGroupContext } from './CheckboxContext.js';
9
9
  import { CheckboxGroup } from './CheckboxGroup.js';
10
10
  import { reducedMotionVariants, indeterminateVariants, checkmarkVariants } from './Checkbox.animations.js';
11
+ import { CHECK_RIPPLE_MOTION } from '../../core/shared/interaction.animations.js';
11
12
 
12
13
  /**
13
14
  * Checkbox component for selecting one or more options
@@ -75,7 +76,7 @@ const CheckboxComponent = React__default.forwardRef(({ id: idProp, name: namePro
75
76
  ref(node);
76
77
  else if (ref)
77
78
  ref.current = node;
78
- }, type: "checkbox", ...restProps, id: id, name: name, value: value, checked: isChecked, onChange: handleChange, disabled: isDisabled, "aria-describedby": description ? `${id}-description` : undefined, "aria-invalid": !isInGroup && isInvalid ? true : undefined, "data-state": isDisabled ? "disabled" : isInvalid ? "invalid" : "default", className: cn(checkboxTheme.inputStyle, checkboxTheme.sizes[size], indeterminate && "bg-neutral-200") }), jsxs(AnimatePresence, { mode: "wait", children: [indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-neutral-600", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8 L12.5 8", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", variants: shouldReduceMotion ? reducedMotionVariants : indeterminateVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "indeterminate")), isChecked && !indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-[var(--color-primary-contrast)]", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8.5 L6.5 11.5 L12.5 4.5", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", variants: shouldReduceMotion ? reducedMotionVariants : checkmarkVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "checkmark"))] })] }), (label || description) && (jsxs("label", { htmlFor: id, className: cn("cursor-pointer", isDisabled && "cursor-not-allowed"), children: [label && (typeof label === 'string' ? (jsx("span", { className: cn(formLabelTheme.baseStyle, formLabelTheme.stateStyles[visualState], "mb-0"), children: label })) : (label)), description && (typeof description === 'string' ? (jsx("div", { id: `${id}-description`, className: checkboxTheme.descriptionStyle, children: description })) : (description))] }))] }));
79
+ }, type: "checkbox", ...restProps, id: id, name: name, value: value, checked: isChecked, onChange: handleChange, disabled: isDisabled, "aria-describedby": description ? `${id}-description` : undefined, "aria-invalid": !isInGroup && isInvalid ? true : undefined, "data-state": isDisabled ? "disabled" : isInvalid ? "invalid" : "default", className: cn(checkboxTheme.inputStyle, checkboxTheme.sizes[size], indeterminate && "bg-neutral-200") }), jsx(AnimatePresence, { initial: false, children: isChecked && !shouldReduceMotion && (jsx(motion.div, { ...CHECK_RIPPLE_MOTION, className: "absolute inset-0 rounded-[var(--checkbox-radius)] bg-[var(--color-primary)]/40 pointer-events-none z-0" }, "ripple")) }), jsxs(AnimatePresence, { mode: "wait", children: [indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-neutral-600", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8 L12.5 8", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", variants: shouldReduceMotion ? reducedMotionVariants : indeterminateVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "indeterminate")), isChecked && !indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-[var(--color-primary-contrast)]", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8.5 L6.5 11.5 L12.5 4.5", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", variants: shouldReduceMotion ? reducedMotionVariants : checkmarkVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "checkmark"))] })] }), (label || description) && (jsxs("label", { htmlFor: id, className: cn("cursor-pointer", isDisabled && "cursor-not-allowed"), children: [label && (typeof label === 'string' ? (jsx("span", { className: cn(formLabelTheme.baseStyle, formLabelTheme.stateStyles[visualState], "mb-0"), children: label })) : (label)), description && (typeof description === 'string' ? (jsx("div", { id: `${id}-description`, className: checkboxTheme.descriptionStyle, children: description })) : (description))] }))] }));
79
80
  });
80
81
  CheckboxComponent.displayName = "Checkbox";
81
82
  const Checkbox = Object.assign(CheckboxComponent, {
@@ -23,8 +23,8 @@ const checkboxTheme = {
23
23
  "disabled:bg-[var(--color-background-disabled)] disabled:checked:outline-0 " +
24
24
  "data-[state=disabled]:border-[var(--color-border)] data-[state=disabled]:bg-[var(--color-background-disabled)] data-[state=disabled]:cursor-not-allowed " +
25
25
  // Disabled state - dark
26
- "dark:disabled:bg-[var(--color-neutral-800)] dark:disabled:border-[var(--color-neutral-600)] " +
27
- "dark:data-[state=disabled]:bg-[var(--color-neutral-700)] dark:data-[state=disabled]:border-[var(--color-neutral-600)]",
26
+ "dark:disabled:bg-[var(--color-mono-800)] dark:disabled:border-[var(--color-mono-600)] " +
27
+ "dark:data-[state=disabled]:bg-[var(--color-mono-700)] dark:data-[state=disabled]:border-[var(--color-mono-600)]",
28
28
  // Invalid is message-led: the control stays neutral (mirrors Radio). The group's
29
29
  // required asterisk + error message carry the error (see CheckboxGroup). `data-state=invalid`
30
30
  // is still emitted on the input as an unstyled consumer/test hook.
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx } from 'react/jsx-runtime';
3
- import { EyeDropperIcon } from '@heroicons/react/20/solid';
3
+ import { Eyedropper } from '@phosphor-icons/react';
4
4
  import { useContext, useMemo } from 'react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { Button } from '../../core/Button/Button.js';
@@ -44,7 +44,7 @@ const ColorPickerEyeDropper = ({ className, ...props }) => {
44
44
  if (!supportsEyeDropper) {
45
45
  return null;
46
46
  }
47
- return (jsx(Button, { size: "sm", variant: "outline", color: "neutral", iconOnly: true, onClick: handleEyeDropper, disabled: disabled, "aria-label": "Pick color from screen", title: "Pick color from screen", className: cn(theme.eyedropperButtonStyle, className), children: jsx(EyeDropperIcon, { className: "size-4" }) }));
47
+ return (jsx(Button, { size: "sm", variant: "outline", color: "mono", iconOnly: true, onClick: handleEyeDropper, disabled: disabled, "aria-label": "Pick color from screen", title: "Pick color from screen", className: cn(theme.eyedropperButtonStyle, className), children: jsx(Eyedropper, { className: "size-4" }) }));
48
48
  };
49
49
  ColorPickerEyeDropper.displayName = 'ColorPickerEyeDropper';
50
50
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { TrashIcon, PlusIcon, ClipboardDocumentCheckIcon, ClipboardDocumentIcon } from '@heroicons/react/20/solid';
3
+ import { Trash, Plus, ClipboardText } from '@phosphor-icons/react';
4
4
  import { useContext, useState, useRef, useCallback, useEffect } from 'react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { Button } from '../../core/Button/Button.js';
@@ -180,7 +180,7 @@ const ColorPickerGradient = ({ className, ...props }) => {
180
180
  const remaining = gradient.stops.filter(s => s.id !== selectedStop.id);
181
181
  if (remaining[0])
182
182
  selectStop(remaining[0].id);
183
- }, "aria-label": "Remove color stop", children: jsx(TrashIcon, { className: "size-4" }) })), jsx(Button, { variant: "ghost", size: "sm", color: "neutral", iconOnly: true, onClick: () => addGradientStop(50), "aria-label": "Add color stop", children: jsx(PlusIcon, { className: "size-4" }) })] })), jsxs("div", { className: "flex items-center gap-2 border border-[var(--color-border)] rounded-lg px-3 py-2", children: [jsx("code", { className: "flex-1 text-xs font-mono text-[var(--color-text-secondary)] truncate", children: outputCSS }), jsx(Button, { variant: "ghost", size: "sm", color: "neutral", iconOnly: true, onClick: handleCopy, "aria-label": "Copy gradient CSS", title: copied ? 'Copied!' : 'Copy CSS', children: copied ? (jsx(ClipboardDocumentCheckIcon, { className: "size-4 text-[var(--color-success)]" })) : (jsx(ClipboardDocumentIcon, { className: "size-4" })) })] })] }));
183
+ }, "aria-label": "Remove color stop", children: jsx(Trash, { className: "size-4" }) })), jsx(Button, { variant: "ghost", size: "sm", color: "mono", iconOnly: true, onClick: () => addGradientStop(50), "aria-label": "Add color stop", children: jsx(Plus, { className: "size-4" }) })] })), jsxs("div", { className: "flex items-center gap-2 border border-[var(--color-border)] rounded-lg px-3 py-2", children: [jsx("code", { className: "flex-1 text-xs font-mono text-[var(--color-text-secondary)] truncate", children: outputCSS }), jsx(Button, { variant: "ghost", size: "sm", color: "mono", iconOnly: true, onClick: handleCopy, "aria-label": "Copy gradient CSS", title: copied ? 'Copied!' : 'Copy CSS', children: copied ? (jsx(ClipboardText, { className: "size-4 text-[var(--color-success)]" })) : (jsx(ClipboardText, { className: "size-4" })) })] })] }));
184
184
  };
185
185
  ColorPickerGradient.displayName = 'ColorPickerGradient';
186
186
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { XMarkIcon } from '@heroicons/react/20/solid';
3
+ import { X } from '@phosphor-icons/react';
4
4
  import { useContext } from 'react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { ColorPickerContext } from './ColorPickerContext.js';
@@ -25,7 +25,7 @@ const ColorPickerHeader = ({ modes = ['solid'], activeMode: activeModeFromProp,
25
25
  };
26
26
  return (jsxs("div", { className: cn('flex items-center justify-between border-b border-[var(--color-border)] -mx-4 -mt-4 px-4', className), ...props, children: [jsx("div", { className: "flex items-center gap-4", children: modes.map((mode) => (jsxs("button", { type: "button", onClick: () => handleModeChange(mode), className: cn('py-3 text-sm font-medium transition-colors relative cursor-pointer', activeMode === mode
27
27
  ? 'text-[var(--color-primary)]'
28
- : 'text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]'), "aria-selected": activeMode === mode, role: "tab", children: [modeLabels[mode], activeMode === mode && (jsx("div", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-[var(--color-primary)] rounded-full" }))] }, mode))) }), showClose && (jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors rounded-md hover:bg-[var(--color-background-secondary)] cursor-pointer", "aria-label": "Close color picker", children: jsx(XMarkIcon, { className: "size-5" }) }))] }));
28
+ : 'text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]'), "aria-selected": activeMode === mode, role: "tab", children: [modeLabels[mode], activeMode === mode && (jsx("div", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-[var(--color-primary)] rounded-full" }))] }, mode))) }), showClose && (jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors rounded-md hover:bg-[var(--color-background-secondary)] cursor-pointer", "aria-label": "Close color picker", children: jsx(X, { className: "size-5" }) }))] }));
29
29
  };
30
30
  ColorPickerHeader.displayName = 'ColorPickerHeader';
31
31
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { ArrowUpTrayIcon, XMarkIcon } from '@heroicons/react/20/solid';
3
+ import { UploadSimple, X } from '@phosphor-icons/react';
4
4
  import { useContext, useRef, useState, useEffect, useCallback } from 'react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { Button } from '../../core/Button/Button.js';
@@ -141,14 +141,14 @@ const ColorPickerImage = ({ className, ...props }) => {
141
141
  /* Upload dropzone */
142
142
  jsxs("div", { onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, className: cn('flex flex-col items-center justify-center gap-2 h-[200px] rounded-xl border-2 border-dashed cursor-pointer transition-colors', isDragOver
143
143
  ? 'border-[var(--color-primary)] bg-[var(--color-primary-50)]'
144
- : 'border-[var(--color-border)] hover:border-[var(--color-primary)] hover:bg-[var(--color-background-secondary)]'), children: [jsx(ArrowUpTrayIcon, { className: "size-8 text-[var(--color-text-muted)]" }), jsx("div", { className: "text-sm text-[var(--color-text-muted)]", children: "Click or drag an image" }), jsx("div", { className: "text-xs text-[var(--color-text-placeholder)]", children: "PNG, JPG, SVG, WebP" }), jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileChange, className: "hidden", "aria-label": "Upload image" })] })) : (
144
+ : 'border-[var(--color-border)] hover:border-[var(--color-primary)] hover:bg-[var(--color-background-secondary)]'), children: [jsx(UploadSimple, { className: "size-8 text-[var(--color-text-muted)]" }), jsx("div", { className: "text-sm text-[var(--color-text-muted)]", children: "Click or drag an image" }), jsx("div", { className: "text-xs text-[var(--color-text-placeholder)]", children: "PNG, JPG, SVG, WebP" }), jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileChange, className: "hidden", "aria-label": "Upload image" })] })) : (
145
145
  /* Canvas with color picking */
146
146
  jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "relative inline-block rounded-xl overflow-hidden ring-1 ring-inset ring-black/5", children: [jsx("canvas", { ref: canvasRef, onClick: handleCanvasClick, className: "cursor-crosshair block" }), cursorPos && (jsx("div", { className: "absolute w-5 h-5 border-2 border-white rounded-full pointer-events-none", style: {
147
147
  left: `${cursorPos.x}%`,
148
148
  top: `${cursorPos.y}%`,
149
149
  transform: 'translate(-50%, -50%)',
150
150
  boxShadow: '0 0 0 1.5px rgba(0,0,0,0.15), 0 2px 6px rgba(0,0,0,0.15)',
151
- }, children: pickedColor && (jsx("div", { className: "absolute inset-1 rounded-full", style: { backgroundColor: pickedColor } })) }))] }), jsxs("div", { className: "flex items-center justify-between", children: [pickedColor && (jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "size-5 rounded-full border border-[var(--color-border)]", style: { backgroundColor: pickedColor } }), jsx("span", { className: "text-xs font-mono text-[var(--color-text-secondary)]", children: pickedColor })] })), jsxs(Button, { variant: "ghost", size: "sm", color: "neutral", onClick: handleClear, "aria-label": "Remove image", className: "ml-auto", children: [jsx(XMarkIcon, { className: "size-3.5" }), "Change"] })] })] })), !imageLoaded && jsx("canvas", { ref: canvasRef, className: "hidden" })] }));
151
+ }, children: pickedColor && (jsx("div", { className: "absolute inset-1 rounded-full", style: { backgroundColor: pickedColor } })) }))] }), jsxs("div", { className: "flex items-center justify-between", children: [pickedColor && (jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "size-5 rounded-full border border-[var(--color-border)]", style: { backgroundColor: pickedColor } }), jsx("span", { className: "text-xs font-mono text-[var(--color-text-secondary)]", children: pickedColor })] })), jsxs(Button, { variant: "ghost", size: "sm", color: "mono", onClick: handleClear, "aria-label": "Remove image", className: "ml-auto", children: [jsx(X, { className: "size-3.5" }), "Change"] })] })] })), !imageLoaded && jsx("canvas", { ref: canvasRef, className: "hidden" })] }));
152
152
  };
153
153
  ColorPickerImage.displayName = 'ColorPickerImage';
154
154
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { useContext, useState, useEffect } from 'react';
4
- import { ChevronUpDownIcon, ClipboardDocumentCheckIcon, ClipboardDocumentIcon } from '@heroicons/react/20/solid';
4
+ import { CaretUpDown, ClipboardText } from '@phosphor-icons/react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { Button } from '../../core/Button/Button.js';
7
7
  import { ColorPickerContext } from './ColorPickerContext.js';
@@ -83,7 +83,7 @@ const ColorPickerInput = ({ className, ...props }) => {
83
83
  };
84
84
  // Get the current color as rgba for the swatch
85
85
  const swatchColor = `hsla(${color.h}, ${color.s}%, ${color.l}%, ${color.a})`;
86
- return (jsxs("div", { className: cn("flex items-stretch border border-[var(--color-border)] rounded-lg overflow-hidden divide-x divide-[var(--color-border)]", className), ...props, children: [jsxs(Button, { variant: "ghost", size: "sm", color: "neutral", onClick: cycleFormat, "aria-label": "Change color format", className: "!rounded-none !border-0 !px-3 !py-2 flex-shrink-0", children: [formatLabel, jsx(ChevronUpDownIcon, { className: "size-4 text-[var(--color-text-muted)]" })] }), jsxs("div", { className: "flex items-center gap-2 px-3 py-2 flex-1 min-w-0", children: [jsx("div", { className: "size-5 rounded-full flex-shrink-0 border border-[var(--color-border)]", style: { backgroundColor: swatchColor } }), jsx("input", { type: "text", value: format === 'hex' ? inputValue : getDisplayValue(), onChange: handleChange, onBlur: handleBlur, onKeyDown: handleKeyDown, readOnly: format !== 'hex', className: cn("flex-1 min-w-0 bg-transparent text-sm font-mono text-[var(--color-text-primary)] outline-none", isInvalid && "text-[var(--color-danger)]"), "aria-label": "Color value" }), jsx(Button, { variant: "ghost", size: "sm", color: "neutral", iconOnly: true, onClick: handleCopy, "aria-label": "Copy color value", title: copied ? "Copied!" : "Copy color value", className: "!p-0 !size-auto flex-shrink-0", children: copied ? (jsx(ClipboardDocumentCheckIcon, { className: "size-4 text-[var(--color-success)]" })) : (jsx(ClipboardDocumentIcon, { className: "size-4" })) })] }), showAlpha && (jsxs("div", { className: "flex items-center px-3 py-2 flex-shrink-0", children: [jsx("input", { type: "number", min: 0, max: 100, value: alphaPercent, onChange: handleAlphaChange, className: "w-10 bg-transparent text-sm text-[var(--color-text-primary)] text-center outline-none font-mono", "aria-label": "Opacity percentage" }), jsx("span", { className: "text-sm text-[var(--color-text-muted)]", children: "%" })] }))] }));
86
+ return (jsxs("div", { className: cn("flex items-stretch border border-[var(--color-border)] rounded-lg overflow-hidden divide-x divide-[var(--color-border)]", className), ...props, children: [jsxs(Button, { variant: "ghost", size: "sm", color: "mono", onClick: cycleFormat, "aria-label": "Change color format", className: "!rounded-none !border-0 !px-3 !py-2 flex-shrink-0", children: [formatLabel, jsx(CaretUpDown, { className: "size-4 text-[var(--color-text-muted)]" })] }), jsxs("div", { className: "flex items-center gap-2 px-3 py-2 flex-1 min-w-0", children: [jsx("div", { className: "size-5 rounded-full flex-shrink-0 border border-[var(--color-border)]", style: { backgroundColor: swatchColor } }), jsx("input", { type: "text", value: format === 'hex' ? inputValue : getDisplayValue(), onChange: handleChange, onBlur: handleBlur, onKeyDown: handleKeyDown, readOnly: format !== 'hex', className: cn("flex-1 min-w-0 bg-transparent text-sm font-mono text-[var(--color-text-primary)] outline-none", isInvalid && "text-[var(--color-danger)]"), "aria-label": "Color value" }), jsx(Button, { variant: "ghost", size: "sm", color: "mono", iconOnly: true, onClick: handleCopy, "aria-label": "Copy color value", title: copied ? "Copied!" : "Copy color value", className: "!p-0 !size-auto flex-shrink-0", children: copied ? (jsx(ClipboardText, { className: "size-4 text-[var(--color-success)]" })) : (jsx(ClipboardText, { className: "size-4" })) })] }), showAlpha && (jsxs("div", { className: "flex items-center px-3 py-2 flex-shrink-0", children: [jsx("input", { type: "number", min: 0, max: 100, value: alphaPercent, onChange: handleAlphaChange, className: "w-10 bg-transparent text-sm text-[var(--color-text-primary)] text-center outline-none font-mono", "aria-label": "Opacity percentage" }), jsx("span", { className: "text-sm text-[var(--color-text-muted)]", children: "%" })] }))] }));
87
87
  };
88
88
  ColorPickerInput.displayName = "ColorPickerInput";
89
89