@prosekit/web 0.7.13 → 0.8.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/prosekit-web-autocomplete.d.ts +112 -90
- package/dist/prosekit-web-autocomplete.d.ts.map +1 -1
- package/dist/prosekit-web-autocomplete.js +292 -217
- package/dist/prosekit-web-autocomplete.js.map +1 -1
- package/dist/prosekit-web-block-handle.d.ts +95 -62
- package/dist/prosekit-web-block-handle.d.ts.map +1 -1
- package/dist/prosekit-web-block-handle.js +219 -114
- package/dist/prosekit-web-block-handle.js.map +1 -1
- package/dist/prosekit-web-drop-indicator.d.ts +13 -15
- package/dist/prosekit-web-drop-indicator.d.ts.map +1 -1
- package/dist/prosekit-web-drop-indicator.js +34 -30
- package/dist/prosekit-web-drop-indicator.js.map +1 -1
- package/dist/prosekit-web-inline-popover.d.ts +88 -54
- package/dist/prosekit-web-inline-popover.d.ts.map +1 -1
- package/dist/prosekit-web-inline-popover.js +129 -79
- package/dist/prosekit-web-inline-popover.js.map +1 -1
- package/dist/prosekit-web-menu.d.ts +13 -0
- package/dist/prosekit-web-menu.d.ts.map +1 -0
- package/dist/prosekit-web-menu.js +53 -0
- package/dist/prosekit-web-menu.js.map +1 -0
- package/dist/prosekit-web-popover.d.ts +7 -26
- package/dist/prosekit-web-popover.d.ts.map +1 -1
- package/dist/prosekit-web-popover.js +31 -29
- package/dist/prosekit-web-popover.js.map +1 -1
- package/dist/prosekit-web-resizable.d.ts +92 -51
- package/dist/prosekit-web-resizable.d.ts.map +1 -1
- package/dist/prosekit-web-resizable.js +139 -131
- package/dist/prosekit-web-resizable.js.map +1 -1
- package/dist/prosekit-web-table-handle.d.ts +166 -199
- package/dist/prosekit-web-table-handle.d.ts.map +1 -1
- package/dist/prosekit-web-table-handle.js +495 -496
- package/dist/prosekit-web-table-handle.js.map +1 -1
- package/dist/prosekit-web-tooltip.d.ts +7 -26
- package/dist/prosekit-web-tooltip.d.ts.map +1 -1
- package/dist/prosekit-web-tooltip.js +31 -29
- package/dist/prosekit-web-tooltip.js.map +1 -1
- package/dist/use-editor-extension.js +2 -2
- package/dist/use-editor-extension.js.map +1 -1
- package/dist/use-scrolling.js +17 -8
- package/dist/use-scrolling.js.map +1 -1
- package/package.json +30 -25
- package/src/components/autocomplete/autocomplete-empty.ts +45 -0
- package/src/components/autocomplete/autocomplete-item.ts +65 -0
- package/src/components/autocomplete/autocomplete-popup.ts +95 -0
- package/src/components/autocomplete/autocomplete-positioner.ts +98 -0
- package/src/components/autocomplete/autocomplete-root.ts +280 -0
- package/src/components/autocomplete/context.ts +16 -14
- package/src/components/autocomplete/index.ts +65 -0
- package/src/components/block-handle/block-handle-add.ts +71 -0
- package/src/components/block-handle/block-handle-draggable.ts +158 -0
- package/src/components/block-handle/block-handle-popup.ts +43 -0
- package/src/components/block-handle/block-handle-positioner.ts +89 -0
- package/src/components/block-handle/block-handle-root.ts +116 -0
- package/src/components/block-handle/context.ts +9 -18
- package/src/components/block-handle/hover-state.ts +16 -0
- package/src/components/block-handle/index.ts +59 -0
- package/src/components/block-handle/{block-handle-popover/pointer-move.ts → pointer-move.ts} +8 -7
- package/src/components/block-handle/{block-handle-draggable/set-drag-preview.ts → set-drag-preview.ts} +4 -4
- package/src/components/block-handle/use-hover-extension.ts +65 -0
- package/src/components/drop-indicator/drop-indicator.ts +128 -0
- package/src/components/drop-indicator/index.ts +18 -0
- package/src/components/inline-popover/index.ts +41 -0
- package/src/components/inline-popover/inline-popover-popup.ts +52 -0
- package/src/components/inline-popover/inline-popover-positioner.ts +98 -0
- package/src/components/inline-popover/inline-popover-root.ts +122 -0
- package/src/components/inline-popover/store.ts +6 -0
- package/src/components/menu/index.ts +92 -0
- package/src/components/popover/index.ts +53 -0
- package/src/components/resizable/{resizable-handle/calc-resize.ts → calc-resize.ts} +1 -1
- package/src/components/resizable/context.ts +3 -6
- package/src/components/resizable/index.ts +32 -0
- package/src/components/resizable/resizable-handle.ts +134 -0
- package/src/components/resizable/resizable-root.ts +184 -0
- package/src/components/table-handle/dnd.ts +16 -27
- package/src/components/table-handle/index.ts +125 -0
- package/src/components/table-handle/{table-handle-drag-preview/render-preview.ts → render-preview.ts} +5 -5
- package/src/components/table-handle/shared.ts +61 -0
- package/src/components/table-handle/store.ts +117 -0
- package/src/components/table-handle/table-handle-column-menu-root.ts +51 -0
- package/src/components/table-handle/table-handle-column-menu-trigger.ts +107 -0
- package/src/components/table-handle/table-handle-column-popup.ts +44 -0
- package/src/components/table-handle/table-handle-column-positioner.ts +67 -0
- package/src/components/table-handle/table-handle-drag-preview.ts +169 -0
- package/src/components/table-handle/table-handle-drop-indicator.ts +166 -0
- package/src/components/table-handle/table-handle-root.ts +103 -0
- package/src/components/table-handle/table-handle-row-menu-root.ts +51 -0
- package/src/components/table-handle/table-handle-row-menu-trigger.ts +107 -0
- package/src/components/table-handle/table-handle-row-popup.ts +42 -0
- package/src/components/table-handle/table-handle-row-positioner.ts +67 -0
- package/src/components/table-handle/use-drop.ts +74 -0
- package/src/components/table-handle/{hooks/use-empty-image.ts → use-empty-image.ts} +2 -3
- package/src/components/table-handle/utils.ts +0 -11
- package/src/components/tooltip/index.ts +52 -0
- package/src/hooks/use-editor-extension.ts +4 -4
- package/src/hooks/use-editor-focus-event.ts +4 -4
- package/src/hooks/use-editor-typing.ts +12 -16
- package/src/hooks/use-editor-update-event.ts +4 -4
- package/src/hooks/use-keymap.ts +4 -4
- package/src/hooks/use-scrolling.ts +11 -10
- package/src/hooks/use-selecting.ts +8 -15
- package/src/utils/event.ts +28 -0
- package/src/utils/lazy-signal.spec.ts +68 -0
- package/src/utils/lazy-signal.ts +17 -0
- package/src/utils/prefers-reduced-motion.ts +6 -0
- package/src/utils/prevent-default.ts +3 -0
- package/src/utils/use-html-element-at.ts +17 -0
- package/src/utils/use-no-focus.ts +7 -0
- package/dist/get-default-state.js +0 -11
- package/dist/get-default-state.js.map +0 -1
- package/src/components/autocomplete/autocomplete-empty/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-empty/setup.ts +0 -6
- package/src/components/autocomplete/autocomplete-empty/types.ts +0 -13
- package/src/components/autocomplete/autocomplete-item/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-item/setup.ts +0 -30
- package/src/components/autocomplete/autocomplete-item/types.ts +0 -25
- package/src/components/autocomplete/autocomplete-list/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-list/setup.ts +0 -125
- package/src/components/autocomplete/autocomplete-list/types.ts +0 -22
- package/src/components/autocomplete/autocomplete-popover/element.gen.ts +0 -18
- package/src/components/autocomplete/autocomplete-popover/setup.ts +0 -169
- package/src/components/autocomplete/autocomplete-popover/types.ts +0 -100
- package/src/components/autocomplete/index.gen.ts +0 -17
- package/src/components/block-handle/block-handle-add/element.gen.ts +0 -18
- package/src/components/block-handle/block-handle-add/setup.ts +0 -33
- package/src/components/block-handle/block-handle-add/types.ts +0 -23
- package/src/components/block-handle/block-handle-draggable/element.gen.ts +0 -18
- package/src/components/block-handle/block-handle-draggable/setup.ts +0 -113
- package/src/components/block-handle/block-handle-draggable/types.ts +0 -23
- package/src/components/block-handle/block-handle-popover/element.gen.ts +0 -18
- package/src/components/block-handle/block-handle-popover/setup.ts +0 -68
- package/src/components/block-handle/block-handle-popover/types.ts +0 -81
- package/src/components/block-handle/index.gen.ts +0 -13
- package/src/components/drop-indicator/drop-indicator/element.gen.ts +0 -18
- package/src/components/drop-indicator/drop-indicator/setup.ts +0 -75
- package/src/components/drop-indicator/drop-indicator/types.ts +0 -31
- package/src/components/drop-indicator/index.gen.ts +0 -5
- package/src/components/inline-popover/index.gen.ts +0 -5
- package/src/components/inline-popover/inline-popover/element.gen.ts +0 -18
- package/src/components/inline-popover/inline-popover/setup.ts +0 -111
- package/src/components/inline-popover/inline-popover/types.ts +0 -112
- package/src/components/popover/index.gen.ts +0 -13
- package/src/components/popover/popover-content/element.gen.ts +0 -18
- package/src/components/popover/popover-content/setup.ts +0 -1
- package/src/components/popover/popover-content/types.ts +0 -6
- package/src/components/popover/popover-root/element.gen.ts +0 -18
- package/src/components/popover/popover-root/setup.ts +0 -1
- package/src/components/popover/popover-root/types.ts +0 -6
- package/src/components/popover/popover-trigger/element.gen.ts +0 -18
- package/src/components/popover/popover-trigger/setup.ts +0 -1
- package/src/components/popover/popover-trigger/types.ts +0 -6
- package/src/components/resizable/index.gen.ts +0 -9
- package/src/components/resizable/resizable-handle/element.gen.ts +0 -18
- package/src/components/resizable/resizable-handle/setup.ts +0 -106
- package/src/components/resizable/resizable-handle/types.ts +0 -29
- package/src/components/resizable/resizable-root/element.gen.ts +0 -18
- package/src/components/resizable/resizable-root/setup.ts +0 -84
- package/src/components/resizable/resizable-root/types.ts +0 -59
- package/src/components/table-handle/context.ts +0 -43
- package/src/components/table-handle/hooks/use-drop.ts +0 -85
- package/src/components/table-handle/index.gen.ts +0 -37
- package/src/components/table-handle/table-handle-column-root/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-column-root/setup.ts +0 -60
- package/src/components/table-handle/table-handle-column-root/types.ts +0 -73
- package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-column-trigger/setup.ts +0 -64
- package/src/components/table-handle/table-handle-column-trigger/types.ts +0 -20
- package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-drag-preview/setup.ts +0 -57
- package/src/components/table-handle/table-handle-drag-preview/types.ts +0 -14
- package/src/components/table-handle/table-handle-drag-preview/updater.ts +0 -90
- package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-drop-indicator/setup.ts +0 -52
- package/src/components/table-handle/table-handle-drop-indicator/types.ts +0 -15
- package/src/components/table-handle/table-handle-drop-indicator/updater.ts +0 -96
- package/src/components/table-handle/table-handle-popover-content/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-popover-content/setup.ts +0 -83
- package/src/components/table-handle/table-handle-popover-content/types.ts +0 -32
- package/src/components/table-handle/table-handle-popover-item/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-popover-item/setup.ts +0 -17
- package/src/components/table-handle/table-handle-popover-item/types.ts +0 -16
- package/src/components/table-handle/table-handle-root/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-root/setup.ts +0 -86
- package/src/components/table-handle/table-handle-root/types.ts +0 -23
- package/src/components/table-handle/table-handle-row-root/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-row-root/setup.ts +0 -70
- package/src/components/table-handle/table-handle-row-root/types.ts +0 -68
- package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +0 -18
- package/src/components/table-handle/table-handle-row-trigger/setup.ts +0 -63
- package/src/components/table-handle/table-handle-row-trigger/types.ts +0 -23
- package/src/components/tooltip/index.gen.ts +0 -13
- package/src/components/tooltip/tooltip-content/element.gen.ts +0 -18
- package/src/components/tooltip/tooltip-content/setup.ts +0 -1
- package/src/components/tooltip/tooltip-content/types.ts +0 -6
- package/src/components/tooltip/tooltip-root/element.gen.ts +0 -18
- package/src/components/tooltip/tooltip-root/setup.ts +0 -1
- package/src/components/tooltip/tooltip-root/types.ts +0 -6
- package/src/components/tooltip/tooltip-trigger/element.gen.ts +0 -18
- package/src/components/tooltip/tooltip-trigger/setup.ts +0 -1
- package/src/components/tooltip/tooltip-trigger/types.ts +0 -6
- package/src/hooks/use-first-rendering.ts +0 -15
- package/src/utils/get-default-state.spec.ts +0 -42
- package/src/utils/get-default-state.ts +0 -18
- /package/src/components/autocomplete/{autocomplete-popover/helpers.spec.ts → helpers.spec.ts} +0 -0
- /package/src/components/autocomplete/{autocomplete-popover/helpers.ts → helpers.ts} +0 -0
- /package/src/components/inline-popover/{inline-popover/virtual-selection-element.ts → virtual-selection-element.ts} +0 -0
- /package/src/components/resizable/{resizable-handle/calc-resize.spec.ts → calc-resize.spec.ts} +0 -0
- /package/src/components/table-handle/{table-handle-drop-indicator/calc-drag-over.ts → calc-drag-over.ts} +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSignal,
|
|
3
|
+
defineCustomElement,
|
|
4
|
+
defineProps,
|
|
5
|
+
onMount,
|
|
6
|
+
registerCustomElement,
|
|
7
|
+
useEventListener,
|
|
8
|
+
type HostElement,
|
|
9
|
+
type HostElementConstructor,
|
|
10
|
+
type PropsDeclaration,
|
|
11
|
+
type State,
|
|
12
|
+
} from '@aria-ui/core'
|
|
13
|
+
import { setupMenuTrigger, type MenuTriggerProps } from '@aria-ui/elements/menu'
|
|
14
|
+
import type { Editor } from '@prosekit/core'
|
|
15
|
+
import { selectTableRow, type defineTableCommands } from '@prosekit/extensions/table'
|
|
16
|
+
|
|
17
|
+
import { tableHandleStoreContext } from './store.ts'
|
|
18
|
+
import { useEmptyImage } from './use-empty-image.ts'
|
|
19
|
+
|
|
20
|
+
type TableCommandsExtension = ReturnType<typeof defineTableCommands>
|
|
21
|
+
|
|
22
|
+
export interface TableHandleRowMenuTriggerProps {
|
|
23
|
+
/**
|
|
24
|
+
* @default null
|
|
25
|
+
* @hidden
|
|
26
|
+
*/
|
|
27
|
+
editor: Editor<TableCommandsExtension> | null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** @internal */
|
|
31
|
+
export const TableHandleRowMenuTriggerPropsDeclaration: PropsDeclaration<TableHandleRowMenuTriggerProps> = defineProps<
|
|
32
|
+
TableHandleRowMenuTriggerProps
|
|
33
|
+
>({
|
|
34
|
+
editor: { default: null, attribute: false, type: 'json' },
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
/** @internal */
|
|
38
|
+
export function setupTableHandleRowMenuTrigger(
|
|
39
|
+
host: HostElement,
|
|
40
|
+
props: State<TableHandleRowMenuTriggerProps>,
|
|
41
|
+
): void {
|
|
42
|
+
const getEditor = props.editor.get
|
|
43
|
+
const getStore = tableHandleStoreContext.consume(host)
|
|
44
|
+
|
|
45
|
+
const triggerProps: State<MenuTriggerProps> = {
|
|
46
|
+
disabled: createSignal(false),
|
|
47
|
+
}
|
|
48
|
+
setupMenuTrigger(host, triggerProps)
|
|
49
|
+
|
|
50
|
+
useEventListener(host, 'pointerdown', () => {
|
|
51
|
+
const editor = getEditor()
|
|
52
|
+
const cellPos = getStore()?.getReferenceCell()?.cellPos
|
|
53
|
+
if (!editor || !cellPos) return
|
|
54
|
+
editor.exec(selectTableRow({ head: cellPos }))
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
onMount(host, () => {
|
|
58
|
+
host.draggable = true
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
const getEmptyImage = useEmptyImage(host)
|
|
62
|
+
|
|
63
|
+
useEventListener(host, 'dragstart', (event: DragEvent) => {
|
|
64
|
+
const dataTransfer = event.dataTransfer
|
|
65
|
+
if (dataTransfer) {
|
|
66
|
+
dataTransfer.effectAllowed = 'move'
|
|
67
|
+
const emptyImage = getEmptyImage()
|
|
68
|
+
if (emptyImage) {
|
|
69
|
+
dataTransfer.setDragImage(emptyImage, 0, 0)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const store = getStore()
|
|
73
|
+
if (!store) return
|
|
74
|
+
const index = store.getReferenceCell()?.rowIndex
|
|
75
|
+
|
|
76
|
+
if (index == null || index < 0) {
|
|
77
|
+
console.warn('[prosekit] Invalid row index for drag operation:', index)
|
|
78
|
+
event.preventDefault()
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const dndStore = store.dndStore
|
|
83
|
+
|
|
84
|
+
dndStore.direction.set('row')
|
|
85
|
+
dndStore.dragging.set(true)
|
|
86
|
+
dndStore.draggingIndex.set(index)
|
|
87
|
+
dndStore.startX.set(event.clientX)
|
|
88
|
+
dndStore.startY.set(event.clientY)
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const TableHandleRowMenuTriggerElementBase: HostElementConstructor<TableHandleRowMenuTriggerProps> = defineCustomElement(
|
|
93
|
+
setupTableHandleRowMenuTrigger,
|
|
94
|
+
TableHandleRowMenuTriggerPropsDeclaration,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @public
|
|
99
|
+
*/
|
|
100
|
+
export class TableHandleRowMenuTriggerElement extends TableHandleRowMenuTriggerElementBase {}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
105
|
+
export function registerTableHandleRowMenuTriggerElement(): void {
|
|
106
|
+
registerCustomElement('prosekit-table-handle-row-menu-trigger', TableHandleRowMenuTriggerElement)
|
|
107
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineCustomElement,
|
|
3
|
+
defineProps,
|
|
4
|
+
registerCustomElement,
|
|
5
|
+
type HostElement,
|
|
6
|
+
type HostElementConstructor,
|
|
7
|
+
type PropsDeclaration,
|
|
8
|
+
type State,
|
|
9
|
+
} from '@aria-ui/core'
|
|
10
|
+
import { setupOverlayPopup } from '@aria-ui/elements/overlay'
|
|
11
|
+
|
|
12
|
+
import { tableHandleStoreContext } from './store.ts'
|
|
13
|
+
|
|
14
|
+
export interface TableHandleRowPopupProps {}
|
|
15
|
+
|
|
16
|
+
/** @internal */
|
|
17
|
+
export const TableHandleRowPopupPropsDeclaration: PropsDeclaration<TableHandleRowPopupProps> = defineProps<TableHandleRowPopupProps>({})
|
|
18
|
+
|
|
19
|
+
/** @internal */
|
|
20
|
+
export function setupTableHandleRowPopup(
|
|
21
|
+
host: HostElement,
|
|
22
|
+
_props: State<TableHandleRowPopupProps>,
|
|
23
|
+
): void {
|
|
24
|
+
const getStore = tableHandleStoreContext.consume(host)
|
|
25
|
+
const getOverlayStore = () => getStore()?.rowOverlayStore
|
|
26
|
+
setupOverlayPopup(host, getOverlayStore)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const TableHandleRowPopupElementBase: HostElementConstructor<TableHandleRowPopupProps> = defineCustomElement(
|
|
30
|
+
setupTableHandleRowPopup,
|
|
31
|
+
TableHandleRowPopupPropsDeclaration,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @public
|
|
36
|
+
*/
|
|
37
|
+
export class TableHandleRowPopupElement extends TableHandleRowPopupElementBase {}
|
|
38
|
+
|
|
39
|
+
/** @internal */
|
|
40
|
+
export function registerTableHandleRowPopupElement(): void {
|
|
41
|
+
registerCustomElement('prosekit-table-handle-row-popup', TableHandleRowPopupElement)
|
|
42
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
defineCustomElement,
|
|
4
|
+
defineProps,
|
|
5
|
+
registerCustomElement,
|
|
6
|
+
useEffect,
|
|
7
|
+
type HostElement,
|
|
8
|
+
type HostElementConstructor,
|
|
9
|
+
type PropsDeclaration,
|
|
10
|
+
type State,
|
|
11
|
+
} from '@aria-ui/core'
|
|
12
|
+
import { setupOverlayPositioner } from '@aria-ui/elements/overlay'
|
|
13
|
+
import type { Placement } from '@floating-ui/dom'
|
|
14
|
+
|
|
15
|
+
import { useHTMLElementAt } from '../../utils/use-html-element-at.ts'
|
|
16
|
+
|
|
17
|
+
import { SharedTableHandlePositionerPropsDeclaration, type SharedTableHandlePositionerProps } from './shared.ts'
|
|
18
|
+
import { tableHandleStoreContext } from './store.ts'
|
|
19
|
+
|
|
20
|
+
export interface TableHandleRowPositionerProps extends Omit<SharedTableHandlePositionerProps, 'placement'> {
|
|
21
|
+
/**
|
|
22
|
+
* The placement of the popover, relative to the hovered table cell.
|
|
23
|
+
*
|
|
24
|
+
* @default "left"
|
|
25
|
+
*/
|
|
26
|
+
placement: Placement
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** @internal */
|
|
30
|
+
export const TableHandleRowPositionerPropsDeclaration: PropsDeclaration<TableHandleRowPositionerProps> = defineProps<
|
|
31
|
+
TableHandleRowPositionerProps
|
|
32
|
+
>({
|
|
33
|
+
...SharedTableHandlePositionerPropsDeclaration,
|
|
34
|
+
placement: { default: 'left', attribute: 'placement', type: 'string' },
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
/** @internal */
|
|
38
|
+
export function setupTableHandleRowPositioner(
|
|
39
|
+
host: HostElement,
|
|
40
|
+
props: State<TableHandleRowPositionerProps>,
|
|
41
|
+
): void {
|
|
42
|
+
const getStore = tableHandleStoreContext.consume(host)
|
|
43
|
+
const getOverlayStore = () => getStore()?.rowOverlayStore
|
|
44
|
+
setupOverlayPositioner(host, props, getOverlayStore)
|
|
45
|
+
|
|
46
|
+
const getEditor = props.editor.get
|
|
47
|
+
const getRowFirstCellPos = computed(() => getStore()?.getReferenceCell()?.rowFirstCellPos)
|
|
48
|
+
const getReferenceCell = useHTMLElementAt(getEditor, getRowFirstCellPos)
|
|
49
|
+
useEffect(host, () => {
|
|
50
|
+
getOverlayStore()?.setAnchorElement(getReferenceCell())
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const TableHandleRowPositionerElementBase: HostElementConstructor<TableHandleRowPositionerProps> = defineCustomElement(
|
|
55
|
+
setupTableHandleRowPositioner,
|
|
56
|
+
TableHandleRowPositionerPropsDeclaration,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @public
|
|
61
|
+
*/
|
|
62
|
+
export class TableHandleRowPositionerElement extends TableHandleRowPositionerElementBase {}
|
|
63
|
+
|
|
64
|
+
/** @internal */
|
|
65
|
+
export function registerTableHandleRowPositionerElement(): void {
|
|
66
|
+
registerCustomElement('prosekit-table-handle-row-positioner', TableHandleRowPositionerElement)
|
|
67
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { computed, useEffect, type HostElement } from '@aria-ui/core'
|
|
2
|
+
import type { Editor } from '@prosekit/core'
|
|
3
|
+
import { moveTableColumn, moveTableRow } from '@prosekit/extensions/table'
|
|
4
|
+
|
|
5
|
+
import { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'
|
|
6
|
+
|
|
7
|
+
import type { TableHandleStore } from './store.ts'
|
|
8
|
+
|
|
9
|
+
export function useDrop(
|
|
10
|
+
host: HostElement,
|
|
11
|
+
getEditor: () => Editor | null,
|
|
12
|
+
store: TableHandleStore,
|
|
13
|
+
): void {
|
|
14
|
+
const getDndStore = () => store.dndStore
|
|
15
|
+
const getDragging = computed(() => getDndStore().dragging.get())
|
|
16
|
+
|
|
17
|
+
useEffect(host, () => {
|
|
18
|
+
const view = getSafeEditorView(getEditor())
|
|
19
|
+
if (!view || !view.editable) return
|
|
20
|
+
|
|
21
|
+
const ownerDocument = view.dom?.ownerDocument
|
|
22
|
+
if (!ownerDocument) return
|
|
23
|
+
|
|
24
|
+
const handleDrop = () => {
|
|
25
|
+
if (!getDragging()) return
|
|
26
|
+
const editor = getEditor()
|
|
27
|
+
if (!editor) return
|
|
28
|
+
|
|
29
|
+
const dndStore = getDndStore()
|
|
30
|
+
|
|
31
|
+
const droppingIndex = dndStore.droppingIndex.get()
|
|
32
|
+
const draggingIndex = dndStore.draggingIndex.get()
|
|
33
|
+
const direction = dndStore.direction.get()
|
|
34
|
+
|
|
35
|
+
if (draggingIndex < 0 || droppingIndex < 0) {
|
|
36
|
+
console.warn('[prosekit] Invalid drag indices:', { draggingIndex, droppingIndex })
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (direction === 'row') {
|
|
41
|
+
editor.exec(moveTableRow({ from: draggingIndex, to: droppingIndex }))
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
if (direction === 'col') {
|
|
45
|
+
editor.exec(moveTableColumn({ from: draggingIndex, to: droppingIndex }))
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const handleDragOver = (event: DragEvent) => {
|
|
51
|
+
if (!getDragging()) return
|
|
52
|
+
event.preventDefault()
|
|
53
|
+
const dndStore = getDndStore()
|
|
54
|
+
dndStore.dragging.set(true)
|
|
55
|
+
dndStore.x.set(event.clientX)
|
|
56
|
+
dndStore.y.set(event.clientY)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const handleDragEnd = () => {
|
|
60
|
+
if (!getDragging()) return
|
|
61
|
+
const dndStore = getDndStore()
|
|
62
|
+
dndStore.dragging.set(false)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
ownerDocument.addEventListener('dragover', handleDragOver)
|
|
66
|
+
ownerDocument.addEventListener('drop', handleDrop)
|
|
67
|
+
ownerDocument.addEventListener('dragend', handleDragEnd)
|
|
68
|
+
return () => {
|
|
69
|
+
ownerDocument.removeEventListener('dragover', handleDragOver)
|
|
70
|
+
ownerDocument.removeEventListener('drop', handleDrop)
|
|
71
|
+
ownerDocument.removeEventListener('dragend', handleDragEnd)
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { useEffect } from '@aria-ui/core'
|
|
1
|
+
import { useEffect, type HostElement } from '@aria-ui/core'
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Returns a function that returns a 1x1 transparent image. This is used to
|
|
@@ -12,7 +11,7 @@ import { useEffect } from '@aria-ui/core'
|
|
|
12
11
|
* @internal
|
|
13
12
|
*/
|
|
14
13
|
export function useEmptyImage(
|
|
15
|
-
host:
|
|
14
|
+
host: HostElement,
|
|
16
15
|
): () => HTMLImageElement | undefined {
|
|
17
16
|
let image: HTMLImageElement | undefined
|
|
18
17
|
|
|
@@ -9,17 +9,6 @@ export interface HoveringCellInfo {
|
|
|
9
9
|
colFirstCellPos: number
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export interface DndInfo {
|
|
13
|
-
dragging: boolean
|
|
14
|
-
direction: 'row' | 'col'
|
|
15
|
-
draggingIndex: number
|
|
16
|
-
droppingIndex: number
|
|
17
|
-
x: number
|
|
18
|
-
y: number
|
|
19
|
-
startX: number
|
|
20
|
-
startY: number
|
|
21
|
-
}
|
|
22
|
-
|
|
23
12
|
export function isHoveringCellInfoEqual(
|
|
24
13
|
a?: HoveringCellInfo | null,
|
|
25
14
|
b?: HoveringCellInfo | null,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
@module
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<prosekit-tooltip-root>
|
|
9
|
+
<prosekit-tooltip-trigger>...</prosekit-tooltip-trigger>
|
|
10
|
+
<prosekit-tooltip-positioner>
|
|
11
|
+
<prosekit-tooltip-popup>...</prosekit-tooltip-popup>
|
|
12
|
+
</prosekit-tooltip-positioner>
|
|
13
|
+
</prosekit-tooltip-root>
|
|
14
|
+
```
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { registerCustomElement } from '@aria-ui/core'
|
|
18
|
+
import { TooltipPopupElement, TooltipPositionerElement, TooltipRootElement, TooltipTriggerElement } from '@aria-ui/elements/tooltip'
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
OpenChangeEvent,
|
|
22
|
+
setupTooltipPopup,
|
|
23
|
+
setupTooltipPositioner,
|
|
24
|
+
setupTooltipRoot,
|
|
25
|
+
setupTooltipTrigger,
|
|
26
|
+
TooltipPopupElement,
|
|
27
|
+
TooltipPopupPropsDeclaration,
|
|
28
|
+
TooltipPositionerElement,
|
|
29
|
+
TooltipPositionerPropsDeclaration,
|
|
30
|
+
TooltipRootElement,
|
|
31
|
+
TooltipRootPropsDeclaration,
|
|
32
|
+
TooltipTriggerElement,
|
|
33
|
+
TooltipTriggerPropsDeclaration,
|
|
34
|
+
type TooltipPopupProps,
|
|
35
|
+
type TooltipPositionerProps,
|
|
36
|
+
type TooltipRootEvents,
|
|
37
|
+
type TooltipRootProps,
|
|
38
|
+
type TooltipTriggerProps,
|
|
39
|
+
} from '@aria-ui/elements/tooltip'
|
|
40
|
+
|
|
41
|
+
export function registerTooltipRootElement(): void {
|
|
42
|
+
registerCustomElement('prosekit-tooltip-root', TooltipRootElement)
|
|
43
|
+
}
|
|
44
|
+
export function registerTooltipTriggerElement(): void {
|
|
45
|
+
registerCustomElement('prosekit-tooltip-trigger', TooltipTriggerElement)
|
|
46
|
+
}
|
|
47
|
+
export function registerTooltipPopupElement(): void {
|
|
48
|
+
registerCustomElement('prosekit-tooltip-popup', TooltipPopupElement)
|
|
49
|
+
}
|
|
50
|
+
export function registerTooltipPositionerElement(): void {
|
|
51
|
+
registerCustomElement('prosekit-tooltip-positioner', TooltipPositionerElement)
|
|
52
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { useEffect, type
|
|
1
|
+
import { useEffect, type HostElement } from '@aria-ui/core'
|
|
2
2
|
import type { Editor, Extension } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
export function useEditorExtension(
|
|
5
|
-
host:
|
|
6
|
-
|
|
5
|
+
host: HostElement,
|
|
6
|
+
getEditor: () => Editor | null,
|
|
7
7
|
extension: Extension,
|
|
8
8
|
): void {
|
|
9
9
|
useEffect(host, () => {
|
|
10
|
-
return
|
|
10
|
+
return getEditor()?.use(extension)
|
|
11
11
|
})
|
|
12
12
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineFocusChangeHandler, type Editor, type FocusChangeHandler } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
@@ -7,10 +7,10 @@ import { useEditorExtension } from './use-editor-extension.ts'
|
|
|
7
7
|
* @internal
|
|
8
8
|
*/
|
|
9
9
|
export function useEditorFocusChangeEvent(
|
|
10
|
-
host:
|
|
11
|
-
|
|
10
|
+
host: HostElement,
|
|
11
|
+
getEditor: () => Editor | null,
|
|
12
12
|
handler: FocusChangeHandler,
|
|
13
13
|
): void {
|
|
14
14
|
const extension = defineFocusChangeHandler(handler)
|
|
15
|
-
useEditorExtension(host,
|
|
15
|
+
useEditorExtension(host, getEditor, extension)
|
|
16
16
|
}
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
import { createSignal, type
|
|
1
|
+
import { createSignal, type HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineDOMEventHandler, union, type Editor } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
5
5
|
|
|
6
6
|
export function useEditorTyping(
|
|
7
|
-
host:
|
|
8
|
-
|
|
9
|
-
):
|
|
7
|
+
host: HostElement,
|
|
8
|
+
getEditor: () => Editor | null,
|
|
9
|
+
): () => boolean {
|
|
10
10
|
const typing = createSignal(false)
|
|
11
11
|
|
|
12
|
-
const handleKeypress = () => {
|
|
13
|
-
typing.set(true)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const handlePointerMove = () => {
|
|
17
|
-
typing.set(false)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
12
|
const extension = union(
|
|
21
|
-
defineDOMEventHandler('keypress',
|
|
22
|
-
|
|
13
|
+
defineDOMEventHandler('keypress', () => {
|
|
14
|
+
typing.set(true)
|
|
15
|
+
}),
|
|
16
|
+
defineDOMEventHandler('pointermove', () => {
|
|
17
|
+
typing.set(false)
|
|
18
|
+
}),
|
|
23
19
|
)
|
|
24
20
|
|
|
25
|
-
useEditorExtension(host,
|
|
21
|
+
useEditorExtension(host, getEditor, extension)
|
|
26
22
|
|
|
27
|
-
return typing
|
|
23
|
+
return typing.get
|
|
28
24
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineUpdateHandler, type Editor, type UpdateHandler } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
@@ -7,10 +7,10 @@ import { useEditorExtension } from './use-editor-extension.ts'
|
|
|
7
7
|
* @internal
|
|
8
8
|
*/
|
|
9
9
|
export function useEditorUpdateEvent(
|
|
10
|
-
host:
|
|
11
|
-
|
|
10
|
+
host: HostElement,
|
|
11
|
+
getEditor: () => Editor | null,
|
|
12
12
|
handler: UpdateHandler,
|
|
13
13
|
): void {
|
|
14
14
|
const extension = defineUpdateHandler(handler)
|
|
15
|
-
useEditorExtension(host,
|
|
15
|
+
useEditorExtension(host, getEditor, extension)
|
|
16
16
|
}
|
package/src/hooks/use-keymap.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineKeymap, type Editor, type Keymap } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
5
5
|
|
|
6
6
|
export function useKeymap(
|
|
7
|
-
host:
|
|
8
|
-
|
|
7
|
+
host: HostElement,
|
|
8
|
+
getEditor: () => Editor | null,
|
|
9
9
|
keymap: Keymap,
|
|
10
10
|
): void {
|
|
11
11
|
const extension = defineKeymap(keymap)
|
|
12
|
-
useEditorExtension(host,
|
|
12
|
+
useEditorExtension(host, getEditor, extension)
|
|
13
13
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createSignal, useEffect, type
|
|
2
|
-
import { getNearestOverflowAncestor } from '@
|
|
1
|
+
import { createSignal, useEffect, type HostElement } from '@aria-ui/core'
|
|
2
|
+
import { getNearestOverflowAncestor } from '@aria-ui/utils'
|
|
3
3
|
|
|
4
|
-
export function useScrolling(host:
|
|
4
|
+
export function useScrolling(host: HostElement): () => boolean {
|
|
5
5
|
const scrolling = createSignal(false)
|
|
6
6
|
|
|
7
7
|
useEffect(host, () => {
|
|
@@ -15,16 +15,17 @@ export function useScrolling(host: ConnectableElement): ReadonlySignal<boolean>
|
|
|
15
15
|
scrolling.set(false)
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const abortController = new AbortController()
|
|
19
|
+
const abortSignal = abortController.signal
|
|
20
|
+
|
|
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 })
|
|
21
24
|
|
|
22
25
|
return () => {
|
|
23
|
-
|
|
24
|
-
window.removeEventListener('mousemove', handleMouseMove)
|
|
25
|
-
window.removeEventListener('pointermove', handleMouseMove)
|
|
26
|
+
abortController.abort()
|
|
26
27
|
}
|
|
27
28
|
})
|
|
28
29
|
|
|
29
|
-
return scrolling
|
|
30
|
+
return scrolling.get
|
|
30
31
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { createSignal, useEffect, type ConnectableElement } from '@aria-ui/core'
|
|
1
|
+
import { createSignal, useEffect, type HostElement } from '@aria-ui/core'
|
|
3
2
|
import type { Editor } from '@prosekit/core'
|
|
4
3
|
|
|
5
4
|
import { getSafeEditorView } from '../utils/get-safe-editor-view.ts'
|
|
@@ -9,25 +8,22 @@ import { getSafeEditorView } from '../utils/get-safe-editor-view.ts'
|
|
|
9
8
|
* components should be disabled or hidden.
|
|
10
9
|
*/
|
|
11
10
|
export function useSelecting(
|
|
12
|
-
host:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
):
|
|
11
|
+
host: HostElement,
|
|
12
|
+
getEditor: () => Editor | null,
|
|
13
|
+
getEnabled: () => boolean,
|
|
14
|
+
): () => boolean {
|
|
16
15
|
const selecting = createSignal(false)
|
|
17
16
|
const isPointerDown = createSignal(false)
|
|
18
17
|
|
|
19
18
|
useEffect(host, () => {
|
|
20
|
-
if (!
|
|
21
|
-
return
|
|
22
|
-
}
|
|
19
|
+
if (!getEnabled()) return
|
|
23
20
|
|
|
24
|
-
const view = getSafeEditorView(
|
|
21
|
+
const view = getSafeEditorView(getEditor())
|
|
25
22
|
if (!view) return
|
|
26
23
|
|
|
27
24
|
const { dom, root } = view
|
|
28
25
|
if (!root) return
|
|
29
26
|
|
|
30
|
-
// When the user starts selecting text, we set the selecting signal to true.
|
|
31
27
|
const handlePointerDown = () => {
|
|
32
28
|
selecting.set(true)
|
|
33
29
|
isPointerDown.set(true)
|
|
@@ -35,15 +31,12 @@ export function useSelecting(
|
|
|
35
31
|
const handlePointerUp = () => {
|
|
36
32
|
isPointerDown.set(false)
|
|
37
33
|
}
|
|
38
|
-
// When the user moves the pointer and the pointer is not down, we set the
|
|
39
|
-
// selecting signal to false again.
|
|
40
34
|
const handleMouseMove = () => {
|
|
41
35
|
if (!isPointerDown.get()) {
|
|
42
36
|
selecting.set(false)
|
|
43
37
|
}
|
|
44
38
|
}
|
|
45
39
|
|
|
46
|
-
// Only listen to pointer down events on the editor
|
|
47
40
|
dom.addEventListener('pointerdown', handlePointerDown)
|
|
48
41
|
root.addEventListener('pointerup', handlePointerUp)
|
|
49
42
|
root.addEventListener('pointermove', handleMouseMove)
|
|
@@ -55,5 +48,5 @@ export function useSelecting(
|
|
|
55
48
|
}
|
|
56
49
|
})
|
|
57
50
|
|
|
58
|
-
return selecting
|
|
51
|
+
return selecting.get
|
|
59
52
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
function cloneKeyboardEvent(source: KeyboardEvent): KeyboardEvent {
|
|
2
|
+
return new KeyboardEvent(source.type, {
|
|
3
|
+
code: source.code,
|
|
4
|
+
key: source.key,
|
|
5
|
+
location: source.location,
|
|
6
|
+
repeat: source.repeat,
|
|
7
|
+
altKey: source.altKey,
|
|
8
|
+
ctrlKey: source.ctrlKey,
|
|
9
|
+
metaKey: source.metaKey,
|
|
10
|
+
shiftKey: source.shiftKey,
|
|
11
|
+
|
|
12
|
+
view: source.view,
|
|
13
|
+
// internal bridge target; events don't need to bubble"
|
|
14
|
+
bubbles: false,
|
|
15
|
+
cancelable: true,
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class KeyboardEventTarget extends EventTarget {
|
|
20
|
+
override dispatchEvent(event: KeyboardEvent): boolean {
|
|
21
|
+
const newEvent = cloneKeyboardEvent(event)
|
|
22
|
+
const result: boolean = super.dispatchEvent(newEvent)
|
|
23
|
+
if (newEvent.defaultPrevented) {
|
|
24
|
+
event.preventDefault()
|
|
25
|
+
}
|
|
26
|
+
return result
|
|
27
|
+
}
|
|
28
|
+
}
|