@cube-dev/ui-kit 0.155.0 → 0.156.0

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 (521) hide show
  1. package/dist/CHANGELOG.md +64 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.d.ts +10 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +4 -3
  25. package/dist/components/actions/CommandMenu/CommandMenu.js.map +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.js +1 -1
  89. package/dist/components/content/TextItem/TextItem.js +1 -1
  90. package/dist/components/content/Title.js +1 -1
  91. package/dist/components/content/Tree/Tree.js +1 -1
  92. package/dist/components/content/Tree/TreeNode.js +1 -1
  93. package/dist/components/content/Tree/styled.js +1 -1
  94. package/dist/components/content/Tree/tree-index.js +1 -1
  95. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  96. package/dist/components/content/Tree/use-load-data.js +1 -1
  97. package/dist/components/content/highlightText.js +1 -1
  98. package/dist/components/content/use-auto-tooltip.js +1 -1
  99. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  100. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  101. package/dist/components/fields/Checkbox/context.js +1 -1
  102. package/dist/components/fields/ColorPicker/ColorPicker.d.ts +67 -0
  103. package/dist/components/fields/ColorPicker/ColorPicker.js +240 -0
  104. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -0
  105. package/dist/components/fields/ColorPicker/ColorPickerPanel.js +149 -0
  106. package/dist/components/fields/ColorPicker/ColorPickerPanel.js.map +1 -0
  107. package/dist/components/fields/ColorPicker/channels.d.ts +13 -0
  108. package/dist/components/fields/ColorPicker/channels.js +194 -0
  109. package/dist/components/fields/ColorPicker/channels.js.map +1 -0
  110. package/dist/components/fields/ColorPicker/color.d.ts +15 -0
  111. package/dist/components/fields/ColorPicker/color.js +282 -0
  112. package/dist/components/fields/ColorPicker/color.js.map +1 -0
  113. package/dist/components/fields/ColorPicker/index.d.ts +4 -0
  114. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  115. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  116. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  117. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  118. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  119. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  120. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  121. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  122. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  123. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  124. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  125. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  126. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  127. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  128. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  129. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  130. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  131. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  132. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  133. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  134. package/dist/components/fields/DatePicker/period.js +1 -1
  135. package/dist/components/fields/DatePicker/props.js +1 -1
  136. package/dist/components/fields/DatePicker/utils.js +1 -1
  137. package/dist/components/fields/FileInput/FileInput.js +1 -1
  138. package/dist/components/fields/FilterListBox/FilterListBox.d.ts +3 -3
  139. package/dist/components/fields/FilterListBox/FilterListBox.js +7 -6
  140. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  141. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  142. package/dist/components/fields/Input/Input.js +1 -1
  143. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  144. package/dist/components/fields/ListBox/ListBox.js +1 -1
  145. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  146. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  147. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  148. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  149. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  150. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  151. package/dist/components/fields/Picker/Picker.js +1 -1
  152. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  153. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  154. package/dist/components/fields/RadioGroup/context.js +1 -1
  155. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  156. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  157. package/dist/components/fields/Select/Select.js +1 -1
  158. package/dist/components/fields/Slider/Gradation.js +1 -1
  159. package/dist/components/fields/Slider/HueSlider.js +1 -1
  160. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  161. package/dist/components/fields/Slider/Slider.js +1 -1
  162. package/dist/components/fields/Slider/SliderBase.js +1 -1
  163. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  164. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  165. package/dist/components/fields/Slider/elements.js +1 -1
  166. package/dist/components/fields/Slider/index.js +1 -1
  167. package/dist/components/fields/Switch/Switch.js +1 -1
  168. package/dist/components/fields/TextArea/TextArea.js +1 -1
  169. package/dist/components/fields/TextInput/TextInput.js +1 -1
  170. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  171. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  172. package/dist/components/fields/index.d.ts +4 -0
  173. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  174. package/dist/components/form/Form/Field.js +1 -1
  175. package/dist/components/form/Form/Form.js +1 -1
  176. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  177. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  178. package/dist/components/form/Form/SubmitError.js +1 -1
  179. package/dist/components/form/Form/index.js +1 -1
  180. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  181. package/dist/components/form/Form/use-field/use-field.js +1 -1
  182. package/dist/components/form/Form/use-form.js +1 -1
  183. package/dist/components/form/Form/validation.js +1 -1
  184. package/dist/components/form/Label.js +1 -1
  185. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  186. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  187. package/dist/components/form/validation/use-validation-props.js +1 -1
  188. package/dist/components/form/wrapper.js +1 -1
  189. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  190. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  191. package/dist/components/layout/Board/Board.d.ts +55 -1
  192. package/dist/components/layout/Board/Board.js +278 -75
  193. package/dist/components/layout/Board/Board.js.map +1 -1
  194. package/dist/components/layout/Board/BoardProvider.js +1 -1
  195. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  196. package/dist/components/layout/Board/Widget.d.ts +16 -0
  197. package/dist/components/layout/Board/Widget.js +6 -3
  198. package/dist/components/layout/Board/Widget.js.map +1 -1
  199. package/dist/components/layout/Board/WidgetHost.js +81 -14
  200. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  201. package/dist/components/layout/Board/board-context.js +1 -1
  202. package/dist/components/layout/Board/board-context.js.map +1 -1
  203. package/dist/components/layout/Board/board-store.js +2 -2
  204. package/dist/components/layout/Board/board-store.js.map +1 -1
  205. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  206. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  207. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  208. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  209. package/dist/components/layout/Board/grid-core/group-move.js +132 -0
  210. package/dist/components/layout/Board/grid-core/group-move.js.map +1 -0
  211. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  212. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  213. package/dist/components/layout/Board/index.d.ts +2 -1
  214. package/dist/components/layout/Board/index.js +2 -2
  215. package/dist/components/layout/Board/index.js.map +1 -1
  216. package/dist/components/layout/Board/responsive-utils.js +1 -1
  217. package/dist/components/layout/Board/use-board-layout.js +17 -12
  218. package/dist/components/layout/Board/use-board-layout.js.map +1 -1
  219. package/dist/components/layout/Board/use-board-registry.js +139 -20
  220. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  221. package/dist/components/layout/Board/use-board-select-modifier-key.js +24 -0
  222. package/dist/components/layout/Board/use-board-select-modifier-key.js.map +1 -0
  223. package/dist/components/layout/Board/use-board-selection.d.ts +8 -0
  224. package/dist/components/layout/Board/use-board-selection.js +113 -0
  225. package/dist/components/layout/Board/use-board-selection.js.map +1 -0
  226. package/dist/components/layout/Flex.js +1 -1
  227. package/dist/components/layout/Flow.js +1 -1
  228. package/dist/components/layout/Grid.js +1 -1
  229. package/dist/components/layout/Panel.js +1 -1
  230. package/dist/components/layout/Prefix.js +1 -1
  231. package/dist/components/layout/ResizablePanel.js +1 -1
  232. package/dist/components/layout/Space.js +1 -1
  233. package/dist/components/layout/Suffix.js +1 -1
  234. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  235. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  236. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  237. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  238. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  239. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  240. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  241. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  242. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  243. package/dist/components/navigation/Tabs/styled.js +1 -1
  244. package/dist/components/navigation/Tabs/types.js +1 -1
  245. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  246. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  247. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  248. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  249. package/dist/components/other/Calendar/Calendar.js +1 -1
  250. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  251. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  252. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  253. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  254. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  255. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  256. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  257. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  258. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  259. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  260. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  261. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  262. package/dist/components/overlays/Dialog/context.js +1 -1
  263. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  264. package/dist/components/overlays/Modal/Modal.js +1 -1
  265. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  266. package/dist/components/overlays/Modal/Overlay.js +1 -1
  267. package/dist/components/overlays/Modal/Popover.js +1 -1
  268. package/dist/components/overlays/Modal/Tray.js +1 -1
  269. package/dist/components/overlays/Modal/Underlay.js +1 -1
  270. package/dist/components/overlays/Notifications/Notification.js +1 -1
  271. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  272. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  273. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  274. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  275. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  276. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  277. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  278. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  279. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  280. package/dist/components/overlays/Notifications/index.js +1 -1
  281. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  282. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  283. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  284. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  285. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  286. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  287. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  288. package/dist/components/overlays/Toast/index.js +1 -1
  289. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  290. package/dist/components/overlays/Toast/useToast.js +1 -1
  291. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  292. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  293. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  294. package/dist/components/overlays/Tooltip/context.js +1 -1
  295. package/dist/components/portal/Portal.js +1 -1
  296. package/dist/components/portal/PortalProvider.js +1 -1
  297. package/dist/components/portal/usePortal.js +1 -1
  298. package/dist/components/shared/DraggableCollection.js +1 -1
  299. package/dist/components/shared/InvalidIcon.js +1 -1
  300. package/dist/components/shared/ValidIcon.js +1 -1
  301. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  302. package/dist/components/status/Spin/Cube.js +1 -1
  303. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  304. package/dist/components/status/Spin/Spin.js +1 -1
  305. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  306. package/dist/data/item-themes.js +1 -1
  307. package/dist/data/themes.js +1 -1
  308. package/dist/eslint-plugin/defaults.generated.js +9 -1
  309. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  310. package/dist/eslint-plugin/index.js +1 -1
  311. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  312. package/dist/i18n/I18nProvider.js +1 -1
  313. package/dist/i18n/createFormatter.js +1 -1
  314. package/dist/i18n/index.js +1 -1
  315. package/dist/i18n/instance.js +1 -1
  316. package/dist/i18n/locales/de-DE/uikit.js +9 -1
  317. package/dist/i18n/locales/en-US/uikit.js +9 -1
  318. package/dist/i18n/locales/en-US/uikit.json.d.ts +9 -1
  319. package/dist/i18n/locales/es-ES/uikit.js +9 -1
  320. package/dist/i18n/locales/es-MX/uikit.js +9 -1
  321. package/dist/i18n/locales/fr-FR/uikit.js +9 -1
  322. package/dist/i18n/locales/it-IT/uikit.js +9 -1
  323. package/dist/i18n/locales/ja-JP/uikit.js +9 -1
  324. package/dist/i18n/locales/nb-NO/uikit.js +9 -1
  325. package/dist/i18n/locales/pt-BR/uikit.js +9 -1
  326. package/dist/i18n/locales/pt-PT/uikit.js +9 -1
  327. package/dist/i18n/locales/sv-SE/uikit.js +9 -1
  328. package/dist/i18n/locales/vi-VN/uikit.js +9 -1
  329. package/dist/i18n/locales.js +1 -1
  330. package/dist/i18n/useFormatter.js +1 -1
  331. package/dist/i18n/useI18n.js +1 -1
  332. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  333. package/dist/icons/AdjustmentsIcon.js +1 -1
  334. package/dist/icons/AiIcon.js +1 -1
  335. package/dist/icons/AreaChartIcon.js +1 -1
  336. package/dist/icons/BackwardIcon.js +1 -1
  337. package/dist/icons/BarChartIcon.js +1 -1
  338. package/dist/icons/BellFilledIcon.js +1 -1
  339. package/dist/icons/BellIcon.js +1 -1
  340. package/dist/icons/BooleanIcon.js +1 -1
  341. package/dist/icons/CalendarEditIcon.js +1 -1
  342. package/dist/icons/CalendarIcon.js +1 -1
  343. package/dist/icons/CaretDownIcon.js +1 -1
  344. package/dist/icons/CaretUpIcon.js +1 -1
  345. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  346. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  347. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  348. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  349. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  350. package/dist/icons/ChartBarLineIcon.js +1 -1
  351. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  352. package/dist/icons/ChartBarStackedIcon.js +1 -1
  353. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  354. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  355. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  356. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  357. package/dist/icons/ChartBubbleIcon.js +1 -1
  358. package/dist/icons/ChartDonut2Icon.js +1 -1
  359. package/dist/icons/ChartFunnelIcon.js +1 -1
  360. package/dist/icons/ChartHeatmapIcon.js +1 -1
  361. package/dist/icons/ChartKPIIcon.js +1 -1
  362. package/dist/icons/ChartPie2Icon.js +1 -1
  363. package/dist/icons/ChartScatterIcon.js +1 -1
  364. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  365. package/dist/icons/CheckCircleIcon.js +1 -1
  366. package/dist/icons/CheckIcon.js +1 -1
  367. package/dist/icons/CircleFilledIcon.js +1 -1
  368. package/dist/icons/ClearIcon.js +1 -1
  369. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  370. package/dist/icons/CloseCircleIcon.js +1 -1
  371. package/dist/icons/CloseIcon.js +1 -1
  372. package/dist/icons/CodeIcon.js +1 -1
  373. package/dist/icons/ColumnTotalIcon.js +1 -1
  374. package/dist/icons/CopyIcon.js +1 -1
  375. package/dist/icons/CountIcon.js +1 -1
  376. package/dist/icons/CubeIcon.js +1 -1
  377. package/dist/icons/CubePauseIcon.js +1 -1
  378. package/dist/icons/CubePlayIcon.js +1 -1
  379. package/dist/icons/CurrencyDollarIcon.js +1 -1
  380. package/dist/icons/DangerIcon.js +1 -1
  381. package/dist/icons/DashboardIcon.js +1 -1
  382. package/dist/icons/DatabaseIcon.js +1 -1
  383. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  384. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  385. package/dist/icons/DirectionIcon.js +1 -1
  386. package/dist/icons/DonutIcon.js +1 -1
  387. package/dist/icons/DownIcon.js +1 -1
  388. package/dist/icons/EditIcon.js +1 -1
  389. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  390. package/dist/icons/ExclamationCircleIcon.js +1 -1
  391. package/dist/icons/ExclamationIcon.js +1 -1
  392. package/dist/icons/EyeIcon.js +1 -1
  393. package/dist/icons/EyeInvisibleIcon.js +1 -1
  394. package/dist/icons/FilterIcon.js +1 -1
  395. package/dist/icons/FolderFilledIcon.js +1 -1
  396. package/dist/icons/FolderIcon.js +1 -1
  397. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  398. package/dist/icons/FolderOpenIcon.js +1 -1
  399. package/dist/icons/ForwardIcon.js +1 -1
  400. package/dist/icons/GripVerticalIcon.js +1 -1
  401. package/dist/icons/HierarchyIcon.js +1 -1
  402. package/dist/icons/HierarchyOpenIcon.js +1 -1
  403. package/dist/icons/Icon.js +1 -1
  404. package/dist/icons/InfoCircleIcon.js +1 -1
  405. package/dist/icons/InfoIcon.js +1 -1
  406. package/dist/icons/KeyIcon.js +1 -1
  407. package/dist/icons/LeftIcon.js +1 -1
  408. package/dist/icons/LineChartIcon.js +1 -1
  409. package/dist/icons/LoadingIcon.js +1 -1
  410. package/dist/icons/LockFilledIcon.js +1 -1
  411. package/dist/icons/LockIcon.js +1 -1
  412. package/dist/icons/MoreIcon.js +1 -1
  413. package/dist/icons/NotAllowedIcon.js +1 -1
  414. package/dist/icons/Number123Icon.js +1 -1
  415. package/dist/icons/NumberIcon.js +1 -1
  416. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  417. package/dist/icons/PauseCircleIcon.js +1 -1
  418. package/dist/icons/PauseIcon.js +1 -1
  419. package/dist/icons/PercentageIcon.js +1 -1
  420. package/dist/icons/PieChartIcon.js +1 -1
  421. package/dist/icons/PipetteIcon.d.ts +12 -0
  422. package/dist/icons/PipetteIcon.js +11 -0
  423. package/dist/icons/PipetteIcon.js.map +1 -0
  424. package/dist/icons/PlayCircleIcon.js +1 -1
  425. package/dist/icons/PlayIcon.js +1 -1
  426. package/dist/icons/PlusIcon.js +1 -1
  427. package/dist/icons/ProgressBarIcon.js +1 -1
  428. package/dist/icons/ReloadIcon.js +1 -1
  429. package/dist/icons/ReportIcon.js +1 -1
  430. package/dist/icons/ReturnIcon.js +1 -1
  431. package/dist/icons/RightIcon.js +1 -1
  432. package/dist/icons/RowTotalsIcon.js +1 -1
  433. package/dist/icons/SchemeIcon.js +1 -1
  434. package/dist/icons/SearchIcon.js +1 -1
  435. package/dist/icons/SemanticQueryIcon.js +1 -1
  436. package/dist/icons/SettingsIcon.js +1 -1
  437. package/dist/icons/ShieldFilledIcon.js +1 -1
  438. package/dist/icons/ShieldIcon.js +1 -1
  439. package/dist/icons/SlashIcon.js +1 -1
  440. package/dist/icons/SparklesIcon.js +1 -1
  441. package/dist/icons/SqlIcon.js +1 -1
  442. package/dist/icons/StatsIcon.js +1 -1
  443. package/dist/icons/StopIcon.js +1 -1
  444. package/dist/icons/StringIcon.js +1 -1
  445. package/dist/icons/SubtotalsIcon.js +1 -1
  446. package/dist/icons/SwitchIcon.js +1 -1
  447. package/dist/icons/TableIcon.js +1 -1
  448. package/dist/icons/ThumbsDownIcon.js +1 -1
  449. package/dist/icons/ThumbsUpIcon.js +1 -1
  450. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  451. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  452. package/dist/icons/ThunderboltIcon.js +1 -1
  453. package/dist/icons/TimeIcon.js +1 -1
  454. package/dist/icons/TrashIcon.js +1 -1
  455. package/dist/icons/UnlockIcon.js +1 -1
  456. package/dist/icons/UpIcon.js +1 -1
  457. package/dist/icons/UserGroupIcon.js +1 -1
  458. package/dist/icons/UserIcon.js +1 -1
  459. package/dist/icons/UserLockIcon.js +1 -1
  460. package/dist/icons/ViewIcon.js +1 -1
  461. package/dist/icons/WarningFilledIcon.js +1 -1
  462. package/dist/icons/WarningIcon.js +1 -1
  463. package/dist/icons/index.d.ts +1 -0
  464. package/dist/icons/wrap-icon.js +1 -1
  465. package/dist/index.d.ts +7 -2
  466. package/dist/index.js +13 -8
  467. package/dist/index.js.map +1 -1
  468. package/dist/provider.js +1 -1
  469. package/dist/providers/TrackingProvider.js +1 -1
  470. package/dist/providers/navigationAdapter.default.js +1 -1
  471. package/dist/tokens/base.js +1 -1
  472. package/dist/tokens/colors.js +1 -1
  473. package/dist/tokens/index.js +1 -1
  474. package/dist/tokens/layout.js +1 -1
  475. package/dist/tokens/lazy-styles.js +1 -1
  476. package/dist/tokens/palette-config.js +1 -1
  477. package/dist/tokens/palette.js +1 -1
  478. package/dist/tokens/shadows.js +1 -1
  479. package/dist/tokens/sizes.js +1 -1
  480. package/dist/tokens/spacing.js +1 -1
  481. package/dist/tokens/typography.js +1 -1
  482. package/dist/utils/ResizeSensor.js +1 -1
  483. package/dist/utils/is-dev-env.js +1 -1
  484. package/dist/utils/modules.js +1 -1
  485. package/dist/utils/promise.js +1 -1
  486. package/dist/utils/raf.js +1 -1
  487. package/dist/utils/random.js +1 -1
  488. package/dist/utils/range.js +1 -1
  489. package/dist/utils/react/RenderCache.js +1 -1
  490. package/dist/utils/react/Slots.js +1 -1
  491. package/dist/utils/react/chain.js +1 -1
  492. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  493. package/dist/utils/react/index.js +1 -1
  494. package/dist/utils/react/interactions.js +1 -1
  495. package/dist/utils/react/isTextOnly.js +1 -1
  496. package/dist/utils/react/mapProps.js +1 -1
  497. package/dist/utils/react/mergeProps.js +1 -1
  498. package/dist/utils/react/nullableValue.js +1 -1
  499. package/dist/utils/react/resolveIcon.js +1 -1
  500. package/dist/utils/react/sharedStore.js +1 -1
  501. package/dist/utils/react/useCombinedRefs.js +1 -1
  502. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  503. package/dist/utils/react/useEventBus.js +1 -1
  504. package/dist/utils/react/useId.js +1 -1
  505. package/dist/utils/react/useIsDarwin.js +1 -1
  506. package/dist/utils/react/useKeySymbols.js +1 -1
  507. package/dist/utils/react/useLayoutEffect.js +1 -1
  508. package/dist/utils/react/useLocalStorage.js +1 -1
  509. package/dist/utils/react/useMergeStyles.js +1 -1
  510. package/dist/utils/react/usePopoverSync.js +1 -1
  511. package/dist/utils/react/useQaProps.js +1 -1
  512. package/dist/utils/react/useViewportSize.js +1 -1
  513. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  514. package/dist/utils/selection.js +1 -1
  515. package/dist/utils/styles.js +1 -1
  516. package/dist/utils/tree.js +1 -1
  517. package/dist/utils/warnings.js +1 -1
  518. package/dist/version.js +2 -2
  519. package/docs/components/fields/ColorPicker.md +271 -0
  520. package/docs/components/layout/Board.md +154 -6
  521. package/package.json +1 -1
@@ -0,0 +1,240 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.156.0 | Cube Dev Team */
2
+ import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
+ import { useEvent } from "../../../_internal/hooks/use-event.js";
4
+ import { ItemAction } from "../../actions/ItemAction/ItemAction.js";
5
+ import { PipetteIcon } from "../../../icons/PipetteIcon.js";
6
+ import { useFieldProps } from "../../form/Form/use-field/use-field-props.js";
7
+ import { Dialog } from "../../overlays/Dialog/Dialog.js";
8
+ import { DialogTrigger } from "../../overlays/Dialog/DialogTrigger.js";
9
+ import { TextInputBase } from "../TextInput/TextInputBase.js";
10
+ import { detectFormat, formatColor, parseColor, toHex } from "./color.js";
11
+ import { ColorPickerPanel } from "./ColorPickerPanel.js";
12
+ import { tasty } from "@tenphi/tasty";
13
+ import { forwardRef, useEffect, useRef, useState } from "react";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ import { useTextField } from "react-aria";
16
+
17
+ //#region src/components/fields/ColorPicker/ColorPicker.tsx
18
+ /** What the popover starts from when there is no color to edit yet. */
19
+ const FALLBACK_COLOR = {
20
+ h: 264,
21
+ s: .8,
22
+ l: .6
23
+ };
24
+ const SwatchElement = tasty({
25
+ qa: "ColorSwatch",
26
+ styles: {
27
+ display: "block",
28
+ width: "2.5x",
29
+ height: "2.5x",
30
+ radius: "1r",
31
+ fill: {
32
+ "": "(#color-picker, #clear)",
33
+ empty: "#clear"
34
+ },
35
+ shadow: "inset 0 0 0 1bw #dark.15",
36
+ image: {
37
+ "": false,
38
+ empty: "linear-gradient(to bottom right, #clear 46%, #danger 46%, #danger 54%, #clear 54%)"
39
+ }
40
+ }
41
+ });
42
+ const ColorPickerButton = tasty(ItemAction, {
43
+ qa: "ColorPickerButton",
44
+ icon: /* @__PURE__ */ jsx(PipetteIcon, {})
45
+ });
46
+ /**
47
+ * A color field: the color as text, a swatch of the current value, and a
48
+ * popover to dial it in across OKHST, OKLCH and RGB.
49
+ */
50
+ const ColorPicker = forwardRef(function ColorPicker(allProps, ref) {
51
+ const props = useFieldProps(allProps, {
52
+ defaultValidationTrigger: "onBlur",
53
+ valuePropsMapper: ({ value, onChange }) => ({
54
+ value,
55
+ onChange
56
+ })
57
+ });
58
+ const { qa, value, defaultValue, onChange, format = "hex", formatMode = "forced", defaultSpace = "hst", isOpen: controlledOpen, defaultOpen, onOpenChange, shouldFlip, placeholder = "Pick a color", size, isDisabled, isReadOnly, isInvalid, isValid, isLoading, autoFocus, inputStyles, triggerStyles, swatchStyles, labelProps: userLabelProps, onBlur: userOnBlur, onFocus, label, description, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby, id } = props;
59
+ const initialText = (value ?? defaultValue ?? "").toString();
60
+ const [text, setText] = useState(() => {
61
+ const parsed = parseColor(initialText);
62
+ return parsed && formatMode === "forced" ? formatColor(parsed, format) : initialText;
63
+ });
64
+ const [color, setColor] = useState(() => parseColor(initialText));
65
+ const [space, setSpace] = useState(defaultSpace);
66
+ const [isOpen, setOpen] = useState(defaultOpen ?? false);
67
+ const targetRef = useRef(null);
68
+ const inputRef = useRef(null);
69
+ /** The last text that parsed, so an invalid entry has something to fall back to. */
70
+ const validText = useRef(parseColor(initialText) ? text : "");
71
+ /** What was last handed to `onChange`, to tell our own updates from outside ones. */
72
+ const emitted = useRef(value);
73
+ const emit = useEvent((next) => {
74
+ emitted.current = next;
75
+ onChange?.(next);
76
+ });
77
+ /** The notation a value should be written in, given the current text. */
78
+ const outputFormat = (source) => formatMode === "forced" ? format : detectFormat(source) ?? format;
79
+ useEffect(() => {
80
+ if (value === void 0 || value === emitted.current) return;
81
+ emitted.current = value;
82
+ const raw = (value ?? "").toString();
83
+ const parsed = parseColor(raw);
84
+ const nextText = parsed && formatMode === "forced" ? formatColor(parsed, format) : raw;
85
+ setColor(parsed);
86
+ setText(nextText);
87
+ validText.current = parsed ? nextText : "";
88
+ }, [
89
+ value,
90
+ format,
91
+ formatMode
92
+ ]);
93
+ const handleTextChange = useEvent((nextText) => {
94
+ setText(nextText);
95
+ if (!nextText.trim()) {
96
+ setColor(null);
97
+ validText.current = "";
98
+ emit(null);
99
+ return;
100
+ }
101
+ const parsed = parseColor(nextText);
102
+ if (!parsed) return;
103
+ setColor(parsed);
104
+ validText.current = nextText;
105
+ emit(formatMode === "free" ? nextText.trim() : formatColor(parsed, outputFormat(nextText)));
106
+ });
107
+ /** Resolve whatever is in the input into a real color, or undo it. */
108
+ const settle = useEvent(() => {
109
+ if (!text.trim()) return;
110
+ const parsed = parseColor(text);
111
+ if (!parsed) {
112
+ setText(validText.current);
113
+ return;
114
+ }
115
+ if (formatMode === "forced") setText(formatColor(parsed, format));
116
+ });
117
+ /**
118
+ * Focusing offers the whole value up for replacement, the way a hex field
119
+ * does. The string is the unit of editing here: a single channel is tuned
120
+ * with the sliders, not by hand-editing one number inside `oklch(…)`.
121
+ *
122
+ * Read off the event rather than `inputRef`, which `TextInputBase` re-points
123
+ * through `useCombinedRefs`.
124
+ */
125
+ const handleFocus = useEvent((event) => {
126
+ event.currentTarget.select();
127
+ onFocus?.(event);
128
+ });
129
+ /**
130
+ * A click would otherwise drop a caret and undo that selection — the browser
131
+ * applies it after the focus handler has run. Suppressing the default action
132
+ * of the focusing press means no caret is ever placed; focus is then moved
133
+ * here instead, which selects.
134
+ *
135
+ * Only the press that *takes* focus is suppressed, so clicking a field that
136
+ * already has focus still positions the caret, and dragging still selects a
137
+ * range.
138
+ */
139
+ const handleMouseDown = useEvent((event) => {
140
+ if (document.activeElement === event.currentTarget) return;
141
+ event.preventDefault();
142
+ event.currentTarget.focus();
143
+ });
144
+ const handleBlur = useEvent((event) => {
145
+ settle();
146
+ userOnBlur?.(event);
147
+ });
148
+ const handleKeyDown = useEvent((event) => {
149
+ if (event.key === "Enter") settle();
150
+ });
151
+ const handleColorChange = useEvent((nextColor) => {
152
+ const nextText = formatColor(nextColor, outputFormat(text));
153
+ setColor(nextColor);
154
+ setText(nextText);
155
+ validText.current = nextText;
156
+ emit(nextText);
157
+ });
158
+ const handleOpenChange = useEvent((next) => {
159
+ setOpen(next);
160
+ onOpenChange?.(next);
161
+ });
162
+ const { labelProps, inputProps } = useTextField({
163
+ id,
164
+ label,
165
+ description,
166
+ "aria-label": ariaLabel,
167
+ "aria-labelledby": ariaLabelledby,
168
+ "aria-describedby": ariaDescribedby,
169
+ isDisabled,
170
+ isReadOnly,
171
+ isInvalid,
172
+ autoFocus,
173
+ placeholder,
174
+ value: text,
175
+ type: "text",
176
+ onChange: handleTextChange,
177
+ onFocus: handleFocus,
178
+ onBlur: handleBlur,
179
+ onKeyDown: handleKeyDown
180
+ }, inputRef);
181
+ return /* @__PURE__ */ jsx(TextInputBase, {
182
+ ...props,
183
+ ref,
184
+ qa: qa || "ColorPicker",
185
+ size,
186
+ autocomplete: "off",
187
+ icon: /* @__PURE__ */ jsx(SwatchElement, {
188
+ mods: { empty: !color },
189
+ styles: swatchStyles,
190
+ style: color ? { "--color-picker-color": toHex(color) } : void 0
191
+ }),
192
+ inputRef,
193
+ inputProps: {
194
+ ...inputProps,
195
+ spellCheck: false,
196
+ onMouseDown: handleMouseDown
197
+ },
198
+ inputStyles,
199
+ labelProps: mergeProps$1(labelProps, userLabelProps),
200
+ wrapperRef: targetRef,
201
+ isDisabled,
202
+ isReadOnly,
203
+ isInvalid,
204
+ isValid,
205
+ isLoading,
206
+ suffixPosition: "after",
207
+ suffix: /* @__PURE__ */ jsxs(DialogTrigger, {
208
+ hideArrow: true,
209
+ type: "popover",
210
+ mobileType: "tray",
211
+ placement: "bottom right",
212
+ targetRef,
213
+ isOpen: controlledOpen ?? isOpen,
214
+ shouldFlip,
215
+ onOpenChange: handleOpenChange,
216
+ children: [/* @__PURE__ */ jsx(ColorPickerButton, {
217
+ size,
218
+ "aria-label": "Open the color picker",
219
+ isDisabled: isDisabled || isReadOnly,
220
+ styles: triggerStyles
221
+ }), /* @__PURE__ */ jsx(Dialog, {
222
+ "aria-label": "Color picker",
223
+ width: "max-content",
224
+ children: /* @__PURE__ */ jsx(ColorPickerPanel, {
225
+ color: color ?? FALLBACK_COLOR,
226
+ space,
227
+ isDisabled: isDisabled || isReadOnly,
228
+ previewFormat: outputFormat(text),
229
+ onChange: handleColorChange,
230
+ onSpaceChange: setSpace
231
+ })
232
+ })]
233
+ })
234
+ });
235
+ });
236
+ ColorPicker.cubeInputType = "Text";
237
+
238
+ //#endregion
239
+ export { ColorPicker };
240
+ //# sourceMappingURL=ColorPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPicker.js","names":["mergeProps"],"sources":["../../../../src/components/fields/ColorPicker/ColorPicker.tsx"],"sourcesContent":["import {\n BaseProps,\n BaseStyleProps,\n BlockStyleProps,\n ColorStyleProps,\n OuterStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n FocusEvent,\n ForwardedRef,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useTextField } from 'react-aria';\n\nimport { useEvent } from '../../../_internal';\nimport { PipetteIcon } from '../../../icons';\nimport { FieldBaseProps } from '../../../shared';\nimport { mergeProps } from '../../../utils/react';\nimport { ItemAction } from '../../actions';\nimport { useFieldProps } from '../../form';\nimport { Dialog, DialogTrigger } from '../../overlays/Dialog';\nimport { TextInputBase } from '../TextInput/TextInputBase';\n\nimport { ColorSpace } from './channels';\nimport {\n ColorFormat,\n ColorValue,\n detectFormat,\n formatColor,\n parseColor,\n toHex,\n} from './color';\nimport { ColorPickerPanel } from './ColorPickerPanel';\n\n/**\n * How the text in the input relates to the committed value.\n *\n * - `forced` — the text is rewritten in `format` whenever it is not mid-edit,\n * and the value is always written in `format`.\n * - `derive` — the user's own notation is left alone, and the value is\n * normalized in whichever notation the text is written in.\n * - `free` — the text *is* the value, verbatim. It is still verified, so an\n * unparsable entry falls back to the last valid one.\n */\nexport type ColorPickerFormatMode = 'forced' | 'derive' | 'free';\n\n/** What the popover starts from when there is no color to edit yet. */\nconst FALLBACK_COLOR: ColorValue = { h: 264, s: 0.8, l: 0.6 };\n\nconst SwatchElement = tasty({\n qa: 'ColorSwatch',\n styles: {\n display: 'block',\n width: '2.5x',\n height: '2.5x',\n radius: '1r',\n fill: {\n '': '(#color-picker, #clear)',\n empty: '#clear',\n },\n shadow: 'inset 0 0 0 1bw #dark.15',\n // A single diagonal stroke is the conventional \"no color\" swatch.\n image: {\n '': false,\n empty:\n 'linear-gradient(to bottom right, #clear 46%, #danger 46%, #danger 54%, #clear 54%)',\n },\n },\n});\n\nconst ColorPickerButton = tasty(ItemAction, {\n qa: 'ColorPickerButton',\n icon: <PipetteIcon />,\n});\n\nexport interface CubeColorPickerProps\n extends BaseProps,\n BaseStyleProps,\n OuterStyleProps,\n BlockStyleProps,\n ColorStyleProps,\n FieldBaseProps {\n /** The selected color, as a color string. */\n value?: string | null;\n /** The initial color of an uncontrolled picker. */\n defaultValue?: string | null;\n /** Called with the normalized color string, or `null` when the field is cleared. */\n onChange?: (value: string | null) => void;\n /** Notation the value is written in, and the one `forced` mode displays. */\n format?: ColorFormat;\n /** How strictly the input text is tied to `format`. */\n formatMode?: ColorPickerFormatMode;\n /** Color concept the popover opens with. */\n defaultSpace?: ColorSpace;\n /** Whether the popover is open. Makes the disclosure controlled. */\n isOpen?: boolean;\n /** Whether the popover is open initially. */\n defaultOpen?: boolean;\n /** Called when the popover opens or closes. */\n onOpenChange?: (isOpen: boolean) => void;\n /** Whether the popover may flip to the other side of the input. */\n shouldFlip?: boolean;\n /** Text shown while the field is empty. */\n placeholder?: string;\n /** The size of the input. */\n size?: 'small' | 'medium' | 'large' | (string & {});\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n styles?: Styles;\n /** Styles of the text input element. */\n inputStyles?: Styles;\n /** Styles of the popover trigger button. */\n triggerStyles?: Styles;\n /** Styles of the color swatch shown inside the input. */\n swatchStyles?: Styles;\n}\n\n/**\n * A color field: the color as text, a swatch of the current value, and a\n * popover to dial it in across OKHST, OKLCH and RGB.\n */\nexport const ColorPicker = forwardRef(function ColorPicker(\n allProps: CubeColorPickerProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n const props = useFieldProps(allProps, {\n defaultValidationTrigger: 'onBlur',\n valuePropsMapper: ({ value, onChange }) => ({\n value: value as string | null | undefined,\n onChange,\n }),\n });\n\n const {\n qa,\n value,\n defaultValue,\n onChange,\n format = 'hex',\n formatMode = 'forced',\n defaultSpace = 'hst',\n isOpen: controlledOpen,\n defaultOpen,\n onOpenChange,\n shouldFlip,\n placeholder = 'Pick a color',\n size,\n isDisabled,\n isReadOnly,\n isInvalid,\n isValid,\n isLoading,\n autoFocus,\n inputStyles,\n triggerStyles,\n swatchStyles,\n labelProps: userLabelProps,\n onBlur: userOnBlur,\n onFocus,\n label,\n description,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n id,\n } = props;\n\n const initialText = (value ?? defaultValue ?? '').toString();\n const [text, setText] = useState(() => {\n const parsed = parseColor(initialText);\n\n return parsed && formatMode === 'forced'\n ? formatColor(parsed, format)\n : initialText;\n });\n const [color, setColor] = useState(() => parseColor(initialText));\n const [space, setSpace] = useState<ColorSpace>(defaultSpace);\n const [isOpen, setOpen] = useState(defaultOpen ?? false);\n\n const targetRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n /** The last text that parsed, so an invalid entry has something to fall back to. */\n const validText = useRef(parseColor(initialText) ? text : '');\n /** What was last handed to `onChange`, to tell our own updates from outside ones. */\n const emitted = useRef<string | null | undefined>(value);\n\n const emit = useEvent((next: string | null) => {\n emitted.current = next;\n onChange?.(next);\n });\n\n /** The notation a value should be written in, given the current text. */\n const outputFormat = (source: string): ColorFormat =>\n formatMode === 'forced' ? format : detectFormat(source) ?? format;\n\n // Adopt values that did not come from here — a form reset, or a parent that\n // overrides what the user picked.\n useEffect(() => {\n if (value === undefined || value === emitted.current) return;\n\n emitted.current = value;\n\n const raw = (value ?? '').toString();\n const parsed = parseColor(raw);\n const nextText =\n parsed && formatMode === 'forced' ? formatColor(parsed, format) : raw;\n\n setColor(parsed);\n setText(nextText);\n validText.current = parsed ? nextText : '';\n }, [value, format, formatMode]);\n\n const handleTextChange = useEvent((nextText: string) => {\n setText(nextText);\n\n if (!nextText.trim()) {\n setColor(null);\n validText.current = '';\n emit(null);\n\n return;\n }\n\n const parsed = parseColor(nextText);\n\n // Half-typed input keeps the last valid color, so the value stays a real\n // color at every keystroke.\n if (!parsed) return;\n\n setColor(parsed);\n validText.current = nextText;\n emit(\n formatMode === 'free'\n ? nextText.trim()\n : formatColor(parsed, outputFormat(nextText)),\n );\n });\n\n /** Resolve whatever is in the input into a real color, or undo it. */\n const settle = useEvent(() => {\n if (!text.trim()) return;\n\n const parsed = parseColor(text);\n\n if (!parsed) {\n setText(validText.current);\n\n return;\n }\n\n if (formatMode === 'forced') setText(formatColor(parsed, format));\n });\n\n /**\n * Focusing offers the whole value up for replacement, the way a hex field\n * does. The string is the unit of editing here: a single channel is tuned\n * with the sliders, not by hand-editing one number inside `oklch(…)`.\n *\n * Read off the event rather than `inputRef`, which `TextInputBase` re-points\n * through `useCombinedRefs`.\n */\n const handleFocus = useEvent((event: FocusEvent<HTMLInputElement>) => {\n event.currentTarget.select();\n onFocus?.(event);\n });\n\n /**\n * A click would otherwise drop a caret and undo that selection — the browser\n * applies it after the focus handler has run. Suppressing the default action\n * of the focusing press means no caret is ever placed; focus is then moved\n * here instead, which selects.\n *\n * Only the press that *takes* focus is suppressed, so clicking a field that\n * already has focus still positions the caret, and dragging still selects a\n * range.\n */\n const handleMouseDown = useEvent((event: MouseEvent<HTMLInputElement>) => {\n if (document.activeElement === event.currentTarget) return;\n\n event.preventDefault();\n event.currentTarget.focus();\n });\n\n const handleBlur = useEvent((event: FocusEvent<HTMLInputElement>) => {\n settle();\n userOnBlur?.(event);\n });\n\n const handleKeyDown = useEvent((event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') settle();\n });\n\n const handleColorChange = useEvent((nextColor: ColorValue) => {\n const nextText = formatColor(nextColor, outputFormat(text));\n\n setColor(nextColor);\n setText(nextText);\n validText.current = nextText;\n emit(nextText);\n });\n\n const handleOpenChange = useEvent((next: boolean) => {\n setOpen(next);\n onOpenChange?.(next);\n });\n\n const { labelProps, inputProps } = useTextField(\n {\n id,\n label,\n description,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n isDisabled,\n isReadOnly,\n isInvalid,\n autoFocus,\n placeholder,\n value: text,\n type: 'text',\n onChange: handleTextChange,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n },\n inputRef,\n );\n\n return (\n <TextInputBase\n {...props}\n ref={ref}\n qa={qa || 'ColorPicker'}\n size={size}\n autocomplete=\"off\"\n icon={\n <SwatchElement\n mods={{ empty: !color }}\n styles={swatchStyles}\n style={color ? { '--color-picker-color': toHex(color) } : undefined}\n />\n }\n inputRef={inputRef}\n inputProps={{\n ...inputProps,\n spellCheck: false,\n onMouseDown: handleMouseDown,\n }}\n inputStyles={inputStyles}\n labelProps={mergeProps(labelProps, userLabelProps)}\n wrapperRef={targetRef}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isInvalid={isInvalid}\n isValid={isValid}\n isLoading={isLoading}\n // The validation state reads left of the trigger, the way `DateInputBase`\n // orders it for the date pickers.\n suffixPosition=\"after\"\n suffix={\n <DialogTrigger\n hideArrow\n type=\"popover\"\n mobileType=\"tray\"\n placement=\"bottom right\"\n targetRef={targetRef}\n isOpen={controlledOpen ?? isOpen}\n shouldFlip={shouldFlip}\n onOpenChange={handleOpenChange}\n >\n <ColorPickerButton\n size={size}\n aria-label=\"Open the color picker\"\n isDisabled={isDisabled || isReadOnly}\n styles={triggerStyles}\n />\n <Dialog aria-label=\"Color picker\" width=\"max-content\">\n <ColorPickerPanel\n color={color ?? FALLBACK_COLOR}\n space={space}\n isDisabled={isDisabled || isReadOnly}\n previewFormat={outputFormat(text)}\n onChange={handleColorChange}\n onSpaceChange={setSpace}\n />\n </Dialog>\n </DialogTrigger>\n }\n />\n );\n});\n\n(ColorPicker as any).cubeInputType = 'Text';\n"],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.156.0 | Cube Dev Team */
2
+ import { useEvent } from "../../../_internal/hooks/use-event.js";
3
+ import { formatColor, getContrastingColor, toHex } from "./color.js";
4
+ import { __Radio } from "../RadioGroup/Radio.js";
5
+ import { __Slider } from "../Slider/Slider.js";
6
+ import { CHANNELS, COLOR_SPACES, COLOR_SPACE_HINTS, COLOR_SPACE_LABELS } from "./channels.js";
7
+ import { tasty } from "@tenphi/tasty";
8
+ import { useMemo } from "react";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
+
11
+ //#region src/components/fields/ColorPicker/ColorPickerPanel.tsx
12
+ const PanelElement = tasty({
13
+ qa: "ColorPickerPanel",
14
+ styles: {
15
+ display: "grid",
16
+ flow: "row",
17
+ gap: "1x",
18
+ padding: "1x",
19
+ width: "34x"
20
+ }
21
+ });
22
+ const PreviewElement = tasty({
23
+ qa: "ColorPreview",
24
+ styles: {
25
+ display: "grid",
26
+ placeItems: "center",
27
+ height: "6x",
28
+ radius: true,
29
+ preset: "s4",
30
+ fill: "(#color-picker, #clear)",
31
+ color: "(#color-picker-contrast, #dark)",
32
+ shadow: "inset 0 0 0 1bw #dark.1"
33
+ }
34
+ });
35
+ const ChannelsElement = tasty({ styles: {
36
+ display: "grid",
37
+ gridColumns: "max-content 1sf max-content",
38
+ placeItems: "center stretch",
39
+ gap: "1x"
40
+ } });
41
+ const ChannelLabelElement = tasty({ styles: {
42
+ preset: "c2",
43
+ color: "#dark-03",
44
+ textAlign: "center",
45
+ width: "2x"
46
+ } });
47
+ const ChannelTrackElement = tasty({ styles: {
48
+ display: "grid",
49
+ placeItems: "center stretch"
50
+ } });
51
+ const ChannelValueElement = tasty({ styles: {
52
+ preset: "s4",
53
+ color: "#dark-02",
54
+ textAlign: "right",
55
+ whiteSpace: "nowrap",
56
+ width: "5.5x"
57
+ } });
58
+ /**
59
+ * The gradient reaches the track through a plain custom property so the track
60
+ * keeps a single cached style rule. A color picker moves its channels
61
+ * continuously, and a fresh `styles` object per frame would emit a fresh CSS
62
+ * rule per frame.
63
+ */
64
+ const TRACK_STYLES = {
65
+ height: "1x",
66
+ top: ".5x",
67
+ radius: "1r",
68
+ fill: "#clear",
69
+ image: "$channel-gradient",
70
+ shadow: "inset 0 0 0 1bw #dark.1",
71
+ Fill: false
72
+ };
73
+ /** A ring keeps the thumb visible wherever it sits on its own gradient. */
74
+ const THUMB_STYLES = { shadow: "0 0 0 2bw #surface, 0 0 0 3bw #dark.2" };
75
+ const THUMB_TOKENS = { "#slider-thumb": "(#color-picker, #surface)" };
76
+ const SPACE_STYLES = { width: "100%" };
77
+ const TAB_STYLES = { flexGrow: 1 };
78
+ function ChannelRow({ channel, color, isDisabled, onChange }) {
79
+ const max = channel.max(color);
80
+ const handleChange = useEvent((value) => {
81
+ onChange(channel.apply(color, value));
82
+ });
83
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
84
+ /* @__PURE__ */ jsx(ChannelLabelElement, {
85
+ "aria-hidden": "true",
86
+ children: channel.label
87
+ }),
88
+ /* @__PURE__ */ jsx(ChannelTrackElement, {
89
+ style: { "--channel-gradient": `linear-gradient(to right, ${channel.stops(color)})` },
90
+ children: /* @__PURE__ */ jsx(__Slider, {
91
+ "aria-label": channel.title,
92
+ value: Math.min(channel.value(color), max),
93
+ minValue: channel.min,
94
+ maxValue: max,
95
+ step: channel.step,
96
+ isDisabled,
97
+ trackStyles: TRACK_STYLES,
98
+ thumbStyles: THUMB_STYLES,
99
+ thumbTokens: THUMB_TOKENS,
100
+ onChange: handleChange
101
+ })
102
+ }),
103
+ /* @__PURE__ */ jsx(ChannelValueElement, { children: channel.display(color) })
104
+ ] });
105
+ }
106
+ /**
107
+ * The popover body of `ColorPicker`: a preview, a switch between the three
108
+ * color concepts, and one gradient slider per channel of the active one.
109
+ */
110
+ function ColorPickerPanel(props) {
111
+ const { color, space, isDisabled, previewFormat, onChange, onSpaceChange } = props;
112
+ const colorTokens = useMemo(() => ({
113
+ "--color-picker-color": toHex(color),
114
+ "--color-picker-contrast-color": getContrastingColor(color)
115
+ }), [color]);
116
+ const handleSpaceChange = useEvent((value) => {
117
+ onSpaceChange(value);
118
+ });
119
+ return /* @__PURE__ */ jsxs(PanelElement, {
120
+ style: colorTokens,
121
+ children: [
122
+ /* @__PURE__ */ jsx(PreviewElement, { children: formatColor(color, previewFormat) }),
123
+ /* @__PURE__ */ jsx(__Radio.Tabs, {
124
+ "aria-label": "Color space",
125
+ value: space,
126
+ isDisabled,
127
+ styles: SPACE_STYLES,
128
+ onChange: handleSpaceChange,
129
+ children: COLOR_SPACES.map((item) => /* @__PURE__ */ jsx(__Radio, {
130
+ value: item,
131
+ "aria-label": COLOR_SPACE_LABELS[item],
132
+ tooltip: COLOR_SPACE_HINTS[item],
133
+ styles: TAB_STYLES,
134
+ children: COLOR_SPACE_LABELS[item]
135
+ }, item))
136
+ }),
137
+ /* @__PURE__ */ jsx(ChannelsElement, { children: CHANNELS[space].map((channel) => /* @__PURE__ */ jsx(ChannelRow, {
138
+ channel,
139
+ color,
140
+ isDisabled,
141
+ onChange
142
+ }, `${space}-${channel.label}`)) })
143
+ ]
144
+ });
145
+ }
146
+
147
+ //#endregion
148
+ export { ColorPickerPanel };
149
+ //# sourceMappingURL=ColorPickerPanel.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,13 @@
1
+
2
+ import "./color.js";
3
+
4
+ //#region src/components/fields/ColorPicker/channels.d.ts
5
+ /**
6
+ * The three color concepts the popover can be driven by. They all edit the
7
+ * same canonical value — only the axes the user manipulates differ.
8
+ */
9
+ declare const COLOR_SPACES: readonly ["hst", "lch", "rgb"];
10
+ type ColorSpace = (typeof COLOR_SPACES)[number];
11
+ //#endregion
12
+ export { COLOR_SPACES, ColorSpace };
13
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1,194 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.156.0 | Cube Dev Team */
2
+ import { fromOkhst, fromOklch, fromRgb, isAchromatic, maxChroma, normalizeHue, toHex, toOkhst, toOklch, toRgb } from "./color.js";
3
+
4
+ //#region src/components/fields/ColorPicker/channels.ts
5
+ /**
6
+ * The three color concepts the popover can be driven by. They all edit the
7
+ * same canonical value — only the axes the user manipulates differ.
8
+ */
9
+ const COLOR_SPACES = [
10
+ "hst",
11
+ "lch",
12
+ "rgb"
13
+ ];
14
+ const COLOR_SPACE_LABELS = {
15
+ hst: "HST",
16
+ lch: "LCH",
17
+ rgb: "RGB"
18
+ };
19
+ const COLOR_SPACE_HINTS = {
20
+ hst: "OKHST — hue, saturation, tone",
21
+ lch: "OKLCH — lightness, chroma, hue",
22
+ rgb: "sRGB — red, green, blue"
23
+ };
24
+ const constant = (value) => () => value;
25
+ function round(value, precision = 2) {
26
+ const factor = 10 ** precision;
27
+ return Math.round(value * factor) / factor;
28
+ }
29
+ /**
30
+ * `count` evenly spaced gradient stops, always as hex. Perceptual channels are
31
+ * not linear in sRGB, so a two-stop gradient would misrepresent them —
32
+ * sampling the real conversion keeps the track honest. Hex (rather than an
33
+ * `okhsl()` string) because the gradient reaches the DOM as a raw custom
34
+ * property, without passing through Tasty's color functions.
35
+ */
36
+ function ramp(count, at) {
37
+ return Array.from({ length: count }, (_, index) => toHex(at(index / (count - 1)))).join(", ");
38
+ }
39
+ /**
40
+ * The hue strip is drawn at full saturation and a fixed OKHSL lightness, which
41
+ * keeps it perceptually even instead of spiking at yellow the way a CSS-HSL
42
+ * rainbow does. Its own saturation and tone stay fixed: the strip is the same
43
+ * in HST and in LCH, where `H` means the same thing.
44
+ */
45
+ const HUE_STOPS = ramp(25, (position) => ({
46
+ h: position * 360,
47
+ s: 1,
48
+ l: .6
49
+ }));
50
+ const hueChannel = {
51
+ label: "H",
52
+ title: "Hue",
53
+ min: 0,
54
+ max: constant(359),
55
+ step: 1,
56
+ value: (color) => round(color.h, 1),
57
+ apply: (color, value) => ({
58
+ ...color,
59
+ h: normalizeHue(value)
60
+ }),
61
+ stops: () => HUE_STOPS,
62
+ display: (color) => `${Math.round(color.h)}°`
63
+ };
64
+ const saturationChannel = {
65
+ label: "S",
66
+ title: "Saturation",
67
+ min: 0,
68
+ max: constant(100),
69
+ step: 1,
70
+ value: (color) => round(color.s * 100, 1),
71
+ apply: (color, value) => ({
72
+ ...color,
73
+ s: value / 100
74
+ }),
75
+ stops: (color) => ramp(7, (position) => ({
76
+ ...color,
77
+ s: position
78
+ })),
79
+ display: (color) => `${Math.round(color.s * 100)}%`
80
+ };
81
+ const toneChannel = {
82
+ label: "T",
83
+ title: "Tone",
84
+ min: 0,
85
+ max: constant(100),
86
+ step: 1,
87
+ value: (color) => round(toOkhst(color).t * 100, 1),
88
+ apply: (color, value) => fromOkhst({
89
+ h: color.h,
90
+ s: color.s,
91
+ t: value / 100
92
+ }),
93
+ stops: (color) => ramp(7, (position) => fromOkhst({
94
+ h: color.h,
95
+ s: color.s,
96
+ t: position
97
+ })),
98
+ display: (color) => `${Math.round(toOkhst(color).t * 100)}%`
99
+ };
100
+ const lightnessChannel = {
101
+ label: "L",
102
+ title: "Lightness",
103
+ min: 0,
104
+ max: constant(100),
105
+ step: 1,
106
+ value: (color) => round(toOklch(color).l * 100, 1),
107
+ apply: (color, value) => {
108
+ const { c, h } = toOklch(color);
109
+ return fromOklch({
110
+ l: value / 100,
111
+ c,
112
+ h
113
+ });
114
+ },
115
+ stops: (color) => {
116
+ const { c, h } = toOklch(color);
117
+ return ramp(7, (position) => fromOklch({
118
+ l: position,
119
+ c,
120
+ h
121
+ }));
122
+ },
123
+ display: (color) => `${Math.round(toOklch(color).l * 100)}%`
124
+ };
125
+ const chromaChannel = {
126
+ label: "C",
127
+ title: "Chroma",
128
+ min: 0,
129
+ max: (color) => Math.max(round(maxChroma(color.h, color.l), 4), .001),
130
+ step: .001,
131
+ value: (color) => round(toOklch(color).c, 4),
132
+ apply: (color, value) => {
133
+ const { l, h } = toOklch(color);
134
+ return fromOklch({
135
+ l,
136
+ c: value,
137
+ h
138
+ });
139
+ },
140
+ stops: (color) => {
141
+ const { l, h } = toOklch(color);
142
+ const limit = maxChroma(color.h, color.l);
143
+ return ramp(7, (position) => fromOklch({
144
+ l,
145
+ c: position * limit,
146
+ h
147
+ }));
148
+ },
149
+ display: (color) => toOklch(color).c.toFixed(3)
150
+ };
151
+ function rgbChannel(key, label, title) {
152
+ const at = (color, value) => fromRgb({
153
+ ...toRgb(color),
154
+ [key]: value
155
+ });
156
+ return {
157
+ label,
158
+ title,
159
+ min: 0,
160
+ max: constant(255),
161
+ step: 1,
162
+ value: (color) => toRgb(color)[key],
163
+ apply: (color, value) => {
164
+ const next = at(color, value);
165
+ return isAchromatic(next) ? {
166
+ ...next,
167
+ h: color.h
168
+ } : next;
169
+ },
170
+ stops: (color) => ramp(2, (position) => at(color, position * 255)),
171
+ display: (color) => `${toRgb(color)[key]}`
172
+ };
173
+ }
174
+ const CHANNELS = {
175
+ hst: [
176
+ hueChannel,
177
+ saturationChannel,
178
+ toneChannel
179
+ ],
180
+ lch: [
181
+ lightnessChannel,
182
+ chromaChannel,
183
+ hueChannel
184
+ ],
185
+ rgb: [
186
+ rgbChannel("r", "R", "Red"),
187
+ rgbChannel("g", "G", "Green"),
188
+ rgbChannel("b", "B", "Blue")
189
+ ]
190
+ };
191
+
192
+ //#endregion
193
+ export { CHANNELS, COLOR_SPACES, COLOR_SPACE_HINTS, COLOR_SPACE_LABELS };
194
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
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":"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"}