@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.
- package/dist/{get-default-state-BzBimBWi.js → get-default-state.js} +2 -3
- package/dist/get-default-state.js.map +1 -0
- package/dist/{get-safe-editor-view-Dt9Amrcn.js → get-safe-editor-view.js} +2 -2
- package/dist/get-safe-editor-view.js.map +1 -0
- package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
- package/dist/prosekit-web-autocomplete.js +7 -22
- package/dist/prosekit-web-autocomplete.js.map +1 -1
- package/dist/prosekit-web-block-handle.js +53 -80
- package/dist/prosekit-web-block-handle.js.map +1 -1
- package/dist/prosekit-web-drop-indicator.js +3 -6
- package/dist/prosekit-web-drop-indicator.js.map +1 -1
- package/dist/prosekit-web-inline-popover.js +2 -9
- package/dist/prosekit-web-inline-popover.js.map +1 -1
- package/dist/prosekit-web-popover.js +1 -4
- package/dist/prosekit-web-popover.js.map +1 -1
- package/dist/prosekit-web-resizable.d.ts.map +1 -1
- package/dist/prosekit-web-resizable.js +30 -13
- package/dist/prosekit-web-resizable.js.map +1 -1
- package/dist/prosekit-web-table-handle.js +76 -48
- package/dist/prosekit-web-table-handle.js.map +1 -1
- package/dist/prosekit-web-tooltip.js +1 -4
- package/dist/prosekit-web-tooltip.js.map +1 -1
- package/dist/prosekit-web.js +1 -1
- package/dist/prosekit-web.js.map +1 -1
- package/dist/{use-editor-extension-B2WuUfnd.js → use-editor-extension.js} +2 -3
- package/dist/use-editor-extension.js.map +1 -0
- package/dist/{use-scrolling-BjVzAkiZ.js → use-scrolling.js} +2 -4
- package/dist/use-scrolling.js.map +1 -0
- package/package.json +11 -11
- package/src/components/autocomplete/autocomplete-list/setup.ts +3 -2
- package/src/components/autocomplete/autocomplete-popover/setup.ts +2 -2
- package/src/components/block-handle/block-handle-draggable/set-drag-preview.ts +9 -10
- package/src/components/block-handle/block-handle-draggable/setup.ts +5 -10
- package/src/components/block-handle/block-handle-popover/pointer-move.ts +2 -10
- package/src/components/block-handle/block-handle-popover/setup.ts +1 -3
- package/src/components/resizable/resizable-root/types.ts +37 -3
- package/src/constants.ts +1 -0
- package/src/utils/get-client-rect.ts +47 -9
- package/dist/get-default-state-BzBimBWi.js.map +0 -1
- package/dist/get-safe-editor-view-Dt9Amrcn.js.map +0 -1
- package/dist/inject-style-BaFaVQvj.js +0 -76
- package/dist/inject-style-BaFaVQvj.js.map +0 -1
- package/dist/use-editor-extension-B2WuUfnd.js.map +0 -1
- package/dist/use-scrolling-BjVzAkiZ.js.map +0 -1
- package/src/utils/get-box-element.ts +0 -20
- 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
|
-
|
|
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
|
-
|
|
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;;;;;;
|
|
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
|
|
2
|
-
import { t as useEditorExtension } from "./use-editor-extension
|
|
3
|
-
import { t as getSafeEditorView } from "./get-safe-editor-view
|
|
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 {
|
|
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,
|
|
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 }),
|
|
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":";;;;;;;;;;;;;;;AAKA,MAAa,uBAA+C;;;;;ACC5D,MAAa,yBAAmE,EAAE;;AAMlF,MAAa,0BAAsE,EAAE;;;;ACPrF,MAAM,+BAA+E,oBAGnF;CACA,OAAO;CACP,QAAQ;CACR,OAAO;CACR,CAAC;AACF,IAAM,2BAAN,cAAuC,6BAA6B;AAEpE,sBAAsB,+BAA+B,yBAAyB;;;;ACb9E,MAAa,eAAgC,cAC3C,uCACA,GACD;AAED,MAAa,kBAAgD,cAC3D,0CACA,KACD;AAED,MAAa,cAAgC,cAC3C,sCACA,MACD;;;;;;;ACLD,SAAgB,oBACd,SACA,EAAE,OAAO,QACH;AACN,gBAAe,SAAS;EAAE;EAAO;EAAM,CAAC;CAExC,MAAM,OAAO,YAAY,QAAQ,QAAQ;AAEzC,WAAU,eAAe;AAEvB,MAAI,CAAC,MAAM,MAAM,MAAM,IAAI,KAAK,KAAK,CACnC,OAAM,MAAM,IAAI,QAAQ,eAAe,GAAG;GAE5C;AAEF,kBAAiB,SAAS,gBAAgB,UAAU;AAElD,QAAM,gBAAgB;GACtB;;;;;;ACbJ,MAAa,wBAAiE,EAC5E,OAAO,EACL,SAAS,IACV,EACF;;AAKD,MAAa,yBAAoE;;;;ACnBjF,MAAM,8BAA6E,oBAGjF;CACA,OAAO;CACP,QAAQ;CACR,OAAO;CACR,CAAC;AACF,IAAM,0BAAN,cAAsC,4BAA4B;AAElE,sBAAsB,8BAA8B,wBAAwB;;;;;;;ACI5E,SAAgB,oBACd,SACA,EAAE,OAAO,QACH;CACN,MAAM,OAAO,YAAY,QAAQ,QAAQ;CACzC,MAAM,QAAQ,aAAa,QAAQ,QAAQ;CAC3C,MAAM,WAAW,gBAAgB,QAAQ,QAAQ;CAEjD,MAAM,gBAAgB,iBAAiB,SAAS,MAAM,MAAM,OAAO;CAEnE,MAAM,eAAe,qBACnB;EAAE,QAAQ,MAAM;EAAQ,aAAa,aAAa,cAAc;EAAE,EAClE,aACD;AAED,WAAU,eAAe;AACvB,UAAQ,iBAAiB,qBAAqB;AAC5C,OAAI,SACF,UAAS,KAAK,IAAI;IAEpB;GACF;AAEF,YAAW,SAAS;EAAE,OAAO;EAAc;EAAM,CAAC;AAElD,WAAU,eAAe;AACvB,eAAa,MAAM,IAAI,MAAM,KAAK,CAAC;GACnC;AAEF,WAAU,eAAe;AACvB,MAAI,CAAC,KAAK,KAAK,EAAE;AACf,gBAAa,MAAM,IAAI,GAAG;AAC1B,SAAM,IAAI,GAAG;;GAEf;AAGF,WAAU,eAAe;AACvB,MAAI,CAAC,KAAK,KAAK,CACb,cAAa,UAAU,IAAI,MAAM;OAC5B;GACL,IAAI,WAAW;AAEf,+BAA4B;AAC1B,QAAI,SAAU;AACd,iBAAa,UAAU,IAAI,KAAK;KAChC;AAEF,gBAAa;AACX,eAAW;;;GAGf;AAIF,WAAU,eAAe;AACvB,UAAQ,WAAW;GACnB;;AAGJ,SAAS,iBACP,SACA,MACA,QAC6B;CAC7B,MAAM,kBAAsD,EAAE;AAE9D,WAAU,eAAe;EACvB,MAAM,cAAc,OAAO,KAAK;AAEhC,MAAI,CAAC,YACH;EAGF,MAAM,YAAY,sBAChB,YACC,MAAM,UAAmB;AACxB,OAAI,KAAK,aAAa,MAAM,oBAAoB,CAAC,KAAK,KAAK,CACzD,QAAO;AAET,mBAAgB,SAAS,YAAY,QAAQ,MAAM,CAAC;AACpD,UAAO,MAAM;IAEhB;AAED,SAAO,YAAY,IAAI,aAAa,WAAW,SAAS,QAAQ,CAAC;GACjE;AAEF,QAAO;EACL,mBAAmB,MAAM,aAAa;AACpC,OAAI,SAAS,UACX,iBAAgB,KAAK,SAAS;;EAGlC,sBAAsB,MAAM,aAAa;AACvC,OAAI,SAAS,WAAW;IACtB,MAAM,QAAQ,gBAAgB,QAAQ,SAAS;AAC/C,QAAI,UAAU,GACZ,iBAAgB,OAAO,OAAO,EAAE;;;EAIvC;;;;;AC5GH,MAAa,wBAAiE;CAC5E,QAAQA,eAAa;CACrB,QAAQ,EAAE,SAAS,MAAM;CAC1B;AAID,MAAa,yBAAoE,EAAE,GAAG,eAAe;;;;AChBrG,MAAM,8BAA6E,oBAGjF;CACA,OAAO;CACP,QAAQ;CACR,OAAO;CACR,CAAC;AACF,IAAM,0BAAN,cAAsC,4BAA4B;AAElE,sBAAsB,8BAA8B,wBAAwB;;;;ACb5E,SAAgB,kBACd,MACyB;CACzB,MAAM,iBAAiB,aAAa,KAAK;AAEzC,WAAU,YAAY;AACpB,8BAA4B;AAC1B,kBAAe,IAAI,MAAM;IACzB;GACF;AAEF,QAAO;;;;;ACbT,SAAgB,oBAAoB,OAAgC;AAClE,QAAO,MAAM,GACV,aAAa,CACb,WAAW,yCAAyC,GAAG,CACvD,WAAW,UAAU,IAAI,CACzB,MAAM;;;;;;;;ACsBX,SAAgB,uBACd,MACA,EACE,OACA,QAEI;CACN,MAAM,EAAE,QAAQ,OAAO,GAAG,iBAAiB;CAE3C,MAAM,YAAY,aAA6B,KAAK;CACpD,MAAM,QAAQ,aAAqB,GAAG;CACtC,MAAM,YAAY,aAAkC,KAAK;CACzD,MAAM,WAAW,aAAkC,KAAK;CACxD,MAAM,WAAW,qBAAqB,CAAC,CAAC,UAAU,KAAK,CAAC;AAExD,cAAa,QAAQ,MAAM,MAAM;AACjC,iBAAgB,QAAQ,MAAM,SAAS;AACvC,aAAY,QAAQ,MAAM,SAAS;AAEnC,kBAAiB,MAAM,QAAQ,oBAAoB,WAAW,SAAS,CAAC;AAExE,0BACE,MACA,QACA,OACA,WACA,OACA,WACA,SACD;AAED,2BAA0B,MAAM,cAAc,EAAE,WAAW,CAAC;AAE5D,cAAa,MAAM,oBAAqB,SAAS,KAAK,GAAG,SAAS,SAAU;AAC5E,aAAY,MAAM,SAAS;CAE3B,MAAM,iBAAiB,kBAAkB,KAAK;AAE9C,WAAU,YAAY;EACpB,MAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,CAAC,eAAe,MAAM,CACxB,MAAK,eAAe,WAAW;GAEjC;AAEF,mBAAkB,YAAY;EAC5B,MAAM,gBAAgB,SAAS,KAAK;AACpC,eAAa;AACX,QAAK,cAAc,cAAc;;GAEnC;;AAGJ,SAAS,yBACP,MACA,QACA,OACA,WACA,OACA,WACA,UACA;AACA,WAAU,YAAY;EACpB,MAAM,cAAc,OAAO,KAAK;EAChC,MAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,CAAC,eAAe,CAAC,WACnB;EAWF,MAAM,YAAY,mBARL,uBACX,aACA,YACA,WACA,OACA,WACA,SACD,CACyC;AAC1C,SAAO,YAAY,IAAI,UAAU;GACjC;;AAGJ,SAAS,uBACP,QACA,OACA,WACA,OACA,WACA,UACA;CACA,MAAM,eAA6B,YAAY;EAE7C,MAAM,OADO,kBAAkB,OAAO,EACnB,IAAI,cAAc,+BAA+B;AAEpE,MAAI,KACF,WAAU,IAAI,KAAK;AAGrB,QAAM,IAAI,oBAAoB,QAAQ,MAAM,CAAC;AAC7C,YAAU,IAAI,QAAQ,YAAY;AAClC,WAAS,IAAI,QAAQ,YAAY;;CAGnC,MAAM,oBAAoB;AACxB,YAAU,IAAI,KAAK;AACnB,QAAM,IAAI,GAAG;;AAGf,QAAO,IAAI,iBAAiB;EAC1B;EACA,SAAS;EACT,SAAS;EACV,CAAC;;AAGJ,SAAS,oBACP,SACA,SACA;AACA,cAAsB;AACpB,MAAI,CAAC,QAAQ,KAAK,CAChB,QAAO;EAGT,MAAM,KAAK,QAAQ,MAAM;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI;AACJ,SAAO;;;AAIX,SAAS,iBACP,MACA,QACA,SACM;AAGN,oBAAmB,MAAM,QADP,aAAa,aADhB,EAAE,QAAQ,SAAS,CACiB,EAAE,SAAS,QAAQ,CAC3B;;;;;ACrG7C,MAAM,kBADO,OAAO,aAAa,eAAe,SAAS,cAAc,OAAO,IAC9C;;AAGhC,MAAa,2BAAuE;CAClF,GAAG;CACH,QAAQ,EAAE,SAAS,MAAM;CACzB,OAAO,EAAE,SAAS,MAAM;CACxB,WAAW,EAAE,SAAS,gBAAgB;CACtC,QAAQ,EAAE,SAAS,GAAG;CACtB,QAAQ,EAAE,SAAS,MAAM;CACzB,OAAO,EAAE,SAAS,MAAM;CACxB,aAAa,EAAE,SAAS,MAAM;CAC9B,UAAU,EAAE,SAAS,iBAAiB;CACtC,iBAAiB,EAAE,SAAS,GAAG;CAChC;;AAeD,MAAa,4BAA0E;CACrF,GAAG;CACH,YAAY,EAAE;CACd,aAAa,EAAE;CAChB;;;;AC9FD,MAAM,iCAAmF,oBAGvF;CACA,OAAO;CACP,QAAQ;CACR,OAAO;CACR,CAAC;AACF,IAAM,6BAAN,cAAyC,+BAA+B;AAExE,sBAAsB,iCAAiC,2BAA2B"}
|
|
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
|
|
2
|
-
import { t as getSafeEditorView } from "./get-safe-editor-view
|
|
3
|
-
import { n as assignStyles, t as useScrolling } from "./use-scrolling
|
|
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/
|
|
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`
|
|
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 =
|
|
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
|
|
147
|
-
clonedElement.style.setProperty("opacity", "0.
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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",
|
|
212
|
+
event.dataTransfer.setData("text/html", element.outerHTML);
|
|
208
213
|
event.dataTransfer.effectAllowed = "copyMove";
|
|
209
|
-
setDragPreview(event,
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
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
|