@pzerelles/headlessui-svelte 2.0.0-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 (275) hide show
  1. package/dist/button/Button.svelte +61 -0
  2. package/dist/button/Button.svelte.d.ts +47 -0
  3. package/dist/button/index.d.ts +1 -0
  4. package/dist/button/index.js +1 -0
  5. package/dist/checkbox/Checkbox.svelte +93 -61
  6. package/dist/checkbox/Checkbox.svelte.d.ts +45 -29
  7. package/dist/close-button/CloseButton.svelte +11 -0
  8. package/dist/close-button/CloseButton.svelte.d.ts +48 -0
  9. package/dist/close-button/index.d.ts +1 -0
  10. package/dist/close-button/index.js +1 -0
  11. package/dist/combobox/Combobox.svelte +6 -0
  12. package/dist/combobox/Combobox.svelte.d.ts +50 -0
  13. package/dist/data-interactive/DataInteractive.svelte +41 -0
  14. package/dist/data-interactive/DataInteractive.svelte.d.ts +39 -0
  15. package/dist/data-interactive/index.d.ts +1 -0
  16. package/dist/data-interactive/index.js +1 -0
  17. package/dist/description/Description.svelte +16 -41
  18. package/dist/description/Description.svelte.d.ts +15 -23
  19. package/dist/description/context.svelte.d.ts +17 -0
  20. package/dist/description/context.svelte.js +51 -0
  21. package/dist/dialog/Dialog.svelte +51 -0
  22. package/dist/dialog/Dialog.svelte.d.ts +60 -0
  23. package/dist/dialog/DialogBackdrop.svelte +39 -0
  24. package/dist/dialog/DialogBackdrop.svelte.d.ts +38 -0
  25. package/dist/dialog/DialogPanel.svelte +46 -0
  26. package/dist/dialog/DialogPanel.svelte.d.ts +40 -0
  27. package/dist/dialog/DialogTitle.svelte +29 -0
  28. package/dist/dialog/DialogTitle.svelte.d.ts +34 -0
  29. package/dist/dialog/InternalDialog.svelte +233 -0
  30. package/dist/dialog/InternalDialog.svelte.d.ts +42 -0
  31. package/dist/dialog/context.svelte.d.ts +15 -0
  32. package/dist/dialog/context.svelte.js +16 -0
  33. package/dist/dialog/index.d.ts +4 -0
  34. package/dist/dialog/index.js +4 -0
  35. package/dist/field/Field.svelte +14 -16
  36. package/dist/field/Field.svelte.d.ts +21 -17
  37. package/dist/fieldset/Fieldset.svelte +19 -17
  38. package/dist/fieldset/Fieldset.svelte.d.ts +21 -17
  39. package/dist/focus-trap/FocusTrap.svelte +332 -0
  40. package/dist/focus-trap/FocusTrap.svelte.d.ts +58 -0
  41. package/dist/hooks/document-overflow/adjust-scrollbar-padding.d.ts +2 -0
  42. package/dist/hooks/document-overflow/adjust-scrollbar-padding.js +18 -0
  43. package/dist/hooks/document-overflow/handle-ios-locking.d.ts +6 -0
  44. package/dist/hooks/document-overflow/handle-ios-locking.js +134 -0
  45. package/dist/hooks/document-overflow/overflow-store.d.ts +19 -0
  46. package/dist/hooks/document-overflow/overflow-store.js +76 -0
  47. package/dist/hooks/document-overflow/prevent-scroll.d.ts +2 -0
  48. package/dist/hooks/document-overflow/prevent-scroll.js +7 -0
  49. package/dist/hooks/document-overflow/use-document-overflow.svelte.d.ts +7 -0
  50. package/dist/hooks/document-overflow/use-document-overflow.svelte.js +27 -0
  51. package/dist/hooks/use-active-press.svelte.d.ts +14 -0
  52. package/dist/{actions/activePress.svelte.js → hooks/use-active-press.svelte.js} +33 -39
  53. package/dist/hooks/use-by-comparator.d.ts +2 -0
  54. package/dist/hooks/use-by-comparator.js +15 -0
  55. package/dist/hooks/use-controllable.svelte.d.ts +6 -0
  56. package/dist/hooks/use-controllable.svelte.js +34 -0
  57. package/dist/hooks/use-did-element-move.svelte.d.ts +6 -0
  58. package/dist/hooks/use-did-element-move.svelte.js +27 -0
  59. package/dist/hooks/use-disabled.d.ts +3 -0
  60. package/dist/hooks/use-disabled.js +9 -0
  61. package/dist/hooks/use-element-size.svelte.d.ts +7 -0
  62. package/dist/hooks/use-element-size.svelte.js +36 -0
  63. package/dist/hooks/use-escape.svelte.d.ts +5 -0
  64. package/dist/hooks/use-escape.svelte.js +26 -0
  65. package/dist/hooks/use-event-listener.svelte.d.ts +6 -0
  66. package/dist/hooks/use-event-listener.svelte.js +12 -0
  67. package/dist/hooks/use-flags.svelte.d.ts +8 -0
  68. package/dist/hooks/use-flags.svelte.js +18 -0
  69. package/dist/hooks/use-focus-ring.svelte.d.ts +10 -0
  70. package/dist/hooks/use-focus-ring.svelte.js +24 -0
  71. package/dist/hooks/use-hover.svelte.d.ts +26 -0
  72. package/dist/hooks/use-hover.svelte.js +124 -0
  73. package/dist/hooks/use-id.d.ts +1 -0
  74. package/dist/hooks/use-id.js +1 -0
  75. package/dist/hooks/use-inert-others.svelte.d.ts +32 -0
  76. package/dist/hooks/use-inert-others.svelte.js +114 -0
  77. package/dist/hooks/use-is-mounted.svelte.d.ts +3 -0
  78. package/dist/hooks/use-is-mounted.svelte.js +14 -0
  79. package/dist/hooks/use-is-top-layer.svelte.d.ts +29 -0
  80. package/dist/hooks/use-is-top-layer.svelte.js +82 -0
  81. package/dist/hooks/use-is-touch-device.svelte.d.ts +3 -0
  82. package/dist/hooks/use-is-touch-device.svelte.js +20 -0
  83. package/dist/hooks/use-on-disappear.svelte.d.ts +12 -0
  84. package/dist/hooks/use-on-disappear.svelte.js +38 -0
  85. package/dist/hooks/use-outside-click.svelte.d.ts +10 -0
  86. package/dist/hooks/use-outside-click.svelte.js +150 -0
  87. package/dist/hooks/use-reducer.d.ts +4 -0
  88. package/dist/hooks/use-reducer.js +11 -0
  89. package/dist/hooks/use-resolve-button-type.svelte.d.ts +10 -0
  90. package/dist/hooks/use-resolve-button-type.svelte.js +19 -0
  91. package/dist/hooks/use-root-containers.svelte.d.ts +9 -0
  92. package/dist/hooks/use-root-containers.svelte.js +50 -0
  93. package/dist/hooks/use-scroll-lock.svelte.d.ts +5 -0
  94. package/dist/hooks/use-scroll-lock.svelte.js +24 -0
  95. package/dist/hooks/use-sync-refs.d.ts +7 -0
  96. package/dist/hooks/use-sync-refs.js +22 -0
  97. package/dist/hooks/use-tab-direction.svelte.d.ts +7 -0
  98. package/dist/hooks/use-tab-direction.svelte.js +25 -0
  99. package/dist/hooks/use-text-value.svelte.d.ts +3 -0
  100. package/dist/hooks/use-text-value.svelte.js +20 -0
  101. package/dist/hooks/use-tracked-pointer.d.ts +4 -0
  102. package/dist/hooks/use-tracked-pointer.js +26 -0
  103. package/dist/hooks/use-transition.svelte.d.ts +20 -0
  104. package/dist/hooks/use-transition.svelte.js +253 -0
  105. package/dist/hooks/use-tree-walker.svelte.d.ts +8 -0
  106. package/dist/hooks/use-tree-walker.svelte.js +19 -0
  107. package/dist/hooks/use-watch.svelte.d.ts +4 -0
  108. package/dist/hooks/use-watch.svelte.js +16 -0
  109. package/dist/hooks/use-window-event.svelte.d.ts +6 -0
  110. package/dist/hooks/use-window-event.svelte.js +12 -0
  111. package/dist/index.d.ts +13 -0
  112. package/dist/index.js +13 -0
  113. package/dist/input/Input.svelte +59 -0
  114. package/dist/input/Input.svelte.d.ts +52 -0
  115. package/dist/input/index.d.ts +1 -0
  116. package/dist/input/index.js +1 -0
  117. package/dist/internal/FocusSentinel.svelte +45 -0
  118. package/dist/internal/FocusSentinel.svelte.d.ts +20 -0
  119. package/dist/internal/ForcePortalRoot.svelte +6 -0
  120. package/dist/internal/ForcePortalRoot.svelte.d.ts +22 -0
  121. package/dist/internal/FormFields.svelte +2 -4
  122. package/dist/internal/FormFields.svelte.d.ts +9 -7
  123. package/dist/internal/FormResolver.svelte +11 -16
  124. package/dist/internal/FormResolver.svelte.d.ts +6 -4
  125. package/dist/internal/Hidden.svelte +5 -9
  126. package/dist/internal/Hidden.svelte.d.ts +35 -19
  127. package/dist/internal/HoistFormFields.svelte.d.ts +5 -2
  128. package/dist/internal/MainTreeProvider.svelte +45 -0
  129. package/dist/internal/MainTreeProvider.svelte.d.ts +31 -0
  130. package/dist/internal/Portal.svelte.d.ts +5 -2
  131. package/dist/internal/close-provider.d.ts +7 -0
  132. package/dist/internal/close-provider.js +7 -0
  133. package/dist/internal/floating.svelte.d.ts +62 -0
  134. package/dist/internal/floating.svelte.js +488 -0
  135. package/dist/internal/frozen.svelte.d.ts +6 -0
  136. package/dist/internal/frozen.svelte.js +18 -0
  137. package/dist/internal/id.d.ts +8 -0
  138. package/dist/internal/id.js +11 -0
  139. package/dist/internal/open-closed.d.ts +14 -0
  140. package/dist/internal/open-closed.js +17 -0
  141. package/dist/internal/portal-force-root.svelte.d.ts +6 -0
  142. package/dist/internal/portal-force-root.svelte.js +11 -0
  143. package/dist/label/Label.svelte +17 -45
  144. package/dist/label/Label.svelte.d.ts +19 -23
  145. package/dist/label/context.svelte.d.ts +17 -0
  146. package/dist/label/context.svelte.js +56 -0
  147. package/dist/legend/Legend.svelte +4 -3
  148. package/dist/legend/Legend.svelte.d.ts +33 -16
  149. package/dist/listbox/Listbox.svelte +448 -0
  150. package/dist/listbox/Listbox.svelte.d.ts +126 -0
  151. package/dist/listbox/ListboxButton.svelte +139 -0
  152. package/dist/listbox/ListboxButton.svelte.d.ts +52 -0
  153. package/dist/listbox/ListboxOption.svelte +136 -0
  154. package/dist/listbox/ListboxOption.svelte.d.ts +50 -0
  155. package/dist/listbox/ListboxOptions.svelte +269 -0
  156. package/dist/listbox/ListboxOptions.svelte.d.ts +55 -0
  157. package/dist/listbox/ListboxSelectedOption.svelte +35 -0
  158. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +40 -0
  159. package/dist/listbox/index.d.ts +5 -0
  160. package/dist/listbox/index.js +5 -0
  161. package/dist/menu/Menu.svelte +235 -0
  162. package/dist/menu/Menu.svelte.d.ts +42 -0
  163. package/dist/menu/MenuButton.svelte +127 -0
  164. package/dist/menu/MenuButton.svelte.d.ts +52 -0
  165. package/dist/menu/MenuHeading.svelte +19 -0
  166. package/dist/menu/MenuHeading.svelte.d.ts +39 -0
  167. package/dist/menu/MenuItem.svelte +114 -0
  168. package/dist/menu/MenuItem.svelte.d.ts +49 -0
  169. package/dist/menu/MenuItems.svelte +244 -0
  170. package/dist/menu/MenuItems.svelte.d.ts +55 -0
  171. package/dist/menu/MenuSection.svelte +14 -0
  172. package/dist/menu/MenuSection.svelte.d.ts +35 -0
  173. package/dist/menu/MenuSeparator.svelte +9 -0
  174. package/dist/menu/MenuSeparator.svelte.d.ts +35 -0
  175. package/dist/menu/context.svelte.d.ts +47 -0
  176. package/dist/menu/context.svelte.js +21 -0
  177. package/dist/menu/index.d.ts +7 -0
  178. package/dist/menu/index.js +7 -0
  179. package/dist/portal/InternalPortal.svelte +97 -0
  180. package/dist/portal/InternalPortal.svelte.d.ts +43 -0
  181. package/dist/portal/Portal.svelte +7 -0
  182. package/dist/portal/Portal.svelte.d.ts +23 -0
  183. package/dist/portal/PortalGroup.svelte +14 -0
  184. package/dist/portal/PortalGroup.svelte.d.ts +40 -0
  185. package/dist/switch/Switch.svelte +143 -0
  186. package/dist/switch/Switch.svelte.d.ts +61 -0
  187. package/dist/switch/SwitchGroup.svelte +37 -0
  188. package/dist/switch/SwitchGroup.svelte.d.ts +34 -0
  189. package/dist/switch/index.d.ts +2 -0
  190. package/dist/switch/index.js +2 -0
  191. package/dist/tabs/Tab.svelte +156 -0
  192. package/dist/tabs/Tab.svelte.d.ts +48 -0
  193. package/dist/tabs/TabGroup.svelte +241 -0
  194. package/dist/tabs/TabGroup.svelte.d.ts +67 -0
  195. package/dist/tabs/TabList.svelte +16 -0
  196. package/dist/tabs/TabList.svelte.d.ts +35 -0
  197. package/dist/tabs/TabPanel.svelte +61 -0
  198. package/dist/tabs/TabPanel.svelte.d.ts +47 -0
  199. package/dist/tabs/TabPanels.svelte +12 -0
  200. package/dist/tabs/TabPanels.svelte.d.ts +34 -0
  201. package/dist/tabs/index.d.ts +5 -0
  202. package/dist/tabs/index.js +5 -0
  203. package/dist/test-utils/accessability-assertions.d.ts +271 -0
  204. package/dist/test-utils/accessability-assertions.js +1572 -0
  205. package/dist/test-utils/fake-pointer.d.ts +24 -0
  206. package/dist/test-utils/fake-pointer.js +48 -0
  207. package/dist/test-utils/interactions.d.ts +61 -0
  208. package/dist/test-utils/interactions.js +453 -0
  209. package/dist/test-utils/suppress-console-logs.d.ts +7 -0
  210. package/dist/test-utils/suppress-console-logs.js +17 -0
  211. package/dist/transition/InternalTransitionChild.svelte +178 -0
  212. package/dist/transition/InternalTransitionChild.svelte.d.ts +55 -0
  213. package/dist/transition/Transition.svelte +89 -0
  214. package/dist/transition/Transition.svelte.d.ts +42 -0
  215. package/dist/transition/TransitionChild.svelte +16 -0
  216. package/dist/transition/TransitionChild.svelte.d.ts +44 -0
  217. package/dist/transition/context.svelte.d.ts +64 -0
  218. package/dist/transition/context.svelte.js +120 -0
  219. package/dist/transition/index.d.ts +2 -0
  220. package/dist/transition/index.js +2 -0
  221. package/dist/utils/ElementOrComponent.svelte +26 -0
  222. package/dist/utils/ElementOrComponent.svelte.d.ts +56 -0
  223. package/dist/utils/Generic.svelte +44 -0
  224. package/dist/utils/Generic.svelte.d.ts +35 -0
  225. package/dist/utils/StableCollection.svelte +43 -0
  226. package/dist/utils/StableCollection.svelte.d.ts +22 -0
  227. package/dist/utils/active-element-history.d.ts +1 -0
  228. package/dist/utils/active-element-history.js +35 -0
  229. package/dist/utils/alternative-types.d.ts +21 -0
  230. package/dist/utils/alternative-types.js +1 -0
  231. package/dist/utils/calculate-active-index.d.ts +25 -0
  232. package/dist/utils/calculate-active-index.js +74 -0
  233. package/dist/utils/class-names.d.ts +1 -0
  234. package/dist/utils/class-names.js +10 -0
  235. package/dist/utils/default-map.d.ts +5 -0
  236. package/dist/utils/default-map.js +15 -0
  237. package/dist/utils/disposables.d.ts +14 -12
  238. package/dist/utils/disposables.js +13 -10
  239. package/dist/utils/dom.d.ts +0 -2
  240. package/dist/utils/dom.js +2 -4
  241. package/dist/utils/env.d.ts +17 -0
  242. package/dist/utils/env.js +39 -0
  243. package/dist/utils/focus-management.d.ts +45 -0
  244. package/dist/utils/focus-management.js +242 -0
  245. package/dist/utils/focusVisible.svelte.d.ts +3 -3
  246. package/dist/utils/focusVisible.svelte.js +52 -41
  247. package/dist/utils/get-text-value.d.ts +1 -0
  248. package/dist/utils/get-text-value.js +71 -0
  249. package/dist/utils/id.d.ts +1 -1
  250. package/dist/utils/match.d.ts +1 -0
  251. package/dist/utils/match.js +13 -0
  252. package/dist/utils/on-document-ready.d.ts +1 -0
  253. package/dist/utils/on-document-ready.js +12 -0
  254. package/dist/utils/once.d.ts +1 -0
  255. package/dist/utils/once.js +9 -0
  256. package/dist/utils/owner.d.ts +1 -0
  257. package/dist/utils/owner.js +8 -0
  258. package/dist/utils/platform.d.ts +2 -0
  259. package/dist/utils/platform.js +17 -0
  260. package/dist/utils/ref.svelte.d.ts +4 -0
  261. package/dist/utils/ref.svelte.js +4 -0
  262. package/dist/utils/render.d.ts +34 -0
  263. package/dist/utils/render.js +119 -0
  264. package/dist/utils/state.d.ts +7 -1
  265. package/dist/utils/state.js +10 -6
  266. package/dist/utils/store.d.ts +11 -0
  267. package/dist/utils/store.js +20 -0
  268. package/dist/utils/types.d.ts +24 -0
  269. package/dist/utils/types.js +1 -0
  270. package/package.json +33 -25
  271. package/dist/actions/activePress.svelte.d.ts +0 -8
  272. package/dist/actions/focusRing.svelte.d.ts +0 -9
  273. package/dist/actions/focusRing.svelte.js +0 -34
  274. package/dist/utils/disabled.d.ts +0 -3
  275. package/dist/utils/disabled.js +0 -2
@@ -0,0 +1,24 @@
1
+ export declare class FakePointer {
2
+ private width;
3
+ private height;
4
+ private x;
5
+ private y;
6
+ constructor(width: number, height: number);
7
+ get options(): {
8
+ screenX: number;
9
+ screenY: number;
10
+ };
11
+ randomize(): void;
12
+ advance(amount?: number): void;
13
+ /**
14
+ * JSDOM does not support pointer events.
15
+ * Because of this when we try to set the pointer position it returns undefined so our checks fail.
16
+ *
17
+ * This runs the callback with the TEST_IGNORE_TRACKED_POINTER environment variable set to 1 so we bypass the checks.
18
+ */
19
+ bypassingTrackingChecks(callback: () => void): void;
20
+ }
21
+ /**
22
+ * A global pointer for use in pointer and mouse event checks
23
+ */
24
+ export declare let pointer: FakePointer;
@@ -0,0 +1,48 @@
1
+ export class FakePointer {
2
+ width;
3
+ height;
4
+ x = 0;
5
+ y = 0;
6
+ constructor(width, height) {
7
+ this.width = width;
8
+ this.height = height;
9
+ this.width = width;
10
+ this.height = height;
11
+ }
12
+ get options() {
13
+ return {
14
+ screenX: this.x,
15
+ screenY: this.y,
16
+ };
17
+ }
18
+ randomize() {
19
+ this.x = Math.floor(Math.random() * this.width);
20
+ this.y = Math.floor(Math.random() * this.height);
21
+ }
22
+ advance(amount = 1) {
23
+ this.x += amount;
24
+ if (this.x >= this.width) {
25
+ this.x %= this.width;
26
+ this.y++;
27
+ }
28
+ if (this.y >= this.height) {
29
+ this.y %= this.height;
30
+ }
31
+ }
32
+ /**
33
+ * JSDOM does not support pointer events.
34
+ * Because of this when we try to set the pointer position it returns undefined so our checks fail.
35
+ *
36
+ * This runs the callback with the TEST_IGNORE_TRACKED_POINTER environment variable set to 1 so we bypass the checks.
37
+ */
38
+ bypassingTrackingChecks(callback) {
39
+ let original = process.env.TEST_BYPASS_TRACKED_POINTER;
40
+ process.env.TEST_BYPASS_TRACKED_POINTER = "1";
41
+ callback();
42
+ process.env.TEST_BYPASS_TRACKED_POINTER = original;
43
+ }
44
+ }
45
+ /**
46
+ * A global pointer for use in pointer and mouse event checks
47
+ */
48
+ export let pointer = new FakePointer(1920, 1080);
@@ -0,0 +1,61 @@
1
+ export declare let Keys: Record<string, Partial<KeyboardEvent>>;
2
+ export declare function shift(event: Partial<KeyboardEvent>): {
3
+ shiftKey: boolean;
4
+ altKey?: boolean | undefined;
5
+ charCode?: number | undefined;
6
+ code?: string | undefined;
7
+ ctrlKey?: boolean | undefined;
8
+ isComposing?: boolean | undefined;
9
+ key?: string | undefined;
10
+ keyCode?: number | undefined;
11
+ location?: number | undefined;
12
+ metaKey?: boolean | undefined;
13
+ repeat?: boolean | undefined;
14
+ getModifierState?: ((keyArg: string) => boolean) | undefined;
15
+ initKeyboardEvent?: ((typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, keyArg?: string, locationArg?: number, ctrlKey?: boolean, altKey?: boolean, shiftKey?: boolean, metaKey?: boolean) => void) | undefined;
16
+ DOM_KEY_LOCATION_STANDARD?: 0 | undefined;
17
+ DOM_KEY_LOCATION_LEFT?: 1 | undefined;
18
+ DOM_KEY_LOCATION_RIGHT?: 2 | undefined;
19
+ DOM_KEY_LOCATION_NUMPAD?: 3 | undefined;
20
+ detail?: number | undefined;
21
+ view?: Window | null | undefined;
22
+ which?: number | undefined;
23
+ initUIEvent?: ((typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, detailArg?: number) => void) | undefined;
24
+ bubbles?: boolean | undefined;
25
+ cancelBubble?: boolean | undefined;
26
+ cancelable?: boolean | undefined;
27
+ composed?: boolean | undefined;
28
+ currentTarget?: EventTarget | null | undefined;
29
+ defaultPrevented?: boolean | undefined;
30
+ eventPhase?: number | undefined;
31
+ isTrusted?: boolean | undefined;
32
+ returnValue?: boolean | undefined;
33
+ srcElement?: EventTarget | null | undefined;
34
+ target?: EventTarget | null | undefined;
35
+ timeStamp?: number | undefined;
36
+ type?: string | undefined;
37
+ composedPath?: (() => EventTarget[]) | undefined;
38
+ initEvent?: ((type: string, bubbles?: boolean, cancelable?: boolean) => void) | undefined;
39
+ preventDefault?: (() => void) | undefined;
40
+ stopImmediatePropagation?: (() => void) | undefined;
41
+ stopPropagation?: (() => void) | undefined;
42
+ NONE?: 0 | undefined;
43
+ CAPTURING_PHASE?: 1 | undefined;
44
+ AT_TARGET?: 2 | undefined;
45
+ BUBBLING_PHASE?: 3 | undefined;
46
+ };
47
+ export declare function word(input: string): Partial<KeyboardEvent>[];
48
+ export declare function type(events: Partial<KeyboardEvent>[], element?: Element | null): Promise<void>;
49
+ export declare function press(event: Partial<KeyboardEvent>, element?: Element | null): Promise<void>;
50
+ export declare enum MouseButton {
51
+ Left = 0,
52
+ Right = 2
53
+ }
54
+ export declare function click(element: Document | Element | Window | Node | null, button?: MouseButton): Promise<void>;
55
+ export declare function rawClick(element: Document | Element | Window | Node | null, button?: MouseButton): Promise<void>;
56
+ export declare function focus(element: Document | Element | Window | Node | null): Promise<void>;
57
+ export declare function blur(element: Document | Element | Window | Node | null): Promise<void>;
58
+ export declare function mouseEnter(element: Document | Element | Window | null): Promise<void>;
59
+ export declare function mouseMove(element: Document | Element | Window | null): Promise<void>;
60
+ export declare function mouseLeave(element: Document | Element | Window | null): Promise<void>;
61
+ export declare function mouseDrag(startingElement: Document | Element | Window | Node | null, endingElement: Document | Element | Window | Node | null): Promise<void>;
@@ -0,0 +1,453 @@
1
+ import { act, fireEvent } from "@testing-library/svelte";
2
+ import { pointer } from "./fake-pointer.js";
3
+ function nextFrame(cb) {
4
+ setImmediate(() => {
5
+ setImmediate(() => {
6
+ setImmediate(() => {
7
+ cb();
8
+ });
9
+ });
10
+ });
11
+ }
12
+ export let Keys = {
13
+ Space: { key: " ", keyCode: 32, charCode: 32 },
14
+ Enter: { key: "Enter", keyCode: 13, charCode: 13 },
15
+ Escape: { key: "Escape", keyCode: 27, charCode: 27 },
16
+ Backspace: { key: "Backspace", keyCode: 8 },
17
+ ArrowLeft: { key: "ArrowLeft", keyCode: 37 },
18
+ ArrowUp: { key: "ArrowUp", keyCode: 38 },
19
+ ArrowRight: { key: "ArrowRight", keyCode: 39 },
20
+ ArrowDown: { key: "ArrowDown", keyCode: 40 },
21
+ Home: { key: "Home", keyCode: 36 },
22
+ End: { key: "End", keyCode: 35 },
23
+ PageUp: { key: "PageUp", keyCode: 33 },
24
+ PageDown: { key: "PageDown", keyCode: 34 },
25
+ Tab: { key: "Tab", keyCode: 9, charCode: 9 },
26
+ };
27
+ export function shift(event) {
28
+ return { ...event, shiftKey: true };
29
+ }
30
+ export function word(input) {
31
+ let result = input.split("").map((key) => ({ key }));
32
+ let element = document.activeElement;
33
+ if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
34
+ fireEvent.change(element, {
35
+ target: Object.assign({}, element, { value: input }),
36
+ });
37
+ }
38
+ return result;
39
+ }
40
+ let Default = Symbol();
41
+ let Ignore = Symbol();
42
+ let cancellations = {
43
+ [Default]: {
44
+ keydown: new Set(["keypress"]),
45
+ keypress: new Set([]),
46
+ keyup: new Set([]),
47
+ },
48
+ [Keys.Enter.key]: {
49
+ keydown: new Set(["keypress", "click"]),
50
+ keypress: new Set(["click"]),
51
+ keyup: new Set([]),
52
+ },
53
+ [Keys.Space.key]: {
54
+ keydown: new Set(["keypress", "click"]),
55
+ keypress: new Set([]),
56
+ keyup: new Set(["click"]),
57
+ },
58
+ [Keys.Tab.key]: {
59
+ keydown: new Set(["keypress", "blur", "focus"]),
60
+ keypress: new Set([]),
61
+ keyup: new Set([]),
62
+ },
63
+ };
64
+ let order = {
65
+ [Default]: [
66
+ function keydown(element, event) {
67
+ return fireEvent.keyDown(element, event);
68
+ },
69
+ function keypress(element, event) {
70
+ return fireEvent.keyPress(element, event);
71
+ },
72
+ function input(element, event) {
73
+ // TODO: This should only fire when the element's value changes
74
+ return fireEvent.input(element, event);
75
+ },
76
+ function keyup(element, event) {
77
+ return fireEvent.keyUp(element, event);
78
+ },
79
+ ],
80
+ [Keys.Enter.key]: [
81
+ function keydown(element, event) {
82
+ return fireEvent.keyDown(element, event);
83
+ },
84
+ function keypress(element, event) {
85
+ return fireEvent.keyPress(element, event);
86
+ },
87
+ function click(element, event) {
88
+ if (element instanceof HTMLButtonElement)
89
+ return fireEvent.click(element, event);
90
+ return Ignore;
91
+ },
92
+ function keyup(element, event) {
93
+ return fireEvent.keyUp(element, event);
94
+ },
95
+ ],
96
+ [Keys.Space.key]: [
97
+ function keydown(element, event) {
98
+ return fireEvent.keyDown(element, event);
99
+ },
100
+ function keypress(element, event) {
101
+ return fireEvent.keyPress(element, event);
102
+ },
103
+ function keyup(element, event) {
104
+ return fireEvent.keyUp(element, event);
105
+ },
106
+ function click(element, event) {
107
+ if (element instanceof HTMLButtonElement)
108
+ return fireEvent.click(element, event);
109
+ return Ignore;
110
+ },
111
+ ],
112
+ [Keys.Tab.key]: [
113
+ function keydown(element, event) {
114
+ return fireEvent.keyDown(element, event);
115
+ },
116
+ function blurAndfocus(_element, event) {
117
+ return focusNext(event);
118
+ },
119
+ function keyup(element, event) {
120
+ return fireEvent.keyUp(element, event);
121
+ },
122
+ ],
123
+ [Keys.Escape.key]: [
124
+ function keydown(element, event) {
125
+ return fireEvent.keyDown(element, event);
126
+ },
127
+ function keypress(element, event) {
128
+ return fireEvent.keyPress(element, event);
129
+ },
130
+ function keyup(element, event) {
131
+ return fireEvent.keyUp(element, event);
132
+ },
133
+ ],
134
+ [Keys.Backspace.key]: [
135
+ function keydown(element, event) {
136
+ if (element instanceof HTMLInputElement) {
137
+ let ev = Object.assign({}, event, {
138
+ target: Object.assign({}, event.target, {
139
+ value: element.value.slice(0, -1),
140
+ }),
141
+ });
142
+ fireEvent.keyDown(element, ev);
143
+ return fireEvent.input(element, ev);
144
+ }
145
+ return fireEvent.keyDown(element, event);
146
+ },
147
+ function keyup(element, event) {
148
+ return fireEvent.keyUp(element, event);
149
+ },
150
+ ],
151
+ };
152
+ export async function type(events, element = document.activeElement) {
153
+ vitest.useFakeTimers();
154
+ try {
155
+ if (element === null)
156
+ return expect(element).not.toBe(null);
157
+ for (let event of events) {
158
+ let skip = new Set();
159
+ let actions = order[event.key] ?? order[Default];
160
+ for (let action of actions) {
161
+ let checks = action.name.split("And");
162
+ if (checks.some((check) => skip.has(check)))
163
+ continue;
164
+ let result = action(element, {
165
+ type: action.name,
166
+ charCode: event.key?.length === 1 ? event.key?.charCodeAt(0) : undefined,
167
+ ...event,
168
+ });
169
+ if (result === Ignore)
170
+ continue;
171
+ if (result instanceof Element) {
172
+ element = result;
173
+ }
174
+ let cancelled = !result;
175
+ if (cancelled) {
176
+ let skippablesForKey = cancellations[event.key] ?? cancellations[Default];
177
+ let skippables = skippablesForKey?.[action.name] ?? new Set();
178
+ for (let skippable of skippables)
179
+ skip.add(skippable);
180
+ }
181
+ }
182
+ }
183
+ // We don't want to actually wait in our tests, so let's advance
184
+ vitest.runAllTimers();
185
+ await new Promise(nextFrame);
186
+ }
187
+ catch (err) {
188
+ if (err instanceof Error)
189
+ Error.captureStackTrace(err, type);
190
+ throw err;
191
+ }
192
+ finally {
193
+ vitest.useRealTimers();
194
+ }
195
+ }
196
+ export async function press(event, element = document.activeElement) {
197
+ return type([event], element);
198
+ }
199
+ export var MouseButton;
200
+ (function (MouseButton) {
201
+ MouseButton[MouseButton["Left"] = 0] = "Left";
202
+ MouseButton[MouseButton["Right"] = 2] = "Right";
203
+ })(MouseButton || (MouseButton = {}));
204
+ export async function click(element, button = MouseButton.Left) {
205
+ return act(() => rawClick(element, button));
206
+ }
207
+ export async function rawClick(element, button = MouseButton.Left) {
208
+ try {
209
+ if (element === null)
210
+ return expect(element).not.toBe(null);
211
+ if (element instanceof HTMLButtonElement && element.disabled)
212
+ return;
213
+ let options = { button };
214
+ if (button === MouseButton.Left) {
215
+ // Cancel in pointerDown cancels mouseDown, mouseUp
216
+ let cancelled = !fireEvent.pointerDown(element, options);
217
+ if (!cancelled) {
218
+ cancelled = !fireEvent.mouseDown(element, options);
219
+ }
220
+ // Ensure to trigger a `focus` event if the element is focusable, or within a focusable element
221
+ if (!cancelled) {
222
+ let next = element;
223
+ while (next !== null) {
224
+ if (next.matches(focusableSelector)) {
225
+ act(() => {
226
+ // act scopes are called immediately. `next` should keep its type refinements.
227
+ next.focus();
228
+ });
229
+ break;
230
+ }
231
+ next = next.parentElement;
232
+ }
233
+ }
234
+ fireEvent.pointerUp(element, options);
235
+ if (!cancelled) {
236
+ fireEvent.mouseUp(element, options);
237
+ }
238
+ fireEvent.click(element, options);
239
+ }
240
+ else if (button === MouseButton.Right) {
241
+ // Cancel in pointerDown cancels mouseDown, mouseUp
242
+ let cancelled = !fireEvent.pointerDown(element, options);
243
+ if (!cancelled) {
244
+ fireEvent.mouseDown(element, options);
245
+ }
246
+ // Only in Firefox:
247
+ fireEvent.pointerUp(element, options);
248
+ if (!cancelled) {
249
+ fireEvent.mouseUp(element, options);
250
+ }
251
+ }
252
+ await new Promise(nextFrame);
253
+ }
254
+ catch (err) {
255
+ if (err instanceof Error)
256
+ Error.captureStackTrace(err, click);
257
+ throw err;
258
+ }
259
+ }
260
+ export async function focus(element) {
261
+ await act(async () => {
262
+ try {
263
+ if (element === null)
264
+ return expect(element).not.toBe(null);
265
+ if (element instanceof HTMLElement) {
266
+ element.focus();
267
+ }
268
+ else {
269
+ fireEvent.focus(element);
270
+ }
271
+ await new Promise(nextFrame);
272
+ }
273
+ catch (err) {
274
+ if (err instanceof Error)
275
+ Error.captureStackTrace(err, focus);
276
+ throw err;
277
+ }
278
+ });
279
+ }
280
+ export async function blur(element) {
281
+ await act(async () => {
282
+ try {
283
+ if (element === null)
284
+ return expect(element).not.toBe(null);
285
+ if (element instanceof HTMLElement) {
286
+ element.blur();
287
+ }
288
+ else {
289
+ fireEvent.blur(element);
290
+ }
291
+ await new Promise(nextFrame);
292
+ }
293
+ catch (err) {
294
+ if (err instanceof Error)
295
+ Error.captureStackTrace(err, blur);
296
+ throw err;
297
+ }
298
+ });
299
+ }
300
+ export async function mouseEnter(element) {
301
+ try {
302
+ if (element === null)
303
+ return expect(element).not.toBe(null);
304
+ fireEvent.pointerOver(element);
305
+ fireEvent.pointerEnter(element);
306
+ fireEvent.mouseOver(element);
307
+ await new Promise(nextFrame);
308
+ }
309
+ catch (err) {
310
+ if (err instanceof Error)
311
+ Error.captureStackTrace(err, mouseEnter);
312
+ throw err;
313
+ }
314
+ }
315
+ export async function mouseMove(element) {
316
+ try {
317
+ if (element === null)
318
+ return expect(element).not.toBe(null);
319
+ pointer.advance();
320
+ pointer.bypassingTrackingChecks(() => {
321
+ fireEvent.pointerMove(element);
322
+ });
323
+ fireEvent.mouseMove(element, pointer.options);
324
+ await new Promise(nextFrame);
325
+ }
326
+ catch (err) {
327
+ if (err instanceof Error)
328
+ Error.captureStackTrace(err, mouseMove);
329
+ throw err;
330
+ }
331
+ }
332
+ export async function mouseLeave(element) {
333
+ try {
334
+ if (element === null)
335
+ return expect(element).not.toBe(null);
336
+ pointer.advance();
337
+ pointer.bypassingTrackingChecks(() => {
338
+ fireEvent.pointerOut(element);
339
+ fireEvent.pointerLeave(element);
340
+ });
341
+ fireEvent.mouseOut(element, pointer.options);
342
+ fireEvent.mouseLeave(element, pointer.options);
343
+ await new Promise(nextFrame);
344
+ }
345
+ catch (err) {
346
+ if (err instanceof Error)
347
+ Error.captureStackTrace(err, mouseLeave);
348
+ throw err;
349
+ }
350
+ }
351
+ export async function mouseDrag(startingElement, endingElement) {
352
+ let button = MouseButton.Left;
353
+ try {
354
+ if (startingElement === null)
355
+ return expect(startingElement).not.toBe(null);
356
+ if (endingElement === null)
357
+ return expect(endingElement).not.toBe(null);
358
+ if (startingElement instanceof HTMLButtonElement && startingElement.disabled)
359
+ return;
360
+ let options = { button };
361
+ // Cancel in pointerDown cancels mouseDown, mouseUp
362
+ let cancelled = !fireEvent.pointerDown(startingElement, options);
363
+ if (!cancelled) {
364
+ cancelled = !fireEvent.mouseDown(startingElement, options);
365
+ }
366
+ // Ensure to trigger a `focus` event if the element is focusable, or within a focusable element
367
+ if (!cancelled) {
368
+ let next = startingElement;
369
+ while (next !== null) {
370
+ if (next.matches(focusableSelector)) {
371
+ act(() => {
372
+ // act scopes are called immediately. `next` should keep its type refinements.
373
+ next.focus();
374
+ });
375
+ break;
376
+ }
377
+ next = next.parentElement;
378
+ }
379
+ }
380
+ fireEvent.pointerMove(startingElement, options);
381
+ if (!cancelled) {
382
+ fireEvent.mouseMove(startingElement, options);
383
+ }
384
+ fireEvent.pointerOut(startingElement, options);
385
+ if (!cancelled) {
386
+ fireEvent.mouseOut(startingElement, options);
387
+ }
388
+ // crosses over to the ending element
389
+ fireEvent.pointerOver(endingElement, options);
390
+ if (!cancelled) {
391
+ fireEvent.mouseOver(endingElement, options);
392
+ }
393
+ fireEvent.pointerMove(endingElement, options);
394
+ if (!cancelled) {
395
+ fireEvent.mouseMove(endingElement, options);
396
+ }
397
+ fireEvent.pointerUp(endingElement, options);
398
+ if (!cancelled) {
399
+ fireEvent.mouseUp(endingElement, options);
400
+ }
401
+ fireEvent.click(endingElement, options);
402
+ await new Promise(nextFrame);
403
+ }
404
+ catch (err) {
405
+ if (err instanceof Error)
406
+ Error.captureStackTrace(err, click);
407
+ throw err;
408
+ }
409
+ }
410
+ // ---
411
+ function focusNext(event) {
412
+ let direction = event.shiftKey ? -1 : +1;
413
+ let focusableElements = getFocusableElements();
414
+ let total = focusableElements.length;
415
+ function innerFocusNext(offset = 0) {
416
+ let currentIdx = focusableElements.indexOf(document.activeElement);
417
+ let next = focusableElements[(currentIdx + total + direction + offset) % total];
418
+ if (next) {
419
+ act(() => {
420
+ next?.focus({ preventScroll: true });
421
+ });
422
+ }
423
+ if (next !== document.activeElement)
424
+ return innerFocusNext(offset + direction);
425
+ return next;
426
+ }
427
+ return innerFocusNext();
428
+ }
429
+ // Credit:
430
+ // - https://stackoverflow.com/a/30753870
431
+ let focusableSelector = [
432
+ "[contentEditable=true]",
433
+ "[tabindex]",
434
+ "a[href]",
435
+ "area[href]",
436
+ "button:not([disabled])",
437
+ "iframe",
438
+ "input:not([disabled])",
439
+ "select:not([disabled])",
440
+ "textarea:not([disabled])",
441
+ ]
442
+ .map(process.env.NODE_ENV === "test"
443
+ ? // TODO: Remove this once JSDOM fixes the issue where an element that is
444
+ // "hidden" can be the document.activeElement, because this is not possible
445
+ // in real browsers.
446
+ (selector) => `${selector}:not([tabindex='-1']):not([style*='display: none'])`
447
+ : (selector) => `${selector}:not([tabindex='-1'])`)
448
+ .join(",");
449
+ function getFocusableElements(container = document.body) {
450
+ if (!container)
451
+ return [];
452
+ return Array.from(container.querySelectorAll(focusableSelector));
453
+ }
@@ -0,0 +1,7 @@
1
+ import type { MockInstance } from "vitest";
2
+ type FunctionPropertyNames<T> = {
3
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
4
+ }[keyof T] & string;
5
+ export declare function suppressConsoleLogs<T extends unknown[]>(cb: (...args: T) => unknown, type?: FunctionPropertyNames<typeof globalThis.console>): (...args: T) => Promise<unknown>;
6
+ export declare function mockingConsoleLogs<T extends unknown[]>(cb: (spy: MockInstance, ...args: T) => unknown, type?: FunctionPropertyNames<typeof globalThis.console>): (...args: T) => Promise<unknown>;
7
+ export {};
@@ -0,0 +1,17 @@
1
+ import { vitest } from "vitest";
2
+ export function suppressConsoleLogs(cb, type = "error") {
3
+ return (...args) => {
4
+ let spy = vitest.spyOn(globalThis.console, type).mockImplementation(vitest.fn());
5
+ return new Promise((resolve, reject) => {
6
+ Promise.resolve(cb(...args)).then(resolve, reject);
7
+ }).finally(() => spy.mockRestore());
8
+ };
9
+ }
10
+ export function mockingConsoleLogs(cb, type = "error") {
11
+ return (...args) => {
12
+ let spy = vitest.spyOn(globalThis.console, type).mockImplementation(vitest.fn());
13
+ return new Promise((resolve, reject) => {
14
+ Promise.resolve(cb(spy, ...args)).then(resolve, reject);
15
+ }).finally(() => spy.mockRestore());
16
+ };
17
+ }