@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
@@ -2,17 +2,17 @@
2
2
  /* Primary color palette — monochrome: aliased to the neutral scale.
3
3
  (Original blue ramp kept for easy revert:
4
4
  50 oklch(0.962 0.018 272.314) … 600 oklch(0.511 0.262 276.966) … 950 oklch(0.257 0.09 281.288)) */
5
- --color-primary-50: var(--color-neutral-50);
6
- --color-primary-100: var(--color-neutral-100);
7
- --color-primary-200: var(--color-neutral-200);
8
- --color-primary-300: var(--color-neutral-300);
9
- --color-primary-400: var(--color-neutral-400);
10
- --color-primary-500: var(--color-neutral-500);
11
- --color-primary-600: var(--color-neutral-600);
12
- --color-primary-700: var(--color-neutral-700);
13
- --color-primary-800: var(--color-neutral-800);
14
- --color-primary-900: var(--color-neutral-900);
15
- --color-primary-950: var(--color-neutral-950);
5
+ --color-primary-50: var(--color-mono-50);
6
+ --color-primary-100: var(--color-mono-100);
7
+ --color-primary-200: var(--color-mono-200);
8
+ --color-primary-300: var(--color-mono-300);
9
+ --color-primary-400: var(--color-mono-400);
10
+ --color-primary-500: var(--color-mono-500);
11
+ --color-primary-600: var(--color-mono-600);
12
+ --color-primary-700: var(--color-mono-700);
13
+ --color-primary-800: var(--color-mono-800);
14
+ --color-primary-900: var(--color-mono-900);
15
+ --color-primary-950: var(--color-mono-950);
16
16
 
17
17
  /* Light mode: dark primary → dark buttons with light text (contrast auto-resolves white). */
18
18
  --color-primary: var(--color-primary-900);
@@ -26,17 +26,17 @@
26
26
  to the neutral scale so any stray/consumer CSS still resolves. Remove next
27
27
  major. Original Tailwind-gray ramp kept for reference:
28
28
  50 oklch(0.984 0.003 247.858) … 600 oklch(0.446 0.043 257.281) … 950 oklch(0.129 0.042 264.695). */
29
- --color-secondary-50: var(--color-neutral-50);
30
- --color-secondary-100: var(--color-neutral-100);
31
- --color-secondary-200: var(--color-neutral-200);
32
- --color-secondary-300: var(--color-neutral-300);
33
- --color-secondary-400: var(--color-neutral-400);
34
- --color-secondary-500: var(--color-neutral-500);
35
- --color-secondary-600: var(--color-neutral-600);
36
- --color-secondary-700: var(--color-neutral-700);
37
- --color-secondary-800: var(--color-neutral-800);
38
- --color-secondary-900: var(--color-neutral-900);
39
- --color-secondary-950: var(--color-neutral-950);
29
+ --color-secondary-50: var(--color-mono-50);
30
+ --color-secondary-100: var(--color-mono-100);
31
+ --color-secondary-200: var(--color-mono-200);
32
+ --color-secondary-300: var(--color-mono-300);
33
+ --color-secondary-400: var(--color-mono-400);
34
+ --color-secondary-500: var(--color-mono-500);
35
+ --color-secondary-600: var(--color-mono-600);
36
+ --color-secondary-700: var(--color-mono-700);
37
+ --color-secondary-800: var(--color-mono-800);
38
+ --color-secondary-900: var(--color-mono-900);
39
+ --color-secondary-950: var(--color-mono-950);
40
40
 
41
41
  --color-secondary: var(--color-secondary-600);
42
42
  --color-secondary-contrast: oklch(from var(--color-secondary) clamp(0, (0.85 - l) * 1000, 1) 0 0);
@@ -70,7 +70,8 @@
70
70
  --color-success-900: oklch(0.386 0.063 188.416);
71
71
  --color-success-950: oklch(0.277 0.046 192.524);
72
72
 
73
- --color-success: var(--color-success-500);
73
+ /* -600 like danger/warning — white -contrast text passes AA (500 was ~2.7:1) */
74
+ --color-success: var(--color-success-600);
74
75
  --color-success-contrast: oklch(from var(--color-success) clamp(0, (0.85 - l) * 1000, 1) 0 0);
75
76
 
76
77
  /* Warning color palette - full 50-950 range */
@@ -90,12 +91,18 @@
90
91
  --color-warning-contrast: oklch(from var(--color-warning) clamp(0, (0.85 - l) * 1000, 1) 0 0);
91
92
 
92
93
  /* text color */
93
- --color-text-primary: var(--color-neutral-950);
94
- --color-text-secondary: var(--color-neutral-700);
95
- --color-text-placeholder: var(--color-neutral-400);
96
- --color-text-muted: var(--color-neutral-500);
97
- --color-text-disabled: var(--color-neutral-400);
98
- --color-text-inverse: var(--color-neutral-50);
94
+ --color-text-primary: var(--color-mono-950);
95
+ --color-text-secondary: var(--color-mono-700);
96
+ /* placeholder/muted are ALPHA-DERIVED from text-primary (not ramp rungs):
97
+ they auto-track any theme's text color in both modes, and translucency
98
+ composites correctly over any surface. Components must consume these
99
+ tokens — never point text at neutral rungs (dark:text-[--color-mono-N]
100
+ bypasses are the theming bug fixed here; same class as Segmented PER-292).
101
+ Re-derived in .dark below (same reason contrast tokens are). */
102
+ --color-text-placeholder: color-mix(in oklab, var(--color-text-primary) 40%, transparent);
103
+ --color-text-muted: color-mix(in oklab, var(--color-text-primary) 57%, transparent);
104
+ --color-text-disabled: var(--color-mono-400);
105
+ --color-text-inverse: var(--color-mono-50);
99
106
 
100
107
  /* generic colors */
101
108
  --color-border: oklch(93% 0 0);
@@ -141,6 +148,24 @@
141
148
  over ANY surface level — darkens in light, lightens in dark. For hover/active highlights. */
142
149
  --color-surface-hover: oklch(0% 0 0 / 0.05);
143
150
  --color-chart-track: rgba(0, 0, 0, 0.06);
151
+ /* Categorical chart series palette — 5 fixed slots, independent of the
152
+ semantic status tokens (primary/success/warning/danger). Series N always
153
+ maps to slot N; don't reorder or reuse these for status meaning. */
154
+ --color-chart-1: #3b82f6;
155
+ /* blue */
156
+ --color-chart-1-contrast: oklch(from var(--color-chart-1) clamp(0, (0.85 - l) * 1000, 1) 0 0);
157
+ --color-chart-2: #14b8a6;
158
+ /* teal */
159
+ --color-chart-2-contrast: oklch(from var(--color-chart-2) clamp(0, (0.85 - l) * 1000, 1) 0 0);
160
+ --color-chart-3: #f59e0b;
161
+ /* amber */
162
+ --color-chart-3-contrast: oklch(from var(--color-chart-3) clamp(0, (0.85 - l) * 1000, 1) 0 0);
163
+ --color-chart-4: #8b5cf6;
164
+ /* violet */
165
+ --color-chart-4-contrast: oklch(from var(--color-chart-4) clamp(0, (0.85 - l) * 1000, 1) 0 0);
166
+ --color-chart-5: #ec4899;
167
+ /* pink */
168
+ --color-chart-5-contrast: oklch(from var(--color-chart-5) clamp(0, (0.85 - l) * 1000, 1) 0 0);
144
169
  --color-background: var(--surface-1);
145
170
  /* near-white page canvas (rung 1) — white cards lift via the shadow ring */
146
171
  /* DEPRECATED (remove next major): alias of --color-surface. Use the surface ladder. */
@@ -150,23 +175,58 @@
150
175
  --color-background-tertiary: oklch(90% 0.002 247.839);
151
176
  --color-background-quaternary: oklch(85% 0.002 247.839);
152
177
  --color-background-quinary: oklch(80% 0.002 247.839);
153
- --color-background-disabled: var(--color-neutral-100);
154
-
155
- --color-neutral-50: oklch(98.5% 0 0);
156
- --color-neutral-100: oklch(97% 0 0);
157
- --color-neutral-200: oklch(92.2% 0 0);
158
- --color-neutral-300: oklch(87% 0 0);
159
- --color-neutral-400: oklch(70.8% 0 0);
160
- --color-neutral-500: oklch(55.6% 0 0);
161
- --color-neutral-600: oklch(43.9% 0 0);
162
- --color-neutral-700: oklch(37.1% 0 0);
163
- --color-neutral-800: oklch(26.9% 0 0);
164
- --color-neutral-900: oklch(20.5% 0 0);
165
- --color-neutral-950: oklch(14.5% 0 0);
178
+ --color-background-disabled: var(--color-mono-100);
179
+
180
+ --color-mono-50: oklch(98.5% 0 0);
181
+ --color-mono-100: oklch(97% 0 0);
182
+ --color-mono-200: oklch(92.2% 0 0);
183
+ --color-mono-300: oklch(87% 0 0);
184
+ --color-mono-400: oklch(70.8% 0 0);
185
+ --color-mono-500: oklch(55.6% 0 0);
186
+ --color-mono-600: oklch(43.9% 0 0);
187
+ --color-mono-700: oklch(37.1% 0 0);
188
+ --color-mono-800: oklch(26.9% 0 0);
189
+ --color-mono-900: oklch(20.5% 0 0);
190
+ --color-mono-950: oklch(14.5% 0 0);
191
+
192
+ /* Mono (gray-role) fill default + auto contrast — same machinery as the
193
+ semantic hues, for FILLED gray surfaces (Button color="mono" etc.): dark
194
+ ink in light mode, light chip in dark (flipped in .dark below). Lets
195
+ components write bg-[var(--color-mono)] text-[var(--color-mono-contrast)]
196
+ instead of hand-picking rungs + hardcoding text-white (§3 foreground rule). */
197
+ --color-mono: var(--color-mono-900);
198
+ --color-mono-contrast: oklch(from var(--color-mono) clamp(0, (0.85 - l) * 1000, 1) 0 0);
166
199
 
167
200
  /* Font family variables */
168
201
  --font-family-base: var(--font-sans);
169
- --font-cursive: "Birthstone", cursive;
202
+
203
+ /* ============================================
204
+ TYPE SCALE — one --font-scale knob (like --radius-base).
205
+ Tailwind v4 defines each --text-* step as an independent literal, so a
206
+ smaller "base font size" would otherwise mean redefining every step per
207
+ theme. Here the ramp is Tailwind's EXACT defaults × --font-scale: at the
208
+ default 1 every utility is byte-for-byte Tailwind (text-sm = 14px);
209
+ a theme sets ONE factor (e.g. 0.9375 → 15px-based text) and the whole
210
+ ramp follows. Line-heights are unitless ratios upstream, so they scale
211
+ automatically. Text-only: spacing (--spacing is rem) and px geometry
212
+ tokens are deliberately unaffected. Each step is round()ed to a whole px
213
+ so scaled sizes stay clean (0.9375 → text-sm 13px, not 13.125px); at
214
+ scale 1 the rounding is inert (Tailwind's defaults are already integers).
215
+ ============================================ */
216
+ --font-scale: 1;
217
+ --text-xs: round(calc(0.75rem * var(--font-scale)), 1px);
218
+ --text-sm: round(calc(0.875rem * var(--font-scale)), 1px);
219
+ --text-base: round(calc(1rem * var(--font-scale)), 1px);
220
+ --text-lg: round(calc(1.125rem * var(--font-scale)), 1px);
221
+ --text-xl: round(calc(1.25rem * var(--font-scale)), 1px);
222
+ --text-2xl: round(calc(1.5rem * var(--font-scale)), 1px);
223
+ --text-3xl: round(calc(1.875rem * var(--font-scale)), 1px);
224
+ --text-4xl: round(calc(2.25rem * var(--font-scale)), 1px);
225
+ --text-5xl: round(calc(3rem * var(--font-scale)), 1px);
226
+ --text-6xl: round(calc(3.75rem * var(--font-scale)), 1px);
227
+ --text-7xl: round(calc(4.5rem * var(--font-scale)), 1px);
228
+ --text-8xl: round(calc(6rem * var(--font-scale)), 1px);
229
+ --text-9xl: round(calc(8rem * var(--font-scale)), 1px);
170
230
  --font-weight-light: 300;
171
231
  --font-weight-normal: 400;
172
232
  --font-weight-medium: 500;
@@ -174,13 +234,61 @@
174
234
  --font-weight-bold: 700;
175
235
  --font-weight-extrabold: 800;
176
236
 
237
+ /* ============================================
238
+ TYPE ROLE SYSTEM — mirrors the two-tier override pattern used by
239
+ BORDER RADIUS SYSTEM below (--card-radius/--metric-radius etc.): a
240
+ shared base scale (the --text-* ramp / --font-scale above) that everything derives
241
+ from by default, plus independently-overridable per-role tokens for the
242
+ handful of prominent heading/value elements a theme most often wants to
243
+ differentiate. --font-scale alone can only resize the WHOLE UI
244
+ uniformly — there was previously no way to make e.g. just Card titles
245
+ bigger without touching every other text size too.
246
+
247
+ Each token below defaults to a specific --text-* rung, so it inherits
248
+ --font-scale automatically (zero visual change for any theme that
249
+ doesn't touch these). A theme can override a token two ways:
250
+ 1. Scale-following: --card-title-size: var(--text-lg);
251
+ (stays pinned to a rung, so it still tracks --font-scale)
252
+ 2. Fixed: --card-title-size: 1.25rem;
253
+ (a literal opts that one role out of the scale entirely — same
254
+ escape hatch --card-radius: 20px gives for geometry)
255
+ This is an ADDITIVE namespace layered on top of --text-* — it does NOT
256
+ redefine individual --text-* steps, which stays forbidden (see TYPE
257
+ SCALE above).
258
+
259
+ 🔴 Consume these via `text-[length:var(--x)]`, NEVER `text-[var(--x)]` —
260
+ Tailwind's arbitrary text-[...] syntax is ambiguous between color and
261
+ font-size, and a bare var() value resolves to the COLOR branch (silently
262
+ dropping the font-size change, no error). The `length:` type hint forces
263
+ the correct branch.
264
+ ============================================ */
265
+ --card-title-size: var(--text-base);
266
+ --modal-title-size: var(--text-base);
267
+ --drawer-title-size: var(--text-base);
268
+ --page-heading-title-size: var(--text-xl);
269
+ --section-title-size: var(--text-base);
270
+ /* AlertDialog has no title style of its own — it renders Modal.Title
271
+ directly, so it already inherits --modal-title-size above. */
272
+
273
+ /* Metric/KPI: one token per size variant, not a single shared token — the
274
+ sm/md/lg values today are deliberate information-density choices, not
275
+ a formula (e.g. Metric's md and lg are literally identical), so a
276
+ single token would either collapse that hierarchy or force an
277
+ arbitrary scaling relationship that doesn't match today's values. */
278
+ --metric-value-size-sm: var(--text-xl);
279
+ --metric-value-size-md: var(--text-3xl);
280
+ --metric-value-size-lg: var(--text-3xl);
281
+ --kpi-value-size-sm: var(--text-xl);
282
+ --kpi-value-size-md: var(--text-2xl);
283
+ --kpi-value-size-lg: var(--text-3xl);
284
+
177
285
  /* Form element variables — fixed px so they don't scale with root font-size */
178
286
  --form-min-h-sm: 32px;
179
287
  /* h-8 in Tailwind */
180
- --form-min-h-md: 40px;
288
+ --form-min-h-md: 36px;
289
+ /* h-9 in Tailwind */
290
+ --form-min-h-lg: 40px;
181
291
  /* h-10 in Tailwind */
182
- --form-min-h-lg: 48px;
183
- /* h-12 in Tailwind */
184
292
 
185
293
  --form-label-pb: 8px;
186
294
  /* pb-2 in Tailwind */
@@ -193,21 +301,97 @@
193
301
  /* px-4 in Tailwind */
194
302
 
195
303
  --form-py-sm: 8px;
196
- /* py-1 in Tailwind */
197
- --form-py-md: 10px;
198
304
  /* py-2 in Tailwind */
305
+ --form-py-md: 10px;
306
+ /* py-2.5 in Tailwind */
199
307
  --form-py-lg: 12px;
200
308
  /* py-3 in Tailwind */
201
309
 
310
+ /* CONTROL TYPE SIZE — the last control-tier axis that was still a raw
311
+ Tailwind literal baked into the .theme.ts files. Height, padding and
312
+ radius were already tokens, so a theme could retune a control's box but
313
+ never its type; same "a library can't hardcode a Tailwind literal and
314
+ call it themeable" reasoning as the SURFACE PADDING and TYPE ROLE
315
+ systems below/above. Defaults to a --text-* rung, so --font-scale still
316
+ applies unless a theme overrides one outright.
317
+
318
+ Deliberately TWO rungs across three sizes: 14px is the workhorse control
319
+ size and dropping sm to 12px is a legibility liability on a 32px-tall
320
+ primary action — sm/md are separated by box (height + padding), not type.
321
+ Don't "fix" the repeat into a 12/14/16 ramp without a design pass.
322
+
323
+ 🔴 Consume as text-[length:var(--…)], never bare text-[var(--…)] —
324
+ Tailwind's arbitrary text-[…] syntax is ambiguous between colour and
325
+ font-size and a bare var() resolves to the COLOUR branch, silently
326
+ no-oping the size (see TYPE ROLE SYSTEM). */
327
+ --form-text-size-sm: var(--text-sm);
328
+ --form-text-size-md: var(--text-sm);
329
+ --form-text-size-lg: var(--text-base);
330
+
331
+ /* 🔴 Paired line-heights are NOT optional here. A bare `text-sm` utility
332
+ compiles to font-size AND Tailwind's paired `--text-sm--line-height`
333
+ (14px/20px); an arbitrary `text-[length:…]` carries font-size ONLY and
334
+ the element falls back to normal/1.5 (14px/21px). Consuming these
335
+ tokens without the `/[var(--…-line-height-…)]` modifier therefore
336
+ silently changes every control's leading — caught in review at exactly
337
+ that 20px→21px step. Values alias Tailwind's own pairing vars so the
338
+ ramp stays byte-identical and --font-scale still flows through (the
339
+ pairings are unitless ratios). */
340
+ --form-line-height-sm: var(--text-sm--line-height);
341
+ --form-line-height-md: var(--text-sm--line-height);
342
+ --form-line-height-lg: var(--text-base--line-height);
343
+
344
+ /* ============================================
345
+ OTP SLOT SIZING
346
+ OTP slots are SQUARE, so this is one size token per rung, not a height +
347
+ width pair. sm/md/lg ALIAS the form ramp so slots line up with an adjacent
348
+ Input of the same size — break an alias to size OTP independently (same
349
+ pattern as --button-min-h-* / --segmented-min-h-*).
350
+
351
+ xl is DERIVED, not a literal, and there is deliberately no global
352
+ --form-min-h-xl: OTP is the only control large enough to want one, and a
353
+ global rung would ship without its px/py/text siblings. A hardcoded 48px
354
+ would not track a theme's ramp the way sm/md/lg do — it renders SMALLER
355
+ than lg in both Jade (36/44/52) and Ember (40/48/56). The 1.2 factor is
356
+ anchored so the default theme lands on 48px exactly.
357
+ ============================================ */
358
+ --otp-slot-size-sm: var(--form-min-h-sm);
359
+ /* 32px */
360
+ --otp-slot-size-md: var(--form-min-h-md);
361
+ /* 36px */
362
+ --otp-slot-size-lg: var(--form-min-h-lg);
363
+ /* 40px */
364
+ --otp-slot-size-xl: calc(var(--form-min-h-lg) * 1.2);
365
+ /* 48px in the default theme */
366
+
367
+ /* The digit runs one rung HOTTER than form body text — it is a display
368
+ numeral, not label text — so these deliberately do NOT alias
369
+ --form-text-size-*. Same two-rungs-across-the-low-end shape as the form
370
+ ramp: sm and md share a rung, lg and xl each step. */
371
+ --otp-text-size-sm: var(--text-base);
372
+ --otp-text-size-md: var(--text-base);
373
+ --otp-text-size-lg: var(--text-lg);
374
+ --otp-text-size-xl: var(--text-xl);
375
+
376
+ /* 🔴 MANDATORY pairing. A bare `text-lg` utility compiles to font-size AND
377
+ Tailwind's paired --text-lg--line-height; an arbitrary text-[length:…]
378
+ carries font-size ONLY and falls back to normal/1.5, silently changing
379
+ the digit's leading. Aliases Tailwind's own pairing vars so --font-scale
380
+ still flows through. */
381
+ --otp-line-height-sm: var(--text-base--line-height);
382
+ --otp-line-height-md: var(--text-base--line-height);
383
+ --otp-line-height-lg: var(--text-lg--line-height);
384
+ --otp-line-height-xl: var(--text-xl--line-height);
385
+
202
386
  /* ============================================
203
387
  BORDER RADIUS SYSTEM
204
388
  Change --radius-base to adjust the entire UI.
205
389
  Individual --*-radius variables can be overridden independently.
206
390
  ============================================ */
207
- --radius-base: 12px;
391
+ --radius-base: 8px;
208
392
  /* Base radius token */
209
393
 
210
- /* Forms & Controls (1x base = 8px) */
394
+ /* Forms & Controls (1x base = 12px) */
211
395
  --form-radius: var(--radius-base);
212
396
 
213
397
  /* Checkbox: small absolute box (20–28px), so the radius is CAPPED — a raw
@@ -215,49 +399,97 @@
215
399
  base grows. min() keeps it a rounded square at any base. */
216
400
  --checkbox-radius: min(calc(var(--radius-base) * 0.5), 6px);
217
401
 
218
- /* Overlays (1.5x base = 12px) */
219
- --dropdown-radius: calc(var(--radius-base) * 1.5);
220
- --tooltip-radius: calc(var(--radius-base) / 1);
221
- --codeblock-radius: calc(var(--radius-base) * 1.5);
222
- --popover-radius: calc(var(--radius-base) * 1.5);
402
+ /* Surface radius ceilings every CONTENT-BEARING container (Tooltip,
403
+ ChartTooltip, Dropdown, CodeBlock, Popover, Alert, Toast, Metric,
404
+ Message, GanttChart, Card, Modal, Drawer, HeroCard) caps its computed
405
+ radius at one of these, so a theme chasing pill-shaped controls at a
406
+ very large --radius-base can never round a padded surface past what
407
+ its own padding can absorb — the curve would otherwise start visually
408
+ eating into header text/icons sitting in that padding. Three tiers
409
+ because containers aren't one size: tiny fixed-padding chips run
410
+ ~4–12px padding, compact fixed-height surfaces run ~12–20px, spacious
411
+ freeform ones run ~24px. CONTROLS (Button/Input/Badge/NavItem/
412
+ Segmented) are the one category deliberately NOT capped below — going
413
+ fully pill at an extreme --radius-base is the correct, common look
414
+ there, and CSS itself auto-clamps border-radius to 50% of the box, so
415
+ a control can never visually break either way. (Tooltip looks like a
416
+ control at a glance — small, single-purpose — but unlike Button/Badge
417
+ it's a PADDED content box, not a filled shape with no internal inset,
418
+ so the padding-collision risk applies to it too; it belongs in the
419
+ capped camp, not the uncapped one — this was gotten wrong in an
420
+ earlier pass.) Override any cap per-theme for a more/less rounded
421
+ ceiling on surfaces specifically (independent of how round the
422
+ theme's controls are). Every new content-bearing container's radius
423
+ token MUST derive from one of these three caps — never a bare
424
+ `calc(var(--radius-base) * N)` — or it silently re-opens this exact gap
425
+ (see the OfflineIndicator/Message/HeroCard/GanttChart/Tooltip fixes
426
+ this system replaced). */
427
+ --surface-radius-cap-xs: 12px;
428
+ /* tiny/tight-padding chips (~4–12px padding): Tooltip, ChartTooltip */
429
+ --surface-radius-cap-sm: 24px;
430
+ /* compact/fixed-height content (~12–20px padding): Dropdown, CodeBlock,
431
+ Popover, Alert, Toast, Metric, Message, GanttChart */
432
+ --surface-radius-cap-lg: 32px;
433
+ /* spacious/freeform containers (~24px padding): Card, Modal, Drawer, HeroCard */
434
+
435
+ /* Overlays (1.5x base = 18px, capped; tooltip stays 1x but is now ALSO
436
+ capped — same 1x multiplier as before, just no longer unbounded) */
437
+ --dropdown-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
438
+ --tooltip-radius: min(var(--radius-base), var(--surface-radius-cap-xs));
439
+ --codeblock-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
440
+ --popover-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
223
441
 
224
442
  /* Feedback surfaces */
225
- --alert-radius: calc(var(--radius-base) * 1.5);
226
- --toast-radius: calc(var(--radius-base) * 1.5);
227
- --drawer-radius: calc(var(--radius-base) * 2);
228
- --metric-radius: calc(var(--radius-base) * 2);
229
-
230
- /* Surfaces (3x base = 24px) */
231
- --card-radius: calc(var(--radius-base) * 1.5);
232
- --modal-radius: calc(var(--radius-base) * 1.5);
443
+ --alert-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
444
+ --toast-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
445
+ --drawer-radius: min(calc(var(--radius-base) * 2), var(--surface-radius-cap-lg));
446
+ /* Metric is a compact stat tile, not a Drawer-scale surface — same tier
447
+ and cap as the other compact containers above, not 2x/lg. */
448
+ --metric-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
449
+ /* Chat bubble: same formula/tier as Alert/Toast/Metric above (compact,
450
+ padded content) its own token rather than reusing one of theirs so a
451
+ theme can dial bubble roundness independently. */
452
+ --message-bubble-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
453
+ /* Owns its own border/bg/shadow with compact (~12-20px) paddings, closer
454
+ to Alert/Dropdown's profile than Card's, despite living in data-display. */
455
+ --gantt-chart-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-sm));
456
+
457
+ /* Surfaces (1.5x base = 18px, capped) */
458
+ --card-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-lg));
459
+ --modal-radius: min(calc(var(--radius-base) * 1.5), var(--surface-radius-cap-lg));
460
+ /* HeroCard has no radius token of its own — it's a Card presentation, so
461
+ it shares --card-radius (overridable per-instance via className, same
462
+ as every other component). */
233
463
 
234
464
  /* Special shapes - not part of scale */
235
465
  --segmented-radius: var(--form-radius);
236
466
  --avatar-radius: 50%;
237
467
 
238
- /* Focus ring styling */
239
- --form-focus-ring-width: 2px;
240
- --form-focus-ring-offset: -1px;
241
- --form-focus-ring-opacity: 0.1;
242
-
243
- /* Outline/border styling */
244
- --form-outline-width: 1px;
245
- --form-outline-focused-width: 2px;
246
-
247
468
  /* Button variables - inheriting from form variables */
248
469
  --button-radius: var(--form-radius);
249
470
  --button-min-h-sm: var(--form-min-h-sm);
250
471
  --button-min-h-md: var(--form-min-h-md);
251
472
  --button-min-h-lg: var(--form-min-h-lg);
252
473
 
253
- /* Button padding — fixed px */
254
- --button-px-sm: 12px;
474
+ /* Button padding — fixed px. A +2 ramp (10/12/14); py is 0 because the
475
+ height comes from --button-min-h-* (i.e. --form-min-h-*), not padding. */
476
+ --button-px-sm: 10px;
255
477
  --button-py-sm: 0;
256
- --button-px-md: 14px;
478
+ --button-px-md: 12px;
257
479
  --button-py-md: 0;
258
- --button-px-lg: 20px;
480
+ --button-px-lg: 14px;
259
481
  --button-py-lg: 0;
260
482
 
483
+ /* Button type size — aliases the form ramp, like --button-min-h-* aliases
484
+ --form-min-h-*. A theme can break the alias to size button type
485
+ independently of input type. */
486
+ --button-text-size-sm: var(--form-text-size-sm);
487
+ --button-text-size-md: var(--form-text-size-md);
488
+ --button-text-size-lg: var(--form-text-size-lg);
489
+ --button-line-height-sm: var(--form-line-height-sm);
490
+ --button-line-height-md: var(--form-line-height-md);
491
+ --button-line-height-lg: var(--form-line-height-lg);
492
+
261
493
  /* Button icon-only padding — fixed px */
262
494
  --button-icon-p-sm: 6px;
263
495
  --button-icon-p-md: 8px;
@@ -268,8 +500,46 @@
268
500
  --button-icon-size-md: var(--form-min-h-md);
269
501
  --button-icon-size-lg: var(--form-min-h-lg);
270
502
 
271
- /* Badge variables */
272
- --badge-radius: 6px;
503
+ /* Badge variables.
504
+ Radius derives from --radius-base like every other CONTROL (Button/Input/
505
+ Segmented) — 0.75x = 6px at the 8px base, and now it tracks a themed base
506
+ (was a hardcoded 6px literal that silently ignored --radius-base). Uncapped:
507
+ a large base takes Badge fully pill, which CSS auto-clamps to 50%.
508
+ Paddings are fixed px (like --button-px-*/--form-px-*), overridable per theme
509
+ so a spacious theme can grow the chip tier alongside its controls. py drives
510
+ height together with the text line-height + 1px border (sm: 16+0+2=18, md:
511
+ 16+4+2=22). pill-px must clear the rounded-full cap so text is not eaten
512
+ by the curve. */
513
+ --badge-radius: calc(var(--radius-base) * 0.75);
514
+ --badge-px-sm: 4px;
515
+ --badge-px-md: 6px;
516
+ --badge-py-sm: 0px;
517
+ --badge-py-md: 2px;
518
+ --badge-pill-px-sm: 8px;
519
+ --badge-pill-px-md: 10px;
520
+
521
+ /* Pill (chip tier) — px/py per size. rounded-full is intrinsic (no radius
522
+ token needed); a themed --radius-base leaves it pill either way. */
523
+ --pill-px-sm: 10px;
524
+ --pill-px-md: 10px;
525
+ --pill-px-lg: 12px;
526
+ --pill-py-sm: 2px;
527
+ --pill-py-md: 2px;
528
+ --pill-py-lg: 4px;
529
+
530
+ /* Tag (chip tier) — rounded-full intrinsic. md carries a slightly larger LEFT
531
+ inset (--tag-pl-md) so a leading avatar/icon sits right; px-md is the right
532
+ edge. */
533
+ --tag-px-sm: 8px;
534
+ --tag-px-md: 8px;
535
+ --tag-pl-md: 10px;
536
+ --tag-py-sm: 2px;
537
+ --tag-py-md: 2px;
538
+
539
+ /* Kbd (chip tier) — px only; height stays the fixed h-5/h-6 keycap size and
540
+ radius already derives from --radius-base in Kbd.theme.ts. */
541
+ --kbd-px-sm: 4px;
542
+ --kbd-px-md: 6px;
273
543
 
274
544
  /* Segmented variables - now defined in radius system above */
275
545
  --segmented-min-h-sm: var(--form-min-h-sm);
@@ -285,6 +555,50 @@
285
555
  --segmented-py-md: var(--form-py-md);
286
556
  --segmented-py-lg: var(--form-py-lg);
287
557
 
558
+ /* Segmented type size — aliases the form ramp like every other Segmented
559
+ box token. Previously Segmented was text-sm at ALL THREE sizes while
560
+ Button/Input both stepped up at lg, despite --segmented-min-h-* being a
561
+ straight alias of --form-min-h-*: lg grew its box but not its type. */
562
+ --segmented-text-size-sm: var(--form-text-size-sm);
563
+ --segmented-text-size-md: var(--form-text-size-md);
564
+ --segmented-text-size-lg: var(--form-text-size-lg);
565
+ --segmented-line-height-sm: var(--form-line-height-sm);
566
+ --segmented-line-height-md: var(--form-line-height-md);
567
+ --segmented-line-height-lg: var(--form-line-height-lg);
568
+
569
+ /* ============================================
570
+ SURFACE PADDING SYSTEM — same idea as BORDER RADIUS SYSTEM/TYPE ROLE
571
+ SYSTEM above: a library can't bake a Tailwind literal (p-6, p-4) into a
572
+ .theme.ts file and call it themeable — a consumer's theme has no lever
573
+ to reach it. These are the "brand-visible container weight" surfaces a
574
+ theme author would actually want to dial roomier/tighter (e.g. the
575
+ spacious-dialog look), not every padded box in the library — denser/
576
+ data-oriented chrome (Alert, Toast, Popover, Message, Tooltip,
577
+ ChartTooltip, GanttChart, CommandPalette, Table, etc.) is deliberately
578
+ out of scope for now. HeroCard is also deliberately excluded — it's a
579
+ custom/override presentation of Card, not a foundational container, and
580
+ keeps its hardcoded p-10.
581
+ Each token defaults to today's exact px value — zero visual change for
582
+ any theme that doesn't override these. */
583
+ --card-px: 24px;
584
+ --card-py: 24px;
585
+ /* from p-6 */
586
+ --modal-px: 16px;
587
+ --modal-py: 16px;
588
+ /* from p-4 */
589
+ --drawer-px: 16px;
590
+ --drawer-py: 16px;
591
+ /* from p-4 */
592
+
593
+ /* Metric: uniform (not split px/py) — matches its existing non-split
594
+ contentPaddingSizes shape and the --metric-value-size-* naming. */
595
+ --metric-content-p-sm: 12px;
596
+ /* from p-3 */
597
+ --metric-content-p-md: 16px;
598
+ /* from p-4 */
599
+ --metric-content-p-lg: 20px;
600
+ /* from p-5 */
601
+
288
602
  /* Segmented inner offset — drives wrapper padding AND inner radius so
289
603
  the sliding background + items stay concentric with the outer shell.
290
604
  border (1px) + padding (--segmented-padding) = total inset. */
@@ -292,16 +606,6 @@
292
606
  /* 2px */
293
607
  --segmented-inner-radius: calc(var(--segmented-radius) - var(--segmented-padding) - 1px);
294
608
 
295
- /* Segmented sliding background */
296
- --segmented-active-bg: #ffffff;
297
- --segmented-active-shadow:
298
- 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
299
-
300
- /* Glass effect variables */
301
- --glass-layer-padding: 0.5px;
302
- --glass-layer-border-width: 0.5px;
303
- --glass-layer-inner-offset: 1.5px;
304
-
305
609
  /* Glass effect gradient variables */
306
610
  --glass-gradient-outer: linear-gradient(to bottom,
307
611
  rgba(250, 250, 250, 0.8) 0%,
@@ -312,10 +616,6 @@
312
616
  rgba(242, 242, 242, 0.8) 0%,
313
617
  rgba(250, 250, 250, 0.8) 100%);
314
618
 
315
- /* Chat message variables */
316
- --chat-bubble-border-sender: rgba(255, 255, 255, 0.4);
317
- --chat-bubble-border-receiver: rgba(255, 255, 255, 1);
318
-
319
619
  /* Avatar variables — fixed px */
320
620
  --avatar-size-xs: 24px;
321
621
  /* size-6 in Tailwind */
@@ -330,45 +630,8 @@
330
630
 
331
631
  /* Avatar radius - now defined in radius system above */
332
632
 
333
- /* Carousel Variables */
334
- --carousel-container-width: 100%;
335
- /* Full width container */
336
- --carousel-slide-width: 66vw;
337
- /* Default slide width - can be overridden */
338
- --carousel-slide-height: 44rem;
339
- /* 384px = h-96 */
340
- --carousel-slide-gap: 16px;
341
- /* gap between slides */
342
- --carousel-controls-size: 48px;
343
- /* control button size */
344
- --carousel-controls-offset: 16px;
345
- /* distance from edge */
346
-
347
- /* Popover variables - radius now defined in radius system above */
348
- --popover-shadow:
349
- 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
350
- --popover-border-width: 1px;
351
- --popover-backdrop-opacity: 0.5;
352
- --popover-offset-sm: 8px;
353
- --popover-offset-md: 8px;
354
- --popover-offset-lg: 12px;
355
- --popover-max-width-sm: 256px;
356
- --popover-max-width-md: 384px;
357
- --popover-max-width-lg: 512px;
358
- --popover-padding-sm: 12px;
359
- --popover-padding-md: 12px;
360
- --popover-padding-lg: 16px;
361
-
362
- /* NavItem variables */
633
+ /* NavItem variables — radius only (padding/height live in NavItem.theme.ts) */
363
634
  --nav-item-radius: var(--radius-base);
364
- --nav-item-min-h: 40px;
365
- /* h-10 in Tailwind */
366
-
367
- /* NavItem padding — fixed px */
368
- --nav-item-px: 12px;
369
- /* px-3 in Tailwind */
370
- --nav-item-py: 10px;
371
- /* py-2.5 in Tailwind */
372
635
 
373
636
  /* Modal and Drawer */
374
637
  --overlay-bg: rgba(0, 0, 0, 0.65);
@@ -377,13 +640,6 @@
377
640
  /* backdrop behind scaled content */
378
641
  /* Modal radius - now defined in radius system above */
379
642
 
380
- /* Shadow color presets for utility generation */
381
- --shadow-color-primary: var(--color-primary);
382
- --shadow-color-success: var(--color-success);
383
- --shadow-color-warning: var(--color-warning);
384
- --shadow-color-danger: var(--color-danger);
385
- --shadow-color-secondary: var(--color-secondary);
386
-
387
643
  /* Neumorphic tokens — light mode (multi-layer realistic) */
388
644
  --neu-raised-shadow:
389
645
  1px 1px 2px rgba(0, 0, 0, 0.04), 3px 3px 6px rgba(0, 0, 0, 0.06),
@@ -425,6 +681,17 @@
425
681
  rgba(255, 255, 255, 0.5) 100%);
426
682
  }
427
683
 
684
+ /* NOTE on --color-neutral-*: the gray ROLE was renamed to `mono`
685
+ (--color-mono-* / color="mono") so it stops colliding with Tailwind's own
686
+ `neutral`. We deliberately do NOT re-alias --color-neutral-* here: in a
687
+ Tailwind build those names already resolve to Tailwind's real neutral
688
+ palette (emitted into styles.css alongside slate/zinc/stone, which the
689
+ RichTextEditor swatches rely on), and re-aliasing them to mono would
690
+ re-shadow Tailwind's neutral — exactly what this rename removes. Raw-var
691
+ consumers who used var(--color-neutral-*) for the role should migrate to
692
+ var(--color-mono-*); the old name now yields Tailwind's neutral (a near-
693
+ identical gray in the default theme). See CHANGELOG. */
694
+
428
695
  /* ============================================
429
696
  DARK MODE OVERRIDES
430
697
  Add .dark class to <html> or a parent container
@@ -603,12 +870,18 @@
603
870
 
604
871
  /* Neutral text ramp (Linear's text reads essentially neutral off-white;
605
872
  slate was too blue against the low-chroma surfaces). */
606
- --color-text-primary: var(--color-neutral-50);
873
+ --color-text-primary: var(--color-mono-50);
607
874
  --color-text-secondary: oklch(80% 0 0);
608
- --color-text-placeholder: var(--color-neutral-600);
609
- --color-text-muted: var(--color-neutral-600);
610
- --color-text-disabled: var(--color-neutral-400);
611
- --color-text-inverse: var(--color-neutral-950);
875
+ /* Re-derived (same formulas as :root) so the mix picks up the dark
876
+ text-primary even when .dark is scoped to a subtree — mirrors the
877
+ contrast-token re-declaration below. 40% of near-white over the dark
878
+ surfaces lands at the neutral-500 lightness the components used. */
879
+ --color-text-placeholder: color-mix(in oklab, var(--color-text-primary) 40%, transparent);
880
+ --color-text-muted: color-mix(in oklab, var(--color-text-primary) 50%, transparent);
881
+ /* neutral-600, not -400: the value every date/time picker bypassed to —
882
+ encoded here so components don't need dark: overrides */
883
+ --color-text-disabled: var(--color-mono-600);
884
+ --color-text-inverse: var(--color-mono-950);
612
885
 
613
886
  /* Shimmer surface sweep — dim the white streak on the near-black floor. */
614
887
  --shimmer-surface-highlight: color-mix(in srgb, #fff 8%, transparent);
@@ -620,6 +893,8 @@
620
893
  --color-warning: var(--color-warning-400);
621
894
  --color-danger: var(--color-danger-400);
622
895
  --color-secondary: var(--color-secondary-400);
896
+ /* Neutral fill flips to a light chip (dark ink text via auto contrast) */
897
+ --color-mono: var(--color-mono-200);
623
898
 
624
899
  /* Contrast colors for filled variants on semantic backgrounds.
625
900
  Auto-derived (same formula as :root) — recomputes against the dark-mode
@@ -629,6 +904,7 @@
629
904
  --color-success-contrast: oklch(from var(--color-success) clamp(0, (0.85 - l) * 1000, 1) 0 0);
630
905
  --color-warning-contrast: oklch(from var(--color-warning) clamp(0, (0.85 - l) * 1000, 1) 0 0);
631
906
  --color-secondary-contrast: oklch(from var(--color-secondary) clamp(0, (0.85 - l) * 1000, 1) 0 0);
907
+ --color-mono-contrast: oklch(from var(--color-mono) clamp(0, (0.85 - l) * 1000, 1) 0 0);
632
908
 
633
909
  /* Background colors - dark equivalents */
634
910
  /* Surface ladder — faithful Fluid Functionalism dark palette. 8 rungs step up neutrally
@@ -656,7 +932,7 @@
656
932
  --color-background-tertiary: oklch(22% 0 0);
657
933
  --color-background-quaternary: oklch(26% 0 0);
658
934
  --color-background-quinary: oklch(30% 0 0);
659
- --color-background-disabled: var(--color-neutral-800);
935
+ --color-background-disabled: var(--color-mono-800);
660
936
 
661
937
  /* Scale backdrop — sits behind scaled content, darker than the #171717 floor */
662
938
  --color-scale-background: #0a0a0a;
@@ -777,20 +1053,32 @@
777
1053
  inset 0 20px 40px -8px rgba(0, 0, 0, 0.36),
778
1054
  inset 0 -1px 0 rgba(255, 255, 255, 0.12);
779
1055
  --color-chart-track: rgba(255, 255, 255, 0.05);
780
-
781
- /* Glass effect gradients - dark mode */
1056
+ --color-chart-1: #60a5fa;
1057
+ --color-chart-1-contrast: oklch(from var(--color-chart-1) clamp(0, (0.85 - l) * 1000, 1) 0 0);
1058
+ --color-chart-2: #2dd4bf;
1059
+ --color-chart-2-contrast: oklch(from var(--color-chart-2) clamp(0, (0.85 - l) * 1000, 1) 0 0);
1060
+ --color-chart-3: #fbbf24;
1061
+ --color-chart-3-contrast: oklch(from var(--color-chart-3) clamp(0, (0.85 - l) * 1000, 1) 0 0);
1062
+ --color-chart-4: #a78bfa;
1063
+ --color-chart-4-contrast: oklch(from var(--color-chart-4) clamp(0, (0.85 - l) * 1000, 1) 0 0);
1064
+ --color-chart-5: #f472b6;
1065
+ --color-chart-5-contrast: oklch(from var(--color-chart-5) clamp(0, (0.85 - l) * 1000, 1) 0 0);
1066
+
1067
+ /* Glass effect gradients - dark mode. Surface-ladder rungs, NOT the deprecated
1068
+ --color-background-* aliases (removed next major); values match the old ones
1069
+ (tertiary oklch 22% ≈ surface-4, secondary = surface-3, background = surface-1). */
782
1070
  --glass-gradient-outer: linear-gradient(135deg,
783
- var(--color-background-tertiary) 0%,
784
- var(--color-background-secondary) 30%,
785
- var(--color-background) 70%,
786
- var(--color-background-tertiary) 100%);
1071
+ var(--surface-4) 0%,
1072
+ var(--surface-3) 30%,
1073
+ var(--surface-1) 70%,
1074
+ var(--surface-4) 100%);
787
1075
  --glass-gradient-inner: linear-gradient(to bottom,
788
- var(--color-background-secondary) 0%,
789
- var(--color-background) 100%);
1076
+ var(--surface-3) 0%,
1077
+ var(--surface-1) 100%);
790
1078
 
791
1079
  /* Scrollbar - dark mode */
792
1080
  --ui-scrollbar-thumb-rest: rgba(75, 85, 99, 0.3);
793
- --ui-scrollbar-thumb-active: rgb(75 85 99, 0.75);
1081
+ --ui-scrollbar-thumb-active: rgb(75 85 99 / 0.75);
794
1082
  --ui-scrollbar-track-rest: transparent;
795
1083
  --ui-scrollbar-track-active: rgba(55, 65, 81, 0.1);
796
1084