@accelint/design-system 0.8.1 → 0.10.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 (329) hide show
  1. package/dist/components/aria/index.d.ts +32 -3
  2. package/dist/components/aria/index.js +36 -1
  3. package/dist/components/aria/index.js.map +1 -1
  4. package/dist/components/button/button.css.js.map +1 -1
  5. package/dist/components/button/index.d.ts +45 -6
  6. package/dist/components/button/index.js +105 -3
  7. package/dist/components/button/index.js.map +1 -1
  8. package/dist/components/checkbox/checkbox.css.js.map +1 -1
  9. package/dist/components/checkbox/index.d.ts +28 -7
  10. package/dist/components/checkbox/index.js +124 -3
  11. package/dist/components/checkbox/index.js.map +1 -1
  12. package/dist/components/chip/chip.css.js.map +1 -1
  13. package/dist/components/chip/index.d.ts +36 -6
  14. package/dist/components/chip/index.js +171 -3
  15. package/dist/components/chip/index.js.map +1 -1
  16. package/dist/components/collection/index.d.ts +16 -5
  17. package/dist/components/collection/index.js +19 -1
  18. package/dist/components/collection/index.js.map +1 -1
  19. package/dist/components/combo-box/combo-box.css.js.map +1 -1
  20. package/dist/components/combo-box/index.d.ts +13 -5
  21. package/dist/components/combo-box/index.js +116 -3
  22. package/dist/components/combo-box/index.js.map +1 -1
  23. package/dist/components/date-field/date-field.css.js.map +1 -1
  24. package/dist/components/date-field/index.d.ts +13 -5
  25. package/dist/components/date-field/index.js +106 -2
  26. package/dist/components/date-field/index.js.map +1 -1
  27. package/dist/components/date-input/date-input.css.js.map +1 -1
  28. package/dist/components/date-input/index.d.ts +19 -7
  29. package/dist/components/date-input/index.js +144 -2
  30. package/dist/components/date-input/index.js.map +1 -1
  31. package/dist/components/dialog/dialog.css.js.map +1 -1
  32. package/dist/components/dialog/index.d.ts +24 -6
  33. package/dist/components/dialog/index.js +187 -3
  34. package/dist/components/dialog/index.js.map +1 -1
  35. package/dist/components/dialog/types.d.ts +1 -1
  36. package/dist/components/drawer/drawer.css.js.map +1 -1
  37. package/dist/components/drawer/index.d.ts +19 -7
  38. package/dist/components/drawer/index.js +306 -3
  39. package/dist/components/drawer/index.js.map +1 -1
  40. package/dist/components/element/index.d.ts +15 -4
  41. package/dist/components/element/index.js +21 -2
  42. package/dist/components/element/index.js.map +1 -1
  43. package/dist/components/element/types.d.ts +3 -3
  44. package/dist/components/group/group.css.js.map +1 -1
  45. package/dist/components/group/index.d.ts +15 -5
  46. package/dist/components/group/index.js +60 -3
  47. package/dist/components/group/index.js.map +1 -1
  48. package/dist/components/icon/icon.css.js.map +1 -1
  49. package/dist/components/icon/index.d.ts +17 -5
  50. package/dist/components/icon/index.js +39 -3
  51. package/dist/components/icon/index.js.map +1 -1
  52. package/dist/components/index.d.ts +35 -35
  53. package/dist/components/index.js +58 -28
  54. package/dist/components/input/index.d.ts +12 -5
  55. package/dist/components/input/index.js +141 -3
  56. package/dist/components/input/index.js.map +1 -1
  57. package/dist/components/input/input.css.js.map +1 -1
  58. package/dist/components/menu/index.d.ts +29 -5
  59. package/dist/components/menu/index.js +254 -3
  60. package/dist/components/menu/index.js.map +1 -1
  61. package/dist/components/menu/menu.css.js.map +1 -1
  62. package/dist/components/merge-provider/index.d.ts +18 -3
  63. package/dist/components/merge-provider/index.js +43 -2
  64. package/dist/components/merge-provider/index.js.map +1 -1
  65. package/dist/components/number-field/index.d.ts +14 -6
  66. package/dist/components/number-field/index.js +127 -2
  67. package/dist/components/number-field/index.js.map +1 -1
  68. package/dist/components/number-field/number-field.css.d.ts +1 -1
  69. package/dist/components/number-field/number-field.css.js.map +1 -1
  70. package/dist/components/number-field/types.d.ts +1 -1
  71. package/dist/components/options/index.d.ts +25 -5
  72. package/dist/components/options/index.js +255 -3
  73. package/dist/components/options/index.js.map +1 -1
  74. package/dist/components/options/options.css.js.map +1 -1
  75. package/dist/components/picker/index.d.ts +23 -5
  76. package/dist/components/picker/index.js +113 -3
  77. package/dist/components/picker/index.js.map +1 -1
  78. package/dist/components/picker/picker.css.js.map +1 -1
  79. package/dist/components/picker/picker.stories.css.js.map +1 -1
  80. package/dist/components/popover/index.d.ts +14 -6
  81. package/dist/components/popover/index.js +140 -3
  82. package/dist/components/popover/index.js.map +1 -1
  83. package/dist/components/popover/popover.css.js.map +1 -1
  84. package/dist/components/popover/types.d.ts +1 -1
  85. package/dist/components/query-builder/action-element.js.map +1 -1
  86. package/dist/components/query-builder/constants.js.map +1 -1
  87. package/dist/components/query-builder/dataset-sample.js.map +1 -1
  88. package/dist/components/query-builder/group.js +1 -1
  89. package/dist/components/query-builder/group.js.map +1 -1
  90. package/dist/components/query-builder/index.d.ts +7 -7
  91. package/dist/components/query-builder/index.js +198 -5
  92. package/dist/components/query-builder/index.js.map +1 -1
  93. package/dist/components/query-builder/query-builder.css.js.map +1 -1
  94. package/dist/components/query-builder/rule.js +1 -1
  95. package/dist/components/query-builder/rule.js.map +1 -1
  96. package/dist/components/query-builder/utils.js.map +1 -1
  97. package/dist/components/query-builder/value-editor.js.map +1 -1
  98. package/dist/components/query-builder/value-selector.js +1 -1
  99. package/dist/components/query-builder/value-selector.js.map +1 -1
  100. package/dist/components/radio/index.d.ts +22 -6
  101. package/dist/components/radio/index.js +114 -3
  102. package/dist/components/radio/index.js.map +1 -1
  103. package/dist/components/radio/radio.css.js.map +1 -1
  104. package/dist/components/search-field/index.d.ts +15 -6
  105. package/dist/components/search-field/index.js +92 -3
  106. package/dist/components/search-field/index.js.map +1 -1
  107. package/dist/components/search-field/search-field.css.js.map +1 -1
  108. package/dist/components/select/index.d.ts +13 -5
  109. package/dist/components/select/index.js +109 -3
  110. package/dist/components/select/index.js.map +1 -1
  111. package/dist/components/select/select.css.js.map +1 -1
  112. package/dist/components/slider/index.d.ts +41 -7
  113. package/dist/components/slider/index.js +235 -3
  114. package/dist/components/slider/index.js.map +1 -1
  115. package/dist/components/slider/slider.css.d.ts +1 -1
  116. package/dist/components/slider/slider.css.js.map +1 -1
  117. package/dist/components/slider/types.d.ts +1 -1
  118. package/dist/components/switch/index.d.ts +9 -5
  119. package/dist/components/switch/index.js +60 -3
  120. package/dist/components/switch/index.js.map +1 -1
  121. package/dist/components/switch/switch.css.js.map +1 -1
  122. package/dist/components/tabs/index.d.ts +74 -7
  123. package/dist/components/tabs/index.js +259 -3
  124. package/dist/components/tabs/index.js.map +1 -1
  125. package/dist/components/tabs/tabs.css.js.map +1 -1
  126. package/dist/components/text-field/index.d.ts +61 -6
  127. package/dist/components/text-field/index.js +93 -2
  128. package/dist/components/text-field/index.js.map +1 -1
  129. package/dist/components/text-field/text-field.css.js.map +1 -1
  130. package/dist/components/textarea/index.d.ts +18 -5
  131. package/dist/components/textarea/index.js +134 -3
  132. package/dist/components/textarea/index.js.map +1 -1
  133. package/dist/components/textarea/textarea.css.js.map +1 -1
  134. package/dist/components/time-field/index.d.ts +14 -6
  135. package/dist/components/time-field/index.js +103 -2
  136. package/dist/components/time-field/index.js.map +1 -1
  137. package/dist/components/time-field/time-field.css.js.map +1 -1
  138. package/dist/components/tooltip/index.d.ts +29 -6
  139. package/dist/components/tooltip/index.js +112 -3
  140. package/dist/components/tooltip/index.js.map +1 -1
  141. package/dist/components/tooltip/tooltip.css.js.map +1 -1
  142. package/dist/components/tree/index.d.ts +17 -5
  143. package/dist/components/tree/index.js +491 -3
  144. package/dist/components/tree/index.js.map +1 -1
  145. package/dist/components/tree/tree.css.js.map +1 -1
  146. package/dist/components/tree/utils.js.map +1 -1
  147. package/dist/hooks/index.d.ts +12 -12
  148. package/dist/hooks/use-collection-render/index.d.ts +11 -3
  149. package/dist/hooks/use-collection-render/index.js +25 -1
  150. package/dist/hooks/use-collection-render/index.js.map +1 -1
  151. package/dist/hooks/use-context-props/index.d.ts +10 -3
  152. package/dist/hooks/use-context-props/index.js +15 -1
  153. package/dist/hooks/use-context-props/index.js.map +1 -1
  154. package/dist/hooks/use-defaults/index.d.ts +99 -31
  155. package/dist/hooks/use-defaults/index.js +33 -2
  156. package/dist/hooks/use-defaults/index.js.map +1 -1
  157. package/dist/hooks/use-defaults/types.d.ts +6 -6
  158. package/dist/hooks/use-propagating-press/index.d.ts +13 -2
  159. package/dist/hooks/use-propagating-press/index.js +19 -1
  160. package/dist/hooks/use-propagating-press/index.js.map +1 -1
  161. package/dist/hooks/use-slot/index.d.ts +16 -2
  162. package/dist/hooks/use-slot/index.js +18 -1
  163. package/dist/hooks/use-slot/index.js.map +1 -1
  164. package/dist/hooks/use-theme/index.d.ts +37 -8
  165. package/dist/hooks/use-theme/index.js +105 -2
  166. package/dist/hooks/use-theme/index.js.map +1 -1
  167. package/dist/hooks/use-theme/types.d.ts +2 -2
  168. package/dist/hooks/use-theme/use-theme.css.js.map +1 -1
  169. package/dist/hooks/use-tree/index.d.ts +5 -2
  170. package/dist/hooks/use-tree/index.js +262 -1
  171. package/dist/hooks/use-tree/index.js.map +1 -1
  172. package/dist/hooks/use-tree/utils.js.map +1 -1
  173. package/dist/hooks/use-update-effect/index.d.ts +3 -1
  174. package/dist/hooks/use-update-effect/index.js +20 -1
  175. package/dist/hooks/use-update-effect/index.js.map +1 -1
  176. package/dist/index.css +119 -119
  177. package/dist/index.d.ts +47 -47
  178. package/dist/ladle/actions.js.map +1 -1
  179. package/dist/styles/layers.css.d.ts +3 -3
  180. package/dist/styles/layers.css.js.map +1 -1
  181. package/dist/styles/surfaces.css.d.ts +1 -1
  182. package/dist/styles/surfaces.css.js.map +1 -1
  183. package/dist/styles/theme.css.js.map +1 -1
  184. package/dist/styles/typography.css.js.map +1 -1
  185. package/dist/test/setup.js +78 -8
  186. package/dist/test/setup.js.map +1 -1
  187. package/dist/types/use-tree.d.ts +1 -1
  188. package/dist/utils/{css.d.ts → css/index.d.ts} +2 -2
  189. package/dist/utils/{css.js → css/index.js} +5 -5
  190. package/dist/utils/css/index.js.map +1 -0
  191. package/dist/utils/events/index.js +10 -0
  192. package/dist/utils/events/index.js.map +1 -0
  193. package/dist/utils/index.d.ts +4 -4
  194. package/dist/utils/index.js +4 -4
  195. package/dist/utils/{props.d.ts → props/index.d.ts} +2 -2
  196. package/dist/utils/{props.js → props/index.js} +3 -3
  197. package/dist/utils/props/index.js.map +1 -0
  198. package/dist/utils/{validators.d.ts → validators/index.d.ts} +1 -1
  199. package/dist/utils/{validators.js → validators/index.js} +3 -3
  200. package/dist/utils/validators/index.js.map +1 -0
  201. package/dist/vanilla.d.ts +1 -1
  202. package/dist/vanilla.js +1 -1
  203. package/package.json +25 -26
  204. package/dist/components/aria/aria.d.ts +0 -32
  205. package/dist/components/aria/aria.js +0 -39
  206. package/dist/components/aria/aria.js.map +0 -1
  207. package/dist/components/button/button.d.ts +0 -47
  208. package/dist/components/button/button.js +0 -104
  209. package/dist/components/button/button.js.map +0 -1
  210. package/dist/components/checkbox/checkbox.d.ts +0 -30
  211. package/dist/components/checkbox/checkbox.js +0 -123
  212. package/dist/components/checkbox/checkbox.js.map +0 -1
  213. package/dist/components/chip/chip.d.ts +0 -41
  214. package/dist/components/chip/chip.js +0 -171
  215. package/dist/components/chip/chip.js.map +0 -1
  216. package/dist/components/collection/collection.d.ts +0 -17
  217. package/dist/components/collection/collection.js +0 -22
  218. package/dist/components/collection/collection.js.map +0 -1
  219. package/dist/components/combo-box/combo-box.d.ts +0 -21
  220. package/dist/components/combo-box/combo-box.js +0 -116
  221. package/dist/components/combo-box/combo-box.js.map +0 -1
  222. package/dist/components/date-field/date-field.d.ts +0 -20
  223. package/dist/components/date-field/date-field.js +0 -106
  224. package/dist/components/date-field/date-field.js.map +0 -1
  225. package/dist/components/date-input/date-input.d.ts +0 -42
  226. package/dist/components/date-input/date-input.js +0 -128
  227. package/dist/components/date-input/date-input.js.map +0 -1
  228. package/dist/components/dialog/dialog.d.ts +0 -29
  229. package/dist/components/dialog/dialog.js +0 -186
  230. package/dist/components/dialog/dialog.js.map +0 -1
  231. package/dist/components/drawer/drawer.d.ts +0 -28
  232. package/dist/components/drawer/drawer.js +0 -305
  233. package/dist/components/drawer/drawer.js.map +0 -1
  234. package/dist/components/element/element.d.ts +0 -16
  235. package/dist/components/element/element.js +0 -24
  236. package/dist/components/element/element.js.map +0 -1
  237. package/dist/components/group/group.d.ts +0 -16
  238. package/dist/components/group/group.js +0 -61
  239. package/dist/components/group/group.js.map +0 -1
  240. package/dist/components/icon/icon.d.ts +0 -17
  241. package/dist/components/icon/icon.js +0 -39
  242. package/dist/components/icon/icon.js.map +0 -1
  243. package/dist/components/input/input.d.ts +0 -13
  244. package/dist/components/input/input.js +0 -141
  245. package/dist/components/input/input.js.map +0 -1
  246. package/dist/components/menu/menu.d.ts +0 -32
  247. package/dist/components/menu/menu.js +0 -252
  248. package/dist/components/menu/menu.js.map +0 -1
  249. package/dist/components/merge-provider/merge-provider.d.ts +0 -20
  250. package/dist/components/merge-provider/merge-provider.js +0 -46
  251. package/dist/components/merge-provider/merge-provider.js.map +0 -1
  252. package/dist/components/number-field/number-field.d.ts +0 -20
  253. package/dist/components/number-field/number-field.js +0 -125
  254. package/dist/components/number-field/number-field.js.map +0 -1
  255. package/dist/components/options/options.d.ts +0 -28
  256. package/dist/components/options/options.js +0 -253
  257. package/dist/components/options/options.js.map +0 -1
  258. package/dist/components/picker/picker.d.ts +0 -24
  259. package/dist/components/picker/picker.js +0 -113
  260. package/dist/components/picker/picker.js.map +0 -1
  261. package/dist/components/popover/popover.d.ts +0 -22
  262. package/dist/components/popover/popover.js +0 -139
  263. package/dist/components/popover/popover.js.map +0 -1
  264. package/dist/components/query-builder/query-builder.d.ts +0 -23
  265. package/dist/components/query-builder/query-builder.js +0 -200
  266. package/dist/components/query-builder/query-builder.js.map +0 -1
  267. package/dist/components/radio/radio.d.ts +0 -23
  268. package/dist/components/radio/radio.js +0 -114
  269. package/dist/components/radio/radio.js.map +0 -1
  270. package/dist/components/search-field/search-field.d.ts +0 -21
  271. package/dist/components/search-field/search-field.js +0 -92
  272. package/dist/components/search-field/search-field.js.map +0 -1
  273. package/dist/components/select/select.d.ts +0 -20
  274. package/dist/components/select/select.js +0 -109
  275. package/dist/components/select/select.js.map +0 -1
  276. package/dist/components/slider/slider.d.ts +0 -49
  277. package/dist/components/slider/slider.js +0 -230
  278. package/dist/components/slider/slider.js.map +0 -1
  279. package/dist/components/switch/switch.d.ts +0 -10
  280. package/dist/components/switch/switch.js +0 -60
  281. package/dist/components/switch/switch.js.map +0 -1
  282. package/dist/components/tabs/tabs.d.ts +0 -75
  283. package/dist/components/tabs/tabs.js +0 -258
  284. package/dist/components/tabs/tabs.js.map +0 -1
  285. package/dist/components/text-field/text-field.d.ts +0 -64
  286. package/dist/components/text-field/text-field.js +0 -92
  287. package/dist/components/text-field/text-field.js.map +0 -1
  288. package/dist/components/textarea/textarea.d.ts +0 -19
  289. package/dist/components/textarea/textarea.js +0 -134
  290. package/dist/components/textarea/textarea.js.map +0 -1
  291. package/dist/components/time-field/time-field.d.ts +0 -21
  292. package/dist/components/time-field/time-field.js +0 -106
  293. package/dist/components/time-field/time-field.js.map +0 -1
  294. package/dist/components/tooltip/tooltip.d.ts +0 -30
  295. package/dist/components/tooltip/tooltip.js +0 -112
  296. package/dist/components/tooltip/tooltip.js.map +0 -1
  297. package/dist/components/tree/tree.d.ts +0 -29
  298. package/dist/components/tree/tree.js +0 -491
  299. package/dist/components/tree/tree.js.map +0 -1
  300. package/dist/hooks/use-collection-render/use-collection-render.d.ts +0 -11
  301. package/dist/hooks/use-collection-render/use-collection-render.js +0 -28
  302. package/dist/hooks/use-collection-render/use-collection-render.js.map +0 -1
  303. package/dist/hooks/use-context-props/use-context-props.d.ts +0 -10
  304. package/dist/hooks/use-context-props/use-context-props.js +0 -18
  305. package/dist/hooks/use-context-props/use-context-props.js.map +0 -1
  306. package/dist/hooks/use-defaults/use-defaults.d.ts +0 -110
  307. package/dist/hooks/use-defaults/use-defaults.js +0 -36
  308. package/dist/hooks/use-defaults/use-defaults.js.map +0 -1
  309. package/dist/hooks/use-propagating-press/use-propagating-press.d.ts +0 -13
  310. package/dist/hooks/use-propagating-press/use-propagating-press.js +0 -21
  311. package/dist/hooks/use-propagating-press/use-propagating-press.js.map +0 -1
  312. package/dist/hooks/use-slot/use-slot.d.ts +0 -16
  313. package/dist/hooks/use-slot/use-slot.js +0 -21
  314. package/dist/hooks/use-slot/use-slot.js.map +0 -1
  315. package/dist/hooks/use-theme/use-theme.d.ts +0 -77
  316. package/dist/hooks/use-theme/use-theme.js +0 -108
  317. package/dist/hooks/use-theme/use-theme.js.map +0 -1
  318. package/dist/hooks/use-tree/use-tree.d.ts +0 -7
  319. package/dist/hooks/use-tree/use-tree.js +0 -262
  320. package/dist/hooks/use-tree/use-tree.js.map +0 -1
  321. package/dist/hooks/use-update-effect/use-update-effect.d.ts +0 -3
  322. package/dist/hooks/use-update-effect/use-update-effect.js +0 -23
  323. package/dist/hooks/use-update-effect/use-update-effect.js.map +0 -1
  324. package/dist/utils/css.js.map +0 -1
  325. package/dist/utils/events.js +0 -10
  326. package/dist/utils/events.js.map +0 -1
  327. package/dist/utils/props.js.map +0 -1
  328. package/dist/utils/validators.js.map +0 -1
  329. /package/dist/utils/{events.d.ts → events/index.d.ts} +0 -0
@@ -1,262 +0,0 @@
1
- import '../../chunk-PZ5AY32C.js';
2
- import { useTreeData } from '@react-stately/data';
3
- import isEqual from 'lodash/isEqual';
4
- import { useId, useMemo, useRef, useCallback } from 'react';
5
- import { useUpdateEffect } from '../use-update-effect/index.js';
6
- import { getKey, getChildren, mapTree, toggleVisibility } from './utils.js';
7
-
8
- function useTree({
9
- allowsExpansion = true,
10
- allowsVisibility = false,
11
- nodes,
12
- selectionMode = "none",
13
- onSelectionChange,
14
- onUpdate
15
- }) {
16
- const rootKey = useId();
17
- const list = useTreeData({
18
- initialItems: nodes,
19
- getChildren,
20
- getKey
21
- });
22
- useUpdateEffect(() => {
23
- if (selectionMode === "none" && list.selectedKeys.size) {
24
- list.setSelectedKeys(/* @__PURE__ */ new Set());
25
- }
26
- }, [selectionMode, list.selectedKeys.size]);
27
- const { lookup, tree, getItem, update } = useMemo(() => {
28
- const lookup2 = {};
29
- let tree2 = mapTree(
30
- {
31
- key: rootKey,
32
- children: list.items
33
- },
34
- (node) => {
35
- if (node.key === rootKey) {
36
- return;
37
- }
38
- node = lookup2[node.key] = getItem2(node.key);
39
- return node;
40
- }
41
- );
42
- if (allowsVisibility) {
43
- tree2 = mapTree(
44
- {
45
- key: rootKey,
46
- children: toggleVisibility(tree2.children)
47
- },
48
- (node) => {
49
- if (node.key === rootKey) {
50
- return;
51
- }
52
- lookup2[node.key] = node;
53
- return node;
54
- }
55
- );
56
- }
57
- function getItem2(key) {
58
- let node = lookup2[key];
59
- if (node) {
60
- return node;
61
- }
62
- node = list.getItem(key);
63
- if ("nodes" in node.value) {
64
- return {
65
- ...node,
66
- value: {
67
- ...node.value,
68
- nodes: node.children.flatMap((child) => {
69
- const value = lookup2[child.key]?.value;
70
- if (value) {
71
- return [value];
72
- }
73
- return [];
74
- })
75
- }
76
- };
77
- }
78
- return node;
79
- }
80
- function update2(key, patch) {
81
- const node = getItem2(key);
82
- let value;
83
- if ("nodes" in node.value) {
84
- value = {
85
- ...node.value,
86
- ...patch,
87
- // Disallow a parent update to change child values
88
- nodes: node.children.flatMap((child) => {
89
- const value2 = lookup2[child.key]?.value;
90
- if (value2) {
91
- return [value2];
92
- }
93
- return [];
94
- })
95
- };
96
- } else {
97
- value = {
98
- ...node.value,
99
- ...patch
100
- };
101
- }
102
- lookup2[key] = {
103
- ...node,
104
- value
105
- };
106
- list.update(key, value);
107
- }
108
- return { lookup: lookup2, tree: tree2, getItem: getItem2, update: update2 };
109
- }, [rootKey, list, allowsVisibility]);
110
- const treeRef = useRef(tree);
111
- useUpdateEffect(() => {
112
- if (isEqual(treeRef.current, tree)) {
113
- return;
114
- }
115
- treeRef.current = tree;
116
- onUpdate?.(tree.children.map(({ value }) => value));
117
- }, [tree]);
118
- const previousExpansionValuesRef = useRef([]);
119
- const revertIsExpanded = useCallback(() => {
120
- if (!previousExpansionValuesRef.current.length) {
121
- return;
122
- }
123
- for (const { key, patch } of previousExpansionValuesRef.current) {
124
- update(key, patch);
125
- }
126
- previousExpansionValuesRef.current = [];
127
- }, [update]);
128
- const toggleIsExpanded = useCallback(
129
- (selection = "all", isExpanded = void 0, isRevertable = false) => {
130
- if (!(allowsExpansion || isRevertable)) {
131
- return;
132
- }
133
- if (!isRevertable) {
134
- previousExpansionValuesRef.current = [];
135
- }
136
- function toggle({ key, value }) {
137
- if (key === rootKey || !("nodes" in value)) {
138
- return;
139
- }
140
- if (isRevertable) {
141
- previousExpansionValuesRef.current.push({
142
- key,
143
- patch: { isExpanded: value.isExpanded }
144
- });
145
- }
146
- update(key, { isExpanded: isExpanded ?? !value.isExpanded });
147
- }
148
- if (selection === "all") {
149
- return mapTree(tree, toggle);
150
- }
151
- mapTree(tree, (node) => {
152
- if (!selection.has(node.key)) {
153
- return;
154
- }
155
- toggle(node);
156
- });
157
- },
158
- [allowsExpansion, tree, rootKey, update]
159
- );
160
- const toggleIsSelected = useCallback(
161
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor
162
- (selection = "all", isSelected = void 0) => {
163
- if (selectionMode === "none" || selectionMode === "single" && (selection === "all" || selection.size > 1)) {
164
- return;
165
- }
166
- const all = Object.values(lookup);
167
- let keys = selection === "all" ? new Set(all.map(({ key }) => key)) : selection;
168
- if (isSelected != null) {
169
- keys = isSelected ? keys : /* @__PURE__ */ new Set();
170
- list.setSelectedKeys(keys);
171
- return onSelectionChange?.(
172
- (selection === "all" || keys.size === all.length) && isSelected ? "all" : keys
173
- );
174
- }
175
- keys = /* @__PURE__ */ new Set([
176
- ...selectionMode === "multiple" ? [...list.selectedKeys].filter(
177
- (key) => !selection.has(key)
178
- ) : [],
179
- ...[...keys].filter((key) => !list.selectedKeys.has(key))
180
- ]);
181
- list.setSelectedKeys(keys);
182
- onSelectionChange?.(
183
- selection === "all" && keys.size === all.length ? "all" : keys
184
- );
185
- },
186
- [selectionMode, lookup, list, onSelectionChange]
187
- );
188
- const toggleIsViewable = useCallback(
189
- (selection = "all", isViewable = void 0) => {
190
- if (!allowsVisibility) {
191
- return;
192
- }
193
- if (selection === "all") {
194
- return mapTree(tree, ({ key, value }) => {
195
- if (key === rootKey) {
196
- return;
197
- }
198
- if (!value.isReadOnly) {
199
- update(key, {
200
- isViewable: isViewable ?? !value.isViewable
201
- });
202
- }
203
- });
204
- }
205
- mapTree(
206
- {
207
- key: rootKey,
208
- children: Array.from(selection).reduce(
209
- (acc, key) => toggleVisibility(acc, key, isViewable),
210
- tree.children
211
- )
212
- },
213
- ({ key, value }) => {
214
- if (key === rootKey) {
215
- return;
216
- }
217
- if (!value.isReadOnly) {
218
- update(key, { isViewable: value.isViewable });
219
- }
220
- }
221
- );
222
- },
223
- [allowsVisibility, tree, rootKey, update]
224
- );
225
- return useMemo(() => {
226
- const { items: _, selectedKeys, ...rest } = list;
227
- return {
228
- actions: {
229
- ...rest,
230
- getItem,
231
- revertIsExpanded,
232
- toggleIsExpanded,
233
- toggleIsSelected,
234
- toggleIsViewable,
235
- update
236
- },
237
- allowsExpansion,
238
- allowsVisibility,
239
- lookup,
240
- selectedKeys,
241
- selectionMode,
242
- tree
243
- };
244
- }, [
245
- list,
246
- allowsExpansion,
247
- allowsVisibility,
248
- lookup,
249
- selectionMode,
250
- tree,
251
- getItem,
252
- revertIsExpanded,
253
- toggleIsExpanded,
254
- toggleIsSelected,
255
- toggleIsViewable,
256
- update
257
- ]);
258
- }
259
-
260
- export { useTree };
261
- //# sourceMappingURL=use-tree.js.map
262
- //# sourceMappingURL=use-tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/hooks/use-tree/use-tree.ts"],"names":["lookup","tree","getItem","update","value"],"mappings":"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","file":"use-tree.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { useTreeData } from '@react-stately/data';\nimport type { Key } from '@react-types/shared';\nimport isEqual from 'lodash/isEqual';\nimport { useCallback, useId, useMemo, useRef } from 'react';\nimport type {\n TreeActions,\n TreeNode,\n TreeNodes,\n UseTreeOptions,\n UseTreeResult,\n} from '../../types';\nimport { useUpdateEffect } from '../use-update-effect';\nimport { getChildren, getKey, mapTree, toggleVisibility } from './utils';\n\nexport function useTree<T>({\n allowsExpansion = true,\n allowsVisibility = false,\n nodes,\n selectionMode = 'none',\n onSelectionChange,\n onUpdate,\n}: UseTreeOptions<T>): UseTreeResult<T> {\n const rootKey = useId();\n\n const list = useTreeData({\n initialItems: nodes,\n getChildren,\n getKey,\n });\n\n useUpdateEffect(() => {\n if (selectionMode === 'none' && list.selectedKeys.size) {\n list.setSelectedKeys(new Set());\n }\n }, [selectionMode, list.selectedKeys.size]);\n\n /**\n * useTreeData doesn't update the state of TreeNode.value when updates\n * are made to children.\n *\n * Given the structure:\n * Foo\n * - Bar\n * - Cat\n *\n * There will be TreeNodes for each item, with a value that represents\n * the original node passed in. If an update occurs to one of the child\n * nodes (Bar, Cat), then Foo node's value is NOT updated to reflect that\n * change. This means that each node is the source of truth only for itself\n * and not any of its children.\n *\n * To provide a completely accurate tree, we need to override the getItem\n * and update methods, as well as replace the list.items with a tree that\n * is completely accurate at all times. This requires storing (depth first)\n * each node in a lookup, so that parent node's values can be updated to\n * reflect the current state of their children.\n */\n const { lookup, tree, getItem, update } = useMemo(() => {\n const lookup: Record<Key, TreeNode<T>> = {};\n\n let tree = mapTree(\n {\n key: rootKey,\n children: list.items,\n } as TreeNode<T>,\n (node) => {\n if (node.key === rootKey) {\n return;\n }\n\n node = lookup[node.key] = getItem(node.key);\n\n return node;\n },\n );\n\n if (allowsVisibility) {\n tree = mapTree(\n {\n key: rootKey,\n children: toggleVisibility(tree.children),\n } as TreeNode<T>,\n (node) => {\n if (node.key === rootKey) {\n return;\n }\n\n lookup[node.key] = node;\n\n return node;\n },\n );\n }\n\n function getItem(key: Key): TreeNode<T> {\n let node = lookup[key];\n\n if (node) {\n return node;\n }\n\n node = list.getItem(key);\n\n if ('nodes' in node.value) {\n return {\n ...node,\n value: {\n ...node.value,\n nodes: node.children.flatMap((child) => {\n const value = lookup[child.key]?.value;\n\n if (value) {\n return [value];\n }\n\n return [];\n }),\n },\n };\n }\n\n return node;\n }\n\n function update(key: Key, patch: Partial<TreeNodes<T>>) {\n const node = getItem(key);\n\n let value: TreeNode<T>['value'];\n\n if ('nodes' in node.value) {\n value = {\n ...node.value,\n ...patch,\n // Disallow a parent update to change child values\n nodes: node.children.flatMap((child) => {\n const value = lookup[child.key]?.value;\n\n if (value) {\n return [value];\n }\n\n return [];\n }),\n };\n } else {\n value = {\n ...node.value,\n ...patch,\n };\n }\n\n /**\n * We must immediately update the state of the lookup due to the\n * possibility of a queue of state changes and we can't allow for\n * a parent to update and wipe out a previous child update\n */\n lookup[key] = {\n ...node,\n value,\n };\n\n list.update(key, value);\n }\n\n return { lookup, tree, getItem, update };\n }, [rootKey, list, allowsVisibility]);\n\n const treeRef = useRef(tree);\n\n /**\n * Because tree is a computed value and there are so many methods\n * that update list.items, it's far simpler to fire the onUpdate\n * during the render cycle. However, this means that onUpdate can\n * only be used for side effect purposes and should not trigger\n * state updates\n */\n useUpdateEffect(() => {\n if (isEqual(treeRef.current, tree)) {\n return;\n }\n\n treeRef.current = tree;\n\n onUpdate?.(tree.children.map(({ value }) => value));\n }, [tree]);\n\n const previousExpansionValuesRef = useRef<\n {\n key: Key;\n patch: { isExpanded?: boolean };\n }[]\n >([]);\n\n const revertIsExpanded = useCallback(() => {\n if (!previousExpansionValuesRef.current.length) {\n return;\n }\n\n for (const { key, patch } of previousExpansionValuesRef.current) {\n update(key, patch);\n }\n\n previousExpansionValuesRef.current = [];\n }, [update]);\n\n const toggleIsExpanded = useCallback<TreeActions<T>['toggleIsExpanded']>(\n (selection = 'all', isExpanded = undefined, isRevertable = false) => {\n if (!(allowsExpansion || isRevertable)) {\n return;\n }\n\n if (!isRevertable) {\n previousExpansionValuesRef.current = [];\n }\n\n function toggle({ key, value }: TreeNode<T>) {\n if (key === rootKey || !('nodes' in value)) {\n return;\n }\n\n if (isRevertable) {\n previousExpansionValuesRef.current.push({\n key,\n patch: { isExpanded: value.isExpanded },\n });\n }\n\n update(key, { isExpanded: isExpanded ?? !value.isExpanded });\n }\n\n if (selection === 'all') {\n return mapTree(tree, toggle);\n }\n\n mapTree(tree, (node) => {\n if (!selection.has(node.key)) {\n return;\n }\n\n toggle(node);\n });\n },\n [allowsExpansion, tree, rootKey, update],\n );\n\n const toggleIsSelected = useCallback<TreeActions<T>['toggleIsSelected']>(\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\n (selection = 'all', isSelected = undefined) => {\n if (\n selectionMode === 'none' ||\n (selectionMode === 'single' &&\n (selection === 'all' || selection.size > 1))\n ) {\n return;\n }\n\n const all = Object.values(lookup);\n\n let keys =\n selection === 'all' ? new Set(all.map(({ key }) => key)) : selection;\n\n if (isSelected != null) {\n keys = isSelected ? keys : new Set();\n\n list.setSelectedKeys(keys);\n\n return onSelectionChange?.(\n (selection === 'all' || keys.size === all.length) && isSelected\n ? 'all'\n : keys,\n );\n }\n\n keys = new Set([\n ...(selectionMode === 'multiple'\n ? [...list.selectedKeys].filter(\n (key) => !(selection as Set<Key>).has(key),\n )\n : []),\n ...[...keys].filter((key) => !list.selectedKeys.has(key)),\n ]);\n\n list.setSelectedKeys(keys);\n\n onSelectionChange?.(\n selection === 'all' && keys.size === all.length ? 'all' : keys,\n );\n },\n [selectionMode, lookup, list, onSelectionChange],\n );\n\n const toggleIsViewable = useCallback<TreeActions<T>['toggleIsViewable']>(\n (selection = 'all', isViewable = undefined) => {\n if (!allowsVisibility) {\n return;\n }\n\n if (selection === 'all') {\n return mapTree(tree, ({ key, value }) => {\n if (key === rootKey) {\n return;\n }\n\n if (!value.isReadOnly) {\n update(key, {\n isViewable: isViewable ?? !value.isViewable,\n });\n }\n });\n }\n\n mapTree(\n {\n key: rootKey,\n children: Array.from(selection).reduce(\n (acc, key) => toggleVisibility(acc, key, isViewable),\n tree.children,\n ),\n } as TreeNode<T>,\n ({ key, value }) => {\n if (key === rootKey) {\n return;\n }\n\n if (!value.isReadOnly) {\n update(key, { isViewable: value.isViewable });\n }\n },\n );\n },\n [allowsVisibility, tree, rootKey, update],\n );\n\n return useMemo(() => {\n const { items: _, selectedKeys, ...rest } = list;\n\n return {\n actions: {\n ...rest,\n getItem,\n revertIsExpanded,\n toggleIsExpanded,\n toggleIsSelected,\n toggleIsViewable,\n update,\n },\n allowsExpansion,\n allowsVisibility,\n lookup,\n selectedKeys,\n selectionMode,\n tree,\n };\n }, [\n list,\n allowsExpansion,\n allowsVisibility,\n lookup,\n selectionMode,\n tree,\n getItem,\n revertIsExpanded,\n toggleIsExpanded,\n toggleIsSelected,\n toggleIsViewable,\n update,\n ]);\n}\n"]}
@@ -1,3 +0,0 @@
1
- declare function useUpdateEffect(effect: () => void, deps: any): void;
2
-
3
- export { useUpdateEffect };
@@ -1,23 +0,0 @@
1
- import '../../chunk-PZ5AY32C.js';
2
- import { useEffect, useRef } from 'react';
3
-
4
- function useIsFirstMount() {
5
- const isFirst = useRef(true);
6
- if (isFirst.current) {
7
- isFirst.current = false;
8
- return true;
9
- }
10
- return isFirst.current;
11
- }
12
- function useUpdateEffect(effect, deps) {
13
- const isFirstMount = useIsFirstMount();
14
- useEffect(() => {
15
- if (!isFirstMount) {
16
- return effect();
17
- }
18
- }, deps);
19
- }
20
-
21
- export { useUpdateEffect };
22
- //# sourceMappingURL=use-update-effect.js.map
23
- //# sourceMappingURL=use-update-effect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/hooks/use-update-effect/use-update-effect.ts"],"names":[],"mappings":";;;AAEA,SAAS,eAA2B,GAAA;AAClC,EAAM,MAAA,OAAA,GAAU,OAAO,IAAI,CAAA;AAE3B,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAA,OAAA,CAAQ,OAAU,GAAA,KAAA;AAElB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,OAAO,OAAQ,CAAA,OAAA;AACjB;AAEO,SAAS,eAAA,CAAgB,QAAoB,IAAW,EAAA;AAC7D,EAAA,MAAM,eAAe,eAAgB,EAAA;AAErC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAA,OAAO,MAAO,EAAA;AAAA;AAChB,KACC,IAAI,CAAA;AACT","file":"use-update-effect.js","sourcesContent":["import { useEffect, useRef } from 'react';\n\nfunction useIsFirstMount(): boolean {\n const isFirst = useRef(true);\n\n if (isFirst.current) {\n isFirst.current = false;\n\n return true;\n }\n\n return isFirst.current;\n}\n\nexport function useUpdateEffect(effect: () => void, deps: any) {\n const isFirstMount = useIsFirstMount();\n\n useEffect(() => {\n if (!isFirstMount) {\n return effect();\n }\n }, deps);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/css.ts"],"names":[],"mappings":"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","file":"css.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type { GlobalStyleRule, StyleRule } from '@vanilla-extract/css';\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport kebabCase from 'lodash/kebabCase';\nimport { layers } from '../styles';\nimport type {\n Contract,\n CssVarFunction,\n MapLeafNodes,\n PartialMapLeafNodes,\n Primitive,\n RGBA,\n} from '../types';\nimport {\n pixelValueAsStringValidator,\n rgbaAsStringValidator,\n} from './validators';\n\n/**\n * Parse out CSS var name from CSS var implementation\n *\n * @example\n * unwrapCssVar('var(--foo)')\n * // returns '--foo'\n *\n * @example\n * unwrapCssVar('var(--foo, blue)')\n * // returns '--foo'\n *\n * @example\n * unwrapCssVar('var(--foo, var(--bar))')\n * // returns '--foo'\n */\nexport function unwrapCssVar(cssVar: string) {\n return cssVar.replace(/^var\\((--[\\w-]+)[^\\w-]+.*/i, '$1');\n}\n\ntype FulfilledContract<T> = MapLeafNodes<T, null | number | string | RGBA>;\n\n// TODO: remove if possible\n// NOTE: had to create a generic version not bound to type of T because of type issues around setting values on accumulator\ntype GenericFulfilledContract = {\n [key: string]: GenericFulfilledContract | null | number | string | RGBA;\n};\n\n/**\n * Convert contract to nested object of identical shape with computed CSS values\n * Pixel values are converted to numbers\n * RGB(A) values are converted to DeckGL compatible tuples\n * All other values are left unconverted\n */\nexport function computeContract<T extends Contract>(\n contract: T,\n css: CSSStyleDeclaration,\n): FulfilledContract<T> {\n return Object.entries(contract).reduce<GenericFulfilledContract>(\n (acc, [key, cssVarOrContract]) => {\n if (cssVarOrContract == null) {\n acc[key] = null;\n\n return acc;\n }\n\n if (typeof cssVarOrContract === 'object') {\n acc[key] = computeContract(cssVarOrContract, css);\n\n return acc;\n }\n\n const cssVar = unwrapCssVar(cssVarOrContract);\n const value = css.getPropertyValue(cssVar);\n const pixel = pixelValueAsStringValidator.safeParse(value);\n\n if (pixel.success) {\n acc[key] = pixel.data;\n\n return acc;\n }\n\n const rgba = rgbaAsStringValidator.safeParse(value);\n\n if (rgba.success) {\n acc[key] = rgba.data;\n\n return acc;\n }\n\n acc[key] = value ?? null;\n\n return acc;\n },\n {},\n ) as FulfilledContract<T>;\n}\n\n/**\n * Convert potentially nested contract and values pair into flattened CSS var record\n * The contract provides a lookup for CSS vars\n * The values are expected to partially match the contract shapeForm\n */\nexport function reduceContract<T extends Contract, U>(\n contract: T,\n values: PartialMapLeafNodes<T, U>,\n) {\n const nodes: { contract: Contract; values: PartialMapLeafNodes<T, U> }[] = [\n { contract, values },\n ];\n\n const vars: Record<CssVarFunction, U> = {};\n\n for (const node of nodes) {\n // biome-ignore lint/complexity/noForEach: TODO: refactor. converting to for...of results in breaking complexity rule limit 🫠\n Object.entries(node.values).forEach(([key, value]: [string, U]) => {\n const cssVarOrSubContract = node.contract[key];\n\n if (cssVarOrSubContract == null || value == null) {\n return;\n }\n\n if (\n typeof cssVarOrSubContract === 'string' &&\n (typeof value !== 'object' || Array.isArray(value))\n ) {\n vars[cssVarOrSubContract] = value;\n\n return;\n }\n\n if (\n typeof cssVarOrSubContract === 'object' &&\n typeof value === 'object'\n ) {\n nodes.push({ contract: cssVarOrSubContract, values: value });\n }\n });\n }\n\n return vars;\n}\n\n/**\n * Reduce contract and values into Vanilla Extract friendly CSS vars\n */\nexport function assignPartialVars<T extends Contract>(\n contract: T,\n values: PartialMapLeafNodes<T, Primitive>,\n) {\n return Object.fromEntries(\n Object.entries(reduceContract(contract, values)).map(([key, value]) => [\n key,\n `${value}`,\n ]),\n );\n}\n\ntype CssVarValues = {\n [key: string]: CssVarValues | Primitive;\n};\n\ntype CssVarValueOptions<T extends object> = {\n [P in keyof T]?: T[P] extends object\n ? CssVarValueOptions<T[P]>\n : T[P] | T[P][];\n};\n\ntype Operators = 'and' | 'or';\n\ntype ContainerQueryOptions = {\n container?: string;\n operator?: Operators;\n maxHeight?: string;\n minHeight?: string;\n maxWidth?: string;\n minWidth?: string;\n};\n\ntype ContainerQueryValues<T extends CssVarValues> = CssVarValueOptions<T> &\n ContainerQueryOptions;\n\ntype MultiContainerQuery<T extends CssVarValues> = {\n operator?: Operators;\n groups: ContainerQueryValues<T>[];\n};\n\n/**\n * Handle creation of query groups based on options and values\n * Internal to containerQueries\n */\nfunction processConditions<T extends CssVarValues>(\n contract: MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n values: ContainerQueryValues<T>,\n) {\n return Object.entries(\n reduceContract(\n {\n ...contract,\n maxHeight: 'maxHeight', // NOTE: Passthrough these values not as CSS vars\n minHeight: 'minHeight',\n maxWidth: 'maxWidth',\n minWidth: 'minWidth',\n },\n values as PartialMapLeafNodes<\n MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n ContainerQueryValues<T>[string]\n >,\n ),\n ).reduce<string[]>((acc, [key, value]) => {\n if (key === 'container' || key === 'operator' || value == null) {\n return acc;\n }\n\n const isStyle = !/^(?:max|min)(?:Height|Width)$/.test(key);\n const prefix = isStyle ? 'style' : '';\n const prop = isStyle ? unwrapCssVar(key) : kebabCase(key);\n\n if (Array.isArray(value)) {\n const group = value.reduce<string[]>((ac, val) => {\n if (val != null) {\n ac.push(`${prefix}(${prop}: ${val})`);\n }\n\n return ac;\n }, []);\n\n acc.push(`(${group.join(' or ')})`);\n } else {\n acc.push(`${prefix}(${prop}: ${value})`);\n }\n\n return acc;\n }, []);\n}\n\nfunction isMultiQuery<T extends CssVarValues>(\n value: unknown,\n): value is MultiContainerQuery<T> {\n return (\n value != null &&\n typeof value === 'object' &&\n (!('operator' in value) ||\n ('operator' in value &&\n (value.operator === 'and' || value.operator === 'or'))) &&\n 'groups' in value &&\n Array.isArray(value.groups) &&\n value.groups.every((group) => group != null && typeof group === 'object')\n );\n}\n\n/**\n * Create simple or complex container queries with and/or operators.\n *\n * To provide type safety and ease of use, this function accepts a generic and a contract\n * The generic type defines the possible values for the parameters defined within the contract\n *\n * Ex: `containerQuery<{ foo: boolean }>({ foo: 'var(--foo)' }, { foo: true })`\n *\n * By providing the type constraint and contract, the query parameters will have intellisense\n * on which parameters exist and what their possible values can be\n *\n * @example\n * containerQuery(contract, { a: true })\n * // returns (a: true)\n *\n * @example\n * containerQuery(contract, { a: true, b: true })\n * // returns (a: true) and (b: true)\n *\n * @example\n * containerQuery(contract, { operator: 'or', a: true, b: true })\n * // returns (a: true) or (b: true)\n *\n * @example\n * containerQuery(contract, { groups: [{ a: true }, { b: true }] })\n * // returns (a: true) or (b: true)\n *\n * @example\n * containerQuery(contract, { a: ['foo', 'bar'] })\n * // returns (a: 'foo') or (a: 'bar')\n *\n * @example\n * containerQuery(contract, { a: ['foo', 'bar'], b: true })\n * // returns ((a: 'foo') or (a: 'bar')) and (b: true)\n *\n * @example\n * containerQuery(contract, { operator: 'or', a: ['foo', 'bar'], b: true })\n * // returns ((a: 'foo') or (a: 'bar')) or (b: true)\n *\n * @example\n * containerQuery(contract, { groups: [{ a: true, b: true }, { c: true, d: true }] })\n * // returns ((a: true) and (b: true)) or ((c: true) and (d: true))\n *\n * @example\n * containerQuery(contract, { operator: 'and', groups: [{ operator: 'or', a: true, b: true }, { c: true, d: true }] })\n * // returns ((a: true) or (b: true)) and ((c: true) and (d: true))\n *\n * @example\n * containerQuery(contract, { operator: 'and', groups: [{ operator: 'or', a: true, b: true }, { operator: 'or', c: true, d: true }] })\n * // returns ((a: true) or (b: true)) and ((c: true) or (d: true))\n */\nexport function containerQuery<T extends CssVarValues = CssVarValues>(\n contract: MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n query: ContainerQueryValues<T> | MultiContainerQuery<T>,\n) {\n const isMultiGroup = isMultiQuery<T>(query);\n const groups = isMultiGroup ? query.groups : [query];\n const groupsOperator = ` ${(isMultiGroup ? query.operator : null) ?? 'or'} `;\n\n return groups\n .map((group, index) => {\n const operator = ` ${group.operator ?? 'and'} `;\n\n let container = group.container ?? '';\n\n if (index) {\n // Multiple container specifiers is not yet supported: https://github.com/w3c/csswg-drafts/issues/6876\n container = '';\n }\n\n const conditions = processConditions(contract, group);\n const isMultiCondition = groups.length > 1 && conditions.length > 1;\n\n return [\n container,\n container && ' ',\n isMultiCondition ? '(' : '',\n conditions.join(operator),\n isMultiCondition ? ')' : '',\n ].join('');\n })\n .join(groupsOperator);\n}\n\ntype ContainerStyle = Exclude<StyleRule['@container'], undefined>[string];\n\ntype ContainerQuery<T extends CssVarValues> = {\n query: ContainerQueryValues<T> | MultiContainerQuery<T>;\n};\n\ntype ContainerQueries<T extends CssVarValues> = ContainerStyle &\n ContainerQuery<T>;\n\ntype GlobalContainerStyle = Exclude<\n GlobalStyleRule['@container'],\n undefined\n>[string];\n\ntype GlobalContainerQueries<T extends CssVarValues> = GlobalContainerStyle &\n ContainerQuery<T>;\n\n/**\n * Bulk container query creation based on the same contract\n */\nexport function containerQueries<T extends CssVarValues = CssVarValues>(\n contract: MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n ...styles: ContainerQueries<T>[]\n): Record<string, ContainerStyle>;\n\nexport function containerQueries<T extends CssVarValues = CssVarValues>(\n contract: MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n ...styles: GlobalContainerQueries<T>[]\n): Record<string, GlobalContainerStyle>;\n\nexport function containerQueries<T extends CssVarValues = CssVarValues>(\n contract: MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n ...styles: ContainerQueries<T>[] | GlobalContainerQueries<T>[]\n): Record<string, ContainerStyle | GlobalContainerStyle> {\n return Object.fromEntries(\n styles.map(({ query, ...style }) => [\n containerQuery<T>(contract, query),\n style,\n ]),\n );\n}\n\ntype VarsOnlyContainerQuery<T extends CssVarValues> = Required<\n Pick<ContainerQueries<T>, 'query' | 'vars'>\n>;\n\ntype QueryOptionalVarsOnlyContainerQuery<T extends CssVarValues> = Partial<\n Pick<VarsOnlyContainerQuery<T>, 'query'>\n> &\n Pick<VarsOnlyContainerQuery<T>, 'vars'>;\n\n/**\n * Helper for establishing global theme variables with the restriction that\n * only variables may be set (and are required). All other styles must be\n * established using alternative utils\n *\n * The first style rule has an optional query. If the query is missing, the vars\n * are set outside of a container query\n */\nexport function applyThemeVars<T extends CssVarValues = CssVarValues>(\n contract: MapLeafNodes<Omit<T, keyof ContainerQueryOptions>, CssVarFunction>,\n styles:\n | [QueryOptionalVarsOnlyContainerQuery<T>, ...VarsOnlyContainerQuery<T>[]]\n | VarsOnlyContainerQuery<T>[],\n layer = layers.variables.l1,\n): StyleRule {\n const [style, ...rest] = styles;\n\n const stylesWithQueries = (\n style.query ? styles : rest\n ) as VarsOnlyContainerQuery<T>[];\n\n return {\n '@layer': {\n [layer]: {\n ...(style.query ? {} : { vars: style.vars }),\n ...(stylesWithQueries.length\n ? {\n '@container': containerQueries<T>(contract, ...stylesWithQueries),\n }\n : {}),\n },\n },\n };\n}\n\n/**\n * Runtime creation of inline style CSS vars that enable CSS container queries\n */\nexport function inlineVars(\n vars: Record<string, Primitive>,\n): Record<string, string>;\n\nexport function inlineVars<T extends Contract>(\n contract: T,\n values: PartialMapLeafNodes<T, Primitive>,\n): Record<string, string>;\n\nexport function inlineVars<T extends Contract>(\n varsOrContract: Record<string, Primitive> | T,\n values?: PartialMapLeafNodes<T, Primitive>,\n): Record<string, string> {\n return assignInlineVars(\n values\n ? assignPartialVars(varsOrContract as T, values)\n : Object.entries(varsOrContract).reduce<Record<string, string>>(\n (acc, [key, value]) => {\n if (value != null) {\n acc[key] = `${value}`;\n }\n\n return acc;\n },\n {},\n ),\n );\n}\n"]}
@@ -1,10 +0,0 @@
1
- import '../chunk-PZ5AY32C.js';
2
-
3
- // src/utils/events.ts
4
- function continuePropagation(event) {
5
- event.continuePropagation();
6
- }
7
-
8
- export { continuePropagation };
9
- //# sourceMappingURL=events.js.map
10
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/events.ts"],"names":[],"mappings":";;;AAUO,SAAS,oBAAoB,KAAyB,EAAA;AAC3D,EAAA,KAAA,CAAM,mBAAoB,EAAA;AAC5B","file":"events.js","sourcesContent":["// Support React Aria's BaseEvent & PressEvent (and any others the might share the same interface)\ntype ContinuableEvent = {\n continuePropagation: () => void;\n};\n\n/**\n * The default behavior of events within React Aria is to stop progagation\n *\n * To reenable propagation, continuePropagation must be called\n */\nexport function continuePropagation(event: ContinuableEvent) {\n event.continuePropagation();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/props.ts"],"names":["mergePropsWithoutStyles"],"mappings":"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","file":"props.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { mergeProps as mergePropsWithoutStyles } from '@react-aria/utils';\nimport { clsx } from 'clsx';\nimport mergeWith from 'lodash/mergeWith';\nimport type { CSSProperties } from 'react';\nimport { composeRenderProps } from 'react-aria-components';\nimport { z } from 'zod';\nimport type {\n AsType,\n ClassNameRenderProps,\n ClassNames,\n RenderProps,\n StylePropRenderProps,\n} from '../types';\n\ntype Props<T extends object> = AsType<T> | null | undefined;\n\n/**\n * Recursively process merging of all class name render props\n */\nfunction processClassNameRenderProps<T extends RenderProps<object>>(\n value: string,\n renderProps: ClassNameRenderProps<object>,\n ...propsToMerge: Props<T>[]\n): string {\n if (!propsToMerge.length) {\n return '';\n }\n\n const [props, ...rest] = propsToMerge;\n\n return clsx(\n value,\n composeRenderProps<string, ClassNameRenderProps<object>, string>(\n props?.className ?? '',\n (prev) => processClassNameRenderProps(prev, renderProps, ...rest),\n )(renderProps),\n );\n}\n\n/**\n * Compose class name render props to be processed and merged\n */\nfunction mergeRenderClassName<T extends RenderProps<object>>(\n ...propsToMerge: Props<T>[]\n) {\n return composeRenderProps<string, ClassNameRenderProps<object>, string>(\n (renderProps) => renderProps.defaultClassName ?? '',\n (prev, renderProps) =>\n processClassNameRenderProps(prev, renderProps, ...propsToMerge),\n );\n}\n\n/**\n * Merge static class names\n */\nfunction mergeStaticClassName<T extends RenderProps<object>>(\n ...propsToMerge: Props<T>[]\n) {\n return clsx(\n propsToMerge.reduce<string[]>((acc, props) => {\n if (typeof props?.className !== 'string') {\n return acc;\n }\n\n acc.push(props.className);\n\n return acc;\n }, []),\n );\n}\n\n/**\n * Determine if a static or composed merge of class names is necesary based on the presence of functions\n */\nfunction mergeClassNameProps<T extends RenderProps<object>>(\n ...propsToMerge: Props<T>[]\n) {\n const anyFunctions = propsToMerge.some(\n (props) => typeof props?.className === 'function',\n );\n\n const anyPrimitives = propsToMerge.some(\n (props) => typeof props?.className === 'string',\n );\n\n if (!(anyFunctions || anyPrimitives)) {\n return undefined;\n }\n\n return anyFunctions\n ? mergeRenderClassName(...propsToMerge)\n : mergeStaticClassName(...propsToMerge);\n}\n\nconst classNamesValidator: z.ZodType<ClassNames> = z.record(\n z.string(),\n z.union([z.string(), z.lazy(() => classNamesValidator)]),\n);\n\nconst propsValidator = z.object({\n classNames: classNamesValidator,\n});\n\n/**\n * Deep merges classNames objects within props\n */\nfunction mergeClassNamesProps<T extends object>(...propsToMerge: Props<T>[]) {\n return propsToMerge.reduce<ClassNames | undefined>((acc, props) => {\n const result = propsValidator.safeParse(props);\n\n if (result.success) {\n return acc\n ? mergeWith(acc, result.data.classNames, (accValue, srcValue) =>\n (!accValue || typeof accValue === 'string') &&\n (!srcValue || typeof srcValue === 'string')\n ? clsx(accValue, srcValue)\n : undefined,\n )\n : result.data.classNames;\n }\n\n return acc;\n }, undefined);\n}\n\n/**\n * Deep merges classNames objects by concatenating class values\n *\n * @example\n * mergeClassNames({ foo: 'foo' }, { foo: 'FOO', bar: 'bar' })\n * // returns { foo: 'foo FOO', bar: 'bar' }\n */\nexport function mergeClassNames<T extends ClassNames>(\n ...classNamesToMerge: (T | null | undefined)[]\n) {\n return mergeClassNamesProps(\n ...classNamesToMerge.map((classNames) => ({ classNames })),\n ) as T | undefined;\n}\n\n/**\n * Recursively process merging of all style render props\n */\nfunction processStyleRenderProps<T extends RenderProps<object>>(\n value: CSSProperties,\n renderProps: StylePropRenderProps<object>,\n ...propsToMerge: Props<T>[]\n): CSSProperties {\n if (!propsToMerge.length) {\n return {};\n }\n\n const [props, ...rest] = propsToMerge;\n\n return {\n ...value,\n ...composeRenderProps<\n CSSProperties,\n StylePropRenderProps<object>,\n CSSProperties\n >(props?.style ?? {}, (prev) =>\n processStyleRenderProps(prev, renderProps, ...rest),\n )(renderProps),\n };\n}\n\n/**\n * Compose style render props to be processed and merged\n */\nfunction mergeRenderStyle<T extends RenderProps<object>>(\n ...propsToMerge: Props<T>[]\n) {\n return composeRenderProps<\n CSSProperties,\n StylePropRenderProps<object>,\n CSSProperties\n >(\n (renderProps) => renderProps.defaultStyle ?? {},\n (prev, renderProps) =>\n processStyleRenderProps(prev, renderProps, ...propsToMerge),\n );\n}\n\n/**\n * Merge static styles\n */\nfunction mergeStaticStyle<T extends RenderProps<object>>(\n ...propsToMerge: Props<T>[]\n) {\n return propsToMerge.reduce<CSSProperties>((acc, props) => {\n if (!props?.style) {\n return acc;\n }\n\n Object.assign(acc, props.style);\n\n return acc;\n }, {});\n}\n\n/**\n * Determine if a static or composed merge of styles is necesary based on the presence of functions\n */\nfunction mergeStyleProps<T extends RenderProps<object>>(\n ...propsToMerge: Props<T>[]\n) {\n const anyFunctions = propsToMerge.some(\n (props) => typeof props?.style === 'function',\n );\n\n const anyObjects = propsToMerge.some(\n (props) => typeof props?.style === 'object' && props.style != null,\n );\n\n if (!(anyFunctions || anyObjects)) {\n return undefined;\n }\n\n return anyFunctions\n ? mergeRenderStyle(...propsToMerge)\n : mergeStaticStyle(...propsToMerge);\n}\n\n/**\n * Extends the base margeProps functionality to also merge styles and handle class/style render props\n */\nexport function mergeProps<T extends object>(...propsToMerge: Props<T>[]): T {\n const className = mergeClassNameProps(...propsToMerge);\n const classNames = mergeClassNamesProps(...propsToMerge);\n const style = mergeStyleProps(...propsToMerge);\n\n return {\n ...(mergePropsWithoutStyles(...propsToMerge) as T),\n ...(className ? { className } : {}),\n ...(classNames ? { classNames } : {}),\n ...(style ? { style } : {}),\n };\n}\n\n/**\n * A helper for not having to reimplement the type check for a renderProp value being a function or not everywhere\n */\nexport function callRenderProps<T extends object, R>(\n value: R | ((renderProps: T) => R),\n values: T,\n) {\n if (typeof value === 'function') {\n return (value as (renderProps: T) => R)(values);\n }\n\n return value;\n}\n\n/**\n * A helper function to pair with React Aria's render props. Typically\n * implemented with children, className and styles\n *\n * Allows for the injection of additional renderProps that a component\n * from React Aria may not already provide\n *\n * If the value isn't a renderProp function, then it is passed through unchanged\n */\nexport function wrapRenderProps<T extends object, U extends object, R>(\n value: R | ((renderProps: T & U) => R),\n inject?: U,\n) {\n if (typeof value === 'function') {\n return (renderProps: T) =>\n (value as (renderProps: T & U) => R)({\n ...renderProps,\n ...inject,\n } as T & U);\n }\n\n return value;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/validators.ts"],"names":[],"mappings":";;;;AAmBO,IAAM,2BAA8B,GAAA,CAAA,CAAE,MAAO,EAAA,CAAE,IAAK;AAW9C,IAAA,2BAAA,GAA8B,EACxC,KAAM,CAAA;AAAA,EACL,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,EACb,CACG,CAAA,MAAA,EACA,CAAA,QAAA,CAAS,IAAI,CAAA,CACb,SAAU,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAC;AAClD,CAAC,CAAA,CACA,KAAK,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAA,CACtB,KAAK,2BAA2B;AAK5B,IAAM,6BAAgC,GAAA,CAAA,CAC1C,MAAO,EAAA,CACP,IAAK,EAAA,CACL,GAAI,EAAA,CACJ,GAAI,CAAA,CAAC,CACL,CAAA,GAAA,CAAI,GAAG;AAKH,IAAM,6BAAgC,GAAA,CAAA,CAC1C,MAAO,EAAA,CACP,IAAK,EAAA,CACL,IAAK,CAAA,CAAA,CAAE,MAAO,CAAA,MAAA,EAAQ,CAAA,CACtB,KAAK,6BAA6B;AAK9B,IAAM,6BAAgC,GAAA;AAKtC,IAAM,6BAAgC,GAAA,CAAA,CAC1C,MAAO,EAAA,CACP,IAAK,EAAA,CACL,IAAK,CAAA,CAAA,CAAE,MAAO,CAAA,MAAA,EAAS,CAAA,IAAA,EAAO,CAAA,GAAA,CAAI,CAAC,CAAC,CACpC,CAAA,SAAA,CAAU,CAAC,KAAA,KAAU,IAAK,CAAA,KAAA,CAAM,KAAM,CAAA,KAAA,EAAO,CAAG,EAAA,CAAC,CAAI,GAAA,GAAG,CAAC;AAY/C,IAAA,qBAAA,GAAwB,EAClC,KAAM,CAAA;AAAA,EACL,EACG,MAAO,EAAA,CACP,UAAW,CAAA,MAAM,EACjB,QAAS,CAAA,GAAG,CACZ,CAAA,SAAA,CAAU,CAAC,KAAU,KAAA,KAAA,CAAM,OAAQ,CAAA,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA;AAAA,EAClD,EACG,MAAO,EAAA,CACP,UAAW,CAAA,OAAO,EAClB,QAAS,CAAA,GAAG,CACZ,CAAA,SAAA,CAAU,CAAC,KAAU,KAAA,KAAA,CAAM,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAC;AAClD,CAAC,CACA,CAAA,SAAA,CAAU,CAAC,KAAA,KAAU,KAAM,CAAA,OAAA,CAAQ,UAAY,EAAA,EAAE,CAAE,CAAA,KAAA,CAAM,GAAG,CAAC,CAC7D,CAAA,IAAA;AAAA,EACC,EAAE,KAAM,CAAA;AAAA,IACN,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD;AACH;AAOW,IAAA,oBAAA,GAAuB,EAAE,KAAM,CAAA;AAAA,EAC1C,EACG,KAAM,CAAA;AAAA,IACL,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD,EACA,SAAgB,CAAA,CAAC,QAAQ,CAAC,GAAG,GAAK,EAAA,GAAG,CAAC,CAAA;AAAA,EACzC,EAAE,KAAM,CAAA;AAAA,IACN,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD;AACH,CAAC","file":"validators.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport clamp from 'lodash/clamp';\nimport { z } from 'zod';\nimport type { RGBA } from '../types';\n\n/**\n * Test for any safe number that could represent a pixel value\n */\nexport const pixelValueAsNumberValidator = z.number().safe();\n\n/**\n * Test for and capture numeric pixel values\n * Will allow decimals and negative numbers\n *\n * Examples:\n * 0 -> 0\n * 1px -> 1\n * 20.5px -> 20.5\n */\nexport const pixelValueAsStringValidator = z\n .union([\n z.literal('0'),\n z\n .string()\n .endsWith('px')\n .transform((value) => value.replace(/px$/, '')),\n ])\n .pipe(z.coerce.number())\n .pipe(pixelValueAsNumberValidator);\n\n/**\n * Test for an integer in the range of 0-255 as a representation of an RGB color channel value\n */\nexport const colorChannelAsNumberValidator = z\n .number()\n .safe()\n .int()\n .min(0)\n .max(255);\n\n/**\n * Test for and convert CSS RGB color channel to numeric value (0-255)\n */\nexport const colorChannelAsStringValidator = z\n .string()\n .trim()\n .pipe(z.coerce.number())\n .pipe(colorChannelAsNumberValidator);\n\n/**\n * DeckGL treats alpha channel the same as color channels (0-255)\n */\nexport const alphaChannelAsNumberValidator = colorChannelAsNumberValidator;\n\n/**\n * Test for and convert CSS RGBA alpha channel to DeckGL numeric value\n */\nexport const alphaChannelAsStringValidator = z\n .string()\n .trim()\n .pipe(z.coerce.number().safe().min(0)) // CSS allows for values greater than 1\n .transform((value) => Math.round(clamp(value, 0, 1) * 255));\n\n/**\n * Test for and convert CSS RGB(A) values to numeric RGBA tuple\n * Will only allow for rgb with 3 valid numbers `(0-255){3, intergers only}`\n * Will only allow for rgba with 4 valid numbers `(0-255){3, intergers only} + (0-1){1, decimals allowed}`\n * Will allow for whitespace spread throughout\n *\n * Examples:\n * rgb( 0, 0, 0 ) -> [0, 0, 0, 255]\n * rgba(203,117,98,0.4) -> [203, 117, 98, 102]\n */\nexport const rgbaAsStringValidator = z\n .union([\n z\n .string()\n .startsWith('rgb(')\n .endsWith(')')\n .transform((value) => value.replace(/\\)$/, ',1')), // Add on 100% alpha channel\n z\n .string()\n .startsWith('rgba(')\n .endsWith(')')\n .transform((value) => value.replace(/\\)$/, '')),\n ])\n .transform((value) => value.replace(/^rgba?\\(/, '').split(','))\n .pipe(\n z.tuple([\n colorChannelAsStringValidator,\n colorChannelAsStringValidator,\n colorChannelAsStringValidator,\n alphaChannelAsStringValidator,\n ]),\n );\n\n/**\n * Test for numeric RGB(A) tuple\n *\n * Will return RGB as RGBA with 100% alpha channel\n */\nexport const rgbaAsTupleValidator = z.union([\n z\n .tuple([\n colorChannelAsNumberValidator,\n colorChannelAsNumberValidator,\n colorChannelAsNumberValidator,\n ])\n .transform<RGBA>((rgb) => [...rgb, 255]),\n z.tuple([\n colorChannelAsNumberValidator,\n colorChannelAsNumberValidator,\n colorChannelAsNumberValidator,\n alphaChannelAsNumberValidator,\n ]),\n]);\n"]}
File without changes