reka-ui 2.8.0 → 2.9.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 (622) hide show
  1. package/dist/Autocomplete/AutocompleteInput.cjs +128 -0
  2. package/dist/Autocomplete/AutocompleteInput.cjs.map +1 -0
  3. package/dist/Autocomplete/AutocompleteInput.js +122 -0
  4. package/dist/Autocomplete/AutocompleteInput.js.map +1 -0
  5. package/dist/Autocomplete/AutocompleteRoot.cjs +258 -0
  6. package/dist/Autocomplete/AutocompleteRoot.cjs.map +1 -0
  7. package/dist/Autocomplete/AutocompleteRoot.js +246 -0
  8. package/dist/Autocomplete/AutocompleteRoot.js.map +1 -0
  9. package/dist/Calendar/CalendarCellTrigger.cjs +12 -6
  10. package/dist/Calendar/CalendarCellTrigger.cjs.map +1 -1
  11. package/dist/Calendar/CalendarCellTrigger.js +13 -7
  12. package/dist/Calendar/CalendarCellTrigger.js.map +1 -1
  13. package/dist/Calendar/CalendarNext.cjs +7 -3
  14. package/dist/Calendar/CalendarNext.cjs.map +1 -1
  15. package/dist/Calendar/CalendarNext.js +7 -3
  16. package/dist/Calendar/CalendarNext.js.map +1 -1
  17. package/dist/Calendar/CalendarPrev.cjs +7 -3
  18. package/dist/Calendar/CalendarPrev.cjs.map +1 -1
  19. package/dist/Calendar/CalendarPrev.js +7 -3
  20. package/dist/Calendar/CalendarPrev.js.map +1 -1
  21. package/dist/Calendar/CalendarRoot.cjs +12 -7
  22. package/dist/Calendar/CalendarRoot.cjs.map +1 -1
  23. package/dist/Calendar/CalendarRoot.js +13 -8
  24. package/dist/Calendar/CalendarRoot.js.map +1 -1
  25. package/dist/Calendar/useCalendar.cjs +32 -2
  26. package/dist/Calendar/useCalendar.cjs.map +1 -1
  27. package/dist/Calendar/useCalendar.js +33 -3
  28. package/dist/Calendar/useCalendar.js.map +1 -1
  29. package/dist/Checkbox/CheckboxGroupRoot.cjs +1 -1
  30. package/dist/Checkbox/CheckboxGroupRoot.js +1 -1
  31. package/dist/Checkbox/CheckboxRoot.cjs +21 -10
  32. package/dist/Checkbox/CheckboxRoot.cjs.map +1 -1
  33. package/dist/Checkbox/CheckboxRoot.js +21 -10
  34. package/dist/Checkbox/CheckboxRoot.js.map +1 -1
  35. package/dist/ColorArea/ColorAreaArea.cjs +143 -0
  36. package/dist/ColorArea/ColorAreaArea.cjs.map +1 -0
  37. package/dist/ColorArea/ColorAreaArea.js +137 -0
  38. package/dist/ColorArea/ColorAreaArea.js.map +1 -0
  39. package/dist/ColorArea/ColorAreaRoot.cjs +240 -0
  40. package/dist/ColorArea/ColorAreaRoot.cjs.map +1 -0
  41. package/dist/ColorArea/ColorAreaRoot.js +228 -0
  42. package/dist/ColorArea/ColorAreaRoot.js.map +1 -0
  43. package/dist/ColorArea/ColorAreaThumb.cjs +91 -0
  44. package/dist/ColorArea/ColorAreaThumb.cjs.map +1 -0
  45. package/dist/ColorArea/ColorAreaThumb.js +85 -0
  46. package/dist/ColorArea/ColorAreaThumb.js.map +1 -0
  47. package/dist/ColorArea/utils.cjs +32 -0
  48. package/dist/ColorArea/utils.cjs.map +1 -0
  49. package/dist/ColorArea/utils.js +21 -0
  50. package/dist/ColorArea/utils.js.map +1 -0
  51. package/dist/ColorField/ColorFieldInput.cjs +140 -0
  52. package/dist/ColorField/ColorFieldInput.cjs.map +1 -0
  53. package/dist/ColorField/ColorFieldInput.js +134 -0
  54. package/dist/ColorField/ColorFieldInput.js.map +1 -0
  55. package/dist/ColorField/ColorFieldRoot.cjs +281 -0
  56. package/dist/ColorField/ColorFieldRoot.cjs.map +1 -0
  57. package/dist/ColorField/ColorFieldRoot.js +269 -0
  58. package/dist/ColorField/ColorFieldRoot.js.map +1 -0
  59. package/dist/ColorSlider/ColorSliderRoot.cjs +230 -0
  60. package/dist/ColorSlider/ColorSliderRoot.cjs.map +1 -0
  61. package/dist/ColorSlider/ColorSliderRoot.js +218 -0
  62. package/dist/ColorSlider/ColorSliderRoot.js.map +1 -0
  63. package/dist/ColorSlider/ColorSliderThumb.cjs +66 -0
  64. package/dist/ColorSlider/ColorSliderThumb.cjs.map +1 -0
  65. package/dist/ColorSlider/ColorSliderThumb.js +60 -0
  66. package/dist/ColorSlider/ColorSliderThumb.js.map +1 -0
  67. package/dist/ColorSlider/ColorSliderTrack.cjs +55 -0
  68. package/dist/ColorSlider/ColorSliderTrack.cjs.map +1 -0
  69. package/dist/ColorSlider/ColorSliderTrack.js +49 -0
  70. package/dist/ColorSlider/ColorSliderTrack.js.map +1 -0
  71. package/dist/ColorSwatch/ColorSwatch.cjs +106 -0
  72. package/dist/ColorSwatch/ColorSwatch.cjs.map +1 -0
  73. package/dist/ColorSwatch/ColorSwatch.js +100 -0
  74. package/dist/ColorSwatch/ColorSwatch.js.map +1 -0
  75. package/dist/ColorSwatchPicker/ColorSwatchPickerItem.cjs +78 -0
  76. package/dist/ColorSwatchPicker/ColorSwatchPickerItem.cjs.map +1 -0
  77. package/dist/ColorSwatchPicker/ColorSwatchPickerItem.js +66 -0
  78. package/dist/ColorSwatchPicker/ColorSwatchPickerItem.js.map +1 -0
  79. package/dist/ColorSwatchPicker/ColorSwatchPickerItemIndicator.cjs +40 -0
  80. package/dist/ColorSwatchPicker/ColorSwatchPickerItemIndicator.cjs.map +1 -0
  81. package/dist/ColorSwatchPicker/ColorSwatchPickerItemIndicator.js +34 -0
  82. package/dist/ColorSwatchPicker/ColorSwatchPickerItemIndicator.js.map +1 -0
  83. package/dist/ColorSwatchPicker/ColorSwatchPickerItemSwatch.cjs +43 -0
  84. package/dist/ColorSwatchPicker/ColorSwatchPickerItemSwatch.cjs.map +1 -0
  85. package/dist/ColorSwatchPicker/ColorSwatchPickerItemSwatch.js +37 -0
  86. package/dist/ColorSwatchPicker/ColorSwatchPickerItemSwatch.js.map +1 -0
  87. package/dist/ColorSwatchPicker/ColorSwatchPickerRoot.cjs +110 -0
  88. package/dist/ColorSwatchPicker/ColorSwatchPickerRoot.cjs.map +1 -0
  89. package/dist/ColorSwatchPicker/ColorSwatchPickerRoot.js +104 -0
  90. package/dist/ColorSwatchPicker/ColorSwatchPickerRoot.js.map +1 -0
  91. package/dist/Combobox/ComboboxContent.cjs +4 -0
  92. package/dist/Combobox/ComboboxContent.cjs.map +1 -1
  93. package/dist/Combobox/ComboboxContent.js +4 -0
  94. package/dist/Combobox/ComboboxContent.js.map +1 -1
  95. package/dist/Combobox/ComboboxContentImpl.cjs +11 -3
  96. package/dist/Combobox/ComboboxContentImpl.cjs.map +1 -1
  97. package/dist/Combobox/ComboboxContentImpl.js +11 -3
  98. package/dist/Combobox/ComboboxContentImpl.js.map +1 -1
  99. package/dist/Combobox/ComboboxRoot.cjs +7 -1
  100. package/dist/Combobox/ComboboxRoot.js +2 -2
  101. package/dist/DateField/DateFieldRoot.cjs +1 -1
  102. package/dist/DateField/DateFieldRoot.js +1 -1
  103. package/dist/DatePicker/DatePickerRoot.cjs +4 -3
  104. package/dist/DatePicker/DatePickerRoot.cjs.map +1 -1
  105. package/dist/DatePicker/DatePickerRoot.js +4 -3
  106. package/dist/DatePicker/DatePickerRoot.js.map +1 -1
  107. package/dist/DateRangeField/DateRangeFieldRoot.cjs +1 -1
  108. package/dist/DateRangeField/DateRangeFieldRoot.cjs.map +1 -1
  109. package/dist/DateRangeField/DateRangeFieldRoot.js +1 -1
  110. package/dist/DateRangeField/DateRangeFieldRoot.js.map +1 -1
  111. package/dist/DateRangePicker/DateRangePickerRoot.cjs +4 -3
  112. package/dist/DateRangePicker/DateRangePickerRoot.cjs.map +1 -1
  113. package/dist/DateRangePicker/DateRangePickerRoot.js +5 -4
  114. package/dist/DateRangePicker/DateRangePickerRoot.js.map +1 -1
  115. package/dist/DismissableLayer/utils.cjs.map +1 -1
  116. package/dist/DismissableLayer/utils.js.map +1 -1
  117. package/dist/DropdownMenu/DropdownMenuFilter.cjs +134 -0
  118. package/dist/DropdownMenu/DropdownMenuFilter.cjs.map +1 -0
  119. package/dist/DropdownMenu/DropdownMenuFilter.js +128 -0
  120. package/dist/DropdownMenu/DropdownMenuFilter.js.map +1 -0
  121. package/dist/Listbox/ListboxRoot.cjs +1 -1
  122. package/dist/Listbox/ListboxRoot.js +1 -1
  123. package/dist/Listbox/ListboxVirtualizer.cjs +1 -1
  124. package/dist/Listbox/ListboxVirtualizer.js +1 -1
  125. package/dist/Menu/MenuContentImpl.cjs +44 -4
  126. package/dist/Menu/MenuContentImpl.cjs.map +1 -1
  127. package/dist/Menu/MenuContentImpl.js +44 -4
  128. package/dist/Menu/MenuContentImpl.js.map +1 -1
  129. package/dist/Menu/MenuItemImpl.cjs +8 -3
  130. package/dist/Menu/MenuItemImpl.cjs.map +1 -1
  131. package/dist/Menu/MenuItemImpl.js +9 -4
  132. package/dist/Menu/MenuItemImpl.js.map +1 -1
  133. package/dist/Menu/MenuSubContent.cjs +8 -2
  134. package/dist/Menu/MenuSubContent.cjs.map +1 -1
  135. package/dist/Menu/MenuSubContent.js +9 -3
  136. package/dist/Menu/MenuSubContent.js.map +1 -1
  137. package/dist/Menu/MenuSubTrigger.cjs +7 -0
  138. package/dist/Menu/MenuSubTrigger.cjs.map +1 -1
  139. package/dist/Menu/MenuSubTrigger.js +8 -1
  140. package/dist/Menu/MenuSubTrigger.js.map +1 -1
  141. package/dist/MonthPicker/MonthPickerCell.cjs +59 -0
  142. package/dist/MonthPicker/MonthPickerCell.cjs.map +1 -0
  143. package/dist/MonthPicker/MonthPickerCell.js +53 -0
  144. package/dist/MonthPicker/MonthPickerCell.js.map +1 -0
  145. package/dist/MonthPicker/MonthPickerCellTrigger.cjs +197 -0
  146. package/dist/MonthPicker/MonthPickerCellTrigger.cjs.map +1 -0
  147. package/dist/MonthPicker/MonthPickerCellTrigger.js +191 -0
  148. package/dist/MonthPicker/MonthPickerCellTrigger.js.map +1 -0
  149. package/dist/MonthPicker/MonthPickerGrid.cjs +59 -0
  150. package/dist/MonthPicker/MonthPickerGrid.cjs.map +1 -0
  151. package/dist/MonthPicker/MonthPickerGrid.js +53 -0
  152. package/dist/MonthPicker/MonthPickerGrid.js.map +1 -0
  153. package/dist/MonthPicker/MonthPickerGridBody.cjs +41 -0
  154. package/dist/MonthPicker/MonthPickerGridBody.cjs.map +1 -0
  155. package/dist/MonthPicker/MonthPickerGridBody.js +35 -0
  156. package/dist/MonthPicker/MonthPickerGridBody.js.map +1 -0
  157. package/dist/MonthPicker/MonthPickerGridRow.cjs +41 -0
  158. package/dist/MonthPicker/MonthPickerGridRow.cjs.map +1 -0
  159. package/dist/MonthPicker/MonthPickerGridRow.js +35 -0
  160. package/dist/MonthPicker/MonthPickerGridRow.js.map +1 -0
  161. package/dist/MonthPicker/MonthPickerHeader.cjs +41 -0
  162. package/dist/MonthPicker/MonthPickerHeader.cjs.map +1 -0
  163. package/dist/MonthPicker/MonthPickerHeader.js +35 -0
  164. package/dist/MonthPicker/MonthPickerHeader.js.map +1 -0
  165. package/dist/MonthPicker/MonthPickerHeading.cjs +48 -0
  166. package/dist/MonthPicker/MonthPickerHeading.cjs.map +1 -0
  167. package/dist/MonthPicker/MonthPickerHeading.js +42 -0
  168. package/dist/MonthPicker/MonthPickerHeading.js.map +1 -0
  169. package/dist/MonthPicker/MonthPickerNext.cjs +68 -0
  170. package/dist/MonthPicker/MonthPickerNext.cjs.map +1 -0
  171. package/dist/MonthPicker/MonthPickerNext.js +62 -0
  172. package/dist/MonthPicker/MonthPickerNext.js.map +1 -0
  173. package/dist/MonthPicker/MonthPickerPrev.cjs +68 -0
  174. package/dist/MonthPicker/MonthPickerPrev.cjs.map +1 -0
  175. package/dist/MonthPicker/MonthPickerPrev.js +62 -0
  176. package/dist/MonthPicker/MonthPickerPrev.js.map +1 -0
  177. package/dist/MonthPicker/MonthPickerRoot.cjs +281 -0
  178. package/dist/MonthPicker/MonthPickerRoot.cjs.map +1 -0
  179. package/dist/MonthPicker/MonthPickerRoot.js +269 -0
  180. package/dist/MonthPicker/MonthPickerRoot.js.map +1 -0
  181. package/dist/MonthPicker/useMonthPicker.cjs +148 -0
  182. package/dist/MonthPicker/useMonthPicker.cjs.map +1 -0
  183. package/dist/MonthPicker/useMonthPicker.js +136 -0
  184. package/dist/MonthPicker/useMonthPicker.js.map +1 -0
  185. package/dist/MonthRangePicker/MonthRangePickerCell.cjs +59 -0
  186. package/dist/MonthRangePicker/MonthRangePickerCell.cjs.map +1 -0
  187. package/dist/MonthRangePicker/MonthRangePickerCell.js +53 -0
  188. package/dist/MonthRangePicker/MonthRangePickerCell.js.map +1 -0
  189. package/dist/MonthRangePicker/MonthRangePickerCellTrigger.cjs +258 -0
  190. package/dist/MonthRangePicker/MonthRangePickerCellTrigger.cjs.map +1 -0
  191. package/dist/MonthRangePicker/MonthRangePickerCellTrigger.js +252 -0
  192. package/dist/MonthRangePicker/MonthRangePickerCellTrigger.js.map +1 -0
  193. package/dist/MonthRangePicker/MonthRangePickerGrid.cjs +59 -0
  194. package/dist/MonthRangePicker/MonthRangePickerGrid.cjs.map +1 -0
  195. package/dist/MonthRangePicker/MonthRangePickerGrid.js +53 -0
  196. package/dist/MonthRangePicker/MonthRangePickerGrid.js.map +1 -0
  197. package/dist/MonthRangePicker/MonthRangePickerGridBody.cjs +41 -0
  198. package/dist/MonthRangePicker/MonthRangePickerGridBody.cjs.map +1 -0
  199. package/dist/MonthRangePicker/MonthRangePickerGridBody.js +35 -0
  200. package/dist/MonthRangePicker/MonthRangePickerGridBody.js.map +1 -0
  201. package/dist/MonthRangePicker/MonthRangePickerGridRow.cjs +41 -0
  202. package/dist/MonthRangePicker/MonthRangePickerGridRow.cjs.map +1 -0
  203. package/dist/MonthRangePicker/MonthRangePickerGridRow.js +35 -0
  204. package/dist/MonthRangePicker/MonthRangePickerGridRow.js.map +1 -0
  205. package/dist/MonthRangePicker/MonthRangePickerHeader.cjs +41 -0
  206. package/dist/MonthRangePicker/MonthRangePickerHeader.cjs.map +1 -0
  207. package/dist/MonthRangePicker/MonthRangePickerHeader.js +35 -0
  208. package/dist/MonthRangePicker/MonthRangePickerHeader.js.map +1 -0
  209. package/dist/MonthRangePicker/MonthRangePickerHeading.cjs +48 -0
  210. package/dist/MonthRangePicker/MonthRangePickerHeading.cjs.map +1 -0
  211. package/dist/MonthRangePicker/MonthRangePickerHeading.js +42 -0
  212. package/dist/MonthRangePicker/MonthRangePickerHeading.js.map +1 -0
  213. package/dist/MonthRangePicker/MonthRangePickerNext.cjs +68 -0
  214. package/dist/MonthRangePicker/MonthRangePickerNext.cjs.map +1 -0
  215. package/dist/MonthRangePicker/MonthRangePickerNext.js +62 -0
  216. package/dist/MonthRangePicker/MonthRangePickerNext.js.map +1 -0
  217. package/dist/MonthRangePicker/MonthRangePickerPrev.cjs +68 -0
  218. package/dist/MonthRangePicker/MonthRangePickerPrev.cjs.map +1 -0
  219. package/dist/MonthRangePicker/MonthRangePickerPrev.js +62 -0
  220. package/dist/MonthRangePicker/MonthRangePickerPrev.js.map +1 -0
  221. package/dist/MonthRangePicker/MonthRangePickerRoot.cjs +347 -0
  222. package/dist/MonthRangePicker/MonthRangePickerRoot.cjs.map +1 -0
  223. package/dist/MonthRangePicker/MonthRangePickerRoot.js +335 -0
  224. package/dist/MonthRangePicker/MonthRangePickerRoot.js.map +1 -0
  225. package/dist/MonthRangePicker/useRangeMonthPicker.cjs +128 -0
  226. package/dist/MonthRangePicker/useRangeMonthPicker.cjs.map +1 -0
  227. package/dist/MonthRangePicker/useRangeMonthPicker.js +122 -0
  228. package/dist/MonthRangePicker/useRangeMonthPicker.js.map +1 -0
  229. package/dist/NavigationMenu/NavigationMenuItem.js +3 -3
  230. package/dist/NavigationMenu/NavigationMenuItem.js.map +1 -1
  231. package/dist/NumberField/NumberFieldRoot.cjs +3 -2
  232. package/dist/NumberField/NumberFieldRoot.cjs.map +1 -1
  233. package/dist/NumberField/NumberFieldRoot.js +3 -2
  234. package/dist/NumberField/NumberFieldRoot.js.map +1 -1
  235. package/dist/Progress/ProgressRoot.cjs.map +1 -1
  236. package/dist/Progress/ProgressRoot.js.map +1 -1
  237. package/dist/RadioGroup/RadioGroupRoot.cjs +1 -1
  238. package/dist/RadioGroup/RadioGroupRoot.js +1 -1
  239. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs +8 -2
  240. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs.map +1 -1
  241. package/dist/RangeCalendar/RangeCalendarCellTrigger.js +8 -2
  242. package/dist/RangeCalendar/RangeCalendarCellTrigger.js.map +1 -1
  243. package/dist/RangeCalendar/RangeCalendarGrid.cjs +2 -1
  244. package/dist/RangeCalendar/RangeCalendarGrid.cjs.map +1 -1
  245. package/dist/RangeCalendar/RangeCalendarGrid.js +2 -1
  246. package/dist/RangeCalendar/RangeCalendarGrid.js.map +1 -1
  247. package/dist/RangeCalendar/RangeCalendarNext.cjs +9 -5
  248. package/dist/RangeCalendar/RangeCalendarNext.cjs.map +1 -1
  249. package/dist/RangeCalendar/RangeCalendarNext.js +9 -5
  250. package/dist/RangeCalendar/RangeCalendarNext.js.map +1 -1
  251. package/dist/RangeCalendar/RangeCalendarPrev.cjs +9 -5
  252. package/dist/RangeCalendar/RangeCalendarPrev.cjs.map +1 -1
  253. package/dist/RangeCalendar/RangeCalendarPrev.js +9 -5
  254. package/dist/RangeCalendar/RangeCalendarPrev.js.map +1 -1
  255. package/dist/RangeCalendar/RangeCalendarRoot.cjs +31 -17
  256. package/dist/RangeCalendar/RangeCalendarRoot.cjs.map +1 -1
  257. package/dist/RangeCalendar/RangeCalendarRoot.js +32 -18
  258. package/dist/RangeCalendar/RangeCalendarRoot.js.map +1 -1
  259. package/dist/RangeCalendar/useRangeCalendar.cjs +35 -6
  260. package/dist/RangeCalendar/useRangeCalendar.cjs.map +1 -1
  261. package/dist/RangeCalendar/useRangeCalendar.js +35 -6
  262. package/dist/RangeCalendar/useRangeCalendar.js.map +1 -1
  263. package/dist/Splitter/SplitterGroup.cjs +136 -26
  264. package/dist/Splitter/SplitterGroup.cjs.map +1 -1
  265. package/dist/Splitter/SplitterGroup.js +136 -26
  266. package/dist/Splitter/SplitterGroup.js.map +1 -1
  267. package/dist/Splitter/SplitterPanel.cjs +7 -2
  268. package/dist/Splitter/SplitterPanel.cjs.map +1 -1
  269. package/dist/Splitter/SplitterPanel.js +7 -2
  270. package/dist/Splitter/SplitterPanel.js.map +1 -1
  271. package/dist/Switch/SwitchRoot.cjs +23 -9
  272. package/dist/Switch/SwitchRoot.cjs.map +1 -1
  273. package/dist/Switch/SwitchRoot.js +23 -9
  274. package/dist/Switch/SwitchRoot.js.map +1 -1
  275. package/dist/Switch/SwitchThumb.cjs +1 -1
  276. package/dist/Switch/SwitchThumb.cjs.map +1 -1
  277. package/dist/Switch/SwitchThumb.js +1 -1
  278. package/dist/Switch/SwitchThumb.js.map +1 -1
  279. package/dist/TimeField/TimeFieldRoot.cjs +1 -1
  280. package/dist/TimeField/TimeFieldRoot.cjs.map +1 -1
  281. package/dist/TimeField/TimeFieldRoot.js +1 -1
  282. package/dist/TimeField/TimeFieldRoot.js.map +1 -1
  283. package/dist/TimeRangeField/TimeRangeFieldInput.cjs +102 -0
  284. package/dist/TimeRangeField/TimeRangeFieldInput.cjs.map +1 -0
  285. package/dist/TimeRangeField/TimeRangeFieldInput.js +96 -0
  286. package/dist/TimeRangeField/TimeRangeFieldInput.js.map +1 -0
  287. package/dist/TimeRangeField/TimeRangeFieldRoot.cjs +402 -0
  288. package/dist/TimeRangeField/TimeRangeFieldRoot.cjs.map +1 -0
  289. package/dist/TimeRangeField/TimeRangeFieldRoot.js +390 -0
  290. package/dist/TimeRangeField/TimeRangeFieldRoot.js.map +1 -0
  291. package/dist/Toast/ToastAnnounce.cjs +4 -1
  292. package/dist/Toast/ToastAnnounce.cjs.map +1 -1
  293. package/dist/Toast/ToastAnnounce.js +4 -1
  294. package/dist/Toast/ToastAnnounce.js.map +1 -1
  295. package/dist/ToggleGroup/ToggleGroupRoot.cjs +1 -1
  296. package/dist/ToggleGroup/ToggleGroupRoot.js +1 -1
  297. package/dist/Tooltip/TooltipContent.cjs +1 -2
  298. package/dist/Tooltip/TooltipContent.cjs.map +1 -1
  299. package/dist/Tooltip/TooltipContent.js +1 -2
  300. package/dist/Tooltip/TooltipContent.js.map +1 -1
  301. package/dist/Tooltip/TooltipContentImpl.cjs +25 -18
  302. package/dist/Tooltip/TooltipContentImpl.cjs.map +1 -1
  303. package/dist/Tooltip/TooltipContentImpl.js +25 -18
  304. package/dist/Tooltip/TooltipContentImpl.js.map +1 -1
  305. package/dist/Tooltip/TooltipProvider.cjs +7 -2
  306. package/dist/Tooltip/TooltipProvider.cjs.map +1 -1
  307. package/dist/Tooltip/TooltipProvider.js +7 -2
  308. package/dist/Tooltip/TooltipProvider.js.map +1 -1
  309. package/dist/YearPicker/YearPickerCell.cjs +59 -0
  310. package/dist/YearPicker/YearPickerCell.cjs.map +1 -0
  311. package/dist/YearPicker/YearPickerCell.js +53 -0
  312. package/dist/YearPicker/YearPickerCell.js.map +1 -0
  313. package/dist/YearPicker/YearPickerCellTrigger.cjs +197 -0
  314. package/dist/YearPicker/YearPickerCellTrigger.cjs.map +1 -0
  315. package/dist/YearPicker/YearPickerCellTrigger.js +191 -0
  316. package/dist/YearPicker/YearPickerCellTrigger.js.map +1 -0
  317. package/dist/YearPicker/YearPickerGrid.cjs +59 -0
  318. package/dist/YearPicker/YearPickerGrid.cjs.map +1 -0
  319. package/dist/YearPicker/YearPickerGrid.js +53 -0
  320. package/dist/YearPicker/YearPickerGrid.js.map +1 -0
  321. package/dist/YearPicker/YearPickerGridBody.cjs +41 -0
  322. package/dist/YearPicker/YearPickerGridBody.cjs.map +1 -0
  323. package/dist/YearPicker/YearPickerGridBody.js +35 -0
  324. package/dist/YearPicker/YearPickerGridBody.js.map +1 -0
  325. package/dist/YearPicker/YearPickerGridRow.cjs +41 -0
  326. package/dist/YearPicker/YearPickerGridRow.cjs.map +1 -0
  327. package/dist/YearPicker/YearPickerGridRow.js +35 -0
  328. package/dist/YearPicker/YearPickerGridRow.js.map +1 -0
  329. package/dist/YearPicker/YearPickerHeader.cjs +41 -0
  330. package/dist/YearPicker/YearPickerHeader.cjs.map +1 -0
  331. package/dist/YearPicker/YearPickerHeader.js +35 -0
  332. package/dist/YearPicker/YearPickerHeader.js.map +1 -0
  333. package/dist/YearPicker/YearPickerHeading.cjs +48 -0
  334. package/dist/YearPicker/YearPickerHeading.cjs.map +1 -0
  335. package/dist/YearPicker/YearPickerHeading.js +42 -0
  336. package/dist/YearPicker/YearPickerHeading.js.map +1 -0
  337. package/dist/YearPicker/YearPickerNext.cjs +68 -0
  338. package/dist/YearPicker/YearPickerNext.cjs.map +1 -0
  339. package/dist/YearPicker/YearPickerNext.js +62 -0
  340. package/dist/YearPicker/YearPickerNext.js.map +1 -0
  341. package/dist/YearPicker/YearPickerPrev.cjs +68 -0
  342. package/dist/YearPicker/YearPickerPrev.cjs.map +1 -0
  343. package/dist/YearPicker/YearPickerPrev.js +62 -0
  344. package/dist/YearPicker/YearPickerPrev.js.map +1 -0
  345. package/dist/YearPicker/YearPickerRoot.cjs +287 -0
  346. package/dist/YearPicker/YearPickerRoot.cjs.map +1 -0
  347. package/dist/YearPicker/YearPickerRoot.js +275 -0
  348. package/dist/YearPicker/YearPickerRoot.js.map +1 -0
  349. package/dist/YearPicker/useYearPicker.cjs +180 -0
  350. package/dist/YearPicker/useYearPicker.cjs.map +1 -0
  351. package/dist/YearPicker/useYearPicker.js +168 -0
  352. package/dist/YearPicker/useYearPicker.js.map +1 -0
  353. package/dist/YearRangePicker/YearRangePickerCell.cjs +59 -0
  354. package/dist/YearRangePicker/YearRangePickerCell.cjs.map +1 -0
  355. package/dist/YearRangePicker/YearRangePickerCell.js +53 -0
  356. package/dist/YearRangePicker/YearRangePickerCell.js.map +1 -0
  357. package/dist/YearRangePicker/YearRangePickerCellTrigger.cjs +256 -0
  358. package/dist/YearRangePicker/YearRangePickerCellTrigger.cjs.map +1 -0
  359. package/dist/YearRangePicker/YearRangePickerCellTrigger.js +250 -0
  360. package/dist/YearRangePicker/YearRangePickerCellTrigger.js.map +1 -0
  361. package/dist/YearRangePicker/YearRangePickerGrid.cjs +59 -0
  362. package/dist/YearRangePicker/YearRangePickerGrid.cjs.map +1 -0
  363. package/dist/YearRangePicker/YearRangePickerGrid.js +53 -0
  364. package/dist/YearRangePicker/YearRangePickerGrid.js.map +1 -0
  365. package/dist/YearRangePicker/YearRangePickerGridBody.cjs +41 -0
  366. package/dist/YearRangePicker/YearRangePickerGridBody.cjs.map +1 -0
  367. package/dist/YearRangePicker/YearRangePickerGridBody.js +35 -0
  368. package/dist/YearRangePicker/YearRangePickerGridBody.js.map +1 -0
  369. package/dist/YearRangePicker/YearRangePickerGridRow.cjs +41 -0
  370. package/dist/YearRangePicker/YearRangePickerGridRow.cjs.map +1 -0
  371. package/dist/YearRangePicker/YearRangePickerGridRow.js +35 -0
  372. package/dist/YearRangePicker/YearRangePickerGridRow.js.map +1 -0
  373. package/dist/YearRangePicker/YearRangePickerHeader.cjs +41 -0
  374. package/dist/YearRangePicker/YearRangePickerHeader.cjs.map +1 -0
  375. package/dist/YearRangePicker/YearRangePickerHeader.js +35 -0
  376. package/dist/YearRangePicker/YearRangePickerHeader.js.map +1 -0
  377. package/dist/YearRangePicker/YearRangePickerHeading.cjs +48 -0
  378. package/dist/YearRangePicker/YearRangePickerHeading.cjs.map +1 -0
  379. package/dist/YearRangePicker/YearRangePickerHeading.js +42 -0
  380. package/dist/YearRangePicker/YearRangePickerHeading.js.map +1 -0
  381. package/dist/YearRangePicker/YearRangePickerNext.cjs +68 -0
  382. package/dist/YearRangePicker/YearRangePickerNext.cjs.map +1 -0
  383. package/dist/YearRangePicker/YearRangePickerNext.js +62 -0
  384. package/dist/YearRangePicker/YearRangePickerNext.js.map +1 -0
  385. package/dist/YearRangePicker/YearRangePickerPrev.cjs +68 -0
  386. package/dist/YearRangePicker/YearRangePickerPrev.cjs.map +1 -0
  387. package/dist/YearRangePicker/YearRangePickerPrev.js +62 -0
  388. package/dist/YearRangePicker/YearRangePickerPrev.js.map +1 -0
  389. package/dist/YearRangePicker/YearRangePickerRoot.cjs +350 -0
  390. package/dist/YearRangePicker/YearRangePickerRoot.cjs.map +1 -0
  391. package/dist/YearRangePicker/YearRangePickerRoot.js +338 -0
  392. package/dist/YearRangePicker/YearRangePickerRoot.js.map +1 -0
  393. package/dist/YearRangePicker/useRangeYearPicker.cjs +128 -0
  394. package/dist/YearRangePicker/useRangeYearPicker.cjs.map +1 -0
  395. package/dist/YearRangePicker/useRangeYearPicker.js +122 -0
  396. package/dist/YearRangePicker/useRangeYearPicker.js.map +1 -0
  397. package/dist/color/channel.cjs +378 -0
  398. package/dist/color/channel.cjs.map +1 -0
  399. package/dist/color/channel.js +349 -0
  400. package/dist/color/channel.js.map +1 -0
  401. package/dist/color/convert.cjs +285 -0
  402. package/dist/color/convert.cjs.map +1 -0
  403. package/dist/color/convert.js +237 -0
  404. package/dist/color/convert.js.map +1 -0
  405. package/dist/color/gradient.cjs +377 -0
  406. package/dist/color/gradient.cjs.map +1 -0
  407. package/dist/color/gradient.js +354 -0
  408. package/dist/color/gradient.js.map +1 -0
  409. package/dist/color/parse.cjs +113 -0
  410. package/dist/color/parse.cjs.map +1 -0
  411. package/dist/color/parse.js +95 -0
  412. package/dist/color/parse.js.map +1 -0
  413. package/dist/color/utils.cjs +112 -0
  414. package/dist/color/utils.cjs.map +1 -0
  415. package/dist/color/utils.js +100 -0
  416. package/dist/color/utils.js.map +1 -0
  417. package/dist/composables/useWindowSplitterPanelGroupBehavior.cjs +11 -7
  418. package/dist/composables/useWindowSplitterPanelGroupBehavior.cjs.map +1 -1
  419. package/dist/composables/useWindowSplitterPanelGroupBehavior.js +11 -7
  420. package/dist/composables/useWindowSplitterPanelGroupBehavior.js.map +1 -1
  421. package/dist/constant/components.cjs +87 -1
  422. package/dist/constant/components.cjs.map +1 -1
  423. package/dist/constant/components.js +87 -1
  424. package/dist/constant/components.js.map +1 -1
  425. package/dist/constant.d.cts +12 -1
  426. package/dist/constant.d.cts.map +1 -1
  427. package/dist/constant.d.ts +12 -1
  428. package/dist/constant.d.ts.map +1 -1
  429. package/dist/date/calendar.cjs +70 -9
  430. package/dist/date/calendar.cjs.map +1 -1
  431. package/dist/date/calendar.js +54 -11
  432. package/dist/date/calendar.js.map +1 -1
  433. package/dist/date/comparators.cjs +129 -0
  434. package/dist/date/comparators.cjs.map +1 -1
  435. package/dist/date/comparators.js +76 -1
  436. package/dist/date/comparators.js.map +1 -1
  437. package/dist/date/useDateField.cjs +1 -2
  438. package/dist/date/useDateField.cjs.map +1 -1
  439. package/dist/date/useDateField.js +1 -2
  440. package/dist/date/useDateField.js.map +1 -1
  441. package/dist/date.cjs +12 -0
  442. package/dist/date.d.cts +2 -2
  443. package/dist/date.d.ts +2 -2
  444. package/dist/date.js +3 -3
  445. package/dist/index.cjs +216 -46
  446. package/dist/index.d.cts +3 -8829
  447. package/dist/index.d.ts +3 -8829
  448. package/dist/index.js +116 -47
  449. package/dist/index2.d.cts +66 -3
  450. package/dist/index2.d.cts.map +1 -1
  451. package/dist/index2.d.ts +66 -3
  452. package/dist/index2.d.ts.map +1 -1
  453. package/dist/index3.d.cts +11061 -0
  454. package/dist/index3.d.cts.map +1 -0
  455. package/dist/index3.d.ts +11061 -0
  456. package/dist/index3.d.ts.map +1 -0
  457. package/dist/internal.cjs +81 -0
  458. package/dist/internal.d.cts +22 -0
  459. package/dist/internal.d.cts.map +1 -0
  460. package/dist/internal.d.ts +22 -0
  461. package/dist/internal.d.ts.map +1 -0
  462. package/dist/internal.js +64 -0
  463. package/dist/internal2.cjs +0 -0
  464. package/dist/internal2.js +0 -0
  465. package/dist/namespaced/index.cjs +33 -1
  466. package/dist/namespaced/index.d.cts +32 -4
  467. package/dist/namespaced/index.d.mts +32 -4
  468. package/dist/namespaced/index.mjs +32 -4
  469. package/dist/shared/useArrowNavigation.cjs +4 -2
  470. package/dist/shared/useArrowNavigation.cjs.map +1 -1
  471. package/dist/shared/useArrowNavigation.js +4 -2
  472. package/dist/shared/useArrowNavigation.js.map +1 -1
  473. package/dist/shared/useForwardExpose.cjs +7 -3
  474. package/dist/shared/useForwardExpose.cjs.map +1 -1
  475. package/dist/shared/useForwardExpose.js +8 -4
  476. package/dist/shared/useForwardExpose.js.map +1 -1
  477. package/dist/shared/useId.cjs +7 -4
  478. package/dist/shared/useId.cjs.map +1 -1
  479. package/dist/shared/useId.js +7 -4
  480. package/dist/shared/useId.js.map +1 -1
  481. package/dist/utils/storage.cjs +7 -1
  482. package/dist/utils/storage.cjs.map +1 -1
  483. package/dist/utils/storage.js +7 -1
  484. package/dist/utils/storage.js.map +1 -1
  485. package/dist/utils/units.cjs +101 -0
  486. package/dist/utils/units.cjs.map +1 -0
  487. package/dist/utils/units.js +83 -0
  488. package/dist/utils/units.js.map +1 -0
  489. package/package.json +21 -13
  490. package/src/Autocomplete/AutocompleteInput.vue +112 -0
  491. package/src/Autocomplete/AutocompleteRoot.vue +272 -0
  492. package/src/Autocomplete/index.ts +72 -0
  493. package/src/Calendar/CalendarCellTrigger.vue +10 -2
  494. package/src/Calendar/CalendarNext.vue +8 -2
  495. package/src/Calendar/CalendarPrev.vue +8 -2
  496. package/src/Calendar/CalendarRoot.vue +20 -8
  497. package/src/Calendar/useCalendar.ts +43 -3
  498. package/src/Checkbox/CheckboxRoot.vue +32 -13
  499. package/src/ColorArea/ColorAreaArea.vue +145 -0
  500. package/src/ColorArea/ColorAreaRoot.vue +255 -0
  501. package/src/ColorArea/ColorAreaThumb.vue +75 -0
  502. package/src/ColorArea/index.ts +14 -0
  503. package/src/ColorArea/utils.ts +24 -0
  504. package/src/ColorField/ColorFieldInput.vue +133 -0
  505. package/src/ColorField/ColorFieldRoot.vue +326 -0
  506. package/src/ColorField/index.ts +10 -0
  507. package/src/ColorSlider/ColorSliderRoot.vue +224 -0
  508. package/src/ColorSlider/ColorSliderThumb.vue +54 -0
  509. package/src/ColorSlider/ColorSliderTrack.vue +36 -0
  510. package/src/ColorSlider/index.ts +14 -0
  511. package/src/ColorSlider/utils.ts +39 -0
  512. package/src/ColorSwatch/ColorSwatch.vue +97 -0
  513. package/src/ColorSwatch/index.ts +4 -0
  514. package/src/ColorSwatchPicker/ColorSwatchPickerItem.vue +60 -0
  515. package/src/ColorSwatchPicker/ColorSwatchPickerItemIndicator.vue +17 -0
  516. package/src/ColorSwatchPicker/ColorSwatchPickerItemSwatch.vue +21 -0
  517. package/src/ColorSwatchPicker/ColorSwatchPickerRoot.vue +50 -0
  518. package/src/ColorSwatchPicker/index.ts +17 -0
  519. package/src/Combobox/ComboboxContentImpl.vue +14 -1
  520. package/src/DateField/DateFieldRoot.vue +1 -1
  521. package/src/DatePicker/DatePickerRoot.vue +4 -4
  522. package/src/DateRangeField/DateRangeFieldRoot.vue +11 -4
  523. package/src/DateRangePicker/DateRangePickerRoot.vue +5 -5
  524. package/src/DismissableLayer/utils.ts +1 -2
  525. package/src/DropdownMenu/DropdownMenuFilter.vue +119 -0
  526. package/src/DropdownMenu/index.ts +5 -0
  527. package/src/Menu/MenuContentImpl.vue +68 -2
  528. package/src/Menu/MenuItemImpl.vue +11 -6
  529. package/src/Menu/MenuSubContent.vue +14 -3
  530. package/src/Menu/MenuSubTrigger.vue +13 -1
  531. package/src/MonthPicker/MonthPickerCell.vue +30 -0
  532. package/src/MonthPicker/MonthPickerCellTrigger.vue +214 -0
  533. package/src/MonthPicker/MonthPickerGrid.vue +32 -0
  534. package/src/MonthPicker/MonthPickerGridBody.vue +17 -0
  535. package/src/MonthPicker/MonthPickerGridRow.vue +20 -0
  536. package/src/MonthPicker/MonthPickerHeader.vue +17 -0
  537. package/src/MonthPicker/MonthPickerHeading.vue +35 -0
  538. package/src/MonthPicker/MonthPickerNext.vue +52 -0
  539. package/src/MonthPicker/MonthPickerPrev.vue +52 -0
  540. package/src/MonthPicker/MonthPickerRoot.vue +311 -0
  541. package/src/MonthPicker/index.ts +42 -0
  542. package/src/MonthPicker/useMonthPicker.ts +193 -0
  543. package/src/MonthRangePicker/MonthRangePickerCell.vue +30 -0
  544. package/src/MonthRangePicker/MonthRangePickerCellTrigger.vue +309 -0
  545. package/src/MonthRangePicker/MonthRangePickerGrid.vue +32 -0
  546. package/src/MonthRangePicker/MonthRangePickerGridBody.vue +17 -0
  547. package/src/MonthRangePicker/MonthRangePickerGridRow.vue +20 -0
  548. package/src/MonthRangePicker/MonthRangePickerHeader.vue +17 -0
  549. package/src/MonthRangePicker/MonthRangePickerHeading.vue +35 -0
  550. package/src/MonthRangePicker/MonthRangePickerNext.vue +52 -0
  551. package/src/MonthRangePicker/MonthRangePickerPrev.vue +52 -0
  552. package/src/MonthRangePicker/MonthRangePickerRoot.vue +391 -0
  553. package/src/MonthRangePicker/index.ts +42 -0
  554. package/src/MonthRangePicker/useRangeMonthPicker.ts +165 -0
  555. package/src/NumberField/NumberFieldRoot.vue +2 -1
  556. package/src/Progress/ProgressRoot.vue +3 -1
  557. package/src/RadioGroup/RadioGroupRoot.vue +1 -1
  558. package/src/RangeCalendar/RangeCalendarCellTrigger.vue +13 -3
  559. package/src/RangeCalendar/RangeCalendarGrid.vue +1 -0
  560. package/src/RangeCalendar/RangeCalendarNext.vue +10 -4
  561. package/src/RangeCalendar/RangeCalendarPrev.vue +10 -4
  562. package/src/RangeCalendar/RangeCalendarRoot.vue +48 -32
  563. package/src/RangeCalendar/useRangeCalendar.ts +41 -16
  564. package/src/Splitter/SplitterGroup.vue +218 -49
  565. package/src/Splitter/SplitterPanel.vue +11 -6
  566. package/src/Splitter/utils/composables/useWindowSplitterPanelGroupBehavior.ts +16 -6
  567. package/src/Splitter/utils/storage.ts +14 -0
  568. package/src/Splitter/utils/units.ts +161 -0
  569. package/src/Splitter/utils/validation.ts +3 -2
  570. package/src/Switch/SwitchRoot.vue +36 -19
  571. package/src/Switch/SwitchThumb.vue +1 -1
  572. package/src/TimeField/TimeFieldRoot.vue +0 -3
  573. package/src/TimeRangeField/TimeRangeFieldInput.vue +74 -0
  574. package/src/TimeRangeField/TimeRangeFieldRoot.vue +473 -0
  575. package/src/TimeRangeField/index.ts +2 -0
  576. package/src/Toast/ToastAnnounce.vue +4 -1
  577. package/src/Tooltip/TooltipContent.vue +1 -3
  578. package/src/Tooltip/TooltipContentImpl.vue +18 -10
  579. package/src/Tooltip/TooltipProvider.vue +8 -1
  580. package/src/YearPicker/YearPickerCell.vue +30 -0
  581. package/src/YearPicker/YearPickerCellTrigger.vue +218 -0
  582. package/src/YearPicker/YearPickerGrid.vue +32 -0
  583. package/src/YearPicker/YearPickerGridBody.vue +17 -0
  584. package/src/YearPicker/YearPickerGridRow.vue +20 -0
  585. package/src/YearPicker/YearPickerHeader.vue +17 -0
  586. package/src/YearPicker/YearPickerHeading.vue +35 -0
  587. package/src/YearPicker/YearPickerNext.vue +52 -0
  588. package/src/YearPicker/YearPickerPrev.vue +52 -0
  589. package/src/YearPicker/YearPickerRoot.vue +314 -0
  590. package/src/YearPicker/index.ts +42 -0
  591. package/src/YearPicker/useYearPicker.ts +202 -0
  592. package/src/YearRangePicker/YearRangePickerCell.vue +30 -0
  593. package/src/YearRangePicker/YearRangePickerCellTrigger.vue +311 -0
  594. package/src/YearRangePicker/YearRangePickerGrid.vue +32 -0
  595. package/src/YearRangePicker/YearRangePickerGridBody.vue +17 -0
  596. package/src/YearRangePicker/YearRangePickerGridRow.vue +20 -0
  597. package/src/YearRangePicker/YearRangePickerHeader.vue +17 -0
  598. package/src/YearRangePicker/YearRangePickerHeading.vue +35 -0
  599. package/src/YearRangePicker/YearRangePickerNext.vue +52 -0
  600. package/src/YearRangePicker/YearRangePickerPrev.vue +52 -0
  601. package/src/YearRangePicker/YearRangePickerRoot.vue +391 -0
  602. package/src/YearRangePicker/index.ts +42 -0
  603. package/src/YearRangePicker/useRangeYearPicker.ts +165 -0
  604. package/src/date/calendar.ts +71 -18
  605. package/src/date/comparators.ts +97 -0
  606. package/src/index.ts +41 -0
  607. package/src/internal.ts +7 -0
  608. package/src/shared/color/channel.ts +424 -0
  609. package/src/shared/color/convert.ts +293 -0
  610. package/src/shared/color/gradient.ts +347 -0
  611. package/src/shared/color/index.ts +35 -0
  612. package/src/shared/color/parse.ts +140 -0
  613. package/src/shared/color/types.ts +40 -0
  614. package/src/shared/color/utils.ts +143 -0
  615. package/src/shared/date/types.ts +6 -0
  616. package/src/shared/date/useDateField.ts +40 -40
  617. package/src/shared/macro.ts +11 -0
  618. package/src/shared/useArrowNavigation.ts +8 -2
  619. package/src/shared/useForwardExpose.ts +21 -6
  620. package/src/shared/useId.ts +6 -7
  621. package/dist/index.d.cts.map +0 -1
  622. package/dist/index.d.ts.map +0 -1
@@ -0,0 +1,347 @@
1
+ import type { Color, ColorChannel, ColorSpace, RGBColor } from './types'
2
+ import { colorToString, convertToHsb, convertToHsl, convertToRgb } from './convert'
3
+
4
+ /**
5
+ * Generates a CSS gradient for a color slider track.
6
+ */
7
+ export function getSliderGradient(
8
+ color: Color,
9
+ channel: ColorChannel,
10
+ colorSpace: ColorSpace = color.space as ColorSpace,
11
+ ): string {
12
+ const hsl = convertToHsl(color)
13
+ const hsb = convertToHsb(color)
14
+
15
+ switch (channel) {
16
+ case 'hue':
17
+ return getHueGradient()
18
+ case 'saturation':
19
+ return getSaturationGradient(hsl, colorSpace)
20
+ case 'lightness':
21
+ return getLightnessGradient(hsl)
22
+ case 'brightness':
23
+ return getBrightnessGradient(hsb)
24
+ case 'red':
25
+ return getRedGradient(color)
26
+ case 'green':
27
+ return getGreenGradient(color)
28
+ case 'blue':
29
+ return getBlueGradient(color)
30
+ case 'alpha':
31
+ return getAlphaGradient(color)
32
+ default:
33
+ return ''
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Generates a CSS gradient for a color area (2D picker).
39
+ */
40
+ export function getAreaGradient(
41
+ color: Color,
42
+ xChannel: ColorChannel,
43
+ yChannel: ColorChannel,
44
+ colorSpace: ColorSpace = color.space as ColorSpace,
45
+ ): { background: string, gradientX: string, gradientY: string } {
46
+ const hsl = convertToHsl(color)
47
+ const hsb = convertToHsb(color)
48
+
49
+ // Determine which gradient layers to apply based on channels
50
+ const gradientX = getChannelGradientForArea(color, xChannel, colorSpace, 'x')
51
+ const gradientY = getChannelGradientForArea(color, yChannel, colorSpace, 'y')
52
+
53
+ // Background is the color with both channels at max
54
+ const bgColor = getAreaBackgroundColor(color, xChannel, yChannel, colorSpace)
55
+
56
+ return {
57
+ background: bgColor,
58
+ gradientX,
59
+ gradientY,
60
+ }
61
+ }
62
+
63
+ function getHueGradient(): string {
64
+ return 'linear-gradient(to right, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000)'
65
+ }
66
+
67
+ function getSaturationGradient(hsl: { h: number, s: number, l: number, alpha: number }, colorSpace: ColorSpace): string {
68
+ const start = colorToString({ space: 'hsl', h: hsl.h, s: 0, l: colorSpace === 'hsl' ? hsl.l : 50, alpha: 1 }, 'hsl')
69
+ const end = colorToString({ space: 'hsl', h: hsl.h, s: 100, l: colorSpace === 'hsl' ? hsl.l : 50, alpha: 1 }, 'hsl')
70
+ return `linear-gradient(to right, ${start}, ${end})`
71
+ }
72
+
73
+ function getLightnessGradient(hsl: { h: number, s: number, l: number, alpha: number }): string {
74
+ const start = colorToString({ space: 'hsl', h: hsl.h, s: hsl.s, l: 0, alpha: 1 }, 'hsl')
75
+ const mid = colorToString({ space: 'hsl', h: hsl.h, s: hsl.s, l: 50, alpha: 1 }, 'hsl')
76
+ const end = colorToString({ space: 'hsl', h: hsl.h, s: hsl.s, l: 100, alpha: 1 }, 'hsl')
77
+ return `linear-gradient(to right, ${start}, ${mid}, ${end})`
78
+ }
79
+
80
+ function getBrightnessGradient(hsb: { h: number, s: number, b: number, alpha: number }): string {
81
+ const start = colorToString({ space: 'hsb', h: hsb.h, s: hsb.s, b: 0, alpha: 1 }, 'rgb')
82
+ const end = colorToString({ space: 'hsb', h: hsb.h, s: hsb.s, b: 100, alpha: 1 }, 'rgb')
83
+ return `linear-gradient(to right, ${start}, ${end})`
84
+ }
85
+
86
+ function getRedGradient(color: Color): string {
87
+ const { g, b, alpha } = color.space === 'rgb' ? color : { g: 128, b: 128, alpha: 1 }
88
+ const start = colorToString({ space: 'rgb', r: 0, g, b, alpha: 1 }, 'rgb')
89
+ const end = colorToString({ space: 'rgb', r: 255, g, b, alpha: 1 }, 'rgb')
90
+ return `linear-gradient(to right, ${start}, ${end})`
91
+ }
92
+
93
+ function getGreenGradient(color: Color): string {
94
+ const { r, b, alpha } = color.space === 'rgb' ? color : { r: 128, b: 128, alpha: 1 }
95
+ const start = colorToString({ space: 'rgb', r, g: 0, b, alpha: 1 }, 'rgb')
96
+ const end = colorToString({ space: 'rgb', r, g: 255, b, alpha: 1 }, 'rgb')
97
+ return `linear-gradient(to right, ${start}, ${end})`
98
+ }
99
+
100
+ function getBlueGradient(color: Color): string {
101
+ const { r, g, alpha } = color.space === 'rgb' ? color : { r: 128, g: 128, alpha: 1 }
102
+ const start = colorToString({ space: 'rgb', r, g, b: 0, alpha: 1 }, 'rgb')
103
+ const end = colorToString({ space: 'rgb', r, g, b: 255, alpha: 1 }, 'rgb')
104
+ return `linear-gradient(to right, ${start}, ${end})`
105
+ }
106
+
107
+ // Checkerboard pattern used behind alpha gradients to visualize transparency
108
+ const CHECKERBOARD_LAYERS = [
109
+ 'linear-gradient(45deg, #ccc 25%, transparent 25%)',
110
+ 'linear-gradient(-45deg, #ccc 25%, transparent 25%)',
111
+ 'linear-gradient(45deg, transparent 75%, #ccc 75%)',
112
+ 'linear-gradient(-45deg, transparent 75%, #ccc 75%)',
113
+ ].join(', ')
114
+
115
+ function getAlphaGradient(color: Color): string {
116
+ const { r, g, b } = color.space === 'rgb' ? color : convertToRgb(color)
117
+ const solidRgb = `rgb(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)})`
118
+ return `linear-gradient(to right, transparent, ${solidRgb}), ${CHECKERBOARD_LAYERS}`
119
+ }
120
+
121
+ function getChannelGradientForArea(
122
+ color: Color,
123
+ channel: ColorChannel,
124
+ colorSpace: ColorSpace,
125
+ axis: 'x' | 'y',
126
+ ): string {
127
+ const direction = axis === 'x' ? 'to right' : 'to top'
128
+ const hsl = convertToHsl(color)
129
+ const hsb = convertToHsb(color)
130
+
131
+ switch (channel) {
132
+ case 'saturation': {
133
+ if (colorSpace === 'hsb') {
134
+ // For HSB: White to transparent (overlay on pure hue)
135
+ // Left side (0% sat) = white, Right side (100% sat) = transparent (shows pure hue)
136
+ return `linear-gradient(${direction}, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0))`
137
+ }
138
+ // For HSL: White to full color
139
+ const fullColor = colorToString({ space: 'hsl', h: hsl.h, s: 100, l: 50, alpha: 1 }, 'rgb')
140
+ return `linear-gradient(${direction}, #ffffff, ${fullColor})`
141
+ }
142
+ case 'lightness': {
143
+ // White -> color -> black
144
+ const mid = colorToString({ space: 'hsl', h: hsl.h, s: hsl.s, l: 50, alpha: 1 }, 'rgb')
145
+ return `linear-gradient(${direction}, #000000, ${mid}, #ffffff)`
146
+ }
147
+ case 'brightness': {
148
+ // For HSB: Transparent to black (overlay on pure hue)
149
+ // Top (100% brightness) = transparent (shows pure hue), Bottom (0% brightness) = black
150
+ return `linear-gradient(${direction}, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1))`
151
+ }
152
+ default:
153
+ return ''
154
+ }
155
+ }
156
+
157
+ function getAreaBackgroundColor(
158
+ color: Color,
159
+ xChannel: ColorChannel,
160
+ yChannel: ColorChannel,
161
+ colorSpace: ColorSpace,
162
+ ): string {
163
+ const hsl = convertToHsl(color)
164
+ const hsb = convertToHsb(color)
165
+
166
+ // For HSL saturation/lightness area, show pure hue
167
+ if (colorSpace === 'hsl' && xChannel === 'saturation' && yChannel === 'lightness') {
168
+ return colorToString({ space: 'hsl', h: hsl.h, s: 100, l: 50, alpha: 1 }, 'rgb')
169
+ }
170
+
171
+ // For HSB saturation/brightness area, show pure hue
172
+ if (colorSpace === 'hsb' && xChannel === 'saturation' && yChannel === 'brightness') {
173
+ return colorToString({ space: 'hsb', h: hsb.h, s: 100, b: 100, alpha: 1 }, 'rgb')
174
+ }
175
+
176
+ // Default to white
177
+ return '#ffffff'
178
+ }
179
+
180
+ /**
181
+ * Gets the CSS background style for a color area.
182
+ */
183
+ export function getAreaBackgroundStyle(
184
+ color: Color,
185
+ xChannel: ColorChannel,
186
+ yChannel: ColorChannel,
187
+ colorSpace: ColorSpace = color.space as ColorSpace,
188
+ ): Record<string, string> {
189
+ const hsl = convertToHsl(color)
190
+ const hsb = convertToHsb(color)
191
+
192
+ // Hue-based color picker (Hue/Saturation, Hue/Lightness, Hue/Brightness)
193
+ // Shows full rainbow spectrum horizontally
194
+ if (xChannel === 'hue') {
195
+ // Full hue gradient as background (rainbow spectrum)
196
+ const hueGradient = 'linear-gradient(to right, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000)'
197
+
198
+ if (yChannel === 'saturation') {
199
+ // Vertical: gray at bottom (0% sat) fading to transparent at top (100% sat shows hue)
200
+ // No blend mode needed — transparent stacking is correct
201
+ const desatColor = colorToString({ space: 'hsl', h: hsl.h, s: 0, l: hsl.l, alpha: 1 }, 'rgb')
202
+ return {
203
+ backgroundImage: `linear-gradient(to bottom, transparent, ${desatColor}), ${hueGradient}`,
204
+ }
205
+ }
206
+
207
+ if (yChannel === 'lightness') {
208
+ // Vertical: black at bottom (L=0) → transparent at middle (L=50, shows hue) → white at top (L=100)
209
+ return {
210
+ backgroundImage: `linear-gradient(to top, #000000, transparent, #ffffff), ${hueGradient}`,
211
+ }
212
+ }
213
+
214
+ if (yChannel === 'brightness') {
215
+ // Vertical: black at bottom (B=0) → transparent at top (B=100, shows hue)
216
+ return {
217
+ backgroundImage: `linear-gradient(to top, #000000, transparent), ${hueGradient}`,
218
+ }
219
+ }
220
+ }
221
+
222
+ // Classic color picker gradients for saturation-based pickers
223
+ if (xChannel === 'saturation' && (yChannel === 'lightness' || yChannel === 'brightness')) {
224
+ if (colorSpace === 'hsl') {
225
+ // HSL: Base is pure hue at 50% lightness
226
+ // Saturation x-axis: gray (S=0) at left fading to transparent (shows pure hue at S=100)
227
+ // Lightness y-axis: black at bottom (L=0), transparent at middle (L=50), white at top (L=100)
228
+ const hueColor = colorToString({ space: 'hsl', h: hsl.h, s: 100, l: 50, alpha: 1 }, 'rgb')
229
+ const grayColor = colorToString({ space: 'hsl', h: hsl.h, s: 0, l: 50, alpha: 1 }, 'rgb')
230
+ const satGradient = `linear-gradient(to right, ${grayColor}, transparent)`
231
+ const lightGradient = `linear-gradient(to top, #000000, transparent, #ffffff)`
232
+
233
+ return {
234
+ backgroundColor: hueColor,
235
+ backgroundImage: `${lightGradient}, ${satGradient}`,
236
+ }
237
+ }
238
+
239
+ if (colorSpace === 'hsb') {
240
+ // HSB: Base is pure hue (full sat, full brightness)
241
+ // Top edge: white (0% sat) → pure hue (100% sat)
242
+ // Bottom edge: always black (0% brightness)
243
+ const hueColor = colorToString({ space: 'hsb', h: hsb.h, s: 100, b: 100, alpha: 1 }, 'rgb')
244
+ // White to transparent (left to right)
245
+ const satGradient = `linear-gradient(to right, #ffffff, transparent)`
246
+ // Black gradient from bottom up
247
+ const brightGradient = `linear-gradient(to top, #000000, transparent)`
248
+
249
+ return {
250
+ backgroundColor: hueColor,
251
+ backgroundImage: `${brightGradient}, ${satGradient}`,
252
+ }
253
+ }
254
+ }
255
+
256
+ // RGB color picker (Red/Green, Red/Blue, Green/Blue)
257
+ // Uses screen blend mode to combine gradients additively (like React Spectrum)
258
+ // Formula: 1 - (1 - a) * (1 - b), effectively adds RGB values
259
+ if (colorSpace === 'rgb'
260
+ && (xChannel === 'red' || xChannel === 'green' || xChannel === 'blue')
261
+ && (yChannel === 'red' || yChannel === 'green' || yChannel === 'blue')) {
262
+ const rgb = convertToRgb(color)
263
+
264
+ // Get the constant channel (z-channel - the one NOT x or y)
265
+ const allChannels = ['red', 'green', 'blue'] as const
266
+ const varyingChannels = [xChannel, yChannel]
267
+ const constantChannel = allChannels.find(c => !varyingChannels.includes(c))!
268
+ const constantValue = rgb[constantChannel === 'red' ? 'r' : constantChannel === 'green' ? 'g' : 'b']
269
+
270
+ // Create the three layers for screen blend mode:
271
+ // 1. X gradient: black to full-X-color
272
+ // 2. Y gradient: black to full-Y-color
273
+ // 3. Background: black with Z channel set
274
+
275
+ // X gradient: black (0,0,0) → full X (255,0,0) for red, etc.
276
+ const xColorStart: RGBColor = { space: 'rgb', r: 0, g: 0, b: 0, alpha: 1 }
277
+ const xColorEnd: RGBColor = {
278
+ space: 'rgb',
279
+ r: xChannel === 'red' ? 255 : 0,
280
+ g: xChannel === 'green' ? 255 : 0,
281
+ b: xChannel === 'blue' ? 255 : 0,
282
+ alpha: 1,
283
+ }
284
+ const xGradient = `linear-gradient(to right, ${colorToString(xColorStart, 'rgb')}, ${colorToString(xColorEnd, 'rgb')})`
285
+
286
+ // Y gradient: black (0,0,0) → full Y (0,255,0) for green, etc.
287
+ const yColorEnd: RGBColor = {
288
+ space: 'rgb',
289
+ r: yChannel === 'red' ? 255 : 0,
290
+ g: yChannel === 'green' ? 255 : 0,
291
+ b: yChannel === 'blue' ? 255 : 0,
292
+ alpha: 1,
293
+ }
294
+ const yGradient = `linear-gradient(to top, ${colorToString(xColorStart, 'rgb')}, ${colorToString(yColorEnd, 'rgb')})`
295
+
296
+ // Background: black with constant Z channel value
297
+ const bgColor: RGBColor = {
298
+ space: 'rgb',
299
+ r: constantChannel === 'red' ? constantValue : 0,
300
+ g: constantChannel === 'green' ? constantValue : 0,
301
+ b: constantChannel === 'blue' ? constantValue : 0,
302
+ alpha: 1,
303
+ }
304
+
305
+ return {
306
+ backgroundColor: colorToString(bgColor, 'rgb'),
307
+ backgroundImage: `${yGradient}, ${xGradient}`,
308
+ backgroundBlendMode: 'screen',
309
+ }
310
+ }
311
+
312
+ // Fallback for other combinations
313
+ const { background, gradientX, gradientY } = getAreaGradient(color, xChannel, yChannel, colorSpace)
314
+ const gradients: string[] = []
315
+ if (gradientY)
316
+ gradients.push(gradientY)
317
+ if (gradientX)
318
+ gradients.push(gradientX)
319
+
320
+ return {
321
+ backgroundColor: background,
322
+ backgroundImage: gradients.join(', '),
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Gets the CSS background for a slider track.
328
+ */
329
+ export function getSliderBackgroundStyle(
330
+ color: Color,
331
+ channel: ColorChannel,
332
+ colorSpace: ColorSpace = color.space as ColorSpace,
333
+ ): Record<string, string> {
334
+ const gradient = getSliderGradient(color, channel, colorSpace)
335
+
336
+ if (channel === 'alpha') {
337
+ return {
338
+ background: gradient,
339
+ backgroundSize: '100% 100%, 8px 8px, 8px 8px, 8px 8px, 8px 8px',
340
+ backgroundPosition: '0 0, 0 0, 0 4px, 4px -4px, -4px 0px',
341
+ }
342
+ }
343
+
344
+ return {
345
+ background: gradient,
346
+ }
347
+ }
@@ -0,0 +1,35 @@
1
+ // Channel operations
2
+ export { getChannelName, getChannelRange, getChannelValue, setChannelValue, setChannelValues } from './channel'
3
+
4
+ // Conversion
5
+ export {
6
+ colorToHex,
7
+ colorToHsb,
8
+ colorToHsl,
9
+ colorToRgb,
10
+ colorToString,
11
+ convertToHsb,
12
+ convertToHsl,
13
+ convertToRgb,
14
+ } from './convert'
15
+
16
+ // Gradients
17
+ export { getAreaBackgroundStyle, getAreaGradient, getSliderBackgroundStyle, getSliderGradient } from './gradient'
18
+
19
+ // Parsing
20
+ export { isValidColor, normalizeColor, parseColor } from './parse'
21
+
22
+ // Types
23
+ export type {
24
+ ChannelRange,
25
+ Color,
26
+ ColorChannel,
27
+ ColorFormat,
28
+ ColorSpace,
29
+ HSBColor,
30
+ HSLColor,
31
+ RGBColor,
32
+ } from './types'
33
+
34
+ // Legacy utilities (keeping for backwards compatibility)
35
+ export { getColorContrast, getColorName, hexToHSL, hexToRGB } from './utils'
@@ -0,0 +1,140 @@
1
+ import type { Color, HSBColor, HSLColor, RGBColor } from './types'
2
+
3
+ /**
4
+ * Parses a color string into a Color object.
5
+ * Supports hex (#rrggbb, #rgb), rgb(), hsl(), and hsb()/hsv() formats.
6
+ */
7
+ export function parseColor(value: string): Color {
8
+ const trimmed = value.trim().toLowerCase()
9
+
10
+ // Hex format
11
+ if (trimmed.startsWith('#')) {
12
+ return parseHex(trimmed)
13
+ }
14
+
15
+ // rgb() format
16
+ if (trimmed.startsWith('rgb')) {
17
+ return parseRgb(trimmed)
18
+ }
19
+
20
+ // hsl() format
21
+ if (trimmed.startsWith('hsl')) {
22
+ return parseHsl(trimmed)
23
+ }
24
+
25
+ // hsb() or hsv() format
26
+ if (trimmed.startsWith('hsb') || trimmed.startsWith('hsv')) {
27
+ return parseHsb(trimmed)
28
+ }
29
+
30
+ throw new Error(`Unable to parse color: ${value}`)
31
+ }
32
+
33
+ function parseHex(hex: string): RGBColor {
34
+ let normalized = hex.slice(1)
35
+
36
+ // Validate hex format (3, 6, or 8 hex digits)
37
+ if (!/^[0-9A-F]{3}$/i.test(normalized) && !/^[0-9A-F]{6}$/i.test(normalized) && !/^[0-9A-F]{8}$/i.test(normalized)) {
38
+ throw new Error(`Invalid hex color: ${hex}. Expected format: #RGB, #RRGGBB, or #RRGGBBAA`)
39
+ }
40
+
41
+ // Expand shorthand (e.g., #f00 -> #ff0000)
42
+ if (normalized.length === 3) {
43
+ normalized = normalized.split('').map(c => c + c).join('')
44
+ }
45
+
46
+ // Handle 6-digit hex
47
+ if (normalized.length === 6) {
48
+ const bigint = parseInt(normalized, 16)
49
+ return {
50
+ space: 'rgb',
51
+ r: (bigint >> 16) & 255,
52
+ g: (bigint >> 8) & 255,
53
+ b: bigint & 255,
54
+ alpha: 1,
55
+ }
56
+ }
57
+
58
+ // Handle 8-digit hex (with alpha)
59
+ if (normalized.length === 8) {
60
+ const bigint = parseInt(normalized, 16)
61
+ return {
62
+ space: 'rgb',
63
+ r: (bigint >> 24) & 255,
64
+ g: (bigint >> 16) & 255,
65
+ b: (bigint >> 8) & 255,
66
+ alpha: (bigint & 255) / 255,
67
+ }
68
+ }
69
+
70
+ throw new Error(`Invalid hex color: ${hex}`)
71
+ }
72
+
73
+ function parseRgb(rgb: string): RGBColor {
74
+ const match = rgb.match(/rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)/)
75
+ if (!match) {
76
+ throw new Error(`Invalid RGB color: ${rgb}`)
77
+ }
78
+
79
+ return {
80
+ space: 'rgb',
81
+ r: parseFloat(match[1]),
82
+ g: parseFloat(match[2]),
83
+ b: parseFloat(match[3]),
84
+ alpha: match[4] ? parseFloat(match[4]) : 1,
85
+ }
86
+ }
87
+
88
+ function parseHsl(hsl: string): HSLColor {
89
+ const match = hsl.match(/hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%\s*(?:,\s*([\d.]+)\s*)?\)/)
90
+ if (!match) {
91
+ throw new Error(`Invalid HSL color: ${hsl}`)
92
+ }
93
+
94
+ return {
95
+ space: 'hsl',
96
+ h: parseFloat(match[1]),
97
+ s: parseFloat(match[2]),
98
+ l: parseFloat(match[3]),
99
+ alpha: match[4] ? parseFloat(match[4]) : 1,
100
+ }
101
+ }
102
+
103
+ function parseHsb(hsb: string): HSBColor {
104
+ const match = hsb.match(/hsb[av]?\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*(?:,\s*([\d.]+)\s*)?\)/)
105
+ if (!match) {
106
+ throw new Error(`Invalid HSB color: ${hsb}`)
107
+ }
108
+
109
+ return {
110
+ space: 'hsb',
111
+ h: parseFloat(match[1]),
112
+ s: parseFloat(match[2]),
113
+ b: parseFloat(match[3]),
114
+ alpha: match[4] ? parseFloat(match[4]) : 1,
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Normalizes a value to a Color object.
120
+ * If already a Color, returns it. If a string, parses it.
121
+ */
122
+ export function normalizeColor(value: string | Color): Color {
123
+ if (typeof value === 'string') {
124
+ return parseColor(value)
125
+ }
126
+ return value
127
+ }
128
+
129
+ /**
130
+ * Checks if a string is a valid color.
131
+ */
132
+ export function isValidColor(value: string): boolean {
133
+ try {
134
+ parseColor(value)
135
+ return true
136
+ }
137
+ catch {
138
+ return false
139
+ }
140
+ }
@@ -0,0 +1,40 @@
1
+ export type ColorSpace = 'rgb' | 'hsl' | 'hsb'
2
+
3
+ export interface RGBColor {
4
+ space: 'rgb'
5
+ r: number
6
+ g: number
7
+ b: number
8
+ alpha: number
9
+ }
10
+
11
+ export interface HSLColor {
12
+ space: 'hsl'
13
+ h: number
14
+ s: number
15
+ l: number
16
+ alpha: number
17
+ }
18
+
19
+ export interface HSBColor {
20
+ space: 'hsb'
21
+ h: number
22
+ s: number
23
+ b: number
24
+ alpha: number
25
+ }
26
+
27
+ export type Color = RGBColor | HSLColor | HSBColor
28
+
29
+ export type RGBChannel = 'red' | 'green' | 'blue' | 'alpha'
30
+ export type HSLChannel = 'hue' | 'saturation' | 'lightness' | 'alpha'
31
+ export type HSBChannel = 'hue' | 'saturation' | 'brightness' | 'alpha'
32
+ export type ColorChannel = RGBChannel | HSLChannel | HSBChannel
33
+
34
+ export interface ChannelRange {
35
+ min: number
36
+ max: number
37
+ step: number
38
+ }
39
+
40
+ export type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'hsb'
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Converts a hex color string to RGB (Red, Green, Blue).
3
+ * @param hex Hex color string (e.g., "#ff5733" or "#f53")
4
+ * @returns An object containing red, green, and blue values (0-255).
5
+ */
6
+ export function hexToRGB(hex: string): { r: number, g: number, b: number } {
7
+ hex = hex.replace(/^#/, '')
8
+
9
+ // Validate hex format (3 or 6 hex digits)
10
+ if (!/^[0-9A-F]{6}$/i.test(hex) && !/^[0-9A-F]{3}$/i.test(hex)) {
11
+ throw new Error(`Invalid hex color: ${hex}. Expected format: #RGB or #RRGGBB`)
12
+ }
13
+
14
+ // Handle shorthand hex (e.g., "#FFF" -> "#FFFFFF")
15
+ if (hex.length === 3) {
16
+ hex = hex.split('').map(c => c + c).join('')
17
+ }
18
+
19
+ const bigint = parseInt(hex, 16)
20
+ const r = (bigint >> 16) & 255
21
+ const g = (bigint >> 8) & 255
22
+ const b = bigint & 255
23
+ return { r, g, b }
24
+ }
25
+
26
+ /**
27
+ * Converts a hex color string to HSL (Hue, Saturation, Lightness).
28
+ * @param hex Hex color string (e.g., "#ff5733")
29
+ * @returns An object containing hue (0-360), saturation (0-100), and lightness (0-100) values.
30
+ */
31
+ export function hexToHSL(hex: string): { h: number, s: number, l: number } {
32
+ let { r, g, b } = hexToRGB(hex)
33
+
34
+ r /= 255
35
+ g /= 255
36
+ b /= 255
37
+
38
+ const max = Math.max(r, g, b)
39
+ const min = Math.min(r, g, b)
40
+ let h: number
41
+ let s: number
42
+ let l: number = (max + min) / 2
43
+
44
+ if (max === min) {
45
+ h = s = 0 // achromatic
46
+ l *= 100 // Scale l to 0-100 for consistency with chromatic case
47
+ }
48
+ else {
49
+ const d = max - min
50
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
51
+ if (max === r) {
52
+ h = (g - b) / d + (g < b ? 6 : 0)
53
+ }
54
+ else if (max === g) {
55
+ h = (b - r) / d + 2
56
+ }
57
+ else {
58
+ h = (r - g) / d + 4
59
+ }
60
+ h /= 6
61
+ h *= 360
62
+ s *= 100
63
+ l *= 100
64
+ }
65
+
66
+ return { h, s, l }
67
+ }
68
+
69
+ /**
70
+ * Converts a hex color string to a human-readable color name.
71
+ * @param hex Hex color string (e.g., "#ff5733")
72
+ * @returns A human-readable color name based on the hue, saturation, and lightness.
73
+ */
74
+ export function getColorName(hex: string) {
75
+ const { h, s, l } = hexToHSL(hex)
76
+
77
+ // Handle achromatic colors (low saturation)
78
+ // Using 0-100 scale for all comparisons
79
+ if (s < 10) {
80
+ if (l < 10)
81
+ return 'black'
82
+ if (l > 95)
83
+ return 'white'
84
+ if (l < 20)
85
+ return 'very dark gray'
86
+ if (l < 35)
87
+ return 'dark gray'
88
+ if (l < 65)
89
+ return 'gray'
90
+ if (l < 80)
91
+ return 'light gray'
92
+ return 'very light gray'
93
+ }
94
+
95
+ // Determine base color by hue
96
+ let baseName
97
+ if (h < 15 || h >= 345)
98
+ baseName = 'red'
99
+ else if (h < 45)
100
+ baseName = 'orange'
101
+ else if (h < 75)
102
+ baseName = 'yellow'
103
+ else if (h < 105)
104
+ baseName = 'yellow-green'
105
+ else if (h < 135)
106
+ baseName = 'green'
107
+ else if (h < 165)
108
+ baseName = 'green-cyan'
109
+ else if (h < 195)
110
+ baseName = 'cyan'
111
+ else if (h < 225)
112
+ baseName = 'blue'
113
+ else if (h < 255)
114
+ baseName = 'blue-violet'
115
+ else if (h < 285)
116
+ baseName = 'violet'
117
+ else if (h < 315)
118
+ baseName = 'magenta'
119
+ else baseName = 'red-magenta'
120
+
121
+ // Add descriptors based on saturation and lightness
122
+ // Using 0-100 scale for all comparisons
123
+ const descriptors = []
124
+ if (s > 80)
125
+ descriptors.push('vibrant')
126
+ else if (s < 30)
127
+ descriptors.push('muted')
128
+
129
+ if (l > 80)
130
+ descriptors.push('light')
131
+ else if (l < 30)
132
+ descriptors.push('dark')
133
+
134
+ return descriptors.length > 0
135
+ ? `${descriptors.join(' ')} ${baseName}`
136
+ : baseName
137
+ }
138
+
139
+ export function getColorContrast(hex: string): 'light' | 'dark' {
140
+ const { r, g, b } = hexToRGB(hex)
141
+ const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255
142
+ return luminance > 0.5 ? 'dark' : 'light'
143
+ }