@pzerelles/headlessui-svelte 2.1.2-next.45 → 2.1.2-next.47
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/disclosure/Disclosure.svelte +61 -0
- package/dist/disclosure/Disclosure.svelte.d.ts +14 -0
- package/dist/disclosure/DisclosureButton.svelte +191 -0
- package/dist/disclosure/DisclosureButton.svelte.d.ts +19 -0
- package/dist/disclosure/DisclosurePanel.svelte +98 -0
- package/dist/disclosure/DisclosurePanel.svelte.d.ts +16 -0
- package/dist/disclosure/context.svelte.d.ts +32 -0
- package/dist/disclosure/context.svelte.js +94 -0
- package/dist/disclosure/index.d.ts +3 -0
- package/dist/disclosure/index.js +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/internal/floating.svelte.d.ts +1 -1
- package/dist/utils/ElementOrComponent.svelte.d.ts +1 -1
- package/dist/utils/types.d.ts +2 -2
- package/package.json +16 -17
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
|
+
|
|
4
|
+
const DEFAULT_DISCLOSURE_TAG = "div" as const
|
|
5
|
+
export type DisclosureRenderPropArg = {
|
|
6
|
+
open: boolean
|
|
7
|
+
close: (focusableElement?: HTMLElement) => void
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type DisclosureOwnProps = {
|
|
11
|
+
defaultOpen?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type DisclosureProps = Props<typeof DEFAULT_DISCLOSURE_TAG, DisclosureRenderPropArg, DisclosureOwnProps>
|
|
15
|
+
|
|
16
|
+
export * from "./context.svelte.js"
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<script lang="ts">
|
|
20
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
21
|
+
import { createDisclosureAPIContext, createDisclosureContext, DisclosureStates } from "./context.svelte.js"
|
|
22
|
+
import { getOwnerDocument } from "../utils/owner.js"
|
|
23
|
+
import { createOpenClosedContext, State } from "../internal/open-closed.js"
|
|
24
|
+
import { createCloseContext } from "../internal/close-provider.js"
|
|
25
|
+
|
|
26
|
+
let { defaultOpen = false, ...theirProps }: DisclosureProps = $props()
|
|
27
|
+
|
|
28
|
+
const context = createDisclosureContext(defaultOpen)
|
|
29
|
+
const { buttonId, disclosureState } = $derived(context)
|
|
30
|
+
|
|
31
|
+
const close = (focusableElement?: HTMLElement) => {
|
|
32
|
+
context.closeDisclosure()
|
|
33
|
+
const ownerDocument = getOwnerDocument(undefined)
|
|
34
|
+
if (!ownerDocument) return
|
|
35
|
+
if (!buttonId) return
|
|
36
|
+
|
|
37
|
+
const restoreElement = (() => {
|
|
38
|
+
if (!focusableElement) return ownerDocument.getElementById(buttonId)
|
|
39
|
+
return focusableElement
|
|
40
|
+
})()
|
|
41
|
+
|
|
42
|
+
restoreElement?.focus()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
createDisclosureAPIContext(close)
|
|
46
|
+
|
|
47
|
+
const slot = $derived({
|
|
48
|
+
open: disclosureState === DisclosureStates.Open,
|
|
49
|
+
close,
|
|
50
|
+
} satisfies DisclosureRenderPropArg)
|
|
51
|
+
|
|
52
|
+
createOpenClosedContext({
|
|
53
|
+
get value() {
|
|
54
|
+
return disclosureState === DisclosureStates.Open ? State.Open : State.Closed
|
|
55
|
+
},
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
createCloseContext({ close })
|
|
59
|
+
</script>
|
|
60
|
+
|
|
61
|
+
<ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_DISCLOSURE_TAG} name="Disclosure" />
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
|
+
declare const DEFAULT_DISCLOSURE_TAG: "div";
|
|
3
|
+
export type DisclosureRenderPropArg = {
|
|
4
|
+
open: boolean;
|
|
5
|
+
close: (focusableElement?: HTMLElement) => void;
|
|
6
|
+
};
|
|
7
|
+
export type DisclosureOwnProps = {
|
|
8
|
+
defaultOpen?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type DisclosureProps = Props<typeof DEFAULT_DISCLOSURE_TAG, DisclosureRenderPropArg, DisclosureOwnProps>;
|
|
11
|
+
export * from "./context.svelte.js";
|
|
12
|
+
declare const Disclosure: import("svelte").Component<DisclosureProps, {}, "">;
|
|
13
|
+
type Disclosure = ReturnType<typeof Disclosure>;
|
|
14
|
+
export default Disclosure;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
|
+
|
|
4
|
+
const DEFAULT_BUTTON_TAG = "button" as const
|
|
5
|
+
export type ButtonRenderPropArg = {
|
|
6
|
+
open: boolean
|
|
7
|
+
hover: boolean
|
|
8
|
+
active: boolean
|
|
9
|
+
disabled: boolean
|
|
10
|
+
focus: boolean
|
|
11
|
+
autofocus: boolean
|
|
12
|
+
}
|
|
13
|
+
type ButtonPropsWeControl = "aria-controls" | "aria-expanded"
|
|
14
|
+
|
|
15
|
+
export type DisclosureButtonOwnProps = {
|
|
16
|
+
element?: HTMLButtonElement
|
|
17
|
+
disabled?: boolean
|
|
18
|
+
autofocus?: boolean
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type DisclosureButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, DisclosureButtonOwnProps>
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<script lang="ts">
|
|
25
|
+
import { useId } from "../hooks/use-id.js"
|
|
26
|
+
import { DisclosureStates, useDisclosureContext, useDisclosurePanelContext } from "./context.svelte.js"
|
|
27
|
+
import { onMount, untrack } from "svelte"
|
|
28
|
+
import { useHover } from "../hooks/use-hover.svelte.js"
|
|
29
|
+
import { useActivePress } from "../hooks/use-active-press.svelte.js"
|
|
30
|
+
import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
|
|
31
|
+
import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js"
|
|
32
|
+
import { mergeProps } from "../utils/render.js"
|
|
33
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
34
|
+
|
|
35
|
+
const internalId = useId()
|
|
36
|
+
let {
|
|
37
|
+
element = $bindable(),
|
|
38
|
+
id = `headlessui-disclosure-button-${internalId}`,
|
|
39
|
+
disabled = false,
|
|
40
|
+
autofocus = false,
|
|
41
|
+
...theirProps
|
|
42
|
+
}: DisclosureButtonProps = $props()
|
|
43
|
+
|
|
44
|
+
const context = useDisclosureContext("DisclosureButton")
|
|
45
|
+
const panelContext = useDisclosurePanelContext()
|
|
46
|
+
const isWithinPanel = $derived(!panelContext ? false : panelContext.panelId === context.panelId)
|
|
47
|
+
|
|
48
|
+
onMount(() => {
|
|
49
|
+
context.setButtonElement(element)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
$effect(() => {
|
|
53
|
+
if (isWithinPanel) return
|
|
54
|
+
;[id]
|
|
55
|
+
return untrack(() => {
|
|
56
|
+
context.setButtonId(id ?? undefined)
|
|
57
|
+
return () => {
|
|
58
|
+
context.setButtonId(undefined)
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
64
|
+
if (isWithinPanel) {
|
|
65
|
+
if (context.disclosureState === DisclosureStates.Closed) return
|
|
66
|
+
|
|
67
|
+
switch (event.key) {
|
|
68
|
+
case " ":
|
|
69
|
+
case "Enter":
|
|
70
|
+
event.preventDefault()
|
|
71
|
+
event.stopPropagation()
|
|
72
|
+
context.toggleDisclosure()
|
|
73
|
+
context.buttonElement?.focus()
|
|
74
|
+
break
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
switch (event.key) {
|
|
78
|
+
case " ":
|
|
79
|
+
case "Enter":
|
|
80
|
+
event.preventDefault()
|
|
81
|
+
event.stopPropagation()
|
|
82
|
+
context.toggleDisclosure()
|
|
83
|
+
break
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const handleKeyUp = (event: KeyboardEvent) => {
|
|
89
|
+
switch (event.key) {
|
|
90
|
+
case " ":
|
|
91
|
+
// Required for firefox, event.preventDefault() in handleKeyDown for
|
|
92
|
+
// the Space key doesn't cancel the handleKeyUp, which in turn
|
|
93
|
+
// triggers a *click*.
|
|
94
|
+
event.preventDefault()
|
|
95
|
+
break
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const handleClick = (event: MouseEvent) => {
|
|
100
|
+
//if (isDisabledReactIssue7711(event.currentTarget)) return
|
|
101
|
+
if (disabled) return
|
|
102
|
+
|
|
103
|
+
if (isWithinPanel) {
|
|
104
|
+
context.toggleDisclosure()
|
|
105
|
+
context.buttonElement?.focus()
|
|
106
|
+
} else {
|
|
107
|
+
context.toggleDisclosure()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const { isHovered: hover, hoverProps } = $derived(
|
|
112
|
+
useHover({
|
|
113
|
+
get disabled() {
|
|
114
|
+
return disabled
|
|
115
|
+
},
|
|
116
|
+
})
|
|
117
|
+
)
|
|
118
|
+
const { pressed: active, pressProps } = $derived(
|
|
119
|
+
useActivePress({
|
|
120
|
+
get disabled() {
|
|
121
|
+
return disabled
|
|
122
|
+
},
|
|
123
|
+
})
|
|
124
|
+
)
|
|
125
|
+
const { isFocusVisible: focus, focusProps } = $derived(
|
|
126
|
+
useFocusRing({
|
|
127
|
+
get autofocus() {
|
|
128
|
+
return autofocus
|
|
129
|
+
},
|
|
130
|
+
})
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
const slot = $derived({
|
|
134
|
+
open: context.disclosureState === DisclosureStates.Open,
|
|
135
|
+
hover,
|
|
136
|
+
active,
|
|
137
|
+
disabled,
|
|
138
|
+
focus,
|
|
139
|
+
autofocus,
|
|
140
|
+
} satisfies ButtonRenderPropArg)
|
|
141
|
+
|
|
142
|
+
const buttonType = useResolveButtonType({
|
|
143
|
+
get props() {
|
|
144
|
+
return { type: theirProps.type ?? undefined, as: DEFAULT_BUTTON_TAG }
|
|
145
|
+
},
|
|
146
|
+
get ref() {
|
|
147
|
+
return { current: context.buttonElement }
|
|
148
|
+
},
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
const ourProps = $derived(
|
|
152
|
+
isWithinPanel
|
|
153
|
+
? mergeProps(
|
|
154
|
+
{
|
|
155
|
+
type: buttonType.type,
|
|
156
|
+
disabled: disabled || undefined,
|
|
157
|
+
autofocus,
|
|
158
|
+
onkeydown: handleKeyDown,
|
|
159
|
+
onclick: handleClick,
|
|
160
|
+
},
|
|
161
|
+
focusProps,
|
|
162
|
+
hoverProps,
|
|
163
|
+
pressProps
|
|
164
|
+
)
|
|
165
|
+
: mergeProps(
|
|
166
|
+
{
|
|
167
|
+
id,
|
|
168
|
+
type: buttonType.type,
|
|
169
|
+
"aria-expanded": context.disclosureState === DisclosureStates.Open,
|
|
170
|
+
"aria-controls": context.panelElement ? context.panelId : undefined,
|
|
171
|
+
disabled: disabled || undefined,
|
|
172
|
+
autofocus,
|
|
173
|
+
onkeydown: handleKeyDown,
|
|
174
|
+
onkeyup: handleKeyUp,
|
|
175
|
+
onclick: handleClick,
|
|
176
|
+
},
|
|
177
|
+
focusProps,
|
|
178
|
+
hoverProps,
|
|
179
|
+
pressProps
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
</script>
|
|
183
|
+
|
|
184
|
+
<ElementOrComponent
|
|
185
|
+
{ourProps}
|
|
186
|
+
{theirProps}
|
|
187
|
+
slots={slot}
|
|
188
|
+
defaultTag={DEFAULT_BUTTON_TAG}
|
|
189
|
+
name="DisclosureButton"
|
|
190
|
+
bind:element
|
|
191
|
+
/>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
|
+
declare const DEFAULT_BUTTON_TAG: "button";
|
|
3
|
+
export type ButtonRenderPropArg = {
|
|
4
|
+
open: boolean;
|
|
5
|
+
hover: boolean;
|
|
6
|
+
active: boolean;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
focus: boolean;
|
|
9
|
+
autofocus: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type DisclosureButtonOwnProps = {
|
|
12
|
+
element?: HTMLButtonElement;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
autofocus?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type DisclosureButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, DisclosureButtonOwnProps>;
|
|
17
|
+
declare const DisclosureButton: import("svelte").Component<DisclosureButtonProps, {}, "element">;
|
|
18
|
+
type DisclosureButton = ReturnType<typeof DisclosureButton>;
|
|
19
|
+
export default DisclosureButton;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { RenderFeatures, type PropsForFeatures } from "../utils/render.js"
|
|
3
|
+
import type { Props } from "../utils/types.js"
|
|
4
|
+
|
|
5
|
+
const DEFAULT_PANEL_TAG = "div" as const
|
|
6
|
+
export type PanelRenderPropArg = {
|
|
7
|
+
open: boolean
|
|
8
|
+
close: (focusableElement?: HTMLElement) => void
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let PanelRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Static
|
|
12
|
+
|
|
13
|
+
export type DisclosurePanelOwnProps = {
|
|
14
|
+
element?: HTMLElement
|
|
15
|
+
transition?: boolean
|
|
16
|
+
} & PropsForFeatures<typeof PanelRenderFeatures>
|
|
17
|
+
|
|
18
|
+
export type DisclosurePanelProps = Props<typeof DEFAULT_PANEL_TAG, PanelRenderPropArg, DisclosurePanelOwnProps>
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<script lang="ts">
|
|
22
|
+
import { useId } from "../hooks/use-id.js"
|
|
23
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
24
|
+
import { mergeProps } from "../utils/render.js"
|
|
25
|
+
import TransitionChild from "../transition/TransitionChild.svelte"
|
|
26
|
+
import {
|
|
27
|
+
createDisclosurePanelContext,
|
|
28
|
+
DisclosureStates,
|
|
29
|
+
useDisclosureAPIContext,
|
|
30
|
+
useDisclosureContext,
|
|
31
|
+
} from "./context.svelte.js"
|
|
32
|
+
import { onMount, untrack } from "svelte"
|
|
33
|
+
import { clearOpenClosedContext, State, useOpenClosed } from "../internal/open-closed.js"
|
|
34
|
+
import { transitionDataAttributes, useTransition } from "../hooks/use-transition.svelte.js"
|
|
35
|
+
|
|
36
|
+
const internalId = useId()
|
|
37
|
+
let {
|
|
38
|
+
element = $bindable(),
|
|
39
|
+
id = `headlessui-disclosure-panel-${internalId}`,
|
|
40
|
+
transition = false,
|
|
41
|
+
...theirProps
|
|
42
|
+
}: DisclosurePanelProps = $props()
|
|
43
|
+
const context = useDisclosureContext("DisclosurePanel")
|
|
44
|
+
const { close } = useDisclosureAPIContext("DisclosurePanel")
|
|
45
|
+
|
|
46
|
+
onMount(() => {
|
|
47
|
+
context.setPanelElement(element)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
$effect(() => {
|
|
51
|
+
;[id]
|
|
52
|
+
return untrack(() => {
|
|
53
|
+
context.setPanelId(id ?? undefined)
|
|
54
|
+
return () => {
|
|
55
|
+
context.setPanelId(undefined)
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
const usesOpenClosedState = useOpenClosed()
|
|
61
|
+
const _transition = useTransition({
|
|
62
|
+
get enabled() {
|
|
63
|
+
return transition
|
|
64
|
+
},
|
|
65
|
+
get element() {
|
|
66
|
+
return element
|
|
67
|
+
},
|
|
68
|
+
get show() {
|
|
69
|
+
return usesOpenClosedState !== null
|
|
70
|
+
? (usesOpenClosedState.value & State.Open) === State.Open
|
|
71
|
+
: context.disclosureState === DisclosureStates.Open
|
|
72
|
+
},
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
const slot = $derived({
|
|
76
|
+
open: context.disclosureState === DisclosureStates.Open,
|
|
77
|
+
close,
|
|
78
|
+
} satisfies PanelRenderPropArg)
|
|
79
|
+
|
|
80
|
+
const ourProps = $derived({
|
|
81
|
+
id,
|
|
82
|
+
...transitionDataAttributes(_transition.data),
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
createDisclosurePanelContext(() => context.panelId)
|
|
86
|
+
clearOpenClosedContext()
|
|
87
|
+
</script>
|
|
88
|
+
|
|
89
|
+
<ElementOrComponent
|
|
90
|
+
{ourProps}
|
|
91
|
+
{theirProps}
|
|
92
|
+
slots={slot}
|
|
93
|
+
defaultTag={DEFAULT_PANEL_TAG}
|
|
94
|
+
features={PanelRenderFeatures}
|
|
95
|
+
visible={_transition.visible}
|
|
96
|
+
name="DisclosurePanel"
|
|
97
|
+
bind:element
|
|
98
|
+
/>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type PropsForFeatures } from "../utils/render.js";
|
|
2
|
+
import type { Props } from "../utils/types.js";
|
|
3
|
+
declare const DEFAULT_PANEL_TAG: "div";
|
|
4
|
+
export type PanelRenderPropArg = {
|
|
5
|
+
open: boolean;
|
|
6
|
+
close: (focusableElement?: HTMLElement) => void;
|
|
7
|
+
};
|
|
8
|
+
declare let PanelRenderFeatures: number;
|
|
9
|
+
export type DisclosurePanelOwnProps = {
|
|
10
|
+
element?: HTMLElement;
|
|
11
|
+
transition?: boolean;
|
|
12
|
+
} & PropsForFeatures<typeof PanelRenderFeatures>;
|
|
13
|
+
export type DisclosurePanelProps = Props<typeof DEFAULT_PANEL_TAG, PanelRenderPropArg, DisclosurePanelOwnProps>;
|
|
14
|
+
declare const DisclosurePanel: import("svelte").Component<DisclosurePanelProps, {}, "element">;
|
|
15
|
+
type DisclosurePanel = ReturnType<typeof DisclosurePanel>;
|
|
16
|
+
export default DisclosurePanel;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare enum DisclosureStates {
|
|
2
|
+
Open = 0,
|
|
3
|
+
Closed = 1
|
|
4
|
+
}
|
|
5
|
+
export interface StateDefinition {
|
|
6
|
+
disclosureState: DisclosureStates;
|
|
7
|
+
buttonElement?: HTMLButtonElement;
|
|
8
|
+
panelElement?: HTMLElement;
|
|
9
|
+
buttonId?: string;
|
|
10
|
+
panelId?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface StateActions {
|
|
13
|
+
toggleDisclosure(): void;
|
|
14
|
+
closeDisclosure(): void;
|
|
15
|
+
setButtonId(buttonId: string | undefined): void;
|
|
16
|
+
setPanelId(panelId: string | undefined): void;
|
|
17
|
+
setButtonElement(element: HTMLButtonElement | undefined): void;
|
|
18
|
+
setPanelElement(element: HTMLElement | undefined): void;
|
|
19
|
+
}
|
|
20
|
+
export type DisclosureContext = StateDefinition & StateActions;
|
|
21
|
+
export declare function createDisclosureContext(defaultOpen: boolean): DisclosureContext;
|
|
22
|
+
export declare function useDisclosureContext(component: string): DisclosureContext;
|
|
23
|
+
export interface DisclosureAPIContext {
|
|
24
|
+
close: (focusableElement?: HTMLElement) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function createDisclosureAPIContext(close: (focusableElement?: HTMLElement) => void): DisclosureAPIContext;
|
|
27
|
+
export declare function useDisclosureAPIContext(component: string): DisclosureAPIContext;
|
|
28
|
+
export interface DisclosurePanelContext {
|
|
29
|
+
panelId: string | undefined;
|
|
30
|
+
}
|
|
31
|
+
export declare function createDisclosurePanelContext(panelId: () => string | undefined): DisclosurePanelContext;
|
|
32
|
+
export declare function useDisclosurePanelContext(): DisclosurePanelContext | undefined;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { getContext, setContext } from "svelte";
|
|
2
|
+
export var DisclosureStates;
|
|
3
|
+
(function (DisclosureStates) {
|
|
4
|
+
DisclosureStates[DisclosureStates["Open"] = 0] = "Open";
|
|
5
|
+
DisclosureStates[DisclosureStates["Closed"] = 1] = "Closed";
|
|
6
|
+
})(DisclosureStates || (DisclosureStates = {}));
|
|
7
|
+
export function createDisclosureContext(defaultOpen) {
|
|
8
|
+
let disclosureState = $state(defaultOpen ? DisclosureStates.Open : DisclosureStates.Closed);
|
|
9
|
+
let buttonElement = $state();
|
|
10
|
+
let panelElement = $state();
|
|
11
|
+
let buttonId = $state();
|
|
12
|
+
let panelId = $state();
|
|
13
|
+
const context = {
|
|
14
|
+
get disclosureState() {
|
|
15
|
+
return disclosureState;
|
|
16
|
+
},
|
|
17
|
+
get buttonElement() {
|
|
18
|
+
return buttonElement;
|
|
19
|
+
},
|
|
20
|
+
get panelElement() {
|
|
21
|
+
return panelElement;
|
|
22
|
+
},
|
|
23
|
+
get buttonId() {
|
|
24
|
+
return buttonId;
|
|
25
|
+
},
|
|
26
|
+
get panelId() {
|
|
27
|
+
return panelId;
|
|
28
|
+
},
|
|
29
|
+
toggleDisclosure() {
|
|
30
|
+
disclosureState = disclosureState === DisclosureStates.Open ? DisclosureStates.Closed : DisclosureStates.Open;
|
|
31
|
+
},
|
|
32
|
+
closeDisclosure() {
|
|
33
|
+
if (disclosureState !== DisclosureStates.Closed)
|
|
34
|
+
disclosureState = DisclosureStates.Closed;
|
|
35
|
+
},
|
|
36
|
+
setButtonId(id) {
|
|
37
|
+
if (id !== buttonId)
|
|
38
|
+
buttonId = id;
|
|
39
|
+
},
|
|
40
|
+
setPanelId(id) {
|
|
41
|
+
if (id !== panelId)
|
|
42
|
+
panelId = id;
|
|
43
|
+
},
|
|
44
|
+
setButtonElement(element) {
|
|
45
|
+
if (element !== buttonElement)
|
|
46
|
+
buttonElement = element;
|
|
47
|
+
},
|
|
48
|
+
setPanelElement(element) {
|
|
49
|
+
if (element !== panelElement)
|
|
50
|
+
panelElement = element;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
setContext("DisclosureContext", context);
|
|
54
|
+
return context;
|
|
55
|
+
}
|
|
56
|
+
export function useDisclosureContext(component) {
|
|
57
|
+
const context = getContext("DisclosureContext");
|
|
58
|
+
if (!context) {
|
|
59
|
+
const err = new Error(`<${component} /> is missing a parent <Disclosure /> component.`);
|
|
60
|
+
if (Error.captureStackTrace)
|
|
61
|
+
Error.captureStackTrace(err, useDisclosureContext);
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
return context;
|
|
65
|
+
}
|
|
66
|
+
export function createDisclosureAPIContext(close) {
|
|
67
|
+
const context = {
|
|
68
|
+
close,
|
|
69
|
+
};
|
|
70
|
+
setContext("DisclosureAPIContext", context);
|
|
71
|
+
return context;
|
|
72
|
+
}
|
|
73
|
+
export function useDisclosureAPIContext(component) {
|
|
74
|
+
const context = getContext("DisclosureAPIContext");
|
|
75
|
+
if (!context) {
|
|
76
|
+
const err = new Error(`<${component} /> is missing a parent <Disclosure /> component.`);
|
|
77
|
+
if (Error.captureStackTrace)
|
|
78
|
+
Error.captureStackTrace(err, useDisclosureAPIContext);
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
return context;
|
|
82
|
+
}
|
|
83
|
+
export function createDisclosurePanelContext(panelId) {
|
|
84
|
+
const context = {
|
|
85
|
+
get panelId() {
|
|
86
|
+
return panelId();
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
setContext("DisclosurePanelContext", context);
|
|
90
|
+
return context;
|
|
91
|
+
}
|
|
92
|
+
export function useDisclosurePanelContext() {
|
|
93
|
+
return getContext("DisclosurePanelContext");
|
|
94
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { default as Disclosure, type DisclosureProps, type DisclosureRenderPropArg as DisclosureSlot, type DisclosureOwnProps, } from "./Disclosure.svelte";
|
|
2
|
+
export { default as DisclosureButton, type DisclosureButtonProps, type ButtonRenderPropArg as DisclosureButtonSlot, type DisclosureButtonOwnProps, } from "./DisclosureButton.svelte";
|
|
3
|
+
export { default as DisclosurePanel, type DisclosurePanelProps, type PanelRenderPropArg as DisclosurePanelSlot, type DisclosurePanelOwnProps, } from "./DisclosurePanel.svelte";
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * from "./close-button/index.js";
|
|
|
4
4
|
export * from "./data-interactive/index.js";
|
|
5
5
|
export * from "./description/index.js";
|
|
6
6
|
export * from "./dialog/index.js";
|
|
7
|
+
export * from "./disclosure/index.js";
|
|
7
8
|
export * from "./field/index.js";
|
|
8
9
|
export * from "./fieldset/index.js";
|
|
9
10
|
export * from "./input/index.js";
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export * from "./close-button/index.js";
|
|
|
4
4
|
export * from "./data-interactive/index.js";
|
|
5
5
|
export * from "./description/index.js";
|
|
6
6
|
export * from "./dialog/index.js";
|
|
7
|
+
export * from "./disclosure/index.js";
|
|
7
8
|
export * from "./field/index.js";
|
|
8
9
|
export * from "./fieldset/index.js";
|
|
9
10
|
export * from "./input/index.js";
|
|
@@ -59,7 +59,7 @@ export declare function useFloatingReference(): {
|
|
|
59
59
|
export declare function useFloatingReferenceProps(): {
|
|
60
60
|
readonly getReferenceProps: (userProps?: import("svelte/elements.js").HTMLAttributes<Element>) => Record<string, unknown>;
|
|
61
61
|
};
|
|
62
|
-
export declare function useFloatingPanelProps(): (userProps?: import("svelte/elements.js").HTMLAttributes<HTMLElement>
|
|
62
|
+
export declare function useFloatingPanelProps(): (...args: Parameters<(userProps?: import("svelte/elements.js").HTMLAttributes<HTMLElement>) => Record<string, unknown>>) => Record<string, unknown> & {
|
|
63
63
|
"data-anchor": Placement | "top end" | "top start" | "right end" | "right start" | "bottom end" | "bottom start" | "left end" | "left start" | "selection" | "selection end" | "selection start" | undefined;
|
|
64
64
|
};
|
|
65
65
|
export declare function useFloatingPanel(options?: {
|
|
@@ -7,7 +7,7 @@ declare class __sveltets_Render<TFeature extends RenderFeatures, TSlot extends R
|
|
|
7
7
|
children?: import("svelte").Snippet<[TSlot & {
|
|
8
8
|
props?: Record<string, any>;
|
|
9
9
|
}]> | undefined;
|
|
10
|
-
class?:
|
|
10
|
+
class?: import("svelte/elements.js").ClassValue | ((bag: TSlot) => string) | null | undefined;
|
|
11
11
|
} & Expand<((TFeature extends RenderFeatures.Static ? {
|
|
12
12
|
static?: boolean;
|
|
13
13
|
} : {}) extends infer T ? T extends (TFeature extends RenderFeatures.Static ? {
|
package/dist/utils/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
|
-
import type { SvelteHTMLElements } from "svelte/elements";
|
|
2
|
+
import type { ClassValue, SvelteHTMLElements } from "svelte/elements";
|
|
3
3
|
export type Expand<T> = T extends infer O ? {
|
|
4
4
|
[K in keyof O]: O[K];
|
|
5
5
|
} : never;
|
|
@@ -8,7 +8,7 @@ export type Props<TTag extends string | Record<string, any>, TSlot extends Recor
|
|
|
8
8
|
children?: Snippet<[TSlot & {
|
|
9
9
|
props?: Record<string, any>;
|
|
10
10
|
}]>;
|
|
11
|
-
class?:
|
|
11
|
+
class?: ClassValue | null | ((bag: TSlot) => string);
|
|
12
12
|
} & Overrides;
|
|
13
13
|
export type PropsAsChild<TSlot extends Record<string, any> = {}, Overrides = {}> = {
|
|
14
14
|
children?: Snippet<[TSlot & {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pzerelles/headlessui-svelte",
|
|
3
|
-
"version": "2.1.2-next.
|
|
3
|
+
"version": "2.1.2-next.47",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite dev",
|
|
6
6
|
"build": "vite build && npm run package",
|
|
@@ -29,49 +29,48 @@
|
|
|
29
29
|
"!dist/**/*.spec.*"
|
|
30
30
|
],
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"svelte": "^5.
|
|
32
|
+
"svelte": "^5.16.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@changesets/cli": "^2.28.1",
|
|
36
36
|
"@changesets/types": "^6.1.0",
|
|
37
|
-
"@playwright/test": "^1.
|
|
37
|
+
"@playwright/test": "^1.51.1",
|
|
38
38
|
"@pzerelles/heroicons-svelte": "^2.2.0",
|
|
39
39
|
"@sveltejs/adapter-auto": "^3.3.1",
|
|
40
|
-
"@sveltejs/kit": "^2.
|
|
40
|
+
"@sveltejs/kit": "^2.20.1",
|
|
41
41
|
"@sveltejs/package": "^2.3.10",
|
|
42
42
|
"@sveltejs/vite-plugin-svelte": "^5.0.3",
|
|
43
43
|
"@testing-library/jest-dom": "^6.6.3",
|
|
44
44
|
"@testing-library/svelte": "^5.2.7",
|
|
45
45
|
"@types/eslint": "^9.6.1",
|
|
46
|
-
"@types/node": "^22.13.
|
|
47
|
-
"autoprefixer": "^10.4.
|
|
48
|
-
"eslint": "^9.
|
|
46
|
+
"@types/node": "^22.13.10",
|
|
47
|
+
"autoprefixer": "^10.4.21",
|
|
48
|
+
"eslint": "^9.22.0",
|
|
49
49
|
"eslint-config-prettier": "^9.1.0",
|
|
50
50
|
"eslint-plugin-svelte": "^2.46.1",
|
|
51
51
|
"globals": "^16.0.0",
|
|
52
52
|
"jsdom": "^25.0.1",
|
|
53
53
|
"outdent": "^0.8.0",
|
|
54
54
|
"postcss": "^8.5.3",
|
|
55
|
-
"prettier": "^3.5.
|
|
55
|
+
"prettier": "^3.5.3",
|
|
56
56
|
"prettier-plugin-svelte": "^3.3.3",
|
|
57
57
|
"prettier-plugin-tailwindcss": "^0.6.11",
|
|
58
|
-
"publint": "^0.3.
|
|
59
|
-
"svelte": "^5.
|
|
60
|
-
"svelte-check": "^4.1.
|
|
58
|
+
"publint": "^0.3.9",
|
|
59
|
+
"svelte": "^5.23.2",
|
|
60
|
+
"svelte-check": "^4.1.5",
|
|
61
61
|
"tailwindcss": "^3.4.17",
|
|
62
62
|
"tslib": "^2.8.1",
|
|
63
|
-
"typescript": "^5.
|
|
64
|
-
"typescript-eslint": "^8.
|
|
65
|
-
"vite": "^6.
|
|
66
|
-
"vitest": "^3.0.
|
|
63
|
+
"typescript": "^5.8.2",
|
|
64
|
+
"typescript-eslint": "^8.26.1",
|
|
65
|
+
"vite": "^6.2.2",
|
|
66
|
+
"vitest": "^3.0.9"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"@floating-ui/core": "^1.6.9",
|
|
70
70
|
"@floating-ui/dom": "^1.6.13",
|
|
71
71
|
"@floating-ui/utils": "^0.2.9",
|
|
72
|
-
"clsx": "^2.1.1",
|
|
73
72
|
"esm-env": "^1.2.2",
|
|
74
|
-
"nanoid": "^5.1.
|
|
73
|
+
"nanoid": "^5.1.5"
|
|
75
74
|
},
|
|
76
75
|
"svelte": "./dist/index.js",
|
|
77
76
|
"types": "./dist/index.d.ts",
|