@cdx-ui/primitives 0.1.6 → 0.2.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 (344) hide show
  1. package/lib/commonjs/color/Color.js +69 -0
  2. package/lib/commonjs/color/Color.js.map +1 -0
  3. package/lib/commonjs/color/index.js +13 -0
  4. package/lib/commonjs/color/index.js.map +1 -0
  5. package/lib/commonjs/color/types.js +2 -0
  6. package/lib/commonjs/color/types.js.map +1 -0
  7. package/lib/commonjs/color-area/ColorAreaAccessibility.js +100 -0
  8. package/lib/commonjs/color-area/ColorAreaAccessibility.js.map +1 -0
  9. package/lib/commonjs/color-area/ColorAreaAccessibility.web.js +58 -0
  10. package/lib/commonjs/color-area/ColorAreaAccessibility.web.js.map +1 -0
  11. package/lib/commonjs/color-area/ColorAreaRoot.js +240 -0
  12. package/lib/commonjs/color-area/ColorAreaRoot.js.map +1 -0
  13. package/lib/commonjs/color-area/ColorAreaThumb.js +71 -0
  14. package/lib/commonjs/color-area/ColorAreaThumb.js.map +1 -0
  15. package/lib/commonjs/color-area/context.js +11 -0
  16. package/lib/commonjs/color-area/context.js.map +1 -0
  17. package/lib/commonjs/color-area/index.js +27 -0
  18. package/lib/commonjs/color-area/index.js.map +1 -0
  19. package/lib/commonjs/color-area/types.js +6 -0
  20. package/lib/commonjs/color-area/types.js.map +1 -0
  21. package/lib/commonjs/color-area/utils.js +51 -0
  22. package/lib/commonjs/color-area/utils.js.map +1 -0
  23. package/lib/commonjs/color-field/ColorFieldInput.js +67 -0
  24. package/lib/commonjs/color-field/ColorFieldInput.js.map +1 -0
  25. package/lib/commonjs/color-field/ColorFieldRoot.js +104 -0
  26. package/lib/commonjs/color-field/ColorFieldRoot.js.map +1 -0
  27. package/lib/commonjs/color-field/context.js +11 -0
  28. package/lib/commonjs/color-field/context.js.map +1 -0
  29. package/lib/commonjs/color-field/index.js +27 -0
  30. package/lib/commonjs/color-field/index.js.map +1 -0
  31. package/lib/commonjs/color-field/types.js +6 -0
  32. package/lib/commonjs/color-field/types.js.map +1 -0
  33. package/lib/commonjs/color-field/utils.js +60 -0
  34. package/lib/commonjs/color-field/utils.js.map +1 -0
  35. package/lib/commonjs/color-picker/ColorPickerRoot.js +69 -0
  36. package/lib/commonjs/color-picker/ColorPickerRoot.js.map +1 -0
  37. package/lib/commonjs/color-picker/ColorPickerTrigger.js +98 -0
  38. package/lib/commonjs/color-picker/ColorPickerTrigger.js.map +1 -0
  39. package/lib/commonjs/color-picker/context.js +32 -0
  40. package/lib/commonjs/color-picker/context.js.map +1 -0
  41. package/lib/commonjs/color-picker/index.js +51 -0
  42. package/lib/commonjs/color-picker/index.js.map +1 -0
  43. package/lib/commonjs/color-picker/types.js +6 -0
  44. package/lib/commonjs/color-picker/types.js.map +1 -0
  45. package/lib/commonjs/color-slider/ColorSliderRail.js +119 -0
  46. package/lib/commonjs/color-slider/ColorSliderRail.js.map +1 -0
  47. package/lib/commonjs/color-slider/ColorSliderRoot.js +153 -0
  48. package/lib/commonjs/color-slider/ColorSliderRoot.js.map +1 -0
  49. package/lib/commonjs/color-slider/ColorSliderThumb.js +265 -0
  50. package/lib/commonjs/color-slider/ColorSliderThumb.js.map +1 -0
  51. package/lib/commonjs/color-slider/context.js +11 -0
  52. package/lib/commonjs/color-slider/context.js.map +1 -0
  53. package/lib/commonjs/color-slider/index.js +34 -0
  54. package/lib/commonjs/color-slider/index.js.map +1 -0
  55. package/lib/commonjs/color-slider/types.js +6 -0
  56. package/lib/commonjs/color-slider/types.js.map +1 -0
  57. package/lib/commonjs/color-slider/utils.js +75 -0
  58. package/lib/commonjs/color-slider/utils.js.map +1 -0
  59. package/lib/commonjs/color-swatch-picker/ColorSwatchPickerItem.js +46 -0
  60. package/lib/commonjs/color-swatch-picker/ColorSwatchPickerItem.js.map +1 -0
  61. package/lib/commonjs/color-swatch-picker/ColorSwatchPickerRoot.js +71 -0
  62. package/lib/commonjs/color-swatch-picker/ColorSwatchPickerRoot.js.map +1 -0
  63. package/lib/commonjs/color-swatch-picker/context.js +22 -0
  64. package/lib/commonjs/color-swatch-picker/context.js.map +1 -0
  65. package/lib/commonjs/color-swatch-picker/index.js +33 -0
  66. package/lib/commonjs/color-swatch-picker/index.js.map +1 -0
  67. package/lib/commonjs/color-swatch-picker/types.js +6 -0
  68. package/lib/commonjs/color-swatch-picker/types.js.map +1 -0
  69. package/lib/commonjs/dialog/DialogContent.js +13 -5
  70. package/lib/commonjs/dialog/DialogContent.js.map +1 -1
  71. package/lib/commonjs/dialog/DialogPopup.js +7 -1
  72. package/lib/commonjs/dialog/DialogPopup.js.map +1 -1
  73. package/lib/commonjs/dialog/DialogRoot.js +3 -1
  74. package/lib/commonjs/dialog/DialogRoot.js.map +1 -1
  75. package/lib/commonjs/index.js +80 -0
  76. package/lib/commonjs/index.js.map +1 -1
  77. package/lib/commonjs/portal/portal.js +4 -2
  78. package/lib/commonjs/portal/portal.js.map +1 -1
  79. package/lib/commonjs/react-native-web.d.js +2 -0
  80. package/lib/commonjs/react-native-web.d.js.map +1 -0
  81. package/lib/commonjs/select/SelectContent.js +1 -0
  82. package/lib/commonjs/select/SelectContent.js.map +1 -1
  83. package/lib/commonjs/slider/useSliderPointer.js +2 -0
  84. package/lib/commonjs/slider/useSliderPointer.js.map +1 -1
  85. package/lib/commonjs/utils/createPortal.web.js +10 -1
  86. package/lib/commonjs/utils/createPortal.web.js.map +1 -1
  87. package/lib/commonjs/utils/textAncestor.js +25 -0
  88. package/lib/commonjs/utils/textAncestor.js.map +1 -0
  89. package/lib/commonjs/utils/textAncestor.web.js +27 -0
  90. package/lib/commonjs/utils/textAncestor.web.js.map +1 -0
  91. package/lib/module/color/Color.js +65 -0
  92. package/lib/module/color/Color.js.map +1 -0
  93. package/lib/module/color/index.js +4 -0
  94. package/lib/module/color/index.js.map +1 -0
  95. package/lib/module/color/types.js +2 -0
  96. package/lib/module/color/types.js.map +1 -0
  97. package/lib/module/color-area/ColorAreaAccessibility.js +96 -0
  98. package/lib/module/color-area/ColorAreaAccessibility.js.map +1 -0
  99. package/lib/module/color-area/ColorAreaAccessibility.web.js +54 -0
  100. package/lib/module/color-area/ColorAreaAccessibility.web.js.map +1 -0
  101. package/lib/module/color-area/ColorAreaRoot.js +236 -0
  102. package/lib/module/color-area/ColorAreaRoot.js.map +1 -0
  103. package/lib/module/color-area/ColorAreaThumb.js +67 -0
  104. package/lib/module/color-area/ColorAreaThumb.js.map +1 -0
  105. package/lib/module/color-area/context.js +5 -0
  106. package/lib/module/color-area/context.js.map +1 -0
  107. package/lib/module/color-area/index.js +6 -0
  108. package/lib/module/color-area/index.js.map +1 -0
  109. package/lib/module/color-area/types.js +4 -0
  110. package/lib/module/color-area/types.js.map +1 -0
  111. package/lib/module/color-area/utils.js +45 -0
  112. package/lib/module/color-area/utils.js.map +1 -0
  113. package/lib/module/color-field/ColorFieldInput.js +63 -0
  114. package/lib/module/color-field/ColorFieldInput.js.map +1 -0
  115. package/lib/module/color-field/ColorFieldRoot.js +100 -0
  116. package/lib/module/color-field/ColorFieldRoot.js.map +1 -0
  117. package/lib/module/color-field/context.js +5 -0
  118. package/lib/module/color-field/context.js.map +1 -0
  119. package/lib/module/color-field/index.js +6 -0
  120. package/lib/module/color-field/index.js.map +1 -0
  121. package/lib/module/color-field/types.js +4 -0
  122. package/lib/module/color-field/types.js.map +1 -0
  123. package/lib/module/color-field/utils.js +55 -0
  124. package/lib/module/color-field/utils.js.map +1 -0
  125. package/lib/module/color-picker/ColorPickerRoot.js +65 -0
  126. package/lib/module/color-picker/ColorPickerRoot.js.map +1 -0
  127. package/lib/module/color-picker/ColorPickerTrigger.js +94 -0
  128. package/lib/module/color-picker/ColorPickerTrigger.js.map +1 -0
  129. package/lib/module/color-picker/context.js +25 -0
  130. package/lib/module/color-picker/context.js.map +1 -0
  131. package/lib/module/color-picker/index.js +6 -0
  132. package/lib/module/color-picker/index.js.map +1 -0
  133. package/lib/module/color-picker/types.js +4 -0
  134. package/lib/module/color-picker/types.js.map +1 -0
  135. package/lib/module/color-slider/ColorSliderRail.js +115 -0
  136. package/lib/module/color-slider/ColorSliderRail.js.map +1 -0
  137. package/lib/module/color-slider/ColorSliderRoot.js +149 -0
  138. package/lib/module/color-slider/ColorSliderRoot.js.map +1 -0
  139. package/lib/module/color-slider/ColorSliderThumb.js +261 -0
  140. package/lib/module/color-slider/ColorSliderThumb.js.map +1 -0
  141. package/lib/module/color-slider/context.js +5 -0
  142. package/lib/module/color-slider/context.js.map +1 -0
  143. package/lib/module/color-slider/index.js +7 -0
  144. package/lib/module/color-slider/index.js.map +1 -0
  145. package/lib/module/color-slider/types.js +4 -0
  146. package/lib/module/color-slider/types.js.map +1 -0
  147. package/lib/module/color-slider/utils.js +66 -0
  148. package/lib/module/color-slider/utils.js.map +1 -0
  149. package/lib/module/color-swatch-picker/ColorSwatchPickerItem.js +42 -0
  150. package/lib/module/color-swatch-picker/ColorSwatchPickerItem.js.map +1 -0
  151. package/lib/module/color-swatch-picker/ColorSwatchPickerRoot.js +67 -0
  152. package/lib/module/color-swatch-picker/ColorSwatchPickerRoot.js.map +1 -0
  153. package/lib/module/color-swatch-picker/context.js +15 -0
  154. package/lib/module/color-swatch-picker/context.js.map +1 -0
  155. package/lib/module/color-swatch-picker/index.js +6 -0
  156. package/lib/module/color-swatch-picker/index.js.map +1 -0
  157. package/lib/module/color-swatch-picker/types.js +4 -0
  158. package/lib/module/color-swatch-picker/types.js.map +1 -0
  159. package/lib/module/dialog/DialogContent.js +13 -5
  160. package/lib/module/dialog/DialogContent.js.map +1 -1
  161. package/lib/module/dialog/DialogPopup.js +7 -1
  162. package/lib/module/dialog/DialogPopup.js.map +1 -1
  163. package/lib/module/dialog/DialogRoot.js +4 -2
  164. package/lib/module/dialog/DialogRoot.js.map +1 -1
  165. package/lib/module/index.js +7 -0
  166. package/lib/module/index.js.map +1 -1
  167. package/lib/module/portal/portal.js +4 -2
  168. package/lib/module/portal/portal.js.map +1 -1
  169. package/lib/module/react-native-web.d.js +2 -0
  170. package/lib/module/react-native-web.d.js.map +1 -0
  171. package/lib/module/select/SelectContent.js +2 -1
  172. package/lib/module/select/SelectContent.js.map +1 -1
  173. package/lib/module/slider/useSliderPointer.js +2 -0
  174. package/lib/module/slider/useSliderPointer.js.map +1 -1
  175. package/lib/module/utils/createPortal.web.js +9 -1
  176. package/lib/module/utils/createPortal.web.js.map +1 -1
  177. package/lib/module/utils/textAncestor.js +20 -0
  178. package/lib/module/utils/textAncestor.js.map +1 -0
  179. package/lib/module/utils/textAncestor.web.js +22 -0
  180. package/lib/module/utils/textAncestor.web.js.map +1 -0
  181. package/lib/typescript/breadcrumbs/types.d.ts +13 -0
  182. package/lib/typescript/breadcrumbs/types.d.ts.map +1 -1
  183. package/lib/typescript/checkbox/types.d.ts +4 -0
  184. package/lib/typescript/checkbox/types.d.ts.map +1 -1
  185. package/lib/typescript/color/Color.d.ts +3 -0
  186. package/lib/typescript/color/Color.d.ts.map +1 -0
  187. package/lib/typescript/color/index.d.ts +3 -0
  188. package/lib/typescript/color/index.d.ts.map +1 -0
  189. package/lib/typescript/color/types.d.ts +13 -0
  190. package/lib/typescript/color/types.d.ts.map +1 -0
  191. package/lib/typescript/color-area/ColorAreaAccessibility.d.ts +8 -0
  192. package/lib/typescript/color-area/ColorAreaAccessibility.d.ts.map +1 -0
  193. package/lib/typescript/color-area/ColorAreaAccessibility.web.d.ts +8 -0
  194. package/lib/typescript/color-area/ColorAreaAccessibility.web.d.ts.map +1 -0
  195. package/lib/typescript/color-area/ColorAreaRoot.d.ts +7 -0
  196. package/lib/typescript/color-area/ColorAreaRoot.d.ts.map +1 -0
  197. package/lib/typescript/color-area/ColorAreaThumb.d.ts +6 -0
  198. package/lib/typescript/color-area/ColorAreaThumb.d.ts.map +1 -0
  199. package/lib/typescript/color-area/context.d.ts +6 -0
  200. package/lib/typescript/color-area/context.d.ts.map +1 -0
  201. package/lib/typescript/color-area/index.d.ts +5 -0
  202. package/lib/typescript/color-area/index.d.ts.map +1 -0
  203. package/lib/typescript/color-area/types.d.ts +65 -0
  204. package/lib/typescript/color-area/types.d.ts.map +1 -0
  205. package/lib/typescript/color-area/utils.d.ts +5 -0
  206. package/lib/typescript/color-area/utils.d.ts.map +1 -0
  207. package/lib/typescript/color-field/ColorFieldInput.d.ts +5 -0
  208. package/lib/typescript/color-field/ColorFieldInput.d.ts.map +1 -0
  209. package/lib/typescript/color-field/ColorFieldRoot.d.ts +7 -0
  210. package/lib/typescript/color-field/ColorFieldRoot.d.ts.map +1 -0
  211. package/lib/typescript/color-field/context.d.ts +6 -0
  212. package/lib/typescript/color-field/context.d.ts.map +1 -0
  213. package/lib/typescript/color-field/index.d.ts +7 -0
  214. package/lib/typescript/color-field/index.d.ts.map +1 -0
  215. package/lib/typescript/color-field/types.d.ts +39 -0
  216. package/lib/typescript/color-field/types.d.ts.map +1 -0
  217. package/lib/typescript/color-field/utils.d.ts +5 -0
  218. package/lib/typescript/color-field/utils.d.ts.map +1 -0
  219. package/lib/typescript/color-picker/ColorPickerRoot.d.ts +7 -0
  220. package/lib/typescript/color-picker/ColorPickerRoot.d.ts.map +1 -0
  221. package/lib/typescript/color-picker/ColorPickerTrigger.d.ts +4 -0
  222. package/lib/typescript/color-picker/ColorPickerTrigger.d.ts.map +1 -0
  223. package/lib/typescript/color-picker/context.d.ts +19 -0
  224. package/lib/typescript/color-picker/context.d.ts.map +1 -0
  225. package/lib/typescript/color-picker/index.d.ts +5 -0
  226. package/lib/typescript/color-picker/index.d.ts.map +1 -0
  227. package/lib/typescript/color-picker/types.d.ts +24 -0
  228. package/lib/typescript/color-picker/types.d.ts.map +1 -0
  229. package/lib/typescript/color-slider/ColorSliderRail.d.ts +6 -0
  230. package/lib/typescript/color-slider/ColorSliderRail.d.ts.map +1 -0
  231. package/lib/typescript/color-slider/ColorSliderRoot.d.ts +7 -0
  232. package/lib/typescript/color-slider/ColorSliderRoot.d.ts.map +1 -0
  233. package/lib/typescript/color-slider/ColorSliderThumb.d.ts +6 -0
  234. package/lib/typescript/color-slider/ColorSliderThumb.d.ts.map +1 -0
  235. package/lib/typescript/color-slider/context.d.ts +6 -0
  236. package/lib/typescript/color-slider/context.d.ts.map +1 -0
  237. package/lib/typescript/color-slider/index.d.ts +6 -0
  238. package/lib/typescript/color-slider/index.d.ts.map +1 -0
  239. package/lib/typescript/color-slider/types.d.ts +82 -0
  240. package/lib/typescript/color-slider/types.d.ts.map +1 -0
  241. package/lib/typescript/color-slider/utils.d.ts +12 -0
  242. package/lib/typescript/color-slider/utils.d.ts.map +1 -0
  243. package/lib/typescript/color-swatch-picker/ColorSwatchPickerItem.d.ts +6 -0
  244. package/lib/typescript/color-swatch-picker/ColorSwatchPickerItem.d.ts.map +1 -0
  245. package/lib/typescript/color-swatch-picker/ColorSwatchPickerRoot.d.ts +7 -0
  246. package/lib/typescript/color-swatch-picker/ColorSwatchPickerRoot.d.ts.map +1 -0
  247. package/lib/typescript/color-swatch-picker/context.d.ts +8 -0
  248. package/lib/typescript/color-swatch-picker/context.d.ts.map +1 -0
  249. package/lib/typescript/color-swatch-picker/index.d.ts +5 -0
  250. package/lib/typescript/color-swatch-picker/index.d.ts.map +1 -0
  251. package/lib/typescript/color-swatch-picker/types.d.ts +26 -0
  252. package/lib/typescript/color-swatch-picker/types.d.ts.map +1 -0
  253. package/lib/typescript/dialog/DialogContent.d.ts +1 -1
  254. package/lib/typescript/dialog/DialogContent.d.ts.map +1 -1
  255. package/lib/typescript/dialog/DialogPopup.d.ts.map +1 -1
  256. package/lib/typescript/dialog/DialogRoot.d.ts.map +1 -1
  257. package/lib/typescript/dialog/types.d.ts +12 -0
  258. package/lib/typescript/dialog/types.d.ts.map +1 -1
  259. package/lib/typescript/field/types.d.ts +1 -1
  260. package/lib/typescript/field/types.d.ts.map +1 -1
  261. package/lib/typescript/form/types.d.ts +6 -0
  262. package/lib/typescript/form/types.d.ts.map +1 -1
  263. package/lib/typescript/index.d.ts +7 -0
  264. package/lib/typescript/index.d.ts.map +1 -1
  265. package/lib/typescript/input/types.d.ts +1 -0
  266. package/lib/typescript/input/types.d.ts.map +1 -1
  267. package/lib/typescript/link/types.d.ts +2 -2
  268. package/lib/typescript/list-item/types.d.ts +3 -2
  269. package/lib/typescript/list-item/types.d.ts.map +1 -1
  270. package/lib/typescript/portal/portal.d.ts +13 -2
  271. package/lib/typescript/portal/portal.d.ts.map +1 -1
  272. package/lib/typescript/progress-bar/types.d.ts +9 -4
  273. package/lib/typescript/progress-bar/types.d.ts.map +1 -1
  274. package/lib/typescript/radio/types.d.ts +2 -0
  275. package/lib/typescript/radio/types.d.ts.map +1 -1
  276. package/lib/typescript/select/SelectContent.d.ts.map +1 -1
  277. package/lib/typescript/slider/useSliderPointer.d.ts.map +1 -1
  278. package/lib/typescript/switch/types.d.ts +4 -4
  279. package/lib/typescript/tabs/types.d.ts +7 -2
  280. package/lib/typescript/tabs/types.d.ts.map +1 -1
  281. package/lib/typescript/utils/createPortal.web.d.ts +6 -2
  282. package/lib/typescript/utils/createPortal.web.d.ts.map +1 -1
  283. package/lib/typescript/utils/textAncestor.d.ts +13 -0
  284. package/lib/typescript/utils/textAncestor.d.ts.map +1 -0
  285. package/lib/typescript/utils/textAncestor.web.d.ts +15 -0
  286. package/lib/typescript/utils/textAncestor.web.d.ts.map +1 -0
  287. package/package.json +4 -3
  288. package/src/breadcrumbs/types.ts +13 -0
  289. package/src/checkbox/types.ts +4 -0
  290. package/src/color/Color.ts +95 -0
  291. package/src/color/index.ts +2 -0
  292. package/src/color/types.ts +19 -0
  293. package/src/color-area/ColorAreaAccessibility.tsx +94 -0
  294. package/src/color-area/ColorAreaAccessibility.web.tsx +52 -0
  295. package/src/color-area/ColorAreaRoot.tsx +326 -0
  296. package/src/color-area/ColorAreaThumb.tsx +56 -0
  297. package/src/color-area/context.tsx +5 -0
  298. package/src/color-area/index.ts +10 -0
  299. package/src/color-area/types.ts +69 -0
  300. package/src/color-area/utils.ts +51 -0
  301. package/src/color-field/ColorFieldInput.tsx +66 -0
  302. package/src/color-field/ColorFieldRoot.tsx +132 -0
  303. package/src/color-field/context.tsx +5 -0
  304. package/src/color-field/index.ts +11 -0
  305. package/src/color-field/types.ts +46 -0
  306. package/src/color-field/utils.ts +75 -0
  307. package/src/color-picker/ColorPickerRoot.tsx +91 -0
  308. package/src/color-picker/ColorPickerTrigger.tsx +96 -0
  309. package/src/color-picker/context.tsx +47 -0
  310. package/src/color-picker/index.ts +12 -0
  311. package/src/color-picker/types.ts +25 -0
  312. package/src/color-slider/ColorSliderRail.tsx +130 -0
  313. package/src/color-slider/ColorSliderRoot.tsx +222 -0
  314. package/src/color-slider/ColorSliderThumb.tsx +294 -0
  315. package/src/color-slider/context.tsx +5 -0
  316. package/src/color-slider/index.ts +16 -0
  317. package/src/color-slider/types.ts +94 -0
  318. package/src/color-slider/utils.ts +79 -0
  319. package/src/color-swatch-picker/ColorSwatchPickerItem.tsx +54 -0
  320. package/src/color-swatch-picker/ColorSwatchPickerRoot.tsx +94 -0
  321. package/src/color-swatch-picker/context.tsx +22 -0
  322. package/src/color-swatch-picker/index.ts +4 -0
  323. package/src/color-swatch-picker/types.ts +29 -0
  324. package/src/dialog/DialogContent.tsx +13 -5
  325. package/src/dialog/DialogPopup.tsx +7 -1
  326. package/src/dialog/DialogRoot.tsx +3 -1
  327. package/src/dialog/types.ts +12 -0
  328. package/src/field/types.tsx +1 -1
  329. package/src/form/types.tsx +6 -0
  330. package/src/index.ts +7 -0
  331. package/src/input/types.ts +1 -0
  332. package/src/link/types.ts +2 -2
  333. package/src/list-item/types.ts +3 -2
  334. package/src/portal/portal.tsx +17 -2
  335. package/src/progress-bar/types.ts +9 -4
  336. package/src/radio/types.ts +2 -0
  337. package/src/react-native-web.d.ts +6 -0
  338. package/src/select/SelectContent.tsx +2 -1
  339. package/src/slider/useSliderPointer.ts +3 -0
  340. package/src/switch/types.ts +4 -4
  341. package/src/tabs/types.ts +7 -2
  342. package/src/utils/createPortal.web.ts +9 -3
  343. package/src/utils/textAncestor.ts +19 -0
  344. package/src/utils/textAncestor.web.ts +19 -0
@@ -0,0 +1,326 @@
1
+ import { forwardRef, useCallback, useMemo, useRef, useState } from 'react';
2
+ import {
3
+ I18nManager,
4
+ PanResponder,
5
+ Platform,
6
+ View,
7
+ type GestureResponderEvent,
8
+ type LayoutChangeEvent,
9
+ } from 'react-native';
10
+ import { useControllableState } from '@cdx-ui/utils';
11
+ import { parseColor, type Color } from '../color';
12
+ import { useOptionalColorPickerContext } from '../color-picker';
13
+ import { Slot } from '../slot';
14
+ import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
15
+ import { ColorAreaAccessibility } from './ColorAreaAccessibility';
16
+ import { ColorAreaProvider } from './context';
17
+ import type {
18
+ ColorAreaContextValue,
19
+ ColorAreaKeyboardEvent,
20
+ ColorAreaLayout,
21
+ IColorAreaProps,
22
+ } from './types';
23
+ import { clampColorChannel, snapColorChannel } from './utils';
24
+
25
+ function createDefaultColor(): Color {
26
+ const color = parseColor('#FF0000');
27
+ if (!color) {
28
+ throw new Error('ColorArea default color could not be parsed');
29
+ }
30
+ return color;
31
+ }
32
+
33
+ const DEFAULT_COLOR = createDefaultColor();
34
+ const EMPTY_LAYOUT: ColorAreaLayout = { width: 0, height: 0 };
35
+
36
+ function getFinitePoint(event: GestureResponderEvent): { x: number; y: number } | null {
37
+ const { locationX: x, locationY: y } = event.nativeEvent;
38
+ return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;
39
+ }
40
+
41
+ export interface ColorAreaRootProps extends IColorAreaProps {
42
+ readonly asChild?: boolean;
43
+ }
44
+
45
+ export const ColorAreaRoot = forwardRef<View, ColorAreaRootProps>(
46
+ (
47
+ {
48
+ asChild,
49
+ value: valueProp,
50
+ defaultValue,
51
+ onValueChange,
52
+ onValueChangeComplete,
53
+ colorSpace = 'hsb',
54
+ xChannel = 'saturation',
55
+ yChannel = 'brightness',
56
+ step = 1,
57
+ pageStep = 10,
58
+ isRTL = I18nManager.isRTL,
59
+ isDisabled = false,
60
+ accessibilityLabel,
61
+ children,
62
+ onLayout,
63
+ ...props
64
+ },
65
+ ref,
66
+ ) => {
67
+ const picker = useOptionalColorPickerContext();
68
+ const usesPickerContext =
69
+ picker !== null && valueProp === undefined && defaultValue === undefined;
70
+ const [localValue, setLocalValue] = useControllableState<Color>({
71
+ prop: valueProp,
72
+ defaultProp: defaultValue ?? DEFAULT_COLOR,
73
+ onChange: onValueChange,
74
+ });
75
+ const value = (usesPickerContext ? picker.value : localValue) ?? DEFAULT_COLOR;
76
+ const [layout, setLayoutState] = useState<ColorAreaLayout>(EMPTY_LAYOUT);
77
+ const [thumbSize, setThumbSizeState] = useState<ColorAreaLayout>(EMPTY_LAYOUT);
78
+
79
+ const valueRef = useRef(value);
80
+ valueRef.current = value;
81
+ const layoutRef = useRef(layout);
82
+ layoutRef.current = layout;
83
+ const isDisabledRef = useRef(isDisabled);
84
+ isDisabledRef.current = isDisabled;
85
+ const setChannelsFromPointRef = useRef<
86
+ ((x: number, y: number, complete?: boolean) => void) | undefined
87
+ >(undefined);
88
+ const lastValidPointRef = useRef<{ x: number; y: number } | null>(null);
89
+
90
+ const commitValue = useCallback(
91
+ (next: Color, complete = false) => {
92
+ if (isDisabled) {
93
+ return;
94
+ }
95
+
96
+ valueRef.current = next;
97
+ if (usesPickerContext) {
98
+ onValueChange?.(next);
99
+ picker.onValueChange(next);
100
+ } else {
101
+ setLocalValue(next);
102
+ }
103
+ if (complete) {
104
+ onValueChangeComplete?.(next);
105
+ }
106
+ },
107
+ [isDisabled, onValueChange, onValueChangeComplete, picker, setLocalValue, usesPickerContext],
108
+ );
109
+
110
+ const setXValue = useCallback(
111
+ (nextValue: number, complete = false) => {
112
+ commitValue(
113
+ valueRef.current.withChannel(colorSpace, xChannel, snapColorChannel(nextValue, step)),
114
+ complete,
115
+ );
116
+ },
117
+ [colorSpace, commitValue, step, xChannel],
118
+ );
119
+
120
+ const setYValue = useCallback(
121
+ (nextValue: number, complete = false) => {
122
+ commitValue(
123
+ valueRef.current.withChannel(colorSpace, yChannel, snapColorChannel(nextValue, step)),
124
+ complete,
125
+ );
126
+ },
127
+ [colorSpace, commitValue, step, yChannel],
128
+ );
129
+
130
+ const setChannelsFromPoint = useCallback(
131
+ (x: number, y: number, complete = false) => {
132
+ const currentLayout = layoutRef.current;
133
+ if (
134
+ isDisabledRef.current ||
135
+ !Number.isFinite(x) ||
136
+ !Number.isFinite(y) ||
137
+ !Number.isFinite(currentLayout.width) ||
138
+ !Number.isFinite(currentLayout.height) ||
139
+ currentLayout.width <= 0 ||
140
+ currentLayout.height <= 0
141
+ ) {
142
+ return;
143
+ }
144
+
145
+ const visualXRatio = clampColorChannel(x, 0, currentLayout.width) / currentLayout.width;
146
+ const xRatio = isRTL ? 1 - visualXRatio : visualXRatio;
147
+ const yRatio = 1 - clampColorChannel(y, 0, currentLayout.height) / currentLayout.height;
148
+ const next = valueRef.current
149
+ .withChannel(colorSpace, xChannel, xRatio * 100)
150
+ .withChannel(colorSpace, yChannel, yRatio * 100);
151
+
152
+ commitValue(next, complete);
153
+ },
154
+ [colorSpace, commitValue, isRTL, xChannel, yChannel],
155
+ );
156
+ setChannelsFromPointRef.current = setChannelsFromPoint;
157
+
158
+ const handleKeyDown = useCallback(
159
+ (event: ColorAreaKeyboardEvent) => {
160
+ if (isDisabled) {
161
+ return;
162
+ }
163
+
164
+ const key = event.nativeEvent?.key ?? event.key;
165
+ const shiftKey = event.nativeEvent?.shiftKey ?? event.shiftKey;
166
+ const increment = shiftKey ? pageStep : step;
167
+ const currentX = valueRef.current.getChannel(colorSpace, xChannel);
168
+ const currentY = valueRef.current.getChannel(colorSpace, yChannel);
169
+ let handled = true;
170
+
171
+ if (key === 'ArrowLeft') {
172
+ setXValue(currentX + (isRTL ? increment : -increment), true);
173
+ } else if (key === 'ArrowRight') {
174
+ setXValue(currentX + (isRTL ? -increment : increment), true);
175
+ } else if (key === 'ArrowUp') {
176
+ setYValue(currentY + increment, true);
177
+ } else if (key === 'ArrowDown') {
178
+ setYValue(currentY - increment, true);
179
+ } else if (key === 'PageUp') {
180
+ setYValue(currentY + pageStep, true);
181
+ } else if (key === 'PageDown') {
182
+ setYValue(currentY - pageStep, true);
183
+ } else if (key === 'Home') {
184
+ setXValue(currentX + (isRTL ? pageStep : -pageStep), true);
185
+ } else if (key === 'End') {
186
+ setXValue(currentX + (isRTL ? -pageStep : pageStep), true);
187
+ } else {
188
+ handled = false;
189
+ }
190
+
191
+ if (handled) {
192
+ event.preventDefault?.();
193
+ }
194
+ },
195
+ [colorSpace, isDisabled, isRTL, pageStep, setXValue, setYValue, step, xChannel, yChannel],
196
+ );
197
+
198
+ const panResponder = useMemo(() => {
199
+ const updateFromEvent = (event: GestureResponderEvent, complete = false) => {
200
+ const point = getFinitePoint(event);
201
+ if (point) {
202
+ lastValidPointRef.current = point;
203
+ }
204
+ const resolvedPoint = point ?? lastValidPointRef.current;
205
+ if (resolvedPoint) {
206
+ setChannelsFromPointRef.current?.(resolvedPoint.x, resolvedPoint.y, complete);
207
+ }
208
+ };
209
+
210
+ return PanResponder.create({
211
+ onStartShouldSetPanResponder: () => !isDisabledRef.current,
212
+ onMoveShouldSetPanResponder: () => !isDisabledRef.current,
213
+ onPanResponderTerminationRequest: () => false,
214
+ onShouldBlockNativeResponder: () => true,
215
+ onPanResponderGrant: (event) => {
216
+ lastValidPointRef.current = null;
217
+ updateFromEvent(event);
218
+ },
219
+ onPanResponderMove: (event) => {
220
+ updateFromEvent(event);
221
+ },
222
+ onPanResponderRelease: (event) => {
223
+ updateFromEvent(event, true);
224
+ lastValidPointRef.current = null;
225
+ },
226
+ onPanResponderTerminate: (event) => {
227
+ updateFromEvent(event, true);
228
+ lastValidPointRef.current = null;
229
+ },
230
+ });
231
+ }, []);
232
+
233
+ const setLayout = useCallback((next: ColorAreaLayout) => {
234
+ setLayoutState((previous) =>
235
+ previous.width === next.width && previous.height === next.height ? previous : next,
236
+ );
237
+ }, []);
238
+
239
+ const setThumbSize = useCallback((next: ColorAreaLayout) => {
240
+ setThumbSizeState((previous) =>
241
+ previous.width === next.width && previous.height === next.height ? previous : next,
242
+ );
243
+ }, []);
244
+
245
+ const handleLayout = useCallback(
246
+ (event: LayoutChangeEvent) => {
247
+ const { width, height } = event.nativeEvent.layout;
248
+ setLayout({ width, height });
249
+ onLayout?.(event);
250
+ },
251
+ [onLayout, setLayout],
252
+ );
253
+
254
+ const xValue = value.getChannel(colorSpace, xChannel);
255
+ const yValue = value.getChannel(colorSpace, yChannel);
256
+ const contextValue = useMemo<ColorAreaContextValue>(
257
+ () => ({
258
+ value,
259
+ xValue,
260
+ yValue,
261
+ xPercent: clampColorChannel(xValue),
262
+ yPercent: clampColorChannel(yValue),
263
+ layout,
264
+ thumbSize,
265
+ isRTL,
266
+ isDisabled,
267
+ step,
268
+ pageStep,
269
+ setLayout,
270
+ setThumbSize,
271
+ setChannelsFromPoint,
272
+ setXValue,
273
+ setYValue,
274
+ handleKeyDown,
275
+ }),
276
+ [
277
+ handleKeyDown,
278
+ isDisabled,
279
+ isRTL,
280
+ layout,
281
+ pageStep,
282
+ setChannelsFromPoint,
283
+ setLayout,
284
+ setThumbSize,
285
+ setXValue,
286
+ setYValue,
287
+ step,
288
+ thumbSize,
289
+ value,
290
+ xValue,
291
+ yValue,
292
+ ],
293
+ );
294
+
295
+ const Comp = asChild ? Slot : View;
296
+
297
+ return (
298
+ <ColorAreaProvider value={contextValue}>
299
+ <Comp
300
+ ref={ref}
301
+ {...props}
302
+ {...panResponder.panHandlers}
303
+ onLayout={handleLayout}
304
+ role={Platform.OS === 'web' ? 'group' : undefined}
305
+ aria-label={props['aria-label'] ?? accessibilityLabel}
306
+ accessibilityLabel={accessibilityLabel}
307
+ accessibilityState={{ disabled: isDisabled }}
308
+ {...mergeDataAttributes(
309
+ props,
310
+ dataAttributes({
311
+ disabled: isDisabled,
312
+ colorSpace,
313
+ xChannel,
314
+ yChannel,
315
+ }),
316
+ )}
317
+ >
318
+ {children}
319
+ <ColorAreaAccessibility accessibilityLabel={accessibilityLabel} />
320
+ </Comp>
321
+ </ColorAreaProvider>
322
+ );
323
+ },
324
+ );
325
+
326
+ ColorAreaRoot.displayName = 'ColorAreaRoot';
@@ -0,0 +1,56 @@
1
+ import { forwardRef, useCallback, useMemo } from 'react';
2
+ import { View, type LayoutChangeEvent, type ViewStyle } from 'react-native';
3
+ import { Slot } from '../slot';
4
+ import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
5
+ import { useColorAreaContext } from './context';
6
+ import type { IColorAreaThumbProps } from './types';
7
+
8
+ export interface ColorAreaThumbProps extends IColorAreaThumbProps {}
9
+
10
+ export const ColorAreaThumb = forwardRef<View, ColorAreaThumbProps>(
11
+ ({ asChild, style, onLayout, children, ...props }, ref) => {
12
+ const { xPercent, yPercent, layout, thumbSize, isRTL, setThumbSize } = useColorAreaContext();
13
+
14
+ const positionStyle = useMemo<ViewStyle>(() => {
15
+ const visualXPercent = isRTL ? 100 - xPercent : xPercent;
16
+ const translateX = (visualXPercent / 100) * layout.width - thumbSize.width / 2;
17
+ const translateY = ((100 - yPercent) / 100) * layout.height - thumbSize.height / 2;
18
+
19
+ return {
20
+ position: 'absolute',
21
+ top: 0,
22
+ left: 0,
23
+ pointerEvents: 'none',
24
+ transform: [{ translateX }, { translateY }],
25
+ };
26
+ }, [isRTL, layout.height, layout.width, thumbSize.height, thumbSize.width, xPercent, yPercent]);
27
+
28
+ const handleLayout = useCallback(
29
+ (event: LayoutChangeEvent) => {
30
+ const { width, height } = event.nativeEvent.layout;
31
+ setThumbSize({ width, height });
32
+ onLayout?.(event);
33
+ },
34
+ [onLayout, setThumbSize],
35
+ );
36
+
37
+ const Comp = asChild ? Slot : View;
38
+
39
+ return (
40
+ <Comp
41
+ ref={ref}
42
+ {...props}
43
+ accessible={false}
44
+ accessibilityElementsHidden
45
+ importantForAccessibility="no-hide-descendants"
46
+ onLayout={handleLayout}
47
+ style={[positionStyle, style]}
48
+ {...mergeDataAttributes(props, dataAttributes({ slot: 'color-area-thumb' }))}
49
+ >
50
+ {children}
51
+ </Comp>
52
+ );
53
+ },
54
+ );
55
+
56
+ ColorAreaThumb.displayName = 'ColorAreaThumb';
@@ -0,0 +1,5 @@
1
+ import { createContext } from '@cdx-ui/utils';
2
+ import type { ColorAreaContextValue } from './types';
3
+
4
+ export const [ColorAreaProvider, useColorAreaContext] =
5
+ createContext<ColorAreaContextValue>('ColorAreaContext');
@@ -0,0 +1,10 @@
1
+ export { ColorAreaRoot, type ColorAreaRootProps } from './ColorAreaRoot';
2
+ export { ColorAreaThumb, type ColorAreaThumbProps } from './ColorAreaThumb';
3
+ export { useColorAreaContext } from './context';
4
+ export type {
5
+ ColorAreaContextValue,
6
+ ColorAreaKeyboardEvent,
7
+ ColorAreaLayout,
8
+ IColorAreaProps,
9
+ IColorAreaThumbProps,
10
+ } from './types';
@@ -0,0 +1,69 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ViewProps } from 'react-native';
3
+ import type { Color } from '../color';
4
+
5
+ export interface IColorAreaProps extends Omit<ViewProps, 'children'> {
6
+ /** Current controlled color. */
7
+ readonly value?: Color;
8
+ /** Initial color for uncontrolled usage. */
9
+ readonly defaultValue?: Color;
10
+ /** Called while either color channel changes. */
11
+ readonly onValueChange?: (value: Color) => void;
12
+ /** Called when a pointer, keyboard, or screen reader interaction completes. */
13
+ readonly onValueChangeComplete?: (value: Color) => void;
14
+ /** Color space represented by the area. @default `'hsb'` */
15
+ readonly colorSpace?: 'hsb';
16
+ /** Horizontal channel. @default `'saturation'` */
17
+ readonly xChannel?: 'saturation';
18
+ /** Vertical channel. @default `'brightness'` */
19
+ readonly yChannel?: 'brightness';
20
+ /** Arrow-key and screen-reader increment. @default `1` */
21
+ readonly step?: number;
22
+ /** Shift-arrow and page-key increment. @default `10` */
23
+ readonly pageStep?: number;
24
+ /** Overrides the platform layout direction for horizontal interaction. */
25
+ readonly isRTL?: boolean;
26
+ /** Disables pointer, keyboard, and screen reader interaction. @default `false` */
27
+ readonly isDisabled?: boolean;
28
+ readonly children?: ReactNode;
29
+ }
30
+
31
+ export interface IColorAreaThumbProps extends ViewProps {
32
+ readonly asChild?: boolean;
33
+ readonly children?: ReactNode;
34
+ }
35
+
36
+ export interface ColorAreaLayout {
37
+ readonly width: number;
38
+ readonly height: number;
39
+ }
40
+
41
+ export interface ColorAreaContextValue {
42
+ readonly value: Color;
43
+ readonly xValue: number;
44
+ readonly yValue: number;
45
+ readonly xPercent: number;
46
+ readonly yPercent: number;
47
+ readonly layout: ColorAreaLayout;
48
+ readonly thumbSize: ColorAreaLayout;
49
+ readonly isRTL: boolean;
50
+ readonly isDisabled: boolean;
51
+ readonly step: number;
52
+ readonly pageStep: number;
53
+ readonly setLayout: (layout: ColorAreaLayout) => void;
54
+ readonly setThumbSize: (size: ColorAreaLayout) => void;
55
+ readonly setChannelsFromPoint: (x: number, y: number, complete?: boolean) => void;
56
+ readonly setXValue: (value: number, complete?: boolean) => void;
57
+ readonly setYValue: (value: number, complete?: boolean) => void;
58
+ readonly handleKeyDown: (event: ColorAreaKeyboardEvent) => void;
59
+ }
60
+
61
+ export interface ColorAreaKeyboardEvent {
62
+ readonly nativeEvent?: {
63
+ readonly key?: string;
64
+ readonly shiftKey?: boolean;
65
+ };
66
+ readonly key?: string;
67
+ readonly shiftKey?: boolean;
68
+ preventDefault?: () => void;
69
+ }
@@ -0,0 +1,51 @@
1
+ import type { Color } from '../color';
2
+
3
+ export function clampColorChannel(value: number, min = 0, max = 100): number {
4
+ if (!Number.isFinite(value)) {
5
+ return min;
6
+ }
7
+ return Math.min(max, Math.max(min, value));
8
+ }
9
+
10
+ export function snapColorChannel(value: number, step: number, min = 0, max = 100): number {
11
+ const clamped = clampColorChannel(value, min, max);
12
+ const snapped = step > 0 ? min + Math.round((clamped - min) / step) * step : clamped;
13
+ return clampColorChannel(snapped, min, max);
14
+ }
15
+
16
+ function describeColor(color: Color): string {
17
+ const hue = clampColorChannel(color.getChannel('hsb', 'hue'), 0, 360);
18
+ const saturation = clampColorChannel(color.getChannel('hsb', 'saturation'));
19
+ const brightness = clampColorChannel(color.getChannel('hsb', 'brightness'));
20
+
21
+ if (brightness <= 10) {
22
+ return 'black';
23
+ }
24
+ if (saturation <= 10) {
25
+ if (brightness >= 90) {
26
+ return 'white';
27
+ }
28
+ return brightness < 45 ? 'dark gray' : brightness > 75 ? 'light gray' : 'gray';
29
+ }
30
+
31
+ const names = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple', 'magenta'];
32
+ const index = Math.round((((hue % 360) + 360) % 360) / 45) % names.length;
33
+ const tone = brightness < 40 ? 'dark ' : brightness > 80 ? 'light ' : '';
34
+ const intensity = saturation > 75 ? 'vibrant ' : saturation < 40 ? 'muted ' : '';
35
+
36
+ return `${tone}${intensity}${names[index]}`;
37
+ }
38
+
39
+ export function colorAreaValueText(color: Color, changedChannel?: 'saturation' | 'brightness') {
40
+ const saturation = Math.round(clampColorChannel(color.getChannel('hsb', 'saturation')));
41
+ const brightness = Math.round(clampColorChannel(color.getChannel('hsb', 'brightness')));
42
+ const colorName = describeColor(color);
43
+
44
+ if (changedChannel === 'saturation') {
45
+ return `Saturation ${String(saturation)}%, ${colorName}`;
46
+ }
47
+ if (changedChannel === 'brightness') {
48
+ return `Brightness ${String(brightness)}%, ${colorName}`;
49
+ }
50
+ return `Saturation ${String(saturation)}%, Brightness ${String(brightness)}%, ${colorName}`;
51
+ }
@@ -0,0 +1,66 @@
1
+ import { forwardRef, useEffect, useState } from 'react';
2
+ import { TextInput } from 'react-native';
3
+ import { InputField } from '../input';
4
+ import { useColorFieldContext } from './context';
5
+ import type { IColorFieldInputProps } from './types';
6
+
7
+ export type ColorFieldInputProps = IColorFieldInputProps;
8
+
9
+ export const ColorFieldInput = forwardRef<TextInput, ColorFieldInputProps>(
10
+ (
11
+ {
12
+ onChangeText,
13
+ onFocus,
14
+ onBlur,
15
+ editable,
16
+ keyboardType,
17
+ autoCapitalize = 'none',
18
+ autoCorrect = false,
19
+ ...props
20
+ },
21
+ ref,
22
+ ) => {
23
+ const { value, colorSpace, disabled, readOnly, invalid, required, commitText, formatValue } =
24
+ useColorFieldContext();
25
+ const [text, setText] = useState(formatValue);
26
+ const [isEditing, setIsEditing] = useState(false);
27
+
28
+ useEffect(() => {
29
+ if (!isEditing) {
30
+ setText(formatValue());
31
+ }
32
+ }, [formatValue, isEditing, value]);
33
+
34
+ return (
35
+ <InputField
36
+ ref={ref}
37
+ {...props}
38
+ value={text}
39
+ editable={editable ?? !(disabled || readOnly)}
40
+ disabled={disabled}
41
+ isDisabled={disabled}
42
+ isReadOnly={readOnly}
43
+ isInvalid={invalid}
44
+ isRequired={required}
45
+ keyboardType={keyboardType ?? (colorSpace ? 'decimal-pad' : 'default')}
46
+ autoCapitalize={autoCapitalize}
47
+ autoCorrect={autoCorrect}
48
+ onChangeText={(nextText) => {
49
+ onChangeText?.(nextText);
50
+ setText(nextText);
51
+ commitText(nextText);
52
+ }}
53
+ onFocus={(event) => {
54
+ setIsEditing(true);
55
+ onFocus?.(event);
56
+ }}
57
+ onBlur={(event) => {
58
+ setIsEditing(false);
59
+ onBlur?.(event);
60
+ }}
61
+ />
62
+ );
63
+ },
64
+ );
65
+
66
+ ColorFieldInput.displayName = 'ColorFieldInput';