@pzerelles/headlessui-svelte 2.1.2-next.7 → 2.1.2-next.9
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 +54 -84
- package/dist/checkbox/Checkbox.svelte +120 -174
- package/dist/checkbox/Checkbox.svelte.d.ts +4 -6
- package/dist/close-button/CloseButton.svelte +6 -12
- package/dist/combobox/Combobox.svelte +3 -50
- package/dist/data-interactive/DataInteractive.svelte +29 -57
- package/dist/description/Description.svelte +21 -32
- package/dist/dialog/Dialog.svelte +34 -69
- package/dist/dialog/DialogBackdrop.svelte +12 -29
- package/dist/dialog/DialogPanel.svelte +26 -49
- package/dist/dialog/DialogTitle.svelte +23 -38
- package/dist/dialog/InternalDialog.svelte +202 -263
- package/dist/field/Field.svelte +25 -49
- package/dist/fieldset/Fieldset.svelte +29 -50
- package/dist/focus-trap/FocusTrap.svelte +283 -419
- package/dist/input/Input.svelte +53 -84
- package/dist/internal/FocusSentinel.svelte +8 -16
- package/dist/internal/ForcePortalRoot.svelte +3 -7
- package/dist/internal/FormFields.svelte +20 -31
- package/dist/internal/FormResolver.svelte +15 -20
- package/dist/internal/Hidden.svelte +23 -44
- package/dist/internal/HoistFormFields.svelte +4 -7
- package/dist/internal/MainTreeProvider.svelte +36 -89
- package/dist/internal/Portal.svelte +14 -18
- package/dist/label/Label.svelte +58 -91
- package/dist/legend/Legend.svelte +3 -18
- package/dist/listbox/Listbox.svelte +396 -588
- package/dist/listbox/ListboxButton.svelte +127 -176
- package/dist/listbox/ListboxButton.svelte.d.ts +4 -6
- package/dist/listbox/ListboxOption.svelte +125 -166
- package/dist/listbox/ListboxOptions.svelte +244 -340
- package/dist/listbox/ListboxSelectedOption.svelte +15 -38
- package/dist/menu/Menu.svelte +218 -307
- package/dist/menu/MenuButton.svelte +115 -157
- package/dist/menu/MenuHeading.svelte +14 -34
- package/dist/menu/MenuItem.svelte +107 -145
- package/dist/menu/MenuItems.svelte +224 -298
- package/dist/menu/MenuSection.svelte +9 -26
- package/dist/menu/MenuSeparator.svelte +4 -20
- package/dist/portal/InternalPortal.svelte +85 -141
- package/dist/portal/Portal.svelte +2 -5
- package/dist/portal/PortalGroup.svelte +9 -30
- package/dist/switch/Switch.svelte +132 -179
- package/dist/switch/SwitchGroup.svelte +31 -44
- package/dist/tabs/Tab.svelte +143 -195
- package/dist/tabs/TabGroup.svelte +205 -292
- package/dist/tabs/TabList.svelte +11 -31
- package/dist/tabs/TabPanel.svelte +43 -68
- package/dist/tabs/TabPanels.svelte +7 -18
- package/dist/textarea/Textarea.svelte +53 -84
- package/dist/transition/InternalTransitionChild.svelte +170 -259
- package/dist/transition/Transition.svelte +66 -96
- package/dist/transition/TransitionChild.svelte +11 -31
- package/dist/utils/ElementOrComponent.svelte +23 -44
- package/dist/utils/Generic.svelte +17 -29
- package/dist/utils/StableCollection.svelte +36 -54
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/id.js +1 -1
- package/package.json +12 -12
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
|
@@ -1,267 +1,178 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* prevent crashes when the `as` prop is a Fragment _and_ the component just acts
|
|
25
|
-
* as a state container (aka, there is no actual transition happening).
|
|
26
|
-
*
|
|
27
|
-
* E.g.:
|
|
28
|
-
*
|
|
29
|
-
* ```tsx
|
|
30
|
-
* <Transition show={true}>
|
|
31
|
-
* <Transition.Child enter="duration-100"><div>Child 1</div></Transition.Child>
|
|
32
|
-
* <Transition.Child enter="duration-200"><div>Child 2</div></Transition.Child>
|
|
33
|
-
* </Transition>
|
|
34
|
-
* ```
|
|
35
|
-
*
|
|
36
|
-
* In this scenario, the child components are transitioning, but the
|
|
37
|
-
* `Transition` parent, which is a `Fragment`, is not. So we should not forward
|
|
38
|
-
* the ref to the `Fragment`.
|
|
39
|
-
*/
|
|
40
|
-
export function shouldForwardRef<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(
|
|
41
|
-
props: TransitionRootProps<TTag>
|
|
42
|
-
) {
|
|
43
|
-
return (
|
|
44
|
-
// If we have any of the enter/leave classes
|
|
45
|
-
Boolean(props.enter || props.enterFrom || props.enterTo || props.leave || props.leaveFrom || props.leaveTo) ||
|
|
46
|
-
// If the `as` prop is not a Fragment
|
|
47
|
-
(props.as ?? DEFAULT_TRANSITION_CHILD_TAG) !== "svelte:fragment" ||
|
|
48
|
-
// If we have a single child, then we can forward the ref directly
|
|
49
|
-
props.children !== undefined
|
|
50
|
-
)
|
|
51
|
-
}
|
|
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
|
+
}
|
|
52
24
|
</script>
|
|
53
25
|
|
|
54
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
let _state = $state(untrack(() => show) ? TreeStates.Visible : TreeStates.Hidden)
|
|
89
|
-
|
|
90
|
-
const parentNesting = useParentNesting()
|
|
91
|
-
const { register, unregister } = $derived(parentNesting)
|
|
92
|
-
|
|
93
|
-
onMount(() => {
|
|
94
|
-
if (requiresRef) {
|
|
95
|
-
container.current = ref ?? null
|
|
96
|
-
containerElement = ref
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return register(container)
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
$effect(() => {
|
|
103
|
-
// If we are in another mode than the Hidden mode then ignore
|
|
104
|
-
if (strategy !== RenderStrategy.Hidden) return
|
|
105
|
-
if (!container.current) return
|
|
106
|
-
|
|
107
|
-
// Make sure that we are visible
|
|
108
|
-
if (show && _state !== TreeStates.Visible) {
|
|
109
|
-
_state = TreeStates.Visible
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
match(_state, {
|
|
114
|
-
[TreeStates.Hidden]: () => unregister(container),
|
|
115
|
-
[TreeStates.Visible]: () => register(container),
|
|
116
|
-
})
|
|
117
|
-
})
|
|
118
|
-
//[state, container, register, unregister, show, strategy]
|
|
119
|
-
|
|
120
|
-
$effect(() => {
|
|
121
|
-
if (!requiresRef) return
|
|
122
|
-
|
|
123
|
-
if (_state === TreeStates.Visible && container.current === null) {
|
|
124
|
-
throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")
|
|
125
|
-
}
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
// Skipping initial transition
|
|
129
|
-
const skip = $derived(initial && !appear)
|
|
130
|
-
const immediate = $derived(appear && show && initial)
|
|
131
|
-
|
|
132
|
-
let isTransitioning = $state(false)
|
|
133
|
-
|
|
134
|
-
let nesting = useNesting({
|
|
135
|
-
done: () => {
|
|
136
|
-
// When all children have been unmounted we can only hide ourselves if and
|
|
137
|
-
// only if we are not transitioning ourselves. Otherwise we would unmount
|
|
138
|
-
// before the transitions are finished.
|
|
139
|
-
if (isTransitioning) return
|
|
140
|
-
|
|
141
|
-
_state = TreeStates.Hidden
|
|
142
|
-
unregister(container)
|
|
143
|
-
},
|
|
144
|
-
get parent() {
|
|
145
|
-
return parentNesting
|
|
146
|
-
},
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
const start = (show: boolean) => {
|
|
150
|
-
isTransitioning = true
|
|
151
|
-
const direction: TransitionDirection = show ? "enter" : "leave"
|
|
152
|
-
|
|
153
|
-
nesting.onStart(container, direction, (direction) => {
|
|
154
|
-
if (direction === "enter") beforeEnter?.()
|
|
155
|
-
else if (direction === "leave") beforeLeave?.()
|
|
156
|
-
})
|
|
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;
|
|
157
60
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
if (direction === "leave" && !hasChildren(nesting)) {
|
|
169
|
-
// When we don't have children anymore we can safely unregister from the
|
|
170
|
-
// parent and hide ourselves.
|
|
171
|
-
_state = TreeStates.Hidden
|
|
172
|
-
unregister(container)
|
|
173
|
-
}
|
|
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;
|
|
174
69
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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)
|
|
263
160
|
})
|
|
264
|
-
|
|
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);
|
|
265
176
|
</script>
|
|
266
177
|
|
|
267
178
|
<ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_TRANSITION_CHILD_TAG} name="TransitionChild" bind:ref />
|
|
@@ -1,105 +1,75 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
DEFAULT_TRANSITION_CHILD_TAG,
|
|
8
|
-
TransitionChildRenderFeatures,
|
|
9
|
-
} from "./TransitionChild.svelte"
|
|
10
|
-
|
|
11
|
-
export type TransitionRootProps<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG> =
|
|
12
|
-
TransitionChildProps<TTag> & {
|
|
13
|
-
show?: boolean
|
|
14
|
-
appear?: boolean
|
|
15
|
-
}
|
|
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";
|
|
16
7
|
</script>
|
|
17
8
|
|
|
18
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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;
|
|
37
31
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
});
|
|
33
|
+
let initial = $state(true);
|
|
34
|
+
let changes = $state([show]);
|
|
35
|
+
$effect(() => {
|
|
36
|
+
if (untrack(() => initial) === false) {
|
|
37
|
+
return;
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const nestingBag = useNesting({
|
|
46
|
-
done: () => {
|
|
47
|
-
if (show) return
|
|
48
|
-
_state = TreeStates.Hidden
|
|
49
|
-
},
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
let initial = $state(true)
|
|
53
|
-
|
|
54
|
-
// Change the `initial` value
|
|
55
|
-
let changes = $state([show])
|
|
56
|
-
$effect(() => {
|
|
57
|
-
// We can skip this effect
|
|
58
|
-
if (untrack(() => initial) === false) {
|
|
59
|
-
return
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Track the changes
|
|
63
|
-
if (changes[changes.length - 1] !== show) {
|
|
64
|
-
changes.push(show)
|
|
65
|
-
initial = false
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
$effect(() => {
|
|
70
|
-
if (show) {
|
|
71
|
-
_state = TreeStates.Visible
|
|
72
|
-
} else if (!hasChildren(nestingBag) && untrack(() => ref)) {
|
|
73
|
-
_state = TreeStates.Hidden
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
const sharedProps = $derived({ unmount })
|
|
78
|
-
|
|
79
|
-
const beforeEnter = () => {
|
|
80
|
-
if (initial) initial = false
|
|
81
|
-
_props.beforeEnter?.()
|
|
39
|
+
if (changes[changes.length - 1] !== show) {
|
|
40
|
+
changes.push(show);
|
|
41
|
+
initial = false;
|
|
82
42
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
43
|
+
});
|
|
44
|
+
$effect(() => {
|
|
45
|
+
if (show) {
|
|
46
|
+
_state = TreeStates.Visible;
|
|
47
|
+
} else if (!hasChildren(nestingBag) && untrack(() => ref)) {
|
|
48
|
+
_state = TreeStates.Hidden;
|
|
87
49
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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;
|
|
103
73
|
</script>
|
|
104
74
|
|
|
105
75
|
{#snippet children()}
|