@pzerelles/headlessui-svelte 2.1.2-next.31 → 2.1.2-next.33
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 +84 -55
- package/dist/button/Button.svelte.d.ts +4 -32
- package/dist/checkbox/Checkbox.svelte +177 -121
- package/dist/checkbox/Checkbox.svelte.d.ts +14 -32
- package/dist/close-button/CloseButton.svelte +10 -7
- package/dist/close-button/CloseButton.svelte.d.ts +2 -44
- package/dist/data-interactive/DataInteractive.svelte +49 -37
- package/dist/data-interactive/DataInteractive.svelte.d.ts +7 -30
- package/dist/description/Description.svelte +35 -22
- package/dist/description/Description.svelte.d.ts +7 -28
- package/dist/dialog/Dialog.svelte +326 -232
- package/dist/dialog/Dialog.svelte.d.ts +4 -42
- package/dist/dialog/DialogBackdrop.svelte +33 -16
- package/dist/dialog/DialogBackdrop.svelte.d.ts +4 -29
- package/dist/dialog/DialogPanel.svelte +60 -29
- package/dist/dialog/DialogPanel.svelte.d.ts +4 -30
- package/dist/dialog/DialogTitle.svelte +51 -24
- package/dist/dialog/DialogTitle.svelte.d.ts +6 -27
- package/dist/field/Field.svelte +44 -28
- package/dist/field/Field.svelte.d.ts +4 -30
- package/dist/fieldset/Fieldset.svelte +48 -30
- package/dist/fieldset/Fieldset.svelte.d.ts +5 -31
- package/dist/focus-trap/FocusTrap.svelte +430 -298
- package/dist/focus-trap/FocusTrap.svelte.d.ts +5 -34
- package/dist/hooks/use-inert-others.svelte.js +10 -10
- package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
- package/dist/input/Input.svelte +95 -54
- package/dist/input/Input.svelte.d.ts +13 -27
- package/dist/internal/FloatingProvider.svelte +14 -9
- package/dist/internal/FocusSentinel.svelte +49 -40
- package/dist/internal/ForcePortalRoot.svelte +7 -3
- package/dist/internal/FormFields.svelte +47 -34
- package/dist/internal/FormFieldsProvider.svelte +9 -5
- package/dist/internal/FormResolver.svelte +25 -16
- package/dist/internal/Hidden.svelte +45 -38
- package/dist/internal/Hidden.svelte.d.ts +4 -30
- package/dist/internal/MainTreeProvider.svelte +90 -37
- package/dist/internal/Portal.svelte +18 -14
- package/dist/label/Label.svelte +100 -59
- package/dist/label/Label.svelte.d.ts +7 -32
- package/dist/legend/Legend.svelte +27 -4
- package/dist/legend/Legend.svelte.d.ts +4 -3
- package/dist/listbox/Listbox.svelte +518 -391
- package/dist/listbox/Listbox.svelte.d.ts +11 -35
- package/dist/listbox/ListboxButton.svelte +175 -128
- package/dist/listbox/ListboxButton.svelte.d.ts +5 -32
- package/dist/listbox/ListboxOption.svelte +171 -130
- package/dist/listbox/ListboxOption.svelte.d.ts +12 -26
- package/dist/listbox/ListboxOptions.svelte +403 -305
- package/dist/listbox/ListboxOptions.svelte.d.ts +4 -38
- package/dist/listbox/ListboxSelectedOption.svelte +40 -19
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +8 -33
- package/dist/menu/Menu.svelte +76 -52
- package/dist/menu/Menu.svelte.d.ts +3 -31
- package/dist/menu/MenuButton.svelte +158 -118
- package/dist/menu/MenuButton.svelte.d.ts +4 -34
- package/dist/menu/MenuHeading.svelte +34 -15
- package/dist/menu/MenuHeading.svelte.d.ts +4 -31
- package/dist/menu/MenuItem.svelte +143 -108
- package/dist/menu/MenuItem.svelte.d.ts +5 -32
- package/dist/menu/MenuItems.svelte +301 -230
- package/dist/menu/MenuItems.svelte.d.ts +4 -38
- package/dist/menu/MenuSection.svelte +26 -10
- package/dist/menu/MenuSection.svelte.d.ts +5 -29
- package/dist/menu/MenuSeparator.svelte +20 -5
- package/dist/menu/MenuSeparator.svelte.d.ts +5 -28
- package/dist/popover/Popover.svelte +217 -151
- package/dist/popover/Popover.svelte.d.ts +4 -30
- package/dist/popover/PopoverBackdrop.svelte +71 -42
- package/dist/popover/PopoverBackdrop.svelte.d.ts +6 -34
- package/dist/popover/PopoverButton.svelte +302 -222
- package/dist/popover/PopoverButton.svelte.d.ts +6 -29
- package/dist/popover/PopoverGroup.svelte +64 -36
- package/dist/popover/PopoverGroup.svelte.d.ts +5 -28
- package/dist/popover/PopoverPanel.svelte +335 -248
- package/dist/popover/PopoverPanel.svelte.d.ts +5 -36
- package/dist/popover/index.d.ts +1 -1
- package/dist/portal/InternalPortal.svelte +143 -86
- package/dist/portal/InternalPortal.svelte.d.ts +4 -30
- package/dist/portal/Portal.svelte +8 -4
- package/dist/portal/Portal.svelte.d.ts +2 -18
- package/dist/portal/PortalGroup.svelte +23 -10
- package/dist/portal/PortalGroup.svelte.d.ts +3 -31
- package/dist/select/Select.svelte +100 -69
- package/dist/select/Select.svelte.d.ts +5 -32
- package/dist/switch/Switch.svelte +181 -133
- package/dist/switch/Switch.svelte.d.ts +5 -38
- package/dist/switch/SwitchGroup.svelte +45 -32
- package/dist/switch/SwitchGroup.svelte.d.ts +7 -28
- package/dist/tabs/Tab.svelte +195 -143
- package/dist/tabs/Tab.svelte.d.ts +4 -32
- package/dist/tabs/TabGroup.svelte +87 -57
- package/dist/tabs/TabGroup.svelte.d.ts +4 -34
- package/dist/tabs/TabList.svelte +31 -12
- package/dist/tabs/TabList.svelte.d.ts +5 -28
- package/dist/tabs/TabPanel.svelte +69 -44
- package/dist/tabs/TabPanel.svelte.d.ts +4 -34
- package/dist/tabs/TabPanels.svelte +19 -8
- package/dist/tabs/TabPanels.svelte.d.ts +5 -27
- package/dist/textarea/Textarea.svelte +87 -54
- package/dist/textarea/Textarea.svelte.d.ts +13 -27
- package/dist/transition/InternalTransitionChild.svelte +267 -171
- package/dist/transition/InternalTransitionChild.svelte.d.ts +3 -33
- package/dist/transition/Transition.svelte +88 -67
- package/dist/transition/Transition.svelte.d.ts +3 -36
- package/dist/transition/TransitionChild.svelte +31 -12
- package/dist/transition/TransitionChild.svelte.d.ts +8 -35
- package/dist/transition/context.svelte.js +7 -7
- package/dist/utils/DisabledProvider.svelte +7 -3
- package/dist/utils/ElementOrComponent.svelte +88 -24
- package/dist/utils/ElementOrComponent.svelte.d.ts +32 -27
- package/dist/utils/StableCollection.svelte +54 -36
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +27 -12
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +88 -44
- package/dist/utils/state.js +4 -4
- package/dist/utils/types.d.ts +14 -12
- package/package.json +12 -12
- package/dist/combobox/Combobox.svelte +0 -6
- package/dist/combobox/Combobox.svelte.d.ts +0 -50
- package/dist/utils/Generic.svelte +0 -46
- package/dist/utils/Generic.svelte.d.ts +0 -32
- package/dist/utils/alternative-types.d.ts +0 -20
- package/dist/utils/alternative-types.js +0 -1
|
@@ -1,44 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
2
|
import { FocusTrapFeatures } from "./FocusTrapFeatures.js";
|
|
3
3
|
type Containers = (() => Iterable<HTMLElement>) | Iterable<HTMLElement>;
|
|
4
|
-
declare
|
|
4
|
+
declare const DEFAULT_FOCUS_TRAP_TAG: "div";
|
|
5
5
|
export * from "./FocusTrapFeatures.js";
|
|
6
6
|
type FocusTrapRenderPropArg = {};
|
|
7
|
-
type
|
|
8
|
-
|
|
7
|
+
export type FocusTrapProps = Props<typeof DEFAULT_FOCUS_TRAP_TAG, FocusTrapRenderPropArg, {
|
|
8
|
+
element?: HTMLElement;
|
|
9
9
|
initialFocus?: HTMLElement;
|
|
10
10
|
initialFocusFallback?: HTMLElement;
|
|
11
11
|
features?: FocusTrapFeatures;
|
|
12
12
|
containers?: Containers;
|
|
13
13
|
}>;
|
|
14
|
-
declare
|
|
15
|
-
props(): {
|
|
16
|
-
as?: TTag | undefined;
|
|
17
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "features" | "containers" | "initialFocus" | "initialFocusFallback"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
18
|
-
children?: import("svelte").Snippet<[{
|
|
19
|
-
slot: FocusTrapRenderPropArg;
|
|
20
|
-
props: Record<string, any>;
|
|
21
|
-
}]> | undefined;
|
|
22
|
-
class?: string | ((bag: FocusTrapRenderPropArg) => string) | null | undefined;
|
|
23
|
-
ref?: HTMLElement;
|
|
24
|
-
} & {
|
|
25
|
-
initialFocus?: HTMLElement;
|
|
26
|
-
initialFocusFallback?: HTMLElement;
|
|
27
|
-
features?: FocusTrapFeatures;
|
|
28
|
-
containers?: Containers;
|
|
29
|
-
};
|
|
30
|
-
events(): {};
|
|
31
|
-
slots(): {};
|
|
32
|
-
bindings(): "ref";
|
|
33
|
-
exports(): {};
|
|
34
|
-
}
|
|
35
|
-
interface $$IsomorphicComponent {
|
|
36
|
-
new <TTag extends ElementType = typeof DEFAULT_FOCUS_TRAP_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']>> & {
|
|
37
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
38
|
-
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
39
|
-
<TTag extends ElementType = typeof DEFAULT_FOCUS_TRAP_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
40
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
41
|
-
}
|
|
42
|
-
declare const FocusTrap: $$IsomorphicComponent;
|
|
43
|
-
type FocusTrap<TTag extends ElementType = typeof DEFAULT_FOCUS_TRAP_TAG> = InstanceType<typeof FocusTrap<TTag>>;
|
|
14
|
+
declare const FocusTrap: import("svelte").Component<FocusTrapProps, {}, "element">;
|
|
44
15
|
export default FocusTrap;
|
|
@@ -5,7 +5,7 @@ const originals = new Map();
|
|
|
5
5
|
const counts = new Map();
|
|
6
6
|
function markInert(element) {
|
|
7
7
|
// Increase count
|
|
8
|
-
|
|
8
|
+
const count = counts.get(element) ?? 0;
|
|
9
9
|
counts.set(element, count + 1);
|
|
10
10
|
// Already marked as inert, no need to do it again
|
|
11
11
|
if (count !== 0)
|
|
@@ -22,7 +22,7 @@ function markInert(element) {
|
|
|
22
22
|
}
|
|
23
23
|
function markNotInert(element) {
|
|
24
24
|
// Decrease counts
|
|
25
|
-
|
|
25
|
+
const count = counts.get(element) ?? 1; // Should always exist
|
|
26
26
|
if (count === 1)
|
|
27
27
|
counts.delete(element); // We are the last one, so we can delete the count
|
|
28
28
|
else
|
|
@@ -30,7 +30,7 @@ function markNotInert(element) {
|
|
|
30
30
|
// Not the last one, so we don't restore the original values (yet)
|
|
31
31
|
if (count !== 1)
|
|
32
32
|
return;
|
|
33
|
-
|
|
33
|
+
const original = originals.get(element);
|
|
34
34
|
if (!original)
|
|
35
35
|
return; // Should never happen
|
|
36
36
|
// Restore original values
|
|
@@ -70,7 +70,7 @@ function markNotInert(element) {
|
|
|
70
70
|
export function useInertOthers(options) {
|
|
71
71
|
const { enabled, elements } = $derived(options);
|
|
72
72
|
const { allowed, disallowed } = $derived(elements ?? {});
|
|
73
|
-
|
|
73
|
+
const isTopLayer = useIsTopLayer({
|
|
74
74
|
get enabled() {
|
|
75
75
|
return enabled;
|
|
76
76
|
},
|
|
@@ -79,25 +79,25 @@ export function useInertOthers(options) {
|
|
|
79
79
|
$effect(() => {
|
|
80
80
|
if (!isTopLayer.value)
|
|
81
81
|
return;
|
|
82
|
-
|
|
82
|
+
const d = disposables();
|
|
83
83
|
// Mark all disallowed elements as inert
|
|
84
|
-
for (
|
|
84
|
+
for (const element of disallowed ?? []) {
|
|
85
85
|
if (!element)
|
|
86
86
|
continue;
|
|
87
87
|
d.add(markInert(element));
|
|
88
88
|
}
|
|
89
89
|
// Mark all siblings of allowed elements (and parents) as inert
|
|
90
|
-
|
|
91
|
-
for (
|
|
90
|
+
const allowedElements = allowed ?? [];
|
|
91
|
+
for (const element of allowedElements) {
|
|
92
92
|
if (!element)
|
|
93
93
|
continue;
|
|
94
|
-
|
|
94
|
+
const ownerDocument = getOwnerDocument(element);
|
|
95
95
|
if (!ownerDocument)
|
|
96
96
|
continue;
|
|
97
97
|
let parent = element.parentElement;
|
|
98
98
|
while (parent && parent !== ownerDocument.body) {
|
|
99
99
|
// Mark all siblings as inert
|
|
100
|
-
for (
|
|
100
|
+
for (const node of parent.children) {
|
|
101
101
|
// If the node contains any of the elements we should not mark it as inert
|
|
102
102
|
// because it would make the elements unreachable.
|
|
103
103
|
if (node.tagName.toLowerCase() === "svelte:fragment" || allowedElements.some((el) => node.contains(el)))
|
package/dist/input/Input.svelte
CHANGED
|
@@ -1,59 +1,100 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
|
+
import type { SvelteHTMLElements } from "svelte/elements"
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
value = $bindable(),
|
|
19
|
-
id = providedId || `headlessui-input-${internalId}`,
|
|
20
|
-
disabled: theirDisabled = false,
|
|
21
|
-
autofocus = false,
|
|
22
|
-
invalid = false,
|
|
23
|
-
...theirProps
|
|
24
|
-
} = $props();
|
|
25
|
-
const disabled = $derived(providedDisabled.current || theirDisabled);
|
|
26
|
-
const labelledBy = useLabelledBy();
|
|
27
|
-
const describedBy = useDescribedBy();
|
|
28
|
-
const { isHovered: hover, hoverProps } = $derived(
|
|
29
|
-
useHover({
|
|
30
|
-
get disabled() {
|
|
31
|
-
return disabled;
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
);
|
|
35
|
-
const { isFocusVisible: focus, focusProps } = $derived(
|
|
36
|
-
useFocusRing({
|
|
37
|
-
get autofocus() {
|
|
38
|
-
return autofocus;
|
|
39
|
-
}
|
|
40
|
-
})
|
|
41
|
-
);
|
|
42
|
-
const ourProps = $derived(
|
|
43
|
-
mergeProps(
|
|
5
|
+
const DEFAULT_INPUT_TAG = "input" as const
|
|
6
|
+
|
|
7
|
+
type InputRenderPropArg = {
|
|
8
|
+
disabled: boolean
|
|
9
|
+
hover: boolean
|
|
10
|
+
focus: boolean
|
|
11
|
+
autofocus: boolean
|
|
12
|
+
invalid: boolean
|
|
13
|
+
}
|
|
14
|
+
type InputPropsWeControl = "aria-labelledby" | "aria-describedby"
|
|
15
|
+
|
|
16
|
+
export type InputProps<TValue = string> = Props<
|
|
17
|
+
typeof DEFAULT_INPUT_TAG,
|
|
18
|
+
InputRenderPropArg,
|
|
44
19
|
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
autofocus
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
20
|
+
element?: HTMLElement
|
|
21
|
+
id?: string
|
|
22
|
+
value?: TValue
|
|
23
|
+
disabled?: boolean
|
|
24
|
+
invalid?: boolean
|
|
25
|
+
autofocus?: boolean
|
|
26
|
+
}
|
|
27
|
+
>
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<script lang="ts" generics="TValue = string">
|
|
31
|
+
import { htmlid } from "../utils/id.js"
|
|
32
|
+
import { useDisabled } from "../hooks/use-disabled.js"
|
|
33
|
+
import { useProvidedId } from "../utils/id.js"
|
|
34
|
+
import { useLabelledBy } from "../label/context.svelte.js"
|
|
35
|
+
import { useDescribedBy } from "../description/context.svelte.js"
|
|
36
|
+
import { useHover } from "../hooks/use-hover.svelte.js"
|
|
37
|
+
import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
|
|
38
|
+
import { mergeProps } from "../utils/render.js"
|
|
39
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
40
|
+
|
|
41
|
+
const internalId = htmlid()
|
|
42
|
+
const providedId = useProvidedId()
|
|
43
|
+
const providedDisabled = useDisabled()
|
|
44
|
+
|
|
45
|
+
let {
|
|
46
|
+
element = $bindable(),
|
|
47
|
+
value = $bindable(),
|
|
48
|
+
id = providedId || `headlessui-input-${internalId}`,
|
|
49
|
+
disabled: theirDisabled = false,
|
|
50
|
+
autofocus = false,
|
|
51
|
+
invalid = false,
|
|
52
|
+
...theirProps
|
|
53
|
+
}: InputProps<TValue> = $props()
|
|
54
|
+
const disabled = $derived(providedDisabled.current || theirDisabled)
|
|
55
|
+
|
|
56
|
+
const labelledBy = useLabelledBy()
|
|
57
|
+
const describedBy = useDescribedBy()
|
|
58
|
+
|
|
59
|
+
const { isHovered: hover, hoverProps } = $derived(
|
|
60
|
+
useHover({
|
|
61
|
+
get disabled() {
|
|
62
|
+
return disabled
|
|
63
|
+
},
|
|
64
|
+
})
|
|
54
65
|
)
|
|
55
|
-
|
|
56
|
-
|
|
66
|
+
const { isFocusVisible: focus, focusProps } = $derived(
|
|
67
|
+
useFocusRing({
|
|
68
|
+
get autofocus() {
|
|
69
|
+
return autofocus
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
const ourProps = $derived(
|
|
75
|
+
mergeProps(
|
|
76
|
+
{
|
|
77
|
+
id,
|
|
78
|
+
"aria-labelledby": labelledBy?.value,
|
|
79
|
+
"aria-describedby": describedBy?.value,
|
|
80
|
+
"aria-invalid": invalid ? "" : undefined,
|
|
81
|
+
disabled: disabled || undefined,
|
|
82
|
+
autofocus,
|
|
83
|
+
},
|
|
84
|
+
focusProps,
|
|
85
|
+
hoverProps
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
const slot = $derived({ disabled, invalid, hover, focus, autofocus } satisfies InputRenderPropArg)
|
|
57
90
|
</script>
|
|
58
91
|
|
|
59
|
-
<ElementOrComponent
|
|
92
|
+
<ElementOrComponent
|
|
93
|
+
{ourProps}
|
|
94
|
+
{theirProps}
|
|
95
|
+
{slot}
|
|
96
|
+
defaultTag={DEFAULT_INPUT_TAG}
|
|
97
|
+
name="Input"
|
|
98
|
+
bind:element
|
|
99
|
+
bind:value
|
|
100
|
+
/>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
2
|
declare const DEFAULT_INPUT_TAG: "input";
|
|
3
3
|
type InputRenderPropArg = {
|
|
4
4
|
disabled: boolean;
|
|
@@ -7,42 +7,28 @@ type InputRenderPropArg = {
|
|
|
7
7
|
autofocus: boolean;
|
|
8
8
|
invalid: boolean;
|
|
9
9
|
};
|
|
10
|
-
type
|
|
11
|
-
|
|
10
|
+
export type InputProps<TValue = string> = Props<typeof DEFAULT_INPUT_TAG, InputRenderPropArg, {
|
|
11
|
+
element?: HTMLElement;
|
|
12
|
+
id?: string;
|
|
12
13
|
value?: TValue;
|
|
13
14
|
disabled?: boolean;
|
|
14
15
|
invalid?: boolean;
|
|
15
16
|
autofocus?: boolean;
|
|
16
17
|
}>;
|
|
17
|
-
declare class __sveltets_Render<
|
|
18
|
-
props():
|
|
19
|
-
as?: TTag | undefined;
|
|
20
|
-
value?: TValue | undefined;
|
|
21
|
-
} & (Exclude<keyof PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "invalid" | "disabled" | "autofocus" | "value" | InputPropsWeControl> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
|
|
22
|
-
children?: import("svelte").Snippet<[{
|
|
23
|
-
slot: InputRenderPropArg;
|
|
24
|
-
props: Record<string, any>;
|
|
25
|
-
}]> | undefined;
|
|
26
|
-
class?: string | ((bag: InputRenderPropArg) => string) | null | undefined;
|
|
27
|
-
ref?: HTMLElement;
|
|
28
|
-
} & {
|
|
29
|
-
value?: TValue | undefined;
|
|
30
|
-
disabled?: boolean;
|
|
31
|
-
invalid?: boolean;
|
|
32
|
-
autofocus?: boolean;
|
|
33
|
-
};
|
|
18
|
+
declare class __sveltets_Render<TValue = string> {
|
|
19
|
+
props(): InputProps<TValue>;
|
|
34
20
|
events(): {};
|
|
35
21
|
slots(): {};
|
|
36
|
-
bindings(): "
|
|
22
|
+
bindings(): "element" | "value";
|
|
37
23
|
exports(): {};
|
|
38
24
|
}
|
|
39
25
|
interface $$IsomorphicComponent {
|
|
40
|
-
new <
|
|
41
|
-
$$bindings?: ReturnType<__sveltets_Render<
|
|
42
|
-
} & ReturnType<__sveltets_Render<
|
|
43
|
-
<
|
|
44
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any
|
|
26
|
+
new <TValue = string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TValue>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TValue>['props']>, ReturnType<__sveltets_Render<TValue>['events']>, ReturnType<__sveltets_Render<TValue>['slots']>> & {
|
|
27
|
+
$$bindings?: ReturnType<__sveltets_Render<TValue>['bindings']>;
|
|
28
|
+
} & ReturnType<__sveltets_Render<TValue>['exports']>;
|
|
29
|
+
<TValue = string>(internal: unknown, props: ReturnType<__sveltets_Render<TValue>['props']> & {}): ReturnType<__sveltets_Render<TValue>['exports']>;
|
|
30
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
45
31
|
}
|
|
46
32
|
declare const Input: $$IsomorphicComponent;
|
|
47
|
-
type Input<
|
|
33
|
+
type Input<TValue = string> = InstanceType<typeof Input<TValue>>;
|
|
48
34
|
export default Input;
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
<script lang="ts" module
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<script lang="ts">
|
|
5
|
+
import type { Snippet } from "svelte"
|
|
6
|
+
import { useFloatingProvider } from "./floating-provider.svelte.js"
|
|
7
|
+
|
|
8
|
+
const { children, enabled = true }: { children: Snippet; enabled?: boolean } = $props()
|
|
9
|
+
|
|
10
|
+
useFloatingProvider({
|
|
11
|
+
get enabled() {
|
|
12
|
+
return enabled
|
|
13
|
+
},
|
|
14
|
+
})
|
|
10
15
|
</script>
|
|
11
16
|
|
|
12
17
|
{#if children}{@render children()}{/if}
|
|
@@ -1,45 +1,54 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
let enabled = $state(true);
|
|
5
|
-
let mounted = $state(false);
|
|
6
|
-
onMount(() => {
|
|
7
|
-
mounted = true;
|
|
8
|
-
});
|
|
9
|
-
</script>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from "svelte"
|
|
3
|
+
import Hidden, { HiddenFeatures } from "./Hidden.svelte"
|
|
10
4
|
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
enabled = false
|
|
35
|
-
return
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Retry
|
|
39
|
-
frame = requestAnimationFrame(forwardFocus)
|
|
5
|
+
interface FocusSentinelProps {
|
|
6
|
+
onfocus: () => boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { onfocus }: FocusSentinelProps = $props()
|
|
10
|
+
|
|
11
|
+
let enabled = $state(true)
|
|
12
|
+
let mounted = $state(false)
|
|
13
|
+
|
|
14
|
+
onMount(() => {
|
|
15
|
+
mounted = true
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
const handleFocus = (event: FocusEvent) => {
|
|
19
|
+
event.preventDefault()
|
|
20
|
+
let frame: ReturnType<typeof requestAnimationFrame>
|
|
21
|
+
|
|
22
|
+
let tries = 50
|
|
23
|
+
function forwardFocus() {
|
|
24
|
+
// Prevent infinite loops
|
|
25
|
+
if (tries-- <= 0) {
|
|
26
|
+
if (frame) cancelAnimationFrame(frame)
|
|
27
|
+
return
|
|
40
28
|
}
|
|
41
29
|
|
|
30
|
+
// Try to move focus to the correct element. This depends on the implementation
|
|
31
|
+
// of `onFocus` of course since it would be different for each place we use it in.
|
|
32
|
+
if (onfocus?.()) {
|
|
33
|
+
cancelAnimationFrame(frame)
|
|
34
|
+
if (!mounted) return
|
|
35
|
+
|
|
36
|
+
enabled = false
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Retry
|
|
42
41
|
frame = requestAnimationFrame(forwardFocus)
|
|
43
|
-
}
|
|
44
|
-
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
frame = requestAnimationFrame(forwardFocus)
|
|
45
|
+
}
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
{#if enabled}
|
|
49
|
+
<Hidden asChild features={HiddenFeatures.Focusable}>
|
|
50
|
+
{#snippet children({ props })}
|
|
51
|
+
<button {...props} type="button" onfocus={handleFocus}>‌</button>
|
|
52
|
+
{/snippet}
|
|
53
|
+
</Hidden>
|
|
45
54
|
{/if}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from "svelte"
|
|
3
|
+
import { createPortalRoot } from "./portal-force-root.svelte.js"
|
|
4
|
+
|
|
5
|
+
let { force, children }: { force: boolean; children: Snippet } = $props()
|
|
6
|
+
|
|
7
|
+
createPortalRoot({ force })
|
|
4
8
|
</script>
|
|
5
9
|
|
|
6
10
|
{#if children}{@render children()}{/if}
|
|
@@ -1,38 +1,51 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { disposables } from "../utils/disposables.js"
|
|
3
|
+
import { objectToFormEntries } from "../utils/form.js"
|
|
4
|
+
import FormResolver from "./FormResolver.svelte"
|
|
5
|
+
import { hoistFormFields } from "./form-fields.svelte.js"
|
|
6
|
+
import Hidden, { HiddenFeatures } from "./Hidden.svelte"
|
|
7
|
+
import { compact } from "../utils/object.js"
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
data,
|
|
11
|
+
form: formId,
|
|
12
|
+
disabled,
|
|
13
|
+
onReset,
|
|
14
|
+
overrides,
|
|
15
|
+
}: {
|
|
16
|
+
data: Record<string, any>
|
|
17
|
+
overrides?: Record<string, any>
|
|
18
|
+
form?: string
|
|
19
|
+
disabled?: boolean
|
|
20
|
+
onReset?: (e: Event) => void
|
|
21
|
+
} = $props()
|
|
22
|
+
|
|
23
|
+
let form = $state<HTMLFormElement | null>(null)
|
|
24
|
+
const d = disposables()
|
|
25
|
+
|
|
26
|
+
$effect(() => {
|
|
27
|
+
if (!onReset) return
|
|
28
|
+
if (!form) return
|
|
29
|
+
|
|
30
|
+
return d.addEventListener(form, "reset", onReset)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
const fields = $derived(
|
|
34
|
+
objectToFormEntries(data).map(([name, value]) =>
|
|
35
|
+
compact({
|
|
36
|
+
key: name,
|
|
37
|
+
as: "input",
|
|
38
|
+
type: "hidden",
|
|
39
|
+
form: formId,
|
|
40
|
+
disabled,
|
|
41
|
+
name,
|
|
42
|
+
value,
|
|
43
|
+
...overrides,
|
|
44
|
+
})
|
|
45
|
+
)
|
|
33
46
|
)
|
|
34
|
-
|
|
35
|
-
const hoisted = hoistFormFields(formFields)
|
|
47
|
+
|
|
48
|
+
const hoisted = hoistFormFields(formFields)
|
|
36
49
|
</script>
|
|
37
50
|
|
|
38
51
|
{#snippet formFields()}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from "svelte"
|
|
3
|
+
import Hidden, { HiddenFeatures } from "./Hidden.svelte"
|
|
4
|
+
import { createFormFieldsContext } from "./form-fields.svelte.js"
|
|
5
|
+
|
|
6
|
+
const { children }: { children?: Snippet } = $props()
|
|
7
|
+
|
|
8
|
+
const context = createFormFieldsContext()
|
|
9
|
+
const { fields } = $derived(context)
|
|
6
10
|
</script>
|
|
7
11
|
|
|
8
12
|
{#if children}{@render children()}{/if}
|
|
@@ -1,20 +1,29 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from "svelte"
|
|
3
|
+
import Hidden, { HiddenFeatures } from "./Hidden.svelte"
|
|
4
|
+
|
|
5
|
+
let { setForm, formId }: { setForm: (form: HTMLFormElement) => void; formId?: string } = $props()
|
|
6
|
+
|
|
7
|
+
$effect(() => {
|
|
8
|
+
if (formId) {
|
|
9
|
+
const resolvedForm = document.getElementById(formId) as HTMLFormElement
|
|
10
|
+
if (resolvedForm) setForm(resolvedForm)
|
|
11
|
+
}
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
let element = $state<HTMLElement>()
|
|
15
|
+
|
|
16
|
+
onMount(() => {
|
|
17
|
+
if (!element) return
|
|
18
|
+
const resolvedForm = element.closest("form")
|
|
19
|
+
if (resolvedForm) setForm(resolvedForm)
|
|
20
|
+
})
|
|
16
21
|
</script>
|
|
17
22
|
|
|
18
23
|
{#if !formId}
|
|
19
|
-
<Hidden features={HiddenFeatures.Hidden}
|
|
24
|
+
<Hidden asChild features={HiddenFeatures.Hidden}>
|
|
25
|
+
{#snippet children({ props })}
|
|
26
|
+
<input {...props} type="hidden" hidden readonly bind:this={element} />
|
|
27
|
+
{/snippet}
|
|
28
|
+
</Hidden>
|
|
20
29
|
{/if}
|