@pzerelles/headlessui-svelte 2.1.1-next.1 → 2.1.2-next.3
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/button/Button.svelte +6 -10
- package/dist/button/Button.svelte.d.ts +34 -26
- package/dist/checkbox/Checkbox.svelte +40 -22
- package/dist/checkbox/Checkbox.svelte.d.ts +44 -28
- package/dist/close-button/CloseButton.svelte +5 -4
- package/dist/close-button/CloseButton.svelte.d.ts +36 -13
- package/dist/combobox/Combobox.svelte +2 -2
- package/dist/combobox/Combobox.svelte.d.ts +9 -9
- package/dist/data-interactive/DataInteractive.svelte +41 -0
- package/dist/data-interactive/DataInteractive.svelte.d.ts +39 -0
- package/dist/data-interactive/index.d.ts +1 -0
- package/dist/data-interactive/index.js +1 -0
- package/dist/description/Description.svelte +10 -53
- package/dist/description/Description.svelte.d.ts +15 -32
- package/dist/description/context.svelte.d.ts +17 -0
- package/dist/description/context.svelte.js +51 -0
- package/dist/dialog/Dialog.svelte +51 -0
- package/dist/dialog/Dialog.svelte.d.ts +60 -0
- package/dist/dialog/DialogBackdrop.svelte +39 -0
- package/dist/dialog/DialogBackdrop.svelte.d.ts +38 -0
- package/dist/dialog/DialogPanel.svelte +46 -0
- package/dist/dialog/DialogPanel.svelte.d.ts +40 -0
- package/dist/dialog/DialogTitle.svelte +29 -0
- package/dist/dialog/DialogTitle.svelte.d.ts +34 -0
- package/dist/dialog/InternalDialog.svelte +233 -0
- package/dist/dialog/InternalDialog.svelte.d.ts +42 -0
- package/dist/dialog/context.svelte.d.ts +15 -0
- package/dist/dialog/context.svelte.js +16 -0
- package/dist/dialog/index.d.ts +4 -0
- package/dist/dialog/index.js +4 -0
- package/dist/field/Field.svelte +8 -10
- package/dist/field/Field.svelte.d.ts +21 -17
- package/dist/fieldset/Fieldset.svelte +11 -9
- package/dist/fieldset/Fieldset.svelte.d.ts +21 -17
- package/dist/focus-trap/FocusTrap.svelte +332 -0
- package/dist/focus-trap/FocusTrap.svelte.d.ts +58 -0
- package/dist/hooks/use-controllable.svelte.d.ts +1 -1
- package/dist/hooks/use-controllable.svelte.js +3 -3
- package/dist/hooks/use-escape.svelte.d.ts +5 -0
- package/dist/hooks/use-escape.svelte.js +26 -0
- package/dist/hooks/use-event-listener.svelte.d.ts +6 -0
- package/dist/hooks/use-event-listener.svelte.js +12 -0
- package/dist/hooks/use-inert-others.svelte.d.ts +2 -2
- package/dist/hooks/use-inert-others.svelte.js +3 -3
- package/dist/hooks/use-is-mounted.svelte.d.ts +3 -0
- package/dist/hooks/use-is-mounted.svelte.js +14 -0
- package/dist/hooks/use-is-touch-device.svelte.d.ts +3 -0
- package/dist/hooks/use-is-touch-device.svelte.js +20 -0
- package/dist/hooks/use-root-containers.svelte.d.ts +9 -0
- package/dist/hooks/use-root-containers.svelte.js +50 -0
- package/dist/hooks/use-tab-direction.svelte.d.ts +7 -0
- package/dist/hooks/use-tab-direction.svelte.js +25 -0
- package/dist/hooks/use-transition.svelte.js +14 -13
- package/dist/hooks/use-tree-walker.svelte.d.ts +8 -0
- package/dist/hooks/use-tree-walker.svelte.js +19 -0
- package/dist/hooks/use-watch.svelte.d.ts +4 -0
- package/dist/hooks/use-watch.svelte.js +16 -0
- package/dist/hooks/use-window-event.svelte.d.ts +6 -0
- package/dist/hooks/use-window-event.svelte.js +12 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/input/Input.svelte +59 -0
- package/dist/input/Input.svelte.d.ts +52 -0
- package/dist/input/index.d.ts +1 -0
- package/dist/input/index.js +1 -0
- package/dist/internal/FocusSentinel.svelte.d.ts +4 -1
- package/dist/internal/ForcePortalRoot.svelte +6 -0
- package/dist/internal/ForcePortalRoot.svelte.d.ts +22 -0
- package/dist/internal/FormFields.svelte.d.ts +4 -1
- package/dist/internal/FormResolver.svelte.d.ts +4 -1
- package/dist/internal/Hidden.svelte +5 -9
- package/dist/internal/Hidden.svelte.d.ts +17 -10
- package/dist/internal/HoistFormFields.svelte.d.ts +4 -1
- package/dist/internal/MainTreeProvider.svelte +45 -0
- package/dist/internal/MainTreeProvider.svelte.d.ts +31 -0
- package/dist/internal/Portal.svelte.d.ts +4 -1
- package/dist/internal/close-provider.d.ts +7 -0
- package/dist/internal/close-provider.js +7 -0
- package/dist/internal/floating.svelte.d.ts +13 -8
- package/dist/internal/floating.svelte.js +197 -186
- package/dist/internal/id.d.ts +1 -1
- package/dist/internal/open-closed.d.ts +1 -1
- package/dist/internal/open-closed.js +1 -1
- package/dist/label/Label.svelte +12 -61
- package/dist/label/Label.svelte.d.ts +19 -32
- package/dist/label/context.svelte.d.ts +17 -0
- package/dist/label/context.svelte.js +56 -0
- package/dist/legend/Legend.svelte +4 -3
- package/dist/legend/Legend.svelte.d.ts +33 -15
- package/dist/listbox/Listbox.svelte +6 -9
- package/dist/listbox/Listbox.svelte.d.ts +29 -10
- package/dist/listbox/ListboxButton.svelte +6 -8
- package/dist/listbox/ListboxButton.svelte.d.ts +18 -7
- package/dist/listbox/ListboxOption.svelte +4 -6
- package/dist/listbox/ListboxOption.svelte.d.ts +22 -11
- package/dist/listbox/ListboxOptions.svelte +21 -19
- package/dist/listbox/ListboxOptions.svelte.d.ts +23 -7
- package/dist/listbox/ListboxSelectedOption.svelte +17 -7
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +23 -13
- package/dist/menu/Menu.svelte +235 -0
- package/dist/menu/Menu.svelte.d.ts +42 -0
- package/dist/menu/MenuButton.svelte +127 -0
- package/dist/menu/MenuButton.svelte.d.ts +52 -0
- package/dist/menu/MenuHeading.svelte +19 -0
- package/dist/menu/MenuHeading.svelte.d.ts +39 -0
- package/dist/menu/MenuItem.svelte +114 -0
- package/dist/menu/MenuItem.svelte.d.ts +49 -0
- package/dist/menu/MenuItems.svelte +244 -0
- package/dist/menu/MenuItems.svelte.d.ts +55 -0
- package/dist/menu/MenuSection.svelte +14 -0
- package/dist/menu/MenuSection.svelte.d.ts +35 -0
- package/dist/menu/MenuSeparator.svelte +9 -0
- package/dist/menu/MenuSeparator.svelte.d.ts +35 -0
- package/dist/menu/context.svelte.d.ts +47 -0
- package/dist/menu/context.svelte.js +21 -0
- package/dist/menu/index.d.ts +7 -0
- package/dist/menu/index.js +7 -0
- package/dist/portal/InternalPortal.svelte +22 -33
- package/dist/portal/InternalPortal.svelte.d.ts +16 -7
- package/dist/portal/Portal.svelte +4 -8
- package/dist/portal/Portal.svelte.d.ts +6 -6
- package/dist/portal/PortalGroup.svelte +5 -6
- package/dist/portal/PortalGroup.svelte.d.ts +16 -7
- package/dist/switch/Switch.svelte +11 -17
- package/dist/switch/Switch.svelte.d.ts +23 -6
- package/dist/switch/SwitchGroup.svelte +7 -8
- package/dist/switch/SwitchGroup.svelte.d.ts +14 -7
- package/dist/tabs/Tab.svelte +9 -14
- package/dist/tabs/Tab.svelte.d.ts +18 -6
- package/dist/tabs/TabGroup.svelte +20 -23
- package/dist/tabs/TabGroup.svelte.d.ts +19 -6
- package/dist/tabs/TabList.svelte +5 -7
- package/dist/tabs/TabList.svelte.d.ts +13 -6
- package/dist/tabs/TabPanel.svelte +30 -32
- package/dist/tabs/TabPanel.svelte.d.ts +19 -6
- package/dist/tabs/TabPanels.svelte +5 -6
- package/dist/tabs/TabPanels.svelte.d.ts +13 -6
- package/dist/textarea/Textarea.svelte +67 -0
- package/dist/textarea/Textarea.svelte.d.ts +47 -0
- package/dist/textarea/index.d.ts +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/transition/InternalTransitionChild.svelte +178 -0
- package/dist/transition/InternalTransitionChild.svelte.d.ts +55 -0
- package/dist/transition/Transition.svelte +89 -0
- package/dist/transition/Transition.svelte.d.ts +42 -0
- package/dist/transition/TransitionChild.svelte +16 -0
- package/dist/transition/TransitionChild.svelte.d.ts +44 -0
- package/dist/transition/context.svelte.d.ts +64 -0
- package/dist/transition/context.svelte.js +120 -0
- package/dist/transition/index.d.ts +2 -0
- package/dist/transition/index.js +2 -0
- package/dist/utils/ElementOrComponent.svelte +26 -0
- package/dist/utils/ElementOrComponent.svelte.d.ts +56 -0
- package/dist/utils/Generic.svelte +44 -0
- package/dist/utils/Generic.svelte.d.ts +35 -0
- package/dist/utils/StableCollection.svelte +1 -1
- package/dist/utils/StableCollection.svelte.d.ts +4 -1
- package/dist/utils/active-element-history.d.ts +1 -0
- package/dist/utils/active-element-history.js +35 -0
- package/dist/utils/alternative-types.d.ts +21 -0
- package/dist/utils/alternative-types.js +1 -0
- package/dist/utils/class-names.d.ts +1 -0
- package/dist/utils/class-names.js +10 -0
- package/dist/utils/focus-management.d.ts +2 -1
- package/dist/utils/focus-management.js +13 -13
- package/dist/utils/on-document-ready.d.ts +1 -0
- package/dist/utils/on-document-ready.js +12 -0
- package/dist/utils/render.d.ts +3 -0
- package/dist/utils/render.js +63 -0
- package/dist/utils/state.d.ts +7 -1
- package/dist/utils/state.js +10 -6
- package/dist/utils/types.d.ts +14 -17
- package/dist/utils/types.js +0 -5
- package/package.json +26 -25
- package/dist/tabs/Button.svelte +0 -65
- package/dist/tabs/Button.svelte.d.ts +0 -39
- package/dist/utils/close.d.ts +0 -2
- package/dist/utils/close.js +0 -3
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
<script lang="ts" module>import { compact, RenderStrategy } from "../utils/render.js";
|
|
2
|
+
import { onMount, setContext, untrack } from "svelte";
|
|
3
|
+
import {
|
|
4
|
+
hasChildren,
|
|
5
|
+
TreeStates,
|
|
6
|
+
useNesting,
|
|
7
|
+
useParentNesting,
|
|
8
|
+
useTransitionContext
|
|
9
|
+
} from "./context.svelte.js";
|
|
10
|
+
import { match } from "../utils/match.js";
|
|
11
|
+
import { transitionDataAttributes, useTransition } from "../hooks/use-transition.svelte.js";
|
|
12
|
+
import { classNames } from "../utils/class-names.js";
|
|
13
|
+
import { createOpenClosedContext, State } from "../internal/open-closed.js";
|
|
14
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
15
|
+
import { DEFAULT_TRANSITION_CHILD_TAG } from "./TransitionChild.svelte";
|
|
16
|
+
export function shouldForwardRef(props) {
|
|
17
|
+
return (
|
|
18
|
+
// If we have any of the enter/leave classes
|
|
19
|
+
Boolean(props.enter || props.enterFrom || props.enterTo || props.leave || props.leaveFrom || props.leaveTo) || // If the `as` prop is not a Fragment
|
|
20
|
+
(props.as ?? DEFAULT_TRANSITION_CHILD_TAG) !== "svelte:fragment" || // If we have a single child, then we can forward the ref directly
|
|
21
|
+
props.children !== void 0
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">let { ref = $bindable(), ..._props } = $props();
|
|
27
|
+
const {
|
|
28
|
+
// Whether or not to enable transitions on the current element (by exposing
|
|
29
|
+
// transition data). When set to false, the `Transition` component still
|
|
30
|
+
// acts as a transition boundary for `TransitionChild` components.
|
|
31
|
+
transition = true,
|
|
32
|
+
// Event "handlers"
|
|
33
|
+
beforeEnter,
|
|
34
|
+
afterEnter,
|
|
35
|
+
beforeLeave,
|
|
36
|
+
afterLeave,
|
|
37
|
+
// Class names
|
|
38
|
+
enter,
|
|
39
|
+
enterFrom,
|
|
40
|
+
enterTo,
|
|
41
|
+
entered,
|
|
42
|
+
leave,
|
|
43
|
+
leaveFrom,
|
|
44
|
+
leaveTo,
|
|
45
|
+
...theirProps
|
|
46
|
+
} = $derived(_props);
|
|
47
|
+
let containerElement = $state();
|
|
48
|
+
let container = $state({ current: null });
|
|
49
|
+
const requiresRef = $derived(shouldForwardRef(_props));
|
|
50
|
+
const strategy = $derived(theirProps.unmount ?? true ? RenderStrategy.Unmount : RenderStrategy.Hidden);
|
|
51
|
+
const _transitionContext = useTransitionContext();
|
|
52
|
+
const { show, appear, initial } = $derived(_transitionContext);
|
|
53
|
+
let _state = $state(untrack(() => show) ? TreeStates.Visible : TreeStates.Hidden);
|
|
54
|
+
const parentNesting = useParentNesting();
|
|
55
|
+
const { register, unregister } = $derived(parentNesting);
|
|
56
|
+
onMount(() => {
|
|
57
|
+
if (requiresRef) {
|
|
58
|
+
container.current = ref ?? null;
|
|
59
|
+
containerElement = ref;
|
|
60
|
+
}
|
|
61
|
+
return register(container);
|
|
62
|
+
});
|
|
63
|
+
$effect(() => {
|
|
64
|
+
if (strategy !== RenderStrategy.Hidden) return;
|
|
65
|
+
if (!container.current) return;
|
|
66
|
+
if (show && _state !== TreeStates.Visible) {
|
|
67
|
+
_state = TreeStates.Visible;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
match(_state, {
|
|
71
|
+
[TreeStates.Hidden]: () => unregister(container),
|
|
72
|
+
[TreeStates.Visible]: () => register(container)
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
$effect(() => {
|
|
76
|
+
if (!requiresRef) return;
|
|
77
|
+
if (_state === TreeStates.Visible && container.current === null) {
|
|
78
|
+
throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?");
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
const skip = $derived(initial && !appear);
|
|
82
|
+
const immediate = $derived(appear && show && initial);
|
|
83
|
+
let isTransitioning = $state(false);
|
|
84
|
+
let nesting = useNesting({
|
|
85
|
+
done: () => {
|
|
86
|
+
if (isTransitioning) return;
|
|
87
|
+
_state = TreeStates.Hidden;
|
|
88
|
+
unregister(container);
|
|
89
|
+
},
|
|
90
|
+
get parent() {
|
|
91
|
+
return parentNesting;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
const start = (show2) => {
|
|
95
|
+
isTransitioning = true;
|
|
96
|
+
const direction = show2 ? "enter" : "leave";
|
|
97
|
+
nesting.onStart(container, direction, (direction2) => {
|
|
98
|
+
if (direction2 === "enter") beforeEnter?.();
|
|
99
|
+
else if (direction2 === "leave") beforeLeave?.();
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
const end = (show2) => {
|
|
103
|
+
let direction = show2 ? "enter" : "leave";
|
|
104
|
+
isTransitioning = false;
|
|
105
|
+
nesting.onStop(container, direction, (direction2) => {
|
|
106
|
+
if (direction2 === "enter") afterEnter?.();
|
|
107
|
+
else if (direction2 === "leave") afterLeave?.();
|
|
108
|
+
});
|
|
109
|
+
if (direction === "leave" && !hasChildren(nesting)) {
|
|
110
|
+
_state = TreeStates.Hidden;
|
|
111
|
+
unregister(container);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
$effect(() => {
|
|
115
|
+
if (requiresRef && transition) return;
|
|
116
|
+
untrack(() => start(show));
|
|
117
|
+
untrack(() => end(show));
|
|
118
|
+
});
|
|
119
|
+
const enabled = $derived.by(() => {
|
|
120
|
+
if (!transition) return false;
|
|
121
|
+
if (!requiresRef) return false;
|
|
122
|
+
if (skip) return false;
|
|
123
|
+
return true;
|
|
124
|
+
});
|
|
125
|
+
const _transition = useTransition({
|
|
126
|
+
get enabled() {
|
|
127
|
+
return enabled;
|
|
128
|
+
},
|
|
129
|
+
get element() {
|
|
130
|
+
return containerElement;
|
|
131
|
+
},
|
|
132
|
+
get show() {
|
|
133
|
+
return show;
|
|
134
|
+
},
|
|
135
|
+
events: { start, end }
|
|
136
|
+
});
|
|
137
|
+
const { data: transitionData } = $derived(_transition);
|
|
138
|
+
const ourProps = $derived(
|
|
139
|
+
compact({
|
|
140
|
+
class: classNames(
|
|
141
|
+
// Incoming classes if any
|
|
142
|
+
// all components accept className (but all HTML elements do)
|
|
143
|
+
theirProps.class,
|
|
144
|
+
// Apply these classes immediately
|
|
145
|
+
immediate && enter,
|
|
146
|
+
immediate && enterFrom,
|
|
147
|
+
// Map data attributes to `enter`, `enterFrom` and `enterTo` classes
|
|
148
|
+
transitionData.enter && enter,
|
|
149
|
+
transitionData.enter && transitionData.closed && enterFrom,
|
|
150
|
+
transitionData.enter && !transitionData.closed && enterTo,
|
|
151
|
+
// Map data attributes to `leave`, `leaveFrom` and `leaveTo` classes
|
|
152
|
+
transitionData.leave && leave,
|
|
153
|
+
transitionData.leave && !transitionData.closed && leaveFrom,
|
|
154
|
+
transitionData.leave && transitionData.closed && leaveTo,
|
|
155
|
+
// Map data attributes to `entered` class (backwards compatibility)
|
|
156
|
+
!transitionData.transition && show && entered
|
|
157
|
+
)?.trim() || void 0,
|
|
158
|
+
// If `class` is an empty string, we can omit it
|
|
159
|
+
...transitionDataAttributes(transitionData)
|
|
160
|
+
})
|
|
161
|
+
);
|
|
162
|
+
const openClosedState = $derived.by(() => {
|
|
163
|
+
let openClosedState2 = 0;
|
|
164
|
+
if (_state === TreeStates.Visible) openClosedState2 |= State.Open;
|
|
165
|
+
if (_state === TreeStates.Hidden) openClosedState2 |= State.Closed;
|
|
166
|
+
if (transitionData.enter) openClosedState2 |= State.Opening;
|
|
167
|
+
if (transitionData.leave) openClosedState2 |= State.Closing;
|
|
168
|
+
return openClosedState2;
|
|
169
|
+
});
|
|
170
|
+
createOpenClosedContext({
|
|
171
|
+
get value() {
|
|
172
|
+
return openClosedState;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
setContext("NestingContext", nesting);
|
|
176
|
+
</script>
|
|
177
|
+
|
|
178
|
+
<ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_TRANSITION_CHILD_TAG} name="TransitionChild" bind:ref />
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ElementType } from "../utils/types.js";
|
|
2
|
+
import type { TransitionRootProps } from "./Transition.svelte";
|
|
3
|
+
import { DEFAULT_TRANSITION_CHILD_TAG } from "./TransitionChild.svelte";
|
|
4
|
+
/**
|
|
5
|
+
* Check if we should forward the ref to the child element or not. This is to
|
|
6
|
+
* prevent crashes when the `as` prop is a Fragment _and_ the component just acts
|
|
7
|
+
* as a state container (aka, there is no actual transition happening).
|
|
8
|
+
*
|
|
9
|
+
* E.g.:
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <Transition show={true}>
|
|
13
|
+
* <Transition.Child enter="duration-100"><div>Child 1</div></Transition.Child>
|
|
14
|
+
* <Transition.Child enter="duration-200"><div>Child 2</div></Transition.Child>
|
|
15
|
+
* </Transition>
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* In this scenario, the child components are transitioning, but the
|
|
19
|
+
* `Transition` parent, which is a `Fragment`, is not. So we should not forward
|
|
20
|
+
* the ref to the `Fragment`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function shouldForwardRef<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(props: TransitionRootProps<TTag>): boolean;
|
|
23
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> {
|
|
24
|
+
props(): {
|
|
25
|
+
as?: TTag | undefined;
|
|
26
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "unmount" | "transition" | keyof import("./context.svelte.js").TransitionClasses | keyof import("./context.svelte.js").TransitionEvents | "appear"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
27
|
+
children?: import("../utils/types.js").Children<HTMLElement> | undefined;
|
|
28
|
+
ref?: HTMLElement;
|
|
29
|
+
} & (true extends (import("../utils/types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../utils/types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
|
|
30
|
+
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: HTMLElement) => string) | undefined;
|
|
31
|
+
} : {}) & {
|
|
32
|
+
unmount?: boolean | undefined;
|
|
33
|
+
} & import("./context.svelte.js").TransitionClasses & import("./context.svelte.js").TransitionEvents & {
|
|
34
|
+
transition?: boolean;
|
|
35
|
+
appear?: boolean;
|
|
36
|
+
};
|
|
37
|
+
events(): {} & {
|
|
38
|
+
[evt: string]: CustomEvent<any>;
|
|
39
|
+
};
|
|
40
|
+
slots(): {};
|
|
41
|
+
bindings(): "ref";
|
|
42
|
+
exports(): {};
|
|
43
|
+
}
|
|
44
|
+
interface $$IsomorphicComponent {
|
|
45
|
+
new <TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag>['props']>, ReturnType<__sveltets_Render<TTag>['events']>, ReturnType<__sveltets_Render<TTag>['slots']>> & {
|
|
46
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
47
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
48
|
+
<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
49
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
50
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
51
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
52
|
+
}
|
|
53
|
+
declare const InternalTransitionChild: $$IsomorphicComponent;
|
|
54
|
+
type InternalTransitionChild<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> = InstanceType<typeof InternalTransitionChild<TTag>>;
|
|
55
|
+
export default InternalTransitionChild;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts" module>import { State, useOpenClosed } from "../internal/open-closed.js";
|
|
2
|
+
import { setContext, untrack } from "svelte";
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_TRANSITION_CHILD_TAG,
|
|
5
|
+
TransitionChildRenderFeatures
|
|
6
|
+
} from "./TransitionChild.svelte";
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">import InternalTransitionChild, { shouldForwardRef } from "./InternalTransitionChild.svelte";
|
|
10
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
11
|
+
import {
|
|
12
|
+
hasChildren,
|
|
13
|
+
TreeStates,
|
|
14
|
+
useNesting
|
|
15
|
+
} from "./context.svelte.js";
|
|
16
|
+
let { ref = $bindable(), show, ..._props } = $props();
|
|
17
|
+
const { appear = false, unmount = true, ...theirProps } = $derived(_props);
|
|
18
|
+
const requiresRef = shouldForwardRef(_props);
|
|
19
|
+
const usesOpenClosedState = useOpenClosed();
|
|
20
|
+
if (show === void 0 && usesOpenClosedState !== null) {
|
|
21
|
+
show = (usesOpenClosedState.value & State.Open) === State.Open;
|
|
22
|
+
}
|
|
23
|
+
if (show === void 0) {
|
|
24
|
+
throw new Error("A <Transition /> is used but it is missing a `show={true | false}` prop.");
|
|
25
|
+
}
|
|
26
|
+
let _state = $state(show ? TreeStates.Visible : TreeStates.Hidden);
|
|
27
|
+
const nestingBag = useNesting({
|
|
28
|
+
done: () => {
|
|
29
|
+
if (show) return;
|
|
30
|
+
_state = TreeStates.Hidden;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
let initial = $state(true);
|
|
34
|
+
let changes = $state([show]);
|
|
35
|
+
$effect(() => {
|
|
36
|
+
if (untrack(() => initial) === false) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (changes[changes.length - 1] !== show) {
|
|
40
|
+
changes.push(show);
|
|
41
|
+
initial = false;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
$effect(() => {
|
|
45
|
+
if (show) {
|
|
46
|
+
_state = TreeStates.Visible;
|
|
47
|
+
} else if (!hasChildren(nestingBag) && untrack(() => ref)) {
|
|
48
|
+
_state = TreeStates.Hidden;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const sharedProps = $derived({ unmount });
|
|
52
|
+
const beforeEnter = () => {
|
|
53
|
+
if (initial) initial = false;
|
|
54
|
+
_props.beforeEnter?.();
|
|
55
|
+
};
|
|
56
|
+
const beforeLeave = () => {
|
|
57
|
+
if (initial) initial = false;
|
|
58
|
+
_props.beforeLeave?.();
|
|
59
|
+
};
|
|
60
|
+
setContext("NestingContext", nestingBag);
|
|
61
|
+
setContext("TransitionContext", {
|
|
62
|
+
get show() {
|
|
63
|
+
return show;
|
|
64
|
+
},
|
|
65
|
+
get appear() {
|
|
66
|
+
return appear;
|
|
67
|
+
},
|
|
68
|
+
get initial() {
|
|
69
|
+
return initial;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
const InternalChild = InternalTransitionChild;
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
{#snippet children()}
|
|
76
|
+
<InternalChild bind:ref {...sharedProps} {...theirProps} {beforeEnter} {beforeLeave} />
|
|
77
|
+
{/snippet}
|
|
78
|
+
|
|
79
|
+
<ElementOrComponent
|
|
80
|
+
ourProps={{
|
|
81
|
+
...sharedProps,
|
|
82
|
+
children,
|
|
83
|
+
}}
|
|
84
|
+
theirProps={{}}
|
|
85
|
+
defaultTag={"svelte:fragment"}
|
|
86
|
+
features={TransitionChildRenderFeatures}
|
|
87
|
+
visible={_state === TreeStates.Visible}
|
|
88
|
+
name="Transition"
|
|
89
|
+
/>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ElementType } from "../utils/types.js";
|
|
2
|
+
import { type TransitionChildProps, DEFAULT_TRANSITION_CHILD_TAG } from "./TransitionChild.svelte";
|
|
3
|
+
export type TransitionRootProps<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> = TransitionChildProps<TTag> & {
|
|
4
|
+
show?: boolean;
|
|
5
|
+
appear?: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> {
|
|
8
|
+
props(): {
|
|
9
|
+
as?: TTag | undefined;
|
|
10
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "unmount" | "transition" | keyof import("./context.svelte.js").TransitionClasses | keyof import("./context.svelte.js").TransitionEvents | "appear"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
11
|
+
children?: import("../utils/types.js").Children<HTMLElement> | undefined;
|
|
12
|
+
ref?: HTMLElement;
|
|
13
|
+
} & (true extends (import("../utils/types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../utils/types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
|
|
14
|
+
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: HTMLElement) => string) | undefined;
|
|
15
|
+
} : {}) & {
|
|
16
|
+
unmount?: boolean | undefined;
|
|
17
|
+
} & import("./context.svelte.js").TransitionClasses & import("./context.svelte.js").TransitionEvents & {
|
|
18
|
+
transition?: boolean;
|
|
19
|
+
appear?: boolean;
|
|
20
|
+
} & {
|
|
21
|
+
show?: boolean;
|
|
22
|
+
appear?: boolean;
|
|
23
|
+
};
|
|
24
|
+
events(): {} & {
|
|
25
|
+
[evt: string]: CustomEvent<any>;
|
|
26
|
+
};
|
|
27
|
+
slots(): {};
|
|
28
|
+
bindings(): "ref";
|
|
29
|
+
exports(): {};
|
|
30
|
+
}
|
|
31
|
+
interface $$IsomorphicComponent {
|
|
32
|
+
new <TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag>['props']>, ReturnType<__sveltets_Render<TTag>['events']>, ReturnType<__sveltets_Render<TTag>['slots']>> & {
|
|
33
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
34
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
35
|
+
<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
36
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
37
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
38
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
39
|
+
}
|
|
40
|
+
declare const Transition: $$IsomorphicComponent;
|
|
41
|
+
type Transition<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> = InstanceType<typeof Transition<TTag>>;
|
|
42
|
+
export default Transition;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script lang="ts" module>import { RenderFeatures } from "../utils/render.js";
|
|
2
|
+
export const DEFAULT_TRANSITION_CHILD_TAG = "svelte:fragment";
|
|
3
|
+
export const TransitionChildRenderFeatures = RenderFeatures.RenderStrategy;
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">import { useOpenClosed } from "../internal/open-closed.js";
|
|
7
|
+
import { getContext } from "svelte";
|
|
8
|
+
import InternalTransitionChild from "./InternalTransitionChild.svelte";
|
|
9
|
+
import Transition from "./Transition.svelte";
|
|
10
|
+
const hasTransitionContext = !!getContext("TransitionContext");
|
|
11
|
+
const hasOpenClosedContext = useOpenClosed() !== null;
|
|
12
|
+
let { ref = $bindable(), as, ...props } = $props();
|
|
13
|
+
const TransitionRootOrChild = !hasTransitionContext && hasOpenClosedContext ? Transition : InternalTransitionChild;
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<TransitionRootOrChild bind:ref {...props} />
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ElementType, Props } from "../utils/types.js";
|
|
2
|
+
import { RenderFeatures, type PropsForFeatures } from "../utils/render.js";
|
|
3
|
+
import type { TransitionEvents, TransitionClasses } from "./context.svelte.js";
|
|
4
|
+
type TransitionChildPropsWeControl = never;
|
|
5
|
+
export type TransitionChildProps<TTag extends ElementType> = Props<TTag, TransitionChildRenderPropArg, TransitionChildPropsWeControl, PropsForFeatures<typeof TransitionChildRenderFeatures> & TransitionClasses & TransitionEvents & {
|
|
6
|
+
transition?: boolean;
|
|
7
|
+
appear?: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const DEFAULT_TRANSITION_CHILD_TAG = "svelte:fragment";
|
|
10
|
+
export type TransitionChildRenderPropArg = HTMLElement;
|
|
11
|
+
export declare const TransitionChildRenderFeatures = RenderFeatures.RenderStrategy;
|
|
12
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> {
|
|
13
|
+
props(): {
|
|
14
|
+
as?: TTag | undefined;
|
|
15
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "unmount" | "transition" | keyof TransitionClasses | keyof TransitionEvents | "appear"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
16
|
+
children?: import("../utils/types.js").Children<HTMLElement> | undefined;
|
|
17
|
+
ref?: HTMLElement;
|
|
18
|
+
} & (true extends (import("../utils/types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../utils/types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
|
|
19
|
+
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: HTMLElement) => string) | undefined;
|
|
20
|
+
} : {}) & {
|
|
21
|
+
unmount?: boolean | undefined;
|
|
22
|
+
} & TransitionClasses & TransitionEvents & {
|
|
23
|
+
transition?: boolean;
|
|
24
|
+
appear?: boolean;
|
|
25
|
+
};
|
|
26
|
+
events(): {} & {
|
|
27
|
+
[evt: string]: CustomEvent<any>;
|
|
28
|
+
};
|
|
29
|
+
slots(): {};
|
|
30
|
+
bindings(): "ref";
|
|
31
|
+
exports(): {};
|
|
32
|
+
}
|
|
33
|
+
interface $$IsomorphicComponent {
|
|
34
|
+
new <TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag>['props']>, ReturnType<__sveltets_Render<TTag>['events']>, ReturnType<__sveltets_Render<TTag>['slots']>> & {
|
|
35
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
36
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
37
|
+
<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
38
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
39
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
40
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
41
|
+
}
|
|
42
|
+
declare const TransitionChild: $$IsomorphicComponent;
|
|
43
|
+
type TransitionChild<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> = InstanceType<typeof TransitionChild<TTag>>;
|
|
44
|
+
export default TransitionChild;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { MutableRefObject } from "../utils/ref.svelte.js";
|
|
2
|
+
import { RenderStrategy } from "../utils/render.js";
|
|
3
|
+
type ContainerElement = MutableRefObject<HTMLElement | null>;
|
|
4
|
+
export type TransitionDirection = "enter" | "leave";
|
|
5
|
+
export interface TransitionContextValues {
|
|
6
|
+
show: boolean;
|
|
7
|
+
appear: boolean;
|
|
8
|
+
initial: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare enum TreeStates {
|
|
11
|
+
Visible = "visible",
|
|
12
|
+
Hidden = "hidden"
|
|
13
|
+
}
|
|
14
|
+
export interface TransitionClasses {
|
|
15
|
+
enter?: string;
|
|
16
|
+
enterFrom?: string;
|
|
17
|
+
enterTo?: string;
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated The `enterTo` and `leaveTo` classes stay applied after the transition has finished.
|
|
20
|
+
*/
|
|
21
|
+
entered?: string;
|
|
22
|
+
leave?: string;
|
|
23
|
+
leaveFrom?: string;
|
|
24
|
+
leaveTo?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TransitionEvents {
|
|
27
|
+
beforeEnter?: () => void;
|
|
28
|
+
afterEnter?: () => void;
|
|
29
|
+
beforeLeave?: () => void;
|
|
30
|
+
afterLeave?: () => void;
|
|
31
|
+
}
|
|
32
|
+
export declare function useTransitionContext(): TransitionContextValues;
|
|
33
|
+
export declare function useParentNesting(): NestingContextValues;
|
|
34
|
+
export interface NestingContextValues {
|
|
35
|
+
children: {
|
|
36
|
+
el: ContainerElement;
|
|
37
|
+
state: TreeStates;
|
|
38
|
+
}[];
|
|
39
|
+
register: (el: ContainerElement) => () => void;
|
|
40
|
+
unregister: (el: ContainerElement, strategy?: RenderStrategy) => void;
|
|
41
|
+
onStart: (el: ContainerElement, direction: TransitionDirection, cb: () => void) => void;
|
|
42
|
+
onStop: (el: ContainerElement, direction: TransitionDirection, cb: () => void) => void;
|
|
43
|
+
chains: Record<TransitionDirection, [container: ContainerElement, promise: Promise<void>][]>;
|
|
44
|
+
wait: Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export declare function hasChildren(bag: NestingContextValues["children"] | {
|
|
47
|
+
children: NestingContextValues["children"];
|
|
48
|
+
}): boolean;
|
|
49
|
+
export declare function useNesting(options: {
|
|
50
|
+
done?: () => void;
|
|
51
|
+
parent?: NestingContextValues;
|
|
52
|
+
}): {
|
|
53
|
+
readonly children: {
|
|
54
|
+
el: ContainerElement;
|
|
55
|
+
state: TreeStates;
|
|
56
|
+
}[];
|
|
57
|
+
register: (container: ContainerElement) => () => void;
|
|
58
|
+
unregister: (container: ContainerElement, strategy?: RenderStrategy) => void;
|
|
59
|
+
onStart: (container: ContainerElement, direction: TransitionDirection, cb: (direction: TransitionDirection) => void) => void;
|
|
60
|
+
onStop: (_container: ContainerElement, direction: TransitionDirection, cb: (direction: TransitionDirection) => void) => void;
|
|
61
|
+
readonly wait: Promise<void>;
|
|
62
|
+
readonly chains: Record<TransitionDirection, [identifier: ContainerElement, promise: Promise<void>][]>;
|
|
63
|
+
};
|
|
64
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { useIsMounted } from "../hooks/use-is-mounted.svelte.js";
|
|
2
|
+
import { useDisposables } from "../utils/disposables.js";
|
|
3
|
+
import { match } from "../utils/match.js";
|
|
4
|
+
import { RenderStrategy } from "../utils/render.js";
|
|
5
|
+
import { getContext } from "svelte";
|
|
6
|
+
export var TreeStates;
|
|
7
|
+
(function (TreeStates) {
|
|
8
|
+
TreeStates["Visible"] = "visible";
|
|
9
|
+
TreeStates["Hidden"] = "hidden";
|
|
10
|
+
})(TreeStates || (TreeStates = {}));
|
|
11
|
+
export function useTransitionContext() {
|
|
12
|
+
const context = getContext("TransitionContext");
|
|
13
|
+
if (context === null) {
|
|
14
|
+
throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");
|
|
15
|
+
}
|
|
16
|
+
return context;
|
|
17
|
+
}
|
|
18
|
+
export function useParentNesting() {
|
|
19
|
+
let context = getContext("NestingContext");
|
|
20
|
+
if (context === null) {
|
|
21
|
+
throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");
|
|
22
|
+
}
|
|
23
|
+
return context;
|
|
24
|
+
}
|
|
25
|
+
export function hasChildren(bag) {
|
|
26
|
+
if ("children" in bag)
|
|
27
|
+
return hasChildren(bag.children);
|
|
28
|
+
return bag.filter(({ state }) => state === TreeStates.Visible).length > 0;
|
|
29
|
+
}
|
|
30
|
+
export function useNesting(options) {
|
|
31
|
+
const { done, parent } = $derived(options);
|
|
32
|
+
let transitionableChildren = $state([]);
|
|
33
|
+
const mounted = useIsMounted();
|
|
34
|
+
const d = useDisposables();
|
|
35
|
+
const unregister = (container, strategy = RenderStrategy.Hidden) => {
|
|
36
|
+
const idx = transitionableChildren.findIndex(({ el }) => el === container);
|
|
37
|
+
if (idx === -1)
|
|
38
|
+
return;
|
|
39
|
+
match(strategy, {
|
|
40
|
+
[RenderStrategy.Unmount]() {
|
|
41
|
+
transitionableChildren.splice(idx, 1);
|
|
42
|
+
},
|
|
43
|
+
[RenderStrategy.Hidden]() {
|
|
44
|
+
transitionableChildren[idx].state = TreeStates.Hidden;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
d.microTask(() => {
|
|
48
|
+
if (!hasChildren(transitionableChildren) && mounted.current) {
|
|
49
|
+
done?.();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
const register = (container) => {
|
|
54
|
+
const child = transitionableChildren.find(({ el }) => el === container);
|
|
55
|
+
if (!child) {
|
|
56
|
+
transitionableChildren.push({ el: container, state: TreeStates.Visible });
|
|
57
|
+
}
|
|
58
|
+
else if (child.state !== TreeStates.Visible) {
|
|
59
|
+
child.state = TreeStates.Visible;
|
|
60
|
+
}
|
|
61
|
+
return () => unregister(container, RenderStrategy.Unmount);
|
|
62
|
+
};
|
|
63
|
+
let todos = $state([]);
|
|
64
|
+
let wait = $state(Promise.resolve());
|
|
65
|
+
let chains = $state({
|
|
66
|
+
enter: [],
|
|
67
|
+
leave: [],
|
|
68
|
+
});
|
|
69
|
+
let onStart = (container, direction, cb) => {
|
|
70
|
+
// Clear out all existing todos
|
|
71
|
+
todos.splice(0);
|
|
72
|
+
// Remove all existing promises for the current container from the parent because we can
|
|
73
|
+
// ignore those and use only the new one.
|
|
74
|
+
if (parent) {
|
|
75
|
+
parent.chains[direction] = parent.chains[direction].filter(([containerInParent]) => containerInParent !== container);
|
|
76
|
+
}
|
|
77
|
+
// Wait until our own transition is done
|
|
78
|
+
parent?.chains[direction].push([
|
|
79
|
+
container,
|
|
80
|
+
new Promise((resolve) => {
|
|
81
|
+
todos.push(resolve);
|
|
82
|
+
}),
|
|
83
|
+
]);
|
|
84
|
+
// Wait until our children are done
|
|
85
|
+
parent?.chains[direction].push([
|
|
86
|
+
container,
|
|
87
|
+
new Promise((resolve) => {
|
|
88
|
+
Promise.all(chains[direction].map(([_container, promise]) => promise)).then(() => resolve());
|
|
89
|
+
}),
|
|
90
|
+
]);
|
|
91
|
+
if (direction === "enter") {
|
|
92
|
+
wait = wait.then(() => parent?.wait).then(() => cb(direction));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
cb(direction);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const onStop = (_container, direction, cb) => {
|
|
99
|
+
Promise.all(chains[direction].splice(0).map(([_container, promise]) => promise)) // Wait for my children
|
|
100
|
+
.then(() => {
|
|
101
|
+
todos.shift()?.(); // I'm ready
|
|
102
|
+
})
|
|
103
|
+
.then(() => cb(direction));
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
get children() {
|
|
107
|
+
return transitionableChildren;
|
|
108
|
+
},
|
|
109
|
+
register,
|
|
110
|
+
unregister,
|
|
111
|
+
onStart,
|
|
112
|
+
onStop,
|
|
113
|
+
get wait() {
|
|
114
|
+
return wait;
|
|
115
|
+
},
|
|
116
|
+
get chains() {
|
|
117
|
+
return chains;
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script lang="ts" generics="TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue">import { mergePropsAdvanced, RenderFeatures, RenderStrategy } from "./render.js";
|
|
2
|
+
import Generic from "./Generic.svelte";
|
|
3
|
+
let {
|
|
4
|
+
ourProps,
|
|
5
|
+
theirProps,
|
|
6
|
+
slots,
|
|
7
|
+
slot = slots,
|
|
8
|
+
defaultTag,
|
|
9
|
+
features,
|
|
10
|
+
visible = true,
|
|
11
|
+
name,
|
|
12
|
+
ref = $bindable(),
|
|
13
|
+
value = $bindable(),
|
|
14
|
+
checked = $bindable()
|
|
15
|
+
} = $props();
|
|
16
|
+
const featureFlags = $derived(features ?? RenderFeatures.None);
|
|
17
|
+
const { static: isStatic = false, unmount = true, ...rest } = $derived(mergePropsAdvanced(theirProps, ourProps ?? {}));
|
|
18
|
+
const render = $derived(
|
|
19
|
+
visible || featureFlags & RenderFeatures.Static && isStatic || featureFlags & RenderFeatures.RenderStrategy && !unmount
|
|
20
|
+
);
|
|
21
|
+
const hiddenProps = $derived(
|
|
22
|
+
!visible && !(featureFlags & RenderFeatures.Static) && featureFlags & RenderFeatures.RenderStrategy && !unmount ? { hidden: true, style: "display: none;" } : {}
|
|
23
|
+
);
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
{#if render}<Generic {...rest} {...hiddenProps} {slot} tag={defaultTag} {name} bind:ref bind:value bind:checked />{/if}
|