@prosekit/web 0.8.1 → 0.8.3

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 (43) hide show
  1. package/dist/autocomplete.d.ts +0 -15
  2. package/dist/autocomplete.d.ts.map +1 -1
  3. package/dist/autocomplete.js +0 -3
  4. package/dist/autocomplete.js.map +1 -1
  5. package/dist/block-handle.d.ts +0 -12
  6. package/dist/block-handle.d.ts.map +1 -1
  7. package/dist/block-handle.js +0 -3
  8. package/dist/block-handle.js.map +1 -1
  9. package/dist/drop-indicator.d.ts.map +1 -1
  10. package/dist/drop-indicator.js.map +1 -1
  11. package/dist/get-safe-editor-view.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/inline-popover.d.ts +0 -12
  15. package/dist/inline-popover.d.ts.map +1 -1
  16. package/dist/inline-popover.js.map +1 -1
  17. package/dist/menu.d.ts.map +1 -1
  18. package/dist/menu.js.map +1 -1
  19. package/dist/popover.d.ts.map +1 -1
  20. package/dist/popover.js.map +1 -1
  21. package/dist/resizable.d.ts +0 -15
  22. package/dist/resizable.d.ts.map +1 -1
  23. package/dist/resizable.js +0 -6
  24. package/dist/resizable.js.map +1 -1
  25. package/dist/table-handle.d.ts.map +1 -1
  26. package/dist/table-handle.js.map +1 -1
  27. package/dist/tooltip.d.ts.map +1 -1
  28. package/dist/tooltip.js.map +1 -1
  29. package/dist/use-editor-extension.js.map +1 -1
  30. package/dist/use-editor-update-event.js.map +1 -1
  31. package/dist/use-scrolling.js.map +1 -1
  32. package/package.json +9 -9
  33. package/src/components/autocomplete/autocomplete-popup.ts +0 -6
  34. package/src/components/autocomplete/autocomplete-positioner.ts +0 -3
  35. package/src/components/autocomplete/autocomplete-root.ts +0 -6
  36. package/src/components/block-handle/block-handle-popup.ts +0 -3
  37. package/src/components/block-handle/block-handle-positioner.ts +0 -3
  38. package/src/components/block-handle/block-handle-root.ts +0 -6
  39. package/src/components/inline-popover/inline-popover-popup.ts +0 -3
  40. package/src/components/inline-popover/inline-popover-positioner.ts +0 -3
  41. package/src/components/inline-popover/inline-popover-root.ts +0 -6
  42. package/src/components/resizable/resizable-handle.ts +0 -3
  43. package/src/components/resizable/resizable-root.ts +0 -12
@@ -53,13 +53,7 @@ declare const AutocompleteItemElementBase: HostElementConstructor<AutocompleteIt
53
53
  declare class AutocompleteItemElement extends AutocompleteItemElementBase {}
54
54
  /** @internal */
55
55
  declare function registerAutocompleteItemElement(): void;
56
- /**
57
- * @public
58
- */
59
56
  interface AutocompletePopupProps extends OverlayPopupProps {}
60
- /**
61
- * @public
62
- */
63
57
  interface AutocompletePopupEvents extends ListboxRootEvents {}
64
58
  /** @internal */
65
59
  declare const AutocompletePopupPropsDeclaration: PropsDeclaration<AutocompletePopupProps>;
@@ -82,9 +76,6 @@ declare const AutocompletePopupElementBase: HostElementConstructor<AutocompleteP
82
76
  declare class AutocompletePopupElement extends AutocompletePopupElementBase {}
83
77
  /** @internal */
84
78
  declare function registerAutocompletePopupElement(): void;
85
- /**
86
- * @public
87
- */
88
79
  interface AutocompletePositionerProps extends OverlayPositionerProps {
89
80
  /**
90
81
  * The placement of the popover, relative to the text cursor.
@@ -186,9 +177,6 @@ interface AutocompleteRootProps {
186
177
  }
187
178
  /** @internal */
188
179
  declare const AutocompleteRootPropsDeclaration: PropsDeclaration<AutocompleteRootProps>;
189
- /**
190
- * @public
191
- */
192
180
  declare class QueryChangeEvent extends Event {
193
181
  /**
194
182
  * The current query string.
@@ -196,9 +184,6 @@ declare class QueryChangeEvent extends Event {
196
184
  readonly detail: string;
197
185
  constructor(query: string);
198
186
  }
199
- /**
200
- * @public
201
- */
202
187
  interface AutocompleteRootEvents extends ListboxRootEvents {
203
188
  /**
204
189
  * Fired when the open state changes.
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.d.ts","names":[],"sources":["../src/components/autocomplete/autocomplete-empty.ts","../src/components/autocomplete/autocomplete-item.ts","../src/components/autocomplete/autocomplete-popup.ts","../src/components/autocomplete/autocomplete-positioner.ts","../src/components/autocomplete/autocomplete-root.ts"],"mappings":";;;;;UAWiB,sBAAA,SAA+B,iBAAA;;cAGnC,iCAAA,EAAmC,gBAAA,CAAiB,sBAAA;AAHjE;;;AAAA,iBAUgB,sBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,sBAAA;AAAA,cAKT,4BAAA,EAA8B,sBAAA,CAAuB,sBAAA;AAd3D;;;;;AAAA,cAwBa,wBAAA,SAAiC,4BAAA;;iBAG9B,gCAAA,CAAA;AAAA,UCzBC,qBAAA,SAA8B,gBAAA;;;ADL/C;;;;;ECaE,KAAA;AAAA;;cAIW,gCAAA,EAAkC,gBAAA,CAAiB,qBAAA;AAAA,UAO/C,sBAAA,SAA+B,iBAAA;;;;iBAKhC,qBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,qBAAA;AAAA,cAST,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;;;;;;;;;;ADzBzD;;;;cC2CY,uBAAA,SAAgC,2BAAA;;iBAG7B,+BAAA,CAAA;;;;UC5CC,sBAAA,SAA+B,iBAAA;;;;UAK/B,uBAAA,SAAgC,iBAAA;;cAGpC,iCAAA,EAAmC,gBAAA,CAAiB,sBAAA;;iBAKjD,sBAAA,CACd,IAAA,EAAM,WAAA,EACN,MAAA,EAAQ,KAAA,CAAM,sBAAA;AAAA,cAsCV,4BAAA,EAA8B,sBAAA,CAAuB,sBAAA;;;;;;;;;;;;;;cAkB9C,wBAAA,SAAiC,4BAAA;;iBAG9B,gCAAA,CAAA;;;;UCnFC,2BAAA,SAAoC,sBAAA;EHRpC;;;;;EGcf,SAAA,EAAW,sBAAA;EHTR;;;;AAKL;EGWE,MAAA,EAAQ,sBAAA;;;;;;;EAQR,IAAA,EAAM,sBAAA;EHlBN;;;EGuBA,MAAA,EAAQ,sBAAA;EHtB4B;;AAGrC;EGwBC,KAAA,EAAO,sBAAA;;;;EAKP,WAAA,EAAa,sBAAA;EHjBuB;;;EGsBpC,QAAA,EAAU,sBAAA;EHnBI;;;EGwBd,eAAA,EAAiB,sBAAA;AAAA;;cAIN,sCAAA,EAAwC,gBAAA,CAAiB,2BAAA;;iBAetD,2BAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,2BAAA;AAAA,cAOT,iCAAA,EAAmC,sBAAA,CAAuB,2BAAA;;AFjEhE;;;;;AAOA;;;;;AAKA;;;;;;;;cE6Ea,6BAAA,SAAsC,iCAAA;;iBAGnC,qCAAA,CAAA;AAAA,UC5FC,qBAAA;EJjBuB;;;;AAGxC;;EIqBE,MAAA,EAAQ,MAAA;EJrBsC;;AAOhD;;;EIqBE,KAAA,EAAO,MAAA;EJnBM;;;;;;EI2Bb,MAAA,EAAQ,UAAA;EJ3BK;;;;AAGd;;;;EIkCC,MAAA,EAAQ,OAAA,GAAU,cAAA,UAAwB,OAAA,GAAU,cAAA;AAAA;;cAIzC,gCAAA,EAAkC,gBAAA,CAAiB,qBAAA;;;AJvBhE;cImCa,gBAAA,SAAyB,KAAA;;;;WAI3B,MAAA;cAEG,KAAA;AAAA;;;;UASG,sBAAA,SAA+B,iBAAA;EH1D/C;;;EG8DC,UAAA,EAAY,eAAA;EH5DG;;;EGiEf,WAAA,EAAa,gBAAA;AAAA;AH5Df;;;AAAA,iBG8EgB,qBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,qBAAA;AAAA,cAyKT,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;;;;;;;;cAY7C,uBAAA,SAAgC,2BAAA;;iBAG7B,+BAAA,CAAA"}
1
+ {"version":3,"file":"autocomplete.d.ts","names":[],"sources":["../src/components/autocomplete/autocomplete-empty.ts","../src/components/autocomplete/autocomplete-item.ts","../src/components/autocomplete/autocomplete-popup.ts","../src/components/autocomplete/autocomplete-positioner.ts","../src/components/autocomplete/autocomplete-root.ts"],"mappings":";;;;;UAWiB,sBAAA,SAA+B,iBAAiB;;cAGpD,iCAAA,EAAmC,gBAAgB,CAAC,sBAAA;AAHjE;;;AAAA,iBAUgB,sBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,sBAAA;AAAA,cAKT,4BAAA,EAA8B,sBAAsB,CAAC,sBAAA;AAd3D;;;;AAAuF;AAAvF,cAwBa,wBAAA,SAAiC,4BAA4B;;iBAG1D,gCAAA,CAAA;AAAA,UCzBC,qBAAA,SAA8B,gBAAgB;;;ADL/D;;;;AAAiE;ECa/D,KAAK;AAAA;;cAIM,gCAAA,EAAkC,gBAAgB,CAAC,qBAAA;AAAA,UAO/C,sBAAA,SAA+B,iBAAiB;;;;iBAKjD,qBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,qBAAA;AAAA,cAST,2BAAA,EAA6B,sBAAsB,CAAC,qBAAA;;;;;;;;;AD5BpB;AAGrC;;;;cC2CY,uBAAA,SAAgC,2BAA2B;;iBAGxD,+BAAA,CAAA;AAAA,UC/CC,sBAAA,SAA+B,iBAAiB;AAAA,UAEhD,uBAAA,SAAgC,iBAAiB;;cAGrD,iCAAA,EAAmC,gBAAgB,CAAC,sBAAA;;iBAKjD,sBAAA,CACd,IAAA,EAAM,WAAA,EACN,MAAA,EAAQ,KAAA,CAAM,sBAAA;AAAA,cAsCV,4BAAA,EAA8B,sBAAsB,CAAC,sBAAA;;;;AF7D4B;AAOvF;;;;;;;;;cEwEa,wBAAA,SAAiC,4BAA4B;;iBAG1D,gCAAA,CAAA;AAAA,UChFC,2BAAA,SAAoC,sBAAA;;;;AHLrD;;EGWE,SAAA,EAAW,sBAAA;EHXoD;AAAA;AAGjE;;;EGeE,MAAA,EAAQ,sBAAA;EHf6E;AAOvF;;;;;EGgBE,IAAA,EAAM,sBAAA;EHdM;;;EGmBZ,MAAA,EAAQ,sBAAA;EHnBD;;;EGwBP,KAAA,EAAO,sBAAA;EHxB6B;AAGrC;;EG0BC,WAAA,EAAa,sBAAA;EHxBqB;AAA6C;AAUjF;EGmBE,QAAA,EAAU,sBAAA;;;AHnB8D;EGwBxE,eAAA,EAAiB,sBAAA;AAAA;;cAIN,sCAAA,EAAwC,gBAAgB,CAAC,2BAAA;AHzBtB;AAAA,iBGwChC,2BAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,2BAAA;AAAA,cAOT,iCAAA,EAAmC,sBAAsB,CAAC,2BAAA;;;;AFlEzD;AAIP;;;;AAAqF;AAOrF;;;;AAAiE;AAKjE;;;;;cE0Ea,6BAAA,SAAsC,iCAAiC;;iBAGpE,qCAAA,CAAA;AAAA,UCzFC,qBAAA;EJjBuB;;;AAAyB;AAGjE;;EIqBE,MAAA,EAAQ,MAAA;EJrBsC;AAAuC;AAOvF;;;EIqBE,KAAA,EAAO,MAAA;EJnBM;;;;;;EI2Bb,MAAA,EAAQ,UAAA;EJ3BK;;;AAAuB;AAGrC;;;;EIkCC,MAAA,EAAQ,OAAA,GAAU,cAAA,UAAwB,OAAA,GAAU,cAAA;AAAA;;cAIzC,gCAAA,EAAkC,gBAAgB,CAAC,qBAAA;AAAA,cASnD,gBAAA,SAAyB,KAAK;EJnC+B;AAG1E;;EAH0E,SIuC/D,MAAA;cAEG,KAAA;AAAA;AAAA,UAMG,sBAAA,SAA+B,iBAAA;EHrE/B;;;EGyEf,UAAA,EAAY,eAAA;EHjEP;AAIP;;EGkEE,WAAA,EAAa,gBAAA;AAAA;AHlEsE;AAOrF;;AAPqF,iBGoFrE,qBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,qBAAA;AAAA,cAyKT,2BAAA,EAA6B,sBAAsB,CAAC,qBAAA;AHxPO;AAKjE;;;;;;AALiE,cGoQpD,uBAAA,SAAgC,2BAA2B;;iBAGxD,+BAAA,CAAA"}
@@ -261,9 +261,6 @@ const AutocompleteRootPropsDeclaration = /* @__PURE__ */ defineProps({
261
261
  attribute: false
262
262
  }
263
263
  });
264
- /**
265
- * @public
266
- */
267
264
  var QueryChangeEvent = class extends Event {
268
265
  constructor(query) {
269
266
  super("queryChange", { bubbles: true });
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.js","names":[],"sources":["../src/components/autocomplete/autocomplete-empty.ts","../src/utils/prevent-default.ts","../src/components/autocomplete/autocomplete-item.ts","../src/utils/lazy-signal.ts","../src/utils/use-no-focus.ts","../src/components/autocomplete/context.ts","../src/components/autocomplete/autocomplete-popup.ts","../src/components/autocomplete/autocomplete-positioner.ts","../src/utils/event.ts","../src/components/autocomplete/helpers.ts","../src/components/autocomplete/autocomplete-root.ts"],"sourcesContent":["import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { setupListboxEmpty, type ListboxEmptyProps } from '@aria-ui/elements/listbox'\n\nexport interface AutocompleteEmptyProps extends ListboxEmptyProps {}\n\n/** @internal */\nexport const AutocompleteEmptyPropsDeclaration: PropsDeclaration<AutocompleteEmptyProps> = /* @__PURE__ */ defineProps<\n AutocompleteEmptyProps\n>({})\n\n/**\n * @internal\n */\nexport function setupAutocompleteEmpty(\n host: HostElement,\n props: State<AutocompleteEmptyProps>,\n): void {\n setupListboxEmpty(host, props)\n}\n\nconst AutocompleteEmptyElementBase: HostElementConstructor<AutocompleteEmptyProps> = defineCustomElement(\n setupAutocompleteEmpty,\n AutocompleteEmptyPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-empty>` custom element.\n *\n * Properties: {@link AutocompleteEmptyProps}\n */\nexport class AutocompleteEmptyElement extends AutocompleteEmptyElementBase {}\n\n/** @internal */\nexport function registerAutocompleteEmptyElement(): void {\n registerCustomElement('prosekit-autocomplete-empty', AutocompleteEmptyElement)\n}\n","export function preventDefault(event: Event): void {\n event.preventDefault()\n}\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { SelectEvent, setupListboxItem, type ListboxItemEvents, type ListboxItemProps } from '@aria-ui/elements/listbox'\nimport { useEventListener } from '@aria-ui/utils'\n\nimport { preventDefault } from '../../utils/prevent-default.ts'\n\nexport { SelectEvent }\n\nexport interface AutocompleteItemProps extends ListboxItemProps {\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 AutocompleteItemPropsDeclaration: PropsDeclaration<AutocompleteItemProps> = /* @__PURE__ */ defineProps<AutocompleteItemProps>(\n {\n value: { default: '', attribute: 'value', type: 'string' },\n disabled: { default: false, attribute: 'disabled', type: 'boolean' },\n },\n)\n\nexport interface AutocompleteItemEvents extends ListboxItemEvents {}\n\n/**\n * @internal\n */\nexport function setupAutocompleteItem(\n host: HostElement,\n props: State<AutocompleteItemProps>,\n): void {\n setupListboxItem(host, props)\n\n // Prevent the editor from losing focus\n useEventListener(host, 'pointerdown', preventDefault)\n useEventListener(host, 'mousedown', preventDefault)\n}\n\nconst AutocompleteItemElementBase: HostElementConstructor<AutocompleteItemProps> = defineCustomElement(\n setupAutocompleteItem,\n AutocompleteItemPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-item>` custom element.\n *\n * Properties: {@link AutocompleteItemProps}\n *\n * Events: {@link AutocompleteItemEvents}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-highlighted` | Present when the item is the currently highlighted option |\n */\nexport class AutocompleteItemElement extends AutocompleteItemElementBase {}\n\n/** @internal */\nexport function registerAutocompleteItemElement(): void {\n registerCustomElement('prosekit-autocomplete-item', AutocompleteItemElement)\n}\n","import type { Signal } from '@aria-ui/core'\n\nexport function createLazySignal<T>(\n getRemote: () => Signal<T> | undefined,\n fallback: T,\n): Signal<T> {\n return {\n get: (): T => {\n const remote = getRemote()\n return remote ? remote.get() : fallback\n },\n set: (value: T): void => {\n const remote = getRemote()\n if (remote) remote.set(value)\n },\n }\n}\n","import { onMount, type HostElement } from '@aria-ui/core'\n\nexport function useNoFocus(host: HostElement): void {\n onMount(host, () => {\n host.tabIndex = -1\n })\n}\n","import { createContext, type Context, type Signal } from '@aria-ui/core'\nimport type { ItemFilter } from '@aria-ui/elements/listbox'\nimport type { OverlayStore } from '@aria-ui/elements/overlay'\n\n/**\n * @internal\n */\nexport interface AutocompleteStore {\n overlayStore: OverlayStore\n query: Signal<string>\n eventTarget: Signal<EventTarget | null>\n filter: Signal<ItemFilter | null>\n}\n\n/**\n * @internal\n */\nexport const autocompleteStoreContext: Context<AutocompleteStore> = createContext<AutocompleteStore>('prosekit-autocomplete-store')\n","import {\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type Signal,\n type State,\n} from '@aria-ui/core'\nimport {\n defaultItemFilter,\n setupListboxRoot,\n type ItemFilter,\n type ListboxRootEvents,\n type ListboxRootProps,\n} from '@aria-ui/elements/listbox'\nimport { OverlayPopupPropsDeclaration, setupOverlayPopup, type OverlayPopupProps } from '@aria-ui/elements/overlay'\n\nimport { createLazySignal } from '../../utils/lazy-signal.ts'\nimport { useNoFocus } from '../../utils/use-no-focus.ts'\n\nimport { autocompleteStoreContext } from './context.ts'\n\n/**\n * @public\n */\nexport interface AutocompletePopupProps extends OverlayPopupProps {}\n\n/**\n * @public\n */\nexport interface AutocompletePopupEvents extends ListboxRootEvents {}\n\n/** @internal */\nexport const AutocompletePopupPropsDeclaration: PropsDeclaration<AutocompletePopupProps> = /* @__PURE__ */ defineProps<\n AutocompletePopupProps\n>(OverlayPopupPropsDeclaration)\n\n/** @internal */\nexport function setupAutocompletePopup(\n host: HostElement,\n _props: State<AutocompletePopupProps>,\n): void {\n const getStore = autocompleteStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.overlayStore\n\n setupOverlayPopup(host, getOverlayStore)\n\n const query = createLazySignal<string>(() => getStore()?.query, ' ')\n const eventTarget = createLazySignal<EventTarget | null>(() => getStore()?.eventTarget, null)\n const filter = createLazySignal<ItemFilter | null>(() => getStore()?.filter, defaultItemFilter)\n const getDisabled = () => (!(getOverlayStore()?.getIsOpen?.()))\n const disabled: Signal<boolean> = { get: getDisabled, set: () => {} }\n const listboxProps = createPopupListboxProps(filter, query, eventTarget, disabled)\n\n setupListboxRoot(host, listboxProps)\n useNoFocus(host)\n}\n\nfunction createPopupListboxProps(\n filter: Signal<ItemFilter | null>,\n query: Signal<string>,\n eventTarget: Signal<EventTarget | null>,\n disabled: Signal<boolean>,\n): State<ListboxRootProps> {\n return {\n value: createSignal(''),\n values: createSignal<string[]>([]),\n multiple: createSignal(false),\n disabled,\n orientation: createSignal<'vertical' | 'horizontal'>('vertical'),\n loop: createSignal(false),\n autoHighlight: createSignal(true),\n query,\n eventTarget,\n filter,\n }\n}\n\nconst AutocompletePopupElementBase: HostElementConstructor<AutocompletePopupProps> = defineCustomElement(\n setupAutocompletePopup,\n AutocompletePopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-popup>` custom element.\n *\n * Properties: {@link AutocompletePopupProps}\n *\n * Events: {@link AutocompletePopupEvents}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the autocomplete is visible, `\"closed\"` otherwise |\n */\nexport class AutocompletePopupElement extends AutocompletePopupElementBase {}\n\n/** @internal */\nexport function registerAutocompletePopupElement(): void {\n registerCustomElement('prosekit-autocomplete-popup', AutocompletePopupElement)\n}\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { OverlayPositionerPropsDeclaration, setupOverlayPositioner, type OverlayPositionerProps } from '@aria-ui/elements/overlay'\n\nimport { autocompleteStoreContext } from './context.ts'\n\nconst body = typeof document !== 'undefined' && document.querySelector('body')\nconst defaultBoundary = body || 'clippingAncestors'\n\n/**\n * @public\n */\nexport interface AutocompletePositionerProps extends OverlayPositionerProps {\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 text selection.\n *\n * @default { mainAxis: 8, crossAxis: -4 }\n */\n offset: OverlayPositionerProps['offset']\n\n /**\n * Whether to hide the floating element when the reference element or the\n * floating element is fully clipped.\n *\n * @default true\n */\n hide: OverlayPositionerProps['hide']\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\n/** @internal */\nexport const AutocompletePositionerPropsDeclaration: PropsDeclaration<AutocompletePositionerProps> = /* @__PURE__ */ defineProps<\n AutocompletePositionerProps\n>({\n ...OverlayPositionerPropsDeclaration,\n placement: { default: 'bottom-start', attribute: 'placement', type: 'string' },\n offset: { default: { mainAxis: 8, crossAxis: -4 }, attribute: false },\n hide: { default: true, attribute: 'hide', type: 'boolean' },\n inline: { default: true, attribute: 'inline', type: 'boolean' },\n hoist: { default: true, attribute: 'hoist', type: 'boolean' },\n fitViewport: { default: true, attribute: 'fit-viewport', type: 'boolean' },\n boundary: { default: defaultBoundary, attribute: false },\n overflowPadding: { default: 8, attribute: 'overflow-padding', type: 'number' },\n})\n\n/** @internal */\nexport function setupAutocompletePositioner(\n host: HostElement,\n props: State<AutocompletePositionerProps>,\n): void {\n const getStore = autocompleteStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.overlayStore\n setupOverlayPositioner(host, props satisfies State<OverlayPositionerProps>, getOverlayStore)\n}\n\nconst AutocompletePositionerElementBase: HostElementConstructor<AutocompletePositionerProps> = defineCustomElement(\n setupAutocompletePositioner,\n AutocompletePositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-positioner>` custom element.\n *\n * Properties: {@link AutocompletePositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the autocomplete is visible, `\"closed\"` otherwise |\n * | `data-side` | The side of the anchor element the positioner is on |\n * | `data-align` | The alignment of the positioner relative to the anchor element |\n *\n * CSS variables:\n *\n * | Variable | Description |\n * | --- | --- |\n * | `--transform-origin` | The coordinates that this element is anchored to. Useful for scale animations. |\n */\nexport class AutocompletePositionerElement extends AutocompletePositionerElementBase {}\n\n/** @internal */\nexport function registerAutocompletePositionerElement(): void {\n registerCustomElement('prosekit-autocomplete-positioner', AutocompletePositionerElement)\n}\n","function cloneKeyboardEvent(source: KeyboardEvent): KeyboardEvent {\n return new KeyboardEvent(source.type, {\n code: source.code,\n key: source.key,\n location: source.location,\n repeat: source.repeat,\n altKey: source.altKey,\n ctrlKey: source.ctrlKey,\n metaKey: source.metaKey,\n shiftKey: source.shiftKey,\n\n view: source.view,\n // internal bridge target; events don't need to bubble\"\n bubbles: false,\n cancelable: true,\n })\n}\n\nexport class KeyboardEventTarget extends EventTarget {\n override dispatchEvent(event: KeyboardEvent): boolean {\n const newEvent = cloneKeyboardEvent(event)\n const result: boolean = super.dispatchEvent(newEvent)\n if (newEvent.defaultPrevented) {\n event.preventDefault()\n }\n return result\n }\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 createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n useEffect,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type Signal,\n type State,\n} from '@aria-ui/core'\nimport { defaultItemFilter, type ItemFilter, type ListboxRootEvents } from '@aria-ui/elements/listbox'\nimport { createOverlayStore, OpenChangeEvent, type OverlayStore } from '@aria-ui/elements/overlay'\nimport { useEventListener } from '@aria-ui/utils'\nimport type { ReferenceElement, VirtualElement } from '@floating-ui/dom'\nimport { defineDOMEventHandler, defineKeymap, withPriority, type Editor, type Extension, type Priority } from '@prosekit/core'\nimport { AutocompleteRule, defineAutocomplete, type MatchHandler } from '@prosekit/extensions/autocomplete'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { KeyboardEventTarget } from '../../utils/event.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { autocompleteStoreContext, type AutocompleteStore } from './context.ts'\nimport { defaultQueryBuilder } from './helpers.ts'\n\nexport { OpenChangeEvent }\n\nexport interface AutocompleteRootProps {\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 filter function to determine if an item should be shown in the\n * listbox.\n *\n * @default defaultItemFilter\n */\n filter: ItemFilter | null\n\n /**\n * The reference to position the popup against. This can be a DOM element, a\n * Floating UI virtual element, or a function that returns either of them.\n * By default, the popup will be positioned against the text content that\n * triggers the autocomplete.\n *\n * @default null\n */\n anchor: Element | VirtualElement | (() => Element | VirtualElement | null) | null\n}\n\n/** @internal */\nexport const AutocompleteRootPropsDeclaration: PropsDeclaration<AutocompleteRootProps> = /* @__PURE__ */ defineProps<\n AutocompleteRootProps\n>({\n editor: { default: null, attribute: false },\n regex: { default: null, attribute: false },\n filter: { default: defaultItemFilter, attribute: false },\n anchor: { default: null, attribute: false },\n})\n\n/**\n * @public\n */\nexport class QueryChangeEvent extends Event {\n /**\n * The current query string.\n */\n readonly detail: string\n\n constructor(query: string) {\n super('queryChange', { bubbles: true })\n this.detail = query\n }\n}\n\n/**\n * @public\n */\nexport interface AutocompleteRootEvents extends ListboxRootEvents {\n /**\n * Fired when the open state changes.\n */\n openChange: OpenChangeEvent\n\n /**\n * Fired when the query changes.\n */\n queryChange: QueryChangeEvent\n}\n\ninterface RuleHandlers {\n submit?: VoidFunction\n dismiss?: VoidFunction\n}\n\ninterface AutocompleteRuleDeps {\n reference: Signal<ReferenceElement | undefined>\n handlers: RuleHandlers\n setQuery: (next: string) => void\n requestOpenChange: (open: boolean) => void\n}\n\n/**\n * @internal\n */\nexport function setupAutocompleteRoot(\n host: HostElement,\n props: State<AutocompleteRootProps>,\n): void {\n const getEditor = props.editor.get\n\n const reference = createSignal<ReferenceElement | undefined>(undefined)\n const open = createSignal(false)\n const query = createSignal('')\n const keyboardTarget = new KeyboardEventTarget()\n const eventTarget = createSignal<EventTarget | null>(keyboardTarget)\n const handlers: RuleHandlers = {}\n\n // Create overlay store for positioning. The open state is managed by the\n // overlay store via requestOpenChange(), which dispatches OpenChangeEvent and\n // updates the open signal.\n const overlayStore: OverlayStore = createOverlayStore(\n open.get,\n open.set,\n () => false,\n () => false,\n (event) => host.dispatchEvent(event),\n )\n\n useEffect(host, () => {\n overlayStore.setAnchorElement(reference.get())\n })\n\n const autocompleteStore: AutocompleteStore = {\n overlayStore,\n query,\n eventTarget,\n filter: props.filter,\n }\n\n autocompleteStoreContext.provide(host, autocompleteStore)\n\n useEventListener(host, 'valueChange', () => {\n handlers.submit?.()\n })\n\n useKeyboardBridge(host, getEditor, open.get, keyboardTarget)\n\n useEscapeKeydown(host, getEditor, () => {\n if (!open.get() || !handlers.dismiss) return false\n handlers.dismiss()\n return true\n })\n\n const setQuery = (next: string): void => {\n if (query.get() === next) return\n query.set(next)\n host.dispatchEvent(new QueryChangeEvent(next))\n }\n\n const getAnchor = (): ReferenceElement | null => {\n const customAnchor = props.anchor.get()\n if (customAnchor) {\n if (typeof customAnchor === 'function') {\n return customAnchor() || null\n } else {\n return customAnchor\n }\n }\n const view = getSafeEditorView(getEditor())\n return view?.dom.querySelector('.prosekit-autocomplete-match') || null\n }\n\n useAutocompleteExtension(host, getEditor, props.regex.get, getAnchor, {\n reference,\n handlers,\n setQuery,\n requestOpenChange: (open) => overlayStore.requestOpenChange(open),\n })\n}\n\nconst EVENT_KEYS = [\n 'ArrowDown',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowLeft',\n 'Home',\n 'End',\n 'Enter',\n] as const\n\nfunction useKeyboardBridge(\n host: HostElement,\n getEditor: () => Editor | null,\n getOpen: () => boolean,\n target: EventTarget,\n): void {\n const extension: Extension = defineDOMEventHandler('keydown', (view, event): boolean => {\n if (\n view.composing\n || event.defaultPrevented\n || !getOpen()\n || !EVENT_KEYS.includes(event.key as (typeof EVENT_KEYS)[number])\n ) {\n return false\n }\n target.dispatchEvent(event)\n return event.defaultPrevented\n })\n useEditorExtension(host, getEditor, withPriority(extension, 4 satisfies typeof Priority.highest))\n}\n\nfunction useAutocompleteExtension(\n host: HostElement,\n getEditor: () => Editor | null,\n getRegex: () => RegExp | null,\n getAnchor: () => ReferenceElement | null,\n deps: AutocompleteRuleDeps,\n) {\n useEffect(host, () => {\n const editor = getEditor()\n const regex = getRegex()\n\n if (!editor || !regex) {\n return\n }\n\n const rule = createAutocompleteRule(editor, regex, getAnchor, deps)\n const extension = defineAutocomplete(rule)\n return editor.use(extension)\n })\n}\n\nfunction createAutocompleteRule(\n editor: Editor,\n regex: RegExp,\n getAnchor: () => ReferenceElement | null,\n deps: AutocompleteRuleDeps,\n) {\n const { reference, handlers, setQuery, requestOpenChange } = deps\n\n const handleEnter: MatchHandler = (options) => {\n const anchor = getAnchor()\n reference.set(anchor || undefined)\n\n handlers.submit = options.deleteMatch\n handlers.dismiss = options.ignoreMatch\n setQuery(defaultQueryBuilder(options.match))\n requestOpenChange(true)\n }\n\n const handleLeave = () => {\n reference.set(undefined)\n setQuery('')\n handlers.submit = undefined\n handlers.dismiss = undefined\n requestOpenChange(false)\n }\n\n return new AutocompleteRule({\n regex,\n onEnter: handleEnter,\n onLeave: handleLeave,\n })\n}\n\nfunction useEscapeKeydown(\n host: HostElement,\n getEditor: () => 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, getEditor, extension)\n}\n\nconst AutocompleteRootElementBase: HostElementConstructor<AutocompleteRootProps> = defineCustomElement(\n setupAutocompleteRoot,\n AutocompleteRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-root>` custom element.\n *\n * Properties: {@link AutocompleteRootProps}\n *\n * Events: {@link AutocompleteRootEvents}\n */\nexport class AutocompleteRootElement extends AutocompleteRootElementBase {}\n\n/** @internal */\nexport function registerAutocompleteRootElement(): void {\n registerCustomElement('prosekit-autocomplete-root', AutocompleteRootElement)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"autocomplete.js","names":[],"sources":["../src/components/autocomplete/autocomplete-empty.ts","../src/utils/prevent-default.ts","../src/components/autocomplete/autocomplete-item.ts","../src/utils/lazy-signal.ts","../src/utils/use-no-focus.ts","../src/components/autocomplete/context.ts","../src/components/autocomplete/autocomplete-popup.ts","../src/components/autocomplete/autocomplete-positioner.ts","../src/utils/event.ts","../src/components/autocomplete/helpers.ts","../src/components/autocomplete/autocomplete-root.ts"],"sourcesContent":["import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { setupListboxEmpty, type ListboxEmptyProps } from '@aria-ui/elements/listbox'\n\nexport interface AutocompleteEmptyProps extends ListboxEmptyProps {}\n\n/** @internal */\nexport const AutocompleteEmptyPropsDeclaration: PropsDeclaration<AutocompleteEmptyProps> = /* @__PURE__ */ defineProps<\n AutocompleteEmptyProps\n>({})\n\n/**\n * @internal\n */\nexport function setupAutocompleteEmpty(\n host: HostElement,\n props: State<AutocompleteEmptyProps>,\n): void {\n setupListboxEmpty(host, props)\n}\n\nconst AutocompleteEmptyElementBase: HostElementConstructor<AutocompleteEmptyProps> = defineCustomElement(\n setupAutocompleteEmpty,\n AutocompleteEmptyPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-empty>` custom element.\n *\n * Properties: {@link AutocompleteEmptyProps}\n */\nexport class AutocompleteEmptyElement extends AutocompleteEmptyElementBase {}\n\n/** @internal */\nexport function registerAutocompleteEmptyElement(): void {\n registerCustomElement('prosekit-autocomplete-empty', AutocompleteEmptyElement)\n}\n","export function preventDefault(event: Event): void {\n event.preventDefault()\n}\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { SelectEvent, setupListboxItem, type ListboxItemEvents, type ListboxItemProps } from '@aria-ui/elements/listbox'\nimport { useEventListener } from '@aria-ui/utils'\n\nimport { preventDefault } from '../../utils/prevent-default.ts'\n\nexport { SelectEvent }\n\nexport interface AutocompleteItemProps extends ListboxItemProps {\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 AutocompleteItemPropsDeclaration: PropsDeclaration<AutocompleteItemProps> = /* @__PURE__ */ defineProps<AutocompleteItemProps>(\n {\n value: { default: '', attribute: 'value', type: 'string' },\n disabled: { default: false, attribute: 'disabled', type: 'boolean' },\n },\n)\n\nexport interface AutocompleteItemEvents extends ListboxItemEvents {}\n\n/**\n * @internal\n */\nexport function setupAutocompleteItem(\n host: HostElement,\n props: State<AutocompleteItemProps>,\n): void {\n setupListboxItem(host, props)\n\n // Prevent the editor from losing focus\n useEventListener(host, 'pointerdown', preventDefault)\n useEventListener(host, 'mousedown', preventDefault)\n}\n\nconst AutocompleteItemElementBase: HostElementConstructor<AutocompleteItemProps> = defineCustomElement(\n setupAutocompleteItem,\n AutocompleteItemPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-item>` custom element.\n *\n * Properties: {@link AutocompleteItemProps}\n *\n * Events: {@link AutocompleteItemEvents}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-highlighted` | Present when the item is the currently highlighted option |\n */\nexport class AutocompleteItemElement extends AutocompleteItemElementBase {}\n\n/** @internal */\nexport function registerAutocompleteItemElement(): void {\n registerCustomElement('prosekit-autocomplete-item', AutocompleteItemElement)\n}\n","import type { Signal } from '@aria-ui/core'\n\nexport function createLazySignal<T>(\n getRemote: () => Signal<T> | undefined,\n fallback: T,\n): Signal<T> {\n return {\n get: (): T => {\n const remote = getRemote()\n return remote ? remote.get() : fallback\n },\n set: (value: T): void => {\n const remote = getRemote()\n if (remote) remote.set(value)\n },\n }\n}\n","import { onMount, type HostElement } from '@aria-ui/core'\n\nexport function useNoFocus(host: HostElement): void {\n onMount(host, () => {\n host.tabIndex = -1\n })\n}\n","import { createContext, type Context, type Signal } from '@aria-ui/core'\nimport type { ItemFilter } from '@aria-ui/elements/listbox'\nimport type { OverlayStore } from '@aria-ui/elements/overlay'\n\n/**\n * @internal\n */\nexport interface AutocompleteStore {\n overlayStore: OverlayStore\n query: Signal<string>\n eventTarget: Signal<EventTarget | null>\n filter: Signal<ItemFilter | null>\n}\n\n/**\n * @internal\n */\nexport const autocompleteStoreContext: Context<AutocompleteStore> = createContext<AutocompleteStore>('prosekit-autocomplete-store')\n","import {\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type Signal,\n type State,\n} from '@aria-ui/core'\nimport {\n defaultItemFilter,\n setupListboxRoot,\n type ItemFilter,\n type ListboxRootEvents,\n type ListboxRootProps,\n} from '@aria-ui/elements/listbox'\nimport { OverlayPopupPropsDeclaration, setupOverlayPopup, type OverlayPopupProps } from '@aria-ui/elements/overlay'\n\nimport { createLazySignal } from '../../utils/lazy-signal.ts'\nimport { useNoFocus } from '../../utils/use-no-focus.ts'\n\nimport { autocompleteStoreContext } from './context.ts'\n\nexport interface AutocompletePopupProps extends OverlayPopupProps {}\n\nexport interface AutocompletePopupEvents extends ListboxRootEvents {}\n\n/** @internal */\nexport const AutocompletePopupPropsDeclaration: PropsDeclaration<AutocompletePopupProps> = /* @__PURE__ */ defineProps<\n AutocompletePopupProps\n>(OverlayPopupPropsDeclaration)\n\n/** @internal */\nexport function setupAutocompletePopup(\n host: HostElement,\n _props: State<AutocompletePopupProps>,\n): void {\n const getStore = autocompleteStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.overlayStore\n\n setupOverlayPopup(host, getOverlayStore)\n\n const query = createLazySignal<string>(() => getStore()?.query, ' ')\n const eventTarget = createLazySignal<EventTarget | null>(() => getStore()?.eventTarget, null)\n const filter = createLazySignal<ItemFilter | null>(() => getStore()?.filter, defaultItemFilter)\n const getDisabled = () => (!(getOverlayStore()?.getIsOpen?.()))\n const disabled: Signal<boolean> = { get: getDisabled, set: () => {} }\n const listboxProps = createPopupListboxProps(filter, query, eventTarget, disabled)\n\n setupListboxRoot(host, listboxProps)\n useNoFocus(host)\n}\n\nfunction createPopupListboxProps(\n filter: Signal<ItemFilter | null>,\n query: Signal<string>,\n eventTarget: Signal<EventTarget | null>,\n disabled: Signal<boolean>,\n): State<ListboxRootProps> {\n return {\n value: createSignal(''),\n values: createSignal<string[]>([]),\n multiple: createSignal(false),\n disabled,\n orientation: createSignal<'vertical' | 'horizontal'>('vertical'),\n loop: createSignal(false),\n autoHighlight: createSignal(true),\n query,\n eventTarget,\n filter,\n }\n}\n\nconst AutocompletePopupElementBase: HostElementConstructor<AutocompletePopupProps> = defineCustomElement(\n setupAutocompletePopup,\n AutocompletePopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-popup>` custom element.\n *\n * Properties: {@link AutocompletePopupProps}\n *\n * Events: {@link AutocompletePopupEvents}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the autocomplete is visible, `\"closed\"` otherwise |\n */\nexport class AutocompletePopupElement extends AutocompletePopupElementBase {}\n\n/** @internal */\nexport function registerAutocompletePopupElement(): void {\n registerCustomElement('prosekit-autocomplete-popup', AutocompletePopupElement)\n}\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { OverlayPositionerPropsDeclaration, setupOverlayPositioner, type OverlayPositionerProps } from '@aria-ui/elements/overlay'\n\nimport { autocompleteStoreContext } from './context.ts'\n\nconst body = typeof document !== 'undefined' && document.querySelector('body')\nconst defaultBoundary = body || 'clippingAncestors'\n\nexport interface AutocompletePositionerProps extends OverlayPositionerProps {\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 text selection.\n *\n * @default { mainAxis: 8, crossAxis: -4 }\n */\n offset: OverlayPositionerProps['offset']\n\n /**\n * Whether to hide the floating element when the reference element or the\n * floating element is fully clipped.\n *\n * @default true\n */\n hide: OverlayPositionerProps['hide']\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\n/** @internal */\nexport const AutocompletePositionerPropsDeclaration: PropsDeclaration<AutocompletePositionerProps> = /* @__PURE__ */ defineProps<\n AutocompletePositionerProps\n>({\n ...OverlayPositionerPropsDeclaration,\n placement: { default: 'bottom-start', attribute: 'placement', type: 'string' },\n offset: { default: { mainAxis: 8, crossAxis: -4 }, attribute: false },\n hide: { default: true, attribute: 'hide', type: 'boolean' },\n inline: { default: true, attribute: 'inline', type: 'boolean' },\n hoist: { default: true, attribute: 'hoist', type: 'boolean' },\n fitViewport: { default: true, attribute: 'fit-viewport', type: 'boolean' },\n boundary: { default: defaultBoundary, attribute: false },\n overflowPadding: { default: 8, attribute: 'overflow-padding', type: 'number' },\n})\n\n/** @internal */\nexport function setupAutocompletePositioner(\n host: HostElement,\n props: State<AutocompletePositionerProps>,\n): void {\n const getStore = autocompleteStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.overlayStore\n setupOverlayPositioner(host, props satisfies State<OverlayPositionerProps>, getOverlayStore)\n}\n\nconst AutocompletePositionerElementBase: HostElementConstructor<AutocompletePositionerProps> = defineCustomElement(\n setupAutocompletePositioner,\n AutocompletePositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-positioner>` custom element.\n *\n * Properties: {@link AutocompletePositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the autocomplete is visible, `\"closed\"` otherwise |\n * | `data-side` | The side of the anchor element the positioner is on |\n * | `data-align` | The alignment of the positioner relative to the anchor element |\n *\n * CSS variables:\n *\n * | Variable | Description |\n * | --- | --- |\n * | `--transform-origin` | The coordinates that this element is anchored to. Useful for scale animations. |\n */\nexport class AutocompletePositionerElement extends AutocompletePositionerElementBase {}\n\n/** @internal */\nexport function registerAutocompletePositionerElement(): void {\n registerCustomElement('prosekit-autocomplete-positioner', AutocompletePositionerElement)\n}\n","function cloneKeyboardEvent(source: KeyboardEvent): KeyboardEvent {\n return new KeyboardEvent(source.type, {\n code: source.code,\n key: source.key,\n location: source.location,\n repeat: source.repeat,\n altKey: source.altKey,\n ctrlKey: source.ctrlKey,\n metaKey: source.metaKey,\n shiftKey: source.shiftKey,\n\n view: source.view,\n // internal bridge target; events don't need to bubble\"\n bubbles: false,\n cancelable: true,\n })\n}\n\nexport class KeyboardEventTarget extends EventTarget {\n override dispatchEvent(event: KeyboardEvent): boolean {\n const newEvent = cloneKeyboardEvent(event)\n const result: boolean = super.dispatchEvent(newEvent)\n if (newEvent.defaultPrevented) {\n event.preventDefault()\n }\n return result\n }\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 createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n useEffect,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type Signal,\n type State,\n} from '@aria-ui/core'\nimport { defaultItemFilter, type ItemFilter, type ListboxRootEvents } from '@aria-ui/elements/listbox'\nimport { createOverlayStore, OpenChangeEvent, type OverlayStore } from '@aria-ui/elements/overlay'\nimport { useEventListener } from '@aria-ui/utils'\nimport type { ReferenceElement, VirtualElement } from '@floating-ui/dom'\nimport { defineDOMEventHandler, defineKeymap, withPriority, type Editor, type Extension, type Priority } from '@prosekit/core'\nimport { AutocompleteRule, defineAutocomplete, type MatchHandler } from '@prosekit/extensions/autocomplete'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { KeyboardEventTarget } from '../../utils/event.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { autocompleteStoreContext, type AutocompleteStore } from './context.ts'\nimport { defaultQueryBuilder } from './helpers.ts'\n\nexport { OpenChangeEvent }\n\nexport interface AutocompleteRootProps {\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 filter function to determine if an item should be shown in the\n * listbox.\n *\n * @default defaultItemFilter\n */\n filter: ItemFilter | null\n\n /**\n * The reference to position the popup against. This can be a DOM element, a\n * Floating UI virtual element, or a function that returns either of them.\n * By default, the popup will be positioned against the text content that\n * triggers the autocomplete.\n *\n * @default null\n */\n anchor: Element | VirtualElement | (() => Element | VirtualElement | null) | null\n}\n\n/** @internal */\nexport const AutocompleteRootPropsDeclaration: PropsDeclaration<AutocompleteRootProps> = /* @__PURE__ */ defineProps<\n AutocompleteRootProps\n>({\n editor: { default: null, attribute: false },\n regex: { default: null, attribute: false },\n filter: { default: defaultItemFilter, attribute: false },\n anchor: { default: null, attribute: false },\n})\n\nexport class QueryChangeEvent extends Event {\n /**\n * The current query string.\n */\n readonly detail: string\n\n constructor(query: string) {\n super('queryChange', { bubbles: true })\n this.detail = query\n }\n}\n\nexport interface AutocompleteRootEvents extends ListboxRootEvents {\n /**\n * Fired when the open state changes.\n */\n openChange: OpenChangeEvent\n\n /**\n * Fired when the query changes.\n */\n queryChange: QueryChangeEvent\n}\n\ninterface RuleHandlers {\n submit?: VoidFunction\n dismiss?: VoidFunction\n}\n\ninterface AutocompleteRuleDeps {\n reference: Signal<ReferenceElement | undefined>\n handlers: RuleHandlers\n setQuery: (next: string) => void\n requestOpenChange: (open: boolean) => void\n}\n\n/**\n * @internal\n */\nexport function setupAutocompleteRoot(\n host: HostElement,\n props: State<AutocompleteRootProps>,\n): void {\n const getEditor = props.editor.get\n\n const reference = createSignal<ReferenceElement | undefined>(undefined)\n const open = createSignal(false)\n const query = createSignal('')\n const keyboardTarget = new KeyboardEventTarget()\n const eventTarget = createSignal<EventTarget | null>(keyboardTarget)\n const handlers: RuleHandlers = {}\n\n // Create overlay store for positioning. The open state is managed by the\n // overlay store via requestOpenChange(), which dispatches OpenChangeEvent and\n // updates the open signal.\n const overlayStore: OverlayStore = createOverlayStore(\n open.get,\n open.set,\n () => false,\n () => false,\n (event) => host.dispatchEvent(event),\n )\n\n useEffect(host, () => {\n overlayStore.setAnchorElement(reference.get())\n })\n\n const autocompleteStore: AutocompleteStore = {\n overlayStore,\n query,\n eventTarget,\n filter: props.filter,\n }\n\n autocompleteStoreContext.provide(host, autocompleteStore)\n\n useEventListener(host, 'valueChange', () => {\n handlers.submit?.()\n })\n\n useKeyboardBridge(host, getEditor, open.get, keyboardTarget)\n\n useEscapeKeydown(host, getEditor, () => {\n if (!open.get() || !handlers.dismiss) return false\n handlers.dismiss()\n return true\n })\n\n const setQuery = (next: string): void => {\n if (query.get() === next) return\n query.set(next)\n host.dispatchEvent(new QueryChangeEvent(next))\n }\n\n const getAnchor = (): ReferenceElement | null => {\n const customAnchor = props.anchor.get()\n if (customAnchor) {\n if (typeof customAnchor === 'function') {\n return customAnchor() || null\n } else {\n return customAnchor\n }\n }\n const view = getSafeEditorView(getEditor())\n return view?.dom.querySelector('.prosekit-autocomplete-match') || null\n }\n\n useAutocompleteExtension(host, getEditor, props.regex.get, getAnchor, {\n reference,\n handlers,\n setQuery,\n requestOpenChange: (open) => overlayStore.requestOpenChange(open),\n })\n}\n\nconst EVENT_KEYS = [\n 'ArrowDown',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowLeft',\n 'Home',\n 'End',\n 'Enter',\n] as const\n\nfunction useKeyboardBridge(\n host: HostElement,\n getEditor: () => Editor | null,\n getOpen: () => boolean,\n target: EventTarget,\n): void {\n const extension: Extension = defineDOMEventHandler('keydown', (view, event): boolean => {\n if (\n view.composing\n || event.defaultPrevented\n || !getOpen()\n || !EVENT_KEYS.includes(event.key as (typeof EVENT_KEYS)[number])\n ) {\n return false\n }\n target.dispatchEvent(event)\n return event.defaultPrevented\n })\n useEditorExtension(host, getEditor, withPriority(extension, 4 satisfies typeof Priority.highest))\n}\n\nfunction useAutocompleteExtension(\n host: HostElement,\n getEditor: () => Editor | null,\n getRegex: () => RegExp | null,\n getAnchor: () => ReferenceElement | null,\n deps: AutocompleteRuleDeps,\n) {\n useEffect(host, () => {\n const editor = getEditor()\n const regex = getRegex()\n\n if (!editor || !regex) {\n return\n }\n\n const rule = createAutocompleteRule(editor, regex, getAnchor, deps)\n const extension = defineAutocomplete(rule)\n return editor.use(extension)\n })\n}\n\nfunction createAutocompleteRule(\n editor: Editor,\n regex: RegExp,\n getAnchor: () => ReferenceElement | null,\n deps: AutocompleteRuleDeps,\n) {\n const { reference, handlers, setQuery, requestOpenChange } = deps\n\n const handleEnter: MatchHandler = (options) => {\n const anchor = getAnchor()\n reference.set(anchor || undefined)\n\n handlers.submit = options.deleteMatch\n handlers.dismiss = options.ignoreMatch\n setQuery(defaultQueryBuilder(options.match))\n requestOpenChange(true)\n }\n\n const handleLeave = () => {\n reference.set(undefined)\n setQuery('')\n handlers.submit = undefined\n handlers.dismiss = undefined\n requestOpenChange(false)\n }\n\n return new AutocompleteRule({\n regex,\n onEnter: handleEnter,\n onLeave: handleLeave,\n })\n}\n\nfunction useEscapeKeydown(\n host: HostElement,\n getEditor: () => 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, getEditor, extension)\n}\n\nconst AutocompleteRootElementBase: HostElementConstructor<AutocompleteRootProps> = defineCustomElement(\n setupAutocompleteRoot,\n AutocompleteRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-autocomplete-root>` custom element.\n *\n * Properties: {@link AutocompleteRootProps}\n *\n * Events: {@link AutocompleteRootEvents}\n */\nexport class AutocompleteRootElement extends AutocompleteRootElementBase {}\n\n/** @internal */\nexport function registerAutocompleteRootElement(): void {\n registerCustomElement('prosekit-autocomplete-root', AutocompleteRootElement)\n}\n"],"mappings":"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"}
@@ -57,9 +57,6 @@ declare const BlockHandleDraggableElementBase: HostElementConstructor<BlockHandl
57
57
  declare class BlockHandleDraggableElement extends BlockHandleDraggableElementBase {}
58
58
  /** @internal */
59
59
  declare function registerBlockHandleDraggableElement(): void;
60
- /**
61
- * @public
62
- */
63
60
  interface BlockHandlePopupProps extends OverlayPopupProps {}
64
61
  /** @internal */
65
62
  declare const BlockHandlePopupPropsDeclaration: PropsDeclaration<BlockHandlePopupProps>;
@@ -80,9 +77,6 @@ declare const BlockHandlePopupElementBase: HostElementConstructor<BlockHandlePop
80
77
  declare class BlockHandlePopupElement extends BlockHandlePopupElementBase {}
81
78
  /** @internal */
82
79
  declare function registerBlockHandlePopupElement(): void;
83
- /**
84
- * @public
85
- */
86
80
  interface BlockHandlePositionerProps extends Omit<OverlayPositionerProps, 'placement' | 'hoist' | 'flip' | 'shift' | 'hide'> {
87
81
  /**
88
82
  * The placement of the popover, relative to the hovered block.
@@ -151,9 +145,6 @@ interface BlockHandleRootProps {
151
145
  }
152
146
  /** @internal */
153
147
  declare const BlockHandleRootPropsDeclaration: PropsDeclaration<BlockHandleRootProps>;
154
- /**
155
- * @public
156
- */
157
148
  declare class BlockHandleStateChangeEvent extends Event {
158
149
  /**
159
150
  * The currently hovered block's node and position, or `null` if no block is hovered.
@@ -167,9 +158,6 @@ declare class BlockHandleStateChangeEvent extends Event {
167
158
  pos: number;
168
159
  } | null);
169
160
  }
170
- /**
171
- * @public
172
- */
173
161
  interface BlockHandleRootEvents {
174
162
  /**
175
163
  * Fired when the hovered block changes.
@@ -1 +1 @@
1
- {"version":3,"file":"block-handle.d.ts","names":[],"sources":["../src/components/block-handle/block-handle-add.ts","../src/components/block-handle/block-handle-draggable.ts","../src/components/block-handle/block-handle-popup.ts","../src/components/block-handle/block-handle-positioner.ts","../src/components/block-handle/block-handle-root.ts"],"mappings":";;;;;UAciB,mBAAA;;;;AAAjB;;;EAOE,MAAA,EAAQ,MAAA;AAAA;AAIV;AAAA,cAAa,8BAAA,EAAgC,gBAAA,CAAiB,mBAAA;;;;iBAO9C,mBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,mBAAA;AAAA,cAuBT,yBAAA,EAA2B,sBAAA,CAAuB,mBAAA;;;;;;cAU3C,qBAAA,SAA8B,yBAAA;;iBAG3B,6BAAA,CAAA;AAAA,UC7CC,yBAAA;;;;ADXjB;;;ECkBE,MAAA,EAAQ,MAAA;AAAA;ADPV;AAAA,cCWa,oCAAA,EAAsC,gBAAA,CAAiB,yBAAA;;;;iBASpD,yBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,yBAAA;AAAA,cAgGT,+BAAA,EAAiC,sBAAA,CAAuB,yBAAA;;;;;;;;;;;;cAgBjD,2BAAA,SAAoC,+BAAA;ADxGhD;AAAA,iBC2Ge,mCAAA,CAAA;;;;UCnJC,qBAAA,SAA8B,iBAAA;;cAGlC,gCAAA,EAAkC,gBAAA,CAAiB,qBAAA;;iBAGhD,qBAAA,CACd,IAAA,EAAM,WAAA,EACN,MAAA,EAAQ,KAAA,CAAM,qBAAA;AAAA,cAMV,2BAAA,EAA6B,sBAAA,CAAuB,qBAAA;;;;;AFG1D;;;;;;;cEaa,uBAAA,SAAgC,2BAAA;;iBAG7B,+BAAA,CAAA;;;;UC/BC,0BAAA,SAAmC,IAAA,CAAK,sBAAA;EHHrB;;;;AAWpC;EGFE,SAAA,EAAW,SAAA;;;;AHSb;;;EGDE,KAAA;EHGa;;;;EGGb,IAAA;EHJA;;;;EGUA,KAAA;EHTiC;AAqBlC;;;EGNC,IAAA;AAAA;AHkBF;AAAA,cGda,qCAAA,EAAuC,gBAAA,CAAiB,0BAAA;;iBAcrD,0BAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,0BAAA;AAAA,cAMT,gCAAA,EAAkC,sBAAA,CAAuB,0BAAA;AHL/D;;;;;;AC7CA;;;;;AAWA;;;;;AASA;;;ADyBA,cG6Ba,4BAAA,SAAqC,gCAAA;;iBAGlC,oCAAA,CAAA;AAAA,UC/EC,oBAAA;;;AJTjB;;;;EIgBE,MAAA,EAAQ,MAAA;AAAA;;cAIG,+BAAA,EAAiC,gBAAA,CAAiB,oBAAA;;;AJF/D;cIWa,2BAAA,SAAoC,KAAA;;;;EAI/C,MAAA;IAAU,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;cACrB,KAAA;IAAS,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;AAAA;;AJO7C;;UIEgB,qBAAA;EJAgB;;AAUjC;EINE,WAAA,EAAa,2BAAA;AAAA;;;AJSf;iBIHgB,oBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,oBAAA;AAAA,cAoCT,0BAAA,EAA4B,sBAAA,CAAuB,oBAAA;;;;AHhFzD;;;;cG4Fa,sBAAA,SAA+B,0BAAA;;iBAG5B,8BAAA,CAAA"}
1
+ {"version":3,"file":"block-handle.d.ts","names":[],"sources":["../src/components/block-handle/block-handle-add.ts","../src/components/block-handle/block-handle-draggable.ts","../src/components/block-handle/block-handle-popup.ts","../src/components/block-handle/block-handle-positioner.ts","../src/components/block-handle/block-handle-root.ts"],"mappings":";;;;;UAciB,mBAAA;;;;AAAjB;;;EAOE,MAAA,EAAQ,MAAM;AAAA;AAIhB;AAAA,cAAa,8BAAA,EAAgC,gBAAgB,CAAC,mBAAA;;;AAAmB;iBAOjE,mBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,mBAAA;AAAA,cAuBT,yBAAA,EAA2B,sBAAsB,CAAC,mBAAA;;;;;;cAU3C,qBAAA,SAA8B,yBAAyB;;iBAGpD,6BAAA,CAAA;AAAA,UC7CC,yBAAA;;;;ADXjB;;;ECkBE,MAAA,EAAQ,MAAM;AAAA;ADPhB;AAAA,cCWa,oCAAA,EAAsC,gBAAgB,CAAC,yBAAA;;;ADXa;iBCoBjE,yBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,yBAAA;AAAA,cAgGT,+BAAA,EAAiC,sBAAsB,CAAC,yBAAA;;;;;;;;;;;;cAgBjD,2BAAA,SAAoC,+BAA+B;ADxG/E;AAAA,iBC2Ge,mCAAA,CAAA;AAAA,UCtJC,qBAAA,SAA8B,iBAAiB;;cAGnD,gCAAA,EAAkC,gBAAgB,CAAC,qBAAA;AFDhE;AAAA,iBEIgB,qBAAA,CACd,IAAA,EAAM,WAAA,EACN,MAAA,EAAQ,KAAA,CAAM,qBAAA;AAAA,cAMV,2BAAA,EAA6B,sBAAsB,CAAC,qBAAA;;AFL1C;AAIhB;;;;AAAiF;AAOjF;;;;cEUa,uBAAA,SAAgC,2BAA2B;;iBAGxD,+BAAA,CAAA;AAAA,UC/BC,0BAAA,SAAmC,IAAA,CAAK,sBAAA;;;AHAzD;;;EGME,SAAA,EAAW,SAAA;EHCG;AAIhB;;;;AAAiF;EGG/E,KAAA;EHIiC;;;;EGEjC,IAAA;EHAY;;;;EGMZ,KAAA;EHNa;;;AAAoB;EGYjC,IAAA;AAAA;;cAIW,qCAAA,EAAuC,gBAAgB,CAAC,0BAAA;AHOM;AAAA,iBGO3D,0BAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,0BAAA;AAAA,cAMT,gCAAA,EAAkC,sBAAsB,CAAC,0BAAA;;;AHLK;AAGpE;;;;AAA6C;;AC7C7C;;;;AAOgB;AAIhB;;;;AAA6F;cE4DhF,4BAAA,SAAqC,gCAAgC;;iBAGlE,oCAAA,CAAA;AAAA,UC5EC,oBAAA;;;AJTjB;;;;EIgBE,MAAA,EAAQ,MAAM;AAAA;;cAIH,+BAAA,EAAiC,gBAAgB,CAAC,oBAAA;AAAA,cAMlD,2BAAA,SAAoC,KAAA;EJfgC;AAOjF;;EIYE,MAAA;IAAU,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;cACrB,KAAA;IAAS,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;AAAA;AAAA,UAM7B,qBAAA;EJjBf;;AAAiC;EIqBjC,WAAA,EAAa,2BAA2B;AAAA;;;AJEiC;iBII3D,oBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,oBAAA;AAAA,cAoCT,0BAAA,EAA4B,sBAAsB,CAAC,oBAAA;;;AJhCW;AAGpE;;;;cIyCa,sBAAA,SAA+B,0BAA0B;AHtFtE;AAAA,iBGyFgB,8BAAA,CAAA"}
@@ -544,9 +544,6 @@ const BlockHandleRootPropsDeclaration = /* @__PURE__ */ defineProps({ editor: {
544
544
  default: null,
545
545
  attribute: false
546
546
  } });
547
- /**
548
- * @public
549
- */
550
547
  var BlockHandleStateChangeEvent = class extends Event {
551
548
  constructor(state) {
552
549
  super("stateChange", { bubbles: true });
@@ -1 +1 @@
1
- {"version":3,"file":"block-handle.js","names":[],"sources":["../src/components/block-handle/context.ts","../src/components/block-handle/block-handle-add.ts","../src/constants.ts","../src/utils/get-client-rect.ts","../src/utils/max-z-index.ts","../src/components/block-handle/set-drag-preview.ts","../src/components/block-handle/block-handle-draggable.ts","../src/components/block-handle/block-handle-popup.ts","../src/components/block-handle/block-handle-positioner.ts","../src/components/block-handle/use-has-text-selection.ts","../src/utils/prefers-reduced-motion.ts","../src/components/block-handle/hover-state.ts","../src/components/block-handle/pointer-move.ts","../src/components/block-handle/use-hover-extension.ts","../src/components/block-handle/block-handle-root.ts"],"sourcesContent":["import { createContext, createSignal, type Context, type Signal } from '@aria-ui/core'\nimport type { OverlayStore } from '@aria-ui/elements/overlay'\n\nimport type { HoverState } from './hover-state.ts'\n\n/**\n * @internal\n */\nexport class BlockHandleStore {\n readonly hoverState: Signal<HoverState | undefined> = createSignal<HoverState | undefined>(undefined)\n readonly dragging: Signal<boolean> = createSignal(false)\n}\n\n/**\n * @internal\n */\nexport const blockHandleStoreContext: Context<BlockHandleStore> = createContext<BlockHandleStore>('prosekit-block-handle-store')\n\n/**\n * @internal\n */\nexport const blockHandleOverlayStoreContext: Context<OverlayStore> = createContext<OverlayStore>('prosekit-block-handle-overlay-store')\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { useEventListener } from '@aria-ui/utils'\nimport { insertDefaultBlock, type Editor } from '@prosekit/core'\n\nimport { blockHandleStoreContext } from './context.ts'\n\nexport interface BlockHandleAddProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const BlockHandleAddPropsDeclaration: PropsDeclaration<BlockHandleAddProps> = /* @__PURE__ */ defineProps<BlockHandleAddProps>({\n editor: { default: null, attribute: false },\n})\n\n/**\n * @internal\n */\nexport function setupBlockHandleAdd(\n host: HostElement,\n props: State<BlockHandleAddProps>,\n): void {\n const getStore = blockHandleStoreContext.consume(host)\n\n useEventListener(host, 'pointerdown', (event) => {\n event.preventDefault()\n\n const store = getStore()\n const editor = props.editor.get()\n const hoverState = store?.hoverState.get()\n if (!editor || !hoverState) {\n return\n }\n\n const { node, pos } = hoverState\n editor.exec(insertDefaultBlock({ pos: pos + node.nodeSize }))\n editor.focus()\n\n // Hide the drag handle\n store?.hoverState.set(undefined)\n })\n}\n\nconst BlockHandleAddElementBase: HostElementConstructor<BlockHandleAddProps> = defineCustomElement(\n setupBlockHandleAdd,\n BlockHandleAddPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-add>` custom element.\n *\n * Properties: {@link BlockHandleAddProps}\n */\nexport class BlockHandleAddElement extends BlockHandleAddElementBase {}\n\n/** @internal */\nexport function registerBlockHandleAddElement(): void {\n registerCustomElement('prosekit-block-handle-add', BlockHandleAddElement)\n}\n","export const DRAGGING_CLASS_NAME = 'prosekit-dragging'\n","interface Rect {\n top: number\n bottom: number\n right: number\n left: number\n}\n\ninterface IncludeExtraOptions {\n top?: boolean\n bottom?: boolean\n right?: boolean\n left?: boolean\n}\n\n/**\n * Similar to `element.getBoundingClientRect`, but handles `display: contents` CSS\n * property and optionally includes margins and outlines.\n */\nexport function getClientRect(element: Element, includeExtra?: IncludeExtraOptions | false): Rect {\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0 && rect.x === 0 && rect.y === 0) {\n // Suspiciously rect, probably an element with `display: contents`, in\n // which case `element.getClientRects()` will return an empty array.\n if (element.getClientRects().length === 0) {\n const children = [...element.children]\n const rects = children.map(child => getClientRect(child, includeExtra))\n if (rects.length === 0) {\n return rect\n }\n if (rects.length === 1) {\n return rects[0]\n }\n let { top, bottom, left, right } = rects[0]\n for (let i = 1; i < rects.length; i++) {\n const r = rects[i]\n if (r.top < top) top = r.top\n if (r.bottom > bottom) bottom = r.bottom\n if (r.left < left) left = r.left\n if (r.right > right) right = r.right\n }\n return { top, bottom, left, right }\n }\n }\n return includeExtra ? addExtra(element, rect, includeExtra) : rect\n}\n\nfunction addExtra(element: Element, rect: Rect, options: IncludeExtraOptions): Rect {\n const view = element.ownerDocument?.defaultView\n if (!view) {\n return rect\n }\n\n const style = view.getComputedStyle(element)\n const marginTop = options.top ? Number.parseFloat(style.marginTop) || 0 : 0\n const marginBottom = options.bottom ? Number.parseFloat(style.marginBottom) || 0 : 0\n const marginRight = options.right ? Number.parseFloat(style.marginRight) || 0 : 0\n const marginLeft = options.left ? Number.parseFloat(style.marginLeft) || 0 : 0\n\n const outlineWidth = Number.parseFloat(style.outlineWidth) || 0\n const outlineOffset = Number.parseFloat(style.outlineOffset) || 0\n const outline = Math.max(outlineWidth + outlineOffset, 0)\n const outlineTop = options.top ? outline : 0\n const outlineBottom = options.bottom ? outline : 0\n const outlineRight = options.right ? outline : 0\n const outlineLeft = options.left ? outline : 0\n\n return {\n top: rect.top - Math.max(marginTop, outlineTop),\n bottom: rect.bottom + Math.max(marginBottom, outlineBottom),\n right: rect.right + Math.max(marginRight, outlineRight),\n left: rect.left - Math.max(marginLeft, outlineLeft),\n }\n}\n","// Maximum possible z-index\n// https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index\nexport const maxZIndex = '2147483647'\n","import { DRAGGING_CLASS_NAME } from '../../constants.ts'\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getClientRect } from '../../utils/get-client-rect.ts'\nimport { maxZIndex } from '../../utils/max-z-index.ts'\n\n/**\n * Sets a drag preview image for the given element and ensures the preview position\n * relative to the pointer is correct.\n *\n * This function does the following:\n *\n * - Creates a temporary container element.\n * - Puts the container at the end of the document body.\n * - Sets event's drag image.\n * - Removes the container from the document body after the next frame.\n */\nexport function setDragPreview(event: DragEvent, element: HTMLElement): void {\n const { top, bottom, left, right } = getClientRect(element, { left: true, right: true, top: true, bottom: true })\n const width = right - left\n const height = bottom - top\n const elementX = left\n const elementY = top\n\n const { clientX, clientY } = event\n\n const document = element.ownerDocument\n\n const container = document.createElement('div')\n\n // Add some class names so that all styles applied to\n // given class names can also be applied to the drag preview.\n container.classList.add('ProseMirror', DRAGGING_CLASS_NAME)\n\n // If outsideX is positive, the point is at the left side of the element.\n const outsideX = Math.round(elementX - clientX)\n // If outsideY is positive, the point is above the element.\n const outsideY = Math.round(elementY - clientY)\n\n const borderX = Math.max(outsideX, 0)\n const borderY = Math.max(outsideY, 0)\n assignStyles(container, {\n // Ensuring we don't cause reflow when adding the element to the page using\n // `position:fixed` rather than `position:absolute` so we are positioned on\n // the current viewport. `position:fixed` also creates a new stacking\n // context, so we don't need to do that here.\n // https://github.com/atlassian/pragmatic-drag-and-drop/blob/56276552/packages/core/src/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.ts#L60\n position: 'fixed',\n\n // The element is positioned off-screen to avoid capturing the content of\n // the page on Safari when the dragging element has a transparent background\n // on Safari. See https://github.com/prosekit/prosekit/issues/1153 for more\n // details.\n top: '-1000vh',\n left: '-1000vw',\n\n // The element should not be interactive.\n pointerEvents: 'none',\n\n zIndex: maxZIndex,\n\n // Only reliable cross browser technique found to push a drag preview away\n // from the cursor is to use transparent borders on the container.\n // https://github.com/atlassian/pragmatic-drag-and-drop/blob/56276552/packages/core/src/public-utils/element/custom-native-drag-preview/pointer-outside-of-preview.ts#L13-L18\n borderLeft: `${borderX}px solid transparent`,\n borderTop: `${borderY}px solid transparent`,\n\n boxSizing: 'border-box',\n width: `${width + borderX}px`,\n height: `${height + borderY}px`,\n })\n\n const clonedElement = element.cloneNode(true) as HTMLElement\n\n // A hardcoded opacity.\n clonedElement.style.setProperty('opacity', '0.8', 'important')\n // Hide the outline of the cloned element.\n clonedElement.style.setProperty('outline-color', 'transparent', 'important')\n\n container.appendChild(clonedElement)\n document.body.appendChild(container)\n\n event.dataTransfer?.setDragImage(container, Math.max(-outsideX, 0), Math.max(-outsideY, 0))\n\n requestAnimationFrame(() => {\n container.remove()\n })\n}\n","import {\n defineCustomElement,\n defineProps,\n onMount,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { useAttribute, useEventListener } from '@aria-ui/utils'\nimport { isHTMLElement } from '@ocavue/utils'\nimport type { Editor } from '@prosekit/core'\nimport type { ViewDragging } from '@prosekit/extensions/drop-indicator'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport { NodeSelection } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { DRAGGING_CLASS_NAME } from '../../constants.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { blockHandleStoreContext } from './context.ts'\nimport type { HoverState } from './hover-state.ts'\nimport { setDragPreview } from './set-drag-preview.ts'\n\nexport interface BlockHandleDraggableProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const BlockHandleDraggablePropsDeclaration: PropsDeclaration<BlockHandleDraggableProps> = /* @__PURE__ */ defineProps<\n BlockHandleDraggableProps\n>({\n editor: { default: null, attribute: false },\n})\n\n/**\n * @internal\n */\nexport function setupBlockHandleDraggable(\n host: HostElement,\n props: State<BlockHandleDraggableProps>,\n): void {\n const getStore = blockHandleStoreContext.consume(host)\n\n onMount(host, () => {\n host.draggable = true\n })\n\n usePointerDownHandler(host, () => getStore()?.hoverState.get() ?? null, props.editor.get)\n\n useEventListener(host, 'dragstart', (event) => {\n const store = getStore()\n store?.dragging.set(true)\n\n const view = getSafeEditorView(props.editor.get())\n const hoverState = store?.hoverState.get()\n\n if (view && hoverState) {\n view.dom.classList.add(DRAGGING_CLASS_NAME)\n createDraggingPreview(view, hoverState, event)\n setViewDragging(view, hoverState)\n }\n })\n\n useEventListener(host, 'dragend', () => {\n const store = getStore()\n store?.dragging.set(false)\n\n const view = getSafeEditorView(props.editor.get())\n if (view) {\n view.dom.classList.remove(DRAGGING_CLASS_NAME)\n }\n })\n\n useAttribute(host, 'data-dragging', () => (getStore()?.dragging.get() ? '' : undefined))\n}\n\nfunction usePointerDownHandler(\n host: HostElement,\n getHoverState: () => HoverState | null,\n getEditor: () => Editor | null,\n) {\n useEventListener(host, 'pointerdown', () => {\n const hoverState = getHoverState()\n const editor = getEditor()\n\n if (hoverState?.pos == null || !editor?.view) {\n return\n }\n\n const { view } = editor\n view.dispatch(\n view.state.tr.setSelection(NodeSelection.create(view.state.doc, hoverState.pos)),\n )\n\n // Clicking the handle will blur the editor, so we need to focus it again.\n // We cannot call `event.preventDefault()` here to prevent the blur\n // because it will prevent the drag event from firing.\n requestAnimationFrame(() => {\n view.focus()\n })\n })\n}\n\nfunction createDraggingPreview(view: EditorView, hoverState: HoverState, event: DragEvent): void {\n if (!event.dataTransfer) {\n return\n }\n\n const { pos } = hoverState\n\n const element = view.nodeDOM(pos)\n if (!element || !isHTMLElement(element)) {\n return\n }\n\n event.dataTransfer.clearData()\n event.dataTransfer.setData('text/html', element.outerHTML)\n event.dataTransfer.effectAllowed = 'copyMove'\n setDragPreview(event, element)\n\n return\n}\n\nfunction setViewDragging(view: EditorView, hoverState: HoverState): void {\n const { node, pos } = hoverState\n\n const dragging: ViewDragging = {\n slice: new Slice(Fragment.from(node), 0, 0),\n move: true,\n node: NodeSelection.create(view.state.doc, pos),\n }\n\n view.dragging = dragging\n}\n\nconst BlockHandleDraggableElementBase: HostElementConstructor<BlockHandleDraggableProps> = defineCustomElement(\n setupBlockHandleDraggable,\n BlockHandleDraggablePropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-draggable>` custom element.\n *\n * Properties: {@link BlockHandleDraggableProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-dragging` | Present when the element is being dragged |\n */\nexport class BlockHandleDraggableElement extends BlockHandleDraggableElementBase {}\n\n/** @internal */\nexport function registerBlockHandleDraggableElement(): void {\n registerCustomElement('prosekit-block-handle-draggable', BlockHandleDraggableElement)\n}\n","import {\n defineCustomElement,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { OverlayPopupPropsDeclaration, setupOverlayPopup, type OverlayPopupProps } from '@aria-ui/elements/overlay'\n\nimport { blockHandleOverlayStoreContext } from './context.ts'\n\n/**\n * @public\n */\nexport interface BlockHandlePopupProps extends OverlayPopupProps {}\n\n/** @internal */\nexport const BlockHandlePopupPropsDeclaration: PropsDeclaration<BlockHandlePopupProps> = OverlayPopupPropsDeclaration\n\n/** @internal */\nexport function setupBlockHandlePopup(\n host: HostElement,\n _props: State<BlockHandlePopupProps>,\n): void {\n const getOverlayStore = blockHandleOverlayStoreContext.consume(host)\n setupOverlayPopup(host, getOverlayStore)\n}\n\nconst BlockHandlePopupElementBase: HostElementConstructor<BlockHandlePopupProps> = defineCustomElement(\n setupBlockHandlePopup,\n BlockHandlePopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-popup>` custom element.\n *\n * Properties: {@link BlockHandlePopupProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the block handle is visible, `\"closed\"` otherwise |\n */\nexport class BlockHandlePopupElement extends BlockHandlePopupElementBase {}\n\n/** @internal */\nexport function registerBlockHandlePopupElement(): void {\n registerCustomElement('prosekit-block-handle-popup', BlockHandlePopupElement)\n}\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { OverlayPositionerPropsDeclaration, setupOverlayPositioner, type OverlayPositionerProps } from '@aria-ui/elements/overlay'\nimport type { Placement } from '@floating-ui/dom'\n\nimport { blockHandleOverlayStoreContext } from './context.ts'\n\n/**\n * @public\n */\nexport interface BlockHandlePositionerProps extends Omit<OverlayPositionerProps, 'placement' | 'hoist' | 'flip' | 'shift' | 'hide'> {\n /**\n * The placement of the popover, relative to the hovered block.\n *\n * @default \"left\"\n */\n placement: Placement\n\n /**\n * Whether to use the browser [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)\n * to place the floating element on top of other page content.\n *\n * @default false\n */\n hoist: boolean\n\n /**\n * @default false\n * @hidden\n */\n flip: boolean\n\n /**\n * @default false\n * @hidden\n */\n shift: boolean\n\n /**\n * @default true\n * @hidden\n */\n hide: boolean\n}\n\n/** @internal */\nexport const BlockHandlePositionerPropsDeclaration: PropsDeclaration<BlockHandlePositionerProps> = /* @__PURE__ */ defineProps<\n BlockHandlePositionerProps\n>({\n ...OverlayPositionerPropsDeclaration,\n placement: { default: 'left', attribute: 'placement', type: 'string' },\n // Enabling `hoist` will cause the popover to have a small delay when\n // scrolling the page.\n hoist: { default: false, attribute: 'hoist', type: 'boolean' },\n flip: { default: false, attribute: false },\n shift: { default: false, attribute: 'shift', type: 'boolean' },\n hide: { default: true, attribute: 'hide', type: 'boolean' },\n})\n\n/** @internal */\nexport function setupBlockHandlePositioner(\n host: HostElement,\n props: State<BlockHandlePositionerProps>,\n): void {\n const getOverlayStore = blockHandleOverlayStoreContext.consume(host)\n setupOverlayPositioner(host, props as unknown as State<OverlayPositionerProps>, getOverlayStore)\n}\n\nconst BlockHandlePositionerElementBase: HostElementConstructor<BlockHandlePositionerProps> = defineCustomElement(\n setupBlockHandlePositioner,\n BlockHandlePositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-positioner>` custom element.\n *\n * Properties: {@link BlockHandlePositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the block handle is visible, `\"closed\"` otherwise |\n * | `data-side` | The side of the anchor element the positioner is on |\n * | `data-align` | The alignment of the positioner relative to the anchor element |\n *\n * CSS variables:\n *\n * | Variable | Description |\n * | --- | --- |\n * | `--transform-origin` | The coordinates that this element is anchored to. Useful for scale animations. |\n */\nexport class BlockHandlePositionerElement extends BlockHandlePositionerElementBase {}\n\n/** @internal */\nexport function registerBlockHandlePositionerElement(): void {\n registerCustomElement('prosekit-block-handle-positioner', BlockHandlePositionerElement)\n}\n","import { createSignal, type HostElement } from '@aria-ui/core'\nimport { isTextSelection, type Editor } from '@prosekit/core'\n\nimport { useEditorUpdateEvent } from '../../hooks/use-editor-update-event.ts'\n\nexport function useHasTextSelection(host: HostElement, getEditor: () => Editor | null): () => boolean {\n const state = createSignal(false)\n useEditorUpdateEvent(host, getEditor, (view) => {\n const { selection } = view.state\n state.set(!selection.empty && isTextSelection(selection))\n })\n return state.get\n}\n","export function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') {\n return false\n }\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n","import type { ProseMirrorNode } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport interface HoverState {\n node: ProseMirrorNode\n pos: number\n}\n\n/**\n * @internal\n */\nexport function isHoverStateEqual(a: HoverState, b: HoverState): boolean {\n return a.pos === b.pos && a.node.eq(b.node)\n}\n","import type { VirtualElement } from '@floating-ui/dom'\nimport { isElement, isHTMLElement, isTextNode, throttle } from '@ocavue/utils'\nimport { defineDOMEventHandler, union, type PlainExtension } from '@prosekit/core'\nimport type { ProseMirrorNode } from '@prosekit/pm/model'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { getClientRect } from '../../utils/get-client-rect.ts'\n\nimport type { HoverState } from './hover-state.ts'\n\nexport type ElementHoverHandler = (\n reference?: VirtualElement,\n hoverState?: HoverState,\n) => void\n\nexport function defineElementHoverHandler(handler: ElementHoverHandler): PlainExtension {\n const handleElement = (\n node: ProseMirrorNode,\n pos: number,\n element: HTMLElement,\n parentElement?: Node | null,\n ) => {\n const reference: VirtualElement = {\n contextElement: element,\n\n getBoundingClientRect: () => {\n const rect = findFirstLineRect(parentElement, element)\n return rect ? fulfillRect(rect) : fallbackRect\n },\n }\n\n handler(reference, { node, pos })\n }\n\n let lastX = -1\n let lastY = -1\n let lastTime = -1\n\n const handlePointerEvent = (view: EditorView, event: PointerEvent) => {\n const { x, y } = event\n\n // Simple performance optimization. If the pointer is not moving, we don't\n // want to recalculate the block handle position within a short period of\n // time window.\n if (lastX === x && lastY === y) {\n const now = Date.now()\n if (now - lastTime < 100) {\n return\n }\n lastTime = now\n }\n lastX = x\n lastY = y\n\n const block = findBlockByCoords(view, x, y)\n if (!block) {\n handler()\n return\n }\n\n const { node, pos } = block\n const element = view.nodeDOM(pos)\n if (!element || !isHTMLElement(element)) {\n handler()\n return\n }\n\n // If `node` is the first child of another non-doc block node, for example a\n // list node or a blockquote node, we want to put the block handle agains\n // the parent node.\n const $pos = view.state.doc.resolve(pos)\n if ($pos.depth > 0 && $pos.index($pos.depth) === 0) {\n const parentPos = $pos.before($pos.depth)\n const parentNode = $pos.parent\n const parentElement = view.nodeDOM(parentPos)\n handleElement(parentNode, parentPos, element, parentElement)\n } else {\n handleElement(node, pos, element)\n }\n }\n\n return union(\n defineDOMEventHandler('pointermove', throttle(handlePointerEvent, 200)),\n defineDOMEventHandler('pointerenter', handlePointerEvent),\n defineDOMEventHandler('pointerout', handlePointerEvent),\n defineDOMEventHandler('keypress', () => handler()),\n )\n}\n\nfunction findBlockByCoords(view: EditorView, x: number, y: number): { node: ProseMirrorNode; pos: number } | undefined {\n const rect = getClientRect(view.dom)\n if (!isWithinRect(rect, x, y)) {\n return\n }\n\n let parent: ProseMirrorNode | undefined = view.state.doc\n let pos = -1\n\n while (parent) {\n if (parent.isBlock && (parent.isTextblock || parent.isAtom || parent.type.spec.isolating)) {\n return { node: parent, pos }\n }\n\n // Collect all children and their positions\n const children: ProseMirrorNode[] = []\n const positions: number[] = []\n parent.forEach((child, offset) => {\n children.push(child)\n positions.push(offset + pos + 1)\n })\n\n let lo = 0\n let hi = children.length - 1\n\n while (lo <= hi) {\n const i = hi - ((hi - lo) >> 1)\n const childDOM = view.nodeDOM(positions[i])\n const childRect = getNodeRect(childDOM)\n if (!childRect) {\n console.warn(`[prosekit] Unable to get rect at position: ${positions[i]}`)\n return\n }\n if (childRect.top > y) {\n hi = i - 1\n } else if (childRect.bottom < y) {\n lo = i + 1\n } else {\n lo = i\n break\n }\n }\n\n if (lo > hi) {\n return\n }\n\n parent = children[lo]\n pos = positions[lo]\n }\n}\n\nfunction getNodeRect(node: Node | null | undefined): Rect | undefined {\n if (node && isElement(node) && node.isConnected) {\n return getClientRect(node)\n }\n}\n\nfunction isWithinRect(rect: Rect, x: number, y: number) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n}\n\ninterface Rect {\n top: number\n right: number\n bottom: number\n left: number\n}\n\nfunction findFirstLineRect(outer?: Node | null, inner?: Node | null): Rect | undefined {\n if (outer && !outer.isConnected) {\n return\n }\n if (inner && !inner.isConnected) {\n return\n }\n\n if (outer && inner) {\n const outerRect = findOuterRect(outer)\n const innerRect = findFirstLineRectInNode(inner)\n if (outerRect && innerRect) {\n const { top, bottom } = innerRect\n const { left, right } = outerRect\n return { top, bottom, left, right }\n } else {\n return outerRect || innerRect\n }\n } else if (outer) {\n return findFirstLineRectInNode(outer)\n } else if (inner) {\n return findFirstLineRectInNode(inner)\n }\n}\n\nfunction findOuterRect(node: Node): Rect | undefined {\n if (!isElement(node)) {\n return\n }\n\n return getClientRect(node, { left: true, right: true })\n}\n\nfunction findFirstLineRectInNode(node: Node): Rect | undefined {\n if (isElement(node)) {\n return findFirstLineRectInElement(node)\n } else if (isTextNode(node)) {\n return findFirstLineRectInTextNode(node)\n }\n}\n\nfunction findFirstLineRectInTextNode(node: Text): Rect | undefined {\n const ownerDocument = node.ownerDocument\n if (!ownerDocument) {\n return\n }\n const range = ownerDocument.createRange()\n range.setStart(node, 0)\n range.setEnd(node, 0)\n const rects = range.getClientRects()\n return rects[0]\n}\n\nfunction findFirstLineRectInElement(element: Element): Rect | undefined {\n if (element.nodeName === 'BR') {\n return element.getBoundingClientRect()\n }\n\n const rect = getClientRect(element)\n const style = element.ownerDocument.defaultView?.getComputedStyle(element)\n const marginLeft = style && Number.parseInt(style.marginLeft, 10) || 0\n const marginRight = style && Number.parseInt(style.marginRight, 10) || 0\n const left = rect.left - marginLeft\n const right = rect.right + marginRight\n\n const lineHeight = style && Number.parseInt(style.lineHeight, 10) || 24\n const paddingTop = style && Number.parseInt(style.paddingTop, 10) || 0\n const borderTop = style && Number.parseInt(style.borderTopWidth, 10) || 0\n const top = rect.top + paddingTop + borderTop\n const bottom = top + lineHeight\n\n return { top, bottom, left, right }\n}\n\nfunction fulfillRect({ top, right, bottom, left }: Rect) {\n return { top, right, bottom, left, width: right - left, height: bottom - top, x: left, y: top }\n}\n\n// A fallback rect that is far away from the screen. It should not be used through.\nconst fallbackRect = Object.freeze({\n top: -9999,\n right: -9999,\n bottom: -9999,\n left: -9999,\n width: 0,\n height: 0,\n x: -9999,\n y: -9999,\n})\n","import type { HostElement } from '@aria-ui/core'\nimport type { Editor } from '@prosekit/core'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { prefersReducedMotion } from '../../utils/prefers-reduced-motion.ts'\n\nimport { isHoverStateEqual, type HoverState } from './hover-state.ts'\nimport { defineElementHoverHandler, type ElementHoverHandler } from './pointer-move.ts'\n\nexport function useHoverExtension(\n host: HostElement,\n getEditor: () => Editor | null,\n handler: ElementHoverHandler,\n): void {\n const invalidTimeoutMs = prefersReducedMotion() ? 0 : 180\n\n let invalidTimeoutId: ReturnType<typeof setTimeout> | undefined\n\n let prevHoverState: HoverState | undefined\n\n const callHandler: ElementHoverHandler = (reference, hoverState) => {\n prevHoverState = hoverState\n handler(reference, hoverState)\n }\n\n const extension = defineElementHoverHandler((reference, hoverState) => {\n if (hoverState && invalidTimeoutId != null) {\n clearTimeout(invalidTimeoutId)\n invalidTimeoutId = undefined\n }\n\n if (prevHoverState && hoverState) {\n if (isHoverStateEqual(prevHoverState, hoverState)) {\n return\n }\n callHandler(reference, hoverState)\n return\n }\n\n if (!prevHoverState && !hoverState) {\n return\n }\n\n if (!prevHoverState && hoverState) {\n callHandler(reference, hoverState)\n return\n }\n\n if (prevHoverState && !hoverState) {\n if (invalidTimeoutId != null) {\n return\n }\n\n // Wait for a short period of time before invalidating the hover state.\n // This ensures smoother animation when the pointer moves between two\n // blocks with a small gap.\n invalidTimeoutId = setTimeout(() => {\n callHandler(reference, undefined)\n invalidTimeoutId = undefined\n }, invalidTimeoutMs)\n }\n })\n\n useEditorExtension(host, getEditor, extension)\n}\n","import {\n computed,\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n useEffect,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { createOverlayStore } from '@aria-ui/elements/overlay'\nimport type { VirtualElement } from '@floating-ui/dom'\nimport type { Editor } from '@prosekit/core'\nimport type { ProseMirrorNode } from '@prosekit/pm/model'\n\nimport { useScrolling } from '../../hooks/use-scrolling.ts'\n\nimport { blockHandleOverlayStoreContext, BlockHandleStore, blockHandleStoreContext } from './context.ts'\nimport { useHasTextSelection } from './use-has-text-selection.ts'\nimport { useHoverExtension } from './use-hover-extension.ts'\n\nexport interface BlockHandleRootProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const BlockHandleRootPropsDeclaration: PropsDeclaration<BlockHandleRootProps> = /* @__PURE__ */ defineProps<\n BlockHandleRootProps\n>({\n editor: { default: null, attribute: false },\n})\n\n/**\n * @public\n */\nexport class BlockHandleStateChangeEvent extends Event {\n /**\n * The currently hovered block's node and position, or `null` if no block is hovered.\n */\n detail: { node: ProseMirrorNode; pos: number } | null\n constructor(state: { node: ProseMirrorNode; pos: number } | null) {\n super('stateChange', { bubbles: true })\n this.detail = state\n }\n}\n\n/**\n * @public\n */\nexport interface BlockHandleRootEvents {\n /**\n * Fired when the hovered block changes.\n */\n stateChange: BlockHandleStateChangeEvent\n}\n\n/**\n * @internal\n */\nexport function setupBlockHandleRoot(\n host: HostElement,\n props: State<BlockHandleRootProps>,\n): void {\n const getEditor = props.editor.get\n\n const store = new BlockHandleStore()\n blockHandleStoreContext.provide(host, store)\n\n const reference = createSignal<VirtualElement | undefined>(undefined)\n const getScrolling = useScrolling(host)\n // Hide the block handle when there is a text selection to avoid the block handle overlapping with inline menu\n const getHasTextSelection = useHasTextSelection(host, getEditor)\n\n const getOpen = computed(() => !!store.hoverState.get() && !getScrolling() && !getHasTextSelection())\n\n const overlayStore = createOverlayStore(\n getOpen,\n () => {},\n () => true,\n () => false,\n (event) => host.dispatchEvent(event),\n )\n\n useHoverExtension(host, getEditor, (ref, hoverState) => {\n reference.set(ref ?? undefined)\n store.hoverState.set(hoverState)\n const state = hoverState ? { node: hoverState.node, pos: hoverState.pos } : null\n host.dispatchEvent(new BlockHandleStateChangeEvent(state))\n })\n\n useEffect(host, () => {\n overlayStore.setAnchorElement(reference.get())\n })\n\n blockHandleOverlayStoreContext.provide(host, overlayStore)\n}\n\nconst BlockHandleRootElementBase: HostElementConstructor<BlockHandleRootProps> = defineCustomElement(\n setupBlockHandleRoot,\n BlockHandleRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-root>` custom element.\n *\n * Properties: {@link BlockHandleRootProps}\n *\n * Events: {@link BlockHandleRootEvents}\n */\nexport class BlockHandleRootElement extends BlockHandleRootElementBase {}\n\n/** @internal */\nexport function registerBlockHandleRootElement(): void {\n registerCustomElement('prosekit-block-handle-root', BlockHandleRootElement)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"block-handle.js","names":[],"sources":["../src/components/block-handle/context.ts","../src/components/block-handle/block-handle-add.ts","../src/constants.ts","../src/utils/get-client-rect.ts","../src/utils/max-z-index.ts","../src/components/block-handle/set-drag-preview.ts","../src/components/block-handle/block-handle-draggable.ts","../src/components/block-handle/block-handle-popup.ts","../src/components/block-handle/block-handle-positioner.ts","../src/components/block-handle/use-has-text-selection.ts","../src/utils/prefers-reduced-motion.ts","../src/components/block-handle/hover-state.ts","../src/components/block-handle/pointer-move.ts","../src/components/block-handle/use-hover-extension.ts","../src/components/block-handle/block-handle-root.ts"],"sourcesContent":["import { createContext, createSignal, type Context, type Signal } from '@aria-ui/core'\nimport type { OverlayStore } from '@aria-ui/elements/overlay'\n\nimport type { HoverState } from './hover-state.ts'\n\n/**\n * @internal\n */\nexport class BlockHandleStore {\n readonly hoverState: Signal<HoverState | undefined> = createSignal<HoverState | undefined>(undefined)\n readonly dragging: Signal<boolean> = createSignal(false)\n}\n\n/**\n * @internal\n */\nexport const blockHandleStoreContext: Context<BlockHandleStore> = createContext<BlockHandleStore>('prosekit-block-handle-store')\n\n/**\n * @internal\n */\nexport const blockHandleOverlayStoreContext: Context<OverlayStore> = createContext<OverlayStore>('prosekit-block-handle-overlay-store')\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { useEventListener } from '@aria-ui/utils'\nimport { insertDefaultBlock, type Editor } from '@prosekit/core'\n\nimport { blockHandleStoreContext } from './context.ts'\n\nexport interface BlockHandleAddProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const BlockHandleAddPropsDeclaration: PropsDeclaration<BlockHandleAddProps> = /* @__PURE__ */ defineProps<BlockHandleAddProps>({\n editor: { default: null, attribute: false },\n})\n\n/**\n * @internal\n */\nexport function setupBlockHandleAdd(\n host: HostElement,\n props: State<BlockHandleAddProps>,\n): void {\n const getStore = blockHandleStoreContext.consume(host)\n\n useEventListener(host, 'pointerdown', (event) => {\n event.preventDefault()\n\n const store = getStore()\n const editor = props.editor.get()\n const hoverState = store?.hoverState.get()\n if (!editor || !hoverState) {\n return\n }\n\n const { node, pos } = hoverState\n editor.exec(insertDefaultBlock({ pos: pos + node.nodeSize }))\n editor.focus()\n\n // Hide the drag handle\n store?.hoverState.set(undefined)\n })\n}\n\nconst BlockHandleAddElementBase: HostElementConstructor<BlockHandleAddProps> = defineCustomElement(\n setupBlockHandleAdd,\n BlockHandleAddPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-add>` custom element.\n *\n * Properties: {@link BlockHandleAddProps}\n */\nexport class BlockHandleAddElement extends BlockHandleAddElementBase {}\n\n/** @internal */\nexport function registerBlockHandleAddElement(): void {\n registerCustomElement('prosekit-block-handle-add', BlockHandleAddElement)\n}\n","export const DRAGGING_CLASS_NAME = 'prosekit-dragging'\n","interface Rect {\n top: number\n bottom: number\n right: number\n left: number\n}\n\ninterface IncludeExtraOptions {\n top?: boolean\n bottom?: boolean\n right?: boolean\n left?: boolean\n}\n\n/**\n * Similar to `element.getBoundingClientRect`, but handles `display: contents` CSS\n * property and optionally includes margins and outlines.\n */\nexport function getClientRect(element: Element, includeExtra?: IncludeExtraOptions | false): Rect {\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0 && rect.x === 0 && rect.y === 0) {\n // Suspiciously rect, probably an element with `display: contents`, in\n // which case `element.getClientRects()` will return an empty array.\n if (element.getClientRects().length === 0) {\n const children = [...element.children]\n const rects = children.map(child => getClientRect(child, includeExtra))\n if (rects.length === 0) {\n return rect\n }\n if (rects.length === 1) {\n return rects[0]\n }\n let { top, bottom, left, right } = rects[0]\n for (let i = 1; i < rects.length; i++) {\n const r = rects[i]\n if (r.top < top) top = r.top\n if (r.bottom > bottom) bottom = r.bottom\n if (r.left < left) left = r.left\n if (r.right > right) right = r.right\n }\n return { top, bottom, left, right }\n }\n }\n return includeExtra ? addExtra(element, rect, includeExtra) : rect\n}\n\nfunction addExtra(element: Element, rect: Rect, options: IncludeExtraOptions): Rect {\n const view = element.ownerDocument?.defaultView\n if (!view) {\n return rect\n }\n\n const style = view.getComputedStyle(element)\n const marginTop = options.top ? Number.parseFloat(style.marginTop) || 0 : 0\n const marginBottom = options.bottom ? Number.parseFloat(style.marginBottom) || 0 : 0\n const marginRight = options.right ? Number.parseFloat(style.marginRight) || 0 : 0\n const marginLeft = options.left ? Number.parseFloat(style.marginLeft) || 0 : 0\n\n const outlineWidth = Number.parseFloat(style.outlineWidth) || 0\n const outlineOffset = Number.parseFloat(style.outlineOffset) || 0\n const outline = Math.max(outlineWidth + outlineOffset, 0)\n const outlineTop = options.top ? outline : 0\n const outlineBottom = options.bottom ? outline : 0\n const outlineRight = options.right ? outline : 0\n const outlineLeft = options.left ? outline : 0\n\n return {\n top: rect.top - Math.max(marginTop, outlineTop),\n bottom: rect.bottom + Math.max(marginBottom, outlineBottom),\n right: rect.right + Math.max(marginRight, outlineRight),\n left: rect.left - Math.max(marginLeft, outlineLeft),\n }\n}\n","// Maximum possible z-index\n// https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index\nexport const maxZIndex = '2147483647'\n","import { DRAGGING_CLASS_NAME } from '../../constants.ts'\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getClientRect } from '../../utils/get-client-rect.ts'\nimport { maxZIndex } from '../../utils/max-z-index.ts'\n\n/**\n * Sets a drag preview image for the given element and ensures the preview position\n * relative to the pointer is correct.\n *\n * This function does the following:\n *\n * - Creates a temporary container element.\n * - Puts the container at the end of the document body.\n * - Sets event's drag image.\n * - Removes the container from the document body after the next frame.\n */\nexport function setDragPreview(event: DragEvent, element: HTMLElement): void {\n const { top, bottom, left, right } = getClientRect(element, { left: true, right: true, top: true, bottom: true })\n const width = right - left\n const height = bottom - top\n const elementX = left\n const elementY = top\n\n const { clientX, clientY } = event\n\n const document = element.ownerDocument\n\n const container = document.createElement('div')\n\n // Add some class names so that all styles applied to\n // given class names can also be applied to the drag preview.\n container.classList.add('ProseMirror', DRAGGING_CLASS_NAME)\n\n // If outsideX is positive, the point is at the left side of the element.\n const outsideX = Math.round(elementX - clientX)\n // If outsideY is positive, the point is above the element.\n const outsideY = Math.round(elementY - clientY)\n\n const borderX = Math.max(outsideX, 0)\n const borderY = Math.max(outsideY, 0)\n assignStyles(container, {\n // Ensuring we don't cause reflow when adding the element to the page using\n // `position:fixed` rather than `position:absolute` so we are positioned on\n // the current viewport. `position:fixed` also creates a new stacking\n // context, so we don't need to do that here.\n // https://github.com/atlassian/pragmatic-drag-and-drop/blob/56276552/packages/core/src/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.ts#L60\n position: 'fixed',\n\n // The element is positioned off-screen to avoid capturing the content of\n // the page on Safari when the dragging element has a transparent background\n // on Safari. See https://github.com/prosekit/prosekit/issues/1153 for more\n // details.\n top: '-1000vh',\n left: '-1000vw',\n\n // The element should not be interactive.\n pointerEvents: 'none',\n\n zIndex: maxZIndex,\n\n // Only reliable cross browser technique found to push a drag preview away\n // from the cursor is to use transparent borders on the container.\n // https://github.com/atlassian/pragmatic-drag-and-drop/blob/56276552/packages/core/src/public-utils/element/custom-native-drag-preview/pointer-outside-of-preview.ts#L13-L18\n borderLeft: `${borderX}px solid transparent`,\n borderTop: `${borderY}px solid transparent`,\n\n boxSizing: 'border-box',\n width: `${width + borderX}px`,\n height: `${height + borderY}px`,\n })\n\n const clonedElement = element.cloneNode(true) as HTMLElement\n\n // A hardcoded opacity.\n clonedElement.style.setProperty('opacity', '0.8', 'important')\n // Hide the outline of the cloned element.\n clonedElement.style.setProperty('outline-color', 'transparent', 'important')\n\n container.appendChild(clonedElement)\n document.body.appendChild(container)\n\n event.dataTransfer?.setDragImage(container, Math.max(-outsideX, 0), Math.max(-outsideY, 0))\n\n requestAnimationFrame(() => {\n container.remove()\n })\n}\n","import {\n defineCustomElement,\n defineProps,\n onMount,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { useAttribute, useEventListener } from '@aria-ui/utils'\nimport { isHTMLElement } from '@ocavue/utils'\nimport type { Editor } from '@prosekit/core'\nimport type { ViewDragging } from '@prosekit/extensions/drop-indicator'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport { NodeSelection } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { DRAGGING_CLASS_NAME } from '../../constants.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { blockHandleStoreContext } from './context.ts'\nimport type { HoverState } from './hover-state.ts'\nimport { setDragPreview } from './set-drag-preview.ts'\n\nexport interface BlockHandleDraggableProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const BlockHandleDraggablePropsDeclaration: PropsDeclaration<BlockHandleDraggableProps> = /* @__PURE__ */ defineProps<\n BlockHandleDraggableProps\n>({\n editor: { default: null, attribute: false },\n})\n\n/**\n * @internal\n */\nexport function setupBlockHandleDraggable(\n host: HostElement,\n props: State<BlockHandleDraggableProps>,\n): void {\n const getStore = blockHandleStoreContext.consume(host)\n\n onMount(host, () => {\n host.draggable = true\n })\n\n usePointerDownHandler(host, () => getStore()?.hoverState.get() ?? null, props.editor.get)\n\n useEventListener(host, 'dragstart', (event) => {\n const store = getStore()\n store?.dragging.set(true)\n\n const view = getSafeEditorView(props.editor.get())\n const hoverState = store?.hoverState.get()\n\n if (view && hoverState) {\n view.dom.classList.add(DRAGGING_CLASS_NAME)\n createDraggingPreview(view, hoverState, event)\n setViewDragging(view, hoverState)\n }\n })\n\n useEventListener(host, 'dragend', () => {\n const store = getStore()\n store?.dragging.set(false)\n\n const view = getSafeEditorView(props.editor.get())\n if (view) {\n view.dom.classList.remove(DRAGGING_CLASS_NAME)\n }\n })\n\n useAttribute(host, 'data-dragging', () => (getStore()?.dragging.get() ? '' : undefined))\n}\n\nfunction usePointerDownHandler(\n host: HostElement,\n getHoverState: () => HoverState | null,\n getEditor: () => Editor | null,\n) {\n useEventListener(host, 'pointerdown', () => {\n const hoverState = getHoverState()\n const editor = getEditor()\n\n if (hoverState?.pos == null || !editor?.view) {\n return\n }\n\n const { view } = editor\n view.dispatch(\n view.state.tr.setSelection(NodeSelection.create(view.state.doc, hoverState.pos)),\n )\n\n // Clicking the handle will blur the editor, so we need to focus it again.\n // We cannot call `event.preventDefault()` here to prevent the blur\n // because it will prevent the drag event from firing.\n requestAnimationFrame(() => {\n view.focus()\n })\n })\n}\n\nfunction createDraggingPreview(view: EditorView, hoverState: HoverState, event: DragEvent): void {\n if (!event.dataTransfer) {\n return\n }\n\n const { pos } = hoverState\n\n const element = view.nodeDOM(pos)\n if (!element || !isHTMLElement(element)) {\n return\n }\n\n event.dataTransfer.clearData()\n event.dataTransfer.setData('text/html', element.outerHTML)\n event.dataTransfer.effectAllowed = 'copyMove'\n setDragPreview(event, element)\n\n return\n}\n\nfunction setViewDragging(view: EditorView, hoverState: HoverState): void {\n const { node, pos } = hoverState\n\n const dragging: ViewDragging = {\n slice: new Slice(Fragment.from(node), 0, 0),\n move: true,\n node: NodeSelection.create(view.state.doc, pos),\n }\n\n view.dragging = dragging\n}\n\nconst BlockHandleDraggableElementBase: HostElementConstructor<BlockHandleDraggableProps> = defineCustomElement(\n setupBlockHandleDraggable,\n BlockHandleDraggablePropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-draggable>` custom element.\n *\n * Properties: {@link BlockHandleDraggableProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-dragging` | Present when the element is being dragged |\n */\nexport class BlockHandleDraggableElement extends BlockHandleDraggableElementBase {}\n\n/** @internal */\nexport function registerBlockHandleDraggableElement(): void {\n registerCustomElement('prosekit-block-handle-draggable', BlockHandleDraggableElement)\n}\n","import {\n defineCustomElement,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { OverlayPopupPropsDeclaration, setupOverlayPopup, type OverlayPopupProps } from '@aria-ui/elements/overlay'\n\nimport { blockHandleOverlayStoreContext } from './context.ts'\n\nexport interface BlockHandlePopupProps extends OverlayPopupProps {}\n\n/** @internal */\nexport const BlockHandlePopupPropsDeclaration: PropsDeclaration<BlockHandlePopupProps> = OverlayPopupPropsDeclaration\n\n/** @internal */\nexport function setupBlockHandlePopup(\n host: HostElement,\n _props: State<BlockHandlePopupProps>,\n): void {\n const getOverlayStore = blockHandleOverlayStoreContext.consume(host)\n setupOverlayPopup(host, getOverlayStore)\n}\n\nconst BlockHandlePopupElementBase: HostElementConstructor<BlockHandlePopupProps> = defineCustomElement(\n setupBlockHandlePopup,\n BlockHandlePopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-popup>` custom element.\n *\n * Properties: {@link BlockHandlePopupProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the block handle is visible, `\"closed\"` otherwise |\n */\nexport class BlockHandlePopupElement extends BlockHandlePopupElementBase {}\n\n/** @internal */\nexport function registerBlockHandlePopupElement(): void {\n registerCustomElement('prosekit-block-handle-popup', BlockHandlePopupElement)\n}\n","import {\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { OverlayPositionerPropsDeclaration, setupOverlayPositioner, type OverlayPositionerProps } from '@aria-ui/elements/overlay'\nimport type { Placement } from '@floating-ui/dom'\n\nimport { blockHandleOverlayStoreContext } from './context.ts'\n\nexport interface BlockHandlePositionerProps extends Omit<OverlayPositionerProps, 'placement' | 'hoist' | 'flip' | 'shift' | 'hide'> {\n /**\n * The placement of the popover, relative to the hovered block.\n *\n * @default \"left\"\n */\n placement: Placement\n\n /**\n * Whether to use the browser [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)\n * to place the floating element on top of other page content.\n *\n * @default false\n */\n hoist: boolean\n\n /**\n * @default false\n * @hidden\n */\n flip: boolean\n\n /**\n * @default false\n * @hidden\n */\n shift: boolean\n\n /**\n * @default true\n * @hidden\n */\n hide: boolean\n}\n\n/** @internal */\nexport const BlockHandlePositionerPropsDeclaration: PropsDeclaration<BlockHandlePositionerProps> = /* @__PURE__ */ defineProps<\n BlockHandlePositionerProps\n>({\n ...OverlayPositionerPropsDeclaration,\n placement: { default: 'left', attribute: 'placement', type: 'string' },\n // Enabling `hoist` will cause the popover to have a small delay when\n // scrolling the page.\n hoist: { default: false, attribute: 'hoist', type: 'boolean' },\n flip: { default: false, attribute: false },\n shift: { default: false, attribute: 'shift', type: 'boolean' },\n hide: { default: true, attribute: 'hide', type: 'boolean' },\n})\n\n/** @internal */\nexport function setupBlockHandlePositioner(\n host: HostElement,\n props: State<BlockHandlePositionerProps>,\n): void {\n const getOverlayStore = blockHandleOverlayStoreContext.consume(host)\n setupOverlayPositioner(host, props as unknown as State<OverlayPositionerProps>, getOverlayStore)\n}\n\nconst BlockHandlePositionerElementBase: HostElementConstructor<BlockHandlePositionerProps> = defineCustomElement(\n setupBlockHandlePositioner,\n BlockHandlePositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-positioner>` custom element.\n *\n * Properties: {@link BlockHandlePositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when the block handle is visible, `\"closed\"` otherwise |\n * | `data-side` | The side of the anchor element the positioner is on |\n * | `data-align` | The alignment of the positioner relative to the anchor element |\n *\n * CSS variables:\n *\n * | Variable | Description |\n * | --- | --- |\n * | `--transform-origin` | The coordinates that this element is anchored to. Useful for scale animations. |\n */\nexport class BlockHandlePositionerElement extends BlockHandlePositionerElementBase {}\n\n/** @internal */\nexport function registerBlockHandlePositionerElement(): void {\n registerCustomElement('prosekit-block-handle-positioner', BlockHandlePositionerElement)\n}\n","import { createSignal, type HostElement } from '@aria-ui/core'\nimport { isTextSelection, type Editor } from '@prosekit/core'\n\nimport { useEditorUpdateEvent } from '../../hooks/use-editor-update-event.ts'\n\nexport function useHasTextSelection(host: HostElement, getEditor: () => Editor | null): () => boolean {\n const state = createSignal(false)\n useEditorUpdateEvent(host, getEditor, (view) => {\n const { selection } = view.state\n state.set(!selection.empty && isTextSelection(selection))\n })\n return state.get\n}\n","export function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') {\n return false\n }\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n","import type { ProseMirrorNode } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport interface HoverState {\n node: ProseMirrorNode\n pos: number\n}\n\n/**\n * @internal\n */\nexport function isHoverStateEqual(a: HoverState, b: HoverState): boolean {\n return a.pos === b.pos && a.node.eq(b.node)\n}\n","import type { VirtualElement } from '@floating-ui/dom'\nimport { isElement, isHTMLElement, isTextNode, throttle } from '@ocavue/utils'\nimport { defineDOMEventHandler, union, type PlainExtension } from '@prosekit/core'\nimport type { ProseMirrorNode } from '@prosekit/pm/model'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { getClientRect } from '../../utils/get-client-rect.ts'\n\nimport type { HoverState } from './hover-state.ts'\n\nexport type ElementHoverHandler = (\n reference?: VirtualElement,\n hoverState?: HoverState,\n) => void\n\nexport function defineElementHoverHandler(handler: ElementHoverHandler): PlainExtension {\n const handleElement = (\n node: ProseMirrorNode,\n pos: number,\n element: HTMLElement,\n parentElement?: Node | null,\n ) => {\n const reference: VirtualElement = {\n contextElement: element,\n\n getBoundingClientRect: () => {\n const rect = findFirstLineRect(parentElement, element)\n return rect ? fulfillRect(rect) : fallbackRect\n },\n }\n\n handler(reference, { node, pos })\n }\n\n let lastX = -1\n let lastY = -1\n let lastTime = -1\n\n const handlePointerEvent = (view: EditorView, event: PointerEvent) => {\n const { x, y } = event\n\n // Simple performance optimization. If the pointer is not moving, we don't\n // want to recalculate the block handle position within a short period of\n // time window.\n if (lastX === x && lastY === y) {\n const now = Date.now()\n if (now - lastTime < 100) {\n return\n }\n lastTime = now\n }\n lastX = x\n lastY = y\n\n const block = findBlockByCoords(view, x, y)\n if (!block) {\n handler()\n return\n }\n\n const { node, pos } = block\n const element = view.nodeDOM(pos)\n if (!element || !isHTMLElement(element)) {\n handler()\n return\n }\n\n // If `node` is the first child of another non-doc block node, for example a\n // list node or a blockquote node, we want to put the block handle agains\n // the parent node.\n const $pos = view.state.doc.resolve(pos)\n if ($pos.depth > 0 && $pos.index($pos.depth) === 0) {\n const parentPos = $pos.before($pos.depth)\n const parentNode = $pos.parent\n const parentElement = view.nodeDOM(parentPos)\n handleElement(parentNode, parentPos, element, parentElement)\n } else {\n handleElement(node, pos, element)\n }\n }\n\n return union(\n defineDOMEventHandler('pointermove', throttle(handlePointerEvent, 200)),\n defineDOMEventHandler('pointerenter', handlePointerEvent),\n defineDOMEventHandler('pointerout', handlePointerEvent),\n defineDOMEventHandler('keypress', () => handler()),\n )\n}\n\nfunction findBlockByCoords(view: EditorView, x: number, y: number): { node: ProseMirrorNode; pos: number } | undefined {\n const rect = getClientRect(view.dom)\n if (!isWithinRect(rect, x, y)) {\n return\n }\n\n let parent: ProseMirrorNode | undefined = view.state.doc\n let pos = -1\n\n while (parent) {\n if (parent.isBlock && (parent.isTextblock || parent.isAtom || parent.type.spec.isolating)) {\n return { node: parent, pos }\n }\n\n // Collect all children and their positions\n const children: ProseMirrorNode[] = []\n const positions: number[] = []\n parent.forEach((child, offset) => {\n children.push(child)\n positions.push(offset + pos + 1)\n })\n\n let lo = 0\n let hi = children.length - 1\n\n while (lo <= hi) {\n const i = hi - ((hi - lo) >> 1)\n const childDOM = view.nodeDOM(positions[i])\n const childRect = getNodeRect(childDOM)\n if (!childRect) {\n console.warn(`[prosekit] Unable to get rect at position: ${positions[i]}`)\n return\n }\n if (childRect.top > y) {\n hi = i - 1\n } else if (childRect.bottom < y) {\n lo = i + 1\n } else {\n lo = i\n break\n }\n }\n\n if (lo > hi) {\n return\n }\n\n parent = children[lo]\n pos = positions[lo]\n }\n}\n\nfunction getNodeRect(node: Node | null | undefined): Rect | undefined {\n if (node && isElement(node) && node.isConnected) {\n return getClientRect(node)\n }\n}\n\nfunction isWithinRect(rect: Rect, x: number, y: number) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n}\n\ninterface Rect {\n top: number\n right: number\n bottom: number\n left: number\n}\n\nfunction findFirstLineRect(outer?: Node | null, inner?: Node | null): Rect | undefined {\n if (outer && !outer.isConnected) {\n return\n }\n if (inner && !inner.isConnected) {\n return\n }\n\n if (outer && inner) {\n const outerRect = findOuterRect(outer)\n const innerRect = findFirstLineRectInNode(inner)\n if (outerRect && innerRect) {\n const { top, bottom } = innerRect\n const { left, right } = outerRect\n return { top, bottom, left, right }\n } else {\n return outerRect || innerRect\n }\n } else if (outer) {\n return findFirstLineRectInNode(outer)\n } else if (inner) {\n return findFirstLineRectInNode(inner)\n }\n}\n\nfunction findOuterRect(node: Node): Rect | undefined {\n if (!isElement(node)) {\n return\n }\n\n return getClientRect(node, { left: true, right: true })\n}\n\nfunction findFirstLineRectInNode(node: Node): Rect | undefined {\n if (isElement(node)) {\n return findFirstLineRectInElement(node)\n } else if (isTextNode(node)) {\n return findFirstLineRectInTextNode(node)\n }\n}\n\nfunction findFirstLineRectInTextNode(node: Text): Rect | undefined {\n const ownerDocument = node.ownerDocument\n if (!ownerDocument) {\n return\n }\n const range = ownerDocument.createRange()\n range.setStart(node, 0)\n range.setEnd(node, 0)\n const rects = range.getClientRects()\n return rects[0]\n}\n\nfunction findFirstLineRectInElement(element: Element): Rect | undefined {\n if (element.nodeName === 'BR') {\n return element.getBoundingClientRect()\n }\n\n const rect = getClientRect(element)\n const style = element.ownerDocument.defaultView?.getComputedStyle(element)\n const marginLeft = style && Number.parseInt(style.marginLeft, 10) || 0\n const marginRight = style && Number.parseInt(style.marginRight, 10) || 0\n const left = rect.left - marginLeft\n const right = rect.right + marginRight\n\n const lineHeight = style && Number.parseInt(style.lineHeight, 10) || 24\n const paddingTop = style && Number.parseInt(style.paddingTop, 10) || 0\n const borderTop = style && Number.parseInt(style.borderTopWidth, 10) || 0\n const top = rect.top + paddingTop + borderTop\n const bottom = top + lineHeight\n\n return { top, bottom, left, right }\n}\n\nfunction fulfillRect({ top, right, bottom, left }: Rect) {\n return { top, right, bottom, left, width: right - left, height: bottom - top, x: left, y: top }\n}\n\n// A fallback rect that is far away from the screen. It should not be used through.\nconst fallbackRect = Object.freeze({\n top: -9999,\n right: -9999,\n bottom: -9999,\n left: -9999,\n width: 0,\n height: 0,\n x: -9999,\n y: -9999,\n})\n","import type { HostElement } from '@aria-ui/core'\nimport type { Editor } from '@prosekit/core'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { prefersReducedMotion } from '../../utils/prefers-reduced-motion.ts'\n\nimport { isHoverStateEqual, type HoverState } from './hover-state.ts'\nimport { defineElementHoverHandler, type ElementHoverHandler } from './pointer-move.ts'\n\nexport function useHoverExtension(\n host: HostElement,\n getEditor: () => Editor | null,\n handler: ElementHoverHandler,\n): void {\n const invalidTimeoutMs = prefersReducedMotion() ? 0 : 180\n\n let invalidTimeoutId: ReturnType<typeof setTimeout> | undefined\n\n let prevHoverState: HoverState | undefined\n\n const callHandler: ElementHoverHandler = (reference, hoverState) => {\n prevHoverState = hoverState\n handler(reference, hoverState)\n }\n\n const extension = defineElementHoverHandler((reference, hoverState) => {\n if (hoverState && invalidTimeoutId != null) {\n clearTimeout(invalidTimeoutId)\n invalidTimeoutId = undefined\n }\n\n if (prevHoverState && hoverState) {\n if (isHoverStateEqual(prevHoverState, hoverState)) {\n return\n }\n callHandler(reference, hoverState)\n return\n }\n\n if (!prevHoverState && !hoverState) {\n return\n }\n\n if (!prevHoverState && hoverState) {\n callHandler(reference, hoverState)\n return\n }\n\n if (prevHoverState && !hoverState) {\n if (invalidTimeoutId != null) {\n return\n }\n\n // Wait for a short period of time before invalidating the hover state.\n // This ensures smoother animation when the pointer moves between two\n // blocks with a small gap.\n invalidTimeoutId = setTimeout(() => {\n callHandler(reference, undefined)\n invalidTimeoutId = undefined\n }, invalidTimeoutMs)\n }\n })\n\n useEditorExtension(host, getEditor, extension)\n}\n","import {\n computed,\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n useEffect,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { createOverlayStore } from '@aria-ui/elements/overlay'\nimport type { VirtualElement } from '@floating-ui/dom'\nimport type { Editor } from '@prosekit/core'\nimport type { ProseMirrorNode } from '@prosekit/pm/model'\n\nimport { useScrolling } from '../../hooks/use-scrolling.ts'\n\nimport { blockHandleOverlayStoreContext, BlockHandleStore, blockHandleStoreContext } from './context.ts'\nimport { useHasTextSelection } from './use-has-text-selection.ts'\nimport { useHoverExtension } from './use-hover-extension.ts'\n\nexport interface BlockHandleRootProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const BlockHandleRootPropsDeclaration: PropsDeclaration<BlockHandleRootProps> = /* @__PURE__ */ defineProps<\n BlockHandleRootProps\n>({\n editor: { default: null, attribute: false },\n})\n\nexport class BlockHandleStateChangeEvent extends Event {\n /**\n * The currently hovered block's node and position, or `null` if no block is hovered.\n */\n detail: { node: ProseMirrorNode; pos: number } | null\n constructor(state: { node: ProseMirrorNode; pos: number } | null) {\n super('stateChange', { bubbles: true })\n this.detail = state\n }\n}\n\nexport interface BlockHandleRootEvents {\n /**\n * Fired when the hovered block changes.\n */\n stateChange: BlockHandleStateChangeEvent\n}\n\n/**\n * @internal\n */\nexport function setupBlockHandleRoot(\n host: HostElement,\n props: State<BlockHandleRootProps>,\n): void {\n const getEditor = props.editor.get\n\n const store = new BlockHandleStore()\n blockHandleStoreContext.provide(host, store)\n\n const reference = createSignal<VirtualElement | undefined>(undefined)\n const getScrolling = useScrolling(host)\n // Hide the block handle when there is a text selection to avoid the block handle overlapping with inline menu\n const getHasTextSelection = useHasTextSelection(host, getEditor)\n\n const getOpen = computed(() => !!store.hoverState.get() && !getScrolling() && !getHasTextSelection())\n\n const overlayStore = createOverlayStore(\n getOpen,\n () => {},\n () => true,\n () => false,\n (event) => host.dispatchEvent(event),\n )\n\n useHoverExtension(host, getEditor, (ref, hoverState) => {\n reference.set(ref ?? undefined)\n store.hoverState.set(hoverState)\n const state = hoverState ? { node: hoverState.node, pos: hoverState.pos } : null\n host.dispatchEvent(new BlockHandleStateChangeEvent(state))\n })\n\n useEffect(host, () => {\n overlayStore.setAnchorElement(reference.get())\n })\n\n blockHandleOverlayStoreContext.provide(host, overlayStore)\n}\n\nconst BlockHandleRootElementBase: HostElementConstructor<BlockHandleRootProps> = defineCustomElement(\n setupBlockHandleRoot,\n BlockHandleRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-block-handle-root>` custom element.\n *\n * Properties: {@link BlockHandleRootProps}\n *\n * Events: {@link BlockHandleRootEvents}\n */\nexport class BlockHandleRootElement extends BlockHandleRootElementBase {}\n\n/** @internal */\nexport function registerBlockHandleRootElement(): void {\n registerCustomElement('prosekit-block-handle-root', BlockHandleRootElement)\n}\n"],"mappings":";;;;;;;;;;;;;;AAQA,IAAa,mBAAb,MAA8B;;oBAC0B,aAAqC,KAAA,CAAS;kBAC/D,aAAa,KAAK;;AACzD;;;;AAKA,MAAa,0BAAqD,cAAgC,6BAA6B;;;;AAK/H,MAAa,iCAAwD,cAA4B,qCAAqC;;ACItI,MAAa,iCAAwF,4BAAiC,EACpI,QAAQ;CAAE,SAAS;CAAM,WAAW;AAAM,EAC5C,CAAC;;;;AAKD,SAAgB,oBACd,MACA,OACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,IAAI;CAErD,iBAAiB,MAAM,gBAAgB,UAAU;EAC/C,MAAM,eAAe;EAErB,MAAM,QAAQ,SAAS;EACvB,MAAM,SAAS,MAAM,OAAO,IAAI;EAChC,MAAM,aAAa,OAAO,WAAW,IAAI;EACzC,IAAI,CAAC,UAAU,CAAC,YACd;EAGF,MAAM,EAAE,MAAM,QAAQ;EACtB,OAAO,KAAK,mBAAmB,EAAE,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;EAC5D,OAAO,MAAM;EAGb,OAAO,WAAW,IAAI,KAAA,CAAS;CACjC,CAAC;AACH;AAEA,MAAM,4BAAyE,oBAC7E,qBACA,8BACF;;;;;;AAOA,IAAa,wBAAb,cAA2C,0BAA0B,CAAC;;AAGtE,SAAgB,gCAAsC;CACpD,sBAAsB,6BAA6B,qBAAqB;AAC1E;ACxEA,MAAa,sBAAsB;;;;;ACkBnC,SAAgB,cAAc,SAAkB,cAAkD;CAChG,MAAM,OAAO,QAAQ,sBAAsB;CAC3C,IAAI,KAAK,UAAU,KAAK,KAAK,WAAW,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM;MAGlE,QAAQ,eAAe,EAAE,WAAW,GAAG;GAEzC,MAAM,QAAQ,CADI,GAAG,QAAQ,QACR,EAAE,KAAI,UAAS,cAAc,OAAO,YAAY,CAAC;GACtE,IAAI,MAAM,WAAW,GACnB,OAAO;GAET,IAAI,MAAM,WAAW,GACnB,OAAO,MAAM;GAEf,IAAI,EAAE,KAAK,QAAQ,MAAM,UAAU,MAAM;GACzC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,MAAM;IAChB,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE;IACzB,IAAI,EAAE,SAAS,QAAQ,SAAS,EAAE;IAClC,IAAI,EAAE,OAAO,MAAM,OAAO,EAAE;IAC5B,IAAI,EAAE,QAAQ,OAAO,QAAQ,EAAE;GACjC;GACA,OAAO;IAAE;IAAK;IAAQ;IAAM;GAAM;EACpC;;CAEF,OAAO,eAAe,SAAS,SAAS,MAAM,YAAY,IAAI;AAChE;AAEA,SAAS,SAAS,SAAkB,MAAY,SAAoC;CAClF,MAAM,OAAO,QAAQ,eAAe;CACpC,IAAI,CAAC,MACH,OAAO;CAGT,MAAM,QAAQ,KAAK,iBAAiB,OAAO;CAC3C,MAAM,YAAY,QAAQ,MAAM,OAAO,WAAW,MAAM,SAAS,KAAK,IAAI;CAC1E,MAAM,eAAe,QAAQ,SAAS,OAAO,WAAW,MAAM,YAAY,KAAK,IAAI;CACnF,MAAM,cAAc,QAAQ,QAAQ,OAAO,WAAW,MAAM,WAAW,KAAK,IAAI;CAChF,MAAM,aAAa,QAAQ,OAAO,OAAO,WAAW,MAAM,UAAU,KAAK,IAAI;CAE7E,MAAM,eAAe,OAAO,WAAW,MAAM,YAAY,KAAK;CAC9D,MAAM,gBAAgB,OAAO,WAAW,MAAM,aAAa,KAAK;CAChE,MAAM,UAAU,KAAK,IAAI,eAAe,eAAe,CAAC;CACxD,MAAM,aAAa,QAAQ,MAAM,UAAU;CAC3C,MAAM,gBAAgB,QAAQ,SAAS,UAAU;CACjD,MAAM,eAAe,QAAQ,QAAQ,UAAU;CAC/C,MAAM,cAAc,QAAQ,OAAO,UAAU;CAE7C,OAAO;EACL,KAAK,KAAK,MAAM,KAAK,IAAI,WAAW,UAAU;EAC9C,QAAQ,KAAK,SAAS,KAAK,IAAI,cAAc,aAAa;EAC1D,OAAO,KAAK,QAAQ,KAAK,IAAI,aAAa,YAAY;EACtD,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,WAAW;CACpD;AACF;ACtEA,MAAa,YAAY;;;;;;;;;;;;ACczB,SAAgB,eAAe,OAAkB,SAA4B;CAC3E,MAAM,EAAE,KAAK,QAAQ,MAAM,UAAU,cAAc,SAAS;EAAE,MAAM;EAAM,OAAO;EAAM,KAAK;EAAM,QAAQ;CAAK,CAAC;CAChH,MAAM,QAAQ,QAAQ;CACtB,MAAM,SAAS,SAAS;CACxB,MAAM,WAAW;CACjB,MAAM,WAAW;CAEjB,MAAM,EAAE,SAAS,YAAY;CAE7B,MAAM,WAAW,QAAQ;CAEzB,MAAM,YAAY,SAAS,cAAc,KAAK;CAI9C,UAAU,UAAU,IAAI,eAAe,mBAAmB;CAG1D,MAAM,WAAW,KAAK,MAAM,WAAW,OAAO;CAE9C,MAAM,WAAW,KAAK,MAAM,WAAW,OAAO;CAE9C,MAAM,UAAU,KAAK,IAAI,UAAU,CAAC;CACpC,MAAM,UAAU,KAAK,IAAI,UAAU,CAAC;CACpC,aAAa,WAAW;EAMtB,UAAU;EAMV,KAAK;EACL,MAAM;EAGN,eAAe;EAEf,QAAQ;EAKR,YAAY,GAAG,QAAQ;EACvB,WAAW,GAAG,QAAQ;EAEtB,WAAW;EACX,OAAO,GAAG,QAAQ,QAAQ;EAC1B,QAAQ,GAAG,SAAS,QAAQ;CAC9B,CAAC;CAED,MAAM,gBAAgB,QAAQ,UAAU,IAAI;CAG5C,cAAc,MAAM,YAAY,WAAW,OAAO,WAAW;CAE7D,cAAc,MAAM,YAAY,iBAAiB,eAAe,WAAW;CAE3E,UAAU,YAAY,aAAa;CACnC,SAAS,KAAK,YAAY,SAAS;CAEnC,MAAM,cAAc,aAAa,WAAW,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;CAE1F,4BAA4B;EAC1B,UAAU,OAAO;CACnB,CAAC;AACH;;AClDA,MAAa,uCAAoG,4BAE/G,EACA,QAAQ;CAAE,SAAS;CAAM,WAAW;AAAM,EAC5C,CAAC;;;;AAKD,SAAgB,0BACd,MACA,OACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,IAAI;CAErD,QAAQ,YAAY;EAClB,KAAK,YAAY;CACnB,CAAC;CAED,sBAAsB,YAAY,SAAS,GAAG,WAAW,IAAI,KAAK,MAAM,MAAM,OAAO,GAAG;CAExF,iBAAiB,MAAM,cAAc,UAAU;EAC7C,MAAM,QAAQ,SAAS;EACvB,OAAO,SAAS,IAAI,IAAI;EAExB,MAAM,OAAO,kBAAkB,MAAM,OAAO,IAAI,CAAC;EACjD,MAAM,aAAa,OAAO,WAAW,IAAI;EAEzC,IAAI,QAAQ,YAAY;GACtB,KAAK,IAAI,UAAU,IAAI,mBAAmB;GAC1C,sBAAsB,MAAM,YAAY,KAAK;GAC7C,gBAAgB,MAAM,UAAU;EAClC;CACF,CAAC;CAED,iBAAiB,MAAM,iBAAiB;EAEtC,SAAI,GAAG,SAAS,IAAI,KAAK;EAEzB,MAAM,OAAO,kBAAkB,MAAM,OAAO,IAAI,CAAC;EACjD,IAAI,MACF,KAAK,IAAI,UAAU,OAAO,mBAAmB;CAEjD,CAAC;CAED,aAAa,MAAM,uBAAwB,SAAS,GAAG,SAAS,IAAI,IAAI,KAAK,KAAA,CAAU;AACzF;AAEA,SAAS,sBACP,MACA,eACA,WACA;CACA,iBAAiB,MAAM,qBAAqB;EAC1C,MAAM,aAAa,cAAc;EACjC,MAAM,SAAS,UAAU;EAEzB,IAAI,YAAY,OAAO,QAAQ,CAAC,QAAQ,MACtC;EAGF,MAAM,EAAE,SAAS;EACjB,KAAK,SACH,KAAK,MAAM,GAAG,aAAa,cAAc,OAAO,KAAK,MAAM,KAAK,WAAW,GAAG,CAAC,CACjF;EAKA,4BAA4B;GAC1B,KAAK,MAAM;EACb,CAAC;CACH,CAAC;AACH;AAEA,SAAS,sBAAsB,MAAkB,YAAwB,OAAwB;CAC/F,IAAI,CAAC,MAAM,cACT;CAGF,MAAM,EAAE,QAAQ;CAEhB,MAAM,UAAU,KAAK,QAAQ,GAAG;CAChC,IAAI,CAAC,WAAW,CAAC,cAAc,OAAO,GACpC;CAGF,MAAM,aAAa,UAAU;CAC7B,MAAM,aAAa,QAAQ,aAAa,QAAQ,SAAS;CACzD,MAAM,aAAa,gBAAgB;CACnC,eAAe,OAAO,OAAO;AAG/B;AAEA,SAAS,gBAAgB,MAAkB,YAA8B;CACvE,MAAM,EAAE,MAAM,QAAQ;CAQtB,KAAK,WAAW;EALd,OAAO,IAAI,MAAM,SAAS,KAAK,IAAI,GAAG,GAAG,CAAC;EAC1C,MAAM;EACN,MAAM,cAAc,OAAO,KAAK,MAAM,KAAK,GAAG;CAGzB;AACzB;AAEA,MAAM,kCAAqF,oBACzF,2BACA,oCACF;;;;;;;;;;;;AAaA,IAAa,8BAAb,cAAiD,gCAAgC,CAAC;;AAGlF,SAAgB,sCAA4C;CAC1D,sBAAsB,mCAAmC,2BAA2B;AACtF;;ACrJA,MAAa,mCAA4E;;AAGzF,SAAgB,sBACd,MACA,QACM;CAEN,kBAAkB,MADM,+BAA+B,QAAQ,IACzB,CAAC;AACzC;AAEA,MAAM,8BAA6E,oBACjF,uBACA,gCACF;;;;;;;;;;;;AAaA,IAAa,0BAAb,cAA6C,4BAA4B,CAAC;;AAG1E,SAAgB,kCAAwC;CACtD,sBAAsB,+BAA+B,uBAAuB;AAC9E;;ACGA,MAAa,wCAAsG,4BAEjH;CACA,GAAG;CACH,WAAW;EAAE,SAAS;EAAQ,WAAW;EAAa,MAAM;CAAS;CAGrE,OAAO;EAAE,SAAS;EAAO,WAAW;EAAS,MAAM;CAAU;CAC7D,MAAM;EAAE,SAAS;EAAO,WAAW;CAAM;CACzC,OAAO;EAAE,SAAS;EAAO,WAAW;EAAS,MAAM;CAAU;CAC7D,MAAM;EAAE,SAAS;EAAM,WAAW;EAAQ,MAAM;CAAU;AAC5D,CAAC;;AAGD,SAAgB,2BACd,MACA,OACM;CAEN,uBAAuB,MAAM,OADL,+BAA+B,QAAQ,IAC+B,CAAC;AACjG;AAEA,MAAM,mCAAuF,oBAC3F,4BACA,qCACF;;;;;;;;;;;;;;;;;;;;AAqBA,IAAa,+BAAb,cAAkD,iCAAiC,CAAC;;AAGpF,SAAgB,uCAA6C;CAC3D,sBAAsB,oCAAoC,4BAA4B;AACxF;AChGA,SAAgB,oBAAoB,MAAmB,WAA+C;CACpG,MAAM,QAAQ,aAAa,KAAK;CAChC,qBAAqB,MAAM,YAAY,SAAS;EAC9C,MAAM,EAAE,cAAc,KAAK;EAC3B,MAAM,IAAI,CAAC,UAAU,SAAS,gBAAgB,SAAS,CAAC;CAC1D,CAAC;CACD,OAAO,MAAM;AACf;ACZA,SAAgB,uBAAgC;CAC9C,IAAI,OAAO,WAAW,aACpB,OAAO;CAET,OAAO,OAAO,WAAW,kCAAkC,EAAE;AAC/D;;;;ACQA,SAAgB,kBAAkB,GAAe,GAAwB;CACvE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,IAAI;AAC5C;ACAA,SAAgB,0BAA0B,SAA8C;CACtF,MAAM,iBACJ,MACA,KACA,SACA,kBACG;EAUH,QAAQ;GARN,gBAAgB;GAEhB,6BAA6B;IAC3B,MAAM,OAAO,kBAAkB,eAAe,OAAO;IACrD,OAAO,OAAO,YAAY,IAAI,IAAI;GACpC;EAGc,GAAG;GAAE;GAAM;EAAI,CAAC;CAClC;CAEA,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,IAAI,WAAW;CAEf,MAAM,sBAAsB,MAAkB,UAAwB;EACpE,MAAM,EAAE,GAAG,MAAM;EAKjB,IAAI,UAAU,KAAK,UAAU,GAAG;GAC9B,MAAM,MAAM,KAAK,IAAI;GACrB,IAAI,MAAM,WAAW,KACnB;GAEF,WAAW;EACb;EACA,QAAQ;EACR,QAAQ;EAER,MAAM,QAAQ,kBAAkB,MAAM,GAAG,CAAC;EAC1C,IAAI,CAAC,OAAO;GACV,QAAQ;GACR;EACF;EAEA,MAAM,EAAE,MAAM,QAAQ;EACtB,MAAM,UAAU,KAAK,QAAQ,GAAG;EAChC,IAAI,CAAC,WAAW,CAAC,cAAc,OAAO,GAAG;GACvC,QAAQ;GACR;EACF;EAKA,MAAM,OAAO,KAAK,MAAM,IAAI,QAAQ,GAAG;EACvC,IAAI,KAAK,QAAQ,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG;GAClD,MAAM,YAAY,KAAK,OAAO,KAAK,KAAK;GACxC,MAAM,aAAa,KAAK;GAExB,cAAc,YAAY,WAAW,SADf,KAAK,QAAQ,SACuB,CAAC;EAC7D,OACE,cAAc,MAAM,KAAK,OAAO;CAEpC;CAEA,OAAO,MACL,sBAAsB,eAAe,SAAS,oBAAoB,GAAG,CAAC,GACtE,sBAAsB,gBAAgB,kBAAkB,GACxD,sBAAsB,cAAc,kBAAkB,GACtD,sBAAsB,kBAAkB,QAAQ,CAAC,CACnD;AACF;AAEA,SAAS,kBAAkB,MAAkB,GAAW,GAA+D;CAErH,IAAI,CAAC,aADQ,cAAc,KAAK,GACX,GAAG,GAAG,CAAC,GAC1B;CAGF,IAAI,SAAsC,KAAK,MAAM;CACrD,IAAI,MAAM;CAEV,OAAO,QAAQ;EACb,IAAI,OAAO,YAAY,OAAO,eAAe,OAAO,UAAU,OAAO,KAAK,KAAK,YAC7E,OAAO;GAAE,MAAM;GAAQ;EAAI;EAI7B,MAAM,WAA8B,CAAC;EACrC,MAAM,YAAsB,CAAC;EAC7B,OAAO,SAAS,OAAO,WAAW;GAChC,SAAS,KAAK,KAAK;GACnB,UAAU,KAAK,SAAS,MAAM,CAAC;EACjC,CAAC;EAED,IAAI,KAAK;EACT,IAAI,KAAK,SAAS,SAAS;EAE3B,OAAO,MAAM,IAAI;GACf,MAAM,IAAI,MAAO,KAAK,MAAO;GAE7B,MAAM,YAAY,YADD,KAAK,QAAQ,UAAU,EACH,CAAC;GACtC,IAAI,CAAC,WAAW;IACd,QAAQ,KAAK,8CAA8C,UAAU,IAAI;IACzE;GACF;GACA,IAAI,UAAU,MAAM,GAClB,KAAK,IAAI;QACJ,IAAI,UAAU,SAAS,GAC5B,KAAK,IAAI;QACJ;IACL,KAAK;IACL;GACF;EACF;EAEA,IAAI,KAAK,IACP;EAGF,SAAS,SAAS;EAClB,MAAM,UAAU;CAClB;AACF;AAEA,SAAS,YAAY,MAAiD;CACpE,IAAI,QAAQ,UAAU,IAAI,KAAK,KAAK,aAClC,OAAO,cAAc,IAAI;AAE7B;AAEA,SAAS,aAAa,MAAY,GAAW,GAAW;CACtD,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAK,OAAO,KAAK,KAAK;AACzE;AASA,SAAS,kBAAkB,OAAqB,OAAuC;CACrF,IAAI,SAAS,CAAC,MAAM,aAClB;CAEF,IAAI,SAAS,CAAC,MAAM,aAClB;CAGF,IAAI,SAAS,OAAO;EAClB,MAAM,YAAY,cAAc,KAAK;EACrC,MAAM,YAAY,wBAAwB,KAAK;EAC/C,IAAI,aAAa,WAAW;GAC1B,MAAM,EAAE,KAAK,WAAW;GACxB,MAAM,EAAE,MAAM,UAAU;GACxB,OAAO;IAAE;IAAK;IAAQ;IAAM;GAAM;EACpC,OACE,OAAO,aAAa;CAExB,OAAO,IAAI,OACT,OAAO,wBAAwB,KAAK;MAC/B,IAAI,OACT,OAAO,wBAAwB,KAAK;AAExC;AAEA,SAAS,cAAc,MAA8B;CACnD,IAAI,CAAC,UAAU,IAAI,GACjB;CAGF,OAAO,cAAc,MAAM;EAAE,MAAM;EAAM,OAAO;CAAK,CAAC;AACxD;AAEA,SAAS,wBAAwB,MAA8B;CAC7D,IAAI,UAAU,IAAI,GAChB,OAAO,2BAA2B,IAAI;MACjC,IAAI,WAAW,IAAI,GACxB,OAAO,4BAA4B,IAAI;AAE3C;AAEA,SAAS,4BAA4B,MAA8B;CACjE,MAAM,gBAAgB,KAAK;CAC3B,IAAI,CAAC,eACH;CAEF,MAAM,QAAQ,cAAc,YAAY;CACxC,MAAM,SAAS,MAAM,CAAC;CACtB,MAAM,OAAO,MAAM,CAAC;CAEpB,OADc,MAAM,eACT,EAAE;AACf;AAEA,SAAS,2BAA2B,SAAoC;CACtE,IAAI,QAAQ,aAAa,MACvB,OAAO,QAAQ,sBAAsB;CAGvC,MAAM,OAAO,cAAc,OAAO;CAClC,MAAM,QAAQ,QAAQ,cAAc,aAAa,iBAAiB,OAAO;CACzE,MAAM,aAAa,SAAS,OAAO,SAAS,MAAM,YAAY,EAAE,KAAK;CACrE,MAAM,cAAc,SAAS,OAAO,SAAS,MAAM,aAAa,EAAE,KAAK;CACvE,MAAM,OAAO,KAAK,OAAO;CACzB,MAAM,QAAQ,KAAK,QAAQ;CAE3B,MAAM,aAAa,SAAS,OAAO,SAAS,MAAM,YAAY,EAAE,KAAK;CACrE,MAAM,aAAa,SAAS,OAAO,SAAS,MAAM,YAAY,EAAE,KAAK;CACrE,MAAM,YAAY,SAAS,OAAO,SAAS,MAAM,gBAAgB,EAAE,KAAK;CACxE,MAAM,MAAM,KAAK,MAAM,aAAa;CAGpC,OAAO;EAAE;EAAK,QAFC,MAAM;EAEC;EAAM;CAAM;AACpC;AAEA,SAAS,YAAY,EAAE,KAAK,OAAO,QAAQ,QAAc;CACvD,OAAO;EAAE;EAAK;EAAO;EAAQ;EAAM,OAAO,QAAQ;EAAM,QAAQ,SAAS;EAAK,GAAG;EAAM,GAAG;CAAI;AAChG;AAGA,MAAM,eAAe,OAAO,OAAO;CACjC,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,GAAG;CACH,GAAG;AACL,CAAC;AC7OD,SAAgB,kBACd,MACA,WACA,SACM;CACN,MAAM,mBAAmB,qBAAqB,IAAI,IAAI;CAEtD,IAAI;CAEJ,IAAI;CAEJ,MAAM,eAAoC,WAAW,eAAe;EAClE,iBAAiB;EACjB,QAAQ,WAAW,UAAU;CAC/B;CAwCA,mBAAmB,MAAM,WAtCP,2BAA2B,WAAW,eAAe;EACrE,IAAI,cAAc,oBAAoB,MAAM;GAC1C,aAAa,gBAAgB;GAC7B,mBAAmB,KAAA;EACrB;EAEA,IAAI,kBAAkB,YAAY;GAChC,IAAI,kBAAkB,gBAAgB,UAAU,GAC9C;GAEF,YAAY,WAAW,UAAU;GACjC;EACF;EAEA,IAAI,CAAC,kBAAkB,CAAC,YACtB;EAGF,IAAI,CAAC,kBAAkB,YAAY;GACjC,YAAY,WAAW,UAAU;GACjC;EACF;EAEA,IAAI,kBAAkB,CAAC,YAAY;GACjC,IAAI,oBAAoB,MACtB;GAMF,mBAAmB,iBAAiB;IAClC,YAAY,WAAW,KAAA,CAAS;IAChC,mBAAmB,KAAA;GACrB,GAAG,gBAAgB;EACrB;CACF,CAE4C,CAAC;AAC/C;;AC9BA,MAAa,kCAA0F,4BAErG,EACA,QAAQ;CAAE,SAAS;CAAM,WAAW;AAAM,EAC5C,CAAC;AAED,IAAa,8BAAb,cAAiD,MAAM;CAKrD,YAAY,OAAsD;EAChE,MAAM,eAAe,EAAE,SAAS,KAAK,CAAC;EACtC,KAAK,SAAS;CAChB;AACF;;;;AAYA,SAAgB,qBACd,MACA,OACM;CACN,MAAM,YAAY,MAAM,OAAO;CAE/B,MAAM,QAAQ,IAAI,iBAAiB;CACnC,wBAAwB,QAAQ,MAAM,KAAK;CAE3C,MAAM,YAAY,aAAyC,KAAA,CAAS;CACpE,MAAM,eAAe,aAAa,IAAI;CAEtC,MAAM,sBAAsB,oBAAoB,MAAM,SAAS;CAI/D,MAAM,eAAe,mBAFL,eAAe,CAAC,CAAC,MAAM,WAAW,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,oBAAoB,CAG3F,SACA,CAAC,SACD,YACA,QACL,UAAU,KAAK,cAAc,KAAK,CACrC;CAEA,kBAAkB,MAAM,YAAY,KAAK,eAAe;EACtD,UAAU,IAAI,OAAO,KAAA,CAAS;EAC9B,MAAM,WAAW,IAAI,UAAU;EAC/B,MAAM,QAAQ,aAAa;GAAE,MAAM,WAAW;GAAM,KAAK,WAAW;EAAI,IAAI;EAC5E,KAAK,cAAc,IAAI,4BAA4B,KAAK,CAAC;CAC3D,CAAC;CAED,UAAU,YAAY;EACpB,aAAa,iBAAiB,UAAU,IAAI,CAAC;CAC/C,CAAC;CAED,+BAA+B,QAAQ,MAAM,YAAY;AAC3D;AAEA,MAAM,6BAA2E,oBAC/E,sBACA,+BACF;;;;;;;;AASA,IAAa,yBAAb,cAA4C,2BAA2B,CAAC;;AAGxE,SAAgB,iCAAuC;CACrD,sBAAsB,8BAA8B,sBAAsB;AAC5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"drop-indicator.d.ts","names":[],"sources":["../src/components/drop-indicator/drop-indicator.ts"],"mappings":";;UAoBiB,kBAAA;EAAA;;;;;;EAOf,MAAA,EAAQ,MAAA;EAOH;;AAIP;;;EAJE,KAAA;AAAA;AAoBF;AAAA,cAhBa,6BAAA,EAA+B,gBAAA,CAAiB,kBAAA;;;;iBAgB7C,kBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,kBAAA;AAAA,cAwDT,wBAAA,EAA0B,sBAAA,CAAuB,kBAAA;;;;;;cAU1C,oBAAA,SAA6B,wBAAA;;AAZzC;;iBAiBe,4BAAA,CAAA"}
1
+ {"version":3,"file":"drop-indicator.d.ts","names":[],"sources":["../src/components/drop-indicator/drop-indicator.ts"],"mappings":";;UAoBiB,kBAAA;EAAA;;;;;;EAOf,MAAA,EAAQ,MAAM;EAOT;AAAA;AAIP;;;EAJE,KAAA;AAAA;AAoBF;AAAA,cAhBa,6BAAA,EAA+B,gBAAgB,CAAC,kBAAA;;;;iBAgB7C,kBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,kBAAA;AAAA,cAwDT,wBAAA,EAA0B,sBAAsB,CAAC,kBAAA;;;;;;cAU1C,oBAAA,SAA6B,wBAAwB;AAlEhC;AAsDjC;;AAtDiC,iBAuElB,4BAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"drop-indicator.js","names":[],"sources":["../src/components/drop-indicator/drop-indicator.ts"],"sourcesContent":["import {\n computed,\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n useEffect,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { usePresence } from '@aria-ui/utils'\nimport type { Editor } from '@prosekit/core'\nimport { defineDropIndicator, type ShowHandlerOptions } from '@prosekit/extensions/drop-indicator'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { useScrolling } from '../../hooks/use-scrolling.ts'\nimport { assignStyles } from '../../utils/assign-styles.ts'\n\nexport interface DropIndicatorProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n\n /**\n * The line width in pixels.\n *\n * @default 2\n */\n width: number\n}\n\n/** @internal */\nexport const DropIndicatorPropsDeclaration: PropsDeclaration<DropIndicatorProps> = /* @__PURE__ */ defineProps<DropIndicatorProps>({\n editor: {\n default: null,\n attribute: false,\n type: 'json',\n },\n width: {\n default: 2,\n attribute: 'width',\n type: 'number',\n },\n})\n\n/**\n * @internal\n */\nexport function setupDropIndicator(\n host: HostElement,\n props: State<DropIndicatorProps>,\n): void {\n type DropIndicatorContext = ShowHandlerOptions | null\n const context = createSignal<DropIndicatorContext>(null)\n\n const extension = defineDropIndicator({\n onShow: (options) => context.set(options),\n onHide: () => context.set(null),\n })\n\n useEditorExtension(host, props.editor.get, extension)\n\n const getLine = computed(() => context.get()?.line)\n const getScrolling = useScrolling(host)\n const getPresence = computed(() => !!context.get() && !getScrolling())\n usePresence(host, getPresence)\n\n useEffect(host, () => {\n const lineValue = getLine()\n const lineWidth = props.width.get()\n\n if (!lineValue) return\n\n const { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } } = lineValue\n const horizontal = y1 === y2\n\n let width: number\n let height: number\n let top: number = y1\n let left: number = x1\n\n if (horizontal) {\n width = x2 - x1\n height = lineWidth\n top -= lineWidth / 2\n } else {\n width = lineWidth\n height = y2 - y1\n left -= lineWidth / 2\n }\n\n top = Math.round(top)\n left = Math.round(left)\n\n assignStyles(host, {\n position: 'fixed',\n pointerEvents: 'none',\n width: `${width}px`,\n height: `${height}px`,\n transform: `translate(${left}px, ${top}px)`,\n left: '0px',\n top: '0px',\n })\n })\n}\n\nconst DropIndicatorElementBase: HostElementConstructor<DropIndicatorProps> = defineCustomElement(\n setupDropIndicator,\n DropIndicatorPropsDeclaration,\n)\n\n/**\n * `<prosekit-drop-indicator>` custom element.\n *\n * Properties: {@link DropIndicatorProps}\n */\nexport class DropIndicatorElement extends DropIndicatorElementBase {}\n\n/**\n * @internal\n */\nexport function registerDropIndicatorElement(): void {\n registerCustomElement('prosekit-drop-indicator', DropIndicatorElement)\n}\n"],"mappings":";;;;;;AAsCA,MAAa,gCAAsF,4BAAgC;CACjI,QAAQ;EACN,SAAS;EACT,WAAW;EACX,MAAM;EACP;CACD,OAAO;EACL,SAAS;EACT,WAAW;EACX,MAAM;EACP;CACF,CAAC;;;;AAKF,SAAgB,mBACd,MACA,OACM;CAEN,MAAM,UAAU,aAAmC,KAAK;CAExD,MAAM,YAAY,oBAAoB;EACpC,SAAS,YAAY,QAAQ,IAAI,QAAQ;EACzC,cAAc,QAAQ,IAAI,KAAK;EAChC,CAAC;CAEF,mBAAmB,MAAM,MAAM,OAAO,KAAK,UAAU;CAErD,MAAM,UAAU,eAAe,QAAQ,KAAK,EAAE,KAAK;CACnD,MAAM,eAAe,aAAa,KAAK;CAEvC,YAAY,MADQ,eAAe,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,cAAc,CACxC,CAAC;CAE9B,UAAU,YAAY;EACpB,MAAM,YAAY,SAAS;EAC3B,MAAM,YAAY,MAAM,MAAM,KAAK;EAEnC,IAAI,CAAC,WAAW;EAEhB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,MAAM,IAAI,EAAE,GAAG,IAAI,GAAG,SAAS;EACvD,MAAM,aAAa,OAAO;EAE1B,IAAI;EACJ,IAAI;EACJ,IAAI,MAAc;EAClB,IAAI,OAAe;EAEnB,IAAI,YAAY;GACd,QAAQ,KAAK;GACb,SAAS;GACT,OAAO,YAAY;SACd;GACL,QAAQ;GACR,SAAS,KAAK;GACd,QAAQ,YAAY;;EAGtB,MAAM,KAAK,MAAM,IAAI;EACrB,OAAO,KAAK,MAAM,KAAK;EAEvB,aAAa,MAAM;GACjB,UAAU;GACV,eAAe;GACf,OAAO,GAAG,MAAM;GAChB,QAAQ,GAAG,OAAO;GAClB,WAAW,aAAa,KAAK,MAAM,IAAI;GACvC,MAAM;GACN,KAAK;GACN,CAAC;GACF;;AAGJ,MAAM,2BAAuE,oBAC3E,oBACA,8BACD;;;;;;AAOD,IAAa,uBAAb,cAA0C,yBAAyB;;;;AAKnE,SAAgB,+BAAqC;CACnD,sBAAsB,2BAA2B,qBAAqB"}
1
+ {"version":3,"file":"drop-indicator.js","names":[],"sources":["../src/components/drop-indicator/drop-indicator.ts"],"sourcesContent":["import {\n computed,\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n useEffect,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { usePresence } from '@aria-ui/utils'\nimport type { Editor } from '@prosekit/core'\nimport { defineDropIndicator, type ShowHandlerOptions } from '@prosekit/extensions/drop-indicator'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { useScrolling } from '../../hooks/use-scrolling.ts'\nimport { assignStyles } from '../../utils/assign-styles.ts'\n\nexport interface DropIndicatorProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n\n /**\n * The line width in pixels.\n *\n * @default 2\n */\n width: number\n}\n\n/** @internal */\nexport const DropIndicatorPropsDeclaration: PropsDeclaration<DropIndicatorProps> = /* @__PURE__ */ defineProps<DropIndicatorProps>({\n editor: {\n default: null,\n attribute: false,\n type: 'json',\n },\n width: {\n default: 2,\n attribute: 'width',\n type: 'number',\n },\n})\n\n/**\n * @internal\n */\nexport function setupDropIndicator(\n host: HostElement,\n props: State<DropIndicatorProps>,\n): void {\n type DropIndicatorContext = ShowHandlerOptions | null\n const context = createSignal<DropIndicatorContext>(null)\n\n const extension = defineDropIndicator({\n onShow: (options) => context.set(options),\n onHide: () => context.set(null),\n })\n\n useEditorExtension(host, props.editor.get, extension)\n\n const getLine = computed(() => context.get()?.line)\n const getScrolling = useScrolling(host)\n const getPresence = computed(() => !!context.get() && !getScrolling())\n usePresence(host, getPresence)\n\n useEffect(host, () => {\n const lineValue = getLine()\n const lineWidth = props.width.get()\n\n if (!lineValue) return\n\n const { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } } = lineValue\n const horizontal = y1 === y2\n\n let width: number\n let height: number\n let top: number = y1\n let left: number = x1\n\n if (horizontal) {\n width = x2 - x1\n height = lineWidth\n top -= lineWidth / 2\n } else {\n width = lineWidth\n height = y2 - y1\n left -= lineWidth / 2\n }\n\n top = Math.round(top)\n left = Math.round(left)\n\n assignStyles(host, {\n position: 'fixed',\n pointerEvents: 'none',\n width: `${width}px`,\n height: `${height}px`,\n transform: `translate(${left}px, ${top}px)`,\n left: '0px',\n top: '0px',\n })\n })\n}\n\nconst DropIndicatorElementBase: HostElementConstructor<DropIndicatorProps> = defineCustomElement(\n setupDropIndicator,\n DropIndicatorPropsDeclaration,\n)\n\n/**\n * `<prosekit-drop-indicator>` custom element.\n *\n * Properties: {@link DropIndicatorProps}\n */\nexport class DropIndicatorElement extends DropIndicatorElementBase {}\n\n/**\n * @internal\n */\nexport function registerDropIndicatorElement(): void {\n registerCustomElement('prosekit-drop-indicator', DropIndicatorElement)\n}\n"],"mappings":";;;;;;AAsCA,MAAa,gCAAsF,4BAAgC;CACjI,QAAQ;EACN,SAAS;EACT,WAAW;EACX,MAAM;CACR;CACA,OAAO;EACL,SAAS;EACT,WAAW;EACX,MAAM;CACR;AACF,CAAC;;;;AAKD,SAAgB,mBACd,MACA,OACM;CAEN,MAAM,UAAU,aAAmC,IAAI;CAEvD,MAAM,YAAY,oBAAoB;EACpC,SAAS,YAAY,QAAQ,IAAI,OAAO;EACxC,cAAc,QAAQ,IAAI,IAAI;CAChC,CAAC;CAED,mBAAmB,MAAM,MAAM,OAAO,KAAK,SAAS;CAEpD,MAAM,UAAU,eAAe,QAAQ,IAAI,GAAG,IAAI;CAClD,MAAM,eAAe,aAAa,IAAI;CAEtC,YAAY,MADQ,eAAe,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,aAAa,CACxC,CAAC;CAE7B,UAAU,YAAY;EACpB,MAAM,YAAY,QAAQ;EAC1B,MAAM,YAAY,MAAM,MAAM,IAAI;EAElC,IAAI,CAAC,WAAW;EAEhB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,MAAM,IAAI,EAAE,GAAG,IAAI,GAAG,SAAS;EACvD,MAAM,aAAa,OAAO;EAE1B,IAAI;EACJ,IAAI;EACJ,IAAI,MAAc;EAClB,IAAI,OAAe;EAEnB,IAAI,YAAY;GACd,QAAQ,KAAK;GACb,SAAS;GACT,OAAO,YAAY;EACrB,OAAO;GACL,QAAQ;GACR,SAAS,KAAK;GACd,QAAQ,YAAY;EACtB;EAEA,MAAM,KAAK,MAAM,GAAG;EACpB,OAAO,KAAK,MAAM,IAAI;EAEtB,aAAa,MAAM;GACjB,UAAU;GACV,eAAe;GACf,OAAO,GAAG,MAAM;GAChB,QAAQ,GAAG,OAAO;GAClB,WAAW,aAAa,KAAK,MAAM,IAAI;GACvC,MAAM;GACN,KAAK;EACP,CAAC;CACH,CAAC;AACH;AAEA,MAAM,2BAAuE,oBAC3E,oBACA,6BACF;;;;;;AAOA,IAAa,uBAAb,cAA0C,yBAAyB,CAAC;;;;AAKpE,SAAgB,+BAAqC;CACnD,sBAAsB,2BAA2B,oBAAoB;AACvE"}
@@ -1 +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;CAChF,IAAI,CAAC,UAAU,CAAC,OAAO,SAAS;CAChC,OAAO,OAAO"}
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;CAChF,IAAI,CAAC,UAAU,CAAC,OAAO,SAAS;CAChC,OAAO,OAAO;AAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/queue-extension.ts"],"mappings":";;AA2EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,SAAA,GAAY,YAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/queue-extension.ts"],"mappings":";;AA2EA;;;;;;;;;;;;;;AAAkF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAlE,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,SAAA,GAAY,YAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/queue-extension.ts"],"sourcesContent":["import type { Editor, Extension } from '@prosekit/core'\n\n/**\n\n @internal\n\n Queues an extension to be added to the editor in the next task. Returns a\n dispose function that can be used to remove the extension in the next task.\n\n Why?\n\n Let's take React as an example.\n\n `editor.use(extension)` is synchronous. If the extension adds a node view that\n is controlled by `@prosemirror-adapter/react`, adding this extension will\n cause `prosemirror-adapter` to set UI state synchronously (e.g. `setState`\n returned by `useState` in React).\n\n ProseMirror is a sync-based framework. When updating node view, ProseMirror\n will first stop DOMObserver, then update the DOM, then resume DOMObserver.\n `prosemirror-adapter` needs to call `React.flushSync()` to update the DOM\n synchronously right after React state is updated, before ProseMirror resumes\n DOMObserver.\n\n If we call `editor.use(extension)` directly in `useEffect`, we eventually are\n doing something like this:\n\n ```ts\n React.useEffect(() => {\n React.flushSync(() => {\n setState(newState)\n })\n }, [])\n ```\n\n This breaks the async nature of React, and causes the following React\n warning:\n\n ```\n flushSync was called from inside a lifecycle method. React cannot flush when\n React is already rendering. Consider moving this call to a scheduler task or\n micro task.\n ```\n\n To fix this, we need to queue the extension addition to the editor in the next\n task or in the next microtask.\n\n ```ts\n // In the next microtask\n React.useEffect(() => {\n queueMicrotask(() => {\n React.flushSync(() => {\n setState(newState)\n })\n })\n }, [])\n\n // In the next task\n React.useEffect(() => {\n setTimeout(() => {\n React.flushSync(() => {\n setState(newState)\n })\n })\n }, [])\n ```\n\n I chose to use `setTimeout` instead of `queueMicrotask` because\n `queueMicrotask` causes another React act warning `An update to %s inside a\n test was not wrapped in act(...)` during testing.\n\n Although the example above is based on React, this is a general pattern for\n any async based UI framework, including Svelte.\n\n */\nexport function queueExtension(editor: Editor, extension: Extension): VoidFunction {\n let canceled = false\n let dispose: VoidFunction | undefined\n const timeout = setTimeout(() => {\n if (canceled) return\n dispose?.()\n dispose = editor.use(extension)\n })\n\n return () => {\n canceled = true\n clearTimeout(timeout)\n setTimeout(() => {\n dispose?.()\n dispose = undefined\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,SAAgB,eAAe,QAAgB,WAAoC;CACjF,IAAI,WAAW;CACf,IAAI;CACJ,MAAM,UAAU,iBAAiB;EAC/B,IAAI,UAAU;EACd,WAAW;EACX,UAAU,OAAO,IAAI,UAAU;GAC/B;CAEF,aAAa;EACX,WAAW;EACX,aAAa,QAAQ;EACrB,iBAAiB;GACf,WAAW;GACX,UAAU,KAAA;IACV"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/queue-extension.ts"],"sourcesContent":["import type { Editor, Extension } from '@prosekit/core'\n\n/**\n\n @internal\n\n Queues an extension to be added to the editor in the next task. Returns a\n dispose function that can be used to remove the extension in the next task.\n\n Why?\n\n Let's take React as an example.\n\n `editor.use(extension)` is synchronous. If the extension adds a node view that\n is controlled by `@prosemirror-adapter/react`, adding this extension will\n cause `prosemirror-adapter` to set UI state synchronously (e.g. `setState`\n returned by `useState` in React).\n\n ProseMirror is a sync-based framework. When updating node view, ProseMirror\n will first stop DOMObserver, then update the DOM, then resume DOMObserver.\n `prosemirror-adapter` needs to call `React.flushSync()` to update the DOM\n synchronously right after React state is updated, before ProseMirror resumes\n DOMObserver.\n\n If we call `editor.use(extension)` directly in `useEffect`, we eventually are\n doing something like this:\n\n ```ts\n React.useEffect(() => {\n React.flushSync(() => {\n setState(newState)\n })\n }, [])\n ```\n\n This breaks the async nature of React, and causes the following React\n warning:\n\n ```\n flushSync was called from inside a lifecycle method. React cannot flush when\n React is already rendering. Consider moving this call to a scheduler task or\n micro task.\n ```\n\n To fix this, we need to queue the extension addition to the editor in the next\n task or in the next microtask.\n\n ```ts\n // In the next microtask\n React.useEffect(() => {\n queueMicrotask(() => {\n React.flushSync(() => {\n setState(newState)\n })\n })\n }, [])\n\n // In the next task\n React.useEffect(() => {\n setTimeout(() => {\n React.flushSync(() => {\n setState(newState)\n })\n })\n }, [])\n ```\n\n I chose to use `setTimeout` instead of `queueMicrotask` because\n `queueMicrotask` causes another React act warning `An update to %s inside a\n test was not wrapped in act(...)` during testing.\n\n Although the example above is based on React, this is a general pattern for\n any async based UI framework, including Svelte.\n\n */\nexport function queueExtension(editor: Editor, extension: Extension): VoidFunction {\n let canceled = false\n let dispose: VoidFunction | undefined\n const timeout = setTimeout(() => {\n if (canceled) return\n dispose?.()\n dispose = editor.use(extension)\n })\n\n return () => {\n canceled = true\n clearTimeout(timeout)\n setTimeout(() => {\n dispose?.()\n dispose = undefined\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,SAAgB,eAAe,QAAgB,WAAoC;CACjF,IAAI,WAAW;CACf,IAAI;CACJ,MAAM,UAAU,iBAAiB;EAC/B,IAAI,UAAU;EACd,UAAU;EACV,UAAU,OAAO,IAAI,SAAS;CAChC,CAAC;CAED,aAAa;EACX,WAAW;EACX,aAAa,OAAO;EACpB,iBAAiB;GACf,UAAU;GACV,UAAU,KAAA;EACZ,CAAC;CACH;AACF"}
@@ -1,9 +1,6 @@
1
1
  import { HostElement, HostElementConstructor, PropsDeclaration, State } from "@aria-ui/core";
2
2
  import { OpenChangeEvent, OpenChangeEvent as OpenChangeEvent$1, OverlayPopupProps, OverlayPositionerProps, OverlayRootProps } from "@aria-ui/elements/overlay";
3
3
  import { Editor } from "@prosekit/core";
4
- /**
5
- * @public
6
- */
7
4
  interface InlinePopoverPopupProps extends OverlayPopupProps {}
8
5
  /** @internal */
9
6
  declare const InlinePopoverPopupPropsDeclaration: PropsDeclaration<InlinePopoverPopupProps>;
@@ -24,9 +21,6 @@ declare const InlinePopoverPopupElementBase: HostElementConstructor<InlinePopove
24
21
  declare class InlinePopoverPopupElement extends InlinePopoverPopupElementBase {}
25
22
  /** @internal */
26
23
  declare function registerInlinePopoverPopupElement(): void;
27
- /**
28
- * @public
29
- */
30
24
  interface InlinePopoverPositionerProps extends Omit<OverlayPositionerProps, 'placement' | 'offset' | 'hide' | 'hoist' | 'overlap' | 'inline' | 'overflowPadding'> {
31
25
  /**
32
26
  * The initial placement of the floating element
@@ -102,9 +96,6 @@ declare const InlinePopoverPositionerElementBase: HostElementConstructor<InlineP
102
96
  declare class InlinePopoverPositionerElement extends InlinePopoverPositionerElementBase {}
103
97
  /** @internal */
104
98
  declare function registerInlinePopoverPositionerElement(): void;
105
- /**
106
- * @public
107
- */
108
99
  interface InlinePopoverRootProps extends OverlayRootProps {
109
100
  /**
110
101
  * The ProseKit editor instance.
@@ -130,9 +121,6 @@ interface InlinePopoverRootProps extends OverlayRootProps {
130
121
  }
131
122
  /** @internal */
132
123
  declare const InlinePopoverRootPropsDeclaration: PropsDeclaration<InlinePopoverRootProps>;
133
- /**
134
- * @public
135
- */
136
124
  interface InlinePopoverRootEvents {
137
125
  /**
138
126
  * Emitted when the open state of the popover changes.