@tiptap/core 2.0.0-beta.175 → 2.0.0-beta.176

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiptap/core",
3
3
  "description": "headless rich text editor",
4
- "version": "2.0.0-beta.175",
4
+ "version": "2.0.0-beta.176",
5
5
  "homepage": "https://tiptap.dev",
6
6
  "keywords": [
7
7
  "tiptap",
@@ -45,5 +45,5 @@
45
45
  "directory": "packages/core"
46
46
  },
47
47
  "sideEffects": false,
48
- "gitHead": "90e719c711dbccae6a7333956d543fb93789f3d3"
48
+ "gitHead": "1789af864fe36086df487cf8cd3e578b10de1564"
49
49
  }
package/src/Editor.ts CHANGED
@@ -13,7 +13,7 @@ import { getHTMLFromFragment } from './helpers/getHTMLFromFragment'
13
13
  import { getText } from './helpers/getText'
14
14
  import { isNodeEmpty } from './helpers/isNodeEmpty'
15
15
  import { resolveFocusPosition } from './helpers/resolveFocusPosition'
16
- import { getTextSeralizersFromSchema } from './helpers/getTextSeralizersFromSchema'
16
+ import { getTextSerializersFromSchema } from './helpers/getTextSerializersFromSchema'
17
17
  import { createStyleTag } from './utilities/createStyleTag'
18
18
  import { isFunction } from './utilities/isFunction'
19
19
  import { CommandManager } from './CommandManager'
@@ -57,6 +57,7 @@ export class Editor extends EventEmitter<EditorEvents> {
57
57
  element: document.createElement('div'),
58
58
  content: '',
59
59
  injectCSS: true,
60
+ injectNonce: undefined,
60
61
  extensions: [],
61
62
  autofocus: false,
62
63
  editable: true,
@@ -136,7 +137,7 @@ export class Editor extends EventEmitter<EditorEvents> {
136
137
  */
137
138
  private injectCSS(): void {
138
139
  if (this.options.injectCSS && document) {
139
- this.css = createStyleTag(style)
140
+ this.css = createStyleTag(style, this.options.injectNonce)
140
141
  }
141
142
  }
142
143
 
@@ -435,7 +436,7 @@ export class Editor extends EventEmitter<EditorEvents> {
435
436
  blockSeparator,
436
437
  textSerializers: {
437
438
  ...textSerializers,
438
- ...getTextSeralizersFromSchema(this.schema),
439
+ ...getTextSerializersFromSchema(this.schema),
439
440
  },
440
441
  })
441
442
  }
package/src/NodeView.ts CHANGED
@@ -82,8 +82,12 @@ export class NodeView<
82
82
  const domBox = this.dom.getBoundingClientRect()
83
83
  const handleBox = dragHandle.getBoundingClientRect()
84
84
 
85
- x = handleBox.x - domBox.x + event.offsetX
86
- y = handleBox.y - domBox.y + event.offsetY
85
+ // In React, we have to go through nativeEvent to reach offsetX/offsetY.
86
+ const offsetX = event.offsetX ?? (event as any).nativeEvent?.offsetX
87
+ const offsetY = event.offsetY ?? (event as any).nativeEvent?.offsetY
88
+
89
+ x = handleBox.x - domBox.x + offsetX
90
+ y = handleBox.y - domBox.y + offsetY
87
91
  }
88
92
 
89
93
  event.dataTransfer?.setDragImage(this.dom, x, y)
@@ -1,7 +1,7 @@
1
1
  import { Plugin, PluginKey } from 'prosemirror-state'
2
2
  import { Extension } from '../Extension'
3
3
  import { getTextBetween } from '../helpers/getTextBetween'
4
- import { getTextSeralizersFromSchema } from '../helpers/getTextSeralizersFromSchema'
4
+ import { getTextSerializersFromSchema } from '../helpers/getTextSerializersFromSchema'
5
5
 
6
6
  export const ClipboardTextSerializer = Extension.create({
7
7
  name: 'clipboardTextSerializer',
@@ -18,7 +18,7 @@ export const ClipboardTextSerializer = Extension.create({
18
18
  const { ranges } = selection
19
19
  const from = Math.min(...ranges.map(range => range.$from.pos))
20
20
  const to = Math.max(...ranges.map(range => range.$to.pos))
21
- const textSerializers = getTextSeralizersFromSchema(schema)
21
+ const textSerializers = getTextSerializersFromSchema(schema)
22
22
  const range = { from, to }
23
23
 
24
24
  return getTextBetween(doc, range, {
@@ -1,7 +1,7 @@
1
1
  import { Node } from 'prosemirror-model'
2
2
  import { getSchema } from './getSchema'
3
3
  import { Extensions, JSONContent, TextSerializer } from '../types'
4
- import { getTextSeralizersFromSchema } from './getTextSeralizersFromSchema'
4
+ import { getTextSerializersFromSchema } from './getTextSerializersFromSchema'
5
5
  import { getText } from './getText'
6
6
 
7
7
  export function generateText(
@@ -23,7 +23,7 @@ export function generateText(
23
23
  blockSeparator,
24
24
  textSerializers: {
25
25
  ...textSerializers,
26
- ...getTextSeralizersFromSchema(schema),
26
+ ...getTextSerializersFromSchema(schema),
27
27
  },
28
28
  })
29
29
  }
@@ -29,7 +29,11 @@ export function getMarkRange(
29
29
  return
30
30
  }
31
31
 
32
- const start = $pos.parent.childAfter($pos.parentOffset)
32
+ let start = $pos.parent.childAfter($pos.parentOffset)
33
+
34
+ if ($pos.parentOffset === start.offset && start.offset !== 0) {
35
+ start = $pos.parent.childBefore($pos.parentOffset)
36
+ }
33
37
 
34
38
  if (!start.node) {
35
39
  return
@@ -41,7 +45,7 @@ export function getMarkRange(
41
45
  return
42
46
  }
43
47
 
44
- let startIndex = $pos.index()
48
+ let startIndex = start.index
45
49
  let startPos = $pos.start() + start.offset
46
50
  let endIndex = startIndex + 1
47
51
  let endPos = startPos + start.node.nodeSize
@@ -31,6 +31,7 @@ export function getTextBetween(
31
31
  pos,
32
32
  parent,
33
33
  index,
34
+ range,
34
35
  })
35
36
  } else if (node.isText) {
36
37
  text += node?.text?.slice(Math.max(from, pos) - pos, to - pos)
@@ -1,7 +1,7 @@
1
1
  import { Schema } from 'prosemirror-model'
2
2
  import { TextSerializer } from '../types'
3
3
 
4
- export function getTextSeralizersFromSchema(schema: Schema): Record<string, TextSerializer> {
4
+ export function getTextSerializersFromSchema(schema: Schema): Record<string, TextSerializer> {
5
5
  return Object.fromEntries(Object
6
6
  .entries(schema.nodes)
7
7
  .filter(([, node]) => node.spec.toText)
package/src/index.ts CHANGED
@@ -47,6 +47,7 @@ export * from './helpers/getNodeAttributes'
47
47
  export * from './helpers/getNodeType'
48
48
  export * from './helpers/getText'
49
49
  export * from './helpers/getTextBetween'
50
+ export * from './helpers/getTextSerializersFromSchema'
50
51
  export * from './helpers/isActive'
51
52
  export * from './helpers/isList'
52
53
  export * from './helpers/isMarkActive'
package/src/types.ts CHANGED
@@ -70,6 +70,7 @@ export interface EditorOptions {
70
70
  content: Content,
71
71
  extensions: Extensions,
72
72
  injectCSS: boolean,
73
+ injectNonce: string | undefined,
73
74
  autofocus: FocusPosition,
74
75
  editable: boolean,
75
76
  editorProps: EditorProps,
@@ -243,6 +244,7 @@ export type TextSerializer = (props: {
243
244
  pos: number,
244
245
  parent: ProseMirrorNode,
245
246
  index: number,
247
+ range: Range,
246
248
  }) => string
247
249
 
248
250
  export type ExtendedRegExpMatchArray = RegExpMatchArray & {
@@ -1,4 +1,4 @@
1
- export function createStyleTag(style: string): HTMLStyleElement {
1
+ export function createStyleTag(style: string, nonce?: string): HTMLStyleElement {
2
2
  const tipTapStyleTag = (<HTMLStyleElement>document.querySelector('style[data-tiptap-style]'))
3
3
 
4
4
  if (tipTapStyleTag !== null) {
@@ -7,6 +7,10 @@ export function createStyleTag(style: string): HTMLStyleElement {
7
7
 
8
8
  const styleNode = document.createElement('style')
9
9
 
10
+ if (nonce) {
11
+ styleNode.setAttribute('nonce', nonce)
12
+ }
13
+
10
14
  styleNode.setAttribute('data-tiptap-style', '')
11
15
  styleNode.innerHTML = style
12
16
  document.getElementsByTagName('head')[0].appendChild(styleNode)
@@ -1,3 +0,0 @@
1
- import { Schema } from 'prosemirror-model';
2
- import { TextSerializer } from '../types';
3
- export declare function getTextSeralizersFromSchema(schema: Schema): Record<string, TextSerializer>;