@react-aria/selection 3.0.0-alpha.1 → 3.0.0-nightly-641446f65-240905
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.
- package/README.md +1 -1
- package/dist/DOMLayoutDelegate.main.js +53 -0
- package/dist/DOMLayoutDelegate.main.js.map +1 -0
- package/dist/DOMLayoutDelegate.mjs +48 -0
- package/dist/DOMLayoutDelegate.module.js +48 -0
- package/dist/DOMLayoutDelegate.module.js.map +1 -0
- package/dist/ListKeyboardDelegate.main.js +189 -0
- package/dist/ListKeyboardDelegate.main.js.map +1 -0
- package/dist/ListKeyboardDelegate.mjs +184 -0
- package/dist/ListKeyboardDelegate.module.js +184 -0
- package/dist/ListKeyboardDelegate.module.js.map +1 -0
- package/dist/import.mjs +27 -0
- package/dist/main.js +16 -608
- package/dist/main.js.map +1 -0
- package/dist/module.js +9 -563
- package/dist/module.js.map +1 -0
- package/dist/types.d.ts +218 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/useSelectableCollection.main.js +318 -0
- package/dist/useSelectableCollection.main.js.map +1 -0
- package/dist/useSelectableCollection.mjs +313 -0
- package/dist/useSelectableCollection.module.js +313 -0
- package/dist/useSelectableCollection.module.js.map +1 -0
- package/dist/useSelectableItem.main.js +213 -0
- package/dist/useSelectableItem.main.js.map +1 -0
- package/dist/useSelectableItem.mjs +208 -0
- package/dist/useSelectableItem.module.js +208 -0
- package/dist/useSelectableItem.module.js.map +1 -0
- package/dist/useSelectableList.main.js +63 -0
- package/dist/useSelectableList.main.js.map +1 -0
- package/dist/useSelectableList.mjs +58 -0
- package/dist/useSelectableList.module.js +58 -0
- package/dist/useSelectableList.module.js.map +1 -0
- package/dist/useTypeSelect.main.js +73 -0
- package/dist/useTypeSelect.main.js.map +1 -0
- package/dist/useTypeSelect.mjs +68 -0
- package/dist/useTypeSelect.module.js +68 -0
- package/dist/useTypeSelect.module.js.map +1 -0
- package/dist/utils.main.js +32 -0
- package/dist/utils.main.js.map +1 -0
- package/dist/utils.mjs +26 -0
- package/dist/utils.module.js +26 -0
- package/dist/utils.module.js.map +1 -0
- package/package.json +20 -13
- package/src/DOMLayoutDelegate.ts +57 -0
- package/src/ListKeyboardDelegate.ts +288 -0
- package/src/index.ts +23 -0
- package/src/useSelectableCollection.ts +490 -0
- package/src/useSelectableItem.ts +374 -0
- package/src/useSelectableList.ts +85 -0
- package/src/useTypeSelect.ts +114 -0
- package/src/utils.ts +33 -0
- package/LICENSE +0 -201
package/dist/module.js
CHANGED
|
@@ -1,370 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
keyboardDelegate,
|
|
8
|
-
selectionManager,
|
|
9
|
-
onTypeSelect
|
|
10
|
-
} = options;
|
|
11
|
-
let state = useRef({
|
|
12
|
-
search: '',
|
|
13
|
-
timeout: null
|
|
14
|
-
}).current;
|
|
15
|
-
|
|
16
|
-
let onKeyDown = e => {
|
|
17
|
-
let character = $c52757753013b75867e6437272e1c64e$var$getStringForKey(e.key);
|
|
18
|
-
|
|
19
|
-
if (!character) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
state.search += character; // Use the delegate to find a key to focus.
|
|
24
|
-
// Prioritize items after the currently focused item, falling back to searching the whole list.
|
|
25
|
-
|
|
26
|
-
let key = keyboardDelegate.getKeyForSearch(state.search, selectionManager.focusedKey);
|
|
27
|
-
|
|
28
|
-
if (!key) {
|
|
29
|
-
key = keyboardDelegate.getKeyForSearch(state.search);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (key) {
|
|
33
|
-
selectionManager.setFocusedKey(key);
|
|
34
|
-
|
|
35
|
-
if (onTypeSelect) {
|
|
36
|
-
onTypeSelect(key);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
clearTimeout(state.timeout);
|
|
41
|
-
state.timeout = setTimeout(() => {
|
|
42
|
-
state.search = '';
|
|
43
|
-
}, 500);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
return {
|
|
47
|
-
typeSelectProps: {
|
|
48
|
-
onKeyDown: keyboardDelegate.getKeyForSearch ? onKeyDown : null
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function $c52757753013b75867e6437272e1c64e$var$getStringForKey(key) {
|
|
54
|
-
// If the key is of length 1, it is an ASCII value.
|
|
55
|
-
// Otherwise, if there are no ASCII characters in the key name,
|
|
56
|
-
// it is a Unicode character.
|
|
57
|
-
// See https://www.w3.org/TR/uievents-key/
|
|
58
|
-
if (key.length === 1 || !/^[A-Z]/i.test(key)) {
|
|
59
|
-
return key;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return '';
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const $bcc7c0067661ae56b1d5dd7c698d093$var$isMac = typeof window !== 'undefined' && window.navigator != null ? /^Mac/.test(window.navigator.platform) : false;
|
|
66
|
-
|
|
67
|
-
function $bcc7c0067661ae56b1d5dd7c698d093$var$isCtrlKeyPressed(e) {
|
|
68
|
-
if ($bcc7c0067661ae56b1d5dd7c698d093$var$isMac) {
|
|
69
|
-
return e.metaKey;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return e.ctrlKey;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function useSelectableCollection(options) {
|
|
76
|
-
let {
|
|
77
|
-
selectionManager: manager,
|
|
78
|
-
keyboardDelegate: delegate,
|
|
79
|
-
autoFocus = false,
|
|
80
|
-
shouldFocusWrap = false,
|
|
81
|
-
disallowEmptySelection = false,
|
|
82
|
-
disallowSelectAll = false
|
|
83
|
-
} = options;
|
|
84
|
-
|
|
85
|
-
let onKeyDown = e => {
|
|
86
|
-
switch (e.key) {
|
|
87
|
-
case 'ArrowDown':
|
|
88
|
-
{
|
|
89
|
-
if (delegate.getKeyBelow) {
|
|
90
|
-
e.preventDefault();
|
|
91
|
-
let nextKey = delegate.getKeyBelow(manager.focusedKey);
|
|
92
|
-
|
|
93
|
-
if (nextKey) {
|
|
94
|
-
manager.setFocusedKey(nextKey);
|
|
95
|
-
} else if (shouldFocusWrap) {
|
|
96
|
-
manager.setFocusedKey(delegate.getFirstKey());
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (e.shiftKey && manager.selectionMode === 'multiple') {
|
|
100
|
-
manager.extendSelection(nextKey);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
case 'ArrowUp':
|
|
108
|
-
{
|
|
109
|
-
if (delegate.getKeyAbove) {
|
|
110
|
-
e.preventDefault();
|
|
111
|
-
let nextKey = delegate.getKeyAbove(manager.focusedKey);
|
|
112
|
-
|
|
113
|
-
if (nextKey) {
|
|
114
|
-
manager.setFocusedKey(nextKey);
|
|
115
|
-
} else if (shouldFocusWrap) {
|
|
116
|
-
manager.setFocusedKey(delegate.getLastKey());
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (e.shiftKey && manager.selectionMode === 'multiple') {
|
|
120
|
-
manager.extendSelection(nextKey);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
break;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
case 'ArrowLeft':
|
|
128
|
-
{
|
|
129
|
-
if (delegate.getKeyLeftOf) {
|
|
130
|
-
e.preventDefault();
|
|
131
|
-
let nextKey = delegate.getKeyLeftOf(manager.focusedKey);
|
|
132
|
-
|
|
133
|
-
if (nextKey) {
|
|
134
|
-
manager.setFocusedKey(nextKey);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (e.shiftKey && manager.selectionMode === 'multiple') {
|
|
138
|
-
manager.extendSelection(nextKey);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
case 'ArrowRight':
|
|
146
|
-
{
|
|
147
|
-
if (delegate.getKeyRightOf) {
|
|
148
|
-
e.preventDefault();
|
|
149
|
-
let nextKey = delegate.getKeyRightOf(manager.focusedKey);
|
|
150
|
-
|
|
151
|
-
if (nextKey) {
|
|
152
|
-
manager.setFocusedKey(nextKey);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (e.shiftKey && manager.selectionMode === 'multiple') {
|
|
156
|
-
manager.extendSelection(nextKey);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
case 'Home':
|
|
164
|
-
if (delegate.getFirstKey) {
|
|
165
|
-
e.preventDefault();
|
|
166
|
-
let firstKey = delegate.getFirstKey();
|
|
167
|
-
manager.setFocusedKey(firstKey);
|
|
168
|
-
|
|
169
|
-
if ($bcc7c0067661ae56b1d5dd7c698d093$var$isCtrlKeyPressed(e) && e.shiftKey && manager.selectionMode === 'multiple') {
|
|
170
|
-
manager.extendSelection(firstKey);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
break;
|
|
175
|
-
|
|
176
|
-
case 'End':
|
|
177
|
-
if (delegate.getLastKey) {
|
|
178
|
-
e.preventDefault();
|
|
179
|
-
let lastKey = delegate.getLastKey();
|
|
180
|
-
manager.setFocusedKey(lastKey);
|
|
181
|
-
|
|
182
|
-
if ($bcc7c0067661ae56b1d5dd7c698d093$var$isCtrlKeyPressed(e) && e.shiftKey && manager.selectionMode === 'multiple') {
|
|
183
|
-
manager.extendSelection(lastKey);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
break;
|
|
188
|
-
|
|
189
|
-
case 'PageDown':
|
|
190
|
-
if (delegate.getKeyPageBelow) {
|
|
191
|
-
e.preventDefault();
|
|
192
|
-
let nextKey = delegate.getKeyPageBelow(manager.focusedKey);
|
|
193
|
-
|
|
194
|
-
if (nextKey) {
|
|
195
|
-
manager.setFocusedKey(nextKey);
|
|
196
|
-
|
|
197
|
-
if (e.shiftKey && manager.selectionMode === 'multiple') {
|
|
198
|
-
manager.extendSelection(nextKey);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
break;
|
|
204
|
-
|
|
205
|
-
case 'PageUp':
|
|
206
|
-
if (delegate.getKeyPageAbove) {
|
|
207
|
-
e.preventDefault();
|
|
208
|
-
let nextKey = delegate.getKeyPageAbove(manager.focusedKey);
|
|
209
|
-
|
|
210
|
-
if (nextKey) {
|
|
211
|
-
manager.setFocusedKey(nextKey);
|
|
212
|
-
|
|
213
|
-
if (e.shiftKey && manager.selectionMode === 'multiple') {
|
|
214
|
-
manager.extendSelection(nextKey);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
break;
|
|
220
|
-
|
|
221
|
-
case 'a':
|
|
222
|
-
if ($bcc7c0067661ae56b1d5dd7c698d093$var$isCtrlKeyPressed(e) && manager.selectionMode === 'multiple' && disallowSelectAll !== true) {
|
|
223
|
-
e.preventDefault();
|
|
224
|
-
manager.selectAll();
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
break;
|
|
228
|
-
|
|
229
|
-
case 'Escape':
|
|
230
|
-
e.preventDefault();
|
|
231
|
-
|
|
232
|
-
if (!disallowEmptySelection) {
|
|
233
|
-
manager.clearSelection();
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
break;
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
|
|
240
|
-
let onFocus = e => {
|
|
241
|
-
manager.setFocused(true);
|
|
242
|
-
|
|
243
|
-
if (manager.focusedKey == null && e.target === e.currentTarget) {
|
|
244
|
-
// If the user hasn't yet interacted with the collection, there will be no focusedKey set.
|
|
245
|
-
// Attempt to detect whether the user is tabbing forward or backward into the collection
|
|
246
|
-
// and either focus the first or last item accordingly.
|
|
247
|
-
let relatedTarget = e.relatedTarget;
|
|
248
|
-
|
|
249
|
-
if (relatedTarget && e.currentTarget.compareDocumentPosition(relatedTarget) & Node.DOCUMENT_POSITION_FOLLOWING) {
|
|
250
|
-
manager.setFocusedKey(delegate.getLastKey());
|
|
251
|
-
} else {
|
|
252
|
-
manager.setFocusedKey(delegate.getFirstKey());
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
let onBlur = () => {
|
|
258
|
-
manager.setFocused(false);
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
useEffect(() => {
|
|
262
|
-
if (autoFocus) {
|
|
263
|
-
manager.setFocused(true); // By default, select first item for focus target
|
|
264
|
-
|
|
265
|
-
let focusedKey = delegate.getFirstKey();
|
|
266
|
-
let selectedKeys = manager.selectedKeys; // Set the last item as the new focus target if autoFocus is 'last' (i.e. ArrowUp opening the menu)
|
|
267
|
-
|
|
268
|
-
if (autoFocus === 'last') {
|
|
269
|
-
focusedKey = delegate.getLastKey();
|
|
270
|
-
} // If there are any selected keys, make the first one the new focus target
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
if (selectedKeys.size) {
|
|
274
|
-
focusedKey = selectedKeys.values().next().value;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
manager.setFocusedKey(focusedKey);
|
|
278
|
-
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
279
|
-
|
|
280
|
-
}, []);
|
|
281
|
-
let {
|
|
282
|
-
typeSelectProps
|
|
283
|
-
} = useTypeSelect({
|
|
284
|
-
keyboardDelegate: delegate,
|
|
285
|
-
selectionManager: manager
|
|
286
|
-
});
|
|
287
|
-
return {
|
|
288
|
-
collectionProps: mergeProps(typeSelectProps, {
|
|
289
|
-
onKeyDown,
|
|
290
|
-
onFocus,
|
|
291
|
-
onBlur
|
|
292
|
-
})
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
export function useSelectableItem(options) {
|
|
296
|
-
let {
|
|
297
|
-
selectionManager: manager,
|
|
298
|
-
itemKey,
|
|
299
|
-
itemRef,
|
|
300
|
-
shouldSelectOnPressUp,
|
|
301
|
-
isVirtualized
|
|
302
|
-
} = options;
|
|
303
|
-
|
|
304
|
-
let onSelect = e => {
|
|
305
|
-
if (manager.selectionMode === 'none') {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
if (manager.selectionMode === 'single') {
|
|
310
|
-
if (manager.selectedKeys.has(itemKey)) {
|
|
311
|
-
manager.toggleSelection(itemKey);
|
|
312
|
-
} else {
|
|
313
|
-
manager.replaceSelection(itemKey);
|
|
314
|
-
}
|
|
315
|
-
} else if (e.shiftKey) {
|
|
316
|
-
manager.extendSelection(itemKey);
|
|
317
|
-
} else if (manager) {
|
|
318
|
-
manager.toggleSelection(itemKey);
|
|
319
|
-
}
|
|
320
|
-
}; // Focus the associated DOM node when this item becomes the focusedKey
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
let isFocused = itemKey === manager.focusedKey;
|
|
324
|
-
useEffect(() => {
|
|
325
|
-
if (isFocused && manager.isFocused && document.activeElement !== itemRef.current) {
|
|
326
|
-
focusWithoutScrolling(itemRef.current);
|
|
327
|
-
}
|
|
328
|
-
}, [itemRef, isFocused, manager.focusedKey, manager.isFocused]);
|
|
329
|
-
let itemProps = {
|
|
330
|
-
tabIndex: isFocused ? 0 : -1,
|
|
331
|
-
|
|
332
|
-
onFocus() {
|
|
333
|
-
manager.setFocusedKey(itemKey);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
}; // By default, selection occurs on pointer down. This can be strange if selecting an
|
|
337
|
-
// item causes the UI to disappear immediately (e.g. menuts).
|
|
338
|
-
// If shouldSelectOnPressUp is true, we use onPressUp instead of onPressStart.
|
|
339
|
-
// onPress requires a pointer down event on the same element as pointer up. For menus,
|
|
340
|
-
// we want to be able to have the pointer down on the trigger that opens the menu and
|
|
341
|
-
// the pointer up on the menu item rather than requiring a separate press.
|
|
342
|
-
// For keyboard events, selection still occurrs on key down.
|
|
343
|
-
|
|
344
|
-
if (shouldSelectOnPressUp) {
|
|
345
|
-
itemProps.onPressStart = e => {
|
|
346
|
-
if (e.pointerType === 'keyboard') {
|
|
347
|
-
onSelect(e);
|
|
348
|
-
}
|
|
349
|
-
};
|
|
350
|
-
|
|
351
|
-
itemProps.onPressUp = e => {
|
|
352
|
-
if (e.pointerType !== 'keyboard') {
|
|
353
|
-
onSelect(e);
|
|
354
|
-
}
|
|
355
|
-
};
|
|
356
|
-
} else {
|
|
357
|
-
itemProps.onPressStart = onSelect;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
if (!isVirtualized) {
|
|
361
|
-
itemProps['data-key'] = itemKey;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
return {
|
|
365
|
-
itemProps
|
|
366
|
-
};
|
|
367
|
-
}
|
|
1
|
+
import {useSelectableCollection as $ae20dd8cbca75726$export$d6daf82dcd84e87c} from "./useSelectableCollection.module.js";
|
|
2
|
+
import {useSelectableItem as $880e95eb8b93ba9a$export$ecf600387e221c37} from "./useSelectableItem.module.js";
|
|
3
|
+
import {useSelectableList as $982254629710d113$export$b95089534ab7c1fd} from "./useSelectableList.module.js";
|
|
4
|
+
import {ListKeyboardDelegate as $2a25aae57d74318e$export$a05409b8bb224a5a} from "./ListKeyboardDelegate.module.js";
|
|
5
|
+
import {DOMLayoutDelegate as $657e4dc4a6e88df0$export$8f5ed9ff9f511381} from "./DOMLayoutDelegate.module.js";
|
|
6
|
+
import {useTypeSelect as $fb3050f43d946246$export$e32c88dfddc6e1d8} from "./useTypeSelect.module.js";
|
|
368
7
|
|
|
369
8
|
/*
|
|
370
9
|
* Copyright 2020 Adobe. All rights reserved.
|
|
@@ -376,206 +15,13 @@ export function useSelectableItem(options) {
|
|
|
376
15
|
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
377
16
|
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
378
17
|
* governing permissions and limitations under the License.
|
|
379
|
-
*/
|
|
380
|
-
export class ListKeyboardDelegate {
|
|
381
|
-
constructor(collection, ref, collator) {
|
|
382
|
-
_babelRuntimeHelpersEsmDefineProperty(this, "collection", void 0);
|
|
383
|
-
|
|
384
|
-
_babelRuntimeHelpersEsmDefineProperty(this, "ref", void 0);
|
|
385
|
-
|
|
386
|
-
_babelRuntimeHelpersEsmDefineProperty(this, "collator", void 0);
|
|
387
|
-
|
|
388
|
-
this.collection = collection;
|
|
389
|
-
this.ref = ref;
|
|
390
|
-
this.collator = collator;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
getKeyBelow(key) {
|
|
394
|
-
key = this.collection.getKeyAfter(key);
|
|
395
|
-
|
|
396
|
-
while (key) {
|
|
397
|
-
let item = this.collection.getItem(key);
|
|
398
|
-
|
|
399
|
-
if (item.type === 'item' && !item.isDisabled) {
|
|
400
|
-
return key;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
key = this.collection.getKeyAfter(key);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
getKeyAbove(key) {
|
|
408
|
-
key = this.collection.getKeyBefore(key);
|
|
409
|
-
|
|
410
|
-
while (key) {
|
|
411
|
-
let item = this.collection.getItem(key);
|
|
412
|
-
|
|
413
|
-
if (item.type === 'item' && !item.isDisabled) {
|
|
414
|
-
return key;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
key = this.collection.getKeyBefore(key);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
getFirstKey() {
|
|
422
|
-
let key = this.collection.getFirstKey();
|
|
423
|
-
|
|
424
|
-
while (key) {
|
|
425
|
-
let item = this.collection.getItem(key);
|
|
426
|
-
|
|
427
|
-
if (item.type === 'item' && !item.isDisabled) {
|
|
428
|
-
return key;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
key = this.collection.getKeyAfter(key);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
getLastKey() {
|
|
436
|
-
let key = this.collection.getLastKey();
|
|
437
|
-
|
|
438
|
-
while (key) {
|
|
439
|
-
let item = this.collection.getItem(key);
|
|
440
|
-
|
|
441
|
-
if (item.type === 'item' && !item.isDisabled) {
|
|
442
|
-
return key;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
key = this.collection.getKeyBefore(key);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
getItem(key) {
|
|
450
|
-
return this.ref.current.querySelector("[data-key=\"".concat(key, "\"]"));
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
getKeyPageAbove(key) {
|
|
454
|
-
let menu = this.ref.current;
|
|
455
|
-
let item = this.getItem(key);
|
|
456
|
-
|
|
457
|
-
if (!item) {
|
|
458
|
-
return null;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
let pageY = Math.max(0, item.offsetTop + item.offsetHeight - menu.offsetHeight);
|
|
462
|
-
|
|
463
|
-
while (item && item.offsetTop > pageY) {
|
|
464
|
-
key = this.getKeyAbove(key);
|
|
465
|
-
item = this.getItem(key);
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
return key;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
getKeyPageBelow(key) {
|
|
472
|
-
let menu = this.ref.current;
|
|
473
|
-
let item = this.getItem(key);
|
|
474
|
-
|
|
475
|
-
if (!item) {
|
|
476
|
-
return null;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
let pageY = Math.min(menu.scrollHeight, item.offsetTop - item.offsetHeight + menu.offsetHeight);
|
|
480
|
-
|
|
481
|
-
while (item && item.offsetTop < pageY) {
|
|
482
|
-
key = this.getKeyBelow(key);
|
|
483
|
-
item = this.getItem(key);
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
return key;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
getKeyForSearch(search, fromKey) {
|
|
490
|
-
if (!this.collator) {
|
|
491
|
-
return null;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
let collection = this.collection;
|
|
495
|
-
let key = fromKey ? this.getKeyBelow(fromKey) : this.getFirstKey();
|
|
496
|
-
|
|
497
|
-
while (key) {
|
|
498
|
-
let item = collection.getItem(key);
|
|
499
|
-
let substring = item.textValue.slice(0, search.length);
|
|
500
|
-
|
|
501
|
-
if (item.textValue && this.collator.compare(substring, search) === 0) {
|
|
502
|
-
return key;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
key = this.getKeyBelow(key);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
return null;
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
}
|
|
512
|
-
export function useSelectableList(props) {
|
|
513
|
-
let {
|
|
514
|
-
selectionManager,
|
|
515
|
-
collection,
|
|
516
|
-
ref,
|
|
517
|
-
keyboardDelegate,
|
|
518
|
-
autoFocus,
|
|
519
|
-
shouldFocusWrap,
|
|
520
|
-
isVirtualized,
|
|
521
|
-
disallowEmptySelection
|
|
522
|
-
} = props; // By default, a KeyboardDelegate is provided which uses the DOM to query layout information (e.g. for page up/page down).
|
|
523
|
-
// When virtualized, the layout object will be passed in as a prop and override this.
|
|
18
|
+
*/
|
|
524
19
|
|
|
525
|
-
let collator = useCollator({
|
|
526
|
-
usage: 'search',
|
|
527
|
-
sensitivity: 'base'
|
|
528
|
-
});
|
|
529
|
-
let delegate = useMemo(() => keyboardDelegate || new ListKeyboardDelegate(collection, ref, collator), [keyboardDelegate, collection, ref, collator]); // If not virtualized, scroll the focused element into view when the focusedKey changes.
|
|
530
|
-
// When virtualized, CollectionView handles this internally.
|
|
531
20
|
|
|
532
|
-
useEffect(() => {
|
|
533
|
-
if (!isVirtualized && selectionManager.focusedKey) {
|
|
534
|
-
let element = ref.current.querySelector("[data-key=\"".concat(selectionManager.focusedKey, "\"]"));
|
|
535
21
|
|
|
536
|
-
if (element) {
|
|
537
|
-
$d628da5f2816d7464aa7d4edf8d3eb81$var$scrollIntoView(ref.current, element);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
}, [isVirtualized, ref, selectionManager.focusedKey]);
|
|
541
|
-
let {
|
|
542
|
-
collectionProps
|
|
543
|
-
} = useSelectableCollection({
|
|
544
|
-
selectionManager,
|
|
545
|
-
keyboardDelegate: delegate,
|
|
546
|
-
autoFocus,
|
|
547
|
-
shouldFocusWrap,
|
|
548
|
-
disallowEmptySelection
|
|
549
|
-
});
|
|
550
|
-
return {
|
|
551
|
-
listProps: collectionProps
|
|
552
|
-
};
|
|
553
|
-
} // Scrolls `scrollView` so that `element` is visible.
|
|
554
|
-
// Similar to `element.scrollIntoView({block: 'nearest'})` (not supported in Edge),
|
|
555
|
-
// but doesn't affect parents above `scrollView`.
|
|
556
22
|
|
|
557
|
-
function $d628da5f2816d7464aa7d4edf8d3eb81$var$scrollIntoView(scrollView, element) {
|
|
558
|
-
let offsetX = element.offsetLeft - scrollView.offsetLeft;
|
|
559
|
-
let offsetY = element.offsetTop - scrollView.offsetTop;
|
|
560
|
-
let width = element.offsetWidth;
|
|
561
|
-
let height = element.offsetHeight;
|
|
562
|
-
let x = scrollView.scrollLeft;
|
|
563
|
-
let y = scrollView.scrollTop;
|
|
564
|
-
let maxX = x + scrollView.offsetWidth;
|
|
565
|
-
let maxY = y + scrollView.offsetHeight;
|
|
566
23
|
|
|
567
|
-
if (offsetX <= x) {
|
|
568
|
-
x = offsetX;
|
|
569
|
-
} else if (offsetX + width > maxX) {
|
|
570
|
-
x += offsetX + width - maxX;
|
|
571
|
-
}
|
|
572
24
|
|
|
573
|
-
if (offsetY <= y) {
|
|
574
|
-
y = offsetY;
|
|
575
|
-
} else if (offsetY + height > maxY) {
|
|
576
|
-
y += offsetY + height - maxY;
|
|
577
|
-
}
|
|
578
25
|
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
}
|
|
26
|
+
export {$ae20dd8cbca75726$export$d6daf82dcd84e87c as useSelectableCollection, $880e95eb8b93ba9a$export$ecf600387e221c37 as useSelectableItem, $982254629710d113$export$b95089534ab7c1fd as useSelectableList, $2a25aae57d74318e$export$a05409b8bb224a5a as ListKeyboardDelegate, $657e4dc4a6e88df0$export$8f5ed9ff9f511381 as DOMLayoutDelegate, $fb3050f43d946246$export$e32c88dfddc6e1d8 as useTypeSelect};
|
|
27
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":";;;;;;;AAAA;;;;;;;;;;CAUC","sources":["packages/@react-aria/selection/src/index.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. 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 http://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\nexport {useSelectableCollection} from './useSelectableCollection';\nexport {useSelectableItem} from './useSelectableItem';\nexport {useSelectableList} from './useSelectableList';\nexport {ListKeyboardDelegate} from './ListKeyboardDelegate';\nexport {DOMLayoutDelegate} from './DOMLayoutDelegate';\nexport {useTypeSelect} from './useTypeSelect';\n\nexport type {AriaSelectableCollectionOptions, SelectableCollectionAria} from './useSelectableCollection';\nexport type {AriaSelectableListOptions, SelectableListAria} from './useSelectableList';\nexport type {SelectableItemOptions, SelectableItemStates, SelectableItemAria} from './useSelectableItem';\nexport type {AriaTypeSelectOptions, TypeSelectAria} from './useTypeSelect';\n"],"names":[],"version":3,"file":"module.js.map"}
|