@pzerelles/headlessui-svelte 2.1.2-next.29 → 2.1.2-next.30
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 -173
- package/dist/checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/close-button/CloseButton.svelte +6 -12
- package/dist/combobox/Combobox.svelte +3 -50
- package/dist/data-interactive/DataInteractive.svelte +29 -55
- package/dist/description/Description.svelte +21 -31
- package/dist/dialog/Dialog.svelte +228 -320
- package/dist/dialog/DialogBackdrop.svelte +12 -29
- package/dist/dialog/DialogPanel.svelte +25 -48
- package/dist/dialog/DialogTitle.svelte +23 -38
- package/dist/field/Field.svelte +25 -47
- 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/FloatingProvider.svelte +9 -14
- package/dist/internal/FocusSentinel.svelte +8 -16
- package/dist/internal/ForcePortalRoot.svelte +3 -7
- package/dist/internal/FormFields.svelte +34 -47
- package/dist/internal/FormFieldsProvider.svelte +5 -9
- package/dist/internal/FormResolver.svelte +15 -20
- package/dist/internal/Hidden.svelte +29 -50
- package/dist/internal/MainTreeProvider.svelte +36 -89
- package/dist/internal/Portal.svelte +14 -18
- package/dist/label/Label.svelte +58 -93
- package/dist/legend/Legend.svelte +3 -12
- package/dist/listbox/Listbox.svelte +387 -525
- package/dist/listbox/Listbox.svelte.d.ts +1 -1
- package/dist/listbox/ListboxButton.svelte +127 -173
- package/dist/listbox/ListboxOption.svelte +129 -170
- package/dist/listbox/ListboxOptions.svelte +304 -400
- package/dist/listbox/ListboxSelectedOption.svelte +15 -38
- package/dist/menu/Menu.svelte +51 -78
- package/dist/menu/MenuButton.svelte +117 -157
- package/dist/menu/MenuHeading.svelte +14 -32
- package/dist/menu/MenuItem.svelte +107 -142
- package/dist/menu/MenuItems.svelte +229 -301
- package/dist/menu/MenuSection.svelte +9 -24
- package/dist/menu/MenuSeparator.svelte +4 -17
- package/dist/popover/Popover.svelte +150 -216
- package/dist/popover/PopoverBackdrop.svelte +41 -67
- package/dist/popover/PopoverButton.svelte +212 -292
- package/dist/popover/PopoverGroup.svelte +35 -62
- package/dist/popover/PopoverPanel.svelte +229 -311
- package/dist/portal/InternalPortal.svelte +85 -141
- package/dist/portal/Portal.svelte +2 -5
- package/dist/portal/PortalGroup.svelte +9 -30
- package/dist/select/Select.svelte +68 -98
- package/dist/switch/Switch.svelte +132 -179
- package/dist/switch/SwitchGroup.svelte +31 -44
- package/dist/tabs/Tab.svelte +142 -194
- package/dist/tabs/TabGroup.svelte +56 -86
- package/dist/tabs/TabGroup.svelte.d.ts +1 -1
- package/dist/tabs/TabList.svelte +11 -31
- package/dist/tabs/TabPanel.svelte +42 -67
- 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/DisabledProvider.svelte +3 -7
- package/dist/utils/ElementOrComponent.svelte +23 -43
- package/dist/utils/Generic.svelte +16 -27
- package/dist/utils/StableCollection.svelte +36 -54
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +12 -27
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +44 -88
- package/package.json +4 -4
|
@@ -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()}
|
|
@@ -1,36 +1,16 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import type { TransitionEvents, TransitionClasses } from "./context.svelte.js"
|
|
5
|
-
|
|
6
|
-
type TransitionChildPropsWeControl = never
|
|
7
|
-
|
|
8
|
-
export type TransitionChildProps<TTag extends ElementType> = Props<
|
|
9
|
-
TTag,
|
|
10
|
-
TransitionChildRenderPropArg,
|
|
11
|
-
TransitionChildPropsWeControl,
|
|
12
|
-
PropsForFeatures<typeof TransitionChildRenderFeatures> &
|
|
13
|
-
TransitionClasses &
|
|
14
|
-
TransitionEvents & { transition?: boolean; appear?: boolean }
|
|
15
|
-
>
|
|
16
|
-
|
|
17
|
-
export const DEFAULT_TRANSITION_CHILD_TAG = "svelte:fragment"
|
|
18
|
-
export type TransitionChildRenderPropArg = HTMLElement
|
|
19
|
-
export const TransitionChildRenderFeatures = RenderFeatures.RenderStrategy
|
|
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;
|
|
20
4
|
</script>
|
|
21
5
|
|
|
22
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
let { ref = $bindable(), as, ...props }: { as?: TTag } & TransitionChildProps<TTag> = $props()
|
|
32
|
-
|
|
33
|
-
const TransitionRootOrChild = !hasTransitionContext && hasOpenClosedContext ? Transition : InternalTransitionChild
|
|
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;
|
|
34
14
|
</script>
|
|
35
15
|
|
|
36
16
|
<TransitionRootOrChild bind:ref {...props} />
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const { disabled, children }: { disabled?: boolean; children?: Snippet } = $props()
|
|
6
|
-
|
|
7
|
-
provideDisabled(() => disabled ?? false)
|
|
1
|
+
<script lang="ts">import { provideDisabled } from "../hooks/use-disabled.js";
|
|
2
|
+
const { disabled, children } = $props();
|
|
3
|
+
provideDisabled(() => disabled ?? false);
|
|
8
4
|
</script>
|
|
9
5
|
|
|
10
6
|
{@render children?.()}
|
|
@@ -1,46 +1,26 @@
|
|
|
1
|
-
<script lang="ts" generics="TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
features?: TFeature
|
|
25
|
-
visible?: boolean
|
|
26
|
-
name: string
|
|
27
|
-
ref?: HTMLElement
|
|
28
|
-
value?: TValue
|
|
29
|
-
checked?: boolean
|
|
30
|
-
} = $props()
|
|
31
|
-
|
|
32
|
-
const featureFlags = $derived(features ?? RenderFeatures.None)
|
|
33
|
-
const { static: isStatic = false, unmount = true, ...rest } = $derived(mergePropsAdvanced(theirProps, ourProps ?? {}))
|
|
34
|
-
const render = $derived(
|
|
35
|
-
visible ||
|
|
36
|
-
(featureFlags & RenderFeatures.Static && isStatic) ||
|
|
37
|
-
(featureFlags & RenderFeatures.RenderStrategy && !unmount)
|
|
38
|
-
)
|
|
39
|
-
const hiddenProps = $derived(
|
|
40
|
-
!visible && !(featureFlags & RenderFeatures.Static) && featureFlags & RenderFeatures.RenderStrategy && !unmount
|
|
41
|
-
? { hidden: true, style: "display: none;" }
|
|
42
|
-
: {}
|
|
43
|
-
)
|
|
1
|
+
<script lang="ts" generics="TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue">import { mergePropsAdvanced, RenderFeatures } 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
|
+
);
|
|
44
24
|
</script>
|
|
45
25
|
|
|
46
26
|
{#if render}<Generic {...rest} {...hiddenProps} {slot} tag={defaultTag} bind:ref bind:value bind:checked />{/if}
|
|
@@ -1,30 +1,19 @@
|
|
|
1
|
-
<script lang="ts" generics="TTag extends ElementType, TSlot, TValue">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
as?: TTag
|
|
18
|
-
slot: TSlot
|
|
19
|
-
tag: ElementType
|
|
20
|
-
ref?: HTMLElement
|
|
21
|
-
value?: TValue
|
|
22
|
-
checked?: boolean
|
|
23
|
-
} & Props<TTag, TSlot> = $props()
|
|
24
|
-
|
|
25
|
-
const resolvedClass = $derived(
|
|
26
|
-
typeof props.class === "function" ? props.class(slot) : (props.class as string | undefined)
|
|
27
|
-
)
|
|
1
|
+
<script lang="ts" generics="TTag extends ElementType, TSlot, TValue">import { stateFromSlot } from "./state.js";
|
|
2
|
+
let {
|
|
3
|
+
slot = {},
|
|
4
|
+
tag,
|
|
5
|
+
ref = $bindable(),
|
|
6
|
+
value = $bindable(),
|
|
7
|
+
checked = $bindable(),
|
|
8
|
+
children,
|
|
9
|
+
as = tag,
|
|
10
|
+
unmount,
|
|
11
|
+
static: isStatic,
|
|
12
|
+
...props
|
|
13
|
+
} = $props();
|
|
14
|
+
const resolvedClass = $derived(
|
|
15
|
+
typeof props.class === "function" ? props.class(slot) : props.class
|
|
16
|
+
);
|
|
28
17
|
</script>
|
|
29
18
|
|
|
30
19
|
{#if as === "svelte:fragment"}
|
|
@@ -1,61 +1,43 @@
|
|
|
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
|
-
// FIXME: This is a side-effect during render. `release` is only called in
|
|
23
|
-
// an effect cleanup so we may never release if we had to render multiple
|
|
24
|
-
// times before commit e.g. when a sibling suspends.
|
|
25
|
-
list.set(key, renders + 1)
|
|
26
|
-
|
|
27
|
-
let index = Array.from(list.keys()).indexOf(key)
|
|
28
|
-
function release() {
|
|
29
|
-
let renders = list.get(key)
|
|
30
|
-
if (renders > 1) {
|
|
31
|
-
list.set(key, renders - 1)
|
|
32
|
-
} else {
|
|
33
|
-
list.delete(key)
|
|
34
|
-
}
|
|
1
|
+
<script lang="ts" module>import { useId } from "../hooks/use-id.js";
|
|
2
|
+
import { getContext, setContext } from "svelte";
|
|
3
|
+
function createCollection() {
|
|
4
|
+
return {
|
|
5
|
+
/** @type {Map<string, Map<string, number>>} */
|
|
6
|
+
groups: /* @__PURE__ */ new Map(),
|
|
7
|
+
get(group, key) {
|
|
8
|
+
let list = this.groups.get(group);
|
|
9
|
+
if (!list) {
|
|
10
|
+
list = /* @__PURE__ */ new Map();
|
|
11
|
+
this.groups.set(group, list);
|
|
12
|
+
}
|
|
13
|
+
let renders = list.get(key) ?? 0;
|
|
14
|
+
list.set(key, renders + 1);
|
|
15
|
+
let index = Array.from(list.keys()).indexOf(key);
|
|
16
|
+
function release() {
|
|
17
|
+
let renders2 = list.get(key);
|
|
18
|
+
if (renders2 > 1) {
|
|
19
|
+
list.set(key, renders2 - 1);
|
|
20
|
+
} else {
|
|
21
|
+
list.delete(key);
|
|
35
22
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
},
|
|
23
|
+
}
|
|
24
|
+
return [index, release];
|
|
39
25
|
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return idx
|
|
51
|
-
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function useStableCollectionIndex(group) {
|
|
29
|
+
let collection = getContext("StableCollection");
|
|
30
|
+
if (!collection) throw new Error("You must wrap your component in a <StableCollection>");
|
|
31
|
+
let key = useId();
|
|
32
|
+
let [idx, cleanupIdx] = collection.get(group, key);
|
|
33
|
+
$effect(() => cleanupIdx);
|
|
34
|
+
return idx;
|
|
35
|
+
}
|
|
52
36
|
</script>
|
|
53
37
|
|
|
54
|
-
<script lang="ts">
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
let { children }: { children: Snippet } = $props()
|
|
38
|
+
<script lang="ts">const collection = createCollection();
|
|
39
|
+
setContext("StableCollection", collection);
|
|
40
|
+
let { children } = $props();
|
|
59
41
|
</script>
|
|
60
42
|
|
|
61
43
|
{#if children}{@render children()}{/if}
|
|
@@ -1,32 +1,17 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
import type { Snippet } from "svelte"
|
|
1
|
+
<script lang="ts" module></script>
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
<script lang="ts">import { setContext } from "svelte";
|
|
4
|
+
import { useFloatingParentNodeId } from "./FloatingTree.svelte";
|
|
5
|
+
const { children, id } = $props();
|
|
6
|
+
const parentId = useFloatingParentNodeId();
|
|
7
|
+
setContext("FloatingNodeContext", {
|
|
8
|
+
get id() {
|
|
9
|
+
return id;
|
|
10
|
+
},
|
|
11
|
+
get parentId() {
|
|
12
|
+
return parentId.value;
|
|
7
13
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
<script lang="ts">
|
|
11
|
-
/**
|
|
12
|
-
* Provides parent node context for nested floating elements.
|
|
13
|
-
* @see https://floating-ui.com/docs/FloatingTree
|
|
14
|
-
*/
|
|
15
|
-
import { setContext } from "svelte"
|
|
16
|
-
import type { FloatingNodeType } from "../types.js"
|
|
17
|
-
import { useFloatingParentNodeId } from "./FloatingTree.svelte"
|
|
18
|
-
|
|
19
|
-
const { children, id }: FloatingNodeProps = $props()
|
|
20
|
-
|
|
21
|
-
const parentId = useFloatingParentNodeId()
|
|
22
|
-
setContext<FloatingNodeType>("FloatingNodeContext", {
|
|
23
|
-
get id() {
|
|
24
|
-
return id
|
|
25
|
-
},
|
|
26
|
-
get parentId() {
|
|
27
|
-
return parentId.value
|
|
28
|
-
},
|
|
29
|
-
})
|
|
14
|
+
});
|
|
30
15
|
</script>
|
|
31
16
|
|
|
32
17
|
{#if children}{@render children()}{/if}
|
|
@@ -1,94 +1,50 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
//const FloatingTreeContext = React.createContext<FloatingTreeType | null>(null)
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Returns the parent node id for nested floating elements, if available.
|
|
13
|
-
* Returns `null` for top-level floating elements.
|
|
14
|
-
*/
|
|
15
|
-
export const useFloatingParentNodeId = (): { readonly value: string | null } => {
|
|
16
|
-
const context = getContext<FloatingNodeType>("FloatingNodeContext")
|
|
17
|
-
return {
|
|
18
|
-
get value() {
|
|
19
|
-
return context?.id ?? null
|
|
20
|
-
},
|
|
1
|
+
<script lang="ts" module>import { getContext } from "svelte";
|
|
2
|
+
import { useId } from "../hooks/useId.svelte.js";
|
|
3
|
+
import { createPubSub } from "../utils/createPubSub.js";
|
|
4
|
+
export const useFloatingParentNodeId = () => {
|
|
5
|
+
const context = getContext("FloatingNodeContext");
|
|
6
|
+
return {
|
|
7
|
+
get value() {
|
|
8
|
+
return context?.id ?? null;
|
|
21
9
|
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
$effect(() => {
|
|
42
|
-
const node = { id, parentId }
|
|
43
|
-
tree?.addNode(node)
|
|
44
|
-
return () => {
|
|
45
|
-
tree?.removeNode(node)
|
|
46
|
-
}
|
|
47
|
-
}) //, [tree, id, parentId])
|
|
48
|
-
|
|
49
|
-
return id
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export interface FloatingTreeProps {
|
|
53
|
-
children?: Snippet
|
|
54
|
-
}
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export const useFloatingTree = () => getContext("FloatingTreeContext") ?? null;
|
|
13
|
+
export function useFloatingNodeId(options) {
|
|
14
|
+
const { customParentId } = $derived(options);
|
|
15
|
+
const id = useId();
|
|
16
|
+
const tree = useFloatingTree();
|
|
17
|
+
const reactParentId = useFloatingParentNodeId();
|
|
18
|
+
const parentId = $derived(customParentId || reactParentId.value);
|
|
19
|
+
$effect(() => {
|
|
20
|
+
const node = { id, parentId };
|
|
21
|
+
tree?.addNode(node);
|
|
22
|
+
return () => {
|
|
23
|
+
tree?.removeNode(node);
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
return id;
|
|
27
|
+
}
|
|
55
28
|
</script>
|
|
56
29
|
|
|
57
|
-
<script lang="ts">
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
nodesRef.current = [...nodesRef.current, node]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const removeNode = (node: FloatingNodeType) => {
|
|
79
|
-
nodesRef.current = nodesRef.current.filter((n) => n !== node)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const events = createPubSub()
|
|
83
|
-
|
|
84
|
-
setContext<FloatingTreeType<ReferenceType>>("FloatingTreeContext", {
|
|
85
|
-
get nodesRef() {
|
|
86
|
-
return nodesRef
|
|
87
|
-
},
|
|
88
|
-
addNode,
|
|
89
|
-
removeNode,
|
|
90
|
-
events,
|
|
91
|
-
})
|
|
30
|
+
<script lang="ts">import { setContext } from "svelte";
|
|
31
|
+
const { children } = $props();
|
|
32
|
+
const nodesRef = $state({ current: [] });
|
|
33
|
+
const addNode = (node) => {
|
|
34
|
+
nodesRef.current = [...nodesRef.current, node];
|
|
35
|
+
};
|
|
36
|
+
const removeNode = (node) => {
|
|
37
|
+
nodesRef.current = nodesRef.current.filter((n) => n !== node);
|
|
38
|
+
};
|
|
39
|
+
const events = createPubSub();
|
|
40
|
+
setContext("FloatingTreeContext", {
|
|
41
|
+
get nodesRef() {
|
|
42
|
+
return nodesRef;
|
|
43
|
+
},
|
|
44
|
+
addNode,
|
|
45
|
+
removeNode,
|
|
46
|
+
events
|
|
47
|
+
});
|
|
92
48
|
</script>
|
|
93
49
|
|
|
94
50
|
{#if children}{@render children()}{/if}
|