@cube-dev/ui-kit 0.0.0-canary-694a764 → 0.0.0-canary-dcbc0fb

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 (568) hide show
  1. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.js +1 -1
  14. package/dist/components/HiddenInput.js +1 -1
  15. package/dist/components/Root.d.ts +4 -4
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/Root.js.map +1 -1
  18. package/dist/components/actions/Action/Action.js +1 -1
  19. package/dist/components/actions/Banner/Banner.js +1 -1
  20. package/dist/components/actions/Button/Button.d.ts +1 -0
  21. package/dist/components/actions/Button/Button.js +1 -1
  22. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  23. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  24. package/dist/components/actions/ButtonSplit/context.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/Link/Link.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js +1 -1
  32. package/dist/components/actions/Menu/MenuItem.js +1 -1
  33. package/dist/components/actions/Menu/MenuSection.js +1 -1
  34. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/dist/components/actions/Menu/context.js +1 -1
  38. package/dist/components/actions/Menu/styled.js +1 -1
  39. package/dist/components/actions/index.js +1 -1
  40. package/dist/components/actions/use-action.js +1 -1
  41. package/dist/components/actions/use-anchored-menu.js +1 -1
  42. package/dist/components/actions/use-context-menu.js +1 -1
  43. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  44. package/dist/components/content/Alert/Alert.js +1 -1
  45. package/dist/components/content/Alert/use-alert.js +1 -1
  46. package/dist/components/content/Avatar/Avatar.js +1 -1
  47. package/dist/components/content/Badge/Badge.js +1 -1
  48. package/dist/components/content/Card/Card.js +1 -1
  49. package/dist/components/content/Content.js +1 -1
  50. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  51. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  52. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  53. package/dist/components/content/Divider.js +1 -1
  54. package/dist/components/content/Footer.js +1 -1
  55. package/dist/components/content/Header.js +1 -1
  56. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  57. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  58. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  59. package/dist/components/content/Item/Item.js +1 -1
  60. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  61. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  62. package/dist/components/content/Layout/GridLayout.js +1 -1
  63. package/dist/components/content/Layout/Layout.js +1 -1
  64. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  65. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  66. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  67. package/dist/components/content/Layout/LayoutContent.js +1 -1
  68. package/dist/components/content/Layout/LayoutContext.js +1 -1
  69. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  70. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  71. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  72. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutPane.js +1 -1
  74. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  75. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  76. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  77. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  78. package/dist/components/content/Layout/index.js +1 -1
  79. package/dist/components/content/Layout/utils.js +1 -1
  80. package/dist/components/content/Paragraph.js +1 -1
  81. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  82. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  83. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  84. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  85. package/dist/components/content/Result/Result.js +1 -1
  86. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  87. package/dist/components/content/Tag/Tag.js +1 -1
  88. package/dist/components/content/Text.d.ts +14 -14
  89. package/dist/components/content/Text.js +1 -1
  90. package/dist/components/content/TextItem/TextItem.js +1 -1
  91. package/dist/components/content/Title.js +1 -1
  92. package/dist/components/content/Tree/Tree.js +1 -1
  93. package/dist/components/content/Tree/TreeNode.js +1 -1
  94. package/dist/components/content/Tree/styled.js +1 -1
  95. package/dist/components/content/Tree/tree-index.js +1 -1
  96. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  97. package/dist/components/content/Tree/use-load-data.js +1 -1
  98. package/dist/components/content/highlightText.js +1 -1
  99. package/dist/components/content/use-auto-tooltip.js +1 -1
  100. package/dist/components/data/DataTable/DataTable.js +1 -1
  101. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  102. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  103. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  104. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  106. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  107. package/dist/components/data/TableBase/RowCollection.js +1 -1
  108. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  109. package/dist/components/data/TableBase/TableRow.js +1 -1
  110. package/dist/components/data/TableBase/TableView.js +1 -1
  111. package/dist/components/data/TableBase/column-menu.js +1 -1
  112. package/dist/components/data/TableBase/column-tint.js +1 -1
  113. package/dist/components/data/TableBase/row-menu.js +1 -1
  114. package/dist/components/data/TableBase/styled.d.ts +2 -1
  115. package/dist/components/data/TableBase/styled.js +1 -1
  116. package/dist/components/data/TableBase/types.js +1 -1
  117. package/dist/components/data/TableBase/use-cell-selection.d.ts +1 -0
  118. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  119. package/dist/components/data/TableBase/use-column-order.js +1 -1
  120. package/dist/components/data/TableBase/use-container-width.js +1 -1
  121. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  122. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  123. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  124. package/dist/components/data/TableBase/use-table-search.js +1 -1
  125. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  126. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  127. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  128. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  129. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  130. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  131. package/dist/components/fields/Checkbox/context.js +1 -1
  132. package/dist/components/fields/ColorInput/ColorInput.js +3 -2
  133. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
  134. package/dist/components/fields/ColorPicker/ColorPicker.js +2 -2
  135. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
  136. package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.d.ts +8 -2
  137. package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.js +14 -6
  138. package/dist/components/fields/ColorSwatch/ColorSwatch.js.map +1 -0
  139. package/dist/components/fields/ColorSwatch/index.d.ts +2 -0
  140. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  141. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  142. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  143. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  144. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  145. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  146. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  147. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  148. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  149. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  150. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  151. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  152. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  153. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  154. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  155. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  156. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  157. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  158. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  159. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  160. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  161. package/dist/components/fields/DatePicker/period.js +1 -1
  162. package/dist/components/fields/DatePicker/props.js +1 -1
  163. package/dist/components/fields/DatePicker/utils.js +1 -1
  164. package/dist/components/fields/FileInput/FileInput.js +1 -1
  165. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  166. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  167. package/dist/components/fields/Input/Input.js +1 -1
  168. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  169. package/dist/components/fields/ListBox/ListBox.js +1 -1
  170. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  171. package/dist/components/fields/ListBoxPopover/index.d.ts +1 -0
  172. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  173. package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +2 -0
  174. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  175. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  176. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  177. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  178. package/dist/components/fields/Picker/Picker.js +1 -1
  179. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  180. package/dist/components/fields/RadioGroup/RadioGroup.js +2 -1
  181. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  182. package/dist/components/fields/RadioGroup/context.js +1 -1
  183. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  184. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  185. package/dist/components/fields/Select/Select.js +1 -1
  186. package/dist/components/fields/Slider/Gradation.js +1 -1
  187. package/dist/components/fields/Slider/HueSlider.js +15 -2
  188. package/dist/components/fields/Slider/HueSlider.js.map +1 -1
  189. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  190. package/dist/components/fields/Slider/Slider.js +1 -1
  191. package/dist/components/fields/Slider/SliderBase.js +1 -1
  192. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  193. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  194. package/dist/components/fields/Slider/elements.js +1 -1
  195. package/dist/components/fields/Slider/index.js +1 -1
  196. package/dist/components/fields/Switch/Switch.js +1 -1
  197. package/dist/components/fields/TextArea/TextArea.js +1 -1
  198. package/dist/components/fields/TextInput/TextInput.js +1 -1
  199. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  200. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  201. package/dist/components/fields/color/ColorPanel.js +1 -1
  202. package/dist/components/fields/color/channels.js +1 -1
  203. package/dist/components/fields/color/color.js +1 -1
  204. package/dist/components/fields/color/context.js +1 -1
  205. package/dist/components/fields/color/index.d.ts +0 -1
  206. package/dist/components/fields/index.d.ts +2 -1
  207. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  208. package/dist/components/form/Form/Field.js +1 -1
  209. package/dist/components/form/Form/Form.js +1 -1
  210. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  211. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  212. package/dist/components/form/Form/SubmitError.js +1 -1
  213. package/dist/components/form/Form/index.js +1 -1
  214. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  215. package/dist/components/form/Form/use-field/use-field.js +1 -1
  216. package/dist/components/form/Form/use-form.js +1 -1
  217. package/dist/components/form/Form/validation.js +1 -1
  218. package/dist/components/form/Label.js +1 -1
  219. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  220. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  221. package/dist/components/form/validation/use-validation-props.js +1 -1
  222. package/dist/components/form/wrapper.js +1 -1
  223. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  224. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  225. package/dist/components/layout/Board/Board.js +1 -1
  226. package/dist/components/layout/Board/BoardProvider.js +1 -1
  227. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  228. package/dist/components/layout/Board/Widget.js +1 -1
  229. package/dist/components/layout/Board/WidgetHost.js +1 -1
  230. package/dist/components/layout/Board/board-context.js +1 -1
  231. package/dist/components/layout/Board/board-store.js +1 -1
  232. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  233. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  234. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  235. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  236. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  237. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  238. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  239. package/dist/components/layout/Board/index.js +1 -1
  240. package/dist/components/layout/Board/responsive-utils.js +1 -1
  241. package/dist/components/layout/Board/use-board-layout.js +1 -1
  242. package/dist/components/layout/Board/use-board-registry.js +1 -1
  243. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  244. package/dist/components/layout/Board/use-board-selection.js +1 -1
  245. package/dist/components/layout/Flex.js +1 -1
  246. package/dist/components/layout/Flow.js +1 -1
  247. package/dist/components/layout/Grid.js +1 -1
  248. package/dist/components/layout/Panel.js +1 -1
  249. package/dist/components/layout/Prefix.js +1 -1
  250. package/dist/components/layout/ResizablePanel.js +1 -1
  251. package/dist/components/layout/Space.js +1 -1
  252. package/dist/components/layout/Suffix.js +1 -1
  253. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  254. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  255. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  256. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  257. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  258. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  259. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  260. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  261. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  262. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  263. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  264. package/dist/components/navigation/Tabs/styled.js +1 -1
  265. package/dist/components/navigation/Tabs/types.js +1 -1
  266. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  267. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  268. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  269. package/dist/components/other/Calendar/Calendar.js +1 -1
  270. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  271. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  272. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  273. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  274. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  275. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  276. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  277. package/dist/components/other/Calendar/styled.js +1 -1
  278. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  279. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  280. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  281. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  282. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  283. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  284. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  285. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  286. package/dist/components/overlays/Dialog/context.js +1 -1
  287. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  288. package/dist/components/overlays/Modal/Modal.d.ts +2 -1
  289. package/dist/components/overlays/Modal/Modal.js +1 -1
  290. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  291. package/dist/components/overlays/Modal/Overlay.d.ts +1 -0
  292. package/dist/components/overlays/Modal/Overlay.js +1 -1
  293. package/dist/components/overlays/Modal/Popover.js +1 -1
  294. package/dist/components/overlays/Modal/Tray.js +1 -1
  295. package/dist/components/overlays/Modal/Underlay.js +1 -1
  296. package/dist/components/overlays/Modal/types.d.ts +1 -0
  297. package/dist/components/overlays/Notifications/Notification.js +1 -1
  298. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  299. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  300. package/dist/components/overlays/Notifications/NotificationContext.d.ts +2 -0
  301. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  302. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  303. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  304. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  305. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  306. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  307. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  308. package/dist/components/overlays/Notifications/index.js +1 -1
  309. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  310. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  311. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  312. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  313. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  314. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  315. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  316. package/dist/components/overlays/Toast/index.js +1 -1
  317. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  318. package/dist/components/overlays/Toast/useToast.js +1 -1
  319. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  320. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  321. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  322. package/dist/components/overlays/Tooltip/context.js +1 -1
  323. package/dist/components/portal/Portal.js +1 -1
  324. package/dist/components/portal/PortalProvider.d.ts +2 -0
  325. package/dist/components/portal/PortalProvider.js +1 -1
  326. package/dist/components/portal/index.d.ts +1 -0
  327. package/dist/components/portal/usePortal.js +1 -1
  328. package/dist/components/shared/DraggableCollection.js +1 -1
  329. package/dist/components/shared/InvalidIcon.js +1 -1
  330. package/dist/components/shared/ValidIcon.js +1 -1
  331. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  332. package/dist/components/status/Spin/Cube.js +1 -1
  333. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  334. package/dist/components/status/Spin/Spin.js +1 -1
  335. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  336. package/dist/data/item-themes.js +1 -1
  337. package/dist/data/themes.js +1 -1
  338. package/dist/eslint-plugin/defaults.generated.js +1 -1
  339. package/dist/eslint-plugin/index.js +1 -1
  340. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  341. package/dist/i18n/I18nProvider.js +1 -1
  342. package/dist/i18n/createFormatter.js +1 -1
  343. package/dist/i18n/index.js +1 -1
  344. package/dist/i18n/instance.js +1 -1
  345. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  346. package/dist/i18n/locales/en-US/uikit.js +1 -1
  347. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  348. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  349. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  350. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  351. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  352. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  353. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  354. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  355. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  356. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  357. package/dist/i18n/locales.js +1 -1
  358. package/dist/i18n/useFormatter.js +1 -1
  359. package/dist/i18n/useI18n.js +1 -1
  360. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  361. package/dist/icons/AdjustmentsIcon.js +1 -1
  362. package/dist/icons/AiIcon.js +1 -1
  363. package/dist/icons/AreaChartIcon.js +1 -1
  364. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  365. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  366. package/dist/icons/BackwardIcon.js +1 -1
  367. package/dist/icons/BarChartIcon.js +1 -1
  368. package/dist/icons/BellFilledIcon.js +1 -1
  369. package/dist/icons/BellIcon.js +1 -1
  370. package/dist/icons/BooleanIcon.js +1 -1
  371. package/dist/icons/CalendarEditIcon.js +1 -1
  372. package/dist/icons/CalendarIcon.js +1 -1
  373. package/dist/icons/CaretDownIcon.js +1 -1
  374. package/dist/icons/CaretUpIcon.js +1 -1
  375. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  376. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  377. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  378. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  379. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  380. package/dist/icons/ChartBarLineIcon.js +1 -1
  381. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  382. package/dist/icons/ChartBarStackedIcon.js +1 -1
  383. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  384. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  385. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  386. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  387. package/dist/icons/ChartBubbleIcon.js +1 -1
  388. package/dist/icons/ChartDonut2Icon.js +1 -1
  389. package/dist/icons/ChartFunnelIcon.js +1 -1
  390. package/dist/icons/ChartHeatmapIcon.js +1 -1
  391. package/dist/icons/ChartKPIIcon.js +1 -1
  392. package/dist/icons/ChartPie2Icon.js +1 -1
  393. package/dist/icons/ChartScatterIcon.js +1 -1
  394. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  395. package/dist/icons/CheckCircleIcon.js +1 -1
  396. package/dist/icons/CheckIcon.js +1 -1
  397. package/dist/icons/CircleFilledIcon.js +1 -1
  398. package/dist/icons/ClearIcon.js +1 -1
  399. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  400. package/dist/icons/CloseCircleIcon.js +1 -1
  401. package/dist/icons/CloseIcon.js +1 -1
  402. package/dist/icons/CodeIcon.js +1 -1
  403. package/dist/icons/ColumnTotalIcon.js +1 -1
  404. package/dist/icons/CopyIcon.js +1 -1
  405. package/dist/icons/CountIcon.js +1 -1
  406. package/dist/icons/CubeIcon.js +1 -1
  407. package/dist/icons/CubePauseIcon.js +1 -1
  408. package/dist/icons/CubePlayIcon.js +1 -1
  409. package/dist/icons/CurrencyDollarIcon.js +1 -1
  410. package/dist/icons/DangerIcon.js +1 -1
  411. package/dist/icons/DashboardIcon.js +1 -1
  412. package/dist/icons/DatabaseIcon.js +1 -1
  413. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  414. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  415. package/dist/icons/DirectionIcon.js +1 -1
  416. package/dist/icons/DonutIcon.js +1 -1
  417. package/dist/icons/DownIcon.js +1 -1
  418. package/dist/icons/EditIcon.js +1 -1
  419. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  420. package/dist/icons/ExclamationCircleIcon.js +1 -1
  421. package/dist/icons/ExclamationIcon.js +1 -1
  422. package/dist/icons/EyeIcon.js +1 -1
  423. package/dist/icons/EyeInvisibleIcon.js +1 -1
  424. package/dist/icons/FilterIcon.js +1 -1
  425. package/dist/icons/FolderFilledIcon.js +1 -1
  426. package/dist/icons/FolderIcon.js +1 -1
  427. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  428. package/dist/icons/FolderOpenIcon.js +1 -1
  429. package/dist/icons/ForwardIcon.js +1 -1
  430. package/dist/icons/GripVerticalIcon.js +1 -1
  431. package/dist/icons/HierarchyIcon.js +1 -1
  432. package/dist/icons/HierarchyOpenIcon.js +1 -1
  433. package/dist/icons/Icon.js +1 -1
  434. package/dist/icons/InfoCircleIcon.js +1 -1
  435. package/dist/icons/InfoIcon.js +1 -1
  436. package/dist/icons/KeyIcon.js +1 -1
  437. package/dist/icons/LeftIcon.js +1 -1
  438. package/dist/icons/LineChartIcon.js +1 -1
  439. package/dist/icons/LoadingIcon.js +1 -1
  440. package/dist/icons/LockFilledIcon.js +1 -1
  441. package/dist/icons/LockIcon.js +1 -1
  442. package/dist/icons/MoreIcon.js +1 -1
  443. package/dist/icons/NotAllowedIcon.js +1 -1
  444. package/dist/icons/Number123Icon.js +1 -1
  445. package/dist/icons/NumberIcon.js +1 -1
  446. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  447. package/dist/icons/PauseCircleIcon.js +1 -1
  448. package/dist/icons/PauseIcon.js +1 -1
  449. package/dist/icons/PercentageIcon.js +1 -1
  450. package/dist/icons/PieChartIcon.js +1 -1
  451. package/dist/icons/PipetteIcon.js +1 -1
  452. package/dist/icons/PlayCircleIcon.js +1 -1
  453. package/dist/icons/PlayIcon.js +1 -1
  454. package/dist/icons/PlusIcon.js +1 -1
  455. package/dist/icons/ProgressBarIcon.js +1 -1
  456. package/dist/icons/ReloadIcon.js +1 -1
  457. package/dist/icons/ReportIcon.js +1 -1
  458. package/dist/icons/ReturnIcon.js +1 -1
  459. package/dist/icons/RightIcon.js +1 -1
  460. package/dist/icons/RowTotalsIcon.js +1 -1
  461. package/dist/icons/SchemeIcon.js +1 -1
  462. package/dist/icons/SearchIcon.js +1 -1
  463. package/dist/icons/SemanticQueryIcon.js +1 -1
  464. package/dist/icons/SettingsIcon.js +1 -1
  465. package/dist/icons/ShieldFilledIcon.js +1 -1
  466. package/dist/icons/ShieldIcon.js +1 -1
  467. package/dist/icons/SlashIcon.js +1 -1
  468. package/dist/icons/SparklesIcon.js +1 -1
  469. package/dist/icons/SqlIcon.js +1 -1
  470. package/dist/icons/StatsIcon.js +1 -1
  471. package/dist/icons/StopIcon.js +1 -1
  472. package/dist/icons/StringIcon.js +1 -1
  473. package/dist/icons/SubtotalsIcon.js +1 -1
  474. package/dist/icons/SwitchIcon.js +1 -1
  475. package/dist/icons/TableIcon.js +1 -1
  476. package/dist/icons/ThumbsDownIcon.js +1 -1
  477. package/dist/icons/ThumbsUpIcon.js +1 -1
  478. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  479. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  480. package/dist/icons/ThunderboltIcon.js +1 -1
  481. package/dist/icons/TimeIcon.js +1 -1
  482. package/dist/icons/TrashIcon.js +1 -1
  483. package/dist/icons/UnlockIcon.js +1 -1
  484. package/dist/icons/UpIcon.js +1 -1
  485. package/dist/icons/UserGroupIcon.js +1 -1
  486. package/dist/icons/UserIcon.js +1 -1
  487. package/dist/icons/UserLockIcon.js +1 -1
  488. package/dist/icons/ViewIcon.js +1 -1
  489. package/dist/icons/WarningFilledIcon.js +1 -1
  490. package/dist/icons/WarningIcon.js +1 -1
  491. package/dist/icons/wrap-icon.js +1 -1
  492. package/dist/index.d.ts +4 -3
  493. package/dist/index.js +5 -4
  494. package/dist/index.js.map +1 -1
  495. package/dist/probe/canonicalize.js +1 -1
  496. package/dist/probe/css.js +1 -1
  497. package/dist/probe/index.js +1 -1
  498. package/dist/provider.js +1 -1
  499. package/dist/providers/TrackingProvider.js +1 -1
  500. package/dist/providers/navigationAdapter.default.js +1 -1
  501. package/dist/tokens/base.js +1 -1
  502. package/dist/tokens/color-seed.d.ts +44 -0
  503. package/dist/tokens/color-seed.js +48 -0
  504. package/dist/tokens/color-seed.js.map +1 -0
  505. package/dist/tokens/color-theme.d.ts +8 -1
  506. package/dist/tokens/color-theme.js +19 -7
  507. package/dist/tokens/color-theme.js.map +1 -1
  508. package/dist/tokens/colors.js +1 -1
  509. package/dist/tokens/index.d.ts +2 -1
  510. package/dist/tokens/index.js +3 -2
  511. package/dist/tokens/index.js.map +1 -1
  512. package/dist/tokens/layout.js +1 -1
  513. package/dist/tokens/lazy-styles.js +1 -1
  514. package/dist/tokens/palette-config.d.ts +175 -9
  515. package/dist/tokens/palette-config.js +62 -10
  516. package/dist/tokens/palette-config.js.map +1 -1
  517. package/dist/tokens/palette.js +398 -157
  518. package/dist/tokens/palette.js.map +1 -1
  519. package/dist/tokens/shadows.js +1 -1
  520. package/dist/tokens/sizes.js +1 -1
  521. package/dist/tokens/spacing.js +1 -1
  522. package/dist/tokens/typography.js +1 -1
  523. package/dist/utils/ResizeSensor.js +1 -1
  524. package/dist/utils/is-dev-env.js +1 -1
  525. package/dist/utils/modules.js +1 -1
  526. package/dist/utils/promise.js +1 -1
  527. package/dist/utils/raf.js +1 -1
  528. package/dist/utils/random.js +1 -1
  529. package/dist/utils/range.js +1 -1
  530. package/dist/utils/react/RenderCache.js +1 -1
  531. package/dist/utils/react/Slots.js +1 -1
  532. package/dist/utils/react/chain.js +1 -1
  533. package/dist/utils/react/disabledProps.js +1 -1
  534. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  535. package/dist/utils/react/index.js +1 -1
  536. package/dist/utils/react/interactions.js +1 -1
  537. package/dist/utils/react/isTextOnly.js +1 -1
  538. package/dist/utils/react/mapProps.js +1 -1
  539. package/dist/utils/react/mergeProps.js +1 -1
  540. package/dist/utils/react/nullableValue.js +1 -1
  541. package/dist/utils/react/resolveIcon.js +1 -1
  542. package/dist/utils/react/sharedStore.js +1 -1
  543. package/dist/utils/react/useBufferedValue.js +1 -1
  544. package/dist/utils/react/useCombinedRefs.js +1 -1
  545. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  546. package/dist/utils/react/useEventBus.js +1 -1
  547. package/dist/utils/react/useId.js +1 -1
  548. package/dist/utils/react/useIsDarwin.js +1 -1
  549. package/dist/utils/react/useKeySymbols.js +1 -1
  550. package/dist/utils/react/useLayoutEffect.js +1 -1
  551. package/dist/utils/react/useLocalStorage.js +1 -1
  552. package/dist/utils/react/useMergeStyles.js +1 -1
  553. package/dist/utils/react/usePopoverSync.js +1 -1
  554. package/dist/utils/react/useQaProps.js +1 -1
  555. package/dist/utils/react/useViewportSize.js +1 -1
  556. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  557. package/dist/utils/selection.js +1 -1
  558. package/dist/utils/styles.js +1 -1
  559. package/dist/utils/tree.js +1 -1
  560. package/dist/utils/warnings.js +1 -1
  561. package/dist/version.js +2 -2
  562. package/docs/Theming.md +306 -30
  563. package/docs/components/fields/ColorSwatch.md +148 -0
  564. package/docs/glaze/api.md +117 -38
  565. package/docs/glaze/methodology.md +15 -13
  566. package/docs/glaze/okhst.md +4 -0
  567. package/package.json +2 -2
  568. package/dist/components/fields/color/ColorSwatch.js.map +0 -1
@@ -0,0 +1,44 @@
1
+
2
+ //#region src/tokens/color-seed.d.ts
3
+ /**
4
+ * Turns a colour into the three numbers the palette is seeded from.
5
+ *
6
+ * A deliberate LEAF: it imports Glaze and nothing else. `./palette-config` reads it
7
+ * from inside `resolveConfig`, and `./palette-config` is the one module the token
8
+ * graph is not allowed to have a cycle through — so anything this file imported
9
+ * would become a `palette-config` dependency too. Glaze has no edge back into the
10
+ * token modules, so it is safe; `./palette` (which owns `TINT_RECIPE` and the global
11
+ * `glaze.configure`) is not.
12
+ *
13
+ * There is no ordering hazard either, even though `./palette` runs
14
+ * `glaze.configure()` at module scope and this file may be called before that
15
+ * happens. A bare-string colour token defaults to `lightTone: false`, so its light
16
+ * variant preserves the input tone exactly and its hue and saturation come straight
17
+ * off the parse — all three readings are independent of the global config.
18
+ */
19
+ /** Hue, saturation and tone read off a colour, on the palette's own scales. */
20
+ interface ColorSeed {
21
+ /** 0–360. */
22
+ hue: number;
23
+ /** 0–100 — the palette's seed scale, not Glaze's 0–1 factor. */
24
+ saturation: number;
25
+ /** 0–100 on the OKHST tone axis. */
26
+ tone: number;
27
+ }
28
+ /**
29
+ * Read a colour's hue, saturation and tone.
30
+ *
31
+ * Accepts anything Glaze parses — hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`,
32
+ * `oklch()`. CSS colour keywords (`rebeccapurple`) are **not** supported.
33
+ *
34
+ * Returns `null` on anything unparseable, having warned once, so a caller can fall
35
+ * back to its numeric seed instead of throwing on a typo in a settings field.
36
+ *
37
+ * ```ts
38
+ * colorSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19, tone: 65.78 }
39
+ * ```
40
+ */
41
+ declare function colorSeed(value: string): ColorSeed | null;
42
+ //#endregion
43
+ export { ColorSeed, colorSeed };
44
+ //# sourceMappingURL=color-seed.d.ts.map
@@ -0,0 +1,48 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
2
+ import { glaze } from "@tenphi/glaze";
3
+
4
+ //#region src/tokens/color-seed.ts
5
+ /**
6
+ * A colour picker being dragged emits a distinct string per frame, and
7
+ * `resolveConfig` runs on every `setPaletteConfig` *and* every
8
+ * `resolvePaletteConfig` preview. One resolve is only ~3µs, so this is insurance
9
+ * against a drag rather than a hot path — hence a cap and a clear rather than an
10
+ * LRU.
11
+ */
12
+ const CACHE_LIMIT = 256;
13
+ const cache = /* @__PURE__ */ new Map();
14
+ /**
15
+ * Read a colour's hue, saturation and tone.
16
+ *
17
+ * Accepts anything Glaze parses — hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`,
18
+ * `oklch()`. CSS colour keywords (`rebeccapurple`) are **not** supported.
19
+ *
20
+ * Returns `null` on anything unparseable, having warned once, so a caller can fall
21
+ * back to its numeric seed instead of throwing on a typo in a settings field.
22
+ *
23
+ * ```ts
24
+ * colorSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19, tone: 65.78 }
25
+ * ```
26
+ */
27
+ function colorSeed(value) {
28
+ const cached = cache.get(value);
29
+ if (cached !== void 0) return cached;
30
+ let seed = null;
31
+ try {
32
+ const { h, s, t } = glaze.color(value).resolve().light;
33
+ seed = {
34
+ hue: h,
35
+ saturation: s * 100,
36
+ tone: t * 100
37
+ };
38
+ } catch {
39
+ console.warn(`[cube-ui-kit] could not parse palette colour ${JSON.stringify(value)}; keeping the numeric seed. Accepted: hex, rgb(), hsl(), okhsl(), okhst(), oklch() — CSS colour keywords are not supported.`);
40
+ }
41
+ if (cache.size >= CACHE_LIMIT) cache.clear();
42
+ cache.set(value, seed);
43
+ return seed;
44
+ }
45
+
46
+ //#endregion
47
+ export { colorSeed };
48
+ //# sourceMappingURL=color-seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-seed.js","names":[],"sources":["../../src/tokens/color-seed.ts"],"sourcesContent":["import { glaze } from '@tenphi/glaze';\n\n/**\n * Turns a colour into the three numbers the palette is seeded from.\n *\n * A deliberate LEAF: it imports Glaze and nothing else. `./palette-config` reads it\n * from inside `resolveConfig`, and `./palette-config` is the one module the token\n * graph is not allowed to have a cycle through — so anything this file imported\n * would become a `palette-config` dependency too. Glaze has no edge back into the\n * token modules, so it is safe; `./palette` (which owns `TINT_RECIPE` and the global\n * `glaze.configure`) is not.\n *\n * There is no ordering hazard either, even though `./palette` runs\n * `glaze.configure()` at module scope and this file may be called before that\n * happens. A bare-string colour token defaults to `lightTone: false`, so its light\n * variant preserves the input tone exactly and its hue and saturation come straight\n * off the parse — all three readings are independent of the global config.\n */\n\n/** Hue, saturation and tone read off a colour, on the palette's own scales. */\nexport interface ColorSeed {\n /** 0–360. */\n hue: number;\n /** 0–100 — the palette's seed scale, not Glaze's 0–1 factor. */\n saturation: number;\n /** 0–100 on the OKHST tone axis. */\n tone: number;\n}\n\n/**\n * A colour picker being dragged emits a distinct string per frame, and\n * `resolveConfig` runs on every `setPaletteConfig` *and* every\n * `resolvePaletteConfig` preview. One resolve is only ~3µs, so this is insurance\n * against a drag rather than a hot path — hence a cap and a clear rather than an\n * LRU.\n */\nconst CACHE_LIMIT = 256;\nconst cache = new Map<string, ColorSeed | null>();\n\n/**\n * Read a colour's hue, saturation and tone.\n *\n * Accepts anything Glaze parses — hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`,\n * `oklch()`. CSS colour keywords (`rebeccapurple`) are **not** supported.\n *\n * Returns `null` on anything unparseable, having warned once, so a caller can fall\n * back to its numeric seed instead of throwing on a typo in a settings field.\n *\n * ```ts\n * colorSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19, tone: 65.78 }\n * ```\n */\nexport function colorSeed(value: string): ColorSeed | null {\n const cached = cache.get(value);\n\n // `null` is a cached FAILURE, not a miss — which is also what dedupes the\n // warning, so a bad value in a re-rendered config does not fill the console.\n if (cached !== undefined) return cached;\n\n let seed: ColorSeed | null = null;\n\n try {\n const { h, s, t } = glaze.color(value).resolve().light;\n\n // Glaze reports saturation and tone as 0–1 factors; the palette's are 0–100.\n seed = { hue: h, saturation: s * 100, tone: t * 100 };\n } catch {\n console.warn(\n `[cube-ui-kit] could not parse palette colour ${JSON.stringify(value)}; ` +\n `keeping the numeric seed. Accepted: hex, rgb(), hsl(), okhsl(), okhst(), ` +\n `oklch() — CSS colour keywords are not supported.`,\n );\n }\n\n if (cache.size >= CACHE_LIMIT) cache.clear();\n cache.set(value, seed);\n\n return seed;\n}\n"],"mappings":";;;;;;;;;;;AAoCA,MAAM,cAAc;AACpB,MAAM,wBAAQ,IAAI,KAA+B;;;;;;;;;;;;;;AAejD,SAAgB,UAAU,OAAiC;CACzD,MAAM,SAAS,MAAM,IAAI,MAAM;AAI/B,KAAI,WAAW,OAAW,QAAO;CAEjC,IAAI,OAAyB;AAE7B,KAAI;EACF,MAAM,EAAE,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,CAAC,SAAS,CAAC;AAGjD,SAAO;GAAE,KAAK;GAAG,YAAY,IAAI;GAAK,MAAM,IAAI;GAAK;SAC/C;AACN,UAAQ,KACN,gDAAgD,KAAK,UAAU,MAAM,CAAC,6HAGvE;;AAGH,KAAI,MAAM,QAAQ,YAAa,OAAM,OAAO;AAC5C,OAAM,IAAI,OAAO,KAAK;AAEtB,QAAO"}
@@ -17,7 +17,7 @@ interface ColorThemeConfig {
17
17
  saturation?: number;
18
18
  pastel?: boolean;
19
19
  /**
20
- * Extra colour definitions, merged over {@link TINT_RECIPE}. Anything Glaze's
20
+ * Extra colour definitions, merged over {@link tintRecipe}. Anything Glaze's
21
21
  * `theme.colors()` accepts, including `contrast` floors against a sibling.
22
22
  */
23
23
  colors?: ColorMap;
@@ -45,6 +45,13 @@ interface ColorTheme {
45
45
  * ```ts
46
46
  * colorThemeSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19 }
47
47
  * ```
48
+ *
49
+ * The tone {@link colorSeed} also reads is dropped here on purpose: a tint theme
50
+ * re-derives its lightness per scheme, which is what makes it adaptive. The palette's
51
+ * `accentColor` keeps the tone, because a brand fill has to *be* the colour.
52
+ *
53
+ * An unparseable value falls back to the shipped seed rather than throwing — a hue
54
+ * typed into a settings field should not take the render down.
48
55
  */
49
56
  declare function colorThemeSeed(value: string): {
50
57
  hue: number;
@@ -1,6 +1,7 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-694a764 | Cube Dev Team */
2
- import { DEFAULT_SATURATION, getPaletteConfig, getPaletteVersion, usePaletteVersion } from "./palette-config.js";
3
- import { TINT_RECIPE } from "./palette.js";
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
2
+ import { colorSeed } from "./color-seed.js";
3
+ import { DEFAULT_HUE, DEFAULT_SATURATION, getPaletteConfig, getPaletteVersion, usePaletteVersion } from "./palette-config.js";
4
+ import { tintRecipe } from "./palette.js";
4
5
  import { useGlobalStyles } from "@tenphi/tasty";
5
6
  import { glaze } from "@tenphi/glaze";
6
7
 
@@ -50,12 +51,23 @@ function stableStringify(value) {
50
51
  * ```ts
51
52
  * colorThemeSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19 }
52
53
  * ```
54
+ *
55
+ * The tone {@link colorSeed} also reads is dropped here on purpose: a tint theme
56
+ * re-derives its lightness per scheme, which is what makes it adaptive. The palette's
57
+ * `accentColor` keeps the tone, because a brand fill has to *be* the colour.
58
+ *
59
+ * An unparseable value falls back to the shipped seed rather than throwing — a hue
60
+ * typed into a settings field should not take the render down.
53
61
  */
54
62
  function colorThemeSeed(value) {
55
- const light = glaze.color(value).resolve().light;
63
+ const seed = colorSeed(value);
64
+ if (!seed) return {
65
+ hue: DEFAULT_HUE,
66
+ saturation: DEFAULT_SATURATION
67
+ };
56
68
  return {
57
- hue: light.h,
58
- saturation: light.s * 100
69
+ hue: seed.hue,
70
+ saturation: seed.saturation
59
71
  };
60
72
  }
61
73
  /**
@@ -98,7 +110,7 @@ function getColorTheme(config) {
98
110
  };
99
111
  const theme = glaze(hue, saturation, Object.keys(overrides).length ? overrides : void 0);
100
112
  theme.colors({
101
- ...TINT_RECIPE,
113
+ ...tintRecipe(paletteConfig),
102
114
  ...config.colors
103
115
  });
104
116
  const raw = theme.tasty({ format: "oklch" });
@@ -1 +1 @@
1
- {"version":3,"file":"color-theme.js","names":[],"sources":["../../src/tokens/color-theme.ts"],"sourcesContent":["import { glaze } from '@tenphi/glaze';\nimport { useGlobalStyles } from '@tenphi/tasty';\n\n// Imported for its SIDE EFFECT as much as for `TINT_RECIPE`.\n//\n// `palette.ts` runs `glaze.configure({ states: { dark: '@dark', highContrast:\n// '@hc' }, modes: …, darkTone: … })` at module scope, and that global config is\n// what makes a theme emit `'@dark'` / `'@hc'` keys at all. Without this import\n// a runtime theme falls back to Glaze's defaults — `@media(prefers-color-scheme:\n// dark)` keys and NO high-contrast tier — which still renders, so the failure is\n// silent. `color-theme.test.ts` asserts the `'@hc'` key exists to catch it.\nimport { TINT_RECIPE } from './palette';\nimport {\n DEFAULT_SATURATION,\n getPaletteConfig,\n getPaletteVersion,\n usePaletteVersion,\n} from './palette-config';\n\nimport type { ColorMap, GlazeConfigOverride } from '@tenphi/glaze';\nimport type { Styles } from '@tenphi/tasty';\n\nexport interface ColorThemeConfig {\n /**\n * A hue in 0–360, or any colour Glaze parses — hex, `rgb()`, `hsl()`,\n * `okhsl()`, `okhst()`, `oklch()`.\n *\n * From a colour only the HUE and SATURATION are taken; the lightness is\n * discarded and re-derived per scheme. That is what makes the result adaptive\n * rather than a value that happens to work in one theme.\n */\n hue: number | string;\n /** 0–100. @default the palette's own saturation seed */\n saturation?: number;\n pastel?: boolean;\n /**\n * Extra colour definitions, merged over {@link TINT_RECIPE}. Anything Glaze's\n * `theme.colors()` accepts, including `contrast` floors against a sibling.\n */\n colors?: ColorMap;\n}\n\nexport interface ColorTheme {\n /**\n * A hash of the config, and the token prefix — `'tint-1a2b3c'`.\n *\n * Content-addressed rather than positional so two components asking for the\n * same colour name the same theme, and therefore share one injection. Also\n * makes it safe to stamp on the DOM as an identifier.\n */\n name: string;\n /**\n * Tasty token declarations, one state map per colour:\n * `{ '#tint-1a2b3c-surface': { '': …, '@dark': …, '@hc': …, '@dark & @hc': … } }`\n */\n tokens: Styles;\n /** Token references by their unprefixed name — `{ surface: '#tint-1a2b3c-surface' }`. */\n colors: Record<string, string>;\n}\n\n/**\n * FNV-1a, base36. Short, stable and dependency-free.\n *\n * These hashes name CSS custom properties and land in DOM attributes, so they\n * have to be deterministic across processes (SSR and the client must agree) and\n * safe as identifiers — but not cryptographic.\n */\nexport function hashString(input: string): string {\n let hash = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n // >>> 0 keeps it an unsigned 32-bit int; `Math.imul` is the 32-bit multiply.\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n\n return hash.toString(36);\n}\n\n/**\n * Hashes the RESOLVED seed, not the config as written.\n *\n * `{ hue: '#0ea5e9' }` and `{ hue: 237.32, saturation: 98.19 }` are the same\n * colour said two ways; hashing the input would give them two names, two\n * injections and two sets of generated rules. Rounded, because a seed that\n * differs in the twelfth decimal is the same colour to every eye and every\n * renderer — and an unrounded float would defeat the deduplication it is here to\n * provide.\n */\nfunction hashSeed(seed: ResolvedSeed): string {\n return `tint-${hashString(\n JSON.stringify([\n seed.hue.toFixed(4),\n seed.saturation.toFixed(4),\n seed.pastel,\n seed.colors ? stableStringify(seed.colors) : null,\n ]),\n )}`;\n}\n\ninterface ResolvedSeed {\n hue: number;\n saturation: number;\n pastel: boolean;\n colors?: ColorMap;\n}\n\n/** Key order must not change the hash, or two identical configs get two slots. */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0),\n );\n\n return `{${entries\n .map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`)\n .join(',')}}`;\n}\n\n/**\n * The hue and saturation of a colour, for use as a theme seed.\n *\n * ```ts\n * colorThemeSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19 }\n * ```\n */\nexport function colorThemeSeed(value: string): {\n hue: number;\n saturation: number;\n} {\n const light = glaze.color(value).resolve().light;\n\n // Glaze reports saturation as a 0–1 factor; the palette's seeds are 0–100.\n return { hue: light.h, saturation: light.s * 100 };\n}\n\n/**\n * Cached by `${paletteVersion}:${name}`.\n *\n * The palette version is in the KEY rather than triggering a clear, so a stale\n * entry is simply unreachable. `lastVersion` still clears the map on a change,\n * or repeated `setPaletteConfig` calls would grow it without bound.\n */\nconst cache = new Map<string, ColorTheme>();\nlet lastVersion = -1;\n\n/**\n * Build (or reuse) an adaptive theme from a hue.\n *\n * Pure and memoized: the same config returns the same object identity until the\n * palette is re-seeded. Registering the tokens is {@link useColorTheme}'s job —\n * this only computes them, so it is safe to call while rendering or from a test.\n */\nexport function getColorTheme(config: ColorThemeConfig): ColorTheme {\n const version = getPaletteVersion();\n\n if (version !== lastVersion) {\n cache.clear();\n lastVersion = version;\n }\n\n const paletteConfig = getPaletteConfig();\n const parsed =\n typeof config.hue === 'string' ? colorThemeSeed(config.hue) : null;\n const seed: ResolvedSeed = {\n hue: parsed ? parsed.hue : (config.hue as number),\n saturation:\n config.saturation ??\n parsed?.saturation ??\n paletteConfig.saturation ??\n DEFAULT_SATURATION,\n pastel: config.pastel ?? paletteConfig.pastel ?? false,\n colors: config.colors,\n };\n\n const name = hashSeed(seed);\n const cached = cache.get(name);\n\n if (cached) return cached;\n\n const { hue, saturation } = seed;\n\n // `pastel` and `contrastLevel` are instance-level in Glaze, not settable\n // through `glaze.configure`, so a runtime theme has to carry them itself or it\n // would ignore a pastel palette. Omitted entirely when off, so the default\n // output is provably the same as passing nothing.\n const overrides: GlazeConfigOverride = {\n ...(paletteConfig.contrastLevel != null\n ? { contrastLevel: paletteConfig.contrastLevel }\n : null),\n ...(seed.pastel ? { pastel: true } : null),\n };\n\n const theme = glaze(\n hue,\n saturation,\n Object.keys(overrides).length ? overrides : undefined,\n );\n\n theme.colors({ ...TINT_RECIPE, ...config.colors });\n\n // `prefix` is a palette-only option, so the keys are renamed here. `oklch`\n // because that is what the palette emits; tasty converts to the configured\n // colour space on the way out either way.\n const raw = theme.tasty({ format: 'oklch' }) as Record<string, unknown>;\n const tokens: Styles = {};\n const colors: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(raw)) {\n // Only the `#colour` entries are renamed; `splitHue` is off, so there are no\n // `$…-hue` companions to worry about, but a future one must not be mangled.\n if (!key.startsWith('#')) {\n (tokens as Record<string, unknown>)[key] = value;\n continue;\n }\n\n const bare = key.slice(1);\n const token = `#${name}-${bare}`;\n\n (tokens as Record<string, unknown>)[token] = value;\n colors[bare] = token;\n }\n\n const result: ColorTheme = { name, tokens, colors };\n\n cache.set(name, result);\n\n return result;\n}\n\n/**\n * Register an adaptive theme's tokens once per document, and get it back.\n *\n * The tokens land on `body` under a slot keyed by the theme's name, which is a\n * hash of the config — so every component asking for the same colour shares one\n * injection no matter how many of them there are. Tasty's global-style slots are\n * also permanent, which is what makes that safe: one component unmounting cannot\n * strip tokens another is still referencing.\n *\n * `body` rather than `:root`, which emits nothing at all — the same selector\n * `GlobalStyles` uses for the palette's own tokens. Custom properties inherit, so\n * anything rendered inside the document sees them; the one thing this cannot\n * reach is content portalled outside `<body>`, which nothing does.\n *\n * Because the slot id hashes the CONFIG rather than the resolved values,\n * re-seeding the palette replaces the same slot instead of leaking a new one.\n *\n * ```tsx\n * const theme = useColorTheme({ hue: '#0ea5e9' });\n * // theme.colors.surface → '#tint-1a2b3c-surface'\n * ```\n */\nexport function useColorTheme(config: ColorThemeConfig): ColorTheme {\n // Subscribes this component to a re-seed. `getColorTheme` reads the version\n // itself for its cache, so the value is unused here — the subscription is the\n // point, and it is what makes the tokens below re-inject.\n usePaletteVersion();\n\n const theme = getColorTheme(config);\n\n useGlobalStyles('body', theme.tokens, {\n id: `cube-color-theme-${theme.name}`,\n });\n\n return theme;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"color-theme.js","names":[],"sources":["../../src/tokens/color-theme.ts"],"sourcesContent":["import { glaze } from '@tenphi/glaze';\nimport { useGlobalStyles } from '@tenphi/tasty';\n\n// Imported for its SIDE EFFECT as much as for `tintRecipe`.\n//\n// `palette.ts` runs `glaze.configure({ states: { dark: '@dark', highContrast:\n// '@hc' }, modes: …, darkTone: … })` at module scope, and that global config is\n// what makes a theme emit `'@dark'` / `'@hc'` keys at all. Without this import\n// a runtime theme falls back to Glaze's defaults — `@media(prefers-color-scheme:\n// dark)` keys and NO high-contrast tier — which still renders, so the failure is\n// silent. `color-theme.test.ts` asserts the `'@hc'` key exists to catch it.\nimport { colorSeed } from './color-seed';\nimport { tintRecipe } from './palette';\nimport {\n DEFAULT_HUE,\n DEFAULT_SATURATION,\n getPaletteConfig,\n getPaletteVersion,\n usePaletteVersion,\n} from './palette-config';\n\nimport type { ColorMap, GlazeConfigOverride } from '@tenphi/glaze';\nimport type { Styles } from '@tenphi/tasty';\n\nexport interface ColorThemeConfig {\n /**\n * A hue in 0–360, or any colour Glaze parses — hex, `rgb()`, `hsl()`,\n * `okhsl()`, `okhst()`, `oklch()`.\n *\n * From a colour only the HUE and SATURATION are taken; the lightness is\n * discarded and re-derived per scheme. That is what makes the result adaptive\n * rather than a value that happens to work in one theme.\n */\n hue: number | string;\n /** 0–100. @default the palette's own saturation seed */\n saturation?: number;\n pastel?: boolean;\n /**\n * Extra colour definitions, merged over {@link tintRecipe}. Anything Glaze's\n * `theme.colors()` accepts, including `contrast` floors against a sibling.\n */\n colors?: ColorMap;\n}\n\nexport interface ColorTheme {\n /**\n * A hash of the config, and the token prefix — `'tint-1a2b3c'`.\n *\n * Content-addressed rather than positional so two components asking for the\n * same colour name the same theme, and therefore share one injection. Also\n * makes it safe to stamp on the DOM as an identifier.\n */\n name: string;\n /**\n * Tasty token declarations, one state map per colour:\n * `{ '#tint-1a2b3c-surface': { '': …, '@dark': …, '@hc': …, '@dark & @hc': … } }`\n */\n tokens: Styles;\n /** Token references by their unprefixed name — `{ surface: '#tint-1a2b3c-surface' }`. */\n colors: Record<string, string>;\n}\n\n/**\n * FNV-1a, base36. Short, stable and dependency-free.\n *\n * These hashes name CSS custom properties and land in DOM attributes, so they\n * have to be deterministic across processes (SSR and the client must agree) and\n * safe as identifiers — but not cryptographic.\n */\nexport function hashString(input: string): string {\n let hash = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n // >>> 0 keeps it an unsigned 32-bit int; `Math.imul` is the 32-bit multiply.\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n\n return hash.toString(36);\n}\n\n/**\n * Hashes the RESOLVED seed, not the config as written.\n *\n * `{ hue: '#0ea5e9' }` and `{ hue: 237.32, saturation: 98.19 }` are the same\n * colour said two ways; hashing the input would give them two names, two\n * injections and two sets of generated rules. Rounded, because a seed that\n * differs in the twelfth decimal is the same colour to every eye and every\n * renderer — and an unrounded float would defeat the deduplication it is here to\n * provide.\n */\nfunction hashSeed(seed: ResolvedSeed): string {\n return `tint-${hashString(\n JSON.stringify([\n seed.hue.toFixed(4),\n seed.saturation.toFixed(4),\n seed.pastel,\n seed.colors ? stableStringify(seed.colors) : null,\n ]),\n )}`;\n}\n\ninterface ResolvedSeed {\n hue: number;\n saturation: number;\n pastel: boolean;\n colors?: ColorMap;\n}\n\n/** Key order must not change the hash, or two identical configs get two slots. */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0),\n );\n\n return `{${entries\n .map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`)\n .join(',')}}`;\n}\n\n/**\n * The hue and saturation of a colour, for use as a theme seed.\n *\n * ```ts\n * colorThemeSeed('#0ea5e9'); // → { hue: 237.32, saturation: 98.19 }\n * ```\n *\n * The tone {@link colorSeed} also reads is dropped here on purpose: a tint theme\n * re-derives its lightness per scheme, which is what makes it adaptive. The palette's\n * `accentColor` keeps the tone, because a brand fill has to *be* the colour.\n *\n * An unparseable value falls back to the shipped seed rather than throwing — a hue\n * typed into a settings field should not take the render down.\n */\nexport function colorThemeSeed(value: string): {\n hue: number;\n saturation: number;\n} {\n const seed = colorSeed(value);\n\n if (!seed) return { hue: DEFAULT_HUE, saturation: DEFAULT_SATURATION };\n\n return { hue: seed.hue, saturation: seed.saturation };\n}\n\n/**\n * Cached by `${paletteVersion}:${name}`.\n *\n * The palette version is in the KEY rather than triggering a clear, so a stale\n * entry is simply unreachable. `lastVersion` still clears the map on a change,\n * or repeated `setPaletteConfig` calls would grow it without bound.\n */\nconst cache = new Map<string, ColorTheme>();\nlet lastVersion = -1;\n\n/**\n * Build (or reuse) an adaptive theme from a hue.\n *\n * Pure and memoized: the same config returns the same object identity until the\n * palette is re-seeded. Registering the tokens is {@link useColorTheme}'s job —\n * this only computes them, so it is safe to call while rendering or from a test.\n */\nexport function getColorTheme(config: ColorThemeConfig): ColorTheme {\n const version = getPaletteVersion();\n\n if (version !== lastVersion) {\n cache.clear();\n lastVersion = version;\n }\n\n const paletteConfig = getPaletteConfig();\n const parsed =\n typeof config.hue === 'string' ? colorThemeSeed(config.hue) : null;\n const seed: ResolvedSeed = {\n hue: parsed ? parsed.hue : (config.hue as number),\n saturation:\n config.saturation ??\n parsed?.saturation ??\n paletteConfig.saturation ??\n DEFAULT_SATURATION,\n pastel: config.pastel ?? paletteConfig.pastel ?? false,\n colors: config.colors,\n };\n\n const name = hashSeed(seed);\n const cached = cache.get(name);\n\n if (cached) return cached;\n\n const { hue, saturation } = seed;\n\n // `pastel` and `contrastLevel` are instance-level in Glaze, not settable\n // through `glaze.configure`, so a runtime theme has to carry them itself or it\n // would ignore a pastel palette. Omitted entirely when off, so the default\n // output is provably the same as passing nothing.\n const overrides: GlazeConfigOverride = {\n ...(paletteConfig.contrastLevel != null\n ? { contrastLevel: paletteConfig.contrastLevel }\n : null),\n ...(seed.pastel ? { pastel: true } : null),\n };\n\n const theme = glaze(\n hue,\n saturation,\n Object.keys(overrides).length ? overrides : undefined,\n );\n\n // The recipe follows the palette's `surfaceMode`, so a runtime tint sits the same\n // distance off the page as a built-in status theme does. Safe to read here rather\n // than hash into the seed: the cache is cleared on every palette version change,\n // and `surfaceMode` is one of the fields that bumps it.\n theme.colors({ ...tintRecipe(paletteConfig), ...config.colors });\n\n // `prefix` is a palette-only option, so the keys are renamed here. `oklch`\n // because that is what the palette emits; tasty converts to the configured\n // colour space on the way out either way.\n const raw = theme.tasty({ format: 'oklch' }) as Record<string, unknown>;\n const tokens: Styles = {};\n const colors: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(raw)) {\n // Only the `#colour` entries are renamed; `splitHue` is off, so there are no\n // `$…-hue` companions to worry about, but a future one must not be mangled.\n if (!key.startsWith('#')) {\n (tokens as Record<string, unknown>)[key] = value;\n continue;\n }\n\n const bare = key.slice(1);\n const token = `#${name}-${bare}`;\n\n (tokens as Record<string, unknown>)[token] = value;\n colors[bare] = token;\n }\n\n const result: ColorTheme = { name, tokens, colors };\n\n cache.set(name, result);\n\n return result;\n}\n\n/**\n * Register an adaptive theme's tokens once per document, and get it back.\n *\n * The tokens land on `body` under a slot keyed by the theme's name, which is a\n * hash of the config — so every component asking for the same colour shares one\n * injection no matter how many of them there are. Tasty's global-style slots are\n * also permanent, which is what makes that safe: one component unmounting cannot\n * strip tokens another is still referencing.\n *\n * `body` rather than `:root`, which emits nothing at all — the same selector\n * `GlobalStyles` uses for the palette's own tokens. Custom properties inherit, so\n * anything rendered inside the document sees them; the one thing this cannot\n * reach is content portalled outside `<body>`, which nothing does.\n *\n * Because the slot id hashes the CONFIG rather than the resolved values,\n * re-seeding the palette replaces the same slot instead of leaking a new one.\n *\n * ```tsx\n * const theme = useColorTheme({ hue: '#0ea5e9' });\n * // theme.colors.surface → '#tint-1a2b3c-surface'\n * ```\n */\nexport function useColorTheme(config: ColorThemeConfig): ColorTheme {\n // Subscribes this component to a re-seed. `getColorTheme` reads the version\n // itself for its cache, so the value is unused here — the subscription is the\n // point, and it is what makes the tokens below re-inject.\n usePaletteVersion();\n\n const theme = getColorTheme(config);\n\n useGlobalStyles('body', theme.tokens, {\n id: `cube-color-theme-${theme.name}`,\n });\n\n return theme;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-694a764 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
2
2
  import { getPaletteVersion } from "./palette-config.js";
3
3
  import { BASE_TOKENS } from "./base.js";
4
4
  import { lazyStyles } from "./lazy-styles.js";
@@ -1,8 +1,9 @@
1
1
 
2
- import { DEFAULT_PALETTE_CONFIG, PaletteCodeSeed, PaletteConfig, PaletteThemeName, PaletteThemeSeed, ResolvedPaletteConfig, getPaletteConfig, getPaletteConfigInput, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion } from "./palette-config.js";
2
+ import { DEFAULT_PALETTE_CONFIG, MAX_BASE_SATURATION, PaletteCodeSeed, PaletteConfig, PaletteThemeName, PaletteThemeSeed, ResolvedPaletteConfig, SurfaceMode, getPaletteConfig, getPaletteConfigInput, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion } from "./palette-config.js";
3
3
  import { SIZES, SIZE_NAME_TO_KEY, SIZE_TOKENS, SizeKey, SizeName } from "./sizes.js";
4
4
  import { PALETTE_TOKENS, RenderPaletteOptions, getCodeTheme, getPalette, getPaletteTokens, renderPaletteTokens } from "./palette.js";
5
5
  import { COLOR_TOKENS, getColorTokens, renderColorTokens } from "./colors.js";
6
+ import { ColorSeed, colorSeed } from "./color-seed.js";
6
7
  import { ColorTheme, ColorThemeConfig, colorThemeSeed, getColorTheme, useColorTheme } from "./color-theme.js";
7
8
  import { SPACE_TOKENS } from "./spacing.js";
8
9
  import { SHADOW_TOKENS } from "./shadows.js";
@@ -1,5 +1,6 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-694a764 | Cube Dev Team */
2
- import { DEFAULT_PALETTE_CONFIG, getPaletteConfig, getPaletteConfigInput, getPaletteVersion, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion } from "./palette-config.js";
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
2
+ import { colorSeed } from "./color-seed.js";
3
+ import { DEFAULT_PALETTE_CONFIG, MAX_BASE_SATURATION, getPaletteConfig, getPaletteConfigInput, getPaletteVersion, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion } from "./palette-config.js";
3
4
  import { BASE_TOKENS } from "./base.js";
4
5
  import { lazyStyles } from "./lazy-styles.js";
5
6
  import { PALETTE_TOKENS, getCodeTheme, getPalette, getPaletteTokens, renderPaletteTokens } from "./palette.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/tokens/index.ts"],"sourcesContent":["/**\n * Design tokens for the Cube UI Kit.\n *\n * This module exports all design tokens used throughout the design system.\n * All token keys use $ prefix for CSS custom properties.\n *\n * Categories:\n * - Colors: Base color palette with -color and -color-rgb variants\n * - Typography: Font presets for headings, text, paragraphs, etc.\n * - Sizes: Component size values (XS, SM, MD, LG, XL)\n * - Spacing: Space tokens using gap multipliers\n * - Shadows: Shadow definitions for elevation\n * - Layout: Common layout dimensions\n * - Base: Core design system values\n */\n\nimport { generateTypographyTokens } from '@tenphi/tasty';\n\nimport { BASE_TOKENS } from './base';\nimport { getColorTokens } from './colors';\nimport { LAYOUT_TOKENS } from './layout';\nimport { lazyStyles } from './lazy-styles';\nimport { getPaletteVersion } from './palette-config';\nimport { SHADOW_TOKENS } from './shadows';\nimport { SIZE_TOKENS } from './sizes';\nimport { SPACE_TOKENS } from './spacing';\nimport { TYPOGRAPHY_PRESETS } from './typography';\n\nimport type { Styles } from '@tenphi/tasty';\nimport type { SizeKey, SizeName } from './sizes';\n\n/**\n * All design tokens combined into a single Styles object.\n * Keys use $ prefix for CSS custom properties.\n *\n * Color tokens resolve against the current palette config (see\n * {@link getColorTokens}), and this map is memoized against that config's\n * version so `setPaletteConfig()` invalidates it. Prefer this over the lazy\n * {@link TOKENS} proxy when applying styles from React (`GlobalStyles`).\n *\n * Includes:\n * - Base tokens ($gap, $radius, etc.)\n * - Space tokens ($space-xs, $space-sm, etc.)\n * - Size tokens ($size-xs, $size-sm, etc.)\n * - Shadow tokens ($shadow, $item-shadow, etc.)\n * - Layout tokens ($max-content-width, $topbar-height, etc.)\n * - Typography tokens ($h1-font-size, $t3-line-height, etc.)\n * - Color tokens ($purple-color, $purple-color-rgb, etc.)\n */\nlet tokensCache: Styles | null = null;\nlet cachedVersion = -1;\n\nexport function getTokens(): Styles {\n const version = getPaletteVersion();\n\n if (!tokensCache || cachedVersion !== version) {\n tokensCache = {\n ...BASE_TOKENS,\n ...SPACE_TOKENS,\n ...SIZE_TOKENS,\n ...SHADOW_TOKENS,\n ...LAYOUT_TOKENS,\n ...generateTypographyTokens(TYPOGRAPHY_PRESETS),\n ...getColorTokens(),\n };\n cachedVersion = version;\n }\n return tokensCache;\n}\n\n/** Lazy proxy of {@link getTokens}. Prefer `getTokens()` in new code. */\nexport const TOKENS: Styles = lazyStyles(getTokens);\n\n// Re-export category modules for direct access\nexport { COLOR_TOKENS, getColorTokens, renderColorTokens } from './colors';\n// Adaptive one-off themes built at runtime from an arbitrary hue, named by a\n// hash of their config so identical requests share one injection.\nexport { colorThemeSeed, getColorTheme, useColorTheme } from './color-theme';\nexport type { ColorTheme, ColorThemeConfig } from './color-theme';\nexport {\n getCodeTheme,\n getPalette,\n getPaletteTokens,\n PALETTE_TOKENS,\n renderPaletteTokens,\n} from './palette';\nexport type { RenderPaletteOptions } from './palette';\nexport {\n DEFAULT_PALETTE_CONFIG,\n getPaletteConfig,\n getPaletteConfigInput,\n invalidatePaletteTokens,\n resetPaletteConfig,\n resolvePaletteConfig,\n setPaletteConfig,\n subscribePaletteConfig,\n usePaletteConfig,\n usePaletteVersion,\n} from './palette-config';\nexport type {\n PaletteCodeSeed,\n PaletteConfig,\n PaletteThemeName,\n PaletteThemeSeed,\n ResolvedPaletteConfig,\n} from './palette-config';\nexport { SIZES, SIZE_NAME_TO_KEY, SIZE_TOKENS } from './sizes';\nexport type { SizeKey, SizeName } from './sizes';\nexport { SPACE_TOKENS } from './spacing';\nexport { SHADOW_TOKENS } from './shadows';\nexport { LAYOUT_TOKENS } from './layout';\nexport { BASE_TOKENS } from './base';\nexport { TYPOGRAPHY_PRESETS } from './typography';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAI,cAA6B;AACjC,IAAI,gBAAgB;AAEpB,SAAgB,YAAoB;CAClC,MAAM,UAAU,mBAAmB;AAEnC,KAAI,CAAC,eAAe,kBAAkB,SAAS;AAC7C,gBAAc;GACZ,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,yBAAyB,mBAAmB;GAC/C,GAAG,gBAAgB;GACpB;AACD,kBAAgB;;AAElB,QAAO;;;AAIT,MAAa,SAAiB,WAAW,UAAU"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/tokens/index.ts"],"sourcesContent":["/**\n * Design tokens for the Cube UI Kit.\n *\n * This module exports all design tokens used throughout the design system.\n * All token keys use $ prefix for CSS custom properties.\n *\n * Categories:\n * - Colors: Base color palette with -color and -color-rgb variants\n * - Typography: Font presets for headings, text, paragraphs, etc.\n * - Sizes: Component size values (XS, SM, MD, LG, XL)\n * - Spacing: Space tokens using gap multipliers\n * - Shadows: Shadow definitions for elevation\n * - Layout: Common layout dimensions\n * - Base: Core design system values\n */\n\nimport { generateTypographyTokens } from '@tenphi/tasty';\n\nimport { BASE_TOKENS } from './base';\nimport { getColorTokens } from './colors';\nimport { LAYOUT_TOKENS } from './layout';\nimport { lazyStyles } from './lazy-styles';\nimport { getPaletteVersion } from './palette-config';\nimport { SHADOW_TOKENS } from './shadows';\nimport { SIZE_TOKENS } from './sizes';\nimport { SPACE_TOKENS } from './spacing';\nimport { TYPOGRAPHY_PRESETS } from './typography';\n\nimport type { Styles } from '@tenphi/tasty';\nimport type { SizeKey, SizeName } from './sizes';\n\n/**\n * All design tokens combined into a single Styles object.\n * Keys use $ prefix for CSS custom properties.\n *\n * Color tokens resolve against the current palette config (see\n * {@link getColorTokens}), and this map is memoized against that config's\n * version so `setPaletteConfig()` invalidates it. Prefer this over the lazy\n * {@link TOKENS} proxy when applying styles from React (`GlobalStyles`).\n *\n * Includes:\n * - Base tokens ($gap, $radius, etc.)\n * - Space tokens ($space-xs, $space-sm, etc.)\n * - Size tokens ($size-xs, $size-sm, etc.)\n * - Shadow tokens ($shadow, $item-shadow, etc.)\n * - Layout tokens ($max-content-width, $topbar-height, etc.)\n * - Typography tokens ($h1-font-size, $t3-line-height, etc.)\n * - Color tokens ($purple-color, $purple-color-rgb, etc.)\n */\nlet tokensCache: Styles | null = null;\nlet cachedVersion = -1;\n\nexport function getTokens(): Styles {\n const version = getPaletteVersion();\n\n if (!tokensCache || cachedVersion !== version) {\n tokensCache = {\n ...BASE_TOKENS,\n ...SPACE_TOKENS,\n ...SIZE_TOKENS,\n ...SHADOW_TOKENS,\n ...LAYOUT_TOKENS,\n ...generateTypographyTokens(TYPOGRAPHY_PRESETS),\n ...getColorTokens(),\n };\n cachedVersion = version;\n }\n return tokensCache;\n}\n\n/** Lazy proxy of {@link getTokens}. Prefer `getTokens()` in new code. */\nexport const TOKENS: Styles = lazyStyles(getTokens);\n\n// Re-export category modules for direct access\nexport { COLOR_TOKENS, getColorTokens, renderColorTokens } from './colors';\n// Reads hue / saturation / tone off a colour — what the palette's `accentColor` and\n// `baseColor` seeds are resolved through.\nexport { colorSeed } from './color-seed';\nexport type { ColorSeed } from './color-seed';\n// Adaptive one-off themes built at runtime from an arbitrary hue, named by a\n// hash of their config so identical requests share one injection.\nexport { colorThemeSeed, getColorTheme, useColorTheme } from './color-theme';\nexport type { ColorTheme, ColorThemeConfig } from './color-theme';\nexport {\n getCodeTheme,\n getPalette,\n getPaletteTokens,\n PALETTE_TOKENS,\n renderPaletteTokens,\n} from './palette';\nexport type { RenderPaletteOptions } from './palette';\nexport {\n DEFAULT_PALETTE_CONFIG,\n getPaletteConfig,\n getPaletteConfigInput,\n invalidatePaletteTokens,\n MAX_BASE_SATURATION,\n resetPaletteConfig,\n resolvePaletteConfig,\n setPaletteConfig,\n subscribePaletteConfig,\n usePaletteConfig,\n usePaletteVersion,\n} from './palette-config';\nexport type {\n PaletteCodeSeed,\n PaletteConfig,\n PaletteThemeName,\n PaletteThemeSeed,\n ResolvedPaletteConfig,\n SurfaceMode,\n} from './palette-config';\nexport { SIZES, SIZE_NAME_TO_KEY, SIZE_TOKENS } from './sizes';\nexport type { SizeKey, SizeName } from './sizes';\nexport { SPACE_TOKENS } from './spacing';\nexport { SHADOW_TOKENS } from './shadows';\nexport { LAYOUT_TOKENS } from './layout';\nexport { BASE_TOKENS } from './base';\nexport { TYPOGRAPHY_PRESETS } from './typography';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAI,cAA6B;AACjC,IAAI,gBAAgB;AAEpB,SAAgB,YAAoB;CAClC,MAAM,UAAU,mBAAmB;AAEnC,KAAI,CAAC,eAAe,kBAAkB,SAAS;AAC7C,gBAAc;GACZ,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,yBAAyB,mBAAmB;GAC/C,GAAG,gBAAgB;GACpB;AACD,kBAAgB;;AAElB,QAAO;;;AAIT,MAAa,SAAiB,WAAW,UAAU"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-694a764 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
2
2
  //#region src/tokens/layout.ts
3
3
  /**
4
4
  * Layout-related tokens for common UI dimensions.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-694a764 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
2
2
  //#region src/tokens/lazy-styles.ts
3
3
  /**
4
4
  * Proxy that defers to `factory()` on every property / enumeration access.
@@ -1,5 +1,20 @@
1
1
 
2
2
  //#region src/tokens/palette-config.d.ts
3
+ /**
4
+ * Ceiling on a {@link PaletteConfig.baseSaturation} derived from a
5
+ * {@link PaletteConfig.baseColor}.
6
+ *
7
+ * A named base color lands the chrome near itself rather than at the 12% share the
8
+ * accent lends it, which is the whole reason to name one — but a fully saturated
9
+ * chrome stops being chrome. `50` is well past where the base colors begin to
10
+ * converge (`surface-inverse` tops out around `25`), so the clip costs nothing that
11
+ * was still moving and stops a vivid brand hex from being read as an instruction to
12
+ * paint the page with it.
13
+ *
14
+ * The manual slider in the tuner shares the number, so the two agree on what the top
15
+ * of the range means.
16
+ */
17
+ declare const MAX_BASE_SATURATION = 50;
3
18
  /** Hue / saturation seed override for one colored theme. */
4
19
  interface PaletteThemeSeed {
5
20
  /** Hue in degrees (0–360). */
@@ -22,6 +37,11 @@ interface PaletteCodeSeed {
22
37
  /** Saturation (0–100). Defaults to {@link DEFAULT_CODE_SATURATION}, not to `saturation`. */
23
38
  saturation?: number;
24
39
  }
40
+ /**
41
+ * Where the neutral surface ramp sits on the tone scale — see
42
+ * {@link PaletteConfig.surfaceMode}.
43
+ */
44
+ type SurfaceMode = 'neutral' | 'tinted';
25
45
  /** Names of the themes whose seeds can be overridden individually. */
26
46
  type PaletteThemeName = 'success' | 'danger' | 'warning' | 'note' | 'code';
27
47
  /**
@@ -29,6 +49,48 @@ type PaletteThemeName = 'success' | 'danger' | 'warning' | 'note' | 'code';
29
49
  * and per-theme fields left unset inherit the palette-level value.
30
50
  */
31
51
  interface PaletteConfig {
52
+ /**
53
+ * Accent zone seeded by a **color** rather than a hue — the brand, as you have it.
54
+ *
55
+ * Anything Glaze parses: hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`, `oklch()`.
56
+ * CSS color keywords (`rebeccapurple`) are not supported. An unparseable value
57
+ * warns and falls back to the numeric seed.
58
+ *
59
+ * Unlike {@link ColorThemeConfig.hue}, which keeps only hue and saturation, this
60
+ * keeps the **tone** as well — which is the whole point. Without it the brand fill
61
+ * is authored as a fixed tone step off white, so every accent hue lands at roughly
62
+ * the same lightness and the color you asked for never actually appears.
63
+ *
64
+ * The **light, normal-contrast** variant reproduces the color; dark and high
65
+ * contrast adapt, as every other color in the palette does. Two things cost
66
+ * exactness even there: {@link PaletteConfig.pastel} caps chroma (so `#FFD400`
67
+ * softens), and a color that misses the 3:1 floor against `surface` darkens until
68
+ * it clears it — and no further.
69
+ *
70
+ * {@link PaletteConfig.hue} and {@link PaletteConfig.saturation} still win when
71
+ * set — the number is the more specific instruction — and the tone keeps coming
72
+ * from here either way, so a preview can rotate the hue without losing the brand's
73
+ * lightness.
74
+ */
75
+ accentColor?: string;
76
+ /**
77
+ * Base zone seeded by a **color** rather than a hue and a saturation.
78
+ *
79
+ * Its **hue and saturation** are read; its **tone is discarded**, because the
80
+ * chrome's lightness ladder is the design — a base color says which way the greys
81
+ * lean and how far, not how dark they are.
82
+ *
83
+ * The saturation is clipped to {@link MAX_BASE_SATURATION}. Naming a base color
84
+ * says "the chrome is this color", so it lands near it rather than at the 12%
85
+ * share {@link PaletteConfig.baseSaturation} inherits from the accent — but a
86
+ * fully saturated chrome is no longer chrome, so there is a ceiling on how far
87
+ * "near" goes.
88
+ *
89
+ * {@link PaletteConfig.baseHue} and {@link PaletteConfig.baseSaturation} each win
90
+ * over it when set — the number is the more specific instruction, the same
91
+ * precedence {@link PaletteConfig.accentColor} sits under.
92
+ */
93
+ baseColor?: string;
32
94
  /**
33
95
  * Accent hue in degrees (0–360) — the brand.
34
96
  *
@@ -48,10 +110,64 @@ interface PaletteConfig {
48
110
  * danger banner should read as red.
49
111
  */
50
112
  baseHue?: number;
113
+ /**
114
+ * Saturation seed (0–100) of the **base** zone — the same family
115
+ * {@link PaletteConfig.baseHue} governs: `surface` and its ladder, the
116
+ * `surface-text*` ramp, `border`, `placeholder`.
117
+ *
118
+ * On the same 0–100 scale as {@link PaletteConfig.saturation}, and read the same
119
+ * way: `100` is a fully saturated base hue. **The shipped chrome is `12`** — a
120
+ * faint tint is what a neutral surface is — so the useful range is mostly below
121
+ * a third, and the numbers above it are a deliberately tinted theme rather than
122
+ * a neutral one.
123
+ *
124
+ * Left unset it is `saturation × 0.12`, which reproduces the recipe's own factor
125
+ * exactly and keeps a muted palette muting the chrome along with everything
126
+ * else. Set it and the base zone stops following the brand: a vivid accent over
127
+ * near-grey chrome, or a muted accent over visibly warm chrome, are both one
128
+ * number away and neither is reachable from a single scale.
129
+ *
130
+ * The base colors keep their proportions to one another — `border` more than
131
+ * `surface`, the text ramp more than `border` — until the highest of them hits
132
+ * the top of the scale, which happens around `25`. Past that they converge.
133
+ *
134
+ * Under {@link PaletteConfig.surfaceMode} `'neutral'` this reaches
135
+ * `surface-2`…`surface-4`, `border`, `placeholder` and the text ramp, but not
136
+ * the page surface: at the end of the tone scale there is no room for chroma,
137
+ * whatever the seed says. `'tinted'` is what gives it somewhere to land.
138
+ */
139
+ baseSaturation?: number;
140
+ /**
141
+ * Global. Where the neutral surface ramp sits on the tone scale.
142
+ *
143
+ * - `'neutral'` — `surface` is the extreme: pure white in light, the darkest
144
+ * step the dark tone window allows in dark. No room for chroma, so the page
145
+ * carries no hue however saturated the base zone is.
146
+ * - `'tinted'` — the whole ramp moves two tones inward, off the extreme.
147
+ *
148
+ * Two tones is not a visible lightness change; what it buys is *room*. Chroma
149
+ * needs distance from white to exist at all, so at the extreme a light page is
150
+ * white no matter what {@link PaletteConfig.baseSaturation} says. Tinted trades
151
+ * two tones of headroom for a page that actually carries its base hue.
152
+ *
153
+ * Everything below `surface` is positioned relative to it, so the ladder, the
154
+ * borders and the text ramp all follow — and the contrast floors on the text
155
+ * re-solve against the new background rather than drifting.
156
+ */
157
+ surfaceMode?: SurfaceMode;
51
158
  /**
52
159
  * Seed saturation (0–100), and the fallback for every theme that does not set
53
160
  * its own.
54
161
  *
162
+ * **Belongs to the non-pastel path**, and setting it says so: with no
163
+ * {@link PaletteConfig.pastel} beside it, this turns pastel off, because tuning a
164
+ * saturation is the non-pastel path by definition. Pastel is one flat chroma ceiling,
165
+ * so under it there is exactly one seed and it is the top of the scale.
166
+ *
167
+ * A `pastel: true` written next to a saturation wins and the saturation is ignored
168
+ * (with a dev warning) — but it is kept rather than dropped, so turning pastel back
169
+ * off restores your number.
170
+ *
55
171
  * One scale for the whole theme, by design. Every color's own `saturation` is a
56
172
  * 0–1 factor of this seed — `surface` at 0.12, `border` at 0.175, the text ramp
57
173
  * at 0.2, the accent family at ~1.0 — so moving it rescales the palette while
@@ -66,6 +182,19 @@ interface PaletteConfig {
66
182
  * producing a softer, more even palette across hues. Glaze treats `pastel` as
67
183
  * instance-level, so it is threaded into every theme.
68
184
  *
185
+ * It also **pins {@link PaletteConfig.saturation} to 100**: the even, hue-independent
186
+ * ceiling is what pastel is for, and a second saturation scale on top of it would
187
+ * only undo that. Two paths, then — pastel with no saturation knob, or
188
+ * `pastel: false` with a free 0–100 one.
189
+ *
190
+ * Which is why a lone `saturation` picks the second path for you. State this field
191
+ * only to override that: it is the coarser of the two choices, so it wins wherever
192
+ * both are set, and a saturation it shadows is ignored with a dev warning.
193
+ *
194
+ * The same ceiling is why an {@link PaletteConfig.accentColor} cannot render
195
+ * exactly under pastel — `#FFD400` softens to `#e4d8ad`. Under pastel a color
196
+ * contributes its hue and its tone; turn pastel off to get its chroma too.
197
+ *
69
198
  * Every theme except `code`. The syntax family is calibrated on its own
70
199
  * saturation and is deliberately left out — softening it collapses the chroma
71
200
  * spread the syntax hues rely on to stay apart. To soften a code block, lower
@@ -73,14 +202,20 @@ interface PaletteConfig {
73
202
  */
74
203
  pastel?: boolean;
75
204
  /**
76
- * Global. `'auto'` (the default) keeps the two-tier model: normal colors plus
77
- * a separate high-contrast tier driven by `<html data-contrast="high">` /
78
- * `prefers-contrast: more`.
79
- *
80
- * A number (0–100) replaces that switch with a slider — and, because a manual
81
- * level already carries the contrast preference, **drops the high-contrast
82
- * tier entirely**. `0` reproduces the normal output and `100` the
83
- * high-contrast output, bit for bit.
205
+ * Global. `'auto'` (the default) leaves contrast entirely to the two-tier model:
206
+ * normal colors plus a high-contrast tier driven by `<html data-contrast="high">`
207
+ * / `prefers-contrast: more`.
208
+ *
209
+ * A number (0–100) additionally positions the **normal** colors on a slider, so
210
+ * a product can offer its own contrast control. `0` is the shipped palette and
211
+ * `100` is the high-contrast one, bit for bit.
212
+ *
213
+ * The two **compose** rather than replace each other: the high-contrast tier
214
+ * stays the true high-contrast resolution at every level — identical to what
215
+ * `'auto'` emits — so a slider raises the baseline while
216
+ * `prefers-contrast: more` still escalates on top of it. The one exception is
217
+ * `100`, where the normal colors already *are* the high-contrast ones and a
218
+ * second tier would only duplicate them.
84
219
  */
85
220
  contrastLevel?: number | 'auto';
86
221
  /** Per-theme seed overrides. */
@@ -97,6 +232,37 @@ interface ResolvedPaletteConfig {
97
232
  hue: number;
98
233
  baseHue: number;
99
234
  saturation: number;
235
+ baseSaturation: number;
236
+ surfaceMode: SurfaceMode;
237
+ /**
238
+ * The accent color as given, handed to Glaze's `from` so the brand family renders
239
+ * as that literal value rather than as a shade re-derived from the seed.
240
+ *
241
+ * `null` — the common case — means no accent color was supplied and the family keeps
242
+ * its white-anchored derivation, which is the only arrangement that reproduces the
243
+ * shipped palette bit for bit.
244
+ */
245
+ accentColor: string | null;
246
+ /**
247
+ * The base color as given, or `null`.
248
+ *
249
+ * Nothing renders from it — the hue and the saturation it derives are what reach the
250
+ * palette. It is resolved anyway so {@link isSameConfig} can compare it, which is the
251
+ * only way a write that changes the *string* without changing either derived number
252
+ * still counts as a change. `MAX_BASE_SATURATION` makes that a live case rather than
253
+ * a theoretical one: every color above the clip on a given hue derives the same pair,
254
+ * so without this a color picker's whole upper range — and its entire tone axis, which
255
+ * a base color discards — would drop writes silently and leave the field stale.
256
+ */
257
+ baseColor: string | null;
258
+ /**
259
+ * The tone of {@link ResolvedPaletteConfig.accentColor}, or `null` alongside it.
260
+ *
261
+ * `from` carries the tone itself, so this exists for the one thing that needs the
262
+ * *number*: the hover brand text sits a fixed tone step past the rest one, and a
263
+ * step has to be computed.
264
+ */
265
+ accentTone: number | null;
100
266
  pastel: boolean;
101
267
  contrastLevel: number | 'auto';
102
268
  themes: {
@@ -225,5 +391,5 @@ declare function usePaletteVersion(): number;
225
391
  */
226
392
  declare function usePaletteConfig(): readonly [ResolvedPaletteConfig, typeof setPaletteConfig];
227
393
  //#endregion
228
- export { DEFAULT_PALETTE_CONFIG, PaletteCodeSeed, PaletteConfig, PaletteThemeName, PaletteThemeSeed, ResolvedPaletteConfig, getPaletteConfig, getPaletteConfigInput, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion };
394
+ export { DEFAULT_PALETTE_CONFIG, MAX_BASE_SATURATION, PaletteCodeSeed, PaletteConfig, PaletteThemeName, PaletteThemeSeed, ResolvedPaletteConfig, SurfaceMode, getPaletteConfig, getPaletteConfigInput, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion };
229
395
  //# sourceMappingURL=palette-config.d.ts.map