@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
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { useEffect, type
|
|
1
|
+
import { useEffect, type HostElement } from '@aria-ui/core'
|
|
2
2
|
import type { Editor, Extension } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
export function useEditorExtension(
|
|
5
|
-
host:
|
|
6
|
-
|
|
5
|
+
host: HostElement,
|
|
6
|
+
getEditor: () => Editor | null,
|
|
7
7
|
extension: Extension,
|
|
8
8
|
): void {
|
|
9
9
|
useEffect(host, () => {
|
|
10
|
-
return
|
|
10
|
+
return getEditor()?.use(extension)
|
|
11
11
|
})
|
|
12
12
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineFocusChangeHandler, type Editor, type FocusChangeHandler } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
@@ -7,10 +7,10 @@ import { useEditorExtension } from './use-editor-extension.ts'
|
|
|
7
7
|
* @internal
|
|
8
8
|
*/
|
|
9
9
|
export function useEditorFocusChangeEvent(
|
|
10
|
-
host:
|
|
11
|
-
|
|
10
|
+
host: HostElement,
|
|
11
|
+
getEditor: () => Editor | null,
|
|
12
12
|
handler: FocusChangeHandler,
|
|
13
13
|
): void {
|
|
14
14
|
const extension = defineFocusChangeHandler(handler)
|
|
15
|
-
useEditorExtension(host,
|
|
15
|
+
useEditorExtension(host, getEditor, extension)
|
|
16
16
|
}
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
import { createSignal, type
|
|
1
|
+
import { createSignal, type HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineDOMEventHandler, union, type Editor } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
5
5
|
|
|
6
6
|
export function useEditorTyping(
|
|
7
|
-
host:
|
|
8
|
-
|
|
9
|
-
):
|
|
7
|
+
host: HostElement,
|
|
8
|
+
getEditor: () => Editor | null,
|
|
9
|
+
): () => boolean {
|
|
10
10
|
const typing = createSignal(false)
|
|
11
11
|
|
|
12
|
-
const handleKeypress = () => {
|
|
13
|
-
typing.set(true)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const handlePointerMove = () => {
|
|
17
|
-
typing.set(false)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
12
|
const extension = union(
|
|
21
|
-
defineDOMEventHandler('keypress',
|
|
22
|
-
|
|
13
|
+
defineDOMEventHandler('keypress', () => {
|
|
14
|
+
typing.set(true)
|
|
15
|
+
}),
|
|
16
|
+
defineDOMEventHandler('pointermove', () => {
|
|
17
|
+
typing.set(false)
|
|
18
|
+
}),
|
|
23
19
|
)
|
|
24
20
|
|
|
25
|
-
useEditorExtension(host,
|
|
21
|
+
useEditorExtension(host, getEditor, extension)
|
|
26
22
|
|
|
27
|
-
return typing
|
|
23
|
+
return typing.get
|
|
28
24
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineUpdateHandler, type Editor, type UpdateHandler } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
@@ -7,10 +7,10 @@ import { useEditorExtension } from './use-editor-extension.ts'
|
|
|
7
7
|
* @internal
|
|
8
8
|
*/
|
|
9
9
|
export function useEditorUpdateEvent(
|
|
10
|
-
host:
|
|
11
|
-
|
|
10
|
+
host: HostElement,
|
|
11
|
+
getEditor: () => Editor | null,
|
|
12
12
|
handler: UpdateHandler,
|
|
13
13
|
): void {
|
|
14
14
|
const extension = defineUpdateHandler(handler)
|
|
15
|
-
useEditorExtension(host,
|
|
15
|
+
useEditorExtension(host, getEditor, extension)
|
|
16
16
|
}
|
package/src/hooks/use-keymap.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostElement } from '@aria-ui/core'
|
|
2
2
|
import { defineKeymap, type Editor, type Keymap } from '@prosekit/core'
|
|
3
3
|
|
|
4
4
|
import { useEditorExtension } from './use-editor-extension.ts'
|
|
5
5
|
|
|
6
6
|
export function useKeymap(
|
|
7
|
-
host:
|
|
8
|
-
|
|
7
|
+
host: HostElement,
|
|
8
|
+
getEditor: () => Editor | null,
|
|
9
9
|
keymap: Keymap,
|
|
10
10
|
): void {
|
|
11
11
|
const extension = defineKeymap(keymap)
|
|
12
|
-
useEditorExtension(host,
|
|
12
|
+
useEditorExtension(host, getEditor, extension)
|
|
13
13
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createSignal, useEffect, type
|
|
2
|
-
import { getNearestOverflowAncestor } from '@
|
|
1
|
+
import { createSignal, useEffect, type HostElement } from '@aria-ui/core'
|
|
2
|
+
import { getNearestOverflowAncestor } from '@aria-ui/utils'
|
|
3
3
|
|
|
4
|
-
export function useScrolling(host:
|
|
4
|
+
export function useScrolling(host: HostElement): () => boolean {
|
|
5
5
|
const scrolling = createSignal(false)
|
|
6
6
|
|
|
7
7
|
useEffect(host, () => {
|
|
@@ -15,16 +15,17 @@ export function useScrolling(host: ConnectableElement): ReadonlySignal<boolean>
|
|
|
15
15
|
scrolling.set(false)
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const abortController = new AbortController()
|
|
19
|
+
const abortSignal = abortController.signal
|
|
20
|
+
|
|
21
|
+
scrollableParent.addEventListener('scroll', handleScroll, { passive: true, signal: abortSignal })
|
|
22
|
+
window.addEventListener('mousemove', handleMouseMove, { passive: true, signal: abortSignal })
|
|
23
|
+
window.addEventListener('pointermove', handleMouseMove, { passive: true, signal: abortSignal })
|
|
21
24
|
|
|
22
25
|
return () => {
|
|
23
|
-
|
|
24
|
-
window.removeEventListener('mousemove', handleMouseMove)
|
|
25
|
-
window.removeEventListener('pointermove', handleMouseMove)
|
|
26
|
+
abortController.abort()
|
|
26
27
|
}
|
|
27
28
|
})
|
|
28
29
|
|
|
29
|
-
return scrolling
|
|
30
|
+
return scrolling.get
|
|
30
31
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { createSignal, useEffect, type ConnectableElement } from '@aria-ui/core'
|
|
1
|
+
import { createSignal, useEffect, type HostElement } from '@aria-ui/core'
|
|
3
2
|
import type { Editor } from '@prosekit/core'
|
|
4
3
|
|
|
5
4
|
import { getSafeEditorView } from '../utils/get-safe-editor-view.ts'
|
|
@@ -9,25 +8,22 @@ import { getSafeEditorView } from '../utils/get-safe-editor-view.ts'
|
|
|
9
8
|
* components should be disabled or hidden.
|
|
10
9
|
*/
|
|
11
10
|
export function useSelecting(
|
|
12
|
-
host:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
):
|
|
11
|
+
host: HostElement,
|
|
12
|
+
getEditor: () => Editor | null,
|
|
13
|
+
getEnabled: () => boolean,
|
|
14
|
+
): () => boolean {
|
|
16
15
|
const selecting = createSignal(false)
|
|
17
16
|
const isPointerDown = createSignal(false)
|
|
18
17
|
|
|
19
18
|
useEffect(host, () => {
|
|
20
|
-
if (!
|
|
21
|
-
return
|
|
22
|
-
}
|
|
19
|
+
if (!getEnabled()) return
|
|
23
20
|
|
|
24
|
-
const view = getSafeEditorView(
|
|
21
|
+
const view = getSafeEditorView(getEditor())
|
|
25
22
|
if (!view) return
|
|
26
23
|
|
|
27
24
|
const { dom, root } = view
|
|
28
25
|
if (!root) return
|
|
29
26
|
|
|
30
|
-
// When the user starts selecting text, we set the selecting signal to true.
|
|
31
27
|
const handlePointerDown = () => {
|
|
32
28
|
selecting.set(true)
|
|
33
29
|
isPointerDown.set(true)
|
|
@@ -35,15 +31,12 @@ export function useSelecting(
|
|
|
35
31
|
const handlePointerUp = () => {
|
|
36
32
|
isPointerDown.set(false)
|
|
37
33
|
}
|
|
38
|
-
// When the user moves the pointer and the pointer is not down, we set the
|
|
39
|
-
// selecting signal to false again.
|
|
40
34
|
const handleMouseMove = () => {
|
|
41
35
|
if (!isPointerDown.get()) {
|
|
42
36
|
selecting.set(false)
|
|
43
37
|
}
|
|
44
38
|
}
|
|
45
39
|
|
|
46
|
-
// Only listen to pointer down events on the editor
|
|
47
40
|
dom.addEventListener('pointerdown', handlePointerDown)
|
|
48
41
|
root.addEventListener('pointerup', handlePointerUp)
|
|
49
42
|
root.addEventListener('pointermove', handleMouseMove)
|
|
@@ -55,5 +48,5 @@ export function useSelecting(
|
|
|
55
48
|
}
|
|
56
49
|
})
|
|
57
50
|
|
|
58
|
-
return selecting
|
|
51
|
+
return selecting.get
|
|
59
52
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
function cloneKeyboardEvent(source: KeyboardEvent): KeyboardEvent {
|
|
2
|
+
return new KeyboardEvent(source.type, {
|
|
3
|
+
code: source.code,
|
|
4
|
+
key: source.key,
|
|
5
|
+
location: source.location,
|
|
6
|
+
repeat: source.repeat,
|
|
7
|
+
altKey: source.altKey,
|
|
8
|
+
ctrlKey: source.ctrlKey,
|
|
9
|
+
metaKey: source.metaKey,
|
|
10
|
+
shiftKey: source.shiftKey,
|
|
11
|
+
|
|
12
|
+
view: source.view,
|
|
13
|
+
// internal bridge target; events don't need to bubble"
|
|
14
|
+
bubbles: false,
|
|
15
|
+
cancelable: true,
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class KeyboardEventTarget extends EventTarget {
|
|
20
|
+
override dispatchEvent(event: KeyboardEvent): boolean {
|
|
21
|
+
const newEvent = cloneKeyboardEvent(event)
|
|
22
|
+
const result: boolean = super.dispatchEvent(newEvent)
|
|
23
|
+
if (newEvent.defaultPrevented) {
|
|
24
|
+
event.preventDefault()
|
|
25
|
+
}
|
|
26
|
+
return result
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { computed, createSignal, type Signal } from '@aria-ui/core'
|
|
2
|
+
import { describe, expect, it } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import { createLazySignal } from './lazy-signal.ts'
|
|
5
|
+
|
|
6
|
+
describe('createLazySignal', () => {
|
|
7
|
+
it('returns fallback when remote is undefined', () => {
|
|
8
|
+
const lazy = createLazySignal<number>(() => undefined, 42)
|
|
9
|
+
expect(lazy.get()).toBe(42)
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
it('delegates get to remote when resolved', () => {
|
|
13
|
+
const real = createSignal(10)
|
|
14
|
+
const lazy = createLazySignal<number>(() => real, 0)
|
|
15
|
+
expect(lazy.get()).toBe(10)
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('delegates set to remote when resolved', () => {
|
|
19
|
+
const real = createSignal(10)
|
|
20
|
+
const lazy = createLazySignal<number>(() => real, 0)
|
|
21
|
+
lazy.set(20)
|
|
22
|
+
expect(real.get()).toBe(20)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('set is a no-op when remote is undefined', () => {
|
|
26
|
+
const lazy = createLazySignal<number>(() => undefined, 42)
|
|
27
|
+
expect(() => lazy.set(99)).not.toThrow()
|
|
28
|
+
expect(lazy.get()).toBe(42)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('propagates reactivity when remote is bound late', () => {
|
|
32
|
+
const source = createSignal<Signal<number> | undefined>(undefined)
|
|
33
|
+
const lazy = createLazySignal<number>(() => source.get(), 0)
|
|
34
|
+
const derived = computed(() => lazy.get())
|
|
35
|
+
|
|
36
|
+
expect(derived()).toBe(0)
|
|
37
|
+
|
|
38
|
+
const real = createSignal(42)
|
|
39
|
+
source.set(real)
|
|
40
|
+
expect(derived()).toBe(42)
|
|
41
|
+
|
|
42
|
+
real.set(100)
|
|
43
|
+
expect(derived()).toBe(100)
|
|
44
|
+
|
|
45
|
+
real.set(200)
|
|
46
|
+
expect(derived()).toBe(200)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('releases old dependency when remote is reparented', () => {
|
|
50
|
+
const source = createSignal<Signal<number> | undefined>(undefined)
|
|
51
|
+
const lazy = createLazySignal<number>(() => source.get(), 0)
|
|
52
|
+
const derived = computed(() => lazy.get())
|
|
53
|
+
|
|
54
|
+
const a = createSignal(1)
|
|
55
|
+
source.set(a)
|
|
56
|
+
expect(derived()).toBe(1)
|
|
57
|
+
|
|
58
|
+
const b = createSignal(100)
|
|
59
|
+
source.set(b)
|
|
60
|
+
expect(derived()).toBe(100)
|
|
61
|
+
|
|
62
|
+
a.set(999)
|
|
63
|
+
expect(derived()).toBe(100)
|
|
64
|
+
|
|
65
|
+
b.set(200)
|
|
66
|
+
expect(derived()).toBe(200)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Signal } from '@aria-ui/core'
|
|
2
|
+
|
|
3
|
+
export function createLazySignal<T>(
|
|
4
|
+
getRemote: () => Signal<T> | undefined,
|
|
5
|
+
fallback: T,
|
|
6
|
+
): Signal<T> {
|
|
7
|
+
return {
|
|
8
|
+
get: (): T => {
|
|
9
|
+
const remote = getRemote()
|
|
10
|
+
return remote ? remote.get() : fallback
|
|
11
|
+
},
|
|
12
|
+
set: (value: T): void => {
|
|
13
|
+
const remote = getRemote()
|
|
14
|
+
if (remote) remote.set(value)
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { computed } from '@aria-ui/core'
|
|
2
|
+
import { isHTMLElement } from '@ocavue/utils'
|
|
3
|
+
import type { Editor } from '@prosekit/core'
|
|
4
|
+
|
|
5
|
+
export function useHTMLElementAt(
|
|
6
|
+
getEditor: () => Editor | null | undefined,
|
|
7
|
+
getPos: () => number | null | undefined,
|
|
8
|
+
): () => HTMLElement | undefined {
|
|
9
|
+
return computed(() => {
|
|
10
|
+
const editor = getEditor()
|
|
11
|
+
const pos = getPos()
|
|
12
|
+
if (!editor || !pos) return
|
|
13
|
+
const view = editor.view
|
|
14
|
+
const element = view.nodeDOM(pos)
|
|
15
|
+
if (element && isHTMLElement(element)) return element
|
|
16
|
+
})
|
|
17
|
+
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createSignal } from "@aria-ui/core";
|
|
2
|
-
//#region src/utils/get-default-state.ts
|
|
3
|
-
function getStateWithDefaults(state, props) {
|
|
4
|
-
const merged = { ...state };
|
|
5
|
-
for (const key of Object.keys(props)) if (!merged[key]) merged[key] = createSignal(props[key].default);
|
|
6
|
-
return merged;
|
|
7
|
-
}
|
|
8
|
-
//#endregion
|
|
9
|
-
export { getStateWithDefaults as t };
|
|
10
|
-
|
|
11
|
-
//# sourceMappingURL=get-default-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-default-state.js","names":[],"sources":["../src/utils/get-default-state.ts"],"sourcesContent":["import { createSignal, type PropDeclarations, type SignalState } from '@aria-ui/core'\n\nexport function getStateWithDefaults<\n Props extends Record<string, any> = Record<string, any>,\n>(\n state: Partial<SignalState<Props>>,\n props: PropDeclarations<Props>,\n): SignalState<Props> {\n const merged = { ...state } as SignalState<Props>\n\n for (const key of Object.keys(props) as (keyof Props)[]) {\n if (!merged[key]) {\n merged[key] = createSignal(props[key].default)\n }\n }\n\n return merged\n}\n"],"mappings":";;AAEA,SAAgB,qBAGd,OACA,OACoB;CACpB,MAAM,SAAS,EAAE,GAAG,OAAO;AAE3B,MAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,KAAI,CAAC,OAAO,KACV,QAAO,OAAO,aAAa,MAAM,KAAK,QAAQ;AAIlD,QAAO"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
-
|
|
3
|
-
import { useAutocompleteEmpty } from "./setup.ts"
|
|
4
|
-
import { autocompleteEmptyEvents, autocompleteEmptyProps, type AutocompleteEmptyEvents, type AutocompleteEmptyProps } from "./types.ts"
|
|
5
|
-
|
|
6
|
-
const AutocompleteEmptyElementBase: BaseElementConstructor<AutocompleteEmptyProps> = defineCustomElement<
|
|
7
|
-
AutocompleteEmptyProps,
|
|
8
|
-
AutocompleteEmptyEvents
|
|
9
|
-
>({
|
|
10
|
-
props: autocompleteEmptyProps,
|
|
11
|
-
events: autocompleteEmptyEvents,
|
|
12
|
-
setup: useAutocompleteEmpty,
|
|
13
|
-
})
|
|
14
|
-
class AutocompleteEmptyElement extends AutocompleteEmptyElementBase {}
|
|
15
|
-
|
|
16
|
-
registerCustomElement('prosekit-autocomplete-empty', AutocompleteEmptyElement)
|
|
17
|
-
|
|
18
|
-
export { AutocompleteEmptyElement }
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'
|
|
2
|
-
|
|
3
|
-
/** @internal */
|
|
4
|
-
export interface AutocompleteEmptyProps {}
|
|
5
|
-
|
|
6
|
-
/** @internal */
|
|
7
|
-
export const autocompleteEmptyProps: PropDeclarations<AutocompleteEmptyProps> = {}
|
|
8
|
-
|
|
9
|
-
/** @internal */
|
|
10
|
-
export interface AutocompleteEmptyEvents {}
|
|
11
|
-
|
|
12
|
-
/** @internal */
|
|
13
|
-
export const autocompleteEmptyEvents: EventDeclarations<AutocompleteEmptyEvents> = {}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
-
|
|
3
|
-
import { useAutocompleteItem } from "./setup.ts"
|
|
4
|
-
import { autocompleteItemEvents, autocompleteItemProps, type AutocompleteItemEvents, type AutocompleteItemProps } from "./types.ts"
|
|
5
|
-
|
|
6
|
-
const AutocompleteItemElementBase: BaseElementConstructor<AutocompleteItemProps> = defineCustomElement<
|
|
7
|
-
AutocompleteItemProps,
|
|
8
|
-
AutocompleteItemEvents
|
|
9
|
-
>({
|
|
10
|
-
props: autocompleteItemProps,
|
|
11
|
-
events: autocompleteItemEvents,
|
|
12
|
-
setup: useAutocompleteItem,
|
|
13
|
-
})
|
|
14
|
-
class AutocompleteItemElement extends AutocompleteItemElementBase {}
|
|
15
|
-
|
|
16
|
-
registerCustomElement('prosekit-autocomplete-item', AutocompleteItemElement)
|
|
17
|
-
|
|
18
|
-
export { AutocompleteItemElement }
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { useEffect, useEventListener, type ConnectableElement, type SetupOptions } from '@aria-ui/core'
|
|
2
|
-
import { useListboxItem } from '@aria-ui/listbox/elements'
|
|
3
|
-
|
|
4
|
-
import { openContext } from '../context.ts'
|
|
5
|
-
|
|
6
|
-
import type { AutocompleteItemEvents, AutocompleteItemProps } from './types.ts'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @internal
|
|
10
|
-
*/
|
|
11
|
-
export function useAutocompleteItem(
|
|
12
|
-
element: ConnectableElement,
|
|
13
|
-
{ state, emit }: SetupOptions<AutocompleteItemProps, AutocompleteItemEvents>,
|
|
14
|
-
): void {
|
|
15
|
-
useListboxItem(element, { state, emit })
|
|
16
|
-
|
|
17
|
-
const open = openContext.consume(element)
|
|
18
|
-
|
|
19
|
-
useEffect(element, () => {
|
|
20
|
-
// Check the text content again when the open state changes
|
|
21
|
-
if (!state.value.peek() && open.get()) {
|
|
22
|
-
state.value.set(element.textContent ?? '')
|
|
23
|
-
}
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
useEventListener(element, 'pointerdown', (event) => {
|
|
27
|
-
// Prevent the editor from losing focus
|
|
28
|
-
event.preventDefault()
|
|
29
|
-
})
|
|
30
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { EventDeclarations, PropDeclarations } from '@aria-ui/core'
|
|
2
|
-
import { listboxItemEvents, type ListboxItemEvents } from '@aria-ui/listbox'
|
|
3
|
-
|
|
4
|
-
export interface AutocompleteItemProps {
|
|
5
|
-
/**
|
|
6
|
-
* The value of the item, which will be matched against the query.
|
|
7
|
-
*
|
|
8
|
-
* If not provided, the value is the item's text content.
|
|
9
|
-
*
|
|
10
|
-
* @default ""
|
|
11
|
-
*/
|
|
12
|
-
value: string
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** @internal */
|
|
16
|
-
export const autocompleteItemProps: PropDeclarations<AutocompleteItemProps> = {
|
|
17
|
-
value: {
|
|
18
|
-
default: '',
|
|
19
|
-
},
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface AutocompleteItemEvents extends ListboxItemEvents {}
|
|
23
|
-
|
|
24
|
-
/** @internal */
|
|
25
|
-
export const autocompleteItemEvents: EventDeclarations<AutocompleteItemEvents> = listboxItemEvents
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement, registerCustomElement, type BaseElementConstructor } from "@aria-ui/core"
|
|
2
|
-
|
|
3
|
-
import { useAutocompleteList } from "./setup.ts"
|
|
4
|
-
import { autocompleteListEvents, autocompleteListProps, type AutocompleteListEvents, type AutocompleteListProps } from "./types.ts"
|
|
5
|
-
|
|
6
|
-
const AutocompleteListElementBase: BaseElementConstructor<AutocompleteListProps> = defineCustomElement<
|
|
7
|
-
AutocompleteListProps,
|
|
8
|
-
AutocompleteListEvents
|
|
9
|
-
>({
|
|
10
|
-
props: autocompleteListProps,
|
|
11
|
-
events: autocompleteListEvents,
|
|
12
|
-
setup: useAutocompleteList,
|
|
13
|
-
})
|
|
14
|
-
class AutocompleteListElement extends AutocompleteListElementBase {}
|
|
15
|
-
|
|
16
|
-
registerCustomElement('prosekit-autocomplete-list', AutocompleteListElement)
|
|
17
|
-
|
|
18
|
-
export { AutocompleteListElement }
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createSignal,
|
|
3
|
-
useEffect,
|
|
4
|
-
type ConnectableElement,
|
|
5
|
-
type ReadonlySignal,
|
|
6
|
-
type SetupOptions,
|
|
7
|
-
type TypedEventTarget,
|
|
8
|
-
} from '@aria-ui/core'
|
|
9
|
-
import { listboxProps, useListbox, type ListboxProps } from '@aria-ui/listbox/elements'
|
|
10
|
-
import type { Priority } from '@prosekit/core'
|
|
11
|
-
import { defineDOMEventHandler, withPriority, type Editor } from '@prosekit/core'
|
|
12
|
-
|
|
13
|
-
import { getStateWithDefaults } from '../../../utils/get-default-state.ts'
|
|
14
|
-
import { onSubmitContext, openContext, queryContext } from '../context.ts'
|
|
15
|
-
|
|
16
|
-
import type { AutocompleteListEvents, AutocompleteListProps } from './types.ts'
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
export function useAutocompleteList(
|
|
22
|
-
element: ConnectableElement,
|
|
23
|
-
{ state, emit }: SetupOptions<AutocompleteListProps, AutocompleteListEvents>,
|
|
24
|
-
): void {
|
|
25
|
-
const open = openContext.consume(element)
|
|
26
|
-
const query = queryContext.consume(element)
|
|
27
|
-
const onSubmit = onSubmitContext.consume(element)
|
|
28
|
-
|
|
29
|
-
const keydownTarget = useKeyDownTarget(element, open, state.editor)
|
|
30
|
-
|
|
31
|
-
const listboxState = getStateWithDefaults<ListboxProps>(
|
|
32
|
-
{ filter: state.filter, eventTarget: createSignal(keydownTarget) },
|
|
33
|
-
listboxProps,
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
useEffect(element, () => {
|
|
37
|
-
element.addEventListener('valueChange', () => {
|
|
38
|
-
if (onSubmit) {
|
|
39
|
-
onSubmit.get()?.()
|
|
40
|
-
}
|
|
41
|
-
})
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
useListbox(element, { state: listboxState, emit })
|
|
45
|
-
|
|
46
|
-
useEffect(element, () => {
|
|
47
|
-
listboxState.query.set(query.get())
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
useEffect(element, () => {
|
|
51
|
-
if (!open.get()) {
|
|
52
|
-
listboxState.value.set('')
|
|
53
|
-
query.set('')
|
|
54
|
-
}
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
// Reset the focused item when the popover is open
|
|
58
|
-
useEffect(element, () => {
|
|
59
|
-
if (!open.get()) {
|
|
60
|
-
listboxState.autoFocus.set(false)
|
|
61
|
-
} else {
|
|
62
|
-
let canceled = false
|
|
63
|
-
|
|
64
|
-
requestAnimationFrame(() => {
|
|
65
|
-
if (canceled) return
|
|
66
|
-
listboxState.autoFocus.set(true)
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
return () => {
|
|
70
|
-
canceled = true
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
// The autocomplete list should not be focusable because the editor will get
|
|
76
|
-
// the focus during typing.
|
|
77
|
-
useEffect(element, () => {
|
|
78
|
-
element.tabIndex = -1
|
|
79
|
-
})
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function useKeyDownTarget(
|
|
83
|
-
element: ConnectableElement,
|
|
84
|
-
open: ReadonlySignal<boolean>,
|
|
85
|
-
editor: ReadonlySignal<Editor | null>,
|
|
86
|
-
): TypedEventTarget<'keydown'> {
|
|
87
|
-
const keydownHandlers: ((event: KeyboardEvent) => void)[] = []
|
|
88
|
-
|
|
89
|
-
useEffect(element, () => {
|
|
90
|
-
const editorValue = editor.get()
|
|
91
|
-
|
|
92
|
-
if (!editorValue) {
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const extension = defineDOMEventHandler(
|
|
97
|
-
'keydown',
|
|
98
|
-
(view, event): boolean => {
|
|
99
|
-
if (view.composing || event.defaultPrevented || !open.get()) {
|
|
100
|
-
return false
|
|
101
|
-
}
|
|
102
|
-
keydownHandlers.forEach((handler) => handler(event))
|
|
103
|
-
return event.defaultPrevented
|
|
104
|
-
},
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
return editorValue.use(withPriority(extension, 4 satisfies typeof Priority.highest))
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
addEventListener: (type, listener) => {
|
|
112
|
-
if (type === 'keydown') {
|
|
113
|
-
keydownHandlers.push(listener)
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
removeEventListener: (type, listener) => {
|
|
117
|
-
if (type === 'keydown') {
|
|
118
|
-
const index = keydownHandlers.indexOf(listener)
|
|
119
|
-
if (index !== -1) {
|
|
120
|
-
keydownHandlers.splice(index, 1)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
}
|
|
125
|
-
}
|