@pzerelles/headlessui-svelte 2.1.1-next.1 → 2.1.2-next.2

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 (174) hide show
  1. package/dist/button/Button.svelte +6 -10
  2. package/dist/button/Button.svelte.d.ts +34 -26
  3. package/dist/checkbox/Checkbox.svelte +40 -22
  4. package/dist/checkbox/Checkbox.svelte.d.ts +44 -28
  5. package/dist/close-button/CloseButton.svelte +5 -4
  6. package/dist/close-button/CloseButton.svelte.d.ts +36 -13
  7. package/dist/combobox/Combobox.svelte +2 -2
  8. package/dist/combobox/Combobox.svelte.d.ts +9 -9
  9. package/dist/data-interactive/DataInteractive.svelte +41 -0
  10. package/dist/data-interactive/DataInteractive.svelte.d.ts +39 -0
  11. package/dist/data-interactive/index.d.ts +1 -0
  12. package/dist/data-interactive/index.js +1 -0
  13. package/dist/description/Description.svelte +10 -53
  14. package/dist/description/Description.svelte.d.ts +15 -32
  15. package/dist/description/context.svelte.d.ts +17 -0
  16. package/dist/description/context.svelte.js +51 -0
  17. package/dist/dialog/Dialog.svelte +51 -0
  18. package/dist/dialog/Dialog.svelte.d.ts +60 -0
  19. package/dist/dialog/DialogBackdrop.svelte +39 -0
  20. package/dist/dialog/DialogBackdrop.svelte.d.ts +38 -0
  21. package/dist/dialog/DialogPanel.svelte +46 -0
  22. package/dist/dialog/DialogPanel.svelte.d.ts +40 -0
  23. package/dist/dialog/DialogTitle.svelte +29 -0
  24. package/dist/dialog/DialogTitle.svelte.d.ts +34 -0
  25. package/dist/dialog/InternalDialog.svelte +233 -0
  26. package/dist/dialog/InternalDialog.svelte.d.ts +42 -0
  27. package/dist/dialog/context.svelte.d.ts +15 -0
  28. package/dist/dialog/context.svelte.js +16 -0
  29. package/dist/dialog/index.d.ts +4 -0
  30. package/dist/dialog/index.js +4 -0
  31. package/dist/field/Field.svelte +8 -10
  32. package/dist/field/Field.svelte.d.ts +21 -17
  33. package/dist/fieldset/Fieldset.svelte +11 -9
  34. package/dist/fieldset/Fieldset.svelte.d.ts +21 -17
  35. package/dist/focus-trap/FocusTrap.svelte +332 -0
  36. package/dist/focus-trap/FocusTrap.svelte.d.ts +58 -0
  37. package/dist/hooks/use-controllable.svelte.d.ts +1 -1
  38. package/dist/hooks/use-controllable.svelte.js +3 -3
  39. package/dist/hooks/use-escape.svelte.d.ts +5 -0
  40. package/dist/hooks/use-escape.svelte.js +26 -0
  41. package/dist/hooks/use-event-listener.svelte.d.ts +6 -0
  42. package/dist/hooks/use-event-listener.svelte.js +12 -0
  43. package/dist/hooks/use-inert-others.svelte.d.ts +2 -2
  44. package/dist/hooks/use-inert-others.svelte.js +3 -3
  45. package/dist/hooks/use-is-mounted.svelte.d.ts +3 -0
  46. package/dist/hooks/use-is-mounted.svelte.js +14 -0
  47. package/dist/hooks/use-is-touch-device.svelte.d.ts +3 -0
  48. package/dist/hooks/use-is-touch-device.svelte.js +20 -0
  49. package/dist/hooks/use-root-containers.svelte.d.ts +9 -0
  50. package/dist/hooks/use-root-containers.svelte.js +50 -0
  51. package/dist/hooks/use-tab-direction.svelte.d.ts +7 -0
  52. package/dist/hooks/use-tab-direction.svelte.js +25 -0
  53. package/dist/hooks/use-transition.svelte.js +14 -13
  54. package/dist/hooks/use-tree-walker.svelte.d.ts +8 -0
  55. package/dist/hooks/use-tree-walker.svelte.js +19 -0
  56. package/dist/hooks/use-watch.svelte.d.ts +4 -0
  57. package/dist/hooks/use-watch.svelte.js +16 -0
  58. package/dist/hooks/use-window-event.svelte.d.ts +6 -0
  59. package/dist/hooks/use-window-event.svelte.js +12 -0
  60. package/dist/index.d.ts +9 -0
  61. package/dist/index.js +9 -0
  62. package/dist/input/Input.svelte +59 -0
  63. package/dist/input/Input.svelte.d.ts +52 -0
  64. package/dist/input/index.d.ts +1 -0
  65. package/dist/input/index.js +1 -0
  66. package/dist/internal/FocusSentinel.svelte.d.ts +4 -1
  67. package/dist/internal/ForcePortalRoot.svelte +6 -0
  68. package/dist/internal/ForcePortalRoot.svelte.d.ts +22 -0
  69. package/dist/internal/FormFields.svelte.d.ts +4 -1
  70. package/dist/internal/FormResolver.svelte.d.ts +4 -1
  71. package/dist/internal/Hidden.svelte +5 -9
  72. package/dist/internal/Hidden.svelte.d.ts +17 -10
  73. package/dist/internal/HoistFormFields.svelte.d.ts +4 -1
  74. package/dist/internal/MainTreeProvider.svelte +45 -0
  75. package/dist/internal/MainTreeProvider.svelte.d.ts +31 -0
  76. package/dist/internal/Portal.svelte.d.ts +4 -1
  77. package/dist/internal/close-provider.d.ts +7 -0
  78. package/dist/internal/close-provider.js +7 -0
  79. package/dist/internal/floating.svelte.d.ts +13 -8
  80. package/dist/internal/floating.svelte.js +197 -186
  81. package/dist/internal/id.d.ts +1 -1
  82. package/dist/internal/open-closed.d.ts +1 -1
  83. package/dist/internal/open-closed.js +1 -1
  84. package/dist/label/Label.svelte +12 -61
  85. package/dist/label/Label.svelte.d.ts +19 -32
  86. package/dist/label/context.svelte.d.ts +17 -0
  87. package/dist/label/context.svelte.js +56 -0
  88. package/dist/legend/Legend.svelte +4 -3
  89. package/dist/legend/Legend.svelte.d.ts +33 -15
  90. package/dist/listbox/Listbox.svelte +6 -9
  91. package/dist/listbox/Listbox.svelte.d.ts +29 -10
  92. package/dist/listbox/ListboxButton.svelte +6 -8
  93. package/dist/listbox/ListboxButton.svelte.d.ts +18 -7
  94. package/dist/listbox/ListboxOption.svelte +4 -6
  95. package/dist/listbox/ListboxOption.svelte.d.ts +22 -11
  96. package/dist/listbox/ListboxOptions.svelte +21 -19
  97. package/dist/listbox/ListboxOptions.svelte.d.ts +23 -7
  98. package/dist/listbox/ListboxSelectedOption.svelte +17 -7
  99. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +23 -13
  100. package/dist/menu/Menu.svelte +235 -0
  101. package/dist/menu/Menu.svelte.d.ts +42 -0
  102. package/dist/menu/MenuButton.svelte +127 -0
  103. package/dist/menu/MenuButton.svelte.d.ts +52 -0
  104. package/dist/menu/MenuHeading.svelte +19 -0
  105. package/dist/menu/MenuHeading.svelte.d.ts +39 -0
  106. package/dist/menu/MenuItem.svelte +114 -0
  107. package/dist/menu/MenuItem.svelte.d.ts +49 -0
  108. package/dist/menu/MenuItems.svelte +244 -0
  109. package/dist/menu/MenuItems.svelte.d.ts +55 -0
  110. package/dist/menu/MenuSection.svelte +14 -0
  111. package/dist/menu/MenuSection.svelte.d.ts +35 -0
  112. package/dist/menu/MenuSeparator.svelte +9 -0
  113. package/dist/menu/MenuSeparator.svelte.d.ts +35 -0
  114. package/dist/menu/context.svelte.d.ts +47 -0
  115. package/dist/menu/context.svelte.js +21 -0
  116. package/dist/menu/index.d.ts +7 -0
  117. package/dist/menu/index.js +7 -0
  118. package/dist/portal/InternalPortal.svelte +22 -33
  119. package/dist/portal/InternalPortal.svelte.d.ts +16 -7
  120. package/dist/portal/Portal.svelte +4 -8
  121. package/dist/portal/Portal.svelte.d.ts +6 -6
  122. package/dist/portal/PortalGroup.svelte +5 -6
  123. package/dist/portal/PortalGroup.svelte.d.ts +16 -7
  124. package/dist/switch/Switch.svelte +11 -17
  125. package/dist/switch/Switch.svelte.d.ts +23 -6
  126. package/dist/switch/SwitchGroup.svelte +7 -8
  127. package/dist/switch/SwitchGroup.svelte.d.ts +14 -7
  128. package/dist/tabs/Tab.svelte +9 -14
  129. package/dist/tabs/Tab.svelte.d.ts +18 -6
  130. package/dist/tabs/TabGroup.svelte +20 -23
  131. package/dist/tabs/TabGroup.svelte.d.ts +19 -6
  132. package/dist/tabs/TabList.svelte +5 -7
  133. package/dist/tabs/TabList.svelte.d.ts +13 -6
  134. package/dist/tabs/TabPanel.svelte +30 -32
  135. package/dist/tabs/TabPanel.svelte.d.ts +19 -6
  136. package/dist/tabs/TabPanels.svelte +5 -6
  137. package/dist/tabs/TabPanels.svelte.d.ts +13 -6
  138. package/dist/transition/InternalTransitionChild.svelte +178 -0
  139. package/dist/transition/InternalTransitionChild.svelte.d.ts +55 -0
  140. package/dist/transition/Transition.svelte +89 -0
  141. package/dist/transition/Transition.svelte.d.ts +42 -0
  142. package/dist/transition/TransitionChild.svelte +16 -0
  143. package/dist/transition/TransitionChild.svelte.d.ts +44 -0
  144. package/dist/transition/context.svelte.d.ts +64 -0
  145. package/dist/transition/context.svelte.js +120 -0
  146. package/dist/transition/index.d.ts +2 -0
  147. package/dist/transition/index.js +2 -0
  148. package/dist/utils/ElementOrComponent.svelte +26 -0
  149. package/dist/utils/ElementOrComponent.svelte.d.ts +56 -0
  150. package/dist/utils/Generic.svelte +44 -0
  151. package/dist/utils/Generic.svelte.d.ts +35 -0
  152. package/dist/utils/StableCollection.svelte +1 -1
  153. package/dist/utils/StableCollection.svelte.d.ts +4 -1
  154. package/dist/utils/active-element-history.d.ts +1 -0
  155. package/dist/utils/active-element-history.js +35 -0
  156. package/dist/utils/alternative-types.d.ts +21 -0
  157. package/dist/utils/alternative-types.js +1 -0
  158. package/dist/utils/class-names.d.ts +1 -0
  159. package/dist/utils/class-names.js +10 -0
  160. package/dist/utils/focus-management.d.ts +2 -1
  161. package/dist/utils/focus-management.js +13 -13
  162. package/dist/utils/on-document-ready.d.ts +1 -0
  163. package/dist/utils/on-document-ready.js +12 -0
  164. package/dist/utils/render.d.ts +3 -0
  165. package/dist/utils/render.js +63 -0
  166. package/dist/utils/state.d.ts +7 -1
  167. package/dist/utils/state.js +10 -6
  168. package/dist/utils/types.d.ts +14 -17
  169. package/dist/utils/types.js +0 -5
  170. package/package.json +26 -25
  171. package/dist/tabs/Button.svelte +0 -65
  172. package/dist/tabs/Button.svelte.d.ts +0 -39
  173. package/dist/utils/close.d.ts +0 -2
  174. package/dist/utils/close.js +0 -3
@@ -0,0 +1,35 @@
1
+ import { focusableSelector } from "./focus-management.js";
2
+ import { onDocumentReady } from "./on-document-ready.js";
3
+ export let history = [];
4
+ onDocumentReady(() => {
5
+ function handle(e) {
6
+ if (!(e.target instanceof HTMLElement))
7
+ return;
8
+ if (e.target === document.body)
9
+ return;
10
+ if (history[0] === e.target)
11
+ return;
12
+ let focusableElement = e.target;
13
+ // Figure out the closest focusable element, this is needed in a situation
14
+ // where you click on a non-focusable element inside a focusable element.
15
+ //
16
+ // E.g.:
17
+ //
18
+ // ```html
19
+ // <button>
20
+ // <span>Click me</span>
21
+ // </button>
22
+ // ```
23
+ focusableElement = focusableElement.closest(focusableSelector);
24
+ history.unshift(focusableElement ?? e.target);
25
+ // Filter out DOM Nodes that don't exist anymore
26
+ history = history.filter((x) => x != null && x.isConnected);
27
+ history.splice(10); // Only keep the 10 most recent items
28
+ }
29
+ window.addEventListener("click", handle, { capture: true });
30
+ window.addEventListener("mousedown", handle, { capture: true });
31
+ window.addEventListener("focus", handle, { capture: true });
32
+ document.body.addEventListener("click", handle, { capture: true });
33
+ document.body.addEventListener("mousedown", handle, { capture: true });
34
+ document.body.addEventListener("focus", handle, { capture: true });
35
+ });
@@ -0,0 +1,21 @@
1
+ import type { Snippet } from "svelte";
2
+ import type { SvelteHTMLElements } from "svelte/elements";
3
+ export interface SvelteHTMLProps extends SvelteHTMLElements {
4
+ "svelte:fragment": {};
5
+ }
6
+ export type ElementType = keyof SvelteHTMLProps;
7
+ export type Expand<T> = T extends infer O ? {
8
+ [K in keyof O]: O[K];
9
+ } : never;
10
+ export type Children<TSlot> = Snippet | Snippet<[TSlot, Record<string, any>]>;
11
+ type OurProps<TSlot> = {
12
+ children?: Children<TSlot>;
13
+ ref?: HTMLElement;
14
+ class?: string | null | ((bag: TSlot) => string);
15
+ };
16
+ type MergeProps3<T, U, V> = {
17
+ [K in keyof T | keyof U | keyof V]?: K extends keyof V ? V[K] : K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
18
+ };
19
+ export type Props<TTag extends ElementType, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = MergeProps3<SvelteHTMLProps[TTag], OurProps<TSlot>, Overrides>;
20
+ export type EnsureArray<T> = T extends any[] ? T : Expand<T>[];
21
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare function classNames(...classes: (false | null | undefined | string)[]): string;
@@ -0,0 +1,10 @@
1
+ export function classNames(...classes) {
2
+ return Array.from(new Set(classes.flatMap((value) => {
3
+ if (typeof value === "string") {
4
+ return value.split(" ");
5
+ }
6
+ return [];
7
+ })))
8
+ .filter(Boolean)
9
+ .join(" ");
10
+ }
@@ -1,3 +1,4 @@
1
+ export declare let focusableSelector: string;
1
2
  export declare enum Focus {
2
3
  /** Focus the first non-disabled element */
3
4
  First = 1,
@@ -35,7 +36,7 @@ export declare enum FocusableMode {
35
36
  export declare function isFocusableElement(element: HTMLElement, mode?: FocusableMode): boolean;
36
37
  export declare function restoreFocusIfNecessary(element: HTMLElement | null): void;
37
38
  export declare function focusElement(element: HTMLElement | null): void;
38
- export declare function sortByDomNode<T>(nodes: T[], resolveKey?: (item: T) => HTMLElement | null | undefined): T[];
39
+ export declare function sortByDomNode<T>(nodes: T[], resolveKey?: (item: T) => HTMLElement | null): T[];
39
40
  export declare function focusFrom(current: HTMLElement | null, focus: Focus): FocusResult;
40
41
  export declare function focusIn(container: HTMLElement | HTMLElement[], focus: Focus, { sorted, relativeTo, skipElements, }?: Partial<{
41
42
  sorted: boolean;
@@ -3,7 +3,7 @@ import { match } from "./match.js";
3
3
  import { getOwnerDocument } from "./owner.js";
4
4
  // Credit:
5
5
  // - https://stackoverflow.com/a/30753870
6
- const focusableSelector = [
6
+ export let focusableSelector = [
7
7
  "[contentEditable=true]",
8
8
  "[tabindex]",
9
9
  "a[href]",
@@ -21,7 +21,7 @@ const focusableSelector = [
21
21
  (selector) => `${selector}:not([tabindex='-1']):not([style*='display: none'])`
22
22
  : (selector) => `${selector}:not([tabindex='-1'])`)
23
23
  .join(",");
24
- const autoFocusableSelector = [
24
+ let autoFocusableSelector = [
25
25
  // In a perfect world this was just `autofocus`, but React doesn't pass `autofocus` to the DOM...
26
26
  "[data-autofocus]",
27
27
  ]
@@ -105,7 +105,7 @@ export function isFocusableElement(element, mode = FocusableMode.Strict) {
105
105
  });
106
106
  }
107
107
  export function restoreFocusIfNecessary(element) {
108
- const ownerDocument = getOwnerDocument(element);
108
+ let ownerDocument = getOwnerDocument(element);
109
109
  disposables().nextFrame(() => {
110
110
  if (ownerDocument && !isFocusableElement(ownerDocument.activeElement, FocusableMode.Strict)) {
111
111
  focusElement(element);
@@ -144,17 +144,17 @@ export function focusElement(element) {
144
144
  element?.focus({ preventScroll: true });
145
145
  }
146
146
  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select
147
- const selectableSelector = ["textarea", "input"].join(",");
147
+ let selectableSelector = ["textarea", "input"].join(",");
148
148
  function isSelectableElement(element) {
149
149
  return element?.matches?.(selectableSelector) ?? false;
150
150
  }
151
151
  export function sortByDomNode(nodes, resolveKey = (i) => i) {
152
152
  return nodes.slice().sort((aItem, zItem) => {
153
- const a = resolveKey(aItem);
154
- const z = resolveKey(zItem);
155
- if (!a || !z)
153
+ let a = resolveKey(aItem);
154
+ let z = resolveKey(zItem);
155
+ if (a === null || z === null)
156
156
  return 0;
157
- const position = a.compareDocumentPosition(z);
157
+ let position = a.compareDocumentPosition(z);
158
158
  if (position & Node.DOCUMENT_POSITION_FOLLOWING)
159
159
  return -1;
160
160
  if (position & Node.DOCUMENT_POSITION_PRECEDING)
@@ -166,7 +166,7 @@ export function focusFrom(current, focus) {
166
166
  return focusIn(getFocusableElements(), focus, { relativeTo: current });
167
167
  }
168
168
  export function focusIn(container, focus, { sorted = true, relativeTo = null, skipElements = [], } = {}) {
169
- const ownerDocument = Array.isArray(container)
169
+ let ownerDocument = Array.isArray(container)
170
170
  ? container.length > 0
171
171
  ? container[0].ownerDocument
172
172
  : document
@@ -185,14 +185,14 @@ export function focusIn(container, focus, { sorted = true, relativeTo = null, sk
185
185
  ));
186
186
  }
187
187
  relativeTo = relativeTo ?? ownerDocument.activeElement;
188
- const direction = (() => {
188
+ let direction = (() => {
189
189
  if (focus & (Focus.First | Focus.Next))
190
190
  return Direction.Next;
191
191
  if (focus & (Focus.Previous | Focus.Last))
192
192
  return Direction.Previous;
193
193
  throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last");
194
194
  })();
195
- const startIndex = (() => {
195
+ let startIndex = (() => {
196
196
  if (focus & Focus.First)
197
197
  return 0;
198
198
  if (focus & Focus.Previous)
@@ -203,9 +203,9 @@ export function focusIn(container, focus, { sorted = true, relativeTo = null, sk
203
203
  return elements.length - 1;
204
204
  throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last");
205
205
  })();
206
- const focusOptions = focus & Focus.NoScroll ? { preventScroll: true } : {};
206
+ let focusOptions = focus & Focus.NoScroll ? { preventScroll: true } : {};
207
207
  let offset = 0;
208
- const total = elements.length;
208
+ let total = elements.length;
209
209
  let next = undefined;
210
210
  do {
211
211
  // Guard against infinite loops
@@ -0,0 +1 @@
1
+ export declare function onDocumentReady(cb: () => void): void;
@@ -0,0 +1,12 @@
1
+ export function onDocumentReady(cb) {
2
+ function check() {
3
+ if (document.readyState === "loading")
4
+ return;
5
+ cb();
6
+ document.removeEventListener("DOMContentLoaded", check);
7
+ }
8
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
9
+ document.addEventListener("DOMContentLoaded", check);
10
+ check();
11
+ }
12
+ }
@@ -28,4 +28,7 @@ export type PropsForFeatures<T extends RenderFeatures> = Expand<UnionToIntersect
28
28
  unmount?: boolean;
29
29
  }>>>;
30
30
  export declare function mergeProps<T extends Props<any, any>[]>(...listOfProps: T): Props<any, any>;
31
+ export declare function mergePropsAdvanced(...listOfProps: Props<any, any>[]): Props<any, any>;
32
+ export declare function compact<T extends Record<any, any>>(object: T): {} & T;
33
+ export declare function omit<T extends Record<any, any>>(object: T, keysToOmit?: string[]): T;
31
34
  export {};
@@ -54,3 +54,66 @@ export function mergeProps(...listOfProps) {
54
54
  }
55
55
  return target;
56
56
  }
57
+ // A more complex example fo the `mergeProps` function, this one also cancels subsequent event
58
+ // listeners if the event has already been `preventDefault`ed.
59
+ export function mergePropsAdvanced(...listOfProps) {
60
+ if (listOfProps.length === 0)
61
+ return {};
62
+ if (listOfProps.length === 1)
63
+ return listOfProps[0];
64
+ let target = {};
65
+ let eventHandlers = {};
66
+ for (let props of listOfProps) {
67
+ for (let prop in props) {
68
+ // Collect event handlers
69
+ if (prop.startsWith("on") && typeof props[prop] === "function") {
70
+ eventHandlers[prop] ??= [];
71
+ eventHandlers[prop].push(props[prop]);
72
+ }
73
+ else {
74
+ // Override incoming prop
75
+ target[prop] = props[prop];
76
+ }
77
+ }
78
+ }
79
+ // Ensure event listeners are not called if `disabled` or `aria-disabled` is true
80
+ if (target.disabled || target["aria-disabled"]) {
81
+ for (let eventName in eventHandlers) {
82
+ // Prevent default events for `onclick`, `onmousedown`, `onkeydown`, etc.
83
+ if (/^(on(?:click|pointer|mouse|key)(?:down|up|press)?)$/.test(eventName)) {
84
+ eventHandlers[eventName] = [(e) => e?.preventDefault?.()];
85
+ }
86
+ }
87
+ }
88
+ // Merge event handlers
89
+ for (let eventName in eventHandlers) {
90
+ Object.assign(target, {
91
+ [eventName](event, ...args) {
92
+ let handlers = eventHandlers[eventName];
93
+ for (let handler of handlers) {
94
+ if ((event instanceof Event || event?.nativeEvent instanceof Event) && event.defaultPrevented) {
95
+ return;
96
+ }
97
+ handler(event, ...args);
98
+ }
99
+ },
100
+ });
101
+ }
102
+ return target;
103
+ }
104
+ export function compact(object) {
105
+ let clone = Object.assign({}, object);
106
+ for (let key in clone) {
107
+ if (clone[key] === undefined)
108
+ delete clone[key];
109
+ }
110
+ return clone;
111
+ }
112
+ export function omit(object, keysToOmit = []) {
113
+ let clone = Object.assign({}, object);
114
+ for (let key of keysToOmit) {
115
+ if (key in clone)
116
+ delete clone[key];
117
+ }
118
+ return clone;
119
+ }
@@ -1 +1,7 @@
1
- export declare const stateFromSlot: <TSlot extends Record<string, any>>(slot?: TSlot) => Record<string, string>;
1
+ export type SlotStateProps<TSlot> = {
2
+ [Property in keyof TSlot as TSlot[Property] extends boolean ? `data-${string & Property}` : never]?: string;
3
+ };
4
+ export type StateProps<TSlot> = SlotStateProps<TSlot> & {
5
+ "data-headlessui-state"?: string;
6
+ };
7
+ export declare const stateFromSlot: <TSlot>(slot?: TSlot) => StateProps<TSlot>;
@@ -1,4 +1,6 @@
1
1
  export const stateFromSlot = (slot = {}) => {
2
+ if (typeof slot !== "object")
3
+ return {};
2
4
  let dataAttributes = {};
3
5
  let exposeState = false;
4
6
  let states = [];
@@ -10,11 +12,13 @@ export const stateFromSlot = (slot = {}) => {
10
12
  states.push(k.replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`));
11
13
  }
12
14
  }
13
- if (exposeState) {
14
- dataAttributes["data-headlessui-state"] = states.join(" ");
15
- for (let s of states) {
16
- dataAttributes[`data-${s}`] = "";
17
- }
15
+ if (!exposeState)
16
+ return {};
17
+ for (let s of states) {
18
+ dataAttributes[`data-${s}`] = "";
18
19
  }
19
- return dataAttributes;
20
+ return {
21
+ "data-headlessui-state": states.join(" "),
22
+ ...dataAttributes,
23
+ };
20
24
  };
@@ -1,27 +1,24 @@
1
1
  import type { Snippet } from "svelte";
2
- import type { HTMLAttributes, SvelteHTMLElements } from "svelte/elements";
3
- declare const __: "1D45E01E-AF44-47C4-988A-19A94EBAF55C";
4
- export type __ = typeof __;
5
- export type ElementType = keyof SvelteHTMLElements;
6
- export type HTMLElementType<T extends keyof SvelteHTMLElements> = SvelteHTMLElements[T] extends HTMLAttributes<infer U> ? (U extends HTMLElement ? U : never) : never;
2
+ import type { SvelteHTMLElements } from "svelte/elements";
3
+ export interface SvelteHTMLProps extends SvelteHTMLElements {
4
+ "svelte:fragment": {};
5
+ }
6
+ export type ElementType = keyof SvelteHTMLProps;
7
7
  export type Expand<T> = T extends infer O ? {
8
8
  [K in keyof O]: O[K];
9
9
  } : never;
10
- export type PropsOf<TTag extends keyof SvelteHTMLElements> = TTag extends keyof SvelteHTMLElements ? SvelteHTMLElements[TTag] : never;
11
- type PropsWeControl = "as" | "children" | "class";
12
- type CleanProps<TTag extends keyof SvelteHTMLElements, TOmittableProps extends PropertyKey = never> = Omit<SvelteHTMLElements[TTag], TOmittableProps | PropsWeControl>;
13
- type OurProps<TTag extends keyof SvelteHTMLElements, TSlot> = {
14
- as?: TTag;
15
- children?: Snippet<[TSlot]>;
10
+ export type PropsOf<TTag extends ElementType> = SvelteHTMLProps[TTag];
11
+ export type Children<TSlot> = Snippet | Snippet<[TSlot, Record<string, any>]>;
12
+ type PropsWeControl = "as" | "children" | "refName" | "class";
13
+ type CleanProps<TTag extends ElementType, TOmittableProps extends PropertyKey = never> = Omit<PropsOf<TTag>, TOmittableProps | PropsWeControl>;
14
+ type OurProps<TSlot> = {
15
+ children?: Children<TSlot>;
16
+ ref?: HTMLElement;
16
17
  };
17
18
  type HasProperty<T extends object, K extends PropertyKey> = T extends never ? never : K extends keyof T ? true : never;
18
- type ClassNameOverride<TTag extends keyof SvelteHTMLElements, TSlot = {}> = true extends HasProperty<PropsOf<TTag>, "class"> ? {
19
+ type ClassNameOverride<TTag extends ElementType, TSlot = {}> = true extends HasProperty<PropsOf<TTag>, "class"> ? {
19
20
  class?: PropsOf<TTag>["class"] | ((bag: TSlot) => string);
20
21
  } : {};
21
- export type Props<TTag extends keyof SvelteHTMLElements, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = CleanProps<TTag, TOmittableProps | keyof Overrides> & OurProps<TTag, TSlot> & ClassNameOverride<TTag, TSlot> & Overrides;
22
- type Without<T, U> = {
23
- [P in Exclude<keyof T, keyof U>]?: never;
24
- };
25
- export type XOR<T, U> = T | U extends __ ? never : T extends __ ? U : U extends __ ? T : T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
22
+ export type Props<TTag extends ElementType, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = CleanProps<TTag, TOmittableProps | keyof Overrides> & OurProps<TSlot> & ClassNameOverride<TTag, TSlot> & Overrides;
26
23
  export type EnsureArray<T> = T extends any[] ? T : Expand<T>[];
27
24
  export {};
@@ -1,6 +1 @@
1
- /* eslint-disable @typescript-eslint/no-empty-object-type */
2
- // A unique placeholder we can use as a default. This is nice because we can use this instead of
3
- // defaulting to null / never / ... and possibly collide with actual data.
4
- // Ideally we use a unique symbol here.
5
- const __ = "1D45E01E-AF44-47C4-988A-19A94EBAF55C";
6
1
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pzerelles/headlessui-svelte",
3
- "version": "2.1.1-next.1",
3
+ "version": "2.1.2-next.2",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./dist/index.d.ts",
@@ -18,40 +18,41 @@
18
18
  "devDependencies": {
19
19
  "@changesets/cli": "^2.27.7",
20
20
  "@changesets/types": "^6.0.0",
21
- "@playwright/test": "^1.45.2",
21
+ "@playwright/test": "^1.46.1",
22
22
  "@pzerelles/heroicons-svelte": "^2.1.5",
23
- "@sveltejs/adapter-auto": "^3.2.2",
24
- "@sveltejs/kit": "^2.5.18",
25
- "@sveltejs/package": "^2.3.2",
26
- "@sveltejs/vite-plugin-svelte": "^3.1.1",
27
- "@testing-library/jest-dom": "^6.4.6",
28
- "@testing-library/svelte": "^5.2.0",
29
- "@types/eslint": "^8.56.10",
30
- "@types/node": "^20.14.10",
31
- "autoprefixer": "^10.4.19",
23
+ "@sveltejs/adapter-auto": "^3.2.4",
24
+ "@sveltejs/kit": "^2.5.24",
25
+ "@sveltejs/package": "^2.3.4",
26
+ "@sveltejs/vite-plugin-svelte": "^3.1.2",
27
+ "@testing-library/jest-dom": "^6.5.0",
28
+ "@testing-library/svelte": "^5.2.1",
29
+ "@types/eslint": "^8.56.12",
30
+ "@types/node": "^20.16.1",
31
+ "autoprefixer": "^10.4.20",
32
32
  "clsx": "^2.1.1",
33
- "eslint": "^9.7.0",
33
+ "eslint": "^9.9.1",
34
34
  "eslint-config-prettier": "^9.1.0",
35
- "eslint-plugin-svelte": "^2.42.0",
36
- "globals": "^15.8.0",
37
- "jsdom": "^24.1.0",
35
+ "eslint-plugin-svelte": "^2.43.0",
36
+ "globals": "^15.9.0",
37
+ "jsdom": "^24.1.3",
38
38
  "outdent": "^0.8.0",
39
- "postcss": "^8.4.39",
39
+ "postcss": "^8.4.41",
40
40
  "prettier": "^3.3.3",
41
- "prettier-plugin-svelte": "^3.2.5",
41
+ "prettier-plugin-svelte": "^3.2.6",
42
42
  "prettier-plugin-tailwindcss": "^0.5.14",
43
43
  "publint": "^0.1.16",
44
- "svelte": "5.0.0-next.184",
45
- "svelte-check": "^3.8.4",
46
- "tailwindcss": "^3.4.5",
47
- "tslib": "^2.6.3",
48
- "typescript": "^5.5.3",
44
+ "svelte": "5.0.0-next.238",
45
+ "svelte-check": "^3.8.6",
46
+ "tailwindcss": "^3.4.10",
47
+ "tslib": "^2.7.0",
48
+ "typescript": "^5.5.4",
49
49
  "typescript-eslint": "8.0.0-alpha.28",
50
- "vite": "^5.3.4",
51
- "vitest": "^2.0.3"
50
+ "vite": "^5.4.2",
51
+ "vitest": "^2.0.5"
52
52
  },
53
53
  "dependencies": {
54
- "@skeletonlabs/floating-ui-svelte": "^0.3.1",
54
+ "@floating-ui/core": "^1.6.7",
55
+ "@floating-ui/dom": "^1.6.10",
55
56
  "esm-env": "^1.0.0",
56
57
  "nanoid": "^5.0.7"
57
58
  },
@@ -1,65 +0,0 @@
1
- <script lang="ts" context="module">const DEFAULT_BUTTON_TAG = "button";
2
- </script>
3
-
4
- <script lang="ts" generics="TTag extends keyof SvelteHTMLElements, TType">import { useActivePress } from "../hooks/use-active-press.svelte.js";
5
- import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
6
- import { useDisabled } from "../hooks/use-disabled.js";
7
- import { stateFromSlot } from "../utils/state.js";
8
- import { useHover } from "../hooks/use-hover.svelte.js";
9
- import { mergeProps } from "../utils/render.js";
10
- const providedDisabled = useDisabled();
11
- let {
12
- as,
13
- disabled: ownDisabled = false,
14
- autofocus = false,
15
- type = "button",
16
- children,
17
- ...theirProps
18
- } = $props();
19
- const disabled = $derived(providedDisabled.value || ownDisabled);
20
- const { isHovered: hover, hoverProps } = $derived(
21
- useHover({
22
- get disabled() {
23
- return disabled;
24
- }
25
- })
26
- );
27
- const { pressed: active, pressProps } = $derived(
28
- useActivePress({
29
- get disabled() {
30
- return disabled;
31
- }
32
- })
33
- );
34
- const { isFocusVisible: focus, focusProps } = $derived(
35
- useFocusRing({
36
- get autofocus() {
37
- return autofocus;
38
- }
39
- })
40
- );
41
- const slot = $derived({
42
- disabled,
43
- hover,
44
- focus,
45
- active,
46
- autofocus
47
- });
48
- const ownProps = $derived(
49
- mergeProps(
50
- {
51
- type,
52
- disabled: disabled || void 0,
53
- autofocus
54
- },
55
- focusProps,
56
- hoverProps,
57
- pressProps,
58
- stateFromSlot(slot)
59
- )
60
- );
61
- </script>
62
-
63
- <svelte:element this={as ?? DEFAULT_BUTTON_TAG} {...ownProps} {...theirProps}>
64
- {#if children}{@render children(slot)}{/if}
65
- </svelte:element>
@@ -1,39 +0,0 @@
1
- import type { SvelteHTMLElements } from "svelte/elements";
2
- export type ButtonProps<TTag extends keyof SvelteHTMLElements = typeof DEFAULT_BUTTON_TAG> = SvelteHTMLElements[TTag] & {
3
- as?: TTag;
4
- disabled?: boolean;
5
- autofocus?: boolean;
6
- type?: "button" | "submit" | "reset";
7
- children?: Snippet<[
8
- {
9
- disabled: boolean;
10
- hover: boolean;
11
- focus: boolean;
12
- active: boolean;
13
- autofocus: boolean;
14
- }
15
- ]>;
16
- };
17
- declare const DEFAULT_BUTTON_TAG: "button";
18
- import type { Snippet } from "svelte";
19
- declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements, TType> {
20
- props(): ButtonProps<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, 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']>> & {
30
- $$bindings?: ReturnType<__sveltets_Render<TTag, TType>['bindings']>;
31
- } & ReturnType<__sveltets_Render<TTag, TType>['exports']>;
32
- <TTag extends keyof SvelteHTMLElements, TType>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TType>['props']> & {
33
- $$events?: ReturnType<__sveltets_Render<TTag, TType>['events']>;
34
- }): ReturnType<__sveltets_Render<TTag, TType>['exports']>;
35
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
36
- }
37
- declare const Button: $$IsomorphicComponent;
38
- type Button<TTag extends keyof SvelteHTMLElements, TType> = InstanceType<typeof Button<TTag, TType>>;
39
- export default Button;
@@ -1,2 +0,0 @@
1
- export declare const createCloseContext: (close: () => void) => () => void;
2
- export declare const getCloseContext: () => (() => void) | undefined;
@@ -1,3 +0,0 @@
1
- import { getContext, setContext } from "svelte";
2
- export const createCloseContext = (close) => setContext("Close", close);
3
- export const getCloseContext = () => getContext("Close");