@prosekit/web 0.7.3 → 0.7.4
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/get-default-state-CIEy7xrl.js +2 -1
- package/dist/get-default-state-CIEy7xrl.js.map +1 -0
- package/dist/get-safe-editor-view-DENm4avv.js +2 -1
- package/dist/get-safe-editor-view-DENm4avv.js.map +1 -0
- package/dist/{inject-style-D5jj7cme.js → inject-style-BJQNFufI.js} +4 -5
- package/dist/inject-style-BJQNFufI.js.map +1 -0
- package/dist/prosekit-web-autocomplete.d.ts +2 -1
- package/dist/prosekit-web-autocomplete.d.ts.map +1 -0
- package/dist/prosekit-web-autocomplete.js +5 -7
- package/dist/prosekit-web-autocomplete.js.map +1 -0
- package/dist/prosekit-web-block-handle.d.ts +2 -1
- package/dist/prosekit-web-block-handle.d.ts.map +1 -0
- package/dist/prosekit-web-block-handle.js +9 -13
- package/dist/prosekit-web-block-handle.js.map +1 -0
- package/dist/prosekit-web-drop-indicator.d.ts +2 -1
- package/dist/prosekit-web-drop-indicator.d.ts.map +1 -0
- package/dist/prosekit-web-drop-indicator.js +2 -1
- package/dist/prosekit-web-drop-indicator.js.map +1 -0
- package/dist/prosekit-web-inline-popover.d.ts +2 -1
- package/dist/prosekit-web-inline-popover.d.ts.map +1 -0
- package/dist/prosekit-web-inline-popover.js +4 -5
- package/dist/prosekit-web-inline-popover.js.map +1 -0
- package/dist/prosekit-web-popover.d.ts +2 -1
- package/dist/prosekit-web-popover.d.ts.map +1 -0
- package/dist/prosekit-web-popover.js +2 -1
- package/dist/prosekit-web-popover.js.map +1 -0
- package/dist/prosekit-web-resizable.d.ts +2 -1
- package/dist/prosekit-web-resizable.d.ts.map +1 -0
- package/dist/prosekit-web-resizable.js +2 -1
- package/dist/prosekit-web-resizable.js.map +1 -0
- package/dist/prosekit-web-table-handle.d.ts +2 -1
- package/dist/prosekit-web-table-handle.d.ts.map +1 -0
- package/dist/prosekit-web-table-handle.js +17 -37
- package/dist/prosekit-web-table-handle.js.map +1 -0
- package/dist/prosekit-web-tooltip.d.ts +2 -1
- package/dist/prosekit-web-tooltip.d.ts.map +1 -0
- package/dist/prosekit-web-tooltip.js +2 -1
- package/dist/prosekit-web-tooltip.js.map +1 -0
- package/dist/prosekit-web.d.ts +1 -1
- package/dist/prosekit-web.js +1 -0
- package/dist/use-editor-extension-Cc7ZG7uj.js +2 -1
- package/dist/use-editor-extension-Cc7ZG7uj.js.map +1 -0
- package/dist/use-scrolling-BNfsQs3S.js +2 -1
- package/dist/use-scrolling-BNfsQs3S.js.map +1 -0
- package/package.json +17 -17
- package/src/components/autocomplete/autocomplete-empty/element.gen.ts +18 -0
- package/src/components/autocomplete/autocomplete-empty/setup.ts +6 -0
- package/src/components/autocomplete/autocomplete-empty/types.ts +16 -0
- package/src/components/autocomplete/autocomplete-item/element.gen.ts +18 -0
- package/src/components/autocomplete/autocomplete-item/setup.ts +38 -0
- package/src/components/autocomplete/autocomplete-item/types.ts +31 -0
- package/src/components/autocomplete/autocomplete-list/element.gen.ts +18 -0
- package/src/components/autocomplete/autocomplete-list/setup.ts +140 -0
- package/src/components/autocomplete/autocomplete-list/types.ts +30 -0
- package/src/components/autocomplete/autocomplete-popover/element.gen.ts +18 -0
- package/src/components/autocomplete/autocomplete-popover/helpers.spec.ts +21 -0
- package/src/components/autocomplete/autocomplete-popover/helpers.ts +7 -0
- package/src/components/autocomplete/autocomplete-popover/setup.ts +185 -0
- package/src/components/autocomplete/autocomplete-popover/types.ts +103 -0
- package/src/components/autocomplete/context.ts +19 -0
- package/src/components/autocomplete/index.gen.ts +17 -0
- package/src/components/block-handle/block-handle-add/element.gen.ts +18 -0
- package/src/components/block-handle/block-handle-add/setup.ts +37 -0
- package/src/components/block-handle/block-handle-add/types.ts +26 -0
- package/src/components/block-handle/block-handle-draggable/element.gen.ts +18 -0
- package/src/components/block-handle/block-handle-draggable/set-drag-preview.ts +88 -0
- package/src/components/block-handle/block-handle-draggable/setup.ts +133 -0
- package/src/components/block-handle/block-handle-draggable/types.ts +26 -0
- package/src/components/block-handle/block-handle-popover/element.gen.ts +18 -0
- package/src/components/block-handle/block-handle-popover/pointer-move.ts +243 -0
- package/src/components/block-handle/block-handle-popover/setup.ts +88 -0
- package/src/components/block-handle/block-handle-popover/types.ts +84 -0
- package/src/components/block-handle/context.ts +34 -0
- package/src/components/block-handle/index.gen.ts +13 -0
- package/src/components/drop-indicator/drop-indicator/element.gen.ts +18 -0
- package/src/components/drop-indicator/drop-indicator/setup.ts +87 -0
- package/src/components/drop-indicator/drop-indicator/types.ts +34 -0
- package/src/components/drop-indicator/index.gen.ts +5 -0
- package/src/components/inline-popover/index.gen.ts +5 -0
- package/src/components/inline-popover/inline-popover/element.gen.ts +18 -0
- package/src/components/inline-popover/inline-popover/setup.ts +97 -0
- package/src/components/inline-popover/inline-popover/types.ts +115 -0
- package/src/components/inline-popover/inline-popover/virtual-selection-element.ts +75 -0
- package/src/components/popover/index.gen.ts +13 -0
- package/src/components/popover/popover-content/element.gen.ts +18 -0
- package/src/components/popover/popover-content/setup.ts +1 -0
- package/src/components/popover/popover-content/types.ts +12 -0
- package/src/components/popover/popover-root/element.gen.ts +18 -0
- package/src/components/popover/popover-root/setup.ts +1 -0
- package/src/components/popover/popover-root/types.ts +12 -0
- package/src/components/popover/popover-trigger/element.gen.ts +18 -0
- package/src/components/popover/popover-trigger/setup.ts +1 -0
- package/src/components/popover/popover-trigger/types.ts +12 -0
- package/src/components/resizable/context.ts +45 -0
- package/src/components/resizable/index.gen.ts +9 -0
- package/src/components/resizable/resizable-handle/calc-resize.spec.ts +280 -0
- package/src/components/resizable/resizable-handle/calc-resize.ts +121 -0
- package/src/components/resizable/resizable-handle/element.gen.ts +18 -0
- package/src/components/resizable/resizable-handle/setup.ts +112 -0
- package/src/components/resizable/resizable-handle/types.ts +32 -0
- package/src/components/resizable/resizable-root/element.gen.ts +18 -0
- package/src/components/resizable/resizable-root/setup.ts +93 -0
- package/src/components/resizable/resizable-root/types.ts +28 -0
- package/src/components/table-handle/context.ts +49 -0
- package/src/components/table-handle/dnd.ts +135 -0
- package/src/components/table-handle/hooks/use-drop.ts +94 -0
- package/src/components/table-handle/hooks/use-empty-image.ts +30 -0
- package/src/components/table-handle/index.gen.ts +37 -0
- package/src/components/table-handle/table-handle-column-root/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-column-root/setup.ts +71 -0
- package/src/components/table-handle/table-handle-column-root/types.ts +76 -0
- package/src/components/table-handle/table-handle-column-trigger/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-column-trigger/setup.ts +75 -0
- package/src/components/table-handle/table-handle-column-trigger/types.ts +23 -0
- package/src/components/table-handle/table-handle-drag-preview/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-drag-preview/render-preview.ts +80 -0
- package/src/components/table-handle/table-handle-drag-preview/setup.ts +67 -0
- package/src/components/table-handle/table-handle-drag-preview/types.ts +17 -0
- package/src/components/table-handle/table-handle-drag-preview/updater.ts +101 -0
- package/src/components/table-handle/table-handle-drop-indicator/calc-drag-over.ts +44 -0
- package/src/components/table-handle/table-handle-drop-indicator/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-drop-indicator/setup.ts +56 -0
- package/src/components/table-handle/table-handle-drop-indicator/types.ts +18 -0
- package/src/components/table-handle/table-handle-drop-indicator/updater.ts +110 -0
- package/src/components/table-handle/table-handle-popover-content/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-popover-content/setup.ts +90 -0
- package/src/components/table-handle/table-handle-popover-content/types.ts +40 -0
- package/src/components/table-handle/table-handle-popover-item/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-popover-item/setup.ts +23 -0
- package/src/components/table-handle/table-handle-popover-item/types.ts +24 -0
- package/src/components/table-handle/table-handle-root/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-root/setup.ts +93 -0
- package/src/components/table-handle/table-handle-root/types.ts +26 -0
- package/src/components/table-handle/table-handle-row-root/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-row-root/setup.ts +77 -0
- package/src/components/table-handle/table-handle-row-root/types.ts +75 -0
- package/src/components/table-handle/table-handle-row-trigger/element.gen.ts +18 -0
- package/src/components/table-handle/table-handle-row-trigger/setup.ts +74 -0
- package/src/components/table-handle/table-handle-row-trigger/types.ts +26 -0
- package/src/components/table-handle/utils.ts +107 -0
- package/src/components/tooltip/index.gen.ts +13 -0
- package/src/components/tooltip/tooltip-content/element.gen.ts +18 -0
- package/src/components/tooltip/tooltip-content/setup.ts +1 -0
- package/src/components/tooltip/tooltip-content/types.ts +12 -0
- package/src/components/tooltip/tooltip-root/element.gen.ts +18 -0
- package/src/components/tooltip/tooltip-root/setup.ts +1 -0
- package/src/components/tooltip/tooltip-root/types.ts +12 -0
- package/src/components/tooltip/tooltip-trigger/element.gen.ts +18 -0
- package/src/components/tooltip/tooltip-trigger/setup.ts +1 -0
- package/src/components/tooltip/tooltip-trigger/types.ts +12 -0
- package/src/hooks/use-editor-extension.ts +19 -0
- package/src/hooks/use-editor-focus-event.ts +23 -0
- package/src/hooks/use-editor-typing.ts +36 -0
- package/src/hooks/use-editor-update-event.ts +23 -0
- package/src/hooks/use-first-rendering.ts +20 -0
- package/src/hooks/use-keymap.ts +20 -0
- package/src/hooks/use-scrolling.ts +33 -0
- package/src/hooks/use-selecting.ts +63 -0
- package/src/index.ts +1 -0
- package/src/utils/assign-styles.ts +14 -0
- package/src/utils/clone-element.ts +110 -0
- package/src/utils/css-feature-detection.ts +9 -0
- package/src/utils/fade-color.ts +15 -0
- package/src/utils/get-box-element.ts +20 -0
- package/src/utils/get-client-rect.ts +35 -0
- package/src/utils/get-default-state.spec.ts +50 -0
- package/src/utils/get-default-state.ts +22 -0
- package/src/utils/get-effective-background-color.ts +21 -0
- package/src/utils/get-safe-editor-view.ts +10 -0
- package/src/utils/inject-style.ts +11 -0
- package/src/utils/is-finite-positive-number.ts +3 -0
- package/src/utils/max-z-index.ts +3 -0
- package/src/utils/throttle.ts +17 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
type Context,
|
|
4
|
+
} from '@aria-ui/core'
|
|
5
|
+
import type { ProseMirrorNode } from '@prosekit/pm/model'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export interface HoverState {
|
|
11
|
+
node: ProseMirrorNode
|
|
12
|
+
pos: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export type BlockPopoverContext = HoverState | null
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
export const blockPopoverContext: Context<BlockPopoverContext> = createContext(
|
|
24
|
+
'prosekit-block-popover-context',
|
|
25
|
+
null,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export const draggingContext: Context<boolean> = createContext(
|
|
32
|
+
'prosekit-block-handle-dragging-context',
|
|
33
|
+
false,
|
|
34
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// This file is generated by packages/dev/src/gen-components.ts
|
|
2
|
+
|
|
3
|
+
export { BlockHandleAddElement } from './block-handle-add/element.gen'
|
|
4
|
+
export { blockHandleAddEvents, blockHandleAddProps, type BlockHandleAddEvents, type BlockHandleAddProps } from './block-handle-add/types'
|
|
5
|
+
export { useBlockHandleAdd } from './block-handle-add/setup'
|
|
6
|
+
|
|
7
|
+
export { BlockHandleDraggableElement } from './block-handle-draggable/element.gen'
|
|
8
|
+
export { blockHandleDraggableEvents, blockHandleDraggableProps, type BlockHandleDraggableEvents, type BlockHandleDraggableProps } from './block-handle-draggable/types'
|
|
9
|
+
export { useBlockHandleDraggable } from './block-handle-draggable/setup'
|
|
10
|
+
|
|
11
|
+
export { BlockHandlePopoverElement } from './block-handle-popover/element.gen'
|
|
12
|
+
export { blockHandlePopoverEvents, blockHandlePopoverProps, type BlockHandlePopoverEvents, type BlockHandlePopoverProps } from './block-handle-popover/types'
|
|
13
|
+
export { useBlockHandlePopover } from './block-handle-popover/setup'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
+
|
|
3
|
+
import { useDropIndicator } from "./setup"
|
|
4
|
+
import { dropIndicatorEvents, dropIndicatorProps, type DropIndicatorEvents, type DropIndicatorProps } from "./types"
|
|
5
|
+
|
|
6
|
+
const DropIndicatorElementBase: BaseElementConstructor<DropIndicatorProps> = defineCustomElement<
|
|
7
|
+
DropIndicatorProps,
|
|
8
|
+
DropIndicatorEvents
|
|
9
|
+
>({
|
|
10
|
+
props: dropIndicatorProps,
|
|
11
|
+
events: dropIndicatorEvents,
|
|
12
|
+
setup: useDropIndicator,
|
|
13
|
+
})
|
|
14
|
+
class DropIndicatorElement extends DropIndicatorElementBase {}
|
|
15
|
+
|
|
16
|
+
registerCustomElement('prosekit-drop-indicator', DropIndicatorElement)
|
|
17
|
+
|
|
18
|
+
export { DropIndicatorElement }
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createComputed,
|
|
3
|
+
createSignal,
|
|
4
|
+
useEffect,
|
|
5
|
+
type ConnectableElement,
|
|
6
|
+
type SetupOptions,
|
|
7
|
+
} from '@aria-ui/core'
|
|
8
|
+
import { usePresence } from '@aria-ui/presence'
|
|
9
|
+
import {
|
|
10
|
+
defineDropIndicator,
|
|
11
|
+
type ShowHandlerOptions,
|
|
12
|
+
} from '@prosekit/extensions/drop-indicator'
|
|
13
|
+
|
|
14
|
+
import { useEditorExtension } from '../../../hooks/use-editor-extension'
|
|
15
|
+
import { useScrolling } from '../../../hooks/use-scrolling'
|
|
16
|
+
import { assignStyles } from '../../../utils/assign-styles'
|
|
17
|
+
|
|
18
|
+
import type {
|
|
19
|
+
DropIndicatorEvents,
|
|
20
|
+
DropIndicatorProps,
|
|
21
|
+
} from './types'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export function useDropIndicator(
|
|
27
|
+
host: ConnectableElement,
|
|
28
|
+
{ state }: SetupOptions<DropIndicatorProps, DropIndicatorEvents>,
|
|
29
|
+
): void {
|
|
30
|
+
type DropIndicatorContext = ShowHandlerOptions | null
|
|
31
|
+
const context = createSignal<DropIndicatorContext>(null)
|
|
32
|
+
|
|
33
|
+
const extension = defineDropIndicator({
|
|
34
|
+
onShow: (options) => context.set(options),
|
|
35
|
+
onHide: () => context.set(null),
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
useEditorExtension(host, state.editor, extension)
|
|
39
|
+
|
|
40
|
+
const line = createComputed(() => context.get()?.line)
|
|
41
|
+
const scrolling = useScrolling(host)
|
|
42
|
+
const presence = createComputed(() => {
|
|
43
|
+
return !!context.get() && !scrolling.get()
|
|
44
|
+
})
|
|
45
|
+
usePresence(host, presence)
|
|
46
|
+
|
|
47
|
+
useEffect(
|
|
48
|
+
host,
|
|
49
|
+
() => {
|
|
50
|
+
const lineValue = line.get()
|
|
51
|
+
const lineWidth = state.width.get()
|
|
52
|
+
|
|
53
|
+
if (!lineValue) return
|
|
54
|
+
|
|
55
|
+
const { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } } = lineValue
|
|
56
|
+
const horizontal = y1 === y2
|
|
57
|
+
|
|
58
|
+
let width: number
|
|
59
|
+
let height: number
|
|
60
|
+
let top: number = y1
|
|
61
|
+
let left: number = x1
|
|
62
|
+
|
|
63
|
+
if (horizontal) {
|
|
64
|
+
width = x2 - x1
|
|
65
|
+
height = lineWidth
|
|
66
|
+
top -= lineWidth / 2
|
|
67
|
+
} else {
|
|
68
|
+
width = lineWidth
|
|
69
|
+
height = y2 - y1
|
|
70
|
+
left -= lineWidth / 2
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
top = Math.round(top)
|
|
74
|
+
left = Math.round(left)
|
|
75
|
+
|
|
76
|
+
assignStyles(host, {
|
|
77
|
+
position: 'fixed',
|
|
78
|
+
pointerEvents: 'none',
|
|
79
|
+
width: `${width}px`,
|
|
80
|
+
height: `${height}px`,
|
|
81
|
+
transform: `translate(${left}px, ${top}px)`,
|
|
82
|
+
left: '0px',
|
|
83
|
+
top: '0px',
|
|
84
|
+
})
|
|
85
|
+
},
|
|
86
|
+
)
|
|
87
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
EventDeclarations,
|
|
3
|
+
PropDeclarations,
|
|
4
|
+
} from '@aria-ui/core'
|
|
5
|
+
import type { Editor } from '@prosekit/core'
|
|
6
|
+
|
|
7
|
+
export interface DropIndicatorProps {
|
|
8
|
+
/**
|
|
9
|
+
* The ProseKit editor instance.
|
|
10
|
+
*
|
|
11
|
+
* @default null
|
|
12
|
+
* @hidden
|
|
13
|
+
*/
|
|
14
|
+
editor: Editor | null
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The line width in pixels.
|
|
18
|
+
*
|
|
19
|
+
* @default 2
|
|
20
|
+
*/
|
|
21
|
+
width: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** @internal */
|
|
25
|
+
export const dropIndicatorProps: PropDeclarations<DropIndicatorProps> = Object.freeze({
|
|
26
|
+
editor: { default: null },
|
|
27
|
+
width: { default: 2 },
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export interface DropIndicatorEvents {
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** @internal */
|
|
34
|
+
export const dropIndicatorEvents: EventDeclarations<DropIndicatorEvents> = {}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// This file is generated by packages/dev/src/gen-components.ts
|
|
2
|
+
|
|
3
|
+
export { DropIndicatorElement } from './drop-indicator/element.gen'
|
|
4
|
+
export { dropIndicatorEvents, dropIndicatorProps, type DropIndicatorEvents, type DropIndicatorProps } from './drop-indicator/types'
|
|
5
|
+
export { useDropIndicator } from './drop-indicator/setup'
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// This file is generated by packages/dev/src/gen-components.ts
|
|
2
|
+
|
|
3
|
+
export { InlinePopoverElement } from './inline-popover/element.gen'
|
|
4
|
+
export { inlinePopoverEvents, inlinePopoverProps, type InlinePopoverEvents, type InlinePopoverProps } from './inline-popover/types'
|
|
5
|
+
export { useInlinePopover } from './inline-popover/setup'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
+
|
|
3
|
+
import { useInlinePopover } from "./setup"
|
|
4
|
+
import { inlinePopoverEvents, inlinePopoverProps, type InlinePopoverEvents, type InlinePopoverProps } from "./types"
|
|
5
|
+
|
|
6
|
+
const InlinePopoverElementBase: BaseElementConstructor<InlinePopoverProps> = defineCustomElement<
|
|
7
|
+
InlinePopoverProps,
|
|
8
|
+
InlinePopoverEvents
|
|
9
|
+
>({
|
|
10
|
+
props: inlinePopoverProps,
|
|
11
|
+
events: inlinePopoverEvents,
|
|
12
|
+
setup: useInlinePopover,
|
|
13
|
+
})
|
|
14
|
+
class InlinePopoverElement extends InlinePopoverElementBase {}
|
|
15
|
+
|
|
16
|
+
registerCustomElement('prosekit-inline-popover', InlinePopoverElement)
|
|
17
|
+
|
|
18
|
+
export { InlinePopoverElement }
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createComputed,
|
|
3
|
+
createSignal,
|
|
4
|
+
useAttribute,
|
|
5
|
+
useEffect,
|
|
6
|
+
type ConnectableElement,
|
|
7
|
+
type ReadonlySignal,
|
|
8
|
+
type SetupOptions,
|
|
9
|
+
} from '@aria-ui/core'
|
|
10
|
+
import { useOverlayPositionerState } from '@aria-ui/overlay/elements'
|
|
11
|
+
import { usePresence } from '@aria-ui/presence'
|
|
12
|
+
import type { ReferenceElement } from '@floating-ui/dom'
|
|
13
|
+
import type { Editor } from '@prosekit/core'
|
|
14
|
+
|
|
15
|
+
import { useEditorFocusChangeEvent } from '../../../hooks/use-editor-focus-event'
|
|
16
|
+
import { useEditorUpdateEvent } from '../../../hooks/use-editor-update-event'
|
|
17
|
+
import { useKeymap } from '../../../hooks/use-keymap'
|
|
18
|
+
|
|
19
|
+
import type {
|
|
20
|
+
InlinePopoverEvents,
|
|
21
|
+
InlinePopoverProps,
|
|
22
|
+
} from './types'
|
|
23
|
+
import { getVirtualSelectionElement } from './virtual-selection-element'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export function useInlinePopover(
|
|
29
|
+
host: ConnectableElement,
|
|
30
|
+
{ state, emit }: SetupOptions<InlinePopoverProps, InlinePopoverEvents>,
|
|
31
|
+
): void {
|
|
32
|
+
const { editor, defaultOpen, open, ...overlayState } = state
|
|
33
|
+
|
|
34
|
+
const reference = useInlinePopoverReference(host, editor)
|
|
35
|
+
const hasReference = createComputed(() => !!reference.get())
|
|
36
|
+
|
|
37
|
+
useEffect(host, () => {
|
|
38
|
+
const hasReferenceValue = hasReference.get()
|
|
39
|
+
const defaultOpenValue = defaultOpen.peek()
|
|
40
|
+
const openValue = open.peek()
|
|
41
|
+
|
|
42
|
+
if (defaultOpenValue || openValue) {
|
|
43
|
+
emit('openChange', hasReferenceValue)
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
useEffect(host, () => {
|
|
48
|
+
const hasReferenceValue = hasReference.get()
|
|
49
|
+
const defaultOpenValue = defaultOpen.peek()
|
|
50
|
+
|
|
51
|
+
if (hasReferenceValue && defaultOpenValue) {
|
|
52
|
+
open.set(true)
|
|
53
|
+
} else if (!hasReferenceValue) {
|
|
54
|
+
open.set(false)
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
useKeymap(host, editor, {
|
|
59
|
+
Escape: () => {
|
|
60
|
+
if (!state.dismissOnEscape.peek() || !open.peek()) {
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
open.set(false)
|
|
64
|
+
emit('openChange', false)
|
|
65
|
+
return true
|
|
66
|
+
},
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
useOverlayPositionerState(host, overlayState, { reference })
|
|
70
|
+
|
|
71
|
+
useAttribute(host, 'data-state', () => (open.get() ? 'open' : 'closed'))
|
|
72
|
+
usePresence(host, open)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function useInlinePopoverReference(
|
|
76
|
+
host: ConnectableElement,
|
|
77
|
+
editor: ReadonlySignal<Editor | null>,
|
|
78
|
+
) {
|
|
79
|
+
const reference = createSignal<ReferenceElement | null>(null)
|
|
80
|
+
let editorFocused = false
|
|
81
|
+
|
|
82
|
+
useEditorFocusChangeEvent(host, editor, (focus) => {
|
|
83
|
+
editorFocused = focus
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
useEditorUpdateEvent(host, editor, (view) => {
|
|
87
|
+
const isPopoverFocused = !editorFocused && host.contains(host.ownerDocument.activeElement)
|
|
88
|
+
|
|
89
|
+
if (isPopoverFocused) {
|
|
90
|
+
return
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
reference.set(getVirtualSelectionElement(view) || null)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
return reference
|
|
97
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
EventDeclarations,
|
|
3
|
+
PropDeclarations,
|
|
4
|
+
} from '@aria-ui/core'
|
|
5
|
+
import {
|
|
6
|
+
overlayPositionerEvents,
|
|
7
|
+
overlayPositionerProps,
|
|
8
|
+
type OverlayPositionerEvents,
|
|
9
|
+
type OverlayPositionerProps,
|
|
10
|
+
} from '@aria-ui/overlay'
|
|
11
|
+
import type { Editor } from '@prosekit/core'
|
|
12
|
+
|
|
13
|
+
export interface InlinePopoverProps extends
|
|
14
|
+
Omit<
|
|
15
|
+
OverlayPositionerProps,
|
|
16
|
+
'placement' | 'offset' | 'hide' | 'overlap' | 'inline' | 'overflowPadding'
|
|
17
|
+
>
|
|
18
|
+
{
|
|
19
|
+
/**
|
|
20
|
+
* The ProseKit editor instance.
|
|
21
|
+
*
|
|
22
|
+
* @default null
|
|
23
|
+
* @hidden
|
|
24
|
+
*/
|
|
25
|
+
editor: Editor | null
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Whether the popover is open by default when some inline content is
|
|
29
|
+
* selected.
|
|
30
|
+
*
|
|
31
|
+
* When `defaultOpen` is true, the popover will open or close based on the
|
|
32
|
+
* inline selection. When `defaultOpen` is false, the popover will never be
|
|
33
|
+
* opened unless the `open` prop is true.
|
|
34
|
+
*
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
defaultOpen: boolean
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Whether the popover is open.
|
|
41
|
+
*
|
|
42
|
+
* Notice that the popover will be always hidden if the inline selection is
|
|
43
|
+
* empty.
|
|
44
|
+
*
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
open: boolean
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Whether the inline popover should be dismissed when the editor receives an
|
|
51
|
+
* Escape key press.
|
|
52
|
+
*
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
dismissOnEscape: boolean
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @default "top"
|
|
59
|
+
*/
|
|
60
|
+
placement: OverlayPositionerProps['placement']
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @default 12
|
|
64
|
+
*/
|
|
65
|
+
offset: OverlayPositionerProps['offset']
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @default true
|
|
69
|
+
*/
|
|
70
|
+
hide: OverlayPositionerProps['hide']
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @default true
|
|
74
|
+
*/
|
|
75
|
+
overlap: OverlayPositionerProps['overlap']
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @default true
|
|
79
|
+
*/
|
|
80
|
+
inline: OverlayPositionerProps['inline']
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @default 8
|
|
84
|
+
*/
|
|
85
|
+
overflowPadding: OverlayPositionerProps['overflowPadding']
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** @internal */
|
|
89
|
+
export const inlinePopoverProps: PropDeclarations<InlinePopoverProps> = Object.freeze({
|
|
90
|
+
...overlayPositionerProps,
|
|
91
|
+
editor: { default: null },
|
|
92
|
+
defaultOpen: { default: true },
|
|
93
|
+
open: { default: false },
|
|
94
|
+
dismissOnEscape: { default: true },
|
|
95
|
+
|
|
96
|
+
placement: { default: 'top' },
|
|
97
|
+
offset: { default: 12 },
|
|
98
|
+
hide: { default: true },
|
|
99
|
+
overlap: { default: true },
|
|
100
|
+
inline: { default: true },
|
|
101
|
+
overflowPadding: { default: 8 },
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
export interface InlinePopoverEvents extends OverlayPositionerEvents {
|
|
105
|
+
/**
|
|
106
|
+
* Fired when the open state changes.
|
|
107
|
+
*/
|
|
108
|
+
openChange: CustomEvent<boolean>
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** @internal */
|
|
112
|
+
export const inlinePopoverEvents: EventDeclarations<InlinePopoverEvents> = {
|
|
113
|
+
...overlayPositionerEvents,
|
|
114
|
+
openChange: {},
|
|
115
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { ReferenceElement } from '@floating-ui/dom'
|
|
2
|
+
import {
|
|
3
|
+
containsInlineNode,
|
|
4
|
+
isInCodeBlock,
|
|
5
|
+
isTextSelection,
|
|
6
|
+
} from '@prosekit/core'
|
|
7
|
+
import type { EditorView } from '@prosekit/pm/view'
|
|
8
|
+
|
|
9
|
+
export function getVirtualSelectionElement(
|
|
10
|
+
view: EditorView,
|
|
11
|
+
): ReferenceElement | undefined {
|
|
12
|
+
if (typeof window === 'undefined' || view.isDestroyed) {
|
|
13
|
+
return
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const selection = view.state.selection
|
|
17
|
+
|
|
18
|
+
if (
|
|
19
|
+
!selection.empty
|
|
20
|
+
&& !isInCodeBlock(selection)
|
|
21
|
+
&& isTextSelection(selection)
|
|
22
|
+
&& containsInlineNode(view.state.doc, selection.from, selection.to)
|
|
23
|
+
) {
|
|
24
|
+
return getDomDecoration(view) || getInlineDecoration(view)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function getDomDecoration(view: EditorView): ReferenceElement | undefined {
|
|
29
|
+
const range = getDomRange(view)
|
|
30
|
+
if (range) {
|
|
31
|
+
// To get it work properly in Safari, we cannot return the range directly.
|
|
32
|
+
// We have to return a contextElement.
|
|
33
|
+
return {
|
|
34
|
+
contextElement: view.dom,
|
|
35
|
+
getBoundingClientRect: () => range.getBoundingClientRect(),
|
|
36
|
+
getClientRects: () => range.getClientRects(),
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getDomRange(view: EditorView): Range | undefined {
|
|
42
|
+
const win = view.dom.ownerDocument.defaultView
|
|
43
|
+
const selection = win?.getSelection()
|
|
44
|
+
if (!selection || selection.isCollapsed) {
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const range = typeof selection.rangeCount === 'number'
|
|
49
|
+
&& selection.rangeCount > 0
|
|
50
|
+
&& selection.getRangeAt(0)
|
|
51
|
+
|
|
52
|
+
if (!range) {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return range
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function getInlineDecoration(view: EditorView): ReferenceElement | undefined {
|
|
60
|
+
const match = view.dom.querySelectorAll('.prosekit-virtual-selection')
|
|
61
|
+
|
|
62
|
+
if (match.length === 0) {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
if (match.length === 1) {
|
|
66
|
+
return match[0]
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const items = Array.from(match)
|
|
70
|
+
return {
|
|
71
|
+
contextElement: items[0],
|
|
72
|
+
getBoundingClientRect: () => items[0].getBoundingClientRect(),
|
|
73
|
+
getClientRects: () => items.map((item) => item.getBoundingClientRect()),
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// This file is generated by packages/dev/src/gen-components.ts
|
|
2
|
+
|
|
3
|
+
export { PopoverContentElement } from './popover-content/element.gen'
|
|
4
|
+
export { popoverContentEvents, popoverContentProps, type PopoverContentEvents, type PopoverContentProps } from './popover-content/types'
|
|
5
|
+
export { usePopoverContent } from './popover-content/setup'
|
|
6
|
+
|
|
7
|
+
export { PopoverRootElement } from './popover-root/element.gen'
|
|
8
|
+
export { popoverRootEvents, popoverRootProps, type PopoverRootEvents, type PopoverRootProps } from './popover-root/types'
|
|
9
|
+
export { usePopoverRoot } from './popover-root/setup'
|
|
10
|
+
|
|
11
|
+
export { PopoverTriggerElement } from './popover-trigger/element.gen'
|
|
12
|
+
export { popoverTriggerEvents, popoverTriggerProps, type PopoverTriggerEvents, type PopoverTriggerProps } from './popover-trigger/types'
|
|
13
|
+
export { usePopoverTrigger } from './popover-trigger/setup'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
+
|
|
3
|
+
import { usePopoverContent } from "./setup"
|
|
4
|
+
import { popoverContentEvents, popoverContentProps, type PopoverContentEvents, type PopoverContentProps } from "./types"
|
|
5
|
+
|
|
6
|
+
const PopoverContentElementBase: BaseElementConstructor<PopoverContentProps> = defineCustomElement<
|
|
7
|
+
PopoverContentProps,
|
|
8
|
+
PopoverContentEvents
|
|
9
|
+
>({
|
|
10
|
+
props: popoverContentProps,
|
|
11
|
+
events: popoverContentEvents,
|
|
12
|
+
setup: usePopoverContent,
|
|
13
|
+
})
|
|
14
|
+
class PopoverContentElement extends PopoverContentElementBase {}
|
|
15
|
+
|
|
16
|
+
registerCustomElement('prosekit-popover-content', PopoverContentElement)
|
|
17
|
+
|
|
18
|
+
export { PopoverContentElement }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { usePopoverContent } from '@aria-ui/popover/elements'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
PopoverContentEvents as Events,
|
|
3
|
+
PopoverContentProps as Props,
|
|
4
|
+
} from '@aria-ui/popover/elements'
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
popoverContentEvents,
|
|
8
|
+
popoverContentProps,
|
|
9
|
+
} from '@aria-ui/popover/elements'
|
|
10
|
+
|
|
11
|
+
export interface PopoverContentProps extends Props {}
|
|
12
|
+
export interface PopoverContentEvents extends Events {}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
+
|
|
3
|
+
import { usePopoverRoot } from "./setup"
|
|
4
|
+
import { popoverRootEvents, popoverRootProps, type PopoverRootEvents, type PopoverRootProps } from "./types"
|
|
5
|
+
|
|
6
|
+
const PopoverRootElementBase: BaseElementConstructor<PopoverRootProps> = defineCustomElement<
|
|
7
|
+
PopoverRootProps,
|
|
8
|
+
PopoverRootEvents
|
|
9
|
+
>({
|
|
10
|
+
props: popoverRootProps,
|
|
11
|
+
events: popoverRootEvents,
|
|
12
|
+
setup: usePopoverRoot,
|
|
13
|
+
})
|
|
14
|
+
class PopoverRootElement extends PopoverRootElementBase {}
|
|
15
|
+
|
|
16
|
+
registerCustomElement('prosekit-popover-root', PopoverRootElement)
|
|
17
|
+
|
|
18
|
+
export { PopoverRootElement }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { usePopoverRoot } from '@aria-ui/popover/elements'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
PopoverRootEvents as Events,
|
|
3
|
+
PopoverRootProps as Props,
|
|
4
|
+
} from '@aria-ui/popover/elements'
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
popoverRootEvents,
|
|
8
|
+
popoverRootProps,
|
|
9
|
+
} from '@aria-ui/popover/elements'
|
|
10
|
+
|
|
11
|
+
export interface PopoverRootProps extends Props {}
|
|
12
|
+
export interface PopoverRootEvents extends Events {}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
+
|
|
3
|
+
import { usePopoverTrigger } from "./setup"
|
|
4
|
+
import { popoverTriggerEvents, popoverTriggerProps, type PopoverTriggerEvents, type PopoverTriggerProps } from "./types"
|
|
5
|
+
|
|
6
|
+
const PopoverTriggerElementBase: BaseElementConstructor<PopoverTriggerProps> = defineCustomElement<
|
|
7
|
+
PopoverTriggerProps,
|
|
8
|
+
PopoverTriggerEvents
|
|
9
|
+
>({
|
|
10
|
+
props: popoverTriggerProps,
|
|
11
|
+
events: popoverTriggerEvents,
|
|
12
|
+
setup: usePopoverTrigger,
|
|
13
|
+
})
|
|
14
|
+
class PopoverTriggerElement extends PopoverTriggerElementBase {}
|
|
15
|
+
|
|
16
|
+
registerCustomElement('prosekit-popover-trigger', PopoverTriggerElement)
|
|
17
|
+
|
|
18
|
+
export { PopoverTriggerElement }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { usePopoverTrigger } from '@aria-ui/popover/elements'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
PopoverTriggerEvents as Events,
|
|
3
|
+
PopoverTriggerProps as Props,
|
|
4
|
+
} from '@aria-ui/popover/elements'
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
popoverTriggerEvents,
|
|
8
|
+
popoverTriggerProps,
|
|
9
|
+
} from '@aria-ui/popover/elements'
|
|
10
|
+
|
|
11
|
+
export interface PopoverTriggerProps extends Props {}
|
|
12
|
+
export interface PopoverTriggerEvents extends Events {}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
type Context,
|
|
4
|
+
} from '@aria-ui/core'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export const onResizeContext: Context<OnResize> = createContext(
|
|
10
|
+
'prosekit/resizable/onResize',
|
|
11
|
+
null,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export const onResizeStartContext: Context<OnResizeStart> = createContext(
|
|
18
|
+
'prosekit/resizable/onResizeStart',
|
|
19
|
+
null,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export const onResizeEndContext: Context<OnResizeEnd> = createContext(
|
|
26
|
+
'prosekit/resizable/onResizeEnd',
|
|
27
|
+
null,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
export type OnResize = ((width: number, height: number) => void) | null
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export type OnResizeStart =
|
|
39
|
+
| (() => readonly [width: number, height: number, aspectRatio: number])
|
|
40
|
+
| null
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export type OnResizeEnd = (() => void) | null
|