@prosekit/web 0.8.0-beta.0 → 0.8.0-beta.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 (207) hide show
  1. package/dist/prosekit-web-autocomplete.d.ts +112 -90
  2. package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
  3. package/dist/prosekit-web-autocomplete.js +292 -217
  4. package/dist/prosekit-web-autocomplete.js.map +1 -1
  5. package/dist/prosekit-web-block-handle.d.ts +95 -62
  6. package/dist/prosekit-web-block-handle.d.ts.map +1 -1
  7. package/dist/prosekit-web-block-handle.js +219 -114
  8. package/dist/prosekit-web-block-handle.js.map +1 -1
  9. package/dist/prosekit-web-drop-indicator.d.ts +13 -15
  10. package/dist/prosekit-web-drop-indicator.d.ts.map +1 -1
  11. package/dist/prosekit-web-drop-indicator.js +34 -30
  12. package/dist/prosekit-web-drop-indicator.js.map +1 -1
  13. package/dist/prosekit-web-inline-popover.d.ts +94 -53
  14. package/dist/prosekit-web-inline-popover.d.ts.map +1 -1
  15. package/dist/prosekit-web-inline-popover.js +134 -79
  16. package/dist/prosekit-web-inline-popover.js.map +1 -1
  17. package/dist/prosekit-web-menu.d.ts +13 -0
  18. package/dist/prosekit-web-menu.d.ts.map +1 -0
  19. package/dist/prosekit-web-menu.js +53 -0
  20. package/dist/prosekit-web-menu.js.map +1 -0
  21. package/dist/prosekit-web-popover.d.ts +7 -26
  22. package/dist/prosekit-web-popover.d.ts.map +1 -1
  23. package/dist/prosekit-web-popover.js +31 -29
  24. package/dist/prosekit-web-popover.js.map +1 -1
  25. package/dist/prosekit-web-resizable.d.ts +92 -51
  26. package/dist/prosekit-web-resizable.d.ts.map +1 -1
  27. package/dist/prosekit-web-resizable.js +139 -131
  28. package/dist/prosekit-web-resizable.js.map +1 -1
  29. package/dist/prosekit-web-table-handle.d.ts +166 -199
  30. package/dist/prosekit-web-table-handle.d.ts.map +1 -1
  31. package/dist/prosekit-web-table-handle.js +495 -496
  32. package/dist/prosekit-web-table-handle.js.map +1 -1
  33. package/dist/prosekit-web-tooltip.d.ts +7 -26
  34. package/dist/prosekit-web-tooltip.d.ts.map +1 -1
  35. package/dist/prosekit-web-tooltip.js +31 -29
  36. package/dist/prosekit-web-tooltip.js.map +1 -1
  37. package/dist/use-editor-extension.js +2 -2
  38. package/dist/use-editor-extension.js.map +1 -1
  39. package/dist/use-scrolling.js +17 -8
  40. package/dist/use-scrolling.js.map +1 -1
  41. package/package.json +26 -21
  42. package/src/components/autocomplete/autocomplete-empty.ts +45 -0
  43. package/src/components/autocomplete/autocomplete-item.ts +65 -0
  44. package/src/components/autocomplete/autocomplete-popup.ts +95 -0
  45. package/src/components/autocomplete/autocomplete-positioner.ts +98 -0
  46. package/src/components/autocomplete/autocomplete-root.ts +280 -0
  47. package/src/components/autocomplete/context.ts +16 -14
  48. package/src/components/autocomplete/index.ts +65 -0
  49. package/src/components/block-handle/block-handle-add.ts +71 -0
  50. package/src/components/block-handle/block-handle-draggable.ts +158 -0
  51. package/src/components/block-handle/block-handle-popup.ts +43 -0
  52. package/src/components/block-handle/block-handle-positioner.ts +89 -0
  53. package/src/components/block-handle/block-handle-root.ts +116 -0
  54. package/src/components/block-handle/context.ts +9 -18
  55. package/src/components/block-handle/hover-state.ts +16 -0
  56. package/src/components/block-handle/index.ts +59 -0
  57. package/src/components/block-handle/{block-handle-popover/pointer-move.ts → pointer-move.ts} +8 -7
  58. package/src/components/block-handle/{block-handle-draggable/set-drag-preview.ts → set-drag-preview.ts} +4 -4
  59. package/src/components/block-handle/use-hover-extension.ts +65 -0
  60. package/src/components/drop-indicator/drop-indicator.ts +128 -0
  61. package/src/components/drop-indicator/index.ts +18 -0
  62. package/src/components/inline-popover/index.ts +41 -0
  63. package/src/components/inline-popover/inline-popover-popup.ts +52 -0
  64. package/src/components/inline-popover/inline-popover-positioner.ts +118 -0
  65. package/src/components/inline-popover/inline-popover-root.ts +122 -0
  66. package/src/components/inline-popover/store.ts +6 -0
  67. package/src/components/menu/index.ts +92 -0
  68. package/src/components/popover/index.ts +53 -0
  69. package/src/components/resizable/{resizable-handle/calc-resize.ts → calc-resize.ts} +1 -1
  70. package/src/components/resizable/context.ts +3 -6
  71. package/src/components/resizable/index.ts +32 -0
  72. package/src/components/resizable/resizable-handle.ts +134 -0
  73. package/src/components/resizable/resizable-root.ts +184 -0
  74. package/src/components/table-handle/dnd.ts +16 -27
  75. package/src/components/table-handle/index.ts +125 -0
  76. package/src/components/table-handle/{table-handle-drag-preview/render-preview.ts → render-preview.ts} +5 -5
  77. package/src/components/table-handle/shared.ts +61 -0
  78. package/src/components/table-handle/store.ts +117 -0
  79. package/src/components/table-handle/table-handle-column-menu-root.ts +51 -0
  80. package/src/components/table-handle/table-handle-column-menu-trigger.ts +107 -0
  81. package/src/components/table-handle/table-handle-column-popup.ts +44 -0
  82. package/src/components/table-handle/table-handle-column-positioner.ts +67 -0
  83. package/src/components/table-handle/table-handle-drag-preview.ts +169 -0
  84. package/src/components/table-handle/table-handle-drop-indicator.ts +166 -0
  85. package/src/components/table-handle/table-handle-root.ts +103 -0
  86. package/src/components/table-handle/table-handle-row-menu-root.ts +51 -0
  87. package/src/components/table-handle/table-handle-row-menu-trigger.ts +107 -0
  88. package/src/components/table-handle/table-handle-row-popup.ts +42 -0
  89. package/src/components/table-handle/table-handle-row-positioner.ts +67 -0
  90. package/src/components/table-handle/use-drop.ts +74 -0
  91. package/src/components/table-handle/{hooks/use-empty-image.ts → use-empty-image.ts} +2 -3
  92. package/src/components/table-handle/utils.ts +0 -11
  93. package/src/components/tooltip/index.ts +52 -0
  94. package/src/hooks/use-editor-extension.ts +4 -4
  95. package/src/hooks/use-editor-focus-event.ts +4 -4
  96. package/src/hooks/use-editor-typing.ts +12 -16
  97. package/src/hooks/use-editor-update-event.ts +4 -4
  98. package/src/hooks/use-keymap.ts +4 -4
  99. package/src/hooks/use-scrolling.ts +11 -10
  100. package/src/hooks/use-selecting.ts +8 -15
  101. package/src/utils/event.ts +28 -0
  102. package/src/utils/lazy-signal.spec.ts +68 -0
  103. package/src/utils/lazy-signal.ts +17 -0
  104. package/src/utils/prefers-reduced-motion.ts +6 -0
  105. package/src/utils/prevent-default.ts +3 -0
  106. package/src/utils/use-html-element-at.ts +17 -0
  107. package/src/utils/use-no-focus.ts +7 -0
  108. package/dist/get-default-state.js +0 -11
  109. package/dist/get-default-state.js.map +0 -1
  110. package/src/components/autocomplete/autocomplete-empty/element.gen.ts +0 -18
  111. package/src/components/autocomplete/autocomplete-empty/setup.ts +0 -6
  112. package/src/components/autocomplete/autocomplete-empty/types.ts +0 -13
  113. package/src/components/autocomplete/autocomplete-item/element.gen.ts +0 -18
  114. package/src/components/autocomplete/autocomplete-item/setup.ts +0 -30
  115. package/src/components/autocomplete/autocomplete-item/types.ts +0 -25
  116. package/src/components/autocomplete/autocomplete-list/element.gen.ts +0 -18
  117. package/src/components/autocomplete/autocomplete-list/setup.ts +0 -125
  118. package/src/components/autocomplete/autocomplete-list/types.ts +0 -22
  119. package/src/components/autocomplete/autocomplete-popover/element.gen.ts +0 -18
  120. package/src/components/autocomplete/autocomplete-popover/setup.ts +0 -169
  121. package/src/components/autocomplete/autocomplete-popover/types.ts +0 -100
  122. package/src/components/autocomplete/index.gen.ts +0 -17
  123. package/src/components/block-handle/block-handle-add/element.gen.ts +0 -18
  124. package/src/components/block-handle/block-handle-add/setup.ts +0 -33
  125. package/src/components/block-handle/block-handle-add/types.ts +0 -23
  126. package/src/components/block-handle/block-handle-draggable/element.gen.ts +0 -18
  127. package/src/components/block-handle/block-handle-draggable/setup.ts +0 -113
  128. package/src/components/block-handle/block-handle-draggable/types.ts +0 -23
  129. package/src/components/block-handle/block-handle-popover/element.gen.ts +0 -18
  130. package/src/components/block-handle/block-handle-popover/setup.ts +0 -68
  131. package/src/components/block-handle/block-handle-popover/types.ts +0 -81
  132. package/src/components/block-handle/index.gen.ts +0 -13
  133. package/src/components/drop-indicator/drop-indicator/element.gen.ts +0 -18
  134. package/src/components/drop-indicator/drop-indicator/setup.ts +0 -75
  135. package/src/components/drop-indicator/drop-indicator/types.ts +0 -31
  136. package/src/components/drop-indicator/index.gen.ts +0 -5
  137. package/src/components/inline-popover/index.gen.ts +0 -5
  138. package/src/components/inline-popover/inline-popover/element.gen.ts +0 -18
  139. package/src/components/inline-popover/inline-popover/setup.ts +0 -111
  140. package/src/components/inline-popover/inline-popover/types.ts +0 -112
  141. package/src/components/popover/index.gen.ts +0 -13
  142. package/src/components/popover/popover-content/element.gen.ts +0 -18
  143. package/src/components/popover/popover-content/setup.ts +0 -1
  144. package/src/components/popover/popover-content/types.ts +0 -6
  145. package/src/components/popover/popover-root/element.gen.ts +0 -18
  146. package/src/components/popover/popover-root/setup.ts +0 -1
  147. package/src/components/popover/popover-root/types.ts +0 -6
  148. package/src/components/popover/popover-trigger/element.gen.ts +0 -18
  149. package/src/components/popover/popover-trigger/setup.ts +0 -1
  150. package/src/components/popover/popover-trigger/types.ts +0 -6
  151. package/src/components/resizable/index.gen.ts +0 -9
  152. package/src/components/resizable/resizable-handle/element.gen.ts +0 -18
  153. package/src/components/resizable/resizable-handle/setup.ts +0 -106
  154. package/src/components/resizable/resizable-handle/types.ts +0 -29
  155. package/src/components/resizable/resizable-root/element.gen.ts +0 -18
  156. package/src/components/resizable/resizable-root/setup.ts +0 -84
  157. package/src/components/resizable/resizable-root/types.ts +0 -59
  158. package/src/components/table-handle/context.ts +0 -43
  159. package/src/components/table-handle/hooks/use-drop.ts +0 -85
  160. package/src/components/table-handle/index.gen.ts +0 -37
  161. package/src/components/table-handle/table-handle-column-root/element.gen.ts +0 -18
  162. package/src/components/table-handle/table-handle-column-root/setup.ts +0 -60
  163. package/src/components/table-handle/table-handle-column-root/types.ts +0 -73
  164. package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +0 -18
  165. package/src/components/table-handle/table-handle-column-trigger/setup.ts +0 -64
  166. package/src/components/table-handle/table-handle-column-trigger/types.ts +0 -20
  167. package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +0 -18
  168. package/src/components/table-handle/table-handle-drag-preview/setup.ts +0 -57
  169. package/src/components/table-handle/table-handle-drag-preview/types.ts +0 -14
  170. package/src/components/table-handle/table-handle-drag-preview/updater.ts +0 -90
  171. package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +0 -18
  172. package/src/components/table-handle/table-handle-drop-indicator/setup.ts +0 -52
  173. package/src/components/table-handle/table-handle-drop-indicator/types.ts +0 -15
  174. package/src/components/table-handle/table-handle-drop-indicator/updater.ts +0 -96
  175. package/src/components/table-handle/table-handle-popover-content/element.gen.ts +0 -18
  176. package/src/components/table-handle/table-handle-popover-content/setup.ts +0 -83
  177. package/src/components/table-handle/table-handle-popover-content/types.ts +0 -32
  178. package/src/components/table-handle/table-handle-popover-item/element.gen.ts +0 -18
  179. package/src/components/table-handle/table-handle-popover-item/setup.ts +0 -17
  180. package/src/components/table-handle/table-handle-popover-item/types.ts +0 -16
  181. package/src/components/table-handle/table-handle-root/element.gen.ts +0 -18
  182. package/src/components/table-handle/table-handle-root/setup.ts +0 -86
  183. package/src/components/table-handle/table-handle-root/types.ts +0 -23
  184. package/src/components/table-handle/table-handle-row-root/element.gen.ts +0 -18
  185. package/src/components/table-handle/table-handle-row-root/setup.ts +0 -70
  186. package/src/components/table-handle/table-handle-row-root/types.ts +0 -68
  187. package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +0 -18
  188. package/src/components/table-handle/table-handle-row-trigger/setup.ts +0 -63
  189. package/src/components/table-handle/table-handle-row-trigger/types.ts +0 -23
  190. package/src/components/tooltip/index.gen.ts +0 -13
  191. package/src/components/tooltip/tooltip-content/element.gen.ts +0 -18
  192. package/src/components/tooltip/tooltip-content/setup.ts +0 -1
  193. package/src/components/tooltip/tooltip-content/types.ts +0 -6
  194. package/src/components/tooltip/tooltip-root/element.gen.ts +0 -18
  195. package/src/components/tooltip/tooltip-root/setup.ts +0 -1
  196. package/src/components/tooltip/tooltip-root/types.ts +0 -6
  197. package/src/components/tooltip/tooltip-trigger/element.gen.ts +0 -18
  198. package/src/components/tooltip/tooltip-trigger/setup.ts +0 -1
  199. package/src/components/tooltip/tooltip-trigger/types.ts +0 -6
  200. package/src/hooks/use-first-rendering.ts +0 -15
  201. package/src/utils/get-default-state.spec.ts +0 -42
  202. package/src/utils/get-default-state.ts +0 -18
  203. /package/src/components/autocomplete/{autocomplete-popover/helpers.spec.ts → helpers.spec.ts} +0 -0
  204. /package/src/components/autocomplete/{autocomplete-popover/helpers.ts → helpers.ts} +0 -0
  205. /package/src/components/inline-popover/{inline-popover/virtual-selection-element.ts → virtual-selection-element.ts} +0 -0
  206. /package/src/components/resizable/{resizable-handle/calc-resize.spec.ts → calc-resize.spec.ts} +0 -0
  207. /package/src/components/table-handle/{table-handle-drop-indicator/calc-drag-over.ts → calc-drag-over.ts} +0 -0
@@ -1,228 +1,334 @@
1
- import { t as getStateWithDefaults } from "./get-default-state.js";
2
1
  import { t as useEditorExtension } from "./use-editor-extension.js";
3
2
  import { t as getSafeEditorView } from "./get-safe-editor-view.js";
4
- import { createComputed, createContext, createSignal, defineCustomElement, registerCustomElement, useAnimationFrame, useAttribute, useEffect, useEventListener } from "@aria-ui/core";
5
- import { listboxProps, useListbox, useListboxEmpty, useListboxItem } from "@aria-ui/listbox/elements";
6
- import { listboxEvents, listboxItemEvents, listboxProps as listboxProps$1 } from "@aria-ui/listbox";
3
+ import { createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect, useEventListener } from "@aria-ui/core";
4
+ import { SelectEvent, ValueChangeEvent, ValuesChangeEvent, defaultItemFilter, setupListboxEmpty, setupListboxItem, setupListboxRoot } from "@aria-ui/elements/listbox";
5
+ import { OpenChangeEvent, OverlayPopupPropsDeclaration, OverlayPositionerPropsDeclaration, createOverlayStore, setupOverlayPopup, setupOverlayPositioner } from "@aria-ui/elements/overlay";
7
6
  import { defineDOMEventHandler, defineKeymap, withPriority } from "@prosekit/core";
8
- import { overlayPositionerEvents, overlayPositionerProps, useOverlayPositionerState } from "@aria-ui/overlay/elements";
9
- import { usePresence } from "@aria-ui/presence";
10
7
  import { AutocompleteRule, defineAutocomplete } from "@prosekit/extensions/autocomplete";
11
- //#region src/components/autocomplete/autocomplete-empty/setup.ts
8
+ //#region src/components/autocomplete/autocomplete-empty.ts
9
+ /** @internal */
10
+ const AutocompleteEmptyPropsDeclaration = /* @__PURE__ */ defineProps({});
12
11
  /**
13
12
  * @internal
14
13
  */
15
- const useAutocompleteEmpty = useListboxEmpty;
16
- //#endregion
17
- //#region src/components/autocomplete/autocomplete-empty/types.ts
18
- /** @internal */
19
- const autocompleteEmptyProps = {};
20
- /** @internal */
21
- const autocompleteEmptyEvents = {};
22
- //#endregion
23
- //#region src/components/autocomplete/autocomplete-empty/element.gen.ts
24
- const AutocompleteEmptyElementBase = defineCustomElement({
25
- props: autocompleteEmptyProps,
26
- events: autocompleteEmptyEvents,
27
- setup: useAutocompleteEmpty
28
- });
14
+ function setupAutocompleteEmpty(host, props) {
15
+ setupListboxEmpty(host, props);
16
+ }
17
+ const AutocompleteEmptyElementBase = defineCustomElement(setupAutocompleteEmpty, AutocompleteEmptyPropsDeclaration);
18
+ /**
19
+ * @public
20
+ */
29
21
  var AutocompleteEmptyElement = class extends AutocompleteEmptyElementBase {};
30
- registerCustomElement("prosekit-autocomplete-empty", AutocompleteEmptyElement);
22
+ /** @internal */
23
+ function registerAutocompleteEmptyElement() {
24
+ registerCustomElement("prosekit-autocomplete-empty", AutocompleteEmptyElement);
25
+ }
31
26
  //#endregion
32
- //#region src/components/autocomplete/context.ts
33
- const queryContext = createContext("prosekit/autocomplete-popover/query", "");
34
- const onSubmitContext = createContext("prosekit/autocomplete-popover/onSubmit", null);
35
- const openContext = createContext("prosekit/autocomplete-popover/open", false);
27
+ //#region src/utils/prevent-default.ts
28
+ function preventDefault(event) {
29
+ event.preventDefault();
30
+ }
36
31
  //#endregion
37
- //#region src/components/autocomplete/autocomplete-item/setup.ts
32
+ //#region src/components/autocomplete/autocomplete-item.ts
33
+ /** @internal */
34
+ const AutocompleteItemPropsDeclaration = /* @__PURE__ */ defineProps({
35
+ value: {
36
+ default: "",
37
+ attribute: "value",
38
+ type: "string"
39
+ },
40
+ disabled: {
41
+ default: false,
42
+ attribute: "disabled",
43
+ type: "boolean"
44
+ }
45
+ });
38
46
  /**
39
47
  * @internal
40
48
  */
41
- function useAutocompleteItem(element, { state, emit }) {
42
- useListboxItem(element, {
43
- state,
44
- emit
45
- });
46
- const open = openContext.consume(element);
47
- useEffect(element, () => {
48
- if (!state.value.peek() && open.get()) state.value.set(element.textContent ?? "");
49
- });
50
- useEventListener(element, "pointerdown", (event) => {
51
- event.preventDefault();
52
- });
49
+ function setupAutocompleteItem(host, props) {
50
+ setupListboxItem(host, props);
51
+ useEventListener(host, "pointerdown", preventDefault);
52
+ useEventListener(host, "mousedown", preventDefault);
53
53
  }
54
- //#endregion
55
- //#region src/components/autocomplete/autocomplete-item/types.ts
56
- /** @internal */
57
- const autocompleteItemProps = { value: { default: "" } };
54
+ const AutocompleteItemElementBase = defineCustomElement(setupAutocompleteItem, AutocompleteItemPropsDeclaration);
55
+ /**
56
+ * @public
57
+ */
58
+ var AutocompleteItemElement = class extends AutocompleteItemElementBase {};
58
59
  /** @internal */
59
- const autocompleteItemEvents = listboxItemEvents;
60
+ function registerAutocompleteItemElement() {
61
+ registerCustomElement("prosekit-autocomplete-item", AutocompleteItemElement);
62
+ }
60
63
  //#endregion
61
- //#region src/components/autocomplete/autocomplete-item/element.gen.ts
62
- const AutocompleteItemElementBase = defineCustomElement({
63
- props: autocompleteItemProps,
64
- events: autocompleteItemEvents,
65
- setup: useAutocompleteItem
66
- });
67
- var AutocompleteItemElement = class extends AutocompleteItemElementBase {};
68
- registerCustomElement("prosekit-autocomplete-item", AutocompleteItemElement);
64
+ //#region src/utils/lazy-signal.ts
65
+ function createLazySignal(getRemote, fallback) {
66
+ return {
67
+ get: () => {
68
+ const remote = getRemote();
69
+ return remote ? remote.get() : fallback;
70
+ },
71
+ set: (value) => {
72
+ const remote = getRemote();
73
+ if (remote) remote.set(value);
74
+ }
75
+ };
76
+ }
77
+ //#endregion
78
+ //#region src/utils/use-no-focus.ts
79
+ function useNoFocus(host) {
80
+ onMount(host, () => {
81
+ host.tabIndex = -1;
82
+ });
83
+ }
69
84
  //#endregion
70
- //#region src/components/autocomplete/autocomplete-list/setup.ts
85
+ //#region src/components/autocomplete/context.ts
71
86
  /**
72
87
  * @internal
73
88
  */
74
- function useAutocompleteList(element, { state, emit }) {
75
- const open = openContext.consume(element);
76
- const query = queryContext.consume(element);
77
- const onSubmit = onSubmitContext.consume(element);
78
- const keydownTarget = useKeyDownTarget(element, open, state.editor);
79
- const listboxState = getStateWithDefaults({
80
- filter: state.filter,
81
- eventTarget: createSignal(keydownTarget)
82
- }, listboxProps);
83
- useEffect(element, () => {
84
- element.addEventListener("valueChange", () => {
85
- if (onSubmit) onSubmit.get()?.();
86
- });
87
- });
88
- useListbox(element, {
89
- state: listboxState,
90
- emit
91
- });
92
- useEffect(element, () => {
93
- listboxState.query.set(query.get());
94
- });
95
- useEffect(element, () => {
96
- if (!open.get()) {
97
- listboxState.value.set("");
98
- query.set("");
99
- }
100
- });
101
- useEffect(element, () => {
102
- if (!open.get()) listboxState.autoFocus.set(false);
103
- else {
104
- let canceled = false;
105
- requestAnimationFrame(() => {
106
- if (canceled) return;
107
- listboxState.autoFocus.set(true);
108
- });
109
- return () => {
110
- canceled = true;
111
- };
112
- }
113
- });
114
- useEffect(element, () => {
115
- element.tabIndex = -1;
116
- });
89
+ const autocompleteStoreContext = createContext("prosekit-autocomplete-store");
90
+ //#endregion
91
+ //#region src/components/autocomplete/autocomplete-popup.ts
92
+ /** @internal */
93
+ const AutocompletePopupPropsDeclaration = /* @__PURE__ */ defineProps(OverlayPopupPropsDeclaration);
94
+ /** @internal */
95
+ function setupAutocompletePopup(host, _props) {
96
+ const getStore = autocompleteStoreContext.consume(host);
97
+ const getOverlayStore = () => getStore()?.overlayStore;
98
+ setupOverlayPopup(host, getOverlayStore);
99
+ const query = createLazySignal(() => getStore()?.query, " ");
100
+ const eventTarget = createLazySignal(() => getStore()?.eventTarget, null);
101
+ const filter = createLazySignal(() => getStore()?.filter, defaultItemFilter);
102
+ const getDisabled = () => !getOverlayStore()?.getIsOpen?.();
103
+ setupListboxRoot(host, createPopupListboxProps(filter, query, eventTarget, {
104
+ get: getDisabled,
105
+ set: () => {}
106
+ }));
107
+ useNoFocus(host);
117
108
  }
118
- function useKeyDownTarget(element, open, editor) {
119
- const keydownHandlers = [];
120
- useEffect(element, () => {
121
- const editorValue = editor.get();
122
- if (!editorValue) return;
123
- const extension = defineDOMEventHandler("keydown", (view, event) => {
124
- if (view.composing || event.defaultPrevented || !open.get()) return false;
125
- keydownHandlers.forEach((handler) => handler(event));
126
- return event.defaultPrevented;
127
- });
128
- return editorValue.use(withPriority(extension, 4));
129
- });
109
+ function createPopupListboxProps(filter, query, eventTarget, disabled) {
130
110
  return {
131
- addEventListener: (type, listener) => {
132
- if (type === "keydown") keydownHandlers.push(listener);
133
- },
134
- removeEventListener: (type, listener) => {
135
- if (type === "keydown") {
136
- const index = keydownHandlers.indexOf(listener);
137
- if (index !== -1) keydownHandlers.splice(index, 1);
138
- }
139
- }
111
+ value: createSignal(""),
112
+ values: createSignal([]),
113
+ multiple: createSignal(false),
114
+ disabled,
115
+ orientation: createSignal("vertical"),
116
+ loop: createSignal(false),
117
+ autoHighlight: createSignal(true),
118
+ query,
119
+ eventTarget,
120
+ filter
140
121
  };
141
122
  }
123
+ const AutocompletePopupElementBase = defineCustomElement(setupAutocompletePopup, AutocompletePopupPropsDeclaration);
124
+ /**
125
+ * @public
126
+ */
127
+ var AutocompletePopupElement = class extends AutocompletePopupElementBase {};
128
+ /** @internal */
129
+ function registerAutocompletePopupElement() {
130
+ registerCustomElement("prosekit-autocomplete-popup", AutocompletePopupElement);
131
+ }
142
132
  //#endregion
143
- //#region src/components/autocomplete/autocomplete-list/types.ts
144
- const autocompleteListProps = {
145
- filter: listboxProps$1.filter,
146
- editor: { default: null }
147
- };
148
- const autocompleteListEvents = { ...listboxEvents };
149
- //#endregion
150
- //#region src/components/autocomplete/autocomplete-list/element.gen.ts
151
- const AutocompleteListElementBase = defineCustomElement({
152
- props: autocompleteListProps,
153
- events: autocompleteListEvents,
154
- setup: useAutocompleteList
133
+ //#region src/components/autocomplete/autocomplete-positioner.ts
134
+ const defaultBoundary = typeof document !== "undefined" && document.querySelector("body") || "clippingAncestors";
135
+ /** @internal */
136
+ const AutocompletePositionerPropsDeclaration = /* @__PURE__ */ defineProps({
137
+ ...OverlayPositionerPropsDeclaration,
138
+ placement: {
139
+ default: "bottom-start",
140
+ attribute: "placement",
141
+ type: "string"
142
+ },
143
+ offset: {
144
+ default: 4,
145
+ attribute: false,
146
+ type: "json"
147
+ },
148
+ inline: {
149
+ default: true,
150
+ attribute: "inline",
151
+ type: "boolean"
152
+ },
153
+ hoist: {
154
+ default: true,
155
+ attribute: "hoist",
156
+ type: "boolean"
157
+ },
158
+ fitViewport: {
159
+ default: true,
160
+ attribute: "fit-viewport",
161
+ type: "boolean"
162
+ },
163
+ boundary: {
164
+ default: defaultBoundary,
165
+ attribute: false,
166
+ type: "json"
167
+ },
168
+ overflowPadding: {
169
+ default: 8,
170
+ attribute: "overflow-padding",
171
+ type: "number"
172
+ }
155
173
  });
156
- var AutocompleteListElement = class extends AutocompleteListElementBase {};
157
- registerCustomElement("prosekit-autocomplete-list", AutocompleteListElement);
174
+ /** @internal */
175
+ function setupAutocompletePositioner(host, props) {
176
+ const getStore = autocompleteStoreContext.consume(host);
177
+ const getOverlayStore = () => getStore()?.overlayStore;
178
+ setupOverlayPositioner(host, props, getOverlayStore);
179
+ }
180
+ const AutocompletePositionerElementBase = defineCustomElement(setupAutocompletePositioner, AutocompletePositionerPropsDeclaration);
181
+ /**
182
+ * @public
183
+ */
184
+ var AutocompletePositionerElement = class extends AutocompletePositionerElementBase {};
185
+ /** @internal */
186
+ function registerAutocompletePositionerElement() {
187
+ registerCustomElement("prosekit-autocomplete-positioner", AutocompletePositionerElement);
188
+ }
158
189
  //#endregion
159
- //#region src/hooks/use-first-rendering.ts
160
- function useFirstRendering(host) {
161
- const firstRendering = createSignal(true);
162
- useEffect(host, () => {
163
- requestAnimationFrame(() => {
164
- firstRendering.set(false);
165
- });
190
+ //#region src/utils/event.ts
191
+ function cloneKeyboardEvent(source) {
192
+ return new KeyboardEvent(source.type, {
193
+ code: source.code,
194
+ key: source.key,
195
+ location: source.location,
196
+ repeat: source.repeat,
197
+ altKey: source.altKey,
198
+ ctrlKey: source.ctrlKey,
199
+ metaKey: source.metaKey,
200
+ shiftKey: source.shiftKey,
201
+ view: source.view,
202
+ bubbles: false,
203
+ cancelable: true
166
204
  });
167
- return firstRendering;
168
205
  }
206
+ var KeyboardEventTarget = class extends EventTarget {
207
+ dispatchEvent(event) {
208
+ const newEvent = cloneKeyboardEvent(event);
209
+ const result = super.dispatchEvent(newEvent);
210
+ if (newEvent.defaultPrevented) event.preventDefault();
211
+ return result;
212
+ }
213
+ };
169
214
  //#endregion
170
- //#region src/components/autocomplete/autocomplete-popover/helpers.ts
215
+ //#region src/components/autocomplete/helpers.ts
171
216
  function defaultQueryBuilder(match) {
172
217
  return match[0].toLowerCase().replaceAll(/[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~]/g, "").replaceAll(/\s\s+/g, " ").trim();
173
218
  }
174
219
  //#endregion
175
- //#region src/components/autocomplete/autocomplete-popover/setup.ts
220
+ //#region src/components/autocomplete/autocomplete-root.ts
221
+ /** @internal */
222
+ const AutocompleteRootPropsDeclaration = /* @__PURE__ */ defineProps({
223
+ editor: {
224
+ default: null,
225
+ attribute: false,
226
+ type: "json"
227
+ },
228
+ regex: {
229
+ default: null,
230
+ attribute: false,
231
+ type: "json"
232
+ },
233
+ filter: {
234
+ default: defaultItemFilter,
235
+ attribute: false,
236
+ type: "json"
237
+ }
238
+ });
239
+ /**
240
+ * @public
241
+ */
242
+ var QueryChangeEvent = class extends Event {
243
+ constructor(query) {
244
+ super("queryChange", { bubbles: true });
245
+ this.detail = query;
246
+ }
247
+ };
176
248
  /**
177
249
  * @internal
178
250
  */
179
- function useAutocompletePopover(host, { state, emit }) {
180
- const { editor, regex, ...overlayState } = state;
181
- const reference = createSignal(null);
251
+ function setupAutocompleteRoot(host, props) {
252
+ const getEditor = props.editor.get;
253
+ const reference = createSignal(void 0);
254
+ const open = createSignal(false);
182
255
  const query = createSignal("");
183
- const onDismiss = createSignal(null);
184
- const onSubmit = createSignal(null);
185
- const presence = createComputed(() => !!reference.get());
186
- queryContext.provide(host, query);
187
- onSubmitContext.provide(host, onSubmit);
188
- openContext.provide(host, presence);
189
- useEscapeKeydown(host, editor, createKeymapHandler(onDismiss, presence));
190
- useAutocompleteExtension(host, editor, regex, reference, query, onDismiss, onSubmit);
191
- useOverlayPositionerState(host, overlayState, { reference });
192
- useAttribute(host, "data-state", () => presence.get() ? "open" : "closed");
193
- usePresence(host, presence);
194
- const firstRendering = useFirstRendering(host);
256
+ const keyboardTarget = new KeyboardEventTarget();
257
+ const eventTarget = createSignal(keyboardTarget);
258
+ const handlers = {};
259
+ const overlayStore = createOverlayStore(open.get, open.set, () => false, () => false, (event) => host.dispatchEvent(event));
195
260
  useEffect(host, () => {
196
- const queryValue = query.get();
197
- if (!firstRendering.peek()) emit("queryChange", queryValue);
261
+ overlayStore.setAnchorElement(reference.get());
198
262
  });
199
- useAnimationFrame(host, () => {
200
- const presenceValue = presence.get();
201
- return () => {
202
- emit("openChange", presenceValue);
203
- };
263
+ const autocompleteStore = {
264
+ overlayStore,
265
+ query,
266
+ eventTarget,
267
+ filter: props.filter
268
+ };
269
+ autocompleteStoreContext.provide(host, autocompleteStore);
270
+ useEventListener(host, "valueChange", () => {
271
+ handlers.submit?.();
272
+ });
273
+ useKeyboardBridge(host, getEditor, open.get, keyboardTarget);
274
+ useEscapeKeydown(host, getEditor, () => {
275
+ if (!open.get() || !handlers.dismiss) return false;
276
+ handlers.dismiss();
277
+ return true;
204
278
  });
279
+ const setQuery = (next) => {
280
+ if (query.get() === next) return;
281
+ query.set(next);
282
+ host.dispatchEvent(new QueryChangeEvent(next));
283
+ };
284
+ useAutocompleteExtension(host, getEditor, props.regex.get, {
285
+ reference,
286
+ handlers,
287
+ setQuery,
288
+ requestOpenChange: (open) => overlayStore.requestOpenChange(open)
289
+ });
290
+ }
291
+ const EVENT_KEYS = [
292
+ "ArrowDown",
293
+ "ArrowRight",
294
+ "ArrowUp",
295
+ "ArrowLeft",
296
+ "Home",
297
+ "End",
298
+ "Enter"
299
+ ];
300
+ function useKeyboardBridge(host, getEditor, getOpen, target) {
301
+ useEditorExtension(host, getEditor, withPriority(defineDOMEventHandler("keydown", (view, event) => {
302
+ if (view.composing || event.defaultPrevented || !getOpen() || !EVENT_KEYS.includes(event.key)) return false;
303
+ target.dispatchEvent(event);
304
+ return event.defaultPrevented;
305
+ }), 4));
205
306
  }
206
- function useAutocompleteExtension(host, editor, regex, reference, query, onDismiss, onSubmit) {
307
+ function useAutocompleteExtension(host, getEditor, getRegex, deps) {
207
308
  useEffect(host, () => {
208
- const editorValue = editor.get();
209
- const regexValue = regex.get();
210
- if (!editorValue || !regexValue) return;
211
- const extension = defineAutocomplete(createAutocompleteRule(editorValue, regexValue, reference, query, onDismiss, onSubmit));
212
- return editorValue.use(extension);
309
+ const editor = getEditor();
310
+ const regex = getRegex();
311
+ if (!editor || !regex) return;
312
+ const extension = defineAutocomplete(createAutocompleteRule(editor, regex, deps));
313
+ return editor.use(extension);
213
314
  });
214
315
  }
215
- function createAutocompleteRule(editor, regex, reference, query, onDismiss, onSubmit) {
316
+ function createAutocompleteRule(editor, regex, deps) {
317
+ const { reference, handlers, setQuery, requestOpenChange } = deps;
216
318
  const handleEnter = (options) => {
217
319
  const span = getSafeEditorView(editor)?.dom.querySelector(".prosekit-autocomplete-match");
218
320
  if (span) reference.set(span);
219
- query.set(defaultQueryBuilder(options.match));
220
- onDismiss.set(options.ignoreMatch);
221
- onSubmit.set(options.deleteMatch);
321
+ handlers.submit = options.deleteMatch;
322
+ handlers.dismiss = options.ignoreMatch;
323
+ setQuery(defaultQueryBuilder(options.match));
324
+ requestOpenChange(true);
222
325
  };
223
326
  const handleLeave = () => {
224
- reference.set(null);
225
- query.set("");
327
+ reference.set(void 0);
328
+ setQuery("");
329
+ handlers.submit = void 0;
330
+ handlers.dismiss = void 0;
331
+ requestOpenChange(false);
226
332
  };
227
333
  return new AutocompleteRule({
228
334
  regex,
@@ -230,50 +336,19 @@ function createAutocompleteRule(editor, regex, reference, query, onDismiss, onSu
230
336
  onLeave: handleLeave
231
337
  });
232
338
  }
233
- function createKeymapHandler(handler, enabled) {
234
- return () => {
235
- if (!enabled.get()) return false;
236
- const fn = handler.peek();
237
- if (!fn) return false;
238
- fn();
239
- return true;
240
- };
241
- }
242
- function useEscapeKeydown(host, editor, handler) {
243
- useEditorExtension(host, editor, withPriority(defineKeymap({ Escape: handler }), 4));
339
+ function useEscapeKeydown(host, getEditor, handler) {
340
+ useEditorExtension(host, getEditor, withPriority(defineKeymap({ Escape: handler }), 4));
244
341
  }
245
- //#endregion
246
- //#region src/components/autocomplete/autocomplete-popover/types.ts
247
- const defaultBoundary = typeof document !== "undefined" && document.querySelector("body") || "clippingAncestors";
248
- /** @internal */
249
- const autocompletePopoverProps = {
250
- ...overlayPositionerProps,
251
- editor: { default: null },
252
- regex: { default: null },
253
- placement: { default: "bottom-start" },
254
- offset: { default: 4 },
255
- inline: { default: true },
256
- hoist: { default: true },
257
- fitViewport: { default: true },
258
- boundary: { default: defaultBoundary },
259
- overflowPadding: { default: 8 }
260
- };
342
+ const AutocompleteRootElementBase = defineCustomElement(setupAutocompleteRoot, AutocompleteRootPropsDeclaration);
343
+ /**
344
+ * @public
345
+ */
346
+ var AutocompleteRootElement = class extends AutocompleteRootElementBase {};
261
347
  /** @internal */
262
- const autocompletePopoverEvents = {
263
- ...overlayPositionerEvents,
264
- openChange: {},
265
- queryChange: {}
266
- };
267
- //#endregion
268
- //#region src/components/autocomplete/autocomplete-popover/element.gen.ts
269
- const AutocompletePopoverElementBase = defineCustomElement({
270
- props: autocompletePopoverProps,
271
- events: autocompletePopoverEvents,
272
- setup: useAutocompletePopover
273
- });
274
- var AutocompletePopoverElement = class extends AutocompletePopoverElementBase {};
275
- registerCustomElement("prosekit-autocomplete-popover", AutocompletePopoverElement);
348
+ function registerAutocompleteRootElement() {
349
+ registerCustomElement("prosekit-autocomplete-root", AutocompleteRootElement);
350
+ }
276
351
  //#endregion
277
- export { AutocompleteEmptyElement, AutocompleteItemElement, AutocompleteListElement, AutocompletePopoverElement, autocompleteEmptyEvents, autocompleteEmptyProps, autocompleteItemEvents, autocompleteItemProps, autocompleteListEvents, autocompleteListProps, autocompletePopoverEvents, autocompletePopoverProps, useAutocompleteEmpty, useAutocompleteItem, useAutocompleteList, useAutocompletePopover };
352
+ export { AutocompleteEmptyElement, AutocompleteEmptyPropsDeclaration, AutocompleteItemElement, AutocompleteItemPropsDeclaration, AutocompletePopupElement, AutocompletePopupPropsDeclaration, AutocompletePositionerElement, AutocompletePositionerPropsDeclaration, AutocompleteRootElement, AutocompleteRootPropsDeclaration, OpenChangeEvent, QueryChangeEvent, SelectEvent, ValueChangeEvent, ValuesChangeEvent, registerAutocompleteEmptyElement, registerAutocompleteItemElement, registerAutocompletePopupElement, registerAutocompletePositionerElement, registerAutocompleteRootElement, setupAutocompleteEmpty, setupAutocompleteItem, setupAutocompletePopup, setupAutocompletePositioner, setupAutocompleteRoot };
278
353
 
279
354
  //# sourceMappingURL=prosekit-web-autocomplete.js.map