@pzerelles/headlessui-svelte 2.0.0-next.1
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/README.md +58 -0
- package/dist/actions/activePress.svelte.d.ts +8 -0
- package/dist/actions/activePress.svelte.js +84 -0
- package/dist/actions/focusRing.svelte.d.ts +9 -0
- package/dist/actions/focusRing.svelte.js +34 -0
- package/dist/checkbox/Checkbox.svelte +114 -0
- package/dist/checkbox/Checkbox.svelte.d.ts +48 -0
- package/dist/checkbox/index.d.ts +1 -0
- package/dist/checkbox/index.js +1 -0
- package/dist/description/Description.svelte +53 -0
- package/dist/description/Description.svelte.d.ts +39 -0
- package/dist/description/index.d.ts +1 -0
- package/dist/description/index.js +1 -0
- package/dist/field/Field.svelte +33 -0
- package/dist/field/Field.svelte.d.ts +33 -0
- package/dist/field/index.d.ts +1 -0
- package/dist/field/index.js +1 -0
- package/dist/fieldset/Fieldset.svelte +32 -0
- package/dist/fieldset/Fieldset.svelte.d.ts +33 -0
- package/dist/fieldset/index.d.ts +1 -0
- package/dist/fieldset/index.js +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/internal/FormFields.svelte +44 -0
- package/dist/internal/FormFields.svelte.d.ts +22 -0
- package/dist/internal/FormResolver.svelte +25 -0
- package/dist/internal/FormResolver.svelte.d.ts +19 -0
- package/dist/internal/Hidden.svelte +36 -0
- package/dist/internal/Hidden.svelte.d.ts +26 -0
- package/dist/internal/HoistFormFields.svelte +11 -0
- package/dist/internal/HoistFormFields.svelte.d.ts +18 -0
- package/dist/internal/Portal.svelte +17 -0
- package/dist/internal/Portal.svelte.d.ts +19 -0
- package/dist/label/Label.svelte +99 -0
- package/dist/label/Label.svelte.d.ts +41 -0
- package/dist/label/index.d.ts +1 -0
- package/dist/label/index.js +1 -0
- package/dist/legend/Legend.svelte +7 -0
- package/dist/legend/Legend.svelte.d.ts +18 -0
- package/dist/legend/index.d.ts +1 -0
- package/dist/legend/index.js +1 -0
- package/dist/utils/disabled.d.ts +3 -0
- package/dist/utils/disabled.js +2 -0
- package/dist/utils/disposables.d.ts +24 -0
- package/dist/utils/disposables.js +78 -0
- package/dist/utils/dom.d.ts +3 -0
- package/dist/utils/dom.js +10 -0
- package/dist/utils/focusVisible.svelte.d.ts +50 -0
- package/dist/utils/focusVisible.svelte.js +278 -0
- package/dist/utils/form.d.ts +4 -0
- package/dist/utils/form.js +57 -0
- package/dist/utils/id.d.ts +4 -0
- package/dist/utils/id.js +6 -0
- package/dist/utils/isVirtualEvent.d.ts +2 -0
- package/dist/utils/isVirtualEvent.js +48 -0
- package/dist/utils/microTask.d.ts +1 -0
- package/dist/utils/microTask.js +13 -0
- package/dist/utils/object.d.ts +1 -0
- package/dist/utils/object.js +8 -0
- package/dist/utils/platform.d.ts +4 -0
- package/dist/utils/platform.js +29 -0
- package/dist/utils/state.d.ts +1 -0
- package/dist/utils/state.js +20 -0
- package/package.json +69 -0
package/README.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# create-svelte
|
|
2
|
+
|
|
3
|
+
Everything you need to build a Svelte library, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte).
|
|
4
|
+
|
|
5
|
+
Read more about creating a library [in the docs](https://kit.svelte.dev/docs/packaging).
|
|
6
|
+
|
|
7
|
+
## Creating a project
|
|
8
|
+
|
|
9
|
+
If you're seeing this, you've probably already done this step. Congrats!
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# create a new project in the current directory
|
|
13
|
+
npm create svelte@latest
|
|
14
|
+
|
|
15
|
+
# create a new project in my-app
|
|
16
|
+
npm create svelte@latest my-app
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Developing
|
|
20
|
+
|
|
21
|
+
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm run dev
|
|
25
|
+
|
|
26
|
+
# or start the server and open the app in a new browser tab
|
|
27
|
+
npm run dev -- --open
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app.
|
|
31
|
+
|
|
32
|
+
## Building
|
|
33
|
+
|
|
34
|
+
To build your library:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run package
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
To create a production version of your showcase app:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm run build
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
You can preview the production build with `npm run preview`.
|
|
47
|
+
|
|
48
|
+
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
|
|
49
|
+
|
|
50
|
+
## Publishing
|
|
51
|
+
|
|
52
|
+
Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)).
|
|
53
|
+
|
|
54
|
+
To publish your library to [npm](https://www.npmjs.com):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm publish
|
|
58
|
+
```
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="svelte" />
|
|
2
|
+
import type { Action } from "svelte/action";
|
|
3
|
+
export declare const createActivePress: ({ disabled }: {
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
}) => {
|
|
6
|
+
activePressAction: Action<HTMLElement, undefined, Record<never, any>>;
|
|
7
|
+
readonly pressed: boolean;
|
|
8
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { disposables } from "../utils/disposables.js";
|
|
2
|
+
import { getOwnerDocument } from "../utils/dom.js";
|
|
3
|
+
function pointerRectFromPointerEvent(event) {
|
|
4
|
+
// Center of the pointer geometry
|
|
5
|
+
let offsetX = event.width / 2;
|
|
6
|
+
let offsetY = event.height / 2;
|
|
7
|
+
return {
|
|
8
|
+
top: event.clientY - offsetY,
|
|
9
|
+
right: event.clientX + offsetX,
|
|
10
|
+
bottom: event.clientY + offsetY,
|
|
11
|
+
left: event.clientX - offsetX,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function areRectsOverlapping(a, b) {
|
|
15
|
+
if (!a || !b) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (a.right < b.left || a.left > b.right) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (a.bottom < b.top || a.top > b.bottom) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
export const createActivePress = ({ disabled }) => {
|
|
27
|
+
let currentTarget = $state(null);
|
|
28
|
+
let pressed = $state(false);
|
|
29
|
+
const activePressAction = (node) => {
|
|
30
|
+
const d = disposables();
|
|
31
|
+
const reset = () => {
|
|
32
|
+
currentTarget = null;
|
|
33
|
+
pressed = false;
|
|
34
|
+
d.dispose();
|
|
35
|
+
};
|
|
36
|
+
const handlePointerDown = (event) => {
|
|
37
|
+
d.dispose(); // Cancel any scheduled tasks
|
|
38
|
+
if (currentTarget !== null)
|
|
39
|
+
return;
|
|
40
|
+
// Keep track of the current element
|
|
41
|
+
currentTarget = event.currentTarget;
|
|
42
|
+
// We are definitely pressing the element now
|
|
43
|
+
pressed = true;
|
|
44
|
+
// Setup global handlers to catch events on elements that are not the current element
|
|
45
|
+
{
|
|
46
|
+
let owner = getOwnerDocument(event.currentTarget);
|
|
47
|
+
// `pointerup` on any element means that we are no longer pressing the current element
|
|
48
|
+
d.addEventListener(owner, "pointerup", reset, false);
|
|
49
|
+
// `pointerleave` isn't called consistently (if at all) on iOS Safari, so we use `pointermove` instead
|
|
50
|
+
// to determine if we are still "pressing". We also compare the pointer position to the target element
|
|
51
|
+
// so that we can tell if the pointer is still over the element or not.
|
|
52
|
+
d.addEventListener(owner, "pointermove", (event) => {
|
|
53
|
+
if (currentTarget) {
|
|
54
|
+
let pointerRect = pointerRectFromPointerEvent(event);
|
|
55
|
+
pressed = areRectsOverlapping(pointerRect, currentTarget.getBoundingClientRect());
|
|
56
|
+
}
|
|
57
|
+
}, false);
|
|
58
|
+
// Whenever the browser decides to fire a `pointercancel` event, we should abort
|
|
59
|
+
d.addEventListener(owner, "pointercancel", reset, false);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
if (!disabled) {
|
|
63
|
+
node.addEventListener("pointerdown", handlePointerDown);
|
|
64
|
+
node.addEventListener("pointerup", reset);
|
|
65
|
+
node.addEventListener("click", reset);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
destroy: () => {
|
|
69
|
+
if (!disabled) {
|
|
70
|
+
node.removeEventListener("pointerdown", handlePointerDown);
|
|
71
|
+
node.removeEventListener("pointerup", reset);
|
|
72
|
+
node.removeEventListener("click", reset);
|
|
73
|
+
}
|
|
74
|
+
d.dispose();
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
activePressAction,
|
|
80
|
+
get pressed() {
|
|
81
|
+
return pressed;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="svelte" />
|
|
2
|
+
import type { Action } from "svelte/action";
|
|
3
|
+
export declare const createFocusRing: ({ autoFocus, within }?: {
|
|
4
|
+
autoFocus?: boolean;
|
|
5
|
+
within?: boolean;
|
|
6
|
+
}) => {
|
|
7
|
+
focusRingAction: Action<HTMLElement, undefined, Record<never, any>>;
|
|
8
|
+
readonly focusVisible: boolean;
|
|
9
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { isFocusVisible, useFocusVisibleListener } from "../utils/focusVisible.svelte.js";
|
|
2
|
+
export const createFocusRing = ({ autoFocus = false, within } = {}) => {
|
|
3
|
+
let focused = $state(false);
|
|
4
|
+
let focusVisible = $state(autoFocus || isFocusVisible());
|
|
5
|
+
useFocusVisibleListener((isFocusVisible) => {
|
|
6
|
+
focusVisible = isFocusVisible;
|
|
7
|
+
});
|
|
8
|
+
const focusRingAction = (node) => {
|
|
9
|
+
const handleFocus = (e) => {
|
|
10
|
+
focused = true;
|
|
11
|
+
};
|
|
12
|
+
const handleBlur = (e) => {
|
|
13
|
+
focused = false;
|
|
14
|
+
};
|
|
15
|
+
if (!within) {
|
|
16
|
+
node.addEventListener("focus", handleFocus);
|
|
17
|
+
node.addEventListener("blur", handleBlur);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
destroy: () => {
|
|
21
|
+
if (!within) {
|
|
22
|
+
node.removeEventListener("focus", handleFocus);
|
|
23
|
+
node.removeEventListener("blur", handleBlur);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
focusRingAction,
|
|
30
|
+
get focusVisible() {
|
|
31
|
+
return focusVisible && focused;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<script lang="ts" context="module">const DEFAULT_CHECKBOX_TAG = "div";
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<script lang="ts" generics="TTag extends keyof SvelteHTMLElements, TType">import { tick } from "svelte";
|
|
5
|
+
import { createHover } from "svelte-interactions";
|
|
6
|
+
import { attemptSubmit } from "../utils/form.js";
|
|
7
|
+
import { getIdContext, htmlid } from "../utils/id.js";
|
|
8
|
+
import { createActivePress } from "../actions/activePress.svelte.js";
|
|
9
|
+
import { createFocusRing } from "../actions/focusRing.svelte.js";
|
|
10
|
+
import FormFields from "../internal/FormFields.svelte";
|
|
11
|
+
import { getLabelContext } from "../label/Label.svelte";
|
|
12
|
+
import { getDisabledContext } from "../utils/disabled.js";
|
|
13
|
+
import { stateFromSlot } from "../utils/state.js";
|
|
14
|
+
const internalId = htmlid();
|
|
15
|
+
const providedId = getIdContext();
|
|
16
|
+
const providedDisabled = getDisabledContext();
|
|
17
|
+
let {
|
|
18
|
+
id = providedId || `headlessui-checkbox-${internalId}`,
|
|
19
|
+
as,
|
|
20
|
+
value,
|
|
21
|
+
disabled: ownDisabled = false,
|
|
22
|
+
indeterminate = false,
|
|
23
|
+
defaultChecked,
|
|
24
|
+
checked = $bindable(defaultChecked ?? false),
|
|
25
|
+
autoFocus,
|
|
26
|
+
form,
|
|
27
|
+
name,
|
|
28
|
+
onchange,
|
|
29
|
+
children,
|
|
30
|
+
...theirProps
|
|
31
|
+
} = $props();
|
|
32
|
+
const disabled = $derived(providedDisabled?.disabled || ownDisabled);
|
|
33
|
+
const { hoverAction: hover, isHovered } = $derived(createHover({ isDisabled: disabled }));
|
|
34
|
+
const ap = $derived(createActivePress({ disabled }));
|
|
35
|
+
const fr = createFocusRing({ autoFocus });
|
|
36
|
+
const labelContext = getLabelContext();
|
|
37
|
+
const labelledBy = $derived(labelContext?.labelledBy);
|
|
38
|
+
let changing = $state(false);
|
|
39
|
+
const toggle = () => {
|
|
40
|
+
changing = true;
|
|
41
|
+
checked = !checked;
|
|
42
|
+
onchange?.(checked);
|
|
43
|
+
tick().then(() => {
|
|
44
|
+
changing = false;
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
const handleClick = (event) => {
|
|
48
|
+
if (disabled)
|
|
49
|
+
return event.preventDefault();
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
toggle();
|
|
52
|
+
};
|
|
53
|
+
const handleKeyUp = (event) => {
|
|
54
|
+
if (event.key === " ") {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
toggle();
|
|
57
|
+
} else if (event.key === "Enter") {
|
|
58
|
+
if (event.currentTarget)
|
|
59
|
+
attemptSubmit(event.currentTarget);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const handleKeyPress = (event) => event.preventDefault();
|
|
63
|
+
const slot = $derived({
|
|
64
|
+
checked,
|
|
65
|
+
changing,
|
|
66
|
+
focus: fr.focusVisible,
|
|
67
|
+
active: ap.pressed,
|
|
68
|
+
hover: $isHovered,
|
|
69
|
+
autofocus: autoFocus ?? false,
|
|
70
|
+
disabled,
|
|
71
|
+
indeterminate
|
|
72
|
+
});
|
|
73
|
+
const states = $derived(
|
|
74
|
+
Object.entries(slot).filter(([, value2]) => value2).map(([key]) => key)
|
|
75
|
+
);
|
|
76
|
+
const ownProps = $derived({
|
|
77
|
+
id,
|
|
78
|
+
role: "checkbox",
|
|
79
|
+
"aria-checked": indeterminate ? "mixed" : checked ? true : false,
|
|
80
|
+
"aria-labelledby": labelledBy,
|
|
81
|
+
"aria-describedby": void 0,
|
|
82
|
+
"aria-disabled": disabled ? true : void 0,
|
|
83
|
+
tabindex: disabled ? void 0 : 0,
|
|
84
|
+
onkeyup: disabled ? void 0 : handleKeyUp,
|
|
85
|
+
onkeypress: disabled ? void 0 : handleKeyPress,
|
|
86
|
+
onclick: disabled ? void 0 : handleClick,
|
|
87
|
+
...stateFromSlot(slot)
|
|
88
|
+
});
|
|
89
|
+
const reset = $derived(() => {
|
|
90
|
+
if (defaultChecked === void 0)
|
|
91
|
+
return;
|
|
92
|
+
return onchange?.(defaultChecked);
|
|
93
|
+
});
|
|
94
|
+
</script>
|
|
95
|
+
|
|
96
|
+
{#if name}
|
|
97
|
+
<FormFields
|
|
98
|
+
{disabled}
|
|
99
|
+
data={{ [name]: value || "on" }}
|
|
100
|
+
overrides={{ type: "checkbox", checked }}
|
|
101
|
+
{form}
|
|
102
|
+
onReset={reset}
|
|
103
|
+
/>
|
|
104
|
+
{/if}
|
|
105
|
+
<svelte:element
|
|
106
|
+
this={as ?? DEFAULT_CHECKBOX_TAG}
|
|
107
|
+
use:hover
|
|
108
|
+
use:ap.activePressAction
|
|
109
|
+
use:fr.focusRingAction
|
|
110
|
+
{...ownProps}
|
|
111
|
+
{...theirProps}
|
|
112
|
+
>
|
|
113
|
+
{#if children}{@render children(slot)}{/if}
|
|
114
|
+
</svelte:element>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { SvelteHTMLElements } from "svelte/elements";
|
|
2
|
+
export type CheckboxProps<TType = string, TTag extends keyof SvelteHTMLElements = typeof DEFAULT_CHECKBOX_TAG> = SvelteHTMLElements[TTag] & {
|
|
3
|
+
as?: TTag;
|
|
4
|
+
value?: TType;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
indeterminate?: boolean;
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
defaultChecked?: boolean;
|
|
9
|
+
autoFocus?: boolean;
|
|
10
|
+
form?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
onchange?: (checked: boolean) => void;
|
|
13
|
+
children?: Snippet<[
|
|
14
|
+
{
|
|
15
|
+
checked: boolean;
|
|
16
|
+
changing: boolean;
|
|
17
|
+
focus: boolean;
|
|
18
|
+
active: boolean;
|
|
19
|
+
hover: boolean;
|
|
20
|
+
autofocus: boolean;
|
|
21
|
+
disabled: boolean;
|
|
22
|
+
indeterminate: boolean;
|
|
23
|
+
}
|
|
24
|
+
]>;
|
|
25
|
+
};
|
|
26
|
+
declare const DEFAULT_CHECKBOX_TAG: "div";
|
|
27
|
+
import { type Snippet } from "svelte";
|
|
28
|
+
declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements, TType> {
|
|
29
|
+
props(): CheckboxProps<TType, TTag>;
|
|
30
|
+
events(): {} & {
|
|
31
|
+
[evt: string]: CustomEvent<any>;
|
|
32
|
+
};
|
|
33
|
+
slots(): {};
|
|
34
|
+
bindings(): "checked";
|
|
35
|
+
exports(): {};
|
|
36
|
+
}
|
|
37
|
+
interface $$IsomorphicComponent {
|
|
38
|
+
new <TTag extends keyof SvelteHTMLElements, TType>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag, TType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag, TType>['props']>, ReturnType<__sveltets_Render<TTag, TType>['events']>, ReturnType<__sveltets_Render<TTag, TType>['slots']>> & {
|
|
39
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag, TType>['bindings']>;
|
|
40
|
+
} & ReturnType<__sveltets_Render<TTag, TType>['exports']>;
|
|
41
|
+
<TTag extends keyof SvelteHTMLElements, TType>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TType>['props']> & {
|
|
42
|
+
$$events?: ReturnType<__sveltets_Render<TTag, TType>['events']>;
|
|
43
|
+
}): ReturnType<__sveltets_Render<TTag, TType>['exports']>;
|
|
44
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
|
|
45
|
+
}
|
|
46
|
+
declare const Checkbox: $$IsomorphicComponent;
|
|
47
|
+
type Checkbox<TTag extends keyof SvelteHTMLElements, TType> = InstanceType<typeof Checkbox<TTag, TType>>;
|
|
48
|
+
export default Checkbox;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Checkbox, type CheckboxProps } from "./Checkbox.svelte";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Checkbox } from "./Checkbox.svelte";
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts" context="module">import { getContext, setContext, untrack } from "svelte";
|
|
2
|
+
const DEFAULT_DESCRIPTION_TAG = "p";
|
|
3
|
+
export const createDescriptionContext = () => {
|
|
4
|
+
let describedBy = $state();
|
|
5
|
+
setContext("Description", {
|
|
6
|
+
get describedBy() {
|
|
7
|
+
return describedBy;
|
|
8
|
+
},
|
|
9
|
+
register(id) {
|
|
10
|
+
describedBy = untrack(() => describedBy === void 0 ? id : `${describedBy} ${id}`.trim());
|
|
11
|
+
},
|
|
12
|
+
unregister(id) {
|
|
13
|
+
describedBy = untrack(
|
|
14
|
+
() => describedBy?.split(" ").filter((value) => value !== id).join(" ")
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
export const getDescriptionContext = () => getContext("Description");
|
|
20
|
+
const validateDescriptionContext = () => {
|
|
21
|
+
const context = getDescriptionContext();
|
|
22
|
+
if (context === void 0) {
|
|
23
|
+
const err = new Error("You used a <Description /> component, but it is not inside a relevant parent.");
|
|
24
|
+
if (Error.captureStackTrace)
|
|
25
|
+
Error.captureStackTrace(err, validateDescriptionContext);
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
return context;
|
|
29
|
+
};
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<script lang="ts" generics="TTag extends keyof SvelteHTMLElements">import { htmlid } from "../utils/id.js";
|
|
33
|
+
import { stateFromSlot } from "../utils/state.js";
|
|
34
|
+
import { getDisabledContext } from "../utils/disabled.js";
|
|
35
|
+
const internalId = htmlid();
|
|
36
|
+
const providedDisabled = getDisabledContext();
|
|
37
|
+
let { as, id = `headlessui-description-${internalId}`, children, ...theirProps } = $props();
|
|
38
|
+
const context = validateDescriptionContext();
|
|
39
|
+
$effect(() => {
|
|
40
|
+
context.register(id);
|
|
41
|
+
const registeredId = id;
|
|
42
|
+
return () => {
|
|
43
|
+
context.unregister(registeredId);
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
const disabled = $derived(providedDisabled?.disabled || false);
|
|
47
|
+
const slot = $derived({ disabled });
|
|
48
|
+
const ourProps = $derived({ id, ...stateFromSlot(slot) });
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<svelte:element this={as ?? DEFAULT_DESCRIPTION_TAG} {...ourProps} {...theirProps}>
|
|
52
|
+
{#if children}{@render children(slot)}{/if}
|
|
53
|
+
</svelte:element>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SvelteHTMLElements } from "svelte/elements";
|
|
2
|
+
import { type Snippet } from "svelte";
|
|
3
|
+
export type DescriptionProps<TTag extends keyof SvelteHTMLElements = typeof DEFAULT_DESCRIPTION_TAG> = SvelteHTMLElements[TTag] & {
|
|
4
|
+
as?: TTag;
|
|
5
|
+
children?: Snippet<[
|
|
6
|
+
{
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
]>;
|
|
10
|
+
};
|
|
11
|
+
declare const DEFAULT_DESCRIPTION_TAG: "p";
|
|
12
|
+
export type DescriptionContext = {
|
|
13
|
+
describedBy?: string;
|
|
14
|
+
register: (id: string) => void;
|
|
15
|
+
unregister: (id: string) => void;
|
|
16
|
+
};
|
|
17
|
+
export declare const createDescriptionContext: () => void;
|
|
18
|
+
export declare const getDescriptionContext: () => DescriptionContext;
|
|
19
|
+
declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements> {
|
|
20
|
+
props(): DescriptionProps<TTag>;
|
|
21
|
+
events(): {} & {
|
|
22
|
+
[evt: string]: CustomEvent<any>;
|
|
23
|
+
};
|
|
24
|
+
slots(): {};
|
|
25
|
+
bindings(): "";
|
|
26
|
+
exports(): {};
|
|
27
|
+
}
|
|
28
|
+
interface $$IsomorphicComponent {
|
|
29
|
+
new <TTag extends keyof SvelteHTMLElements>(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']>> & {
|
|
30
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
31
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
32
|
+
<TTag extends keyof SvelteHTMLElements>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
33
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
34
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
35
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
36
|
+
}
|
|
37
|
+
declare const Description: $$IsomorphicComponent;
|
|
38
|
+
type Description<TTag extends keyof SvelteHTMLElements> = InstanceType<typeof Description<TTag>>;
|
|
39
|
+
export default Description;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Description, type DescriptionProps } from "./Description.svelte";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Description } from "./Description.svelte";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts" context="module">const DEFAULT_FIELD_TAG = "div";
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<script lang="ts" generics="TTag extends keyof SvelteHTMLElements">import { createDescriptionContext } from "../description/Description.svelte";
|
|
5
|
+
import { createLabelContext } from "../label/Label.svelte";
|
|
6
|
+
import { getDisabledContext } from "../utils/disabled.js";
|
|
7
|
+
import { createIdContext } from "../utils/id.js";
|
|
8
|
+
import { stateFromSlot } from "../utils/state.js";
|
|
9
|
+
import { nanoid } from "nanoid";
|
|
10
|
+
import { setContext } from "svelte";
|
|
11
|
+
let { as, disabled: ownDisabled = false, children, ...theirProps } = $props();
|
|
12
|
+
const inputId = `headlessui-control-${nanoid(8)}`;
|
|
13
|
+
createIdContext(inputId);
|
|
14
|
+
createLabelContext();
|
|
15
|
+
createDescriptionContext();
|
|
16
|
+
const providedDisabled = getDisabledContext();
|
|
17
|
+
const disabled = $derived(providedDisabled?.disabled || ownDisabled);
|
|
18
|
+
setContext("Disabled", {
|
|
19
|
+
get disabled() {
|
|
20
|
+
return disabled;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
const slot = $derived({ disabled });
|
|
24
|
+
const ourProps = $derived({
|
|
25
|
+
disabled: disabled || void 0,
|
|
26
|
+
"aria-disabled": disabled || void 0,
|
|
27
|
+
...stateFromSlot(slot)
|
|
28
|
+
});
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<svelte:element this={as ?? DEFAULT_FIELD_TAG} {...ourProps} {...theirProps}>
|
|
32
|
+
{#if children}{@render children(slot)}{/if}
|
|
33
|
+
</svelte:element>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SvelteHTMLElements } from "svelte/elements";
|
|
2
|
+
export type FieldProps<TTag extends keyof SvelteHTMLElements = typeof DEFAULT_FIELD_TAG> = SvelteHTMLElements[TTag] & {
|
|
3
|
+
as?: TTag;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
children?: Snippet<[
|
|
6
|
+
{
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
]>;
|
|
10
|
+
};
|
|
11
|
+
declare const DEFAULT_FIELD_TAG: "div";
|
|
12
|
+
import { type Snippet } from "svelte";
|
|
13
|
+
declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements> {
|
|
14
|
+
props(): FieldProps<TTag>;
|
|
15
|
+
events(): {} & {
|
|
16
|
+
[evt: string]: CustomEvent<any>;
|
|
17
|
+
};
|
|
18
|
+
slots(): {};
|
|
19
|
+
bindings(): "";
|
|
20
|
+
exports(): {};
|
|
21
|
+
}
|
|
22
|
+
interface $$IsomorphicComponent {
|
|
23
|
+
new <TTag extends keyof SvelteHTMLElements>(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']>> & {
|
|
24
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
25
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
26
|
+
<TTag extends keyof SvelteHTMLElements>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
27
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
28
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
29
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
30
|
+
}
|
|
31
|
+
declare const Field: $$IsomorphicComponent;
|
|
32
|
+
type Field<TTag extends keyof SvelteHTMLElements> = InstanceType<typeof Field<TTag>>;
|
|
33
|
+
export default Field;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Field, type FieldProps } from "./Field.svelte";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Field } from "./Field.svelte";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script lang="ts" context="module">const DEFAULT_FIELDSET_TAG = "fieldset";
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<script lang="ts" generics="TTag extends keyof SvelteHTMLElements">import { setContext } from "svelte";
|
|
5
|
+
import { getDisabledContext } from "../utils/disabled.js";
|
|
6
|
+
import { createLabelContext } from "../label/Label.svelte";
|
|
7
|
+
let { as, disabled: ownDisabled = false, children, ...theirProps } = $props();
|
|
8
|
+
const providedDisabled = getDisabledContext();
|
|
9
|
+
const disabled = $derived(providedDisabled?.disabled || ownDisabled);
|
|
10
|
+
setContext("Disabled", {
|
|
11
|
+
get disabled() {
|
|
12
|
+
return disabled;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const tag = $state(as ?? DEFAULT_FIELDSET_TAG);
|
|
16
|
+
const labelContext = createLabelContext();
|
|
17
|
+
const slot = $derived({ disabled });
|
|
18
|
+
const ourProps = $derived(
|
|
19
|
+
tag === "fieldset" ? {
|
|
20
|
+
"aria-labelledby": labelContext.labelledBy,
|
|
21
|
+
disabled: disabled || void 0
|
|
22
|
+
} : {
|
|
23
|
+
role: "group",
|
|
24
|
+
"aria-labelledby": labelContext.labelledBy,
|
|
25
|
+
"aria-disabled": disabled || void 0
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<svelte:element this={tag} {...ourProps} {...theirProps}>
|
|
31
|
+
{#if children}{@render children(slot)}{/if}
|
|
32
|
+
</svelte:element>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SvelteHTMLElements } from "svelte/elements";
|
|
2
|
+
export type FieldsetProps<TTag extends keyof SvelteHTMLElements = typeof DEFAULT_FIELDSET_TAG> = SvelteHTMLElements[TTag] & {
|
|
3
|
+
as?: TTag;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
children?: Snippet<[
|
|
6
|
+
{
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
]>;
|
|
10
|
+
};
|
|
11
|
+
declare const DEFAULT_FIELDSET_TAG: "fieldset";
|
|
12
|
+
import { type Snippet } from "svelte";
|
|
13
|
+
declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements> {
|
|
14
|
+
props(): FieldsetProps<TTag>;
|
|
15
|
+
events(): {} & {
|
|
16
|
+
[evt: string]: CustomEvent<any>;
|
|
17
|
+
};
|
|
18
|
+
slots(): {};
|
|
19
|
+
bindings(): "";
|
|
20
|
+
exports(): {};
|
|
21
|
+
}
|
|
22
|
+
interface $$IsomorphicComponent {
|
|
23
|
+
new <TTag extends keyof SvelteHTMLElements>(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']>> & {
|
|
24
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
25
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
26
|
+
<TTag extends keyof SvelteHTMLElements>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
27
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
28
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
29
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
30
|
+
}
|
|
31
|
+
declare const Fieldset: $$IsomorphicComponent;
|
|
32
|
+
type Fieldset<TTag extends keyof SvelteHTMLElements> = InstanceType<typeof Fieldset<TTag>>;
|
|
33
|
+
export default Fieldset;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Fieldset, type FieldsetProps } from "./Fieldset.svelte";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Fieldset } from "./Fieldset.svelte";
|
package/dist/index.d.ts
ADDED