@cube-dev/ui-kit 0.0.0-canary-850df32 → 0.0.0-canary-cfad381

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 (542) 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.js +1 -1
  16. package/dist/components/actions/Action/Action.js +1 -1
  17. package/dist/components/actions/Banner/Banner.js +1 -1
  18. package/dist/components/actions/Button/Button.js +1 -1
  19. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  20. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  21. package/dist/components/actions/ButtonSplit/context.js +1 -1
  22. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  23. package/dist/components/actions/CommandMenu/styled.js +1 -1
  24. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  25. package/dist/components/actions/ItemActionContext.js +1 -1
  26. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  27. package/dist/components/actions/Link/Link.js +1 -1
  28. package/dist/components/actions/Menu/Menu.js +1 -1
  29. package/dist/components/actions/Menu/MenuItem.js +1 -1
  30. package/dist/components/actions/Menu/MenuSection.js +1 -1
  31. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  32. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  34. package/dist/components/actions/Menu/context.js +1 -1
  35. package/dist/components/actions/Menu/styled.js +1 -1
  36. package/dist/components/actions/index.js +1 -1
  37. package/dist/components/actions/use-action.js +1 -1
  38. package/dist/components/actions/use-anchored-menu.js +1 -1
  39. package/dist/components/actions/use-context-menu.js +1 -1
  40. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  41. package/dist/components/content/Alert/Alert.js +1 -1
  42. package/dist/components/content/Alert/use-alert.js +1 -1
  43. package/dist/components/content/Avatar/Avatar.js +1 -1
  44. package/dist/components/content/Badge/Badge.js +1 -1
  45. package/dist/components/content/Card/Card.js +1 -1
  46. package/dist/components/content/Content.js +1 -1
  47. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  48. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  49. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  50. package/dist/components/content/Divider.js +1 -1
  51. package/dist/components/content/Footer.js +1 -1
  52. package/dist/components/content/Header.js +1 -1
  53. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  54. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  55. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  56. package/dist/components/content/Item/Item.js +1 -1
  57. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  58. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  59. package/dist/components/content/Layout/GridLayout.js +1 -1
  60. package/dist/components/content/Layout/Layout.js +1 -1
  61. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  62. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  63. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  64. package/dist/components/content/Layout/LayoutContent.js +1 -1
  65. package/dist/components/content/Layout/LayoutContext.js +1 -1
  66. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  67. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  68. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  69. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  70. package/dist/components/content/Layout/LayoutPane.js +1 -1
  71. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  74. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  75. package/dist/components/content/Layout/index.js +1 -1
  76. package/dist/components/content/Layout/utils.js +1 -1
  77. package/dist/components/content/Paragraph.js +1 -1
  78. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  79. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  80. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  81. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  82. package/dist/components/content/Result/Result.js +1 -1
  83. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  84. package/dist/components/content/Tag/Tag.js +1 -1
  85. package/dist/components/content/Text.js +1 -1
  86. package/dist/components/content/TextItem/TextItem.js +1 -1
  87. package/dist/components/content/Title.js +1 -1
  88. package/dist/components/content/Tree/Tree.js +1 -1
  89. package/dist/components/content/Tree/TreeNode.js +1 -1
  90. package/dist/components/content/Tree/styled.js +1 -1
  91. package/dist/components/content/Tree/tree-index.js +1 -1
  92. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  93. package/dist/components/content/Tree/use-load-data.js +1 -1
  94. package/dist/components/content/highlightText.js +1 -1
  95. package/dist/components/content/use-auto-tooltip.js +1 -1
  96. package/dist/components/data/DataTable/DataTable.js +1 -1
  97. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  98. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  99. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  100. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  101. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  102. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  103. package/dist/components/data/TableBase/RowCollection.js +1 -1
  104. package/dist/components/data/TableBase/TableRow.js +1 -1
  105. package/dist/components/data/TableBase/TableView.js +1 -1
  106. package/dist/components/data/TableBase/row-menu.js +1 -1
  107. package/dist/components/data/TableBase/styled.js +1 -1
  108. package/dist/components/data/TableBase/types.js +1 -1
  109. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  110. package/dist/components/data/TableBase/use-container-width.js +1 -1
  111. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  112. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  113. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  114. package/dist/components/data/TableBase/use-table-search.js +1 -1
  115. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  116. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  117. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  118. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  119. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  120. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  121. package/dist/components/fields/Checkbox/context.js +1 -1
  122. package/dist/components/fields/ColorInput/ColorInput.d.ts +67 -0
  123. package/dist/components/fields/ColorInput/ColorInput.js +230 -0
  124. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -0
  125. package/dist/components/fields/ColorInput/index.d.ts +2 -0
  126. package/dist/components/fields/ColorPicker/ColorPicker.d.ts +34 -37
  127. package/dist/components/fields/ColorPicker/ColorPicker.js +131 -182
  128. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
  129. package/dist/components/fields/ColorPicker/index.d.ts +1 -3
  130. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.d.ts +50 -0
  131. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +269 -0
  132. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -0
  133. package/dist/components/fields/ColorSwatchGroup/index.d.ts +2 -0
  134. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  135. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  136. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  137. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  138. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  139. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  140. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  141. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  142. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  143. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  144. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  145. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  146. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  147. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  148. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  149. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  150. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  151. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  152. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  153. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  154. package/dist/components/fields/DatePicker/period.js +1 -1
  155. package/dist/components/fields/DatePicker/props.js +1 -1
  156. package/dist/components/fields/DatePicker/utils.js +1 -1
  157. package/dist/components/fields/FileInput/FileInput.js +1 -1
  158. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  159. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  160. package/dist/components/fields/Input/Input.js +1 -1
  161. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  162. package/dist/components/fields/ListBox/ListBox.js +1 -1
  163. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  164. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  165. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  166. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  167. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  168. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  169. package/dist/components/fields/Picker/Picker.js +1 -1
  170. package/dist/components/fields/RadioGroup/Radio.d.ts +2 -2
  171. package/dist/components/fields/RadioGroup/Radio.js +4 -4
  172. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  173. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  174. package/dist/components/fields/RadioGroup/context.js +1 -1
  175. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  176. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  177. package/dist/components/fields/Select/Select.js +1 -1
  178. package/dist/components/fields/Slider/Gradation.js +1 -1
  179. package/dist/components/fields/Slider/HueSlider.js +1 -1
  180. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  181. package/dist/components/fields/Slider/Slider.js +1 -1
  182. package/dist/components/fields/Slider/SliderBase.js +1 -1
  183. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  184. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  185. package/dist/components/fields/Slider/elements.js +1 -1
  186. package/dist/components/fields/Slider/index.js +1 -1
  187. package/dist/components/fields/Switch/Switch.js +1 -1
  188. package/dist/components/fields/TextArea/TextArea.js +1 -1
  189. package/dist/components/fields/TextInput/TextInput.js +1 -1
  190. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  191. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  192. package/dist/components/fields/{ColorPicker/ColorPickerPanel.js → color/ColorPanel.js} +14 -11
  193. package/dist/components/fields/color/ColorPanel.js.map +1 -0
  194. package/dist/components/fields/color/ColorSwatch.d.ts +22 -0
  195. package/dist/components/fields/color/ColorSwatch.js +58 -0
  196. package/dist/components/fields/color/ColorSwatch.js.map +1 -0
  197. package/dist/components/fields/{ColorPicker → color}/channels.d.ts +1 -1
  198. package/dist/components/fields/{ColorPicker → color}/channels.js +2 -2
  199. package/dist/components/fields/color/channels.js.map +1 -0
  200. package/dist/components/fields/color/color.d.ts +21 -0
  201. package/dist/components/fields/{ColorPicker → color}/color.js +2 -2
  202. package/dist/components/fields/color/color.js.map +1 -0
  203. package/dist/components/fields/color/context.js +20 -0
  204. package/dist/components/fields/color/context.js.map +1 -0
  205. package/dist/components/fields/color/index.d.ts +4 -0
  206. package/dist/components/fields/index.d.ts +9 -3
  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/PeriodCalendar.js +1 -1
  273. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  274. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  275. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  276. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  277. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  278. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  279. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  280. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  281. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  282. package/dist/components/overlays/Dialog/context.js +1 -1
  283. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  284. package/dist/components/overlays/Modal/Modal.js +1 -1
  285. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  286. package/dist/components/overlays/Modal/Overlay.js +1 -1
  287. package/dist/components/overlays/Modal/Popover.js +1 -1
  288. package/dist/components/overlays/Modal/Tray.js +1 -1
  289. package/dist/components/overlays/Modal/Underlay.js +1 -1
  290. package/dist/components/overlays/Notifications/Notification.js +1 -1
  291. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  292. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  293. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  294. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  295. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  296. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  297. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  298. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  299. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  300. package/dist/components/overlays/Notifications/index.js +1 -1
  301. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  302. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  303. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  304. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  305. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  306. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  307. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  308. package/dist/components/overlays/Toast/index.js +1 -1
  309. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  310. package/dist/components/overlays/Toast/useToast.js +1 -1
  311. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  312. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  313. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  314. package/dist/components/overlays/Tooltip/context.js +1 -1
  315. package/dist/components/portal/Portal.js +1 -1
  316. package/dist/components/portal/PortalProvider.js +1 -1
  317. package/dist/components/portal/usePortal.js +1 -1
  318. package/dist/components/shared/DraggableCollection.js +1 -1
  319. package/dist/components/shared/InvalidIcon.js +1 -1
  320. package/dist/components/shared/ValidIcon.js +1 -1
  321. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  322. package/dist/components/status/Spin/Cube.js +1 -1
  323. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  324. package/dist/components/status/Spin/Spin.js +1 -1
  325. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  326. package/dist/data/item-themes.js +1 -1
  327. package/dist/data/themes.js +1 -1
  328. package/dist/eslint-plugin/defaults.generated.js +1 -1
  329. package/dist/eslint-plugin/index.js +1 -1
  330. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  331. package/dist/i18n/I18nProvider.js +1 -1
  332. package/dist/i18n/createFormatter.js +1 -1
  333. package/dist/i18n/index.js +1 -1
  334. package/dist/i18n/instance.js +1 -1
  335. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  336. package/dist/i18n/locales/en-US/uikit.js +1 -1
  337. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  338. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  339. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  340. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  341. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  342. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  343. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  344. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  345. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  346. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  347. package/dist/i18n/locales.js +1 -1
  348. package/dist/i18n/useFormatter.js +1 -1
  349. package/dist/i18n/useI18n.js +1 -1
  350. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  351. package/dist/icons/AdjustmentsIcon.js +1 -1
  352. package/dist/icons/AiIcon.js +1 -1
  353. package/dist/icons/AreaChartIcon.js +1 -1
  354. package/dist/icons/BackwardIcon.js +1 -1
  355. package/dist/icons/BarChartIcon.js +1 -1
  356. package/dist/icons/BellFilledIcon.js +1 -1
  357. package/dist/icons/BellIcon.js +1 -1
  358. package/dist/icons/BooleanIcon.js +1 -1
  359. package/dist/icons/CalendarEditIcon.js +1 -1
  360. package/dist/icons/CalendarIcon.js +1 -1
  361. package/dist/icons/CaretDownIcon.js +1 -1
  362. package/dist/icons/CaretUpIcon.js +1 -1
  363. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  364. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  365. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  366. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  367. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  368. package/dist/icons/ChartBarLineIcon.js +1 -1
  369. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  370. package/dist/icons/ChartBarStackedIcon.js +1 -1
  371. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  372. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  373. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  374. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  375. package/dist/icons/ChartBubbleIcon.js +1 -1
  376. package/dist/icons/ChartDonut2Icon.js +1 -1
  377. package/dist/icons/ChartFunnelIcon.js +1 -1
  378. package/dist/icons/ChartHeatmapIcon.js +1 -1
  379. package/dist/icons/ChartKPIIcon.js +1 -1
  380. package/dist/icons/ChartPie2Icon.js +1 -1
  381. package/dist/icons/ChartScatterIcon.js +1 -1
  382. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  383. package/dist/icons/CheckCircleIcon.js +1 -1
  384. package/dist/icons/CheckIcon.js +1 -1
  385. package/dist/icons/CircleFilledIcon.js +1 -1
  386. package/dist/icons/ClearIcon.js +1 -1
  387. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  388. package/dist/icons/CloseCircleIcon.js +1 -1
  389. package/dist/icons/CloseIcon.js +1 -1
  390. package/dist/icons/CodeIcon.js +1 -1
  391. package/dist/icons/ColumnTotalIcon.js +1 -1
  392. package/dist/icons/CopyIcon.js +1 -1
  393. package/dist/icons/CountIcon.js +1 -1
  394. package/dist/icons/CubeIcon.js +1 -1
  395. package/dist/icons/CubePauseIcon.js +1 -1
  396. package/dist/icons/CubePlayIcon.js +1 -1
  397. package/dist/icons/CurrencyDollarIcon.js +1 -1
  398. package/dist/icons/DangerIcon.js +1 -1
  399. package/dist/icons/DashboardIcon.js +1 -1
  400. package/dist/icons/DatabaseIcon.js +1 -1
  401. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  402. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  403. package/dist/icons/DirectionIcon.js +1 -1
  404. package/dist/icons/DonutIcon.js +1 -1
  405. package/dist/icons/DownIcon.js +1 -1
  406. package/dist/icons/EditIcon.js +1 -1
  407. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  408. package/dist/icons/ExclamationCircleIcon.js +1 -1
  409. package/dist/icons/ExclamationIcon.js +1 -1
  410. package/dist/icons/EyeIcon.js +1 -1
  411. package/dist/icons/EyeInvisibleIcon.js +1 -1
  412. package/dist/icons/FilterIcon.js +1 -1
  413. package/dist/icons/FolderFilledIcon.js +1 -1
  414. package/dist/icons/FolderIcon.js +1 -1
  415. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  416. package/dist/icons/FolderOpenIcon.js +1 -1
  417. package/dist/icons/ForwardIcon.js +1 -1
  418. package/dist/icons/GripVerticalIcon.js +1 -1
  419. package/dist/icons/HierarchyIcon.js +1 -1
  420. package/dist/icons/HierarchyOpenIcon.js +1 -1
  421. package/dist/icons/Icon.js +1 -1
  422. package/dist/icons/InfoCircleIcon.js +1 -1
  423. package/dist/icons/InfoIcon.js +1 -1
  424. package/dist/icons/KeyIcon.js +1 -1
  425. package/dist/icons/LeftIcon.js +1 -1
  426. package/dist/icons/LineChartIcon.js +1 -1
  427. package/dist/icons/LoadingIcon.js +1 -1
  428. package/dist/icons/LockFilledIcon.js +1 -1
  429. package/dist/icons/LockIcon.js +1 -1
  430. package/dist/icons/MoreIcon.js +1 -1
  431. package/dist/icons/NotAllowedIcon.js +1 -1
  432. package/dist/icons/Number123Icon.js +1 -1
  433. package/dist/icons/NumberIcon.js +1 -1
  434. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  435. package/dist/icons/PauseCircleIcon.js +1 -1
  436. package/dist/icons/PauseIcon.js +1 -1
  437. package/dist/icons/PercentageIcon.js +1 -1
  438. package/dist/icons/PieChartIcon.js +1 -1
  439. package/dist/icons/PipetteIcon.js +1 -1
  440. package/dist/icons/PlayCircleIcon.js +1 -1
  441. package/dist/icons/PlayIcon.js +1 -1
  442. package/dist/icons/PlusIcon.js +1 -1
  443. package/dist/icons/ProgressBarIcon.js +1 -1
  444. package/dist/icons/ReloadIcon.js +1 -1
  445. package/dist/icons/ReportIcon.js +1 -1
  446. package/dist/icons/ReturnIcon.js +1 -1
  447. package/dist/icons/RightIcon.js +1 -1
  448. package/dist/icons/RowTotalsIcon.js +1 -1
  449. package/dist/icons/SchemeIcon.js +1 -1
  450. package/dist/icons/SearchIcon.js +1 -1
  451. package/dist/icons/SemanticQueryIcon.js +1 -1
  452. package/dist/icons/SettingsIcon.js +1 -1
  453. package/dist/icons/ShieldFilledIcon.js +1 -1
  454. package/dist/icons/ShieldIcon.js +1 -1
  455. package/dist/icons/SlashIcon.js +1 -1
  456. package/dist/icons/SparklesIcon.js +1 -1
  457. package/dist/icons/SqlIcon.js +1 -1
  458. package/dist/icons/StatsIcon.js +1 -1
  459. package/dist/icons/StopIcon.js +1 -1
  460. package/dist/icons/StringIcon.js +1 -1
  461. package/dist/icons/SubtotalsIcon.js +1 -1
  462. package/dist/icons/SwitchIcon.js +1 -1
  463. package/dist/icons/TableIcon.js +1 -1
  464. package/dist/icons/ThumbsDownIcon.js +1 -1
  465. package/dist/icons/ThumbsUpIcon.js +1 -1
  466. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  467. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  468. package/dist/icons/ThunderboltIcon.js +1 -1
  469. package/dist/icons/TimeIcon.js +1 -1
  470. package/dist/icons/TrashIcon.js +1 -1
  471. package/dist/icons/UnlockIcon.js +1 -1
  472. package/dist/icons/UpIcon.js +1 -1
  473. package/dist/icons/UserGroupIcon.js +1 -1
  474. package/dist/icons/UserIcon.js +1 -1
  475. package/dist/icons/UserLockIcon.js +1 -1
  476. package/dist/icons/ViewIcon.js +1 -1
  477. package/dist/icons/WarningFilledIcon.js +1 -1
  478. package/dist/icons/WarningIcon.js +1 -1
  479. package/dist/icons/wrap-icon.js +1 -1
  480. package/dist/index.d.ts +7 -4
  481. package/dist/index.js +7 -4
  482. package/dist/index.js.map +1 -1
  483. package/dist/provider.js +1 -1
  484. package/dist/providers/TrackingProvider.js +1 -1
  485. package/dist/providers/navigationAdapter.default.js +1 -1
  486. package/dist/tokens/base.js +1 -1
  487. package/dist/tokens/colors.js +1 -1
  488. package/dist/tokens/index.js +1 -1
  489. package/dist/tokens/layout.js +1 -1
  490. package/dist/tokens/lazy-styles.js +1 -1
  491. package/dist/tokens/palette-config.js +1 -1
  492. package/dist/tokens/palette.js +1 -1
  493. package/dist/tokens/shadows.js +1 -1
  494. package/dist/tokens/sizes.js +1 -1
  495. package/dist/tokens/spacing.js +1 -1
  496. package/dist/tokens/typography.js +1 -1
  497. package/dist/utils/ResizeSensor.js +1 -1
  498. package/dist/utils/is-dev-env.js +1 -1
  499. package/dist/utils/modules.js +1 -1
  500. package/dist/utils/promise.js +1 -1
  501. package/dist/utils/raf.js +1 -1
  502. package/dist/utils/random.js +1 -1
  503. package/dist/utils/range.js +1 -1
  504. package/dist/utils/react/RenderCache.js +1 -1
  505. package/dist/utils/react/Slots.js +1 -1
  506. package/dist/utils/react/chain.js +1 -1
  507. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  508. package/dist/utils/react/index.js +1 -1
  509. package/dist/utils/react/interactions.js +1 -1
  510. package/dist/utils/react/isTextOnly.js +1 -1
  511. package/dist/utils/react/mapProps.js +1 -1
  512. package/dist/utils/react/mergeProps.js +1 -1
  513. package/dist/utils/react/nullableValue.js +1 -1
  514. package/dist/utils/react/resolveIcon.js +1 -1
  515. package/dist/utils/react/sharedStore.js +1 -1
  516. package/dist/utils/react/useBufferedValue.js +1 -1
  517. package/dist/utils/react/useCombinedRefs.js +1 -1
  518. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  519. package/dist/utils/react/useEventBus.js +1 -1
  520. package/dist/utils/react/useId.js +1 -1
  521. package/dist/utils/react/useIsDarwin.js +1 -1
  522. package/dist/utils/react/useKeySymbols.js +1 -1
  523. package/dist/utils/react/useLayoutEffect.js +1 -1
  524. package/dist/utils/react/useLocalStorage.js +1 -1
  525. package/dist/utils/react/useMergeStyles.js +1 -1
  526. package/dist/utils/react/usePopoverSync.js +1 -1
  527. package/dist/utils/react/useQaProps.js +1 -1
  528. package/dist/utils/react/useViewportSize.js +1 -1
  529. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  530. package/dist/utils/selection.js +1 -1
  531. package/dist/utils/styles.js +1 -1
  532. package/dist/utils/tree.js +1 -1
  533. package/dist/utils/warnings.js +1 -1
  534. package/dist/version.js +2 -2
  535. package/docs/components/fields/ColorInput.md +284 -0
  536. package/docs/components/fields/ColorPicker.md +85 -144
  537. package/docs/components/fields/ColorSwatchGroup.md +206 -0
  538. package/package.json +1 -1
  539. package/dist/components/fields/ColorPicker/ColorPickerPanel.js.map +0 -1
  540. package/dist/components/fields/ColorPicker/channels.js.map +0 -1
  541. package/dist/components/fields/ColorPicker/color.d.ts +0 -15
  542. package/dist/components/fields/ColorPicker/color.js.map +0 -1
@@ -1,26 +1,21 @@
1
1
  # ColorPicker
2
2
 
3
- An input for a single color. It reads and writes color **text** — hex, `rgb()`,
4
- `hsl()`, `okhsl()`, `okhst()` and `oklch()` — shows the current color as a
5
- swatch, and opens a popover where the color can be dialed in on three
6
- perceptual axes.
3
+ A swatch button that opens the color popover. It is the same popover
4
+ [ColorInput](./ColorInput.md) uses — three perceptual axes backed
5
+ by [Glaze](https://github.com/tenphi/glaze) — without the text field in front of
6
+ it.
7
7
 
8
- Every conversion goes through [Glaze](https://github.com/tenphi/glaze), so the
9
- canonical value the picker holds is OKHSL: bounded on every channel, and always
10
- inside the sRGB gamut. That is what makes an out-of-gamut state impossible and
11
- lets the same value be re-serialized into any of the supported notations without
12
- drift.
8
+ Reach for it when a color is **chosen but never typed**. Reach for `ColorInput`
9
+ when someone needs to paste `#7a4dbf` from a brand guide.
13
10
 
14
11
  ## When to Use
15
12
 
16
- - Theme and branding forms — a seed color, an accent, a chart series color
17
- - Anywhere a color has to be typed *or* explored, rather than chosen from a
18
- fixed palette
19
- - When the stored format matters (a design token file wants `oklch()`, a legacy
20
- API wants hex) and the input has to guarantee it
13
+ - A toolbar or inspector where space is tight
14
+ - A chart legend, a tag color, a cell in a dense table
15
+ - Anywhere the exact notation is an implementation detail the user never sees
21
16
 
22
- Reach for a `RadioGroup` or `Picker` of swatches instead when the choice is
23
- limited to a handful of approved colors.
17
+ Use [ColorInput](./ColorInput.md) instead when the color has to be
18
+ readable and pasteable as text.
24
19
 
25
20
  ## Component
26
21
 
@@ -30,28 +25,26 @@ limited to a handful of approved colors.
30
25
 
31
26
  - **`value`** `string | null` — The selected color (controlled)
32
27
  - **`defaultValue`** `string | null` — The selected color (uncontrolled)
33
- - **`onChange`** `(value: string | null) => void` — Fired with the color string, or `null` when the field is cleared
34
- - **`format`** `'hex' | 'rgb' | 'hsl' | 'okhsl' | 'okhst' | 'oklch'` (default: `hex`) — Notation the value is written in, and the one `forced` mode displays
35
- - **`formatMode`** `'forced' | 'derive' | 'free'` (default: `forced`) — How strictly the input text is tied to `format`
28
+ - **`onChange`** `(value: string | null) => void` — Fired with the color string
29
+ - **`format`** `'hex' | 'rgb' | 'hsl' | 'okhsl' | 'okhst' | 'oklch'` (default: `hex`) — Notation the value is written in, and the one shown on the trigger
36
30
  - **`defaultSpace`** `'hst' | 'lch' | 'rgb'` (default: `hst`) — Color concept the popover opens with
37
- - **`placeholder`** `string` (default: `Pick a color`) — Text shown while the field is empty
38
- - **`size`** `'small' | 'medium' | 'large' | (string & {})` (default: `medium`) — Input size
31
+ - **`children`** `ReactNode` — Replaces the color shown on the trigger. Pass `null` for a swatch on its own
32
+ - **`placeholder`** `ReactNode` (default: `Pick a color`) — Shown on the trigger while there is no color
33
+ - **`type`** `CubeItemProps['type']` (default: `outline`) — Visual type of the trigger
34
+ - **`theme`** `CubeItemProps['theme']` (default: `default`) — Theme of the trigger
35
+ - **`size`** `CubeItemProps['size']` — Size of the trigger
36
+ - **`triggerTooltip`** `CubeItemProps['tooltip']` — Tooltip for the trigger, separate from the field tooltip
37
+ - **`swatches`** `Array<string | { color: string; label?: string }>` — Colors to offer under the editor, as a [ColorSwatchGroup](./ColorSwatchGroup.md)
38
+ - **`swatchColumns`** `number` — How many swatches per row. Defaults to a single row
39
39
  - **`isOpen`** `boolean` — Whether the popover is open (controlled)
40
40
  - **`defaultOpen`** `boolean` (default: `false`) — Whether the popover is open initially
41
41
  - **`onOpenChange`** `(isOpen: boolean) => void` — Fired when the popover opens or closes
42
- - **`shouldFlip`** `boolean` (default: `true`) — Whether the popover may flip to the other side of the input
43
- - **`onFocus`** `(event: FocusEvent) => void` — Fired when the text input receives focus
44
- - **`onBlur`** `(event: FocusEvent) => void` — Fired when the text input loses focus
42
+ - **`shouldFlip`** `boolean` (default: `true`) — Whether the popover may flip to the other side of the trigger
45
43
 
46
- Named CSS colors (`red`, `rebeccapurple`) are **not** accepted — they are not a
47
- color space, and Glaze does not resolve them either. Alpha is parsed but
48
- dropped: the value is always opaque.
49
-
50
- Focusing the field selects the whole value, so a pasted color replaces it
51
- outright. The string is the unit of editing here: a single channel is tuned with
52
- the sliders rather than by hand-editing one number inside `oklch(…)`. Clicking a
53
- field that already has focus positions the caret as usual, so the text stays
54
- editable by hand.
44
+ There is no `formatMode`: with no text to reconcile, `format` alone decides how
45
+ the value is written. Everything else about the color model — the notations it
46
+ reads, the gamut handling, the three spaces — is identical to `ColorInput` and
47
+ documented there.
55
48
 
56
49
  ### Base Properties
57
50
 
@@ -65,109 +58,84 @@ Supports all [Field properties](../../FieldProperties.md)
65
58
 
66
59
  #### styles
67
60
 
68
- Customizes the input wrapper — the element that owns the border, fill and size.
69
-
70
- **Sub-elements:**
71
-
72
- - `Prefix` — the container holding the color swatch
73
- - `Suffix` — the container holding the validation state, then the popover trigger
74
- - `InputIcon` — the swatch slot
75
- - `State` — the validation / loading indicator
76
-
77
- #### inputStyles
78
-
79
- Customizes the `<input>` element itself.
61
+ Customizes the wrapper around the trigger.
80
62
 
81
63
  #### triggerStyles
82
64
 
83
- Customizes the popover trigger button.
65
+ Customizes the trigger button itself.
84
66
 
85
67
  #### swatchStyles
86
68
 
87
- Customizes the color swatch shown inside the input.
69
+ Customizes the color swatch.
88
70
 
89
71
  ### Style Properties
90
72
 
91
73
  These properties allow direct style application without using the `styles` prop:
92
74
 
93
- - **Base:** `display`, `font`, `preset`, `hide`, `whiteSpace`, `opacity`, `transition`
94
75
  - **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `margin`, `inset`, `position`, `scrollMargin`
95
76
  - **Dimension:** `width`, `height`, `flexBasis`, `flexGrow`, `flexShrink`, `flex`
96
77
  - **Block:** `border`, `radius`, `shadow`, `outline`, `padding`, `paddingInline`, `paddingBlock`, `overflow`, `scrollbar`, `textAlign`
97
- - **Color:** `color`, `fill`, `fade`, `image`
98
78
 
99
79
  ### Modifiers
100
80
 
101
81
  The `mods` property accepts the following modifiers you can override:
102
82
 
103
- | Modifier | Type | Description |
104
- | ---------- | --------- | ------------------------------------------------- |
105
- | `focused` | `boolean` | The text input has focus |
106
- | `hovered` | `boolean` | The pointer is over the input |
107
- | `disabled` | `boolean` | The picker is disabled |
108
- | `valid` | `boolean` | The field is in the valid state |
109
- | `invalid` | `boolean` | The field is in the invalid state |
110
- | `prefix` | `boolean` | A prefix (the swatch) is rendered |
111
- | `suffix` | `boolean` | A suffix (the trigger) is rendered |
83
+ | Modifier | Type | Description |
84
+ | ------------- | --------- | ------------------------------------ |
85
+ | `placeholder` | `boolean` | No color is selected yet |
112
86
 
113
87
  The swatch carries its own `empty` modifier while there is no color to show.
114
88
 
115
- ## Format modes
89
+ ### The value as text
116
90
 
117
- The three modes differ in how much freedom the *text* gets. The value is always
118
- a real color in every one of them.
91
+ The popover carries a `ColorInput` above the preview, so the exact color can be
92
+ read, copied, pasted and normalized in place rather than only dialed in. It has
93
+ no trigger of its own — a disclosure inside the thing it discloses would be
94
+ meaningless — and clearing it clears the picker.
119
95
 
120
- | Mode | Text | Value |
121
- | -------- | ----------------------------------- | ---------------------------------------------------- |
122
- | `forced` | Rewritten in `format` on blur/Enter | Always written in `format` |
123
- | `derive` | Left exactly as typed | Normalized in the notation the text is written in |
124
- | `free` | Left exactly as typed | The text itself, verbatim |
96
+ ### A palette under the editor
125
97
 
126
- In every mode an entry that is not a color is rejected: the previous valid color
127
- stays the value while it is being typed, and the text snaps back to it on blur.
128
- Emptying the field is not an error — it commits `null`.
98
+ Pass `swatches` and a [ColorSwatchGroup](./ColorSwatchGroup.md)
99
+ appears below the channels, so a common color is one press away.
129
100
 
130
101
  ```jsx
131
- // A design-token form that must store OKLCH
132
- <ColorPicker label="Accent" format="oklch" onChange={setAccent} />
133
-
134
- // A CSS editor: keep whatever the author wrote, but guarantee it parses
135
- <ColorPicker label="Color" formatMode="free" onChange={setCss} />
102
+ <ColorPicker label="Brand color" swatches={palette} swatchColumns={4} />
136
103
  ```
137
104
 
138
- ## Color spaces
139
-
140
- The popover edits one canonical color through three sets of axes:
141
-
142
- | Space | Axes | Good for |
143
- | ----- | ----------------------------- | ----------------------------------------------------- |
144
- | `hst` | Hue, Saturation, Tone (OKHST) | Building ramps — equal tone steps read as equal steps |
145
- | `lch` | Lightness, Chroma, Hue (OKLCH)| Matching a value from a design-token file |
146
- | `rgb` | Red, Green, Blue | Matching a value from a legacy palette or a screenshot|
147
-
148
- Each of these opens on its own space; the switcher inside the popover moves
149
- between them at any time.
150
-
151
- `H` means the same angle in HST and LCH, so the hue strip is identical in both.
152
- The chroma slider is bounded by the sRGB gamut at the current lightness and hue,
153
- which is why its range changes as `L` moves.
105
+ That group never offers its own custom-color escape hatch, since the escape
106
+ hatch is a `ColorPicker` and would nest popovers without end.
154
107
 
155
108
  ## Examples
156
109
 
157
110
  ### Basic usage
158
111
 
159
112
  ```jsx
160
- <ColorPicker label="Brand color" defaultValue="#7a4dbf" />
113
+ <ColorPicker label="Series color" defaultValue="#7a4dbf" />
161
114
  ```
162
115
 
163
- ### Controlled
116
+ ### A swatch on its own
117
+
118
+ Drop the label for a compact button — a toolbar, or a cell in a table.
164
119
 
165
120
  ```jsx
166
- const [color, setColor] = useState('#7a4dbf');
121
+ <ColorPicker aria-label="Series color" value={color} onChange={setColor}>
122
+ {null}
123
+ </ColorPicker>
124
+ ```
167
125
 
168
- <ColorPicker label="Brand color" value={color} onChange={setColor} />;
126
+ Give it an `aria-label` when you do: with no visible text, that is the only
127
+ thing naming the control.
128
+
129
+ ### A label of your own
130
+
131
+ ```jsx
132
+ <ColorPicker value={color} onChange={setColor}>
133
+ Accent
134
+ </ColorPicker>
169
135
  ```
170
136
 
137
+ ### Trigger types
138
+
171
139
  ### Inside a form
172
140
 
173
141
  ```jsx
@@ -181,91 +149,64 @@ const [color, setColor] = useState('#7a4dbf');
181
149
  </Form>
182
150
  ```
183
151
 
184
- ### Opening on a specific space
185
-
186
- ```jsx
187
- <ColorPicker label="Series color" defaultSpace="rgb" defaultValue="#26fcb2" />
188
- ```
189
-
190
- ### Using the value as a style
191
-
192
- Because the emitted value is a plain color string, it can go straight into a
193
- tasty style — including the `okhsl()` and `okhst()` notations, which tasty
194
- parses natively.
195
-
196
- ```jsx
197
- const [color, setColor] = useState('okhst(264 80% 60%)');
198
-
199
- <>
200
- <ColorPicker label="Fill" format="okhst" value={color} onChange={setColor} />
201
- <Block fill={color} height="10x" radius="1r" />
202
- </>;
203
- ```
204
-
205
152
  ## Accessibility
206
153
 
207
154
  ### Keyboard Navigation
208
155
 
209
- - `Tab` — moves focus to the text input, then to the popover trigger
210
- - `Enter` — commits and normalizes the typed color without leaving the field
211
- - `Space` / `Enter` on the trigger — opens the popover
212
- - `Escape` — closes the popover
156
+ - `Tab` — moves focus to the trigger
157
+ - `Space` / `Enter` — opens the popover
158
+ - `Escape` — closes it
213
159
  - `Left` / `Right`, `Home` / `End` on a channel slider — moves that channel
214
160
  - `Left` / `Right` on the space switcher — moves between HST, LCH and RGB
215
161
 
216
162
  ### Screen Reader Support
217
163
 
218
- - The text input announces as a textbox with the field's label
219
- - The trigger announces as "Open the color picker"
164
+ - The trigger announces as a button, named by the field label, `aria-label`, or
165
+ its own text
220
166
  - The popover announces as a dialog named "Color picker"
221
- - Each channel slider sits in a group named after its axis (`Hue`,
222
- `Saturation`, `Tone`, `Lightness`, `Chroma`, `Red`, `Green`, `Blue`)
223
- - The swatch is decorative and is not announced — the text carries the value
167
+ - Each channel slider sits in a group named after its axis
168
+ - The swatch is decorative; the color is announced as the trigger's text unless
169
+ you replace it
224
170
 
225
171
  ### ARIA Properties
226
172
 
227
- - `aria-label` — names the field when there is no visible label
228
- - `aria-describedby` — wired to the field description by the form system
173
+ - `aria-label` — names the trigger when there is no visible label or text
174
+ - `aria-expanded` — reflects the popover state
229
175
 
230
176
  ## Best Practices
231
177
 
232
- 1. **Do**: name the field, so the text input is announced meaningfully
178
+ 1. **Do**: name a swatch-only picker
233
179
 
234
180
  ```jsx
235
- <ColorPicker label="Brand color" />
181
+ <ColorPicker aria-label="Series color">{null}</ColorPicker>
236
182
  ```
237
183
 
238
- 2. **Don't**: rely on the swatch alone to convey the value
184
+ 2. **Don't**: leave a swatch-only picker unnamed — the swatch says nothing to a
185
+ screen reader
239
186
 
240
187
  ```jsx
241
- <ColorPicker aria-label="" />
188
+ <ColorPicker>{null}</ColorPicker>
242
189
  ```
243
190
 
244
- 3. **Do**: pick the `format` your backend stores, and leave `formatMode` at
245
- `forced` so the two can never disagree.
246
-
247
- 4. **Don't**: use `free` mode when the value is later parsed by something
248
- stricter than a browser — the text is passed through as written.
191
+ 3. **Do**: reach for `ColorInput` the moment someone might want to paste a hex
192
+ value; a picker alone makes that impossible.
249
193
 
250
194
  ## Integration with Forms
251
195
 
252
196
  This component supports all
253
197
  [Field properties](../../FieldProperties.md) when used
254
- within a Form. The field value is the color string, and clearing the input
255
- stores `null`, which makes `required` rules behave as expected.
198
+ within a Form. The field value is the color string.
256
199
 
257
200
  ## Suggested Improvements
258
201
 
202
+ - A row of recent or preset swatches inside the popover
259
203
  - An eyedropper that samples a pixel from the page, where
260
204
  [`EyeDropper`](https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper) is
261
205
  available
262
- - Optional alpha support, which the canonical value currently drops
263
- - A row of recent or preset swatches inside the popover
264
- - Editable numeric inputs next to each channel slider, for exact entry without
265
- going through the text field
206
+ - Clearing the color back to `null` from the trigger
266
207
 
267
208
  ## Related Components
268
209
 
269
- - [HueSlider](./HueSlider.md) — just the hue axis, when only a hue is needed
270
- - [Slider](./Slider.md) — the primitive each channel is built from
271
- - [TextInput](./TextInput.md) — the input chrome this component reuses
210
+ - [ColorInput](./ColorInput.md) — the same popover behind a text field
211
+ - [Picker](./Picker.md) — the same trigger-plus-popover shape, for lists
212
+ - [HueSlider](./HueSlider.md) — just the hue axis
@@ -0,0 +1,206 @@
1
+ # ColorSwatchGroup
2
+
3
+ A grid of color swatches, one of which can be selected. It is the palette half
4
+ of choosing a color, where [ColorPicker](./ColorPicker.md) is the
5
+ freeform half — and the two compose: pass `swatches` to a `ColorPicker` and the
6
+ palette appears under the editor.
7
+
8
+ Under the hood it is a radio group, so one tab stop and arrow keys move between
9
+ swatches. The API is shaped after `Picker` rather than `RadioGroup`: colors go in
10
+ as data, not as children.
11
+
12
+ ## When to Use
13
+
14
+ - A brand or theme palette where freeform color would be wrong
15
+ - Chart series, tag and label colors — a small approved set
16
+ - Inside a `ColorPicker` popover, as a shortcut past the sliders
17
+
18
+ ## Component
19
+
20
+ ---
21
+
22
+ ### Properties
23
+
24
+ - **`colors`** `Array<string | { color: string; label?: string }>` — The colors to offer
25
+ - **`value`** `string | null` — The selected color (controlled)
26
+ - **`defaultValue`** `string | null` — The selected color (uncontrolled)
27
+ - **`onChange`** `(value: string | null) => void` — Fired with the chosen color, written in `format`
28
+ - **`format`** `'hex' | 'rgb' | 'hsl' | 'okhsl' | 'okhst' | 'oklch'` (default: `hex`) — Notation the value is written in
29
+ - **`columns`** `number` — Pin the swatches to a fixed grid. By default they wrap to fill the available width
30
+ - **`allowCustom`** `boolean` (default: `false`) — Append a `ColorPicker` for colors outside the set
31
+ - **`size`** `'small' | 'medium' | 'large'` (default: `medium`) — Size of each swatch
32
+
33
+ ### Base Properties
34
+
35
+ Supports [Base properties](../../BaseProperties.md)
36
+
37
+ ### Field Properties
38
+
39
+ Supports all [Field properties](../../FieldProperties.md)
40
+
41
+ ### Styling Properties
42
+
43
+ #### styles
44
+
45
+ Customizes the grid.
46
+
47
+ #### swatchStyles
48
+
49
+ Customizes an individual swatch.
50
+
51
+ ### Style Properties
52
+
53
+ These properties allow direct style application without using the `styles` prop:
54
+
55
+ - **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `margin`, `inset`, `position`, `scrollMargin`
56
+ - **Dimension:** `width`, `height`, `flexBasis`, `flexGrow`, `flexShrink`, `flex`
57
+ - **Block:** `border`, `radius`, `shadow`, `outline`, `padding`, `paddingInline`, `paddingBlock`, `overflow`, `scrollbar`, `textAlign`
58
+
59
+ ### Style Props on the group
60
+
61
+ `ColorSwatchGroup` and `ColorPicker` both take the outer and block style props,
62
+ so `radius`, `border`, `padding` and `shadow` work directly on them.
63
+
64
+ ### Modifiers
65
+
66
+ The `mods` property accepts the following modifiers you can override:
67
+
68
+ | Modifier | Type | Description |
69
+ | ---------- | --------- | ---------------------------------- |
70
+ | `selected` | `boolean` | The swatch is the selected color |
71
+ | `empty` | `boolean` | The swatch has no color to show |
72
+ | `disabled` | `boolean` | The group is disabled |
73
+
74
+ ## ColorSwatch
75
+
76
+ The square itself is exported, for the times you need to show a color without a
77
+ control around it — a legend, a table cell, a summary line. It takes direct
78
+ style props, so its shape and size are yours:
79
+
80
+ ```jsx
81
+ <ColorSwatch color="#7a4dbf" radius="round" width="4x" height="4x" />
82
+ ```
83
+
84
+ It is decorative on its own: pair it with the value as text, or with something
85
+ that names it.
86
+
87
+ ## Swatches must be unique
88
+
89
+ Equivalent colors are collapsed into one swatch, because two entries for the
90
+ same color make selection ambiguous — there would be no way to say which one is
91
+ selected. Matching is done on the canonical hex, so `#ff0000`, `rgb(255 0 0)`
92
+ and `hsl(0 100% 50%)` are one swatch, not three.
93
+
94
+ The same matching decides which swatch a value selects, so `value` need not be
95
+ written in the same notation as the swatch it refers to.
96
+
97
+ ## Examples
98
+
99
+ ### Basic usage
100
+
101
+ ```jsx
102
+ <ColorSwatchGroup
103
+ label="Brand color"
104
+ colors={['#7a4dbf', '#26fcb2', '#ff0000']}
105
+ value={color}
106
+ onChange={setColor}
107
+ />
108
+ ```
109
+
110
+ ### Wrapping onto rows
111
+
112
+ By default the swatches wrap to fill whatever width they are given: a single row
113
+ where there is room, more rows where there is not. `columns` pins them to a
114
+ fixed grid instead, sized to the swatches rather than stretched across the
115
+ container.
116
+
117
+ ```jsx
118
+ <ColorSwatchGroup colors={palette} columns={4} />
119
+ ```
120
+
121
+ ### Naming the swatches
122
+
123
+ A swatch announces its color by default, which is rarely the most useful thing
124
+ to hear. Give the colors names when they have them.
125
+
126
+ ```jsx
127
+ <ColorSwatchGroup
128
+ colors={[
129
+ { color: '#7a4dbf', label: 'Primary' },
130
+ { color: '#26fcb2', label: 'Success' },
131
+ ]}
132
+ />
133
+ ```
134
+
135
+ ### Allowing a color outside the set
136
+
137
+ ```jsx
138
+ <ColorSwatchGroup colors={palette} allowCustom />
139
+ ```
140
+
141
+ The trailing picker shows the current color whenever that color is not one of
142
+ the swatches, so a custom choice stays visible.
143
+
144
+ ### Inside a ColorPicker
145
+
146
+ ```jsx
147
+ <ColorPicker label="Brand color" swatches={palette} swatchColumns={4} />
148
+ ```
149
+
150
+ `allowCustom` is ignored there, and deliberately so: the escape hatch is itself
151
+ a `ColorPicker`, so offering it inside one would nest popovers without end. The
152
+ group reads a context the popover provides, which means the recursion cannot be
153
+ written even by hand.
154
+
155
+ ## Accessibility
156
+
157
+ ### Keyboard Navigation
158
+
159
+ - `Tab` — moves focus into the group, landing on the selected swatch
160
+ - `Left` / `Right`, `Up` / `Down` — move between swatches, selecting as they go
161
+ - `Space` — selects the focused swatch
162
+
163
+ ### Screen Reader Support
164
+
165
+ - The group announces as a radiogroup, named by its label or `aria-label`
166
+ - Each swatch announces as a radio named by its `label`, or by its color
167
+ - Give the group a name: "radiogroup" alone says nothing about what is chosen
168
+
169
+ ### ARIA Properties
170
+
171
+ - `aria-label` — names the group when there is no visible label
172
+
173
+ ## Best Practices
174
+
175
+ 1. **Do**: name the colors when they mean something
176
+
177
+ ```jsx
178
+ <ColorSwatchGroup colors={[{ color: '#ff0000', label: 'Danger' }]} />
179
+ ```
180
+
181
+ 2. **Don't**: pass the same color twice expecting two swatches — one is dropped
182
+
183
+ ```jsx
184
+ <ColorSwatchGroup colors={['#ff0000', 'rgb(255 0 0)']} />
185
+ ```
186
+
187
+ 3. **Do**: reach for `allowCustom` only where a color outside the palette is
188
+ genuinely acceptable. A fixed set is the point of this component.
189
+
190
+ ## Integration with Forms
191
+
192
+ This component supports all
193
+ [Field properties](../../FieldProperties.md) when used
194
+ within a Form. The field value is the color string.
195
+
196
+ ## Suggested Improvements
197
+
198
+ - Sections with headings, for palettes with more than one group
199
+ - An optional "no color" swatch that clears the value
200
+ - Multi-selection, for palettes that build a series
201
+
202
+ ## Related Components
203
+
204
+ - [ColorPicker](./ColorPicker.md) — freeform color behind a swatch button
205
+ - [ColorInput](./ColorInput.md) — freeform color as editable text
206
+ - [RadioGroup](./RadioGroup.md) — the selection primitive this is built on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cube-dev/ui-kit",
3
- "version": "0.0.0-canary-850df32",
3
+ "version": "0.0.0-canary-cfad381",
4
4
  "type": "module",
5
5
  "description": "UIKit for Cube Projects",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"ColorPickerPanel.js","names":["Slider","Radio"],"sources":["../../../../src/components/fields/ColorPicker/ColorPickerPanel.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\nimport { useMemo } from 'react';\n\nimport { useEvent } from '../../../_internal';\nimport { Radio } from '../RadioGroup';\nimport { Slider } from '../Slider';\n\nimport {\n CHANNELS,\n COLOR_SPACE_HINTS,\n COLOR_SPACE_LABELS,\n COLOR_SPACES,\n ColorChannel,\n ColorSpace,\n} from './channels';\nimport {\n ColorFormat,\n ColorValue,\n formatColor,\n getContrastingColor,\n toHex,\n} from './color';\n\nconst PanelElement = tasty({\n qa: 'ColorPickerPanel',\n styles: {\n display: 'grid',\n flow: 'row',\n gap: '1x',\n padding: '1x',\n width: '34x',\n },\n});\n\nconst PreviewElement = tasty({\n qa: 'ColorPreview',\n styles: {\n display: 'grid',\n placeItems: 'center',\n height: '6x',\n radius: true,\n preset: 's4',\n fill: '(#color-picker, #clear)',\n color: '(#color-picker-contrast, #dark)',\n shadow: 'inset 0 0 0 1bw #dark.1',\n },\n});\n\nconst ChannelsElement = tasty({\n styles: {\n display: 'grid',\n gridColumns: 'max-content 1sf max-content',\n placeItems: 'center stretch',\n gap: '1x',\n },\n});\n\nconst ChannelLabelElement = tasty({\n styles: {\n preset: 'c2',\n color: '#dark-03',\n textAlign: 'center',\n width: '2x',\n },\n});\n\nconst ChannelTrackElement = tasty({\n styles: {\n display: 'grid',\n placeItems: 'center stretch',\n },\n});\n\nconst ChannelValueElement = tasty({\n styles: {\n preset: 's4',\n color: '#dark-02',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n width: '5.5x',\n },\n});\n\n/**\n * The gradient reaches the track through a plain custom property so the track\n * keeps a single cached style rule. A color picker moves its channels\n * continuously, and a fresh `styles` object per frame would emit a fresh CSS\n * rule per frame.\n */\nconst TRACK_STYLES: Styles = {\n height: '1x',\n top: '.5x',\n radius: '1r',\n fill: '#clear',\n image: '$channel-gradient',\n shadow: 'inset 0 0 0 1bw #dark.1',\n Fill: false,\n};\n\n/** A ring keeps the thumb visible wherever it sits on its own gradient. */\nconst THUMB_STYLES: Styles = {\n shadow: '0 0 0 2bw #surface, 0 0 0 3bw #dark.2',\n};\n\nconst THUMB_TOKENS = { '#slider-thumb': '(#color-picker, #surface)' };\n\nconst SPACE_STYLES: Styles = { width: '100%' };\nconst TAB_STYLES: Styles = { flexGrow: 1 };\n\nexport interface ColorPickerPanelProps {\n color: ColorValue;\n space: ColorSpace;\n isDisabled?: boolean;\n /** Notation used for the preview caption. */\n previewFormat: ColorFormat;\n onChange: (color: ColorValue) => void;\n onSpaceChange: (space: ColorSpace) => void;\n}\n\ninterface ChannelRowProps {\n channel: ColorChannel;\n color: ColorValue;\n isDisabled?: boolean;\n onChange: (color: ColorValue) => void;\n}\n\nfunction ChannelRow({ channel, color, isDisabled, onChange }: ChannelRowProps) {\n const max = channel.max(color);\n\n const handleChange = useEvent((value: number) => {\n onChange(channel.apply(color, value));\n });\n\n return (\n <>\n <ChannelLabelElement aria-hidden=\"true\">\n {channel.label}\n </ChannelLabelElement>\n <ChannelTrackElement\n style={{\n '--channel-gradient': `linear-gradient(to right, ${channel.stops(\n color,\n )})`,\n }}\n >\n <Slider\n aria-label={channel.title}\n value={Math.min(channel.value(color), max)}\n minValue={channel.min}\n maxValue={max}\n step={channel.step}\n isDisabled={isDisabled}\n trackStyles={TRACK_STYLES}\n thumbStyles={THUMB_STYLES}\n thumbTokens={THUMB_TOKENS}\n onChange={handleChange}\n />\n </ChannelTrackElement>\n <ChannelValueElement>{channel.display(color)}</ChannelValueElement>\n </>\n );\n}\n\n/**\n * The popover body of `ColorPicker`: a preview, a switch between the three\n * color concepts, and one gradient slider per channel of the active one.\n */\nexport function ColorPickerPanel(props: ColorPickerPanelProps) {\n const { color, space, isDisabled, previewFormat, onChange, onSpaceChange } =\n props;\n\n const colorTokens = useMemo(\n () => ({\n '--color-picker-color': toHex(color),\n '--color-picker-contrast-color': getContrastingColor(color),\n }),\n [color],\n );\n\n const handleSpaceChange = useEvent((value: string) => {\n onSpaceChange(value as ColorSpace);\n });\n\n return (\n <PanelElement style={colorTokens}>\n <PreviewElement>{formatColor(color, previewFormat)}</PreviewElement>\n <Radio.Tabs\n aria-label=\"Color space\"\n value={space}\n isDisabled={isDisabled}\n styles={SPACE_STYLES}\n onChange={handleSpaceChange}\n >\n {COLOR_SPACES.map((item) => (\n <Radio\n key={item}\n value={item}\n aria-label={COLOR_SPACE_LABELS[item]}\n tooltip={COLOR_SPACE_HINTS[item]}\n styles={TAB_STYLES}\n >\n {COLOR_SPACE_LABELS[item]}\n </Radio>\n ))}\n </Radio.Tabs>\n <ChannelsElement>\n {CHANNELS[space].map((channel) => (\n <ChannelRow\n key={`${space}-${channel.label}`}\n channel={channel}\n color={color}\n isDisabled={isDisabled}\n onChange={onChange}\n />\n ))}\n </ChannelsElement>\n </PanelElement>\n );\n}\n"],"mappings":";;;;;;;;;;;AAuBA,MAAM,eAAe,MAAM;CACzB,IAAI;CACJ,QAAQ;EACN,SAAS;EACT,MAAM;EACN,KAAK;EACL,SAAS;EACT,OAAO;EACR;CACF,CAAC;AAEF,MAAM,iBAAiB,MAAM;CAC3B,IAAI;CACJ,QAAQ;EACN,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACF,CAAC;AAEF,MAAM,kBAAkB,MAAM,EAC5B,QAAQ;CACN,SAAS;CACT,aAAa;CACb,YAAY;CACZ,KAAK;CACN,EACF,CAAC;AAEF,MAAM,sBAAsB,MAAM,EAChC,QAAQ;CACN,QAAQ;CACR,OAAO;CACP,WAAW;CACX,OAAO;CACR,EACF,CAAC;AAEF,MAAM,sBAAsB,MAAM,EAChC,QAAQ;CACN,SAAS;CACT,YAAY;CACb,EACF,CAAC;AAEF,MAAM,sBAAsB,MAAM,EAChC,QAAQ;CACN,QAAQ;CACR,OAAO;CACP,WAAW;CACX,YAAY;CACZ,OAAO;CACR,EACF,CAAC;;;;;;;AAQF,MAAM,eAAuB;CAC3B,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACP;;AAGD,MAAM,eAAuB,EAC3B,QAAQ,yCACT;AAED,MAAM,eAAe,EAAE,iBAAiB,6BAA6B;AAErE,MAAM,eAAuB,EAAE,OAAO,QAAQ;AAC9C,MAAM,aAAqB,EAAE,UAAU,GAAG;AAmB1C,SAAS,WAAW,EAAE,SAAS,OAAO,YAAY,YAA6B;CAC7E,MAAM,MAAM,QAAQ,IAAI,MAAM;CAE9B,MAAM,eAAe,UAAU,UAAkB;AAC/C,WAAS,QAAQ,MAAM,OAAO,MAAM,CAAC;GACrC;AAEF,QACE;EACE,oBAAC;GAAoB,eAAY;aAC9B,QAAQ;IACW;EACtB,oBAAC;GACC,OAAO,EACL,sBAAsB,6BAA6B,QAAQ,MACzD,MACD,CAAC,IACH;aAED,oBAACA;IACC,cAAY,QAAQ;IACpB,OAAO,KAAK,IAAI,QAAQ,MAAM,MAAM,EAAE,IAAI;IAC1C,UAAU,QAAQ;IAClB,UAAU;IACV,MAAM,QAAQ;IACF;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,UAAU;KACV;IACkB;EACtB,oBAAC,iCAAqB,QAAQ,QAAQ,MAAM,GAAuB;KAClE;;;;;;AAQP,SAAgB,iBAAiB,OAA8B;CAC7D,MAAM,EAAE,OAAO,OAAO,YAAY,eAAe,UAAU,kBACzD;CAEF,MAAM,cAAc,eACX;EACL,wBAAwB,MAAM,MAAM;EACpC,iCAAiC,oBAAoB,MAAM;EAC5D,GACD,CAAC,MAAM,CACR;CAED,MAAM,oBAAoB,UAAU,UAAkB;AACpD,gBAAc,MAAoB;GAClC;AAEF,QACE,qBAAC;EAAa,OAAO;;GACnB,oBAAC,4BAAgB,YAAY,OAAO,cAAc,GAAkB;GACpE,oBAACC,QAAM;IACL,cAAW;IACX,OAAO;IACK;IACZ,QAAQ;IACR,UAAU;cAET,aAAa,KAAK,SACjB,oBAACA;KAEC,OAAO;KACP,cAAY,mBAAmB;KAC/B,SAAS,kBAAkB;KAC3B,QAAQ;eAEP,mBAAmB;OANf,KAOC,CACR;KACS;GACb,oBAAC,6BACE,SAAS,OAAO,KAAK,YACpB,oBAAC;IAEU;IACF;IACK;IACF;MAJL,GAAG,MAAM,GAAG,QAAQ,QAKzB,CACF,GACc;;GACL"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"channels.js","names":[],"sources":["../../../../src/components/fields/ColorPicker/channels.ts"],"sourcesContent":["import {\n ColorValue,\n fromOkhst,\n fromOklch,\n fromRgb,\n isAchromatic,\n maxChroma,\n normalizeHue,\n toHex,\n toOkhst,\n toOklch,\n toRgb,\n} from './color';\n\n/**\n * The three color concepts the popover can be driven by. They all edit the\n * same canonical value — only the axes the user manipulates differ.\n */\nexport const COLOR_SPACES = ['hst', 'lch', 'rgb'] as const;\n\nexport type ColorSpace = (typeof COLOR_SPACES)[number];\n\nexport const COLOR_SPACE_LABELS: Record<ColorSpace, string> = {\n hst: 'HST',\n lch: 'LCH',\n rgb: 'RGB',\n};\n\nexport const COLOR_SPACE_HINTS: Record<ColorSpace, string> = {\n hst: 'OKHST — hue, saturation, tone',\n lch: 'OKLCH — lightness, chroma, hue',\n rgb: 'sRGB — red, green, blue',\n};\n\nexport interface ColorChannel {\n /** Single-letter axis name shown next to the slider. */\n label: string;\n /** Accessible name for the slider. */\n title: string;\n min: number;\n step: number;\n /** The upper bound. Chroma is gamut-bound, so it depends on the color. */\n max: (color: ColorValue) => number;\n value: (color: ColorValue) => number;\n /** The color this channel produces when moved to `value`. */\n apply: (color: ColorValue, value: number) => ColorValue;\n /** Comma-separated gradient stops describing the channel's whole range. */\n stops: (color: ColorValue) => string;\n /** Human-readable rendering of the current channel value. */\n display: (color: ColorValue) => string;\n}\n\nconst constant = (value: number) => () => value;\n\nfunction round(value: number, precision = 2): number {\n const factor = 10 ** precision;\n\n return Math.round(value * factor) / factor;\n}\n\n/**\n * `count` evenly spaced gradient stops, always as hex. Perceptual channels are\n * not linear in sRGB, so a two-stop gradient would misrepresent them —\n * sampling the real conversion keeps the track honest. Hex (rather than an\n * `okhsl()` string) because the gradient reaches the DOM as a raw custom\n * property, without passing through Tasty's color functions.\n */\nfunction ramp(count: number, at: (position: number) => ColorValue): string {\n return Array.from({ length: count }, (_, index) =>\n toHex(at(index / (count - 1))),\n ).join(', ');\n}\n\n/**\n * The hue strip is drawn at full saturation and a fixed OKHSL lightness, which\n * keeps it perceptually even instead of spiking at yellow the way a CSS-HSL\n * rainbow does. Its own saturation and tone stay fixed: the strip is the same\n * in HST and in LCH, where `H` means the same thing.\n */\nconst HUE_STOPS = ramp(25, (position) => ({\n h: position * 360,\n s: 1,\n l: 0.6,\n}));\n\nconst hueChannel: ColorChannel = {\n label: 'H',\n title: 'Hue',\n min: 0,\n // 360° is the same angle as 0°, so the last usable stop is 359 — the range\n // `HueSlider` exposes as well.\n max: constant(359),\n step: 1,\n value: (color) => round(color.h, 1),\n apply: (color, value) => ({ ...color, h: normalizeHue(value) }),\n stops: () => HUE_STOPS,\n display: (color) => `${Math.round(color.h)}°`,\n};\n\nconst saturationChannel: ColorChannel = {\n label: 'S',\n title: 'Saturation',\n min: 0,\n max: constant(100),\n step: 1,\n value: (color) => round(color.s * 100, 1),\n apply: (color, value) => ({ ...color, s: value / 100 }),\n stops: (color) => ramp(7, (position) => ({ ...color, s: position })),\n display: (color) => `${Math.round(color.s * 100)}%`,\n};\n\nconst toneChannel: ColorChannel = {\n label: 'T',\n title: 'Tone',\n min: 0,\n max: constant(100),\n step: 1,\n value: (color) => round(toOkhst(color).t * 100, 1),\n apply: (color, value) =>\n fromOkhst({ h: color.h, s: color.s, t: value / 100 }),\n stops: (color) =>\n ramp(7, (position) => fromOkhst({ h: color.h, s: color.s, t: position })),\n display: (color) => `${Math.round(toOkhst(color).t * 100)}%`,\n};\n\nconst lightnessChannel: ColorChannel = {\n label: 'L',\n title: 'Lightness',\n min: 0,\n max: constant(100),\n step: 1,\n value: (color) => round(toOklch(color).l * 100, 1),\n apply: (color, value) => {\n const { c, h } = toOklch(color);\n\n return fromOklch({ l: value / 100, c, h });\n },\n stops: (color) => {\n const { c, h } = toOklch(color);\n\n return ramp(7, (position) => fromOklch({ l: position, c, h }));\n },\n display: (color) => `${Math.round(toOklch(color).l * 100)}%`,\n};\n\nconst chromaChannel: ColorChannel = {\n label: 'C',\n title: 'Chroma',\n min: 0,\n // Chroma has no fixed ceiling: how far it can go depends on how far the sRGB\n // gamut reaches at the current lightness and hue. Never zero, so the slider\n // always has a range to divide by.\n max: (color) => Math.max(round(maxChroma(color.h, color.l), 4), 0.001),\n step: 0.001,\n value: (color) => round(toOklch(color).c, 4),\n apply: (color, value) => {\n const { l, h } = toOklch(color);\n\n return fromOklch({ l, c: value, h });\n },\n stops: (color) => {\n const { l, h } = toOklch(color);\n const limit = maxChroma(color.h, color.l);\n\n return ramp(7, (position) => fromOklch({ l, c: position * limit, h }));\n },\n display: (color) => toOklch(color).c.toFixed(3),\n};\n\nfunction rgbChannel(\n key: 'r' | 'g' | 'b',\n label: string,\n title: string,\n): ColorChannel {\n const at = (color: ColorValue, value: number) =>\n fromRgb({ ...toRgb(color), [key]: value });\n\n return {\n label,\n title,\n min: 0,\n max: constant(255),\n step: 1,\n value: (color) => toRgb(color)[key],\n apply: (color, value) => {\n const next = at(color, value);\n\n // A gray has no hue of its own, and the conversion invents one. Keeping\n // the authored hue means switching back to HST or LCH resumes where the\n // user left off.\n return isAchromatic(next) ? { ...next, h: color.h } : next;\n },\n // An sRGB channel is linear in the space CSS interpolates gradients in, so\n // the two ends describe the whole ramp exactly.\n stops: (color) => ramp(2, (position) => at(color, position * 255)),\n display: (color) => `${toRgb(color)[key]}`,\n };\n}\n\nexport const CHANNELS: Record<ColorSpace, ColorChannel[]> = {\n hst: [hueChannel, saturationChannel, toneChannel],\n lch: [lightnessChannel, chromaChannel, hueChannel],\n rgb: [\n rgbChannel('r', 'R', 'Red'),\n rgbChannel('g', 'G', 'Green'),\n rgbChannel('b', 'B', 'Blue'),\n ],\n};\n"],"mappings":";;;;;;;;AAkBA,MAAa,eAAe;CAAC;CAAO;CAAO;CAAM;AAIjD,MAAa,qBAAiD;CAC5D,KAAK;CACL,KAAK;CACL,KAAK;CACN;AAED,MAAa,oBAAgD;CAC3D,KAAK;CACL,KAAK;CACL,KAAK;CACN;AAoBD,MAAM,YAAY,gBAAwB;AAE1C,SAAS,MAAM,OAAe,YAAY,GAAW;CACnD,MAAM,SAAS,MAAM;AAErB,QAAO,KAAK,MAAM,QAAQ,OAAO,GAAG;;;;;;;;;AAUtC,SAAS,KAAK,OAAe,IAA8C;AACzE,QAAO,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,GAAG,UACvC,MAAM,GAAG,SAAS,QAAQ,GAAG,CAAC,CAC/B,CAAC,KAAK,KAAK;;;;;;;;AASd,MAAM,YAAY,KAAK,KAAK,cAAc;CACxC,GAAG,WAAW;CACd,GAAG;CACH,GAAG;CACJ,EAAE;AAEH,MAAM,aAA2B;CAC/B,OAAO;CACP,OAAO;CACP,KAAK;CAGL,KAAK,SAAS,IAAI;CAClB,MAAM;CACN,QAAQ,UAAU,MAAM,MAAM,GAAG,EAAE;CACnC,QAAQ,OAAO,WAAW;EAAE,GAAG;EAAO,GAAG,aAAa,MAAM;EAAE;CAC9D,aAAa;CACb,UAAU,UAAU,GAAG,KAAK,MAAM,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,oBAAkC;CACtC,OAAO;CACP,OAAO;CACP,KAAK;CACL,KAAK,SAAS,IAAI;CAClB,MAAM;CACN,QAAQ,UAAU,MAAM,MAAM,IAAI,KAAK,EAAE;CACzC,QAAQ,OAAO,WAAW;EAAE,GAAG;EAAO,GAAG,QAAQ;EAAK;CACtD,QAAQ,UAAU,KAAK,IAAI,cAAc;EAAE,GAAG;EAAO,GAAG;EAAU,EAAE;CACpE,UAAU,UAAU,GAAG,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC;CAClD;AAED,MAAM,cAA4B;CAChC,OAAO;CACP,OAAO;CACP,KAAK;CACL,KAAK,SAAS,IAAI;CAClB,MAAM;CACN,QAAQ,UAAU,MAAM,QAAQ,MAAM,CAAC,IAAI,KAAK,EAAE;CAClD,QAAQ,OAAO,UACb,UAAU;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG,GAAG,QAAQ;EAAK,CAAC;CACvD,QAAQ,UACN,KAAK,IAAI,aAAa,UAAU;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG,GAAG;EAAU,CAAC,CAAC;CAC3E,UAAU,UAAU,GAAG,KAAK,MAAM,QAAQ,MAAM,CAAC,IAAI,IAAI,CAAC;CAC3D;AAED,MAAM,mBAAiC;CACrC,OAAO;CACP,OAAO;CACP,KAAK;CACL,KAAK,SAAS,IAAI;CAClB,MAAM;CACN,QAAQ,UAAU,MAAM,QAAQ,MAAM,CAAC,IAAI,KAAK,EAAE;CAClD,QAAQ,OAAO,UAAU;EACvB,MAAM,EAAE,GAAG,MAAM,QAAQ,MAAM;AAE/B,SAAO,UAAU;GAAE,GAAG,QAAQ;GAAK;GAAG;GAAG,CAAC;;CAE5C,QAAQ,UAAU;EAChB,MAAM,EAAE,GAAG,MAAM,QAAQ,MAAM;AAE/B,SAAO,KAAK,IAAI,aAAa,UAAU;GAAE,GAAG;GAAU;GAAG;GAAG,CAAC,CAAC;;CAEhE,UAAU,UAAU,GAAG,KAAK,MAAM,QAAQ,MAAM,CAAC,IAAI,IAAI,CAAC;CAC3D;AAED,MAAM,gBAA8B;CAClC,OAAO;CACP,OAAO;CACP,KAAK;CAIL,MAAM,UAAU,KAAK,IAAI,MAAM,UAAU,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,KAAM;CACtE,MAAM;CACN,QAAQ,UAAU,MAAM,QAAQ,MAAM,CAAC,GAAG,EAAE;CAC5C,QAAQ,OAAO,UAAU;EACvB,MAAM,EAAE,GAAG,MAAM,QAAQ,MAAM;AAE/B,SAAO,UAAU;GAAE;GAAG,GAAG;GAAO;GAAG,CAAC;;CAEtC,QAAQ,UAAU;EAChB,MAAM,EAAE,GAAG,MAAM,QAAQ,MAAM;EAC/B,MAAM,QAAQ,UAAU,MAAM,GAAG,MAAM,EAAE;AAEzC,SAAO,KAAK,IAAI,aAAa,UAAU;GAAE;GAAG,GAAG,WAAW;GAAO;GAAG,CAAC,CAAC;;CAExE,UAAU,UAAU,QAAQ,MAAM,CAAC,EAAE,QAAQ,EAAE;CAChD;AAED,SAAS,WACP,KACA,OACA,OACc;CACd,MAAM,MAAM,OAAmB,UAC7B,QAAQ;EAAE,GAAG,MAAM,MAAM;GAAG,MAAM;EAAO,CAAC;AAE5C,QAAO;EACL;EACA;EACA,KAAK;EACL,KAAK,SAAS,IAAI;EAClB,MAAM;EACN,QAAQ,UAAU,MAAM,MAAM,CAAC;EAC/B,QAAQ,OAAO,UAAU;GACvB,MAAM,OAAO,GAAG,OAAO,MAAM;AAK7B,UAAO,aAAa,KAAK,GAAG;IAAE,GAAG;IAAM,GAAG,MAAM;IAAG,GAAG;;EAIxD,QAAQ,UAAU,KAAK,IAAI,aAAa,GAAG,OAAO,WAAW,IAAI,CAAC;EAClE,UAAU,UAAU,GAAG,MAAM,MAAM,CAAC;EACrC;;AAGH,MAAa,WAA+C;CAC1D,KAAK;EAAC;EAAY;EAAmB;EAAY;CACjD,KAAK;EAAC;EAAkB;EAAe;EAAW;CAClD,KAAK;EACH,WAAW,KAAK,KAAK,MAAM;EAC3B,WAAW,KAAK,KAAK,QAAQ;EAC7B,WAAW,KAAK,KAAK,OAAO;EAC7B;CACF"}
@@ -1,15 +0,0 @@
1
-
2
- import "@tenphi/glaze";
3
-
4
- //#region src/components/fields/ColorPicker/color.d.ts
5
- /**
6
- * Every color format the picker can read and write.
7
- *
8
- * `okhsl` and `okhst` are Glaze / Tasty spaces rather than native CSS ones,
9
- * but Tasty parses both, so the produced strings are usable as style values.
10
- */
11
- declare const COLOR_FORMATS: readonly ["hex", "rgb", "hsl", "okhsl", "okhst", "oklch"];
12
- type ColorFormat = (typeof COLOR_FORMATS)[number];
13
- //#endregion
14
- export { COLOR_FORMATS, ColorFormat };
15
- //# sourceMappingURL=color.d.ts.map