@proyecto-viviana/solidaria-components 0.3.2 → 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.
- package/dist/ActionBar.js +184 -0
- package/dist/ActionBar.js.map +1 -0
- package/dist/ActionBar.jsx +128 -0
- package/dist/ActionBar.jsx.map +1 -0
- 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.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 +334 -0
- package/dist/Breadcrumbs.js.map +1 -0
- package/dist/Breadcrumbs.jsx +266 -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 +538 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Calendar.jsx +333 -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 +1720 -0
- package/dist/Color.js.map +1 -0
- package/dist/Color.jsx +1344 -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 +4 -4
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +992 -0
- package/dist/ComboBox.js.map +1 -0
- package/dist/ComboBox.jsx +714 -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 +3 -3
- package/dist/DateField.d.ts.map +1 -1
- package/dist/DateField.js +4 -0
- package/dist/DateField.jsx +4 -0
- package/dist/DateField2.js +499 -0
- package/dist/DateField2.js.map +1 -0
- package/dist/DateField2.jsx +317 -0
- package/dist/DateField2.jsx.map +1 -0
- package/dist/DatePicker.d.ts +4 -4
- package/dist/DatePicker.d.ts.map +1 -1
- package/dist/DatePicker.js +991 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/DatePicker.jsx +682 -0
- package/dist/DatePicker.jsx.map +1 -0
- 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 +328 -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/HiddenTimeInput.js +104 -0
- package/dist/HiddenTimeInput.js.map +1 -0
- package/dist/HiddenTimeInput.jsx +69 -0
- package/dist/HiddenTimeInput.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.map +1 -1
- package/dist/ListBox.js +670 -0
- package/dist/ListBox.js.map +1 -0
- package/dist/ListBox.jsx +508 -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 +380 -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 +464 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Popover.jsx +333 -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 +410 -0
- package/dist/RangeCalendar.js.map +1 -0
- package/dist/RangeCalendar.jsx +253 -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 +643 -0
- package/dist/SearchField.js.map +1 -0
- package/dist/SearchField.jsx +526 -0
- package/dist/SearchField.jsx.map +1 -0
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +1031 -0
- package/dist/Select.js.map +1 -0
- package/dist/Select.jsx +744 -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 +165 -0
- package/dist/SharedElementTransition.js.map +1 -0
- package/dist/SharedElementTransition.jsx +138 -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.js +198 -0
- package/dist/StepList.js.map +1 -0
- package/dist/StepList.jsx +141 -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 +48 -0
- package/dist/Table.d.ts.map +1 -1
- package/dist/Table.js +1759 -0
- package/dist/Table.js.map +1 -0
- package/dist/Table.jsx +1348 -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 +595 -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.map +1 -1
- package/dist/TagGroup.js +378 -0
- package/dist/TagGroup.js.map +1 -0
- package/dist/TagGroup.jsx +270 -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 +436 -0
- package/dist/TextField.js.map +1 -0
- package/dist/TextField.jsx +403 -0
- package/dist/TextField.jsx.map +1 -0
- package/dist/TimeField.d.ts +3 -3
- package/dist/TimeField.d.ts.map +1 -1
- package/dist/TimeField.js +372 -0
- package/dist/TimeField.js.map +1 -0
- package/dist/TimeField.jsx +224 -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 +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -23932
- package/dist/index.jsx +70 -18337
- package/dist/useDragAndDrop.js +2 -0
- package/dist/useDragAndDrop.jsx +2 -0
- package/dist/useDragAndDrop2.js +395 -0
- package/dist/useDragAndDrop2.js.map +1 -0
- package/dist/useDragAndDrop2.jsx +395 -0
- package/dist/useDragAndDrop2.jsx.map +1 -0
- package/dist/utils.d.ts +83 -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 +401 -4
- package/src/Breadcrumbs.tsx +3 -1
- package/src/Button.tsx +22 -2
- package/src/Calendar.tsx +27 -10
- package/src/CalendarPicker.tsx +73 -0
- package/src/Checkbox.tsx +539 -3
- package/src/Collection.tsx +9 -3
- package/src/Color.tsx +42 -14
- package/src/ComboBox.tsx +50 -6
- package/src/DateField.tsx +20 -2
- package/src/DatePicker.tsx +57 -5
- package/src/Dialog.tsx +13 -5
- package/src/Disclosure.tsx +3 -1
- package/src/DragAndDrop.tsx +3 -1
- package/src/DropZone.tsx +3 -1
- package/src/GridList.tsx +125 -24
- package/src/Icon.tsx +3 -1
- package/src/Link.tsx +3 -1
- package/src/ListBox.tsx +31 -4
- package/src/Menu.tsx +252 -128
- package/src/Meter.tsx +3 -1
- package/src/Modal.tsx +100 -52
- package/src/NumberField.tsx +51 -8
- package/src/Popover.tsx +40 -10
- package/src/ProgressBar.tsx +3 -1
- package/src/RadioGroup.tsx +468 -4
- package/src/RangeCalendar.tsx +3 -1
- package/src/SearchField.tsx +27 -3
- package/src/Select.tsx +22 -7
- package/src/SelectionIndicator.tsx +3 -1
- package/src/SharedElementTransition.tsx +3 -1
- package/src/Slider.tsx +159 -13
- package/src/Switch.tsx +395 -2
- package/src/Table.tsx +409 -95
- package/src/Tabs.tsx +16 -45
- package/src/TagGroup.tsx +3 -1
- package/src/Text.tsx +31 -10
- package/src/TextField.tsx +43 -5
- package/src/TimeField.tsx +20 -2
- 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 +77 -9
- package/src/Virtualizer.tsx +180 -31
- package/src/VirtualizerLayouts.ts +45 -10
- package/src/index.ts +50 -0
- package/src/utils.tsx +243 -27
- package/dist/index.js.map +0 -1
- package/dist/index.jsx.map +0 -1
package/dist/Modal.jsx
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { dataAttr, filterDOMProps, useIsHydrated, useRenderProps } from "./utils.jsx";
|
|
2
|
+
import { VisuallyHidden } from "./VisuallyHidden.jsx";
|
|
3
|
+
import { a as useOverlayTriggerState, n as OverlayTriggerStateContext, t as DialogTriggerContext } from "./contexts.jsx";
|
|
4
|
+
import { Show, createContext, createEffect, createMemo, createSignal, onCleanup, splitProps, useContext } from "solid-js";
|
|
5
|
+
import { Portal, isServer } from "solid-js/web";
|
|
6
|
+
import { FocusScope, ariaHideOutside, createEnterAnimation, createExitAnimation, createInteractOutside, useUNSAFE_PortalContext } from "@proyecto-viviana/solidaria";
|
|
7
|
+
//#region src/Modal.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Modal and ModalOverlay components for solidaria-components
|
|
10
|
+
*
|
|
11
|
+
* Headless modal components with overlay, focus trapping, and dismissal handling.
|
|
12
|
+
* Port of react-aria-components Modal.
|
|
13
|
+
*/
|
|
14
|
+
const InternalModalContext = createContext(null);
|
|
15
|
+
const visibleModals = [];
|
|
16
|
+
function pruneDisconnectedModals() {
|
|
17
|
+
for (let index = visibleModals.length - 1; index >= 0; index -= 1) if (!(visibleModals[index]?.())?.isConnected) visibleModals.splice(index, 1);
|
|
18
|
+
}
|
|
19
|
+
const ModalContext = OverlayTriggerStateContext;
|
|
20
|
+
/**
|
|
21
|
+
* ModalOverlay is the backdrop/underlay behind a modal.
|
|
22
|
+
* It handles click-outside dismissal and provides styling hooks.
|
|
23
|
+
*/
|
|
24
|
+
function ModalOverlay(props) {
|
|
25
|
+
const isHydrated = useIsHydrated();
|
|
26
|
+
const [local, rest] = splitProps(props, [
|
|
27
|
+
"class",
|
|
28
|
+
"style",
|
|
29
|
+
"isOpen",
|
|
30
|
+
"defaultOpen",
|
|
31
|
+
"onOpenChange",
|
|
32
|
+
"isDismissable",
|
|
33
|
+
"isKeyboardDismissDisabled",
|
|
34
|
+
"isEntering",
|
|
35
|
+
"isExiting"
|
|
36
|
+
]);
|
|
37
|
+
const dialogTriggerContext = useContext(DialogTriggerContext);
|
|
38
|
+
const [internalOpen, setInternalOpen] = createSignal(local.defaultOpen ?? false);
|
|
39
|
+
const isOpen = () => {
|
|
40
|
+
if (local.isOpen !== void 0) return local.isOpen;
|
|
41
|
+
if (dialogTriggerContext) return dialogTriggerContext.state.isOpen();
|
|
42
|
+
return internalOpen();
|
|
43
|
+
};
|
|
44
|
+
const close = () => {
|
|
45
|
+
if (local.isOpen !== void 0) local.onOpenChange?.(false);
|
|
46
|
+
else if (dialogTriggerContext) {
|
|
47
|
+
dialogTriggerContext.state.close();
|
|
48
|
+
local.onOpenChange?.(false);
|
|
49
|
+
} else {
|
|
50
|
+
setInternalOpen(false);
|
|
51
|
+
local.onOpenChange?.(false);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const open = () => {
|
|
55
|
+
if (local.isOpen !== void 0) local.onOpenChange?.(true);
|
|
56
|
+
else if (dialogTriggerContext) {
|
|
57
|
+
dialogTriggerContext.state.open();
|
|
58
|
+
local.onOpenChange?.(true);
|
|
59
|
+
} else {
|
|
60
|
+
setInternalOpen(true);
|
|
61
|
+
local.onOpenChange?.(true);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const toggle = () => {
|
|
65
|
+
if (isOpen()) close();
|
|
66
|
+
else open();
|
|
67
|
+
};
|
|
68
|
+
const state = {
|
|
69
|
+
get isOpen() {
|
|
70
|
+
return isOpen();
|
|
71
|
+
},
|
|
72
|
+
open,
|
|
73
|
+
close,
|
|
74
|
+
toggle
|
|
75
|
+
};
|
|
76
|
+
let overlayRef;
|
|
77
|
+
const [overlayEl, setOverlayEl] = createSignal(null);
|
|
78
|
+
const overlayRefAccessor = () => overlayEl();
|
|
79
|
+
const registerOverlayRef = (element) => {
|
|
80
|
+
overlayRef = element;
|
|
81
|
+
setOverlayEl(element);
|
|
82
|
+
};
|
|
83
|
+
const [modalEl, setModalEl] = createSignal(null);
|
|
84
|
+
const isOverlayEntering = createEnterAnimation(overlayRefAccessor, isOpen);
|
|
85
|
+
const isOverlayExiting = createExitAnimation(overlayRefAccessor, isOpen);
|
|
86
|
+
const isModalExiting = createExitAnimation(() => modalEl(), isOpen);
|
|
87
|
+
const overlayEntering = () => isOverlayEntering() || (local.isEntering ?? false);
|
|
88
|
+
const combinedExiting = () => isOverlayExiting() || isModalExiting() || (local.isExiting ?? false);
|
|
89
|
+
const renderValues = createMemo(() => ({
|
|
90
|
+
isEntering: overlayEntering(),
|
|
91
|
+
isExiting: combinedExiting()
|
|
92
|
+
}));
|
|
93
|
+
const renderProps = useRenderProps({
|
|
94
|
+
class: local.class,
|
|
95
|
+
style: local.style,
|
|
96
|
+
defaultClassName: "solidaria-ModalOverlay"
|
|
97
|
+
}, renderValues);
|
|
98
|
+
const domProps = createMemo(() => filterDOMProps(rest, { global: true }));
|
|
99
|
+
const internalModalContext = {
|
|
100
|
+
isDismissable: local.isDismissable,
|
|
101
|
+
isKeyboardDismissDisabled: local.isKeyboardDismissDisabled,
|
|
102
|
+
setModalRef: setModalEl,
|
|
103
|
+
isExiting: combinedExiting
|
|
104
|
+
};
|
|
105
|
+
const portalContext = useUNSAFE_PortalContext();
|
|
106
|
+
const portalContainer = () => portalContext.getContainer?.() ?? void 0;
|
|
107
|
+
const isTopMostModalInOverlay = () => {
|
|
108
|
+
pruneDisconnectedModals();
|
|
109
|
+
const topMostModal = visibleModals[visibleModals.length - 1]?.();
|
|
110
|
+
return !topMostModal || overlayRef?.contains(topMostModal);
|
|
111
|
+
};
|
|
112
|
+
const handleOverlayPointerDown = (event) => {
|
|
113
|
+
if (local.isDismissable && event.target === event.currentTarget && isTopMostModalInOverlay()) close();
|
|
114
|
+
};
|
|
115
|
+
createEffect(() => {
|
|
116
|
+
if (!isOpen() || local.isKeyboardDismissDisabled) return;
|
|
117
|
+
const handleKeyDown = (event) => {
|
|
118
|
+
if (event.key === "Escape" && !event.isComposing && isTopMostModalInOverlay()) {
|
|
119
|
+
event.preventDefault();
|
|
120
|
+
event.stopPropagation();
|
|
121
|
+
close();
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
document.addEventListener("keydown", handleKeyDown, true);
|
|
125
|
+
onCleanup(() => {
|
|
126
|
+
document.removeEventListener("keydown", handleKeyDown, true);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
const resolveChildren = () => {
|
|
130
|
+
const children = props.children;
|
|
131
|
+
if (typeof children === "function") return children(renderValues());
|
|
132
|
+
return children;
|
|
133
|
+
};
|
|
134
|
+
return <Show when={isHydrated() && (isOpen() || combinedExiting())}>
|
|
135
|
+
<Portal mount={portalContainer()}>
|
|
136
|
+
<OverlayTriggerStateContext.Provider value={state}>
|
|
137
|
+
<InternalModalContext.Provider value={internalModalContext}>
|
|
138
|
+
<div {...domProps()} ref={registerOverlayRef} class={renderProps.class()} style={renderProps.style()} data-entering={dataAttr(overlayEntering())} data-exiting={dataAttr(combinedExiting())} onPointerDown={handleOverlayPointerDown}>
|
|
139
|
+
{resolveChildren()}
|
|
140
|
+
</div>
|
|
141
|
+
</InternalModalContext.Provider>
|
|
142
|
+
</OverlayTriggerStateContext.Provider>
|
|
143
|
+
</Portal>
|
|
144
|
+
</Show>;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Modal is a dialog container that manages focus trapping, scroll prevention,
|
|
148
|
+
* aria-hiding of content outside, and dismissal.
|
|
149
|
+
*
|
|
150
|
+
* Usage patterns:
|
|
151
|
+
* 1. Standalone: `<Modal isOpen>...</Modal>` - Creates its own overlay
|
|
152
|
+
* 2. With custom overlay: `<ModalOverlay><Modal>...</Modal></ModalOverlay>`
|
|
153
|
+
*
|
|
154
|
+
* Note: Due to SolidJS's eager JSX evaluation, we cannot detect at render time
|
|
155
|
+
* whether Modal is wrapped in ModalOverlay. So standalone Modal always creates
|
|
156
|
+
* an overlay, and wrapped Modal renders directly (relying on InternalModalContext).
|
|
157
|
+
*/
|
|
158
|
+
function Modal(props) {
|
|
159
|
+
return <ModalContentWithAutoOverlay {...props} />;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Helper component that handles the overlay detection.
|
|
163
|
+
* By being a separate component, we can use Show to defer rendering until
|
|
164
|
+
* the parent context is available.
|
|
165
|
+
*/
|
|
166
|
+
function ModalContentWithAutoOverlay(props) {
|
|
167
|
+
const [overlayProps, modalProps] = splitProps(props, [
|
|
168
|
+
"isOpen",
|
|
169
|
+
"defaultOpen",
|
|
170
|
+
"onOpenChange",
|
|
171
|
+
"isDismissable",
|
|
172
|
+
"isKeyboardDismissDisabled",
|
|
173
|
+
"isEntering",
|
|
174
|
+
"isExiting"
|
|
175
|
+
]);
|
|
176
|
+
if (useContext(InternalModalContext)) return <ModalContent {...modalProps}>{props.children}</ModalContent>;
|
|
177
|
+
return <ModalOverlay {...overlayProps}>
|
|
178
|
+
<ModalContent {...modalProps}>{props.children}</ModalContent>
|
|
179
|
+
</ModalOverlay>;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Internal component that renders the actual modal content.
|
|
183
|
+
* Used by both standalone Modal and Modal wrapped in ModalOverlay.
|
|
184
|
+
*/
|
|
185
|
+
function ModalContent(props) {
|
|
186
|
+
if (isServer) return <>{props.children}</>;
|
|
187
|
+
const [local, rest] = splitProps(props, [
|
|
188
|
+
"children",
|
|
189
|
+
"class",
|
|
190
|
+
"style",
|
|
191
|
+
"isOpen",
|
|
192
|
+
"defaultOpen",
|
|
193
|
+
"onOpenChange",
|
|
194
|
+
"isDismissable",
|
|
195
|
+
"isKeyboardDismissDisabled",
|
|
196
|
+
"isEntering",
|
|
197
|
+
"isExiting"
|
|
198
|
+
]);
|
|
199
|
+
let modalRef;
|
|
200
|
+
const modalRefAccessor = () => modalRef ?? null;
|
|
201
|
+
const [modalEl, setModalEl] = createSignal(null);
|
|
202
|
+
const parentState = useContext(OverlayTriggerStateContext);
|
|
203
|
+
const internalContext = useContext(InternalModalContext);
|
|
204
|
+
const isDismissable = () => internalContext?.isDismissable ?? local.isDismissable;
|
|
205
|
+
const isKeyboardDismissDisabled = () => internalContext?.isKeyboardDismissDisabled ?? local.isKeyboardDismissDisabled;
|
|
206
|
+
const isOpen = () => {
|
|
207
|
+
if (local.isOpen !== void 0) return local.isOpen;
|
|
208
|
+
return parentState?.isOpen ?? false;
|
|
209
|
+
};
|
|
210
|
+
const registerModalRef = (element) => {
|
|
211
|
+
modalRef = element;
|
|
212
|
+
setModalEl(element);
|
|
213
|
+
internalContext?.setModalRef?.(element);
|
|
214
|
+
};
|
|
215
|
+
const isModalEntering = createEnterAnimation(() => modalEl(), isOpen);
|
|
216
|
+
const isModalExiting = () => internalContext?.isExiting?.() ?? local.isExiting ?? false;
|
|
217
|
+
createEffect(() => {
|
|
218
|
+
if (!isOpen()) return;
|
|
219
|
+
pruneDisconnectedModals();
|
|
220
|
+
if (!visibleModals.includes(modalRefAccessor)) visibleModals.push(modalRefAccessor);
|
|
221
|
+
onCleanup(() => {
|
|
222
|
+
const index = visibleModals.indexOf(modalRefAccessor);
|
|
223
|
+
if (index >= 0) visibleModals.splice(index, 1);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
const isTopMostModal = () => {
|
|
227
|
+
pruneDisconnectedModals();
|
|
228
|
+
return visibleModals[visibleModals.length - 1] === modalRefAccessor;
|
|
229
|
+
};
|
|
230
|
+
const close = () => {
|
|
231
|
+
if (local.isOpen !== void 0) local.onOpenChange?.(false);
|
|
232
|
+
else parentState?.close();
|
|
233
|
+
};
|
|
234
|
+
createEffect(() => {
|
|
235
|
+
if (!isOpen()) return;
|
|
236
|
+
const html = document.documentElement;
|
|
237
|
+
const prevOverflow = html.style.overflow;
|
|
238
|
+
html.style.overflow = "hidden";
|
|
239
|
+
onCleanup(() => {
|
|
240
|
+
html.style.overflow = prevOverflow;
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
createEffect(() => {
|
|
244
|
+
if (!isOpen() || !isDismissable()) return;
|
|
245
|
+
createInteractOutside({
|
|
246
|
+
ref: modalRefAccessor,
|
|
247
|
+
onInteractOutside: () => {
|
|
248
|
+
if (isTopMostModal()) close();
|
|
249
|
+
},
|
|
250
|
+
isDisabled: false
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
createEffect(() => {
|
|
254
|
+
if (!isOpen() || isKeyboardDismissDisabled()) return;
|
|
255
|
+
const handleKeyDown = (e) => {
|
|
256
|
+
if (e.key === "Escape" && !e.isComposing && isTopMostModal()) {
|
|
257
|
+
e.preventDefault();
|
|
258
|
+
e.stopPropagation();
|
|
259
|
+
close();
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
document.addEventListener("keydown", handleKeyDown, true);
|
|
263
|
+
onCleanup(() => {
|
|
264
|
+
document.removeEventListener("keydown", handleKeyDown, true);
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
createEffect(() => {
|
|
268
|
+
if (!isOpen() || !modalRef) return;
|
|
269
|
+
let cleanup;
|
|
270
|
+
let cancelled = false;
|
|
271
|
+
const ownerWindow = modalRef.ownerDocument.defaultView ?? window;
|
|
272
|
+
const hideOutside = () => {
|
|
273
|
+
if (cancelled || !modalRef?.isConnected) return;
|
|
274
|
+
cleanup = ariaHideOutside([modalRef], { shouldUseInert: true });
|
|
275
|
+
};
|
|
276
|
+
if (modalRef.isConnected) hideOutside();
|
|
277
|
+
else ownerWindow.queueMicrotask(hideOutside);
|
|
278
|
+
onCleanup(() => {
|
|
279
|
+
cancelled = true;
|
|
280
|
+
cleanup?.();
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
const renderValues = createMemo(() => ({
|
|
284
|
+
isEntering: isModalEntering(),
|
|
285
|
+
isExiting: isModalExiting()
|
|
286
|
+
}));
|
|
287
|
+
const renderProps = useRenderProps({
|
|
288
|
+
get children() {
|
|
289
|
+
return props.children;
|
|
290
|
+
},
|
|
291
|
+
class: local.class,
|
|
292
|
+
style: local.style,
|
|
293
|
+
defaultClassName: "solidaria-Modal"
|
|
294
|
+
}, renderValues);
|
|
295
|
+
const domProps = createMemo(() => filterDOMProps(rest, { global: true }));
|
|
296
|
+
return <FocusScope contain restoreFocus>
|
|
297
|
+
<div {...domProps()} ref={registerModalRef} class={renderProps.class()} style={renderProps.style()} data-entering={dataAttr(isModalEntering())} data-exiting={dataAttr(isModalExiting())}>
|
|
298
|
+
<Show when={isDismissable()}>
|
|
299
|
+
{}
|
|
300
|
+
<VisuallyHidden elementType="div">
|
|
301
|
+
<button aria-label="Dismiss" tabIndex={-1} onClick={close} style={{
|
|
302
|
+
width: "1px",
|
|
303
|
+
height: "1px"
|
|
304
|
+
}} />
|
|
305
|
+
</VisuallyHidden>
|
|
306
|
+
</Show>
|
|
307
|
+
{renderProps.renderChildren()}
|
|
308
|
+
</div>
|
|
309
|
+
</FocusScope>;
|
|
310
|
+
}
|
|
311
|
+
//#endregion
|
|
312
|
+
export { Modal, Modal as default, ModalContext, ModalOverlay, OverlayTriggerStateContext, useOverlayTriggerState };
|
|
313
|
+
|
|
314
|
+
//# sourceMappingURL=Modal.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.jsx","names":[],"sources":["../src/Modal.tsx"],"sourcesContent":["/**\n * Modal and ModalOverlay components for solidaria-components\n *\n * Headless modal components with overlay, focus trapping, and dismissal handling.\n * Port of react-aria-components Modal.\n */\n\nimport {\n type JSX,\n createContext,\n createMemo,\n createSignal,\n createEffect,\n onCleanup,\n splitProps,\n Show,\n useContext,\n} from \"solid-js\";\nimport { Portal, isServer } from \"solid-js/web\";\nimport {\n createInteractOutside,\n ariaHideOutside,\n FocusScope,\n useUNSAFE_PortalContext,\n createEnterAnimation,\n createExitAnimation,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n useRenderProps,\n filterDOMProps,\n dataAttr,\n useIsHydrated,\n} from \"./utils\";\nimport {\n DialogTriggerContext,\n OverlayTriggerStateContext,\n type OverlayTriggerState,\n} from \"./contexts\";\nimport { VisuallyHidden } from \"./VisuallyHidden\";\n\n/**\n * Internal context to signal that Modal is wrapped in ModalOverlay.\n * When present, Modal should not create its own Portal.\n */\ninterface InternalModalContextValue {\n isDismissable?: boolean;\n isKeyboardDismissDisabled?: boolean;\n // Upstream's ModalOverlay owns the modal element's ref so it can watch the\n // modal surface's exit animation alongside the overlay's (both must finish\n // before the overlay unmounts). ModalContent registers its element here.\n setModalRef?: (element: HTMLElement | null) => void;\n // Combined exit flag (overlay OR modal still exiting). Both the overlay and\n // the modal surface carry `data-exiting` off this so they fade out together.\n isExiting?: () => boolean;\n}\n\nconst InternalModalContext = createContext<InternalModalContextValue | null>(null);\n\n// Stack of visible modals, used to ensure only the top-most modal dismisses on Escape/outside interaction.\nconst visibleModals: Array<() => Element | null> = [];\n\nfunction pruneDisconnectedModals() {\n for (let index = visibleModals.length - 1; index >= 0; index -= 1) {\n const element = visibleModals[index]?.();\n if (!element?.isConnected) {\n visibleModals.splice(index, 1);\n }\n }\n}\n\nexport interface ModalRenderProps {\n /** Whether the modal is currently entering (for animations). */\n isEntering: boolean;\n /** Whether the modal is currently exiting (for animations). */\n isExiting: boolean;\n}\n\nexport interface ModalOverlayProps {\n /** The children of the component - can be JSX or render function. */\n children?: RenderChildren<ModalRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<ModalRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<ModalRenderProps>;\n /** Whether the modal is open (controlled). */\n isOpen?: boolean;\n /** Whether the modal opens by default (uncontrolled). */\n defaultOpen?: boolean;\n /** Handler called when the modal's open state changes. */\n onOpenChange?: (isOpen: boolean) => void;\n /** Whether clicking outside the modal closes it. */\n isDismissable?: boolean;\n /** Whether pressing Escape closes the modal. */\n isKeyboardDismissDisabled?: boolean;\n /** Whether the modal is entering (for animations). */\n isEntering?: boolean;\n /** Whether the modal is exiting (for animations). */\n isExiting?: boolean;\n}\n\nexport interface ModalProps extends ModalOverlayProps {}\n\nexport { OverlayTriggerStateContext, type OverlayTriggerState } from \"./contexts\";\nexport { useOverlayTriggerState } from \"./contexts\";\nexport const ModalContext = OverlayTriggerStateContext;\n\n/**\n * ModalOverlay is the backdrop/underlay behind a modal.\n * It handles click-outside dismissal and provides styling hooks.\n */\nexport function ModalOverlay(props: ModalOverlayProps): JSX.Element {\n // Do NOT early-return on the server: rendering children bare on the server and a\n // <Show>/<Portal> overlay on the client desyncs hydration. Run the same structure\n // on both and gate the Portal on useIsHydrated() (see Popover for the rationale).\n const isHydrated = useIsHydrated();\n\n // IMPORTANT: Don't destructure or access props.children early!\n // In SolidJS, children are lazily evaluated. Accessing them before\n // the context provider renders causes them to evaluate outside the context.\n // See: https://github.com/solidjs/solid/issues/182\n const [local, rest] = splitProps(props, [\n \"class\",\n \"style\",\n \"isOpen\",\n \"defaultOpen\",\n \"onOpenChange\",\n \"isDismissable\",\n \"isKeyboardDismissDisabled\",\n \"isEntering\",\n \"isExiting\",\n ]);\n\n // Get state from DialogTrigger context if available\n const dialogTriggerContext = useContext(DialogTriggerContext);\n\n // Internal state for uncontrolled mode\n const [internalOpen, setInternalOpen] = createSignal(local.defaultOpen ?? false);\n\n // Determine if open (controlled > DialogTrigger context > uncontrolled)\n const isOpen = (): boolean => {\n if (local.isOpen !== undefined) return local.isOpen;\n if (dialogTriggerContext) return dialogTriggerContext.state.isOpen();\n return internalOpen();\n };\n\n const close = () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(false);\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.close();\n local.onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n local.onOpenChange?.(false);\n }\n };\n\n const open = () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(true);\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.open();\n local.onOpenChange?.(true);\n } else {\n setInternalOpen(true);\n local.onOpenChange?.(true);\n }\n };\n\n const toggle = () => {\n if (isOpen()) {\n close();\n } else {\n open();\n }\n };\n\n const state: OverlayTriggerState = {\n get isOpen() {\n return isOpen();\n },\n open,\n close,\n toggle,\n };\n\n // Enter/exit animation state (mirrors upstream's ModalOverlayWithForwardRef +\n // ModalOverlayInner). The overlay stays mounted here even while closed, so the\n // enter animation is gated on `isOpen` (isReady) — otherwise it would resolve\n // to \"done entering\" before the element ever mounts. Exit is watched for BOTH\n // the overlay and the modal surface; the modal registers its element via\n // InternalModalContext (setModalRef) so we can await its exit too.\n let overlayRef!: HTMLDivElement;\n // Signal-backed so the enter/exit effects re-run once the element mounts — a\n // plain closure over `overlayRef` would read `null` if the effect fired first\n // and, with no reactive dep on the ref, never recover (stuck `data-entering`).\n const [overlayEl, setOverlayEl] = createSignal<HTMLElement | null>(null);\n const overlayRefAccessor = () => overlayEl();\n const registerOverlayRef = (element: HTMLDivElement) => {\n overlayRef = element;\n setOverlayEl(element);\n };\n const [modalEl, setModalEl] = createSignal<HTMLElement | null>(null);\n\n const isOverlayEntering = createEnterAnimation(overlayRefAccessor, isOpen);\n const isOverlayExiting = createExitAnimation(overlayRefAccessor, isOpen);\n const isModalExiting = createExitAnimation(() => modalEl(), isOpen);\n const overlayEntering = () => isOverlayEntering() || (local.isEntering ?? false);\n const combinedExiting = () =>\n isOverlayExiting() || isModalExiting() || (local.isExiting ?? false);\n\n const renderValues = createMemo<ModalRenderProps>(() => ({\n isEntering: overlayEntering(),\n isExiting: combinedExiting(),\n }));\n\n // Resolve render props - don't pass children, we'll render props.children directly\n const renderProps = useRenderProps(\n {\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-ModalOverlay\",\n },\n renderValues,\n );\n\n const domProps = createMemo(() =>\n filterDOMProps(rest as Record<string, unknown>, { global: true }),\n );\n\n // Internal context value to signal Modal that it's wrapped\n const internalModalContext: InternalModalContextValue = {\n isDismissable: local.isDismissable,\n isKeyboardDismissDisabled: local.isKeyboardDismissDisabled,\n setModalRef: setModalEl,\n isExiting: combinedExiting,\n };\n const portalContext = useUNSAFE_PortalContext();\n const portalContainer = () => portalContext.getContainer?.() ?? undefined;\n\n const isTopMostModalInOverlay = () => {\n pruneDisconnectedModals();\n const topMostModal = visibleModals[visibleModals.length - 1]?.();\n return !topMostModal || overlayRef?.contains(topMostModal);\n };\n\n const handleOverlayPointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (local.isDismissable && event.target === event.currentTarget && isTopMostModalInOverlay()) {\n close();\n }\n };\n\n createEffect(() => {\n if (!isOpen() || local.isKeyboardDismissDisabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && !event.isComposing && isTopMostModalInOverlay()) {\n event.preventDefault();\n event.stopPropagation();\n close();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", handleKeyDown, true);\n });\n });\n\n // Resolve children - handle both static JSX and render functions\n // IMPORTANT: We access props.children directly (not local.children) to preserve\n // lazy evaluation inside context providers\n const resolveChildren = () => {\n const children = props.children;\n if (typeof children === \"function\") {\n return (children as (props: ModalRenderProps) => JSX.Element)(renderValues());\n }\n return children;\n };\n\n return (\n <Show when={isHydrated() && (isOpen() || combinedExiting())}>\n <Portal mount={portalContainer()}>\n <OverlayTriggerStateContext.Provider value={state}>\n <InternalModalContext.Provider value={internalModalContext}>\n <div\n {...domProps()}\n ref={registerOverlayRef}\n class={renderProps.class()}\n style={renderProps.style()}\n data-entering={dataAttr(overlayEntering())}\n data-exiting={dataAttr(combinedExiting())}\n onPointerDown={handleOverlayPointerDown}\n >\n {resolveChildren()}\n </div>\n </InternalModalContext.Provider>\n </OverlayTriggerStateContext.Provider>\n </Portal>\n </Show>\n );\n}\n\n/**\n * Modal is a dialog container that manages focus trapping, scroll prevention,\n * aria-hiding of content outside, and dismissal.\n *\n * Usage patterns:\n * 1. Standalone: `<Modal isOpen>...</Modal>` - Creates its own overlay\n * 2. With custom overlay: `<ModalOverlay><Modal>...</Modal></ModalOverlay>`\n *\n * Note: Due to SolidJS's eager JSX evaluation, we cannot detect at render time\n * whether Modal is wrapped in ModalOverlay. So standalone Modal always creates\n * an overlay, and wrapped Modal renders directly (relying on InternalModalContext).\n */\nexport function Modal(props: ModalProps): JSX.Element {\n // Check for InternalModalContext which signals we're inside a rendered ModalOverlay\n // This works because ModalContent is rendered INSIDE ModalOverlay's Show/Portal\n return <ModalContentWithAutoOverlay {...props} />;\n}\n\n/**\n * Helper component that handles the overlay detection.\n * By being a separate component, we can use Show to defer rendering until\n * the parent context is available.\n */\nfunction ModalContentWithAutoOverlay(props: ModalProps): JSX.Element {\n const [overlayProps, modalProps] = splitProps(props, [\n \"isOpen\",\n \"defaultOpen\",\n \"onOpenChange\",\n \"isDismissable\",\n \"isKeyboardDismissDisabled\",\n \"isEntering\",\n \"isExiting\",\n ]);\n\n // Check for InternalModalContext - if present, we're inside a ModalOverlay\n const internalContext = useContext(InternalModalContext);\n\n // If wrapped in ModalOverlay, just render the content. ModalContent reads the\n // overlay's InternalModalContext itself (via useContext), so nothing needs\n // threading — in both branches ModalContent renders inside a provider.\n if (internalContext) {\n return <ModalContent {...modalProps}>{props.children}</ModalContent>;\n }\n\n // For standalone usage, wrap in ModalOverlay.\n return (\n <ModalOverlay {...overlayProps}>\n <ModalContent {...modalProps}>{props.children}</ModalContent>\n </ModalOverlay>\n );\n}\n\n/**\n * Internal component that renders the actual modal content.\n * Used by both standalone Modal and Modal wrapped in ModalOverlay.\n */\nfunction ModalContent(props: ModalProps): JSX.Element {\n if (isServer) {\n return <>{props.children}</>;\n }\n\n const [local, rest] = splitProps(props, [\n \"children\",\n \"class\",\n \"style\",\n \"isOpen\",\n \"defaultOpen\",\n \"onOpenChange\",\n \"isDismissable\",\n \"isKeyboardDismissDisabled\",\n \"isEntering\",\n \"isExiting\",\n ]);\n\n let modalRef!: HTMLDivElement;\n const modalRefAccessor = () => modalRef ?? null;\n // Signal-backed element for the enter animation, so the effect re-runs when\n // the surface mounts (see the overlay's note); the plain `modalRef` var still\n // backs the synchronous consumers (focus stack, interact-outside, aria-hide).\n const [modalEl, setModalEl] = createSignal<HTMLElement | null>(null);\n\n // Get state from parent OverlayTriggerStateContext (provided by ModalOverlay)\n const parentState = useContext(OverlayTriggerStateContext);\n\n // The overlay (auto or user-provided) always wraps this content, so it owns\n // the InternalModalContext: dismissal settings, the modal-ref registration\n // sink, and the combined exit flag.\n const internalContext = useContext(InternalModalContext);\n\n // Get dismissable settings from internal context (set by ModalOverlay)\n const isDismissable = () => internalContext?.isDismissable ?? local.isDismissable;\n const isKeyboardDismissDisabled = () =>\n internalContext?.isKeyboardDismissDisabled ?? local.isKeyboardDismissDisabled;\n\n // Determine if open from parent state\n const isOpen = (): boolean => {\n if (local.isOpen !== undefined) return local.isOpen;\n return parentState?.isOpen ?? false;\n };\n\n // Register this element with the overlay so it can await the modal surface's\n // exit animation (upstream threads modalRef down the same way). The overlay's\n // combined exit flag drives this surface's `data-exiting`. The enter animation\n // is local — the modal fades/slides in on its own timeline (delay 160 vs the\n // overlay's 0).\n const registerModalRef = (element: HTMLDivElement) => {\n modalRef = element;\n setModalEl(element);\n internalContext?.setModalRef?.(element);\n };\n const isModalEntering = createEnterAnimation(() => modalEl(), isOpen);\n const isModalExiting = () => internalContext?.isExiting?.() ?? local.isExiting ?? false;\n\n // Keep this modal in a global stack so nested modals dismiss in top-down order.\n createEffect(() => {\n if (!isOpen()) return;\n\n pruneDisconnectedModals();\n if (!visibleModals.includes(modalRefAccessor)) {\n visibleModals.push(modalRefAccessor);\n }\n\n onCleanup(() => {\n const index = visibleModals.indexOf(modalRefAccessor);\n if (index >= 0) {\n visibleModals.splice(index, 1);\n }\n });\n });\n\n const isTopMostModal = () => {\n pruneDisconnectedModals();\n return visibleModals[visibleModals.length - 1] === modalRefAccessor;\n };\n\n const close = () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(false);\n } else {\n parentState?.close();\n }\n };\n\n // Prevent scroll when modal is open\n createEffect(() => {\n if (!isOpen()) return;\n\n const html = document.documentElement;\n const prevOverflow = html.style.overflow;\n html.style.overflow = \"hidden\";\n\n onCleanup(() => {\n html.style.overflow = prevOverflow;\n });\n });\n\n // Click outside to close (if dismissable)\n createEffect(() => {\n if (!isOpen() || !isDismissable()) return;\n\n createInteractOutside({\n ref: modalRefAccessor,\n onInteractOutside: () => {\n if (isTopMostModal()) {\n close();\n }\n },\n isDisabled: false,\n });\n });\n\n // Escape key to close\n createEffect(() => {\n if (!isOpen() || isKeyboardDismissDisabled()) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && !e.isComposing && isTopMostModal()) {\n e.preventDefault();\n e.stopPropagation();\n close();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", handleKeyDown, true);\n });\n });\n\n // Aria-hide outside content\n createEffect(() => {\n if (!isOpen() || !modalRef) return;\n\n let cleanup: (() => void) | undefined;\n let cancelled = false;\n const ownerWindow = modalRef.ownerDocument.defaultView ?? window;\n\n const hideOutside = () => {\n if (cancelled || !modalRef?.isConnected) return;\n cleanup = ariaHideOutside([modalRef], { shouldUseInert: true });\n };\n\n if (modalRef.isConnected) {\n hideOutside();\n } else {\n ownerWindow.queueMicrotask(hideOutside);\n }\n\n onCleanup(() => {\n cancelled = true;\n cleanup?.();\n });\n });\n\n const renderValues = createMemo<ModalRenderProps>(() => ({\n isEntering: isModalEntering(),\n isExiting: isModalExiting(),\n }));\n\n const renderProps = useRenderProps(\n {\n // Lazy: the modal content is gated behind `<Show when={isHydrated() && …}>`\n // (Portal) below, so it must not be instantiated during the component body.\n // An eager `children: props.children` would build the content template (and\n // walk getNextElement) before the gate — content the server never emitted →\n // hydration mismatch. See Popover for the full rationale.\n get children() {\n return props.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-Modal\",\n },\n renderValues,\n );\n\n const domProps = createMemo(() =>\n filterDOMProps(rest as Record<string, unknown>, { global: true }),\n );\n\n return (\n // No autoFocus: react-aria's Overlay renders FocusScope with restoreFocus +\n // contain only — initial focus is useDialog's job (it focuses the dialog\n // element itself when nothing inside holds focus).\n <FocusScope contain restoreFocus>\n <div\n {...domProps()}\n ref={registerModalRef}\n class={renderProps.class()}\n style={renderProps.style()}\n data-entering={dataAttr(isModalEntering())}\n data-exiting={dataAttr(isModalExiting())}\n >\n <Show when={isDismissable()}>\n {/* Faithful to react-aria's DismissButton: a bare button carrying\n only `width/height: 1px` inside a VisuallyHidden `div` wrapper —\n NOT the hidden styles inlined onto the button. The wrapper clips\n it out of sight while the button keeps its intrinsic UA border-box,\n which is exactly what upstream renders (and what D8 target-size\n measures against the pair oracle). Inlining the reset onto the\n button instead collapsed it to a 1x1 box, diverging from\n upstream's ~16x6 sentinel. */}\n <VisuallyHidden elementType=\"div\">\n <button\n aria-label=\"Dismiss\"\n tabIndex={-1}\n onClick={close}\n style={{ width: \"1px\", height: \"1px\" }}\n />\n </VisuallyHidden>\n </Show>\n {renderProps.renderChildren()}\n </div>\n </FocusScope>\n );\n}\n\nexport default Modal;\n"],"mappings":"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"}
|
package/dist/NumberField.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A pre-wired headless number field that combines state + aria hooks.
|
|
5
5
|
* Port of react-aria-components/src/NumberField.tsx
|
|
6
6
|
*/
|
|
7
|
-
import { type JSX } from "solid-js";
|
|
7
|
+
import { type JSX, type Context } from "solid-js";
|
|
8
8
|
import { type AriaNumberFieldProps, type AriaButtonProps } from "@proyecto-viviana/solidaria";
|
|
9
9
|
import { type NumberFieldState } from "@proyecto-viviana/solid-stately";
|
|
10
10
|
import { type RenderChildren, type ClassNameOrFunction, type StyleOrFunction, type SlotProps } from "./utils";
|
|
@@ -103,8 +103,8 @@ interface NumberFieldContextValue {
|
|
|
103
103
|
isReadOnly: boolean;
|
|
104
104
|
setInputRef: (el: HTMLInputElement) => void;
|
|
105
105
|
}
|
|
106
|
-
export declare const NumberFieldContext:
|
|
107
|
-
export declare const NumberFieldStateContext:
|
|
106
|
+
export declare const NumberFieldContext: Context<NumberFieldContextValue | null>;
|
|
107
|
+
export declare const NumberFieldStateContext: Context<NumberFieldState | null>;
|
|
108
108
|
/**
|
|
109
109
|
* A number field allows a user to enter a number and increment/decrement the value.
|
|
110
110
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.d.ts","sourceRoot":"","sources":["../src/NumberField.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"NumberField.d.ts","sourceRoot":"","sources":["../src/NumberField.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,GAAG,EACR,KAAK,OAAO,EAKb,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAChG,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,SAAS,EAIf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,sBAAsB;IACrC,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,UAAU,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAAE,SAAS;IACtF,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACzC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAClD,yCAAyC;IACzC,KAAK,CAAC,EAAE,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;IACpD,wCAAwC;IACxC,KAAK,CAAC,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,2BAA2B;IAC1C,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,cAAc,EAAE,OAAO,CAAC;IACxB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,SAAS;IACtD,yCAAyC;IACzC,KAAK,CAAC,EAAE,mBAAmB,CAAC,2BAA2B,CAAC,CAAC;IACzD,wCAAwC;IACxC,KAAK,CAAC,EAAE,eAAe,CAAC,2BAA2B,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,+BAAgC,SAAQ,SAAS;IAChE,kCAAkC;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAC,4BAA4B,CAAC,CAAC;IACxD,yCAAyC;IACzC,KAAK,CAAC,EAAE,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC1D,wCAAwC;IACxC,KAAK,CAAC,EAAE,eAAe,CAAC,4BAA4B,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,+BAAgC,SAAQ,SAAS;IAChE,kCAAkC;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAC,4BAA4B,CAAC,CAAC;IACxD,yCAAyC;IACzC,KAAK,CAAC,EAAE,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC1D,wCAAwC;IACxC,KAAK,CAAC,EAAE,eAAe,CAAC,4BAA4B,CAAC,CAAC;CACvD;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IACtD,oBAAoB,EAAE,eAAe,CAAC;IACtC,oBAAoB,EAAE,eAAe,CAAC;IACtC,UAAU,EAAE,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,UAAU,EAAE,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAClD,iBAAiB,EAAE,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,kBAAkB,yCAAsD,CAAC;AACtF,eAAO,MAAM,uBAAuB,kCAA+C,CAAC;AAEpF;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CA8QhE;yBA9Qe,WAAW;;;;;;;AAgR3B;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC;CAC3B,GAAG,GAAG,CAAC,OAAO,CA0Bd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,OAAO,CAsBvF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,GAAG,CAAC,OAAO,CAuE1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,+BAA+B,GAAG,GAAG,CAAC,OAAO,CA4E9F;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,+BAA+B,GAAG,GAAG,CAAC,OAAO,CA4E9F"}
|