@pzerelles/headlessui-svelte 2.1.2-next.61 → 2.1.2-next.62

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.
@@ -2,9 +2,9 @@
2
2
  import { disposables } from "../utils/disposables.js"
3
3
  import { objectToFormEntries } from "../utils/form.js"
4
4
  import FormResolver from "./FormResolver.svelte"
5
- import { hoistFormFields } from "./form-fields.svelte.js"
6
5
  import Hidden, { HiddenFeatures } from "./Hidden.svelte"
7
6
  import { compact } from "../utils/object.js"
7
+ import HoistFormFields from "./HoistFormFields.svelte"
8
8
 
9
9
  let {
10
10
  data,
@@ -20,7 +20,7 @@
20
20
  onReset?: (e: Event) => void
21
21
  } = $props()
22
22
 
23
- let form = $state<HTMLFormElement | null>(null)
23
+ let form = $state<HTMLFormElement>()
24
24
  const d = disposables()
25
25
 
26
26
  $effect(() => {
@@ -29,30 +29,25 @@
29
29
 
30
30
  return d.addEventListener(form, "reset", onReset)
31
31
  })
32
+ </script>
32
33
 
33
- const fields = $derived(
34
- objectToFormEntries(data).map(([name, value]) =>
35
- compact({
34
+ <HoistFormFields>
35
+ <FormResolver setForm={(value) => (form = value)} {formId} />
36
+ {#each objectToFormEntries(data) as [name, value]}
37
+ <Hidden
38
+ features={HiddenFeatures.Hidden}
39
+ {...compact({
36
40
  key: name,
37
41
  as: "input",
38
42
  type: "hidden",
43
+ hidden: true,
44
+ readOnly: true,
39
45
  form: formId,
40
46
  disabled,
41
47
  name,
42
48
  value,
43
49
  ...overrides,
44
- })
45
- )
46
- )
47
-
48
- const hoisted = hoistFormFields(formFields)
49
- </script>
50
-
51
- {#snippet formFields()}
52
- <FormResolver setForm={(value) => (form = value)} {formId} />
53
- {#each fields as props}
54
- <Hidden features={HiddenFeatures.Hidden} {...props} />
50
+ })}
51
+ />
55
52
  {/each}
56
- {/snippet}
57
-
58
- {#if !hoisted}{@render formFields()}{/if}
53
+ </HoistFormFields>
@@ -1,17 +1,23 @@
1
+ <script lang="ts" module>
2
+ export type FormFieldsContext = {
3
+ target: HTMLElement | undefined
4
+ }
5
+ </script>
6
+
1
7
  <script lang="ts">
2
- import type { Snippet } from "svelte"
8
+ import { setContext, type Snippet } from "svelte"
3
9
  import Hidden, { HiddenFeatures } from "./Hidden.svelte"
4
- import { createFormFieldsContext } from "./form-fields.svelte.js"
5
10
 
6
- const { children }: { children?: Snippet } = $props()
11
+ const { children }: { children: Snippet } = $props()
7
12
 
8
- const context = createFormFieldsContext()
9
- const { fields } = $derived(context)
13
+ let target = $state<HTMLElement>()
14
+ const context: FormFieldsContext = {
15
+ get target() {
16
+ return target
17
+ },
18
+ }
19
+ setContext("FormFieldsContext", context)
10
20
  </script>
11
21
 
12
- {#if children}{@render children()}{/if}
13
- <Hidden features={HiddenFeatures.Hidden}>
14
- {#each fields as field}
15
- {@render field()}
16
- {/each}
17
- </Hidden>
22
+ {@render children()}
23
+ <Hidden features={HiddenFeatures.Hidden} bind:element={target} />
@@ -1,6 +1,9 @@
1
- import type { Snippet } from "svelte";
1
+ export type FormFieldsContext = {
2
+ target: HTMLElement | undefined;
3
+ };
4
+ import { type Snippet } from "svelte";
2
5
  type $$ComponentProps = {
3
- children?: Snippet;
6
+ children: Snippet;
4
7
  };
5
8
  declare const FormFieldsProvider: import("svelte").Component<$$ComponentProps, {}, "">;
6
9
  type FormFieldsProvider = ReturnType<typeof FormFieldsProvider>;
@@ -21,9 +21,5 @@
21
21
  </script>
22
22
 
23
23
  {#if !formId}
24
- <Hidden asChild features={HiddenFeatures.Hidden}>
25
- {#snippet children({ props })}
26
- <input {...props} type="hidden" hidden readonly bind:this={element} />
27
- {/snippet}
28
- </Hidden>
24
+ <Hidden features={HiddenFeatures.Hidden} as="input" type="hidden" hidden readonly bind:element />
29
25
  {/if}
@@ -2,7 +2,6 @@
2
2
  import ElementOrComponent from "../utils/ElementOrComponent.svelte"
3
3
  import type { Props } from "../utils/types.js"
4
4
  import { HiddenFeatures } from "./HiddenFeatures.js"
5
- import type { SvelteHTMLElements } from "svelte/elements"
6
5
 
7
6
  export * from "./HiddenFeatures.js"
8
7
 
@@ -11,14 +10,19 @@
11
10
  export type HiddenRenderPropArg = {}
12
11
  type HiddenPropsWeControl = never
13
12
  export type HiddenProps = Props<
14
- typeof DEFAULT_VISUALLY_HIDDEN_TAG,
13
+ "input",
15
14
  HiddenRenderPropArg,
16
- { element?: HTMLElement; features?: HiddenFeatures }
15
+ { as?: string; element?: HTMLElement; features?: HiddenFeatures }
17
16
  >
18
17
  </script>
19
18
 
20
19
  <script lang="ts">
21
- let { element = $bindable(), features = HiddenFeatures.None, ...theirProps }: HiddenProps = $props()
20
+ let {
21
+ as = DEFAULT_VISUALLY_HIDDEN_TAG,
22
+ element = $bindable(),
23
+ features = HiddenFeatures.None,
24
+ ...theirProps
25
+ }: HiddenProps = $props()
22
26
 
23
27
  let ourProps = {
24
28
  "aria-hidden":
@@ -46,4 +50,4 @@
46
50
  }
47
51
  </script>
48
52
 
49
- <ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_VISUALLY_HIDDEN_TAG} name="Hidden" bind:element />
53
+ <ElementOrComponent {ourProps} {theirProps} defaultTag={as} name="Hidden" bind:element />
@@ -1,9 +1,9 @@
1
1
  import type { Props } from "../utils/types.js";
2
2
  import { HiddenFeatures } from "./HiddenFeatures.js";
3
3
  export * from "./HiddenFeatures.js";
4
- declare const DEFAULT_VISUALLY_HIDDEN_TAG: "span";
5
4
  export type HiddenRenderPropArg = {};
6
- export type HiddenProps = Props<typeof DEFAULT_VISUALLY_HIDDEN_TAG, HiddenRenderPropArg, {
5
+ export type HiddenProps = Props<"input", HiddenRenderPropArg, {
6
+ as?: string;
7
7
  element?: HTMLElement;
8
8
  features?: HiddenFeatures;
9
9
  }>;
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import { getContext, type Snippet } from "svelte"
3
+ import type { FormFieldsContext } from "./FormFieldsProvider.svelte"
4
+ import Portal from "./Portal.svelte"
5
+
6
+ const { children }: { children: Snippet } = $props()
7
+ const formFieldsContext = getContext<FormFieldsContext>("FormFieldsContext")
8
+ </script>
9
+
10
+ {#if !formFieldsContext}
11
+ {@render children()}
12
+ {:else if formFieldsContext.target}
13
+ <Portal target={formFieldsContext.target}>{@render children()}</Portal>
14
+ {/if}
@@ -0,0 +1,7 @@
1
+ import { type Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ };
5
+ declare const HoistFormFields: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type HoistFormFields = ReturnType<typeof HoistFormFields>;
7
+ export default HoistFormFields;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pzerelles/headlessui-svelte",
3
- "version": "2.1.2-next.61",
3
+ "version": "2.1.2-next.62",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run package",
@@ -33,37 +33,37 @@
33
33
  "svelte": "^5.16.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@changesets/cli": "^2.29.4",
36
+ "@changesets/cli": "^2.29.5",
37
37
  "@changesets/types": "^6.1.0",
38
- "@playwright/test": "^1.52.0",
39
- "@pzerelles/heroicons-svelte": "^2.2.1",
38
+ "@playwright/test": "^1.53.1",
39
+ "@pzerelles/heroicons-svelte": "^2.2.2",
40
40
  "@sveltejs/adapter-auto": "^3.3.1",
41
- "@sveltejs/kit": "^2.21.1",
42
- "@sveltejs/package": "^2.3.11",
43
- "@sveltejs/vite-plugin-svelte": "^5.0.3",
44
- "@tailwindcss/vite": "^4.1.8",
41
+ "@sveltejs/kit": "^2.22.2",
42
+ "@sveltejs/package": "^2.3.12",
43
+ "@sveltejs/vite-plugin-svelte": "^5.1.0",
44
+ "@tailwindcss/vite": "^4.1.10",
45
45
  "@testing-library/jest-dom": "^6.6.3",
46
46
  "@testing-library/svelte": "^5.2.8",
47
47
  "@types/eslint": "^9.6.1",
48
- "@types/node": "^22.15.29",
49
- "eslint": "^9.28.0",
48
+ "@types/node": "^22.15.33",
49
+ "eslint": "^9.29.0",
50
50
  "eslint-config-prettier": "^9.1.0",
51
51
  "eslint-plugin-svelte": "^2.46.1",
52
52
  "globals": "^16.2.0",
53
53
  "jsdom": "^25.0.1",
54
54
  "outdent": "^0.8.0",
55
- "prettier": "^3.5.3",
55
+ "prettier": "^3.6.1",
56
56
  "prettier-plugin-svelte": "^3.4.0",
57
- "prettier-plugin-tailwindcss": "^0.6.12",
57
+ "prettier-plugin-tailwindcss": "^0.6.13",
58
58
  "publint": "^0.3.12",
59
- "svelte": "^5.33.14",
60
- "svelte-check": "^4.2.1",
61
- "tailwindcss": "^4.1.8",
59
+ "svelte": "^5.34.8",
60
+ "svelte-check": "^4.2.2",
61
+ "tailwindcss": "^4.1.10",
62
62
  "tslib": "^2.8.1",
63
63
  "typescript": "^5.8.3",
64
- "typescript-eslint": "^8.33.1",
64
+ "typescript-eslint": "^8.35.0",
65
65
  "vite": "^6.3.5",
66
- "vitest": "^3.2.0"
66
+ "vitest": "^3.2.4"
67
67
  },
68
68
  "dependencies": {
69
69
  "@floating-ui/core": "^1.7.1",
@@ -1,10 +0,0 @@
1
- import { type Snippet } from "svelte";
2
- import { SvelteSet } from "svelte/reactivity";
3
- export type FormFieldsContext = {
4
- registerField: (field: Snippet) => () => void;
5
- };
6
- export declare const createFormFieldsContext: () => {
7
- registerField: (field: Snippet) => () => boolean;
8
- readonly fields: SvelteSet<Snippet<[]>>;
9
- };
10
- export declare const hoistFormFields: (fields: Snippet) => boolean;
@@ -1,23 +0,0 @@
1
- import { getContext, setContext } from "svelte";
2
- import { SvelteSet } from "svelte/reactivity";
3
- export const createFormFieldsContext = () => {
4
- const fields = new SvelteSet();
5
- const context = {
6
- registerField: (field) => {
7
- fields.add(field);
8
- return () => fields.delete(field);
9
- },
10
- get fields() {
11
- return fields;
12
- },
13
- };
14
- setContext("FormFieldsContext", context);
15
- return context;
16
- };
17
- export const hoistFormFields = (fields) => {
18
- const context = getContext("FormFieldsContext");
19
- if (!context)
20
- return false;
21
- $effect(() => context.registerField(fields));
22
- return true;
23
- };