@prosekit/web 0.8.0-beta.4 → 0.8.0-beta.5

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.
@@ -1,7 +1,8 @@
1
1
  import { t as useEditorExtension } from "./use-editor-extension.js";
2
2
  import { t as getSafeEditorView } from "./get-safe-editor-view.js";
3
- import { createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect, useEventListener } from "@aria-ui/core";
3
+ import { createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect } from "@aria-ui/core";
4
4
  import { SelectEvent, ValueChangeEvent, ValuesChangeEvent, defaultItemFilter, setupListboxEmpty, setupListboxItem, setupListboxRoot } from "@aria-ui/elements/listbox";
5
+ import { useEventListener } from "@aria-ui/utils";
5
6
  import { OpenChangeEvent, OverlayPopupPropsDeclaration, OverlayPositionerPropsDeclaration, createOverlayStore, setupOverlayPopup, setupOverlayPositioner } from "@aria-ui/elements/overlay";
6
7
  import { defineDOMEventHandler, defineKeymap, withPriority } from "@prosekit/core";
7
8
  import { AutocompleteRule, defineAutocomplete } from "@prosekit/extensions/autocomplete";
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-web-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 useEventListener,\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'\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 hovered block.\n *\n * @default 4\n */\n offset: OverlayPositionerProps['offset']\n\n /**\n * @default true\n */\n inline: OverlayPositionerProps['inline']\n\n /**\n * @default true\n */\n hoist: OverlayPositionerProps['hoist']\n\n /**\n * @default true\n */\n fitViewport: OverlayPositionerProps['fitViewport']\n\n /**\n * @default \"The body element\"\n */\n boundary: OverlayPositionerProps['boundary']\n\n /**\n * @default 8\n */\n overflowPadding: OverlayPositionerProps['overflowPadding']\n}\n\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: 4, attribute: false, type: 'json' },\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, type: 'json' },\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 as unknown as 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 useEventListener,\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 { 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/** @internal */\nexport const AutocompleteRootPropsDeclaration: PropsDeclaration<AutocompleteRootProps> = /* @__PURE__ */ defineProps<\n AutocompleteRootProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n regex: { default: null, attribute: false, type: 'json' },\n filter: { default: defaultItemFilter, attribute: false, type: 'json' },\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<Element | 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<Element | 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 useAutocompleteExtension(host, getEditor, props.regex.get, {\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 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, deps)\n const extension = defineAutocomplete(rule)\n return editor.use(extension)\n })\n}\n\nfunction createAutocompleteRule(\n editor: Editor,\n regex: RegExp,\n deps: AutocompleteRuleDeps,\n) {\n const { reference, handlers, setQuery, requestOpenChange } = deps\n\n const handleEnter: MatchHandler = (options) => {\n const view = getSafeEditorView(editor)\n const span = view?.dom.querySelector('.prosekit-autocomplete-match')\n\n if (span) {\n reference.set(span)\n }\n\n 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":"prosekit-web-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 hovered block.\n *\n * @default 4\n */\n offset: OverlayPositionerProps['offset']\n\n /**\n * @default true\n */\n inline: OverlayPositionerProps['inline']\n\n /**\n * @default true\n */\n hoist: OverlayPositionerProps['hoist']\n\n /**\n * @default true\n */\n fitViewport: OverlayPositionerProps['fitViewport']\n\n /**\n * @default \"The body element\"\n */\n boundary: OverlayPositionerProps['boundary']\n\n /**\n * @default 8\n */\n overflowPadding: OverlayPositionerProps['overflowPadding']\n}\n\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: 4, attribute: false, type: 'json' },\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, type: 'json' },\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 as unknown as 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 { 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/** @internal */\nexport const AutocompleteRootPropsDeclaration: PropsDeclaration<AutocompleteRootProps> = /* @__PURE__ */ defineProps<\n AutocompleteRootProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n regex: { default: null, attribute: false, type: 'json' },\n filter: { default: defaultItemFilter, attribute: false, type: 'json' },\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<Element | 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<Element | 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 useAutocompleteExtension(host, getEditor, props.regex.get, {\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 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, deps)\n const extension = defineAutocomplete(rule)\n return editor.use(extension)\n })\n}\n\nfunction createAutocompleteRule(\n editor: Editor,\n regex: RegExp,\n deps: AutocompleteRuleDeps,\n) {\n const { reference, handlers, setQuery, requestOpenChange } = deps\n\n const handleEnter: MatchHandler = (options) => {\n const view = getSafeEditorView(editor)\n const span = view?.dom.querySelector('.prosekit-autocomplete-match')\n\n if (span) {\n reference.set(span)\n }\n\n 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 +1 @@
1
- {"version":3,"file":"prosekit-web-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,UC5CC,yBAAA;;;;ADZjB;;;ECmBE,MAAA,EAAQ,MAAA;AAAA;ADRV;AAAA,cCYa,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;ADzGhD;AAAA,iBC4Ge,mCAAA,CAAA;;;;UCpJC,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;;;;;;AC5CA;;;;;AAWA;;;;;AASA;;;ADwBA,cG6Ba,4BAAA,SAAqC,gCAAA;;iBAGlC,oCAAA,CAAA;AAAA,UChFC,oBAAA;;;AJRjB;;;;EIeE,MAAA,EAAQ,MAAA;AAAA;;cAIG,+BAAA,EAAiC,gBAAA,CAAiB,oBAAA;;;AJD/D;cIUa,2BAAA,SAAoC,KAAA;;;;EAI/C,MAAA;IAAU,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;cACrB,KAAA;IAAS,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;AAAA;;AJQ7C;;UICgB,qBAAA;EJCgB;;AAUjC;EIPE,WAAA,EAAa,2BAAA;AAAA;;;AJUf;iBIJgB,oBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,oBAAA;AAAA,cAkCT,0BAAA,EAA4B,sBAAA,CAAuB,oBAAA;;;;AH5EzD;;;;cGwFa,sBAAA,SAA+B,0BAAA;;iBAG5B,8BAAA,CAAA"}
1
+ {"version":3,"file":"prosekit-web-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,UChFC,oBAAA;;;AJRjB;;;;EIeE,MAAA,EAAQ,MAAA;AAAA;;cAIG,+BAAA,EAAiC,gBAAA,CAAiB,oBAAA;;;AJD/D;cIUa,2BAAA,SAAoC,KAAA;;;;EAI/C,MAAA;IAAU,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;cACrB,KAAA;IAAS,IAAA,EAAM,eAAA;IAAiB,GAAA;EAAA;AAAA;;AJQ7C;;UICgB,qBAAA;EJCgB;;AAUjC;EIPE,WAAA,EAAa,2BAAA;AAAA;;;AJUf;iBIJgB,oBAAA,CACd,IAAA,EAAM,WAAA,EACN,KAAA,EAAO,KAAA,CAAM,oBAAA;AAAA,cAkCT,0BAAA,EAA4B,sBAAA,CAAuB,oBAAA;;;;AH7EzD;;;;cGyFa,sBAAA,SAA+B,0BAAA;;iBAG5B,8BAAA,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { t as useEditorExtension } from "./use-editor-extension.js";
2
2
  import { t as getSafeEditorView } from "./get-safe-editor-view.js";
3
3
  import { n as assignStyles, t as useScrolling } from "./use-scrolling.js";
4
- import { computed, createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect, useEventListener } from "@aria-ui/core";
4
+ import { computed, createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect } from "@aria-ui/core";
5
+ import { useAttribute, useEventListener } from "@aria-ui/utils";
5
6
  import { OverlayPopupPropsDeclaration, OverlayPositionerPropsDeclaration, createOverlayStore, setupOverlayPopup, setupOverlayPositioner } from "@aria-ui/elements/overlay";
6
7
  import { defineDOMEventHandler, insertDefaultBlock, union } from "@prosekit/core";
7
- import { useAttribute } from "@aria-ui/utils";
8
8
  import { isElement, isHTMLElement, isTextNode, throttle } from "@ocavue/utils";
9
9
  import { Fragment, Slice } from "@prosekit/pm/model";
10
10
  import { NodeSelection } from "@prosekit/pm/state";
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-web-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/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 useEventListener,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\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, type: 'json' },\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 useEventListener,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { useAttribute } 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, type: 'json' },\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, type: 'json' },\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","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 { 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, type: 'json' },\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\n const getOpen = computed(() => !!store.hoverState.get() && !getScrolling())\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":"prosekit-web-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/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, type: 'json' },\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, type: 'json' },\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, type: 'json' },\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","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 { 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, type: 'json' },\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\n const getOpen = computed(() => !!store.hoverState.get() && !getScrolling())\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,8 +1,8 @@
1
1
  import { t as useEditorExtension } from "./use-editor-extension.js";
2
2
  import { computed, createContext, defineCustomElement, defineProps, onMount, registerCustomElement } from "@aria-ui/core";
3
+ import { usePresence } from "@aria-ui/utils";
3
4
  import { OpenChangeEvent, OverlayPopupPropsDeclaration, OverlayPositionerPropsDeclaration, OverlayRootPropsDeclaration, setupOverlayPopup, setupOverlayPositioner, useOverlayStore } from "@aria-ui/elements/overlay";
4
5
  import { containsInlineNode, defineFocusChangeHandler, defineKeymap, defineUpdateHandler, isInCodeBlock, isTextSelection } from "@prosekit/core";
5
- import { usePresence } from "@aria-ui/utils";
6
6
  const InlinePopoverStoreContext = createContext("prosekit-inline-popover-store");
7
7
  /** @internal */
8
8
  const InlinePopoverPopupPropsDeclaration = OverlayPopupPropsDeclaration;
@@ -1,7 +1,8 @@
1
1
  import { t as useEditorExtension } from "./use-editor-extension.js";
2
2
  import { t as getSafeEditorView } from "./get-safe-editor-view.js";
3
3
  import { n as assignStyles, t as useScrolling } from "./use-scrolling.js";
4
- import { computed, createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect, useEventListener } from "@aria-ui/core";
4
+ import { computed, createContext, createSignal, defineCustomElement, defineProps, onMount, registerCustomElement, useEffect } from "@aria-ui/core";
5
+ import { useEventListener } from "@aria-ui/utils";
5
6
  import { OverlayPositionerPropsDeclaration, createOverlayStore, setupOverlayPopup, setupOverlayPositioner } from "@aria-ui/elements/overlay";
6
7
  import { defineDOMEventHandler, union } from "@prosekit/core";
7
8
  import { getDocument, getId, isHTMLElement, once } from "@ocavue/utils";
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-web-table-handle.js","names":[],"sources":["../src/components/table-handle/store.ts","../src/components/table-handle/table-handle-column-popup.ts","../src/utils/use-html-element-at.ts","../src/components/table-handle/shared.ts","../src/components/table-handle/table-handle-column-positioner.ts","../src/components/table-handle/table-handle-column-menu-root.ts","../src/components/table-handle/use-empty-image.ts","../src/components/table-handle/table-handle-column-menu-trigger.ts","../src/components/table-handle/dnd.ts","../src/utils/clone-element.ts","../src/utils/css-feature-detection.ts","../src/utils/fade-color.ts","../src/utils/get-effective-background-color.ts","../src/utils/inject-style.ts","../src/components/table-handle/render-preview.ts","../src/components/table-handle/table-handle-drag-preview.ts","../src/components/table-handle/calc-drag-over.ts","../src/components/table-handle/table-handle-drop-indicator.ts","../src/hooks/use-editor-typing.ts","../src/hooks/use-selecting.ts","../src/components/table-handle/use-drop.ts","../src/components/table-handle/utils.ts","../src/components/table-handle/table-handle-root.ts","../src/components/table-handle/table-handle-row-popup.ts","../src/components/table-handle/table-handle-row-positioner.ts","../src/components/table-handle/table-handle-row-menu-root.ts","../src/components/table-handle/table-handle-row-menu-trigger.ts"],"sourcesContent":["import { computed, createContext, createSignal, type Context, type Signal } from '@aria-ui/core'\nimport type { OpenChangeEvent } from '@aria-ui/elements/overlay'\nimport { createOverlayStore, type OverlayStore } from '@aria-ui/elements/overlay'\n\nimport type { HoveringCellInfo } from './utils.ts'\n\nfunction noop(): void {}\nfunction returnTrue(): boolean {\n return true\n}\nfunction returnFalse(): boolean {\n return false\n}\n\nclass DndStore {\n readonly dragging: Signal<boolean> = createSignal(false)\n readonly direction: Signal<'row' | 'col'> = createSignal<'row' | 'col'>('row')\n readonly draggingIndex: Signal<number> = createSignal(-1)\n readonly droppingIndex: Signal<number> = createSignal(-1)\n readonly x: Signal<number> = createSignal(-1)\n readonly y: Signal<number> = createSignal(-1)\n readonly startX: Signal<number> = createSignal(-1)\n readonly startY: Signal<number> = createSignal(-1)\n}\n\n/**\n * @internal\n */\nexport interface TableHandleStore {\n readonly dndStore: DndStore\n readonly setIsColumnMenuOpen: (open: boolean) => void\n readonly setIsRowMenuOpen: (open: boolean) => void\n readonly columnOverlayStore: OverlayStore\n readonly rowOverlayStore: OverlayStore\n readonly getReferenceCell: () => HoveringCellInfo | undefined\n}\n\n/**\n * @internal\n */\nexport function createTableHandleStore(\n getHoveringCellInfo: () => HoveringCellInfo | undefined,\n getCanShow: () => boolean,\n): TableHandleStore {\n const isColumnMenuOpen = createSignal(false)\n const isRowMenuOpen = createSignal(false)\n\n const getHasMenuOpen = (): boolean => {\n return isColumnMenuOpen.get() || isRowMenuOpen.get()\n }\n\n const setIsRowMenuOpen = (open: boolean): void => {\n isRowMenuOpen.set(open)\n }\n\n const setIsColumnMenuOpen = (open: boolean): void => {\n isColumnMenuOpen.set(open)\n }\n\n const referenceCellInfo = createSignal<HoveringCellInfo | undefined>(undefined)\n\n let prevHoveringCellInfo: HoveringCellInfo | undefined = undefined\n\n const getReferenceCell = computed((): HoveringCellInfo | undefined => {\n if (!getCanShow()) {\n referenceCellInfo.set(undefined)\n return\n }\n\n // Do not toggle/update the menu when hovering another cell if the menu is already open\n if (getHasMenuOpen()) {\n return prevHoveringCellInfo\n }\n\n prevHoveringCellInfo = getHoveringCellInfo()\n return prevHoveringCellInfo\n })\n\n const getOpen = computed((): boolean => {\n return !!getReferenceCell()\n })\n\n const handleOpenChange = (event: OpenChangeEvent) => {\n if (getHasMenuOpen()) {\n event.preventDefault()\n }\n }\n\n const columnOverlayStore = createOverlayStore(\n getOpen,\n noop,\n returnTrue,\n returnFalse,\n handleOpenChange,\n )\n const rowOverlayStore = createOverlayStore(\n getOpen,\n noop,\n returnTrue,\n returnFalse,\n handleOpenChange,\n )\n\n return {\n dndStore: new DndStore(),\n setIsRowMenuOpen,\n setIsColumnMenuOpen,\n columnOverlayStore,\n rowOverlayStore,\n getReferenceCell,\n }\n}\n\n/**\n * @internal\n */\nexport const tableHandleStoreContext: Context<TableHandleStore> = createContext<TableHandleStore>('prosekit-table-handle-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 { setupOverlayPopup } from '@aria-ui/elements/overlay'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleColumnPopupProps {}\n\n/** @internal */\nexport const TableHandleColumnPopupPropsDeclaration: PropsDeclaration<TableHandleColumnPopupProps> = defineProps<\n TableHandleColumnPopupProps\n>({})\n\n/** @internal */\nexport function setupTableHandleColumnPopup(\n host: HostElement,\n _props: State<TableHandleColumnPopupProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.columnOverlayStore\n setupOverlayPopup(host, getOverlayStore)\n}\n\nconst TableHandleColumnPopupElementBase: HostElementConstructor<TableHandleColumnPopupProps> = defineCustomElement(\n setupTableHandleColumnPopup,\n TableHandleColumnPopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-popup>` custom element.\n *\n * Properties: {@link TableHandleColumnPopupProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when visible, `\"closed\"` otherwise |\n */\nexport class TableHandleColumnPopupElement extends TableHandleColumnPopupElementBase {}\n\n/** @internal */\nexport function registerTableHandleColumnPopupElement(): void {\n registerCustomElement('prosekit-table-handle-column-popup', TableHandleColumnPopupElement)\n}\n","import { computed } from '@aria-ui/core'\nimport { isHTMLElement } from '@ocavue/utils'\nimport type { Editor } from '@prosekit/core'\n\nexport function useHTMLElementAt(\n getEditor: () => Editor | null | undefined,\n getPos: () => number | null | undefined,\n): () => HTMLElement | undefined {\n return computed(() => {\n const editor = getEditor()\n const pos = getPos()\n if (!editor || !pos) return\n const view = editor.view\n const element = view.nodeDOM(pos)\n if (element && isHTMLElement(element)) return element\n })\n}\n","import { defineProps, type PropsDeclaration } from '@aria-ui/core'\nimport { OverlayPositionerPropsDeclaration, type OverlayPositionerProps } from '@aria-ui/elements/overlay'\nimport type { Editor } from '@prosekit/core'\n\n/**\n * @internal\n */\nexport interface SharedTableHandlePositionerProps extends Omit<OverlayPositionerProps, 'hoist' | 'flip' | 'shift' | 'hide' | 'offset'> {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\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: OverlayPositionerProps['hoist']\n\n /**\n * @default false\n * @hidden\n */\n flip: OverlayPositionerProps['flip']\n\n /**\n * @default false\n * @hidden\n */\n shift: OverlayPositionerProps['shift']\n\n /**\n * @default true\n * @hidden\n */\n hide: OverlayPositionerProps['hide']\n\n /**\n * @default 0\n * @hidden\n */\n offset: OverlayPositionerProps['offset']\n}\n\n/** @internal */\nexport const SharedTableHandlePositionerPropsDeclaration: PropsDeclaration<SharedTableHandlePositionerProps> = defineProps<\n SharedTableHandlePositionerProps\n>({\n ...OverlayPositionerPropsDeclaration,\n editor: { default: null, attribute: false, type: 'json' },\n hoist: { default: false, attribute: false, type: 'boolean' },\n flip: { default: false, attribute: false, type: 'json' },\n shift: { default: false, attribute: false, type: 'boolean' },\n hide: { default: true, attribute: false, type: 'boolean' },\n offset: { default: 0, attribute: false, type: 'json' },\n})\n","import {\n computed,\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 { setupOverlayPositioner } from '@aria-ui/elements/overlay'\nimport type { Placement } from '@floating-ui/dom'\n\nimport { useHTMLElementAt } from '../../utils/use-html-element-at.ts'\n\nimport { SharedTableHandlePositionerPropsDeclaration, type SharedTableHandlePositionerProps } from './shared.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleColumnPositionerProps extends Omit<SharedTableHandlePositionerProps, 'placement'> {\n /**\n * The placement of the popover, relative to the hovered table cell.\n *\n * @default \"top\"\n */\n placement: Placement\n}\n\n/** @internal */\nexport const TableHandleColumnPositionerPropsDeclaration: PropsDeclaration<TableHandleColumnPositionerProps> = defineProps<\n TableHandleColumnPositionerProps\n>({\n ...SharedTableHandlePositionerPropsDeclaration,\n placement: { default: 'top', attribute: 'placement', type: 'string' },\n})\n\n/** @internal */\nexport function setupTableHandleColumnPositioner(\n host: HostElement,\n props: State<TableHandleColumnPositionerProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.columnOverlayStore\n setupOverlayPositioner(host, props, getOverlayStore)\n\n const getEditor = props.editor.get\n const getColumnFirstCellPos = computed(() => getStore()?.getReferenceCell()?.colFirstCellPos)\n const getReferenceCell = useHTMLElementAt(getEditor, getColumnFirstCellPos)\n useEffect(host, () => {\n getOverlayStore()?.setAnchorElement(getReferenceCell())\n })\n}\n\nconst TableHandleColumnPositionerElementBase: HostElementConstructor<TableHandleColumnPositionerProps> = defineCustomElement(\n setupTableHandleColumnPositioner,\n TableHandleColumnPositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-positioner>` custom element.\n *\n * Properties: {@link TableHandleColumnPositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when 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 TableHandleColumnPositionerElement extends TableHandleColumnPositionerElementBase {}\n\n/** @internal */\nexport function registerTableHandleColumnPositionerElement(): void {\n registerCustomElement('prosekit-table-handle-column-positioner', TableHandleColumnPositionerElement)\n}\n","import {\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 { MenuRootPropsDeclaration, setupMenuRoot, type MenuRootProps } from '@aria-ui/elements/menu'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleColumnMenuRootProps extends MenuRootProps {}\n\n/** @internal */\nexport const TableHandleColumnMenuRootPropsDeclaration: PropsDeclaration<TableHandleColumnMenuRootProps> = defineProps<\n TableHandleColumnMenuRootProps\n>(MenuRootPropsDeclaration)\n\n/** @internal */\nexport function setupTableHandleColumnMenuRoot(\n host: HostElement,\n props: State<TableHandleColumnMenuRootProps>,\n): void {\n setupMenuRoot(host, props)\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const open = props.open.get() || false\n const store = getStore?.()\n if (!store) return\n store.setIsColumnMenuOpen(open)\n })\n}\n\nconst TableHandleColumnMenuRootElementBase: HostElementConstructor<TableHandleColumnMenuRootProps> = defineCustomElement(\n setupTableHandleColumnMenuRoot,\n TableHandleColumnMenuRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-menu-root>` custom element.\n *\n * Properties: {@link TableHandleColumnMenuRootProps}\n */\nexport class TableHandleColumnMenuRootElement extends TableHandleColumnMenuRootElementBase {}\n\n/** @internal */\nexport function registerTableHandleColumnMenuRootElement(): void {\n registerCustomElement('prosekit-table-handle-column-menu-root', TableHandleColumnMenuRootElement)\n}\n","import { useEffect, type HostElement } from '@aria-ui/core'\n\n/**\n * Returns a function that returns a 1x1 transparent image. This is used to\n * prevent the browser from showing the default drag image. An earth icon in\n * chrome is used as the default drag image. This image must be loaded before\n * the dragStart event triggers.\n *\n * See https://stackoverflow.com/a/40923520\n *\n * @internal\n */\nexport function useEmptyImage(\n host: HostElement,\n): () => HTMLImageElement | undefined {\n let image: HTMLImageElement | undefined\n\n useEffect(host, () => {\n image = new Image(1, 1)\n image.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'\n\n return () => {\n image?.remove()\n image = undefined\n }\n })\n\n return () => image\n}\n","import {\n createSignal,\n defineCustomElement,\n defineProps,\n onMount,\n registerCustomElement,\n useEventListener,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'\nimport type { Editor } from '@prosekit/core'\nimport { selectTableColumn, type defineTableCommands } from '@prosekit/extensions/table'\n\nimport { tableHandleStoreContext } from './store.ts'\nimport { useEmptyImage } from './use-empty-image.ts'\n\ntype TableCommandsExtension = ReturnType<typeof defineTableCommands>\n\nexport interface TableHandleColumnMenuTriggerProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor<TableCommandsExtension> | null\n}\n\n/** @internal */\nexport const TableHandleColumnMenuTriggerPropsDeclaration: PropsDeclaration<TableHandleColumnMenuTriggerProps> = defineProps<\n TableHandleColumnMenuTriggerProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/** @internal */\nexport function setupTableHandleColumnMenuTrigger(\n host: HostElement,\n props: State<TableHandleColumnMenuTriggerProps>,\n): void {\n const getEditor = props.editor.get\n const getStore = tableHandleStoreContext.consume(host)\n\n const triggerProps: State<MenuTriggerProps> = {\n disabled: createSignal(false),\n }\n setupMenuTrigger(host, triggerProps)\n\n useEventListener(host, 'pointerdown', () => {\n const editor = getEditor()\n const cellPos = getStore()?.getReferenceCell()?.cellPos\n if (!editor || !cellPos) return\n editor.exec(selectTableColumn({ head: cellPos }))\n })\n\n onMount(host, () => {\n host.draggable = true\n })\n\n const getEmptyImage = useEmptyImage(host)\n\n useEventListener(host, 'dragstart', (event: DragEvent) => {\n const dataTransfer = event.dataTransfer\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move'\n const emptyImage = getEmptyImage()\n if (emptyImage) {\n dataTransfer.setDragImage(emptyImage, 0, 0)\n }\n dataTransfer.setData('application/x-prosekit-table-handle-drag', '')\n }\n const store = getStore()\n if (!store) return\n const index = store.getReferenceCell()?.colIndex\n\n if (index == null || index < 0) {\n console.warn('[prosekit] Invalid column index for drag operation:', index)\n event.preventDefault()\n return\n }\n\n const dndStore = store.dndStore\n dndStore.direction.set('col')\n dndStore.dragging.set(true)\n dndStore.draggingIndex.set(index)\n dndStore.startX.set(event.clientX)\n dndStore.startY.set(event.clientY)\n })\n}\n\nconst TableHandleColumnMenuTriggerElementBase: HostElementConstructor<TableHandleColumnMenuTriggerProps> = defineCustomElement(\n setupTableHandleColumnMenuTrigger,\n TableHandleColumnMenuTriggerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-menu-trigger>` custom element.\n *\n * Properties: {@link TableHandleColumnMenuTriggerProps}\n */\nexport class TableHandleColumnMenuTriggerElement extends TableHandleColumnMenuTriggerElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleColumnMenuTriggerElement(): void {\n registerCustomElement('prosekit-table-handle-column-menu-trigger', TableHandleColumnMenuTriggerElement)\n}\n","import { useEffect, type HostElement } from '@aria-ui/core'\nimport { computePosition, offset } from '@floating-ui/dom'\nimport { isHTMLElement } from '@ocavue/utils'\nimport type { Editor } from '@prosekit/core'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport type OnInitParams = {\n host: HostElement\n direction: 'row' | 'col'\n dragging: boolean\n draggingIndex: number\n table: HTMLTableElement\n cell: HTMLTableCellElement\n}\n\nexport function useInitDndPosition(\n host: HostElement,\n getEditor: () => Editor | null,\n onInit: (params: OnInitParams) => void,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const store = getStore()\n if (!store) return\n\n const dndStore = store.dndStore\n\n const dragging = dndStore.dragging.get()\n const direction = dndStore.direction.get()\n\n host.dataset.direction = direction\n host.dataset.dragging = dragging.toString()\n\n const draggingIndex = dndStore.draggingIndex.get()\n\n const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)\n if (!relatedDOMs) return\n const { table, cell } = relatedDOMs\n\n onInit({\n host,\n direction,\n dragging,\n draggingIndex,\n table,\n cell,\n })\n\n if (!dragging) return\n\n let cancelled = false\n\n void computePosition(cell, host, {\n placement: direction === 'row' ? 'right' : 'bottom',\n middleware: [\n offset(({ rects }) => {\n if (direction === 'col') {\n return -rects.reference.height\n }\n return -rects.reference.width\n }),\n ],\n }).then(({ x, y }) => {\n if (cancelled) return\n assignStyles(host, {\n left: `${x}px`,\n top: `${y}px`,\n })\n })\n\n return () => {\n cancelled = true\n }\n })\n}\n\nfunction getTableDOMByPos(view: EditorView, pos: number): HTMLTableElement | undefined {\n const dom = view.domAtPos(pos).node\n if (!dom) return\n const element = isHTMLElement(dom) ? dom : dom.parentElement\n const table = element?.closest('table')\n return table ?? undefined\n}\n\nfunction getTargetFirstCellDOM(table: HTMLTableElement, index: number, direction: 'row' | 'col'): HTMLTableCellElement | undefined {\n if (direction === 'row') {\n const row = table.querySelectorAll('tr')[index]\n const cell = row?.querySelector<HTMLTableCellElement>('td, th')\n return cell ?? undefined\n } else {\n const row = table.querySelector('tr')\n const cell = row?.querySelectorAll<HTMLTableCellElement>('td, th')[index]\n return cell ?? undefined\n }\n}\n\nexport function getDndRelatedDOMs(\n view: EditorView,\n cellPos: number | undefined,\n draggingIndex: number,\n direction: 'row' | 'col',\n): { table: HTMLTableElement; cell: HTMLTableCellElement } | undefined {\n if (cellPos == null) return\n const table = getTableDOMByPos(view, cellPos)\n if (!table) return\n const cell = getTargetFirstCellDOM(table, draggingIndex, direction)\n if (!cell) return\n return { table, cell }\n}\n","import { getId } from '@ocavue/utils'\n\n/**\n * Creates a deep clone of an Element, including all computed styles so that\n * it looks almost exactly the same as the original element.\n */\nexport function deepCloneElement<T extends Element>(element: T, important = false): [T, string] {\n const clonedElement = element.cloneNode(true) as T\n const style = deepCopyStyles(element, clonedElement, important)\n return [clonedElement, style]\n}\n\n/**\n * Creates a clone of an Element, including all computed styles so that\n * it looks similar enough to the original element.\n */\nexport function cloneElement<T extends Element>(element: T, important = false): [T, string] {\n const clonedElement = element.cloneNode() as T\n const style = copyStyles(element, clonedElement, important)\n return [clonedElement, style]\n}\n\nfunction deepCopyStyles(source: Element, target: Element, important: boolean): string {\n const sources = [source]\n const targets = [target]\n const styles: string[] = []\n\n while (sources.length > 0 && sources.length === targets.length) {\n const source = sources.pop()\n const target = targets.pop()\n\n if (!source || !target) {\n break\n }\n\n const style = copyStyles(source, target, important)\n if (style) {\n styles.push(style)\n }\n\n sources.push(...source.children)\n targets.push(...target.children)\n }\n\n return styles.join('\\n')\n}\n\nfunction copyStyles(source: Element, target: Element, important: boolean): string {\n if (!source || !target) {\n return ''\n }\n\n const view = source.ownerDocument?.defaultView\n if (!view) {\n return ''\n }\n\n // Known issue: pseudo styles are not copied.\n const sourceStyle = view.getComputedStyle(source)\n const targetStyle = (target as HTMLElement | SVGElement | MathMLElement).style\n\n if (!sourceStyle || !targetStyle) {\n return ''\n }\n\n for (const key of sourceStyle) {\n targetStyle.setProperty(\n key,\n sourceStyle.getPropertyValue(key),\n // Enforce important to avoid the style being overridden when the element\n // is connected to the page.\n // See https://github.com/prosekit/prosekit/issues/1185 for more details.\n important ? 'important' : (sourceStyle.getPropertyPriority(key) || ''),\n )\n }\n\n const styles: string[] = []\n for (const pseudoSelector of [':before', ':after']) {\n const sourcePseudoStyle = view.getComputedStyle(source, pseudoSelector)\n const targetPseudoStyle = view.getComputedStyle(target, pseudoSelector)\n\n if (!sourcePseudoStyle) {\n continue\n }\n\n const content = sourcePseudoStyle.getPropertyValue('content')\n const hasPseudoElement = content && content !== 'none' && content !== 'normal'\n\n if (!hasPseudoElement) {\n continue\n }\n\n const cssProps: string[] = []\n for (const property of sourcePseudoStyle) {\n const sourceValue = sourcePseudoStyle.getPropertyValue(property)\n const sourcePriority = sourcePseudoStyle.getPropertyPriority(property)\n const targetValue = targetPseudoStyle.getPropertyValue(property)\n const targetPriority = targetPseudoStyle.getPropertyPriority(property)\n if (sourceValue !== targetValue || sourcePriority !== targetPriority) {\n cssProps.push(`${property}: ${sourceValue}${sourcePriority ? ' !important' : ''};`)\n }\n }\n\n const uniqueClassName = `clone-pseudo-element-${getId()}`\n target.classList.add(uniqueClassName)\n styles.push(`.${uniqueClassName}${pseudoSelector} { ${cssProps.join(' ')} }`)\n }\n\n return styles.join('\\n')\n}\n","import { once } from '@ocavue/utils'\n\nexport const isColorMixSupported: () => boolean = once(() => {\n try {\n return CSS.supports('background-color', 'color-mix(in srgb, red, blue)')\n } catch {\n return false\n }\n})\n","import { isColorMixSupported } from './css-feature-detection.ts'\n\n/**\n * Convert a color to a color with opacity\n * @param color - The color to convert\n * @param opacity - The opacity to apply\n * @returns The converted color if color-mix is supported, otherwise undefined\n */\nexport function fadeColor(color: CSSStyleValue, opacity: number): string | undefined {\n if (isColorMixSupported()) {\n const transparentWeight = (1 - opacity) * 100\n const colorWeight = opacity * 100\n return `color-mix(in srgb, ${color} ${colorWeight}%, transparent ${transparentWeight}%)`\n }\n}\n","export function getEffectiveBackgroundColor(element: HTMLElement): string | undefined {\n let current: HTMLElement | null = element\n\n while (current) {\n const style = current.ownerDocument.defaultView?.getComputedStyle(current)\n const backgroundColor = style?.backgroundColor\n\n if (\n backgroundColor\n && backgroundColor !== 'transparent'\n // Chrome returns `rgba(0, 0, 0, 0)` for transparent colors.\n && backgroundColor !== 'rgba(0, 0, 0, 0)'\n ) {\n return backgroundColor\n }\n\n current = current.parentElement\n }\n\n return undefined\n}\n","import { getDocument } from '@ocavue/utils'\n\nexport function injectStyle(container: HTMLElement, styleText: string): void {\n if (!styleText) {\n return\n }\n const document = getDocument(container)\n const style = document.createElement('style')\n style.textContent = styleText\n container.appendChild(style)\n}\n","import { assignStyles } from '../../utils/assign-styles.ts'\nimport { cloneElement, deepCloneElement } from '../../utils/clone-element.ts'\nimport { fadeColor } from '../../utils/fade-color.ts'\nimport { getEffectiveBackgroundColor } from '../../utils/get-effective-background-color.ts'\nimport { injectStyle } from '../../utils/inject-style.ts'\n\nexport function clearPreviewDOM(previewRoot: HTMLElement): void {\n while (previewRoot.firstChild) {\n previewRoot.removeChild(previewRoot.firstChild)\n }\n}\n\nexport function createPreviewDOM(\n table: HTMLTableElement,\n previewRoot: HTMLElement,\n index: number,\n direction: 'row' | 'col',\n): void {\n clearPreviewDOM(previewRoot)\n\n const [previewTable, previewTableStyle] = cloneElement(table)\n injectStyle(previewRoot, previewTableStyle)\n unsetSize(previewTable)\n\n const tableBody = table.querySelector('tbody')\n const [previewTableBody, previewTableBodyStyle] = tableBody\n ? cloneElement(tableBody)\n : [table.ownerDocument.createElement('tbody'), '']\n injectStyle(previewRoot, previewTableBodyStyle)\n unsetSize(previewTableBody)\n\n // Get effective background color and apply it with some opacity\n const backgroundColor = getEffectiveBackgroundColor(table)\n if (backgroundColor) {\n const backgroundColorWithOpacity = fadeColor(backgroundColor, 0.8)\n if (backgroundColorWithOpacity) {\n assignStyles(previewTable, { backgroundColor: backgroundColorWithOpacity })\n }\n }\n\n previewTable.appendChild(previewTableBody)\n previewRoot.appendChild(previewTable)\n\n const rows = table.querySelectorAll('tr')\n\n if (direction === 'row') {\n const row = rows[index]\n const [previewRow, previewRowStyle] = deepCloneElement(row)\n injectStyle(previewRoot, previewRowStyle)\n previewTableBody.appendChild(previewRow)\n } else {\n rows.forEach((row) => {\n const [previewRow, previewRowStyle] = cloneElement(row)\n injectStyle(previewRoot, previewRowStyle)\n unsetSize(previewRow)\n const cells = row.querySelectorAll('td, th')\n const cell = cells[index]\n if (cell) {\n const [previewCell, previewCellStyle] = deepCloneElement(cell)\n injectStyle(previewRoot, previewCellStyle)\n previewRow.appendChild(previewCell)\n previewTableBody.appendChild(previewRow)\n }\n })\n }\n}\n\nfunction unsetSize(element: HTMLElement) {\n assignStyles(element, {\n width: 'unset',\n height: 'unset',\n minWidth: 'unset',\n minHeight: 'unset',\n maxWidth: 'unset',\n maxHeight: 'unset',\n })\n}\n","import {\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 { computePosition, type ReferenceElement } from '@floating-ui/dom'\nimport type { Editor } from '@prosekit/core'\n\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { getDndRelatedDOMs, useInitDndPosition, type OnInitParams } from './dnd.ts'\nimport { clearPreviewDOM, createPreviewDOM } from './render-preview.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleDragPreviewProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const TableHandleDragPreviewPropsDeclaration: PropsDeclaration<TableHandleDragPreviewProps> = defineProps<\n TableHandleDragPreviewProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/**\n * @internal\n */\nexport function setupTableHandleDragPreview(\n host: HostElement,\n props: State<TableHandleDragPreviewProps>,\n): void {\n const getEditor = props.editor.get\n\n useEffect(host, () => {\n assignStyles(host, {\n position: 'absolute',\n pointerEvents: 'none',\n })\n })\n\n useInitDndPosition(host, getEditor, onInitPreviewPosition)\n\n useUpdatePreviewPosition(host, getEditor)\n}\n\nfunction onInitPreviewPosition({ host, direction, dragging, table, cell, draggingIndex }: OnInitParams): void {\n assignStyles(host, {\n display: dragging ? 'block' : 'none',\n })\n\n if (!dragging) {\n clearPreviewDOM(host)\n return\n }\n\n createPreviewDOM(table, host, draggingIndex, direction)\n\n const tableRect = table.getBoundingClientRect()\n const cellRect = cell.getBoundingClientRect()\n\n if (direction === 'col') {\n assignStyles(host, {\n width: `${cellRect.width}px`,\n height: `${tableRect.height}px`,\n })\n }\n\n if (direction === 'row') {\n assignStyles(host, {\n width: `${tableRect.width}px`,\n height: `${cellRect.height}px`,\n })\n }\n}\n\nfunction useUpdatePreviewPosition(host: HostElement, getEditor: () => Editor | null): void {\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const store = getStore()\n if (!store) return\n const dndStore = store.dndStore\n\n if (!dndStore.dragging.get()) return\n\n const draggingIndex = dndStore.draggingIndex.get()\n const direction = dndStore.direction.get()\n const x = dndStore.x.get()\n const y = dndStore.y.get()\n\n const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)\n if (!relatedDOMs) return\n const { cell } = relatedDOMs\n\n let cancelled = false\n\n void computePosition(\n getVirtualElement(cell, x, y),\n host,\n { placement: direction === 'row' ? 'right' : 'bottom' },\n ).then(({ x, y }) => {\n if (cancelled) return\n\n if (direction === 'row') {\n assignStyles(host, { top: `${y}px` })\n return\n }\n\n if (direction === 'col') {\n assignStyles(host, { left: `${x}px` })\n return\n }\n })\n\n return () => {\n cancelled = true\n }\n })\n}\n\nfunction getVirtualElement(cell: HTMLTableCellElement, x: number, y: number): ReferenceElement {\n return {\n contextElement: cell,\n getBoundingClientRect: () => {\n const rect = cell.getBoundingClientRect()\n return {\n width: rect.width,\n height: rect.height,\n right: x + rect.width / 2,\n bottom: y + rect.height / 2,\n top: y - rect.height / 2,\n left: x - rect.width / 2,\n x: x - rect.width / 2,\n y: y - rect.height / 2,\n }\n },\n }\n}\n\nconst TableHandleDragPreviewElementBase: HostElementConstructor<TableHandleDragPreviewProps> = defineCustomElement(\n setupTableHandleDragPreview,\n TableHandleDragPreviewPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-drag-preview>` custom element.\n *\n * Properties: {@link TableHandleDragPreviewProps}\n */\nexport class TableHandleDragPreviewElement extends TableHandleDragPreviewElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleDragPreviewElement(): void {\n registerCustomElement('prosekit-table-handle-drag-preview', TableHandleDragPreviewElement)\n}\n","function findDragOverElement(\n elements: Element[],\n pointer: number,\n axis: 'x' | 'y',\n): [Element, number] | undefined {\n const startProp = axis === 'x' ? 'left' : 'top'\n const endProp = axis === 'x' ? 'right' : 'bottom'\n const lastIndex = elements.length - 1\n\n const index = elements.findIndex((el, index) => {\n const rect = el.getBoundingClientRect()\n const boundaryStart = rect[startProp]\n const boundaryEnd = rect[endProp]\n\n // The pointer is within the boundary of the current element.\n if (boundaryStart <= pointer && pointer <= boundaryEnd) return true\n // The pointer is beyond the last element.\n if (index === lastIndex && pointer > boundaryEnd) return true\n // The pointer is before the first element.\n if (index === 0 && pointer < boundaryStart) return true\n\n return false\n })\n\n return index >= 0 ? [elements[index], index] : undefined\n}\n\nexport function getDragOverColumn(\n table: HTMLTableElement,\n pointerX: number,\n): [element: Element, index: number] | undefined {\n const firstRow = table.querySelector('tr')\n if (!firstRow) return\n const cells = Array.from(firstRow.children)\n return findDragOverElement(cells, pointerX, 'x')\n}\n\nexport function getDragOverRow(\n table: HTMLTableElement,\n pointerY: number,\n): [element: Element, index: number] | undefined {\n const rows = Array.from(table.querySelectorAll('tr'))\n return findDragOverElement(rows, pointerY, 'y')\n}\n","import {\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 { computePosition, offset } from '@floating-ui/dom'\nimport type { Editor } from '@prosekit/core'\nimport type { defineTableCommands } from '@prosekit/extensions/table'\n\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { getDragOverColumn, getDragOverRow } from './calc-drag-over.ts'\nimport { getDndRelatedDOMs, useInitDndPosition, type OnInitParams } from './dnd.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\ntype TableCommandsExtension = ReturnType<typeof defineTableCommands>\n\nconst HANDLE_WIDTH = 2\n\nexport interface TableHandleDropIndicatorProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor<TableCommandsExtension> | null\n}\n\n/** @internal */\nexport const TableHandleDropIndicatorPropsDeclaration: PropsDeclaration<TableHandleDropIndicatorProps> = defineProps<\n TableHandleDropIndicatorProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/**\n * @internal\n */\nexport function setupTableHandleDropIndicator(\n host: HostElement,\n props: State<TableHandleDropIndicatorProps>,\n): void {\n const getEditor = props.editor.get\n\n useEffect(host, () => {\n assignStyles(host, {\n pointerEvents: 'none',\n position: 'absolute',\n })\n })\n\n useInitDndPosition(host, getEditor, onInitIndicatorPosition)\n\n useUpdateIndicatorPosition(host, getEditor, HANDLE_WIDTH)\n}\n\nfunction onInitIndicatorPosition({ host, direction, dragging, table }: OnInitParams): void {\n assignStyles(host, {\n display: dragging ? 'block' : 'none',\n })\n\n const tableRect = table.getBoundingClientRect()\n\n if (direction === 'col') {\n assignStyles(host, {\n width: `${HANDLE_WIDTH}px`,\n height: `${tableRect.height}px`,\n })\n }\n\n if (direction === 'row') {\n assignStyles(host, {\n width: `${tableRect.width}px`,\n height: `${HANDLE_WIDTH}px`,\n })\n }\n}\n\nfunction useUpdateIndicatorPosition(host: HostElement, getEditor: () => Editor | null, handleWidth: number): void {\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const store = getStore()\n if (!store) return\n\n const dndStore = store.dndStore\n if (!dndStore.dragging.get()) return\n\n const draggingIndex = dndStore.draggingIndex.get()\n const direction = dndStore.direction.get()\n const x = dndStore.x.get()\n const y = dndStore.y.get()\n\n const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)\n if (!relatedDOMs) return\n const { table } = relatedDOMs\n\n let cancelled = false\n const cleanup = () => {\n cancelled = true\n }\n\n if (direction === 'col') {\n const dir = dndStore.startX.get() > x ? 'left' : 'right'\n const dragOverColumn = getDragOverColumn(table, x)\n\n if (dragOverColumn) {\n const [col, index] = dragOverColumn\n dndStore.droppingIndex.set(index)\n void computePosition(col, host, {\n placement: dir === 'left' ? 'left' : 'right',\n middleware: [offset(dir === 'left' ? -1 * handleWidth : 0)],\n }).then(({ x }) => {\n if (cancelled) return\n assignStyles(host, { left: `${x}px` })\n })\n }\n\n return cleanup\n }\n\n if (direction === 'row') {\n const dir = dndStore.startY.get() > y ? 'up' : 'down'\n const dragOverRow = getDragOverRow(table, y)\n\n if (dragOverRow) {\n const [row, index] = dragOverRow\n dndStore.droppingIndex.set(index)\n void computePosition(row, host, {\n placement: dir === 'up' ? 'top' : 'bottom',\n middleware: [offset(dir === 'up' ? -1 * handleWidth : 0)],\n }).then(({ y }) => {\n if (cancelled) return\n assignStyles(host, { top: `${y}px` })\n })\n }\n\n return cleanup\n }\n })\n}\n\nconst TableHandleDropIndicatorElementBase: HostElementConstructor<TableHandleDropIndicatorProps> = defineCustomElement(\n setupTableHandleDropIndicator,\n TableHandleDropIndicatorPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-drop-indicator>` custom element.\n *\n * Properties: {@link TableHandleDropIndicatorProps}\n */\nexport class TableHandleDropIndicatorElement extends TableHandleDropIndicatorElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleDropIndicatorElement(): void {\n registerCustomElement('prosekit-table-handle-drop-indicator', TableHandleDropIndicatorElement)\n}\n","import { createSignal, type HostElement } from '@aria-ui/core'\nimport { defineDOMEventHandler, union, type Editor } from '@prosekit/core'\n\nimport { useEditorExtension } from './use-editor-extension.ts'\n\nexport function useEditorTyping(\n host: HostElement,\n getEditor: () => Editor | null,\n): () => boolean {\n const typing = createSignal(false)\n\n const extension = union(\n defineDOMEventHandler('keypress', () => {\n typing.set(true)\n }),\n defineDOMEventHandler('pointermove', () => {\n typing.set(false)\n }),\n )\n\n useEditorExtension(host, getEditor, extension)\n\n return typing.get\n}\n","import { createSignal, useEffect, type HostElement } from '@aria-ui/core'\nimport type { Editor } from '@prosekit/core'\n\nimport { getSafeEditorView } from '../utils/get-safe-editor-view.ts'\n\n/**\n * Detect if the user is selecting text inside the editor, in which case some\n * components should be disabled or hidden.\n */\nexport function useSelecting(\n host: HostElement,\n getEditor: () => Editor | null,\n getEnabled: () => boolean,\n): () => boolean {\n const selecting = createSignal(false)\n const isPointerDown = createSignal(false)\n\n useEffect(host, () => {\n if (!getEnabled()) return\n\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const { dom, root } = view\n if (!root) return\n\n const handlePointerDown = () => {\n selecting.set(true)\n isPointerDown.set(true)\n }\n const handlePointerUp = () => {\n isPointerDown.set(false)\n }\n const handleMouseMove = () => {\n if (!isPointerDown.get()) {\n selecting.set(false)\n }\n }\n\n dom.addEventListener('pointerdown', handlePointerDown)\n root.addEventListener('pointerup', handlePointerUp)\n root.addEventListener('pointermove', handleMouseMove)\n\n return () => {\n dom.removeEventListener('pointerdown', handlePointerDown)\n root.removeEventListener('pointerup', handlePointerUp)\n root.removeEventListener('pointermove', handleMouseMove)\n }\n })\n\n return selecting.get\n}\n","import { computed, useEffect, type HostElement } from '@aria-ui/core'\nimport type { Editor } from '@prosekit/core'\nimport { moveTableColumn, moveTableRow } from '@prosekit/extensions/table'\n\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport type { TableHandleStore } from './store.ts'\n\nexport function useDrop(\n host: HostElement,\n getEditor: () => Editor | null,\n store: TableHandleStore,\n): void {\n const getDndStore = () => store.dndStore\n const getDragging = computed(() => getDndStore().dragging.get())\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view || !view.editable) return\n\n const ownerDocument = view.dom?.ownerDocument\n if (!ownerDocument) return\n\n const handleDrop = () => {\n if (!getDragging()) return\n const editor = getEditor()\n if (!editor) return\n\n const dndStore = getDndStore()\n\n const droppingIndex = dndStore.droppingIndex.get()\n const draggingIndex = dndStore.draggingIndex.get()\n const direction = dndStore.direction.get()\n\n if (draggingIndex < 0 || droppingIndex < 0) {\n console.warn('[prosekit] Invalid drag indices:', { draggingIndex, droppingIndex })\n return\n }\n\n if (direction === 'row') {\n editor.exec(moveTableRow({ from: draggingIndex, to: droppingIndex }))\n return\n }\n if (direction === 'col') {\n editor.exec(moveTableColumn({ from: draggingIndex, to: droppingIndex }))\n return\n }\n }\n\n const handleDragOver = (event: DragEvent) => {\n if (!getDragging()) return\n event.preventDefault()\n const dndStore = getDndStore()\n dndStore.dragging.set(true)\n dndStore.x.set(event.clientX)\n dndStore.y.set(event.clientY)\n }\n\n const handleDragEnd = () => {\n if (!getDragging()) return\n const dndStore = getDndStore()\n dndStore.dragging.set(false)\n }\n\n ownerDocument.addEventListener('dragover', handleDragOver)\n ownerDocument.addEventListener('drop', handleDrop)\n ownerDocument.addEventListener('dragend', handleDragEnd)\n return () => {\n ownerDocument.removeEventListener('dragover', handleDragOver)\n ownerDocument.removeEventListener('drop', handleDrop)\n ownerDocument.removeEventListener('dragend', handleDragEnd)\n }\n })\n}\n","import type { EditorView } from '@prosekit/pm/view'\nimport { cellAround, TableMap } from 'prosemirror-tables'\n\nexport interface HoveringCellInfo {\n rowIndex: number\n colIndex: number\n cellPos: number\n rowFirstCellPos: number\n colFirstCellPos: number\n}\n\nexport function isHoveringCellInfoEqual(\n a?: HoveringCellInfo | null,\n b?: HoveringCellInfo | null,\n): boolean {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n a.rowIndex === b.rowIndex\n && a.colIndex === b.colIndex\n && a.cellPos === b.cellPos\n && a.rowFirstCellPos === b.rowFirstCellPos\n && a.colFirstCellPos === b.colFirstCellPos\n )\n}\n\n/**\n * Copied from https://github.com/ProseMirror/prosemirror-tables/blob/v1.5.0/src/columnresizing.ts#L256\n *\n * @internal\n */\nfunction domCellAround(target: HTMLElement | null): HTMLElement | null {\n while (target && target.nodeName != 'TD' && target.nodeName != 'TH') {\n target = target.classList?.contains('ProseMirror')\n ? null\n : (target.parentNode as HTMLElement | null)\n }\n return target\n}\n\nexport function getHoveringCell(\n view: EditorView,\n event: MouseEvent,\n): HoveringCellInfo | undefined {\n const domCell = domCellAround(event.target as HTMLElement | null)\n if (!domCell) return\n\n const { left, top, width, height } = domCell.getBoundingClientRect()\n const eventPos = view.posAtCoords({\n // Use the center coordinates of the cell to ensure we're within the\n // selected cell. This prevents potential issues when the mouse is on the\n // border of two cells.\n left: left + width / 2,\n top: top + height / 2,\n })\n if (!eventPos) return\n\n const $cellPos = cellAround(view.state.doc.resolve(eventPos.pos))\n if (!$cellPos) return\n\n const map = TableMap.get($cellPos.node(-1))\n const tableStart = $cellPos.start(-1)\n const cellRect = map.findCell($cellPos.pos - tableStart)\n const rowIndex = cellRect.top\n const colIndex = cellRect.left\n\n return {\n rowIndex,\n colIndex,\n cellPos: $cellPos.pos,\n rowFirstCellPos: getCellPos(map, tableStart, rowIndex, 0),\n colFirstCellPos: getCellPos(map, tableStart, 0, colIndex),\n }\n}\n\nfunction getCellPos(\n map: TableMap,\n tableStart: number,\n rowIndex: number,\n colIndex: number,\n) {\n const cellIndex = getCellIndex(map, rowIndex, colIndex)\n const posInTable = map.map[cellIndex]\n return tableStart + posInTable\n}\n\nfunction getCellIndex(\n map: TableMap,\n rowIndex: number,\n colIndex: number,\n): number {\n return map.width * rowIndex + colIndex\n}\n","import {\n computed,\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { defineDOMEventHandler, type Editor } from '@prosekit/core'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { useEditorTyping } from '../../hooks/use-editor-typing.ts'\nimport { useScrolling } from '../../hooks/use-scrolling.ts'\nimport { useSelecting } from '../../hooks/use-selecting.ts'\n\nimport { createTableHandleStore, tableHandleStoreContext } from './store.ts'\nimport { useDrop } from './use-drop.ts'\nimport { getHoveringCell, isHoveringCellInfoEqual, type HoveringCellInfo } from './utils.ts'\n\nexport interface TableHandleRootProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const TableHandleRootPropsDeclaration: PropsDeclaration<TableHandleRootProps> = defineProps<TableHandleRootProps>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/**\n * @internal\n */\nexport function setupTableHandleRoot(\n host: HostElement,\n props: State<TableHandleRootProps>,\n): void {\n const getEditor = props.editor.get\n\n const getHoveringCellInfo = useHoveringCell(host, getEditor)\n const getTyping = useEditorTyping(host, getEditor)\n const getIsInTable = computed(() => !!getHoveringCellInfo())\n const getSelecting = useSelecting(host, getEditor, getIsInTable)\n const getScrolling = useScrolling(host)\n const getCanShow = computed(() => !getTyping() && !getSelecting() && !getScrolling())\n\n const store = createTableHandleStore(getHoveringCellInfo, getCanShow)\n tableHandleStoreContext.provide(host, store)\n\n useDrop(host, getEditor, store)\n}\n\nfunction useHoveringCell(\n host: HostElement,\n getEditor: () => Editor | null,\n): () => HoveringCellInfo | undefined {\n const hoveringCell = createSignal<HoveringCellInfo | undefined>(undefined)\n\n const extension = defineCellHoverHandler((curr: HoveringCellInfo | undefined) => {\n const prev = hoveringCell.get()\n if (isHoveringCellInfoEqual(prev, curr)) return\n hoveringCell.set(curr)\n })\n\n useEditorExtension(host, getEditor, extension)\n\n return hoveringCell.get\n}\n\nfunction defineCellHoverHandler(\n handler: (hoveringCell: HoveringCellInfo | undefined) => void,\n) {\n const pointerHandler = (view: EditorView, event: PointerEvent) => {\n const hoveringCell = getHoveringCell(view, event)\n return handler(hoveringCell)\n }\n return defineDOMEventHandler('pointerover', pointerHandler)\n}\n\nconst TableHandleRootElementBase: HostElementConstructor<TableHandleRootProps> = defineCustomElement(\n setupTableHandleRoot,\n TableHandleRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-root>` custom element.\n *\n * Properties: {@link TableHandleRootProps}\n */\nexport class TableHandleRootElement extends TableHandleRootElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleRootElement(): void {\n registerCustomElement('prosekit-table-handle-root', TableHandleRootElement)\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 { setupOverlayPopup } from '@aria-ui/elements/overlay'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleRowPopupProps {}\n\n/** @internal */\nexport const TableHandleRowPopupPropsDeclaration: PropsDeclaration<TableHandleRowPopupProps> = defineProps<TableHandleRowPopupProps>({})\n\n/** @internal */\nexport function setupTableHandleRowPopup(\n host: HostElement,\n _props: State<TableHandleRowPopupProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.rowOverlayStore\n setupOverlayPopup(host, getOverlayStore)\n}\n\nconst TableHandleRowPopupElementBase: HostElementConstructor<TableHandleRowPopupProps> = defineCustomElement(\n setupTableHandleRowPopup,\n TableHandleRowPopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-popup>` custom element.\n *\n * Properties: {@link TableHandleRowPopupProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when visible, `\"closed\"` otherwise |\n */\nexport class TableHandleRowPopupElement extends TableHandleRowPopupElementBase {}\n\n/** @internal */\nexport function registerTableHandleRowPopupElement(): void {\n registerCustomElement('prosekit-table-handle-row-popup', TableHandleRowPopupElement)\n}\n","import {\n computed,\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 { setupOverlayPositioner } from '@aria-ui/elements/overlay'\nimport type { Placement } from '@floating-ui/dom'\n\nimport { useHTMLElementAt } from '../../utils/use-html-element-at.ts'\n\nimport { SharedTableHandlePositionerPropsDeclaration, type SharedTableHandlePositionerProps } from './shared.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleRowPositionerProps extends Omit<SharedTableHandlePositionerProps, 'placement'> {\n /**\n * The placement of the popover, relative to the hovered table cell.\n *\n * @default \"left\"\n */\n placement: Placement\n}\n\n/** @internal */\nexport const TableHandleRowPositionerPropsDeclaration: PropsDeclaration<TableHandleRowPositionerProps> = defineProps<\n TableHandleRowPositionerProps\n>({\n ...SharedTableHandlePositionerPropsDeclaration,\n placement: { default: 'left', attribute: 'placement', type: 'string' },\n})\n\n/** @internal */\nexport function setupTableHandleRowPositioner(\n host: HostElement,\n props: State<TableHandleRowPositionerProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.rowOverlayStore\n setupOverlayPositioner(host, props, getOverlayStore)\n\n const getEditor = props.editor.get\n const getRowFirstCellPos = computed(() => getStore()?.getReferenceCell()?.rowFirstCellPos)\n const getReferenceCell = useHTMLElementAt(getEditor, getRowFirstCellPos)\n useEffect(host, () => {\n getOverlayStore()?.setAnchorElement(getReferenceCell())\n })\n}\n\nconst TableHandleRowPositionerElementBase: HostElementConstructor<TableHandleRowPositionerProps> = defineCustomElement(\n setupTableHandleRowPositioner,\n TableHandleRowPositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-positioner>` custom element.\n *\n * Properties: {@link TableHandleRowPositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when 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 TableHandleRowPositionerElement extends TableHandleRowPositionerElementBase {}\n\n/** @internal */\nexport function registerTableHandleRowPositionerElement(): void {\n registerCustomElement('prosekit-table-handle-row-positioner', TableHandleRowPositionerElement)\n}\n","import {\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 { MenuRootPropsDeclaration, setupMenuRoot, type MenuRootProps } from '@aria-ui/elements/menu'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleRowMenuRootProps extends MenuRootProps {}\n\n/** @internal */\nexport const TableHandleRowMenuRootPropsDeclaration: PropsDeclaration<TableHandleRowMenuRootProps> = defineProps<\n TableHandleRowMenuRootProps\n>(MenuRootPropsDeclaration)\n\n/** @internal */\nexport function setupTableHandleRowMenuRoot(\n host: HostElement,\n props: State<TableHandleRowMenuRootProps>,\n): void {\n setupMenuRoot(host, props)\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const open = props.open.get() || false\n const store = getStore?.()\n if (!store) return\n store.setIsRowMenuOpen(open)\n })\n}\n\nconst TableHandleRowMenuRootElementBase: HostElementConstructor<TableHandleRowMenuRootProps> = defineCustomElement(\n setupTableHandleRowMenuRoot,\n TableHandleRowMenuRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-menu-root>` custom element.\n *\n * Properties: {@link TableHandleRowMenuRootProps}\n */\nexport class TableHandleRowMenuRootElement extends TableHandleRowMenuRootElementBase {}\n\n/** @internal */\nexport function registerTableHandleRowMenuRootElement(): void {\n registerCustomElement('prosekit-table-handle-row-menu-root', TableHandleRowMenuRootElement)\n}\n","import {\n createSignal,\n defineCustomElement,\n defineProps,\n onMount,\n registerCustomElement,\n useEventListener,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'\nimport type { Editor } from '@prosekit/core'\nimport { selectTableRow, type defineTableCommands } from '@prosekit/extensions/table'\n\nimport { tableHandleStoreContext } from './store.ts'\nimport { useEmptyImage } from './use-empty-image.ts'\n\ntype TableCommandsExtension = ReturnType<typeof defineTableCommands>\n\nexport interface TableHandleRowMenuTriggerProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor<TableCommandsExtension> | null\n}\n\n/** @internal */\nexport const TableHandleRowMenuTriggerPropsDeclaration: PropsDeclaration<TableHandleRowMenuTriggerProps> = defineProps<\n TableHandleRowMenuTriggerProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/** @internal */\nexport function setupTableHandleRowMenuTrigger(\n host: HostElement,\n props: State<TableHandleRowMenuTriggerProps>,\n): void {\n const getEditor = props.editor.get\n const getStore = tableHandleStoreContext.consume(host)\n\n const triggerProps: State<MenuTriggerProps> = {\n disabled: createSignal(false),\n }\n setupMenuTrigger(host, triggerProps)\n\n useEventListener(host, 'pointerdown', () => {\n const editor = getEditor()\n const cellPos = getStore()?.getReferenceCell()?.cellPos\n if (!editor || !cellPos) return\n editor.exec(selectTableRow({ head: cellPos }))\n })\n\n onMount(host, () => {\n host.draggable = true\n })\n\n const getEmptyImage = useEmptyImage(host)\n\n useEventListener(host, 'dragstart', (event: DragEvent) => {\n const dataTransfer = event.dataTransfer\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move'\n const emptyImage = getEmptyImage()\n if (emptyImage) {\n dataTransfer.setDragImage(emptyImage, 0, 0)\n }\n }\n const store = getStore()\n if (!store) return\n const index = store.getReferenceCell()?.rowIndex\n\n if (index == null || index < 0) {\n console.warn('[prosekit] Invalid row index for drag operation:', index)\n event.preventDefault()\n return\n }\n\n const dndStore = store.dndStore\n\n dndStore.direction.set('row')\n dndStore.dragging.set(true)\n dndStore.draggingIndex.set(index)\n dndStore.startX.set(event.clientX)\n dndStore.startY.set(event.clientY)\n })\n}\n\nconst TableHandleRowMenuTriggerElementBase: HostElementConstructor<TableHandleRowMenuTriggerProps> = defineCustomElement(\n setupTableHandleRowMenuTrigger,\n TableHandleRowMenuTriggerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-menu-trigger>` custom element.\n *\n * Properties: {@link TableHandleRowMenuTriggerProps}\n */\nexport class TableHandleRowMenuTriggerElement extends TableHandleRowMenuTriggerElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleRowMenuTriggerElement(): void {\n registerCustomElement('prosekit-table-handle-row-menu-trigger', TableHandleRowMenuTriggerElement)\n}\n"],"mappings":";;;;;;;;;;;AAMA,SAAS,OAAa;AACtB,SAAS,aAAsB;AAC7B,QAAO;;AAET,SAAS,cAAuB;AAC9B,QAAO;;AAGT,IAAM,WAAN,MAAe;;kBACwB,aAAa,MAAM;mBACZ,aAA4B,MAAM;uBACrC,aAAa,GAAG;uBAChB,aAAa,GAAG;WAC5B,aAAa,GAAG;WAChB,aAAa,GAAG;gBACX,aAAa,GAAG;gBAChB,aAAa,GAAG;;;;;;AAkBpD,SAAgB,uBACd,qBACA,YACkB;CAClB,MAAM,mBAAmB,aAAa,MAAM;CAC5C,MAAM,gBAAgB,aAAa,MAAM;CAEzC,MAAM,uBAAgC;AACpC,SAAO,iBAAiB,KAAK,IAAI,cAAc,KAAK;;CAGtD,MAAM,oBAAoB,SAAwB;AAChD,gBAAc,IAAI,KAAK;;CAGzB,MAAM,uBAAuB,SAAwB;AACnD,mBAAiB,IAAI,KAAK;;CAG5B,MAAM,oBAAoB,aAA2C,KAAA,EAAU;CAE/E,IAAI,uBAAqD,KAAA;CAEzD,MAAM,mBAAmB,eAA6C;AACpE,MAAI,CAAC,YAAY,EAAE;AACjB,qBAAkB,IAAI,KAAA,EAAU;AAChC;;AAIF,MAAI,gBAAgB,CAClB,QAAO;AAGT,yBAAuB,qBAAqB;AAC5C,SAAO;GACP;CAEF,MAAM,UAAU,eAAwB;AACtC,SAAO,CAAC,CAAC,kBAAkB;GAC3B;CAEF,MAAM,oBAAoB,UAA2B;AACnD,MAAI,gBAAgB,CAClB,OAAM,gBAAgB;;CAI1B,MAAM,qBAAqB,mBACzB,SACA,MACA,YACA,aACA,iBACD;CACD,MAAM,kBAAkB,mBACtB,SACA,MACA,YACA,aACA,iBACD;AAED,QAAO;EACL,UAAU,IAAI,UAAU;EACxB;EACA;EACA;EACA;EACA;EACD;;;;;AAMH,MAAa,0BAAqD,cAAgC,8BAA8B;;ACpGhI,MAAa,yCAAwF,YAEnG,EAAE,CAAC;;AAGL,SAAgB,4BACd,MACA,QACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,KAAK;CACtD,MAAM,wBAAwB,UAAU,EAAE;AAC1C,mBAAkB,MAAM,gBAAgB;;AAG1C,MAAM,oCAAyF,oBAC7F,6BACA,uCACD;;;;;;;;;;;;AAaD,IAAa,gCAAb,cAAmD,kCAAkC;;AAGrF,SAAgB,wCAA8C;AAC5D,uBAAsB,sCAAsC,8BAA8B;;AC9C5F,SAAgB,iBACd,WACA,QAC+B;AAC/B,QAAO,eAAe;EACpB,MAAM,SAAS,WAAW;EAC1B,MAAM,MAAM,QAAQ;AACpB,MAAI,CAAC,UAAU,CAAC,IAAK;EAErB,MAAM,UADO,OAAO,KACC,QAAQ,IAAI;AACjC,MAAI,WAAW,cAAc,QAAQ,CAAE,QAAO;GAC9C;;;ACmCJ,MAAa,8CAAkG,YAE7G;CACA,GAAG;CACH,QAAQ;EAAE,SAAS;EAAM,WAAW;EAAO,MAAM;EAAQ;CACzD,OAAO;EAAE,SAAS;EAAO,WAAW;EAAO,MAAM;EAAW;CAC5D,MAAM;EAAE,SAAS;EAAO,WAAW;EAAO,MAAM;EAAQ;CACxD,OAAO;EAAE,SAAS;EAAO,WAAW;EAAO,MAAM;EAAW;CAC5D,MAAM;EAAE,SAAS;EAAM,WAAW;EAAO,MAAM;EAAW;CAC1D,QAAQ;EAAE,SAAS;EAAG,WAAW;EAAO,MAAM;EAAQ;CACvD,CAAC;;AC/BF,MAAa,8CAAkG,YAE7G;CACA,GAAG;CACH,WAAW;EAAE,SAAS;EAAO,WAAW;EAAa,MAAM;EAAU;CACtE,CAAC;;AAGF,SAAgB,iCACd,MACA,OACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,KAAK;CACtD,MAAM,wBAAwB,UAAU,EAAE;AAC1C,wBAAuB,MAAM,OAAO,gBAAgB;CAEpD,MAAM,YAAY,MAAM,OAAO;CAE/B,MAAM,mBAAmB,iBAAiB,WADZ,eAAe,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,CAClB;AAC3E,WAAU,YAAY;AACpB,mBAAiB,EAAE,iBAAiB,kBAAkB,CAAC;GACvD;;AAGJ,MAAM,yCAAmG,oBACvG,kCACA,4CACD;;;;;;;;;;;;;;;;;;;;AAqBD,IAAa,qCAAb,cAAwD,uCAAuC;;AAG/F,SAAgB,6CAAmD;AACjE,uBAAsB,2CAA2C,mCAAmC;;;AChEtG,MAAa,4CAA8F,YAEzG,yBAAyB;;AAG3B,SAAgB,+BACd,MACA,OACM;AACN,eAAc,MAAM,MAAM;CAC1B,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAEtD,WAAU,YAAY;EACpB,MAAM,OAAO,MAAM,KAAK,KAAK,IAAI;EACjC,MAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,MAAO;AACZ,QAAM,oBAAoB,KAAK;GAC/B;;AAGJ,MAAM,uCAA+F,oBACnG,gCACA,0CACD;;;;;;AAOD,IAAa,mCAAb,cAAsD,qCAAqC;;AAG3F,SAAgB,2CAAiD;AAC/D,uBAAsB,0CAA0C,iCAAiC;;;;;;;;;;;;ACvCnG,SAAgB,cACd,MACoC;CACpC,IAAI;AAEJ,WAAU,YAAY;AACpB,UAAQ,IAAI,MAAM,GAAG,EAAE;AACvB,QAAM,MAAM;AAEZ,eAAa;AACX,UAAO,QAAQ;AACf,WAAQ,KAAA;;GAEV;AAEF,cAAa;;;ACGf,MAAa,+CAAoG,YAE/G,EACA,QAAQ;CAAE,SAAS;CAAM,WAAW;CAAO,MAAM;CAAQ,EAC1D,CAAC;;AAGF,SAAgB,kCACd,MACA,OACM;CACN,MAAM,YAAY,MAAM,OAAO;CAC/B,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAKtD,kBAAiB,MAH6B,EAC5C,UAAU,aAAa,MAAM,EAC9B,CACmC;AAEpC,kBAAiB,MAAM,qBAAqB;EAC1C,MAAM,SAAS,WAAW;EAC1B,MAAM,UAAU,UAAU,EAAE,kBAAkB,EAAE;AAChD,MAAI,CAAC,UAAU,CAAC,QAAS;AACzB,SAAO,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC,CAAC;GACjD;AAEF,SAAQ,YAAY;AAClB,OAAK,YAAY;GACjB;CAEF,MAAM,gBAAgB,cAAc,KAAK;AAEzC,kBAAiB,MAAM,cAAc,UAAqB;EACxD,MAAM,eAAe,MAAM;AAC3B,MAAI,cAAc;AAChB,gBAAa,gBAAgB;GAC7B,MAAM,aAAa,eAAe;AAClC,OAAI,WACF,cAAa,aAAa,YAAY,GAAG,EAAE;AAE7C,gBAAa,QAAQ,4CAA4C,GAAG;;EAEtE,MAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO;EACZ,MAAM,QAAQ,MAAM,kBAAkB,EAAE;AAExC,MAAI,SAAS,QAAQ,QAAQ,GAAG;AAC9B,WAAQ,KAAK,uDAAuD,MAAM;AAC1E,SAAM,gBAAgB;AACtB;;EAGF,MAAM,WAAW,MAAM;AACvB,WAAS,UAAU,IAAI,MAAM;AAC7B,WAAS,SAAS,IAAI,KAAK;AAC3B,WAAS,cAAc,IAAI,MAAM;AACjC,WAAS,OAAO,IAAI,MAAM,QAAQ;AAClC,WAAS,OAAO,IAAI,MAAM,QAAQ;GAClC;;AAGJ,MAAM,0CAAqG,oBACzG,mCACA,6CACD;;;;;;AAOD,IAAa,sCAAb,cAAyD,wCAAwC;;;;AAKjG,SAAgB,8CAAoD;AAClE,uBAAsB,6CAA6C,oCAAoC;;ACvFzG,SAAgB,mBACd,MACA,WACA,QACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAEtD,WAAU,YAAY;EACpB,MAAM,OAAO,kBAAkB,WAAW,CAAC;AAC3C,MAAI,CAAC,KAAM;EAEX,MAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO;EAEZ,MAAM,WAAW,MAAM;EAEvB,MAAM,WAAW,SAAS,SAAS,KAAK;EACxC,MAAM,YAAY,SAAS,UAAU,KAAK;AAE1C,OAAK,QAAQ,YAAY;AACzB,OAAK,QAAQ,WAAW,SAAS,UAAU;EAE3C,MAAM,gBAAgB,SAAS,cAAc,KAAK;EAElD,MAAM,cAAc,kBAAkB,MAAM,MAAM,kBAAkB,EAAE,SAAS,eAAe,UAAU;AACxG,MAAI,CAAC,YAAa;EAClB,MAAM,EAAE,OAAO,SAAS;AAExB,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;AAEF,MAAI,CAAC,SAAU;EAEf,IAAI,YAAY;AAEX,kBAAgB,MAAM,MAAM;GAC/B,WAAW,cAAc,QAAQ,UAAU;GAC3C,YAAY,CACV,QAAQ,EAAE,YAAY;AACpB,QAAI,cAAc,MAChB,QAAO,CAAC,MAAM,UAAU;AAE1B,WAAO,CAAC,MAAM,UAAU;KACxB,CACH;GACF,CAAC,CAAC,MAAM,EAAE,GAAG,QAAQ;AACpB,OAAI,UAAW;AACf,gBAAa,MAAM;IACjB,MAAM,GAAG,EAAE;IACX,KAAK,GAAG,EAAE;IACX,CAAC;IACF;AAEF,eAAa;AACX,eAAY;;GAEd;;AAGJ,SAAS,iBAAiB,MAAkB,KAA2C;CACrF,MAAM,MAAM,KAAK,SAAS,IAAI,CAAC;AAC/B,KAAI,CAAC,IAAK;AAGV,SAFgB,cAAc,IAAI,GAAG,MAAM,IAAI,gBACxB,QAAQ,QAAQ,IACvB,KAAA;;AAGlB,SAAS,sBAAsB,OAAyB,OAAe,WAA4D;AACjI,KAAI,cAAc,MAGhB,QAFY,MAAM,iBAAiB,KAAK,CAAC,QACvB,cAAoC,SAAS,IAChD,KAAA;KAIf,QAFY,MAAM,cAAc,KAAK,EACnB,iBAAuC,SAAS,CAAC,UACpD,KAAA;;AAInB,SAAgB,kBACd,MACA,SACA,eACA,WACqE;AACrE,KAAI,WAAW,KAAM;CACrB,MAAM,QAAQ,iBAAiB,MAAM,QAAQ;AAC7C,KAAI,CAAC,MAAO;CACZ,MAAM,OAAO,sBAAsB,OAAO,eAAe,UAAU;AACnE,KAAI,CAAC,KAAM;AACX,QAAO;EAAE;EAAO;EAAM;;;;;;AC9GxB,SAAgB,iBAAoC,SAAY,YAAY,OAAoB;CAC9F,MAAM,gBAAgB,QAAQ,UAAU,KAAK;AAE7C,QAAO,CAAC,eADM,eAAe,SAAS,eAAe,UAAU,CAClC;;;;;;AAO/B,SAAgB,aAAgC,SAAY,YAAY,OAAoB;CAC1F,MAAM,gBAAgB,QAAQ,WAAW;AAEzC,QAAO,CAAC,eADM,WAAW,SAAS,eAAe,UAAU,CAC9B;;AAG/B,SAAS,eAAe,QAAiB,QAAiB,WAA4B;CACpF,MAAM,UAAU,CAAC,OAAO;CACxB,MAAM,UAAU,CAAC,OAAO;CACxB,MAAM,SAAmB,EAAE;AAE3B,QAAO,QAAQ,SAAS,KAAK,QAAQ,WAAW,QAAQ,QAAQ;EAC9D,MAAM,SAAS,QAAQ,KAAK;EAC5B,MAAM,SAAS,QAAQ,KAAK;AAE5B,MAAI,CAAC,UAAU,CAAC,OACd;EAGF,MAAM,QAAQ,WAAW,QAAQ,QAAQ,UAAU;AACnD,MAAI,MACF,QAAO,KAAK,MAAM;AAGpB,UAAQ,KAAK,GAAG,OAAO,SAAS;AAChC,UAAQ,KAAK,GAAG,OAAO,SAAS;;AAGlC,QAAO,OAAO,KAAK,KAAK;;AAG1B,SAAS,WAAW,QAAiB,QAAiB,WAA4B;AAChF,KAAI,CAAC,UAAU,CAAC,OACd,QAAO;CAGT,MAAM,OAAO,OAAO,eAAe;AACnC,KAAI,CAAC,KACH,QAAO;CAIT,MAAM,cAAc,KAAK,iBAAiB,OAAO;CACjD,MAAM,cAAe,OAAoD;AAEzE,KAAI,CAAC,eAAe,CAAC,YACnB,QAAO;AAGT,MAAK,MAAM,OAAO,YAChB,aAAY,YACV,KACA,YAAY,iBAAiB,IAAI,EAIjC,YAAY,cAAe,YAAY,oBAAoB,IAAI,IAAI,GACpE;CAGH,MAAM,SAAmB,EAAE;AAC3B,MAAK,MAAM,kBAAkB,CAAC,WAAW,SAAS,EAAE;EAClD,MAAM,oBAAoB,KAAK,iBAAiB,QAAQ,eAAe;EACvE,MAAM,oBAAoB,KAAK,iBAAiB,QAAQ,eAAe;AAEvE,MAAI,CAAC,kBACH;EAGF,MAAM,UAAU,kBAAkB,iBAAiB,UAAU;AAG7D,MAAI,EAFqB,WAAW,YAAY,UAAU,YAAY,UAGpE;EAGF,MAAM,WAAqB,EAAE;AAC7B,OAAK,MAAM,YAAY,mBAAmB;GACxC,MAAM,cAAc,kBAAkB,iBAAiB,SAAS;GAChE,MAAM,iBAAiB,kBAAkB,oBAAoB,SAAS;GACtE,MAAM,cAAc,kBAAkB,iBAAiB,SAAS;GAChE,MAAM,iBAAiB,kBAAkB,oBAAoB,SAAS;AACtE,OAAI,gBAAgB,eAAe,mBAAmB,eACpD,UAAS,KAAK,GAAG,SAAS,IAAI,cAAc,iBAAiB,gBAAgB,GAAG,GAAG;;EAIvF,MAAM,kBAAkB,wBAAwB,OAAO;AACvD,SAAO,UAAU,IAAI,gBAAgB;AACrC,SAAO,KAAK,IAAI,kBAAkB,eAAe,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI;;AAG/E,QAAO,OAAO,KAAK,KAAK;;AC1G1B,MAAa,sBAAqC,WAAW;AAC3D,KAAI;AACF,SAAO,IAAI,SAAS,oBAAoB,gCAAgC;SAClE;AACN,SAAO;;EAET;;;;;;;ACAF,SAAgB,UAAU,OAAsB,SAAqC;AACnF,KAAI,qBAAqB,EAAE;EACzB,MAAM,qBAAqB,IAAI,WAAW;AAE1C,SAAO,sBAAsB,MAAM,GADf,UAAU,IACoB,iBAAiB,kBAAkB;;;ACZzF,SAAgB,4BAA4B,SAA0C;CACpF,IAAI,UAA8B;AAElC,QAAO,SAAS;EAEd,MAAM,mBADQ,QAAQ,cAAc,aAAa,iBAAiB,QAAQ,GAC3C;AAE/B,MACE,mBACG,oBAAoB,iBAEpB,oBAAoB,mBAEvB,QAAO;AAGT,YAAU,QAAQ;;;ACdtB,SAAgB,YAAY,WAAwB,WAAyB;AAC3E,KAAI,CAAC,UACH;CAGF,MAAM,QADW,YAAY,UAAU,CAChB,cAAc,QAAQ;AAC7C,OAAM,cAAc;AACpB,WAAU,YAAY,MAAM;;ACH9B,SAAgB,gBAAgB,aAAgC;AAC9D,QAAO,YAAY,WACjB,aAAY,YAAY,YAAY,WAAW;;AAInD,SAAgB,iBACd,OACA,aACA,OACA,WACM;AACN,iBAAgB,YAAY;CAE5B,MAAM,CAAC,cAAc,qBAAqB,aAAa,MAAM;AAC7D,aAAY,aAAa,kBAAkB;AAC3C,WAAU,aAAa;CAEvB,MAAM,YAAY,MAAM,cAAc,QAAQ;CAC9C,MAAM,CAAC,kBAAkB,yBAAyB,YAC9C,aAAa,UAAU,GACvB,CAAC,MAAM,cAAc,cAAc,QAAQ,EAAE,GAAG;AACpD,aAAY,aAAa,sBAAsB;AAC/C,WAAU,iBAAiB;CAG3B,MAAM,kBAAkB,4BAA4B,MAAM;AAC1D,KAAI,iBAAiB;EACnB,MAAM,6BAA6B,UAAU,iBAAiB,GAAI;AAClE,MAAI,2BACF,cAAa,cAAc,EAAE,iBAAiB,4BAA4B,CAAC;;AAI/E,cAAa,YAAY,iBAAiB;AAC1C,aAAY,YAAY,aAAa;CAErC,MAAM,OAAO,MAAM,iBAAiB,KAAK;AAEzC,KAAI,cAAc,OAAO;EACvB,MAAM,MAAM,KAAK;EACjB,MAAM,CAAC,YAAY,mBAAmB,iBAAiB,IAAI;AAC3D,cAAY,aAAa,gBAAgB;AACzC,mBAAiB,YAAY,WAAW;OAExC,MAAK,SAAS,QAAQ;EACpB,MAAM,CAAC,YAAY,mBAAmB,aAAa,IAAI;AACvD,cAAY,aAAa,gBAAgB;AACzC,YAAU,WAAW;EAErB,MAAM,OADQ,IAAI,iBAAiB,SAAS,CACzB;AACnB,MAAI,MAAM;GACR,MAAM,CAAC,aAAa,oBAAoB,iBAAiB,KAAK;AAC9D,eAAY,aAAa,iBAAiB;AAC1C,cAAW,YAAY,YAAY;AACnC,oBAAiB,YAAY,WAAW;;GAE1C;;AAIN,SAAS,UAAU,SAAsB;AACvC,cAAa,SAAS;EACpB,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WAAW;EACX,UAAU;EACV,WAAW;EACZ,CAAC;;;AC9CJ,MAAa,yCAAwF,YAEnG,EACA,QAAQ;CAAE,SAAS;CAAM,WAAW;CAAO,MAAM;CAAQ,EAC1D,CAAC;;;;AAKF,SAAgB,4BACd,MACA,OACM;CACN,MAAM,YAAY,MAAM,OAAO;AAE/B,WAAU,YAAY;AACpB,eAAa,MAAM;GACjB,UAAU;GACV,eAAe;GAChB,CAAC;GACF;AAEF,oBAAmB,MAAM,WAAW,sBAAsB;AAE1D,0BAAyB,MAAM,UAAU;;AAG3C,SAAS,sBAAsB,EAAE,MAAM,WAAW,UAAU,OAAO,MAAM,iBAAqC;AAC5G,cAAa,MAAM,EACjB,SAAS,WAAW,UAAU,QAC/B,CAAC;AAEF,KAAI,CAAC,UAAU;AACb,kBAAgB,KAAK;AACrB;;AAGF,kBAAiB,OAAO,MAAM,eAAe,UAAU;CAEvD,MAAM,YAAY,MAAM,uBAAuB;CAC/C,MAAM,WAAW,KAAK,uBAAuB;AAE7C,KAAI,cAAc,MAChB,cAAa,MAAM;EACjB,OAAO,GAAG,SAAS,MAAM;EACzB,QAAQ,GAAG,UAAU,OAAO;EAC7B,CAAC;AAGJ,KAAI,cAAc,MAChB,cAAa,MAAM;EACjB,OAAO,GAAG,UAAU,MAAM;EAC1B,QAAQ,GAAG,SAAS,OAAO;EAC5B,CAAC;;AAIN,SAAS,yBAAyB,MAAmB,WAAsC;CACzF,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAEtD,WAAU,YAAY;EACpB,MAAM,OAAO,kBAAkB,WAAW,CAAC;AAC3C,MAAI,CAAC,KAAM;EAEX,MAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO;EACZ,MAAM,WAAW,MAAM;AAEvB,MAAI,CAAC,SAAS,SAAS,KAAK,CAAE;EAE9B,MAAM,gBAAgB,SAAS,cAAc,KAAK;EAClD,MAAM,YAAY,SAAS,UAAU,KAAK;EAC1C,MAAM,IAAI,SAAS,EAAE,KAAK;EAC1B,MAAM,IAAI,SAAS,EAAE,KAAK;EAE1B,MAAM,cAAc,kBAAkB,MAAM,MAAM,kBAAkB,EAAE,SAAS,eAAe,UAAU;AACxG,MAAI,CAAC,YAAa;EAClB,MAAM,EAAE,SAAS;EAEjB,IAAI,YAAY;AAEX,kBACH,kBAAkB,MAAM,GAAG,EAAE,EAC7B,MACA,EAAE,WAAW,cAAc,QAAQ,UAAU,UAAU,CACxD,CAAC,MAAM,EAAE,GAAG,QAAQ;AACnB,OAAI,UAAW;AAEf,OAAI,cAAc,OAAO;AACvB,iBAAa,MAAM,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;AACrC;;AAGF,OAAI,cAAc,OAAO;AACvB,iBAAa,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,CAAC;AACtC;;IAEF;AAEF,eAAa;AACX,eAAY;;GAEd;;AAGJ,SAAS,kBAAkB,MAA4B,GAAW,GAA6B;AAC7F,QAAO;EACL,gBAAgB;EAChB,6BAA6B;GAC3B,MAAM,OAAO,KAAK,uBAAuB;AACzC,UAAO;IACL,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,OAAO,IAAI,KAAK,QAAQ;IACxB,QAAQ,IAAI,KAAK,SAAS;IAC1B,KAAK,IAAI,KAAK,SAAS;IACvB,MAAM,IAAI,KAAK,QAAQ;IACvB,GAAG,IAAI,KAAK,QAAQ;IACpB,GAAG,IAAI,KAAK,SAAS;IACtB;;EAEJ;;AAGH,MAAM,oCAAyF,oBAC7F,6BACA,uCACD;;;;;;AAOD,IAAa,gCAAb,cAAmD,kCAAkC;;;;AAKrF,SAAgB,wCAA8C;AAC5D,uBAAsB,sCAAsC,8BAA8B;;ACzK5F,SAAS,oBACP,UACA,SACA,MAC+B;CAC/B,MAAM,YAAY,SAAS,MAAM,SAAS;CAC1C,MAAM,UAAU,SAAS,MAAM,UAAU;CACzC,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAM,QAAQ,SAAS,WAAW,IAAI,UAAU;EAC9C,MAAM,OAAO,GAAG,uBAAuB;EACvC,MAAM,gBAAgB,KAAK;EAC3B,MAAM,cAAc,KAAK;AAGzB,MAAI,iBAAiB,WAAW,WAAW,YAAa,QAAO;AAE/D,MAAI,UAAU,aAAa,UAAU,YAAa,QAAO;AAEzD,MAAI,UAAU,KAAK,UAAU,cAAe,QAAO;AAEnD,SAAO;GACP;AAEF,QAAO,SAAS,IAAI,CAAC,SAAS,QAAQ,MAAM,GAAG,KAAA;;AAGjD,SAAgB,kBACd,OACA,UAC+C;CAC/C,MAAM,WAAW,MAAM,cAAc,KAAK;AAC1C,KAAI,CAAC,SAAU;AAEf,QAAO,oBADO,MAAM,KAAK,SAAS,SAAS,EACT,UAAU,IAAI;;AAGlD,SAAgB,eACd,OACA,UAC+C;AAE/C,QAAO,oBADM,MAAM,KAAK,MAAM,iBAAiB,KAAK,CAAC,EACpB,UAAU,IAAI;;ACnBjD,MAAM,eAAe;;AAWrB,MAAa,2CAA4F,YAEvG,EACA,QAAQ;CAAE,SAAS;CAAM,WAAW;CAAO,MAAM;CAAQ,EAC1D,CAAC;;;;AAKF,SAAgB,8BACd,MACA,OACM;CACN,MAAM,YAAY,MAAM,OAAO;AAE/B,WAAU,YAAY;AACpB,eAAa,MAAM;GACjB,eAAe;GACf,UAAU;GACX,CAAC;GACF;AAEF,oBAAmB,MAAM,WAAW,wBAAwB;AAE5D,4BAA2B,MAAM,WAAW,aAAa;;AAG3D,SAAS,wBAAwB,EAAE,MAAM,WAAW,UAAU,SAA6B;AACzF,cAAa,MAAM,EACjB,SAAS,WAAW,UAAU,QAC/B,CAAC;CAEF,MAAM,YAAY,MAAM,uBAAuB;AAE/C,KAAI,cAAc,MAChB,cAAa,MAAM;EACjB,OAAO,GAAG,aAAa;EACvB,QAAQ,GAAG,UAAU,OAAO;EAC7B,CAAC;AAGJ,KAAI,cAAc,MAChB,cAAa,MAAM;EACjB,OAAO,GAAG,UAAU,MAAM;EAC1B,QAAQ,GAAG,aAAa;EACzB,CAAC;;AAIN,SAAS,2BAA2B,MAAmB,WAAgC,aAA2B;CAChH,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAEtD,WAAU,YAAY;EACpB,MAAM,OAAO,kBAAkB,WAAW,CAAC;AAC3C,MAAI,CAAC,KAAM;EAEX,MAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO;EAEZ,MAAM,WAAW,MAAM;AACvB,MAAI,CAAC,SAAS,SAAS,KAAK,CAAE;EAE9B,MAAM,gBAAgB,SAAS,cAAc,KAAK;EAClD,MAAM,YAAY,SAAS,UAAU,KAAK;EAC1C,MAAM,IAAI,SAAS,EAAE,KAAK;EAC1B,MAAM,IAAI,SAAS,EAAE,KAAK;EAE1B,MAAM,cAAc,kBAAkB,MAAM,MAAM,kBAAkB,EAAE,SAAS,eAAe,UAAU;AACxG,MAAI,CAAC,YAAa;EAClB,MAAM,EAAE,UAAU;EAElB,IAAI,YAAY;EAChB,MAAM,gBAAgB;AACpB,eAAY;;AAGd,MAAI,cAAc,OAAO;GACvB,MAAM,MAAM,SAAS,OAAO,KAAK,GAAG,IAAI,SAAS;GACjD,MAAM,iBAAiB,kBAAkB,OAAO,EAAE;AAElD,OAAI,gBAAgB;IAClB,MAAM,CAAC,KAAK,SAAS;AACrB,aAAS,cAAc,IAAI,MAAM;AAC5B,oBAAgB,KAAK,MAAM;KAC9B,WAAW,QAAQ,SAAS,SAAS;KACrC,YAAY,CAAC,OAAO,QAAQ,SAAS,KAAK,cAAc,EAAE,CAAC;KAC5D,CAAC,CAAC,MAAM,EAAE,QAAQ;AACjB,SAAI,UAAW;AACf,kBAAa,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,CAAC;MACtC;;AAGJ,UAAO;;AAGT,MAAI,cAAc,OAAO;GACvB,MAAM,MAAM,SAAS,OAAO,KAAK,GAAG,IAAI,OAAO;GAC/C,MAAM,cAAc,eAAe,OAAO,EAAE;AAE5C,OAAI,aAAa;IACf,MAAM,CAAC,KAAK,SAAS;AACrB,aAAS,cAAc,IAAI,MAAM;AAC5B,oBAAgB,KAAK,MAAM;KAC9B,WAAW,QAAQ,OAAO,QAAQ;KAClC,YAAY,CAAC,OAAO,QAAQ,OAAO,KAAK,cAAc,EAAE,CAAC;KAC1D,CAAC,CAAC,MAAM,EAAE,QAAQ;AACjB,SAAI,UAAW;AACf,kBAAa,MAAM,EAAE,KAAK,GAAG,EAAE,KAAK,CAAC;MACrC;;AAGJ,UAAO;;GAET;;AAGJ,MAAM,sCAA6F,oBACjG,+BACA,yCACD;;;;;;AAOD,IAAa,kCAAb,cAAqD,oCAAoC;;;;AAKzF,SAAgB,0CAAgD;AAC9D,uBAAsB,wCAAwC,gCAAgC;;ACjKhG,SAAgB,gBACd,MACA,WACe;CACf,MAAM,SAAS,aAAa,MAAM;AAWlC,oBAAmB,MAAM,WATP,MAChB,sBAAsB,kBAAkB;AACtC,SAAO,IAAI,KAAK;GAChB,EACF,sBAAsB,qBAAqB;AACzC,SAAO,IAAI,MAAM;GACjB,CACH,CAE6C;AAE9C,QAAO,OAAO;;;;;;ACbhB,SAAgB,aACd,MACA,WACA,YACe;CACf,MAAM,YAAY,aAAa,MAAM;CACrC,MAAM,gBAAgB,aAAa,MAAM;AAEzC,WAAU,YAAY;AACpB,MAAI,CAAC,YAAY,CAAE;EAEnB,MAAM,OAAO,kBAAkB,WAAW,CAAC;AAC3C,MAAI,CAAC,KAAM;EAEX,MAAM,EAAE,KAAK,SAAS;AACtB,MAAI,CAAC,KAAM;EAEX,MAAM,0BAA0B;AAC9B,aAAU,IAAI,KAAK;AACnB,iBAAc,IAAI,KAAK;;EAEzB,MAAM,wBAAwB;AAC5B,iBAAc,IAAI,MAAM;;EAE1B,MAAM,wBAAwB;AAC5B,OAAI,CAAC,cAAc,KAAK,CACtB,WAAU,IAAI,MAAM;;AAIxB,MAAI,iBAAiB,eAAe,kBAAkB;AACtD,OAAK,iBAAiB,aAAa,gBAAgB;AACnD,OAAK,iBAAiB,eAAe,gBAAgB;AAErD,eAAa;AACX,OAAI,oBAAoB,eAAe,kBAAkB;AACzD,QAAK,oBAAoB,aAAa,gBAAgB;AACtD,QAAK,oBAAoB,eAAe,gBAAgB;;GAE1D;AAEF,QAAO,UAAU;;AC1CnB,SAAgB,QACd,MACA,WACA,OACM;CACN,MAAM,oBAAoB,MAAM;CAChC,MAAM,cAAc,eAAe,aAAa,CAAC,SAAS,KAAK,CAAC;AAEhE,WAAU,YAAY;EACpB,MAAM,OAAO,kBAAkB,WAAW,CAAC;AAC3C,MAAI,CAAC,QAAQ,CAAC,KAAK,SAAU;EAE7B,MAAM,gBAAgB,KAAK,KAAK;AAChC,MAAI,CAAC,cAAe;EAEpB,MAAM,mBAAmB;AACvB,OAAI,CAAC,aAAa,CAAE;GACpB,MAAM,SAAS,WAAW;AAC1B,OAAI,CAAC,OAAQ;GAEb,MAAM,WAAW,aAAa;GAE9B,MAAM,gBAAgB,SAAS,cAAc,KAAK;GAClD,MAAM,gBAAgB,SAAS,cAAc,KAAK;GAClD,MAAM,YAAY,SAAS,UAAU,KAAK;AAE1C,OAAI,gBAAgB,KAAK,gBAAgB,GAAG;AAC1C,YAAQ,KAAK,oCAAoC;KAAE;KAAe;KAAe,CAAC;AAClF;;AAGF,OAAI,cAAc,OAAO;AACvB,WAAO,KAAK,aAAa;KAAE,MAAM;KAAe,IAAI;KAAe,CAAC,CAAC;AACrE;;AAEF,OAAI,cAAc,OAAO;AACvB,WAAO,KAAK,gBAAgB;KAAE,MAAM;KAAe,IAAI;KAAe,CAAC,CAAC;AACxE;;;EAIJ,MAAM,kBAAkB,UAAqB;AAC3C,OAAI,CAAC,aAAa,CAAE;AACpB,SAAM,gBAAgB;GACtB,MAAM,WAAW,aAAa;AAC9B,YAAS,SAAS,IAAI,KAAK;AAC3B,YAAS,EAAE,IAAI,MAAM,QAAQ;AAC7B,YAAS,EAAE,IAAI,MAAM,QAAQ;;EAG/B,MAAM,sBAAsB;AAC1B,OAAI,CAAC,aAAa,CAAE;AACH,gBAAa,CACrB,SAAS,IAAI,MAAM;;AAG9B,gBAAc,iBAAiB,YAAY,eAAe;AAC1D,gBAAc,iBAAiB,QAAQ,WAAW;AAClD,gBAAc,iBAAiB,WAAW,cAAc;AACxD,eAAa;AACX,iBAAc,oBAAoB,YAAY,eAAe;AAC7D,iBAAc,oBAAoB,QAAQ,WAAW;AACrD,iBAAc,oBAAoB,WAAW,cAAc;;GAE7D;;AC7DJ,SAAgB,wBACd,GACA,GACS;AACT,KAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,KAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,QACE,EAAE,aAAa,EAAE,YACd,EAAE,aAAa,EAAE,YACjB,EAAE,YAAY,EAAE,WAChB,EAAE,oBAAoB,EAAE,mBACxB,EAAE,oBAAoB,EAAE;;;;;;;AAS/B,SAAS,cAAc,QAAgD;AACrE,QAAO,UAAU,OAAO,YAAY,QAAQ,OAAO,YAAY,KAC7D,UAAS,OAAO,WAAW,SAAS,cAAc,GAC9C,OACC,OAAO;AAEd,QAAO;;AAGT,SAAgB,gBACd,MACA,OAC8B;CAC9B,MAAM,UAAU,cAAc,MAAM,OAA6B;AACjE,KAAI,CAAC,QAAS;CAEd,MAAM,EAAE,MAAM,KAAK,OAAO,WAAW,QAAQ,uBAAuB;CACpE,MAAM,WAAW,KAAK,YAAY;EAIhC,MAAM,OAAO,QAAQ;EACrB,KAAK,MAAM,SAAS;EACrB,CAAC;AACF,KAAI,CAAC,SAAU;CAEf,MAAM,WAAW,WAAW,KAAK,MAAM,IAAI,QAAQ,SAAS,IAAI,CAAC;AACjE,KAAI,CAAC,SAAU;CAEf,MAAM,MAAM,SAAS,IAAI,SAAS,KAAK,GAAG,CAAC;CAC3C,MAAM,aAAa,SAAS,MAAM,GAAG;CACrC,MAAM,WAAW,IAAI,SAAS,SAAS,MAAM,WAAW;CACxD,MAAM,WAAW,SAAS;CAC1B,MAAM,WAAW,SAAS;AAE1B,QAAO;EACL;EACA;EACA,SAAS,SAAS;EAClB,iBAAiB,WAAW,KAAK,YAAY,UAAU,EAAE;EACzD,iBAAiB,WAAW,KAAK,YAAY,GAAG,SAAS;EAC1D;;AAGH,SAAS,WACP,KACA,YACA,UACA,UACA;CACA,MAAM,YAAY,aAAa,KAAK,UAAU,SAAS;AAEvD,QAAO,aADY,IAAI,IAAI;;AAI7B,SAAS,aACP,KACA,UACA,UACQ;AACR,QAAO,IAAI,QAAQ,WAAW;;;ACzDhC,MAAa,kCAA0E,YAAkC,EACvH,QAAQ;CAAE,SAAS;CAAM,WAAW;CAAO,MAAM;CAAQ,EAC1D,CAAC;;;;AAKF,SAAgB,qBACd,MACA,OACM;CACN,MAAM,YAAY,MAAM,OAAO;CAE/B,MAAM,sBAAsB,gBAAgB,MAAM,UAAU;CAC5D,MAAM,YAAY,gBAAgB,MAAM,UAAU;CAElD,MAAM,eAAe,aAAa,MAAM,WADnB,eAAe,CAAC,CAAC,qBAAqB,CAAC,CACI;CAChE,MAAM,eAAe,aAAa,KAAK;CAGvC,MAAM,QAAQ,uBAAuB,qBAFlB,eAAe,CAAC,WAAW,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,CAEhB;AACrE,yBAAwB,QAAQ,MAAM,MAAM;AAE5C,SAAQ,MAAM,WAAW,MAAM;;AAGjC,SAAS,gBACP,MACA,WACoC;CACpC,MAAM,eAAe,aAA2C,KAAA,EAAU;AAQ1E,oBAAmB,MAAM,WANP,wBAAwB,SAAuC;AAE/E,MAAI,wBADS,aAAa,KAAK,EACG,KAAK,CAAE;AACzC,eAAa,IAAI,KAAK;GACtB,CAE4C;AAE9C,QAAO,aAAa;;AAGtB,SAAS,uBACP,SACA;CACA,MAAM,kBAAkB,MAAkB,UAAwB;AAEhE,SAAO,QADc,gBAAgB,MAAM,MAAM,CACrB;;AAE9B,QAAO,sBAAsB,eAAe,eAAe;;AAG7D,MAAM,6BAA2E,oBAC/E,sBACA,gCACD;;;;;;AAOD,IAAa,yBAAb,cAA4C,2BAA2B;;;;AAKvE,SAAgB,iCAAuC;AACrD,uBAAsB,8BAA8B,uBAAuB;;;ACvF7E,MAAa,sCAAkF,YAAsC,EAAE,CAAC;;AAGxI,SAAgB,yBACd,MACA,QACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,KAAK;CACtD,MAAM,wBAAwB,UAAU,EAAE;AAC1C,mBAAkB,MAAM,gBAAgB;;AAG1C,MAAM,iCAAmF,oBACvF,0BACA,oCACD;;;;;;;;;;;;AAaD,IAAa,6BAAb,cAAgD,+BAA+B;;AAG/E,SAAgB,qCAA2C;AACzD,uBAAsB,mCAAmC,2BAA2B;;;ACnBtF,MAAa,2CAA4F,YAEvG;CACA,GAAG;CACH,WAAW;EAAE,SAAS;EAAQ,WAAW;EAAa,MAAM;EAAU;CACvE,CAAC;;AAGF,SAAgB,8BACd,MACA,OACM;CACN,MAAM,WAAW,wBAAwB,QAAQ,KAAK;CACtD,MAAM,wBAAwB,UAAU,EAAE;AAC1C,wBAAuB,MAAM,OAAO,gBAAgB;CAEpD,MAAM,YAAY,MAAM,OAAO;CAE/B,MAAM,mBAAmB,iBAAiB,WADf,eAAe,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,CAClB;AACxE,WAAU,YAAY;AACpB,mBAAiB,EAAE,iBAAiB,kBAAkB,CAAC;GACvD;;AAGJ,MAAM,sCAA6F,oBACjG,+BACA,yCACD;;;;;;;;;;;;;;;;;;;;AAqBD,IAAa,kCAAb,cAAqD,oCAAoC;;AAGzF,SAAgB,0CAAgD;AAC9D,uBAAsB,wCAAwC,gCAAgC;;;AChEhG,MAAa,yCAAwF,YAEnG,yBAAyB;;AAG3B,SAAgB,4BACd,MACA,OACM;AACN,eAAc,MAAM,MAAM;CAC1B,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAEtD,WAAU,YAAY;EACpB,MAAM,OAAO,MAAM,KAAK,KAAK,IAAI;EACjC,MAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,MAAO;AACZ,QAAM,iBAAiB,KAAK;GAC5B;;AAGJ,MAAM,oCAAyF,oBAC7F,6BACA,uCACD;;;;;;AAOD,IAAa,gCAAb,cAAmD,kCAAkC;;AAGrF,SAAgB,wCAA8C;AAC5D,uBAAsB,uCAAuC,8BAA8B;;;ACrB7F,MAAa,4CAA8F,YAEzG,EACA,QAAQ;CAAE,SAAS;CAAM,WAAW;CAAO,MAAM;CAAQ,EAC1D,CAAC;;AAGF,SAAgB,+BACd,MACA,OACM;CACN,MAAM,YAAY,MAAM,OAAO;CAC/B,MAAM,WAAW,wBAAwB,QAAQ,KAAK;AAKtD,kBAAiB,MAH6B,EAC5C,UAAU,aAAa,MAAM,EAC9B,CACmC;AAEpC,kBAAiB,MAAM,qBAAqB;EAC1C,MAAM,SAAS,WAAW;EAC1B,MAAM,UAAU,UAAU,EAAE,kBAAkB,EAAE;AAChD,MAAI,CAAC,UAAU,CAAC,QAAS;AACzB,SAAO,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC,CAAC;GAC9C;AAEF,SAAQ,YAAY;AAClB,OAAK,YAAY;GACjB;CAEF,MAAM,gBAAgB,cAAc,KAAK;AAEzC,kBAAiB,MAAM,cAAc,UAAqB;EACxD,MAAM,eAAe,MAAM;AAC3B,MAAI,cAAc;AAChB,gBAAa,gBAAgB;GAC7B,MAAM,aAAa,eAAe;AAClC,OAAI,WACF,cAAa,aAAa,YAAY,GAAG,EAAE;;EAG/C,MAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO;EACZ,MAAM,QAAQ,MAAM,kBAAkB,EAAE;AAExC,MAAI,SAAS,QAAQ,QAAQ,GAAG;AAC9B,WAAQ,KAAK,oDAAoD,MAAM;AACvE,SAAM,gBAAgB;AACtB;;EAGF,MAAM,WAAW,MAAM;AAEvB,WAAS,UAAU,IAAI,MAAM;AAC7B,WAAS,SAAS,IAAI,KAAK;AAC3B,WAAS,cAAc,IAAI,MAAM;AACjC,WAAS,OAAO,IAAI,MAAM,QAAQ;AAClC,WAAS,OAAO,IAAI,MAAM,QAAQ;GAClC;;AAGJ,MAAM,uCAA+F,oBACnG,gCACA,0CACD;;;;;;AAOD,IAAa,mCAAb,cAAsD,qCAAqC;;;;AAK3F,SAAgB,2CAAiD;AAC/D,uBAAsB,0CAA0C,iCAAiC"}
1
+ {"version":3,"file":"prosekit-web-table-handle.js","names":[],"sources":["../src/components/table-handle/store.ts","../src/components/table-handle/table-handle-column-popup.ts","../src/utils/use-html-element-at.ts","../src/components/table-handle/shared.ts","../src/components/table-handle/table-handle-column-positioner.ts","../src/components/table-handle/table-handle-column-menu-root.ts","../src/components/table-handle/use-empty-image.ts","../src/components/table-handle/table-handle-column-menu-trigger.ts","../src/components/table-handle/dnd.ts","../src/utils/clone-element.ts","../src/utils/css-feature-detection.ts","../src/utils/fade-color.ts","../src/utils/get-effective-background-color.ts","../src/utils/inject-style.ts","../src/components/table-handle/render-preview.ts","../src/components/table-handle/table-handle-drag-preview.ts","../src/components/table-handle/calc-drag-over.ts","../src/components/table-handle/table-handle-drop-indicator.ts","../src/hooks/use-editor-typing.ts","../src/hooks/use-selecting.ts","../src/components/table-handle/use-drop.ts","../src/components/table-handle/utils.ts","../src/components/table-handle/table-handle-root.ts","../src/components/table-handle/table-handle-row-popup.ts","../src/components/table-handle/table-handle-row-positioner.ts","../src/components/table-handle/table-handle-row-menu-root.ts","../src/components/table-handle/table-handle-row-menu-trigger.ts"],"sourcesContent":["import { computed, createContext, createSignal, type Context, type Signal } from '@aria-ui/core'\nimport type { OpenChangeEvent } from '@aria-ui/elements/overlay'\nimport { createOverlayStore, type OverlayStore } from '@aria-ui/elements/overlay'\n\nimport type { HoveringCellInfo } from './utils.ts'\n\nfunction noop(): void {}\nfunction returnTrue(): boolean {\n return true\n}\nfunction returnFalse(): boolean {\n return false\n}\n\nclass DndStore {\n readonly dragging: Signal<boolean> = createSignal(false)\n readonly direction: Signal<'row' | 'col'> = createSignal<'row' | 'col'>('row')\n readonly draggingIndex: Signal<number> = createSignal(-1)\n readonly droppingIndex: Signal<number> = createSignal(-1)\n readonly x: Signal<number> = createSignal(-1)\n readonly y: Signal<number> = createSignal(-1)\n readonly startX: Signal<number> = createSignal(-1)\n readonly startY: Signal<number> = createSignal(-1)\n}\n\n/**\n * @internal\n */\nexport interface TableHandleStore {\n readonly dndStore: DndStore\n readonly setIsColumnMenuOpen: (open: boolean) => void\n readonly setIsRowMenuOpen: (open: boolean) => void\n readonly columnOverlayStore: OverlayStore\n readonly rowOverlayStore: OverlayStore\n readonly getReferenceCell: () => HoveringCellInfo | undefined\n}\n\n/**\n * @internal\n */\nexport function createTableHandleStore(\n getHoveringCellInfo: () => HoveringCellInfo | undefined,\n getCanShow: () => boolean,\n): TableHandleStore {\n const isColumnMenuOpen = createSignal(false)\n const isRowMenuOpen = createSignal(false)\n\n const getHasMenuOpen = (): boolean => {\n return isColumnMenuOpen.get() || isRowMenuOpen.get()\n }\n\n const setIsRowMenuOpen = (open: boolean): void => {\n isRowMenuOpen.set(open)\n }\n\n const setIsColumnMenuOpen = (open: boolean): void => {\n isColumnMenuOpen.set(open)\n }\n\n const referenceCellInfo = createSignal<HoveringCellInfo | undefined>(undefined)\n\n let prevHoveringCellInfo: HoveringCellInfo | undefined = undefined\n\n const getReferenceCell = computed((): HoveringCellInfo | undefined => {\n if (!getCanShow()) {\n referenceCellInfo.set(undefined)\n return\n }\n\n // Do not toggle/update the menu when hovering another cell if the menu is already open\n if (getHasMenuOpen()) {\n return prevHoveringCellInfo\n }\n\n prevHoveringCellInfo = getHoveringCellInfo()\n return prevHoveringCellInfo\n })\n\n const getOpen = computed((): boolean => {\n return !!getReferenceCell()\n })\n\n const handleOpenChange = (event: OpenChangeEvent) => {\n if (getHasMenuOpen()) {\n event.preventDefault()\n }\n }\n\n const columnOverlayStore = createOverlayStore(\n getOpen,\n noop,\n returnTrue,\n returnFalse,\n handleOpenChange,\n )\n const rowOverlayStore = createOverlayStore(\n getOpen,\n noop,\n returnTrue,\n returnFalse,\n handleOpenChange,\n )\n\n return {\n dndStore: new DndStore(),\n setIsRowMenuOpen,\n setIsColumnMenuOpen,\n columnOverlayStore,\n rowOverlayStore,\n getReferenceCell,\n }\n}\n\n/**\n * @internal\n */\nexport const tableHandleStoreContext: Context<TableHandleStore> = createContext<TableHandleStore>('prosekit-table-handle-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 { setupOverlayPopup } from '@aria-ui/elements/overlay'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleColumnPopupProps {}\n\n/** @internal */\nexport const TableHandleColumnPopupPropsDeclaration: PropsDeclaration<TableHandleColumnPopupProps> = defineProps<\n TableHandleColumnPopupProps\n>({})\n\n/** @internal */\nexport function setupTableHandleColumnPopup(\n host: HostElement,\n _props: State<TableHandleColumnPopupProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.columnOverlayStore\n setupOverlayPopup(host, getOverlayStore)\n}\n\nconst TableHandleColumnPopupElementBase: HostElementConstructor<TableHandleColumnPopupProps> = defineCustomElement(\n setupTableHandleColumnPopup,\n TableHandleColumnPopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-popup>` custom element.\n *\n * Properties: {@link TableHandleColumnPopupProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when visible, `\"closed\"` otherwise |\n */\nexport class TableHandleColumnPopupElement extends TableHandleColumnPopupElementBase {}\n\n/** @internal */\nexport function registerTableHandleColumnPopupElement(): void {\n registerCustomElement('prosekit-table-handle-column-popup', TableHandleColumnPopupElement)\n}\n","import { computed } from '@aria-ui/core'\nimport { isHTMLElement } from '@ocavue/utils'\nimport type { Editor } from '@prosekit/core'\n\nexport function useHTMLElementAt(\n getEditor: () => Editor | null | undefined,\n getPos: () => number | null | undefined,\n): () => HTMLElement | undefined {\n return computed(() => {\n const editor = getEditor()\n const pos = getPos()\n if (!editor || !pos) return\n const view = editor.view\n const element = view.nodeDOM(pos)\n if (element && isHTMLElement(element)) return element\n })\n}\n","import { defineProps, type PropsDeclaration } from '@aria-ui/core'\nimport { OverlayPositionerPropsDeclaration, type OverlayPositionerProps } from '@aria-ui/elements/overlay'\nimport type { Editor } from '@prosekit/core'\n\n/**\n * @internal\n */\nexport interface SharedTableHandlePositionerProps extends Omit<OverlayPositionerProps, 'hoist' | 'flip' | 'shift' | 'hide' | 'offset'> {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\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: OverlayPositionerProps['hoist']\n\n /**\n * @default false\n * @hidden\n */\n flip: OverlayPositionerProps['flip']\n\n /**\n * @default false\n * @hidden\n */\n shift: OverlayPositionerProps['shift']\n\n /**\n * @default true\n * @hidden\n */\n hide: OverlayPositionerProps['hide']\n\n /**\n * @default 0\n * @hidden\n */\n offset: OverlayPositionerProps['offset']\n}\n\n/** @internal */\nexport const SharedTableHandlePositionerPropsDeclaration: PropsDeclaration<SharedTableHandlePositionerProps> = defineProps<\n SharedTableHandlePositionerProps\n>({\n ...OverlayPositionerPropsDeclaration,\n editor: { default: null, attribute: false, type: 'json' },\n hoist: { default: false, attribute: false, type: 'boolean' },\n flip: { default: false, attribute: false, type: 'json' },\n shift: { default: false, attribute: false, type: 'boolean' },\n hide: { default: true, attribute: false, type: 'boolean' },\n offset: { default: 0, attribute: false, type: 'json' },\n})\n","import {\n computed,\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 { setupOverlayPositioner } from '@aria-ui/elements/overlay'\nimport type { Placement } from '@floating-ui/dom'\n\nimport { useHTMLElementAt } from '../../utils/use-html-element-at.ts'\n\nimport { SharedTableHandlePositionerPropsDeclaration, type SharedTableHandlePositionerProps } from './shared.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleColumnPositionerProps extends Omit<SharedTableHandlePositionerProps, 'placement'> {\n /**\n * The placement of the popover, relative to the hovered table cell.\n *\n * @default \"top\"\n */\n placement: Placement\n}\n\n/** @internal */\nexport const TableHandleColumnPositionerPropsDeclaration: PropsDeclaration<TableHandleColumnPositionerProps> = defineProps<\n TableHandleColumnPositionerProps\n>({\n ...SharedTableHandlePositionerPropsDeclaration,\n placement: { default: 'top', attribute: 'placement', type: 'string' },\n})\n\n/** @internal */\nexport function setupTableHandleColumnPositioner(\n host: HostElement,\n props: State<TableHandleColumnPositionerProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.columnOverlayStore\n setupOverlayPositioner(host, props, getOverlayStore)\n\n const getEditor = props.editor.get\n const getColumnFirstCellPos = computed(() => getStore()?.getReferenceCell()?.colFirstCellPos)\n const getReferenceCell = useHTMLElementAt(getEditor, getColumnFirstCellPos)\n useEffect(host, () => {\n getOverlayStore()?.setAnchorElement(getReferenceCell())\n })\n}\n\nconst TableHandleColumnPositionerElementBase: HostElementConstructor<TableHandleColumnPositionerProps> = defineCustomElement(\n setupTableHandleColumnPositioner,\n TableHandleColumnPositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-positioner>` custom element.\n *\n * Properties: {@link TableHandleColumnPositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when 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 TableHandleColumnPositionerElement extends TableHandleColumnPositionerElementBase {}\n\n/** @internal */\nexport function registerTableHandleColumnPositionerElement(): void {\n registerCustomElement('prosekit-table-handle-column-positioner', TableHandleColumnPositionerElement)\n}\n","import {\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 { MenuRootPropsDeclaration, setupMenuRoot, type MenuRootProps } from '@aria-ui/elements/menu'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleColumnMenuRootProps extends MenuRootProps {}\n\n/** @internal */\nexport const TableHandleColumnMenuRootPropsDeclaration: PropsDeclaration<TableHandleColumnMenuRootProps> = defineProps<\n TableHandleColumnMenuRootProps\n>(MenuRootPropsDeclaration)\n\n/** @internal */\nexport function setupTableHandleColumnMenuRoot(\n host: HostElement,\n props: State<TableHandleColumnMenuRootProps>,\n): void {\n setupMenuRoot(host, props)\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const open = props.open.get() || false\n const store = getStore?.()\n if (!store) return\n store.setIsColumnMenuOpen(open)\n })\n}\n\nconst TableHandleColumnMenuRootElementBase: HostElementConstructor<TableHandleColumnMenuRootProps> = defineCustomElement(\n setupTableHandleColumnMenuRoot,\n TableHandleColumnMenuRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-menu-root>` custom element.\n *\n * Properties: {@link TableHandleColumnMenuRootProps}\n */\nexport class TableHandleColumnMenuRootElement extends TableHandleColumnMenuRootElementBase {}\n\n/** @internal */\nexport function registerTableHandleColumnMenuRootElement(): void {\n registerCustomElement('prosekit-table-handle-column-menu-root', TableHandleColumnMenuRootElement)\n}\n","import { useEffect, type HostElement } from '@aria-ui/core'\n\n/**\n * Returns a function that returns a 1x1 transparent image. This is used to\n * prevent the browser from showing the default drag image. An earth icon in\n * chrome is used as the default drag image. This image must be loaded before\n * the dragStart event triggers.\n *\n * See https://stackoverflow.com/a/40923520\n *\n * @internal\n */\nexport function useEmptyImage(\n host: HostElement,\n): () => HTMLImageElement | undefined {\n let image: HTMLImageElement | undefined\n\n useEffect(host, () => {\n image = new Image(1, 1)\n image.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'\n\n return () => {\n image?.remove()\n image = undefined\n }\n })\n\n return () => image\n}\n","import {\n createSignal,\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 { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'\nimport { useEventListener } from '@aria-ui/utils'\nimport type { Editor } from '@prosekit/core'\nimport { selectTableColumn, type defineTableCommands } from '@prosekit/extensions/table'\n\nimport { tableHandleStoreContext } from './store.ts'\nimport { useEmptyImage } from './use-empty-image.ts'\n\ntype TableCommandsExtension = ReturnType<typeof defineTableCommands>\n\nexport interface TableHandleColumnMenuTriggerProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor<TableCommandsExtension> | null\n}\n\n/** @internal */\nexport const TableHandleColumnMenuTriggerPropsDeclaration: PropsDeclaration<TableHandleColumnMenuTriggerProps> = defineProps<\n TableHandleColumnMenuTriggerProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/** @internal */\nexport function setupTableHandleColumnMenuTrigger(\n host: HostElement,\n props: State<TableHandleColumnMenuTriggerProps>,\n): void {\n const getEditor = props.editor.get\n const getStore = tableHandleStoreContext.consume(host)\n\n const triggerProps: State<MenuTriggerProps> = {\n disabled: createSignal(false),\n }\n setupMenuTrigger(host, triggerProps)\n\n useEventListener(host, 'pointerdown', () => {\n const editor = getEditor()\n const cellPos = getStore()?.getReferenceCell()?.cellPos\n if (!editor || !cellPos) return\n editor.exec(selectTableColumn({ head: cellPos }))\n })\n\n onMount(host, () => {\n host.draggable = true\n })\n\n const getEmptyImage = useEmptyImage(host)\n\n useEventListener(host, 'dragstart', (event: DragEvent) => {\n const dataTransfer = event.dataTransfer\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move'\n const emptyImage = getEmptyImage()\n if (emptyImage) {\n dataTransfer.setDragImage(emptyImage, 0, 0)\n }\n dataTransfer.setData('application/x-prosekit-table-handle-drag', '')\n }\n const store = getStore()\n if (!store) return\n const index = store.getReferenceCell()?.colIndex\n\n if (index == null || index < 0) {\n console.warn('[prosekit] Invalid column index for drag operation:', index)\n event.preventDefault()\n return\n }\n\n const dndStore = store.dndStore\n dndStore.direction.set('col')\n dndStore.dragging.set(true)\n dndStore.draggingIndex.set(index)\n dndStore.startX.set(event.clientX)\n dndStore.startY.set(event.clientY)\n })\n}\n\nconst TableHandleColumnMenuTriggerElementBase: HostElementConstructor<TableHandleColumnMenuTriggerProps> = defineCustomElement(\n setupTableHandleColumnMenuTrigger,\n TableHandleColumnMenuTriggerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-column-menu-trigger>` custom element.\n *\n * Properties: {@link TableHandleColumnMenuTriggerProps}\n */\nexport class TableHandleColumnMenuTriggerElement extends TableHandleColumnMenuTriggerElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleColumnMenuTriggerElement(): void {\n registerCustomElement('prosekit-table-handle-column-menu-trigger', TableHandleColumnMenuTriggerElement)\n}\n","import { useEffect, type HostElement } from '@aria-ui/core'\nimport { computePosition, offset } from '@floating-ui/dom'\nimport { isHTMLElement } from '@ocavue/utils'\nimport type { Editor } from '@prosekit/core'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport type OnInitParams = {\n host: HostElement\n direction: 'row' | 'col'\n dragging: boolean\n draggingIndex: number\n table: HTMLTableElement\n cell: HTMLTableCellElement\n}\n\nexport function useInitDndPosition(\n host: HostElement,\n getEditor: () => Editor | null,\n onInit: (params: OnInitParams) => void,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const store = getStore()\n if (!store) return\n\n const dndStore = store.dndStore\n\n const dragging = dndStore.dragging.get()\n const direction = dndStore.direction.get()\n\n host.dataset.direction = direction\n host.dataset.dragging = dragging.toString()\n\n const draggingIndex = dndStore.draggingIndex.get()\n\n const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)\n if (!relatedDOMs) return\n const { table, cell } = relatedDOMs\n\n onInit({\n host,\n direction,\n dragging,\n draggingIndex,\n table,\n cell,\n })\n\n if (!dragging) return\n\n let cancelled = false\n\n void computePosition(cell, host, {\n placement: direction === 'row' ? 'right' : 'bottom',\n middleware: [\n offset(({ rects }) => {\n if (direction === 'col') {\n return -rects.reference.height\n }\n return -rects.reference.width\n }),\n ],\n }).then(({ x, y }) => {\n if (cancelled) return\n assignStyles(host, {\n left: `${x}px`,\n top: `${y}px`,\n })\n })\n\n return () => {\n cancelled = true\n }\n })\n}\n\nfunction getTableDOMByPos(view: EditorView, pos: number): HTMLTableElement | undefined {\n const dom = view.domAtPos(pos).node\n if (!dom) return\n const element = isHTMLElement(dom) ? dom : dom.parentElement\n const table = element?.closest('table')\n return table ?? undefined\n}\n\nfunction getTargetFirstCellDOM(table: HTMLTableElement, index: number, direction: 'row' | 'col'): HTMLTableCellElement | undefined {\n if (direction === 'row') {\n const row = table.querySelectorAll('tr')[index]\n const cell = row?.querySelector<HTMLTableCellElement>('td, th')\n return cell ?? undefined\n } else {\n const row = table.querySelector('tr')\n const cell = row?.querySelectorAll<HTMLTableCellElement>('td, th')[index]\n return cell ?? undefined\n }\n}\n\nexport function getDndRelatedDOMs(\n view: EditorView,\n cellPos: number | undefined,\n draggingIndex: number,\n direction: 'row' | 'col',\n): { table: HTMLTableElement; cell: HTMLTableCellElement } | undefined {\n if (cellPos == null) return\n const table = getTableDOMByPos(view, cellPos)\n if (!table) return\n const cell = getTargetFirstCellDOM(table, draggingIndex, direction)\n if (!cell) return\n return { table, cell }\n}\n","import { getId } from '@ocavue/utils'\n\n/**\n * Creates a deep clone of an Element, including all computed styles so that\n * it looks almost exactly the same as the original element.\n */\nexport function deepCloneElement<T extends Element>(element: T, important = false): [T, string] {\n const clonedElement = element.cloneNode(true) as T\n const style = deepCopyStyles(element, clonedElement, important)\n return [clonedElement, style]\n}\n\n/**\n * Creates a clone of an Element, including all computed styles so that\n * it looks similar enough to the original element.\n */\nexport function cloneElement<T extends Element>(element: T, important = false): [T, string] {\n const clonedElement = element.cloneNode() as T\n const style = copyStyles(element, clonedElement, important)\n return [clonedElement, style]\n}\n\nfunction deepCopyStyles(source: Element, target: Element, important: boolean): string {\n const sources = [source]\n const targets = [target]\n const styles: string[] = []\n\n while (sources.length > 0 && sources.length === targets.length) {\n const source = sources.pop()\n const target = targets.pop()\n\n if (!source || !target) {\n break\n }\n\n const style = copyStyles(source, target, important)\n if (style) {\n styles.push(style)\n }\n\n sources.push(...source.children)\n targets.push(...target.children)\n }\n\n return styles.join('\\n')\n}\n\nfunction copyStyles(source: Element, target: Element, important: boolean): string {\n if (!source || !target) {\n return ''\n }\n\n const view = source.ownerDocument?.defaultView\n if (!view) {\n return ''\n }\n\n // Known issue: pseudo styles are not copied.\n const sourceStyle = view.getComputedStyle(source)\n const targetStyle = (target as HTMLElement | SVGElement | MathMLElement).style\n\n if (!sourceStyle || !targetStyle) {\n return ''\n }\n\n for (const key of sourceStyle) {\n targetStyle.setProperty(\n key,\n sourceStyle.getPropertyValue(key),\n // Enforce important to avoid the style being overridden when the element\n // is connected to the page.\n // See https://github.com/prosekit/prosekit/issues/1185 for more details.\n important ? 'important' : (sourceStyle.getPropertyPriority(key) || ''),\n )\n }\n\n const styles: string[] = []\n for (const pseudoSelector of [':before', ':after']) {\n const sourcePseudoStyle = view.getComputedStyle(source, pseudoSelector)\n const targetPseudoStyle = view.getComputedStyle(target, pseudoSelector)\n\n if (!sourcePseudoStyle) {\n continue\n }\n\n const content = sourcePseudoStyle.getPropertyValue('content')\n const hasPseudoElement = content && content !== 'none' && content !== 'normal'\n\n if (!hasPseudoElement) {\n continue\n }\n\n const cssProps: string[] = []\n for (const property of sourcePseudoStyle) {\n const sourceValue = sourcePseudoStyle.getPropertyValue(property)\n const sourcePriority = sourcePseudoStyle.getPropertyPriority(property)\n const targetValue = targetPseudoStyle.getPropertyValue(property)\n const targetPriority = targetPseudoStyle.getPropertyPriority(property)\n if (sourceValue !== targetValue || sourcePriority !== targetPriority) {\n cssProps.push(`${property}: ${sourceValue}${sourcePriority ? ' !important' : ''};`)\n }\n }\n\n const uniqueClassName = `clone-pseudo-element-${getId()}`\n target.classList.add(uniqueClassName)\n styles.push(`.${uniqueClassName}${pseudoSelector} { ${cssProps.join(' ')} }`)\n }\n\n return styles.join('\\n')\n}\n","import { once } from '@ocavue/utils'\n\nexport const isColorMixSupported: () => boolean = once(() => {\n try {\n return CSS.supports('background-color', 'color-mix(in srgb, red, blue)')\n } catch {\n return false\n }\n})\n","import { isColorMixSupported } from './css-feature-detection.ts'\n\n/**\n * Convert a color to a color with opacity\n * @param color - The color to convert\n * @param opacity - The opacity to apply\n * @returns The converted color if color-mix is supported, otherwise undefined\n */\nexport function fadeColor(color: CSSStyleValue, opacity: number): string | undefined {\n if (isColorMixSupported()) {\n const transparentWeight = (1 - opacity) * 100\n const colorWeight = opacity * 100\n return `color-mix(in srgb, ${color} ${colorWeight}%, transparent ${transparentWeight}%)`\n }\n}\n","export function getEffectiveBackgroundColor(element: HTMLElement): string | undefined {\n let current: HTMLElement | null = element\n\n while (current) {\n const style = current.ownerDocument.defaultView?.getComputedStyle(current)\n const backgroundColor = style?.backgroundColor\n\n if (\n backgroundColor\n && backgroundColor !== 'transparent'\n // Chrome returns `rgba(0, 0, 0, 0)` for transparent colors.\n && backgroundColor !== 'rgba(0, 0, 0, 0)'\n ) {\n return backgroundColor\n }\n\n current = current.parentElement\n }\n\n return undefined\n}\n","import { getDocument } from '@ocavue/utils'\n\nexport function injectStyle(container: HTMLElement, styleText: string): void {\n if (!styleText) {\n return\n }\n const document = getDocument(container)\n const style = document.createElement('style')\n style.textContent = styleText\n container.appendChild(style)\n}\n","import { assignStyles } from '../../utils/assign-styles.ts'\nimport { cloneElement, deepCloneElement } from '../../utils/clone-element.ts'\nimport { fadeColor } from '../../utils/fade-color.ts'\nimport { getEffectiveBackgroundColor } from '../../utils/get-effective-background-color.ts'\nimport { injectStyle } from '../../utils/inject-style.ts'\n\nexport function clearPreviewDOM(previewRoot: HTMLElement): void {\n while (previewRoot.firstChild) {\n previewRoot.removeChild(previewRoot.firstChild)\n }\n}\n\nexport function createPreviewDOM(\n table: HTMLTableElement,\n previewRoot: HTMLElement,\n index: number,\n direction: 'row' | 'col',\n): void {\n clearPreviewDOM(previewRoot)\n\n const [previewTable, previewTableStyle] = cloneElement(table)\n injectStyle(previewRoot, previewTableStyle)\n unsetSize(previewTable)\n\n const tableBody = table.querySelector('tbody')\n const [previewTableBody, previewTableBodyStyle] = tableBody\n ? cloneElement(tableBody)\n : [table.ownerDocument.createElement('tbody'), '']\n injectStyle(previewRoot, previewTableBodyStyle)\n unsetSize(previewTableBody)\n\n // Get effective background color and apply it with some opacity\n const backgroundColor = getEffectiveBackgroundColor(table)\n if (backgroundColor) {\n const backgroundColorWithOpacity = fadeColor(backgroundColor, 0.8)\n if (backgroundColorWithOpacity) {\n assignStyles(previewTable, { backgroundColor: backgroundColorWithOpacity })\n }\n }\n\n previewTable.appendChild(previewTableBody)\n previewRoot.appendChild(previewTable)\n\n const rows = table.querySelectorAll('tr')\n\n if (direction === 'row') {\n const row = rows[index]\n const [previewRow, previewRowStyle] = deepCloneElement(row)\n injectStyle(previewRoot, previewRowStyle)\n previewTableBody.appendChild(previewRow)\n } else {\n rows.forEach((row) => {\n const [previewRow, previewRowStyle] = cloneElement(row)\n injectStyle(previewRoot, previewRowStyle)\n unsetSize(previewRow)\n const cells = row.querySelectorAll('td, th')\n const cell = cells[index]\n if (cell) {\n const [previewCell, previewCellStyle] = deepCloneElement(cell)\n injectStyle(previewRoot, previewCellStyle)\n previewRow.appendChild(previewCell)\n previewTableBody.appendChild(previewRow)\n }\n })\n }\n}\n\nfunction unsetSize(element: HTMLElement) {\n assignStyles(element, {\n width: 'unset',\n height: 'unset',\n minWidth: 'unset',\n minHeight: 'unset',\n maxWidth: 'unset',\n maxHeight: 'unset',\n })\n}\n","import {\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 { computePosition, type ReferenceElement } from '@floating-ui/dom'\nimport type { Editor } from '@prosekit/core'\n\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { getDndRelatedDOMs, useInitDndPosition, type OnInitParams } from './dnd.ts'\nimport { clearPreviewDOM, createPreviewDOM } from './render-preview.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleDragPreviewProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const TableHandleDragPreviewPropsDeclaration: PropsDeclaration<TableHandleDragPreviewProps> = defineProps<\n TableHandleDragPreviewProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/**\n * @internal\n */\nexport function setupTableHandleDragPreview(\n host: HostElement,\n props: State<TableHandleDragPreviewProps>,\n): void {\n const getEditor = props.editor.get\n\n useEffect(host, () => {\n assignStyles(host, {\n position: 'absolute',\n pointerEvents: 'none',\n })\n })\n\n useInitDndPosition(host, getEditor, onInitPreviewPosition)\n\n useUpdatePreviewPosition(host, getEditor)\n}\n\nfunction onInitPreviewPosition({ host, direction, dragging, table, cell, draggingIndex }: OnInitParams): void {\n assignStyles(host, {\n display: dragging ? 'block' : 'none',\n })\n\n if (!dragging) {\n clearPreviewDOM(host)\n return\n }\n\n createPreviewDOM(table, host, draggingIndex, direction)\n\n const tableRect = table.getBoundingClientRect()\n const cellRect = cell.getBoundingClientRect()\n\n if (direction === 'col') {\n assignStyles(host, {\n width: `${cellRect.width}px`,\n height: `${tableRect.height}px`,\n })\n }\n\n if (direction === 'row') {\n assignStyles(host, {\n width: `${tableRect.width}px`,\n height: `${cellRect.height}px`,\n })\n }\n}\n\nfunction useUpdatePreviewPosition(host: HostElement, getEditor: () => Editor | null): void {\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const store = getStore()\n if (!store) return\n const dndStore = store.dndStore\n\n if (!dndStore.dragging.get()) return\n\n const draggingIndex = dndStore.draggingIndex.get()\n const direction = dndStore.direction.get()\n const x = dndStore.x.get()\n const y = dndStore.y.get()\n\n const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)\n if (!relatedDOMs) return\n const { cell } = relatedDOMs\n\n let cancelled = false\n\n void computePosition(\n getVirtualElement(cell, x, y),\n host,\n { placement: direction === 'row' ? 'right' : 'bottom' },\n ).then(({ x, y }) => {\n if (cancelled) return\n\n if (direction === 'row') {\n assignStyles(host, { top: `${y}px` })\n return\n }\n\n if (direction === 'col') {\n assignStyles(host, { left: `${x}px` })\n return\n }\n })\n\n return () => {\n cancelled = true\n }\n })\n}\n\nfunction getVirtualElement(cell: HTMLTableCellElement, x: number, y: number): ReferenceElement {\n return {\n contextElement: cell,\n getBoundingClientRect: () => {\n const rect = cell.getBoundingClientRect()\n return {\n width: rect.width,\n height: rect.height,\n right: x + rect.width / 2,\n bottom: y + rect.height / 2,\n top: y - rect.height / 2,\n left: x - rect.width / 2,\n x: x - rect.width / 2,\n y: y - rect.height / 2,\n }\n },\n }\n}\n\nconst TableHandleDragPreviewElementBase: HostElementConstructor<TableHandleDragPreviewProps> = defineCustomElement(\n setupTableHandleDragPreview,\n TableHandleDragPreviewPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-drag-preview>` custom element.\n *\n * Properties: {@link TableHandleDragPreviewProps}\n */\nexport class TableHandleDragPreviewElement extends TableHandleDragPreviewElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleDragPreviewElement(): void {\n registerCustomElement('prosekit-table-handle-drag-preview', TableHandleDragPreviewElement)\n}\n","function findDragOverElement(\n elements: Element[],\n pointer: number,\n axis: 'x' | 'y',\n): [Element, number] | undefined {\n const startProp = axis === 'x' ? 'left' : 'top'\n const endProp = axis === 'x' ? 'right' : 'bottom'\n const lastIndex = elements.length - 1\n\n const index = elements.findIndex((el, index) => {\n const rect = el.getBoundingClientRect()\n const boundaryStart = rect[startProp]\n const boundaryEnd = rect[endProp]\n\n // The pointer is within the boundary of the current element.\n if (boundaryStart <= pointer && pointer <= boundaryEnd) return true\n // The pointer is beyond the last element.\n if (index === lastIndex && pointer > boundaryEnd) return true\n // The pointer is before the first element.\n if (index === 0 && pointer < boundaryStart) return true\n\n return false\n })\n\n return index >= 0 ? [elements[index], index] : undefined\n}\n\nexport function getDragOverColumn(\n table: HTMLTableElement,\n pointerX: number,\n): [element: Element, index: number] | undefined {\n const firstRow = table.querySelector('tr')\n if (!firstRow) return\n const cells = Array.from(firstRow.children)\n return findDragOverElement(cells, pointerX, 'x')\n}\n\nexport function getDragOverRow(\n table: HTMLTableElement,\n pointerY: number,\n): [element: Element, index: number] | undefined {\n const rows = Array.from(table.querySelectorAll('tr'))\n return findDragOverElement(rows, pointerY, 'y')\n}\n","import {\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 { computePosition, offset } from '@floating-ui/dom'\nimport type { Editor } from '@prosekit/core'\nimport type { defineTableCommands } from '@prosekit/extensions/table'\n\nimport { assignStyles } from '../../utils/assign-styles.ts'\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport { getDragOverColumn, getDragOverRow } from './calc-drag-over.ts'\nimport { getDndRelatedDOMs, useInitDndPosition, type OnInitParams } from './dnd.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\ntype TableCommandsExtension = ReturnType<typeof defineTableCommands>\n\nconst HANDLE_WIDTH = 2\n\nexport interface TableHandleDropIndicatorProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor<TableCommandsExtension> | null\n}\n\n/** @internal */\nexport const TableHandleDropIndicatorPropsDeclaration: PropsDeclaration<TableHandleDropIndicatorProps> = defineProps<\n TableHandleDropIndicatorProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/**\n * @internal\n */\nexport function setupTableHandleDropIndicator(\n host: HostElement,\n props: State<TableHandleDropIndicatorProps>,\n): void {\n const getEditor = props.editor.get\n\n useEffect(host, () => {\n assignStyles(host, {\n pointerEvents: 'none',\n position: 'absolute',\n })\n })\n\n useInitDndPosition(host, getEditor, onInitIndicatorPosition)\n\n useUpdateIndicatorPosition(host, getEditor, HANDLE_WIDTH)\n}\n\nfunction onInitIndicatorPosition({ host, direction, dragging, table }: OnInitParams): void {\n assignStyles(host, {\n display: dragging ? 'block' : 'none',\n })\n\n const tableRect = table.getBoundingClientRect()\n\n if (direction === 'col') {\n assignStyles(host, {\n width: `${HANDLE_WIDTH}px`,\n height: `${tableRect.height}px`,\n })\n }\n\n if (direction === 'row') {\n assignStyles(host, {\n width: `${tableRect.width}px`,\n height: `${HANDLE_WIDTH}px`,\n })\n }\n}\n\nfunction useUpdateIndicatorPosition(host: HostElement, getEditor: () => Editor | null, handleWidth: number): void {\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const store = getStore()\n if (!store) return\n\n const dndStore = store.dndStore\n if (!dndStore.dragging.get()) return\n\n const draggingIndex = dndStore.draggingIndex.get()\n const direction = dndStore.direction.get()\n const x = dndStore.x.get()\n const y = dndStore.y.get()\n\n const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)\n if (!relatedDOMs) return\n const { table } = relatedDOMs\n\n let cancelled = false\n const cleanup = () => {\n cancelled = true\n }\n\n if (direction === 'col') {\n const dir = dndStore.startX.get() > x ? 'left' : 'right'\n const dragOverColumn = getDragOverColumn(table, x)\n\n if (dragOverColumn) {\n const [col, index] = dragOverColumn\n dndStore.droppingIndex.set(index)\n void computePosition(col, host, {\n placement: dir === 'left' ? 'left' : 'right',\n middleware: [offset(dir === 'left' ? -1 * handleWidth : 0)],\n }).then(({ x }) => {\n if (cancelled) return\n assignStyles(host, { left: `${x}px` })\n })\n }\n\n return cleanup\n }\n\n if (direction === 'row') {\n const dir = dndStore.startY.get() > y ? 'up' : 'down'\n const dragOverRow = getDragOverRow(table, y)\n\n if (dragOverRow) {\n const [row, index] = dragOverRow\n dndStore.droppingIndex.set(index)\n void computePosition(row, host, {\n placement: dir === 'up' ? 'top' : 'bottom',\n middleware: [offset(dir === 'up' ? -1 * handleWidth : 0)],\n }).then(({ y }) => {\n if (cancelled) return\n assignStyles(host, { top: `${y}px` })\n })\n }\n\n return cleanup\n }\n })\n}\n\nconst TableHandleDropIndicatorElementBase: HostElementConstructor<TableHandleDropIndicatorProps> = defineCustomElement(\n setupTableHandleDropIndicator,\n TableHandleDropIndicatorPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-drop-indicator>` custom element.\n *\n * Properties: {@link TableHandleDropIndicatorProps}\n */\nexport class TableHandleDropIndicatorElement extends TableHandleDropIndicatorElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleDropIndicatorElement(): void {\n registerCustomElement('prosekit-table-handle-drop-indicator', TableHandleDropIndicatorElement)\n}\n","import { createSignal, type HostElement } from '@aria-ui/core'\nimport { defineDOMEventHandler, union, type Editor } from '@prosekit/core'\n\nimport { useEditorExtension } from './use-editor-extension.ts'\n\nexport function useEditorTyping(\n host: HostElement,\n getEditor: () => Editor | null,\n): () => boolean {\n const typing = createSignal(false)\n\n const extension = union(\n defineDOMEventHandler('keypress', () => {\n typing.set(true)\n }),\n defineDOMEventHandler('pointermove', () => {\n typing.set(false)\n }),\n )\n\n useEditorExtension(host, getEditor, extension)\n\n return typing.get\n}\n","import { createSignal, useEffect, type HostElement } from '@aria-ui/core'\nimport type { Editor } from '@prosekit/core'\n\nimport { getSafeEditorView } from '../utils/get-safe-editor-view.ts'\n\n/**\n * Detect if the user is selecting text inside the editor, in which case some\n * components should be disabled or hidden.\n */\nexport function useSelecting(\n host: HostElement,\n getEditor: () => Editor | null,\n getEnabled: () => boolean,\n): () => boolean {\n const selecting = createSignal(false)\n const isPointerDown = createSignal(false)\n\n useEffect(host, () => {\n if (!getEnabled()) return\n\n const view = getSafeEditorView(getEditor())\n if (!view) return\n\n const { dom, root } = view\n if (!root) return\n\n const handlePointerDown = () => {\n selecting.set(true)\n isPointerDown.set(true)\n }\n const handlePointerUp = () => {\n isPointerDown.set(false)\n }\n const handleMouseMove = () => {\n if (!isPointerDown.get()) {\n selecting.set(false)\n }\n }\n\n dom.addEventListener('pointerdown', handlePointerDown)\n root.addEventListener('pointerup', handlePointerUp)\n root.addEventListener('pointermove', handleMouseMove)\n\n return () => {\n dom.removeEventListener('pointerdown', handlePointerDown)\n root.removeEventListener('pointerup', handlePointerUp)\n root.removeEventListener('pointermove', handleMouseMove)\n }\n })\n\n return selecting.get\n}\n","import { computed, useEffect, type HostElement } from '@aria-ui/core'\nimport type { Editor } from '@prosekit/core'\nimport { moveTableColumn, moveTableRow } from '@prosekit/extensions/table'\n\nimport { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'\n\nimport type { TableHandleStore } from './store.ts'\n\nexport function useDrop(\n host: HostElement,\n getEditor: () => Editor | null,\n store: TableHandleStore,\n): void {\n const getDndStore = () => store.dndStore\n const getDragging = computed(() => getDndStore().dragging.get())\n\n useEffect(host, () => {\n const view = getSafeEditorView(getEditor())\n if (!view || !view.editable) return\n\n const ownerDocument = view.dom?.ownerDocument\n if (!ownerDocument) return\n\n const handleDrop = () => {\n if (!getDragging()) return\n const editor = getEditor()\n if (!editor) return\n\n const dndStore = getDndStore()\n\n const droppingIndex = dndStore.droppingIndex.get()\n const draggingIndex = dndStore.draggingIndex.get()\n const direction = dndStore.direction.get()\n\n if (draggingIndex < 0 || droppingIndex < 0) {\n console.warn('[prosekit] Invalid drag indices:', { draggingIndex, droppingIndex })\n return\n }\n\n if (direction === 'row') {\n editor.exec(moveTableRow({ from: draggingIndex, to: droppingIndex }))\n return\n }\n if (direction === 'col') {\n editor.exec(moveTableColumn({ from: draggingIndex, to: droppingIndex }))\n return\n }\n }\n\n const handleDragOver = (event: DragEvent) => {\n if (!getDragging()) return\n event.preventDefault()\n const dndStore = getDndStore()\n dndStore.dragging.set(true)\n dndStore.x.set(event.clientX)\n dndStore.y.set(event.clientY)\n }\n\n const handleDragEnd = () => {\n if (!getDragging()) return\n const dndStore = getDndStore()\n dndStore.dragging.set(false)\n }\n\n ownerDocument.addEventListener('dragover', handleDragOver)\n ownerDocument.addEventListener('drop', handleDrop)\n ownerDocument.addEventListener('dragend', handleDragEnd)\n return () => {\n ownerDocument.removeEventListener('dragover', handleDragOver)\n ownerDocument.removeEventListener('drop', handleDrop)\n ownerDocument.removeEventListener('dragend', handleDragEnd)\n }\n })\n}\n","import type { EditorView } from '@prosekit/pm/view'\nimport { cellAround, TableMap } from 'prosemirror-tables'\n\nexport interface HoveringCellInfo {\n rowIndex: number\n colIndex: number\n cellPos: number\n rowFirstCellPos: number\n colFirstCellPos: number\n}\n\nexport function isHoveringCellInfoEqual(\n a?: HoveringCellInfo | null,\n b?: HoveringCellInfo | null,\n): boolean {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n a.rowIndex === b.rowIndex\n && a.colIndex === b.colIndex\n && a.cellPos === b.cellPos\n && a.rowFirstCellPos === b.rowFirstCellPos\n && a.colFirstCellPos === b.colFirstCellPos\n )\n}\n\n/**\n * Copied from https://github.com/ProseMirror/prosemirror-tables/blob/v1.5.0/src/columnresizing.ts#L256\n *\n * @internal\n */\nfunction domCellAround(target: HTMLElement | null): HTMLElement | null {\n while (target && target.nodeName != 'TD' && target.nodeName != 'TH') {\n target = target.classList?.contains('ProseMirror')\n ? null\n : (target.parentNode as HTMLElement | null)\n }\n return target\n}\n\nexport function getHoveringCell(\n view: EditorView,\n event: MouseEvent,\n): HoveringCellInfo | undefined {\n const domCell = domCellAround(event.target as HTMLElement | null)\n if (!domCell) return\n\n const { left, top, width, height } = domCell.getBoundingClientRect()\n const eventPos = view.posAtCoords({\n // Use the center coordinates of the cell to ensure we're within the\n // selected cell. This prevents potential issues when the mouse is on the\n // border of two cells.\n left: left + width / 2,\n top: top + height / 2,\n })\n if (!eventPos) return\n\n const $cellPos = cellAround(view.state.doc.resolve(eventPos.pos))\n if (!$cellPos) return\n\n const map = TableMap.get($cellPos.node(-1))\n const tableStart = $cellPos.start(-1)\n const cellRect = map.findCell($cellPos.pos - tableStart)\n const rowIndex = cellRect.top\n const colIndex = cellRect.left\n\n return {\n rowIndex,\n colIndex,\n cellPos: $cellPos.pos,\n rowFirstCellPos: getCellPos(map, tableStart, rowIndex, 0),\n colFirstCellPos: getCellPos(map, tableStart, 0, colIndex),\n }\n}\n\nfunction getCellPos(\n map: TableMap,\n tableStart: number,\n rowIndex: number,\n colIndex: number,\n) {\n const cellIndex = getCellIndex(map, rowIndex, colIndex)\n const posInTable = map.map[cellIndex]\n return tableStart + posInTable\n}\n\nfunction getCellIndex(\n map: TableMap,\n rowIndex: number,\n colIndex: number,\n): number {\n return map.width * rowIndex + colIndex\n}\n","import {\n computed,\n createSignal,\n defineCustomElement,\n defineProps,\n registerCustomElement,\n type HostElement,\n type HostElementConstructor,\n type PropsDeclaration,\n type State,\n} from '@aria-ui/core'\nimport { defineDOMEventHandler, type Editor } from '@prosekit/core'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { useEditorExtension } from '../../hooks/use-editor-extension.ts'\nimport { useEditorTyping } from '../../hooks/use-editor-typing.ts'\nimport { useScrolling } from '../../hooks/use-scrolling.ts'\nimport { useSelecting } from '../../hooks/use-selecting.ts'\n\nimport { createTableHandleStore, tableHandleStoreContext } from './store.ts'\nimport { useDrop } from './use-drop.ts'\nimport { getHoveringCell, isHoveringCellInfoEqual, type HoveringCellInfo } from './utils.ts'\n\nexport interface TableHandleRootProps {\n /**\n * The ProseKit editor instance.\n *\n * @default null\n * @hidden\n */\n editor: Editor | null\n}\n\n/** @internal */\nexport const TableHandleRootPropsDeclaration: PropsDeclaration<TableHandleRootProps> = defineProps<TableHandleRootProps>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/**\n * @internal\n */\nexport function setupTableHandleRoot(\n host: HostElement,\n props: State<TableHandleRootProps>,\n): void {\n const getEditor = props.editor.get\n\n const getHoveringCellInfo = useHoveringCell(host, getEditor)\n const getTyping = useEditorTyping(host, getEditor)\n const getIsInTable = computed(() => !!getHoveringCellInfo())\n const getSelecting = useSelecting(host, getEditor, getIsInTable)\n const getScrolling = useScrolling(host)\n const getCanShow = computed(() => !getTyping() && !getSelecting() && !getScrolling())\n\n const store = createTableHandleStore(getHoveringCellInfo, getCanShow)\n tableHandleStoreContext.provide(host, store)\n\n useDrop(host, getEditor, store)\n}\n\nfunction useHoveringCell(\n host: HostElement,\n getEditor: () => Editor | null,\n): () => HoveringCellInfo | undefined {\n const hoveringCell = createSignal<HoveringCellInfo | undefined>(undefined)\n\n const extension = defineCellHoverHandler((curr: HoveringCellInfo | undefined) => {\n const prev = hoveringCell.get()\n if (isHoveringCellInfoEqual(prev, curr)) return\n hoveringCell.set(curr)\n })\n\n useEditorExtension(host, getEditor, extension)\n\n return hoveringCell.get\n}\n\nfunction defineCellHoverHandler(\n handler: (hoveringCell: HoveringCellInfo | undefined) => void,\n) {\n const pointerHandler = (view: EditorView, event: PointerEvent) => {\n const hoveringCell = getHoveringCell(view, event)\n return handler(hoveringCell)\n }\n return defineDOMEventHandler('pointerover', pointerHandler)\n}\n\nconst TableHandleRootElementBase: HostElementConstructor<TableHandleRootProps> = defineCustomElement(\n setupTableHandleRoot,\n TableHandleRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-root>` custom element.\n *\n * Properties: {@link TableHandleRootProps}\n */\nexport class TableHandleRootElement extends TableHandleRootElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleRootElement(): void {\n registerCustomElement('prosekit-table-handle-root', TableHandleRootElement)\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 { setupOverlayPopup } from '@aria-ui/elements/overlay'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleRowPopupProps {}\n\n/** @internal */\nexport const TableHandleRowPopupPropsDeclaration: PropsDeclaration<TableHandleRowPopupProps> = defineProps<TableHandleRowPopupProps>({})\n\n/** @internal */\nexport function setupTableHandleRowPopup(\n host: HostElement,\n _props: State<TableHandleRowPopupProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.rowOverlayStore\n setupOverlayPopup(host, getOverlayStore)\n}\n\nconst TableHandleRowPopupElementBase: HostElementConstructor<TableHandleRowPopupProps> = defineCustomElement(\n setupTableHandleRowPopup,\n TableHandleRowPopupPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-popup>` custom element.\n *\n * Properties: {@link TableHandleRowPopupProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when visible, `\"closed\"` otherwise |\n */\nexport class TableHandleRowPopupElement extends TableHandleRowPopupElementBase {}\n\n/** @internal */\nexport function registerTableHandleRowPopupElement(): void {\n registerCustomElement('prosekit-table-handle-row-popup', TableHandleRowPopupElement)\n}\n","import {\n computed,\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 { setupOverlayPositioner } from '@aria-ui/elements/overlay'\nimport type { Placement } from '@floating-ui/dom'\n\nimport { useHTMLElementAt } from '../../utils/use-html-element-at.ts'\n\nimport { SharedTableHandlePositionerPropsDeclaration, type SharedTableHandlePositionerProps } from './shared.ts'\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleRowPositionerProps extends Omit<SharedTableHandlePositionerProps, 'placement'> {\n /**\n * The placement of the popover, relative to the hovered table cell.\n *\n * @default \"left\"\n */\n placement: Placement\n}\n\n/** @internal */\nexport const TableHandleRowPositionerPropsDeclaration: PropsDeclaration<TableHandleRowPositionerProps> = defineProps<\n TableHandleRowPositionerProps\n>({\n ...SharedTableHandlePositionerPropsDeclaration,\n placement: { default: 'left', attribute: 'placement', type: 'string' },\n})\n\n/** @internal */\nexport function setupTableHandleRowPositioner(\n host: HostElement,\n props: State<TableHandleRowPositionerProps>,\n): void {\n const getStore = tableHandleStoreContext.consume(host)\n const getOverlayStore = () => getStore()?.rowOverlayStore\n setupOverlayPositioner(host, props, getOverlayStore)\n\n const getEditor = props.editor.get\n const getRowFirstCellPos = computed(() => getStore()?.getReferenceCell()?.rowFirstCellPos)\n const getReferenceCell = useHTMLElementAt(getEditor, getRowFirstCellPos)\n useEffect(host, () => {\n getOverlayStore()?.setAnchorElement(getReferenceCell())\n })\n}\n\nconst TableHandleRowPositionerElementBase: HostElementConstructor<TableHandleRowPositionerProps> = defineCustomElement(\n setupTableHandleRowPositioner,\n TableHandleRowPositionerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-positioner>` custom element.\n *\n * Properties: {@link TableHandleRowPositionerProps}\n *\n * Data attributes:\n *\n * | Attribute | Description |\n * | --- | --- |\n * | `data-state` | `\"open\"` when 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 TableHandleRowPositionerElement extends TableHandleRowPositionerElementBase {}\n\n/** @internal */\nexport function registerTableHandleRowPositionerElement(): void {\n registerCustomElement('prosekit-table-handle-row-positioner', TableHandleRowPositionerElement)\n}\n","import {\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 { MenuRootPropsDeclaration, setupMenuRoot, type MenuRootProps } from '@aria-ui/elements/menu'\n\nimport { tableHandleStoreContext } from './store.ts'\n\nexport interface TableHandleRowMenuRootProps extends MenuRootProps {}\n\n/** @internal */\nexport const TableHandleRowMenuRootPropsDeclaration: PropsDeclaration<TableHandleRowMenuRootProps> = defineProps<\n TableHandleRowMenuRootProps\n>(MenuRootPropsDeclaration)\n\n/** @internal */\nexport function setupTableHandleRowMenuRoot(\n host: HostElement,\n props: State<TableHandleRowMenuRootProps>,\n): void {\n setupMenuRoot(host, props)\n const getStore = tableHandleStoreContext.consume(host)\n\n useEffect(host, () => {\n const open = props.open.get() || false\n const store = getStore?.()\n if (!store) return\n store.setIsRowMenuOpen(open)\n })\n}\n\nconst TableHandleRowMenuRootElementBase: HostElementConstructor<TableHandleRowMenuRootProps> = defineCustomElement(\n setupTableHandleRowMenuRoot,\n TableHandleRowMenuRootPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-menu-root>` custom element.\n *\n * Properties: {@link TableHandleRowMenuRootProps}\n */\nexport class TableHandleRowMenuRootElement extends TableHandleRowMenuRootElementBase {}\n\n/** @internal */\nexport function registerTableHandleRowMenuRootElement(): void {\n registerCustomElement('prosekit-table-handle-row-menu-root', TableHandleRowMenuRootElement)\n}\n","import {\n createSignal,\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 { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'\nimport { useEventListener } from '@aria-ui/utils'\nimport type { Editor } from '@prosekit/core'\nimport { selectTableRow, type defineTableCommands } from '@prosekit/extensions/table'\n\nimport { tableHandleStoreContext } from './store.ts'\nimport { useEmptyImage } from './use-empty-image.ts'\n\ntype TableCommandsExtension = ReturnType<typeof defineTableCommands>\n\nexport interface TableHandleRowMenuTriggerProps {\n /**\n * @default null\n * @hidden\n */\n editor: Editor<TableCommandsExtension> | null\n}\n\n/** @internal */\nexport const TableHandleRowMenuTriggerPropsDeclaration: PropsDeclaration<TableHandleRowMenuTriggerProps> = defineProps<\n TableHandleRowMenuTriggerProps\n>({\n editor: { default: null, attribute: false, type: 'json' },\n})\n\n/** @internal */\nexport function setupTableHandleRowMenuTrigger(\n host: HostElement,\n props: State<TableHandleRowMenuTriggerProps>,\n): void {\n const getEditor = props.editor.get\n const getStore = tableHandleStoreContext.consume(host)\n\n const triggerProps: State<MenuTriggerProps> = {\n disabled: createSignal(false),\n }\n setupMenuTrigger(host, triggerProps)\n\n useEventListener(host, 'pointerdown', () => {\n const editor = getEditor()\n const cellPos = getStore()?.getReferenceCell()?.cellPos\n if (!editor || !cellPos) return\n editor.exec(selectTableRow({ head: cellPos }))\n })\n\n onMount(host, () => {\n host.draggable = true\n })\n\n const getEmptyImage = useEmptyImage(host)\n\n useEventListener(host, 'dragstart', (event: DragEvent) => {\n const dataTransfer = event.dataTransfer\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move'\n const emptyImage = getEmptyImage()\n if (emptyImage) {\n dataTransfer.setDragImage(emptyImage, 0, 0)\n }\n }\n const store = getStore()\n if (!store) return\n const index = store.getReferenceCell()?.rowIndex\n\n if (index == null || index < 0) {\n console.warn('[prosekit] Invalid row index for drag operation:', index)\n event.preventDefault()\n return\n }\n\n const dndStore = store.dndStore\n\n dndStore.direction.set('row')\n dndStore.dragging.set(true)\n dndStore.draggingIndex.set(index)\n dndStore.startX.set(event.clientX)\n dndStore.startY.set(event.clientY)\n })\n}\n\nconst TableHandleRowMenuTriggerElementBase: HostElementConstructor<TableHandleRowMenuTriggerProps> = defineCustomElement(\n setupTableHandleRowMenuTrigger,\n TableHandleRowMenuTriggerPropsDeclaration,\n)\n\n/**\n * `<prosekit-table-handle-row-menu-trigger>` custom element.\n *\n * Properties: {@link TableHandleRowMenuTriggerProps}\n */\nexport class TableHandleRowMenuTriggerElement extends TableHandleRowMenuTriggerElementBase {}\n\n/**\n * @internal\n */\nexport function registerTableHandleRowMenuTriggerElement(): void {\n registerCustomElement('prosekit-table-handle-row-menu-trigger', TableHandleRowMenuTriggerElement)\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { createSignal, useEffect } from "@aria-ui/core";
2
- import { getNearestOverflowAncestor } from "@aria-ui/utils";
2
+ import { getNearestOverflowAncestor, useGlobalEventListener } from "@aria-ui/utils";
3
3
  /**
4
4
  * A type-safe version of `Object.assign` for `element.style`.
5
5
  */
@@ -7,34 +7,28 @@ function assignStyles(element, styles) {
7
7
  Object.assign(element.style, styles);
8
8
  }
9
9
  function useScrolling(host) {
10
- const scrolling = createSignal(false);
10
+ const { get: getScrolling, set: setScrolling } = createSignal(false);
11
+ const handleMouseMove = () => {
12
+ setScrolling(false);
13
+ };
14
+ const handleScroll = () => {
15
+ setScrolling(true);
16
+ };
17
+ useGlobalEventListener(host, "mousemove", handleMouseMove);
18
+ useGlobalEventListener(host, "pointermove", handleMouseMove);
11
19
  useEffect(host, () => {
12
20
  const scrollableParent = getNearestOverflowAncestor(host);
13
- const handleScroll = () => {
14
- scrolling.set(true);
15
- };
16
- const handleMouseMove = () => {
17
- scrolling.set(false);
18
- };
19
21
  const abortController = new AbortController();
20
22
  const abortSignal = abortController.signal;
21
23
  scrollableParent.addEventListener("scroll", handleScroll, {
22
24
  passive: true,
23
25
  signal: abortSignal
24
26
  });
25
- window.addEventListener("mousemove", handleMouseMove, {
26
- passive: true,
27
- signal: abortSignal
28
- });
29
- window.addEventListener("pointermove", handleMouseMove, {
30
- passive: true,
31
- signal: abortSignal
32
- });
33
27
  return () => {
34
28
  abortController.abort();
35
29
  };
36
30
  });
37
- return scrolling.get;
31
+ return getScrolling;
38
32
  }
39
33
  export { assignStyles as n, useScrolling as t };
40
34
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-scrolling.js","names":[],"sources":["../src/utils/assign-styles.ts","../src/hooks/use-scrolling.ts"],"sourcesContent":["import type { ConditionalPick } from 'type-fest'\n\n// Only include CSS properties whose value type is `string`\ntype StringStyleDeclaration = Partial<ConditionalPick<CSSStyleDeclaration, string>>\n\n/**\n * A type-safe version of `Object.assign` for `element.style`.\n */\nexport function assignStyles(\n element: HTMLElement | SVGElement | MathMLElement,\n styles: StringStyleDeclaration,\n): void {\n Object.assign(element.style, styles)\n}\n","import { createSignal, useEffect, type HostElement } from '@aria-ui/core'\nimport { getNearestOverflowAncestor } from '@aria-ui/utils'\n\nexport function useScrolling(host: HostElement): () => boolean {\n const scrolling = createSignal(false)\n\n useEffect(host, () => {\n const scrollableParent = getNearestOverflowAncestor(host)\n\n const handleScroll = () => {\n scrolling.set(true)\n }\n\n const handleMouseMove = () => {\n scrolling.set(false)\n }\n\n const abortController = new AbortController()\n const abortSignal = abortController.signal\n\n scrollableParent.addEventListener('scroll', handleScroll, { passive: true, signal: abortSignal })\n window.addEventListener('mousemove', handleMouseMove, { passive: true, signal: abortSignal })\n window.addEventListener('pointermove', handleMouseMove, { passive: true, signal: abortSignal })\n\n return () => {\n abortController.abort()\n }\n })\n\n return scrolling.get\n}\n"],"mappings":";;;;;AAQA,SAAgB,aACd,SACA,QACM;AACN,QAAO,OAAO,QAAQ,OAAO,OAAO;;ACTtC,SAAgB,aAAa,MAAkC;CAC7D,MAAM,YAAY,aAAa,MAAM;AAErC,WAAU,YAAY;EACpB,MAAM,mBAAmB,2BAA2B,KAAK;EAEzD,MAAM,qBAAqB;AACzB,aAAU,IAAI,KAAK;;EAGrB,MAAM,wBAAwB;AAC5B,aAAU,IAAI,MAAM;;EAGtB,MAAM,kBAAkB,IAAI,iBAAiB;EAC7C,MAAM,cAAc,gBAAgB;AAEpC,mBAAiB,iBAAiB,UAAU,cAAc;GAAE,SAAS;GAAM,QAAQ;GAAa,CAAC;AACjG,SAAO,iBAAiB,aAAa,iBAAiB;GAAE,SAAS;GAAM,QAAQ;GAAa,CAAC;AAC7F,SAAO,iBAAiB,eAAe,iBAAiB;GAAE,SAAS;GAAM,QAAQ;GAAa,CAAC;AAE/F,eAAa;AACX,mBAAgB,OAAO;;GAEzB;AAEF,QAAO,UAAU"}
1
+ {"version":3,"file":"use-scrolling.js","names":[],"sources":["../src/utils/assign-styles.ts","../src/hooks/use-scrolling.ts"],"sourcesContent":["import type { ConditionalPick } from 'type-fest'\n\n// Only include CSS properties whose value type is `string`\ntype StringStyleDeclaration = Partial<ConditionalPick<CSSStyleDeclaration, string>>\n\n/**\n * A type-safe version of `Object.assign` for `element.style`.\n */\nexport function assignStyles(\n element: HTMLElement | SVGElement | MathMLElement,\n styles: StringStyleDeclaration,\n): void {\n Object.assign(element.style, styles)\n}\n","import { createSignal, useEffect, type HostElement } from '@aria-ui/core'\nimport { getNearestOverflowAncestor, useGlobalEventListener } from '@aria-ui/utils'\n\nexport function useScrolling(host: HostElement): () => boolean {\n const { get: getScrolling, set: setScrolling } = createSignal(false)\n const handleMouseMove = () => {\n setScrolling(false)\n }\n const handleScroll = () => {\n setScrolling(true)\n }\n\n useGlobalEventListener(host, 'mousemove', handleMouseMove)\n useGlobalEventListener(host, 'pointermove', handleMouseMove)\n\n useEffect(host, () => {\n const scrollableParent = getNearestOverflowAncestor(host)\n\n const abortController = new AbortController()\n const abortSignal = abortController.signal\n\n scrollableParent.addEventListener('scroll', handleScroll, {\n passive: true,\n signal: abortSignal,\n })\n\n return () => {\n abortController.abort()\n }\n })\n\n return getScrolling\n}\n"],"mappings":";;;;;AAQA,SAAgB,aACd,SACA,QACM;AACN,QAAO,OAAO,QAAQ,OAAO,OAAO;;ACTtC,SAAgB,aAAa,MAAkC;CAC7D,MAAM,EAAE,KAAK,cAAc,KAAK,iBAAiB,aAAa,MAAM;CACpE,MAAM,wBAAwB;AAC5B,eAAa,MAAM;;CAErB,MAAM,qBAAqB;AACzB,eAAa,KAAK;;AAGpB,wBAAuB,MAAM,aAAa,gBAAgB;AAC1D,wBAAuB,MAAM,eAAe,gBAAgB;AAE5D,WAAU,YAAY;EACpB,MAAM,mBAAmB,2BAA2B,KAAK;EAEzD,MAAM,kBAAkB,IAAI,iBAAiB;EAC7C,MAAM,cAAc,gBAAgB;AAEpC,mBAAiB,iBAAiB,UAAU,cAAc;GACxD,SAAS;GACT,QAAQ;GACT,CAAC;AAEF,eAAa;AACX,mBAAgB,OAAO;;GAEzB;AAEF,QAAO"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prosekit/web",
3
3
  "type": "module",
4
- "version": "0.8.0-beta.4",
4
+ "version": "0.8.0-beta.5",
5
5
  "private": false,
6
6
  "description": "A collection of web components for ProseKit",
7
7
  "author": {
@@ -72,25 +72,25 @@
72
72
  "src"
73
73
  ],
74
74
  "dependencies": {
75
- "@aria-ui/core": "^0.1.1",
76
- "@aria-ui/elements": "^0.1.4",
77
- "@aria-ui/utils": "^0.1.1",
75
+ "@aria-ui/core": "^0.2.0",
76
+ "@aria-ui/elements": "^0.1.8",
77
+ "@aria-ui/utils": "^0.1.5",
78
78
  "@floating-ui/dom": "^1.7.6",
79
79
  "@ocavue/utils": "^1.6.0",
80
80
  "prosemirror-tables": "^1.8.5",
81
- "@prosekit/extensions": "^0.16.0-beta.0",
82
81
  "@prosekit/core": "^0.12.0-beta.0",
83
- "@prosekit/pm": "^0.1.15"
82
+ "@prosekit/pm": "^0.1.15",
83
+ "@prosekit/extensions": "^0.16.0-beta.0"
84
84
  },
85
85
  "devDependencies": {
86
- "@aria-ui/cli": "^0.1.5",
87
- "tsdown": "^0.21.7",
86
+ "@aria-ui/cli": "^0.1.6",
87
+ "tsdown": "^0.21.8",
88
88
  "type-fest": "^5.5.0",
89
89
  "typescript": "~5.9.3",
90
90
  "vitest": "^4.1.4",
91
+ "@prosekit/config-ts": "0.0.0",
91
92
  "@prosekit/config-tsdown": "0.0.0",
92
- "@prosekit/config-vitest": "0.0.0",
93
- "@prosekit/config-ts": "0.0.0"
93
+ "@prosekit/config-vitest": "0.0.0"
94
94
  },
95
95
  "publishConfig": {
96
96
  "dev": {}
@@ -2,13 +2,13 @@ import {
2
2
  defineCustomElement,
3
3
  defineProps,
4
4
  registerCustomElement,
5
- useEventListener,
6
5
  type HostElement,
7
6
  type HostElementConstructor,
8
7
  type PropsDeclaration,
9
8
  type State,
10
9
  } from '@aria-ui/core'
11
10
  import { SelectEvent, setupListboxItem, type ListboxItemEvents, type ListboxItemProps } from '@aria-ui/elements/listbox'
11
+ import { useEventListener } from '@aria-ui/utils'
12
12
 
13
13
  import { preventDefault } from '../../utils/prevent-default.ts'
14
14
 
@@ -4,7 +4,6 @@ import {
4
4
  defineProps,
5
5
  registerCustomElement,
6
6
  useEffect,
7
- useEventListener,
8
7
  type HostElement,
9
8
  type HostElementConstructor,
10
9
  type PropsDeclaration,
@@ -13,6 +12,7 @@ import {
13
12
  } from '@aria-ui/core'
14
13
  import { defaultItemFilter, type ItemFilter, type ListboxRootEvents } from '@aria-ui/elements/listbox'
15
14
  import { createOverlayStore, OpenChangeEvent, type OverlayStore } from '@aria-ui/elements/overlay'
15
+ import { useEventListener } from '@aria-ui/utils'
16
16
  import { defineDOMEventHandler, defineKeymap, withPriority, type Editor, type Extension, type Priority } from '@prosekit/core'
17
17
  import { AutocompleteRule, defineAutocomplete, type MatchHandler } from '@prosekit/extensions/autocomplete'
18
18
 
@@ -2,12 +2,12 @@ import {
2
2
  defineCustomElement,
3
3
  defineProps,
4
4
  registerCustomElement,
5
- useEventListener,
6
5
  type HostElement,
7
6
  type HostElementConstructor,
8
7
  type PropsDeclaration,
9
8
  type State,
10
9
  } from '@aria-ui/core'
10
+ import { useEventListener } from '@aria-ui/utils'
11
11
  import { insertDefaultBlock, type Editor } from '@prosekit/core'
12
12
 
13
13
  import { blockHandleStoreContext } from './context.ts'
@@ -3,13 +3,12 @@ import {
3
3
  defineProps,
4
4
  onMount,
5
5
  registerCustomElement,
6
- useEventListener,
7
6
  type HostElement,
8
7
  type HostElementConstructor,
9
8
  type PropsDeclaration,
10
9
  type State,
11
10
  } from '@aria-ui/core'
12
- import { useAttribute } from '@aria-ui/utils'
11
+ import { useAttribute, useEventListener } from '@aria-ui/utils'
13
12
  import { isHTMLElement } from '@ocavue/utils'
14
13
  import type { Editor } from '@prosekit/core'
15
14
  import type { ViewDragging } from '@prosekit/extensions/drop-indicator'
@@ -4,13 +4,13 @@ import {
4
4
  defineProps,
5
5
  onMount,
6
6
  registerCustomElement,
7
- useEventListener,
8
7
  type HostElement,
9
8
  type HostElementConstructor,
10
9
  type PropsDeclaration,
11
10
  type State,
12
11
  } from '@aria-ui/core'
13
12
  import { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'
13
+ import { useEventListener } from '@aria-ui/utils'
14
14
  import type { Editor } from '@prosekit/core'
15
15
  import { selectTableColumn, type defineTableCommands } from '@prosekit/extensions/table'
16
16
 
@@ -4,13 +4,13 @@ import {
4
4
  defineProps,
5
5
  onMount,
6
6
  registerCustomElement,
7
- useEventListener,
8
7
  type HostElement,
9
8
  type HostElementConstructor,
10
9
  type PropsDeclaration,
11
10
  type State,
12
11
  } from '@aria-ui/core'
13
12
  import { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'
13
+ import { useEventListener } from '@aria-ui/utils'
14
14
  import type { Editor } from '@prosekit/core'
15
15
  import { selectTableRow, type defineTableCommands } from '@prosekit/extensions/table'
16
16
 
@@ -1,31 +1,33 @@
1
1
  import { createSignal, useEffect, type HostElement } from '@aria-ui/core'
2
- import { getNearestOverflowAncestor } from '@aria-ui/utils'
2
+ import { getNearestOverflowAncestor, useGlobalEventListener } from '@aria-ui/utils'
3
3
 
4
4
  export function useScrolling(host: HostElement): () => boolean {
5
- const scrolling = createSignal(false)
5
+ const { get: getScrolling, set: setScrolling } = createSignal(false)
6
+ const handleMouseMove = () => {
7
+ setScrolling(false)
8
+ }
9
+ const handleScroll = () => {
10
+ setScrolling(true)
11
+ }
12
+
13
+ useGlobalEventListener(host, 'mousemove', handleMouseMove)
14
+ useGlobalEventListener(host, 'pointermove', handleMouseMove)
6
15
 
7
16
  useEffect(host, () => {
8
17
  const scrollableParent = getNearestOverflowAncestor(host)
9
18
 
10
- const handleScroll = () => {
11
- scrolling.set(true)
12
- }
13
-
14
- const handleMouseMove = () => {
15
- scrolling.set(false)
16
- }
17
-
18
19
  const abortController = new AbortController()
19
20
  const abortSignal = abortController.signal
20
21
 
21
- scrollableParent.addEventListener('scroll', handleScroll, { passive: true, signal: abortSignal })
22
- window.addEventListener('mousemove', handleMouseMove, { passive: true, signal: abortSignal })
23
- window.addEventListener('pointermove', handleMouseMove, { passive: true, signal: abortSignal })
22
+ scrollableParent.addEventListener('scroll', handleScroll, {
23
+ passive: true,
24
+ signal: abortSignal,
25
+ })
24
26
 
25
27
  return () => {
26
28
  abortController.abort()
27
29
  }
28
30
  })
29
31
 
30
- return scrolling.get
32
+ return getScrolling
31
33
  }