@mortenbrudvik/waveui 0.4.0 → 0.8.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 (650) hide show
  1. package/README.md +1484 -173
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  3. package/dist/components/button/Button.cjs +2 -0
  4. package/dist/components/button/Button.cjs.map +1 -0
  5. package/dist/components/button/Button.mjs +51 -0
  6. package/dist/components/button/Button.mjs.map +1 -0
  7. package/dist/components/button/Button.semantics.cjs +2 -0
  8. package/dist/components/button/Button.semantics.cjs.map +1 -0
  9. package/dist/components/button/Button.semantics.mjs +61 -0
  10. package/dist/components/button/Button.semantics.mjs.map +1 -0
  11. package/dist/components/button/Button.slots.cjs +2 -0
  12. package/dist/components/button/Button.slots.cjs.map +1 -0
  13. package/dist/components/button/Button.slots.mjs +57 -0
  14. package/dist/components/button/Button.slots.mjs.map +1 -0
  15. package/dist/components/button/CompoundButton.cjs +2 -0
  16. package/dist/components/button/CompoundButton.cjs.map +1 -0
  17. package/dist/components/button/CompoundButton.mjs +55 -0
  18. package/dist/components/button/CompoundButton.mjs.map +1 -0
  19. package/dist/components/button/Link.cjs +2 -0
  20. package/dist/components/button/Link.cjs.map +1 -0
  21. package/dist/components/button/Link.mjs +38 -0
  22. package/dist/components/button/Link.mjs.map +1 -0
  23. package/dist/components/button/MenuButton.cjs +2 -0
  24. package/dist/components/button/MenuButton.cjs.map +1 -0
  25. package/dist/components/button/MenuButton.mjs +46 -0
  26. package/dist/components/button/MenuButton.mjs.map +1 -0
  27. package/dist/components/button/SplitButton.cjs +2 -0
  28. package/dist/components/button/SplitButton.cjs.map +1 -0
  29. package/dist/components/button/SplitButton.mjs +67 -0
  30. package/dist/components/button/SplitButton.mjs.map +1 -0
  31. package/dist/components/button/ToggleButton.cjs +2 -0
  32. package/dist/components/button/ToggleButton.cjs.map +1 -0
  33. package/dist/components/button/ToggleButton.mjs +68 -0
  34. package/dist/components/button/ToggleButton.mjs.map +1 -0
  35. package/dist/components/button/Toolbar.cjs +2 -0
  36. package/dist/components/button/Toolbar.cjs.map +1 -0
  37. package/dist/components/button/Toolbar.context.cjs +2 -0
  38. package/dist/components/button/Toolbar.context.cjs.map +1 -0
  39. package/dist/components/button/Toolbar.context.mjs +31 -0
  40. package/dist/components/button/Toolbar.context.mjs.map +1 -0
  41. package/dist/components/button/Toolbar.mjs +64 -0
  42. package/dist/components/button/Toolbar.mjs.map +1 -0
  43. package/dist/components/button/Toolbar.parts.cjs +2 -0
  44. package/dist/components/button/Toolbar.parts.cjs.map +1 -0
  45. package/dist/components/button/Toolbar.parts.mjs +126 -0
  46. package/dist/components/button/Toolbar.parts.mjs.map +1 -0
  47. package/dist/components/button/buttonStyles.cjs +2 -0
  48. package/dist/components/button/buttonStyles.cjs.map +1 -0
  49. package/dist/components/button/buttonStyles.mjs +39 -0
  50. package/dist/components/button/buttonStyles.mjs.map +1 -0
  51. package/dist/components/data-display/Avatar.cjs +2 -0
  52. package/dist/components/data-display/Avatar.cjs.map +1 -0
  53. package/dist/components/data-display/Avatar.mjs +162 -0
  54. package/dist/components/data-display/Avatar.mjs.map +1 -0
  55. package/dist/components/data-display/AvatarGroup.cjs +2 -0
  56. package/dist/components/data-display/AvatarGroup.cjs.map +1 -0
  57. package/dist/components/data-display/AvatarGroup.mjs +135 -0
  58. package/dist/components/data-display/AvatarGroup.mjs.map +1 -0
  59. package/dist/components/data-display/Badge.cjs +2 -0
  60. package/dist/components/data-display/Badge.cjs.map +1 -0
  61. package/dist/components/data-display/Badge.colors.cjs +2 -0
  62. package/dist/components/data-display/Badge.colors.cjs.map +1 -0
  63. package/dist/components/data-display/Badge.colors.mjs +58 -0
  64. package/dist/components/data-display/Badge.colors.mjs.map +1 -0
  65. package/dist/components/data-display/Badge.mjs +33 -0
  66. package/dist/components/data-display/Badge.mjs.map +1 -0
  67. package/dist/components/data-display/CounterBadge.cjs +2 -0
  68. package/dist/components/data-display/CounterBadge.cjs.map +1 -0
  69. package/dist/components/data-display/CounterBadge.mjs +29 -0
  70. package/dist/components/data-display/CounterBadge.mjs.map +1 -0
  71. package/dist/components/data-display/Divider.cjs +2 -0
  72. package/dist/components/data-display/Divider.cjs.map +1 -0
  73. package/dist/components/data-display/Divider.mjs +53 -0
  74. package/dist/components/data-display/Divider.mjs.map +1 -0
  75. package/dist/components/data-display/Image.cjs +2 -0
  76. package/dist/components/data-display/Image.cjs.map +1 -0
  77. package/dist/components/data-display/Image.mjs +33 -0
  78. package/dist/components/data-display/Image.mjs.map +1 -0
  79. package/dist/components/data-display/InfoLabel.cjs +2 -0
  80. package/dist/components/data-display/InfoLabel.cjs.map +1 -0
  81. package/dist/components/data-display/InfoLabel.mjs +105 -0
  82. package/dist/components/data-display/InfoLabel.mjs.map +1 -0
  83. package/dist/components/data-display/List.cjs +2 -0
  84. package/dist/components/data-display/List.cjs.map +1 -0
  85. package/dist/components/data-display/List.mjs +382 -0
  86. package/dist/components/data-display/List.mjs.map +1 -0
  87. package/dist/components/data-display/List.registry.cjs +2 -0
  88. package/dist/components/data-display/List.registry.cjs.map +1 -0
  89. package/dist/components/data-display/List.registry.mjs +101 -0
  90. package/dist/components/data-display/List.registry.mjs.map +1 -0
  91. package/dist/components/data-display/Persona.cjs +2 -0
  92. package/dist/components/data-display/Persona.cjs.map +1 -0
  93. package/dist/components/data-display/Persona.mjs +50 -0
  94. package/dist/components/data-display/Persona.mjs.map +1 -0
  95. package/dist/components/data-display/PresenceBadge.cjs +2 -0
  96. package/dist/components/data-display/PresenceBadge.cjs.map +1 -0
  97. package/dist/components/data-display/PresenceBadge.mjs +72 -0
  98. package/dist/components/data-display/PresenceBadge.mjs.map +1 -0
  99. package/dist/components/data-display/Tag.cjs +2 -0
  100. package/dist/components/data-display/Tag.cjs.map +1 -0
  101. package/dist/components/data-display/Tag.mjs +152 -0
  102. package/dist/components/data-display/Tag.mjs.map +1 -0
  103. package/dist/components/feedback/MessageBar.cjs +2 -0
  104. package/dist/components/feedback/MessageBar.cjs.map +1 -0
  105. package/dist/components/feedback/MessageBar.mjs +202 -0
  106. package/dist/components/feedback/MessageBar.mjs.map +1 -0
  107. package/dist/components/feedback/MessageBar.parts.cjs +2 -0
  108. package/dist/components/feedback/MessageBar.parts.cjs.map +1 -0
  109. package/dist/components/feedback/MessageBar.parts.mjs +84 -0
  110. package/dist/components/feedback/MessageBar.parts.mjs.map +1 -0
  111. package/dist/components/feedback/MessageBar.reflow.cjs +2 -0
  112. package/dist/components/feedback/MessageBar.reflow.cjs.map +1 -0
  113. package/dist/components/feedback/MessageBar.reflow.mjs +74 -0
  114. package/dist/components/feedback/MessageBar.reflow.mjs.map +1 -0
  115. package/dist/components/feedback/MessageBar.status.cjs +2 -0
  116. package/dist/components/feedback/MessageBar.status.cjs.map +1 -0
  117. package/dist/components/feedback/MessageBar.status.mjs +46 -0
  118. package/dist/components/feedback/MessageBar.status.mjs.map +1 -0
  119. package/dist/components/feedback/ProgressBar.cjs +2 -0
  120. package/dist/components/feedback/ProgressBar.cjs.map +1 -0
  121. package/dist/components/feedback/ProgressBar.mjs +73 -0
  122. package/dist/components/feedback/ProgressBar.mjs.map +1 -0
  123. package/dist/components/feedback/Skeleton.cjs +2 -0
  124. package/dist/components/feedback/Skeleton.cjs.map +1 -0
  125. package/dist/components/feedback/Skeleton.mjs +49 -0
  126. package/dist/components/feedback/Skeleton.mjs.map +1 -0
  127. package/dist/components/feedback/Spinner.cjs +2 -0
  128. package/dist/components/feedback/Spinner.cjs.map +1 -0
  129. package/dist/components/feedback/Spinner.mjs +61 -0
  130. package/dist/components/feedback/Spinner.mjs.map +1 -0
  131. package/dist/components/feedback/Toast.cjs +2 -0
  132. package/dist/components/feedback/Toast.cjs.map +1 -0
  133. package/dist/components/feedback/Toast.context.cjs +2 -0
  134. package/dist/components/feedback/Toast.context.cjs.map +1 -0
  135. package/dist/components/feedback/Toast.context.mjs +23 -0
  136. package/dist/components/feedback/Toast.context.mjs.map +1 -0
  137. package/dist/components/feedback/Toast.mjs +15 -0
  138. package/dist/components/feedback/Toast.mjs.map +1 -0
  139. package/dist/components/feedback/Toast.parts.cjs +2 -0
  140. package/dist/components/feedback/Toast.parts.cjs.map +1 -0
  141. package/dist/components/feedback/Toast.parts.mjs +98 -0
  142. package/dist/components/feedback/Toast.parts.mjs.map +1 -0
  143. package/dist/components/feedback/Toast.root.cjs +2 -0
  144. package/dist/components/feedback/Toast.root.cjs.map +1 -0
  145. package/dist/components/feedback/Toast.root.mjs +109 -0
  146. package/dist/components/feedback/Toast.root.mjs.map +1 -0
  147. package/dist/components/feedback/Toaster.cjs +2 -0
  148. package/dist/components/feedback/Toaster.cjs.map +1 -0
  149. package/dist/components/feedback/Toaster.mjs +564 -0
  150. package/dist/components/feedback/Toaster.mjs.map +1 -0
  151. package/dist/components/input/AlphaSlider.cjs +2 -0
  152. package/dist/components/input/AlphaSlider.cjs.map +1 -0
  153. package/dist/components/input/AlphaSlider.mjs +115 -0
  154. package/dist/components/input/AlphaSlider.mjs.map +1 -0
  155. package/dist/components/input/Checkbox.cjs +2 -0
  156. package/dist/components/input/Checkbox.cjs.map +1 -0
  157. package/dist/components/input/Checkbox.mjs +97 -0
  158. package/dist/components/input/Checkbox.mjs.map +1 -0
  159. package/dist/components/input/ColorArea.cjs +2 -0
  160. package/dist/components/input/ColorArea.cjs.map +1 -0
  161. package/dist/components/input/ColorArea.mjs +204 -0
  162. package/dist/components/input/ColorArea.mjs.map +1 -0
  163. package/dist/components/input/ColorPicker.cjs +6 -0
  164. package/dist/components/input/ColorPicker.cjs.map +1 -0
  165. package/dist/components/input/ColorPicker.mjs +213 -0
  166. package/dist/components/input/ColorPicker.mjs.map +1 -0
  167. package/dist/components/input/ColorPicker.parts.cjs +2 -0
  168. package/dist/components/input/ColorPicker.parts.cjs.map +1 -0
  169. package/dist/components/input/ColorPicker.parts.mjs +192 -0
  170. package/dist/components/input/ColorPicker.parts.mjs.map +1 -0
  171. package/dist/components/input/ColorSlider.cjs +2 -0
  172. package/dist/components/input/ColorSlider.cjs.map +1 -0
  173. package/dist/components/input/ColorSlider.mjs +138 -0
  174. package/dist/components/input/ColorSlider.mjs.map +1 -0
  175. package/dist/components/input/Combobox.cjs +2 -0
  176. package/dist/components/input/Combobox.cjs.map +1 -0
  177. package/dist/components/input/Combobox.expand.cjs +2 -0
  178. package/dist/components/input/Combobox.expand.cjs.map +1 -0
  179. package/dist/components/input/Combobox.expand.mjs +38 -0
  180. package/dist/components/input/Combobox.expand.mjs.map +1 -0
  181. package/dist/components/input/Combobox.mjs +192 -0
  182. package/dist/components/input/Combobox.mjs.map +1 -0
  183. package/dist/components/input/DatePicker.cjs +2 -0
  184. package/dist/components/input/DatePicker.cjs.map +1 -0
  185. package/dist/components/input/DatePicker.mjs +341 -0
  186. package/dist/components/input/DatePicker.mjs.map +1 -0
  187. package/dist/components/input/Dropdown.cjs +2 -0
  188. package/dist/components/input/Dropdown.cjs.map +1 -0
  189. package/dist/components/input/Dropdown.mjs +131 -0
  190. package/dist/components/input/Dropdown.mjs.map +1 -0
  191. package/dist/components/input/Field.cjs +2 -0
  192. package/dist/components/input/Field.cjs.map +1 -0
  193. package/dist/components/input/Field.mjs +201 -0
  194. package/dist/components/input/Field.mjs.map +1 -0
  195. package/dist/components/input/Input.cjs +2 -0
  196. package/dist/components/input/Input.cjs.map +1 -0
  197. package/dist/components/input/Input.mjs +82 -0
  198. package/dist/components/input/Input.mjs.map +1 -0
  199. package/dist/components/input/Label.cjs +2 -0
  200. package/dist/components/input/Label.cjs.map +1 -0
  201. package/dist/components/input/Label.mjs +29 -0
  202. package/dist/components/input/Label.mjs.map +1 -0
  203. package/dist/components/input/Option.cjs +2 -0
  204. package/dist/components/input/Option.cjs.map +1 -0
  205. package/dist/components/input/Option.mjs +171 -0
  206. package/dist/components/input/Option.mjs.map +1 -0
  207. package/dist/components/input/RadioGroup.cjs +2 -0
  208. package/dist/components/input/RadioGroup.cjs.map +1 -0
  209. package/dist/components/input/RadioGroup.mjs +140 -0
  210. package/dist/components/input/RadioGroup.mjs.map +1 -0
  211. package/dist/components/input/Rating.cjs +2 -0
  212. package/dist/components/input/Rating.cjs.map +1 -0
  213. package/dist/components/input/Rating.mjs +197 -0
  214. package/dist/components/input/Rating.mjs.map +1 -0
  215. package/dist/components/input/SearchBox.cjs +2 -0
  216. package/dist/components/input/SearchBox.cjs.map +1 -0
  217. package/dist/components/input/SearchBox.mjs +204 -0
  218. package/dist/components/input/SearchBox.mjs.map +1 -0
  219. package/dist/components/input/Select.cjs +2 -0
  220. package/dist/components/input/Select.cjs.map +1 -0
  221. package/dist/components/input/Select.mjs +34 -0
  222. package/dist/components/input/Select.mjs.map +1 -0
  223. package/dist/components/input/Slider.cjs +2 -0
  224. package/dist/components/input/Slider.cjs.map +1 -0
  225. package/dist/components/input/Slider.mjs +80 -0
  226. package/dist/components/input/Slider.mjs.map +1 -0
  227. package/dist/components/input/SpinButton.cjs +2 -0
  228. package/dist/components/input/SpinButton.cjs.map +1 -0
  229. package/dist/components/input/SpinButton.mjs +158 -0
  230. package/dist/components/input/SpinButton.mjs.map +1 -0
  231. package/dist/components/input/SwatchPicker.cjs +2 -0
  232. package/dist/components/input/SwatchPicker.cjs.map +1 -0
  233. package/dist/components/input/SwatchPicker.mjs +114 -0
  234. package/dist/components/input/SwatchPicker.mjs.map +1 -0
  235. package/dist/components/input/Switch.cjs +2 -0
  236. package/dist/components/input/Switch.cjs.map +1 -0
  237. package/dist/components/input/Switch.mjs +93 -0
  238. package/dist/components/input/Switch.mjs.map +1 -0
  239. package/dist/components/input/TagPicker.cjs +2 -0
  240. package/dist/components/input/TagPicker.cjs.map +1 -0
  241. package/dist/components/input/TagPicker.mjs +253 -0
  242. package/dist/components/input/TagPicker.mjs.map +1 -0
  243. package/dist/components/input/Textarea.cjs +2 -0
  244. package/dist/components/input/Textarea.cjs.map +1 -0
  245. package/dist/components/input/Textarea.mjs +33 -0
  246. package/dist/components/input/Textarea.mjs.map +1 -0
  247. package/dist/components/input/TimePicker.cjs +2 -0
  248. package/dist/components/input/TimePicker.cjs.map +1 -0
  249. package/dist/components/input/TimePicker.mjs +295 -0
  250. package/dist/components/input/TimePicker.mjs.map +1 -0
  251. package/dist/components/input/colorName.cjs +2 -0
  252. package/dist/components/input/colorName.cjs.map +1 -0
  253. package/dist/components/input/colorName.mjs +30 -0
  254. package/dist/components/input/colorName.mjs.map +1 -0
  255. package/dist/components/input/colorUtils.cjs +2 -0
  256. package/dist/components/input/colorUtils.cjs.map +1 -0
  257. package/dist/components/input/colorUtils.mjs +194 -0
  258. package/dist/components/input/colorUtils.mjs.map +1 -0
  259. package/dist/components/input/dateUtils.cjs +2 -0
  260. package/dist/components/input/dateUtils.cjs.map +1 -0
  261. package/dist/components/input/dateUtils.mjs +250 -0
  262. package/dist/components/input/dateUtils.mjs.map +1 -0
  263. package/dist/components/input/pickerStyles.cjs +2 -0
  264. package/dist/components/input/pickerStyles.cjs.map +1 -0
  265. package/dist/components/input/pickerStyles.mjs +10 -0
  266. package/dist/components/input/pickerStyles.mjs.map +1 -0
  267. package/dist/components/internal/HiddenInput.cjs +2 -0
  268. package/dist/components/internal/HiddenInput.cjs.map +1 -0
  269. package/dist/components/internal/HiddenInput.mjs +88 -0
  270. package/dist/components/internal/HiddenInput.mjs.map +1 -0
  271. package/dist/components/layout/Accordion.cjs +2 -0
  272. package/dist/components/layout/Accordion.cjs.map +1 -0
  273. package/dist/components/layout/Accordion.mjs +237 -0
  274. package/dist/components/layout/Accordion.mjs.map +1 -0
  275. package/dist/components/layout/Card.cjs +2 -0
  276. package/dist/components/layout/Card.cjs.map +1 -0
  277. package/dist/components/layout/Card.mjs +122 -0
  278. package/dist/components/layout/Card.mjs.map +1 -0
  279. package/dist/components/layout/Carousel.cjs +2 -0
  280. package/dist/components/layout/Carousel.cjs.map +1 -0
  281. package/dist/components/layout/Carousel.mjs +206 -0
  282. package/dist/components/layout/Carousel.mjs.map +1 -0
  283. package/dist/components/layout/Flex.cjs +2 -0
  284. package/dist/components/layout/Flex.cjs.map +1 -0
  285. package/dist/components/layout/Flex.mjs +55 -0
  286. package/dist/components/layout/Flex.mjs.map +1 -0
  287. package/dist/components/layout/Grid.cjs +2 -0
  288. package/dist/components/layout/Grid.cjs.map +1 -0
  289. package/dist/components/layout/Grid.mjs +63 -0
  290. package/dist/components/layout/Grid.mjs.map +1 -0
  291. package/dist/components/layout/Overflow.cjs +2 -0
  292. package/dist/components/layout/Overflow.cjs.map +1 -0
  293. package/dist/components/layout/Overflow.mjs +270 -0
  294. package/dist/components/layout/Overflow.mjs.map +1 -0
  295. package/dist/components/layout/Stack.cjs +2 -0
  296. package/dist/components/layout/Stack.cjs.map +1 -0
  297. package/dist/components/layout/Stack.mjs +40 -0
  298. package/dist/components/layout/Stack.mjs.map +1 -0
  299. package/dist/components/layout/TabList.cjs +2 -0
  300. package/dist/components/layout/TabList.cjs.map +1 -0
  301. package/dist/components/layout/TabList.mjs +239 -0
  302. package/dist/components/layout/TabList.mjs.map +1 -0
  303. package/dist/components/layout/Tree.cjs +2 -0
  304. package/dist/components/layout/Tree.cjs.map +1 -0
  305. package/dist/components/layout/Tree.context.cjs +2 -0
  306. package/dist/components/layout/Tree.context.cjs.map +1 -0
  307. package/dist/components/layout/Tree.context.mjs +33 -0
  308. package/dist/components/layout/Tree.context.mjs.map +1 -0
  309. package/dist/components/layout/Tree.core.cjs +2 -0
  310. package/dist/components/layout/Tree.core.cjs.map +1 -0
  311. package/dist/components/layout/Tree.core.mjs +416 -0
  312. package/dist/components/layout/Tree.core.mjs.map +1 -0
  313. package/dist/components/layout/Tree.itemPersonaLayout.cjs +2 -0
  314. package/dist/components/layout/Tree.itemPersonaLayout.cjs.map +1 -0
  315. package/dist/components/layout/Tree.itemPersonaLayout.mjs +46 -0
  316. package/dist/components/layout/Tree.itemPersonaLayout.mjs.map +1 -0
  317. package/dist/components/layout/Tree.mjs +12 -0
  318. package/dist/components/layout/Tree.mjs.map +1 -0
  319. package/dist/components/layout/Tree.selection.cjs +2 -0
  320. package/dist/components/layout/Tree.selection.cjs.map +1 -0
  321. package/dist/components/layout/Tree.selection.mjs +73 -0
  322. package/dist/components/layout/Tree.selection.mjs.map +1 -0
  323. package/dist/components/layout/disclosureIds.cjs +2 -0
  324. package/dist/components/layout/disclosureIds.cjs.map +1 -0
  325. package/dist/components/layout/disclosureIds.mjs +12 -0
  326. package/dist/components/layout/disclosureIds.mjs.map +1 -0
  327. package/dist/components/motion/Presence.cjs +2 -0
  328. package/dist/components/motion/Presence.cjs.map +1 -0
  329. package/dist/components/motion/Presence.mjs +35 -0
  330. package/dist/components/motion/Presence.mjs.map +1 -0
  331. package/dist/components/navigation/Breadcrumb.cjs +2 -0
  332. package/dist/components/navigation/Breadcrumb.cjs.map +1 -0
  333. package/dist/components/navigation/Breadcrumb.mjs +145 -0
  334. package/dist/components/navigation/Breadcrumb.mjs.map +1 -0
  335. package/dist/components/navigation/Menu.cjs +2 -0
  336. package/dist/components/navigation/Menu.cjs.map +1 -0
  337. package/dist/components/navigation/Menu.context.cjs +2 -0
  338. package/dist/components/navigation/Menu.context.cjs.map +1 -0
  339. package/dist/components/navigation/Menu.context.mjs +82 -0
  340. package/dist/components/navigation/Menu.context.mjs.map +1 -0
  341. package/dist/components/navigation/Menu.group.cjs +2 -0
  342. package/dist/components/navigation/Menu.group.cjs.map +1 -0
  343. package/dist/components/navigation/Menu.group.mjs +60 -0
  344. package/dist/components/navigation/Menu.group.mjs.map +1 -0
  345. package/dist/components/navigation/Menu.items.cjs +2 -0
  346. package/dist/components/navigation/Menu.items.cjs.map +1 -0
  347. package/dist/components/navigation/Menu.items.mjs +133 -0
  348. package/dist/components/navigation/Menu.items.mjs.map +1 -0
  349. package/dist/components/navigation/Menu.link.cjs +2 -0
  350. package/dist/components/navigation/Menu.link.cjs.map +1 -0
  351. package/dist/components/navigation/Menu.link.mjs +47 -0
  352. package/dist/components/navigation/Menu.link.mjs.map +1 -0
  353. package/dist/components/navigation/Menu.mjs +27 -0
  354. package/dist/components/navigation/Menu.mjs.map +1 -0
  355. package/dist/components/navigation/Menu.popover.cjs +2 -0
  356. package/dist/components/navigation/Menu.popover.cjs.map +1 -0
  357. package/dist/components/navigation/Menu.popover.mjs +232 -0
  358. package/dist/components/navigation/Menu.popover.mjs.map +1 -0
  359. package/dist/components/navigation/Menu.root.cjs +2 -0
  360. package/dist/components/navigation/Menu.root.cjs.map +1 -0
  361. package/dist/components/navigation/Menu.root.mjs +309 -0
  362. package/dist/components/navigation/Menu.root.mjs.map +1 -0
  363. package/dist/components/navigation/Menu.selectable.cjs +2 -0
  364. package/dist/components/navigation/Menu.selectable.cjs.map +1 -0
  365. package/dist/components/navigation/Menu.selectable.mjs +111 -0
  366. package/dist/components/navigation/Menu.selectable.mjs.map +1 -0
  367. package/dist/components/navigation/Menu.shared.cjs +2 -0
  368. package/dist/components/navigation/Menu.shared.cjs.map +1 -0
  369. package/dist/components/navigation/Menu.shared.mjs +23 -0
  370. package/dist/components/navigation/Menu.shared.mjs.map +1 -0
  371. package/dist/components/navigation/Menu.splitGroup.cjs +2 -0
  372. package/dist/components/navigation/Menu.splitGroup.cjs.map +1 -0
  373. package/dist/components/navigation/Menu.splitGroup.mjs +52 -0
  374. package/dist/components/navigation/Menu.splitGroup.mjs.map +1 -0
  375. package/dist/components/navigation/Menu.trigger.cjs +2 -0
  376. package/dist/components/navigation/Menu.trigger.cjs.map +1 -0
  377. package/dist/components/navigation/Menu.trigger.mjs +79 -0
  378. package/dist/components/navigation/Menu.trigger.mjs.map +1 -0
  379. package/dist/components/navigation/Nav.cjs +2 -0
  380. package/dist/components/navigation/Nav.cjs.map +1 -0
  381. package/dist/components/navigation/Nav.mjs +291 -0
  382. package/dist/components/navigation/Nav.mjs.map +1 -0
  383. package/dist/components/navigation/Pagination.cjs +2 -0
  384. package/dist/components/navigation/Pagination.cjs.map +1 -0
  385. package/dist/components/navigation/Pagination.mjs +118 -0
  386. package/dist/components/navigation/Pagination.mjs.map +1 -0
  387. package/dist/components/navigation/Stepper.cjs +2 -0
  388. package/dist/components/navigation/Stepper.cjs.map +1 -0
  389. package/dist/components/navigation/Stepper.mjs +205 -0
  390. package/dist/components/navigation/Stepper.mjs.map +1 -0
  391. package/dist/components/overlays/Dialog.cjs +2 -0
  392. package/dist/components/overlays/Dialog.cjs.map +1 -0
  393. package/dist/components/overlays/Dialog.mjs +181 -0
  394. package/dist/components/overlays/Dialog.mjs.map +1 -0
  395. package/dist/components/overlays/Dialog.shared.cjs +2 -0
  396. package/dist/components/overlays/Dialog.shared.cjs.map +1 -0
  397. package/dist/components/overlays/Dialog.shared.mjs +227 -0
  398. package/dist/components/overlays/Dialog.shared.mjs.map +1 -0
  399. package/dist/components/overlays/Drawer.cjs +2 -0
  400. package/dist/components/overlays/Drawer.cjs.map +1 -0
  401. package/dist/components/overlays/Drawer.mjs +193 -0
  402. package/dist/components/overlays/Drawer.mjs.map +1 -0
  403. package/dist/components/overlays/Popover.cjs +2 -0
  404. package/dist/components/overlays/Popover.cjs.map +1 -0
  405. package/dist/components/overlays/Popover.mjs +367 -0
  406. package/dist/components/overlays/Popover.mjs.map +1 -0
  407. package/dist/components/overlays/Popover.shared.cjs +2 -0
  408. package/dist/components/overlays/Popover.shared.cjs.map +1 -0
  409. package/dist/components/overlays/Popover.shared.mjs +182 -0
  410. package/dist/components/overlays/Popover.shared.mjs.map +1 -0
  411. package/dist/components/overlays/TeachingPopover.cjs +2 -0
  412. package/dist/components/overlays/TeachingPopover.cjs.map +1 -0
  413. package/dist/components/overlays/TeachingPopover.mjs +185 -0
  414. package/dist/components/overlays/TeachingPopover.mjs.map +1 -0
  415. package/dist/components/overlays/Tooltip.cjs +2 -0
  416. package/dist/components/overlays/Tooltip.cjs.map +1 -0
  417. package/dist/components/overlays/Tooltip.mjs +161 -0
  418. package/dist/components/overlays/Tooltip.mjs.map +1 -0
  419. package/dist/components/portal/Portal.cjs +2 -0
  420. package/dist/components/portal/Portal.cjs.map +1 -0
  421. package/dist/components/portal/Portal.mjs +46 -0
  422. package/dist/components/portal/Portal.mjs.map +1 -0
  423. package/dist/components/provider/WaveProvider.cjs +2 -0
  424. package/dist/components/provider/WaveProvider.cjs.map +1 -0
  425. package/dist/components/provider/WaveProvider.mjs +52 -0
  426. package/dist/components/provider/WaveProvider.mjs.map +1 -0
  427. package/dist/components/table/DataGrid.cjs +2 -0
  428. package/dist/components/table/DataGrid.cjs.map +1 -0
  429. package/dist/components/table/DataGrid.mjs +490 -0
  430. package/dist/components/table/DataGrid.mjs.map +1 -0
  431. package/dist/components/table/Table.cjs +2 -0
  432. package/dist/components/table/Table.cjs.map +1 -0
  433. package/dist/components/table/Table.mjs +100 -0
  434. package/dist/components/table/Table.mjs.map +1 -0
  435. package/dist/components/table/useGridNavigation.cjs +2 -0
  436. package/dist/components/table/useGridNavigation.cjs.map +1 -0
  437. package/dist/components/table/useGridNavigation.mjs +336 -0
  438. package/dist/components/table/useGridNavigation.mjs.map +1 -0
  439. package/dist/components/typography/Text.cjs +2 -0
  440. package/dist/components/typography/Text.cjs.map +1 -0
  441. package/dist/components/typography/Text.mjs +39 -0
  442. package/dist/components/typography/Text.mjs.map +1 -0
  443. package/dist/hooks/useAnnounce.cjs +2 -0
  444. package/dist/hooks/useAnnounce.cjs.map +1 -0
  445. package/dist/hooks/useAnnounce.mjs +88 -0
  446. package/dist/hooks/useAnnounce.mjs.map +1 -0
  447. package/dist/hooks/useCheckedValues.cjs +2 -0
  448. package/dist/hooks/useCheckedValues.cjs.map +1 -0
  449. package/dist/hooks/useCheckedValues.mjs +102 -0
  450. package/dist/hooks/useCheckedValues.mjs.map +1 -0
  451. package/dist/hooks/useContextMenuAnchor.cjs +2 -0
  452. package/dist/hooks/useContextMenuAnchor.cjs.map +1 -0
  453. package/dist/hooks/useContextMenuAnchor.mjs +132 -0
  454. package/dist/hooks/useContextMenuAnchor.mjs.map +1 -0
  455. package/dist/hooks/useControllable.cjs +2 -0
  456. package/dist/hooks/useControllable.cjs.map +1 -0
  457. package/dist/hooks/useControllable.mjs +37 -0
  458. package/dist/hooks/useControllable.mjs.map +1 -0
  459. package/dist/hooks/useDirection.cjs +2 -0
  460. package/dist/hooks/useDirection.cjs.map +1 -0
  461. package/dist/hooks/useDirection.mjs +57 -0
  462. package/dist/hooks/useDirection.mjs.map +1 -0
  463. package/dist/hooks/useDismiss.cjs +2 -0
  464. package/dist/hooks/useDismiss.cjs.map +1 -0
  465. package/dist/hooks/useDismiss.mjs +57 -0
  466. package/dist/hooks/useDismiss.mjs.map +1 -0
  467. package/dist/hooks/useEventCallback.cjs +2 -0
  468. package/dist/hooks/useEventCallback.cjs.map +1 -0
  469. package/dist/hooks/useEventCallback.mjs +16 -0
  470. package/dist/hooks/useEventCallback.mjs.map +1 -0
  471. package/dist/hooks/useFieldControl.cjs +2 -0
  472. package/dist/hooks/useFieldControl.cjs.map +1 -0
  473. package/dist/hooks/useFieldControl.mjs +62 -0
  474. package/dist/hooks/useFieldControl.mjs.map +1 -0
  475. package/dist/hooks/useFocusTrap.cjs +2 -0
  476. package/dist/hooks/useFocusTrap.cjs.map +1 -0
  477. package/dist/hooks/useFocusTrap.mjs +266 -0
  478. package/dist/hooks/useFocusTrap.mjs.map +1 -0
  479. package/dist/hooks/useFormReset.cjs +2 -0
  480. package/dist/hooks/useFormReset.cjs.map +1 -0
  481. package/dist/hooks/useFormReset.mjs +33 -0
  482. package/dist/hooks/useFormReset.mjs.map +1 -0
  483. package/dist/hooks/useHoverIntent.cjs +2 -0
  484. package/dist/hooks/useHoverIntent.cjs.map +1 -0
  485. package/dist/hooks/useHoverIntent.mjs +201 -0
  486. package/dist/hooks/useHoverIntent.mjs.map +1 -0
  487. package/dist/hooks/useId.cjs +2 -0
  488. package/dist/hooks/useId.cjs.map +1 -0
  489. package/dist/hooks/useId.mjs +11 -0
  490. package/dist/hooks/useId.mjs.map +1 -0
  491. package/dist/hooks/useIsClient.cjs +2 -0
  492. package/dist/hooks/useIsClient.cjs.map +1 -0
  493. package/dist/hooks/useIsClient.mjs +19 -0
  494. package/dist/hooks/useIsClient.mjs.map +1 -0
  495. package/dist/hooks/useListbox.cjs +2 -0
  496. package/dist/hooks/useListbox.cjs.map +1 -0
  497. package/dist/hooks/useListbox.mjs +492 -0
  498. package/dist/hooks/useListbox.mjs.map +1 -0
  499. package/dist/hooks/useMediaQuery.cjs +2 -0
  500. package/dist/hooks/useMediaQuery.cjs.map +1 -0
  501. package/dist/hooks/useMediaQuery.mjs +20 -0
  502. package/dist/hooks/useMediaQuery.mjs.map +1 -0
  503. package/dist/hooks/useMergedRefs.cjs +2 -0
  504. package/dist/hooks/useMergedRefs.cjs.map +1 -0
  505. package/dist/hooks/useMergedRefs.mjs +57 -0
  506. package/dist/hooks/useMergedRefs.mjs.map +1 -0
  507. package/dist/hooks/useModalIsolation.cjs +2 -0
  508. package/dist/hooks/useModalIsolation.cjs.map +1 -0
  509. package/dist/hooks/useModalIsolation.mjs +87 -0
  510. package/dist/hooks/useModalIsolation.mjs.map +1 -0
  511. package/dist/hooks/useModalLayer.cjs +2 -0
  512. package/dist/hooks/useModalLayer.cjs.map +1 -0
  513. package/dist/hooks/useModalLayer.mjs +30 -0
  514. package/dist/hooks/useModalLayer.mjs.map +1 -0
  515. package/dist/hooks/usePopupPosition.cjs +2 -0
  516. package/dist/hooks/usePopupPosition.cjs.map +1 -0
  517. package/dist/hooks/usePopupPosition.mjs +117 -0
  518. package/dist/hooks/usePopupPosition.mjs.map +1 -0
  519. package/dist/hooks/usePrefersReducedMotion.cjs +2 -0
  520. package/dist/hooks/usePrefersReducedMotion.cjs.map +1 -0
  521. package/dist/hooks/usePrefersReducedMotion.mjs +10 -0
  522. package/dist/hooks/usePrefersReducedMotion.mjs.map +1 -0
  523. package/dist/hooks/usePresence.cjs +2 -0
  524. package/dist/hooks/usePresence.cjs.map +1 -0
  525. package/dist/hooks/usePresence.mjs +136 -0
  526. package/dist/hooks/usePresence.mjs.map +1 -0
  527. package/dist/hooks/usePreserveFocus.cjs +2 -0
  528. package/dist/hooks/usePreserveFocus.cjs.map +1 -0
  529. package/dist/hooks/usePreserveFocus.mjs +50 -0
  530. package/dist/hooks/usePreserveFocus.mjs.map +1 -0
  531. package/dist/hooks/useRestoreFocus.cjs +2 -0
  532. package/dist/hooks/useRestoreFocus.cjs.map +1 -0
  533. package/dist/hooks/useRestoreFocus.mjs +271 -0
  534. package/dist/hooks/useRestoreFocus.mjs.map +1 -0
  535. package/dist/hooks/useRovingTabIndex.cjs +2 -0
  536. package/dist/hooks/useRovingTabIndex.cjs.map +1 -0
  537. package/dist/hooks/useRovingTabIndex.mjs +389 -0
  538. package/dist/hooks/useRovingTabIndex.mjs.map +1 -0
  539. package/dist/hooks/useScrollLock.cjs +2 -0
  540. package/dist/hooks/useScrollLock.cjs.map +1 -0
  541. package/dist/hooks/useScrollLock.mjs +71 -0
  542. package/dist/hooks/useScrollLock.mjs.map +1 -0
  543. package/dist/hooks/useTriggerElement.cjs +2 -0
  544. package/dist/hooks/useTriggerElement.cjs.map +1 -0
  545. package/dist/hooks/useTriggerElement.mjs +126 -0
  546. package/dist/hooks/useTriggerElement.mjs.map +1 -0
  547. package/dist/hooks/useTypeahead.cjs +2 -0
  548. package/dist/hooks/useTypeahead.cjs.map +1 -0
  549. package/dist/hooks/useTypeahead.mjs +38 -0
  550. package/dist/hooks/useTypeahead.mjs.map +1 -0
  551. package/dist/index.cjs +1 -1
  552. package/dist/index.d.cts +11086 -0
  553. package/dist/index.d.ts +10405 -1757
  554. package/dist/index.mjs +103 -5695
  555. package/dist/lib/aria.cjs +2 -0
  556. package/dist/lib/aria.cjs.map +1 -0
  557. package/dist/lib/aria.mjs +29 -0
  558. package/dist/lib/aria.mjs.map +1 -0
  559. package/dist/lib/children.cjs +2 -0
  560. package/dist/lib/children.cjs.map +1 -0
  561. package/dist/lib/children.mjs +37 -0
  562. package/dist/lib/children.mjs.map +1 -0
  563. package/dist/lib/classNames.cjs +2 -0
  564. package/dist/lib/classNames.cjs.map +1 -0
  565. package/dist/lib/classNames.mjs +415 -0
  566. package/dist/lib/classNames.mjs.map +1 -0
  567. package/dist/lib/cn.cjs +2 -0
  568. package/dist/lib/cn.cjs.map +1 -0
  569. package/dist/lib/cn.mjs +64 -0
  570. package/dist/lib/cn.mjs.map +1 -0
  571. package/dist/lib/color.cjs +2 -0
  572. package/dist/lib/color.cjs.map +1 -0
  573. package/dist/lib/color.mjs +86 -0
  574. package/dist/lib/color.mjs.map +1 -0
  575. package/dist/lib/composeEventHandlers.cjs +2 -0
  576. package/dist/lib/composeEventHandlers.cjs.map +1 -0
  577. package/dist/lib/composeEventHandlers.mjs +11 -0
  578. package/dist/lib/composeEventHandlers.mjs.map +1 -0
  579. package/dist/lib/dev.cjs +2 -0
  580. package/dist/lib/dev.cjs.map +1 -0
  581. package/dist/lib/dev.mjs +42 -0
  582. package/dist/lib/dev.mjs.map +1 -0
  583. package/dist/lib/direction.cjs +2 -0
  584. package/dist/lib/direction.cjs.map +1 -0
  585. package/dist/lib/direction.mjs +35 -0
  586. package/dist/lib/direction.mjs.map +1 -0
  587. package/dist/lib/events.cjs +2 -0
  588. package/dist/lib/events.cjs.map +1 -0
  589. package/dist/lib/events.mjs +31 -0
  590. package/dist/lib/events.mjs.map +1 -0
  591. package/dist/lib/focus.cjs +2 -0
  592. package/dist/lib/focus.cjs.map +1 -0
  593. package/dist/lib/focus.mjs +119 -0
  594. package/dist/lib/focus.mjs.map +1 -0
  595. package/dist/lib/globalRegistry.cjs +2 -0
  596. package/dist/lib/globalRegistry.cjs.map +1 -0
  597. package/dist/lib/globalRegistry.mjs +13 -0
  598. package/dist/lib/globalRegistry.mjs.map +1 -0
  599. package/dist/lib/icons.cjs +2 -0
  600. package/dist/lib/icons.cjs.map +1 -0
  601. package/dist/lib/icons.mjs +254 -0
  602. package/dist/lib/icons.mjs.map +1 -0
  603. package/dist/lib/labelInName.cjs +2 -0
  604. package/dist/lib/labelInName.cjs.map +1 -0
  605. package/dist/lib/labelInName.mjs +54 -0
  606. package/dist/lib/labelInName.mjs.map +1 -0
  607. package/dist/lib/layers.cjs +2 -0
  608. package/dist/lib/layers.cjs.map +1 -0
  609. package/dist/lib/layers.mjs +224 -0
  610. package/dist/lib/layers.mjs.map +1 -0
  611. package/dist/lib/mergeProps.cjs +2 -0
  612. package/dist/lib/mergeProps.cjs.map +1 -0
  613. package/dist/lib/mergeProps.mjs +21 -0
  614. package/dist/lib/mergeProps.mjs.map +1 -0
  615. package/dist/lib/mergeRefs.cjs +2 -0
  616. package/dist/lib/mergeRefs.cjs.map +1 -0
  617. package/dist/lib/mergeRefs.mjs +29 -0
  618. package/dist/lib/mergeRefs.mjs.map +1 -0
  619. package/dist/lib/renderTrigger.cjs +2 -0
  620. package/dist/lib/renderTrigger.cjs.map +1 -0
  621. package/dist/lib/renderTrigger.mjs +29 -0
  622. package/dist/lib/renderTrigger.mjs.map +1 -0
  623. package/dist/lib/slot.cjs +2 -0
  624. package/dist/lib/slot.cjs.map +1 -0
  625. package/dist/lib/slot.mjs +122 -0
  626. package/dist/lib/slot.mjs.map +1 -0
  627. package/dist/lib/styles.cjs +2 -0
  628. package/dist/lib/styles.cjs.map +1 -0
  629. package/dist/lib/styles.mjs +16 -0
  630. package/dist/lib/styles.mjs.map +1 -0
  631. package/dist/lib/theme.cjs +2 -0
  632. package/dist/lib/theme.cjs.map +1 -0
  633. package/dist/lib/theme.mjs +16 -0
  634. package/dist/lib/theme.mjs.map +1 -0
  635. package/dist/lib/toaster.cjs +2 -0
  636. package/dist/lib/toaster.cjs.map +1 -0
  637. package/dist/lib/toaster.mjs +77 -0
  638. package/dist/lib/toaster.mjs.map +1 -0
  639. package/dist/preflight.css +2 -0
  640. package/dist/styles.css +2 -0
  641. package/package.json +149 -100
  642. package/src/styles/animations.css +7 -39
  643. package/src/styles/base.css +103 -0
  644. package/src/styles/globals.css +10 -22
  645. package/src/styles/legacy-tokens.css +184 -0
  646. package/src/styles/preflight.css +7 -0
  647. package/src/styles/styles.css +32 -0
  648. package/src/styles/tailwind.css +17 -0
  649. package/src/styles/tokens.css +561 -221
  650. package/src/styles/variants.css +29 -0
@@ -0,0 +1,213 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/cn.mjs";
3
+ import { warnDeprecated as t, warnOnce as n } from "../../lib/dev.mjs";
4
+ import { slotRendersContent as r } from "../../lib/slot.mjs";
5
+ import { colorPickerClassNames as i } from "../../lib/classNames.mjs";
6
+ import { hexToHsv as a, hsvToHex as o } from "../../lib/color.mjs";
7
+ import { useEventCallback as s } from "../../hooks/useEventCallback.mjs";
8
+ import { useControllable as c } from "../../hooks/useControllable.mjs";
9
+ import { getFirstTabbable as ee } from "../../lib/focus.mjs";
10
+ import { useMergedRefs as te } from "../../hooks/useMergedRefs.mjs";
11
+ import { FieldContext as ne, useFieldContext as re, useFieldControl as ie } from "../../hooks/useFieldControl.mjs";
12
+ import { useFormReset as ae } from "../../hooks/useFormReset.mjs";
13
+ import { HiddenInput as oe } from "../internal/HiddenInput.mjs";
14
+ import { alphaToOpacity as se, formatHexColor as l, normalizeHexColor as u, parseHexColor as d } from "./colorUtils.mjs";
15
+ import { ColorPickerContext as ce, ColorPickerHexField as f, ColorPickerPreview as p, ColorPickerSwatches as m, DEFAULT_COLOR_PICKER_LABELS as le, DEFAULT_PART_COLOR as ue } from "./ColorPicker.parts.mjs";
16
+ import { AlphaSlider as de } from "./AlphaSlider.mjs";
17
+ import { ColorArea as fe } from "./ColorArea.mjs";
18
+ import { ColorSlider as pe } from "./ColorSlider.mjs";
19
+ import * as h from "react";
20
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
21
+ //#region src/components/input/ColorPicker.tsx
22
+ var me = [
23
+ {
24
+ color: "#0f6cbd",
25
+ label: "Blue"
26
+ },
27
+ {
28
+ color: "#d13438",
29
+ label: "Red"
30
+ },
31
+ {
32
+ color: "#107c10",
33
+ label: "Green"
34
+ },
35
+ {
36
+ color: "#ffb900",
37
+ label: "Yellow"
38
+ },
39
+ {
40
+ color: "#5c2d91",
41
+ label: "Purple"
42
+ },
43
+ {
44
+ color: "#008272",
45
+ label: "Teal"
46
+ },
47
+ {
48
+ color: "#e3008c",
49
+ label: "Pink"
50
+ },
51
+ {
52
+ color: "#242424",
53
+ label: "Black"
54
+ }
55
+ ];
56
+ function he(e) {
57
+ let t = [], n = [], r = [], i = /* @__PURE__ */ new Set();
58
+ for (let a of e) {
59
+ let e = typeof a == "string" ? a : a.color, o = d(e);
60
+ if (!o) {
61
+ n.push(e);
62
+ continue;
63
+ }
64
+ let s = o.alpha !== 255;
65
+ if (s && r.push(e), i.has(o.rgb)) continue;
66
+ i.add(o.rgb);
67
+ let c = s ? o.rgb : e;
68
+ t.push({
69
+ value: o.rgb,
70
+ color: o.rgb,
71
+ label: typeof a == "string" ? c : a.label
72
+ });
73
+ }
74
+ return {
75
+ items: t,
76
+ invalid: n,
77
+ translucent: r
78
+ };
79
+ }
80
+ function y(e, t) {
81
+ let n = a(e);
82
+ return n ? n.v === 0 ? {
83
+ ...n,
84
+ h: t.h,
85
+ s: t.s
86
+ } : n.s === 0 ? {
87
+ ...n,
88
+ h: t.h
89
+ } : n : t;
90
+ }
91
+ var b = ({ value: a, defaultValue: b, onValueChange: x, onChange: S, presets: C = me, showOpacity: w = !1, labels: T, shape: E = "rounded", name: ge, required: _e, form: D, className: ve, id: ye, "aria-label": be, "aria-labelledby": xe, "aria-describedby": Se, "aria-invalid": Ce, "aria-required": O, "aria-errormessage": we, children: k, ref: Te, ...Ee }) => {
92
+ S !== void 0 && t("ColorPicker", "onChange", "onValueChange");
93
+ let A = b ?? "#0f6cbd", j = u(A) ?? A, M = h.useMemo(() => ({
94
+ ...le,
95
+ ...T
96
+ }), [T]), [N, P] = c(a, j, (e) => {
97
+ x?.(e), S?.(e);
98
+ }), F = h.useMemo(() => d(N), [N]), I = F?.alpha ?? 255, De = se(I), { items: L, invalid: Oe, translucent: ke } = h.useMemo(() => he(C), [C]), R = Oe.join("\n"), z = ke.join("\n"), B = F ? null : N;
99
+ h.useEffect(() => {
100
+ B !== null && n("ColorPicker:invalid-value", `ColorPicker: "${B}" is not a hex color (#rrggbb or #rrggbbaa). Pass a hex value; the color area and sliders are disabled until then.`);
101
+ }, [B]), h.useEffect(() => {
102
+ if (R) for (let e of R.split("\n")) n(`ColorPicker:invalid-preset:${e}`, `ColorPicker: preset "${e}" is not a hex color (#rgb or #rrggbb) and is not shown.`);
103
+ }, [R]), h.useEffect(() => {
104
+ if (z) for (let e of z.split("\n")) n(`ColorPicker:alpha-preset:${e}`, `ColorPicker: preset "${e}" has an alpha byte, which is ignored: picking a preset keeps the current opacity. Pass the color as #rgb or #rrggbb.`);
105
+ }, [z]);
106
+ let V = h.useRef(null), H = h.useRef(null), Ae = te(Te, V), U = h.useCallback((e) => {
107
+ H.current = e;
108
+ }, []), [W, G] = h.useState(0), K = re(), { "aria-invalid": q, "aria-required": je, required: Me, ...Ne } = ie({
109
+ id: ye,
110
+ "aria-label": be,
111
+ "aria-labelledby": xe,
112
+ "aria-describedby": Se,
113
+ "aria-invalid": Ce
114
+ }, { labelable: !1 }), Pe = q !== void 0 && q !== !1 && q !== "false", Fe = _e ?? (O === !0 || O === "true" || (K?.required ?? !1)), J = Pe && we || void 0;
115
+ ae(V, () => {
116
+ (u(N) ?? N) !== j && P(j), G((e) => e + 1);
117
+ }, D);
118
+ let Y = s((e) => {
119
+ let t = d(e);
120
+ t && (G((e) => e + 1), P(l(t.rgb, I)));
121
+ }), [X, Z] = h.useState(() => y(N, ue)), Q = F ? l(F.rgb, F.alpha) : null;
122
+ Q !== null && o(X) !== Q && Z(y(Q, X));
123
+ let $ = s((e) => {
124
+ F && (Z(e), P(o(e)));
125
+ }), Ie = h.useMemo(() => ({
126
+ hsv: X,
127
+ setHsv: $,
128
+ color: N,
129
+ parsed: F,
130
+ setColor: P,
131
+ pickPreset: Y,
132
+ presetItems: L,
133
+ shape: E,
134
+ labels: M,
135
+ disabled: F === null,
136
+ draftResetKey: W,
137
+ field: K,
138
+ groupInvalid: q,
139
+ errorMessageId: J,
140
+ registerHexInput: U
141
+ }), [
142
+ X,
143
+ $,
144
+ N,
145
+ F,
146
+ P,
147
+ Y,
148
+ L,
149
+ E,
150
+ M,
151
+ W,
152
+ K,
153
+ q,
154
+ J,
155
+ U
156
+ ]), Le = () => {
157
+ let e = V.current;
158
+ (H.current ?? (e ? ee(e) : null))?.focus();
159
+ };
160
+ return /* @__PURE__ */ v("div", {
161
+ role: "group",
162
+ ...Ne,
163
+ className: e(i.root, "relative inline-flex flex-col gap-3 rounded border border-border bg-background p-3 shadow-4", ve),
164
+ ...Ee,
165
+ ref: Ae,
166
+ children: [/* @__PURE__ */ _(ce.Provider, {
167
+ value: Ie,
168
+ children: /* @__PURE__ */ _(ne.Provider, {
169
+ value: null,
170
+ children: r(k) ? k : /* @__PURE__ */ v(g, { children: [
171
+ /* @__PURE__ */ _(fe, {}),
172
+ /* @__PURE__ */ _(pe, {}),
173
+ /* @__PURE__ */ v("div", {
174
+ className: "flex items-start gap-2",
175
+ children: [/* @__PURE__ */ _(p, {}), /* @__PURE__ */ _(f, {})]
176
+ }),
177
+ /* @__PURE__ */ _(m, {}),
178
+ w && /* @__PURE__ */ v("div", {
179
+ className: "flex items-center gap-2",
180
+ children: [
181
+ /* @__PURE__ */ _("span", {
182
+ className: e(i.opacityLabel, "w-14 text-caption-1 text-muted-foreground"),
183
+ children: M.opacity
184
+ }),
185
+ /* @__PURE__ */ _(de, { className: "min-w-0 flex-1" }),
186
+ /* @__PURE__ */ v("span", {
187
+ className: e(i.opacityValue, "w-10 text-end text-caption-1 text-muted-foreground"),
188
+ children: [De, "%"]
189
+ })
190
+ ]
191
+ })
192
+ ] })
193
+ })
194
+ }), /* @__PURE__ */ _(oe, {
195
+ type: "text",
196
+ name: ge,
197
+ form: D,
198
+ value: N,
199
+ required: Fe,
200
+ onInvalid: Le
201
+ })]
202
+ });
203
+ };
204
+ b.displayName = "ColorPicker";
205
+ var x = /* @__PURE__ */ Object.assign(b, {
206
+ HexField: f,
207
+ Swatches: m,
208
+ Preview: p
209
+ });
210
+ //#endregion
211
+ export { x as ColorPicker, f as ColorPickerHexField, p as ColorPickerPreview, m as ColorPickerSwatches };
212
+
213
+ //# sourceMappingURL=ColorPicker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPicker.mjs","names":["_Fragment","React","DEFAULT_PRESETS","resolvePresets","items","invalid","translucent","seen","preset","presets","color","parsed","parseHexColor","hasAlpha","stringLabel","deriveWorkingColor","next","hexToHsv","hex","previous","ColorPickerRoot","valueProp","ariaLabel","ariaLabelledBy","ariaDescribedBy","ariaInvalid","ariaRequired","ariaErrorMessage","rest","onChange","warnDeprecated","rawDefault","defaultValue","initialValue","normalizeHexColor","strings","DEFAULT_COLOR_PICKER_LABELS","labels","setColor","useControllable","onValueChange","alpha","opacity","alphaToOpacity","presetItems","invalidPresets","translucentPresets","invalidPresetKey","translucentPresetKey","invalidValue","warnOnce","rootRef","hexInputRef","mergedRef","useMergedRefs","ref","registerHexInput","input","draftResetKey","setDraftResetKey","field","useFieldContext","groupInvalid","_ariaRequired","_required","groupProps","useFieldControl","fieldInvalid","isRequired","required","errorMessageId","key","form","pickPreset","useEventCallback","rgb","formatHexColor","hsv","setHsvState","DEFAULT_PART_COLOR","normalized","hsvToHex","setHsv","context","shape","focusInvalidTarget","root","getFirstTabbable","cn","colorPickerClassNames","className","ColorPickerContext","FieldContext","slotRendersContent","children","Fragment","ColorArea","ColorSlider","ColorPickerPreview","ColorPickerHexField","ColorPickerSwatches","showOpacity","AlphaSlider","HiddenInput","ColorPicker"],"sources":["../../../src/components/input/ColorPicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { colorPickerClassNames } from '../../lib/classNames';\nimport { cn } from '../../lib/cn';\nimport { hexToHsv, hsvToHex } from '../../lib/color';\nimport { warnDeprecated, warnOnce } from '../../lib/dev';\nimport { getFirstTabbable } from '../../lib/focus';\nimport { slotRendersContent } from '../../lib/slot';\nimport type { ColorPickerShape, HsvColor } from '../../lib/types';\nimport { useControllable } from '../../hooks/useControllable';\nimport { useEventCallback } from '../../hooks/useEventCallback';\nimport { FieldContext, useFieldContext, useFieldControl } from '../../hooks/useFieldControl';\nimport { useFormReset } from '../../hooks/useFormReset';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { HiddenInput } from '../internal/HiddenInput';\nimport { AlphaSlider } from './AlphaSlider';\nimport { ColorArea } from './ColorArea';\nimport { ColorSlider } from './ColorSlider';\nimport type { SwatchItem } from './SwatchPicker';\nimport {\n ColorPickerContext,\n ColorPickerHexField,\n ColorPickerPreview,\n ColorPickerSwatches,\n DEFAULT_COLOR,\n DEFAULT_COLOR_PICKER_LABELS,\n DEFAULT_PART_COLOR,\n type ColorPickerContextValue,\n type ColorPickerLabels,\n} from './ColorPicker.parts';\nimport { alphaToOpacity, formatHexColor, normalizeHexColor, parseHexColor } from './colorUtils';\n\nexport { ColorPickerHexField, ColorPickerPreview, ColorPickerSwatches };\nexport type { ColorPickerLabels };\nexport type {\n ColorPickerHexFieldProps,\n ColorPickerPreviewProps,\n ColorPickerSwatchesProps,\n} from './ColorPicker.parts';\n\n/** A named preset color. */\nexport interface ColorPickerPreset {\n /**\n * Hex color (`#rrggbb`; `#rgb` is expanded). A preset has no opacity of its own: picking it keeps\n * the current opacity, so its alpha digits (`#rgba`, `#rrggbbaa`) are ignored. An alpha below\n * `f`/`ff` logs a development warning; an opaque one (`#rgbf`, `#rrggbbff`) changes nothing.\n */\n color: string;\n /** Accessible name of the preset swatch, e.g. `'Cranberry'`. */\n label: string;\n}\n\n/** Properties for the ColorPicker component. */\nexport interface ColorPickerProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /**\n * Controlled hex color: `#rrggbb`, or `#rrggbbaa` with an alpha byte (e.g. `'#0f6cbd80'` for\n * 50% opacity). Other formats are not supported (development warning).\n */\n value?: string;\n /**\n * Initial hex color for uncontrolled usage (also what a form reset restores). Like every edit it\n * is shown, submitted and reported as a lowercase `#rrggbb`, or `#rrggbbaa` when it is not fully\n * opaque (`'#ABC'` becomes `'#aabbcc'`).\n * @default '#0f6cbd'\n */\n defaultValue?: string;\n /**\n * Called with the new color when it changes: a lowercase `#rrggbb`, or `#rrggbbaa` when the color\n * is not fully opaque.\n */\n onValueChange?: (color: string) => void;\n /**\n * Called with the new color when it changes.\n * @deprecated Use `onValueChange`.\n */\n onChange?: (color: string) => void;\n /**\n * Preset colors shown as quick-select swatches. Pass `{ color, label }` objects so screen reader\n * users hear a name; a plain hex string is announced by its hex code. Non-hex presets are\n * skipped (development warning). Picking a preset keeps the current opacity, so a preset's alpha\n * digits are ignored. With an alpha below `f`/`ff` (`#rgba`, `#rrggbbaa`) there is a development\n * warning, and a string preset is announced by the `#rrggbb` color it applies; an opaque alpha\n * (`#rgbf`, `#rrggbbff`) changes nothing, and the string stays the name as written. With\n * `children`, the presets feed only `ColorPicker.Swatches`.\n * @default Blue, Red, Green, Yellow, Purple, Teal, Pink and Black (Fluent brand colors)\n */\n presets?: ReadonlyArray<string | ColorPickerPreset>;\n /**\n * Whether the default layout shows the opacity row: the caption, an alpha slider (0–100 %,\n * named by `labels.opacity`) and the percentage. The opacity is the alpha byte of `value`. Does\n * nothing with `children`.\n * @default false\n */\n showOpacity?: boolean;\n /** Texts of the picker's own parts and of the color parts bound to it, for localisation. */\n labels?: ColorPickerLabels;\n /**\n * `'square'` removes the corner radius of the preview and of the area and the rails of the\n * color parts bound to it, including those of the default layout.\n * @default 'rounded'\n */\n shape?: ColorPickerShape;\n /**\n * Your own layout: `ColorArea`, `ColorSlider` and `AlphaSlider` (bound to the picker while they\n * have neither `value` nor `defaultValue`) and the parts `ColorPicker.HexField`,\n * `ColorPicker.Swatches` and `ColorPicker.Preview`. Without children the picker renders its\n * default layout. With children, `showOpacity` does nothing and `presets` feed only\n * `ColorPicker.Swatches`.\n */\n children?: React.ReactNode;\n /** Form field name. With a name, the current color is submitted with the form. */\n name?: string;\n /**\n * Marks the hidden form input as required (a color is always chosen, so it never blocks). A\n * consumer `aria-required` has the same effect: `role=\"group\"` does not support it, so it is not\n * rendered on the group.\n */\n required?: boolean;\n /** Id of the form the picker belongs to, when it is rendered outside that form. */\n form?: string;\n /** Ref to the root `role=\"group\"` element. */\n ref?: React.Ref<HTMLDivElement>;\n}\n\nconst DEFAULT_PRESETS: readonly ColorPickerPreset[] = [\n { color: '#0f6cbd', label: 'Blue' }, // wave-allow-color: preset swatch data\n { color: '#d13438', label: 'Red' }, // wave-allow-color: preset swatch data\n { color: '#107c10', label: 'Green' }, // wave-allow-color: preset swatch data\n { color: '#ffb900', label: 'Yellow' }, // wave-allow-color: preset swatch data\n { color: '#5c2d91', label: 'Purple' }, // wave-allow-color: preset swatch data\n { color: '#008272', label: 'Teal' }, // wave-allow-color: preset swatch data\n { color: '#e3008c', label: 'Pink' }, // wave-allow-color: preset swatch data\n { color: '#242424', label: 'Black' }, // wave-allow-color: preset swatch data\n];\n\ninterface ResolvedPresets {\n items: SwatchItem[];\n /** Presets that are not hex colors (skipped). */\n invalid: string[];\n /** Presets with an alpha byte below 255, which a preset cannot apply (ignored). */\n translucent: string[];\n}\n\n/** Normalises presets to swatch items keyed by their lowercase `#rrggbb` (duplicates dropped). */\nfunction resolvePresets(presets: ReadonlyArray<string | ColorPickerPreset>): ResolvedPresets {\n const items: SwatchItem[] = [];\n const invalid: string[] = [];\n const translucent: string[] = [];\n const seen = new Set<string>();\n for (const preset of presets) {\n const color = typeof preset === 'string' ? preset : preset.color;\n const parsed = parseHexColor(color);\n if (!parsed) {\n invalid.push(color);\n continue;\n }\n // Picking a preset keeps the current opacity, so its own alpha never applies.\n const hasAlpha = parsed.alpha !== 255;\n if (hasAlpha) translucent.push(color);\n if (seen.has(parsed.rgb)) continue;\n seen.add(parsed.rgb);\n // A string preset is announced by its hex code: the color it applies, without the alpha.\n const stringLabel = hasAlpha ? parsed.rgb : color;\n items.push({\n value: parsed.rgb,\n color: parsed.rgb,\n label: typeof preset === 'string' ? stringLabel : preset.label,\n });\n }\n return { items, invalid, translucent };\n}\n\n/**\n * The working color for a hex value that differs from it: the value's HSV, keeping the previous\n * hue when the new color has no hue of its own (a gray, white or black) and the previous\n * saturation too at zero brightness, so a hue slider does not jump to red when the color reaches\n * gray. `hsvToHex` of the result is `hex` again.\n */\nfunction deriveWorkingColor(hex: string, previous: HsvColor): HsvColor {\n const next = hexToHsv(hex);\n if (!next) return previous;\n if (next.v === 0) return { ...next, h: previous.h, s: previous.s };\n if (next.s === 0) return { ...next, h: previous.h };\n return next;\n}\n\n// The ColorPicker root, documented on the exported `ColorPicker` const.\nconst ColorPickerRoot = ({\n value: valueProp,\n defaultValue,\n onValueChange,\n onChange,\n presets = DEFAULT_PRESETS,\n showOpacity = false,\n labels,\n shape = 'rounded',\n name,\n required,\n form,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n 'aria-errormessage': ariaErrorMessage,\n children,\n ref,\n ...rest\n}: ColorPickerProps) => {\n if (onChange !== undefined) warnDeprecated('ColorPicker', 'onChange', 'onValueChange');\n // The default is written like every edit (C-FORMS): the picker shows, submits and restores it as\n // a lowercase `#rrggbb`/`#rrggbbaa`. A value that is not a hex color stays as given (warning\n // below).\n const rawDefault = defaultValue ?? DEFAULT_COLOR;\n const initialValue = normalizeHexColor(rawDefault) ?? rawDefault;\n const strings = React.useMemo(() => ({ ...DEFAULT_COLOR_PICKER_LABELS, ...labels }), [labels]);\n const [color, setColor] = useControllable(valueProp, initialValue, (next: string) => {\n onValueChange?.(next);\n onChange?.(next);\n });\n\n const parsed = React.useMemo(() => parseHexColor(color), [color]);\n const alpha = parsed?.alpha ?? 255;\n const opacity = alphaToOpacity(alpha);\n\n const {\n items: presetItems,\n invalid: invalidPresets,\n translucent: translucentPresets,\n } = React.useMemo(() => resolvePresets(presets), [presets]);\n const invalidPresetKey = invalidPresets.join('\\n');\n const translucentPresetKey = translucentPresets.join('\\n');\n const invalidValue = parsed ? null : color;\n\n React.useEffect(() => {\n if (invalidValue !== null) {\n warnOnce(\n 'ColorPicker:invalid-value',\n `ColorPicker: \"${invalidValue}\" is not a hex color (#rrggbb or #rrggbbaa). Pass a hex value; the color area and sliders are disabled until then.`,\n );\n }\n }, [invalidValue]);\n React.useEffect(() => {\n if (!invalidPresetKey) return;\n for (const preset of invalidPresetKey.split('\\n')) {\n warnOnce(\n `ColorPicker:invalid-preset:${preset}`,\n `ColorPicker: preset \"${preset}\" is not a hex color (#rgb or #rrggbb) and is not shown.`,\n );\n }\n }, [invalidPresetKey]);\n React.useEffect(() => {\n if (!translucentPresetKey) return;\n for (const preset of translucentPresetKey.split('\\n')) {\n warnOnce(\n `ColorPicker:alpha-preset:${preset}`,\n `ColorPicker: preset \"${preset}\" has an alpha byte, which is ignored: picking a preset keeps the current opacity. Pass the color as #rgb or #rrggbb.`,\n );\n }\n }, [translucentPresetKey]);\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n const hexInputRef = React.useRef<HTMLInputElement | null>(null);\n const mergedRef = useMergedRefs<HTMLDivElement>(ref, rootRef);\n const registerHexInput = React.useCallback((input: HTMLInputElement | null) => {\n hexInputRef.current = input;\n }, []);\n // Changes whenever the hex field must drop its draft: a form reset or a preset pick.\n const [draftResetKey, setDraftResetKey] = React.useState(0);\n\n const field = useFieldContext();\n const fieldProps = useFieldControl(\n {\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n },\n { labelable: false },\n );\n // A group supports neither aria-invalid, aria-required nor a native `required` (ARIA 1.2): the\n // invalid state goes to the hex field and the required state to the hidden form input.\n const {\n 'aria-invalid': groupInvalid,\n 'aria-required': _ariaRequired,\n required: _required,\n ...groupProps\n } = fieldProps;\n const fieldInvalid =\n groupInvalid !== undefined && groupInvalid !== false && groupInvalid !== 'false';\n // A consumer aria-required is not supported on the group either: it requires the hidden input.\n const isRequired =\n required ?? (ariaRequired === true || ariaRequired === 'true' || (field?.required ?? false));\n // The consumer's error message belongs to the invalid state set from outside (the prop or the\n // Field), so it is routed to the hex field only while that state is set.\n const errorMessageId = (fieldInvalid && ariaErrorMessage) || undefined;\n\n useFormReset(\n rootRef,\n () => {\n // Only a real change is reported: the same color in another spelling (a controlled `#ABC`\n // against the default `#aabbcc`) is not one.\n if ((normalizeHexColor(color) ?? color) !== initialValue) setColor(initialValue);\n setDraftResetKey((key) => key + 1);\n },\n form,\n );\n\n const pickPreset = useEventCallback((rgb: string) => {\n // Only a preset color is committed. The presets' own form reset reports `''` (no swatch): it\n // is ignored here, and the picker's reset restores `defaultValue` (input-basic#12).\n const preset = parseHexColor(rgb);\n if (!preset) return;\n setDraftResetKey((key) => key + 1);\n setColor(formatHexColor(preset.rgb, alpha));\n });\n\n // The working color: HSV, so hue and saturation survive gray, white and black (hex keeps\n // neither). The value stays the source of truth: whenever it differs from the working color (a\n // change from outside, a form reset, or a controlled parent that ignored onValueChange), the\n // working color follows it. A parent that accepts a change sets exactly `hsvToHex(hsv)`, so the\n // working color is kept.\n const [hsv, setHsvState] = React.useState<HsvColor>(() =>\n deriveWorkingColor(color, DEFAULT_PART_COLOR),\n );\n const normalized = parsed ? formatHexColor(parsed.rgb, parsed.alpha) : null;\n if (normalized !== null && hsvToHex(hsv) !== normalized) {\n setHsvState(deriveWorkingColor(normalized, hsv));\n }\n const setHsv = useEventCallback((next: HsvColor) => {\n if (!parsed) return;\n setHsvState(next);\n setColor(hsvToHex(next));\n });\n\n const context = React.useMemo<ColorPickerContextValue>(\n () => ({\n hsv,\n setHsv,\n color,\n parsed,\n setColor,\n pickPreset,\n presetItems,\n shape,\n labels: strings,\n disabled: parsed === null,\n draftResetKey,\n field,\n groupInvalid,\n errorMessageId,\n registerHexInput,\n }),\n [\n hsv,\n setHsv,\n color,\n parsed,\n setColor,\n pickPreset,\n presetItems,\n shape,\n strings,\n draftResetKey,\n field,\n groupInvalid,\n errorMessageId,\n registerHexInput,\n ],\n );\n\n /** The hidden input's `onInvalid`: the hex field when there is one, else the first tabbable element. */\n const focusInvalidTarget = () => {\n const root = rootRef.current;\n (hexInputRef.current ?? (root ? getFirstTabbable(root) : null))?.focus();\n };\n\n return (\n <div\n role=\"group\"\n {...groupProps}\n className={cn(\n colorPickerClassNames.root,\n 'relative inline-flex flex-col gap-3 rounded border border-border bg-background p-3 shadow-4',\n className,\n )}\n {...rest}\n ref={mergedRef}\n >\n <ColorPickerContext.Provider value={context}>\n {/* The Field wiring (id, label, hint and error, invalid, required) stays on the group:\n the parts inside never read the surrounding FieldContext. */}\n <FieldContext.Provider value={null}>\n {slotRendersContent(children) ? (\n children\n ) : (\n <>\n <ColorArea />\n <ColorSlider />\n <div className=\"flex items-start gap-2\">\n <ColorPickerPreview />\n <ColorPickerHexField />\n </div>\n <ColorPickerSwatches />\n {showOpacity && (\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n colorPickerClassNames.opacityLabel,\n 'w-14 text-caption-1 text-muted-foreground',\n )}\n >\n {strings.opacity}\n </span>\n <AlphaSlider className=\"min-w-0 flex-1\" />\n <span\n className={cn(\n colorPickerClassNames.opacityValue,\n 'w-10 text-end text-caption-1 text-muted-foreground',\n )}\n >\n {opacity}%\n </span>\n </div>\n )}\n </>\n )}\n </FieldContext.Provider>\n </ColorPickerContext.Provider>\n <HiddenInput\n type=\"text\"\n name={name}\n form={form}\n value={color}\n required={isRequired}\n onInvalid={focusInvalidTarget}\n />\n </div>\n );\n};\n\nColorPickerRoot.displayName = 'ColorPicker';\n\n/**\n * A color picker whose value is a hex string (`#rrggbb`, or `#rrggbbaa` with an alpha byte),\n * grouped as a named `role=\"group\"`.\n *\n * - **Default layout** (no children): a color area (saturation and brightness) and a hue slider,\n * then a preview and the hex field, preset swatches and, with `showOpacity`, an opacity row\n * whose slider is an `AlphaSlider` (0–100 %). Dragging to gray, white or black keeps the hue.\n * - **Your own layout** (children): `ColorArea`, `ColorSlider` and `AlphaSlider`, which bind to\n * the picker while they have neither `value` nor `defaultValue`, and the parts\n * `ColorPicker.HexField`, `ColorPicker.Swatches` and `ColorPicker.Preview`.\n * - **Hex field**: the text is a draft. Complete 6- and 8-digit values apply while typing; text\n * that can never be a hex color is flagged at once (`aria-invalid` plus the `hexError`\n * description). Leaving the field or pressing Enter applies a short `#rgb` (keeping the current\n * opacity) or `#rgba`, then shows the current value again; other text stays flagged until it is\n * corrected, cleared, or the value changes from elsewhere. Enter still submits the surrounding\n * form, with the color just applied.\n * - **Presets** render as a SwatchPicker radiogroup (\"Preset colors\"): one tab stop, arrow keys\n * move and pick, and picking keeps the current opacity.\n * - **Naming**: `aria-label`/`aria-labelledby` name the group; inside a `Field` its label does,\n * and the Field's hint and error describe the group. The invalid state (`aria-invalid`, from the\n * Field or the prop) is set on the hex field, since `role=\"group\"` does not support it, and a\n * consumer `aria-errormessage` goes there too. A consumer `aria-required` makes the hidden form\n * input required instead. The built-in texts are localised with `labels`.\n * - **Forms**: with `name` the color is submitted with the form; a form reset restores\n * `defaultValue` and reports it through `onValueChange` only when the color changes.\n *\n * React Server Components cannot dot into a client module: import the flat names\n * `ColorPickerHexField`, `ColorPickerSwatches` and `ColorPickerPreview` there;\n * `ColorPicker.HexField` etc. work in client files.\n *\n * @example\n * <ColorPicker aria-label=\"Accent color\" showOpacity value={color} onValueChange={setColor} />\n *\n * <ColorPicker aria-label=\"Accent color\" value={color} onValueChange={setColor}>\n * <ColorArea />\n * <ColorSlider />\n * <ColorPicker.HexField />\n * </ColorPicker>\n */\nexport const ColorPicker = /* @__PURE__ */ Object.assign(ColorPickerRoot, {\n HexField: ColorPickerHexField,\n Swatches: ColorPickerSwatches,\n Preview: ColorPickerPreview,\n});\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/dev.cjs"),r=require("../../lib/composeEventHandlers.cjs"),i=require("../../lib/classNames.cjs"),a=require("../../hooks/useControllable.cjs"),o=require("../../hooks/useId.cjs"),s=require("../../hooks/useMergedRefs.cjs"),c=require("../../lib/aria.cjs"),l=require("../../lib/styles.cjs"),u=require("./Input.cjs"),d=require("./colorUtils.cjs"),f=require("./SwatchPicker.cjs");let p=require("react");p=e.__toESM(p,1);let m=require("react/jsx-runtime");var h=`#0f6cbd`,g={h:208,s:.92,v:.74},_={hex:`Hex`,hexInput:`Hex color value`,hexError:`Enter a hex color such as ${h}.`,presets:`Preset colors`,opacity:`Opacity`,area:`Saturation and brightness`,saturation:`Saturation`,brightness:`Brightness`,roleDescription:`2D slider`,hue:`Hue`,transparency:`Transparency`},v=p.createContext(null);v.displayName=`ColorPickerContext`;function y(){return p.useContext(v)}var b=()=>{};function x({value:e,defaultValue:t,onValueChange:n,disabled:r}){let i=y(),o=i!==null&&e===void 0&&t===void 0?i:null,s=t??g,[c,l]=a.useControllable(e,s,o?void 0:n);return o?{picker:o,color:o.hsv,setColor:e=>{o.setHsv(e),n?.(e)},reset:b,disabled:r||o.disabled}:{picker:null,color:c,setColor:l,reset:()=>{d.sameColor(c,s)||l(s)},disabled:r}}var S={hsv:g,setHsv:b,color:h,parsed:null,setColor:b,pickPreset:b,presetItems:[],shape:`rounded`,labels:_,disabled:!0,draftResetKey:0,field:null,groupInvalid:void 0,errorMessageId:void 0,registerHexInput:b};function C(e){return p.useContext(v)||(n.reportMissingContext(e,`<ColorPicker>`),S)}function w(e){let t=e.trim();return t===``||t===`#`}function T(e){let t=e.trim().replace(/^#/,``).length;return t===4||t===8}var E=({id:e,"aria-label":n,"aria-labelledby":a,"aria-describedby":f,"aria-invalid":h,"aria-errormessage":g,"aria-details":_,"aria-required":v,autoFocus:y,tabIndex:b,onFocus:x,onBlur:S,onKeyDown:E,onKeyUp:D,inputMode:O,enterKeyHint:k,autoCapitalize:ee,autoCorrect:te,spellCheck:ne,controlRef:re,className:A,ref:j,...M})=>{let N=C(`ColorPicker.HexField`),{color:P,parsed:ie,field:F,groupInvalid:I,errorMessageId:L,labels:R}=N,z=ie?.alpha??255,[B,V]=p.useState(null),[H,U]=p.useState(P);P!==H&&(U(P),B?.flagged&&V(null));let[W,G]=p.useState(N.draftResetKey);N.draftResetKey!==W&&(G(N.draftResetKey),V(null));let K=B?.text??P,q=B!==null&&!w(B.text)&&(B.flagged||!d.isHexDraft(B.text)),J=I!==void 0&&I!==!1&&I!==`false`,Y=o.useId(`wave-color-picker-error`),X=h??(q?!0:J?I:void 0),ae=u.isInvalidLook(!1,X),oe=p.useRef(null),se=s.useMergedRefs(oe,re,N.registerHexInput),Z=(e,t)=>N.setColor(d.formatHexColor(e,t)),Q=e=>{let t=e.target.value.trim();t!==``&&!t.startsWith(`#`)&&(t=`#${t}`),V({text:t,flagged:!1});let n=d.parseHexInput(t);n&&Z(n.rgb,T(t)?n.alpha:z)},$=()=>{if(B===null||B.flagged)return;let e=d.parseHexColor(B.text);if(e||w(B.text)){e&&!d.parseHexInput(B.text)&&Z(e.rgb,T(B.text)?e.alpha:z),V(null);return}V({text:B.text,flagged:!0})},ce=r.composeEventHandlers(S,$),le=r.composeEventHandlers(E,e=>{e.key===`Enter`&&!e.nativeEvent.isComposing&&$()});return(0,m.jsxs)(`label`,{ref:j,className:t.cn(i.colorPickerHexFieldClassNames.root,`flex min-w-0 flex-col gap-1`,A),...M,children:[(0,m.jsx)(`span`,{className:t.cn(i.colorPickerHexFieldClassNames.label,`text-caption-1 text-muted-foreground`),children:R.hex}),(0,m.jsx)(`input`,{ref:se,id:e,type:`text`,value:K,onChange:Q,onKeyDown:le,onKeyUp:D,onFocus:x,onBlur:ce,"aria-label":n??(a===void 0?R.hexInput:void 0),"aria-labelledby":a,"aria-invalid":X,"aria-errormessage":g??L,"aria-describedby":c.joinIds(q&&Y,F?.validationMessageId??(J?F?.errorId:void 0),L,f),"aria-details":_,"aria-required":v,autoFocus:y,tabIndex:b,inputMode:O,enterKeyHint:k,autoCapitalize:ee,autoCorrect:te,spellCheck:ne??!1,maxLength:9,autoComplete:`off`,className:t.cn(i.colorPickerHexFieldClassNames.input,`w-24 rounded border border-input border-b-stroke-accessible bg-background px-2 py-1 text-body-1 text-foreground`,l.inputFocus,ae&&`border-destructive focus:border-b-destructive`)}),q&&(0,m.jsx)(`span`,{id:Y,className:t.cn(i.colorPickerHexFieldClassNames.errorMessage,`text-caption-1 text-error`),children:R.hexError})]})};E.displayName=`ColorPickerHexField`;var D=({className:e,"aria-label":n,size:r=`small`,shape:a=`rounded`,...o})=>{let s=C(`ColorPicker.Swatches`);return s.presetItems.length===0?null:(0,m.jsx)(f.SwatchPicker,{"aria-label":n??(o[`aria-labelledby`]===void 0?s.labels.presets:void 0),size:r,shape:a,...o,className:t.cn(i.colorPickerSwatchesClassNames.root,e),items:s.presetItems,value:s.parsed?s.parsed.rgb:``,onValueChange:s.pickPreset})};D.displayName=`ColorPickerSwatches`;var O=({className:e,style:n,ref:r,...a})=>{let o=C(`ColorPicker.Preview`),s=o.parsed?d.formatHexColor(o.parsed.rgb,o.parsed.alpha):o.color;return(0,m.jsx)(`div`,{"data-color-preview":``,"aria-hidden":`true`,...a,ref:r,className:t.cn(i.colorPickerPreviewClassNames.root,`h-10 w-10 shrink-0 rounded border border-border forced-colors:forced-color-adjust-none`,o.shape===`square`&&`rounded-none`,e),style:{...n,backgroundColor:s}})};O.displayName=`ColorPickerPreview`,exports.ColorPickerContext=v,exports.ColorPickerHexField=E,exports.ColorPickerPreview=O,exports.ColorPickerSwatches=D,exports.DEFAULT_COLOR=h,exports.DEFAULT_COLOR_PICKER_LABELS=_,exports.DEFAULT_PART_COLOR=g,exports.useColorPartState=x,exports.useColorPickerContext=y,exports.usePickerPartContext=C;
2
+ //# sourceMappingURL=ColorPicker.parts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPicker.parts.cjs","names":["React","useControllable","sameColor","isHexDraft","useId","isInvalidLook","useMergedRefs","formatHexColor","parseHexInput","parseHexColor","composeEventHandlers","cn","colorPickerHexFieldClassNames","joinIds","inputFocus","SwatchPicker","colorPickerSwatchesClassNames","colorPickerPreviewClassNames","require_runtime","require_cn","require_dev","require_composeEventHandlers","require_classNames","require_useControllable","require_useId","require_useMergedRefs","require_aria","require_styles","require_Input","require_colorUtils","require_SwatchPicker","react","react_jsx_runtime","DEFAULT_COLOR","DEFAULT_PART_COLOR","DEFAULT_COLOR_PICKER_LABELS","ColorPickerContext","useColorPickerContext","noop","useColorPartState","context","picker","value","defaultValue","initial","own","setOwn","onValueChange","next","disabled","INERT_PICKER_CONTEXT","usePickerPartContext","componentName","isBlankDraft","trimmed","text","hasAlphaDigits","digits","ColorPickerHexField","ariaLabel","ariaLabelledBy","ariaDescribedBy","ariaInvalid","ariaErrorMessage","ariaDetails","ariaRequired","rest","alpha","parsed","draft","setDraft","syncedColor","setSyncedColor","color","seenResetKey","setSeenResetKey","hexText","draftInvalid","fieldInvalid","groupInvalid","errorId","resolvedInvalid","invalidLook","inputRef","mergedInputRef","controlRef","commit","rgb","nextAlpha","handleChange","event","typed","finishDraft","handleBlur","onBlur","handleKeyDown","onKeyDown","className","labels","errorMessageId","field","spellCheck","ColorPickerSwatches","ColorPickerPreview","shown","style"],"sources":["../../../src/components/input/ColorPicker.parts.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useControllable } from '../../hooks/useControllable';\nimport type { FieldContextValue } from '../../hooks/useFieldControl';\nimport { useId } from '../../hooks/useId';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { joinIds } from '../../lib/aria';\nimport {\n colorPickerHexFieldClassNames,\n colorPickerPreviewClassNames,\n colorPickerSwatchesClassNames,\n} from '../../lib/classNames';\nimport { cn } from '../../lib/cn';\nimport { composeEventHandlers } from '../../lib/composeEventHandlers';\nimport { reportMissingContext } from '../../lib/dev';\nimport { inputFocus, inputInvalid } from '../../lib/styles';\nimport type { ColorPickerShape, HsvColor } from '../../lib/types';\nimport { isInvalidLook } from './Input';\nimport { SwatchPicker, type SwatchItem, type SwatchPickerProps } from './SwatchPicker';\nimport {\n formatHexColor,\n isHexDraft,\n parseHexColor,\n parseHexInput,\n sameColor,\n type HexColor,\n} from './colorUtils';\n\n/*\n * The picker's labels and context, and how the standalone color parts bind to it (spec P3-05,\n * D21). `ColorArea`, `ColorSlider` and `AlphaSlider` read the context; `ColorPicker.tsx` provides\n * it and renders the picker-only parts. This module never imports `ColorPicker.tsx`.\n */\n\n// wave-allow-color: default color value (user color data, C-TOKENS exception)\nexport const DEFAULT_COLOR = '#0f6cbd';\n\n/** The default color of a standalone part: the default picker color in HSV. */\nexport const DEFAULT_PART_COLOR: HsvColor = { h: 208, s: 0.92, v: 0.74 };\n\n/**\n * Texts of the ColorPicker's own parts and of the color parts bound to it, for localisation.\n * Every key is optional; missing keys use the English default.\n */\nexport interface ColorPickerLabels {\n /** Visible caption above the hex field.\n * @default 'Hex'\n */\n hex?: string;\n /** Accessible name of the hex text field.\n * @default 'Hex color value'\n */\n hexInput?: string;\n /** Error text shown (and used as the hex field's description) while the typed text can never be\n * a hex color, or when the field is left with text that is not one (such as `#12345`).\n * @default 'Enter a hex color such as #0f6cbd.'\n */\n hexError?: string;\n /** Accessible name of the preset swatches radiogroup.\n * @default 'Preset colors'\n */\n presets?: string;\n /** Visible label of the opacity row and accessible name of the opacity slider (a bound\n * `AlphaSlider`).\n * @default 'Opacity'\n */\n opacity?: string;\n /** Accessible name of a bound `ColorArea`'s group.\n * @default 'Saturation and brightness'\n */\n area?: string;\n /** Name of a bound area's saturation slider and of a bound `channel=\"saturation\"` slider.\n * @default 'Saturation'\n */\n saturation?: string;\n /** Name of a bound area's brightness slider and of a bound `channel=\"value\"` slider.\n * @default 'Brightness'\n */\n brightness?: string;\n /** Role description of a bound area's two sliders.\n * @default '2D slider'\n */\n roleDescription?: string;\n /** Name of a bound hue slider.\n * @default 'Hue'\n */\n hue?: string;\n /** Name of a bound `AlphaSlider` with `transparency`.\n * @default 'Transparency'\n */\n transparency?: string;\n /** Names the color at the end of the bound parts' value texts; return `''` to leave it out.\n * @default an English namer (\"dark blue\")\n */\n colorName?: (color: HsvColor) => string;\n /** Replaces a whole value text of a bound part, for languages whose order differs. */\n valueText?: (color: HsvColor, channel: 'hue' | 'saturation' | 'value' | 'alpha') => string;\n}\n\n/** The labels with every string default filled in (the two functions stay optional). */\nexport type ResolvedColorPickerLabels = Required<\n Omit<ColorPickerLabels, 'colorName' | 'valueText'>\n> &\n Pick<ColorPickerLabels, 'colorName' | 'valueText'>;\n\nexport const DEFAULT_COLOR_PICKER_LABELS: ResolvedColorPickerLabels = {\n hex: 'Hex',\n hexInput: 'Hex color value',\n hexError: `Enter a hex color such as ${DEFAULT_COLOR}.`,\n presets: 'Preset colors',\n opacity: 'Opacity',\n area: 'Saturation and brightness',\n saturation: 'Saturation',\n brightness: 'Brightness',\n roleDescription: '2D slider',\n hue: 'Hue',\n transparency: 'Transparency',\n};\n\n/** What a ColorPicker shares with its parts and with the color parts bound to it. */\nexport interface ColorPickerContextValue {\n /** The working color: HSV, so hue and saturation survive gray, white and black. */\n hsv: HsvColor;\n /** Writes the working color from a bound part and reports its hex (only when the hex changes). */\n setHsv: (next: HsvColor) => void;\n /** The picker's value as given: a hex string, or a value that is not one (as given). */\n color: string;\n /** The value parsed (`#rrggbb` and the alpha byte), `null` while it is not a hex color. */\n parsed: HexColor | null;\n /** Writes the value as hex text (the hex field). */\n setColor: (next: string) => void;\n /** Applies a preset's `#rrggbb` at the current opacity and drops the hex field's draft. */\n pickPreset: (rgb: string) => void;\n /** The picker's presets as swatch items (values are `#rrggbb`). */\n presetItems: readonly SwatchItem[];\n /** The picker's `shape`, inherited by the bound parts and `ColorPicker.Preview`. */\n shape: ColorPickerShape;\n /** The picker's labels with every string default filled in. */\n labels: ResolvedColorPickerLabels;\n /** `true` while the value is not a hex color: the bound parts are disabled until one arrives. */\n disabled: boolean;\n /** Changes whenever the hex field must drop its draft: a form reset or a preset pick. */\n draftResetKey: number;\n /** The Field around the picker (its parts render in a `null` Field context). */\n field: FieldContextValue | null;\n /** The invalid state set on the picker from outside (its `aria-invalid` or the Field's), as given. */\n groupInvalid: React.AriaAttributes['aria-invalid'];\n /** The consumer's `aria-errormessage`, routed to the hex field while that state is set. */\n errorMessageId: string | undefined;\n /** The hex field registers its `<input>` here (the hidden input's `onInvalid` focuses it). */\n registerHexInput: (input: HTMLInputElement | null) => void;\n}\n\nexport const ColorPickerContext = React.createContext<ColorPickerContextValue | null>(null);\nColorPickerContext.displayName = 'ColorPickerContext';\n\n/** The enclosing ColorPicker's context, or `null` outside one (the standalone parts need none). */\nexport function useColorPickerContext(): ColorPickerContextValue | null {\n return React.useContext(ColorPickerContext);\n}\n\n/** What a color part passes to {@link useColorPartState}. */\nexport interface ColorPartOptions {\n value: HsvColor | undefined;\n defaultValue: HsvColor | undefined;\n onValueChange: ((value: HsvColor) => void) | undefined;\n disabled: boolean;\n}\n\n/** Where a color part's color lives: in the enclosing picker (bound) or in the part. */\nexport interface ColorPartState {\n /** The enclosing picker when the part binds to it, else `null`. */\n picker: ColorPickerContextValue | null;\n /** The color as given (bound: the picker's working color). */\n color: HsvColor;\n /**\n * Writes a new color. Bound: the picker's working color, then the part's own `onValueChange`\n * (a part given only the callback listens; C-NAMING). Otherwise the part's state, through\n * `useControllable`.\n */\n setColor: (next: HsvColor) => void;\n /** Restores `defaultValue` on a form reset, reporting only a real change; nothing while bound. */\n reset: () => void;\n /** The part's `disabled`, or the picker's disabled state while bound. */\n disabled: boolean;\n}\n\nconst noop = () => {};\n\n/**\n * The binding rule of `ColorArea`, `ColorSlider` and `AlphaSlider` (D21): inside a ColorPicker, a\n * part with neither `value` nor `defaultValue` reads and writes the picker's working color;\n * anywhere else, or with either prop, it keeps its own color.\n */\nexport function useColorPartState({\n value,\n defaultValue,\n onValueChange,\n disabled,\n}: ColorPartOptions): ColorPartState {\n const context = useColorPickerContext();\n const picker =\n context !== null && value === undefined && defaultValue === undefined ? context : null;\n const initial = defaultValue ?? DEFAULT_PART_COLOR;\n const [own, setOwn] = useControllable(value, initial, picker ? undefined : onValueChange);\n if (picker) {\n return {\n picker,\n color: picker.hsv,\n setColor: (next) => {\n picker.setHsv(next);\n onValueChange?.(next);\n },\n reset: noop,\n disabled: disabled || picker.disabled,\n };\n }\n return {\n picker: null,\n color: own,\n setColor: setOwn,\n reset: () => {\n if (!sameColor(own, initial)) setOwn(initial);\n },\n disabled,\n };\n}\n\n// ---------------------------------------------------------------------------------------------\n// The picker-only parts: ColorPicker.HexField, ColorPicker.Swatches, ColorPicker.Preview\n// ---------------------------------------------------------------------------------------------\n\n/** The context a misplaced part renders with in production (C-CONTEXT). */\nconst INERT_PICKER_CONTEXT: ColorPickerContextValue = {\n hsv: DEFAULT_PART_COLOR,\n setHsv: noop,\n color: DEFAULT_COLOR,\n parsed: null,\n setColor: noop,\n pickPreset: noop,\n presetItems: [],\n shape: 'rounded',\n labels: DEFAULT_COLOR_PICKER_LABELS,\n disabled: true,\n draftResetKey: 0,\n field: null,\n groupInvalid: undefined,\n errorMessageId: undefined,\n registerHexInput: noop,\n};\n\n/**\n * The context of a picker-only part: throws `[WaveUI] <name> must be used within <ColorPicker>`\n * in development; logs once and returns an inert value in production (C-CONTEXT).\n */\nexport function usePickerPartContext(componentName: string): ColorPickerContextValue {\n const context = React.useContext(ColorPickerContext);\n if (context) return context;\n reportMissingContext(componentName, '<ColorPicker>');\n return INERT_PICKER_CONTEXT;\n}\n\n/** The hex field's text while the user edits it (`null` state: the field shows the value). */\ninterface HexDraft {\n /** The typed text. */\n text: string;\n /** Kept after leaving the field because it is not a hex color, so it is flagged as invalid. */\n flagged: boolean;\n}\n\n/** A hex draft without digits (`''` or a lone `#`): leaving the field shows the value again. */\nfunction isBlankDraft(text: string): boolean {\n const trimmed = text.trim();\n return trimmed === '' || trimmed === '#';\n}\n\n/** Whether typed hex text carries its own alpha digits (`#rgba` or `#rrggbbaa`). */\nfunction hasAlphaDigits(text: string): boolean {\n const digits = text.trim().replace(/^#/, '').length;\n return digits === 4 || digits === 8;\n}\n\n/**\n * Properties for the ColorPickerHexField sub-component. `id`, the labelling and validation\n * `aria-*` (`aria-label`, `aria-labelledby`, `aria-describedby`, `aria-invalid`,\n * `aria-errormessage`, `aria-details`, `aria-required`), `autoFocus`, `tabIndex`, the focus and key\n * handlers and the text-entry attributes (`inputMode`, `enterKeyHint`, `autoCapitalize`,\n * `autoCorrect`, `spellCheck`) go to the `<input>`; everything else stays on the outer label.\n */\nexport interface ColorPickerHexFieldProps extends React.HTMLAttributes<HTMLElement> {\n /** Ref to the hex `<input>`. */\n controlRef?: React.Ref<HTMLInputElement>;\n /** Ref to the field's outer element: the label around the caption, the input and the error. */\n ref?: React.Ref<HTMLLabelElement>;\n}\n\n/**\n * The hex text field of a ColorPicker: a caption, the input and its error. The text is a draft:\n * complete 6- and 8-digit values apply while typing, text that can never be a hex color is\n * flagged at once, and leaving the field (or Enter) applies a short `#rgb`/`#rgba` and shows the\n * value again; other text stays flagged until it is corrected, cleared, or the value changes from\n * elsewhere (a preset, another part, the parent, a form reset). Inside a Field it carries the\n * Field's invalid state and error. Must be inside a ColorPicker. Also exported as\n * `ColorPickerHexField` (import the flat name in React Server Components).\n */\nexport const ColorPickerHexField = ({\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-errormessage': ariaErrorMessage,\n 'aria-details': ariaDetails,\n 'aria-required': ariaRequired,\n autoFocus,\n tabIndex,\n onFocus,\n onBlur,\n onKeyDown,\n onKeyUp,\n inputMode,\n enterKeyHint,\n autoCapitalize,\n autoCorrect,\n spellCheck,\n controlRef,\n className,\n ref,\n ...rest\n}: ColorPickerHexFieldProps) => {\n const picker = usePickerPartContext('ColorPicker.HexField');\n const { color, parsed, field, groupInvalid, errorMessageId, labels } = picker;\n const alpha = parsed?.alpha ?? 255;\n\n // The hex text is a draft over `color` while the user edits it (null: show `color`).\n const [draft, setDraft] = React.useState<HexDraft | null>(null);\n // A value change from elsewhere replaces a flagged draft (input-pickers#25); while the user\n // types, the draft is not flagged and stays.\n const [syncedColor, setSyncedColor] = React.useState(color);\n if (color !== syncedColor) {\n setSyncedColor(color);\n if (draft?.flagged) setDraft(null);\n }\n // A form reset or a preset pick drops any draft.\n const [seenResetKey, setSeenResetKey] = React.useState(picker.draftResetKey);\n if (picker.draftResetKey !== seenResetKey) {\n setSeenResetKey(picker.draftResetKey);\n setDraft(null);\n }\n const hexText = draft?.text ?? color;\n const draftInvalid =\n draft !== null && !isBlankDraft(draft.text) && (draft.flagged || !isHexDraft(draft.text));\n // Any invalid state from outside (the picker's prop or the Field) is set on the input as is;\n // only `true` shows the error look.\n const fieldInvalid =\n groupInvalid !== undefined && groupInvalid !== false && groupInvalid !== 'false';\n const errorId = useId('wave-color-picker-error');\n const resolvedInvalid =\n ariaInvalid ?? (draftInvalid ? true : fieldInvalid ? groupInvalid : undefined);\n const invalidLook = isInvalidLook(false, resolvedInvalid);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const mergedInputRef = useMergedRefs(inputRef, controlRef, picker.registerHexInput);\n\n /** The single commit path: every edit is `#rrggbb` + an alpha byte. */\n const commit = (rgb: string, nextAlpha: number) =>\n picker.setColor(formatHexColor(rgb, nextAlpha));\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n // Surrounding whitespace (a pasted `'#abcdef '`) is dropped, so the text that is checked,\n // committed and shown is the same.\n let text = event.target.value.trim();\n if (text !== '' && !text.startsWith('#')) text = `#${text}`;\n setDraft({ text, flagged: false });\n const typed = parseHexInput(text);\n // A 6-digit hex keeps the current opacity; an 8-digit one brings its own alpha.\n if (typed) commit(typed.rgb, hasAlphaDigits(text) ? typed.alpha : alpha);\n };\n\n /** Finishes the draft when the field is left or Enter is pressed. */\n const finishDraft = () => {\n if (draft === null || draft.flagged) return;\n const typed = parseHexColor(draft.text);\n if (typed || isBlankDraft(draft.text)) {\n // A short `#rgb` (current opacity) or `#rgba` is applied here; complete values were\n // applied while typing, so a rejecting parent is not asked twice. Then the field shows the\n // current value (also when a controlled parent rejected it).\n if (typed && !parseHexInput(draft.text)) {\n commit(typed.rgb, hasAlphaDigits(draft.text) ? typed.alpha : alpha);\n }\n setDraft(null);\n return;\n }\n // Text that is not a hex color is kept and flagged instead of thrown away (WCAG 3.3.1).\n setDraft({ text: draft.text, flagged: true });\n };\n\n const handleBlur = composeEventHandlers(onBlur, finishDraft);\n // Not prevented: Enter still submits the surrounding form, with the color just applied.\n const handleKeyDown = composeEventHandlers(\n onKeyDown,\n (event: React.KeyboardEvent<HTMLElement>) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) finishDraft();\n },\n );\n\n return (\n <label\n ref={ref}\n className={cn(colorPickerHexFieldClassNames.root, 'flex min-w-0 flex-col gap-1', className)}\n {...rest}\n >\n <span\n className={cn(colorPickerHexFieldClassNames.label, 'text-caption-1 text-muted-foreground')}\n >\n {labels.hex}\n </span>\n <input\n ref={mergedInputRef}\n id={id}\n type=\"text\"\n value={hexText}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onKeyUp={onKeyUp}\n onFocus={onFocus}\n onBlur={handleBlur}\n aria-label={ariaLabel ?? (ariaLabelledBy === undefined ? labels.hexInput : undefined)}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={resolvedInvalid}\n aria-errormessage={ariaErrorMessage ?? errorMessageId}\n aria-describedby={joinIds(\n draftInvalid && errorId,\n field?.validationMessageId ?? (fieldInvalid ? field?.errorId : undefined),\n errorMessageId,\n ariaDescribedBy,\n )}\n aria-details={ariaDetails}\n aria-required={ariaRequired}\n autoFocus={autoFocus}\n tabIndex={tabIndex}\n inputMode={inputMode}\n enterKeyHint={enterKeyHint}\n autoCapitalize={autoCapitalize}\n autoCorrect={autoCorrect}\n spellCheck={spellCheck ?? false}\n maxLength={9}\n autoComplete=\"off\"\n className={cn(\n colorPickerHexFieldClassNames.input,\n 'w-24 rounded border border-input border-b-stroke-accessible bg-background px-2 py-1 text-body-1 text-foreground',\n inputFocus,\n invalidLook && inputInvalid,\n )}\n />\n {draftInvalid && (\n <span\n id={errorId}\n className={cn(colorPickerHexFieldClassNames.errorMessage, 'text-caption-1 text-error')}\n >\n {labels.hexError}\n </span>\n )}\n </label>\n );\n};\n\nColorPickerHexField.displayName = 'ColorPickerHexField';\n\n/** Properties for the ColorPickerSwatches sub-component: the picker's `presets` as a SwatchPicker. */\nexport type ColorPickerSwatchesProps = Omit<\n SwatchPickerProps,\n 'items' | 'value' | 'defaultValue' | 'onValueChange' | 'onChange' | 'name' | 'form' | 'required'\n>;\n\n/**\n * The picker's `presets` as swatches (a SwatchPicker named by `labels.presets`, small and rounded\n * unless you pass `size` or `shape`). Picking one keeps the opacity. Renders nothing without\n * presets. Must be inside a ColorPicker. Also exported as `ColorPickerSwatches`.\n */\nexport const ColorPickerSwatches = ({\n className,\n 'aria-label': ariaLabel,\n size = 'small',\n shape = 'rounded',\n ...rest\n}: ColorPickerSwatchesProps) => {\n const picker = usePickerPartContext('ColorPicker.Swatches');\n if (picker.presetItems.length === 0) return null;\n return (\n <SwatchPicker\n aria-label={\n ariaLabel ?? (rest['aria-labelledby'] === undefined ? picker.labels.presets : undefined)\n }\n size={size}\n shape={shape}\n {...rest}\n className={cn(colorPickerSwatchesClassNames.root, className)}\n items={picker.presetItems}\n value={picker.parsed ? picker.parsed.rgb : ''}\n onValueChange={picker.pickPreset}\n />\n );\n};\n\nColorPickerSwatches.displayName = 'ColorPickerSwatches';\n\n/** Properties for the ColorPickerPreview sub-component. */\nexport interface ColorPickerPreviewProps extends React.HTMLAttributes<HTMLDivElement> {\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A swatch of the picker's current color (decorative, `aria-hidden`); it keeps its color in forced\n * colors and follows the picker's `shape`. Must be inside a ColorPicker. Also exported as\n * `ColorPickerPreview`.\n */\nexport const ColorPickerPreview = ({ className, style, ref, ...rest }: ColorPickerPreviewProps) => {\n const picker = usePickerPartContext('ColorPicker.Preview');\n const shown = picker.parsed\n ? formatHexColor(picker.parsed.rgb, picker.parsed.alpha)\n : picker.color;\n return (\n <div\n data-color-preview=\"\"\n aria-hidden=\"true\"\n {...rest}\n ref={ref}\n className={cn(\n colorPickerPreviewClassNames.root,\n 'h-10 w-10 shrink-0 rounded border border-border forced-colors:forced-color-adjust-none',\n picker.shape === 'square' && 'rounded-none',\n className,\n )}\n style={{ ...style, backgroundColor: shown }}\n />\n );\n};\n\nColorPickerPreview.displayName = 'ColorPickerPreview';\n"],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/cn.mjs";
3
+ import { reportMissingContext as t } from "../../lib/dev.mjs";
4
+ import { composeEventHandlers as n } from "../../lib/composeEventHandlers.mjs";
5
+ import { colorPickerHexFieldClassNames as r, colorPickerPreviewClassNames as i, colorPickerSwatchesClassNames as a } from "../../lib/classNames.mjs";
6
+ import { useControllable as o } from "../../hooks/useControllable.mjs";
7
+ import { useId as s } from "../../hooks/useId.mjs";
8
+ import { useMergedRefs as c } from "../../hooks/useMergedRefs.mjs";
9
+ import { joinIds as l } from "../../lib/aria.mjs";
10
+ import { inputFocus as ee } from "../../lib/styles.mjs";
11
+ import { isInvalidLook as u } from "./Input.mjs";
12
+ import { formatHexColor as d, isHexDraft as te, parseHexColor as ne, parseHexInput as f, sameColor as p } from "./colorUtils.mjs";
13
+ import { SwatchPicker as m } from "./SwatchPicker.mjs";
14
+ import * as h from "react";
15
+ import { jsx as g, jsxs as re } from "react/jsx-runtime";
16
+ //#region src/components/input/ColorPicker.parts.tsx
17
+ var _ = "#0f6cbd", v = {
18
+ h: 208,
19
+ s: .92,
20
+ v: .74
21
+ }, y = {
22
+ hex: "Hex",
23
+ hexInput: "Hex color value",
24
+ hexError: `Enter a hex color such as ${_}.`,
25
+ presets: "Preset colors",
26
+ opacity: "Opacity",
27
+ area: "Saturation and brightness",
28
+ saturation: "Saturation",
29
+ brightness: "Brightness",
30
+ roleDescription: "2D slider",
31
+ hue: "Hue",
32
+ transparency: "Transparency"
33
+ }, b = h.createContext(null);
34
+ b.displayName = "ColorPickerContext";
35
+ function x() {
36
+ return h.useContext(b);
37
+ }
38
+ var S = () => {};
39
+ function C({ value: e, defaultValue: t, onValueChange: n, disabled: r }) {
40
+ let i = x(), a = i !== null && e === void 0 && t === void 0 ? i : null, s = t ?? v, [c, l] = o(e, s, a ? void 0 : n);
41
+ return a ? {
42
+ picker: a,
43
+ color: a.hsv,
44
+ setColor: (e) => {
45
+ a.setHsv(e), n?.(e);
46
+ },
47
+ reset: S,
48
+ disabled: r || a.disabled
49
+ } : {
50
+ picker: null,
51
+ color: c,
52
+ setColor: l,
53
+ reset: () => {
54
+ p(c, s) || l(s);
55
+ },
56
+ disabled: r
57
+ };
58
+ }
59
+ var w = {
60
+ hsv: v,
61
+ setHsv: S,
62
+ color: _,
63
+ parsed: null,
64
+ setColor: S,
65
+ pickPreset: S,
66
+ presetItems: [],
67
+ shape: "rounded",
68
+ labels: y,
69
+ disabled: !0,
70
+ draftResetKey: 0,
71
+ field: null,
72
+ groupInvalid: void 0,
73
+ errorMessageId: void 0,
74
+ registerHexInput: S
75
+ };
76
+ function T(e) {
77
+ return h.useContext(b) || (t(e, "<ColorPicker>"), w);
78
+ }
79
+ function E(e) {
80
+ let t = e.trim();
81
+ return t === "" || t === "#";
82
+ }
83
+ function D(e) {
84
+ let t = e.trim().replace(/^#/, "").length;
85
+ return t === 4 || t === 8;
86
+ }
87
+ var O = ({ id: t, "aria-label": i, "aria-labelledby": a, "aria-describedby": o, "aria-invalid": p, "aria-errormessage": m, "aria-details": _, "aria-required": v, autoFocus: y, tabIndex: b, onFocus: x, onBlur: S, onKeyDown: C, onKeyUp: w, inputMode: O, enterKeyHint: k, autoCapitalize: A, autoCorrect: j, spellCheck: M, controlRef: N, className: P, ref: F, ...ie }) => {
88
+ let I = T("ColorPicker.HexField"), { color: L, parsed: ae, field: R, groupInvalid: z, errorMessageId: B, labels: V } = I, H = ae?.alpha ?? 255, [U, W] = h.useState(null), [G, K] = h.useState(L);
89
+ L !== G && (K(L), U?.flagged && W(null));
90
+ let [q, oe] = h.useState(I.draftResetKey);
91
+ I.draftResetKey !== q && (oe(I.draftResetKey), W(null));
92
+ let se = U?.text ?? L, J = U !== null && !E(U.text) && (U.flagged || !te(U.text)), Y = z !== void 0 && z !== !1 && z !== "false", X = s("wave-color-picker-error"), Z = p ?? (J ? !0 : Y ? z : void 0), ce = u(!1, Z), le = h.useRef(null), ue = c(le, N, I.registerHexInput), Q = (e, t) => I.setColor(d(e, t)), de = (e) => {
93
+ let t = e.target.value.trim();
94
+ t !== "" && !t.startsWith("#") && (t = `#${t}`), W({
95
+ text: t,
96
+ flagged: !1
97
+ });
98
+ let n = f(t);
99
+ n && Q(n.rgb, D(t) ? n.alpha : H);
100
+ }, $ = () => {
101
+ if (U === null || U.flagged) return;
102
+ let e = ne(U.text);
103
+ if (e || E(U.text)) {
104
+ e && !f(U.text) && Q(e.rgb, D(U.text) ? e.alpha : H), W(null);
105
+ return;
106
+ }
107
+ W({
108
+ text: U.text,
109
+ flagged: !0
110
+ });
111
+ }, fe = n(S, $), pe = n(C, (e) => {
112
+ e.key === "Enter" && !e.nativeEvent.isComposing && $();
113
+ });
114
+ return /* @__PURE__ */ re("label", {
115
+ ref: F,
116
+ className: e(r.root, "flex min-w-0 flex-col gap-1", P),
117
+ ...ie,
118
+ children: [
119
+ /* @__PURE__ */ g("span", {
120
+ className: e(r.label, "text-caption-1 text-muted-foreground"),
121
+ children: V.hex
122
+ }),
123
+ /* @__PURE__ */ g("input", {
124
+ ref: ue,
125
+ id: t,
126
+ type: "text",
127
+ value: se,
128
+ onChange: de,
129
+ onKeyDown: pe,
130
+ onKeyUp: w,
131
+ onFocus: x,
132
+ onBlur: fe,
133
+ "aria-label": i ?? (a === void 0 ? V.hexInput : void 0),
134
+ "aria-labelledby": a,
135
+ "aria-invalid": Z,
136
+ "aria-errormessage": m ?? B,
137
+ "aria-describedby": l(J && X, R?.validationMessageId ?? (Y ? R?.errorId : void 0), B, o),
138
+ "aria-details": _,
139
+ "aria-required": v,
140
+ autoFocus: y,
141
+ tabIndex: b,
142
+ inputMode: O,
143
+ enterKeyHint: k,
144
+ autoCapitalize: A,
145
+ autoCorrect: j,
146
+ spellCheck: M ?? !1,
147
+ maxLength: 9,
148
+ autoComplete: "off",
149
+ className: e(r.input, "w-24 rounded border border-input border-b-stroke-accessible bg-background px-2 py-1 text-body-1 text-foreground", ee, ce && "border-destructive focus:border-b-destructive")
150
+ }),
151
+ J && /* @__PURE__ */ g("span", {
152
+ id: X,
153
+ className: e(r.errorMessage, "text-caption-1 text-error"),
154
+ children: V.hexError
155
+ })
156
+ ]
157
+ });
158
+ };
159
+ O.displayName = "ColorPickerHexField";
160
+ var k = ({ className: t, "aria-label": n, size: r = "small", shape: i = "rounded", ...o }) => {
161
+ let s = T("ColorPicker.Swatches");
162
+ return s.presetItems.length === 0 ? null : /* @__PURE__ */ g(m, {
163
+ "aria-label": n ?? (o["aria-labelledby"] === void 0 ? s.labels.presets : void 0),
164
+ size: r,
165
+ shape: i,
166
+ ...o,
167
+ className: e(a.root, t),
168
+ items: s.presetItems,
169
+ value: s.parsed ? s.parsed.rgb : "",
170
+ onValueChange: s.pickPreset
171
+ });
172
+ };
173
+ k.displayName = "ColorPickerSwatches";
174
+ var A = ({ className: t, style: n, ref: r, ...a }) => {
175
+ let o = T("ColorPicker.Preview"), s = o.parsed ? d(o.parsed.rgb, o.parsed.alpha) : o.color;
176
+ return /* @__PURE__ */ g("div", {
177
+ "data-color-preview": "",
178
+ "aria-hidden": "true",
179
+ ...a,
180
+ ref: r,
181
+ className: e(i.root, "h-10 w-10 shrink-0 rounded border border-border forced-colors:forced-color-adjust-none", o.shape === "square" && "rounded-none", t),
182
+ style: {
183
+ ...n,
184
+ backgroundColor: s
185
+ }
186
+ });
187
+ };
188
+ A.displayName = "ColorPickerPreview";
189
+ //#endregion
190
+ export { b as ColorPickerContext, O as ColorPickerHexField, A as ColorPickerPreview, k as ColorPickerSwatches, _ as DEFAULT_COLOR, y as DEFAULT_COLOR_PICKER_LABELS, v as DEFAULT_PART_COLOR, C as useColorPartState, x as useColorPickerContext, T as usePickerPartContext };
191
+
192
+ //# sourceMappingURL=ColorPicker.parts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPicker.parts.mjs","names":["useId","useId$1","React","DEFAULT_COLOR","DEFAULT_PART_COLOR","DEFAULT_COLOR_PICKER_LABELS","ColorPickerContext","useColorPickerContext","noop","useColorPartState","context","picker","value","defaultValue","initial","own","setOwn","useControllable","onValueChange","next","disabled","sameColor","INERT_PICKER_CONTEXT","usePickerPartContext","reportMissingContext","componentName","isBlankDraft","trimmed","text","hasAlphaDigits","digits","ColorPickerHexField","ariaLabel","ariaLabelledBy","ariaDescribedBy","ariaInvalid","ariaErrorMessage","ariaDetails","ariaRequired","rest","alpha","parsed","draft","setDraft","syncedColor","setSyncedColor","color","seenResetKey","setSeenResetKey","hexText","draftInvalid","isHexDraft","fieldInvalid","groupInvalid","errorId","resolvedInvalid","invalidLook","isInvalidLook","inputRef","mergedInputRef","useMergedRefs","controlRef","commit","formatHexColor","rgb","nextAlpha","handleChange","event","typed","parseHexInput","finishDraft","parseHexColor","handleBlur","composeEventHandlers","onBlur","handleKeyDown","onKeyDown","cn","colorPickerHexFieldClassNames","className","labels","errorMessageId","joinIds","field","spellCheck","inputFocus","ColorPickerSwatches","SwatchPicker","colorPickerSwatchesClassNames","ColorPickerPreview","shown","colorPickerPreviewClassNames","style"],"sources":["../../../src/components/input/ColorPicker.parts.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useControllable } from '../../hooks/useControllable';\nimport type { FieldContextValue } from '../../hooks/useFieldControl';\nimport { useId } from '../../hooks/useId';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { joinIds } from '../../lib/aria';\nimport {\n colorPickerHexFieldClassNames,\n colorPickerPreviewClassNames,\n colorPickerSwatchesClassNames,\n} from '../../lib/classNames';\nimport { cn } from '../../lib/cn';\nimport { composeEventHandlers } from '../../lib/composeEventHandlers';\nimport { reportMissingContext } from '../../lib/dev';\nimport { inputFocus, inputInvalid } from '../../lib/styles';\nimport type { ColorPickerShape, HsvColor } from '../../lib/types';\nimport { isInvalidLook } from './Input';\nimport { SwatchPicker, type SwatchItem, type SwatchPickerProps } from './SwatchPicker';\nimport {\n formatHexColor,\n isHexDraft,\n parseHexColor,\n parseHexInput,\n sameColor,\n type HexColor,\n} from './colorUtils';\n\n/*\n * The picker's labels and context, and how the standalone color parts bind to it (spec P3-05,\n * D21). `ColorArea`, `ColorSlider` and `AlphaSlider` read the context; `ColorPicker.tsx` provides\n * it and renders the picker-only parts. This module never imports `ColorPicker.tsx`.\n */\n\n// wave-allow-color: default color value (user color data, C-TOKENS exception)\nexport const DEFAULT_COLOR = '#0f6cbd';\n\n/** The default color of a standalone part: the default picker color in HSV. */\nexport const DEFAULT_PART_COLOR: HsvColor = { h: 208, s: 0.92, v: 0.74 };\n\n/**\n * Texts of the ColorPicker's own parts and of the color parts bound to it, for localisation.\n * Every key is optional; missing keys use the English default.\n */\nexport interface ColorPickerLabels {\n /** Visible caption above the hex field.\n * @default 'Hex'\n */\n hex?: string;\n /** Accessible name of the hex text field.\n * @default 'Hex color value'\n */\n hexInput?: string;\n /** Error text shown (and used as the hex field's description) while the typed text can never be\n * a hex color, or when the field is left with text that is not one (such as `#12345`).\n * @default 'Enter a hex color such as #0f6cbd.'\n */\n hexError?: string;\n /** Accessible name of the preset swatches radiogroup.\n * @default 'Preset colors'\n */\n presets?: string;\n /** Visible label of the opacity row and accessible name of the opacity slider (a bound\n * `AlphaSlider`).\n * @default 'Opacity'\n */\n opacity?: string;\n /** Accessible name of a bound `ColorArea`'s group.\n * @default 'Saturation and brightness'\n */\n area?: string;\n /** Name of a bound area's saturation slider and of a bound `channel=\"saturation\"` slider.\n * @default 'Saturation'\n */\n saturation?: string;\n /** Name of a bound area's brightness slider and of a bound `channel=\"value\"` slider.\n * @default 'Brightness'\n */\n brightness?: string;\n /** Role description of a bound area's two sliders.\n * @default '2D slider'\n */\n roleDescription?: string;\n /** Name of a bound hue slider.\n * @default 'Hue'\n */\n hue?: string;\n /** Name of a bound `AlphaSlider` with `transparency`.\n * @default 'Transparency'\n */\n transparency?: string;\n /** Names the color at the end of the bound parts' value texts; return `''` to leave it out.\n * @default an English namer (\"dark blue\")\n */\n colorName?: (color: HsvColor) => string;\n /** Replaces a whole value text of a bound part, for languages whose order differs. */\n valueText?: (color: HsvColor, channel: 'hue' | 'saturation' | 'value' | 'alpha') => string;\n}\n\n/** The labels with every string default filled in (the two functions stay optional). */\nexport type ResolvedColorPickerLabels = Required<\n Omit<ColorPickerLabels, 'colorName' | 'valueText'>\n> &\n Pick<ColorPickerLabels, 'colorName' | 'valueText'>;\n\nexport const DEFAULT_COLOR_PICKER_LABELS: ResolvedColorPickerLabels = {\n hex: 'Hex',\n hexInput: 'Hex color value',\n hexError: `Enter a hex color such as ${DEFAULT_COLOR}.`,\n presets: 'Preset colors',\n opacity: 'Opacity',\n area: 'Saturation and brightness',\n saturation: 'Saturation',\n brightness: 'Brightness',\n roleDescription: '2D slider',\n hue: 'Hue',\n transparency: 'Transparency',\n};\n\n/** What a ColorPicker shares with its parts and with the color parts bound to it. */\nexport interface ColorPickerContextValue {\n /** The working color: HSV, so hue and saturation survive gray, white and black. */\n hsv: HsvColor;\n /** Writes the working color from a bound part and reports its hex (only when the hex changes). */\n setHsv: (next: HsvColor) => void;\n /** The picker's value as given: a hex string, or a value that is not one (as given). */\n color: string;\n /** The value parsed (`#rrggbb` and the alpha byte), `null` while it is not a hex color. */\n parsed: HexColor | null;\n /** Writes the value as hex text (the hex field). */\n setColor: (next: string) => void;\n /** Applies a preset's `#rrggbb` at the current opacity and drops the hex field's draft. */\n pickPreset: (rgb: string) => void;\n /** The picker's presets as swatch items (values are `#rrggbb`). */\n presetItems: readonly SwatchItem[];\n /** The picker's `shape`, inherited by the bound parts and `ColorPicker.Preview`. */\n shape: ColorPickerShape;\n /** The picker's labels with every string default filled in. */\n labels: ResolvedColorPickerLabels;\n /** `true` while the value is not a hex color: the bound parts are disabled until one arrives. */\n disabled: boolean;\n /** Changes whenever the hex field must drop its draft: a form reset or a preset pick. */\n draftResetKey: number;\n /** The Field around the picker (its parts render in a `null` Field context). */\n field: FieldContextValue | null;\n /** The invalid state set on the picker from outside (its `aria-invalid` or the Field's), as given. */\n groupInvalid: React.AriaAttributes['aria-invalid'];\n /** The consumer's `aria-errormessage`, routed to the hex field while that state is set. */\n errorMessageId: string | undefined;\n /** The hex field registers its `<input>` here (the hidden input's `onInvalid` focuses it). */\n registerHexInput: (input: HTMLInputElement | null) => void;\n}\n\nexport const ColorPickerContext = React.createContext<ColorPickerContextValue | null>(null);\nColorPickerContext.displayName = 'ColorPickerContext';\n\n/** The enclosing ColorPicker's context, or `null` outside one (the standalone parts need none). */\nexport function useColorPickerContext(): ColorPickerContextValue | null {\n return React.useContext(ColorPickerContext);\n}\n\n/** What a color part passes to {@link useColorPartState}. */\nexport interface ColorPartOptions {\n value: HsvColor | undefined;\n defaultValue: HsvColor | undefined;\n onValueChange: ((value: HsvColor) => void) | undefined;\n disabled: boolean;\n}\n\n/** Where a color part's color lives: in the enclosing picker (bound) or in the part. */\nexport interface ColorPartState {\n /** The enclosing picker when the part binds to it, else `null`. */\n picker: ColorPickerContextValue | null;\n /** The color as given (bound: the picker's working color). */\n color: HsvColor;\n /**\n * Writes a new color. Bound: the picker's working color, then the part's own `onValueChange`\n * (a part given only the callback listens; C-NAMING). Otherwise the part's state, through\n * `useControllable`.\n */\n setColor: (next: HsvColor) => void;\n /** Restores `defaultValue` on a form reset, reporting only a real change; nothing while bound. */\n reset: () => void;\n /** The part's `disabled`, or the picker's disabled state while bound. */\n disabled: boolean;\n}\n\nconst noop = () => {};\n\n/**\n * The binding rule of `ColorArea`, `ColorSlider` and `AlphaSlider` (D21): inside a ColorPicker, a\n * part with neither `value` nor `defaultValue` reads and writes the picker's working color;\n * anywhere else, or with either prop, it keeps its own color.\n */\nexport function useColorPartState({\n value,\n defaultValue,\n onValueChange,\n disabled,\n}: ColorPartOptions): ColorPartState {\n const context = useColorPickerContext();\n const picker =\n context !== null && value === undefined && defaultValue === undefined ? context : null;\n const initial = defaultValue ?? DEFAULT_PART_COLOR;\n const [own, setOwn] = useControllable(value, initial, picker ? undefined : onValueChange);\n if (picker) {\n return {\n picker,\n color: picker.hsv,\n setColor: (next) => {\n picker.setHsv(next);\n onValueChange?.(next);\n },\n reset: noop,\n disabled: disabled || picker.disabled,\n };\n }\n return {\n picker: null,\n color: own,\n setColor: setOwn,\n reset: () => {\n if (!sameColor(own, initial)) setOwn(initial);\n },\n disabled,\n };\n}\n\n// ---------------------------------------------------------------------------------------------\n// The picker-only parts: ColorPicker.HexField, ColorPicker.Swatches, ColorPicker.Preview\n// ---------------------------------------------------------------------------------------------\n\n/** The context a misplaced part renders with in production (C-CONTEXT). */\nconst INERT_PICKER_CONTEXT: ColorPickerContextValue = {\n hsv: DEFAULT_PART_COLOR,\n setHsv: noop,\n color: DEFAULT_COLOR,\n parsed: null,\n setColor: noop,\n pickPreset: noop,\n presetItems: [],\n shape: 'rounded',\n labels: DEFAULT_COLOR_PICKER_LABELS,\n disabled: true,\n draftResetKey: 0,\n field: null,\n groupInvalid: undefined,\n errorMessageId: undefined,\n registerHexInput: noop,\n};\n\n/**\n * The context of a picker-only part: throws `[WaveUI] <name> must be used within <ColorPicker>`\n * in development; logs once and returns an inert value in production (C-CONTEXT).\n */\nexport function usePickerPartContext(componentName: string): ColorPickerContextValue {\n const context = React.useContext(ColorPickerContext);\n if (context) return context;\n reportMissingContext(componentName, '<ColorPicker>');\n return INERT_PICKER_CONTEXT;\n}\n\n/** The hex field's text while the user edits it (`null` state: the field shows the value). */\ninterface HexDraft {\n /** The typed text. */\n text: string;\n /** Kept after leaving the field because it is not a hex color, so it is flagged as invalid. */\n flagged: boolean;\n}\n\n/** A hex draft without digits (`''` or a lone `#`): leaving the field shows the value again. */\nfunction isBlankDraft(text: string): boolean {\n const trimmed = text.trim();\n return trimmed === '' || trimmed === '#';\n}\n\n/** Whether typed hex text carries its own alpha digits (`#rgba` or `#rrggbbaa`). */\nfunction hasAlphaDigits(text: string): boolean {\n const digits = text.trim().replace(/^#/, '').length;\n return digits === 4 || digits === 8;\n}\n\n/**\n * Properties for the ColorPickerHexField sub-component. `id`, the labelling and validation\n * `aria-*` (`aria-label`, `aria-labelledby`, `aria-describedby`, `aria-invalid`,\n * `aria-errormessage`, `aria-details`, `aria-required`), `autoFocus`, `tabIndex`, the focus and key\n * handlers and the text-entry attributes (`inputMode`, `enterKeyHint`, `autoCapitalize`,\n * `autoCorrect`, `spellCheck`) go to the `<input>`; everything else stays on the outer label.\n */\nexport interface ColorPickerHexFieldProps extends React.HTMLAttributes<HTMLElement> {\n /** Ref to the hex `<input>`. */\n controlRef?: React.Ref<HTMLInputElement>;\n /** Ref to the field's outer element: the label around the caption, the input and the error. */\n ref?: React.Ref<HTMLLabelElement>;\n}\n\n/**\n * The hex text field of a ColorPicker: a caption, the input and its error. The text is a draft:\n * complete 6- and 8-digit values apply while typing, text that can never be a hex color is\n * flagged at once, and leaving the field (or Enter) applies a short `#rgb`/`#rgba` and shows the\n * value again; other text stays flagged until it is corrected, cleared, or the value changes from\n * elsewhere (a preset, another part, the parent, a form reset). Inside a Field it carries the\n * Field's invalid state and error. Must be inside a ColorPicker. Also exported as\n * `ColorPickerHexField` (import the flat name in React Server Components).\n */\nexport const ColorPickerHexField = ({\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-errormessage': ariaErrorMessage,\n 'aria-details': ariaDetails,\n 'aria-required': ariaRequired,\n autoFocus,\n tabIndex,\n onFocus,\n onBlur,\n onKeyDown,\n onKeyUp,\n inputMode,\n enterKeyHint,\n autoCapitalize,\n autoCorrect,\n spellCheck,\n controlRef,\n className,\n ref,\n ...rest\n}: ColorPickerHexFieldProps) => {\n const picker = usePickerPartContext('ColorPicker.HexField');\n const { color, parsed, field, groupInvalid, errorMessageId, labels } = picker;\n const alpha = parsed?.alpha ?? 255;\n\n // The hex text is a draft over `color` while the user edits it (null: show `color`).\n const [draft, setDraft] = React.useState<HexDraft | null>(null);\n // A value change from elsewhere replaces a flagged draft (input-pickers#25); while the user\n // types, the draft is not flagged and stays.\n const [syncedColor, setSyncedColor] = React.useState(color);\n if (color !== syncedColor) {\n setSyncedColor(color);\n if (draft?.flagged) setDraft(null);\n }\n // A form reset or a preset pick drops any draft.\n const [seenResetKey, setSeenResetKey] = React.useState(picker.draftResetKey);\n if (picker.draftResetKey !== seenResetKey) {\n setSeenResetKey(picker.draftResetKey);\n setDraft(null);\n }\n const hexText = draft?.text ?? color;\n const draftInvalid =\n draft !== null && !isBlankDraft(draft.text) && (draft.flagged || !isHexDraft(draft.text));\n // Any invalid state from outside (the picker's prop or the Field) is set on the input as is;\n // only `true` shows the error look.\n const fieldInvalid =\n groupInvalid !== undefined && groupInvalid !== false && groupInvalid !== 'false';\n const errorId = useId('wave-color-picker-error');\n const resolvedInvalid =\n ariaInvalid ?? (draftInvalid ? true : fieldInvalid ? groupInvalid : undefined);\n const invalidLook = isInvalidLook(false, resolvedInvalid);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const mergedInputRef = useMergedRefs(inputRef, controlRef, picker.registerHexInput);\n\n /** The single commit path: every edit is `#rrggbb` + an alpha byte. */\n const commit = (rgb: string, nextAlpha: number) =>\n picker.setColor(formatHexColor(rgb, nextAlpha));\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n // Surrounding whitespace (a pasted `'#abcdef '`) is dropped, so the text that is checked,\n // committed and shown is the same.\n let text = event.target.value.trim();\n if (text !== '' && !text.startsWith('#')) text = `#${text}`;\n setDraft({ text, flagged: false });\n const typed = parseHexInput(text);\n // A 6-digit hex keeps the current opacity; an 8-digit one brings its own alpha.\n if (typed) commit(typed.rgb, hasAlphaDigits(text) ? typed.alpha : alpha);\n };\n\n /** Finishes the draft when the field is left or Enter is pressed. */\n const finishDraft = () => {\n if (draft === null || draft.flagged) return;\n const typed = parseHexColor(draft.text);\n if (typed || isBlankDraft(draft.text)) {\n // A short `#rgb` (current opacity) or `#rgba` is applied here; complete values were\n // applied while typing, so a rejecting parent is not asked twice. Then the field shows the\n // current value (also when a controlled parent rejected it).\n if (typed && !parseHexInput(draft.text)) {\n commit(typed.rgb, hasAlphaDigits(draft.text) ? typed.alpha : alpha);\n }\n setDraft(null);\n return;\n }\n // Text that is not a hex color is kept and flagged instead of thrown away (WCAG 3.3.1).\n setDraft({ text: draft.text, flagged: true });\n };\n\n const handleBlur = composeEventHandlers(onBlur, finishDraft);\n // Not prevented: Enter still submits the surrounding form, with the color just applied.\n const handleKeyDown = composeEventHandlers(\n onKeyDown,\n (event: React.KeyboardEvent<HTMLElement>) => {\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) finishDraft();\n },\n );\n\n return (\n <label\n ref={ref}\n className={cn(colorPickerHexFieldClassNames.root, 'flex min-w-0 flex-col gap-1', className)}\n {...rest}\n >\n <span\n className={cn(colorPickerHexFieldClassNames.label, 'text-caption-1 text-muted-foreground')}\n >\n {labels.hex}\n </span>\n <input\n ref={mergedInputRef}\n id={id}\n type=\"text\"\n value={hexText}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onKeyUp={onKeyUp}\n onFocus={onFocus}\n onBlur={handleBlur}\n aria-label={ariaLabel ?? (ariaLabelledBy === undefined ? labels.hexInput : undefined)}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={resolvedInvalid}\n aria-errormessage={ariaErrorMessage ?? errorMessageId}\n aria-describedby={joinIds(\n draftInvalid && errorId,\n field?.validationMessageId ?? (fieldInvalid ? field?.errorId : undefined),\n errorMessageId,\n ariaDescribedBy,\n )}\n aria-details={ariaDetails}\n aria-required={ariaRequired}\n autoFocus={autoFocus}\n tabIndex={tabIndex}\n inputMode={inputMode}\n enterKeyHint={enterKeyHint}\n autoCapitalize={autoCapitalize}\n autoCorrect={autoCorrect}\n spellCheck={spellCheck ?? false}\n maxLength={9}\n autoComplete=\"off\"\n className={cn(\n colorPickerHexFieldClassNames.input,\n 'w-24 rounded border border-input border-b-stroke-accessible bg-background px-2 py-1 text-body-1 text-foreground',\n inputFocus,\n invalidLook && inputInvalid,\n )}\n />\n {draftInvalid && (\n <span\n id={errorId}\n className={cn(colorPickerHexFieldClassNames.errorMessage, 'text-caption-1 text-error')}\n >\n {labels.hexError}\n </span>\n )}\n </label>\n );\n};\n\nColorPickerHexField.displayName = 'ColorPickerHexField';\n\n/** Properties for the ColorPickerSwatches sub-component: the picker's `presets` as a SwatchPicker. */\nexport type ColorPickerSwatchesProps = Omit<\n SwatchPickerProps,\n 'items' | 'value' | 'defaultValue' | 'onValueChange' | 'onChange' | 'name' | 'form' | 'required'\n>;\n\n/**\n * The picker's `presets` as swatches (a SwatchPicker named by `labels.presets`, small and rounded\n * unless you pass `size` or `shape`). Picking one keeps the opacity. Renders nothing without\n * presets. Must be inside a ColorPicker. Also exported as `ColorPickerSwatches`.\n */\nexport const ColorPickerSwatches = ({\n className,\n 'aria-label': ariaLabel,\n size = 'small',\n shape = 'rounded',\n ...rest\n}: ColorPickerSwatchesProps) => {\n const picker = usePickerPartContext('ColorPicker.Swatches');\n if (picker.presetItems.length === 0) return null;\n return (\n <SwatchPicker\n aria-label={\n ariaLabel ?? (rest['aria-labelledby'] === undefined ? picker.labels.presets : undefined)\n }\n size={size}\n shape={shape}\n {...rest}\n className={cn(colorPickerSwatchesClassNames.root, className)}\n items={picker.presetItems}\n value={picker.parsed ? picker.parsed.rgb : ''}\n onValueChange={picker.pickPreset}\n />\n );\n};\n\nColorPickerSwatches.displayName = 'ColorPickerSwatches';\n\n/** Properties for the ColorPickerPreview sub-component. */\nexport interface ColorPickerPreviewProps extends React.HTMLAttributes<HTMLDivElement> {\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A swatch of the picker's current color (decorative, `aria-hidden`); it keeps its color in forced\n * colors and follows the picker's `shape`. Must be inside a ColorPicker. Also exported as\n * `ColorPickerPreview`.\n */\nexport const ColorPickerPreview = ({ className, style, ref, ...rest }: ColorPickerPreviewProps) => {\n const picker = usePickerPartContext('ColorPicker.Preview');\n const shown = picker.parsed\n ? formatHexColor(picker.parsed.rgb, picker.parsed.alpha)\n : picker.color;\n return (\n <div\n data-color-preview=\"\"\n aria-hidden=\"true\"\n {...rest}\n ref={ref}\n className={cn(\n colorPickerPreviewClassNames.root,\n 'h-10 w-10 shrink-0 rounded border border-border forced-colors:forced-color-adjust-none',\n picker.shape === 'square' && 'rounded-none',\n className,\n )}\n style={{ ...style, backgroundColor: shown }}\n />\n );\n};\n\nColorPickerPreview.displayName = 'ColorPickerPreview';\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/composeEventHandlers.cjs"),r=require("../../lib/classNames.cjs"),i=require("../../lib/color.cjs"),ee=require("../../lib/direction.cjs"),a=require("../../hooks/useMergedRefs.cjs"),o=require("../../hooks/useFieldControl.cjs"),te=require("../../hooks/useFormReset.cjs"),s=require("../internal/HiddenInput.cjs"),c=require("./colorUtils.cjs"),l=require("./ColorPicker.parts.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("react/jsx-runtime");var f={hue:`Hue`,saturation:`Saturation`,brightness:`Brightness`},p={hue:`hue`,saturation:`saturation`,value:`brightness`},m=({channel:e=`hue`,orientation:m=`horizontal`,value:ne,defaultValue:h,onValueChange:g,shape:_,labels:v,disabled:y=!1,name:b,form:x,required:S,controlRef:re,className:C,style:w,id:T,"aria-label":E,"aria-labelledby":D,"aria-describedby":O,"aria-invalid":k,"aria-required":A,"aria-errormessage":j,"aria-details":M,autoFocus:N,tabIndex:P,onFocus:F,onBlur:I,onKeyDown:L,onKeyUp:R,ref:z,...B})=>{let V=l.useColorPartState({value:ne,defaultValue:h,onValueChange:g,disabled:y}),{picker:H}=V,U={...f,...H&&{hue:H.labels.hue,saturation:H.labels.saturation,brightness:H.labels.brightness,colorName:H.labels.colorName,valueText:H.labels.valueText},...v},W=_??H?.shape??`rounded`,G=m===`vertical`,K=c.displayColor(V.color),q=e===`hue`?360:100,J=e===`hue`?Math.round(K.h):c.toPercent(e===`saturation`?K.s:K.v),Y=o.useFieldContext(),{"aria-required":ie,required:ae,...X}=o.useFieldControl({id:T,"aria-label":E??(Y===null&&D===void 0?U[p[e]]:void 0),"aria-labelledby":D,"aria-describedby":O,"aria-invalid":k}),Z=X[`aria-invalid`],oe=Z!==void 0&&Z!==!1&&Z!==`false`,se=S??(A===!0||A===`true`||(Y?.required??!1)),Q=u.useRef(null),ce=a.useMergedRefs(Q,re);te.useFormReset(Q,V.reset,x);let $=t=>{if(t===J)return;let n=V.color;V.setColor(e===`hue`?{...n,h:t}:e===`saturation`?{...n,s:t/100}:{...n,v:t/100})},le=n.composeEventHandlers(L,e=>{if(V.disabled||e.nativeEvent.isComposing)return;let t=c.railKeyTarget(e.key,e,ee.getDirection(e.currentTarget),J,q);t!==null&&(e.preventDefault(),$(t))}),ue=e=>{V.disabled||$(Math.min(q,Math.max(0,Math.round(Number(e.currentTarget.value)))))},de={...w,"--wave-color-slider-gradient":c.colorSliderGradient(e,K,m),"--wave-color-slider-position":c.toPosition(J/q),"--wave-color-thumb":e===`hue`?i.hsvToHex({h:K.h,s:1,v:1}):i.hsvToHex({h:K.h,s:K.s,v:K.v})};return(0,d.jsxs)(`div`,{"data-orientation":m,"data-channel":e,"data-disabled":V.disabled?``:void 0,className:t.cn(r.colorSliderClassNames.root,`group/color-slider relative flex touch-none select-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50`,G?c.RAIL_ROOT_VERTICAL:c.RAIL_ROOT_HORIZONTAL,C),style:de,...B,ref:z,children:[(0,d.jsx)(`div`,{"aria-hidden":`true`,className:t.cn(r.colorSliderClassNames.rail,`rounded-full forced-colors:forced-color-adjust-none`,c.RAIL_GRADIENT,G?c.RAIL_TRACK_VERTICAL:c.RAIL_TRACK_HORIZONTAL,W===`square`&&`rounded-none`)}),(0,d.jsx)(`input`,{type:`range`,...X,ref:ce,min:0,max:q,step:1,value:J,disabled:V.disabled,dir:G?`ltr`:void 0,"aria-orientation":G?`vertical`:void 0,"aria-valuetext":c.sliderValueText(K,e,U),"aria-errormessage":oe&&j||void 0,"aria-details":M,autoFocus:N,tabIndex:P,onFocus:F,onBlur:I,onKeyDown:le,onKeyUp:R,onChange:ue,className:t.cn(c.RAIL_INPUT_CLASSES,G?c.RAIL_INPUT_VERTICAL:c.RAIL_INPUT_HORIZONTAL)}),(0,d.jsx)(`span`,{"aria-hidden":`true`,className:G?c.THUMB_TRACK_VERTICAL:c.THUMB_TRACK_HORIZONTAL,children:(0,d.jsx)(`span`,{className:t.cn(r.colorSliderClassNames.thumb,c.COLOR_THUMB_CLASSES,G?c.THUMB_POSITION_VERTICAL:c.THUMB_POSITION_HORIZONTAL,`group-has-[:focus-visible]/color-slider:ring-2 group-has-[:focus-visible]/color-slider:ring-background forced-colors:group-has-[:focus-visible]/color-slider:ring-[Canvas] group-has-[:focus-visible]/color-slider:outline-2 group-has-[:focus-visible]/color-slider:outline-offset-2 group-has-[:focus-visible]/color-slider:outline-ring forced-colors:group-has-[:focus-visible]/color-slider:outline-[Highlight]`)})}),!H&&(0,d.jsx)(s.HiddenInput,{type:`text`,name:b,form:x,disabled:V.disabled,value:i.hsvToHex(V.color),required:se,onInvalid:()=>Q.current?.focus()})]})};m.displayName=`ColorSlider`,exports.ColorSlider=m;
2
+ //# sourceMappingURL=ColorSlider.cjs.map