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

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 (460) hide show
  1. package/CHANGELOG.md +497 -22
  2. package/dist/components/ai/AgentRequest/AgentRequest.animations.d.ts +25 -0
  3. package/dist/components/ai/AgentRequest/AgentRequest.animations.js +81 -0
  4. package/dist/components/ai/AgentRequest/AgentRequest.d.ts +3 -0
  5. package/dist/components/ai/AgentRequest/AgentRequest.js +435 -0
  6. package/dist/components/ai/AgentRequest/AgentRequest.theme.d.ts +2 -0
  7. package/dist/components/ai/AgentRequest/AgentRequest.theme.js +106 -0
  8. package/dist/components/ai/AgentRequest/AgentRequest.types.d.ts +241 -0
  9. package/dist/components/ai/AgentRequest/index.d.ts +3 -0
  10. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
  11. package/dist/components/ai/PromptInput/PromptInput.js +2 -2
  12. package/dist/components/ai/PromptInput/PromptInput.theme.js +2 -2
  13. package/dist/components/ai/PromptSuggestion/PromptSuggestion.theme.js +2 -2
  14. package/dist/components/ai/Reasoning/Reasoning.js +27 -3
  15. package/dist/components/ai/Reasoning/Reasoning.theme.d.ts +6 -0
  16. package/dist/components/ai/Reasoning/Reasoning.theme.js +36 -0
  17. package/dist/components/ai/Reasoning/Reasoning.types.d.ts +58 -5
  18. package/dist/components/ai/Reasoning/ReasoningTrace.d.ts +11 -0
  19. package/dist/components/ai/Reasoning/ReasoningTrace.js +84 -0
  20. package/dist/components/ai/Reasoning/index.d.ts +2 -1
  21. package/dist/components/ai/StreamingResponse/AnimatedText.d.ts +7 -0
  22. package/dist/components/ai/StreamingResponse/AnimatedText.js +8 -7
  23. package/dist/components/ai/StreamingResponse/MarkdownRenderer.d.ts +5 -0
  24. package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +4 -4
  25. package/dist/components/ai/StreamingResponse/StreamingCursor.d.ts +2 -2
  26. package/dist/components/ai/StreamingResponse/StreamingCursor.js +10 -7
  27. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.d.ts +10 -0
  28. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.js +59 -33
  29. package/dist/components/ai/StreamingResponse/StreamingResponse.js +13 -7
  30. package/dist/components/ai/StreamingResponse/StreamingResponse.types.d.ts +33 -2
  31. package/dist/components/ai/StreamingResponse/StreamingSurface.d.ts +13 -0
  32. package/dist/components/ai/StreamingResponse/StreamingSurface.js +38 -0
  33. package/dist/components/ai/StreamingResponse/WordAnimationContext.d.ts +5 -0
  34. package/dist/components/ai/StreamingResponse/WordAnimationContext.js +5 -4
  35. package/dist/components/ai/StreamingResponse/index.d.ts +4 -2
  36. package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
  37. package/dist/components/ai/index.d.ts +3 -2
  38. package/dist/components/ai/index.js +4 -0
  39. package/dist/components/canvas/BaseNode.js +1 -1
  40. package/dist/components/canvas/CanvasToolbar.js +0 -1
  41. package/dist/components/canvas/Edge.js +2 -2
  42. package/dist/components/canvas/NodeControls.js +0 -1
  43. package/dist/components/canvas/NodeRenderer.js +2 -2
  44. package/dist/components/charts/ActivityRings/ActivityRings.js +2 -2
  45. package/dist/components/charts/ActivityRings/ActivityRings.theme.js +1 -1
  46. package/dist/components/charts/AreaChart/AreaChart.js +3 -3
  47. package/dist/components/charts/AreaChart/AreaChart.theme.js +3 -3
  48. package/dist/components/charts/BarChart/BarChart.js +4 -4
  49. package/dist/components/charts/ComboChart/BarRenderer.js +2 -2
  50. package/dist/components/charts/ComboChart/BarRenderer.types.d.ts +1 -1
  51. package/dist/components/charts/ComboChart/ComboChartCanvas.js +1 -1
  52. package/dist/components/charts/ComboChart/LineRenderer.js +1 -1
  53. package/dist/components/charts/ComboChart/LineRenderer.types.d.ts +1 -1
  54. package/dist/components/charts/DonutChart/DonutChart.theme.js +4 -4
  55. package/dist/components/charts/DonutChart/MultiSegmentDonutChart.theme.js +1 -1
  56. package/dist/components/charts/Heatmap/Heatmap.js +49 -42
  57. package/dist/components/charts/Heatmap/Heatmap.theme.d.ts +6 -2
  58. package/dist/components/charts/Heatmap/Heatmap.theme.js +20 -8
  59. package/dist/components/charts/Heatmap/Heatmap.types.d.ts +49 -82
  60. package/dist/components/charts/Heatmap/HeatmapCell.js +30 -81
  61. package/dist/components/charts/Heatmap/HeatmapLegend.d.ts +7 -6
  62. package/dist/components/charts/Heatmap/HeatmapLegend.js +6 -6
  63. package/dist/components/charts/Heatmap/index.d.ts +1 -1
  64. package/dist/components/charts/Heatmap/utils/heatmapUtils.d.ts +7 -12
  65. package/dist/components/charts/Heatmap/utils/heatmapUtils.js +16 -61
  66. package/dist/components/charts/Heatmap/utils/heatmapUtils.test.d.ts +1 -0
  67. package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.js +1 -1
  68. package/dist/components/charts/LineChart/LineChart.js +2 -2
  69. package/dist/components/charts/LollipopChart/LollipopChart.js +1 -1
  70. package/dist/components/charts/RadarChart/RadarChart.js +1 -1
  71. package/dist/components/charts/StackedBarChart/StackedBarChart.js +3 -3
  72. package/dist/components/charts/hooks/useChartAccessibility.js +9 -6
  73. package/dist/components/charts/index.d.ts +4 -8
  74. package/dist/components/charts/index.js +2 -4
  75. package/dist/components/charts/shared/ChartText/ChartText.theme.js +1 -1
  76. package/dist/components/charts/shared/index.d.ts +1 -1
  77. package/dist/components/charts/theme/chart.theme.js +3 -3
  78. package/dist/components/charts/utils/animation-utils.d.ts +12 -7
  79. package/dist/components/charts/utils/animation-utils.js +19 -19
  80. package/dist/components/core/Accordion/Accordion.theme.js +1 -1
  81. package/dist/components/core/Alert/Alert.animations.d.ts +11 -4
  82. package/dist/components/core/Alert/Alert.animations.js +11 -4
  83. package/dist/components/core/Alert/Alert.js +16 -2
  84. package/dist/components/core/Alert/Alert.theme.js +1 -1
  85. package/dist/components/core/Alert/Alert.types.d.ts +4 -2
  86. package/dist/components/core/AlertDialog/AlertDialog.js +2 -2
  87. package/dist/components/core/Avatar/Avatar.theme.js +1 -1
  88. package/dist/components/core/Badge/Badge.animations.d.ts +0 -5
  89. package/dist/components/core/Badge/Badge.animations.js +5 -84
  90. package/dist/components/core/Badge/Badge.d.ts +7 -4
  91. package/dist/components/core/Badge/Badge.js +27 -64
  92. package/dist/components/core/Badge/Badge.theme.js +8 -12
  93. package/dist/components/core/Badge/Badge.types.d.ts +18 -34
  94. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +4 -4
  95. package/dist/components/core/Button/Button.js +7 -43
  96. package/dist/components/core/Button/Button.theme.js +5 -5
  97. package/dist/components/core/Button/Button.types.d.ts +8 -12
  98. package/dist/components/core/Button/index.d.ts +0 -2
  99. package/dist/components/core/Calendar/Calendar.theme.js +1 -1
  100. package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +2 -2
  101. package/dist/components/core/Card/Card.js +7 -2
  102. package/dist/components/core/Card/Card.theme.js +29 -1
  103. package/dist/components/core/Card/Card.types.d.ts +20 -0
  104. package/dist/components/core/Card/CardBody.js +9 -1
  105. package/dist/components/core/Card/CardContext.d.ts +13 -0
  106. package/dist/components/core/Card/CardContext.js +14 -0
  107. package/dist/components/core/Card/CardHeader.js +4 -1
  108. package/dist/components/core/ContextMenu/ContextMenu.theme.js +4 -3
  109. package/dist/components/core/ContextMenu/ContextMenu.types.d.ts +8 -1
  110. package/dist/components/core/ContextMenu/ContextMenuSub.d.ts +11 -1
  111. package/dist/components/core/ContextMenu/ContextMenuSub.js +35 -22
  112. package/dist/components/core/ContextMenu/ContextMenuSubBody.js +14 -3
  113. package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +21 -8
  114. package/dist/components/core/DragDrop/DragDrop.theme.js +2 -2
  115. package/dist/components/core/Drawer/Drawer.theme.js +1 -1
  116. package/dist/components/core/Drawer/DrawerHeader.js +0 -1
  117. package/dist/components/core/Dropdown/DropdownMenu.js +22 -7
  118. package/dist/components/core/Link/Link.js +1 -1
  119. package/dist/components/core/Masonry/Masonry.theme.js +1 -1
  120. package/dist/components/core/MenuItem/MenuItem.js +2 -1
  121. package/dist/components/core/MenuItem/MenuItem.theme.js +13 -1
  122. package/dist/components/core/Message/Message.js +2 -0
  123. package/dist/components/core/Message/Message.theme.js +3 -3
  124. package/dist/components/core/Modal/Modal.animations.d.ts +1 -1
  125. package/dist/components/core/Modal/Modal.animations.js +50 -11
  126. package/dist/components/core/Modal/Modal.js +5 -1
  127. package/dist/components/core/Modal/Modal.theme.js +1 -1
  128. package/dist/components/core/Modal/ModalHeader.js +0 -1
  129. package/dist/components/core/ModalStack/ModalStackModal.js +3 -1
  130. package/dist/components/core/NavItem/NavItem.js +3 -2
  131. package/dist/components/core/NavItem/NavItem.theme.js +1 -1
  132. package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +4 -2
  133. package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
  134. package/dist/components/core/Pagination/Pagination.theme.js +2 -2
  135. package/dist/components/core/Pill/Pill.js +34 -18
  136. package/dist/components/core/Pill/Pill.theme.js +4 -2
  137. package/dist/components/core/Pill/Pill.types.d.ts +14 -1
  138. package/dist/components/core/Popover/PopoverBody.js +16 -5
  139. package/dist/components/core/Progress/Progress.d.ts +0 -25
  140. package/dist/components/core/Progress/Progress.js +79 -11
  141. package/dist/components/core/Progress/Progress.theme.js +17 -0
  142. package/dist/components/core/Progress/Progress.types.d.ts +47 -1
  143. package/dist/components/core/Rating/Rating.theme.js +1 -1
  144. package/dist/components/core/Rating/Rating.types.d.ts +3 -2
  145. package/dist/components/core/ScrollArea/ScrollArea.js +1 -1
  146. package/dist/components/core/ScrollArea/ScrollArea.theme.js +1 -1
  147. package/dist/components/core/Segmented/Segmented.theme.js +3 -3
  148. package/dist/components/core/Segmented/SegmentedContext.js +1 -0
  149. package/dist/components/core/Sidebar/Sidebar.js +5 -2
  150. package/dist/components/core/Sidebar/Sidebar.theme.js +2 -2
  151. package/dist/components/core/Sidebar/SidebarContent.js +1 -1
  152. package/dist/components/core/Sidebar/SidebarHeader.js +1 -1
  153. package/dist/components/core/Sidebar/SidebarSearch.js +2 -2
  154. package/dist/components/core/Sidebar/SidebarToggle.js +1 -1
  155. package/dist/components/core/Sidebar/SidebarUserProfile.js +1 -1
  156. package/dist/components/core/SlidingNumber/SlidingNumber.d.ts +8 -0
  157. package/dist/components/core/SlidingNumber/SlidingNumber.js +12 -3
  158. package/dist/components/core/Sortable/Sortable.theme.js +1 -1
  159. package/dist/components/core/Tabs/Tabs.theme.js +1 -1
  160. package/dist/components/core/Tag/Tag.theme.js +1 -1
  161. package/dist/components/core/Toast/ToastProvider.js +1 -1
  162. package/dist/components/core/Tree/Tree.theme.js +1 -1
  163. package/dist/components/core/index.d.ts +0 -2
  164. package/dist/components/core/index.js +0 -4
  165. package/dist/components/core/shared/ChartTooltip/ChartTooltip.animations.d.ts +4 -0
  166. package/dist/components/core/shared/ChartTooltip/ChartTooltip.animations.js +20 -0
  167. package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.js +1 -1
  168. package/dist/components/core/shared/Ripple.d.ts +16 -0
  169. package/dist/components/core/shared/Ripple.js +141 -0
  170. package/dist/components/data-display/GanttChart/GanttChart.theme.js +6 -6
  171. package/dist/components/data-display/GanttChart/GanttTaskBar.js +1 -1
  172. package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +1 -1
  173. package/dist/components/data-display/GanttChart/GanttToolbar.js +0 -1
  174. package/dist/components/data-display/KPI/KPI.js +11 -20
  175. package/dist/components/data-display/KPI/KPI.theme.js +8 -4
  176. package/dist/components/data-display/Metric/Metric.theme.js +4 -4
  177. package/dist/components/data-display/Table/Table.theme.js +2 -2
  178. package/dist/components/data-display/Table/TableColumnManager.js +1 -2
  179. package/dist/components/data-display/Table/TableContext.js +1 -0
  180. package/dist/components/data-display/Table/TableFilter.js +9 -2
  181. package/dist/components/data-display/Table/TableSelectionHeader.js +1 -1
  182. package/dist/components/data-display/Timeline/Timeline.theme.js +1 -1
  183. package/dist/components/effects/CustomCursor/CustomCursor.d.ts +1 -1
  184. package/dist/components/effects/CustomCursor/CustomCursor.js +1 -1
  185. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +4 -4
  186. package/dist/components/effects/Neumorphic/InsetCircleButton.js +1 -1
  187. package/dist/components/effects/Overlay/Overlay.js +7 -3
  188. package/dist/components/effects/index.d.ts +0 -32
  189. package/dist/components/effects/index.js +0 -16
  190. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.d.ts +0 -2
  191. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.js +1 -93
  192. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.types.d.ts +0 -10
  193. package/dist/components/effects/shared/ShaderCanvas/index.d.ts +1 -1
  194. package/dist/components/effects/shared/index.d.ts +1 -3
  195. package/dist/components/effects/shared/shaderNoise.glsl.d.ts +1 -1
  196. package/dist/components/effects/shared/shaderNoise.glsl.js +2 -11
  197. package/dist/components/forms/Checkbox/Checkbox.theme.js +1 -1
  198. package/dist/components/forms/ColorPicker/ColorPicker.js +45 -3
  199. package/dist/components/forms/ColorPicker/ColorPickerBody.js +8 -4
  200. package/dist/components/forms/ColorPicker/ColorPickerHeader.js +1 -1
  201. package/dist/components/forms/ColorPicker/ColorPickerImage.js +1 -1
  202. package/dist/components/forms/Combobox/Combobox.js +10 -4
  203. package/dist/components/forms/Combobox/Combobox.theme.js +9 -0
  204. package/dist/components/forms/Combobox/Combobox.types.d.ts +13 -0
  205. package/dist/components/forms/DatePicker/DatePicker.js +19 -12
  206. package/dist/components/forms/DatePicker/DatePicker.theme.js +5 -0
  207. package/dist/components/forms/DatePicker/DatePicker.types.d.ts +8 -0
  208. package/dist/components/forms/DatePicker/DatePickerContext.d.ts +0 -1
  209. package/dist/components/forms/DatePicker/DatePickerTrigger.js +5 -3
  210. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +6 -1
  211. package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +8 -0
  212. package/dist/components/forms/DateRangePicker/DateRangePickerContext.js +1 -0
  213. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +5 -3
  214. package/dist/components/forms/FileUpload/FileUpload.theme.js +2 -2
  215. package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +1 -1
  216. package/dist/components/forms/Input/Input.js +17 -12
  217. package/dist/components/forms/Input/Input.theme.js +10 -0
  218. package/dist/components/forms/Input/Input.types.d.ts +14 -0
  219. package/dist/components/forms/InputAddress/InputAddress.js +5 -5
  220. package/dist/components/forms/InputAddress/InputAddress.types.d.ts +9 -2
  221. package/dist/components/forms/InputCounter/InputCounter.js +194 -17
  222. package/dist/components/forms/InputCounter/InputCounter.theme.d.ts +12 -0
  223. package/dist/components/forms/InputCounter/InputCounter.theme.js +92 -2
  224. package/dist/components/forms/InputCounter/InputCounter.types.d.ts +47 -4
  225. package/dist/components/forms/InputCreditCard/InputCreditCard.js +4 -4
  226. package/dist/components/forms/InputCreditCard/InputCreditCard.types.d.ts +7 -0
  227. package/dist/components/forms/Mention/Mention.js +13 -11
  228. package/dist/components/forms/Radio/Radio.theme.js +1 -1
  229. package/dist/components/forms/RichTextEditor/RichTextEditor.d.ts +12 -16
  230. package/dist/components/forms/RichTextEditor/RichTextEditor.js +174 -1680
  231. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.d.ts +12 -56
  232. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +60 -118
  233. package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +62 -126
  234. package/dist/components/forms/RichTextEditor/RichTextLinkField.d.ts +18 -0
  235. package/dist/components/forms/RichTextEditor/RichTextLinkField.js +46 -0
  236. package/dist/components/forms/RichTextEditor/RichTextToolbar.d.ts +15 -0
  237. package/dist/components/forms/RichTextEditor/RichTextToolbar.js +93 -0
  238. package/dist/components/forms/RichTextEditor/editorCommands.d.ts +50 -0
  239. package/dist/components/forms/RichTextEditor/editorCommands.js +58 -0
  240. package/dist/components/forms/RichTextEditor/editorState.d.ts +19 -0
  241. package/dist/components/forms/RichTextEditor/editorState.js +103 -0
  242. package/dist/components/forms/RichTextEditor/index.d.ts +5 -3
  243. package/dist/components/forms/RichTextEditor/sanitizeHtml.d.ts +38 -0
  244. package/dist/components/forms/RichTextEditor/sanitizeHtml.js +179 -0
  245. package/dist/components/forms/RichTextEditor/sanitizeHtml.test.d.ts +1 -0
  246. package/dist/components/forms/Select/Select.js +19 -12
  247. package/dist/components/forms/Select/Select.theme.js +9 -1
  248. package/dist/components/forms/Select/Select.types.d.ts +86 -8
  249. package/dist/components/forms/Select/useSelectState.d.ts +9 -3
  250. package/dist/components/forms/Select/useSelectState.js +4 -1
  251. package/dist/components/forms/SelectableCard/SelectableCard.js +2 -1
  252. package/dist/components/forms/SelectableCard/SelectableCard.theme.js +1 -1
  253. package/dist/components/forms/Switch/Switch.theme.js +2 -2
  254. package/dist/components/forms/Textarea/Textarea.js +14 -25
  255. package/dist/components/forms/TimePicker/TimePicker.theme.js +10 -1
  256. package/dist/components/forms/TimePicker/TimePicker.types.d.ts +11 -0
  257. package/dist/components/forms/TimePicker/TimePickerTrigger.js +7 -5
  258. package/dist/components/forms/forms.theme.d.ts +57 -0
  259. package/dist/components/forms/forms.theme.js +102 -13
  260. package/dist/components/forms/index.js +1 -0
  261. package/dist/components/generative/FormShell.d.ts +22 -0
  262. package/dist/components/generative/FormShell.js +102 -0
  263. package/dist/components/generative/GenerativeView.d.ts +52 -1
  264. package/dist/components/generative/GenerativeView.js +203 -11
  265. package/dist/components/generative/actions.d.ts +5 -0
  266. package/dist/components/generative/ai-sdk/index.d.ts +1 -0
  267. package/dist/components/generative/ai-sdk/index.js +1 -0
  268. package/dist/components/generative/ai-sdk/useGenerativeChat.d.ts +52 -0
  269. package/dist/components/generative/ai-sdk/useGenerativeChat.js +73 -0
  270. package/dist/components/generative/ai-sdk/useGenerativeChat.test.d.ts +1 -0
  271. package/dist/components/generative/fieldBinding.d.ts +31 -0
  272. package/dist/components/generative/fieldBinding.js +33 -0
  273. package/dist/components/generative/fieldBinding.test.d.ts +1 -0
  274. package/dist/components/generative/formScope.d.ts +71 -0
  275. package/dist/components/generative/formScope.js +135 -0
  276. package/dist/components/generative/index.d.ts +4 -0
  277. package/dist/components/generative/index.js +4 -0
  278. package/dist/components/generative/registry.d.ts +2 -0
  279. package/dist/components/generative/registry.js +11 -10
  280. package/dist/components/generative/schema.generated.js +199 -293
  281. package/dist/components/generative/toToolResult.d.ts +21 -0
  282. package/dist/components/generative/toToolResult.js +15 -0
  283. package/dist/components/generative/toToolResult.test.d.ts +1 -0
  284. package/dist/components/generative/validate.d.ts +10 -1
  285. package/dist/components/generative/validate.js +126 -11
  286. package/dist/components/layout/Grid/Grid.js +1 -0
  287. package/dist/components/layout/Section/Section.theme.js +1 -1
  288. package/dist/components/layout/Stack/Stack.js +1 -0
  289. package/dist/generative.schema.json +199 -293
  290. package/dist/index.js +1 -4
  291. package/dist/registry.json +2765 -2450
  292. package/dist/shadcn-compat.css +5 -5
  293. package/dist/styles/theme.test.d.ts +1 -0
  294. package/dist/styles.css +1 -1
  295. package/dist/test/render.d.ts +17 -0
  296. package/dist/themes/precision.css +232 -0
  297. package/dist/tools.json +200 -295
  298. package/dist/utils/composeEventHandlers.d.ts +19 -0
  299. package/dist/utils/composeEventHandlers.js +26 -0
  300. package/dist/utils/composeEventHandlers.test.d.ts +1 -0
  301. package/dist/utils/index.d.ts +1 -1
  302. package/package.json +31 -1
  303. package/src/global.scss +21 -28
  304. package/src/styles/theme.css +157 -50
  305. package/src/styles/theme.test.ts +119 -0
  306. package/tailwind.preset.cjs +30 -20
  307. package/dist/components/charts/FunnelChart/FunnelChart.animations.d.ts +0 -35
  308. package/dist/components/charts/FunnelChart/FunnelChart.animations.js +0 -59
  309. package/dist/components/charts/FunnelChart/FunnelChart.d.ts +0 -8
  310. package/dist/components/charts/FunnelChart/FunnelChart.js +0 -410
  311. package/dist/components/charts/FunnelChart/FunnelChart.theme.d.ts +0 -2
  312. package/dist/components/charts/FunnelChart/FunnelChart.theme.js +0 -12
  313. package/dist/components/charts/FunnelChart/FunnelChart.types.d.ts +0 -105
  314. package/dist/components/charts/FunnelChart/index.d.ts +0 -4
  315. package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +0 -9
  316. package/dist/components/charts/ScatterPlot/ScatterPlot.js +0 -208
  317. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.d.ts +0 -18
  318. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +0 -42
  319. package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +0 -60
  320. package/dist/components/charts/ScatterPlot/ScatterPlot.types.js +0 -19
  321. package/dist/components/charts/ScatterPlot/index.d.ts +0 -3
  322. package/dist/components/core/Button/Button.ripple.d.ts +0 -71
  323. package/dist/components/core/Button/Button.ripple.js +0 -236
  324. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.d.ts +0 -4
  325. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.theme.d.ts +0 -12
  326. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.types.d.ts +0 -23
  327. package/dist/components/core/Calendar/CalendarEvent/index.d.ts +0 -2
  328. package/dist/components/core/CardStack/CardStack.animations.d.ts +0 -47
  329. package/dist/components/core/CardStack/CardStack.d.ts +0 -3
  330. package/dist/components/core/CardStack/CardStack.js +0 -187
  331. package/dist/components/core/CardStack/CardStack.theme.d.ts +0 -6
  332. package/dist/components/core/CardStack/CardStack.theme.js +0 -33
  333. package/dist/components/core/CardStack/CardStack.types.d.ts +0 -139
  334. package/dist/components/core/CardStack/index.d.ts +0 -7
  335. package/dist/components/core/Carousel/Carousel.d.ts +0 -3
  336. package/dist/components/core/Carousel/Carousel.js +0 -83
  337. package/dist/components/core/Carousel/Carousel.theme.d.ts +0 -10
  338. package/dist/components/core/Carousel/Carousel.theme.js +0 -20
  339. package/dist/components/core/Carousel/Carousel.types.d.ts +0 -113
  340. package/dist/components/core/Carousel/CarouselBody.d.ts +0 -4
  341. package/dist/components/core/Carousel/CarouselBody.js +0 -59
  342. package/dist/components/core/Carousel/CarouselContext.d.ts +0 -3
  343. package/dist/components/core/Carousel/CarouselContext.js +0 -13
  344. package/dist/components/core/Carousel/CarouselItem.d.ts +0 -4
  345. package/dist/components/core/Carousel/CarouselItem.js +0 -11
  346. package/dist/components/core/Carousel/CarouselNext.d.ts +0 -4
  347. package/dist/components/core/Carousel/CarouselNext.js +0 -16
  348. package/dist/components/core/Carousel/CarouselPrevious.d.ts +0 -4
  349. package/dist/components/core/Carousel/CarouselPrevious.js +0 -16
  350. package/dist/components/core/Carousel/index.d.ts +0 -3
  351. package/dist/components/effects/ColorPanels/ColorPanels.d.ts +0 -8
  352. package/dist/components/effects/ColorPanels/ColorPanels.js +0 -66
  353. package/dist/components/effects/ColorPanels/ColorPanels.shaders.d.ts +0 -12
  354. package/dist/components/effects/ColorPanels/ColorPanels.shaders.js +0 -218
  355. package/dist/components/effects/ColorPanels/ColorPanels.types.d.ts +0 -29
  356. package/dist/components/effects/ColorPanels/ColorPanels.types.js +0 -3
  357. package/dist/components/effects/ColorPanels/index.d.ts +0 -2
  358. package/dist/components/effects/FlutedGlass/FlutedGlass.d.ts +0 -9
  359. package/dist/components/effects/FlutedGlass/FlutedGlass.js +0 -80
  360. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.d.ts +0 -12
  361. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.js +0 -335
  362. package/dist/components/effects/FlutedGlass/FlutedGlass.types.d.ts +0 -61
  363. package/dist/components/effects/FlutedGlass/FlutedGlass.types.js +0 -16
  364. package/dist/components/effects/FlutedGlass/index.d.ts +0 -3
  365. package/dist/components/effects/GlassEffect/GlassEffect.d.ts +0 -15
  366. package/dist/components/effects/GlassEffect/GlassEffect.js +0 -38
  367. package/dist/components/effects/GlassEffect/GlassEffect.types.d.ts +0 -19
  368. package/dist/components/effects/GlassEffect/index.d.ts +0 -2
  369. package/dist/components/effects/GlassSurface/GlassSurface.d.ts +0 -8
  370. package/dist/components/effects/GlassSurface/GlassSurface.js +0 -250
  371. package/dist/components/effects/GlassSurface/GlassSurface.types.d.ts +0 -66
  372. package/dist/components/effects/GlassSurface/index.d.ts +0 -2
  373. package/dist/components/effects/GodRays/GodRays.d.ts +0 -8
  374. package/dist/components/effects/GodRays/GodRays.js +0 -68
  375. package/dist/components/effects/GodRays/GodRays.shaders.d.ts +0 -10
  376. package/dist/components/effects/GodRays/GodRays.shaders.js +0 -128
  377. package/dist/components/effects/GodRays/GodRays.types.d.ts +0 -25
  378. package/dist/components/effects/GodRays/GodRays.types.js +0 -3
  379. package/dist/components/effects/GodRays/index.d.ts +0 -2
  380. package/dist/components/effects/GridPattern/GridPattern.d.ts +0 -18
  381. package/dist/components/effects/GridPattern/GridPattern.js +0 -65
  382. package/dist/components/effects/GridPattern/GridPattern.types.d.ts +0 -47
  383. package/dist/components/effects/GridPattern/index.d.ts +0 -2
  384. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.d.ts +0 -10
  385. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.js +0 -78
  386. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.d.ts +0 -22
  387. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.js +0 -239
  388. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.types.d.ts +0 -52
  389. package/dist/components/effects/HalftoneCmyk/index.d.ts +0 -2
  390. package/dist/components/effects/HalftoneDots/HalftoneDots.d.ts +0 -9
  391. package/dist/components/effects/HalftoneDots/HalftoneDots.js +0 -68
  392. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.d.ts +0 -13
  393. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.js +0 -296
  394. package/dist/components/effects/HalftoneDots/HalftoneDots.types.d.ts +0 -43
  395. package/dist/components/effects/HalftoneDots/HalftoneDots.types.js +0 -12
  396. package/dist/components/effects/HalftoneDots/index.d.ts +0 -3
  397. package/dist/components/effects/ImageDithering/ImageDithering.d.ts +0 -9
  398. package/dist/components/effects/ImageDithering/ImageDithering.js +0 -68
  399. package/dist/components/effects/ImageDithering/ImageDithering.shaders.d.ts +0 -12
  400. package/dist/components/effects/ImageDithering/ImageDithering.shaders.js +0 -117
  401. package/dist/components/effects/ImageDithering/ImageDithering.types.d.ts +0 -30
  402. package/dist/components/effects/ImageDithering/ImageDithering.types.js +0 -8
  403. package/dist/components/effects/ImageDithering/index.d.ts +0 -3
  404. package/dist/components/effects/MagneticElement/MagneticElement.d.ts +0 -30
  405. package/dist/components/effects/MagneticElement/MagneticElement.js +0 -111
  406. package/dist/components/effects/MagneticElement/MagneticElement.types.d.ts +0 -44
  407. package/dist/components/effects/MagneticElement/index.d.ts +0 -2
  408. package/dist/components/effects/Metaballs/Metaballs.d.ts +0 -8
  409. package/dist/components/effects/Metaballs/Metaballs.js +0 -59
  410. package/dist/components/effects/Metaballs/Metaballs.shaders.d.ts +0 -10
  411. package/dist/components/effects/Metaballs/Metaballs.shaders.js +0 -102
  412. package/dist/components/effects/Metaballs/Metaballs.types.d.ts +0 -16
  413. package/dist/components/effects/Metaballs/Metaballs.types.js +0 -3
  414. package/dist/components/effects/Metaballs/index.d.ts +0 -2
  415. package/dist/components/effects/PaperTexture/PaperTexture.d.ts +0 -9
  416. package/dist/components/effects/PaperTexture/PaperTexture.js +0 -61
  417. package/dist/components/effects/PaperTexture/PaperTexture.shaders.d.ts +0 -22
  418. package/dist/components/effects/PaperTexture/PaperTexture.shaders.js +0 -145
  419. package/dist/components/effects/PaperTexture/PaperTexture.types.d.ts +0 -19
  420. package/dist/components/effects/PaperTexture/index.d.ts +0 -2
  421. package/dist/components/effects/PulsingBorder/PulsingBorder.d.ts +0 -27
  422. package/dist/components/effects/PulsingBorder/PulsingBorder.js +0 -174
  423. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.d.ts +0 -14
  424. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.js +0 -258
  425. package/dist/components/effects/PulsingBorder/PulsingBorder.types.d.ts +0 -75
  426. package/dist/components/effects/PulsingBorder/PulsingBorder.types.js +0 -3
  427. package/dist/components/effects/PulsingBorder/index.d.ts +0 -2
  428. package/dist/components/effects/SmokeRing/SmokeRing.d.ts +0 -8
  429. package/dist/components/effects/SmokeRing/SmokeRing.js +0 -62
  430. package/dist/components/effects/SmokeRing/SmokeRing.shaders.d.ts +0 -14
  431. package/dist/components/effects/SmokeRing/SmokeRing.shaders.js +0 -130
  432. package/dist/components/effects/SmokeRing/SmokeRing.types.d.ts +0 -22
  433. package/dist/components/effects/SmokeRing/SmokeRing.types.js +0 -3
  434. package/dist/components/effects/SmokeRing/index.d.ts +0 -2
  435. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.d.ts +0 -9
  436. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.js +0 -59
  437. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.d.ts +0 -14
  438. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.js +0 -129
  439. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.d.ts +0 -23
  440. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.js +0 -3
  441. package/dist/components/effects/StaticGradientMesh/index.d.ts +0 -2
  442. package/dist/components/effects/Water/Water.d.ts +0 -9
  443. package/dist/components/effects/Water/Water.js +0 -65
  444. package/dist/components/effects/Water/Water.shaders.d.ts +0 -11
  445. package/dist/components/effects/Water/Water.shaders.js +0 -123
  446. package/dist/components/effects/Water/Water.types.d.ts +0 -25
  447. package/dist/components/effects/Water/index.d.ts +0 -2
  448. package/dist/components/effects/shared/bayerMatrices.glsl.d.ts +0 -10
  449. package/dist/components/effects/shared/bayerMatrices.glsl.js +0 -44
  450. package/dist/components/effects/shared/imageUV.glsl.d.ts +0 -12
  451. package/dist/components/effects/shared/imageUV.glsl.js +0 -26
  452. package/dist/components/forms/RichTextEditor/RichTextEditor.animations.d.ts +0 -7
  453. package/dist/components/forms/RichTextEditor/RichTextEditor.animations.js +0 -32
  454. package/dist/utils/calendarUtils.d.ts +0 -60
  455. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.d.ts +0 -0
  456. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.theme.d.ts +0 -0
  457. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.theme.js +0 -0
  458. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.types.d.ts +0 -0
  459. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltipContent.d.ts +0 -0
  460. /package/dist/components/{charts → core}/shared/ChartTooltip/index.d.ts +0 -0
@@ -6,7 +6,7 @@ const modalTheme = {
6
6
  container: "relative w-full max-h-[calc(100vh-2rem)] rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 flex flex-col my-4 min-h-0 overflow-hidden ring-6 !ring-white/10 border border-[var(--color-border)]",
7
7
  header: "flex items-start justify-between px-[var(--modal-px)] pt-[var(--modal-py)] pb-0 shrink-0 border-b border-transparent gap-6 relative",
8
8
  headerContent: "flex flex-col items-start gap-2 flex-1",
9
- title: "text-[length:var(--modal-title-size)] leading-6 font-semibold text-[var(--color-text-primary)]",
9
+ title: "text-[length:var(--modal-title-size)]/[var(--modal-title-line-height)] font-semibold text-[var(--color-text-primary)]",
10
10
  subtitle: "text-sm text-[var(--color-text-secondary)] mt-0.5",
11
11
  // pb-[...*0.75] is the gap before the footer — proportional to --modal-py
12
12
  // (today's ratio, 12/16) so a themed --modal-py increase widens it too.
@@ -3,7 +3,6 @@ import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { cn } from '../../../utils/cn.js';
4
4
  import { useModalContext } from './ModalContext.js';
5
5
  import { Button } from '../Button/Button.js';
6
- import 'react';
7
6
  import { X } from '@phosphor-icons/react';
8
7
 
9
8
  const ModalHeader = ({ children, icon, showCloseButton, className, ...props }) => {
@@ -47,7 +47,9 @@ const ModalStackModal = ({ size = "md", showCloseButton = true, showBackButton =
47
47
  titleId,
48
48
  subtitleId,
49
49
  }), [closeHandler, size, isSizeToken, showCloseButton, theme, isBodyScrollable, setIsBodyScrollable, titleId, subtitleId]);
50
- return (jsx(ModalContext.Provider, { value: contextValue, children: jsx("div", { className: cn(surfaceClasses(surfaceLevel, { translucent: true, shadow: false }), theme.container, modalSizeVariants[size], className), role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": subtitleId, children: jsxs(SurfaceProvider, { level: surfaceLevel, children: [showBackButton && (jsx("div", { className: cn(modalStackTheme.backButton), children: jsxs(Link, { onClick: backHandler, "aria-label": "Go back", size: "sm", children: [jsx(ArrowLeft, { className: "size-4" }), "Back"] }) })), children] }) }) }));
50
+ return (jsx(ModalContext.Provider, { value: contextValue, children: jsx("div", { className: cn(
51
+ // Opaque — same reason as Modal: behind the shared scrim, no blur on the panel.
52
+ surfaceClasses(surfaceLevel, { translucent: false, shadow: false }), theme.container, modalSizeVariants[size], className), role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": subtitleId, children: jsxs(SurfaceProvider, { level: surfaceLevel, children: [showBackButton && (jsx("div", { className: cn(modalStackTheme.backButton), children: jsxs(Link, { onClick: backHandler, "aria-label": "Go back", size: "sm", children: [jsx(ArrowLeft, { className: "size-4" }), "Back"] }) })), children] }) }) }));
51
53
  };
52
54
  ModalStackModal.displayName = "ModalStack.Modal";
53
55
 
@@ -15,6 +15,7 @@ import { Tooltip } from '../Tooltip/Tooltip.js';
15
15
  import '../Tooltip/Tooltip.animations.js';
16
16
  import { Badge } from '../Badge/Badge.js';
17
17
  import { CaretDown } from '@phosphor-icons/react';
18
+ import { Ripple } from '../shared/Ripple.js';
18
19
  import { AnimatePresence, motion } from 'motion/react';
19
20
 
20
21
  const NavItem = React__default.forwardRef(({ children, startContent, endContent, notification, description, shortcut, href, onClick, active = false, isDisabled = false, hasSubmenu: propHasSubmenu = false, expanded: controlledExpanded, onToggleExpanded, items, defaultExpanded = false, level = 0, showTooltipWhenCollapsed = true, className, theme: customTheme = {}, ...props }, ref) => {
@@ -186,7 +187,7 @@ const NavItem = React__default.forwardRef(({ children, startContent, endContent,
186
187
  const iconClasses = cn(theme.icon, getIconStateClasses(), hasSubmenu && isExpanded && !isActive && "opacity-100", isCollapsedView && ((_b = theme.collapsed) === null || _b === void 0 ? void 0 : _b.icon), isHoveredOrDropdownOpen && "opacity-100");
187
188
  const textClasses = cn(theme.text);
188
189
  // Chevron for submenu
189
- const chevron = hasSubmenu && !isCollapsedView ? (jsx(CaretDown, { weight: "bold", className: cn("size-4 transition-transform duration-200 text-[var(--color-text-muted)]", isExpanded && "text-[var(--color-text-primary)]", isExpanded && "rotate-180") })) : null;
190
+ const chevron = hasSubmenu && !isCollapsedView ? (jsx(CaretDown, { weight: "bold", className: cn("size-4 transition-transform duration-[var(--motion-duration-base)] text-[var(--color-text-muted)]", isExpanded && "text-[var(--color-text-primary)]", isExpanded && "rotate-180") })) : null;
190
191
  // Strip drag/animation DOM handlers that collide with motion's prop types.
191
192
  // `onSubmit`/`onSubmitCapture` are stripped too: NavItem renders as either
192
193
  // `motion.a` or `motion.button`, but `NavItemProps extends HTMLAttributes<HTMLElement>`
@@ -230,7 +231,7 @@ const NavItem = React__default.forwardRef(({ children, startContent, endContent,
230
231
  ? ` (${notification} unread)`
231
232
  : notification === true
232
233
  ? " (unread)"
233
- : null] }))] }));
234
+ : null] })), jsx(Ripple, { disabled: isDisabled })] }));
234
235
  // Content component
235
236
  const content = href && !hasSubmenu ? (jsx(motion.a, { ref: ref, href: isDisabled ? undefined : href, tabIndex: isDisabled ? -1 : undefined, ...interactionProps, children: innerContent })) : (jsx(motion.button, { ref: ref, type: "button", disabled: isDisabled, ...interactionProps, children: innerContent }));
236
237
  // Self-contained submenu
@@ -1,5 +1,5 @@
1
1
  const navItemTheme = {
2
- baseStyle: "group relative flex items-center gap-3 px-2.5 py-2 text-sm font-medium cursor-pointer select-none w-full rounded-[var(--nav-item-radius)] outline-none overflow-hidden transition-[padding,gap,height,background-color,border-color,color,box-shadow] duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] text-left",
2
+ baseStyle: "group relative flex items-center gap-3 px-2.5 py-2 text-sm font-medium cursor-pointer select-none w-full rounded-[var(--nav-item-radius)] outline-none overflow-hidden transition-[padding,gap,height,background-color,border-color,color,box-shadow] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)] text-left",
3
3
  icon: "size-5",
4
4
  text: "flex-1 min-w-0 truncate",
5
5
  // State styling resolved in JS to plain utility classes so `className` overrides win
@@ -1,5 +1,5 @@
1
1
  const offlineIndicatorTheme = {
2
- base: "fixed z-50 flex items-center gap-1.5 transition-colors duration-300 select-none",
2
+ base: "fixed z-50 flex items-center gap-1.5 transition-colors duration-[var(--motion-duration-slow)] select-none",
3
3
  positions: {
4
4
  top: "top-4 left-1/2 -translate-x-1/2",
5
5
  bottom: "bottom-4 left-1/2 -translate-x-1/2",
@@ -34,7 +34,9 @@ const offlineIndicatorTheme = {
34
34
  // (near-black in light, near-white in dark) — a fixed Link color can't.
35
35
  action: "text-xs font-semibold text-inherit",
36
36
  icon: "size-3.5 flex-shrink-0",
37
- message: "text-xs font-medium -tracking-[0.025em]",
37
+ // tracking-tight IS -0.025em — byte-identical to the arbitrary value it
38
+ // replaces, but routed through --tracking-tight so a theme can retune it.
39
+ message: "text-xs font-medium tracking-tight",
38
40
  queueCount: "text-xs opacity-80 ml-1",
39
41
  };
40
42
 
@@ -1,7 +1,7 @@
1
1
  const pageHeadingTheme = {
2
2
  baseStyle: "flex flex-col pb-6 mb-6",
3
3
  headerStyle: "flex flex-col items-start sm:flex-row sm:items-center gap-4",
4
- titleStyle: "text-[length:var(--page-heading-title-size)] leading-[1.4] font-bold text-[var(--color-text-primary)]",
4
+ titleStyle: "text-[length:var(--page-heading-title-size)]/[var(--page-heading-title-line-height)] font-bold text-[var(--color-text-primary)]",
5
5
  subtitleStyle: "text-sm text-[var(--color-text-secondary)] mt-1",
6
6
  actionsStyle: "sm:ml-auto flex items-center gap-2 shrink-0",
7
7
  iconStyle: "flex items-center justify-center shrink-0 text-[var(--color-text-muted)]",
@@ -7,7 +7,7 @@ const paginationTheme = {
7
7
  // Unified item styles for all pagination elements (pages, navigation, etc.)
8
8
  // Light mode: white background, muted text, neutral borders
9
9
  // Dark mode: neutral-800 background, lighter text, neutral-600 borders
10
- itemStyle: "inline-flex items-center justify-center font-medium rounded-[var(--form-radius)] transition-all duration-200 ease-in-out " +
10
+ itemStyle: "inline-flex items-center justify-center font-medium rounded-[var(--form-radius)] transition-all duration-[var(--motion-duration-base)] ease-in-out " +
11
11
  // Focus styles
12
12
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 dark:focus-visible:ring-offset-[var(--color-mono-900)] " +
13
13
  // Base state - light
@@ -15,7 +15,7 @@ const paginationTheme = {
15
15
  // Base state - dark
16
16
  "dark:bg-transparent dark:text-[var(--color-text-secondary)] dark:border-transparent " +
17
17
  // Hover state - light
18
- "hover:text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)] hover:border-[var(--color-border)] " +
18
+ "hover:text-[var(--color-text-primary)] hover:bg-[var(--color-surface)] hover:border-[var(--color-border)] " +
19
19
  // Hover state - dark
20
20
  "dark:hover:bg-[var(--color-surface-hover)] dark:hover:text-[var(--color-text-primary)] dark:hover:border-[var(--color-border)]/0 " +
21
21
  // Active state - light
@@ -4,7 +4,9 @@ import React__default, { useState, useEffect, useCallback } from 'react';
4
4
  import { useReducedMotion, motion } from 'motion/react';
5
5
  import { pillTheme } from './Pill.theme.js';
6
6
  import { createPressVariants } from '../shared/interaction.animations.js';
7
+ import { Ripple } from '../shared/Ripple.js';
7
8
  import { cn } from '../../../utils/cn.js';
9
+ import { composeEventHandlers } from '../../../utils/composeEventHandlers.js';
8
10
 
9
11
  // Shared press physics + subtle hover lift (module-level constant)
10
12
  const PILL_PRESS_VARIANTS = createPressVariants(0.97, 1.02);
@@ -45,19 +47,21 @@ const PILL_PRESS_VARIANTS = createPressVariants(0.97, 1.02);
45
47
  */
46
48
  const Pill = React__default.forwardRef((props, ref) => {
47
49
  var _a, _b;
48
- const { children, size = "md", iconStart, selected = false, onSelect, readOnly = false, className, theme = {}, onClick, ...restProps } = props;
50
+ const { children, size = "md", iconStart, selected, defaultSelected = false, onSelect, readOnly = false, className, theme = {}, onClick, onKeyDown, ...restProps } = props;
49
51
  // Detect whether the consumer *explicitly* passed `selected` (even
50
- // `selected={undefined}` counts as not-passed) checking the raw props
51
- // object, BEFORE the `selected = false` default above is applied, so a
52
- // plain `<Pill>` with no `selected` prop at all never trips the
53
- // dev-warning below just because the destructured default made it look
54
- // "set".
55
- const hasExplicitSelected = "selected" in props && props.selected !== undefined;
52
+ // `selected={undefined}` counts as not-passed), so a plain `<Pill>` with no
53
+ // `selected` prop never trips the dev-warning below.
54
+ const hasExplicitSelected = selected !== undefined;
55
+ const hasExplicitDefaultSelected = "defaultSelected" in props && props.defaultSelected !== undefined;
56
56
  // ========== State Management ==========
57
- const [isSelected, setIsSelected] = useState(selected);
58
- useEffect(() => {
59
- setIsSelected(selected);
60
- }, [selected]);
57
+ // 🔴 §9: mode is DERIVED per render, never stored. `selected` used to be
58
+ // mirrored into state and re-synced from a `useEffect(…, [selected])`. A
59
+ // single-choice group that rejects a deselect leaves the prop identical, so
60
+ // the effect never fired and the chip reported `aria-pressed="false"` while
61
+ // still being the option in force — the control lying about its own state.
62
+ const isControlled = hasExplicitSelected;
63
+ const [uncontrolledSelected, setUncontrolledSelected] = useState(defaultSelected);
64
+ const isSelected = isControlled ? selected : uncontrolledSelected;
61
65
  const shouldReduceMotion = useReducedMotion();
62
66
  // ========== Derived State ==========
63
67
  const isSelectable = Boolean(onSelect);
@@ -70,8 +74,12 @@ const Pill = React__default.forwardRef((props, ref) => {
70
74
  // eslint-disable-next-line no-console
71
75
  console.warn('[Pill] Component has "selected" prop but missing "onSelect" handler. The pill will not be interactive.');
72
76
  }
77
+ if (hasExplicitSelected && hasExplicitDefaultSelected) {
78
+ // eslint-disable-next-line no-console
79
+ console.warn("[Pill] Received both `selected` and `defaultSelected`. `selected` wins and the pill is controlled; drop `defaultSelected`.");
80
+ }
73
81
  }
74
- }, [hasExplicitSelected, onSelect]);
82
+ }, [hasExplicitSelected, hasExplicitDefaultSelected, onSelect]);
75
83
  // ========== Event Handlers ==========
76
84
  const handleClick = useCallback((e) => {
77
85
  if (readOnly) {
@@ -80,21 +88,29 @@ const Pill = React__default.forwardRef((props, ref) => {
80
88
  }
81
89
  if (onSelect) {
82
90
  const newSelected = !isSelected;
83
- setIsSelected(newSelected);
91
+ // Controlled: the parent owns the value — it may accept, reject or
92
+ // normalize this. Writing a local copy is what desynced the chip.
93
+ if (!isControlled)
94
+ setUncontrolledSelected(newSelected);
84
95
  onSelect(newSelected);
85
96
  }
86
97
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
87
- }, [readOnly, onSelect, isSelected, onClick]);
98
+ }, [readOnly, onSelect, isSelected, isControlled, onClick]);
88
99
  const handleKeyDown = useCallback((e) => {
89
100
  if (readOnly || !isSelectable)
90
101
  return;
91
102
  if (e.key === "Enter" || e.key === " ") {
92
103
  e.preventDefault();
93
104
  const newSelected = !isSelected;
94
- setIsSelected(newSelected);
105
+ if (!isControlled)
106
+ setUncontrolledSelected(newSelected);
95
107
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(newSelected);
96
108
  }
97
- }, [readOnly, isSelectable, isSelected, onSelect]);
109
+ }, [readOnly, isSelectable, isSelected, isControlled, onSelect]);
110
+ // 🔴 §9: `{...restProps}` spreads AFTER this element's own attributes, so a
111
+ // consumer's onKeyDown used to REPLACE ours and silently kill Enter/Space
112
+ // selection. Compose instead — ours first, then theirs.
113
+ const composedKeyDown = composeEventHandlers(handleKeyDown, onKeyDown);
98
114
  // ========== Theme Merging ==========
99
115
  const mergedTheme = {
100
116
  baseStyle: theme.baseStyle || pillTheme.baseStyle,
@@ -118,11 +134,11 @@ const Pill = React__default.forwardRef((props, ref) => {
118
134
  isSelected && mergedTheme.selectedStyle,
119
135
  // Cursor styling
120
136
  isInteractive ? "cursor-pointer" : "cursor-default", className // User overrides (highest priority)
121
- ), onClick: handleClick, onKeyDown: handleKeyDown, "data-size": size, "data-selected": isSelected ? "true" : "false", "data-readonly": !isInteractive ? "true" : "false", "data-selectable": isSelectable ? "true" : "false",
137
+ ), onClick: handleClick, onKeyDown: composedKeyDown, "data-size": size, "data-selected": isSelected ? "true" : "false", "data-readonly": !isInteractive ? "true" : "false", "data-selectable": isSelectable ? "true" : "false",
122
138
  // Accessibility
123
139
  role: isSelectable && !readOnly ? "button" : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-pressed": isSelectable && !readOnly ? isSelected : undefined, "aria-readonly": readOnly || undefined,
124
140
  // Animation
125
- variants: PILL_PRESS_VARIANTS, animate: "rest", whileHover: isInteractive && !shouldReduceMotion ? "hover" : undefined, whileTap: isInteractive && !shouldReduceMotion ? "press" : undefined, ...restProps, children: [renderStartIcon(), children] }));
141
+ variants: PILL_PRESS_VARIANTS, animate: "rest", whileHover: isInteractive && !shouldReduceMotion ? "hover" : undefined, whileTap: isInteractive && !shouldReduceMotion ? "press" : undefined, ...restProps, children: [renderStartIcon(), children, isInteractive && jsx(Ripple, {})] }));
126
142
  });
127
143
  Pill.displayName = "Pill";
128
144
 
@@ -8,8 +8,10 @@ const pillTheme = {
8
8
  /**
9
9
  * Base pill style - structure and default colors (no hover)
10
10
  */
11
- baseStyle: "inline-flex items-center justify-center font-medium rounded-full select-none whitespace-nowrap " +
12
- "ring-1 bg-[var(--color-surface)] transition-[color,background-color,box-shadow] duration-150 ease-out " +
11
+ baseStyle:
12
+ // `relative` positions the press <Ripple /> layer (selectable pills only).
13
+ "relative inline-flex items-center justify-center font-medium rounded-full select-none whitespace-nowrap " +
14
+ "ring-1 bg-[var(--color-surface)] transition-[color,background-color,box-shadow] duration-[var(--motion-duration-fast)] ease-out " +
13
15
  "text-[var(--color-text-primary)] ring-[var(--color-border)] " +
14
16
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
15
17
  /**
@@ -30,8 +30,21 @@ export interface PillProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "
30
30
  * Note: Replaced by CheckIcon when pill is selected
31
31
  */
32
32
  iconStart?: React.ReactNode;
33
- /** Whether the pill is selected (controlled state) */
33
+ /**
34
+ * Whether the pill is selected — CONTROLLED. Passing it makes the prop
35
+ * authoritative: the pill renders from it on every render and keeps no copy,
36
+ * so a parent that rejects or normalizes a change (a single-choice group
37
+ * refusing to deselect the active option) stays truthfully reflected.
38
+ *
39
+ * Mutually exclusive with `defaultSelected` (dev-warns if both are passed).
40
+ */
34
41
  selected?: boolean;
42
+ /**
43
+ * Initial selection for an UNCONTROLLED pill, which then owns its own state.
44
+ * Ignored when `selected` is provided.
45
+ * @default false
46
+ */
47
+ defaultSelected?: boolean;
35
48
  /**
36
49
  * Callback when selection state changes
37
50
  * @param selected - The new selected state
@@ -45,11 +45,22 @@ const PopoverBody = React__default.forwardRef(({ children, className, animation
45
45
  ((_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
46
46
  return;
47
47
  }
48
- // Ignore clicks that land inside any FlikkUI overlay portal (a nested
49
- // Select/Tooltip/Dropdown/Popover renders to document.body, outside our
50
- // content ref — without this it would count as an outside click and
51
- // dismiss the popover). See the `data-flikkui-portal` convention.
52
- if ((_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest) === null || _c === void 0 ? void 0 : _c.call(_b, "[data-flikkui-portal]")) {
48
+ // Ignore clicks that land inside a DESCENDANT FlikkUI overlay portal (a
49
+ // nested Select/Tooltip/Dropdown/Popover renders to document.body,
50
+ // outside our content ref — without this it would count as an outside
51
+ // click and dismiss the popover). See the `data-flikkui-portal`
52
+ // convention.
53
+ //
54
+ // The bail only protects against a DESCENDANT portal, not an ANCESTOR
55
+ // one: when this popover's own trigger lives inside another overlay
56
+ // (e.g. a Popover opened from inside a Modal), a click on that host
57
+ // overlay's body content also matches `closest("[data-flikkui-portal]")`
58
+ // — it finds the Modal's portal wrapper, which contains our trigger.
59
+ // That's a real outside click and must still close the popover. Only
60
+ // bail when the matched portal does NOT contain our trigger — i.e.
61
+ // it's a portal we opened ourselves, not the one hosting us.
62
+ const portalEl = (_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest) === null || _c === void 0 ? void 0 : _c.call(_b, "[data-flikkui-portal]");
63
+ if (portalEl && !portalEl.contains(triggerRef.current)) {
53
64
  return;
54
65
  }
55
66
  if (closeOnClickOutside && !preventClose) {
@@ -1,29 +1,4 @@
1
1
  import React from "react";
2
2
  import { ProgressProps } from "./Progress.types";
3
- /**
4
- * Progress component - Linear progress bar for tracking completion
5
- *
6
- * Features:
7
- * - Determinate mode: Shows specific progress value (0-100)
8
- * - Indeterminate mode: Animated loading state when value is undefined
9
- * - Multiple sizes with default primary color
10
- * - className controls the fill bar color (the primary styling target)
11
- * - wrapperClassName controls the outer container
12
- * - Flexible label positioning (right, top, bottom, inside)
13
- * - Respects reduced motion preferences
14
- *
15
- * @example
16
- * // Default (primary color)
17
- * <Progress value={60} />
18
- *
19
- * // Custom fill color via className
20
- * <Progress value={70} className="bg-[var(--color-success)]" />
21
- *
22
- * // With label
23
- * <Progress value={75} showLabel labelPosition="right" />
24
- *
25
- * // Indeterminate (loading)
26
- * <Progress />
27
- */
28
3
  declare const Progress: React.ForwardRefExoticComponent<ProgressProps & React.RefAttributes<HTMLDivElement>>;
29
4
  export { Progress };
@@ -15,8 +15,9 @@ const PROGRESS_SPRING_TRANSITION = {
15
15
  * Progress component - Linear progress bar for tracking completion
16
16
  *
17
17
  * Features:
18
- * - Determinate mode: Shows specific progress value (0-100)
18
+ * - Determinate mode: Shows specific progress value (0 to max)
19
19
  * - Indeterminate mode: Animated loading state when value is undefined
20
+ * - Continuous bar, or a discrete LED-style meter via `segments`
20
21
  * - Multiple sizes with default primary color
21
22
  * - className controls the fill bar color (the primary styling target)
22
23
  * - wrapperClassName controls the outer container
@@ -33,10 +34,25 @@ const PROGRESS_SPRING_TRANSITION = {
33
34
  * // With label
34
35
  * <Progress value={75} showLabel labelPosition="right" />
35
36
  *
37
+ * // Segmented meter over an arbitrary range
38
+ * <Progress value={214} max={300} segments={24} />
39
+ *
36
40
  * // Indeterminate (loading)
37
41
  * <Progress />
38
42
  */
39
- const Progress = React__default.forwardRef(({ value, size = "md", showLabel = false, labelPosition = "right", formatLabel, animated = true, wrapperClassName, className, theme: customTheme, 'aria-label': consumerAriaLabel, ...props }, ref) => {
43
+ /** Cells within this distance of the leading edge fade out when segmentFade is on */
44
+ const SEGMENT_FADE_DISTANCE = 3;
45
+ /** Opacity of the outermost faded cell */
46
+ const SEGMENT_FADE_MIN_OPACITY = 0.4;
47
+ /** Per-cell entrance stagger, seconds */
48
+ const SEGMENT_STAGGER = 0.03;
49
+ /** Per-cell offset of the indeterminate chase, seconds */
50
+ const SEGMENT_CHASE_STAGGER = 0.06;
51
+ const SEGMENT_ENTRANCE_TRANSITION = {
52
+ duration: 0.25,
53
+ ease: "easeOut",
54
+ };
55
+ const Progress = React__default.forwardRef(({ value, max = 100, segments, segmentFade = false, size = "md", showLabel = false, labelPosition = "right", formatLabel, animated = true, wrapperClassName, className, theme: customTheme, 'aria-label': consumerAriaLabel, ...props }, ref) => {
40
56
  const shouldReduceMotion = useReducedMotion();
41
57
  // Merge custom theme with default theme
42
58
  const theme = useMemo(() => {
@@ -46,16 +62,38 @@ const Progress = React__default.forwardRef(({ value, size = "md", showLabel = fa
46
62
  ...progressTheme,
47
63
  ...customTheme,
48
64
  sizes: { ...progressTheme.sizes, ...customTheme.sizes },
65
+ segmentSizes: { ...progressTheme.segmentSizes, ...customTheme.segmentSizes },
49
66
  };
50
67
  }, [customTheme]);
51
- // Calculate percentage (clamped to 0-100)
52
- const percentage = useMemo(() => {
53
- if (value === undefined || value === null)
54
- return 0;
55
- return Math.min(Math.max(Math.round(value), 0), 100);
56
- }, [value]);
68
+ // Dev-time warnings for common issues
69
+ if (process.env.NODE_ENV !== 'production') {
70
+ if (segments !== undefined && (!Number.isInteger(segments) || segments < 1)) {
71
+ // eslint-disable-next-line no-console
72
+ console.warn(`Progress: 'segments' must be a positive integer, received ${segments}. Falling back to the continuous bar.`);
73
+ }
74
+ if (max <= 0) {
75
+ // eslint-disable-next-line no-console
76
+ console.warn(`Progress: 'max' must be greater than 0, received ${max}.`);
77
+ }
78
+ }
79
+ // Segmented rendering is opted into by passing a usable cell count.
80
+ const segmentCount = segments !== undefined && Number.isInteger(segments) && segments >= 1
81
+ ? segments
82
+ : undefined;
83
+ const isSegmented = segmentCount !== undefined;
57
84
  // Determine if this is indeterminate mode
58
85
  const isIndeterminate = value === undefined || value === null;
86
+ // The value clamped into [0, max]. Rounded, matching the historical behaviour
87
+ // of the 0-100 form.
88
+ const clampedValue = useMemo(() => {
89
+ if (value === undefined || value === null)
90
+ return 0;
91
+ return Math.min(Math.max(Math.round(value), 0), Math.max(max, 0));
92
+ }, [value, max]);
93
+ // Position within the range, 0-1
94
+ const ratio = max > 0 ? clampedValue / max : 0;
95
+ // Calculate percentage (0-100) for labels and the continuous fill
96
+ const percentage = useMemo(() => Math.round(ratio * 100), [ratio]);
59
97
  // Format the label
60
98
  const label = useMemo(() => {
61
99
  if (formatLabel)
@@ -86,6 +124,10 @@ const Progress = React__default.forwardRef(({ value, size = "md", showLabel = fa
86
124
  if (!showLabel || isIndeterminate)
87
125
  return null;
88
126
  if (labelPosition === "inside") {
127
+ // No continuous track to sit inside, and a label straddling the cells
128
+ // would be unreadable
129
+ if (isSegmented)
130
+ return null;
89
131
  // Only show inside label for lg size (enough height)
90
132
  if (size !== "lg")
91
133
  return null;
@@ -100,10 +142,36 @@ const Progress = React__default.forwardRef(({ value, size = "md", showLabel = fa
100
142
  // Indeterminate animation
101
143
  jsx("div", { className: cn(theme.fillStyle, "absolute", theme.indeterminateStyle, className) })) : shouldAnimate ? (
102
144
  // Animated determinate progress with spring animation (scaleX avoids layout recalculation)
103
- jsx(motion.div, { className: cn(theme.fillStyle, className), style: { width: '100%', transformOrigin: 'left' }, initial: { scaleX: 0 }, animate: { scaleX: percentage / 100 }, transition: PROGRESS_SPRING_TRANSITION })) : (
145
+ jsx(motion.div, { className: cn(theme.fillStyle, className), style: { width: '100%', transformOrigin: 'left' }, initial: { scaleX: 0 }, animate: { scaleX: ratio }, transition: PROGRESS_SPRING_TRANSITION })) : (
104
146
  // Static determinate progress
105
- jsx("div", { className: cn(theme.fillStyle, className), style: { width: `${percentage}%` } })), showLabel && labelPosition === "inside" && size === "lg" && !isIndeterminate && (jsx("span", { className: theme.insideLabelStyle, children: label }))] }));
106
- return (jsxs("div", { ref: ref, className: cn(theme.containerStyle, containerLayoutClass), role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": isIndeterminate ? undefined : percentage, "aria-label": consumerAriaLabel !== null && consumerAriaLabel !== void 0 ? consumerAriaLabel : (isIndeterminate ? "Loading" : `${percentage}% complete`), ...props, children: [labelPosition === "top" && renderLabel(), labelPosition === "right" ? (jsxs(Fragment, { children: [jsx("div", { className: "flex-1", children: renderTrack() }), renderLabel()] })) : (renderTrack()), labelPosition === "bottom" && renderLabel()] }));
147
+ jsx("div", { className: cn(theme.fillStyle, className), style: { width: `${ratio * 100}%` } })), showLabel && labelPosition === "inside" && size === "lg" && !isIndeterminate && (jsx("span", { className: theme.insideLabelStyle, children: label }))] }));
148
+ // Discrete cell row the LED-style meter. Each cell paints the empty fill,
149
+ // and lit cells stack a coloured overlay on top so the base stays visible
150
+ // underneath while the overlay fades in.
151
+ const renderSegmentedTrack = () => {
152
+ const { height, gap } = theme.segmentSizes[size];
153
+ const litCount = Math.round(ratio * segmentCount);
154
+ return (jsx("div", { className: cn(theme.segmentTrackStyle, gap, wrapperClassName), children: Array.from({ length: segmentCount }, (_, i) => {
155
+ const isLit = !isIndeterminate && i < litCount;
156
+ // Cells nearest the leading edge dim toward it
157
+ const distanceFromEdge = litCount - i;
158
+ const fillOpacity = segmentFade && distanceFromEdge <= SEGMENT_FADE_DISTANCE
159
+ ? SEGMENT_FADE_MIN_OPACITY +
160
+ (distanceFromEdge / SEGMENT_FADE_DISTANCE) *
161
+ (1 - SEGMENT_FADE_MIN_OPACITY)
162
+ : 1;
163
+ // While indeterminate every cell carries the overlay so the chase
164
+ // reads in the fill colour rather than in the muted empty fill.
165
+ const isChasing = isIndeterminate && shouldAnimate;
166
+ const fillClassName = cn(theme.segmentFillStyle, className, isChasing && theme.segmentChaseStyle);
167
+ return (jsx("div", { "data-progress-segment": "", "data-state": isLit ? "filled" : "empty", className: cn(theme.segmentStyle, height, theme.segmentEmptyStyle), children: isChasing ? (jsx("div", { className: fillClassName, style: { animationDelay: `${i * SEGMENT_CHASE_STAGGER}s` } })) : isLit && shouldAnimate ? (jsx(motion.div, { className: fillClassName, initial: { opacity: 0 }, animate: { opacity: fillOpacity }, transition: {
168
+ ...SEGMENT_ENTRANCE_TRANSITION,
169
+ delay: i * SEGMENT_STAGGER,
170
+ } })) : isLit ? (jsx("div", { className: fillClassName, style: { opacity: fillOpacity } })) : null }, i));
171
+ }) }));
172
+ };
173
+ const trackNode = isSegmented ? renderSegmentedTrack() : renderTrack();
174
+ return (jsxs("div", { ref: ref, className: cn(theme.containerStyle, containerLayoutClass), role: "progressbar", "aria-valuemin": 0, "aria-valuemax": max, "aria-valuenow": isIndeterminate ? undefined : clampedValue, "aria-label": consumerAriaLabel !== null && consumerAriaLabel !== void 0 ? consumerAriaLabel : (isIndeterminate ? "Loading" : `${percentage}% complete`), ...props, children: [labelPosition === "top" && renderLabel(), labelPosition === "right" ? (jsxs(Fragment, { children: [jsx("div", { className: "flex-1", children: trackNode }), renderLabel()] })) : (trackNode), labelPosition === "bottom" && renderLabel()] }));
107
175
  });
108
176
  Progress.displayName = "Progress";
109
177
 
@@ -20,6 +20,23 @@ const progressTheme = {
20
20
  },
21
21
  // Indeterminate animation styles
22
22
  indeterminateStyle: "animate-[progress-indeterminate_1.8s_linear_infinite]",
23
+ // Row holding the segment cells — no track fill, rounding or clipping here;
24
+ // each cell paints its own background.
25
+ segmentTrackStyle: "flex items-end w-full",
26
+ // A single segment cell. flex-1 so the row always fills its container
27
+ // regardless of how many cells were asked for.
28
+ segmentStyle: "relative rounded-sm flex-1",
29
+ // Lit overlay — `className` lands here, so it carries the fill colour.
30
+ segmentFillStyle: "absolute inset-0 rounded-sm bg-[var(--color-primary)]",
31
+ segmentEmptyStyle: "bg-[var(--color-surface-sunken)]",
32
+ // Deliberately NOT the continuous `sizes` ramp (h-1.5/h-2.5/h-4) — at that
33
+ // height a cell reads as noise rather than a lit segment.
34
+ segmentSizes: {
35
+ sm: { height: "h-4", gap: "gap-[2px]" },
36
+ md: { height: "h-6", gap: "gap-[3px]" },
37
+ lg: { height: "h-8", gap: "gap-1" },
38
+ },
39
+ segmentChaseStyle: "animate-[progress-segment-chase_1.2s_ease-in-out_infinite]",
23
40
  };
24
41
 
25
42
  export { progressTheme };
@@ -1,6 +1,18 @@
1
1
  import React from "react";
2
2
  export type ProgressSize = "sm" | "md" | "lg";
3
3
  export type ProgressLabelPosition = "right" | "top" | "bottom" | "inside";
4
+ /**
5
+ * Per-size geometry for the segmented form.
6
+ *
7
+ * Two keys rather than a single class string because the two values land on
8
+ * different elements: `height` on each cell, `gap` on the row that holds them.
9
+ */
10
+ export interface ProgressSegmentSize {
11
+ /** Height of a single segment cell */
12
+ height: string;
13
+ /** Gap between segment cells (applied to the row) */
14
+ gap: string;
15
+ }
4
16
  /**
5
17
  * Theme configuration for Progress component
6
18
  */
@@ -19,6 +31,18 @@ export interface ProgressTheme {
19
31
  sizes: Record<ProgressSize, string>;
20
32
  /** Indeterminate animation styles */
21
33
  indeterminateStyle: string;
34
+ /** Row that holds the segment cells (segmented form only) */
35
+ segmentTrackStyle: string;
36
+ /** Base styles for a single segment cell */
37
+ segmentStyle: string;
38
+ /** The lit overlay painted inside a segment cell */
39
+ segmentFillStyle: string;
40
+ /** Fill for an unlit segment cell */
41
+ segmentEmptyStyle: string;
42
+ /** Per-size segment geometry */
43
+ segmentSizes: Record<ProgressSize, ProgressSegmentSize>;
44
+ /** Indeterminate chase animation applied to each segment cell */
45
+ segmentChaseStyle: string;
22
46
  }
23
47
  /**
24
48
  * Theme overrides for Progress component
@@ -31,13 +55,35 @@ export interface ProgressThemeOverrides {
31
55
  insideLabelStyle?: string;
32
56
  sizes?: Partial<Record<ProgressSize, string>>;
33
57
  indeterminateStyle?: string;
58
+ segmentTrackStyle?: string;
59
+ segmentStyle?: string;
60
+ segmentFillStyle?: string;
61
+ segmentEmptyStyle?: string;
62
+ segmentSizes?: Partial<Record<ProgressSize, ProgressSegmentSize>>;
63
+ segmentChaseStyle?: string;
34
64
  }
35
65
  export interface ProgressProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
36
66
  /**
37
- * Progress value from 0 to 100.
67
+ * Progress value, from 0 to `max`.
38
68
  * If undefined, the progress bar will be in indeterminate mode.
39
69
  */
40
70
  value?: number;
71
+ /**
72
+ * Upper bound of the range `value` is measured against.
73
+ * @default 100
74
+ */
75
+ max?: number;
76
+ /**
77
+ * Number of cells to render the bar as an LED-style segmented meter.
78
+ *
79
+ * Omitted renders the continuous fill.
80
+ */
81
+ segments?: number;
82
+ /**
83
+ * Fade the meter out across its last few lit cells (segmented form only).
84
+ * @default false
85
+ */
86
+ segmentFade?: boolean;
41
87
  /**
42
88
  * The size of the progress bar
43
89
  * @default 'md'
@@ -6,7 +6,7 @@ const ratingTheme = {
6
6
  // Base container styles
7
7
  baseStyle: "inline-flex items-center",
8
8
  // Individual star button styles
9
- starStyle: "relative inline-flex items-center justify-center shrink-0 transition-transform duration-150 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-1 rounded-sm",
9
+ starStyle: "relative inline-flex items-center justify-center shrink-0 transition-transform duration-[var(--motion-duration-fast)] cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-1 rounded-sm",
10
10
  // Star icon sizes per rating size
11
11
  starSizes: {
12
12
  sm: "size-4",
@@ -97,11 +97,12 @@ export interface RatingProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
97
97
  */
98
98
  onChange?: (value: number) => void;
99
99
  /**
100
- * Custom filled star icon (defaults to Heroicons StarIcon solid)
100
+ * Custom filled star icon. Defaults to Phosphor `Star` — the built-in filled
101
+ * and empty stars are the same glyph, distinguished by color, not by shape.
101
102
  */
102
103
  iconFilled?: ReactNode;
103
104
  /**
104
- * Custom empty star icon (defaults to Heroicons StarIcon outline)
105
+ * Custom empty star icon. Defaults to Phosphor `Star` — see `iconFilled`.
105
106
  */
106
107
  iconEmpty?: ReactNode;
107
108
  /**
@@ -393,7 +393,7 @@ const ScrollArea = React__default.forwardRef(({ children, type = 'hover', size =
393
393
  '[&::-webkit-scrollbar-thumb]:bg-transparent',
394
394
  '[&[data-scrolling]::-webkit-scrollbar-thumb]:bg-[var(--color-border)]',
395
395
  '[&::-webkit-scrollbar-thumb]:transition-colors',
396
- '[&::-webkit-scrollbar-thumb]:duration-300',
396
+ '[&::-webkit-scrollbar-thumb]:duration-[var(--motion-duration-slow)]',
397
397
  ].join(' ');
398
398
  case 'hover':
399
399
  return [
@@ -4,7 +4,7 @@
4
4
  */
5
5
  const scrollAreaTheme = {
6
6
  baseStyle: 'relative h-full w-full',
7
- scrollbarStyle: 'flex touch-none select-none transition-colors duration-150',
7
+ scrollbarStyle: 'flex touch-none select-none transition-colors duration-[var(--motion-duration-fast)]',
8
8
  thumbStyle: 'relative flex-1 rounded-full bg-[var(--color-border)]/60',
9
9
  };
10
10