@proyecto-viviana/solidaria-components 0.3.2 → 0.4.1
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/dist/ActionBar.d.ts.map +1 -1
- package/dist/ActionBar.js +175 -0
- package/dist/ActionBar.js.map +1 -0
- package/dist/ActionBar.jsx +119 -0
- package/dist/ActionBar.jsx.map +1 -0
- package/dist/ActionGroup.d.ts.map +1 -1
- package/dist/ActionGroup.js +179 -0
- package/dist/ActionGroup.js.map +1 -0
- package/dist/ActionGroup.jsx +129 -0
- package/dist/ActionGroup.jsx.map +1 -0
- package/dist/Alert.js +111 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Alert.jsx +82 -0
- package/dist/Alert.jsx.map +1 -0
- package/dist/Autocomplete.d.ts +2 -2
- package/dist/Autocomplete.d.ts.map +1 -1
- package/dist/Autocomplete.js +130 -0
- package/dist/Autocomplete.js.map +1 -0
- package/dist/Autocomplete.jsx +116 -0
- package/dist/Autocomplete.jsx.map +1 -0
- package/dist/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs.js +333 -0
- package/dist/Breadcrumbs.js.map +1 -0
- package/dist/Breadcrumbs.jsx +261 -0
- package/dist/Breadcrumbs.jsx.map +1 -0
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +348 -0
- package/dist/Button.js.map +1 -0
- package/dist/Button.jsx +314 -0
- package/dist/Button.jsx.map +1 -0
- package/dist/Calendar.d.ts +4 -4
- package/dist/Calendar.d.ts.map +1 -1
- package/dist/Calendar.js +573 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Calendar.jsx +342 -0
- package/dist/Calendar.jsx.map +1 -0
- package/dist/CalendarPicker.d.ts +33 -0
- package/dist/CalendarPicker.d.ts.map +1 -0
- package/dist/CalendarPicker.js +44 -0
- package/dist/CalendarPicker.js.map +1 -0
- package/dist/CalendarPicker.jsx +44 -0
- package/dist/CalendarPicker.jsx.map +1 -0
- package/dist/Checkbox.d.ts +83 -4
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Checkbox.js +923 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Checkbox.jsx +707 -0
- package/dist/Checkbox.jsx.map +1 -0
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +202 -0
- package/dist/Collection.js.map +1 -0
- package/dist/Collection.jsx +152 -0
- package/dist/Collection.jsx.map +1 -0
- package/dist/Color.d.ts.map +1 -1
- package/dist/Color.js +1717 -0
- package/dist/Color.js.map +1 -0
- package/dist/Color.jsx +1340 -0
- package/dist/Color.jsx.map +1 -0
- package/dist/ColorEditor.js +208 -0
- package/dist/ColorEditor.js.map +1 -0
- package/dist/ColorEditor.jsx +120 -0
- package/dist/ColorEditor.jsx.map +1 -0
- package/dist/ComboBox.d.ts +8 -4
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +1000 -0
- package/dist/ComboBox.js.map +1 -0
- package/dist/ComboBox.jsx +724 -0
- package/dist/ComboBox.jsx.map +1 -0
- package/dist/ContextualHelpTrigger.js +146 -0
- package/dist/ContextualHelpTrigger.js.map +1 -0
- package/dist/ContextualHelpTrigger.jsx +109 -0
- package/dist/ContextualHelpTrigger.jsx.map +1 -0
- package/dist/DateField.d.ts +14 -5
- package/dist/DateField.d.ts.map +1 -1
- package/dist/DateField.js +4 -0
- package/dist/DateField.jsx +4 -0
- package/dist/DateField2.js +502 -0
- package/dist/DateField2.js.map +1 -0
- package/dist/DateField2.jsx +354 -0
- package/dist/DateField2.jsx.map +1 -0
- package/dist/DatePicker.d.ts +46 -7
- package/dist/DatePicker.d.ts.map +1 -1
- package/dist/DatePicker.js +7 -0
- package/dist/DatePicker.jsx +7 -0
- package/dist/DatePicker2.js +1171 -0
- package/dist/DatePicker2.js.map +1 -0
- package/dist/DatePicker2.jsx +820 -0
- package/dist/DatePicker2.jsx.map +1 -0
- package/dist/DateRangePickerContext.d.ts +2 -0
- package/dist/DateRangePickerContext.d.ts.map +1 -1
- package/dist/Dialog.d.ts.map +1 -1
- package/dist/Dialog.js +337 -0
- package/dist/Dialog.js.map +1 -0
- package/dist/Dialog.jsx +192 -0
- package/dist/Dialog.jsx.map +1 -0
- package/dist/Disclosure.d.ts.map +1 -1
- package/dist/Disclosure.js +331 -0
- package/dist/Disclosure.js.map +1 -0
- package/dist/Disclosure.jsx +230 -0
- package/dist/Disclosure.jsx.map +1 -0
- package/dist/DragAndDrop.d.ts.map +1 -1
- package/dist/DragAndDrop.js +176 -0
- package/dist/DragAndDrop.js.map +1 -0
- package/dist/DragAndDrop.jsx +160 -0
- package/dist/DragAndDrop.jsx.map +1 -0
- package/dist/DropZone.d.ts.map +1 -1
- package/dist/DropZone.js +189 -0
- package/dist/DropZone.js.map +1 -0
- package/dist/DropZone.jsx +144 -0
- package/dist/DropZone.jsx.map +1 -0
- package/dist/FieldError.js +66 -0
- package/dist/FieldError.js.map +1 -0
- package/dist/FieldError.jsx +47 -0
- package/dist/FieldError.jsx.map +1 -0
- package/dist/FileTrigger.js +79 -0
- package/dist/FileTrigger.js.map +1 -0
- package/dist/FileTrigger.jsx +49 -0
- package/dist/FileTrigger.jsx.map +1 -0
- package/dist/Focusable.js +70 -0
- package/dist/Focusable.js.map +1 -0
- package/dist/Focusable.jsx +69 -0
- package/dist/Focusable.jsx.map +1 -0
- package/dist/Form.js +99 -0
- package/dist/Form.js.map +1 -0
- package/dist/Form.jsx +73 -0
- package/dist/Form.jsx.map +1 -0
- package/dist/GridList.d.ts +34 -2
- package/dist/GridList.d.ts.map +1 -1
- package/dist/GridList.js +723 -0
- package/dist/GridList.js.map +1 -0
- package/dist/GridList.jsx +552 -0
- package/dist/GridList.jsx.map +1 -0
- package/dist/Icon.d.ts.map +1 -1
- package/dist/Icon.js +127 -0
- package/dist/Icon.js.map +1 -0
- package/dist/Icon.jsx +72 -0
- package/dist/Icon.jsx.map +1 -0
- package/dist/Keyboard.js +30 -0
- package/dist/Keyboard.js.map +1 -0
- package/dist/Keyboard.jsx +24 -0
- package/dist/Keyboard.jsx.map +1 -0
- package/dist/Landmark.js +134 -0
- package/dist/Landmark.js.map +1 -0
- package/dist/Landmark.jsx +118 -0
- package/dist/Landmark.jsx.map +1 -0
- package/dist/Link.d.ts.map +1 -1
- package/dist/Link.js +219 -0
- package/dist/Link.js.map +1 -0
- package/dist/Link.jsx +189 -0
- package/dist/Link.jsx.map +1 -0
- package/dist/ListBox.d.ts +2 -2
- package/dist/ListBox.d.ts.map +1 -1
- package/dist/ListBox.js +831 -0
- package/dist/ListBox.js.map +1 -0
- package/dist/ListBox.jsx +644 -0
- package/dist/ListBox.jsx.map +1 -0
- package/dist/Menu.d.ts +27 -9
- package/dist/Menu.d.ts.map +1 -1
- package/dist/Menu.js +1254 -0
- package/dist/Menu.js.map +1 -0
- package/dist/Menu.jsx +1042 -0
- package/dist/Menu.jsx.map +1 -0
- package/dist/Meter.d.ts.map +1 -1
- package/dist/Meter.js +123 -0
- package/dist/Meter.js.map +1 -0
- package/dist/Meter.jsx +107 -0
- package/dist/Meter.jsx.map +1 -0
- package/dist/Modal.d.ts.map +1 -1
- package/dist/Modal.js +382 -0
- package/dist/Modal.js.map +1 -0
- package/dist/Modal.jsx +314 -0
- package/dist/Modal.jsx.map +1 -0
- package/dist/NumberField.d.ts +3 -3
- package/dist/NumberField.d.ts.map +1 -1
- package/dist/NumberField.js +573 -0
- package/dist/NumberField.js.map +1 -0
- package/dist/NumberField.jsx +443 -0
- package/dist/NumberField.jsx.map +1 -0
- package/dist/Popover.d.ts +10 -2
- package/dist/Popover.d.ts.map +1 -1
- package/dist/Popover.js +471 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Popover.jsx +354 -0
- package/dist/Popover.jsx.map +1 -0
- package/dist/Pressable.js +69 -0
- package/dist/Pressable.js.map +1 -0
- package/dist/Pressable.jsx +68 -0
- package/dist/Pressable.jsx.map +1 -0
- package/dist/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar.js +130 -0
- package/dist/ProgressBar.js.map +1 -0
- package/dist/ProgressBar.jsx +114 -0
- package/dist/ProgressBar.jsx.map +1 -0
- package/dist/RadioGroup.d.ts +82 -4
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RadioGroup.js +931 -0
- package/dist/RadioGroup.js.map +1 -0
- package/dist/RadioGroup.jsx +681 -0
- package/dist/RadioGroup.jsx.map +1 -0
- package/dist/RangeCalendar.d.ts.map +1 -1
- package/dist/RangeCalendar.js +546 -0
- package/dist/RangeCalendar.js.map +1 -0
- package/dist/RangeCalendar.jsx +323 -0
- package/dist/RangeCalendar.jsx.map +1 -0
- package/dist/RouterProvider.js +118 -0
- package/dist/RouterProvider.js.map +1 -0
- package/dist/RouterProvider.jsx +112 -0
- package/dist/RouterProvider.jsx.map +1 -0
- package/dist/SearchField.d.ts +2 -2
- package/dist/SearchField.d.ts.map +1 -1
- package/dist/SearchField.js +667 -0
- package/dist/SearchField.js.map +1 -0
- package/dist/SearchField.jsx +550 -0
- package/dist/SearchField.jsx.map +1 -0
- package/dist/Select.d.ts +7 -0
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +1044 -0
- package/dist/Select.js.map +1 -0
- package/dist/Select.jsx +759 -0
- package/dist/Select.jsx.map +1 -0
- package/dist/SelectionIndicator.d.ts.map +1 -1
- package/dist/SelectionIndicator.js +86 -0
- package/dist/SelectionIndicator.js.map +1 -0
- package/dist/SelectionIndicator.jsx +50 -0
- package/dist/SelectionIndicator.jsx.map +1 -0
- package/dist/Separator.js +97 -0
- package/dist/Separator.js.map +1 -0
- package/dist/Separator.jsx +85 -0
- package/dist/Separator.jsx.map +1 -0
- package/dist/SharedElementTransition.d.ts.map +1 -1
- package/dist/SharedElementTransition.js +167 -0
- package/dist/SharedElementTransition.js.map +1 -0
- package/dist/SharedElementTransition.jsx +140 -0
- package/dist/SharedElementTransition.jsx.map +1 -0
- package/dist/Slider.d.ts +33 -1
- package/dist/Slider.d.ts.map +1 -1
- package/dist/Slider.js +515 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Slider.jsx +403 -0
- package/dist/Slider.jsx.map +1 -0
- package/dist/StepList.d.ts.map +1 -1
- package/dist/StepList.js +191 -0
- package/dist/StepList.js.map +1 -0
- package/dist/StepList.jsx +136 -0
- package/dist/StepList.jsx.map +1 -0
- package/dist/Switch.d.ts +65 -2
- package/dist/Switch.d.ts.map +1 -1
- package/dist/Switch.js +534 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Switch.jsx +393 -0
- package/dist/Switch.jsx.map +1 -0
- package/dist/Table.d.ts +50 -0
- package/dist/Table.d.ts.map +1 -1
- package/dist/Table.js +1766 -0
- package/dist/Table.js.map +1 -0
- package/dist/Table.jsx +1355 -0
- package/dist/Table.jsx.map +1 -0
- package/dist/Tabs.d.ts +0 -4
- package/dist/Tabs.d.ts.map +1 -1
- package/dist/Tabs.js +598 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tabs.jsx +367 -0
- package/dist/Tabs.jsx.map +1 -0
- package/dist/TagGroup.d.ts +3 -1
- package/dist/TagGroup.d.ts.map +1 -1
- package/dist/TagGroup.js +382 -0
- package/dist/TagGroup.js.map +1 -0
- package/dist/TagGroup.jsx +273 -0
- package/dist/TagGroup.jsx.map +1 -0
- package/dist/Text.d.ts +18 -6
- package/dist/Text.d.ts.map +1 -1
- package/dist/Text.js +42 -0
- package/dist/Text.js.map +1 -0
- package/dist/Text.jsx +35 -0
- package/dist/Text.jsx.map +1 -0
- package/dist/TextField.d.ts +6 -6
- package/dist/TextField.d.ts.map +1 -1
- package/dist/TextField.js +439 -0
- package/dist/TextField.js.map +1 -0
- package/dist/TextField.jsx +406 -0
- package/dist/TextField.jsx.map +1 -0
- package/dist/TimeField.d.ts +17 -53
- package/dist/TimeField.d.ts.map +1 -1
- package/dist/TimeField.js +278 -0
- package/dist/TimeField.js.map +1 -0
- package/dist/TimeField.jsx +218 -0
- package/dist/TimeField.jsx.map +1 -0
- package/dist/Toast.d.ts +14 -0
- package/dist/Toast.d.ts.map +1 -1
- package/dist/Toast.js +551 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Toast.jsx +361 -0
- package/dist/Toast.jsx.map +1 -0
- package/dist/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton.js +123 -0
- package/dist/ToggleButton.js.map +1 -0
- package/dist/ToggleButton.jsx +88 -0
- package/dist/ToggleButton.jsx.map +1 -0
- package/dist/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButtonGroup.js +114 -0
- package/dist/ToggleButtonGroup.js.map +1 -0
- package/dist/ToggleButtonGroup.jsx +85 -0
- package/dist/ToggleButtonGroup.jsx.map +1 -0
- package/dist/Toolbar.js +112 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/Toolbar.jsx +92 -0
- package/dist/Toolbar.jsx.map +1 -0
- package/dist/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip.js +539 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/Tooltip.jsx +465 -0
- package/dist/Tooltip.jsx.map +1 -0
- package/dist/Tree.d.ts +14 -2
- package/dist/Tree.d.ts.map +1 -1
- package/dist/Tree.js +1424 -0
- package/dist/Tree.js.map +1 -0
- package/dist/Tree.jsx +1172 -0
- package/dist/Tree.jsx.map +1 -0
- package/dist/Virtualizer.d.ts +16 -2
- package/dist/Virtualizer.d.ts.map +1 -1
- package/dist/Virtualizer.js +2 -0
- package/dist/Virtualizer.jsx +2 -0
- package/dist/Virtualizer2.js +751 -0
- package/dist/Virtualizer2.js.map +1 -0
- package/dist/Virtualizer2.jsx +730 -0
- package/dist/Virtualizer2.jsx.map +1 -0
- package/dist/VirtualizerLayouts.d.ts +18 -0
- package/dist/VirtualizerLayouts.d.ts.map +1 -1
- package/dist/VisuallyHidden.js +42 -0
- package/dist/VisuallyHidden.js.map +1 -0
- package/dist/VisuallyHidden.jsx +35 -0
- package/dist/VisuallyHidden.jsx.map +1 -0
- package/dist/contexts.js +33 -0
- package/dist/contexts.js.map +1 -0
- package/dist/contexts.jsx +33 -0
- package/dist/contexts.jsx.map +1 -0
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -23932
- package/dist/index.jsx +69 -18337
- package/dist/useDragAndDrop.d.ts +0 -8
- package/dist/useDragAndDrop.d.ts.map +1 -1
- package/dist/useDragAndDrop.js +2 -0
- package/dist/useDragAndDrop.jsx +2 -0
- package/dist/useDragAndDrop2.js +399 -0
- package/dist/useDragAndDrop2.js.map +1 -0
- package/dist/useDragAndDrop2.jsx +399 -0
- package/dist/useDragAndDrop2.jsx.map +1 -0
- package/dist/utils.d.ts +84 -11
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +285 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.jsx +277 -0
- package/dist/utils.jsx.map +1 -0
- package/dist/virtualizer/Layout.js +144 -0
- package/dist/virtualizer/Layout.js.map +1 -0
- package/dist/virtualizer/Layout.jsx +144 -0
- package/dist/virtualizer/Layout.jsx.map +1 -0
- package/package.json +395 -4
- package/src/ActionBar.tsx +10 -12
- package/src/ActionGroup.tsx +5 -3
- package/src/Autocomplete.tsx +14 -9
- package/src/Breadcrumbs.tsx +58 -39
- package/src/Button.tsx +22 -2
- package/src/Calendar.tsx +57 -11
- package/src/CalendarPicker.tsx +73 -0
- package/src/Checkbox.tsx +539 -3
- package/src/Collection.tsx +9 -3
- package/src/Color.tsx +84 -41
- package/src/ComboBox.tsx +97 -21
- package/src/DateField.tsx +304 -53
- package/src/DatePicker.tsx +402 -62
- package/src/DateRangePickerContext.tsx +2 -0
- package/src/Dialog.tsx +13 -5
- package/src/Disclosure.tsx +7 -1
- package/src/DragAndDrop.tsx +3 -1
- package/src/DropZone.tsx +3 -1
- package/src/GridList.tsx +133 -26
- package/src/Icon.tsx +3 -1
- package/src/Link.tsx +3 -1
- package/src/ListBox.tsx +354 -25
- package/src/Menu.tsx +252 -128
- package/src/Meter.tsx +3 -1
- package/src/Modal.tsx +120 -56
- package/src/NumberField.tsx +51 -8
- package/src/Popover.tsx +68 -17
- package/src/ProgressBar.tsx +3 -1
- package/src/RadioGroup.tsx +468 -4
- package/src/RangeCalendar.tsx +123 -2
- package/src/SearchField.tsx +80 -4
- package/src/Select.tsx +122 -26
- package/src/SelectionIndicator.tsx +3 -1
- package/src/SharedElementTransition.tsx +95 -37
- package/src/Slider.tsx +159 -13
- package/src/StepList.tsx +0 -7
- package/src/Switch.tsx +395 -2
- package/src/Table.tsx +428 -99
- package/src/Tabs.tsx +17 -45
- package/src/TagGroup.tsx +29 -7
- package/src/Text.tsx +31 -10
- package/src/TextField.tsx +44 -6
- package/src/TimeField.tsx +127 -192
- package/src/Toast.tsx +79 -14
- package/src/ToggleButton.tsx +3 -1
- package/src/ToggleButtonGroup.tsx +3 -1
- package/src/Tooltip.tsx +3 -1
- package/src/Tree.tsx +91 -13
- package/src/Virtualizer.tsx +180 -31
- package/src/VirtualizerLayouts.ts +45 -10
- package/src/index.ts +51 -8
- package/src/useDragAndDrop.ts +8 -10
- package/src/utils.tsx +246 -30
- package/dist/HiddenTimeInput.d.ts +0 -25
- package/dist/HiddenTimeInput.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.jsx.map +0 -1
- package/src/HiddenTimeInput.tsx +0 -133
package/dist/ListBox.jsx
ADDED
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
import { filterDOMProps, useRenderProps } from "./utils.jsx";
|
|
2
|
+
import { SharedElementTransition } from "./SharedElementTransition.jsx";
|
|
3
|
+
import { SelectionIndicatorContext } from "./SelectionIndicator.jsx";
|
|
4
|
+
import { CollectionRendererContext, Group, Header, Section, flattenCollectionEntries, isCollectionSection, useCollectionRenderer } from "./Collection.jsx";
|
|
5
|
+
import { r as useVirtualizerContext } from "./Virtualizer2.jsx";
|
|
6
|
+
import { useAutocompleteCollection } from "./Autocomplete.jsx";
|
|
7
|
+
import { DropIndicatorContext, getNormalizedDropTargetKey, mergePersistedKeysIntoVirtualRange, useDndPersistedKeys, useRenderDropIndicator } from "./DragAndDrop.jsx";
|
|
8
|
+
import { For, Show, createContext, createEffect, createMemo, createSignal, on, onCleanup, splitProps, useContext } from "solid-js";
|
|
9
|
+
import { CLEAR_FOCUS_EVENT, FOCUS_EVENT, createDragSession, createFocusRing, createListBox, createOption, createScrollIntoViewOnFocus, createStringFormatter, dndIntlStrings, getGlobalDraggingCollectionRef, getGlobalDraggingKeys, mergeProps as mergeProps$1, moveVirtualFocus, registerDropItem, useLocale } from "@proyecto-viviana/solidaria";
|
|
10
|
+
import { createFilteredListState, createListState } from "@proyecto-viviana/solid-stately";
|
|
11
|
+
//#region src/ListBox.tsx
|
|
12
|
+
/**
|
|
13
|
+
* ListBox component for solidaria-components
|
|
14
|
+
*
|
|
15
|
+
* A pre-wired headless listbox that combines state + aria hooks.
|
|
16
|
+
* Port of react-aria-components/src/ListBox.tsx
|
|
17
|
+
*/
|
|
18
|
+
function assignRef(ref, el) {
|
|
19
|
+
if (!ref) return;
|
|
20
|
+
if (typeof ref === "function") ref(el);
|
|
21
|
+
else ref.current = el;
|
|
22
|
+
}
|
|
23
|
+
const ListBoxContext = createContext(null);
|
|
24
|
+
const ListBoxStateContext = createContext(null);
|
|
25
|
+
const ListStateContext = ListBoxStateContext;
|
|
26
|
+
/**
|
|
27
|
+
* A listbox displays a list of options and allows a user to select one or more of them.
|
|
28
|
+
*/
|
|
29
|
+
function ListBox(props) {
|
|
30
|
+
const contextSlotProps = useContext(ListBoxContext)?.slots?.[props.slot ?? "default"];
|
|
31
|
+
const [local, stateProps, ariaProps] = splitProps(contextSlotProps ? mergeProps$1(contextSlotProps, props) : props, [
|
|
32
|
+
"children",
|
|
33
|
+
"class",
|
|
34
|
+
"style",
|
|
35
|
+
"slot",
|
|
36
|
+
"renderEmptyState",
|
|
37
|
+
"hasMore",
|
|
38
|
+
"isLoading",
|
|
39
|
+
"onLoadMore",
|
|
40
|
+
"dragAndDropHooks",
|
|
41
|
+
"slots",
|
|
42
|
+
"ref"
|
|
43
|
+
], [
|
|
44
|
+
"items",
|
|
45
|
+
"getKey",
|
|
46
|
+
"getTextValue",
|
|
47
|
+
"getDisabled",
|
|
48
|
+
"disabledKeys",
|
|
49
|
+
"disabledBehavior",
|
|
50
|
+
"selectionMode",
|
|
51
|
+
"selectionBehavior",
|
|
52
|
+
"selectedKeys",
|
|
53
|
+
"defaultSelectedKeys",
|
|
54
|
+
"onSelectionChange",
|
|
55
|
+
"layout",
|
|
56
|
+
"orientation"
|
|
57
|
+
]);
|
|
58
|
+
const flatItems = createMemo(() => {
|
|
59
|
+
return flattenCollectionEntries(stateProps.items);
|
|
60
|
+
});
|
|
61
|
+
const hasSections = createMemo(() => stateProps.items.some((item) => isCollectionSection(item)));
|
|
62
|
+
const baseState = createListState({
|
|
63
|
+
get items() {
|
|
64
|
+
return flatItems();
|
|
65
|
+
},
|
|
66
|
+
get getKey() {
|
|
67
|
+
return stateProps.getKey;
|
|
68
|
+
},
|
|
69
|
+
get getTextValue() {
|
|
70
|
+
return stateProps.getTextValue;
|
|
71
|
+
},
|
|
72
|
+
get getDisabled() {
|
|
73
|
+
return stateProps.getDisabled;
|
|
74
|
+
},
|
|
75
|
+
get disabledKeys() {
|
|
76
|
+
return stateProps.disabledKeys;
|
|
77
|
+
},
|
|
78
|
+
get selectionMode() {
|
|
79
|
+
return stateProps.selectionMode;
|
|
80
|
+
},
|
|
81
|
+
get selectionBehavior() {
|
|
82
|
+
return stateProps.selectionBehavior;
|
|
83
|
+
},
|
|
84
|
+
get disabledBehavior() {
|
|
85
|
+
return stateProps.disabledBehavior;
|
|
86
|
+
},
|
|
87
|
+
get selectedKeys() {
|
|
88
|
+
return stateProps.selectedKeys;
|
|
89
|
+
},
|
|
90
|
+
get defaultSelectedKeys() {
|
|
91
|
+
return stateProps.defaultSelectedKeys;
|
|
92
|
+
},
|
|
93
|
+
get onSelectionChange() {
|
|
94
|
+
return stateProps.onSelectionChange;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const autocompleteCtx = useAutocompleteCollection();
|
|
98
|
+
const state = autocompleteCtx ? createFilteredListState(baseState, () => autocompleteCtx.filter) : baseState;
|
|
99
|
+
const resolveDisabled = () => {
|
|
100
|
+
const disabled = ariaProps.isDisabled;
|
|
101
|
+
if (typeof disabled === "function") return disabled();
|
|
102
|
+
return !!disabled;
|
|
103
|
+
};
|
|
104
|
+
const locale = useLocale();
|
|
105
|
+
const parentCollectionRenderer = useCollectionRenderer();
|
|
106
|
+
const listBoxAria = createListBox({
|
|
107
|
+
...ariaProps,
|
|
108
|
+
get isVirtualized() {
|
|
109
|
+
return parentCollectionRenderer?.isVirtualized ?? ariaProps.isVirtualized;
|
|
110
|
+
},
|
|
111
|
+
get id() {
|
|
112
|
+
return autocompleteCtx?.collectionProps.id ?? ariaProps.id;
|
|
113
|
+
},
|
|
114
|
+
get "aria-label"() {
|
|
115
|
+
return autocompleteCtx?.collectionProps["aria-label"] ?? ariaProps["aria-label"];
|
|
116
|
+
},
|
|
117
|
+
get shouldUseVirtualFocus() {
|
|
118
|
+
return autocompleteCtx?.collectionProps.shouldUseVirtualFocus ?? ariaProps.shouldUseVirtualFocus;
|
|
119
|
+
},
|
|
120
|
+
get disallowTypeAhead() {
|
|
121
|
+
return autocompleteCtx?.collectionProps.disallowTypeAhead ?? ariaProps.disallowTypeAhead;
|
|
122
|
+
},
|
|
123
|
+
get isDisabled() {
|
|
124
|
+
return resolveDisabled();
|
|
125
|
+
},
|
|
126
|
+
get orientation() {
|
|
127
|
+
return stateProps.orientation ?? "vertical";
|
|
128
|
+
},
|
|
129
|
+
get direction() {
|
|
130
|
+
return locale().direction;
|
|
131
|
+
}
|
|
132
|
+
}, state, () => listRef());
|
|
133
|
+
const { isFocused, isFocusVisible, focusProps } = createFocusRing();
|
|
134
|
+
const renderValues = createMemo(() => ({
|
|
135
|
+
isFocused: state.isFocused() || isFocused(),
|
|
136
|
+
isFocusVisible: isFocusVisible(),
|
|
137
|
+
isDisabled: resolveDisabled(),
|
|
138
|
+
isEmpty: state.collection().size === 0
|
|
139
|
+
}));
|
|
140
|
+
const renderProps = useRenderProps({
|
|
141
|
+
class: local.class,
|
|
142
|
+
style: local.style,
|
|
143
|
+
defaultClassName: "solidaria-ListBox"
|
|
144
|
+
}, renderValues);
|
|
145
|
+
const domProps = createMemo(() => {
|
|
146
|
+
return filterDOMProps(ariaProps, { global: true });
|
|
147
|
+
});
|
|
148
|
+
const cleanListBoxProps = () => {
|
|
149
|
+
const { ref: _ref1, ...rest } = listBoxAria.listBoxProps;
|
|
150
|
+
return rest;
|
|
151
|
+
};
|
|
152
|
+
const cleanFocusProps = () => {
|
|
153
|
+
const { ref: _ref2, ...rest } = focusProps;
|
|
154
|
+
return rest;
|
|
155
|
+
};
|
|
156
|
+
const cleanLabelProps = () => {
|
|
157
|
+
const { ref: _ref3, ...rest } = listBoxAria.labelProps;
|
|
158
|
+
return rest;
|
|
159
|
+
};
|
|
160
|
+
const [listRef, setListRef] = createSignal(null);
|
|
161
|
+
createScrollIntoViewOnFocus({
|
|
162
|
+
focusedKey: () => state.focusedKey(),
|
|
163
|
+
isActive: () => state.isFocused(),
|
|
164
|
+
ref: () => listRef()
|
|
165
|
+
});
|
|
166
|
+
if (autocompleteCtx) {
|
|
167
|
+
let shouldVirtualFocusFirst = false;
|
|
168
|
+
createEffect(() => {
|
|
169
|
+
const list = listRef();
|
|
170
|
+
if (!list) return;
|
|
171
|
+
const onFocusEvent = (e) => {
|
|
172
|
+
const detail = e.detail;
|
|
173
|
+
e.stopPropagation();
|
|
174
|
+
state.setFocused(true);
|
|
175
|
+
if (detail?.focusStrategy === "first") shouldVirtualFocusFirst = true;
|
|
176
|
+
};
|
|
177
|
+
const onClearFocusEvent = (e) => {
|
|
178
|
+
e.stopPropagation();
|
|
179
|
+
state.setFocused(false);
|
|
180
|
+
if (e.detail?.clearFocusKey) state.setFocusedKey(null);
|
|
181
|
+
};
|
|
182
|
+
list.addEventListener(FOCUS_EVENT, onFocusEvent);
|
|
183
|
+
list.addEventListener(CLEAR_FOCUS_EVENT, onClearFocusEvent);
|
|
184
|
+
onCleanup(() => {
|
|
185
|
+
list.removeEventListener(FOCUS_EVENT, onFocusEvent);
|
|
186
|
+
list.removeEventListener(CLEAR_FOCUS_EVENT, onClearFocusEvent);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
createEffect(on(() => [state.collection().getFirstKey?.() ?? null, state.collection().size], ([firstKey, size]) => {
|
|
190
|
+
if (!shouldVirtualFocusFirst) return;
|
|
191
|
+
if (firstKey == null) {
|
|
192
|
+
const list = listRef();
|
|
193
|
+
if (list) moveVirtualFocus(list);
|
|
194
|
+
if (size > 0) shouldVirtualFocusFirst = false;
|
|
195
|
+
} else {
|
|
196
|
+
state.setFocusedKey(firstKey);
|
|
197
|
+
shouldVirtualFocusFirst = false;
|
|
198
|
+
}
|
|
199
|
+
}, { defer: true }));
|
|
200
|
+
createEffect(() => {
|
|
201
|
+
const key = state.focusedKey();
|
|
202
|
+
const list = listRef();
|
|
203
|
+
if (!list || !state.isFocused()) return;
|
|
204
|
+
if (key == null) return;
|
|
205
|
+
const el = list.ownerDocument.getElementById(String(key));
|
|
206
|
+
if (el) moveVirtualFocus(el);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
const isEmpty = () => stateProps.items.length === 0;
|
|
210
|
+
const getItemNodes = createMemo(() => Array.from(state.collection()).filter((node) => node.type === "item"));
|
|
211
|
+
const getDropTargetByIndex = (index, position) => {
|
|
212
|
+
const node = getItemNodes()[index];
|
|
213
|
+
if (!node) return null;
|
|
214
|
+
return {
|
|
215
|
+
type: "item",
|
|
216
|
+
key: node.key,
|
|
217
|
+
dropPosition: position
|
|
218
|
+
};
|
|
219
|
+
};
|
|
220
|
+
const hasDroppableDnd = createMemo(() => {
|
|
221
|
+
const hooks = local.dragAndDropHooks;
|
|
222
|
+
return Boolean(hooks?.useDroppableCollectionState && hooks.useDroppableCollection && (hooks.dropTargetDelegate || parentCollectionRenderer?.dropTargetDelegate || hooks.ListDropTargetDelegate));
|
|
223
|
+
});
|
|
224
|
+
const dropState = createMemo(() => {
|
|
225
|
+
if (!hasDroppableDnd()) return void 0;
|
|
226
|
+
return local.dragAndDropHooks?.useDroppableCollectionState?.({});
|
|
227
|
+
});
|
|
228
|
+
const hasDraggableDnd = createMemo(() => {
|
|
229
|
+
const hooks = local.dragAndDropHooks;
|
|
230
|
+
return Boolean(hooks?.useDraggableCollectionState && hooks.useDraggableCollection);
|
|
231
|
+
});
|
|
232
|
+
const dragState = createMemo(() => {
|
|
233
|
+
if (!hasDraggableDnd()) return void 0;
|
|
234
|
+
return local.dragAndDropHooks?.useDraggableCollectionState?.({ items: flatItems() });
|
|
235
|
+
});
|
|
236
|
+
createEffect(() => {
|
|
237
|
+
if (!hasDraggableDnd()) return;
|
|
238
|
+
const hooks = local.dragAndDropHooks;
|
|
239
|
+
const activeDragState = dragState();
|
|
240
|
+
if (!hooks?.useDraggableCollection || !activeDragState) return;
|
|
241
|
+
hooks.useDraggableCollection({}, activeDragState, () => listRef());
|
|
242
|
+
});
|
|
243
|
+
const droppableCollection = createMemo(() => {
|
|
244
|
+
if (!hasDroppableDnd()) return void 0;
|
|
245
|
+
const hooks = local.dragAndDropHooks;
|
|
246
|
+
const activeDropState = dropState();
|
|
247
|
+
if (!hooks?.useDroppableCollection || !activeDropState) return void 0;
|
|
248
|
+
const resolveDirection = () => {
|
|
249
|
+
const el = listRef();
|
|
250
|
+
if (el && typeof window !== "undefined" && typeof window.getComputedStyle === "function") {
|
|
251
|
+
if (window.getComputedStyle(el).direction === "rtl") return "rtl";
|
|
252
|
+
}
|
|
253
|
+
return typeof document !== "undefined" && document.dir === "rtl" ? "rtl" : "ltr";
|
|
254
|
+
};
|
|
255
|
+
const dropTargetDelegate = hooks.dropTargetDelegate ?? parentCollectionRenderer?.dropTargetDelegate ?? (hooks.ListDropTargetDelegate ? new hooks.ListDropTargetDelegate(() => state.collection(), () => listRef(), {
|
|
256
|
+
layout: "stack",
|
|
257
|
+
orientation: "vertical",
|
|
258
|
+
direction: resolveDirection()
|
|
259
|
+
}) : void 0);
|
|
260
|
+
if (!dropTargetDelegate) return void 0;
|
|
261
|
+
return hooks.useDroppableCollection({
|
|
262
|
+
dropTargetDelegate,
|
|
263
|
+
keyboardDelegate: {
|
|
264
|
+
getFirstKey: () => state.collection().getFirstKey(),
|
|
265
|
+
getLastKey: () => state.collection().getLastKey(),
|
|
266
|
+
getKeyBelow: (key) => state.collection().getKeyAfter(key),
|
|
267
|
+
getKeyAbove: (key) => state.collection().getKeyBefore(key),
|
|
268
|
+
getKeyPageBelow: (key) => state.collection().getKeyAfter(key),
|
|
269
|
+
getKeyPageAbove: (key) => state.collection().getKeyBefore(key)
|
|
270
|
+
},
|
|
271
|
+
collection: state.collection(),
|
|
272
|
+
selectedKeys: state.selectionManager.selectedKeys,
|
|
273
|
+
setSelectedKeys: (keys) => state.selectionManager.setSelectedKeys(keys),
|
|
274
|
+
setFocusedKey: (key) => state.setFocusedKey(key)
|
|
275
|
+
}, activeDropState, () => listRef());
|
|
276
|
+
});
|
|
277
|
+
const isRootDropTarget = createMemo(() => {
|
|
278
|
+
return Boolean(dropState()?.target?.type === "root");
|
|
279
|
+
});
|
|
280
|
+
const dndRenderDropIndicator = createMemo(() => useRenderDropIndicator(local.dragAndDropHooks, dropState()));
|
|
281
|
+
const dndDropIndicator = (index, position) => {
|
|
282
|
+
const target = getDropTargetByIndex(index, position);
|
|
283
|
+
if (!target || target.type !== "item") return void 0;
|
|
284
|
+
return dndRenderDropIndicator()?.(target);
|
|
285
|
+
};
|
|
286
|
+
const dndFormatter = createStringFormatter(dndIntlStrings);
|
|
287
|
+
const dragSession = createDragSession();
|
|
288
|
+
const dropIndicatorTargetsEqual = (a, b) => !!a && a.type === "item" && a.key === b.key && a.dropPosition === b.dropPosition;
|
|
289
|
+
const dropIndicatorLabel = (target) => {
|
|
290
|
+
const collection = state.collection();
|
|
291
|
+
const getText = (key) => {
|
|
292
|
+
if (key == null) return "";
|
|
293
|
+
return collection.getTextValue(key) ?? collection.getItem(key)?.textValue ?? "";
|
|
294
|
+
};
|
|
295
|
+
if (target.dropPosition === "on") return dndFormatter().format("dropOnItem", { itemText: getText(target.key) });
|
|
296
|
+
let before;
|
|
297
|
+
let after;
|
|
298
|
+
if (target.dropPosition === "before") {
|
|
299
|
+
const prevKey = collection.getKeyBefore(target.key);
|
|
300
|
+
const prevNode = prevKey != null ? collection.getItem(prevKey) : null;
|
|
301
|
+
before = prevNode?.type === "item" ? prevNode.key : null;
|
|
302
|
+
} else before = target.key;
|
|
303
|
+
if (target.dropPosition === "after") {
|
|
304
|
+
const nextKey = collection.getKeyAfter(target.key);
|
|
305
|
+
const nextNode = nextKey != null ? collection.getItem(nextKey) : null;
|
|
306
|
+
after = nextNode?.type === "item" ? nextNode.key : null;
|
|
307
|
+
} else after = target.key;
|
|
308
|
+
if (before != null && after != null) return dndFormatter().format("insertBetween", {
|
|
309
|
+
beforeItemText: getText(before),
|
|
310
|
+
afterItemText: getText(after)
|
|
311
|
+
});
|
|
312
|
+
if (before != null) return dndFormatter().format("insertAfter", { itemText: getText(before) });
|
|
313
|
+
if (after != null) return dndFormatter().format("insertBefore", { itemText: getText(after) });
|
|
314
|
+
return "";
|
|
315
|
+
};
|
|
316
|
+
const wrapDropTypes = (types) => ({ has: (type) => {
|
|
317
|
+
if (typeof type === "string") return types.has(type);
|
|
318
|
+
if (Array.isArray(type)) return type.some((t) => typeof t === "string" && types.has(t));
|
|
319
|
+
return false;
|
|
320
|
+
} });
|
|
321
|
+
const ListBoxDropIndicator = (props) => {
|
|
322
|
+
const [indicatorRef, setIndicatorRef] = createSignal(null);
|
|
323
|
+
const isDropTarget = createMemo(() => dropIndicatorTargetsEqual(dropState()?.target, props.target));
|
|
324
|
+
const ariaHidden = createMemo(() => !dragSession() ? "true" : isDropTarget() ? void 0 : "true");
|
|
325
|
+
const isHidden = createMemo(() => !isDropTarget() && !!ariaHidden());
|
|
326
|
+
createEffect(() => {
|
|
327
|
+
const el = indicatorRef();
|
|
328
|
+
if (!el) return;
|
|
329
|
+
onCleanup(registerDropItem({
|
|
330
|
+
element: el,
|
|
331
|
+
target: props.target,
|
|
332
|
+
getDropOperation: (types, allowedOperations) => {
|
|
333
|
+
const st = dropState();
|
|
334
|
+
if (!st) return "cancel";
|
|
335
|
+
const isInternal = getGlobalDraggingCollectionRef() === listRef();
|
|
336
|
+
return st.getDropOperation(props.target, wrapDropTypes(types), allowedOperations, isInternal, getGlobalDraggingKeys());
|
|
337
|
+
}
|
|
338
|
+
}));
|
|
339
|
+
if (dragSession() && isDropTarget()) requestAnimationFrame(() => {
|
|
340
|
+
if (dragSession() && isDropTarget() && indicatorRef() === el) el.focus();
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
return <Show when={!isHidden()}>
|
|
344
|
+
<div ref={(el) => {
|
|
345
|
+
setIndicatorRef(el);
|
|
346
|
+
onCleanup(() => setIndicatorRef(null));
|
|
347
|
+
}} role="option" class="solidaria-DropIndicator" aria-roledescription={dndFormatter().format("dropIndicator")} aria-label={dropIndicatorLabel(props.target)} aria-hidden={ariaHidden()} tabindex={-1} data-drop-target={isDropTarget() || void 0} />
|
|
348
|
+
</Show>;
|
|
349
|
+
};
|
|
350
|
+
const dropIndicatorContextValue = { render: (p) => <ListBoxDropIndicator target={p.target} /> };
|
|
351
|
+
const virtualizer = useVirtualizerContext();
|
|
352
|
+
const persistedKeys = useDndPersistedKeys({ focusedKey: state.focusedKey }, local.dragAndDropHooks, dropState(), state.collection());
|
|
353
|
+
const virtualRange = createMemo(() => {
|
|
354
|
+
if (!virtualizer || !parentCollectionRenderer?.isVirtualized || hasSections()) return null;
|
|
355
|
+
const baseRange = virtualizer.getVisibleRange(stateProps.items.length);
|
|
356
|
+
const itemNodes = getItemNodes();
|
|
357
|
+
const persistedIndexes = Array.from(persistedKeys()).map((key) => itemNodes.findIndex((node) => node.key === key)).filter((index) => index >= 0);
|
|
358
|
+
const dropTarget = dropState()?.target;
|
|
359
|
+
const normalizedDropKey = getNormalizedDropTargetKey(dropTarget, state.collection());
|
|
360
|
+
const focusedKey = state.focusedKey();
|
|
361
|
+
const focusedIndex = focusedKey != null ? itemNodes.findIndex((node) => node.key === focusedKey) : -1;
|
|
362
|
+
const forceIncludeIndexes = [
|
|
363
|
+
dropTarget?.type === "item" ? itemNodes.findIndex((node) => node.key === dropTarget.key) : -1,
|
|
364
|
+
normalizedDropKey != null ? itemNodes.findIndex((node) => node.key === normalizedDropKey) : -1,
|
|
365
|
+
dropTarget?.type === "item" ? -1 : focusedIndex
|
|
366
|
+
].filter((index) => index >= 0);
|
|
367
|
+
return mergePersistedKeysIntoVirtualRange(baseRange, persistedIndexes, stateProps.items.length, virtualizer, 80, {
|
|
368
|
+
forceIncludeIndexes,
|
|
369
|
+
forceIncludeMaxSpan: 320
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
createEffect(() => {
|
|
373
|
+
if (!virtualizer || !parentCollectionRenderer?.isVirtualized) return;
|
|
374
|
+
const getItemNodes = () => Array.from(state.collection()).filter((node) => node.type === "item");
|
|
375
|
+
virtualizer.setDropTargetItemCountResolver(() => getItemNodes().length);
|
|
376
|
+
virtualizer.setDropTargetIndexResolver((key) => {
|
|
377
|
+
const index = getItemNodes().findIndex((node) => node.key === key);
|
|
378
|
+
return index >= 0 ? index : null;
|
|
379
|
+
});
|
|
380
|
+
virtualizer.setDropTargetResolver((target) => {
|
|
381
|
+
const node = getItemNodes()[target.index];
|
|
382
|
+
if (!node) return target;
|
|
383
|
+
return {
|
|
384
|
+
...target,
|
|
385
|
+
key: typeof node.key === "string" || typeof node.key === "number" ? node.key : void 0
|
|
386
|
+
};
|
|
387
|
+
});
|
|
388
|
+
onCleanup(() => {
|
|
389
|
+
virtualizer.setDropTargetIndexResolver(void 0);
|
|
390
|
+
virtualizer.setDropTargetItemCountResolver(void 0);
|
|
391
|
+
virtualizer.setDropTargetResolver(void 0);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
const visibleItems = createMemo(() => {
|
|
395
|
+
const range = virtualRange();
|
|
396
|
+
if (!range) return stateProps.items;
|
|
397
|
+
return stateProps.items.slice(range.start, range.end);
|
|
398
|
+
});
|
|
399
|
+
const virtualSpacerStyle = (size) => virtualizer?.orientation === "horizontal" ? { width: `${size}px` } : { height: `${size}px` };
|
|
400
|
+
const sectionedRenderEntries = createMemo(() => {
|
|
401
|
+
let globalIndex = 0;
|
|
402
|
+
return stateProps.items.map((entry) => {
|
|
403
|
+
if (isCollectionSection(entry)) return {
|
|
404
|
+
type: "section",
|
|
405
|
+
section: entry,
|
|
406
|
+
items: entry.items.map((item) => ({
|
|
407
|
+
item,
|
|
408
|
+
index: globalIndex++
|
|
409
|
+
}))
|
|
410
|
+
};
|
|
411
|
+
return {
|
|
412
|
+
type: "item",
|
|
413
|
+
item: {
|
|
414
|
+
item: entry,
|
|
415
|
+
index: globalIndex++
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
const collectionRenderer = createMemo(() => ({
|
|
421
|
+
...parentCollectionRenderer,
|
|
422
|
+
renderItem: (item) => local.children(item),
|
|
423
|
+
renderDropIndicator: (index, position) => dndDropIndicator(index, position) ?? parentCollectionRenderer?.renderDropIndicator?.(index, position)
|
|
424
|
+
}));
|
|
425
|
+
return <ListBoxContext.Provider value={{
|
|
426
|
+
state,
|
|
427
|
+
isDisabled: resolveDisabled,
|
|
428
|
+
dragAndDropHooks: local.dragAndDropHooks,
|
|
429
|
+
dragState: dragState(),
|
|
430
|
+
dropState: dropState(),
|
|
431
|
+
slots: local.slots
|
|
432
|
+
}}>
|
|
433
|
+
<ListBoxStateContext.Provider value={state}>
|
|
434
|
+
<CollectionRendererContext.Provider value={collectionRenderer()}>
|
|
435
|
+
<DropIndicatorContext.Provider value={dropIndicatorContextValue}>
|
|
436
|
+
<>
|
|
437
|
+
<Show when={ariaProps.label}>
|
|
438
|
+
<span {...cleanLabelProps()}>{ariaProps.label}</span>
|
|
439
|
+
</Show>
|
|
440
|
+
<div {...mergeProps$1(domProps(), cleanListBoxProps(), cleanFocusProps(), droppableCollection()?.collectionProps ?? {})} ref={(el) => {
|
|
441
|
+
setListRef(el);
|
|
442
|
+
assignRef(local.ref, el);
|
|
443
|
+
autocompleteCtx?.collectionRef(el);
|
|
444
|
+
}} class={renderProps.class()} style={renderProps.style()} data-focused={state.isFocused() || void 0} data-focus-visible={isFocusVisible() || void 0} data-disabled={resolveDisabled() || void 0} data-empty={isEmpty() || void 0} data-layout={stateProps.layout} data-orientation={stateProps.orientation} data-drop-target={isRootDropTarget() || void 0} slot={local.slot}>
|
|
445
|
+
<SharedElementTransition>
|
|
446
|
+
{isEmpty() && local.renderEmptyState ? <div role="option" style={{ display: "contents" }} data-empty-state>
|
|
447
|
+
{local.renderEmptyState()}
|
|
448
|
+
</div> : hasSections() ? <For each={sectionedRenderEntries()}>
|
|
449
|
+
{(entry) => entry.type === "section" ? <div role="presentation" data-section-wrapper>
|
|
450
|
+
<Section class="solidaria-ListBox-section">
|
|
451
|
+
{entry.section.title != null && <Header class="solidaria-ListBox-sectionHeader">
|
|
452
|
+
{entry.section.title}
|
|
453
|
+
</Header>}
|
|
454
|
+
<Group class="solidaria-ListBox-sectionGroup">
|
|
455
|
+
<div role="group" aria-label={entry.section["aria-label"]}>
|
|
456
|
+
<For each={entry.items}>
|
|
457
|
+
{(indexedItem) => <>
|
|
458
|
+
{collectionRenderer().renderDropIndicator?.(indexedItem.index, "before")}
|
|
459
|
+
{collectionRenderer().renderDropIndicator?.(indexedItem.index, "on")}
|
|
460
|
+
{local.children(indexedItem.item)}
|
|
461
|
+
{collectionRenderer().renderDropIndicator?.(indexedItem.index, "after")}
|
|
462
|
+
</>}
|
|
463
|
+
</For>
|
|
464
|
+
</div>
|
|
465
|
+
</Group>
|
|
466
|
+
</Section>
|
|
467
|
+
</div> : <>
|
|
468
|
+
{collectionRenderer().renderDropIndicator?.(entry.item.index, "before")}
|
|
469
|
+
{collectionRenderer().renderDropIndicator?.(entry.item.index, "on")}
|
|
470
|
+
{local.children(entry.item.item)}
|
|
471
|
+
{collectionRenderer().renderDropIndicator?.(entry.item.index, "after")}
|
|
472
|
+
</>}
|
|
473
|
+
</For> : <>
|
|
474
|
+
{virtualRange()?.offsetTop ? <div role="presentation" aria-hidden="true" style={virtualSpacerStyle(virtualRange().offsetTop)} data-virtualizer-spacer="top" /> : null}
|
|
475
|
+
<For each={visibleItems()}>
|
|
476
|
+
{(item, index) => {
|
|
477
|
+
const itemIndex = () => (virtualRange()?.start ?? 0) + index();
|
|
478
|
+
const beforeIndicator = () => collectionRenderer().renderDropIndicator?.(itemIndex(), "before");
|
|
479
|
+
const onIndicator = () => collectionRenderer().renderDropIndicator?.(itemIndex(), "on");
|
|
480
|
+
const afterIndicator = () => collectionRenderer().renderDropIndicator?.(itemIndex(), "after");
|
|
481
|
+
return <>
|
|
482
|
+
{beforeIndicator()}
|
|
483
|
+
{onIndicator()}
|
|
484
|
+
{local.children(item)}
|
|
485
|
+
{afterIndicator()}
|
|
486
|
+
</>;
|
|
487
|
+
}}
|
|
488
|
+
</For>
|
|
489
|
+
{virtualRange()?.offsetBottom ? <div role="presentation" aria-hidden="true" style={virtualSpacerStyle(virtualRange().offsetBottom)} data-virtualizer-spacer="bottom" /> : null}
|
|
490
|
+
</>}
|
|
491
|
+
</SharedElementTransition>
|
|
492
|
+
{local.hasMore && local.onLoadMore && <ListBoxLoadMoreItem onLoadMore={local.onLoadMore} isLoading={local.isLoading} />}
|
|
493
|
+
</div>
|
|
494
|
+
</>
|
|
495
|
+
</DropIndicatorContext.Provider>
|
|
496
|
+
</CollectionRendererContext.Provider>
|
|
497
|
+
</ListBoxStateContext.Provider>
|
|
498
|
+
</ListBoxContext.Provider>;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* An option in a listbox.
|
|
502
|
+
*/
|
|
503
|
+
function ListBoxOption(props) {
|
|
504
|
+
const [local, ariaProps] = splitProps(props, [
|
|
505
|
+
"class",
|
|
506
|
+
"style",
|
|
507
|
+
"slot",
|
|
508
|
+
"id",
|
|
509
|
+
"item",
|
|
510
|
+
"textValue",
|
|
511
|
+
"ref"
|
|
512
|
+
]);
|
|
513
|
+
const context = useContext(ListBoxStateContext);
|
|
514
|
+
if (!context) throw new Error("ListBoxOption must be used within a ListBox");
|
|
515
|
+
const state = context;
|
|
516
|
+
const listContext = useContext(ListBoxContext);
|
|
517
|
+
const [ref, setRef] = createSignal(null);
|
|
518
|
+
const optionAria = createOption({
|
|
519
|
+
key: local.id,
|
|
520
|
+
get isDisabled() {
|
|
521
|
+
return Boolean(ariaProps.isDisabled || listContext?.isDisabled());
|
|
522
|
+
},
|
|
523
|
+
get "aria-label"() {
|
|
524
|
+
return ariaProps["aria-label"] ?? local.textValue;
|
|
525
|
+
},
|
|
526
|
+
get shouldSelectOnPressUp() {
|
|
527
|
+
return ariaProps.shouldSelectOnPressUp;
|
|
528
|
+
},
|
|
529
|
+
get shouldFocusOnHover() {
|
|
530
|
+
return ariaProps.shouldFocusOnHover;
|
|
531
|
+
},
|
|
532
|
+
get onHoverStart() {
|
|
533
|
+
return ariaProps.onHoverStart;
|
|
534
|
+
},
|
|
535
|
+
get onHoverEnd() {
|
|
536
|
+
return ariaProps.onHoverEnd;
|
|
537
|
+
},
|
|
538
|
+
get onHoverChange() {
|
|
539
|
+
return ariaProps.onHoverChange;
|
|
540
|
+
}
|
|
541
|
+
}, state, ref);
|
|
542
|
+
const renderValues = createMemo(() => ({
|
|
543
|
+
isSelected: optionAria.isSelected(),
|
|
544
|
+
isFocused: optionAria.isFocused(),
|
|
545
|
+
isFocusVisible: optionAria.isFocusVisible(),
|
|
546
|
+
isPressed: optionAria.isPressed(),
|
|
547
|
+
isHovered: optionAria.isHovered(),
|
|
548
|
+
isDisabled: optionAria.isDisabled()
|
|
549
|
+
}));
|
|
550
|
+
const renderProps = useRenderProps({
|
|
551
|
+
get children() {
|
|
552
|
+
return props.children;
|
|
553
|
+
},
|
|
554
|
+
class: local.class,
|
|
555
|
+
style: local.style,
|
|
556
|
+
defaultClassName: "solidaria-ListBox-option"
|
|
557
|
+
}, renderValues);
|
|
558
|
+
const hasPrimitiveLabel = () => {
|
|
559
|
+
return typeof props.children === "string" || typeof props.children === "number";
|
|
560
|
+
};
|
|
561
|
+
const selectionIndicatorContext = createMemo(() => ({ isSelected: optionAria.isSelected }));
|
|
562
|
+
const draggableItem = createMemo(() => {
|
|
563
|
+
if (!listContext?.dragAndDropHooks?.useDraggableItem || !listContext.dragState) return void 0;
|
|
564
|
+
return listContext.dragAndDropHooks.useDraggableItem({
|
|
565
|
+
key: local.id,
|
|
566
|
+
selectionMode: state.selectionManager.selectionMode
|
|
567
|
+
}, listContext.dragState);
|
|
568
|
+
});
|
|
569
|
+
const droppableItem = createMemo(() => {
|
|
570
|
+
if (!listContext?.dragAndDropHooks?.useDroppableItem || !listContext.dropState) return void 0;
|
|
571
|
+
return listContext.dragAndDropHooks.useDroppableItem({ key: local.id }, listContext.dropState, () => ref());
|
|
572
|
+
});
|
|
573
|
+
const cleanOptionProps = () => {
|
|
574
|
+
const { ref: _ref1, "aria-describedby": _ariaDescribedby, ...rest } = optionAria.optionProps;
|
|
575
|
+
if (!hasPrimitiveLabel() && rest["aria-label"] == null) delete rest["aria-labelledby"];
|
|
576
|
+
return rest;
|
|
577
|
+
};
|
|
578
|
+
const domProps = () => filterDOMProps(ariaProps, { global: true });
|
|
579
|
+
return <SelectionIndicatorContext.Provider value={selectionIndicatorContext()}>
|
|
580
|
+
<div ref={(el) => {
|
|
581
|
+
setRef(el);
|
|
582
|
+
assignRef(local.ref, el);
|
|
583
|
+
}} {...mergeProps$1(domProps(), cleanOptionProps(), draggableItem()?.dragProps ?? {}, droppableItem()?.dropProps ?? {})} class={renderProps.class()} style={renderProps.style()} data-selected={optionAria.isSelected() || void 0} data-focused={optionAria.isFocused() || void 0} data-focus-visible={optionAria.isFocusVisible() || void 0} data-pressed={optionAria.isPressed() || void 0} data-hovered={optionAria.isHovered() || void 0} data-disabled={optionAria.isDisabled() || void 0} data-dragging={draggableItem()?.isDragging || void 0} data-drop-target={droppableItem()?.isDropTarget || void 0} slot={local.slot}>
|
|
584
|
+
{hasPrimitiveLabel() ? <span {...optionAria.labelProps}>{renderProps.renderChildren()}</span> : renderProps.renderChildren()}
|
|
585
|
+
</div>
|
|
586
|
+
</SelectionIndicatorContext.Provider>;
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Load more sentinel item for listbox collections.
|
|
590
|
+
*/
|
|
591
|
+
function ListBoxLoadMoreItem(props) {
|
|
592
|
+
let sentinelRef;
|
|
593
|
+
const [isPending, setIsPending] = createSignal(false);
|
|
594
|
+
const isLoading = () => !!props.isLoading || isPending();
|
|
595
|
+
const triggerLoadMore = async () => {
|
|
596
|
+
if (isLoading()) return;
|
|
597
|
+
setIsPending(true);
|
|
598
|
+
try {
|
|
599
|
+
await props.onLoadMore();
|
|
600
|
+
} finally {
|
|
601
|
+
setIsPending(false);
|
|
602
|
+
}
|
|
603
|
+
};
|
|
604
|
+
createEffect(() => {});
|
|
605
|
+
const renderProps = useRenderProps({
|
|
606
|
+
get children() {
|
|
607
|
+
return props.children ?? (() => isLoading() ? "Loading more..." : "Load more");
|
|
608
|
+
},
|
|
609
|
+
class: props.class,
|
|
610
|
+
style: props.style,
|
|
611
|
+
defaultClassName: "solidaria-ListBox-loadMore"
|
|
612
|
+
}, () => ({ isLoading: isLoading() }));
|
|
613
|
+
return <>
|
|
614
|
+
<div style={{
|
|
615
|
+
position: "relative",
|
|
616
|
+
width: 0,
|
|
617
|
+
height: 0,
|
|
618
|
+
overflow: "hidden"
|
|
619
|
+
}} inert>
|
|
620
|
+
<div ref={sentinelRef} style={{
|
|
621
|
+
position: "absolute",
|
|
622
|
+
height: "1px",
|
|
623
|
+
width: "1px"
|
|
624
|
+
}} />
|
|
625
|
+
</div>
|
|
626
|
+
<div role="option" aria-disabled={true} tabIndex={0} onFocus={() => {
|
|
627
|
+
triggerLoadMore();
|
|
628
|
+
}} class={renderProps.class()} style={renderProps.style()} data-loading={isLoading() || void 0}>
|
|
629
|
+
{renderProps.renderChildren()}
|
|
630
|
+
</div>
|
|
631
|
+
</>;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Section primitive alias for ListBox composition parity.
|
|
635
|
+
*/
|
|
636
|
+
function ListBoxSection(props) {
|
|
637
|
+
return <Section {...props} />;
|
|
638
|
+
}
|
|
639
|
+
ListBox.Option = ListBoxOption;
|
|
640
|
+
ListBox.LoadMoreItem = ListBoxLoadMoreItem;
|
|
641
|
+
//#endregion
|
|
642
|
+
export { ListBox, ListBoxContext, ListBoxLoadMoreItem, ListBoxOption, ListBoxSection, ListBoxStateContext, ListStateContext };
|
|
643
|
+
|
|
644
|
+
//# sourceMappingURL=ListBox.jsx.map
|