@pzerelles/headlessui-svelte 2.1.2-next.31 → 2.1.2-next.32

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.
Files changed (113) hide show
  1. package/dist/button/Button.svelte +84 -54
  2. package/dist/button/Button.svelte.d.ts +2 -3
  3. package/dist/checkbox/Checkbox.svelte +173 -120
  4. package/dist/checkbox/Checkbox.svelte.d.ts +2 -3
  5. package/dist/close-button/CloseButton.svelte +12 -6
  6. package/dist/close-button/CloseButton.svelte.d.ts +7 -8
  7. package/dist/combobox/Combobox.svelte +50 -3
  8. package/dist/data-interactive/DataInteractive.svelte +55 -29
  9. package/dist/data-interactive/DataInteractive.svelte.d.ts +2 -3
  10. package/dist/description/Description.svelte +31 -21
  11. package/dist/description/Description.svelte.d.ts +1 -2
  12. package/dist/dialog/Dialog.svelte +320 -228
  13. package/dist/dialog/Dialog.svelte.d.ts +2 -3
  14. package/dist/dialog/DialogBackdrop.svelte +30 -13
  15. package/dist/dialog/DialogBackdrop.svelte.d.ts +2 -3
  16. package/dist/dialog/DialogPanel.svelte +49 -26
  17. package/dist/dialog/DialogPanel.svelte.d.ts +2 -3
  18. package/dist/dialog/DialogTitle.svelte +38 -23
  19. package/dist/dialog/DialogTitle.svelte.d.ts +2 -3
  20. package/dist/field/Field.svelte +47 -25
  21. package/dist/field/Field.svelte.d.ts +1 -2
  22. package/dist/fieldset/Fieldset.svelte +50 -29
  23. package/dist/fieldset/Fieldset.svelte.d.ts +1 -2
  24. package/dist/focus-trap/FocusTrap.svelte +419 -283
  25. package/dist/focus-trap/FocusTrap.svelte.d.ts +1 -2
  26. package/dist/input/Input.svelte +84 -53
  27. package/dist/input/Input.svelte.d.ts +2 -3
  28. package/dist/internal/FloatingProvider.svelte +14 -9
  29. package/dist/internal/FocusSentinel.svelte +16 -8
  30. package/dist/internal/ForcePortalRoot.svelte +7 -3
  31. package/dist/internal/FormFields.svelte +47 -34
  32. package/dist/internal/FormFieldsProvider.svelte +9 -5
  33. package/dist/internal/FormResolver.svelte +20 -15
  34. package/dist/internal/Hidden.svelte +50 -29
  35. package/dist/internal/Hidden.svelte.d.ts +1 -2
  36. package/dist/internal/MainTreeProvider.svelte +89 -36
  37. package/dist/internal/Portal.svelte +18 -14
  38. package/dist/label/Label.svelte +93 -58
  39. package/dist/label/Label.svelte.d.ts +1 -2
  40. package/dist/legend/Legend.svelte +12 -3
  41. package/dist/listbox/Listbox.svelte +525 -387
  42. package/dist/listbox/Listbox.svelte.d.ts +2 -3
  43. package/dist/listbox/ListboxButton.svelte +173 -127
  44. package/dist/listbox/ListboxButton.svelte.d.ts +2 -3
  45. package/dist/listbox/ListboxOption.svelte +170 -129
  46. package/dist/listbox/ListboxOption.svelte.d.ts +2 -3
  47. package/dist/listbox/ListboxOptions.svelte +400 -304
  48. package/dist/listbox/ListboxOptions.svelte.d.ts +2 -3
  49. package/dist/listbox/ListboxSelectedOption.svelte +38 -15
  50. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +1 -2
  51. package/dist/menu/Menu.svelte +77 -51
  52. package/dist/menu/Menu.svelte.d.ts +2 -3
  53. package/dist/menu/MenuButton.svelte +157 -117
  54. package/dist/menu/MenuButton.svelte.d.ts +2 -3
  55. package/dist/menu/MenuHeading.svelte +32 -14
  56. package/dist/menu/MenuHeading.svelte.d.ts +1 -2
  57. package/dist/menu/MenuItem.svelte +142 -107
  58. package/dist/menu/MenuItem.svelte.d.ts +2 -3
  59. package/dist/menu/MenuItems.svelte +301 -229
  60. package/dist/menu/MenuItems.svelte.d.ts +2 -3
  61. package/dist/menu/MenuSection.svelte +24 -9
  62. package/dist/menu/MenuSection.svelte.d.ts +1 -2
  63. package/dist/menu/MenuSeparator.svelte +17 -4
  64. package/dist/menu/MenuSeparator.svelte.d.ts +1 -2
  65. package/dist/popover/Popover.svelte +216 -150
  66. package/dist/popover/Popover.svelte.d.ts +2 -3
  67. package/dist/popover/PopoverBackdrop.svelte +67 -41
  68. package/dist/popover/PopoverBackdrop.svelte.d.ts +2 -3
  69. package/dist/popover/PopoverButton.svelte +292 -212
  70. package/dist/popover/PopoverButton.svelte.d.ts +2 -3
  71. package/dist/popover/PopoverGroup.svelte +62 -35
  72. package/dist/popover/PopoverGroup.svelte.d.ts +1 -2
  73. package/dist/popover/PopoverPanel.svelte +311 -229
  74. package/dist/popover/PopoverPanel.svelte.d.ts +2 -3
  75. package/dist/portal/InternalPortal.svelte +141 -85
  76. package/dist/portal/InternalPortal.svelte.d.ts +1 -2
  77. package/dist/portal/Portal.svelte +5 -2
  78. package/dist/portal/PortalGroup.svelte +30 -9
  79. package/dist/portal/PortalGroup.svelte.d.ts +1 -2
  80. package/dist/select/Select.svelte +98 -68
  81. package/dist/select/Select.svelte.d.ts +2 -3
  82. package/dist/switch/Switch.svelte +179 -132
  83. package/dist/switch/Switch.svelte.d.ts +2 -3
  84. package/dist/switch/SwitchGroup.svelte +44 -31
  85. package/dist/switch/SwitchGroup.svelte.d.ts +1 -2
  86. package/dist/tabs/Tab.svelte +194 -142
  87. package/dist/tabs/Tab.svelte.d.ts +2 -3
  88. package/dist/tabs/TabGroup.svelte +86 -56
  89. package/dist/tabs/TabGroup.svelte.d.ts +2 -3
  90. package/dist/tabs/TabList.svelte +31 -11
  91. package/dist/tabs/TabList.svelte.d.ts +2 -3
  92. package/dist/tabs/TabPanel.svelte +67 -42
  93. package/dist/tabs/TabPanel.svelte.d.ts +2 -3
  94. package/dist/tabs/TabPanels.svelte +18 -7
  95. package/dist/tabs/TabPanels.svelte.d.ts +2 -3
  96. package/dist/textarea/Textarea.svelte +84 -53
  97. package/dist/textarea/Textarea.svelte.d.ts +2 -3
  98. package/dist/transition/InternalTransitionChild.svelte +259 -170
  99. package/dist/transition/InternalTransitionChild.svelte.d.ts +2 -3
  100. package/dist/transition/Transition.svelte +96 -66
  101. package/dist/transition/Transition.svelte.d.ts +2 -3
  102. package/dist/transition/TransitionChild.svelte +31 -11
  103. package/dist/transition/TransitionChild.svelte.d.ts +2 -3
  104. package/dist/utils/DisabledProvider.svelte +7 -3
  105. package/dist/utils/ElementOrComponent.svelte +46 -23
  106. package/dist/utils/ElementOrComponent.svelte.d.ts +8 -10
  107. package/dist/utils/Generic.svelte +30 -19
  108. package/dist/utils/Generic.svelte.d.ts +6 -7
  109. package/dist/utils/StableCollection.svelte +54 -36
  110. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +27 -12
  111. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +88 -44
  112. package/dist/utils/types.d.ts +4 -5
  113. package/package.json +1 -1
@@ -1,16 +1,36 @@
1
- <script lang="ts" module>import { RenderFeatures } from "../utils/render.js";
2
- export const DEFAULT_TRANSITION_CHILD_TAG = "svelte:fragment";
3
- export const TransitionChildRenderFeatures = RenderFeatures.RenderStrategy;
1
+ <script lang="ts" module>
2
+ import type { ElementType, Props } from "../utils/types.js"
3
+ import { RenderFeatures, type PropsForFeatures } from "../utils/render.js"
4
+ import type { TransitionEvents, TransitionClasses } from "./context.svelte.js"
5
+
6
+ type TransitionChildPropsWeControl = never
7
+
8
+ export type TransitionChildProps<TTag extends ElementType> = Props<
9
+ TTag,
10
+ TransitionChildRenderPropArg,
11
+ TransitionChildPropsWeControl,
12
+ PropsForFeatures<typeof TransitionChildRenderFeatures> &
13
+ TransitionClasses &
14
+ TransitionEvents & { transition?: boolean; appear?: boolean }
15
+ >
16
+
17
+ export const DEFAULT_TRANSITION_CHILD_TAG = "svelte:fragment"
18
+ export type TransitionChildRenderPropArg = HTMLElement
19
+ export const TransitionChildRenderFeatures = RenderFeatures.RenderStrategy
4
20
  </script>
5
21
 
6
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">import { useOpenClosed } from "../internal/open-closed.js";
7
- import { getContext } from "svelte";
8
- import InternalTransitionChild from "./InternalTransitionChild.svelte";
9
- import Transition from "./Transition.svelte";
10
- const hasTransitionContext = !!getContext("TransitionContext");
11
- const hasOpenClosedContext = useOpenClosed() !== null;
12
- let { ref = $bindable(), as, ...props } = $props();
13
- const TransitionRootOrChild = !hasTransitionContext && hasOpenClosedContext ? Transition : InternalTransitionChild;
22
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG">
23
+ import { useOpenClosed } from "../internal/open-closed.js"
24
+ import { getContext } from "svelte"
25
+ import InternalTransitionChild from "./InternalTransitionChild.svelte"
26
+ import Transition from "./Transition.svelte"
27
+
28
+ const hasTransitionContext = !!getContext("TransitionContext")
29
+ const hasOpenClosedContext = useOpenClosed() !== null
30
+
31
+ let { ref = $bindable(), as, ...props }: { as?: TTag } & TransitionChildProps<TTag> = $props()
32
+
33
+ const TransitionRootOrChild = !hasTransitionContext && hasOpenClosedContext ? Transition : InternalTransitionChild
14
34
  </script>
15
35
 
16
36
  <TransitionRootOrChild bind:ref {...props} />
@@ -13,9 +13,8 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TRANSI
13
13
  props(): {
14
14
  as?: TTag | undefined;
15
15
  } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "unmount" | "transition" | keyof TransitionClasses | keyof TransitionEvents | "appear"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
16
- children?: import("svelte").Snippet<[{
17
- slot: HTMLElement;
18
- props: Record<string, any>;
16
+ children?: import("svelte").Snippet<[HTMLElement & {
17
+ props?: Record<string, any>;
19
18
  }]> | undefined;
20
19
  class?: string | ((bag: HTMLElement) => string) | null | undefined;
21
20
  ref?: HTMLElement;
@@ -1,6 +1,10 @@
1
- <script lang="ts">import { provideDisabled } from "../hooks/use-disabled.js";
2
- const { disabled, children } = $props();
3
- provideDisabled(() => disabled ?? false);
1
+ <script lang="ts">
2
+ import { provideDisabled } from "../hooks/use-disabled.js"
3
+ import type { Snippet } from "svelte"
4
+
5
+ const { disabled, children }: { disabled?: boolean; children?: Snippet } = $props()
6
+
7
+ provideDisabled(() => disabled ?? false)
4
8
  </script>
5
9
 
6
10
  {@render children?.()}
@@ -1,26 +1,49 @@
1
- <script lang="ts" generics="TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue">import { mergePropsAdvanced, RenderFeatures } from "./render.js";
2
- import Generic from "./Generic.svelte";
3
- let {
4
- ourProps,
5
- theirProps,
6
- slots,
7
- slot = slots,
8
- defaultTag,
9
- features,
10
- visible = true,
11
- name,
12
- ref = $bindable(),
13
- value = $bindable(),
14
- checked = $bindable()
15
- } = $props();
16
- const featureFlags = $derived(features ?? RenderFeatures.None);
17
- const { static: isStatic = false, unmount = true, ...rest } = $derived(mergePropsAdvanced(theirProps, ourProps ?? {}));
18
- const render = $derived(
19
- visible || featureFlags & RenderFeatures.Static && isStatic || featureFlags & RenderFeatures.RenderStrategy && !unmount
20
- );
21
- const hiddenProps = $derived(
22
- !visible && !(featureFlags & RenderFeatures.Static) && featureFlags & RenderFeatures.RenderStrategy && !unmount ? { hidden: true, style: "display: none;" } : {}
23
- );
1
+ <script
2
+ lang="ts"
3
+ generics="TFeature extends RenderFeatures, TTag extends ElementType, TSlot extends Record<string, any>, TValue"
4
+ >
5
+ import type { ElementType, Props } from "./types.js"
6
+ import { mergePropsAdvanced, RenderFeatures, type PropsForFeatures } from "./render.js"
7
+ import Generic from "./Generic.svelte"
8
+
9
+ let {
10
+ ourProps,
11
+ theirProps,
12
+ slots,
13
+ slot = slots,
14
+ defaultTag,
15
+ features,
16
+ visible = true,
17
+ name,
18
+ ref = $bindable(),
19
+ value = $bindable(),
20
+ checked = $bindable(),
21
+ }: {
22
+ ourProps?: Expand<Props<any, TSlot> & PropsForFeatures<TFeature>>
23
+ theirProps: Expand<{ as?: TTag } & Props<any, TSlot, any>>
24
+ slot?: TSlot
25
+ slots?: TSlot
26
+ defaultTag: ElementType
27
+ features?: TFeature
28
+ visible?: boolean
29
+ name: string
30
+ ref?: HTMLElement
31
+ value?: TValue
32
+ checked?: boolean
33
+ } = $props()
34
+
35
+ const featureFlags = $derived(features ?? RenderFeatures.None)
36
+ const { static: isStatic = false, unmount = true, ...rest } = $derived(mergePropsAdvanced(theirProps, ourProps ?? {}))
37
+ const render = $derived(
38
+ visible ||
39
+ (featureFlags & RenderFeatures.Static && isStatic) ||
40
+ (featureFlags & RenderFeatures.RenderStrategy && !unmount)
41
+ )
42
+ const hiddenProps = $derived(
43
+ !visible && !(featureFlags & RenderFeatures.Static) && featureFlags & RenderFeatures.RenderStrategy && !unmount
44
+ ? { hidden: true, style: "display: none;" }
45
+ : {}
46
+ )
24
47
  </script>
25
48
 
26
49
  {#if render}<Generic {...rest} {...hiddenProps} {slot} tag={defaultTag} bind:ref bind:value bind:checked />{/if}
@@ -1,14 +1,13 @@
1
1
  import type { ElementType } from "./types.js";
2
2
  import { RenderFeatures } from "./render.js";
3
- declare class __sveltets_Render<TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue> {
3
+ declare class __sveltets_Render<TFeature extends RenderFeatures, TTag extends ElementType, TSlot extends Record<string, any>, TValue> {
4
4
  props(): {
5
5
  ourProps?: Expand<{
6
6
  [x: string]: any;
7
7
  [x: number]: any;
8
8
  } & {
9
- children?: import("svelte").Snippet<[{
10
- slot: TSlot;
11
- props: Record<string, any>;
9
+ children?: import("svelte").Snippet<[TSlot & {
10
+ props?: Record<string, any>;
12
11
  }]> | undefined;
13
12
  class?: string | ((bag: TSlot) => string) | null | undefined;
14
13
  ref?: HTMLElement;
@@ -23,9 +22,8 @@ declare class __sveltets_Render<TFeature extends RenderFeatures, TTag extends El
23
22
  } : {}) ? T_1 extends any ? (x: T_1) => any : never : never : never) extends (x: infer R) => any ? R : never>> | undefined;
24
23
  theirProps: {
25
24
  as?: TTag | undefined;
26
- children?: import("svelte").Snippet<[{
27
- slot: TSlot;
28
- props: Record<string, any>;
25
+ children?: import("svelte").Snippet<[TSlot & {
26
+ props?: Record<string, any>;
29
27
  }]> | undefined;
30
28
  class?: string | ((bag: TSlot) => string) | null | undefined;
31
29
  ref?: HTMLElement | undefined;
@@ -46,12 +44,12 @@ declare class __sveltets_Render<TFeature extends RenderFeatures, TTag extends El
46
44
  exports(): {};
47
45
  }
48
46
  interface $$IsomorphicComponent {
49
- 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
+ new <TFeature extends RenderFeatures, TTag extends ElementType, TSlot extends Record<string, any>, 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']>> & {
50
48
  $$bindings?: ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['bindings']>;
51
49
  } & ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['exports']>;
52
- <TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue>(internal: unknown, props: ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['props']> & {}): ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['exports']>;
50
+ <TFeature extends RenderFeatures, TTag extends ElementType, TSlot extends Record<string, any>, TValue>(internal: unknown, props: ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['props']> & {}): ReturnType<__sveltets_Render<TFeature, TTag, TSlot, TValue>['exports']>;
53
51
  z_$$bindings?: ReturnType<__sveltets_Render<any, any, any, any>['bindings']>;
54
52
  }
55
53
  declare const ElementOrComponent: $$IsomorphicComponent;
56
- type ElementOrComponent<TFeature extends RenderFeatures, TTag extends ElementType, TSlot, TValue> = InstanceType<typeof ElementOrComponent<TFeature, TTag, TSlot, TValue>>;
54
+ type ElementOrComponent<TFeature extends RenderFeatures, TTag extends ElementType, TSlot extends Record<string, any>, TValue> = InstanceType<typeof ElementOrComponent<TFeature, TTag, TSlot, TValue>>;
57
55
  export default ElementOrComponent;
@@ -1,24 +1,35 @@
1
- <script lang="ts" generics="TTag extends ElementType, TSlot, TValue">import { stateFromSlot } from "./state.js";
2
- let {
3
- slot = {},
4
- tag,
5
- ref = $bindable(),
6
- value = $bindable(),
7
- checked = $bindable(),
8
- children,
9
- as = tag,
10
- unmount,
11
- static: isStatic,
12
- ...props
13
- } = $props();
14
- const resolvedClass = $derived(
15
- typeof props.class === "function" ? props.class(slot) : props.class
16
- );
1
+ <script lang="ts" generics="TTag extends ElementType, TSlot extends Record<string, any>, TValue">
2
+ import { stateFromSlot } from "./state.js"
3
+ import type { ElementType, Props } from "./types.js"
4
+
5
+ let {
6
+ slot = {} as TSlot,
7
+ tag,
8
+ ref = $bindable(),
9
+ value = $bindable(),
10
+ checked = $bindable(),
11
+ children,
12
+ as = tag as TTag,
13
+ unmount,
14
+ static: isStatic,
15
+ ...props
16
+ }: {
17
+ as?: TTag
18
+ slot: TSlot
19
+ tag: ElementType
20
+ ref?: HTMLElement
21
+ value?: TValue
22
+ checked?: boolean
23
+ } & Props<TTag, TSlot> = $props()
24
+
25
+ const resolvedClass = $derived(
26
+ typeof props.class === "function" ? props.class(slot) : (props.class as string | undefined)
27
+ )
17
28
  </script>
18
29
 
19
30
  {#if as === "svelte:fragment"}
20
31
  {#if children}{@render children({
21
- slot,
32
+ ...slot,
22
33
  props: {
23
34
  ...props,
24
35
  ...(resolvedClass ? { class: resolvedClass } : {}),
@@ -28,11 +39,11 @@ const resolvedClass = $derived(
28
39
  {:else if children}
29
40
  {#if as === "select"}
30
41
  <select bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)} bind:value>
31
- {@render children({ slot, props: {} })}
42
+ {@render children(slot)}
32
43
  </select>
33
44
  {:else}
34
45
  <svelte:element this={as} bind:this={ref} {...props} class={resolvedClass} {...stateFromSlot(slot)}>
35
- {@render children({ slot, props: {} })}
46
+ {@render children(slot)}
36
47
  </svelte:element>
37
48
  {/if}
38
49
  {:else if as === "input" && props.type === "checkbox"}
@@ -1,5 +1,5 @@
1
1
  import type { ElementType } from "./types.js";
2
- declare class __sveltets_Render<TTag extends ElementType, TSlot, TValue> {
2
+ declare class __sveltets_Render<TTag extends ElementType, TSlot extends Record<string, any>, TValue> {
3
3
  props(): {
4
4
  as?: TTag | undefined;
5
5
  slot: TSlot;
@@ -8,9 +8,8 @@ declare class __sveltets_Render<TTag extends ElementType, TSlot, TValue> {
8
8
  value?: TValue | undefined;
9
9
  checked?: boolean;
10
10
  } & (Exclude<keyof import("./types.js").PropsOf<TTag>, "slot" | "as" | "children" | "class" | "ref"> extends infer T extends keyof import("./types.js").PropsOf<TTag> ? { [P in T]: import("./types.js").PropsOf<TTag>[P]; } : never) & {
11
- children?: import("svelte").Snippet<[{
12
- slot: TSlot;
13
- props: Record<string, any>;
11
+ children?: import("svelte").Snippet<[TSlot & {
12
+ props?: Record<string, any>;
14
13
  }]> | undefined;
15
14
  class?: string | ((bag: TSlot) => string) | null | undefined;
16
15
  ref?: HTMLElement;
@@ -21,12 +20,12 @@ declare class __sveltets_Render<TTag extends ElementType, TSlot, TValue> {
21
20
  exports(): {};
22
21
  }
23
22
  interface $$IsomorphicComponent {
24
- new <TTag extends ElementType, 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']>> & {
23
+ new <TTag extends ElementType, TSlot extends Record<string, any>, 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']>> & {
25
24
  $$bindings?: ReturnType<__sveltets_Render<TTag, TSlot, TValue>['bindings']>;
26
25
  } & ReturnType<__sveltets_Render<TTag, TSlot, TValue>['exports']>;
27
- <TTag extends ElementType, TSlot, TValue>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TSlot, TValue>['props']> & {}): ReturnType<__sveltets_Render<TTag, TSlot, TValue>['exports']>;
26
+ <TTag extends ElementType, TSlot extends Record<string, any>, TValue>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TSlot, TValue>['props']> & {}): ReturnType<__sveltets_Render<TTag, TSlot, TValue>['exports']>;
28
27
  z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
29
28
  }
30
29
  declare const Generic: $$IsomorphicComponent;
31
- type Generic<TTag extends ElementType, TSlot, TValue> = InstanceType<typeof Generic<TTag, TSlot, TValue>>;
30
+ type Generic<TTag extends ElementType, TSlot extends Record<string, any>, TValue> = InstanceType<typeof Generic<TTag, TSlot, TValue>>;
32
31
  export default Generic;
@@ -1,43 +1,61 @@
1
- <script lang="ts" module>import { useId } from "../hooks/use-id.js";
2
- import { getContext, setContext } from "svelte";
3
- function createCollection() {
4
- return {
5
- /** @type {Map<string, Map<string, number>>} */
6
- groups: /* @__PURE__ */ new Map(),
7
- get(group, key) {
8
- let list = this.groups.get(group);
9
- if (!list) {
10
- list = /* @__PURE__ */ new Map();
11
- this.groups.set(group, list);
12
- }
13
- let renders = list.get(key) ?? 0;
14
- list.set(key, renders + 1);
15
- let index = Array.from(list.keys()).indexOf(key);
16
- function release() {
17
- let renders2 = list.get(key);
18
- if (renders2 > 1) {
19
- list.set(key, renders2 - 1);
20
- } else {
21
- list.delete(key);
1
+ <script lang="ts" module>
2
+ import { useId } from "../hooks/use-id.js"
3
+ import { getContext, setContext, type Snippet } from "svelte"
4
+
5
+ type CollectionKey = string | symbol
6
+ type CollectionItem = [number, () => void]
7
+ type Collection = ReturnType<typeof createCollection>
8
+
9
+ function createCollection() {
10
+ return {
11
+ /** @type {Map<string, Map<string, number>>} */
12
+ groups: new Map(),
13
+
14
+ get(group: string, key: CollectionKey): CollectionItem {
15
+ let list = this.groups.get(group)
16
+ if (!list) {
17
+ list = new Map()
18
+ this.groups.set(group, list)
19
+ }
20
+
21
+ let renders = list.get(key) ?? 0
22
+ // FIXME: This is a side-effect during render. `release` is only called in
23
+ // an effect cleanup so we may never release if we had to render multiple
24
+ // times before commit e.g. when a sibling suspends.
25
+ list.set(key, renders + 1)
26
+
27
+ let index = Array.from(list.keys()).indexOf(key)
28
+ function release() {
29
+ let renders = list.get(key)
30
+ if (renders > 1) {
31
+ list.set(key, renders - 1)
32
+ } else {
33
+ list.delete(key)
34
+ }
22
35
  }
23
- }
24
- return [index, release];
36
+
37
+ return [index, release]
38
+ },
25
39
  }
26
- };
27
- }
28
- export function useStableCollectionIndex(group) {
29
- let collection = getContext("StableCollection");
30
- if (!collection) throw new Error("You must wrap your component in a <StableCollection>");
31
- let key = useId();
32
- let [idx, cleanupIdx] = collection.get(group, key);
33
- $effect(() => cleanupIdx);
34
- return idx;
35
- }
40
+ }
41
+
42
+ export function useStableCollectionIndex(group: string) {
43
+ let collection = getContext<Collection>("StableCollection")
44
+ if (!collection) throw new Error("You must wrap your component in a <StableCollection>")
45
+
46
+ let key = useId()
47
+ let [idx, cleanupIdx] = collection.get(group, key)
48
+
49
+ $effect(() => cleanupIdx)
50
+ return idx
51
+ }
36
52
  </script>
37
53
 
38
- <script lang="ts">const collection = createCollection();
39
- setContext("StableCollection", collection);
40
- let { children } = $props();
54
+ <script lang="ts">
55
+ const collection = createCollection()
56
+ setContext<Collection>("StableCollection", collection)
57
+
58
+ let { children }: { children: Snippet } = $props()
41
59
  </script>
42
60
 
43
61
  {#if children}{@render children()}{/if}
@@ -1,17 +1,32 @@
1
- <script lang="ts" module></script>
1
+ <script lang="ts" module>
2
+ import type { Snippet } from "svelte"
2
3
 
3
- <script lang="ts">import { setContext } from "svelte";
4
- import { useFloatingParentNodeId } from "./FloatingTree.svelte";
5
- const { children, id } = $props();
6
- const parentId = useFloatingParentNodeId();
7
- setContext("FloatingNodeContext", {
8
- get id() {
9
- return id;
10
- },
11
- get parentId() {
12
- return parentId.value;
4
+ export interface FloatingNodeProps {
5
+ children?: Snippet
6
+ id: string
13
7
  }
14
- });
8
+ </script>
9
+
10
+ <script lang="ts">
11
+ /**
12
+ * Provides parent node context for nested floating elements.
13
+ * @see https://floating-ui.com/docs/FloatingTree
14
+ */
15
+ import { setContext } from "svelte"
16
+ import type { FloatingNodeType } from "../types.js"
17
+ import { useFloatingParentNodeId } from "./FloatingTree.svelte"
18
+
19
+ const { children, id }: FloatingNodeProps = $props()
20
+
21
+ const parentId = useFloatingParentNodeId()
22
+ setContext<FloatingNodeType>("FloatingNodeContext", {
23
+ get id() {
24
+ return id
25
+ },
26
+ get parentId() {
27
+ return parentId.value
28
+ },
29
+ })
15
30
  </script>
16
31
 
17
32
  {#if children}{@render children()}{/if}
@@ -1,50 +1,94 @@
1
- <script lang="ts" module>import { getContext } from "svelte";
2
- import { useId } from "../hooks/useId.svelte.js";
3
- import { createPubSub } from "../utils/createPubSub.js";
4
- export const useFloatingParentNodeId = () => {
5
- const context = getContext("FloatingNodeContext");
6
- return {
7
- get value() {
8
- return context?.id ?? null;
1
+ <script lang="ts" module>
2
+ import { getContext, type Snippet } from "svelte"
3
+ import { useId } from "../hooks/useId.svelte.js"
4
+ import type { FloatingNodeType, FloatingTreeType, ReferenceType } from "../types.js"
5
+ import { createPubSub } from "../utils/createPubSub.js"
6
+ import type { MutableRefObject } from "../../../ref.svelte.js"
7
+
8
+ //const FloatingNodeContext = React.createContext<FloatingNodeType | null>(null)
9
+ //const FloatingTreeContext = React.createContext<FloatingTreeType | null>(null)
10
+
11
+ /**
12
+ * Returns the parent node id for nested floating elements, if available.
13
+ * Returns `null` for top-level floating elements.
14
+ */
15
+ export const useFloatingParentNodeId = (): { readonly value: string | null } => {
16
+ const context = getContext<FloatingNodeType>("FloatingNodeContext")
17
+ return {
18
+ get value() {
19
+ return context?.id ?? null
20
+ },
9
21
  }
10
- };
11
- };
12
- export const useFloatingTree = () => getContext("FloatingTreeContext") ?? null;
13
- export function useFloatingNodeId(options) {
14
- const { customParentId } = $derived(options);
15
- const id = useId();
16
- const tree = useFloatingTree();
17
- const reactParentId = useFloatingParentNodeId();
18
- const parentId = $derived(customParentId || reactParentId.value);
19
- $effect(() => {
20
- const node = { id, parentId };
21
- tree?.addNode(node);
22
- return () => {
23
- tree?.removeNode(node);
24
- };
25
- });
26
- return id;
27
- }
22
+ }
23
+
24
+ /**
25
+ * Returns the nearest floating tree context, if available.
26
+ */
27
+ export const useFloatingTree = <RT extends ReferenceType = ReferenceType>(): FloatingTreeType<RT> | null =>
28
+ getContext<FloatingTreeType<RT>>("FloatingTreeContext") ?? null
29
+
30
+ /**
31
+ * Registers a node into the `FloatingTree`, returning its id.
32
+ * @see https://floating-ui.com/docs/FloatingTree
33
+ */
34
+ export function useFloatingNodeId(options: { customParentId?: string }): string {
35
+ const { customParentId } = $derived(options)
36
+ const id = useId()
37
+ const tree = useFloatingTree()
38
+ const reactParentId = useFloatingParentNodeId()
39
+ const parentId = $derived(customParentId || reactParentId.value)
40
+
41
+ $effect(() => {
42
+ const node = { id, parentId }
43
+ tree?.addNode(node)
44
+ return () => {
45
+ tree?.removeNode(node)
46
+ }
47
+ }) //, [tree, id, parentId])
48
+
49
+ return id
50
+ }
51
+
52
+ export interface FloatingTreeProps {
53
+ children?: Snippet
54
+ }
28
55
  </script>
29
56
 
30
- <script lang="ts">import { setContext } from "svelte";
31
- const { children } = $props();
32
- const nodesRef = $state({ current: [] });
33
- const addNode = (node) => {
34
- nodesRef.current = [...nodesRef.current, node];
35
- };
36
- const removeNode = (node) => {
37
- nodesRef.current = nodesRef.current.filter((n) => n !== node);
38
- };
39
- const events = createPubSub();
40
- setContext("FloatingTreeContext", {
41
- get nodesRef() {
42
- return nodesRef;
43
- },
44
- addNode,
45
- removeNode,
46
- events
47
- });
57
+ <script lang="ts">
58
+ /**
59
+ * Provides context for nested floating elements when they are not children of
60
+ * each other on the DOM.
61
+ * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:
62
+ * - The `bubbles` option in the `useDismiss()` Hook
63
+ * - Nested virtual list navigation
64
+ * - Nested floating elements that each open on hover
65
+ * - Custom communication between parent and child floating elements
66
+ * @see https://floating-ui.com/docs/FloatingTree
67
+ */
68
+ import { setContext } from "svelte"
69
+
70
+ const { children }: FloatingTreeProps = $props()
71
+
72
+ const nodesRef = $state<MutableRefObject<Array<FloatingNodeType>>>({ current: [] })
73
+
74
+ const addNode = (node: FloatingNodeType) => {
75
+ nodesRef.current = [...nodesRef.current, node]
76
+ }
77
+
78
+ const removeNode = (node: FloatingNodeType) => {
79
+ nodesRef.current = nodesRef.current.filter((n) => n !== node)
80
+ }
81
+
82
+ const events = createPubSub()
83
+
84
+ setContext<FloatingTreeType<ReferenceType>>("FloatingTreeContext", {
85
+ get nodesRef() {
86
+ return nodesRef
87
+ },
88
+ addNode,
89
+ removeNode,
90
+ events,
91
+ })
48
92
  </script>
49
93
 
50
94
  {#if children}{@render children()}{/if}
@@ -7,14 +7,13 @@ export type Expand<T> = T extends infer O ? {
7
7
  export type PropsOf<TTag extends ElementType> = SvelteHTMLElements[TTag];
8
8
  type PropsWeControl = "as" | "children" | "class" | "ref" | "slot";
9
9
  type CleanProps<TTag extends ElementType, TOmittableProps extends PropertyKey = never> = Omit<PropsOf<TTag>, TOmittableProps | PropsWeControl>;
10
- type OurProps<TSlot> = {
11
- children?: Snippet<[{
12
- slot: TSlot;
13
- props: Record<string, any>;
10
+ type OurProps<TSlot extends Record<string, any>> = {
11
+ children?: Snippet<[TSlot & {
12
+ props?: Record<string, any>;
14
13
  }]>;
15
14
  class?: string | null | ((bag: TSlot) => string);
16
15
  ref?: HTMLElement;
17
16
  };
18
- export type Props<TTag extends ElementType, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = CleanProps<TTag, TOmittableProps | keyof Overrides> & OurProps<TSlot> & Overrides;
17
+ export type Props<TTag extends ElementType, TSlot extends Record<string, any> = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = CleanProps<TTag, TOmittableProps | keyof Overrides> & OurProps<TSlot> & Overrides;
19
18
  export type EnsureArray<T> = T extends any[] ? T : Expand<T>[];
20
19
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pzerelles/headlessui-svelte",
3
- "version": "2.1.2-next.31",
3
+ "version": "2.1.2-next.32",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./dist/index.d.ts",