@proyecto-viviana/solid-stately 0.2.7 → 0.4.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 (254) hide show
  1. package/README.md +30 -283
  2. package/dist/autocomplete/createAutocompleteState.d.ts +2 -2
  3. package/dist/autocomplete/index.d.ts +1 -1
  4. package/dist/calendar/IncompleteDate.d.ts +61 -0
  5. package/dist/calendar/createCalendarState.d.ts +41 -16
  6. package/dist/calendar/createDateFieldState.d.ts +39 -9
  7. package/dist/calendar/createDatePickerState.d.ts +60 -0
  8. package/dist/calendar/createRangeCalendarState.d.ts +37 -10
  9. package/dist/calendar/createTimeFieldState.d.ts +34 -7
  10. package/dist/calendar/index.d.ts +7 -6
  11. package/dist/checkbox/createCheckboxGroupState.d.ts +6 -6
  12. package/dist/checkbox/index.d.ts +1 -1
  13. package/dist/collections/ListCollection.d.ts +1 -1
  14. package/dist/collections/createListState.d.ts +11 -8
  15. package/dist/collections/createMenuState.d.ts +7 -7
  16. package/dist/collections/createSelectionState.d.ts +22 -10
  17. package/dist/collections/getChildNodes.d.ts +11 -0
  18. package/dist/collections/index.d.ts +6 -5
  19. package/dist/collections/types.d.ts +12 -12
  20. package/dist/color/Color.d.ts +1 -1
  21. package/dist/color/createColorAreaState.d.ts +4 -2
  22. package/dist/color/createColorFieldState.d.ts +38 -12
  23. package/dist/color/createColorSliderState.d.ts +9 -2
  24. package/dist/color/createColorWheelState.d.ts +13 -2
  25. package/dist/color/getColorChannels.d.ts +1 -1
  26. package/dist/color/index.d.ts +6 -6
  27. package/dist/color/types.d.ts +4 -4
  28. package/dist/combobox/createComboBoxState.d.ts +34 -13
  29. package/dist/combobox/index.d.ts +1 -1
  30. package/dist/data/createAsyncList.d.ts +4 -4
  31. package/dist/data/createListData.d.ts +2 -2
  32. package/dist/data/createTreeData.d.ts +6 -2
  33. package/dist/data/index.d.ts +3 -3
  34. package/dist/datepicker/index.d.ts +2 -4
  35. package/dist/disclosure/createDisclosureState.d.ts +2 -2
  36. package/dist/disclosure/index.d.ts +1 -1
  37. package/dist/dnd/createDragState.d.ts +2 -2
  38. package/dist/dnd/createDraggableCollectionState.d.ts +2 -2
  39. package/dist/dnd/createDropState.d.ts +2 -2
  40. package/dist/dnd/createDroppableCollectionState.d.ts +3 -3
  41. package/dist/dnd/index.d.ts +5 -5
  42. package/dist/dnd/types.d.ts +19 -17
  43. package/dist/form/createFormValidationState.d.ts +3 -3
  44. package/dist/form/index.d.ts +1 -1
  45. package/dist/grid/createGridState.d.ts +2 -2
  46. package/dist/grid/index.d.ts +2 -2
  47. package/dist/grid/types.d.ts +27 -11
  48. package/dist/index.d.ts +31 -30
  49. package/dist/index.js +9077 -7246
  50. package/dist/index.js.map +1 -1
  51. package/dist/menu/index.d.ts +2 -2
  52. package/dist/numberfield/createNumberFieldState.d.ts +2 -2
  53. package/dist/numberfield/index.d.ts +1 -1
  54. package/dist/overlays/createOverlayTriggerState.d.ts +2 -2
  55. package/dist/overlays/index.d.ts +1 -1
  56. package/dist/radio/createRadioGroupState.d.ts +7 -7
  57. package/dist/radio/index.d.ts +1 -1
  58. package/dist/searchfield/createSearchFieldState.d.ts +2 -2
  59. package/dist/searchfield/index.d.ts +2 -2
  60. package/dist/select/createSelectState.d.ts +14 -8
  61. package/dist/select/index.d.ts +1 -1
  62. package/dist/selection/Selection.d.ts +16 -0
  63. package/dist/selection/SelectionManager.d.ts +110 -0
  64. package/dist/selection/createMultipleSelectionState.d.ts +59 -0
  65. package/dist/selection/index.d.ts +6 -5
  66. package/dist/slider/createSliderState.d.ts +3 -3
  67. package/dist/slider/index.d.ts +2 -2
  68. package/dist/steplist/createStepListState.d.ts +48 -0
  69. package/dist/steplist/index.d.ts +1 -0
  70. package/dist/table/TableCollection.d.ts +33 -3
  71. package/dist/table/createTableColumnResizeState.d.ts +54 -0
  72. package/dist/table/createTableState.d.ts +2 -2
  73. package/dist/table/createTreeGridState.d.ts +15 -0
  74. package/dist/table/index.d.ts +6 -3
  75. package/dist/table/types.d.ts +68 -10
  76. package/dist/tabs/createTabListState.d.ts +5 -5
  77. package/dist/tabs/index.d.ts +1 -1
  78. package/dist/textfield/createTextFieldState.d.ts +2 -2
  79. package/dist/textfield/index.d.ts +1 -1
  80. package/dist/toast/createToastState.d.ts +24 -2
  81. package/dist/toast/index.d.ts +1 -1
  82. package/dist/toggle/createToggleGroupState.d.ts +4 -4
  83. package/dist/toggle/createToggleState.d.ts +2 -2
  84. package/dist/toggle/index.d.ts +2 -2
  85. package/dist/tooltip/createTooltipTriggerState.d.ts +2 -2
  86. package/dist/tooltip/index.d.ts +1 -1
  87. package/dist/tree/TreeCollection.d.ts +2 -2
  88. package/dist/tree/createTreeState.d.ts +2 -2
  89. package/dist/tree/index.d.ts +3 -3
  90. package/dist/tree/types.d.ts +27 -13
  91. package/dist/utils/index.d.ts +1 -1
  92. package/dist/utils/reactivity.d.ts +1 -1
  93. package/package.json +29 -30
  94. package/src/autocomplete/createAutocompleteState.d.ts +19 -17
  95. package/src/autocomplete/createAutocompleteState.ts +24 -30
  96. package/src/autocomplete/index.d.ts +6 -2
  97. package/src/autocomplete/index.ts +1 -1
  98. package/src/calendar/IncompleteDate.ts +430 -0
  99. package/src/calendar/createCalendarState.d.ts +139 -117
  100. package/src/calendar/createCalendarState.ts +308 -94
  101. package/src/calendar/createDateFieldState.d.ts +130 -95
  102. package/src/calendar/createDateFieldState.ts +447 -334
  103. package/src/calendar/createDatePickerState.ts +347 -0
  104. package/src/calendar/createRangeCalendarState.d.ts +154 -129
  105. package/src/calendar/createRangeCalendarState.ts +411 -85
  106. package/src/calendar/createTimeFieldState.d.ts +81 -79
  107. package/src/calendar/createTimeFieldState.ts +187 -108
  108. package/src/calendar/index.d.ts +80 -7
  109. package/src/calendar/index.ts +23 -12
  110. package/src/checkbox/createCheckboxGroupState.d.ts +57 -55
  111. package/src/checkbox/createCheckboxGroupState.ts +20 -29
  112. package/src/checkbox/index.d.ts +6 -2
  113. package/src/checkbox/index.ts +1 -1
  114. package/src/collections/ListCollection.d.ts +25 -22
  115. package/src/collections/ListCollection.ts +6 -6
  116. package/src/collections/createListState.d.ts +73 -58
  117. package/src/collections/createListState.ts +67 -35
  118. package/src/collections/createMenuState.d.ts +36 -31
  119. package/src/collections/createMenuState.ts +21 -12
  120. package/src/collections/createSelectionState.d.ts +78 -65
  121. package/src/collections/createSelectionState.ts +66 -52
  122. package/src/collections/getChildNodes.ts +98 -0
  123. package/src/collections/index.d.ts +38 -6
  124. package/src/collections/index.ts +14 -10
  125. package/src/collections/types.d.ts +101 -101
  126. package/src/collections/types.ts +12 -12
  127. package/src/color/Color.d.ts +20 -5
  128. package/src/color/Color.ts +357 -254
  129. package/src/color/createColorAreaState.d.ts +67 -65
  130. package/src/color/createColorAreaState.ts +21 -13
  131. package/src/color/createColorFieldState.d.ts +46 -44
  132. package/src/color/createColorFieldState.ts +285 -149
  133. package/src/color/createColorSliderState.d.ts +58 -56
  134. package/src/color/createColorSliderState.ts +45 -14
  135. package/src/color/createColorWheelState.d.ts +42 -40
  136. package/src/color/createColorWheelState.ts +101 -64
  137. package/src/color/getColorChannels.ts +7 -5
  138. package/src/color/index.d.ts +36 -7
  139. package/src/color/index.ts +6 -9
  140. package/src/color/types.d.ts +68 -63
  141. package/src/color/types.ts +11 -19
  142. package/src/combobox/createComboBoxState.d.ts +107 -105
  143. package/src/combobox/createComboBoxState.ts +184 -89
  144. package/src/combobox/index.d.ts +10 -2
  145. package/src/combobox/index.ts +1 -1
  146. package/src/data/createAsyncList.ts +89 -63
  147. package/src/data/createListData.ts +67 -67
  148. package/src/data/createTreeData.ts +304 -91
  149. package/src/data/index.ts +3 -3
  150. package/src/datepicker/index.ts +6 -10
  151. package/src/disclosure/createDisclosureState.d.ts +47 -43
  152. package/src/disclosure/createDisclosureState.ts +7 -21
  153. package/src/disclosure/index.d.ts +10 -2
  154. package/src/disclosure/index.ts +1 -1
  155. package/src/dnd/createDragState.d.ts +51 -42
  156. package/src/dnd/createDragState.ts +12 -14
  157. package/src/dnd/createDraggableCollectionState.d.ts +52 -41
  158. package/src/dnd/createDraggableCollectionState.ts +14 -21
  159. package/src/dnd/createDropState.d.ts +64 -45
  160. package/src/dnd/createDropState.ts +22 -32
  161. package/src/dnd/createDroppableCollectionState.d.ts +88 -59
  162. package/src/dnd/createDroppableCollectionState.ts +40 -43
  163. package/src/dnd/index.d.ts +55 -6
  164. package/src/dnd/index.ts +6 -18
  165. package/src/dnd/types.d.ts +170 -157
  166. package/src/dnd/types.ts +24 -22
  167. package/src/form/createFormValidationState.d.ts +47 -45
  168. package/src/form/createFormValidationState.ts +30 -63
  169. package/src/form/index.d.ts +16 -2
  170. package/src/form/index.ts +1 -1
  171. package/src/grid/createGridState.d.ts +7 -4
  172. package/src/grid/createGridState.ts +78 -51
  173. package/src/grid/index.d.ts +3 -3
  174. package/src/grid/index.ts +2 -8
  175. package/src/grid/types.d.ts +136 -129
  176. package/src/grid/types.ts +34 -18
  177. package/src/index.d.ts +311 -26
  178. package/src/index.ts +59 -89
  179. package/src/menu/index.ts +2 -4
  180. package/src/numberfield/createNumberFieldState.d.ts +56 -54
  181. package/src/numberfield/createNumberFieldState.ts +26 -31
  182. package/src/numberfield/index.d.ts +6 -2
  183. package/src/numberfield/index.ts +1 -1
  184. package/src/overlays/createOverlayTriggerState.d.ts +22 -20
  185. package/src/overlays/createOverlayTriggerState.ts +3 -4
  186. package/src/overlays/index.d.ts +6 -2
  187. package/src/overlays/index.ts +1 -1
  188. package/src/radio/createRadioGroupState.d.ts +54 -52
  189. package/src/radio/createRadioGroupState.ts +27 -29
  190. package/src/radio/index.d.ts +7 -2
  191. package/src/radio/index.ts +1 -1
  192. package/src/searchfield/createSearchFieldState.d.ts +16 -14
  193. package/src/searchfield/createSearchFieldState.ts +5 -11
  194. package/src/searchfield/index.d.ts +3 -3
  195. package/src/searchfield/index.ts +2 -5
  196. package/src/select/createSelectState.d.ts +63 -61
  197. package/src/select/createSelectState.ts +42 -29
  198. package/src/select/index.d.ts +2 -2
  199. package/src/select/index.ts +1 -5
  200. package/src/selection/Selection.ts +28 -0
  201. package/src/selection/SelectionManager.ts +526 -0
  202. package/src/selection/createMultipleSelectionState.ts +247 -0
  203. package/src/selection/index.ts +12 -7
  204. package/src/slider/createSliderState.d.ts +60 -60
  205. package/src/slider/createSliderState.ts +55 -33
  206. package/src/slider/index.d.ts +3 -3
  207. package/src/slider/index.ts +2 -6
  208. package/src/ssr/index.d.ts +1 -1
  209. package/src/ssr/index.ts +2 -2
  210. package/src/steplist/createStepListState.ts +191 -0
  211. package/src/steplist/index.ts +5 -0
  212. package/src/table/TableCollection.d.ts +42 -40
  213. package/src/table/TableCollection.ts +266 -99
  214. package/src/table/createTableColumnResizeState.ts +242 -0
  215. package/src/table/createTableState.d.ts +7 -4
  216. package/src/table/createTableState.ts +30 -7
  217. package/src/table/createTreeGridState.ts +146 -0
  218. package/src/table/index.d.ts +14 -4
  219. package/src/table/index.ts +13 -3
  220. package/src/table/types.d.ts +98 -92
  221. package/src/table/types.ts +83 -13
  222. package/src/tabs/createTabListState.d.ts +59 -57
  223. package/src/tabs/createTabListState.ts +34 -39
  224. package/src/tabs/index.d.ts +8 -2
  225. package/src/tabs/index.ts +1 -1
  226. package/src/textfield/createTextFieldState.d.ts +16 -14
  227. package/src/textfield/createTextFieldState.ts +7 -18
  228. package/src/textfield/index.d.ts +6 -2
  229. package/src/textfield/index.ts +1 -1
  230. package/src/toast/createToastState.d.ts +92 -86
  231. package/src/toast/createToastState.ts +90 -52
  232. package/src/toast/index.d.ts +12 -2
  233. package/src/toast/index.ts +2 -1
  234. package/src/toggle/createToggleGroupState.ts +11 -21
  235. package/src/toggle/createToggleState.d.ts +19 -19
  236. package/src/toggle/createToggleState.ts +2 -16
  237. package/src/toggle/index.d.ts +2 -2
  238. package/src/toggle/index.ts +2 -6
  239. package/src/tooltip/createTooltipTriggerState.d.ts +17 -17
  240. package/src/tooltip/createTooltipTriggerState.ts +12 -11
  241. package/src/tooltip/index.d.ts +7 -2
  242. package/src/tooltip/index.ts +1 -1
  243. package/src/tree/TreeCollection.d.ts +26 -23
  244. package/src/tree/TreeCollection.ts +29 -22
  245. package/src/tree/createTreeState.d.ts +7 -4
  246. package/src/tree/createTreeState.ts +70 -41
  247. package/src/tree/index.d.ts +10 -4
  248. package/src/tree/index.ts +3 -3
  249. package/src/tree/types.d.ts +131 -126
  250. package/src/tree/types.ts +30 -13
  251. package/src/utils/index.d.ts +2 -2
  252. package/src/utils/index.ts +1 -1
  253. package/src/utils/reactivity.d.ts +2 -2
  254. package/src/utils/reactivity.ts +3 -3
@@ -5,36 +5,39 @@
5
5
  * A flattened view of tree nodes that respects expanded state.
6
6
  * Only visible nodes (root + expanded children) are included in iteration.
7
7
  */
8
- import type { Key } from '../collections/types';
9
- import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from './types';
8
+ import type { Key } from "../collections/types";
9
+ import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from "./types";
10
10
  /**
11
11
  * Creates a TreeCollection from hierarchical data.
12
12
  * The collection is flattened based on expanded keys.
13
13
  */
14
14
  export declare class TreeCollection<T> implements ITreeCollection<T> {
15
- private keyMap;
16
- private visibleKeys;
17
- private _rows;
18
- constructor(items: TreeItemData<T>[], expandedKeys: Set<Key>);
19
- private buildCollection;
20
- get size(): number;
21
- get rows(): TreeNode<T>[];
22
- get rowCount(): number;
23
- getKeys(): Iterable<Key>;
24
- getItem(key: Key): TreeNode<T> | null;
25
- at(index: number): TreeNode<T> | null;
26
- getKeyBefore(key: Key): Key | null;
27
- getKeyAfter(key: Key): Key | null;
28
- getFirstKey(): Key | null;
29
- getLastKey(): Key | null;
30
- getChildren(key: Key): Iterable<TreeNode<T>>;
31
- getTextValue(key: Key): string;
32
- getParentKey(key: Key): Key | null;
33
- [Symbol.iterator](): Iterator<TreeNode<T>>;
15
+ private keyMap;
16
+ private visibleKeys;
17
+ private _rows;
18
+ constructor(items: TreeItemData<T>[], expandedKeys: Set<Key>);
19
+ private buildCollection;
20
+ get size(): number;
21
+ get rows(): TreeNode<T>[];
22
+ get rowCount(): number;
23
+ getKeys(): Iterable<Key>;
24
+ getItem(key: Key): TreeNode<T> | null;
25
+ at(index: number): TreeNode<T> | null;
26
+ getKeyBefore(key: Key): Key | null;
27
+ getKeyAfter(key: Key): Key | null;
28
+ getFirstKey(): Key | null;
29
+ getLastKey(): Key | null;
30
+ getChildren(key: Key): Iterable<TreeNode<T>>;
31
+ getTextValue(key: Key): string;
32
+ getParentKey(key: Key): Key | null;
33
+ [Symbol.iterator](): Iterator<TreeNode<T>>;
34
34
  }
35
35
  /**
36
36
  * Factory function to create a TreeCollection.
37
37
  * Useful for the collectionFactory pattern in TreeStateOptions.
38
38
  */
39
- export declare function createTreeCollection<T>(items: TreeItemData<T>[], expandedKeys: Set<Key>): TreeCollection<T>;
40
- //# sourceMappingURL=TreeCollection.d.ts.map
39
+ export declare function createTreeCollection<T>(
40
+ items: TreeItemData<T>[],
41
+ expandedKeys: Set<Key>,
42
+ ): TreeCollection<T>;
43
+ //# sourceMappingURL=TreeCollection.d.ts.map
@@ -6,8 +6,16 @@
6
6
  * Only visible nodes (root + expanded children) are included in iteration.
7
7
  */
8
8
 
9
- import type { Key } from '../collections/types';
10
- import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from './types';
9
+ import type { Key } from "../collections/types";
10
+ import type { TreeCollection as ITreeCollection, TreeNode, TreeItemData } from "./types";
11
+
12
+ function getItemKey<T>(item: TreeItemData<T>): Key {
13
+ const key = item.key ?? item.id;
14
+ if (key == null) {
15
+ throw new Error("Tree items must define either a key or id.");
16
+ }
17
+ return key;
18
+ }
11
19
 
12
20
  /**
13
21
  * Creates a TreeCollection from hierarchical data.
@@ -19,10 +27,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
19
27
  private firstKey: Key | null = null;
20
28
  private lastKey: Key | null = null;
21
29
 
22
- constructor(
23
- items: TreeItemData<T>[],
24
- expandedKeys: Set<Key>
25
- ) {
30
+ constructor(items: TreeItemData<T>[], expandedKeys: Set<Key>) {
26
31
  this.buildCollection(items, expandedKeys);
27
32
  }
28
33
 
@@ -34,25 +39,27 @@ export class TreeCollection<T> implements ITreeCollection<T> {
34
39
  item: TreeItemData<T>,
35
40
  level: number,
36
41
  parentKey: Key | null,
37
- indexInParent: number
42
+ indexInParent: number,
38
43
  ): TreeNode<T> => {
39
- const hasChildren = item.children && item.children.length > 0;
40
- const isExpanded = hasChildren && expandedKeys.has(item.key);
44
+ const key = getItemKey(item);
45
+ const hasLoadedChildren = Boolean(item.children && item.children.length > 0);
46
+ const hasChildren = hasLoadedChildren || !!item.hasChildItems;
47
+ const isExpanded = hasChildren && expandedKeys.has(key);
41
48
 
42
49
  // Build child nodes first (even if not visible, for the map)
43
50
  const childNodes: TreeNode<T>[] = [];
44
- if (hasChildren && item.children) {
51
+ if (hasLoadedChildren && item.children) {
45
52
  for (let i = 0; i < item.children.length; i++) {
46
- const childNode = visit(item.children[i], level + 1, item.key, i);
53
+ const childNode = visit(item.children[i], level + 1, key, i);
47
54
  childNodes.push(childNode);
48
55
  }
49
56
  }
50
57
 
51
58
  const node: TreeNode<T> = {
52
- type: 'item',
53
- key: item.key,
54
- value: item.value,
55
- textValue: item.textValue || String(item.key),
59
+ type: "item",
60
+ key,
61
+ value: (item.value ?? item) as T,
62
+ textValue: item.textValue || String(key),
56
63
  level,
57
64
  index: indexInParent,
58
65
  parentKey,
@@ -64,7 +71,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
64
71
  };
65
72
 
66
73
  // Always add to keyMap (for getItem lookups)
67
- this.keyMap.set(item.key, node);
74
+ this.keyMap.set(key, node);
68
75
 
69
76
  return node;
70
77
  };
@@ -136,7 +143,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
136
143
  while (previousKey != null) {
137
144
  const candidate = this.keyMap.get(previousKey);
138
145
  if (!candidate) break;
139
- if (candidate.type !== 'content') {
146
+ if (candidate.type !== "content") {
140
147
  return candidate.key;
141
148
  }
142
149
  previousKey = candidate.prevKey ?? null;
@@ -150,7 +157,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
150
157
  while (nextKey != null) {
151
158
  const candidate = this.keyMap.get(nextKey);
152
159
  if (!candidate) break;
153
- if (candidate.type !== 'content') {
160
+ if (candidate.type !== "content") {
154
161
  return candidate.key;
155
162
  }
156
163
  nextKey = candidate.nextKey ?? null;
@@ -161,7 +168,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
161
168
  getFirstKey(): Key | null {
162
169
  if (this.firstKey == null) return null;
163
170
  const candidate = this.keyMap.get(this.firstKey);
164
- if (candidate?.type === 'content') {
171
+ if (candidate?.type === "content") {
165
172
  return this.getKeyAfter(candidate.key);
166
173
  }
167
174
  return this.firstKey;
@@ -170,7 +177,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
170
177
  getLastKey(): Key | null {
171
178
  if (this.lastKey == null) return null;
172
179
  const candidate = this.keyMap.get(this.lastKey);
173
- if (candidate?.type === 'content') {
180
+ if (candidate?.type === "content") {
174
181
  return this.getKeyBefore(candidate.key);
175
182
  }
176
183
  return this.lastKey;
@@ -183,7 +190,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
183
190
 
184
191
  getTextValue(key: Key): string {
185
192
  const node = this.keyMap.get(key);
186
- return node?.textValue ?? '';
193
+ return node?.textValue ?? "";
187
194
  }
188
195
 
189
196
  getParentKey(key: Key): Key | null {
@@ -202,7 +209,7 @@ export class TreeCollection<T> implements ITreeCollection<T> {
202
209
  */
203
210
  export function createTreeCollection<T>(
204
211
  items: TreeItemData<T>[],
205
- expandedKeys: Set<Key>
212
+ expandedKeys: Set<Key>,
206
213
  ): TreeCollection<T> {
207
214
  return new TreeCollection(items, expandedKeys);
208
215
  }
@@ -4,11 +4,14 @@
4
4
  *
5
5
  * Manages expansion state, selection, and focus for hierarchical tree data.
6
6
  */
7
- import { type Accessor } from 'solid-js';
8
- import type { TreeState, TreeStateOptions, TreeCollection } from './types';
7
+ import { type Accessor } from "solid-js";
8
+ import type { TreeState, TreeStateOptions, TreeCollection } from "./types";
9
9
  /**
10
10
  * Creates state management for a tree component.
11
11
  * Handles expansion, selection, focus management, and keyboard navigation state.
12
12
  */
13
- export declare function createTreeState<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(options: Accessor<TreeStateOptions<T, C>>): TreeState<T, C>;
14
- //# sourceMappingURL=createTreeState.d.ts.map
13
+ export declare function createTreeState<
14
+ T extends object,
15
+ C extends TreeCollection<T> = TreeCollection<T>,
16
+ >(options: Accessor<TreeStateOptions<T, C>>): TreeState<T, C>;
17
+ //# sourceMappingURL=createTreeState.d.ts.map
@@ -5,21 +5,16 @@
5
5
  * Manages expansion state, selection, and focus for hierarchical tree data.
6
6
  */
7
7
 
8
- import { createSignal, createEffect, createMemo, on, type Accessor } from 'solid-js';
9
- import type {
10
- TreeState,
11
- TreeStateOptions,
12
- TreeCollection,
13
- TreeNode,
14
- } from './types';
15
- import type { Key, FocusStrategy } from '../collections/types';
8
+ import { createSignal, createEffect, createMemo, on, type Accessor } from "solid-js";
9
+ import type { TreeState, TreeStateOptions, TreeCollection } from "./types";
10
+ import type { Key, FocusStrategy, Selection, SelectionBehavior } from "../collections/types";
16
11
 
17
12
  /**
18
13
  * Creates state management for a tree component.
19
14
  * Handles expansion, selection, focus management, and keyboard navigation state.
20
15
  */
21
16
  export function createTreeState<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(
22
- options: Accessor<TreeStateOptions<T, C>>
17
+ options: Accessor<TreeStateOptions<T, C>>,
23
18
  ): TreeState<T, C> {
24
19
  const getOptions = () => options();
25
20
 
@@ -31,7 +26,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
31
26
 
32
27
  // Expansion state (uncontrolled)
33
28
  const [internalExpandedKeys, setInternalExpandedKeys] = createSignal<Set<Key>>(
34
- getInitialExpandedKeys(getOptions().defaultExpandedKeys)
29
+ getInitialExpandedKeys(getOptions().defaultExpandedKeys),
35
30
  );
36
31
 
37
32
  // Computed expanded keys (controlled or uncontrolled)
@@ -56,8 +51,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
56
51
  const [isKeyboardNavigationDisabled, setKeyboardNavigationDisabled] = createSignal(false);
57
52
 
58
53
  // Selection state
59
- const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<'all' | Set<Key>>(
60
- getInitialSelection(getOptions().defaultSelectedKeys)
54
+ const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<"all" | Set<Key>>(
55
+ getInitialSelection(getOptions().defaultSelectedKeys),
61
56
  );
62
57
  const [anchorKey, setAnchorKey] = createSignal<Key | null>(null);
63
58
 
@@ -70,13 +65,30 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
70
65
  return internalSelectedKeys();
71
66
  });
72
67
 
73
- const selectionMode = createMemo(() => getOptions().selectionMode ?? 'none');
74
- const selectionBehavior = createMemo(() => getOptions().selectionBehavior ?? 'toggle');
68
+ const selectionMode = createMemo(() => getOptions().selectionMode ?? "none");
69
+ const selectionBehaviorProp = (): SelectionBehavior => getOptions().selectionBehavior ?? "toggle";
70
+ const [selectionBehaviorState, setSelectionBehaviorState] =
71
+ createSignal<SelectionBehavior>(selectionBehaviorProp());
72
+ const selectionBehavior = createMemo(() => selectionBehaviorState());
75
73
  const disallowEmptySelection = createMemo(() => getOptions().disallowEmptySelection ?? false);
76
- const disabledBehavior = createMemo(() => getOptions().disabledBehavior ?? 'all');
74
+ const disabledBehavior = createMemo(() => getOptions().disabledBehavior ?? "all");
75
+
76
+ createEffect(on(selectionBehaviorProp, (behavior) => setSelectionBehaviorState(behavior)));
77
+
78
+ createEffect(() => {
79
+ const keys = selectedKeys();
80
+ if (
81
+ selectionBehaviorProp() === "replace" &&
82
+ selectionBehaviorState() === "toggle" &&
83
+ keys !== "all" &&
84
+ keys.size === 0
85
+ ) {
86
+ setSelectionBehaviorState("replace");
87
+ }
88
+ });
77
89
 
78
90
  // Set focused key
79
- const setFocusedKey = (key: Key | null, strategy: FocusStrategy = 'first') => {
91
+ const setFocusedKey = (key: Key | null, strategy: FocusStrategy = "first") => {
80
92
  setFocusedKeyInternal(key);
81
93
  setChildFocusStrategy(strategy);
82
94
  };
@@ -132,25 +144,25 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
132
144
  }
133
145
 
134
146
  cachedCollection = coll;
135
- })
147
+ }),
136
148
  );
137
149
 
138
150
  // Selection methods
139
151
  const isSelected = (key: Key): boolean => {
140
152
  const keys = selectedKeys();
141
- if (keys === 'all') return true;
153
+ if (keys === "all") return true;
142
154
  return keys.has(key);
143
155
  };
144
156
 
145
157
  const isDisabled = (key: Key): boolean => {
146
- return disabledKeys().has(key);
158
+ return disabledKeys().has(key) || collection().getItem(key)?.isDisabled === true;
147
159
  };
148
160
 
149
161
  const isExpanded = (key: Key): boolean => {
150
162
  return expandedKeys().has(key);
151
163
  };
152
164
 
153
- const updateSelection = (newSelection: 'all' | Set<Key>) => {
165
+ const updateSelection = (newSelection: "all" | Set<Key>) => {
154
166
  const opts = getOptions();
155
167
 
156
168
  // Controlled mode
@@ -162,8 +174,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
162
174
  // Uncontrolled mode
163
175
  const current = internalSelectedKeys();
164
176
  const isDifferent =
165
- current === 'all' ||
166
- newSelection === 'all' ||
177
+ current === "all" ||
178
+ newSelection === "all" ||
167
179
  current.size !== (newSelection as Set<Key>).size ||
168
180
  ![...current].every((k) => (newSelection as Set<Key>).has(k));
169
181
 
@@ -174,12 +186,14 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
174
186
  };
175
187
 
176
188
  const toggleSelection = (key: Key) => {
177
- if (isDisabled(key) && disabledBehavior() === 'all') return;
178
- if (selectionMode() === 'none') return;
189
+ // Disabled keys are never selectable, regardless of disabledBehavior
190
+ // (mirrors SelectionManager.canSelectItem, which ignores disabledBehavior).
191
+ if (isDisabled(key)) return;
192
+ if (selectionMode() === "none") return;
179
193
 
180
194
  const current = selectedKeys();
181
195
 
182
- if (selectionMode() === 'single') {
196
+ if (selectionMode() === "single") {
183
197
  if (isSelected(key) && !disallowEmptySelection()) {
184
198
  updateSelection(new Set());
185
199
  } else {
@@ -189,7 +203,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
189
203
  }
190
204
 
191
205
  // Multiple selection
192
- if (current === 'all') {
206
+ if (current === "all") {
193
207
  // Can't toggle when all selected without knowing all keys
194
208
  return;
195
209
  }
@@ -208,16 +222,20 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
208
222
  };
209
223
 
210
224
  const replaceSelection = (key: Key) => {
211
- if (isDisabled(key) && disabledBehavior() === 'all') return;
212
- if (selectionMode() === 'none') return;
225
+ if (isDisabled(key)) return;
226
+ if (selectionMode() === "none") return;
213
227
 
214
228
  updateSelection(new Set([key]));
215
229
  setAnchorKey(key);
216
230
  };
217
231
 
232
+ const setSelectedKeys = (keys: Selection | Iterable<Key>) => {
233
+ updateSelection(normalizeSelection(keys));
234
+ };
235
+
218
236
  const extendSelection = (toKey: Key) => {
219
- if (isDisabled(toKey) && disabledBehavior() === 'all') return;
220
- if (selectionMode() !== 'multiple') {
237
+ if (isDisabled(toKey)) return;
238
+ if (selectionMode() !== "multiple") {
221
239
  replaceSelection(toKey);
222
240
  return;
223
241
  }
@@ -229,7 +247,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
229
247
  }
230
248
 
231
249
  const coll = collection();
232
- const rows = coll.rows.filter((r) => r.type === 'item');
250
+ const rows = coll.rows.filter((r) => r.type === "item");
233
251
  const keys = rows.map((r) => r.key);
234
252
  const anchorIndex = keys.indexOf(anchor);
235
253
  const toIndex = keys.indexOf(toKey);
@@ -247,8 +265,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
247
265
  };
248
266
 
249
267
  const selectAll = () => {
250
- if (selectionMode() !== 'multiple') return;
251
- updateSelection('all');
268
+ if (selectionMode() !== "multiple") return;
269
+ updateSelection("all");
252
270
  };
253
271
 
254
272
  const clearSelection = () => {
@@ -257,9 +275,9 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
257
275
  };
258
276
 
259
277
  const toggleSelectAll = () => {
260
- if (selectionMode() !== 'multiple') return;
278
+ if (selectionMode() !== "multiple") return;
261
279
 
262
- if (selectedKeys() === 'all') {
280
+ if (selectedKeys() === "all") {
263
281
  clearSelection();
264
282
  } else {
265
283
  selectAll();
@@ -284,7 +302,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
284
302
  const toggleKey = (key: Key) => {
285
303
  const node = collection().getItem(key);
286
304
  if (!node || !node.isExpandable) return;
287
- if (isDisabled(key) && disabledBehavior() === 'all') return;
305
+ if (isDisabled(key) && disabledBehavior() === "all") return;
288
306
 
289
307
  const current = expandedKeys();
290
308
  const newKeys = new Set(current);
@@ -301,7 +319,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
301
319
  const expandKey = (key: Key) => {
302
320
  const node = collection().getItem(key);
303
321
  if (!node || !node.isExpandable) return;
304
- if (isDisabled(key) && disabledBehavior() === 'all') return;
322
+ if (isDisabled(key) && disabledBehavior() === "all") return;
305
323
 
306
324
  const current = expandedKeys();
307
325
  if (current.has(key)) return;
@@ -314,7 +332,7 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
314
332
  const collapseKey = (key: Key) => {
315
333
  const node = collection().getItem(key);
316
334
  if (!node || !node.isExpandable) return;
317
- if (isDisabled(key) && disabledBehavior() === 'all') return;
335
+ if (isDisabled(key) && disabledBehavior() === "all") return;
318
336
 
319
337
  const current = expandedKeys();
320
338
  if (!current.has(key)) return;
@@ -335,6 +353,9 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
335
353
  get disabledKeys() {
336
354
  return disabledKeys();
337
355
  },
356
+ get disabledBehavior() {
357
+ return disabledBehavior();
358
+ },
338
359
  get expandedKeys() {
339
360
  return expandedKeys();
340
361
  },
@@ -353,6 +374,12 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
353
374
  get selectionMode() {
354
375
  return selectionMode();
355
376
  },
377
+ get selectionBehavior() {
378
+ return selectionBehavior();
379
+ },
380
+ get disallowEmptySelection() {
381
+ return disallowEmptySelection();
382
+ },
356
383
  get selectedKeys() {
357
384
  return selectedKeys();
358
385
  },
@@ -363,6 +390,8 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
363
390
  setFocused: setIsFocused,
364
391
  toggleSelection,
365
392
  replaceSelection,
393
+ setSelectedKeys,
394
+ setSelectionBehavior: setSelectionBehaviorState,
366
395
  extendSelection,
367
396
  selectAll,
368
397
  clearSelection,
@@ -376,13 +405,13 @@ export function createTreeState<T extends object, C extends TreeCollection<T> =
376
405
  }
377
406
 
378
407
  // Helper functions
379
- function getInitialSelection(defaultKeys?: 'all' | Iterable<Key>): 'all' | Set<Key> {
408
+ function getInitialSelection(defaultKeys?: "all" | Iterable<Key>): "all" | Set<Key> {
380
409
  if (defaultKeys === undefined) return new Set();
381
410
  return normalizeSelection(defaultKeys);
382
411
  }
383
412
 
384
- function normalizeSelection(keys: 'all' | Iterable<Key>): 'all' | Set<Key> {
385
- if (keys === 'all') return 'all';
413
+ function normalizeSelection(keys: "all" | Iterable<Key>): "all" | Set<Key> {
414
+ if (keys === "all") return "all";
386
415
  return new Set(keys);
387
416
  }
388
417
 
@@ -1,7 +1,13 @@
1
1
  /**
2
2
  * Tree state management exports.
3
3
  */
4
- export { createTreeState } from './createTreeState';
5
- export { TreeCollection, createTreeCollection } from './TreeCollection';
6
- export type { TreeState, TreeStateOptions, TreeCollection as TreeCollectionInterface, TreeNode, TreeItemData, } from './types';
7
- //# sourceMappingURL=index.d.ts.map
4
+ export { createTreeState } from "./createTreeState";
5
+ export { TreeCollection, createTreeCollection } from "./TreeCollection";
6
+ export type {
7
+ TreeState,
8
+ TreeStateOptions,
9
+ TreeCollection as TreeCollectionInterface,
10
+ TreeNode,
11
+ TreeItemData,
12
+ } from "./types";
13
+ //# sourceMappingURL=index.d.ts.map
package/src/tree/index.ts CHANGED
@@ -2,12 +2,12 @@
2
2
  * Tree state management exports.
3
3
  */
4
4
 
5
- export { createTreeState } from './createTreeState';
6
- export { TreeCollection, createTreeCollection } from './TreeCollection';
5
+ export { createTreeState } from "./createTreeState";
6
+ export { TreeCollection, createTreeCollection } from "./TreeCollection";
7
7
  export type {
8
8
  TreeState,
9
9
  TreeStateOptions,
10
10
  TreeCollection as TreeCollectionInterface,
11
11
  TreeNode,
12
12
  TreeItemData,
13
- } from './types';
13
+ } from "./types";