@pzerelles/headlessui-svelte 2.1.1-next.1 → 2.1.2-next.11
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 +43 -25
- package/dist/checkbox/Checkbox.svelte.d.ts +42 -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 -11
- 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 +325 -0
- package/dist/focus-trap/FocusTrap.svelte.d.ts +46 -0
- package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
- package/dist/focus-trap/FocusTrapFeatures.js +15 -0
- package/dist/hooks/use-controllable.svelte.d.ts +1 -1
- package/dist/hooks/use-controllable.svelte.js +3 -3
- package/dist/hooks/use-did-element-move.svelte.js +5 -10
- 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 +50 -0
- package/dist/input/index.d.ts +1 -0
- package/dist/input/index.js +1 -0
- package/dist/internal/FloatingProvider.svelte +12 -0
- package/dist/internal/FloatingProvider.svelte.d.ts +22 -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 +6 -14
- package/dist/internal/Hidden.svelte.d.ts +19 -15
- package/dist/internal/HiddenFeatures.d.ts +5 -0
- package/dist/internal/HiddenFeatures.js +9 -0
- 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-provider.svelte.d.ts +3 -0
- package/dist/internal/floating-provider.svelte.js +206 -0
- package/dist/internal/floating.svelte.d.ts +50 -20
- package/dist/internal/floating.svelte.js +100 -271
- package/dist/internal/inner.svelte.d.ts +91 -0
- package/dist/internal/inner.svelte.js +202 -0
- package/dist/internal/open-closed.d.ts +1 -1
- package/dist/internal/open-closed.js +1 -1
- package/dist/label/Label.svelte +17 -65
- 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 +40 -74
- package/dist/listbox/Listbox.svelte.d.ts +30 -72
- package/dist/listbox/ListboxButton.svelte +16 -18
- package/dist/listbox/ListboxButton.svelte.d.ts +16 -7
- package/dist/listbox/ListboxOption.svelte +10 -10
- package/dist/listbox/ListboxOption.svelte.d.ts +22 -11
- package/dist/listbox/ListboxOptions.svelte +62 -60
- package/dist/listbox/ListboxOptions.svelte.d.ts +23 -7
- package/dist/listbox/ListboxSelectedOption.svelte +15 -7
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +24 -14
- package/dist/listbox/context.svelte.d.ts +75 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/menu/Menu.svelte +235 -0
- package/dist/menu/Menu.svelte.d.ts +42 -0
- package/dist/menu/MenuButton.svelte +129 -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 +248 -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 +41 -37
- package/dist/switch/Switch.svelte.d.ts +24 -7
- 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 +50 -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/floating-ui/svelte/components/FloatingNode.svelte +17 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +23 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +41 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
- package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
- package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
- package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
- package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
- package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
- package/dist/utils/floating-ui/svelte/index.js +5 -0
- package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
- package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
- package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
- package/dist/utils/floating-ui/svelte/types.js +1 -0
- package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
- package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
- package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
- package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
- package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
- package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
- package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
- package/dist/utils/floating-ui/svelte/utils.js +136 -0
- package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
- package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
- package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
- package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
- package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
- package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +183 -0
- package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
- package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
- package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
- package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
- package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
- package/dist/utils/focus-management.d.ts +2 -1
- package/dist/utils/focus-management.js +13 -13
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/id.js +1 -1
- 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/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +14 -17
- package/dist/utils/types.js +0 -5
- package/package.json +33 -31
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
- 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,202 @@
|
|
|
1
|
+
import { evaluate, max, min, round } from "@floating-ui/utils";
|
|
2
|
+
import { DEV } from "esm-env";
|
|
3
|
+
import { detectOverflow, offset, } from "@floating-ui/dom";
|
|
4
|
+
import { tick, untrack } from "svelte";
|
|
5
|
+
let devMessageSet;
|
|
6
|
+
if (DEV) {
|
|
7
|
+
devMessageSet = new Set();
|
|
8
|
+
}
|
|
9
|
+
export function warn(...messages) {
|
|
10
|
+
const message = `Floating UI: ${messages.join(" ")}`;
|
|
11
|
+
if (!devMessageSet?.has(message)) {
|
|
12
|
+
devMessageSet?.add(message);
|
|
13
|
+
console.warn(message);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function error(...messages) {
|
|
17
|
+
const message = `Floating UI: ${messages.join(" ")}`;
|
|
18
|
+
if (!devMessageSet?.has(message)) {
|
|
19
|
+
devMessageSet?.add(message);
|
|
20
|
+
console.error(message);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function getUserAgent() {
|
|
24
|
+
const uaData = navigator.userAgentData;
|
|
25
|
+
if (uaData && Array.isArray(uaData.brands)) {
|
|
26
|
+
return uaData.brands.map(({ brand, version }) => `${brand}/${version}`).join(" ");
|
|
27
|
+
}
|
|
28
|
+
return navigator.userAgent;
|
|
29
|
+
}
|
|
30
|
+
// ------
|
|
31
|
+
function getArgsWithCustomFloatingHeight(state, height) {
|
|
32
|
+
return {
|
|
33
|
+
...state,
|
|
34
|
+
rects: {
|
|
35
|
+
...state.rects,
|
|
36
|
+
floating: {
|
|
37
|
+
...state.rects.floating,
|
|
38
|
+
height,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Positions the floating element such that an inner element inside of it is
|
|
45
|
+
* anchored to the reference element.
|
|
46
|
+
* @see https://floating-ui.com/docs/inner
|
|
47
|
+
*/
|
|
48
|
+
export const inner = (props) => ({
|
|
49
|
+
name: "inner",
|
|
50
|
+
options: props,
|
|
51
|
+
async fn(state) {
|
|
52
|
+
const { listRef, overflowRef, onFallbackChange, offset: innerOffset = 0, index = 0, minItemsVisible = 4, referenceOverflowThreshold = 0, scrollRef, ...detectOverflowOptions } = evaluate(props, state);
|
|
53
|
+
const { rects, elements: { floating }, } = state;
|
|
54
|
+
const item = listRef.current[index];
|
|
55
|
+
const scrollEl = scrollRef?.current || floating;
|
|
56
|
+
// Valid combinations:
|
|
57
|
+
// 1. Floating element is the scrollRef and has a border (default)
|
|
58
|
+
// 2. Floating element is not the scrollRef, floating element has a border
|
|
59
|
+
// 3. Floating element is not the scrollRef, scrollRef has a border
|
|
60
|
+
// Floating > {...getFloatingProps()} wrapper > scrollRef > items is not
|
|
61
|
+
// allowed as VoiceOver doesn't work.
|
|
62
|
+
const clientTop = floating.clientTop || scrollEl.clientTop;
|
|
63
|
+
const floatingIsBordered = floating.clientTop !== 0;
|
|
64
|
+
const scrollElIsBordered = scrollEl.clientTop !== 0;
|
|
65
|
+
const floatingIsScrollEl = floating === scrollEl;
|
|
66
|
+
if (DEV) {
|
|
67
|
+
if (!state.placement.startsWith("bottom")) {
|
|
68
|
+
warn('`placement` side must be "bottom" when using the `inner`', "middleware.");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!item) {
|
|
72
|
+
return {};
|
|
73
|
+
}
|
|
74
|
+
const nextArgs = {
|
|
75
|
+
...state,
|
|
76
|
+
...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state)),
|
|
77
|
+
};
|
|
78
|
+
const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);
|
|
79
|
+
const refOverflow = await detectOverflow(nextArgs, {
|
|
80
|
+
...detectOverflowOptions,
|
|
81
|
+
elementContext: "reference",
|
|
82
|
+
});
|
|
83
|
+
const diffY = max(0, overflow.top);
|
|
84
|
+
const nextY = nextArgs.y + diffY;
|
|
85
|
+
const maxHeight = round(max(0, scrollEl.scrollHeight +
|
|
86
|
+
((floatingIsBordered && floatingIsScrollEl) || scrollElIsBordered ? clientTop * 2 : 0) -
|
|
87
|
+
diffY -
|
|
88
|
+
max(0, overflow.bottom)));
|
|
89
|
+
scrollEl.style.maxHeight = `${maxHeight}px`;
|
|
90
|
+
scrollEl.scrollTop = diffY;
|
|
91
|
+
// There is not enough space, fallback to standard anchored positioning
|
|
92
|
+
if (onFallbackChange) {
|
|
93
|
+
const shouldFallback = (scrollEl.scrollHeight > scrollEl.offsetHeight &&
|
|
94
|
+
scrollEl.offsetHeight < item.offsetHeight * minItemsVisible - 1) ||
|
|
95
|
+
refOverflow.top >= -referenceOverflowThreshold ||
|
|
96
|
+
refOverflow.bottom >= -referenceOverflowThreshold;
|
|
97
|
+
onFallbackChange(shouldFallback);
|
|
98
|
+
await tick();
|
|
99
|
+
}
|
|
100
|
+
if (overflowRef) {
|
|
101
|
+
overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({ ...nextArgs, y: nextY }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
y: nextY,
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
/**
|
|
109
|
+
* Changes the `inner` middleware's `offset` upon a `wheel` event to
|
|
110
|
+
* expand the floating element's height, revealing more list items.
|
|
111
|
+
* @see https://floating-ui.com/docs/inner
|
|
112
|
+
*/
|
|
113
|
+
export function useInnerOffset(options) {
|
|
114
|
+
const { context, props } = $derived(options);
|
|
115
|
+
const { open, elements } = $derived(context);
|
|
116
|
+
const { enabled = true, overflowRef, scrollRef, onChange: unstable_onChange } = $derived(props);
|
|
117
|
+
const onChange = unstable_onChange;
|
|
118
|
+
let controlledScrollingRef = $state(false);
|
|
119
|
+
let prevScrollTopRef = $state(null);
|
|
120
|
+
let initialOverflowRef = $state(null);
|
|
121
|
+
$effect(() => {
|
|
122
|
+
if (!enabled)
|
|
123
|
+
return;
|
|
124
|
+
[open, elements.floating, overflowRef, scrollRef, onChange];
|
|
125
|
+
untrack(() => {
|
|
126
|
+
function onWheel(e) {
|
|
127
|
+
if (e.ctrlKey || !el || overflowRef.current == null) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const dY = e.deltaY;
|
|
131
|
+
const isAtTop = overflowRef.current.top >= -0.5;
|
|
132
|
+
const isAtBottom = overflowRef.current.bottom >= -0.5;
|
|
133
|
+
const remainingScroll = el.scrollHeight - el.clientHeight;
|
|
134
|
+
const sign = dY < 0 ? -1 : 1;
|
|
135
|
+
const method = dY < 0 ? "max" : "min";
|
|
136
|
+
if (el.scrollHeight <= el.clientHeight) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if ((!isAtTop && dY > 0) || (!isAtBottom && dY < 0)) {
|
|
140
|
+
e.preventDefault();
|
|
141
|
+
onChange((d) => d + Math[method](dY, remainingScroll * sign));
|
|
142
|
+
tick();
|
|
143
|
+
}
|
|
144
|
+
else if (/firefox/i.test(getUserAgent())) {
|
|
145
|
+
// Needed to propagate scrolling during momentum scrolling phase once
|
|
146
|
+
// it gets limited by the boundary. UX improvement, not critical.
|
|
147
|
+
el.scrollTop += dY;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const el = scrollRef?.current || elements.floating;
|
|
151
|
+
if (open && el) {
|
|
152
|
+
el.addEventListener("wheel", onWheel);
|
|
153
|
+
// Wait for the position to be ready.
|
|
154
|
+
requestAnimationFrame(() => {
|
|
155
|
+
prevScrollTopRef = el.scrollTop;
|
|
156
|
+
if (overflowRef.current != null) {
|
|
157
|
+
initialOverflowRef = { ...overflowRef.current };
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return () => {
|
|
161
|
+
prevScrollTopRef = null;
|
|
162
|
+
initialOverflowRef = null;
|
|
163
|
+
el.removeEventListener("wheel", onWheel);
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
const floating = $derived({
|
|
169
|
+
onKeyDown() {
|
|
170
|
+
controlledScrollingRef = true;
|
|
171
|
+
},
|
|
172
|
+
onWheel() {
|
|
173
|
+
controlledScrollingRef = false;
|
|
174
|
+
},
|
|
175
|
+
onPointerMove() {
|
|
176
|
+
controlledScrollingRef = false;
|
|
177
|
+
},
|
|
178
|
+
async onScroll() {
|
|
179
|
+
const el = scrollRef?.current || elements.floating;
|
|
180
|
+
if (!overflowRef.current || !el || !controlledScrollingRef) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (prevScrollTopRef !== null) {
|
|
184
|
+
const scrollDiff = el.scrollTop - prevScrollTopRef;
|
|
185
|
+
if ((overflowRef.current.bottom < -0.5 && scrollDiff < -1) ||
|
|
186
|
+
(overflowRef.current.top < -0.5 && scrollDiff > 1)) {
|
|
187
|
+
onChange((d) => d + scrollDiff);
|
|
188
|
+
await tick();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// [Firefox] Wait for the height change to have been applied.
|
|
192
|
+
requestAnimationFrame(() => {
|
|
193
|
+
prevScrollTopRef = el.scrollTop;
|
|
194
|
+
});
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
get floating() {
|
|
199
|
+
return enabled ? floating : undefined;
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
@@ -7,7 +7,7 @@ export declare enum State {
|
|
|
7
7
|
export type OpenClosedContext = {
|
|
8
8
|
readonly value: State;
|
|
9
9
|
};
|
|
10
|
-
export declare function useOpenClosed(): OpenClosedContext;
|
|
10
|
+
export declare function useOpenClosed(): OpenClosedContext | null;
|
|
11
11
|
export declare function createOpenClosedContext(options: {
|
|
12
12
|
readonly value: State;
|
|
13
13
|
}): void;
|
|
@@ -7,7 +7,7 @@ export var State;
|
|
|
7
7
|
State[State["Opening"] = 8] = "Opening";
|
|
8
8
|
})(State || (State = {}));
|
|
9
9
|
export function useOpenClosed() {
|
|
10
|
-
return getContext("OpenClosedContext");
|
|
10
|
+
return getContext("OpenClosedContext") ?? null;
|
|
11
11
|
}
|
|
12
12
|
export function createOpenClosedContext(options) {
|
|
13
13
|
setContext("OpenClosedContext", options);
|
package/dist/label/Label.svelte
CHANGED
|
@@ -1,74 +1,21 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
const DEFAULT_LABEL_TAG = "label";
|
|
3
|
-
export function useLabelContext() {
|
|
4
|
-
let context = getContext("LabelContext");
|
|
5
|
-
if (context === null) {
|
|
6
|
-
let err = new Error("You used a <Label /> component, but it is not inside a relevant parent.");
|
|
7
|
-
if (Error.captureStackTrace) Error.captureStackTrace(err, useLabelContext);
|
|
8
|
-
throw err;
|
|
9
|
-
}
|
|
10
|
-
return context;
|
|
11
|
-
}
|
|
12
|
-
export function useLabelledBy(alwaysAvailableIds) {
|
|
13
|
-
const context = getContext("LabelContext");
|
|
14
|
-
const value = $derived(
|
|
15
|
-
(alwaysAvailableIds?.length ?? 0) > 0 ? [context?.value, ...alwaysAvailableIds].filter(Boolean).join(" ") : context?.value
|
|
16
|
-
);
|
|
17
|
-
return {
|
|
18
|
-
get value() {
|
|
19
|
-
return value;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export const useLabels = (options = {}) => {
|
|
24
|
-
const { slot, name, props, inherit } = $derived(options);
|
|
25
|
-
const parentLabelledBy = useLabelledBy();
|
|
26
|
-
let labelIds = $state([]);
|
|
27
|
-
const allLabelIds = $derived(inherit && parentLabelledBy.value ? [parentLabelledBy.value, ...labelIds] : labelIds);
|
|
28
|
-
const value = $derived(allLabelIds.length > 0 ? allLabelIds.join(" ") : void 0);
|
|
29
|
-
const context = {
|
|
30
|
-
get slot() {
|
|
31
|
-
return slot;
|
|
32
|
-
},
|
|
33
|
-
get name() {
|
|
34
|
-
return name;
|
|
35
|
-
},
|
|
36
|
-
get props() {
|
|
37
|
-
return props;
|
|
38
|
-
},
|
|
39
|
-
get value() {
|
|
40
|
-
return value;
|
|
41
|
-
},
|
|
42
|
-
register(value2) {
|
|
43
|
-
labelIds.push(value2);
|
|
44
|
-
return () => {
|
|
45
|
-
const clone = labelIds.slice();
|
|
46
|
-
const idx = clone.indexOf(value2);
|
|
47
|
-
if (idx !== -1) clone.splice(idx, 1);
|
|
48
|
-
labelIds = clone;
|
|
49
|
-
return labelIds;
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
setContext("LabelContext", context);
|
|
54
|
-
return context;
|
|
55
|
-
};
|
|
1
|
+
<script lang="ts" module>let DEFAULT_LABEL_TAG = "label";
|
|
56
2
|
</script>
|
|
57
3
|
|
|
58
|
-
<script lang="ts" generics="TTag extends
|
|
59
|
-
import {
|
|
4
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LABEL_TAG">import { onMount } from "svelte";
|
|
5
|
+
import { useProvidedId, htmlid } from "../utils/id.js";
|
|
60
6
|
import { useDisabled } from "../hooks/use-disabled.js";
|
|
61
7
|
import { stateFromSlot } from "../utils/state.js";
|
|
8
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
9
|
+
import { useLabelContext } from "./context.svelte.js";
|
|
62
10
|
const internalId = htmlid();
|
|
63
11
|
const context = useLabelContext();
|
|
64
|
-
const providedHtmlFor =
|
|
12
|
+
const providedHtmlFor = useProvidedId();
|
|
65
13
|
const providedDisabled = useDisabled();
|
|
66
14
|
let {
|
|
67
|
-
|
|
15
|
+
ref = $bindable(),
|
|
68
16
|
id = `headlessui-label-${internalId}`,
|
|
69
17
|
htmlFor = providedHtmlFor,
|
|
70
18
|
passive = false,
|
|
71
|
-
children,
|
|
72
19
|
...theirOriginalProps
|
|
73
20
|
} = $props();
|
|
74
21
|
onMount(() => {
|
|
@@ -79,8 +26,9 @@ let handleClick = (e) => {
|
|
|
79
26
|
if (current instanceof HTMLLabelElement) {
|
|
80
27
|
e.preventDefault();
|
|
81
28
|
}
|
|
29
|
+
console.log("click", providedHtmlFor);
|
|
82
30
|
if (current instanceof HTMLLabelElement) {
|
|
83
|
-
let target = document.getElementById(current.getAttribute("
|
|
31
|
+
let target = document.getElementById(current.getAttribute("for") ?? "");
|
|
84
32
|
if (target) {
|
|
85
33
|
let actuallyDisabled = target.getAttribute("disabled");
|
|
86
34
|
if (actuallyDisabled === "true" || actuallyDisabled === "") {
|
|
@@ -101,7 +49,7 @@ const disabled = $derived(providedDisabled.value ?? false);
|
|
|
101
49
|
const slot = $derived({ disabled });
|
|
102
50
|
const ourProps = $derived({
|
|
103
51
|
id,
|
|
104
|
-
|
|
52
|
+
for: passive ? void 0 : htmlFor,
|
|
105
53
|
onclick: passive ? void 0 : handleClick,
|
|
106
54
|
...stateFromSlot(slot)
|
|
107
55
|
});
|
|
@@ -115,6 +63,10 @@ const theirProps = $derived.by(() => {
|
|
|
115
63
|
});
|
|
116
64
|
</script>
|
|
117
65
|
|
|
118
|
-
<
|
|
119
|
-
{
|
|
120
|
-
|
|
66
|
+
<ElementOrComponent
|
|
67
|
+
{ourProps}
|
|
68
|
+
{theirProps}
|
|
69
|
+
defaultTag={htmlFor ? DEFAULT_LABEL_TAG : "div"}
|
|
70
|
+
name={context.name || "Label"}
|
|
71
|
+
bind:ref
|
|
72
|
+
/>
|
|
@@ -1,50 +1,37 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import type { ElementType, Props, PropsOf } from "../utils/types.js";
|
|
2
|
+
declare let DEFAULT_LABEL_TAG: "label";
|
|
3
|
+
export type LabelProps<TTag extends ElementType = typeof DEFAULT_LABEL_TAG> = Props<TTag> & {
|
|
4
4
|
passive?: boolean;
|
|
5
5
|
htmlFor?: string;
|
|
6
|
-
children?: Snippet<[
|
|
7
|
-
{
|
|
8
|
-
disabled: boolean;
|
|
9
|
-
}
|
|
10
|
-
]>;
|
|
11
6
|
};
|
|
12
|
-
declare
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
readonly value: string | undefined;
|
|
25
|
-
};
|
|
26
|
-
export declare const useLabels: (options?: SharedData & {
|
|
27
|
-
inherit?: boolean;
|
|
28
|
-
}) => LabelContext;
|
|
29
|
-
import { type Snippet } from "svelte";
|
|
30
|
-
declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements> {
|
|
31
|
-
props(): LabelProps<TTag>;
|
|
7
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LABEL_TAG> {
|
|
8
|
+
props(): {
|
|
9
|
+
as?: TTag | undefined;
|
|
10
|
+
} & (Exclude<keyof PropsOf<TTag>, "as" | "children" | "refName" | "class"> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
|
|
11
|
+
children?: import("../utils/types.js").Children<{}> | undefined;
|
|
12
|
+
ref?: HTMLElement;
|
|
13
|
+
} & (true extends (PropsOf<TTag> extends infer T_1 ? T_1 extends 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?: PropsOf<TTag>["class"] | ((bag: {}) => string) | undefined;
|
|
15
|
+
} : {}) & {
|
|
16
|
+
passive?: boolean;
|
|
17
|
+
htmlFor?: string;
|
|
18
|
+
};
|
|
32
19
|
events(): {} & {
|
|
33
20
|
[evt: string]: CustomEvent<any>;
|
|
34
21
|
};
|
|
35
22
|
slots(): {};
|
|
36
|
-
bindings(): "";
|
|
23
|
+
bindings(): "ref";
|
|
37
24
|
exports(): {};
|
|
38
25
|
}
|
|
39
26
|
interface $$IsomorphicComponent {
|
|
40
|
-
new <TTag extends
|
|
27
|
+
new <TTag extends ElementType = typeof DEFAULT_LABEL_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']>> & {
|
|
41
28
|
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
42
29
|
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
43
|
-
<TTag extends
|
|
30
|
+
<TTag extends ElementType = typeof DEFAULT_LABEL_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
44
31
|
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
45
32
|
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
46
33
|
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
47
34
|
}
|
|
48
35
|
declare const Label: $$IsomorphicComponent;
|
|
49
|
-
type Label<TTag extends
|
|
36
|
+
type Label<TTag extends ElementType = typeof DEFAULT_LABEL_TAG> = InstanceType<typeof Label<TTag>>;
|
|
50
37
|
export default Label;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface SharedData {
|
|
2
|
+
slot?: {};
|
|
3
|
+
name?: string;
|
|
4
|
+
props?: Record<string, any>;
|
|
5
|
+
}
|
|
6
|
+
export type LabelContext = {
|
|
7
|
+
value: string | undefined;
|
|
8
|
+
register(value: string): () => void;
|
|
9
|
+
} & SharedData;
|
|
10
|
+
export declare function useLabelContext(): LabelContext;
|
|
11
|
+
export declare function useLabelledBy(alwaysAvailableIds?: (string | undefined | null)[]): {
|
|
12
|
+
readonly value: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
export declare const useLabels: (options?: SharedData & {
|
|
15
|
+
inherit?: boolean;
|
|
16
|
+
}) => LabelContext;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getContext, setContext } from "svelte";
|
|
2
|
+
export function useLabelContext() {
|
|
3
|
+
let context = getContext("LabelContext");
|
|
4
|
+
if (context === null) {
|
|
5
|
+
let err = new Error("You used a <Label /> component, but it is not inside a relevant parent.");
|
|
6
|
+
if (Error.captureStackTrace)
|
|
7
|
+
Error.captureStackTrace(err, useLabelContext);
|
|
8
|
+
throw err;
|
|
9
|
+
}
|
|
10
|
+
return context;
|
|
11
|
+
}
|
|
12
|
+
export function useLabelledBy(alwaysAvailableIds) {
|
|
13
|
+
const context = getContext("LabelContext");
|
|
14
|
+
const value = $derived((alwaysAvailableIds?.length ?? 0) > 0
|
|
15
|
+
? [context?.value, ...alwaysAvailableIds].filter(Boolean).join(" ")
|
|
16
|
+
: context?.value);
|
|
17
|
+
return {
|
|
18
|
+
get value() {
|
|
19
|
+
return value;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export const useLabels = (options = {}) => {
|
|
24
|
+
const { slot, name, props, inherit } = $derived(options);
|
|
25
|
+
const parentLabelledBy = useLabelledBy();
|
|
26
|
+
let labelIds = $state([]);
|
|
27
|
+
const allLabelIds = $derived(inherit && parentLabelledBy.value ? [parentLabelledBy.value, ...labelIds] : labelIds);
|
|
28
|
+
const value = $derived(allLabelIds.length > 0 ? allLabelIds.join(" ") : undefined);
|
|
29
|
+
const context = {
|
|
30
|
+
get slot() {
|
|
31
|
+
return slot;
|
|
32
|
+
},
|
|
33
|
+
get name() {
|
|
34
|
+
return name;
|
|
35
|
+
},
|
|
36
|
+
get props() {
|
|
37
|
+
return props;
|
|
38
|
+
},
|
|
39
|
+
get value() {
|
|
40
|
+
return value;
|
|
41
|
+
},
|
|
42
|
+
register(value) {
|
|
43
|
+
labelIds.push(value);
|
|
44
|
+
return () => {
|
|
45
|
+
const clone = labelIds.slice();
|
|
46
|
+
const idx = clone.indexOf(value);
|
|
47
|
+
if (idx !== -1)
|
|
48
|
+
clone.splice(idx, 1);
|
|
49
|
+
labelIds = clone;
|
|
50
|
+
return labelIds;
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
setContext("LabelContext", context);
|
|
55
|
+
return context;
|
|
56
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
<script lang="ts"
|
|
1
|
+
<script lang="ts" module>import { Label } from "../index.js";
|
|
2
|
+
const DEFAULT_LEGEND_TAG = Label;
|
|
3
|
+
</script>
|
|
2
4
|
|
|
3
|
-
<script lang="ts">
|
|
4
|
-
let { ...props } = $props();
|
|
5
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LEGEND_TAG">let { ...props } = $props();
|
|
5
6
|
</script>
|
|
6
7
|
|
|
7
8
|
<Label as="div" {...props} />
|
|
@@ -1,17 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { type LabelProps } from "../index.js";
|
|
2
|
+
import type { ElementType, Props } from "../utils/types.js";
|
|
3
|
+
import type { Component } from "svelte";
|
|
4
|
+
declare const DEFAULT_LEGEND_TAG: Component<LabelProps, any>;
|
|
5
|
+
type LegendRenderPropArg = {};
|
|
6
|
+
type LegendPropsWeControl = never;
|
|
7
|
+
export type LegendProps<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = Props<TTag, LegendRenderPropArg, LegendPropsWeControl, {}>;
|
|
8
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> {
|
|
9
|
+
props(): {
|
|
10
|
+
as?: TTag | undefined;
|
|
11
|
+
} & (Exclude<keyof import("../index.js").PropsOf<TTag>, "as" | "children" | "refName" | "class"> extends infer T extends keyof import("../index.js").PropsOf<TTag> ? { [P in T]: import("../index.js").PropsOf<TTag>[P]; } : never) & {
|
|
12
|
+
children?: import("../index.js").Children<LegendRenderPropArg> | undefined;
|
|
13
|
+
ref?: HTMLElement;
|
|
14
|
+
} & (true extends (import("../index.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../index.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) ? {
|
|
15
|
+
class?: import("../index.js").PropsOf<TTag>["class"] | ((bag: LegendRenderPropArg) => string) | undefined;
|
|
16
|
+
} : {});
|
|
17
|
+
events(): {} & {
|
|
18
|
+
[evt: string]: CustomEvent<any>;
|
|
19
|
+
};
|
|
20
|
+
slots(): {};
|
|
21
|
+
bindings(): "";
|
|
22
|
+
exports(): {};
|
|
12
23
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
interface $$IsomorphicComponent {
|
|
25
|
+
new <TTag extends ElementType = typeof DEFAULT_LEGEND_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']>> & {
|
|
26
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
27
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
28
|
+
<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
29
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
30
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
31
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
32
|
+
}
|
|
33
|
+
declare const Legend: $$IsomorphicComponent;
|
|
34
|
+
type Legend<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = InstanceType<typeof Legend<TTag>>;
|
|
17
35
|
export default Legend;
|