@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,184 @@
|
|
|
1
|
+
import type { HostElement, HostElementConstructor, PropsDeclaration } from '@aria-ui/core'
|
|
2
|
+
import { createSignal, defineCustomElement, defineProps, registerCustomElement, useEffect, type State } from '@aria-ui/core'
|
|
3
|
+
import { useAttribute } from '@aria-ui/utils'
|
|
4
|
+
|
|
5
|
+
import { isFinitePositiveNumber } from '../../utils/is-finite-positive-number.ts'
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
onResizeContext,
|
|
9
|
+
onResizeEndContext,
|
|
10
|
+
onResizeStartContext,
|
|
11
|
+
type OnResize,
|
|
12
|
+
type OnResizeEnd,
|
|
13
|
+
type OnResizeStart,
|
|
14
|
+
} from './context.ts'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export interface ResizableRootProps {
|
|
20
|
+
/**
|
|
21
|
+
* The width of the resizable element.
|
|
22
|
+
*
|
|
23
|
+
* @default null
|
|
24
|
+
*/
|
|
25
|
+
width: number | null
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The height of the resizable element.
|
|
29
|
+
*
|
|
30
|
+
* @default null
|
|
31
|
+
*/
|
|
32
|
+
height: number | null
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The aspect ratio of the resizable element.
|
|
36
|
+
*
|
|
37
|
+
* @default null
|
|
38
|
+
*/
|
|
39
|
+
aspectRatio: number | null
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export const ResizableRootPropsDeclaration: PropsDeclaration<ResizableRootProps> = defineProps<ResizableRootProps>({
|
|
46
|
+
width: { default: null, attribute: 'data-width', type: 'json' },
|
|
47
|
+
height: { default: null, attribute: 'data-height', type: 'json' },
|
|
48
|
+
aspectRatio: { default: null, attribute: 'data-aspect-ratio', type: 'json' },
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @public
|
|
53
|
+
*/
|
|
54
|
+
export interface ResizableRootEvents {
|
|
55
|
+
/**
|
|
56
|
+
* Emitted when a resize operation starts.
|
|
57
|
+
*/
|
|
58
|
+
resizeStart: ResizeStartEvent
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Emitted when a resize operation ends.
|
|
62
|
+
*/
|
|
63
|
+
resizeEnd: ResizeEndEvent
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @public
|
|
68
|
+
*/
|
|
69
|
+
export class ResizeStartEvent extends Event {
|
|
70
|
+
readonly detail: {
|
|
71
|
+
readonly width: number
|
|
72
|
+
readonly height: number
|
|
73
|
+
}
|
|
74
|
+
constructor(width: number, height: number) {
|
|
75
|
+
super('resizeStart')
|
|
76
|
+
this.detail = { width, height }
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @public
|
|
82
|
+
*/
|
|
83
|
+
export class ResizeEndEvent extends Event {
|
|
84
|
+
readonly detail: {
|
|
85
|
+
readonly width: number
|
|
86
|
+
readonly height: number
|
|
87
|
+
}
|
|
88
|
+
constructor(width: number, height: number) {
|
|
89
|
+
super('resizeEnd')
|
|
90
|
+
this.detail = { width, height }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
export function setupResizableRoot(
|
|
98
|
+
host: HostElement,
|
|
99
|
+
props: State<ResizableRootProps>,
|
|
100
|
+
): void {
|
|
101
|
+
const resizing = createSignal(false)
|
|
102
|
+
|
|
103
|
+
const onResizeStart: OnResizeStart = () => {
|
|
104
|
+
const { width, height } = host.getBoundingClientRect()
|
|
105
|
+
|
|
106
|
+
let aspectRatio: number = props.aspectRatio.get() ?? width / height
|
|
107
|
+
|
|
108
|
+
if (!isFinitePositiveNumber(aspectRatio)) {
|
|
109
|
+
aspectRatio = 0
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
resizing.set(true)
|
|
113
|
+
host.dispatchEvent(new ResizeStartEvent(width, height))
|
|
114
|
+
return [width, height, aspectRatio]
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const onResize: OnResize = (width, height) => {
|
|
118
|
+
props.width.set(width)
|
|
119
|
+
props.height.set(height)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const onResizeEnd: OnResizeEnd = () => {
|
|
123
|
+
const { width, height } = host.getBoundingClientRect()
|
|
124
|
+
resizing.set(false)
|
|
125
|
+
host.dispatchEvent(new ResizeEndEvent(width, height))
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
onResizeStartContext.provide(host, onResizeStart)
|
|
129
|
+
onResizeContext.provide(host, onResize)
|
|
130
|
+
onResizeEndContext.provide(host, onResizeEnd)
|
|
131
|
+
|
|
132
|
+
useEffect(host, () => {
|
|
133
|
+
updateResizableRootStyles(
|
|
134
|
+
host,
|
|
135
|
+
Math.max(props.width.get() || 0, 1),
|
|
136
|
+
Math.max(props.height.get() || 0, 1),
|
|
137
|
+
props.aspectRatio.get(),
|
|
138
|
+
)
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
useAttribute(host, 'data-resizing', () => (resizing.get() ? '' : undefined))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function updateResizableRootStyles(
|
|
145
|
+
host: HostElement,
|
|
146
|
+
width: number,
|
|
147
|
+
height: number,
|
|
148
|
+
aspectRatio: number | null,
|
|
149
|
+
) {
|
|
150
|
+
host.style.width = isFinitePositiveNumber(width) ? `${width}px` : ''
|
|
151
|
+
|
|
152
|
+
host.style.height = isFinitePositiveNumber(height) ? `${height}px` : ''
|
|
153
|
+
|
|
154
|
+
if (isFinitePositiveNumber(aspectRatio)) {
|
|
155
|
+
host.style.aspectRatio = `${aspectRatio}`
|
|
156
|
+
|
|
157
|
+
if (width && width > 0 && aspectRatio >= 1) {
|
|
158
|
+
host.style.height = 'auto'
|
|
159
|
+
} else if (height && height > 0 && aspectRatio <= 1) {
|
|
160
|
+
host.style.width = 'min-content'
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const ResizableRootElementBase: HostElementConstructor<ResizableRootProps> = defineCustomElement(
|
|
166
|
+
setupResizableRoot,
|
|
167
|
+
ResizableRootPropsDeclaration,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @public
|
|
172
|
+
*/
|
|
173
|
+
export class ResizableRootElement extends ResizableRootElementBase {}
|
|
174
|
+
|
|
175
|
+
let isResizableRootRegistered = false
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @internal
|
|
179
|
+
*/
|
|
180
|
+
export function registerResizableRootElement(): void {
|
|
181
|
+
if (isResizableRootRegistered) return
|
|
182
|
+
isResizableRootRegistered = true
|
|
183
|
+
registerCustomElement('prosekit-resizable-root', ResizableRootElement)
|
|
184
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useEffect, type HostElement } from '@aria-ui/core'
|
|
2
2
|
import { computePosition, offset } from '@floating-ui/dom'
|
|
3
3
|
import { isHTMLElement } from '@ocavue/utils'
|
|
4
4
|
import type { Editor } from '@prosekit/core'
|
|
@@ -7,10 +7,10 @@ import type { EditorView } from '@prosekit/pm/view'
|
|
|
7
7
|
import { assignStyles } from '../../utils/assign-styles.ts'
|
|
8
8
|
import { getSafeEditorView } from '../../utils/get-safe-editor-view.ts'
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import { tableHandleStoreContext } from './store.ts'
|
|
11
11
|
|
|
12
12
|
export type OnInitParams = {
|
|
13
|
-
host:
|
|
13
|
+
host: HostElement
|
|
14
14
|
direction: 'row' | 'col'
|
|
15
15
|
dragging: boolean
|
|
16
16
|
draggingIndex: number
|
|
@@ -19,41 +19,30 @@ export type OnInitParams = {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export function useInitDndPosition(
|
|
22
|
-
host:
|
|
23
|
-
|
|
22
|
+
host: HostElement,
|
|
23
|
+
getEditor: () => Editor | null,
|
|
24
24
|
onInit: (params: OnInitParams) => void,
|
|
25
25
|
): void {
|
|
26
|
-
const
|
|
27
|
-
const rootContext = tableHandleRootContext.consume(host)
|
|
28
|
-
|
|
29
|
-
const draggingSignal = createComputed(() => {
|
|
30
|
-
const context = dndContext.get()
|
|
31
|
-
return context.dragging
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
const directionSignal = createComputed(() => {
|
|
35
|
-
const context = dndContext.get()
|
|
36
|
-
return context.direction
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
const draggingIndexSignal = createComputed(() => {
|
|
40
|
-
const context = dndContext.get()
|
|
41
|
-
return context.draggingIndex
|
|
42
|
-
})
|
|
26
|
+
const getStore = tableHandleStoreContext.consume(host)
|
|
43
27
|
|
|
44
28
|
useEffect(host, () => {
|
|
45
|
-
const view = getSafeEditorView(
|
|
29
|
+
const view = getSafeEditorView(getEditor())
|
|
46
30
|
if (!view) return
|
|
47
31
|
|
|
48
|
-
const
|
|
49
|
-
|
|
32
|
+
const store = getStore()
|
|
33
|
+
if (!store) return
|
|
34
|
+
|
|
35
|
+
const dndStore = store.dndStore
|
|
36
|
+
|
|
37
|
+
const dragging = dndStore.dragging.get()
|
|
38
|
+
const direction = dndStore.direction.get()
|
|
50
39
|
|
|
51
40
|
host.dataset.direction = direction
|
|
52
41
|
host.dataset.dragging = dragging.toString()
|
|
53
42
|
|
|
54
|
-
const draggingIndex =
|
|
43
|
+
const draggingIndex = dndStore.draggingIndex.get()
|
|
55
44
|
|
|
56
|
-
const relatedDOMs = getDndRelatedDOMs(view,
|
|
45
|
+
const relatedDOMs = getDndRelatedDOMs(view, store.getReferenceCell()?.cellPos, draggingIndex, direction)
|
|
57
46
|
if (!relatedDOMs) return
|
|
58
47
|
const { table, cell } = relatedDOMs
|
|
59
48
|
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
@module
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<prosekit-table-handle-root>
|
|
9
|
+
<prosekit-table-handle-drag-preview></prosekit-table-handle-drag-preview>
|
|
10
|
+
<prosekit-table-handle-drop-indicator></prosekit-table-handle-drop-indicator>
|
|
11
|
+
<prosekit-table-handle-column-positioner>
|
|
12
|
+
<prosekit-table-handle-column-popup>
|
|
13
|
+
<prosekit-table-handle-column-menu-root>
|
|
14
|
+
<prosekit-table-handle-column-menu-trigger>...</prosekit-table-handle-column-menu-trigger>
|
|
15
|
+
<prosekit-menu-positioner>
|
|
16
|
+
<prosekit-menu-popup>
|
|
17
|
+
<prosekit-menu-item>...</prosekit-menu-item>
|
|
18
|
+
</prosekit-menu-popup>
|
|
19
|
+
</prosekit-menu-positioner>
|
|
20
|
+
</prosekit-table-handle-column-menu-root>
|
|
21
|
+
</prosekit-table-handle-column-popup>
|
|
22
|
+
</prosekit-table-handle-column-positioner>
|
|
23
|
+
<prosekit-table-handle-row-positioner>
|
|
24
|
+
<prosekit-table-handle-row-popup>
|
|
25
|
+
<prosekit-table-handle-row-menu-root>
|
|
26
|
+
<prosekit-table-handle-row-menu-trigger>...</prosekit-table-handle-row-menu-trigger>
|
|
27
|
+
<prosekit-menu-positioner>
|
|
28
|
+
<prosekit-menu-popup>
|
|
29
|
+
<prosekit-menu-item>...</prosekit-menu-item>
|
|
30
|
+
</prosekit-menu-popup>
|
|
31
|
+
</prosekit-menu-positioner>
|
|
32
|
+
</prosekit-table-handle-row-menu-root>
|
|
33
|
+
</prosekit-table-handle-row-popup>
|
|
34
|
+
</prosekit-table-handle-row-positioner>
|
|
35
|
+
</prosekit-table-handle-root>
|
|
36
|
+
```
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
registerTableHandleColumnPopupElement,
|
|
41
|
+
setupTableHandleColumnPopup,
|
|
42
|
+
TableHandleColumnPopupElement,
|
|
43
|
+
TableHandleColumnPopupPropsDeclaration,
|
|
44
|
+
type TableHandleColumnPopupProps,
|
|
45
|
+
} from './table-handle-column-popup.ts'
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
registerTableHandleColumnPositionerElement,
|
|
49
|
+
setupTableHandleColumnPositioner,
|
|
50
|
+
TableHandleColumnPositionerElement,
|
|
51
|
+
TableHandleColumnPositionerPropsDeclaration,
|
|
52
|
+
type TableHandleColumnPositionerProps,
|
|
53
|
+
} from './table-handle-column-positioner.ts'
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
registerTableHandleColumnMenuRootElement,
|
|
57
|
+
setupTableHandleColumnMenuRoot,
|
|
58
|
+
TableHandleColumnMenuRootElement,
|
|
59
|
+
TableHandleColumnMenuRootPropsDeclaration,
|
|
60
|
+
type TableHandleColumnMenuRootProps,
|
|
61
|
+
} from './table-handle-column-menu-root.ts'
|
|
62
|
+
|
|
63
|
+
export {
|
|
64
|
+
registerTableHandleColumnMenuTriggerElement,
|
|
65
|
+
setupTableHandleColumnMenuTrigger,
|
|
66
|
+
TableHandleColumnMenuTriggerElement,
|
|
67
|
+
TableHandleColumnMenuTriggerPropsDeclaration,
|
|
68
|
+
type TableHandleColumnMenuTriggerProps,
|
|
69
|
+
} from './table-handle-column-menu-trigger.ts'
|
|
70
|
+
|
|
71
|
+
export {
|
|
72
|
+
registerTableHandleDragPreviewElement,
|
|
73
|
+
setupTableHandleDragPreview,
|
|
74
|
+
TableHandleDragPreviewElement,
|
|
75
|
+
TableHandleDragPreviewPropsDeclaration,
|
|
76
|
+
type TableHandleDragPreviewProps,
|
|
77
|
+
} from './table-handle-drag-preview.ts'
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
registerTableHandleDropIndicatorElement,
|
|
81
|
+
setupTableHandleDropIndicator,
|
|
82
|
+
TableHandleDropIndicatorElement,
|
|
83
|
+
TableHandleDropIndicatorPropsDeclaration,
|
|
84
|
+
type TableHandleDropIndicatorProps,
|
|
85
|
+
} from './table-handle-drop-indicator.ts'
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
registerTableHandleRootElement,
|
|
89
|
+
setupTableHandleRoot,
|
|
90
|
+
TableHandleRootElement,
|
|
91
|
+
TableHandleRootPropsDeclaration,
|
|
92
|
+
type TableHandleRootProps,
|
|
93
|
+
} from './table-handle-root.ts'
|
|
94
|
+
|
|
95
|
+
export {
|
|
96
|
+
registerTableHandleRowPopupElement,
|
|
97
|
+
setupTableHandleRowPopup,
|
|
98
|
+
TableHandleRowPopupElement,
|
|
99
|
+
TableHandleRowPopupPropsDeclaration,
|
|
100
|
+
type TableHandleRowPopupProps,
|
|
101
|
+
} from './table-handle-row-popup.ts'
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
registerTableHandleRowPositionerElement,
|
|
105
|
+
setupTableHandleRowPositioner,
|
|
106
|
+
TableHandleRowPositionerElement,
|
|
107
|
+
TableHandleRowPositionerPropsDeclaration,
|
|
108
|
+
type TableHandleRowPositionerProps,
|
|
109
|
+
} from './table-handle-row-positioner.ts'
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
registerTableHandleRowMenuRootElement,
|
|
113
|
+
setupTableHandleRowMenuRoot,
|
|
114
|
+
TableHandleRowMenuRootElement,
|
|
115
|
+
TableHandleRowMenuRootPropsDeclaration,
|
|
116
|
+
type TableHandleRowMenuRootProps,
|
|
117
|
+
} from './table-handle-row-menu-root.ts'
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
registerTableHandleRowMenuTriggerElement,
|
|
121
|
+
setupTableHandleRowMenuTrigger,
|
|
122
|
+
TableHandleRowMenuTriggerElement,
|
|
123
|
+
TableHandleRowMenuTriggerPropsDeclaration,
|
|
124
|
+
type TableHandleRowMenuTriggerProps,
|
|
125
|
+
} from './table-handle-row-menu-trigger.ts'
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { assignStyles } from '
|
|
2
|
-
import { cloneElement, deepCloneElement } from '
|
|
3
|
-
import { fadeColor } from '
|
|
4
|
-
import { getEffectiveBackgroundColor } from '
|
|
5
|
-
import { injectStyle } from '
|
|
1
|
+
import { assignStyles } from '../../utils/assign-styles.ts'
|
|
2
|
+
import { cloneElement, deepCloneElement } from '../../utils/clone-element.ts'
|
|
3
|
+
import { fadeColor } from '../../utils/fade-color.ts'
|
|
4
|
+
import { getEffectiveBackgroundColor } from '../../utils/get-effective-background-color.ts'
|
|
5
|
+
import { injectStyle } from '../../utils/inject-style.ts'
|
|
6
6
|
|
|
7
7
|
export function clearPreviewDOM(previewRoot: HTMLElement): void {
|
|
8
8
|
while (previewRoot.firstChild) {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { defineProps, type PropsDeclaration } from '@aria-ui/core'
|
|
2
|
+
import { OverlayPositionerPropsDeclaration, type OverlayPositionerProps } from '@aria-ui/elements/overlay'
|
|
3
|
+
import type { Editor } from '@prosekit/core'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export interface SharedTableHandlePositionerProps extends Omit<OverlayPositionerProps, 'hoist' | 'flip' | 'shift' | 'hide' | 'offset'> {
|
|
9
|
+
/**
|
|
10
|
+
* The ProseKit editor instance.
|
|
11
|
+
*
|
|
12
|
+
* @default null
|
|
13
|
+
* @hidden
|
|
14
|
+
*/
|
|
15
|
+
editor: Editor | null
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Whether to use the browser [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)
|
|
19
|
+
* to place the floating element on top of other page content.
|
|
20
|
+
*
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
hoist: OverlayPositionerProps['hoist']
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @default false
|
|
27
|
+
* @hidden
|
|
28
|
+
*/
|
|
29
|
+
flip: OverlayPositionerProps['flip']
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @default false
|
|
33
|
+
* @hidden
|
|
34
|
+
*/
|
|
35
|
+
shift: OverlayPositionerProps['shift']
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @default true
|
|
39
|
+
* @hidden
|
|
40
|
+
*/
|
|
41
|
+
hide: OverlayPositionerProps['hide']
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @default 0
|
|
45
|
+
* @hidden
|
|
46
|
+
*/
|
|
47
|
+
offset: OverlayPositionerProps['offset']
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** @internal */
|
|
51
|
+
export const SharedTableHandlePositionerPropsDeclaration: PropsDeclaration<SharedTableHandlePositionerProps> = defineProps<
|
|
52
|
+
SharedTableHandlePositionerProps
|
|
53
|
+
>({
|
|
54
|
+
...OverlayPositionerPropsDeclaration,
|
|
55
|
+
editor: { default: null, attribute: false, type: 'json' },
|
|
56
|
+
hoist: { default: false, attribute: false, type: 'boolean' },
|
|
57
|
+
flip: { default: false, attribute: false, type: 'json' },
|
|
58
|
+
shift: { default: false, attribute: false, type: 'boolean' },
|
|
59
|
+
hide: { default: true, attribute: false, type: 'boolean' },
|
|
60
|
+
offset: { default: 0, attribute: false, type: 'json' },
|
|
61
|
+
})
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { computed, createContext, createSignal, type Context, type Signal } from '@aria-ui/core'
|
|
2
|
+
import type { OpenChangeEvent } from '@aria-ui/elements/overlay'
|
|
3
|
+
import { createOverlayStore, type OverlayStore } from '@aria-ui/elements/overlay'
|
|
4
|
+
|
|
5
|
+
import type { HoveringCellInfo } from './utils.ts'
|
|
6
|
+
|
|
7
|
+
function noop(): void {}
|
|
8
|
+
function returnTrue(): boolean {
|
|
9
|
+
return true
|
|
10
|
+
}
|
|
11
|
+
function returnFalse(): boolean {
|
|
12
|
+
return false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class DndStore {
|
|
16
|
+
readonly dragging: Signal<boolean> = createSignal(false)
|
|
17
|
+
readonly direction: Signal<'row' | 'col'> = createSignal<'row' | 'col'>('row')
|
|
18
|
+
readonly draggingIndex: Signal<number> = createSignal(-1)
|
|
19
|
+
readonly droppingIndex: Signal<number> = createSignal(-1)
|
|
20
|
+
readonly x: Signal<number> = createSignal(-1)
|
|
21
|
+
readonly y: Signal<number> = createSignal(-1)
|
|
22
|
+
readonly startX: Signal<number> = createSignal(-1)
|
|
23
|
+
readonly startY: Signal<number> = createSignal(-1)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export interface TableHandleStore {
|
|
30
|
+
readonly dndStore: DndStore
|
|
31
|
+
readonly setIsColumnMenuOpen: (open: boolean) => void
|
|
32
|
+
readonly setIsRowMenuOpen: (open: boolean) => void
|
|
33
|
+
readonly columnOverlayStore: OverlayStore
|
|
34
|
+
readonly rowOverlayStore: OverlayStore
|
|
35
|
+
readonly getReferenceCell: () => HoveringCellInfo | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export function createTableHandleStore(
|
|
42
|
+
getHoveringCellInfo: () => HoveringCellInfo | undefined,
|
|
43
|
+
getCanShow: () => boolean,
|
|
44
|
+
): TableHandleStore {
|
|
45
|
+
const isColumnMenuOpen = createSignal(false)
|
|
46
|
+
const isRowMenuOpen = createSignal(false)
|
|
47
|
+
|
|
48
|
+
const getHasMenuOpen = (): boolean => {
|
|
49
|
+
return isColumnMenuOpen.get() || isRowMenuOpen.get()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const setIsRowMenuOpen = (open: boolean): void => {
|
|
53
|
+
isRowMenuOpen.set(open)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const setIsColumnMenuOpen = (open: boolean): void => {
|
|
57
|
+
isColumnMenuOpen.set(open)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const referenceCellInfo = createSignal<HoveringCellInfo | undefined>(undefined)
|
|
61
|
+
|
|
62
|
+
let prevHoveringCellInfo: HoveringCellInfo | undefined = undefined
|
|
63
|
+
|
|
64
|
+
const getReferenceCell = computed((): HoveringCellInfo | undefined => {
|
|
65
|
+
if (!getCanShow()) {
|
|
66
|
+
referenceCellInfo.set(undefined)
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Do not toggle/update the menu when hovering another cell if the menu is already open
|
|
71
|
+
if (getHasMenuOpen()) {
|
|
72
|
+
return prevHoveringCellInfo
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
prevHoveringCellInfo = getHoveringCellInfo()
|
|
76
|
+
return prevHoveringCellInfo
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
const getOpen = computed((): boolean => {
|
|
80
|
+
return !!getReferenceCell()
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
const handleOpenChange = (event: OpenChangeEvent) => {
|
|
84
|
+
if (getHasMenuOpen()) {
|
|
85
|
+
event.preventDefault()
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const columnOverlayStore = createOverlayStore(
|
|
90
|
+
getOpen,
|
|
91
|
+
noop,
|
|
92
|
+
returnTrue,
|
|
93
|
+
returnFalse,
|
|
94
|
+
handleOpenChange,
|
|
95
|
+
)
|
|
96
|
+
const rowOverlayStore = createOverlayStore(
|
|
97
|
+
getOpen,
|
|
98
|
+
noop,
|
|
99
|
+
returnTrue,
|
|
100
|
+
returnFalse,
|
|
101
|
+
handleOpenChange,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
dndStore: new DndStore(),
|
|
106
|
+
setIsRowMenuOpen,
|
|
107
|
+
setIsColumnMenuOpen,
|
|
108
|
+
columnOverlayStore,
|
|
109
|
+
rowOverlayStore,
|
|
110
|
+
getReferenceCell,
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @internal
|
|
116
|
+
*/
|
|
117
|
+
export const tableHandleStoreContext: Context<TableHandleStore> = createContext<TableHandleStore>('prosekit-table-handle-store')
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineCustomElement,
|
|
3
|
+
defineProps,
|
|
4
|
+
registerCustomElement,
|
|
5
|
+
useEffect,
|
|
6
|
+
type HostElement,
|
|
7
|
+
type HostElementConstructor,
|
|
8
|
+
type PropsDeclaration,
|
|
9
|
+
type State,
|
|
10
|
+
} from '@aria-ui/core'
|
|
11
|
+
import { MenuRootPropsDeclaration, setupMenuRoot, type MenuRootProps } from '@aria-ui/elements/menu'
|
|
12
|
+
|
|
13
|
+
import { tableHandleStoreContext } from './store.ts'
|
|
14
|
+
|
|
15
|
+
export interface TableHandleColumnMenuRootProps extends MenuRootProps {}
|
|
16
|
+
|
|
17
|
+
/** @internal */
|
|
18
|
+
export const TableHandleColumnMenuRootPropsDeclaration: PropsDeclaration<TableHandleColumnMenuRootProps> = defineProps<
|
|
19
|
+
TableHandleColumnMenuRootProps
|
|
20
|
+
>(MenuRootPropsDeclaration)
|
|
21
|
+
|
|
22
|
+
/** @internal */
|
|
23
|
+
export function setupTableHandleColumnMenuRoot(
|
|
24
|
+
host: HostElement,
|
|
25
|
+
props: State<TableHandleColumnMenuRootProps>,
|
|
26
|
+
): void {
|
|
27
|
+
setupMenuRoot(host, props)
|
|
28
|
+
const getStore = tableHandleStoreContext.consume(host)
|
|
29
|
+
|
|
30
|
+
useEffect(host, () => {
|
|
31
|
+
const open = props.open.get() || false
|
|
32
|
+
const store = getStore?.()
|
|
33
|
+
if (!store) return
|
|
34
|
+
store.setIsColumnMenuOpen(open)
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const TableHandleColumnMenuRootElementBase: HostElementConstructor<TableHandleColumnMenuRootProps> = defineCustomElement(
|
|
39
|
+
setupTableHandleColumnMenuRoot,
|
|
40
|
+
TableHandleColumnMenuRootPropsDeclaration,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export class TableHandleColumnMenuRootElement extends TableHandleColumnMenuRootElementBase {}
|
|
47
|
+
|
|
48
|
+
/** @internal */
|
|
49
|
+
export function registerTableHandleColumnMenuRootElement(): void {
|
|
50
|
+
registerCustomElement('prosekit-table-handle-column-menu-root', TableHandleColumnMenuRootElement)
|
|
51
|
+
}
|