@prosekit/web 0.7.12 → 0.8.0-beta.0

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 (46) hide show
  1. package/dist/{get-default-state-BzBimBWi.js → get-default-state.js} +2 -3
  2. package/dist/get-default-state.js.map +1 -0
  3. package/dist/{get-safe-editor-view-Dt9Amrcn.js → get-safe-editor-view.js} +2 -2
  4. package/dist/get-safe-editor-view.js.map +1 -0
  5. package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
  6. package/dist/prosekit-web-autocomplete.js +7 -22
  7. package/dist/prosekit-web-autocomplete.js.map +1 -1
  8. package/dist/prosekit-web-block-handle.js +53 -80
  9. package/dist/prosekit-web-block-handle.js.map +1 -1
  10. package/dist/prosekit-web-drop-indicator.js +3 -6
  11. package/dist/prosekit-web-drop-indicator.js.map +1 -1
  12. package/dist/prosekit-web-inline-popover.js +2 -9
  13. package/dist/prosekit-web-inline-popover.js.map +1 -1
  14. package/dist/prosekit-web-popover.js +1 -4
  15. package/dist/prosekit-web-popover.js.map +1 -1
  16. package/dist/prosekit-web-resizable.d.ts.map +1 -1
  17. package/dist/prosekit-web-resizable.js +30 -13
  18. package/dist/prosekit-web-resizable.js.map +1 -1
  19. package/dist/prosekit-web-table-handle.js +76 -48
  20. package/dist/prosekit-web-table-handle.js.map +1 -1
  21. package/dist/prosekit-web-tooltip.js +1 -4
  22. package/dist/prosekit-web-tooltip.js.map +1 -1
  23. package/dist/prosekit-web.js +1 -1
  24. package/dist/prosekit-web.js.map +1 -1
  25. package/dist/{use-editor-extension-B2WuUfnd.js → use-editor-extension.js} +2 -3
  26. package/dist/use-editor-extension.js.map +1 -0
  27. package/dist/{use-scrolling-BjVzAkiZ.js → use-scrolling.js} +2 -4
  28. package/dist/use-scrolling.js.map +1 -0
  29. package/package.json +11 -11
  30. package/src/components/autocomplete/autocomplete-list/setup.ts +3 -2
  31. package/src/components/autocomplete/autocomplete-popover/setup.ts +2 -2
  32. package/src/components/block-handle/block-handle-draggable/set-drag-preview.ts +9 -10
  33. package/src/components/block-handle/block-handle-draggable/setup.ts +5 -10
  34. package/src/components/block-handle/block-handle-popover/pointer-move.ts +2 -10
  35. package/src/components/block-handle/block-handle-popover/setup.ts +1 -3
  36. package/src/components/resizable/resizable-root/types.ts +37 -3
  37. package/src/constants.ts +1 -0
  38. package/src/utils/get-client-rect.ts +47 -9
  39. package/dist/get-default-state-BzBimBWi.js.map +0 -1
  40. package/dist/get-safe-editor-view-Dt9Amrcn.js.map +0 -1
  41. package/dist/inject-style-BaFaVQvj.js +0 -76
  42. package/dist/inject-style-BaFaVQvj.js.map +0 -1
  43. package/dist/use-editor-extension-B2WuUfnd.js.map +0 -1
  44. package/dist/use-scrolling-BjVzAkiZ.js.map +0 -1
  45. package/src/utils/get-box-element.ts +0 -20
  46. package/src/utils/throttle.ts +0 -17
@@ -1,12 +1,11 @@
1
1
  import { createSignal } from "@aria-ui/core";
2
-
3
2
  //#region src/utils/get-default-state.ts
4
3
  function getStateWithDefaults(state, props) {
5
4
  const merged = { ...state };
6
5
  for (const key of Object.keys(props)) if (!merged[key]) merged[key] = createSignal(props[key].default);
7
6
  return merged;
8
7
  }
9
-
10
8
  //#endregion
11
9
  export { getStateWithDefaults as t };
12
- //# sourceMappingURL=get-default-state-BzBimBWi.js.map
10
+
11
+ //# sourceMappingURL=get-default-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-default-state.js","names":[],"sources":["../src/utils/get-default-state.ts"],"sourcesContent":["import { createSignal, type PropDeclarations, type SignalState } from '@aria-ui/core'\n\nexport function getStateWithDefaults<\n Props extends Record<string, any> = Record<string, any>,\n>(\n state: Partial<SignalState<Props>>,\n props: PropDeclarations<Props>,\n): SignalState<Props> {\n const merged = { ...state } as SignalState<Props>\n\n for (const key of Object.keys(props) as (keyof Props)[]) {\n if (!merged[key]) {\n merged[key] = createSignal(props[key].default)\n }\n }\n\n return merged\n}\n"],"mappings":";;AAEA,SAAgB,qBAGd,OACA,OACoB;CACpB,MAAM,SAAS,EAAE,GAAG,OAAO;AAE3B,MAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,KAAI,CAAC,OAAO,KACV,QAAO,OAAO,aAAa,MAAM,KAAK,QAAQ;AAIlD,QAAO"}
@@ -6,7 +6,7 @@ function getSafeEditorView(editor) {
6
6
  if (!editor || !editor.mounted) return;
7
7
  return editor.view;
8
8
  }
9
-
10
9
  //#endregion
11
10
  export { getSafeEditorView as t };
12
- //# sourceMappingURL=get-safe-editor-view-Dt9Amrcn.js.map
11
+
12
+ //# sourceMappingURL=get-safe-editor-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-safe-editor-view.js","names":[],"sources":["../src/utils/get-safe-editor-view.ts"],"sourcesContent":["import type { Editor } from '@prosekit/core'\nimport type { EditorView } from '@prosekit/pm/view'\n\n/**\n * @internal\n */\nexport function getSafeEditorView(editor?: Editor | null): EditorView | undefined {\n if (!editor || !editor.mounted) return\n return editor.view\n}\n"],"mappings":";;;;AAMA,SAAgB,kBAAkB,QAAgD;AAChF,KAAI,CAAC,UAAU,CAAC,OAAO,QAAS;AAChC,QAAO,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-web-autocomplete.d.ts","names":[],"sources":["../src/components/autocomplete/autocomplete-empty/types.ts","../src/components/autocomplete/autocomplete-empty/element.gen.ts","../src/components/autocomplete/autocomplete-empty/setup.ts","../src/components/autocomplete/autocomplete-item/types.ts","../src/components/autocomplete/autocomplete-item/element.gen.ts","../src/components/autocomplete/autocomplete-item/setup.ts","../src/components/autocomplete/autocomplete-list/types.ts","../src/components/autocomplete/autocomplete-list/element.gen.ts","../src/components/autocomplete/autocomplete-list/setup.ts","../src/components/autocomplete/autocomplete-popover/types.ts","../src/components/autocomplete/autocomplete-popover/element.gen.ts","../src/components/autocomplete/autocomplete-popover/setup.ts"],"mappings":";;;;;;;;UAGiB,sBAAA;;cAGJ,sBAAA,EAAwB,gBAAA,CAAiB,sBAAA;;UAGrC,uBAAA;;cAGJ,uBAAA,EAAyB,iBAAA,CAAkB,uBAAA;;;cCPlD,4BAAA,EAA8B,sBAAA,CAAuB,sBAAA;AAAA,cAQrD,wBAAA,SAAiC,4BAAA;;;;;;cCR1B,oBAAA,SAA6B,eAAA;;;UCFzB,qBAAA;;;;;AHAjB;;;EGQE,KAAA;AAAA;AHLF;AAAA,cGSa,qBAAA,EAAuB,gBAAA,CAAiB,qBAAA;AAAA,UAMpC,sBAAA,SAA+B,iBAAA;;cAGnC,sBAAA,EAAwB,iBAAA,CAAkB,sBAAA;;;cCnBjD,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;AAAA,cAQpD,uBAAA,SAAgC,2BAAA;;;;;;iBCHtB,mBAAA,CACd,OAAA,EAAS,kBAAA;EACP,KAAA;EAAO;AAAA,GAAQ,YAAA,CAAa,qBAAA,EAAuB,sBAAA;;;UCRtC,qBAAA,SAA8B,IAAA,CAAK,YAAA;;;;ANDpD;;;EMQE,MAAA,EAAQ,MAAA;AAAA;AAAA,cAGG,qBAAA,EAAuB,gBAAA,CAAiB,qBAAA;AAAA,UAKpC,sBAAA,SAA+B,aAAA;AAAA,cAEnC,sBAAA,EAAwB,iBAAA,CAAkB,sBAAA;;;cChBjD,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;AAAA,cAQpD,uBAAA,SAAgC,2BAAA;;;;;;iBCMtB,mBAAA,CACd,OAAA,EAAS,kBAAA;EACP,KAAA;EAAO;AAAA,GAAQ,YAAA,CAAa,qBAAA,EAAuB,sBAAA;;;UCZtC,wBAAA,SAAiC,sBAAA;;;;ATNlD;;;ESaE,MAAA,EAAQ,MAAA;ETb6B;AAGvC;;;;ESiBE,KAAA,EAAO,MAAA;ETdQ;;;;;ESqBf,SAAA,EAAW,sBAAA;ETlBwE;;;;;ESyBnF,MAAA,EAAQ,sBAAA;;ARlC6H;;EQuCrI,MAAA,EAAQ,sBAAA;ERrC0B;;AAA6C;EQ0C/E,KAAA,EAAO,sBAAA;;;;EAKP,WAAA,EAAa,sBAAA;;;AP/Cf;EOoDE,QAAA,EAAU,sBAAA;;;;EAKV,eAAA,EAAiB,sBAAA;AAAA;;cAON,wBAAA,EAA0B,gBAAA,CAAiB,wBAAA;AAAA,UAavC,yBAAA,SAAkC,uBAAA;;;;EAIjD,UAAA,EAAY,WAAA;ENnEb;;;EMwEC,WAAA,EAAa,WAAA;AAAA;;cAIF,yBAAA,EAA2B,iBAAA,CAAkB,yBAAA;;;cC1FpD,8BAAA,EAAgC,sBAAA,CAAuB,wBAAA;AAAA,cAQvD,0BAAA,SAAmC,8BAAA;;;;;;iBCczB,sBAAA,CACd,IAAA,EAAM,kBAAA;EAEJ,KAAA;EACA;AAAA,GACC,YAAA,CAAa,wBAAA,EAA0B,yBAAA"}
1
+ {"version":3,"file":"prosekit-web-autocomplete.d.ts","names":[],"sources":["../src/components/autocomplete/autocomplete-empty/types.ts","../src/components/autocomplete/autocomplete-empty/element.gen.ts","../src/components/autocomplete/autocomplete-empty/setup.ts","../src/components/autocomplete/autocomplete-item/types.ts","../src/components/autocomplete/autocomplete-item/element.gen.ts","../src/components/autocomplete/autocomplete-item/setup.ts","../src/components/autocomplete/autocomplete-list/types.ts","../src/components/autocomplete/autocomplete-list/element.gen.ts","../src/components/autocomplete/autocomplete-list/setup.ts","../src/components/autocomplete/autocomplete-popover/types.ts","../src/components/autocomplete/autocomplete-popover/element.gen.ts","../src/components/autocomplete/autocomplete-popover/setup.ts"],"mappings":";;;;;;;;UAGiB,sBAAA;;cAGJ,sBAAA,EAAwB,gBAAA,CAAiB,sBAAA;;UAGrC,uBAAA;;cAGJ,uBAAA,EAAyB,iBAAA,CAAkB,uBAAA;;;cCPlD,4BAAA,EAA8B,sBAAA,CAAuB,sBAAA;AAAA,cAQrD,wBAAA,SAAiC,4BAAA;;;;;;cCR1B,oBAAA,SAA6B,eAAA;;;UCFzB,qBAAA;;;;;AHAjB;;;EGQE,KAAA;AAAA;AHLF;AAAA,cGSa,qBAAA,EAAuB,gBAAA,CAAiB,qBAAA;AAAA,UAMpC,sBAAA,SAA+B,iBAAA;;cAGnC,sBAAA,EAAwB,iBAAA,CAAkB,sBAAA;;;cCnBjD,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;AAAA,cAQpD,uBAAA,SAAgC,2BAAA;;;;;;iBCHtB,mBAAA,CACd,OAAA,EAAS,kBAAA;EACP,KAAA;EAAO;AAAA,GAAQ,YAAA,CAAa,qBAAA,EAAuB,sBAAA;;;UCRtC,qBAAA,SAA8B,IAAA,CAAK,YAAA;;;;ANDpD;;;EMQE,MAAA,EAAQ,MAAA;AAAA;AAAA,cAGG,qBAAA,EAAuB,gBAAA,CAAiB,qBAAA;AAAA,UAKpC,sBAAA,SAA+B,aAAA;AAAA,cAEnC,sBAAA,EAAwB,iBAAA,CAAkB,sBAAA;;;cChBjD,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;AAAA,cAQpD,uBAAA,SAAgC,2BAAA;;;;;;iBCOtB,mBAAA,CACd,OAAA,EAAS,kBAAA;EACP,KAAA;EAAO;AAAA,GAAQ,YAAA,CAAa,qBAAA,EAAuB,sBAAA;;;UCbtC,wBAAA,SAAiC,sBAAA;;;;ATNlD;;;ESaE,MAAA,EAAQ,MAAA;ETb6B;AAGvC;;;;ESiBE,KAAA,EAAO,MAAA;ETdQ;;;;;ESqBf,SAAA,EAAW,sBAAA;ETlBwE;;;;;ESyBnF,MAAA,EAAQ,sBAAA;;ARlC6H;;EQuCrI,MAAA,EAAQ,sBAAA;ERrC0B;;AAA6C;EQ0C/E,KAAA,EAAO,sBAAA;;;;EAKP,WAAA,EAAa,sBAAA;;;AP/Cf;EOoDE,QAAA,EAAU,sBAAA;;;;EAKV,eAAA,EAAiB,sBAAA;AAAA;;cAON,wBAAA,EAA0B,gBAAA,CAAiB,wBAAA;AAAA,UAavC,yBAAA,SAAkC,uBAAA;;;;EAIjD,UAAA,EAAY,WAAA;ENnEb;;;EMwEC,WAAA,EAAa,WAAA;AAAA;;cAIF,yBAAA,EAA2B,iBAAA,CAAkB,yBAAA;;;cC1FpD,8BAAA,EAAgC,sBAAA,CAAuB,wBAAA;AAAA,cAQvD,0BAAA,SAAmC,8BAAA;;;;;;iBCczB,sBAAA,CACd,IAAA,EAAM,kBAAA;EAEJ,KAAA;EACA;AAAA,GACC,YAAA,CAAa,wBAAA,EAA0B,yBAAA"}
@@ -1,27 +1,24 @@
1
- import { t as getStateWithDefaults } from "./get-default-state-BzBimBWi.js";
2
- import { t as useEditorExtension } from "./use-editor-extension-B2WuUfnd.js";
3
- import { t as getSafeEditorView } from "./get-safe-editor-view-Dt9Amrcn.js";
1
+ import { t as getStateWithDefaults } from "./get-default-state.js";
2
+ import { t as useEditorExtension } from "./use-editor-extension.js";
3
+ import { t as getSafeEditorView } from "./get-safe-editor-view.js";
4
4
  import { createComputed, createContext, createSignal, defineCustomElement, registerCustomElement, useAnimationFrame, useAttribute, useEffect, useEventListener } from "@aria-ui/core";
5
5
  import { listboxProps, useListbox, useListboxEmpty, useListboxItem } from "@aria-ui/listbox/elements";
6
6
  import { listboxEvents, listboxItemEvents, listboxProps as listboxProps$1 } from "@aria-ui/listbox";
7
- import { Priority, defineDOMEventHandler, defineKeymap, withPriority } from "@prosekit/core";
7
+ import { defineDOMEventHandler, defineKeymap, withPriority } from "@prosekit/core";
8
8
  import { overlayPositionerEvents, overlayPositionerProps, useOverlayPositionerState } from "@aria-ui/overlay/elements";
9
9
  import { usePresence } from "@aria-ui/presence";
10
10
  import { AutocompleteRule, defineAutocomplete } from "@prosekit/extensions/autocomplete";
11
-
12
11
  //#region src/components/autocomplete/autocomplete-empty/setup.ts
13
12
  /**
14
13
  * @internal
15
14
  */
16
15
  const useAutocompleteEmpty = useListboxEmpty;
17
-
18
16
  //#endregion
19
17
  //#region src/components/autocomplete/autocomplete-empty/types.ts
20
18
  /** @internal */
21
19
  const autocompleteEmptyProps = {};
22
20
  /** @internal */
23
21
  const autocompleteEmptyEvents = {};
24
-
25
22
  //#endregion
26
23
  //#region src/components/autocomplete/autocomplete-empty/element.gen.ts
27
24
  const AutocompleteEmptyElementBase = defineCustomElement({
@@ -31,13 +28,11 @@ const AutocompleteEmptyElementBase = defineCustomElement({
31
28
  });
32
29
  var AutocompleteEmptyElement = class extends AutocompleteEmptyElementBase {};
33
30
  registerCustomElement("prosekit-autocomplete-empty", AutocompleteEmptyElement);
34
-
35
31
  //#endregion
36
32
  //#region src/components/autocomplete/context.ts
37
33
  const queryContext = createContext("prosekit/autocomplete-popover/query", "");
38
34
  const onSubmitContext = createContext("prosekit/autocomplete-popover/onSubmit", null);
39
35
  const openContext = createContext("prosekit/autocomplete-popover/open", false);
40
-
41
36
  //#endregion
42
37
  //#region src/components/autocomplete/autocomplete-item/setup.ts
43
38
  /**
@@ -56,14 +51,12 @@ function useAutocompleteItem(element, { state, emit }) {
56
51
  event.preventDefault();
57
52
  });
58
53
  }
59
-
60
54
  //#endregion
61
55
  //#region src/components/autocomplete/autocomplete-item/types.ts
62
56
  /** @internal */
63
57
  const autocompleteItemProps = { value: { default: "" } };
64
58
  /** @internal */
65
59
  const autocompleteItemEvents = listboxItemEvents;
66
-
67
60
  //#endregion
68
61
  //#region src/components/autocomplete/autocomplete-item/element.gen.ts
69
62
  const AutocompleteItemElementBase = defineCustomElement({
@@ -73,7 +66,6 @@ const AutocompleteItemElementBase = defineCustomElement({
73
66
  });
74
67
  var AutocompleteItemElement = class extends AutocompleteItemElementBase {};
75
68
  registerCustomElement("prosekit-autocomplete-item", AutocompleteItemElement);
76
-
77
69
  //#endregion
78
70
  //#region src/components/autocomplete/autocomplete-list/setup.ts
79
71
  /**
@@ -133,7 +125,7 @@ function useKeyDownTarget(element, open, editor) {
133
125
  keydownHandlers.forEach((handler) => handler(event));
134
126
  return event.defaultPrevented;
135
127
  });
136
- return editorValue.use(withPriority(extension, Priority.highest));
128
+ return editorValue.use(withPriority(extension, 4));
137
129
  });
138
130
  return {
139
131
  addEventListener: (type, listener) => {
@@ -147,7 +139,6 @@ function useKeyDownTarget(element, open, editor) {
147
139
  }
148
140
  };
149
141
  }
150
-
151
142
  //#endregion
152
143
  //#region src/components/autocomplete/autocomplete-list/types.ts
153
144
  const autocompleteListProps = {
@@ -155,7 +146,6 @@ const autocompleteListProps = {
155
146
  editor: { default: null }
156
147
  };
157
148
  const autocompleteListEvents = { ...listboxEvents };
158
-
159
149
  //#endregion
160
150
  //#region src/components/autocomplete/autocomplete-list/element.gen.ts
161
151
  const AutocompleteListElementBase = defineCustomElement({
@@ -165,7 +155,6 @@ const AutocompleteListElementBase = defineCustomElement({
165
155
  });
166
156
  var AutocompleteListElement = class extends AutocompleteListElementBase {};
167
157
  registerCustomElement("prosekit-autocomplete-list", AutocompleteListElement);
168
-
169
158
  //#endregion
170
159
  //#region src/hooks/use-first-rendering.ts
171
160
  function useFirstRendering(host) {
@@ -177,13 +166,11 @@ function useFirstRendering(host) {
177
166
  });
178
167
  return firstRendering;
179
168
  }
180
-
181
169
  //#endregion
182
170
  //#region src/components/autocomplete/autocomplete-popover/helpers.ts
183
171
  function defaultQueryBuilder(match) {
184
172
  return match[0].toLowerCase().replaceAll(/[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~]/g, "").replaceAll(/\s\s+/g, " ").trim();
185
173
  }
186
-
187
174
  //#endregion
188
175
  //#region src/components/autocomplete/autocomplete-popover/setup.ts
189
176
  /**
@@ -253,9 +240,8 @@ function createKeymapHandler(handler, enabled) {
253
240
  };
254
241
  }
255
242
  function useEscapeKeydown(host, editor, handler) {
256
- useEditorExtension(host, editor, withPriority(defineKeymap({ Escape: handler }), Priority.highest));
243
+ useEditorExtension(host, editor, withPriority(defineKeymap({ Escape: handler }), 4));
257
244
  }
258
-
259
245
  //#endregion
260
246
  //#region src/components/autocomplete/autocomplete-popover/types.ts
261
247
  const defaultBoundary = typeof document !== "undefined" && document.querySelector("body") || "clippingAncestors";
@@ -278,7 +264,6 @@ const autocompletePopoverEvents = {
278
264
  openChange: {},
279
265
  queryChange: {}
280
266
  };
281
-
282
267
  //#endregion
283
268
  //#region src/components/autocomplete/autocomplete-popover/element.gen.ts
284
269
  const AutocompletePopoverElementBase = defineCustomElement({
@@ -288,7 +273,7 @@ const AutocompletePopoverElementBase = defineCustomElement({
288
273
  });
289
274
  var AutocompletePopoverElement = class extends AutocompletePopoverElementBase {};
290
275
  registerCustomElement("prosekit-autocomplete-popover", AutocompletePopoverElement);
291
-
292
276
  //#endregion
293
277
  export { AutocompleteEmptyElement, AutocompleteItemElement, AutocompleteListElement, AutocompletePopoverElement, autocompleteEmptyEvents, autocompleteEmptyProps, autocompleteItemEvents, autocompleteItemProps, autocompleteListEvents, autocompleteListProps, autocompletePopoverEvents, autocompletePopoverProps, useAutocompleteEmpty, useAutocompleteItem, useAutocompleteList, useAutocompletePopover };
278
+
294
279
  //# sourceMappingURL=prosekit-web-autocomplete.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-web-autocomplete.js","names":["listboxProps"],"sources":["../src/components/autocomplete/autocomplete-empty/setup.ts","../src/components/autocomplete/autocomplete-empty/types.ts","../src/components/autocomplete/autocomplete-empty/element.gen.ts","../src/components/autocomplete/context.ts","../src/components/autocomplete/autocomplete-item/setup.ts","../src/components/autocomplete/autocomplete-item/types.ts","../src/components/autocomplete/autocomplete-item/element.gen.ts","../src/components/autocomplete/autocomplete-list/setup.ts","../src/components/autocomplete/autocomplete-list/types.ts","../src/components/autocomplete/autocomplete-list/element.gen.ts","../src/hooks/use-first-rendering.ts","../src/components/autocomplete/autocomplete-popover/helpers.ts","../src/components/autocomplete/autocomplete-popover/setup.ts","../src/components/autocomplete/autocomplete-popover/types.ts","../src/components/autocomplete/autocomplete-popover/element.gen.ts"],"sourcesContent":["import { useListboxEmpty } from '@aria-ui/listbox/elements'\n\n/**\n * @internal\n */\nexport const useAutocompleteEmpty: typeof useListboxEmpty = useListboxEmpty\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\n\n/** @internal */\nexport interface AutocompleteEmptyProps {}\n\n/** @internal */\nexport const autocompleteEmptyProps: PropDeclarations<AutocompleteEmptyProps> = {}\n\n/** @internal */\nexport interface AutocompleteEmptyEvents {}\n\n/** @internal */\nexport const autocompleteEmptyEvents: EventDeclarations<AutocompleteEmptyEvents> = {}\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompleteEmpty } from \"./setup.ts\"\nimport { autocompleteEmptyEvents, autocompleteEmptyProps, type AutocompleteEmptyEvents, type AutocompleteEmptyProps } from \"./types.ts\"\n\nconst AutocompleteEmptyElementBase: BaseElementConstructor<AutocompleteEmptyProps> = defineCustomElement<\n AutocompleteEmptyProps,\n AutocompleteEmptyEvents\n>({\n props: autocompleteEmptyProps,\n events: autocompleteEmptyEvents,\n setup: useAutocompleteEmpty,\n})\nclass AutocompleteEmptyElement extends AutocompleteEmptyElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-empty', AutocompleteEmptyElement)\n \nexport { AutocompleteEmptyElement }\n","import { createContext, type Context } from '@aria-ui/core'\n\nexport const queryContext: Context<string> = createContext(\n 'prosekit/autocomplete-popover/query',\n '',\n)\n\nexport const onSubmitContext: Context<VoidFunction | null> = createContext(\n 'prosekit/autocomplete-popover/onSubmit',\n null,\n)\n\nexport const openContext: Context<boolean> = createContext(\n 'prosekit/autocomplete-popover/open',\n false,\n)\n","import { useEffect, useEventListener, type ConnectableElement, type SetupOptions } from '@aria-ui/core'\nimport { useListboxItem } from '@aria-ui/listbox/elements'\n\nimport { openContext } from '../context.ts'\n\nimport type { AutocompleteItemEvents, AutocompleteItemProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useAutocompleteItem(\n element: ConnectableElement,\n { state, emit }: SetupOptions<AutocompleteItemProps, AutocompleteItemEvents>,\n): void {\n useListboxItem(element, { state, emit })\n\n const open = openContext.consume(element)\n\n useEffect(element, () => {\n // Check the text content again when the open state changes\n if (!state.value.peek() && open.get()) {\n state.value.set(element.textContent ?? '')\n }\n })\n\n useEventListener(element, 'pointerdown', (event) => {\n // Prevent the editor from losing focus\n event.preventDefault()\n })\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\nimport { listboxItemEvents, type ListboxItemEvents } from '@aria-ui/listbox'\n\nexport interface AutocompleteItemProps {\n /**\n * The value of the item, which will be matched against the query.\n *\n * If not provided, the value is the item's text content.\n *\n * @default \"\"\n */\n value: string\n}\n\n/** @internal */\nexport const autocompleteItemProps: PropDeclarations<AutocompleteItemProps> = {\n value: {\n default: '',\n },\n}\n\nexport interface AutocompleteItemEvents extends ListboxItemEvents {}\n\n/** @internal */\nexport const autocompleteItemEvents: EventDeclarations<AutocompleteItemEvents> = listboxItemEvents\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompleteItem } from \"./setup.ts\"\nimport { autocompleteItemEvents, autocompleteItemProps, type AutocompleteItemEvents, type AutocompleteItemProps } from \"./types.ts\"\n\nconst AutocompleteItemElementBase: BaseElementConstructor<AutocompleteItemProps> = defineCustomElement<\n AutocompleteItemProps,\n AutocompleteItemEvents\n>({\n props: autocompleteItemProps,\n events: autocompleteItemEvents,\n setup: useAutocompleteItem,\n})\nclass AutocompleteItemElement extends AutocompleteItemElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-item', AutocompleteItemElement)\n \nexport { AutocompleteItemElement }\n","import {\n createSignal,\n useEffect,\n type ConnectableElement,\n type ReadonlySignal,\n type SetupOptions,\n type TypedEventTarget,\n} from '@aria-ui/core'\nimport { listboxProps, useListbox, type ListboxProps } from '@aria-ui/listbox/elements'\nimport { defineDOMEventHandler, Priority, withPriority, type Editor } from '@prosekit/core'\n\nimport { getStateWithDefaults } from '../../../utils/get-default-state.ts'\nimport { onSubmitContext, openContext, queryContext } from '../context.ts'\n\nimport type { AutocompleteListEvents, AutocompleteListProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useAutocompleteList(\n element: ConnectableElement,\n { state, emit }: SetupOptions<AutocompleteListProps, AutocompleteListEvents>,\n): void {\n const open = openContext.consume(element)\n const query = queryContext.consume(element)\n const onSubmit = onSubmitContext.consume(element)\n\n const keydownTarget = useKeyDownTarget(element, open, state.editor)\n\n const listboxState = getStateWithDefaults<ListboxProps>(\n { filter: state.filter, eventTarget: createSignal(keydownTarget) },\n listboxProps,\n )\n\n useEffect(element, () => {\n element.addEventListener('valueChange', () => {\n if (onSubmit) {\n onSubmit.get()?.()\n }\n })\n })\n\n useListbox(element, { state: listboxState, emit })\n\n useEffect(element, () => {\n listboxState.query.set(query.get())\n })\n\n useEffect(element, () => {\n if (!open.get()) {\n listboxState.value.set('')\n query.set('')\n }\n })\n\n // Reset the focused item when the popover is open\n useEffect(element, () => {\n if (!open.get()) {\n listboxState.autoFocus.set(false)\n } else {\n let canceled = false\n\n requestAnimationFrame(() => {\n if (canceled) return\n listboxState.autoFocus.set(true)\n })\n\n return () => {\n canceled = true\n }\n }\n })\n\n // The autocomplete list should not be focusable because the editor will get\n // the focus during typing.\n useEffect(element, () => {\n element.tabIndex = -1\n })\n}\n\nfunction useKeyDownTarget(\n element: ConnectableElement,\n open: ReadonlySignal<boolean>,\n editor: ReadonlySignal<Editor | null>,\n): TypedEventTarget<'keydown'> {\n const keydownHandlers: ((event: KeyboardEvent) => void)[] = []\n\n useEffect(element, () => {\n const editorValue = editor.get()\n\n if (!editorValue) {\n return\n }\n\n const extension = defineDOMEventHandler(\n 'keydown',\n (view, event): boolean => {\n if (view.composing || event.defaultPrevented || !open.get()) {\n return false\n }\n keydownHandlers.forEach((handler) => handler(event))\n return event.defaultPrevented\n },\n )\n\n return editorValue.use(withPriority(extension, Priority.highest))\n })\n\n return {\n addEventListener: (type, listener) => {\n if (type === 'keydown') {\n keydownHandlers.push(listener)\n }\n },\n removeEventListener: (type, listener) => {\n if (type === 'keydown') {\n const index = keydownHandlers.indexOf(listener)\n if (index !== -1) {\n keydownHandlers.splice(index, 1)\n }\n }\n },\n }\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\nimport { listboxEvents, listboxProps, type ListboxEvents, type ListboxProps } from '@aria-ui/listbox'\nimport type { Editor } from '@prosekit/core'\n\nexport interface AutocompleteListProps extends Pick<ListboxProps, 'filter'> {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\nexport const autocompleteListProps: PropDeclarations<AutocompleteListProps> = {\n filter: listboxProps.filter,\n editor: { default: null },\n}\n\nexport interface AutocompleteListEvents extends ListboxEvents {}\n\nexport const autocompleteListEvents: EventDeclarations<AutocompleteListEvents> = { ...listboxEvents }\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompleteList } from \"./setup.ts\"\nimport { autocompleteListEvents, autocompleteListProps, type AutocompleteListEvents, type AutocompleteListProps } from \"./types.ts\"\n\nconst AutocompleteListElementBase: BaseElementConstructor<AutocompleteListProps> = defineCustomElement<\n AutocompleteListProps,\n AutocompleteListEvents\n>({\n props: autocompleteListProps,\n events: autocompleteListEvents,\n setup: useAutocompleteList,\n})\nclass AutocompleteListElement extends AutocompleteListElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-list', AutocompleteListElement)\n \nexport { AutocompleteListElement }\n","import { createSignal, useEffect, type ConnectableElement, type ReadonlySignal } from '@aria-ui/core'\n\nexport function useFirstRendering(\n host: ConnectableElement,\n): ReadonlySignal<boolean> {\n const firstRendering = createSignal(true)\n\n useEffect(host, () => {\n requestAnimationFrame(() => {\n firstRendering.set(false)\n })\n })\n\n return firstRendering\n}\n","export function defaultQueryBuilder(match: RegExpExecArray): string {\n return match[0]\n .toLowerCase()\n .replaceAll(/[!\"#$%&'()*+,-./:;<=>?@[\\\\\\]^_`{|}~]/g, '')\n .replaceAll(/\\s\\s+/g, ' ')\n .trim()\n}\n","import {\n createComputed,\n createSignal,\n useAnimationFrame,\n useAttribute,\n useEffect,\n type ConnectableElement,\n type ReadonlySignal,\n type SetupOptions,\n type Signal,\n} from '@aria-ui/core'\nimport { useOverlayPositionerState } from '@aria-ui/overlay/elements'\nimport { usePresence } from '@aria-ui/presence'\nimport { defineKeymap, Priority, withPriority, type Editor } from '@prosekit/core'\nimport { AutocompleteRule, defineAutocomplete, type MatchHandler } from '@prosekit/extensions/autocomplete'\n\nimport { useEditorExtension } from '../../../hooks/use-editor-extension.ts'\nimport { useFirstRendering } from '../../../hooks/use-first-rendering.ts'\nimport { getSafeEditorView } from '../../../utils/get-safe-editor-view.ts'\nimport { onSubmitContext, openContext, queryContext } from '../context.ts'\n\nimport { defaultQueryBuilder } from './helpers.ts'\nimport type { AutocompletePopoverEvents, AutocompletePopoverProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useAutocompletePopover(\n host: ConnectableElement,\n {\n state,\n emit,\n }: SetupOptions<AutocompletePopoverProps, AutocompletePopoverEvents>,\n): void {\n const { editor, regex, ...overlayState } = state\n\n const reference = createSignal<Element | null>(null)\n const query = createSignal<string>('')\n const onDismiss = createSignal<VoidFunction | null>(null)\n const onSubmit = createSignal<VoidFunction | null>(null)\n const presence = createComputed(() => !!reference.get())\n\n queryContext.provide(host, query)\n onSubmitContext.provide(host, onSubmit)\n openContext.provide(host, presence)\n\n useEscapeKeydown(host, editor, createKeymapHandler(onDismiss, presence))\n\n useAutocompleteExtension(\n host,\n editor,\n regex,\n reference,\n query,\n onDismiss,\n onSubmit,\n )\n\n useOverlayPositionerState(host, overlayState, { reference })\n\n useAttribute(host, 'data-state', () => (presence.get() ? 'open' : 'closed'))\n usePresence(host, presence)\n\n const firstRendering = useFirstRendering(host)\n\n useEffect(host, () => {\n const queryValue = query.get()\n\n if (!firstRendering.peek()) {\n emit('queryChange', queryValue)\n }\n })\n\n useAnimationFrame(host, () => {\n const presenceValue = presence.get()\n return () => {\n emit('openChange', presenceValue)\n }\n })\n}\n\nfunction useAutocompleteExtension(\n host: ConnectableElement,\n editor: ReadonlySignal<Editor | null>,\n regex: ReadonlySignal<RegExp | null>,\n reference: Signal<Element | null>,\n query: Signal<string>,\n onDismiss: Signal<VoidFunction | null>,\n onSubmit: Signal<VoidFunction | null>,\n) {\n useEffect(host, () => {\n const editorValue = editor.get()\n const regexValue = regex.get()\n\n if (!editorValue || !regexValue) {\n return\n }\n\n const rule = createAutocompleteRule(\n editorValue,\n regexValue,\n reference,\n query,\n onDismiss,\n onSubmit,\n )\n const extension = defineAutocomplete(rule)\n return editorValue.use(extension)\n })\n}\n\nfunction createAutocompleteRule(\n editor: Editor,\n regex: RegExp,\n reference: Signal<Element | null>,\n query: Signal<string>,\n onDismiss: Signal<VoidFunction | null>,\n onSubmit: Signal<VoidFunction | null>,\n) {\n const handleEnter: MatchHandler = (options) => {\n const view = getSafeEditorView(editor)\n const span = view?.dom.querySelector('.prosekit-autocomplete-match')\n\n if (span) {\n reference.set(span)\n }\n\n query.set(defaultQueryBuilder(options.match))\n onDismiss.set(options.ignoreMatch)\n onSubmit.set(options.deleteMatch)\n }\n\n const handleLeave = () => {\n reference.set(null)\n query.set('')\n }\n\n return new AutocompleteRule({\n regex,\n onEnter: handleEnter,\n onLeave: handleLeave,\n })\n}\n\nfunction createKeymapHandler(\n handler: ReadonlySignal<VoidFunction | null>,\n enabled: ReadonlySignal<boolean>,\n) {\n return (): boolean => {\n if (!enabled.get()) {\n return false\n }\n\n const fn = handler.peek()\n if (!fn) return false\n fn()\n return true\n }\n}\n\nfunction useEscapeKeydown(\n host: ConnectableElement,\n editor: ReadonlySignal<Editor | null>,\n handler: () => boolean,\n): void {\n const keymap = { Escape: handler }\n const extension = withPriority(defineKeymap(keymap), Priority.highest)\n useEditorExtension(host, editor, extension)\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\nimport {\n overlayPositionerEvents,\n overlayPositionerProps,\n type OverlayPositionerEvents,\n type OverlayPositionerProps,\n} from '@aria-ui/overlay/elements'\nimport type { Editor } from '@prosekit/core'\n\nexport interface AutocompletePopoverProps extends OverlayPositionerProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n\n /**\n * The regular expression to match the query text to autocomplete.\n *\n * @default null\n */\n regex: RegExp | null\n\n /**\n * The placement of the popover, relative to the text cursor.\n *\n * @default \"bottom-start\"\n */\n placement: OverlayPositionerProps['placement']\n\n /**\n * The distance between the popover and the hovered block.\n *\n * @default 4\n */\n offset: OverlayPositionerProps['offset']\n\n /**\n * @default true\n */\n inline: OverlayPositionerProps['inline']\n\n /**\n * @default true\n */\n hoist: OverlayPositionerProps['hoist']\n\n /**\n * @default true\n */\n fitViewport: OverlayPositionerProps['fitViewport']\n\n /**\n * @default \"The body element\"\n */\n boundary: OverlayPositionerProps['boundary']\n\n /**\n * @default 8\n */\n overflowPadding: OverlayPositionerProps['overflowPadding']\n}\n\nconst body = typeof document !== 'undefined' && document.querySelector('body')\nconst defaultBoundary = body || 'clippingAncestors'\n\n/** @internal */\nexport const autocompletePopoverProps: PropDeclarations<AutocompletePopoverProps> = {\n ...overlayPositionerProps,\n editor: { default: null },\n regex: { default: null },\n placement: { default: 'bottom-start' },\n offset: { default: 4 },\n inline: { default: true },\n hoist: { default: true },\n fitViewport: { default: true },\n boundary: { default: defaultBoundary },\n overflowPadding: { default: 8 },\n}\n\nexport interface AutocompletePopoverEvents extends OverlayPositionerEvents {\n /**\n * Fired when the open state changes.\n */\n openChange: CustomEvent<boolean>\n\n /**\n * Fired when the query changes.\n */\n queryChange: CustomEvent<string>\n}\n\n/** @internal */\nexport const autocompletePopoverEvents: EventDeclarations<AutocompletePopoverEvents> = {\n ...overlayPositionerEvents,\n openChange: {},\n queryChange: {},\n}\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompletePopover } from \"./setup.ts\"\nimport { autocompletePopoverEvents, autocompletePopoverProps, type AutocompletePopoverEvents, type AutocompletePopoverProps } from \"./types.ts\"\n\nconst AutocompletePopoverElementBase: BaseElementConstructor<AutocompletePopoverProps> = defineCustomElement<\n AutocompletePopoverProps,\n AutocompletePopoverEvents\n>({\n props: autocompletePopoverProps,\n events: autocompletePopoverEvents,\n setup: useAutocompletePopover,\n})\nclass AutocompletePopoverElement extends AutocompletePopoverElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-popover', AutocompletePopoverElement)\n \nexport { AutocompletePopoverElement }\n"],"mappings":"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"}
1
+ {"version":3,"file":"prosekit-web-autocomplete.js","names":["listboxProps"],"sources":["../src/components/autocomplete/autocomplete-empty/setup.ts","../src/components/autocomplete/autocomplete-empty/types.ts","../src/components/autocomplete/autocomplete-empty/element.gen.ts","../src/components/autocomplete/context.ts","../src/components/autocomplete/autocomplete-item/setup.ts","../src/components/autocomplete/autocomplete-item/types.ts","../src/components/autocomplete/autocomplete-item/element.gen.ts","../src/components/autocomplete/autocomplete-list/setup.ts","../src/components/autocomplete/autocomplete-list/types.ts","../src/components/autocomplete/autocomplete-list/element.gen.ts","../src/hooks/use-first-rendering.ts","../src/components/autocomplete/autocomplete-popover/helpers.ts","../src/components/autocomplete/autocomplete-popover/setup.ts","../src/components/autocomplete/autocomplete-popover/types.ts","../src/components/autocomplete/autocomplete-popover/element.gen.ts"],"sourcesContent":["import { useListboxEmpty } from '@aria-ui/listbox/elements'\n\n/**\n * @internal\n */\nexport const useAutocompleteEmpty: typeof useListboxEmpty = useListboxEmpty\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\n\n/** @internal */\nexport interface AutocompleteEmptyProps {}\n\n/** @internal */\nexport const autocompleteEmptyProps: PropDeclarations<AutocompleteEmptyProps> = {}\n\n/** @internal */\nexport interface AutocompleteEmptyEvents {}\n\n/** @internal */\nexport const autocompleteEmptyEvents: EventDeclarations<AutocompleteEmptyEvents> = {}\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompleteEmpty } from \"./setup.ts\"\nimport { autocompleteEmptyEvents, autocompleteEmptyProps, type AutocompleteEmptyEvents, type AutocompleteEmptyProps } from \"./types.ts\"\n\nconst AutocompleteEmptyElementBase: BaseElementConstructor<AutocompleteEmptyProps> = defineCustomElement<\n AutocompleteEmptyProps,\n AutocompleteEmptyEvents\n>({\n props: autocompleteEmptyProps,\n events: autocompleteEmptyEvents,\n setup: useAutocompleteEmpty,\n})\nclass AutocompleteEmptyElement extends AutocompleteEmptyElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-empty', AutocompleteEmptyElement)\n \nexport { AutocompleteEmptyElement }\n","import { createContext, type Context } from '@aria-ui/core'\n\nexport const queryContext: Context<string> = createContext(\n 'prosekit/autocomplete-popover/query',\n '',\n)\n\nexport const onSubmitContext: Context<VoidFunction | null> = createContext(\n 'prosekit/autocomplete-popover/onSubmit',\n null,\n)\n\nexport const openContext: Context<boolean> = createContext(\n 'prosekit/autocomplete-popover/open',\n false,\n)\n","import { useEffect, useEventListener, type ConnectableElement, type SetupOptions } from '@aria-ui/core'\nimport { useListboxItem } from '@aria-ui/listbox/elements'\n\nimport { openContext } from '../context.ts'\n\nimport type { AutocompleteItemEvents, AutocompleteItemProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useAutocompleteItem(\n element: ConnectableElement,\n { state, emit }: SetupOptions<AutocompleteItemProps, AutocompleteItemEvents>,\n): void {\n useListboxItem(element, { state, emit })\n\n const open = openContext.consume(element)\n\n useEffect(element, () => {\n // Check the text content again when the open state changes\n if (!state.value.peek() && open.get()) {\n state.value.set(element.textContent ?? '')\n }\n })\n\n useEventListener(element, 'pointerdown', (event) => {\n // Prevent the editor from losing focus\n event.preventDefault()\n })\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\nimport { listboxItemEvents, type ListboxItemEvents } from '@aria-ui/listbox'\n\nexport interface AutocompleteItemProps {\n /**\n * The value of the item, which will be matched against the query.\n *\n * If not provided, the value is the item's text content.\n *\n * @default \"\"\n */\n value: string\n}\n\n/** @internal */\nexport const autocompleteItemProps: PropDeclarations<AutocompleteItemProps> = {\n value: {\n default: '',\n },\n}\n\nexport interface AutocompleteItemEvents extends ListboxItemEvents {}\n\n/** @internal */\nexport const autocompleteItemEvents: EventDeclarations<AutocompleteItemEvents> = listboxItemEvents\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompleteItem } from \"./setup.ts\"\nimport { autocompleteItemEvents, autocompleteItemProps, type AutocompleteItemEvents, type AutocompleteItemProps } from \"./types.ts\"\n\nconst AutocompleteItemElementBase: BaseElementConstructor<AutocompleteItemProps> = defineCustomElement<\n AutocompleteItemProps,\n AutocompleteItemEvents\n>({\n props: autocompleteItemProps,\n events: autocompleteItemEvents,\n setup: useAutocompleteItem,\n})\nclass AutocompleteItemElement extends AutocompleteItemElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-item', AutocompleteItemElement)\n \nexport { AutocompleteItemElement }\n","import {\n createSignal,\n useEffect,\n type ConnectableElement,\n type ReadonlySignal,\n type SetupOptions,\n type TypedEventTarget,\n} from '@aria-ui/core'\nimport { listboxProps, useListbox, type ListboxProps } from '@aria-ui/listbox/elements'\nimport type { Priority } from '@prosekit/core'\nimport { defineDOMEventHandler, withPriority, type Editor } from '@prosekit/core'\n\nimport { getStateWithDefaults } from '../../../utils/get-default-state.ts'\nimport { onSubmitContext, openContext, queryContext } from '../context.ts'\n\nimport type { AutocompleteListEvents, AutocompleteListProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useAutocompleteList(\n element: ConnectableElement,\n { state, emit }: SetupOptions<AutocompleteListProps, AutocompleteListEvents>,\n): void {\n const open = openContext.consume(element)\n const query = queryContext.consume(element)\n const onSubmit = onSubmitContext.consume(element)\n\n const keydownTarget = useKeyDownTarget(element, open, state.editor)\n\n const listboxState = getStateWithDefaults<ListboxProps>(\n { filter: state.filter, eventTarget: createSignal(keydownTarget) },\n listboxProps,\n )\n\n useEffect(element, () => {\n element.addEventListener('valueChange', () => {\n if (onSubmit) {\n onSubmit.get()?.()\n }\n })\n })\n\n useListbox(element, { state: listboxState, emit })\n\n useEffect(element, () => {\n listboxState.query.set(query.get())\n })\n\n useEffect(element, () => {\n if (!open.get()) {\n listboxState.value.set('')\n query.set('')\n }\n })\n\n // Reset the focused item when the popover is open\n useEffect(element, () => {\n if (!open.get()) {\n listboxState.autoFocus.set(false)\n } else {\n let canceled = false\n\n requestAnimationFrame(() => {\n if (canceled) return\n listboxState.autoFocus.set(true)\n })\n\n return () => {\n canceled = true\n }\n }\n })\n\n // The autocomplete list should not be focusable because the editor will get\n // the focus during typing.\n useEffect(element, () => {\n element.tabIndex = -1\n })\n}\n\nfunction useKeyDownTarget(\n element: ConnectableElement,\n open: ReadonlySignal<boolean>,\n editor: ReadonlySignal<Editor | null>,\n): TypedEventTarget<'keydown'> {\n const keydownHandlers: ((event: KeyboardEvent) => void)[] = []\n\n useEffect(element, () => {\n const editorValue = editor.get()\n\n if (!editorValue) {\n return\n }\n\n const extension = defineDOMEventHandler(\n 'keydown',\n (view, event): boolean => {\n if (view.composing || event.defaultPrevented || !open.get()) {\n return false\n }\n keydownHandlers.forEach((handler) => handler(event))\n return event.defaultPrevented\n },\n )\n\n return editorValue.use(withPriority(extension, 4 satisfies typeof Priority.highest))\n })\n\n return {\n addEventListener: (type, listener) => {\n if (type === 'keydown') {\n keydownHandlers.push(listener)\n }\n },\n removeEventListener: (type, listener) => {\n if (type === 'keydown') {\n const index = keydownHandlers.indexOf(listener)\n if (index !== -1) {\n keydownHandlers.splice(index, 1)\n }\n }\n },\n }\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\nimport { listboxEvents, listboxProps, type ListboxEvents, type ListboxProps } from '@aria-ui/listbox'\nimport type { Editor } from '@prosekit/core'\n\nexport interface AutocompleteListProps extends Pick<ListboxProps, 'filter'> {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\nexport const autocompleteListProps: PropDeclarations<AutocompleteListProps> = {\n filter: listboxProps.filter,\n editor: { default: null },\n}\n\nexport interface AutocompleteListEvents extends ListboxEvents {}\n\nexport const autocompleteListEvents: EventDeclarations<AutocompleteListEvents> = { ...listboxEvents }\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompleteList } from \"./setup.ts\"\nimport { autocompleteListEvents, autocompleteListProps, type AutocompleteListEvents, type AutocompleteListProps } from \"./types.ts\"\n\nconst AutocompleteListElementBase: BaseElementConstructor<AutocompleteListProps> = defineCustomElement<\n AutocompleteListProps,\n AutocompleteListEvents\n>({\n props: autocompleteListProps,\n events: autocompleteListEvents,\n setup: useAutocompleteList,\n})\nclass AutocompleteListElement extends AutocompleteListElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-list', AutocompleteListElement)\n \nexport { AutocompleteListElement }\n","import { createSignal, useEffect, type ConnectableElement, type ReadonlySignal } from '@aria-ui/core'\n\nexport function useFirstRendering(\n host: ConnectableElement,\n): ReadonlySignal<boolean> {\n const firstRendering = createSignal(true)\n\n useEffect(host, () => {\n requestAnimationFrame(() => {\n firstRendering.set(false)\n })\n })\n\n return firstRendering\n}\n","export function defaultQueryBuilder(match: RegExpExecArray): string {\n return match[0]\n .toLowerCase()\n .replaceAll(/[!\"#$%&'()*+,-./:;<=>?@[\\\\\\]^_`{|}~]/g, '')\n .replaceAll(/\\s\\s+/g, ' ')\n .trim()\n}\n","import {\n createComputed,\n createSignal,\n useAnimationFrame,\n useAttribute,\n useEffect,\n type ConnectableElement,\n type ReadonlySignal,\n type SetupOptions,\n type Signal,\n} from '@aria-ui/core'\nimport { useOverlayPositionerState } from '@aria-ui/overlay/elements'\nimport { usePresence } from '@aria-ui/presence'\nimport { defineKeymap, withPriority, type Editor, type Priority } from '@prosekit/core'\nimport { AutocompleteRule, defineAutocomplete, type MatchHandler } from '@prosekit/extensions/autocomplete'\n\nimport { useEditorExtension } from '../../../hooks/use-editor-extension.ts'\nimport { useFirstRendering } from '../../../hooks/use-first-rendering.ts'\nimport { getSafeEditorView } from '../../../utils/get-safe-editor-view.ts'\nimport { onSubmitContext, openContext, queryContext } from '../context.ts'\n\nimport { defaultQueryBuilder } from './helpers.ts'\nimport type { AutocompletePopoverEvents, AutocompletePopoverProps } from './types.ts'\n\n/**\n * @internal\n */\nexport function useAutocompletePopover(\n host: ConnectableElement,\n {\n state,\n emit,\n }: SetupOptions<AutocompletePopoverProps, AutocompletePopoverEvents>,\n): void {\n const { editor, regex, ...overlayState } = state\n\n const reference = createSignal<Element | null>(null)\n const query = createSignal<string>('')\n const onDismiss = createSignal<VoidFunction | null>(null)\n const onSubmit = createSignal<VoidFunction | null>(null)\n const presence = createComputed(() => !!reference.get())\n\n queryContext.provide(host, query)\n onSubmitContext.provide(host, onSubmit)\n openContext.provide(host, presence)\n\n useEscapeKeydown(host, editor, createKeymapHandler(onDismiss, presence))\n\n useAutocompleteExtension(\n host,\n editor,\n regex,\n reference,\n query,\n onDismiss,\n onSubmit,\n )\n\n useOverlayPositionerState(host, overlayState, { reference })\n\n useAttribute(host, 'data-state', () => (presence.get() ? 'open' : 'closed'))\n usePresence(host, presence)\n\n const firstRendering = useFirstRendering(host)\n\n useEffect(host, () => {\n const queryValue = query.get()\n\n if (!firstRendering.peek()) {\n emit('queryChange', queryValue)\n }\n })\n\n useAnimationFrame(host, () => {\n const presenceValue = presence.get()\n return () => {\n emit('openChange', presenceValue)\n }\n })\n}\n\nfunction useAutocompleteExtension(\n host: ConnectableElement,\n editor: ReadonlySignal<Editor | null>,\n regex: ReadonlySignal<RegExp | null>,\n reference: Signal<Element | null>,\n query: Signal<string>,\n onDismiss: Signal<VoidFunction | null>,\n onSubmit: Signal<VoidFunction | null>,\n) {\n useEffect(host, () => {\n const editorValue = editor.get()\n const regexValue = regex.get()\n\n if (!editorValue || !regexValue) {\n return\n }\n\n const rule = createAutocompleteRule(\n editorValue,\n regexValue,\n reference,\n query,\n onDismiss,\n onSubmit,\n )\n const extension = defineAutocomplete(rule)\n return editorValue.use(extension)\n })\n}\n\nfunction createAutocompleteRule(\n editor: Editor,\n regex: RegExp,\n reference: Signal<Element | null>,\n query: Signal<string>,\n onDismiss: Signal<VoidFunction | null>,\n onSubmit: Signal<VoidFunction | null>,\n) {\n const handleEnter: MatchHandler = (options) => {\n const view = getSafeEditorView(editor)\n const span = view?.dom.querySelector('.prosekit-autocomplete-match')\n\n if (span) {\n reference.set(span)\n }\n\n query.set(defaultQueryBuilder(options.match))\n onDismiss.set(options.ignoreMatch)\n onSubmit.set(options.deleteMatch)\n }\n\n const handleLeave = () => {\n reference.set(null)\n query.set('')\n }\n\n return new AutocompleteRule({\n regex,\n onEnter: handleEnter,\n onLeave: handleLeave,\n })\n}\n\nfunction createKeymapHandler(\n handler: ReadonlySignal<VoidFunction | null>,\n enabled: ReadonlySignal<boolean>,\n) {\n return (): boolean => {\n if (!enabled.get()) {\n return false\n }\n\n const fn = handler.peek()\n if (!fn) return false\n fn()\n return true\n }\n}\n\nfunction useEscapeKeydown(\n host: ConnectableElement,\n editor: ReadonlySignal<Editor | null>,\n handler: () => boolean,\n): void {\n const keymap = { Escape: handler }\n const extension = withPriority(defineKeymap(keymap), 4 satisfies typeof Priority.highest)\n useEditorExtension(host, editor, extension)\n}\n","import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'\nimport {\n overlayPositionerEvents,\n overlayPositionerProps,\n type OverlayPositionerEvents,\n type OverlayPositionerProps,\n} from '@aria-ui/overlay/elements'\nimport type { Editor } from '@prosekit/core'\n\nexport interface AutocompletePopoverProps extends OverlayPositionerProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n\n /**\n * The regular expression to match the query text to autocomplete.\n *\n * @default null\n */\n regex: RegExp | null\n\n /**\n * The placement of the popover, relative to the text cursor.\n *\n * @default \"bottom-start\"\n */\n placement: OverlayPositionerProps['placement']\n\n /**\n * The distance between the popover and the hovered block.\n *\n * @default 4\n */\n offset: OverlayPositionerProps['offset']\n\n /**\n * @default true\n */\n inline: OverlayPositionerProps['inline']\n\n /**\n * @default true\n */\n hoist: OverlayPositionerProps['hoist']\n\n /**\n * @default true\n */\n fitViewport: OverlayPositionerProps['fitViewport']\n\n /**\n * @default \"The body element\"\n */\n boundary: OverlayPositionerProps['boundary']\n\n /**\n * @default 8\n */\n overflowPadding: OverlayPositionerProps['overflowPadding']\n}\n\nconst body = typeof document !== 'undefined' && document.querySelector('body')\nconst defaultBoundary = body || 'clippingAncestors'\n\n/** @internal */\nexport const autocompletePopoverProps: PropDeclarations<AutocompletePopoverProps> = {\n ...overlayPositionerProps,\n editor: { default: null },\n regex: { default: null },\n placement: { default: 'bottom-start' },\n offset: { default: 4 },\n inline: { default: true },\n hoist: { default: true },\n fitViewport: { default: true },\n boundary: { default: defaultBoundary },\n overflowPadding: { default: 8 },\n}\n\nexport interface AutocompletePopoverEvents extends OverlayPositionerEvents {\n /**\n * Fired when the open state changes.\n */\n openChange: CustomEvent<boolean>\n\n /**\n * Fired when the query changes.\n */\n queryChange: CustomEvent<string>\n}\n\n/** @internal */\nexport const autocompletePopoverEvents: EventDeclarations<AutocompletePopoverEvents> = {\n ...overlayPositionerEvents,\n openChange: {},\n queryChange: {},\n}\n","import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from \"@aria-ui/core\"\n\nimport { useAutocompletePopover } from \"./setup.ts\"\nimport { autocompletePopoverEvents, autocompletePopoverProps, type AutocompletePopoverEvents, type AutocompletePopoverProps } from \"./types.ts\"\n\nconst AutocompletePopoverElementBase: BaseElementConstructor<AutocompletePopoverProps> = defineCustomElement<\n AutocompletePopoverProps,\n AutocompletePopoverEvents\n>({\n props: autocompletePopoverProps,\n events: autocompletePopoverEvents,\n setup: useAutocompletePopover,\n})\nclass AutocompletePopoverElement extends AutocompletePopoverElementBase {}\n\nregisterCustomElement('prosekit-autocomplete-popover', AutocompletePopoverElement)\n \nexport { AutocompletePopoverElement }\n"],"mappings":"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"}
@@ -1,15 +1,13 @@
1
- import { t as useEditorExtension } from "./use-editor-extension-B2WuUfnd.js";
2
- import { t as getSafeEditorView } from "./get-safe-editor-view-Dt9Amrcn.js";
3
- import { n as assignStyles, t as useScrolling } from "./use-scrolling-BjVzAkiZ.js";
4
- import { r as deepCloneElement, t as injectStyle } from "./inject-style-BaFaVQvj.js";
1
+ import { t as useEditorExtension } from "./use-editor-extension.js";
2
+ import { t as getSafeEditorView } from "./get-safe-editor-view.js";
3
+ import { n as assignStyles, t as useScrolling } from "./use-scrolling.js";
5
4
  import { createComputed, createContext, createSignal, defineCustomElement, registerCustomElement, useAttribute, useEffect, useEventListener } from "@aria-ui/core";
6
5
  import { defineDOMEventHandler, insertDefaultBlock, union } from "@prosekit/core";
7
6
  import { overlayPositionerEvents, overlayPositionerProps, useOverlayPositionerState } from "@aria-ui/overlay/elements";
8
7
  import { usePresence } from "@aria-ui/presence";
9
- import { isElement, isHTMLElement, isTextNode } from "@ocavue/utils";
8
+ import { isElement, isHTMLElement, isTextNode, throttle } from "@ocavue/utils";
10
9
  import { Fragment, Slice } from "@prosekit/pm/model";
11
10
  import { NodeSelection } from "@prosekit/pm/state";
12
-
13
11
  //#region src/components/block-handle/context.ts
14
12
  /**
15
13
  * @internal
@@ -19,7 +17,6 @@ const blockPopoverContext = createContext("prosekit-block-popover-context", null
19
17
  * @internal
20
18
  */
21
19
  const draggingContext = createContext("prosekit-block-handle-dragging-context", false);
22
-
23
20
  //#endregion
24
21
  //#region src/components/block-handle/block-handle-add/setup.ts
25
22
  /**
@@ -38,14 +35,12 @@ function useBlockHandleAdd(host, { state }) {
38
35
  context.set(null);
39
36
  });
40
37
  }
41
-
42
38
  //#endregion
43
39
  //#region src/components/block-handle/block-handle-add/types.ts
44
40
  /** @internal */
45
41
  const blockHandleAddProps = { editor: { default: null } };
46
42
  /** @internal */
47
43
  const blockHandleAddEvents = {};
48
-
49
44
  //#endregion
50
45
  //#region src/components/block-handle/block-handle-add/element.gen.ts
51
46
  const BlockHandleAddElementBase = defineCustomElement({
@@ -55,31 +50,20 @@ const BlockHandleAddElementBase = defineCustomElement({
55
50
  });
56
51
  var BlockHandleAddElement = class extends BlockHandleAddElementBase {};
57
52
  registerCustomElement("prosekit-block-handle-add", BlockHandleAddElement);
58
-
59
53
  //#endregion
60
- //#region src/utils/get-box-element.ts
61
- /**
62
- * Returns the element that has a box.
63
- */
64
- function getBoxElement(element) {
65
- const window = element.ownerDocument.defaultView;
66
- if (!window) return;
67
- const display = window.getComputedStyle(element).display;
68
- if (display === "contents" && element.childElementCount === 1) return element.firstElementChild;
69
- else if (display === "none") return;
70
- return element;
71
- }
72
-
54
+ //#region src/constants.ts
55
+ const DRAGGING_CLASS_NAME = "prosekit-dragging";
73
56
  //#endregion
74
57
  //#region src/utils/get-client-rect.ts
75
58
  /**
76
- * Similar to `element.getBoundingClientRect`, but handles `display: contents` elements.
59
+ * Similar to `element.getBoundingClientRect`, but handles `display: contents` CSS
60
+ * property and optionally includes margins and outlines.
77
61
  */
78
- function getClientRect(element) {
62
+ function getClientRect(element, includeExtra) {
79
63
  const rect = element.getBoundingClientRect();
80
64
  if (rect.width === 0 && rect.height === 0 && rect.x === 0 && rect.y === 0) {
81
65
  if (element.getClientRects().length === 0) {
82
- const rects = Array.from(element.children).map((child) => getClientRect(child));
66
+ const rects = [...element.children].map((child) => getClientRect(child, includeExtra));
83
67
  if (rects.length === 0) return rect;
84
68
  if (rects.length === 1) return rects[0];
85
69
  let { top, bottom, left, right } = rects[0];
@@ -98,13 +82,33 @@ function getClientRect(element) {
98
82
  };
99
83
  }
100
84
  }
101
- return rect;
85
+ return includeExtra ? addExtra(element, rect, includeExtra) : rect;
86
+ }
87
+ function addExtra(element, rect, options) {
88
+ const view = element.ownerDocument?.defaultView;
89
+ if (!view) return rect;
90
+ const style = view.getComputedStyle(element);
91
+ const marginTop = options.top ? Number.parseFloat(style.marginTop) || 0 : 0;
92
+ const marginBottom = options.bottom ? Number.parseFloat(style.marginBottom) || 0 : 0;
93
+ const marginRight = options.right ? Number.parseFloat(style.marginRight) || 0 : 0;
94
+ const marginLeft = options.left ? Number.parseFloat(style.marginLeft) || 0 : 0;
95
+ const outlineWidth = Number.parseFloat(style.outlineWidth) || 0;
96
+ const outlineOffset = Number.parseFloat(style.outlineOffset) || 0;
97
+ const outline = Math.max(outlineWidth + outlineOffset, 0);
98
+ const outlineTop = options.top ? outline : 0;
99
+ const outlineBottom = options.bottom ? outline : 0;
100
+ const outlineRight = options.right ? outline : 0;
101
+ const outlineLeft = options.left ? outline : 0;
102
+ return {
103
+ top: rect.top - Math.max(marginTop, outlineTop),
104
+ bottom: rect.bottom + Math.max(marginBottom, outlineBottom),
105
+ right: rect.right + Math.max(marginRight, outlineRight),
106
+ left: rect.left - Math.max(marginLeft, outlineLeft)
107
+ };
102
108
  }
103
-
104
109
  //#endregion
105
110
  //#region src/utils/max-z-index.ts
106
111
  const maxZIndex = "2147483647";
107
-
108
112
  //#endregion
109
113
  //#region src/components/block-handle/block-handle-draggable/set-drag-preview.ts
110
114
  /**
@@ -119,7 +123,12 @@ const maxZIndex = "2147483647";
119
123
  * - Removes the container from the document body after the next frame.
120
124
  */
121
125
  function setDragPreview(event, element) {
122
- const { top, bottom, left, right } = getClientRect(element);
126
+ const { top, bottom, left, right } = getClientRect(element, {
127
+ left: true,
128
+ right: true,
129
+ top: true,
130
+ bottom: true
131
+ });
123
132
  const width = right - left;
124
133
  const height = bottom - top;
125
134
  const elementX = left;
@@ -127,6 +136,7 @@ function setDragPreview(event, element) {
127
136
  const { clientX, clientY } = event;
128
137
  const document = element.ownerDocument;
129
138
  const container = document.createElement("div");
139
+ container.classList.add("ProseMirror", DRAGGING_CLASS_NAME);
130
140
  const outsideX = Math.round(elementX - clientX);
131
141
  const outsideY = Math.round(elementY - clientY);
132
142
  const borderX = Math.max(outsideX, 0);
@@ -143,19 +153,16 @@ function setDragPreview(event, element) {
143
153
  width: `${width + borderX}px`,
144
154
  height: `${height + borderY}px`
145
155
  });
146
- const [clonedElement, styleText] = deepCloneElement(element, true);
147
- clonedElement.style.setProperty("opacity", "0.5", "important");
148
- clonedElement.style.setProperty("margin", "0", "important");
156
+ const clonedElement = element.cloneNode(true);
157
+ clonedElement.style.setProperty("opacity", "0.8", "important");
149
158
  clonedElement.style.setProperty("outline-color", "transparent", "important");
150
- document.body.appendChild(container);
151
159
  container.appendChild(clonedElement);
152
- injectStyle(container, styleText);
160
+ document.body.appendChild(container);
153
161
  event.dataTransfer?.setDragImage(container, Math.max(-outsideX, 0), Math.max(-outsideY, 0));
154
162
  requestAnimationFrame(() => {
155
163
  container.remove();
156
164
  });
157
165
  }
158
-
159
166
  //#endregion
160
167
  //#region src/components/block-handle/block-handle-draggable/setup.ts
161
168
  /**
@@ -173,7 +180,7 @@ function useBlockHandleDraggable(host, { state }) {
173
180
  const view = getSafeEditorView(state.editor.get());
174
181
  const hoverState = context.get();
175
182
  if (view && hoverState) {
176
- view.dom.classList.add("prosekit-dragging");
183
+ view.dom.classList.add(DRAGGING_CLASS_NAME);
177
184
  createDraggingPreview(view, hoverState, event);
178
185
  setViewDragging(view, hoverState);
179
186
  }
@@ -181,7 +188,7 @@ function useBlockHandleDraggable(host, { state }) {
181
188
  useEventListener(host, "dragend", () => {
182
189
  dragging.set(false);
183
190
  const view = getSafeEditorView(state.editor.get());
184
- if (view) view.dom.classList.remove("prosekit-dragging");
191
+ if (view) view.dom.classList.remove(DRAGGING_CLASS_NAME);
185
192
  });
186
193
  useAttribute(host, "data-dragging", () => dragging.get() ? "" : void 0);
187
194
  }
@@ -201,12 +208,10 @@ function createDraggingPreview(view, hoverState, event) {
201
208
  const { pos } = hoverState;
202
209
  const element = view.nodeDOM(pos);
203
210
  if (!element || !isHTMLElement(element)) return;
204
- const boxElement = getBoxElement(element);
205
- if (!boxElement || !isHTMLElement(boxElement)) return;
206
211
  event.dataTransfer.clearData();
207
- event.dataTransfer.setData("text/html", boxElement.outerHTML);
212
+ event.dataTransfer.setData("text/html", element.outerHTML);
208
213
  event.dataTransfer.effectAllowed = "copyMove";
209
- setDragPreview(event, boxElement);
214
+ setDragPreview(event, element);
210
215
  }
211
216
  function setViewDragging(view, hoverState) {
212
217
  const { node, pos } = hoverState;
@@ -216,14 +221,12 @@ function setViewDragging(view, hoverState) {
216
221
  node: NodeSelection.create(view.state.doc, pos)
217
222
  };
218
223
  }
219
-
220
224
  //#endregion
221
225
  //#region src/components/block-handle/block-handle-draggable/types.ts
222
226
  /** @internal */
223
227
  const blockHandleDraggableProps = { editor: { default: null } };
224
228
  /** @internal */
225
229
  const blockHandleDraggableEvents = {};
226
-
227
230
  //#endregion
228
231
  //#region src/components/block-handle/block-handle-draggable/element.gen.ts
229
232
  const BlockHandleDraggableElementBase = defineCustomElement({
@@ -233,23 +236,6 @@ const BlockHandleDraggableElementBase = defineCustomElement({
233
236
  });
234
237
  var BlockHandleDraggableElement = class extends BlockHandleDraggableElementBase {};
235
238
  registerCustomElement("prosekit-block-handle-draggable", BlockHandleDraggableElement);
236
-
237
- //#endregion
238
- //#region src/utils/throttle.ts
239
- /**
240
- * @internal
241
- */
242
- function throttle(callback, wait) {
243
- let lastTime = 0;
244
- return (...args) => {
245
- const now = Date.now();
246
- if (now - lastTime >= wait) {
247
- callback(...args);
248
- lastTime = now;
249
- }
250
- };
251
- }
252
-
253
239
  //#endregion
254
240
  //#region src/components/block-handle/block-handle-popover/pointer-move.ts
255
241
  function defineElementHoverHandler(handler) {
@@ -360,18 +346,10 @@ function findFirstLineRect(outer, inner) {
360
346
  }
361
347
  function findOuterRect(node) {
362
348
  if (!isElement(node)) return;
363
- const rect = getClientRect(node);
364
- const style = node.ownerDocument.defaultView?.getComputedStyle(node);
365
- const marginLeft = style && Number.parseInt(style.marginLeft, 10) || 0;
366
- const marginRight = style && Number.parseInt(style.marginRight, 10) || 0;
367
- const left = rect.left - marginLeft;
368
- const right = rect.right + marginRight;
369
- return {
370
- top: rect.top,
371
- bottom: rect.bottom,
372
- left,
373
- right
374
- };
349
+ return getClientRect(node, {
350
+ left: true,
351
+ right: true
352
+ });
375
353
  }
376
354
  function findFirstLineRectInNode(node) {
377
355
  if (isElement(node)) return findFirstLineRectInElement(node);
@@ -426,7 +404,6 @@ const fallbackRect = Object.freeze({
426
404
  x: -9999,
427
405
  y: -9999
428
406
  });
429
-
430
407
  //#endregion
431
408
  //#region src/components/block-handle/block-handle-popover/setup.ts
432
409
  /**
@@ -464,11 +441,8 @@ function useHoverExtension(host, editor, handler) {
464
441
  }));
465
442
  }
466
443
  function isHoverStateEqual(a, b) {
467
- if (!a && !b) return true;
468
- if (!a || !b) return false;
469
- return a.pos === b.pos && a.node.eq(b.node);
444
+ return !a && !b || a && b && a.pos === b.pos && a.node.eq(b.node);
470
445
  }
471
-
472
446
  //#endregion
473
447
  //#region src/components/block-handle/block-handle-popover/types.ts
474
448
  /** @internal */
@@ -486,7 +460,6 @@ const blockHandlePopoverEvents = {
486
460
  ...overlayPositionerEvents,
487
461
  stateChange: {}
488
462
  };
489
-
490
463
  //#endregion
491
464
  //#region src/components/block-handle/block-handle-popover/element.gen.ts
492
465
  const BlockHandlePopoverElementBase = defineCustomElement({
@@ -496,7 +469,7 @@ const BlockHandlePopoverElementBase = defineCustomElement({
496
469
  });
497
470
  var BlockHandlePopoverElement = class extends BlockHandlePopoverElementBase {};
498
471
  registerCustomElement("prosekit-block-handle-popover", BlockHandlePopoverElement);
499
-
500
472
  //#endregion
501
473
  export { BlockHandleAddElement, BlockHandleDraggableElement, BlockHandlePopoverElement, blockHandleAddEvents, blockHandleAddProps, blockHandleDraggableEvents, blockHandleDraggableProps, blockHandlePopoverEvents, blockHandlePopoverProps, useBlockHandleAdd, useBlockHandleDraggable, useBlockHandlePopover };
474
+
502
475
  //# sourceMappingURL=prosekit-web-block-handle.js.map