@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
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { filterDOMProps, useRenderProps } from "./utils.js";
|
|
2
|
+
import { createComponent, getNextElement, insert, mergeProps, runHydrationEvents, spread, template, use } from "solid-js/web";
|
|
3
|
+
import { Show, createContext, createEffect, createMemo, createRenderEffect, createSignal, on, onCleanup, splitProps, untrack, useContext } from "solid-js";
|
|
4
|
+
//#region src/SharedElementTransition.tsx
|
|
5
|
+
/**
|
|
6
|
+
* SharedElementTransition primitives for solidaria-components.
|
|
7
|
+
*
|
|
8
|
+
* Provides FLIP-based shared element animations when elements move between
|
|
9
|
+
* parents within a scope. Captures geometry snapshots on unmount and applies
|
|
10
|
+
* transition animations on mount.
|
|
11
|
+
*
|
|
12
|
+
* Parity target: react-aria-components/src/SharedElementTransition.tsx
|
|
13
|
+
*/
|
|
14
|
+
var _tmpl$ = /*#__PURE__*/ template(`<div>`);
|
|
15
|
+
/** Safe wrapper — jsdom doesn't implement the Web Animations API. */
|
|
16
|
+
function getAnimations(el) {
|
|
17
|
+
return typeof el.getAnimations === "function" ? el.getAnimations() : [];
|
|
18
|
+
}
|
|
19
|
+
const SharedElementContext = createContext(null);
|
|
20
|
+
function useHasSharedElementTransitionScope() {
|
|
21
|
+
return useContext(SharedElementContext) != null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A scope for SharedElements, which animate between parents.
|
|
25
|
+
*/
|
|
26
|
+
function SharedElementTransition(props) {
|
|
27
|
+
return createComponent(SharedElementContext.Provider, {
|
|
28
|
+
value: { snapshots: {} },
|
|
29
|
+
get children() {
|
|
30
|
+
return props.children;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* An element that animates between its old and new position when moving
|
|
36
|
+
* between parents within a SharedElementTransition scope.
|
|
37
|
+
*/
|
|
38
|
+
function SharedElement(props) {
|
|
39
|
+
const scope = useContext(SharedElementContext);
|
|
40
|
+
if (!scope) throw new Error("<SharedElement> must be rendered inside a <SharedElementTransition>");
|
|
41
|
+
const [local, domProps] = splitProps(props, [
|
|
42
|
+
"name",
|
|
43
|
+
"isVisible",
|
|
44
|
+
"children",
|
|
45
|
+
"class",
|
|
46
|
+
"style",
|
|
47
|
+
"ref"
|
|
48
|
+
]);
|
|
49
|
+
const [lifecycle, setLifecycle] = createSignal(local.isVisible === false ? "hidden" : "visible");
|
|
50
|
+
const [element, setElement] = createSignal();
|
|
51
|
+
let frame;
|
|
52
|
+
const setRef = (el) => {
|
|
53
|
+
setElement(el);
|
|
54
|
+
const userRef = local.ref;
|
|
55
|
+
if (typeof userRef === "function") userRef(el);
|
|
56
|
+
else if (userRef !== void 0) userRef.current = el;
|
|
57
|
+
};
|
|
58
|
+
const storeSnapshot = () => {
|
|
59
|
+
const el = untrack(element);
|
|
60
|
+
if (el && el.isConnected && !el.hasAttribute("data-exiting")) {
|
|
61
|
+
const style = window.getComputedStyle(el);
|
|
62
|
+
if (style.transitionProperty !== "none") {
|
|
63
|
+
const transitionProperty = style.transitionProperty.split(/\s*,\s*/);
|
|
64
|
+
scope.snapshots[local.name] = {
|
|
65
|
+
rect: el.getBoundingClientRect(),
|
|
66
|
+
style: transitionProperty.map((property) => [property, style.getPropertyValue(property)])
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
createRenderEffect(on(() => local.isVisible !== false, (isVisible) => {
|
|
72
|
+
if (isVisible && untrack(lifecycle) === "hidden") setLifecycle("visible");
|
|
73
|
+
}));
|
|
74
|
+
createRenderEffect(on(() => local.isVisible !== false, (isVisible) => {
|
|
75
|
+
onCleanup(() => {
|
|
76
|
+
if (isVisible) storeSnapshot();
|
|
77
|
+
});
|
|
78
|
+
}));
|
|
79
|
+
createEffect(on([() => local.isVisible !== false, element], ([isVisible, el]) => {
|
|
80
|
+
const name = local.name;
|
|
81
|
+
if (frame != null) {
|
|
82
|
+
cancelAnimationFrame(frame);
|
|
83
|
+
frame = void 0;
|
|
84
|
+
}
|
|
85
|
+
if (isVisible && el) {
|
|
86
|
+
const prevSnapshot = scope.snapshots[name];
|
|
87
|
+
if (prevSnapshot) {
|
|
88
|
+
setLifecycle("visible");
|
|
89
|
+
const animations = getAnimations(el);
|
|
90
|
+
const values = prevSnapshot.style.map(([property, prevValue]) => {
|
|
91
|
+
const value = el.style.getPropertyValue(property);
|
|
92
|
+
if (property === "translate") {
|
|
93
|
+
const prevRect = prevSnapshot.rect;
|
|
94
|
+
const currentRect = el.getBoundingClientRect();
|
|
95
|
+
const deltaX = prevRect.left - currentRect.left;
|
|
96
|
+
const deltaY = prevRect.top - currentRect.top;
|
|
97
|
+
el.style.setProperty("translate", `${deltaX}px ${deltaY}px`);
|
|
98
|
+
} else el.style.setProperty(property, prevValue);
|
|
99
|
+
return [property, value];
|
|
100
|
+
});
|
|
101
|
+
for (const a of getAnimations(el)) if (!animations.includes(a)) a.cancel();
|
|
102
|
+
frame = requestAnimationFrame(() => {
|
|
103
|
+
frame = void 0;
|
|
104
|
+
for (const [property, value] of values) el.style.setProperty(property, value);
|
|
105
|
+
});
|
|
106
|
+
delete scope.snapshots[name];
|
|
107
|
+
} else {
|
|
108
|
+
queueMicrotask(() => setLifecycle("entering"));
|
|
109
|
+
frame = requestAnimationFrame(() => {
|
|
110
|
+
frame = void 0;
|
|
111
|
+
setLifecycle("visible");
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
} else if (!isVisible && el) queueMicrotask(() => {
|
|
115
|
+
if (scope.snapshots[name]) {
|
|
116
|
+
delete scope.snapshots[name];
|
|
117
|
+
setLifecycle("exiting");
|
|
118
|
+
Promise.all(getAnimations(el).map((a) => a.finished)).then(() => setLifecycle("hidden")).catch(() => {});
|
|
119
|
+
} else setLifecycle("hidden");
|
|
120
|
+
});
|
|
121
|
+
}));
|
|
122
|
+
onCleanup(() => {
|
|
123
|
+
if (frame != null) cancelAnimationFrame(frame);
|
|
124
|
+
});
|
|
125
|
+
const renderProps = useRenderProps({
|
|
126
|
+
get children() {
|
|
127
|
+
return local.children;
|
|
128
|
+
},
|
|
129
|
+
class: local.class,
|
|
130
|
+
style: local.style,
|
|
131
|
+
defaultClassName: "solidaria-SharedElement"
|
|
132
|
+
}, () => ({
|
|
133
|
+
isEntering: lifecycle() === "entering",
|
|
134
|
+
isExiting: lifecycle() === "exiting"
|
|
135
|
+
}));
|
|
136
|
+
const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
|
|
137
|
+
return createComponent(Show, {
|
|
138
|
+
get when() {
|
|
139
|
+
return lifecycle() !== "hidden";
|
|
140
|
+
},
|
|
141
|
+
get children() {
|
|
142
|
+
var _el$ = getNextElement(_tmpl$);
|
|
143
|
+
use(setRef, _el$);
|
|
144
|
+
spread(_el$, mergeProps(filteredDomProps, {
|
|
145
|
+
get ["class"]() {
|
|
146
|
+
return renderProps.class();
|
|
147
|
+
},
|
|
148
|
+
get style() {
|
|
149
|
+
return renderProps.style();
|
|
150
|
+
},
|
|
151
|
+
get ["data-entering"]() {
|
|
152
|
+
return lifecycle() === "entering" || void 0;
|
|
153
|
+
},
|
|
154
|
+
get ["data-exiting"]() {
|
|
155
|
+
return lifecycle() === "exiting" || void 0;
|
|
156
|
+
}
|
|
157
|
+
}), false, true);
|
|
158
|
+
insert(_el$, () => renderProps.renderChildren());
|
|
159
|
+
runHydrationEvents();
|
|
160
|
+
return _el$;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
export { SharedElement, SharedElementTransition, useHasSharedElementTransitionScope };
|
|
166
|
+
|
|
167
|
+
//# sourceMappingURL=SharedElementTransition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedElementTransition.js","names":["JSX","createContext","createEffect","createMemo","createRenderEffect","createSignal","onCleanup","splitProps","untrack","useContext","Show","on","ClassNameOrFunction","StyleOrFunction","RenderChildren","useRenderProps","filterDOMProps","SharedElementLifecycle","getAnimations","el","HTMLElement","Animation","Snapshot","rect","DOMRect","style","SharedElementScope","snapshots","name","SharedElementContext","useHasSharedElementTransitionScope","SharedElementTransitionProps","children","Element","SharedElementTransition","props","scope","_$createComponent","Provider","value","SharedElementRenderProps","isEntering","isExiting","SharedElementPropsBase","Omit","HTMLAttributes","HTMLDivElement","class","SharedElementProps","isVisible","ref","current","SharedElement","Error","local","domProps","lifecycle","setLifecycle","element","setElement","frame","setRef","userRef","undefined","storeSnapshot","isConnected","hasAttribute","window","getComputedStyle","transitionProperty","split","getBoundingClientRect","map","property","getPropertyValue","const","cancelAnimationFrame","prevSnapshot","animations","values","prevValue","prevRect","currentRect","deltaX","left","deltaY","top","setProperty","a","includes","cancel","requestAnimationFrame","queueMicrotask","Promise","all","finished","then","catch","renderProps","defaultClassName","filteredDomProps","global","when","_el$","_$getNextElement","_tmpl$","_$use","_$spread","_$mergeProps","data-entering","data-exiting","_$insert","renderChildren","_$runHydrationEvents"],"sources":["../src/SharedElementTransition.tsx"],"sourcesContent":["/**\n * SharedElementTransition primitives for solidaria-components.\n *\n * Provides FLIP-based shared element animations when elements move between\n * parents within a scope. Captures geometry snapshots on unmount and applies\n * transition animations on mount.\n *\n * Parity target: react-aria-components/src/SharedElementTransition.tsx\n */\n\nimport {\n type JSX,\n createContext,\n createEffect,\n createMemo,\n createRenderEffect,\n createSignal,\n onCleanup,\n splitProps,\n untrack,\n useContext,\n Show,\n on,\n} from \"solid-js\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type RenderChildren,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\n\ntype SharedElementLifecycle = \"hidden\" | \"entering\" | \"visible\" | \"exiting\";\n\n/** Safe wrapper — jsdom doesn't implement the Web Animations API. */\nfunction getAnimations(el: HTMLElement): Animation[] {\n return typeof el.getAnimations === \"function\" ? el.getAnimations() : [];\n}\n\ninterface Snapshot {\n rect: DOMRect;\n style: [string, string][];\n}\n\ninterface SharedElementScope {\n snapshots: { [name: string]: Snapshot };\n}\n\nconst SharedElementContext = createContext<SharedElementScope | null>(null);\n\nexport function useHasSharedElementTransitionScope(): boolean {\n return useContext(SharedElementContext) != null;\n}\n\nexport interface SharedElementTransitionProps {\n children?: JSX.Element;\n}\n\n/**\n * A scope for SharedElements, which animate between parents.\n */\nexport function SharedElementTransition(props: SharedElementTransitionProps): JSX.Element {\n const scope: SharedElementScope = {\n snapshots: {},\n };\n\n return (\n <SharedElementContext.Provider value={scope}>{props.children}</SharedElementContext.Provider>\n );\n}\n\nexport interface SharedElementRenderProps {\n isEntering: boolean;\n isExiting: boolean;\n}\n\nexport interface SharedElementPropsBase extends Omit<\n JSX.HTMLAttributes<HTMLDivElement>,\n \"children\" | \"class\" | \"style\" | \"ref\"\n> {\n children?: RenderChildren<SharedElementRenderProps>;\n class?: ClassNameOrFunction<SharedElementRenderProps>;\n style?: StyleOrFunction<SharedElementRenderProps>;\n}\n\nexport interface SharedElementProps extends SharedElementPropsBase {\n name: string;\n isVisible?: boolean;\n ref?: ((el: HTMLDivElement) => void) | { current?: HTMLDivElement };\n}\n\n/**\n * An element that animates between its old and new position when moving\n * between parents within a SharedElementTransition scope.\n */\nexport function SharedElement(props: SharedElementProps): JSX.Element | null {\n const scope = useContext(SharedElementContext);\n if (!scope) {\n throw new Error(\"<SharedElement> must be rendered inside a <SharedElementTransition>\");\n }\n\n const [local, domProps] = splitProps(props, [\n \"name\",\n \"isVisible\",\n \"children\",\n \"class\",\n \"style\",\n \"ref\",\n ]);\n\n const [lifecycle, setLifecycle] = createSignal<SharedElementLifecycle>(\n local.isVisible === false ? \"hidden\" : \"visible\",\n );\n\n // The mounted div, tracked as a signal so the FLIP-read effect below REACTS to\n // it appearing. React guarantees `ref.current` is committed before the layout\n // effect body runs; Solid gives no such ordering between the `<Show>`'s\n // insertion render-effect and a plain createEffect, so we make the read depend\n // on the element instead of racing its mount (see READ PHASE).\n const [element, setElement] = createSignal<HTMLDivElement | undefined>();\n let frame: number | undefined;\n\n const setRef = (el: HTMLDivElement) => {\n setElement(el);\n // Forward ref to consumer\n const userRef = local.ref;\n if (typeof userRef === \"function\") {\n userRef(el);\n } else if (userRef !== undefined) {\n userRef.current = el;\n }\n };\n\n // Store a geometry + transition-style snapshot of the currently-mounted\n // element, so a sibling SharedElement with the same `name` can FLIP from it.\n // Mirrors upstream's layout-effect *cleanup*\n // (react-aria-components/src/SharedElementTransition.tsx), which runs for\n // every `isVisible` flip — not only on unmount.\n const storeSnapshot = () => {\n const el = untrack(element);\n if (el && el.isConnected && !el.hasAttribute(\"data-exiting\")) {\n // Store a snapshot of the rectangle and computed style for transitioning properties.\n const style = window.getComputedStyle(el);\n if (style.transitionProperty !== \"none\") {\n const transitionProperty = style.transitionProperty.split(/\\s*,\\s*/);\n scope.snapshots[local.name] = {\n rect: el.getBoundingClientRect(),\n style: transitionProperty.map((property) => [property, style.getPropertyValue(property)]),\n };\n }\n }\n };\n\n // MOUNT-IN-RENDER — mirrors upstream's render-phase\n // `if (isVisible && state === 'hidden') setState('visible')`. Promoting a\n // hidden element to visible in the render phase mounts its div (via the\n // `<Show>` below) BEFORE the FLIP-read createEffect runs, so the incoming\n // element is in the DOM to be measured and translated. Without this the\n // incoming element's ref is still null when the read effect fires and it can\n // only enter fresh — never FLIP. Keyed on `isVisible` (untracked lifecycle\n // read) so it cannot loop.\n createRenderEffect(\n on(\n () => local.isVisible !== false,\n (isVisible) => {\n if (isVisible && untrack(lifecycle) === \"hidden\") {\n setLifecycle(\"visible\");\n }\n },\n ),\n );\n\n // STORE PHASE — a render effect runs before user effects within a Solid\n // batch, exactly as React runs all layout-effect destroys before any create.\n // The cleanup registered here fires on the *next* `isVisible` change (and on\n // disposal), capturing the outgoing snapshot BEFORE any sibling's FLIP-read\n // createEffect below runs — React's two-phase commit. Only the cleanup\n // registered while VISIBLE stores (an outgoing element); an incoming\n // element's prior cleanup was registered while hidden and must not clobber\n // the outgoing snapshot. This mirrors React closing over `element =\n // ref.current`, which is null while hidden.\n createRenderEffect(\n on(\n () => local.isVisible !== false,\n (isVisible) => {\n onCleanup(() => {\n if (isVisible) {\n storeSnapshot();\n }\n });\n },\n ),\n );\n\n // READ PHASE — mirrors upstream's layout-effect body, which reads the freshly\n // committed `ref.current`. Keying on the `element` signal (not just isVisible)\n // makes this run only once the incoming div is actually mounted: when isVisible\n // flips true the mount-in-render effect above mounts the div, `setRef` sets the\n // signal, and this effect runs with `el` present — never against a null ref.\n // (Solid batches, so an isVisible flip + the resulting mount coalesce into one\n // run with the mounted element.) There is therefore no \"element not yet in DOM\"\n // fresh-enter branch: with no committed div there is nothing to measure, so we\n // wait — exactly as React never runs the body before commit.\n createEffect(\n on(\n [() => local.isVisible !== false, element] as const,\n ([isVisible, el]) => {\n const name = local.name;\n\n if (frame != null) {\n cancelAnimationFrame(frame);\n frame = undefined;\n }\n\n if (isVisible && el) {\n const prevSnapshot = scope.snapshots[name];\n\n if (prevSnapshot) {\n // FLIP: Element is transitioning from a previous instance.\n setLifecycle(\"visible\");\n const animations = getAnimations(el);\n\n // Set properties to animate from.\n const values = prevSnapshot.style.map(([property, prevValue]) => {\n const value = el.style.getPropertyValue(property);\n if (property === \"translate\") {\n const prevRect = prevSnapshot.rect;\n const currentRect = el.getBoundingClientRect();\n const deltaX = prevRect.left - currentRect.left;\n const deltaY = prevRect.top - currentRect.top;\n el.style.setProperty(\"translate\", `${deltaX}px ${deltaY}px`);\n } else {\n el.style.setProperty(property, prevValue);\n }\n return [property, value] as [string, string];\n });\n\n // Cancel any new animations triggered by these properties.\n for (const a of getAnimations(el)) {\n if (!animations.includes(a)) {\n a.cancel();\n }\n }\n\n // Remove overrides after one frame to animate to the current values.\n frame = requestAnimationFrame(() => {\n frame = undefined;\n for (const [property, value] of values) {\n el.style.setProperty(property, value);\n }\n });\n\n delete scope.snapshots[name];\n } else {\n // No previous instance exists, apply the entering state.\n queueMicrotask(() => setLifecycle(\"entering\"));\n frame = requestAnimationFrame(() => {\n frame = undefined;\n setLifecycle(\"visible\");\n });\n }\n } else if (!isVisible && el) {\n // Wait a microtask to check if a snapshot still exists (meaning no new\n // SharedElement consumed it), then enter exiting state.\n queueMicrotask(() => {\n if (scope.snapshots[name]) {\n delete scope.snapshots[name];\n setLifecycle(\"exiting\");\n // Wait for animations to finish before hiding.\n Promise.all(getAnimations(el).map((a) => a.finished))\n .then(() => setLifecycle(\"hidden\"))\n .catch(() => {});\n } else {\n // Snapshot was consumed by another instance, unmount immediately.\n setLifecycle(\"hidden\");\n }\n });\n }\n },\n ),\n );\n\n // Cancel any pending FLIP frame on disposal. The snapshot store lives in the\n // render-effect cleanup above, which also fires on disposal.\n onCleanup(() => {\n if (frame != null) {\n cancelAnimationFrame(frame);\n }\n });\n\n const renderProps = useRenderProps(\n {\n get children() {\n return local.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-SharedElement\",\n },\n () => ({\n isEntering: lifecycle() === \"entering\",\n isExiting: lifecycle() === \"exiting\",\n }),\n );\n\n const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));\n\n return (\n <Show when={lifecycle() !== \"hidden\"}>\n <div\n ref={setRef}\n {...filteredDomProps()}\n class={renderProps.class()}\n style={renderProps.style()}\n data-entering={lifecycle() === \"entering\" || undefined}\n data-exiting={lifecycle() === \"exiting\" || undefined}\n >\n {renderProps.renderChildren()}\n </div>\n </Show>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { filterDOMProps, useRenderProps } from "./utils.jsx";
|
|
2
|
+
import { Show, createContext, createEffect, createMemo, createRenderEffect, createSignal, on, onCleanup, splitProps, untrack, useContext } from "solid-js";
|
|
3
|
+
//#region src/SharedElementTransition.tsx
|
|
4
|
+
/**
|
|
5
|
+
* SharedElementTransition primitives for solidaria-components.
|
|
6
|
+
*
|
|
7
|
+
* Provides FLIP-based shared element animations when elements move between
|
|
8
|
+
* parents within a scope. Captures geometry snapshots on unmount and applies
|
|
9
|
+
* transition animations on mount.
|
|
10
|
+
*
|
|
11
|
+
* Parity target: react-aria-components/src/SharedElementTransition.tsx
|
|
12
|
+
*/
|
|
13
|
+
/** Safe wrapper — jsdom doesn't implement the Web Animations API. */
|
|
14
|
+
function getAnimations(el) {
|
|
15
|
+
return typeof el.getAnimations === "function" ? el.getAnimations() : [];
|
|
16
|
+
}
|
|
17
|
+
const SharedElementContext = createContext(null);
|
|
18
|
+
function useHasSharedElementTransitionScope() {
|
|
19
|
+
return useContext(SharedElementContext) != null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A scope for SharedElements, which animate between parents.
|
|
23
|
+
*/
|
|
24
|
+
function SharedElementTransition(props) {
|
|
25
|
+
const scope = { snapshots: {} };
|
|
26
|
+
return <SharedElementContext.Provider value={scope}>{props.children}</SharedElementContext.Provider>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* An element that animates between its old and new position when moving
|
|
30
|
+
* between parents within a SharedElementTransition scope.
|
|
31
|
+
*/
|
|
32
|
+
function SharedElement(props) {
|
|
33
|
+
const scope = useContext(SharedElementContext);
|
|
34
|
+
if (!scope) throw new Error("<SharedElement> must be rendered inside a <SharedElementTransition>");
|
|
35
|
+
const [local, domProps] = splitProps(props, [
|
|
36
|
+
"name",
|
|
37
|
+
"isVisible",
|
|
38
|
+
"children",
|
|
39
|
+
"class",
|
|
40
|
+
"style",
|
|
41
|
+
"ref"
|
|
42
|
+
]);
|
|
43
|
+
const [lifecycle, setLifecycle] = createSignal(local.isVisible === false ? "hidden" : "visible");
|
|
44
|
+
const [element, setElement] = createSignal();
|
|
45
|
+
let frame;
|
|
46
|
+
const setRef = (el) => {
|
|
47
|
+
setElement(el);
|
|
48
|
+
const userRef = local.ref;
|
|
49
|
+
if (typeof userRef === "function") userRef(el);
|
|
50
|
+
else if (userRef !== void 0) userRef.current = el;
|
|
51
|
+
};
|
|
52
|
+
const storeSnapshot = () => {
|
|
53
|
+
const el = untrack(element);
|
|
54
|
+
if (el && el.isConnected && !el.hasAttribute("data-exiting")) {
|
|
55
|
+
const style = window.getComputedStyle(el);
|
|
56
|
+
if (style.transitionProperty !== "none") {
|
|
57
|
+
const transitionProperty = style.transitionProperty.split(/\s*,\s*/);
|
|
58
|
+
scope.snapshots[local.name] = {
|
|
59
|
+
rect: el.getBoundingClientRect(),
|
|
60
|
+
style: transitionProperty.map((property) => [property, style.getPropertyValue(property)])
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
createRenderEffect(on(() => local.isVisible !== false, (isVisible) => {
|
|
66
|
+
if (isVisible && untrack(lifecycle) === "hidden") setLifecycle("visible");
|
|
67
|
+
}));
|
|
68
|
+
createRenderEffect(on(() => local.isVisible !== false, (isVisible) => {
|
|
69
|
+
onCleanup(() => {
|
|
70
|
+
if (isVisible) storeSnapshot();
|
|
71
|
+
});
|
|
72
|
+
}));
|
|
73
|
+
createEffect(on([() => local.isVisible !== false, element], ([isVisible, el]) => {
|
|
74
|
+
const name = local.name;
|
|
75
|
+
if (frame != null) {
|
|
76
|
+
cancelAnimationFrame(frame);
|
|
77
|
+
frame = void 0;
|
|
78
|
+
}
|
|
79
|
+
if (isVisible && el) {
|
|
80
|
+
const prevSnapshot = scope.snapshots[name];
|
|
81
|
+
if (prevSnapshot) {
|
|
82
|
+
setLifecycle("visible");
|
|
83
|
+
const animations = getAnimations(el);
|
|
84
|
+
const values = prevSnapshot.style.map(([property, prevValue]) => {
|
|
85
|
+
const value = el.style.getPropertyValue(property);
|
|
86
|
+
if (property === "translate") {
|
|
87
|
+
const prevRect = prevSnapshot.rect;
|
|
88
|
+
const currentRect = el.getBoundingClientRect();
|
|
89
|
+
const deltaX = prevRect.left - currentRect.left;
|
|
90
|
+
const deltaY = prevRect.top - currentRect.top;
|
|
91
|
+
el.style.setProperty("translate", `${deltaX}px ${deltaY}px`);
|
|
92
|
+
} else el.style.setProperty(property, prevValue);
|
|
93
|
+
return [property, value];
|
|
94
|
+
});
|
|
95
|
+
for (const a of getAnimations(el)) if (!animations.includes(a)) a.cancel();
|
|
96
|
+
frame = requestAnimationFrame(() => {
|
|
97
|
+
frame = void 0;
|
|
98
|
+
for (const [property, value] of values) el.style.setProperty(property, value);
|
|
99
|
+
});
|
|
100
|
+
delete scope.snapshots[name];
|
|
101
|
+
} else {
|
|
102
|
+
queueMicrotask(() => setLifecycle("entering"));
|
|
103
|
+
frame = requestAnimationFrame(() => {
|
|
104
|
+
frame = void 0;
|
|
105
|
+
setLifecycle("visible");
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
} else if (!isVisible && el) queueMicrotask(() => {
|
|
109
|
+
if (scope.snapshots[name]) {
|
|
110
|
+
delete scope.snapshots[name];
|
|
111
|
+
setLifecycle("exiting");
|
|
112
|
+
Promise.all(getAnimations(el).map((a) => a.finished)).then(() => setLifecycle("hidden")).catch(() => {});
|
|
113
|
+
} else setLifecycle("hidden");
|
|
114
|
+
});
|
|
115
|
+
}));
|
|
116
|
+
onCleanup(() => {
|
|
117
|
+
if (frame != null) cancelAnimationFrame(frame);
|
|
118
|
+
});
|
|
119
|
+
const renderProps = useRenderProps({
|
|
120
|
+
get children() {
|
|
121
|
+
return local.children;
|
|
122
|
+
},
|
|
123
|
+
class: local.class,
|
|
124
|
+
style: local.style,
|
|
125
|
+
defaultClassName: "solidaria-SharedElement"
|
|
126
|
+
}, () => ({
|
|
127
|
+
isEntering: lifecycle() === "entering",
|
|
128
|
+
isExiting: lifecycle() === "exiting"
|
|
129
|
+
}));
|
|
130
|
+
const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
|
|
131
|
+
return <Show when={lifecycle() !== "hidden"}>
|
|
132
|
+
<div ref={setRef} {...filteredDomProps()} class={renderProps.class()} style={renderProps.style()} data-entering={lifecycle() === "entering" || void 0} data-exiting={lifecycle() === "exiting" || void 0}>
|
|
133
|
+
{renderProps.renderChildren()}
|
|
134
|
+
</div>
|
|
135
|
+
</Show>;
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
export { SharedElement, SharedElementTransition, useHasSharedElementTransitionScope };
|
|
139
|
+
|
|
140
|
+
//# sourceMappingURL=SharedElementTransition.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedElementTransition.jsx","names":[],"sources":["../src/SharedElementTransition.tsx"],"sourcesContent":["/**\n * SharedElementTransition primitives for solidaria-components.\n *\n * Provides FLIP-based shared element animations when elements move between\n * parents within a scope. Captures geometry snapshots on unmount and applies\n * transition animations on mount.\n *\n * Parity target: react-aria-components/src/SharedElementTransition.tsx\n */\n\nimport {\n type JSX,\n createContext,\n createEffect,\n createMemo,\n createRenderEffect,\n createSignal,\n onCleanup,\n splitProps,\n untrack,\n useContext,\n Show,\n on,\n} from \"solid-js\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type RenderChildren,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\n\ntype SharedElementLifecycle = \"hidden\" | \"entering\" | \"visible\" | \"exiting\";\n\n/** Safe wrapper — jsdom doesn't implement the Web Animations API. */\nfunction getAnimations(el: HTMLElement): Animation[] {\n return typeof el.getAnimations === \"function\" ? el.getAnimations() : [];\n}\n\ninterface Snapshot {\n rect: DOMRect;\n style: [string, string][];\n}\n\ninterface SharedElementScope {\n snapshots: { [name: string]: Snapshot };\n}\n\nconst SharedElementContext = createContext<SharedElementScope | null>(null);\n\nexport function useHasSharedElementTransitionScope(): boolean {\n return useContext(SharedElementContext) != null;\n}\n\nexport interface SharedElementTransitionProps {\n children?: JSX.Element;\n}\n\n/**\n * A scope for SharedElements, which animate between parents.\n */\nexport function SharedElementTransition(props: SharedElementTransitionProps): JSX.Element {\n const scope: SharedElementScope = {\n snapshots: {},\n };\n\n return (\n <SharedElementContext.Provider value={scope}>{props.children}</SharedElementContext.Provider>\n );\n}\n\nexport interface SharedElementRenderProps {\n isEntering: boolean;\n isExiting: boolean;\n}\n\nexport interface SharedElementPropsBase extends Omit<\n JSX.HTMLAttributes<HTMLDivElement>,\n \"children\" | \"class\" | \"style\" | \"ref\"\n> {\n children?: RenderChildren<SharedElementRenderProps>;\n class?: ClassNameOrFunction<SharedElementRenderProps>;\n style?: StyleOrFunction<SharedElementRenderProps>;\n}\n\nexport interface SharedElementProps extends SharedElementPropsBase {\n name: string;\n isVisible?: boolean;\n ref?: ((el: HTMLDivElement) => void) | { current?: HTMLDivElement };\n}\n\n/**\n * An element that animates between its old and new position when moving\n * between parents within a SharedElementTransition scope.\n */\nexport function SharedElement(props: SharedElementProps): JSX.Element | null {\n const scope = useContext(SharedElementContext);\n if (!scope) {\n throw new Error(\"<SharedElement> must be rendered inside a <SharedElementTransition>\");\n }\n\n const [local, domProps] = splitProps(props, [\n \"name\",\n \"isVisible\",\n \"children\",\n \"class\",\n \"style\",\n \"ref\",\n ]);\n\n const [lifecycle, setLifecycle] = createSignal<SharedElementLifecycle>(\n local.isVisible === false ? \"hidden\" : \"visible\",\n );\n\n // The mounted div, tracked as a signal so the FLIP-read effect below REACTS to\n // it appearing. React guarantees `ref.current` is committed before the layout\n // effect body runs; Solid gives no such ordering between the `<Show>`'s\n // insertion render-effect and a plain createEffect, so we make the read depend\n // on the element instead of racing its mount (see READ PHASE).\n const [element, setElement] = createSignal<HTMLDivElement | undefined>();\n let frame: number | undefined;\n\n const setRef = (el: HTMLDivElement) => {\n setElement(el);\n // Forward ref to consumer\n const userRef = local.ref;\n if (typeof userRef === \"function\") {\n userRef(el);\n } else if (userRef !== undefined) {\n userRef.current = el;\n }\n };\n\n // Store a geometry + transition-style snapshot of the currently-mounted\n // element, so a sibling SharedElement with the same `name` can FLIP from it.\n // Mirrors upstream's layout-effect *cleanup*\n // (react-aria-components/src/SharedElementTransition.tsx), which runs for\n // every `isVisible` flip — not only on unmount.\n const storeSnapshot = () => {\n const el = untrack(element);\n if (el && el.isConnected && !el.hasAttribute(\"data-exiting\")) {\n // Store a snapshot of the rectangle and computed style for transitioning properties.\n const style = window.getComputedStyle(el);\n if (style.transitionProperty !== \"none\") {\n const transitionProperty = style.transitionProperty.split(/\\s*,\\s*/);\n scope.snapshots[local.name] = {\n rect: el.getBoundingClientRect(),\n style: transitionProperty.map((property) => [property, style.getPropertyValue(property)]),\n };\n }\n }\n };\n\n // MOUNT-IN-RENDER — mirrors upstream's render-phase\n // `if (isVisible && state === 'hidden') setState('visible')`. Promoting a\n // hidden element to visible in the render phase mounts its div (via the\n // `<Show>` below) BEFORE the FLIP-read createEffect runs, so the incoming\n // element is in the DOM to be measured and translated. Without this the\n // incoming element's ref is still null when the read effect fires and it can\n // only enter fresh — never FLIP. Keyed on `isVisible` (untracked lifecycle\n // read) so it cannot loop.\n createRenderEffect(\n on(\n () => local.isVisible !== false,\n (isVisible) => {\n if (isVisible && untrack(lifecycle) === \"hidden\") {\n setLifecycle(\"visible\");\n }\n },\n ),\n );\n\n // STORE PHASE — a render effect runs before user effects within a Solid\n // batch, exactly as React runs all layout-effect destroys before any create.\n // The cleanup registered here fires on the *next* `isVisible` change (and on\n // disposal), capturing the outgoing snapshot BEFORE any sibling's FLIP-read\n // createEffect below runs — React's two-phase commit. Only the cleanup\n // registered while VISIBLE stores (an outgoing element); an incoming\n // element's prior cleanup was registered while hidden and must not clobber\n // the outgoing snapshot. This mirrors React closing over `element =\n // ref.current`, which is null while hidden.\n createRenderEffect(\n on(\n () => local.isVisible !== false,\n (isVisible) => {\n onCleanup(() => {\n if (isVisible) {\n storeSnapshot();\n }\n });\n },\n ),\n );\n\n // READ PHASE — mirrors upstream's layout-effect body, which reads the freshly\n // committed `ref.current`. Keying on the `element` signal (not just isVisible)\n // makes this run only once the incoming div is actually mounted: when isVisible\n // flips true the mount-in-render effect above mounts the div, `setRef` sets the\n // signal, and this effect runs with `el` present — never against a null ref.\n // (Solid batches, so an isVisible flip + the resulting mount coalesce into one\n // run with the mounted element.) There is therefore no \"element not yet in DOM\"\n // fresh-enter branch: with no committed div there is nothing to measure, so we\n // wait — exactly as React never runs the body before commit.\n createEffect(\n on(\n [() => local.isVisible !== false, element] as const,\n ([isVisible, el]) => {\n const name = local.name;\n\n if (frame != null) {\n cancelAnimationFrame(frame);\n frame = undefined;\n }\n\n if (isVisible && el) {\n const prevSnapshot = scope.snapshots[name];\n\n if (prevSnapshot) {\n // FLIP: Element is transitioning from a previous instance.\n setLifecycle(\"visible\");\n const animations = getAnimations(el);\n\n // Set properties to animate from.\n const values = prevSnapshot.style.map(([property, prevValue]) => {\n const value = el.style.getPropertyValue(property);\n if (property === \"translate\") {\n const prevRect = prevSnapshot.rect;\n const currentRect = el.getBoundingClientRect();\n const deltaX = prevRect.left - currentRect.left;\n const deltaY = prevRect.top - currentRect.top;\n el.style.setProperty(\"translate\", `${deltaX}px ${deltaY}px`);\n } else {\n el.style.setProperty(property, prevValue);\n }\n return [property, value] as [string, string];\n });\n\n // Cancel any new animations triggered by these properties.\n for (const a of getAnimations(el)) {\n if (!animations.includes(a)) {\n a.cancel();\n }\n }\n\n // Remove overrides after one frame to animate to the current values.\n frame = requestAnimationFrame(() => {\n frame = undefined;\n for (const [property, value] of values) {\n el.style.setProperty(property, value);\n }\n });\n\n delete scope.snapshots[name];\n } else {\n // No previous instance exists, apply the entering state.\n queueMicrotask(() => setLifecycle(\"entering\"));\n frame = requestAnimationFrame(() => {\n frame = undefined;\n setLifecycle(\"visible\");\n });\n }\n } else if (!isVisible && el) {\n // Wait a microtask to check if a snapshot still exists (meaning no new\n // SharedElement consumed it), then enter exiting state.\n queueMicrotask(() => {\n if (scope.snapshots[name]) {\n delete scope.snapshots[name];\n setLifecycle(\"exiting\");\n // Wait for animations to finish before hiding.\n Promise.all(getAnimations(el).map((a) => a.finished))\n .then(() => setLifecycle(\"hidden\"))\n .catch(() => {});\n } else {\n // Snapshot was consumed by another instance, unmount immediately.\n setLifecycle(\"hidden\");\n }\n });\n }\n },\n ),\n );\n\n // Cancel any pending FLIP frame on disposal. The snapshot store lives in the\n // render-effect cleanup above, which also fires on disposal.\n onCleanup(() => {\n if (frame != null) {\n cancelAnimationFrame(frame);\n }\n });\n\n const renderProps = useRenderProps(\n {\n get children() {\n return local.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-SharedElement\",\n },\n () => ({\n isEntering: lifecycle() === \"entering\",\n isExiting: lifecycle() === \"exiting\",\n }),\n );\n\n const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));\n\n return (\n <Show when={lifecycle() !== \"hidden\"}>\n <div\n ref={setRef}\n {...filteredDomProps()}\n class={renderProps.class()}\n style={renderProps.style()}\n data-entering={lifecycle() === \"entering\" || undefined}\n data-exiting={lifecycle() === \"exiting\" || undefined}\n >\n {renderProps.renderChildren()}\n </div>\n </Show>\n );\n}\n"],"mappings":"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"}
|
package/dist/Slider.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Port of react-aria-components/src/Slider.tsx
|
|
6
6
|
*/
|
|
7
7
|
import { type JSX } from "solid-js";
|
|
8
|
-
import { type AriaSliderProps } from "@proyecto-viviana/solidaria";
|
|
8
|
+
import { type AriaSliderProps, type HoverEvents } from "@proyecto-viviana/solidaria";
|
|
9
9
|
import { type SliderState, type SliderOrientation } from "@proyecto-viviana/solid-stately";
|
|
10
10
|
import { type RenderChildren, type ClassNameOrFunction, type StyleOrFunction, type SlotProps } from "./utils";
|
|
11
11
|
export interface SliderRenderProps {
|
|
@@ -96,6 +96,26 @@ export interface SliderThumbProps extends SlotProps, Omit<JSX.HTMLAttributes<HTM
|
|
|
96
96
|
/** The inline style for the element. */
|
|
97
97
|
style?: StyleOrFunction<SliderThumbRenderProps>;
|
|
98
98
|
}
|
|
99
|
+
export interface SliderFillRenderProps {
|
|
100
|
+
/** Whether the slider is disabled. */
|
|
101
|
+
isDisabled: boolean;
|
|
102
|
+
/** Whether the slider fill is currently hovered with a mouse. */
|
|
103
|
+
isHovered: boolean;
|
|
104
|
+
/** The value as a percent (0-1). */
|
|
105
|
+
valuePercent: number;
|
|
106
|
+
/** The orientation. */
|
|
107
|
+
orientation: SliderOrientation;
|
|
108
|
+
}
|
|
109
|
+
export interface SliderFillProps extends SlotProps, HoverEvents, Omit<JSX.HTMLAttributes<HTMLDivElement>, "class" | "style" | "children"> {
|
|
110
|
+
/** The offset from which to start the fill. Defaults to the slider's minValue. */
|
|
111
|
+
offset?: number;
|
|
112
|
+
/** The children of the fill. */
|
|
113
|
+
children?: RenderChildren<SliderFillRenderProps>;
|
|
114
|
+
/** The CSS className for the element. */
|
|
115
|
+
class?: ClassNameOrFunction<SliderFillRenderProps>;
|
|
116
|
+
/** The inline style for the element. */
|
|
117
|
+
style?: StyleOrFunction<SliderFillRenderProps>;
|
|
118
|
+
}
|
|
99
119
|
export interface SliderOutputRenderProps {
|
|
100
120
|
/** The current value. */
|
|
101
121
|
value: number;
|
|
@@ -124,6 +144,7 @@ interface SliderContextValue {
|
|
|
124
144
|
export declare const SliderContext: import("solid-js").Context<SliderContextValue | null>;
|
|
125
145
|
export declare const SliderStateContext: import("solid-js").Context<SliderContextValue | null>;
|
|
126
146
|
export declare const SliderTrackContext: import("solid-js").Context<SliderContextValue | null>;
|
|
147
|
+
export declare const SliderFillContext: import("solid-js").Context<SliderContextValue | null>;
|
|
127
148
|
export declare const SliderOutputContext: import("solid-js").Context<SliderContextValue | null>;
|
|
128
149
|
/**
|
|
129
150
|
* A slider allows users to select a value from a range.
|
|
@@ -132,6 +153,7 @@ export declare function Slider(props: SliderProps): JSX.Element;
|
|
|
132
153
|
export declare namespace Slider {
|
|
133
154
|
var Track: typeof SliderTrack;
|
|
134
155
|
var Thumb: typeof SliderThumb;
|
|
156
|
+
var Fill: typeof SliderFill;
|
|
135
157
|
var Output: typeof SliderOutput;
|
|
136
158
|
}
|
|
137
159
|
/**
|
|
@@ -142,6 +164,16 @@ export declare function SliderTrack(props: SliderTrackProps): JSX.Element;
|
|
|
142
164
|
* The thumb element of a slider.
|
|
143
165
|
*/
|
|
144
166
|
export declare function SliderThumb(props: SliderThumbProps): JSX.Element;
|
|
167
|
+
/**
|
|
168
|
+
* The fill element of a slider, displaying the selected range.
|
|
169
|
+
*
|
|
170
|
+
* Port of react-aria-components `SliderFill` (RAC 1.18). Upstream reads the
|
|
171
|
+
* array-based `SliderState` (`values`/`getThumbPercent`); our `SliderState` is
|
|
172
|
+
* single-value, so this fills from `offset` (default the slider's minValue, i.e.
|
|
173
|
+
* 0%) to the current value — the single-thumb branch of upstream's math, using
|
|
174
|
+
* the same `(v - min) / (max - min)` percent formula the state itself uses.
|
|
175
|
+
*/
|
|
176
|
+
export declare function SliderFill(props: SliderFillProps): JSX.Element;
|
|
145
177
|
/**
|
|
146
178
|
* The output element of a slider, displaying the current value.
|
|
147
179
|
*/
|
package/dist/Slider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slider.d.ts","sourceRoot":"","sources":["../src/Slider.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,GAAG,EAA2D,MAAM,UAAU,CAAC;AAC7F,OAAO,EAKL,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"Slider.d.ts","sourceRoot":"","sources":["../src/Slider.tsx"],"names":[],"mappings":"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"}
|