@pzerelles/headlessui-svelte 2.1.1-next.1 → 2.1.2-next.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/button/Button.svelte +6 -10
- package/dist/button/Button.svelte.d.ts +34 -26
- package/dist/checkbox/Checkbox.svelte +40 -22
- package/dist/checkbox/Checkbox.svelte.d.ts +44 -28
- package/dist/close-button/CloseButton.svelte +5 -4
- package/dist/close-button/CloseButton.svelte.d.ts +36 -13
- package/dist/combobox/Combobox.svelte +2 -2
- package/dist/combobox/Combobox.svelte.d.ts +9 -9
- package/dist/data-interactive/DataInteractive.svelte +41 -0
- package/dist/data-interactive/DataInteractive.svelte.d.ts +39 -0
- package/dist/data-interactive/index.d.ts +1 -0
- package/dist/data-interactive/index.js +1 -0
- package/dist/description/Description.svelte +10 -53
- package/dist/description/Description.svelte.d.ts +15 -32
- package/dist/description/context.svelte.d.ts +17 -0
- package/dist/description/context.svelte.js +51 -0
- package/dist/dialog/Dialog.svelte +51 -0
- package/dist/dialog/Dialog.svelte.d.ts +60 -0
- package/dist/dialog/DialogBackdrop.svelte +39 -0
- package/dist/dialog/DialogBackdrop.svelte.d.ts +38 -0
- package/dist/dialog/DialogPanel.svelte +46 -0
- package/dist/dialog/DialogPanel.svelte.d.ts +40 -0
- package/dist/dialog/DialogTitle.svelte +29 -0
- package/dist/dialog/DialogTitle.svelte.d.ts +34 -0
- package/dist/dialog/InternalDialog.svelte +233 -0
- package/dist/dialog/InternalDialog.svelte.d.ts +42 -0
- package/dist/dialog/context.svelte.d.ts +15 -0
- package/dist/dialog/context.svelte.js +16 -0
- package/dist/dialog/index.d.ts +4 -0
- package/dist/dialog/index.js +4 -0
- package/dist/field/Field.svelte +8 -10
- package/dist/field/Field.svelte.d.ts +21 -17
- package/dist/fieldset/Fieldset.svelte +11 -9
- package/dist/fieldset/Fieldset.svelte.d.ts +21 -17
- package/dist/focus-trap/FocusTrap.svelte +332 -0
- package/dist/focus-trap/FocusTrap.svelte.d.ts +58 -0
- package/dist/hooks/use-controllable.svelte.d.ts +1 -1
- package/dist/hooks/use-controllable.svelte.js +3 -3
- package/dist/hooks/use-escape.svelte.d.ts +5 -0
- package/dist/hooks/use-escape.svelte.js +26 -0
- package/dist/hooks/use-event-listener.svelte.d.ts +6 -0
- package/dist/hooks/use-event-listener.svelte.js +12 -0
- package/dist/hooks/use-inert-others.svelte.d.ts +2 -2
- package/dist/hooks/use-inert-others.svelte.js +3 -3
- package/dist/hooks/use-is-mounted.svelte.d.ts +3 -0
- package/dist/hooks/use-is-mounted.svelte.js +14 -0
- package/dist/hooks/use-is-touch-device.svelte.d.ts +3 -0
- package/dist/hooks/use-is-touch-device.svelte.js +20 -0
- package/dist/hooks/use-root-containers.svelte.d.ts +9 -0
- package/dist/hooks/use-root-containers.svelte.js +50 -0
- package/dist/hooks/use-tab-direction.svelte.d.ts +7 -0
- package/dist/hooks/use-tab-direction.svelte.js +25 -0
- package/dist/hooks/use-transition.svelte.js +14 -13
- package/dist/hooks/use-tree-walker.svelte.d.ts +8 -0
- package/dist/hooks/use-tree-walker.svelte.js +19 -0
- package/dist/hooks/use-watch.svelte.d.ts +4 -0
- package/dist/hooks/use-watch.svelte.js +16 -0
- package/dist/hooks/use-window-event.svelte.d.ts +6 -0
- package/dist/hooks/use-window-event.svelte.js +12 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/input/Input.svelte +59 -0
- package/dist/input/Input.svelte.d.ts +52 -0
- package/dist/input/index.d.ts +1 -0
- package/dist/input/index.js +1 -0
- package/dist/internal/FocusSentinel.svelte.d.ts +4 -1
- package/dist/internal/ForcePortalRoot.svelte +6 -0
- package/dist/internal/ForcePortalRoot.svelte.d.ts +22 -0
- package/dist/internal/FormFields.svelte.d.ts +4 -1
- package/dist/internal/FormResolver.svelte.d.ts +4 -1
- package/dist/internal/Hidden.svelte +5 -9
- package/dist/internal/Hidden.svelte.d.ts +17 -10
- package/dist/internal/HoistFormFields.svelte.d.ts +4 -1
- package/dist/internal/MainTreeProvider.svelte +45 -0
- package/dist/internal/MainTreeProvider.svelte.d.ts +31 -0
- package/dist/internal/Portal.svelte.d.ts +4 -1
- package/dist/internal/close-provider.d.ts +7 -0
- package/dist/internal/close-provider.js +7 -0
- package/dist/internal/floating.svelte.d.ts +13 -8
- package/dist/internal/floating.svelte.js +197 -186
- package/dist/internal/id.d.ts +1 -1
- package/dist/internal/open-closed.d.ts +1 -1
- package/dist/internal/open-closed.js +1 -1
- package/dist/label/Label.svelte +12 -61
- package/dist/label/Label.svelte.d.ts +19 -32
- package/dist/label/context.svelte.d.ts +17 -0
- package/dist/label/context.svelte.js +56 -0
- package/dist/legend/Legend.svelte +4 -3
- package/dist/legend/Legend.svelte.d.ts +33 -15
- package/dist/listbox/Listbox.svelte +6 -9
- package/dist/listbox/Listbox.svelte.d.ts +29 -10
- package/dist/listbox/ListboxButton.svelte +6 -8
- package/dist/listbox/ListboxButton.svelte.d.ts +18 -7
- package/dist/listbox/ListboxOption.svelte +4 -6
- package/dist/listbox/ListboxOption.svelte.d.ts +22 -11
- package/dist/listbox/ListboxOptions.svelte +21 -19
- package/dist/listbox/ListboxOptions.svelte.d.ts +23 -7
- package/dist/listbox/ListboxSelectedOption.svelte +17 -7
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +23 -13
- package/dist/menu/Menu.svelte +235 -0
- package/dist/menu/Menu.svelte.d.ts +42 -0
- package/dist/menu/MenuButton.svelte +127 -0
- package/dist/menu/MenuButton.svelte.d.ts +52 -0
- package/dist/menu/MenuHeading.svelte +19 -0
- package/dist/menu/MenuHeading.svelte.d.ts +39 -0
- package/dist/menu/MenuItem.svelte +114 -0
- package/dist/menu/MenuItem.svelte.d.ts +49 -0
- package/dist/menu/MenuItems.svelte +244 -0
- package/dist/menu/MenuItems.svelte.d.ts +55 -0
- package/dist/menu/MenuSection.svelte +14 -0
- package/dist/menu/MenuSection.svelte.d.ts +35 -0
- package/dist/menu/MenuSeparator.svelte +9 -0
- package/dist/menu/MenuSeparator.svelte.d.ts +35 -0
- package/dist/menu/context.svelte.d.ts +47 -0
- package/dist/menu/context.svelte.js +21 -0
- package/dist/menu/index.d.ts +7 -0
- package/dist/menu/index.js +7 -0
- package/dist/portal/InternalPortal.svelte +22 -33
- package/dist/portal/InternalPortal.svelte.d.ts +16 -7
- package/dist/portal/Portal.svelte +4 -8
- package/dist/portal/Portal.svelte.d.ts +6 -6
- package/dist/portal/PortalGroup.svelte +5 -6
- package/dist/portal/PortalGroup.svelte.d.ts +16 -7
- package/dist/switch/Switch.svelte +11 -17
- package/dist/switch/Switch.svelte.d.ts +23 -6
- package/dist/switch/SwitchGroup.svelte +7 -8
- package/dist/switch/SwitchGroup.svelte.d.ts +14 -7
- package/dist/tabs/Tab.svelte +9 -14
- package/dist/tabs/Tab.svelte.d.ts +18 -6
- package/dist/tabs/TabGroup.svelte +20 -23
- package/dist/tabs/TabGroup.svelte.d.ts +19 -6
- package/dist/tabs/TabList.svelte +5 -7
- package/dist/tabs/TabList.svelte.d.ts +13 -6
- package/dist/tabs/TabPanel.svelte +30 -32
- package/dist/tabs/TabPanel.svelte.d.ts +19 -6
- package/dist/tabs/TabPanels.svelte +5 -6
- package/dist/tabs/TabPanels.svelte.d.ts +13 -6
- package/dist/textarea/Textarea.svelte +67 -0
- package/dist/textarea/Textarea.svelte.d.ts +47 -0
- package/dist/textarea/index.d.ts +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/transition/InternalTransitionChild.svelte +178 -0
- package/dist/transition/InternalTransitionChild.svelte.d.ts +55 -0
- package/dist/transition/Transition.svelte +89 -0
- package/dist/transition/Transition.svelte.d.ts +42 -0
- package/dist/transition/TransitionChild.svelte +16 -0
- package/dist/transition/TransitionChild.svelte.d.ts +44 -0
- package/dist/transition/context.svelte.d.ts +64 -0
- package/dist/transition/context.svelte.js +120 -0
- package/dist/transition/index.d.ts +2 -0
- package/dist/transition/index.js +2 -0
- package/dist/utils/ElementOrComponent.svelte +26 -0
- package/dist/utils/ElementOrComponent.svelte.d.ts +56 -0
- package/dist/utils/Generic.svelte +44 -0
- package/dist/utils/Generic.svelte.d.ts +35 -0
- package/dist/utils/StableCollection.svelte +1 -1
- package/dist/utils/StableCollection.svelte.d.ts +4 -1
- package/dist/utils/active-element-history.d.ts +1 -0
- package/dist/utils/active-element-history.js +35 -0
- package/dist/utils/alternative-types.d.ts +21 -0
- package/dist/utils/alternative-types.js +1 -0
- package/dist/utils/class-names.d.ts +1 -0
- package/dist/utils/class-names.js +10 -0
- package/dist/utils/focus-management.d.ts +2 -1
- package/dist/utils/focus-management.js +13 -13
- package/dist/utils/on-document-ready.d.ts +1 -0
- package/dist/utils/on-document-ready.js +12 -0
- package/dist/utils/render.d.ts +3 -0
- package/dist/utils/render.js +63 -0
- package/dist/utils/state.d.ts +7 -1
- package/dist/utils/state.js +10 -6
- package/dist/utils/types.d.ts +14 -17
- package/dist/utils/types.js +0 -5
- package/package.json +26 -25
- package/dist/tabs/Button.svelte +0 -65
- package/dist/tabs/Button.svelte.d.ts +0 -39
- package/dist/utils/close.d.ts +0 -2
- package/dist/utils/close.js +0 -3
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ElementType } from "./types.js";
|
|
2
|
+
import { RenderFeatures } from "./render.js";
|
|
3
|
+
declare class __sveltets_Render<TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue> {
|
|
4
|
+
props(): {
|
|
5
|
+
ourProps?: Expand<{
|
|
6
|
+
[x: string]: any;
|
|
7
|
+
[x: number]: any;
|
|
8
|
+
} & {
|
|
9
|
+
children?: import("./types.js").Children<TSlot> | undefined;
|
|
10
|
+
ref?: HTMLElement;
|
|
11
|
+
} & {
|
|
12
|
+
class?: any;
|
|
13
|
+
} & Expand<((TFeature extends RenderFeatures.Static ? {
|
|
14
|
+
static?: boolean;
|
|
15
|
+
} : {}) extends infer T ? T extends (TFeature extends RenderFeatures.Static ? {
|
|
16
|
+
static?: boolean;
|
|
17
|
+
} : {}) ? T extends any ? (x: T) => any : never : never : never) | ((TFeature extends RenderFeatures.RenderStrategy ? {
|
|
18
|
+
unmount?: boolean;
|
|
19
|
+
} : {}) extends infer T_1 ? T_1 extends (TFeature extends RenderFeatures.RenderStrategy ? {
|
|
20
|
+
unmount?: boolean;
|
|
21
|
+
} : {}) ? T_1 extends any ? (x: T_1) => any : never : never : never) extends (x: infer R) => any ? R : never>> | undefined;
|
|
22
|
+
theirProps: {
|
|
23
|
+
as?: TTag | undefined;
|
|
24
|
+
children?: import("./types.js").Children<TSlot> | undefined;
|
|
25
|
+
ref?: HTMLElement | undefined;
|
|
26
|
+
class?: any;
|
|
27
|
+
};
|
|
28
|
+
slot?: TSlot | undefined;
|
|
29
|
+
slots?: TSlot | undefined;
|
|
30
|
+
defaultTag: ElementType;
|
|
31
|
+
features?: TFeature | undefined;
|
|
32
|
+
visible?: boolean;
|
|
33
|
+
name: string;
|
|
34
|
+
ref?: HTMLElement;
|
|
35
|
+
value?: TValue | undefined;
|
|
36
|
+
checked?: boolean;
|
|
37
|
+
};
|
|
38
|
+
events(): {} & {
|
|
39
|
+
[evt: string]: CustomEvent<any>;
|
|
40
|
+
};
|
|
41
|
+
slots(): {};
|
|
42
|
+
bindings(): "ref" | "value" | "checked";
|
|
43
|
+
exports(): {};
|
|
44
|
+
}
|
|
45
|
+
interface $$IsomorphicComponent {
|
|
46
|
+
new <TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['props']>, ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['events']>, ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['slots']>> & {
|
|
47
|
+
$$bindings?: ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['bindings']>;
|
|
48
|
+
} & ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['exports']>;
|
|
49
|
+
<TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue>(internal: unknown, props: ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['props']> & {
|
|
50
|
+
$$events?: ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['events']>;
|
|
51
|
+
}): ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['exports']>;
|
|
52
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any, any, any, any>['bindings']>;
|
|
53
|
+
}
|
|
54
|
+
declare const ElementOrComponent: $$IsomorphicComponent;
|
|
55
|
+
type ElementOrComponent<TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue> = InstanceType<typeof ElementOrComponent<TFeature, TTag, TSlot, TValue>>;
|
|
56
|
+
export default ElementOrComponent;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts" generics="TTag extends keyof SvelteHTMLProps, TSlot, TValue">import { stateFromSlot } from "./state.js";
|
|
2
|
+
let {
|
|
3
|
+
slot = {},
|
|
4
|
+
tag,
|
|
5
|
+
name,
|
|
6
|
+
ref = $bindable(),
|
|
7
|
+
value = $bindable(),
|
|
8
|
+
checked = $bindable(),
|
|
9
|
+
children,
|
|
10
|
+
as = tag,
|
|
11
|
+
unmount,
|
|
12
|
+
static: isStatic,
|
|
13
|
+
...props
|
|
14
|
+
} = $props();
|
|
15
|
+
const resolvedClass = $derived(
|
|
16
|
+
typeof props.class === "function" ? props.class(slot) : props.class
|
|
17
|
+
);
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
{#if as === "svelte:fragment"}
|
|
21
|
+
{#if children}{@render children(slot, {
|
|
22
|
+
...props,
|
|
23
|
+
...(resolvedClass ? { class: resolvedClass } : {}),
|
|
24
|
+
...stateFromSlot(slot),
|
|
25
|
+
})}{/if}
|
|
26
|
+
{:else if children}
|
|
27
|
+
{#if as === "select"}
|
|
28
|
+
<select bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)} bind:value>
|
|
29
|
+
{@render children(slot, {})}
|
|
30
|
+
</select>
|
|
31
|
+
{:else}
|
|
32
|
+
<svelte:element this={as} bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)}>
|
|
33
|
+
{@render children(slot, {})}
|
|
34
|
+
</svelte:element>
|
|
35
|
+
{/if}
|
|
36
|
+
{:else if as === "input" && props.type === "checkbox"}
|
|
37
|
+
<input type="checkbox" bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)} bind:checked />
|
|
38
|
+
{:else if as === "input"}
|
|
39
|
+
<input bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)} bind:value />
|
|
40
|
+
{:else if as === "textarea"}
|
|
41
|
+
<textarea bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)} bind:value></textarea>
|
|
42
|
+
{:else}
|
|
43
|
+
<svelte:element this={as} bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)} />
|
|
44
|
+
{/if}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ElementType, SvelteHTMLProps } from "./types.js";
|
|
2
|
+
declare class __sveltets_Render<TTag extends keyof SvelteHTMLProps, TSlot, TValue> {
|
|
3
|
+
props(): {
|
|
4
|
+
as?: TTag | undefined;
|
|
5
|
+
slot: TSlot;
|
|
6
|
+
tag: ElementType;
|
|
7
|
+
name: string;
|
|
8
|
+
ref?: HTMLElement;
|
|
9
|
+
value?: TValue | undefined;
|
|
10
|
+
checked?: boolean;
|
|
11
|
+
} & (Exclude<keyof import("./types.js").PropsOf<TTag>, "as" | "children" | "refName" | "class"> extends infer T extends keyof import("./types.js").PropsOf<TTag> ? { [P in T]: import("./types.js").PropsOf<TTag>[P]; } : never) & {
|
|
12
|
+
children?: import("./types.js").Children<TSlot> | undefined;
|
|
13
|
+
ref?: HTMLElement;
|
|
14
|
+
} & (true extends (import("./types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("./types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
|
|
15
|
+
class?: import("./types.js").PropsOf<TTag>["class"] | ((bag: TSlot) => string) | undefined;
|
|
16
|
+
} : {});
|
|
17
|
+
events(): {} & {
|
|
18
|
+
[evt: string]: CustomEvent<any>;
|
|
19
|
+
};
|
|
20
|
+
slots(): {};
|
|
21
|
+
bindings(): "ref" | "value" | "checked";
|
|
22
|
+
exports(): {};
|
|
23
|
+
}
|
|
24
|
+
interface $$IsomorphicComponent {
|
|
25
|
+
new <TTag extends keyof SvelteHTMLProps, TSlot, TValue>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag, TSlot, TValue>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag, TSlot, TValue>['props']>, ReturnType<__sveltets_Render<TTag, TSlot, TValue>['events']>, ReturnType<__sveltets_Render<TTag, TSlot, TValue>['slots']>> & {
|
|
26
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag, TSlot, TValue>['bindings']>;
|
|
27
|
+
} & ReturnType<__sveltets_Render<TTag, TSlot, TValue>['exports']>;
|
|
28
|
+
<TTag extends keyof SvelteHTMLProps, TSlot, TValue>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TSlot, TValue>['props']> & {
|
|
29
|
+
$$events?: ReturnType<__sveltets_Render<TTag, TSlot, TValue>['events']>;
|
|
30
|
+
}): ReturnType<__sveltets_Render<TTag, TSlot, TValue>['exports']>;
|
|
31
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
|
|
32
|
+
}
|
|
33
|
+
declare const Generic: $$IsomorphicComponent;
|
|
34
|
+
type Generic<TTag extends keyof SvelteHTMLProps, TSlot, TValue> = InstanceType<typeof Generic<TTag, TSlot, TValue>>;
|
|
35
|
+
export default Generic;
|
|
@@ -7,7 +7,10 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
|
|
|
7
7
|
(internal: unknown, props: Props & {
|
|
8
8
|
$$events?: Events;
|
|
9
9
|
$$slots?: Slots;
|
|
10
|
-
}): Exports
|
|
10
|
+
}): Exports & {
|
|
11
|
+
$set?: any;
|
|
12
|
+
$on?: any;
|
|
13
|
+
};
|
|
11
14
|
z_$$bindings?: Bindings;
|
|
12
15
|
}
|
|
13
16
|
declare const StableCollection: $$__sveltets_2_IsomorphicComponent<{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare let history: HTMLElement[];
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { focusableSelector } from "./focus-management.js";
|
|
2
|
+
import { onDocumentReady } from "./on-document-ready.js";
|
|
3
|
+
export let history = [];
|
|
4
|
+
onDocumentReady(() => {
|
|
5
|
+
function handle(e) {
|
|
6
|
+
if (!(e.target instanceof HTMLElement))
|
|
7
|
+
return;
|
|
8
|
+
if (e.target === document.body)
|
|
9
|
+
return;
|
|
10
|
+
if (history[0] === e.target)
|
|
11
|
+
return;
|
|
12
|
+
let focusableElement = e.target;
|
|
13
|
+
// Figure out the closest focusable element, this is needed in a situation
|
|
14
|
+
// where you click on a non-focusable element inside a focusable element.
|
|
15
|
+
//
|
|
16
|
+
// E.g.:
|
|
17
|
+
//
|
|
18
|
+
// ```html
|
|
19
|
+
// <button>
|
|
20
|
+
// <span>Click me</span>
|
|
21
|
+
// </button>
|
|
22
|
+
// ```
|
|
23
|
+
focusableElement = focusableElement.closest(focusableSelector);
|
|
24
|
+
history.unshift(focusableElement ?? e.target);
|
|
25
|
+
// Filter out DOM Nodes that don't exist anymore
|
|
26
|
+
history = history.filter((x) => x != null && x.isConnected);
|
|
27
|
+
history.splice(10); // Only keep the 10 most recent items
|
|
28
|
+
}
|
|
29
|
+
window.addEventListener("click", handle, { capture: true });
|
|
30
|
+
window.addEventListener("mousedown", handle, { capture: true });
|
|
31
|
+
window.addEventListener("focus", handle, { capture: true });
|
|
32
|
+
document.body.addEventListener("click", handle, { capture: true });
|
|
33
|
+
document.body.addEventListener("mousedown", handle, { capture: true });
|
|
34
|
+
document.body.addEventListener("focus", handle, { capture: true });
|
|
35
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
import type { SvelteHTMLElements } from "svelte/elements";
|
|
3
|
+
export interface SvelteHTMLProps extends SvelteHTMLElements {
|
|
4
|
+
"svelte:fragment": {};
|
|
5
|
+
}
|
|
6
|
+
export type ElementType = keyof SvelteHTMLProps;
|
|
7
|
+
export type Expand<T> = T extends infer O ? {
|
|
8
|
+
[K in keyof O]: O[K];
|
|
9
|
+
} : never;
|
|
10
|
+
export type Children<TSlot> = Snippet | Snippet<[TSlot, Record<string, any>]>;
|
|
11
|
+
type OurProps<TSlot> = {
|
|
12
|
+
children?: Children<TSlot>;
|
|
13
|
+
ref?: HTMLElement;
|
|
14
|
+
class?: string | null | ((bag: TSlot) => string);
|
|
15
|
+
};
|
|
16
|
+
type MergeProps3<T, U, V> = {
|
|
17
|
+
[K in keyof T | keyof U | keyof V]?: K extends keyof V ? V[K] : K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
|
|
18
|
+
};
|
|
19
|
+
export type Props<TTag extends ElementType, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = MergeProps3<SvelteHTMLProps[TTag], OurProps<TSlot>, Overrides>;
|
|
20
|
+
export type EnsureArray<T> = T extends any[] ? T : Expand<T>[];
|
|
21
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function classNames(...classes: (false | null | undefined | string)[]): string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare let focusableSelector: string;
|
|
1
2
|
export declare enum Focus {
|
|
2
3
|
/** Focus the first non-disabled element */
|
|
3
4
|
First = 1,
|
|
@@ -35,7 +36,7 @@ export declare enum FocusableMode {
|
|
|
35
36
|
export declare function isFocusableElement(element: HTMLElement, mode?: FocusableMode): boolean;
|
|
36
37
|
export declare function restoreFocusIfNecessary(element: HTMLElement | null): void;
|
|
37
38
|
export declare function focusElement(element: HTMLElement | null): void;
|
|
38
|
-
export declare function sortByDomNode<T>(nodes: T[], resolveKey?: (item: T) => HTMLElement | null
|
|
39
|
+
export declare function sortByDomNode<T>(nodes: T[], resolveKey?: (item: T) => HTMLElement | null): T[];
|
|
39
40
|
export declare function focusFrom(current: HTMLElement | null, focus: Focus): FocusResult;
|
|
40
41
|
export declare function focusIn(container: HTMLElement | HTMLElement[], focus: Focus, { sorted, relativeTo, skipElements, }?: Partial<{
|
|
41
42
|
sorted: boolean;
|
|
@@ -3,7 +3,7 @@ import { match } from "./match.js";
|
|
|
3
3
|
import { getOwnerDocument } from "./owner.js";
|
|
4
4
|
// Credit:
|
|
5
5
|
// - https://stackoverflow.com/a/30753870
|
|
6
|
-
|
|
6
|
+
export let focusableSelector = [
|
|
7
7
|
"[contentEditable=true]",
|
|
8
8
|
"[tabindex]",
|
|
9
9
|
"a[href]",
|
|
@@ -21,7 +21,7 @@ const focusableSelector = [
|
|
|
21
21
|
(selector) => `${selector}:not([tabindex='-1']):not([style*='display: none'])`
|
|
22
22
|
: (selector) => `${selector}:not([tabindex='-1'])`)
|
|
23
23
|
.join(",");
|
|
24
|
-
|
|
24
|
+
let autoFocusableSelector = [
|
|
25
25
|
// In a perfect world this was just `autofocus`, but React doesn't pass `autofocus` to the DOM...
|
|
26
26
|
"[data-autofocus]",
|
|
27
27
|
]
|
|
@@ -105,7 +105,7 @@ export function isFocusableElement(element, mode = FocusableMode.Strict) {
|
|
|
105
105
|
});
|
|
106
106
|
}
|
|
107
107
|
export function restoreFocusIfNecessary(element) {
|
|
108
|
-
|
|
108
|
+
let ownerDocument = getOwnerDocument(element);
|
|
109
109
|
disposables().nextFrame(() => {
|
|
110
110
|
if (ownerDocument && !isFocusableElement(ownerDocument.activeElement, FocusableMode.Strict)) {
|
|
111
111
|
focusElement(element);
|
|
@@ -144,17 +144,17 @@ export function focusElement(element) {
|
|
|
144
144
|
element?.focus({ preventScroll: true });
|
|
145
145
|
}
|
|
146
146
|
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select
|
|
147
|
-
|
|
147
|
+
let selectableSelector = ["textarea", "input"].join(",");
|
|
148
148
|
function isSelectableElement(element) {
|
|
149
149
|
return element?.matches?.(selectableSelector) ?? false;
|
|
150
150
|
}
|
|
151
151
|
export function sortByDomNode(nodes, resolveKey = (i) => i) {
|
|
152
152
|
return nodes.slice().sort((aItem, zItem) => {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (
|
|
153
|
+
let a = resolveKey(aItem);
|
|
154
|
+
let z = resolveKey(zItem);
|
|
155
|
+
if (a === null || z === null)
|
|
156
156
|
return 0;
|
|
157
|
-
|
|
157
|
+
let position = a.compareDocumentPosition(z);
|
|
158
158
|
if (position & Node.DOCUMENT_POSITION_FOLLOWING)
|
|
159
159
|
return -1;
|
|
160
160
|
if (position & Node.DOCUMENT_POSITION_PRECEDING)
|
|
@@ -166,7 +166,7 @@ export function focusFrom(current, focus) {
|
|
|
166
166
|
return focusIn(getFocusableElements(), focus, { relativeTo: current });
|
|
167
167
|
}
|
|
168
168
|
export function focusIn(container, focus, { sorted = true, relativeTo = null, skipElements = [], } = {}) {
|
|
169
|
-
|
|
169
|
+
let ownerDocument = Array.isArray(container)
|
|
170
170
|
? container.length > 0
|
|
171
171
|
? container[0].ownerDocument
|
|
172
172
|
: document
|
|
@@ -185,14 +185,14 @@ export function focusIn(container, focus, { sorted = true, relativeTo = null, sk
|
|
|
185
185
|
));
|
|
186
186
|
}
|
|
187
187
|
relativeTo = relativeTo ?? ownerDocument.activeElement;
|
|
188
|
-
|
|
188
|
+
let direction = (() => {
|
|
189
189
|
if (focus & (Focus.First | Focus.Next))
|
|
190
190
|
return Direction.Next;
|
|
191
191
|
if (focus & (Focus.Previous | Focus.Last))
|
|
192
192
|
return Direction.Previous;
|
|
193
193
|
throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last");
|
|
194
194
|
})();
|
|
195
|
-
|
|
195
|
+
let startIndex = (() => {
|
|
196
196
|
if (focus & Focus.First)
|
|
197
197
|
return 0;
|
|
198
198
|
if (focus & Focus.Previous)
|
|
@@ -203,9 +203,9 @@ export function focusIn(container, focus, { sorted = true, relativeTo = null, sk
|
|
|
203
203
|
return elements.length - 1;
|
|
204
204
|
throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last");
|
|
205
205
|
})();
|
|
206
|
-
|
|
206
|
+
let focusOptions = focus & Focus.NoScroll ? { preventScroll: true } : {};
|
|
207
207
|
let offset = 0;
|
|
208
|
-
|
|
208
|
+
let total = elements.length;
|
|
209
209
|
let next = undefined;
|
|
210
210
|
do {
|
|
211
211
|
// Guard against infinite loops
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function onDocumentReady(cb: () => void): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function onDocumentReady(cb) {
|
|
2
|
+
function check() {
|
|
3
|
+
if (document.readyState === "loading")
|
|
4
|
+
return;
|
|
5
|
+
cb();
|
|
6
|
+
document.removeEventListener("DOMContentLoaded", check);
|
|
7
|
+
}
|
|
8
|
+
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
9
|
+
document.addEventListener("DOMContentLoaded", check);
|
|
10
|
+
check();
|
|
11
|
+
}
|
|
12
|
+
}
|
package/dist/utils/render.d.ts
CHANGED
|
@@ -28,4 +28,7 @@ export type PropsForFeatures<T extends RenderFeatures> = Expand<UnionToIntersect
|
|
|
28
28
|
unmount?: boolean;
|
|
29
29
|
}>>>;
|
|
30
30
|
export declare function mergeProps<T extends Props<any, any>[]>(...listOfProps: T): Props<any, any>;
|
|
31
|
+
export declare function mergePropsAdvanced(...listOfProps: Props<any, any>[]): Props<any, any>;
|
|
32
|
+
export declare function compact<T extends Record<any, any>>(object: T): {} & T;
|
|
33
|
+
export declare function omit<T extends Record<any, any>>(object: T, keysToOmit?: string[]): T;
|
|
31
34
|
export {};
|
package/dist/utils/render.js
CHANGED
|
@@ -54,3 +54,66 @@ export function mergeProps(...listOfProps) {
|
|
|
54
54
|
}
|
|
55
55
|
return target;
|
|
56
56
|
}
|
|
57
|
+
// A more complex example fo the `mergeProps` function, this one also cancels subsequent event
|
|
58
|
+
// listeners if the event has already been `preventDefault`ed.
|
|
59
|
+
export function mergePropsAdvanced(...listOfProps) {
|
|
60
|
+
if (listOfProps.length === 0)
|
|
61
|
+
return {};
|
|
62
|
+
if (listOfProps.length === 1)
|
|
63
|
+
return listOfProps[0];
|
|
64
|
+
let target = {};
|
|
65
|
+
let eventHandlers = {};
|
|
66
|
+
for (let props of listOfProps) {
|
|
67
|
+
for (let prop in props) {
|
|
68
|
+
// Collect event handlers
|
|
69
|
+
if (prop.startsWith("on") && typeof props[prop] === "function") {
|
|
70
|
+
eventHandlers[prop] ??= [];
|
|
71
|
+
eventHandlers[prop].push(props[prop]);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Override incoming prop
|
|
75
|
+
target[prop] = props[prop];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Ensure event listeners are not called if `disabled` or `aria-disabled` is true
|
|
80
|
+
if (target.disabled || target["aria-disabled"]) {
|
|
81
|
+
for (let eventName in eventHandlers) {
|
|
82
|
+
// Prevent default events for `onclick`, `onmousedown`, `onkeydown`, etc.
|
|
83
|
+
if (/^(on(?:click|pointer|mouse|key)(?:down|up|press)?)$/.test(eventName)) {
|
|
84
|
+
eventHandlers[eventName] = [(e) => e?.preventDefault?.()];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Merge event handlers
|
|
89
|
+
for (let eventName in eventHandlers) {
|
|
90
|
+
Object.assign(target, {
|
|
91
|
+
[eventName](event, ...args) {
|
|
92
|
+
let handlers = eventHandlers[eventName];
|
|
93
|
+
for (let handler of handlers) {
|
|
94
|
+
if ((event instanceof Event || event?.nativeEvent instanceof Event) && event.defaultPrevented) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
handler(event, ...args);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return target;
|
|
103
|
+
}
|
|
104
|
+
export function compact(object) {
|
|
105
|
+
let clone = Object.assign({}, object);
|
|
106
|
+
for (let key in clone) {
|
|
107
|
+
if (clone[key] === undefined)
|
|
108
|
+
delete clone[key];
|
|
109
|
+
}
|
|
110
|
+
return clone;
|
|
111
|
+
}
|
|
112
|
+
export function omit(object, keysToOmit = []) {
|
|
113
|
+
let clone = Object.assign({}, object);
|
|
114
|
+
for (let key of keysToOmit) {
|
|
115
|
+
if (key in clone)
|
|
116
|
+
delete clone[key];
|
|
117
|
+
}
|
|
118
|
+
return clone;
|
|
119
|
+
}
|
package/dist/utils/state.d.ts
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type SlotStateProps<TSlot> = {
|
|
2
|
+
[Property in keyof TSlot as TSlot[Property] extends boolean ? `data-${string & Property}` : never]?: string;
|
|
3
|
+
};
|
|
4
|
+
export type StateProps<TSlot> = SlotStateProps<TSlot> & {
|
|
5
|
+
"data-headlessui-state"?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const stateFromSlot: <TSlot>(slot?: TSlot) => StateProps<TSlot>;
|
package/dist/utils/state.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export const stateFromSlot = (slot = {}) => {
|
|
2
|
+
if (typeof slot !== "object")
|
|
3
|
+
return {};
|
|
2
4
|
let dataAttributes = {};
|
|
3
5
|
let exposeState = false;
|
|
4
6
|
let states = [];
|
|
@@ -10,11 +12,13 @@ export const stateFromSlot = (slot = {}) => {
|
|
|
10
12
|
states.push(k.replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`));
|
|
11
13
|
}
|
|
12
14
|
}
|
|
13
|
-
if (exposeState)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
15
|
+
if (!exposeState)
|
|
16
|
+
return {};
|
|
17
|
+
for (let s of states) {
|
|
18
|
+
dataAttributes[`data-${s}`] = "";
|
|
18
19
|
}
|
|
19
|
-
return
|
|
20
|
+
return {
|
|
21
|
+
"data-headlessui-state": states.join(" "),
|
|
22
|
+
...dataAttributes,
|
|
23
|
+
};
|
|
20
24
|
};
|
package/dist/utils/types.d.ts
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export type
|
|
2
|
+
import type { SvelteHTMLElements } from "svelte/elements";
|
|
3
|
+
export interface SvelteHTMLProps extends SvelteHTMLElements {
|
|
4
|
+
"svelte:fragment": {};
|
|
5
|
+
}
|
|
6
|
+
export type ElementType = keyof SvelteHTMLProps;
|
|
7
7
|
export type Expand<T> = T extends infer O ? {
|
|
8
8
|
[K in keyof O]: O[K];
|
|
9
9
|
} : never;
|
|
10
|
-
export type PropsOf<TTag extends
|
|
11
|
-
type
|
|
12
|
-
type
|
|
13
|
-
type
|
|
14
|
-
|
|
15
|
-
children?:
|
|
10
|
+
export type PropsOf<TTag extends ElementType> = SvelteHTMLProps[TTag];
|
|
11
|
+
export type Children<TSlot> = Snippet | Snippet<[TSlot, Record<string, any>]>;
|
|
12
|
+
type PropsWeControl = "as" | "children" | "refName" | "class";
|
|
13
|
+
type CleanProps<TTag extends ElementType, TOmittableProps extends PropertyKey = never> = Omit<PropsOf<TTag>, TOmittableProps | PropsWeControl>;
|
|
14
|
+
type OurProps<TSlot> = {
|
|
15
|
+
children?: Children<TSlot>;
|
|
16
|
+
ref?: HTMLElement;
|
|
16
17
|
};
|
|
17
18
|
type HasProperty<T extends object, K extends PropertyKey> = T extends never ? never : K extends keyof T ? true : never;
|
|
18
|
-
type ClassNameOverride<TTag extends
|
|
19
|
+
type ClassNameOverride<TTag extends ElementType, TSlot = {}> = true extends HasProperty<PropsOf<TTag>, "class"> ? {
|
|
19
20
|
class?: PropsOf<TTag>["class"] | ((bag: TSlot) => string);
|
|
20
21
|
} : {};
|
|
21
|
-
export type Props<TTag extends
|
|
22
|
-
type Without<T, U> = {
|
|
23
|
-
[P in Exclude<keyof T, keyof U>]?: never;
|
|
24
|
-
};
|
|
25
|
-
export type XOR<T, U> = T | U extends __ ? never : T extends __ ? U : U extends __ ? T : T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
|
|
22
|
+
export type Props<TTag extends ElementType, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = CleanProps<TTag, TOmittableProps | keyof Overrides> & OurProps<TSlot> & ClassNameOverride<TTag, TSlot> & Overrides;
|
|
26
23
|
export type EnsureArray<T> = T extends any[] ? T : Expand<T>[];
|
|
27
24
|
export {};
|
package/dist/utils/types.js
CHANGED
|
@@ -1,6 +1 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
2
|
-
// A unique placeholder we can use as a default. This is nice because we can use this instead of
|
|
3
|
-
// defaulting to null / never / ... and possibly collide with actual data.
|
|
4
|
-
// Ideally we use a unique symbol here.
|
|
5
|
-
const __ = "1D45E01E-AF44-47C4-988A-19A94EBAF55C";
|
|
6
1
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pzerelles/headlessui-svelte",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2-next.3",
|
|
4
4
|
"exports": {
|
|
5
5
|
".": {
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -18,40 +18,41 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@changesets/cli": "^2.27.7",
|
|
20
20
|
"@changesets/types": "^6.0.0",
|
|
21
|
-
"@playwright/test": "^1.
|
|
21
|
+
"@playwright/test": "^1.46.1",
|
|
22
22
|
"@pzerelles/heroicons-svelte": "^2.1.5",
|
|
23
|
-
"@sveltejs/adapter-auto": "^3.2.
|
|
24
|
-
"@sveltejs/kit": "^2.5.
|
|
25
|
-
"@sveltejs/package": "^2.3.
|
|
26
|
-
"@sveltejs/vite-plugin-svelte": "^3.1.
|
|
27
|
-
"@testing-library/jest-dom": "^6.
|
|
28
|
-
"@testing-library/svelte": "^5.2.
|
|
29
|
-
"@types/eslint": "^8.56.
|
|
30
|
-
"@types/node": "^20.
|
|
31
|
-
"autoprefixer": "^10.4.
|
|
23
|
+
"@sveltejs/adapter-auto": "^3.2.4",
|
|
24
|
+
"@sveltejs/kit": "^2.5.24",
|
|
25
|
+
"@sveltejs/package": "^2.3.4",
|
|
26
|
+
"@sveltejs/vite-plugin-svelte": "^3.1.2",
|
|
27
|
+
"@testing-library/jest-dom": "^6.5.0",
|
|
28
|
+
"@testing-library/svelte": "^5.2.1",
|
|
29
|
+
"@types/eslint": "^8.56.12",
|
|
30
|
+
"@types/node": "^20.16.1",
|
|
31
|
+
"autoprefixer": "^10.4.20",
|
|
32
32
|
"clsx": "^2.1.1",
|
|
33
|
-
"eslint": "^9.
|
|
33
|
+
"eslint": "^9.9.1",
|
|
34
34
|
"eslint-config-prettier": "^9.1.0",
|
|
35
|
-
"eslint-plugin-svelte": "^2.
|
|
36
|
-
"globals": "^15.
|
|
37
|
-
"jsdom": "^24.1.
|
|
35
|
+
"eslint-plugin-svelte": "^2.43.0",
|
|
36
|
+
"globals": "^15.9.0",
|
|
37
|
+
"jsdom": "^24.1.3",
|
|
38
38
|
"outdent": "^0.8.0",
|
|
39
|
-
"postcss": "^8.4.
|
|
39
|
+
"postcss": "^8.4.41",
|
|
40
40
|
"prettier": "^3.3.3",
|
|
41
|
-
"prettier-plugin-svelte": "^3.2.
|
|
41
|
+
"prettier-plugin-svelte": "^3.2.6",
|
|
42
42
|
"prettier-plugin-tailwindcss": "^0.5.14",
|
|
43
43
|
"publint": "^0.1.16",
|
|
44
|
-
"svelte": "5.0.0-next.
|
|
45
|
-
"svelte-check": "^3.8.
|
|
46
|
-
"tailwindcss": "^3.4.
|
|
47
|
-
"tslib": "^2.
|
|
48
|
-
"typescript": "^5.5.
|
|
44
|
+
"svelte": "5.0.0-next.238",
|
|
45
|
+
"svelte-check": "^3.8.6",
|
|
46
|
+
"tailwindcss": "^3.4.10",
|
|
47
|
+
"tslib": "^2.7.0",
|
|
48
|
+
"typescript": "^5.5.4",
|
|
49
49
|
"typescript-eslint": "8.0.0-alpha.28",
|
|
50
|
-
"vite": "^5.
|
|
51
|
-
"vitest": "^2.0.
|
|
50
|
+
"vite": "^5.4.2",
|
|
51
|
+
"vitest": "^2.0.5"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@
|
|
54
|
+
"@floating-ui/core": "^1.6.7",
|
|
55
|
+
"@floating-ui/dom": "^1.6.10",
|
|
55
56
|
"esm-env": "^1.0.0",
|
|
56
57
|
"nanoid": "^5.0.7"
|
|
57
58
|
},
|