@pzerelles/headlessui-svelte 2.1.2-next.3 → 2.1.2-next.31
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 +1 -1
- package/dist/button/Button.svelte.d.ts +9 -11
- package/dist/checkbox/Checkbox.svelte +4 -4
- package/dist/checkbox/Checkbox.svelte.d.ts +10 -14
- package/dist/close-button/CloseButton.svelte.d.ts +16 -18
- package/dist/data-interactive/DataInteractive.svelte.d.ts +8 -11
- package/dist/description/Description.svelte +19 -14
- package/dist/description/Description.svelte.d.ts +9 -11
- package/dist/description/context.svelte.js +14 -16
- package/dist/dialog/Dialog.svelte +245 -17
- package/dist/dialog/Dialog.svelte.d.ts +12 -14
- package/dist/dialog/DialogBackdrop.svelte +1 -1
- package/dist/dialog/DialogBackdrop.svelte.d.ts +9 -11
- package/dist/dialog/DialogPanel.svelte +1 -2
- package/dist/dialog/DialogPanel.svelte.d.ts +9 -11
- package/dist/dialog/DialogTitle.svelte.d.ts +8 -10
- package/dist/dialog/context.svelte.js +1 -1
- package/dist/field/Field.svelte +24 -12
- package/dist/field/Field.svelte.d.ts +9 -11
- package/dist/fieldset/Fieldset.svelte +1 -1
- package/dist/fieldset/Fieldset.svelte.d.ts +9 -11
- package/dist/focus-trap/FocusTrap.svelte +7 -14
- package/dist/focus-trap/FocusTrap.svelte.d.ts +11 -25
- package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
- package/dist/focus-trap/FocusTrapFeatures.js +15 -0
- package/dist/hooks/use-controllable.svelte.js +2 -1
- package/dist/hooks/use-did-element-move.svelte.js +5 -10
- package/dist/hooks/use-disabled.d.ts +6 -1
- package/dist/hooks/use-disabled.js +10 -5
- package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
- package/dist/hooks/use-event-listener.svelte.js +3 -1
- package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
- package/dist/hooks/use-root-containers.svelte.js +5 -5
- package/dist/hooks/use-tab-direction.svelte.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/input/Input.svelte +3 -3
- package/dist/input/Input.svelte.d.ts +10 -14
- package/dist/internal/FloatingProvider.svelte +12 -0
- package/dist/internal/FloatingProvider.svelte.d.ts +6 -0
- package/dist/internal/FocusSentinel.svelte.d.ts +2 -18
- package/dist/internal/ForcePortalRoot.svelte.d.ts +2 -18
- package/dist/internal/FormFields.svelte +22 -19
- package/dist/internal/FormFields.svelte.d.ts +2 -18
- package/dist/internal/FormFieldsProvider.svelte +13 -0
- package/dist/internal/FormFieldsProvider.svelte.d.ts +5 -0
- package/dist/internal/FormResolver.svelte.d.ts +2 -18
- package/dist/internal/Hidden.svelte +18 -8
- package/dist/internal/Hidden.svelte.d.ts +11 -16
- package/dist/internal/HiddenFeatures.d.ts +5 -0
- package/dist/internal/HiddenFeatures.js +9 -0
- package/dist/internal/MainTreeProvider.svelte.d.ts +2 -18
- package/dist/internal/Portal.svelte.d.ts +2 -18
- 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 +46 -22
- package/dist/internal/floating.svelte.js +90 -272
- package/dist/internal/form-fields.svelte.d.ts +10 -0
- package/dist/internal/form-fields.svelte.js +23 -0
- package/dist/label/Label.svelte +6 -5
- package/dist/label/Label.svelte.d.ts +9 -11
- package/dist/label/context.svelte.js +1 -1
- package/dist/legend/Legend.svelte +2 -2
- package/dist/legend/Legend.svelte.d.ts +4 -32
- package/dist/listbox/Listbox.svelte +47 -68
- package/dist/listbox/Listbox.svelte.d.ts +18 -80
- package/dist/listbox/ListboxButton.svelte +10 -10
- package/dist/listbox/ListboxButton.svelte.d.ts +10 -15
- package/dist/listbox/ListboxOption.svelte +10 -6
- package/dist/listbox/ListboxOption.svelte.d.ts +9 -12
- package/dist/listbox/ListboxOptions.svelte +108 -54
- package/dist/listbox/ListboxOptions.svelte.d.ts +9 -12
- package/dist/listbox/ListboxSelectedOption.svelte +2 -4
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -16
- package/dist/listbox/context.svelte.d.ts +76 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/listbox/index.d.ts +4 -4
- package/dist/listbox/index.js +1 -1
- package/dist/menu/Menu.svelte +13 -191
- package/dist/menu/Menu.svelte.d.ts +9 -13
- package/dist/menu/MenuButton.svelte +4 -2
- package/dist/menu/MenuButton.svelte.d.ts +9 -12
- package/dist/menu/MenuHeading.svelte.d.ts +9 -12
- package/dist/menu/MenuItem.svelte.d.ts +11 -16
- package/dist/menu/MenuItems.svelte +15 -11
- package/dist/menu/MenuItems.svelte.d.ts +9 -12
- package/dist/menu/MenuSection.svelte.d.ts +8 -11
- package/dist/menu/MenuSeparator.svelte.d.ts +8 -12
- package/dist/menu/context.svelte.d.ts +2 -1
- package/dist/menu/context.svelte.js +212 -2
- package/dist/menu/index.d.ts +7 -7
- package/dist/popover/Popover.svelte +161 -0
- package/dist/popover/Popover.svelte.d.ts +39 -0
- package/dist/popover/PopoverBackdrop.svelte +56 -0
- package/dist/popover/PopoverBackdrop.svelte.d.ts +43 -0
- package/dist/popover/PopoverButton.svelte +246 -0
- package/dist/popover/PopoverButton.svelte.d.ts +42 -0
- package/dist/popover/PopoverGroup.svelte +43 -0
- package/dist/popover/PopoverGroup.svelte.d.ts +31 -0
- package/dist/popover/PopoverPanel.svelte +274 -0
- package/dist/popover/PopoverPanel.svelte.d.ts +51 -0
- package/dist/popover/context.svelte.d.ts +51 -0
- package/dist/popover/context.svelte.js +108 -0
- package/dist/popover/index.d.ts +5 -0
- package/dist/popover/index.js +5 -0
- package/dist/portal/InternalPortal.svelte.d.ts +9 -11
- package/dist/portal/Portal.svelte.d.ts +2 -6
- package/dist/portal/PortalGroup.svelte.d.ts +9 -11
- package/dist/select/Select.svelte +74 -0
- package/dist/select/Select.svelte.d.ts +46 -0
- package/dist/select/index.d.ts +1 -0
- package/dist/select/index.js +1 -0
- package/dist/switch/Switch.svelte +30 -20
- package/dist/switch/Switch.svelte.d.ts +10 -12
- package/dist/switch/SwitchGroup.svelte.d.ts +8 -10
- package/dist/tabs/Tab.svelte +8 -9
- package/dist/tabs/Tab.svelte.d.ts +9 -11
- package/dist/tabs/TabGroup.svelte +27 -190
- package/dist/tabs/TabGroup.svelte.d.ts +9 -31
- package/dist/tabs/TabList.svelte +4 -4
- package/dist/tabs/TabList.svelte.d.ts +8 -10
- package/dist/tabs/TabPanel.svelte +4 -5
- package/dist/tabs/TabPanel.svelte.d.ts +9 -11
- package/dist/tabs/TabPanels.svelte +3 -3
- package/dist/tabs/TabPanels.svelte.d.ts +8 -10
- package/dist/tabs/context.svelte.d.ts +31 -0
- package/dist/tabs/context.svelte.js +134 -0
- package/dist/textarea/Textarea.svelte +4 -4
- package/dist/textarea/Textarea.svelte.d.ts +21 -20
- package/dist/transition/InternalTransitionChild.svelte.d.ts +9 -11
- package/dist/transition/Transition.svelte.d.ts +9 -11
- package/dist/transition/TransitionChild.svelte.d.ts +9 -11
- package/dist/transition/context.svelte.js +2 -2
- package/dist/utils/DisabledProvider.svelte +6 -0
- package/dist/utils/DisabledProvider.svelte.d.ts +6 -0
- package/dist/utils/ElementOrComponent.svelte +2 -2
- package/dist/utils/ElementOrComponent.svelte.d.ts +12 -11
- package/dist/utils/Generic.svelte +10 -8
- package/dist/utils/Generic.svelte.d.ts +12 -15
- package/dist/utils/StableCollection.svelte.d.ts +2 -18
- package/dist/utils/alternative-types.d.ts +1 -2
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +7 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +25 -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 +182 -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/id.d.ts +1 -1
- package/dist/utils/id.js +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +9 -13
- package/package.json +27 -26
- package/dist/dialog/InternalDialog.svelte +0 -233
- package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
- package/dist/internal/HoistFormFields.svelte +0 -11
- package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
<script lang="ts" module>import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
2
|
+
import { HiddenFeatures } from "./HiddenFeatures.js";
|
|
3
|
+
export * from "./HiddenFeatures.js";
|
|
2
4
|
const DEFAULT_VISUALLY_HIDDEN_TAG = "span";
|
|
3
|
-
export var HiddenFeatures = /* @__PURE__ */ ((HiddenFeatures2) => {
|
|
4
|
-
HiddenFeatures2[HiddenFeatures2["None"] = 1] = "None";
|
|
5
|
-
HiddenFeatures2[HiddenFeatures2["Focusable"] = 2] = "Focusable";
|
|
6
|
-
HiddenFeatures2[HiddenFeatures2["Hidden"] = 4] = "Hidden";
|
|
7
|
-
return HiddenFeatures2;
|
|
8
|
-
})(HiddenFeatures || {});
|
|
9
5
|
</script>
|
|
10
6
|
|
|
11
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_TAG">let {
|
|
7
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_TAG">let {
|
|
8
|
+
ref = $bindable(),
|
|
9
|
+
value,
|
|
10
|
+
checked,
|
|
11
|
+
features = HiddenFeatures.None,
|
|
12
|
+
...theirProps
|
|
13
|
+
} = $props();
|
|
12
14
|
let ourProps = {
|
|
13
15
|
"aria-hidden": (features & HiddenFeatures.Focusable) === HiddenFeatures.Focusable ? true : theirProps["aria-hidden"] ?? void 0,
|
|
14
16
|
hidden: (features & HiddenFeatures.Hidden) === HiddenFeatures.Hidden ? true : void 0,
|
|
@@ -29,4 +31,12 @@ let ourProps = {
|
|
|
29
31
|
};
|
|
30
32
|
</script>
|
|
31
33
|
|
|
32
|
-
<ElementOrComponent
|
|
34
|
+
<ElementOrComponent
|
|
35
|
+
{ourProps}
|
|
36
|
+
{theirProps}
|
|
37
|
+
defaultTag={DEFAULT_VISUALLY_HIDDEN_TAG}
|
|
38
|
+
name="Hidden"
|
|
39
|
+
bind:ref
|
|
40
|
+
{value}
|
|
41
|
+
{checked}
|
|
42
|
+
/>
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import type { ElementType, Props } from "../utils/types.js";
|
|
2
|
+
import { HiddenFeatures } from "./HiddenFeatures.js";
|
|
3
|
+
export * from "./HiddenFeatures.js";
|
|
2
4
|
declare const DEFAULT_VISUALLY_HIDDEN_TAG: "span";
|
|
3
|
-
export declare enum HiddenFeatures {
|
|
4
|
-
None = 1,
|
|
5
|
-
Focusable = 2,
|
|
6
|
-
Hidden = 4
|
|
7
|
-
}
|
|
8
5
|
type HiddenRenderPropArg = {};
|
|
9
6
|
type HiddenPropsWeControl = never;
|
|
10
7
|
export type HiddenProps<TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_TAG> = Props<TTag, HiddenRenderPropArg, HiddenPropsWeControl, {
|
|
@@ -13,17 +10,17 @@ export type HiddenProps<TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDE
|
|
|
13
10
|
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_TAG> {
|
|
14
11
|
props(): {
|
|
15
12
|
as?: TTag | undefined;
|
|
16
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "
|
|
17
|
-
children?: import("
|
|
13
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "features"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
14
|
+
children?: import("svelte").Snippet<[{
|
|
15
|
+
slot: HiddenRenderPropArg;
|
|
16
|
+
props: Record<string, any>;
|
|
17
|
+
}]> | undefined;
|
|
18
|
+
class?: string | ((bag: HiddenRenderPropArg) => string) | null | undefined;
|
|
18
19
|
ref?: HTMLElement;
|
|
19
|
-
} &
|
|
20
|
-
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: HiddenRenderPropArg) => string) | undefined;
|
|
21
|
-
} : {}) & {
|
|
20
|
+
} & {
|
|
22
21
|
features?: HiddenFeatures;
|
|
23
22
|
};
|
|
24
|
-
events(): {}
|
|
25
|
-
[evt: string]: CustomEvent<any>;
|
|
26
|
-
};
|
|
23
|
+
events(): {};
|
|
27
24
|
slots(): {};
|
|
28
25
|
bindings(): "ref";
|
|
29
26
|
exports(): {};
|
|
@@ -32,9 +29,7 @@ interface $$IsomorphicComponent {
|
|
|
32
29
|
new <TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_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
30
|
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
34
31
|
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
35
|
-
<TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
36
|
-
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
37
|
-
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
32
|
+
<TTag extends ElementType = typeof DEFAULT_VISUALLY_HIDDEN_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
38
33
|
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
39
34
|
}
|
|
40
35
|
declare const Hidden: $$IsomorphicComponent;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export var HiddenFeatures;
|
|
2
|
+
(function (HiddenFeatures) {
|
|
3
|
+
// The default, no features.
|
|
4
|
+
HiddenFeatures[HiddenFeatures["None"] = 1] = "None";
|
|
5
|
+
// Whether the element should be focusable or not.
|
|
6
|
+
HiddenFeatures[HiddenFeatures["Focusable"] = 2] = "Focusable";
|
|
7
|
+
// Whether it should be completely hidden, even to assistive technologies.
|
|
8
|
+
HiddenFeatures[HiddenFeatures["Hidden"] = 4] = "Hidden";
|
|
9
|
+
})(HiddenFeatures || (HiddenFeatures = {}));
|
|
@@ -8,24 +8,8 @@ export declare function useMainTreeNode(options?: {
|
|
|
8
8
|
fallbackMainTreeNode?: HTMLElement | null;
|
|
9
9
|
}): MainTreeContext;
|
|
10
10
|
import { type Snippet } from "svelte";
|
|
11
|
-
|
|
12
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
13
|
-
$$bindings?: Bindings;
|
|
14
|
-
} & Exports;
|
|
15
|
-
(internal: unknown, props: Props & {
|
|
16
|
-
$$events?: Events;
|
|
17
|
-
$$slots?: Slots;
|
|
18
|
-
}): Exports & {
|
|
19
|
-
$set?: any;
|
|
20
|
-
$on?: any;
|
|
21
|
-
};
|
|
22
|
-
z_$$bindings?: Bindings;
|
|
23
|
-
}
|
|
24
|
-
declare const MainTreeProvider: $$__sveltets_2_IsomorphicComponent<{
|
|
11
|
+
declare const MainTreeProvider: import("svelte").Component<{
|
|
25
12
|
children: Snippet;
|
|
26
13
|
node?: HTMLElement | null;
|
|
27
|
-
}, {
|
|
28
|
-
[evt: string]: CustomEvent<any>;
|
|
29
|
-
}, {}, {}, "">;
|
|
30
|
-
type MainTreeProvider = InstanceType<typeof MainTreeProvider>;
|
|
14
|
+
}, {}, "">;
|
|
31
15
|
export default MainTreeProvider;
|
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
import { type Snippet } from "svelte";
|
|
2
|
-
|
|
3
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
4
|
-
$$bindings?: Bindings;
|
|
5
|
-
} & Exports;
|
|
6
|
-
(internal: unknown, props: Props & {
|
|
7
|
-
$$events?: Events;
|
|
8
|
-
$$slots?: Slots;
|
|
9
|
-
}): Exports & {
|
|
10
|
-
$set?: any;
|
|
11
|
-
$on?: any;
|
|
12
|
-
};
|
|
13
|
-
z_$$bindings?: Bindings;
|
|
14
|
-
}
|
|
15
|
-
declare const Portal: $$__sveltets_2_IsomorphicComponent<{
|
|
2
|
+
declare const Portal: import("svelte").Component<{
|
|
16
3
|
target: HTMLElement;
|
|
17
4
|
children: Snippet;
|
|
18
|
-
}, {
|
|
19
|
-
[evt: string]: CustomEvent<any>;
|
|
20
|
-
}, {}, {}, "">;
|
|
21
|
-
type Portal = InstanceType<typeof Portal>;
|
|
5
|
+
}, {}, "">;
|
|
22
6
|
export default Portal;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { setContext } from "svelte";
|
|
2
|
+
import { useFixScrollingPixel, useResolvedConfig, } from "./floating.svelte.js";
|
|
3
|
+
import { autoUpdate, flip as flipMiddleware, inner as innerMiddleware, offset as offsetMiddleware, shift as shiftMiddleware, size as sizeMiddleware, useFloating, useInnerOffset, useInteractions, } from "../utils/floating-ui/svelte/index.js";
|
|
4
|
+
export const useFloatingProvider = (options = { enabled: true }) => {
|
|
5
|
+
const { enabled } = $derived(options);
|
|
6
|
+
// TODO: Make this a config part of the `config`. Just need to decide on a name.
|
|
7
|
+
const MINIMUM_ITEMS_VISIBLE = 4;
|
|
8
|
+
let config = $state(null);
|
|
9
|
+
let innerOffset = $state(0);
|
|
10
|
+
const setInnerOffset = (offset) => (innerOffset = typeof offset === "function" ? offset(innerOffset) : offset);
|
|
11
|
+
const overflowRef = $state({ current: null });
|
|
12
|
+
let floatingEl = $state(null);
|
|
13
|
+
const setFloatingElement = (element) => (floatingEl = element ?? null);
|
|
14
|
+
useFixScrollingPixel({
|
|
15
|
+
get element() {
|
|
16
|
+
return floatingEl;
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const isEnabled = $derived(enabled && config !== null && floatingEl !== null);
|
|
20
|
+
const resolvedConfig = useResolvedConfig({
|
|
21
|
+
get config() {
|
|
22
|
+
return config;
|
|
23
|
+
},
|
|
24
|
+
get element() {
|
|
25
|
+
return floatingEl;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
const { to: placement = "bottom", gap = 0, offset = 0, padding = 0, inner } = $derived(resolvedConfig);
|
|
29
|
+
const [to, align = "center"] = $derived(placement.split(" "));
|
|
30
|
+
// Reset
|
|
31
|
+
$effect(() => {
|
|
32
|
+
if (!isEnabled)
|
|
33
|
+
return;
|
|
34
|
+
innerOffset = 0;
|
|
35
|
+
});
|
|
36
|
+
const middleware = $derived([
|
|
37
|
+
// - The `mainAxis` is set to `gap` which defines the gap between the panel and the
|
|
38
|
+
// trigger/reference.
|
|
39
|
+
// - The `crossAxis` is set to `offset` which nudges the panel from its original position.
|
|
40
|
+
//
|
|
41
|
+
// When we are showing the panel on top of the selected item, we don't want a gap between the
|
|
42
|
+
// reference and the panel, therefore setting the `mainAxis` to `0`.
|
|
43
|
+
offsetMiddleware({
|
|
44
|
+
mainAxis: to === "selection" ? 0 : gap,
|
|
45
|
+
crossAxis: offset,
|
|
46
|
+
}),
|
|
47
|
+
// When the panel overflows the viewport, we will try to nudge the panel to the other side to
|
|
48
|
+
// ensure it's not clipped. We use the `padding` to define the minimum space between the
|
|
49
|
+
// panel and the viewport.
|
|
50
|
+
shiftMiddleware({ padding }),
|
|
51
|
+
// The `flip` middleware will swap the `placement` of the panel if there is not enough room.
|
|
52
|
+
// This is not compatible with the `inner` middleware (which is only enabled when `to` is set
|
|
53
|
+
// to "selection").
|
|
54
|
+
to !== "selection" && flipMiddleware({ padding }),
|
|
55
|
+
// The `inner` middleware will ensure the panel is always fully visible on screen and
|
|
56
|
+
// positioned on top of the reference and moved to the currently selected item.
|
|
57
|
+
to === "selection" && inner
|
|
58
|
+
? innerMiddleware({
|
|
59
|
+
...inner,
|
|
60
|
+
padding, // For overflow detection
|
|
61
|
+
overflowRef,
|
|
62
|
+
offset: innerOffset,
|
|
63
|
+
minItemsVisible: MINIMUM_ITEMS_VISIBLE,
|
|
64
|
+
referenceOverflowThreshold: padding,
|
|
65
|
+
onFallbackChange(fallback) {
|
|
66
|
+
if (!fallback)
|
|
67
|
+
return;
|
|
68
|
+
const parent = context.elements.floating;
|
|
69
|
+
if (!parent)
|
|
70
|
+
return;
|
|
71
|
+
const scrollPaddingBottom = parseFloat(getComputedStyle(parent).scrollPaddingBottom) || 0;
|
|
72
|
+
// We want at least X visible items, but if there are less than X items in the list,
|
|
73
|
+
// we want to show as many as possible.
|
|
74
|
+
let missing = Math.min(MINIMUM_ITEMS_VISIBLE, parent.childElementCount);
|
|
75
|
+
let elementHeight = 0;
|
|
76
|
+
let elementAmountVisible = 0;
|
|
77
|
+
for (const child of context.elements.floating?.childNodes ?? []) {
|
|
78
|
+
if (child instanceof HTMLElement) {
|
|
79
|
+
const childTop = child.offsetTop;
|
|
80
|
+
// It can be that the child is fully visible, but we also want to keep the scroll
|
|
81
|
+
// padding into account to ensure the UI looks good. Therefore we fake that the
|
|
82
|
+
// bottom of the child is actually `scrollPaddingBottom` amount of pixels lower.
|
|
83
|
+
const childBottom = childTop + child.clientHeight + scrollPaddingBottom;
|
|
84
|
+
const parentTop = parent.scrollTop;
|
|
85
|
+
const parentBottom = parentTop + parent.clientHeight;
|
|
86
|
+
// Figure out if the child is fully visible in the scroll parent.
|
|
87
|
+
if (childTop >= parentTop && childBottom <= parentBottom) {
|
|
88
|
+
missing--;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Not fully visible, so we will use this child to calculate the height of
|
|
92
|
+
// each item. We will also use this to calculate how much of the item is
|
|
93
|
+
// already visible.
|
|
94
|
+
elementAmountVisible = Math.max(0, Math.min(childBottom, parentBottom) - Math.max(childTop, parentTop));
|
|
95
|
+
elementHeight = child.clientHeight;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// There are fewer visible items than we want, so we will try to nudge the offset
|
|
101
|
+
// to show more items.
|
|
102
|
+
if (missing >= 1) {
|
|
103
|
+
setInnerOffset((existingOffset) => {
|
|
104
|
+
const newInnerOffset = elementHeight * missing - // `missing` amount of `elementHeight`
|
|
105
|
+
elementAmountVisible + // The amount of the last item that is visible
|
|
106
|
+
scrollPaddingBottom; // The scroll padding to ensure the UI looks good
|
|
107
|
+
// Nudged enough already, no need to continue
|
|
108
|
+
if (existingOffset >= newInnerOffset) {
|
|
109
|
+
return existingOffset;
|
|
110
|
+
}
|
|
111
|
+
return newInnerOffset;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
})
|
|
116
|
+
: null,
|
|
117
|
+
// The `size` middleware will ensure the panel is never bigger than the viewport minus the
|
|
118
|
+
// provided `padding` that we want.
|
|
119
|
+
sizeMiddleware({
|
|
120
|
+
padding,
|
|
121
|
+
apply({ availableWidth, availableHeight, elements }) {
|
|
122
|
+
Object.assign(elements.floating.style, {
|
|
123
|
+
overflow: "auto",
|
|
124
|
+
maxWidth: `${availableWidth}px`,
|
|
125
|
+
maxHeight: `min(var(--anchor-max-height, 100vh), ${availableHeight}px)`,
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
}),
|
|
129
|
+
].filter(Boolean));
|
|
130
|
+
const floating = useFloating({
|
|
131
|
+
get open() {
|
|
132
|
+
return isEnabled;
|
|
133
|
+
},
|
|
134
|
+
get placement() {
|
|
135
|
+
return (to === "selection"
|
|
136
|
+
? align === "center"
|
|
137
|
+
? "bottom"
|
|
138
|
+
: `bottom-${align}`
|
|
139
|
+
: align === "center"
|
|
140
|
+
? `${to}`
|
|
141
|
+
: `${to}-${align}`);
|
|
142
|
+
},
|
|
143
|
+
// This component will be used in combination with a `Portal`, which means the floating
|
|
144
|
+
// element will be rendered outside of the current DOM tree.
|
|
145
|
+
strategy: "absolute",
|
|
146
|
+
// We use the panel in a `Dialog` which is making the page inert, therefore no re-positioning is
|
|
147
|
+
// needed when scrolling changes.
|
|
148
|
+
transform: false,
|
|
149
|
+
get middleware() {
|
|
150
|
+
return middleware;
|
|
151
|
+
},
|
|
152
|
+
whileElementsMounted: autoUpdate,
|
|
153
|
+
});
|
|
154
|
+
const { refs, floatingStyles, context } = $derived(floating);
|
|
155
|
+
// Calculate placement information to expose as data attributes
|
|
156
|
+
const { exposedTo, exposedAlign } = $derived.by(() => {
|
|
157
|
+
const [exposedTo = to, exposedAlign = align] = context.placement.split("-");
|
|
158
|
+
return { exposedTo: to === "selection" ? "selection" : exposedTo, exposedAlign };
|
|
159
|
+
});
|
|
160
|
+
// If user-land code is using custom styles specifically for `bottom`, but
|
|
161
|
+
// they chose `selection`, then we want to make sure to map it to selection
|
|
162
|
+
// again otherwise styles could be wrong.
|
|
163
|
+
//if (to === "selection") exposedTo = "selection"
|
|
164
|
+
const data = $derived({
|
|
165
|
+
anchor: [exposedTo, exposedAlign].filter(Boolean).join(" "),
|
|
166
|
+
});
|
|
167
|
+
const innerOffsetConfig = useInnerOffset({
|
|
168
|
+
get context() {
|
|
169
|
+
return context;
|
|
170
|
+
},
|
|
171
|
+
get props() {
|
|
172
|
+
return {
|
|
173
|
+
overflowRef,
|
|
174
|
+
onChange: setInnerOffset,
|
|
175
|
+
};
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const { getReferenceProps, getFloatingProps } = useInteractions({
|
|
179
|
+
get propsList() {
|
|
180
|
+
return [innerOffsetConfig];
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
const setFloatingRef = (el) => {
|
|
184
|
+
setFloatingElement(el);
|
|
185
|
+
refs.setFloating(el);
|
|
186
|
+
};
|
|
187
|
+
setContext("PlacementContext", {
|
|
188
|
+
updatePlacementConfig: (value) => {
|
|
189
|
+
config = value;
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
setContext("FloatingContext", {
|
|
193
|
+
setFloating: setFloatingRef,
|
|
194
|
+
get setReference() {
|
|
195
|
+
return refs.setReference;
|
|
196
|
+
},
|
|
197
|
+
get styles() {
|
|
198
|
+
return floatingStyles;
|
|
199
|
+
},
|
|
200
|
+
getReferenceProps,
|
|
201
|
+
getFloatingProps,
|
|
202
|
+
get slot() {
|
|
203
|
+
return data;
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type
|
|
2
|
-
type Align = "start" | "end";
|
|
3
|
-
type Placement = "top" | "right" | "bottom" | "left";
|
|
4
|
-
type BaseAnchorProps = {
|
|
1
|
+
import { useInteractions, type InnerProps, type UseFloatingReturn } from "../utils/floating-ui/svelte/index.js";
|
|
2
|
+
export type Align = "start" | "end";
|
|
3
|
+
export type Placement = "top" | "right" | "bottom" | "left";
|
|
4
|
+
export type BaseAnchorProps = {
|
|
5
5
|
/**
|
|
6
6
|
* The `gap` is the space between the trigger and the panel.
|
|
7
7
|
*/
|
|
@@ -31,32 +31,56 @@ export type AnchorPropsWithSelection = false | (`${Placement | "selection"}` | `
|
|
|
31
31
|
}>;
|
|
32
32
|
export type InternalFloatingPanelProps = Partial<{
|
|
33
33
|
inner: {
|
|
34
|
-
listRef:
|
|
35
|
-
index:
|
|
34
|
+
listRef: InnerProps["listRef"];
|
|
35
|
+
index: InnerProps["index"];
|
|
36
36
|
};
|
|
37
37
|
}>;
|
|
38
|
-
type FloatingContext = {
|
|
39
|
-
styles?:
|
|
40
|
-
setReference:
|
|
41
|
-
setFloating:
|
|
42
|
-
getReferenceProps:
|
|
43
|
-
getFloatingProps:
|
|
38
|
+
export type FloatingContext = {
|
|
39
|
+
styles?: UseFloatingReturn["floatingStyles"];
|
|
40
|
+
setReference: UseFloatingReturn["refs"]["setReference"];
|
|
41
|
+
setFloating: UseFloatingReturn["refs"]["setFloating"];
|
|
42
|
+
getReferenceProps: ReturnType<typeof useInteractions>["getReferenceProps"];
|
|
43
|
+
getFloatingProps: ReturnType<typeof useInteractions>["getFloatingProps"];
|
|
44
44
|
slot: Partial<{
|
|
45
45
|
anchor: `${Placement | "selection"}` | `${Placement | "selection"} ${Align}`;
|
|
46
46
|
}>;
|
|
47
47
|
};
|
|
48
|
-
export
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
export type PlacementContext = {
|
|
49
|
+
updatePlacementConfig: ((value: Exclude<AnchorPropsWithSelection, boolean> | null) => void) | null;
|
|
50
|
+
};
|
|
51
|
+
export declare function useResolvedAnchor<T extends AnchorProps | AnchorPropsWithSelection>(options: {
|
|
52
|
+
anchor?: T;
|
|
53
|
+
}): {
|
|
54
|
+
anchor: Exclude<T, boolean | string> | null;
|
|
55
|
+
};
|
|
56
|
+
export declare function useFloatingReference(): {
|
|
57
|
+
readonly setReference: ((node: import("../utils/floating-ui/svelte-dom/types.js").ReferenceType | null | undefined) => void) & ((node: import("../utils/floating-ui/svelte/types.js").ReferenceType | null | undefined) => void);
|
|
58
|
+
};
|
|
59
|
+
export declare function useFloatingReferenceProps(): {
|
|
60
|
+
readonly getReferenceProps: (userProps?: import("svelte/elements.js").HTMLAttributes<Element>) => Record<string, unknown>;
|
|
61
|
+
};
|
|
62
|
+
export declare function useFloatingPanelProps(): (userProps?: import("svelte/elements.js").HTMLAttributes<HTMLElement> | undefined) => Record<string, unknown> & {
|
|
51
63
|
"data-anchor": Placement | "top end" | "top start" | "right end" | "right start" | "bottom end" | "bottom start" | "left end" | "left start" | "selection" | "selection end" | "selection start" | undefined;
|
|
52
64
|
};
|
|
53
|
-
export declare function useFloatingPanel(options
|
|
65
|
+
export declare function useFloatingPanel(options?: {
|
|
54
66
|
placement: (AnchorPropsWithSelection & InternalFloatingPanelProps) | null;
|
|
55
67
|
}): {
|
|
56
|
-
readonly setFloating: (
|
|
57
|
-
readonly
|
|
68
|
+
readonly setFloating: ((node: HTMLElement | null | undefined) => void) & ((node: HTMLElement | null | undefined) => void);
|
|
69
|
+
readonly styles: string | undefined;
|
|
70
|
+
};
|
|
71
|
+
export declare function useFixScrollingPixel(options: {
|
|
72
|
+
element: HTMLElement | null;
|
|
73
|
+
}): void;
|
|
74
|
+
export declare function useResolvedConfig(options: {
|
|
75
|
+
config: (Exclude<AnchorPropsWithSelection, boolean | string> & InternalFloatingPanelProps) | null;
|
|
76
|
+
element?: HTMLElement | null;
|
|
77
|
+
}): {
|
|
78
|
+
readonly to: Placement | "top end" | "top start" | "right end" | "right start" | "bottom end" | "bottom start" | "left end" | "left start" | "selection" | "selection end" | "selection start" | undefined;
|
|
79
|
+
readonly gap: number | undefined;
|
|
80
|
+
readonly offset: number | undefined;
|
|
81
|
+
readonly padding: number | undefined;
|
|
82
|
+
readonly inner: {
|
|
83
|
+
listRef: InnerProps["listRef"];
|
|
84
|
+
index: InnerProps["index"];
|
|
85
|
+
} | undefined;
|
|
58
86
|
};
|
|
59
|
-
export declare const createFloatingContext: ({ enabled }?: {
|
|
60
|
-
enabled?: boolean;
|
|
61
|
-
}) => FloatingContext;
|
|
62
|
-
export {};
|