@prosekit/web 0.8.0-beta.0 → 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 +28 -23
- 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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
@module
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<prosekit-popover-root>
|
|
9
|
+
<prosekit-popover-trigger>...</prosekit-popover-trigger>
|
|
10
|
+
<prosekit-popover-positioner>
|
|
11
|
+
<prosekit-popover-popup>...</prosekit-popover-popup>
|
|
12
|
+
</prosekit-popover-positioner>
|
|
13
|
+
</prosekit-popover-root>
|
|
14
|
+
```
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { registerCustomElement } from '@aria-ui/core'
|
|
18
|
+
import { PopoverPopupElement, PopoverPositionerElement, PopoverRootElement, PopoverTriggerElement } from '@aria-ui/elements/popover'
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
OpenChangeEvent,
|
|
22
|
+
PopoverPopupElement,
|
|
23
|
+
PopoverPopupPropsDeclaration,
|
|
24
|
+
PopoverPositionerElement,
|
|
25
|
+
PopoverPositionerPropsDeclaration,
|
|
26
|
+
PopoverRootElement,
|
|
27
|
+
PopoverRootPropsDeclaration,
|
|
28
|
+
PopoverTriggerElement,
|
|
29
|
+
PopoverTriggerPropsDeclaration,
|
|
30
|
+
setupPopoverPopup,
|
|
31
|
+
setupPopoverPositioner,
|
|
32
|
+
setupPopoverRoot,
|
|
33
|
+
setupPopoverTrigger,
|
|
34
|
+
type PopoverPopupProps,
|
|
35
|
+
type PopoverPositionerProps,
|
|
36
|
+
type PopoverRootEvents,
|
|
37
|
+
type PopoverRootProps,
|
|
38
|
+
type PopoverTriggerEvents,
|
|
39
|
+
type PopoverTriggerProps,
|
|
40
|
+
} from '@aria-ui/elements/popover'
|
|
41
|
+
|
|
42
|
+
export function registerPopoverRootElement(): void {
|
|
43
|
+
registerCustomElement('prosekit-popover-root', PopoverRootElement)
|
|
44
|
+
}
|
|
45
|
+
export function registerPopoverTriggerElement(): void {
|
|
46
|
+
registerCustomElement('prosekit-popover-trigger', PopoverTriggerElement)
|
|
47
|
+
}
|
|
48
|
+
export function registerPopoverPopupElement(): void {
|
|
49
|
+
registerCustomElement('prosekit-popover-popup', PopoverPopupElement)
|
|
50
|
+
}
|
|
51
|
+
export function registerPopoverPositionerElement(): void {
|
|
52
|
+
registerCustomElement('prosekit-popover-positioner', PopoverPositionerElement)
|
|
53
|
+
}
|
|
@@ -3,25 +3,22 @@ import { createContext, type Context } from '@aria-ui/core'
|
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
6
|
-
export const onResizeContext: Context<OnResize> = createContext(
|
|
6
|
+
export const onResizeContext: Context<OnResize> = createContext<OnResize>(
|
|
7
7
|
'prosekit/resizable/onResize',
|
|
8
|
-
null,
|
|
9
8
|
)
|
|
10
9
|
|
|
11
10
|
/**
|
|
12
11
|
* @internal
|
|
13
12
|
*/
|
|
14
|
-
export const onResizeStartContext: Context<OnResizeStart> = createContext(
|
|
13
|
+
export const onResizeStartContext: Context<OnResizeStart> = createContext<OnResizeStart>(
|
|
15
14
|
'prosekit/resizable/onResizeStart',
|
|
16
|
-
null,
|
|
17
15
|
)
|
|
18
16
|
|
|
19
17
|
/**
|
|
20
18
|
* @internal
|
|
21
19
|
*/
|
|
22
|
-
export const onResizeEndContext: Context<OnResizeEnd> = createContext(
|
|
20
|
+
export const onResizeEndContext: Context<OnResizeEnd> = createContext<OnResizeEnd>(
|
|
23
21
|
'prosekit/resizable/onResizeEnd',
|
|
24
|
-
null,
|
|
25
22
|
)
|
|
26
23
|
|
|
27
24
|
/**
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
@module
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<prosekit-resizable-root>
|
|
9
|
+
<img src="..." />
|
|
10
|
+
<prosekit-resizable-handle>...</prosekit-resizable-handle>
|
|
11
|
+
</prosekit-resizable-root>
|
|
12
|
+
```
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
registerResizableRootElement,
|
|
17
|
+
ResizableRootElement,
|
|
18
|
+
ResizableRootPropsDeclaration,
|
|
19
|
+
ResizeEndEvent,
|
|
20
|
+
ResizeStartEvent,
|
|
21
|
+
setupResizableRoot,
|
|
22
|
+
type ResizableRootEvents,
|
|
23
|
+
type ResizableRootProps,
|
|
24
|
+
} from './resizable-root.ts'
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
registerResizableHandleElement,
|
|
28
|
+
ResizableHandleElement,
|
|
29
|
+
ResizableHandlePropsDeclaration,
|
|
30
|
+
setupResizableHandle,
|
|
31
|
+
type ResizableHandleProps,
|
|
32
|
+
} from './resizable-handle.ts'
|
|
@@ -0,0 +1,134 @@
|
|
|
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 { getWindow } from '@ocavue/utils'
|
|
4
|
+
|
|
5
|
+
import { calcResize } from './calc-resize.ts'
|
|
6
|
+
import { onResizeContext, onResizeEndContext, onResizeStartContext } from './context.ts'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface ResizableHandleProps {
|
|
12
|
+
/**
|
|
13
|
+
* The position of the handle.
|
|
14
|
+
*
|
|
15
|
+
* @default "bottom-right"
|
|
16
|
+
*/
|
|
17
|
+
position:
|
|
18
|
+
| 'top'
|
|
19
|
+
| 'right'
|
|
20
|
+
| 'bottom'
|
|
21
|
+
| 'left'
|
|
22
|
+
| 'top-left'
|
|
23
|
+
| 'top-right'
|
|
24
|
+
| 'bottom-left'
|
|
25
|
+
| 'bottom-right'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export const ResizableHandlePropsDeclaration: PropsDeclaration<ResizableHandleProps> = defineProps<ResizableHandleProps>({
|
|
32
|
+
position: { default: 'bottom-right', attribute: 'position', type: 'string' },
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export function setupResizableHandle(
|
|
39
|
+
host: HostElement,
|
|
40
|
+
props: State<ResizableHandleProps>,
|
|
41
|
+
): void {
|
|
42
|
+
const getOnResize = onResizeContext.consume(host)
|
|
43
|
+
const getOnResizeStart = onResizeStartContext.consume(host)
|
|
44
|
+
const getOnResizeEnd = onResizeEndContext.consume(host)
|
|
45
|
+
|
|
46
|
+
let startX = 0
|
|
47
|
+
let startY = 0
|
|
48
|
+
let width = 0
|
|
49
|
+
let height = 0
|
|
50
|
+
let aspectRatio = 1
|
|
51
|
+
|
|
52
|
+
const pointerPressing = createSignal(false)
|
|
53
|
+
|
|
54
|
+
const handlePointerDown = (event: PointerEvent) => {
|
|
55
|
+
event.preventDefault()
|
|
56
|
+
pointerPressing.set(true)
|
|
57
|
+
|
|
58
|
+
startX = event.x
|
|
59
|
+
startY = event.y
|
|
60
|
+
|
|
61
|
+
const size = getOnResizeStart()?.()
|
|
62
|
+
if (size) {
|
|
63
|
+
;[width, height, aspectRatio] = size
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const handlePointerMove = (event: PointerEvent) => {
|
|
68
|
+
event.preventDefault()
|
|
69
|
+
|
|
70
|
+
const dx = event.x - startX
|
|
71
|
+
const dy = event.y - startY
|
|
72
|
+
|
|
73
|
+
const [w, h] = calcResize(
|
|
74
|
+
props.position.get(),
|
|
75
|
+
width,
|
|
76
|
+
height,
|
|
77
|
+
dx,
|
|
78
|
+
dy,
|
|
79
|
+
aspectRatio,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
getOnResize()?.(w, h)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const handlePointerUp = (event: PointerEvent) => {
|
|
86
|
+
event.preventDefault()
|
|
87
|
+
pointerPressing.set(false)
|
|
88
|
+
|
|
89
|
+
getOnResizeEnd()?.()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
useEffect(host, () => {
|
|
93
|
+
host.addEventListener('pointerdown', handlePointerDown)
|
|
94
|
+
return () => {
|
|
95
|
+
host.removeEventListener('pointerdown', handlePointerDown)
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
useEffect(host, () => {
|
|
100
|
+
if (!pointerPressing.get()) {
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const win = getWindow(host)
|
|
105
|
+
|
|
106
|
+
win.addEventListener('pointermove', handlePointerMove)
|
|
107
|
+
win.addEventListener('pointerup', handlePointerUp)
|
|
108
|
+
return () => {
|
|
109
|
+
win.removeEventListener('pointermove', handlePointerMove)
|
|
110
|
+
win.removeEventListener('pointerup', handlePointerUp)
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const ResizableHandleElementBase: HostElementConstructor<ResizableHandleProps> = defineCustomElement(
|
|
116
|
+
setupResizableHandle,
|
|
117
|
+
ResizableHandlePropsDeclaration,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @public
|
|
122
|
+
*/
|
|
123
|
+
export class ResizableHandleElement extends ResizableHandleElementBase {}
|
|
124
|
+
|
|
125
|
+
let isResizableHandleRegistered = false
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @internal
|
|
129
|
+
*/
|
|
130
|
+
export function registerResizableHandleElement(): void {
|
|
131
|
+
if (isResizableHandleRegistered) return
|
|
132
|
+
isResizableHandleRegistered = true
|
|
133
|
+
registerCustomElement('prosekit-resizable-handle', ResizableHandleElement)
|
|
134
|
+
}
|
|
@@ -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) {
|