@prosekit/extensions 0.11.5 → 0.11.7

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.
Files changed (78) hide show
  1. package/dist/drop-indicator-E7nCfdnR.js +58 -0
  2. package/dist/drop-indicator-E7nCfdnR.js.map +1 -0
  3. package/dist/{enter-rule-RdhEA900.js → enter-rule-5tkoU2Ir.js} +2 -3
  4. package/dist/enter-rule-5tkoU2Ir.js.map +1 -0
  5. package/dist/file-nRyo7PMB.js +132 -0
  6. package/dist/file-nRyo7PMB.js.map +1 -0
  7. package/dist/index-DY6lIIYV.d.ts +134 -0
  8. package/dist/index-DY6lIIYV.d.ts.map +1 -0
  9. package/dist/{input-rule-B17tpW4m.js → input-rule-DO_iy2aT.js} +4 -7
  10. package/dist/input-rule-DO_iy2aT.js.map +1 -0
  11. package/dist/{mark-rule-BCqIZMDu.js → mark-rule-CGmswjQ_.js} +1 -1
  12. package/dist/{mark-rule-BCqIZMDu.js.map → mark-rule-CGmswjQ_.js.map} +1 -1
  13. package/dist/{paste-rule-DIEJKIje.js → paste-rule-Brej6cWi.js} +2 -3
  14. package/dist/{paste-rule-DIEJKIje.js.map → paste-rule-Brej6cWi.js.map} +1 -1
  15. package/dist/prosekit-extensions-autocomplete.js +1 -2
  16. package/dist/prosekit-extensions-autocomplete.js.map +1 -1
  17. package/dist/prosekit-extensions-blockquote.js +1 -1
  18. package/dist/prosekit-extensions-bold.js +1 -1
  19. package/dist/prosekit-extensions-code-block.d.ts +1 -1
  20. package/dist/prosekit-extensions-code-block.js +4 -5
  21. package/dist/prosekit-extensions-code-block.js.map +1 -1
  22. package/dist/prosekit-extensions-code.js +1 -1
  23. package/dist/prosekit-extensions-commit.js +2 -4
  24. package/dist/prosekit-extensions-commit.js.map +1 -1
  25. package/dist/prosekit-extensions-drop-indicator.d.ts +3 -106
  26. package/dist/prosekit-extensions-drop-indicator.d.ts.map +1 -1
  27. package/dist/prosekit-extensions-drop-indicator.js +1 -1
  28. package/dist/prosekit-extensions-enter-rule.js +1 -1
  29. package/dist/prosekit-extensions-file.d.ts +2 -126
  30. package/dist/prosekit-extensions-file.js +2 -128
  31. package/dist/prosekit-extensions-hard-break.d.ts +0 -4
  32. package/dist/prosekit-extensions-hard-break.d.ts.map +1 -1
  33. package/dist/prosekit-extensions-heading.js +1 -1
  34. package/dist/prosekit-extensions-horizontal-rule.js +1 -1
  35. package/dist/prosekit-extensions-image.d.ts +135 -3
  36. package/dist/prosekit-extensions-image.d.ts.map +1 -1
  37. package/dist/prosekit-extensions-image.js +129 -8
  38. package/dist/prosekit-extensions-image.js.map +1 -1
  39. package/dist/prosekit-extensions-input-rule.js +1 -1
  40. package/dist/prosekit-extensions-italic.js +1 -1
  41. package/dist/prosekit-extensions-link.js +4 -4
  42. package/dist/prosekit-extensions-list.js +5 -7
  43. package/dist/prosekit-extensions-list.js.map +1 -1
  44. package/dist/prosekit-extensions-mark-rule.js +1 -1
  45. package/dist/prosekit-extensions-paragraph.d.ts +0 -4
  46. package/dist/prosekit-extensions-paragraph.d.ts.map +1 -1
  47. package/dist/prosekit-extensions-paste-rule.js +1 -1
  48. package/dist/prosekit-extensions-placeholder.js +3 -4
  49. package/dist/prosekit-extensions-placeholder.js.map +1 -1
  50. package/dist/prosekit-extensions-search.js +1 -2
  51. package/dist/prosekit-extensions-search.js.map +1 -1
  52. package/dist/prosekit-extensions-strike.js +1 -1
  53. package/dist/prosekit-extensions-table.js +2 -2
  54. package/dist/prosekit-extensions.d.ts +1 -1
  55. package/dist/{shiki-highlighter-chunk-DSPM0T27.d.ts → shiki-highlighter-chunk-Cwu1Jr9o.d.ts} +1 -1
  56. package/dist/{shiki-highlighter-chunk-DSPM0T27.d.ts.map → shiki-highlighter-chunk-Cwu1Jr9o.d.ts.map} +1 -1
  57. package/dist/shiki-highlighter-chunk.d.ts +1 -1
  58. package/dist/{table-Bi7WsMI3.js → table-DND_1127.js} +10 -19
  59. package/dist/{table-Bi7WsMI3.js.map → table-DND_1127.js.map} +1 -1
  60. package/package.json +8 -7
  61. package/src/drop-indicator/drop-indicator-facet.ts +6 -28
  62. package/src/drop-indicator/drop-indicator.ts +3 -5
  63. package/src/drop-indicator/index.ts +6 -6
  64. package/src/file/file-upload.ts +19 -6
  65. package/src/image/image-commands/insert-image.ts +14 -0
  66. package/src/image/image-commands/upload-image.ts +137 -0
  67. package/src/image/image-commands.ts +8 -4
  68. package/src/image/image-upload-handler.ts +96 -0
  69. package/src/image/index.ts +14 -0
  70. package/dist/drop-indicator-D1eHOhSi.js +0 -267
  71. package/dist/drop-indicator-D1eHOhSi.js.map +0 -1
  72. package/dist/enter-rule-RdhEA900.js.map +0 -1
  73. package/dist/input-rule-B17tpW4m.js.map +0 -1
  74. package/dist/prosekit-extensions-file.d.ts.map +0 -1
  75. package/dist/prosekit-extensions-file.js.map +0 -1
  76. package/src/drop-indicator/drop-indicator-plugin.ts +0 -147
  77. package/src/drop-indicator/drop-target.ts +0 -168
  78. package/src/drop-indicator/types.ts +0 -90
@@ -1,147 +0,0 @@
1
- import type { ResolvedPos } from '@prosekit/pm/model'
2
- import {
3
- NodeSelection,
4
- Plugin,
5
- PluginKey,
6
- TextSelection,
7
- type PluginView,
8
- } from '@prosekit/pm/state'
9
- import type { EditorView } from '@prosekit/pm/view'
10
-
11
- import {
12
- buildGetTarget,
13
- type GetTarget,
14
- } from './drop-target'
15
- import type {
16
- DragEventHandler,
17
- ShowHandler,
18
- ViewDragging,
19
- } from './types'
20
-
21
- /**
22
- * @internal
23
- */
24
- interface DropIndicatorPluginOptions {
25
- onDrag: DragEventHandler
26
- onShow: ShowHandler
27
- onHide: VoidFunction
28
- }
29
-
30
- /**
31
- * @internal
32
- */
33
- export function createDropIndicatorPlugin(options: DropIndicatorPluginOptions): Plugin {
34
- let getTarget: GetTarget | undefined
35
-
36
- return new Plugin({
37
- key: new PluginKey('prosekit-drop-indicator'),
38
- view: (view) => {
39
- getTarget = buildGetTarget(view, options.onDrag)
40
- return createDropIndicatorView(view, getTarget, options)
41
- },
42
- props: {
43
- handleDrop(view, event, slice, move): boolean {
44
- if (!getTarget) return false
45
-
46
- const target = getTarget([event.clientX, event.clientY], event)
47
-
48
- if (!target) return false
49
-
50
- event.preventDefault()
51
- let insertPos = target[0]
52
-
53
- let tr = view.state.tr
54
- if (move) {
55
- let { node } = (view.dragging as ViewDragging | null) || {}
56
- if (node) node.replace(tr)
57
- else tr.deleteSelection()
58
- }
59
-
60
- let pos = tr.mapping.map(insertPos)
61
- let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1
62
- let beforeInsert = tr.doc
63
- if (isNode) tr.replaceRangeWith(pos, pos, slice.content.firstChild!)
64
- else tr.replaceRange(pos, pos, slice)
65
- if (tr.doc.eq(beforeInsert)) {
66
- return true
67
- }
68
-
69
- let $pos = tr.doc.resolve(pos)
70
- if (
71
- isNode && NodeSelection.isSelectable(slice.content.firstChild!)
72
- && $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild!)
73
- ) {
74
- tr.setSelection(new NodeSelection($pos))
75
- } else {
76
- let end = tr.mapping.map(insertPos)
77
- tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo)
78
- tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)))
79
- }
80
- view.focus()
81
- view.dispatch(tr.setMeta('uiEvent', 'drop'))
82
- return true
83
- },
84
- },
85
- })
86
- }
87
-
88
- function selectionBetween(view: EditorView, $anchor: ResolvedPos, $head: ResolvedPos, bias?: number) {
89
- return view.someProp('createSelectionBetween', f => f(view, $anchor, $head))
90
- || TextSelection.between($anchor, $head, bias)
91
- }
92
-
93
- function createDropIndicatorView(view: EditorView, getTarget: GetTarget, options: DropIndicatorPluginOptions): PluginView {
94
- let dom = view.dom
95
- let hideId: ReturnType<typeof setTimeout> | undefined
96
- let prevX: number | undefined
97
- let prevY: number | undefined
98
- let hasDragOverEvent: boolean = false
99
-
100
- const scheduleHide = () => {
101
- if (hideId) {
102
- clearTimeout(hideId)
103
- }
104
-
105
- hasDragOverEvent = false
106
- hideId = setTimeout(() => {
107
- if (hasDragOverEvent) return
108
- options.onHide()
109
- }, 30)
110
- }
111
-
112
- const handleDragOver = (event: DragEvent): void => {
113
- hasDragOverEvent = true
114
-
115
- const { clientX, clientY } = event
116
- if (prevX === clientX && prevY === clientY) {
117
- return
118
- }
119
- prevX = clientX
120
- prevY = clientY
121
-
122
- let target = getTarget([clientX, clientY], event)
123
-
124
- if (!target) {
125
- scheduleHide()
126
- return
127
- } else {
128
- const [pos, [x1, y1, x2, y2]] = target
129
- const line = { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } }
130
- options.onShow({ view, pos, line })
131
- }
132
- }
133
-
134
- dom.addEventListener('dragover', handleDragOver)
135
- dom.addEventListener('dragend', scheduleHide)
136
- dom.addEventListener('drop', scheduleHide)
137
- dom.addEventListener('dragleave', scheduleHide)
138
-
139
- const destroy = () => {
140
- dom.removeEventListener('dragover', handleDragOver)
141
- dom.removeEventListener('dragend', scheduleHide)
142
- dom.removeEventListener('drop', scheduleHide)
143
- dom.removeEventListener('dragleave', scheduleHide)
144
- }
145
-
146
- return { destroy }
147
- }
@@ -1,168 +0,0 @@
1
- import { isHTMLElement } from '@ocavue/utils'
2
- import { isNodeSelection } from '@prosekit/core'
3
- import type { ProseMirrorNode } from '@prosekit/pm/model'
4
- import type { EditorView } from '@prosekit/pm/view'
5
-
6
- import type { DragEventHandler } from './types'
7
-
8
- type Point = readonly [x: number, y: number]
9
-
10
- type Line = readonly [x1: number, y1: number, x2: number, y2: number]
11
-
12
- /**
13
- * @internal
14
- */
15
- type DropTarget = readonly [pos: number, line: Line]
16
-
17
- function getTargetsByView(view: EditorView): DropTarget[] {
18
- type StackItem = [pos: number, node: ProseMirrorNode]
19
- let stack: StackItem[] = [[-1, view.state.doc]]
20
- let targets: DropTarget[] = []
21
-
22
- while (stack.length > 0) {
23
- const [pos, node] = stack.pop()!
24
- if (pos >= 0) {
25
- let dom = view.nodeDOM(pos)
26
- if (dom && isHTMLElement(dom)) {
27
- let rect = dom.getBoundingClientRect()
28
- let { top, bottom, left: x1, right: x2 } = rect
29
- targets.push(
30
- [pos, [x1, top, x2, top]],
31
- [pos + node.nodeSize, [x1, bottom, x2, bottom]],
32
- )
33
- }
34
- }
35
- if (node.isBlock && !node.isTextblock) {
36
- let childPos = pos + 1
37
- for (let child of node.children) {
38
- stack.push([childPos, child])
39
- childPos += child.nodeSize
40
- }
41
- }
42
- }
43
-
44
- return targets
45
- }
46
-
47
- /**
48
- * @internal
49
- */
50
- export type GetTarget = (point: Point, event: DragEvent) => DropTarget | undefined
51
-
52
- /**
53
- * @internal
54
- */
55
- export function buildGetTarget(
56
- view: EditorView,
57
- onDrag: DragEventHandler,
58
- ): GetTarget {
59
- let prevTargets: DropTarget[] = []
60
- let prevDoc: ProseMirrorNode | undefined
61
- let prevRect: DOMRect | undefined
62
-
63
- const getTargets = (): DropTarget[] => {
64
- const rect = view.dom.getBoundingClientRect()
65
- const doc = view.state.doc
66
-
67
- if (
68
- prevTargets && prevDoc && prevRect
69
- && rect.width === prevRect.width
70
- && rect.height === prevRect.height
71
- && rect.x === prevRect.x
72
- && rect.y === prevRect.y
73
- && prevDoc.eq(doc)
74
- ) {
75
- return prevTargets
76
- }
77
-
78
- prevRect = rect
79
- prevDoc = doc
80
- prevTargets = getTargetsByView(view)
81
- return prevTargets
82
- }
83
-
84
- const getTargetImpl: GetTarget = (point, event) => {
85
- if (!view.editable || view.isDestroyed) {
86
- return
87
- }
88
-
89
- const compare = (p1: DropTarget, p2: DropTarget): number => {
90
- const [pos1, line1] = p1
91
- const [pos2, line2] = p2
92
- const p1Distance = pointLineDistance(point, line1)
93
- const p2Distance = pointLineDistance(point, line2)
94
-
95
- return (p1Distance - p2Distance) || (pos1 - pos2)
96
- }
97
-
98
- let targets = getTargets()
99
- targets.sort(compare)
100
-
101
- // Only consider the first few targets for performance reasons.
102
- targets = targets.slice(0, 8)
103
-
104
- // Find the closest valid target.
105
- const target = targets.find(target => onDrag({ view, pos: target[0], event }) !== false)
106
-
107
- // If the dragging node is already at the target position, we ignore this
108
- // target. Notice that we don't pick the second better target here.
109
- if (target && isDraggingToItself(view, target[0])) {
110
- return undefined
111
- }
112
-
113
- return target
114
- }
115
-
116
- let prevPoint: Point | undefined
117
- let prevTarget: DropTarget | undefined
118
-
119
- const getTargetCached: GetTarget = (point, event) => {
120
- if (prevPoint && pointEqual(prevPoint, point)) {
121
- return prevTarget
122
- }
123
-
124
- prevPoint = point
125
- prevTarget = getTargetImpl(point, event)
126
- return prevTarget
127
- }
128
-
129
- return getTargetCached
130
- }
131
-
132
- function pointEqual(a: Point, b: Point) {
133
- return a[0] === b[0] && a[1] === b[1]
134
- }
135
-
136
- function pointPointDistance(a: Point, b: Point) {
137
- // Manhattan distance
138
- return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1])
139
- }
140
-
141
- function pointLineDistance(point: Point, line: Line) {
142
- // Notice that we are actually not calculating the distance between the point
143
- // and the line. Instead, we are calculating the distance between the point
144
- // and the two endpoints of the line.
145
- return Math.min(
146
- pointPointDistance(point, [line[0], line[1]]),
147
- pointPointDistance(point, [line[2], line[3]]),
148
- )
149
- }
150
-
151
- /**
152
- * Whether the dragging node is being dragged to the same position. For example,
153
- * dragging a list node into a new position that is just below the list node, or
154
- * dragging a nested quoteblock into itself.
155
- */
156
- function isDraggingToItself(view: EditorView, pos: number) {
157
- const dragging = view.dragging
158
- if (!dragging) return
159
-
160
- const { move } = dragging
161
- if (!move) return
162
-
163
- const selection = view.state.selection
164
- if (!isNodeSelection(selection)) return
165
-
166
- const { from, to } = selection
167
- return from <= pos && pos <= to
168
- }
@@ -1,90 +0,0 @@
1
- import type { Slice } from '@prosekit/pm/model'
2
- import type { NodeSelection } from '@prosekit/pm/state'
3
- import type { EditorView } from '@prosekit/pm/view'
4
-
5
- /**
6
- * A function that will be called when the `dragover` event is fired. You can
7
- * return `false` to disable the current drop point and thus hide the drop
8
- * indicator.
9
- *
10
- * @public
11
- */
12
- export type DragEventHandler = (options: DragEventHandlerOptions) => boolean
13
-
14
- /**
15
- * Options for {@link DragEventHandler}.
16
- *
17
- * @public
18
- */
19
- export interface DragEventHandlerOptions {
20
- /**
21
- * The editor's view.
22
- */
23
- view: EditorView
24
- /**
25
- * The drop position in current document.
26
- */
27
- pos: number
28
- /**
29
- * The `dragover` event.
30
- */
31
- event: DragEvent
32
- }
33
-
34
- /**
35
- * A function that will be called when the drop indicator should be shown.
36
- *
37
- * @public
38
- */
39
- export type ShowHandler = (options: ShowHandlerOptions) => void
40
-
41
- /**
42
- * Options for {@link ShowHandler}.
43
- *
44
- * @public
45
- */
46
- export interface ShowHandlerOptions {
47
- /**
48
- * The editor's view.
49
- */
50
- view: EditorView
51
-
52
- /**
53
- * The ProseMirror position that the drop indicator should be shown at.
54
- */
55
- pos: number
56
-
57
- /**
58
- * The line that the drop indicator should be shown at.
59
- */
60
- line: Line
61
- }
62
-
63
- /**
64
- * @internal
65
- */
66
- export interface Point {
67
- readonly x: number
68
- readonly y: number
69
- }
70
-
71
- /**
72
- * @internal
73
- */
74
- export interface Line {
75
- readonly p1: Point
76
- readonly p2: Point
77
- }
78
-
79
- /**
80
- * An interface matching the internal ProseMirror implementation.
81
- *
82
- * See https://github.com/ProseMirror/prosemirror-view/blob/1.38.1/src/input.ts#L657
83
- *
84
- * @internal
85
- */
86
- export interface ViewDragging {
87
- readonly slice: Slice
88
- readonly move: boolean
89
- readonly node?: NodeSelection
90
- }