@portabletext/editor 1.47.0 → 1.47.2

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 (93) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +7 -7
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  4. package/lib/_chunks-cjs/editor-provider.cjs +379 -326
  5. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  6. package/lib/_chunks-cjs/parse-blocks.cjs +4 -4
  7. package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -1
  8. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
  9. package/lib/_chunks-es/behavior.core.js +7 -7
  10. package/lib/_chunks-es/behavior.core.js.map +1 -1
  11. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  12. package/lib/_chunks-es/editor-provider.js +380 -327
  13. package/lib/_chunks-es/editor-provider.js.map +1 -1
  14. package/lib/_chunks-es/parse-blocks.js +4 -4
  15. package/lib/_chunks-es/parse-blocks.js.map +1 -1
  16. package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
  17. package/lib/behaviors/index.cjs.map +1 -1
  18. package/lib/behaviors/index.d.cts +70 -28
  19. package/lib/behaviors/index.d.ts +70 -28
  20. package/lib/behaviors/index.js.map +1 -1
  21. package/lib/index.cjs +12 -14
  22. package/lib/index.cjs.map +1 -1
  23. package/lib/index.d.cts +61 -3
  24. package/lib/index.d.ts +61 -3
  25. package/lib/index.js +12 -14
  26. package/lib/index.js.map +1 -1
  27. package/lib/plugins/index.cjs.map +1 -1
  28. package/lib/plugins/index.d.cts +68 -23
  29. package/lib/plugins/index.d.ts +68 -23
  30. package/lib/plugins/index.js.map +1 -1
  31. package/lib/selectors/index.d.cts +69 -27
  32. package/lib/selectors/index.d.ts +69 -27
  33. package/lib/utils/index.d.cts +74 -29
  34. package/lib/utils/index.d.ts +74 -29
  35. package/package.json +6 -6
  36. package/src/behavior-actions/behavior.action.insert.block.ts +1 -1
  37. package/src/behavior-actions/behavior.action.split.block.ts +1 -1
  38. package/src/behavior-actions/behavior.guards.ts +1 -1
  39. package/src/behaviors/behavior.core.decorators.ts +4 -4
  40. package/src/behaviors/behavior.core.insert-break.ts +4 -4
  41. package/src/behaviors/behavior.decorator-pair.ts +1 -1
  42. package/src/behaviors/behavior.links.ts +1 -1
  43. package/src/behaviors/behavior.markdown.ts +1 -1
  44. package/src/behaviors/behavior.perform-event.ts +1 -1
  45. package/src/converters/converter.portable-text.deserialize.test.ts +2 -3
  46. package/src/converters/converter.text-html.deserialize.test.ts +62 -5
  47. package/src/converters/converter.text-html.serialize.test.ts +9 -5
  48. package/src/converters/converter.text-html.ts +66 -64
  49. package/src/converters/converter.text-plain.test.ts +9 -4
  50. package/src/converters/converter.text-plain.ts +91 -87
  51. package/src/converters/converters.core.ts +13 -8
  52. package/src/editor/Editable.tsx +18 -13
  53. package/src/editor/PortableTextEditor.tsx +5 -5
  54. package/src/editor/__tests__/PortableTextEditorTester.tsx +4 -3
  55. package/src/editor/__tests__/insert-block.test.tsx +10 -10
  56. package/src/editor/__tests__/self-solving.test.tsx +2 -2
  57. package/src/editor/components/Synchronizer.tsx +1 -1
  58. package/src/editor/create-editor.ts +51 -18
  59. package/src/editor/editor-machine.ts +1 -1
  60. package/src/editor/{define-schema.ts → editor-schema.ts} +114 -5
  61. package/src/editor/editor-snapshot.ts +1 -1
  62. package/src/editor/get-active-decorators.ts +2 -2
  63. package/src/editor/{create-editor-schema.ts → legacy-schema.ts} +3 -3
  64. package/src/editor/mutation-machine.ts +1 -1
  65. package/src/editor/plugins/createWithObjectKeys.ts +6 -9
  66. package/src/editor/plugins/createWithPatches.ts +12 -11
  67. package/src/editor/plugins/createWithPortableTextBlockStyle.ts +2 -6
  68. package/src/editor/plugins/createWithPortableTextMarkModel.ts +15 -12
  69. package/src/editor/plugins/createWithSchemaTypes.ts +24 -16
  70. package/src/editor/plugins/createWithUndoRedo.ts +3 -4
  71. package/src/editor/plugins/createWithUtils.ts +12 -10
  72. package/src/editor/plugins/with-plugins.ts +5 -15
  73. package/src/editor/range-decorations-machine.ts +1 -1
  74. package/src/editor/sync-machine.ts +1 -1
  75. package/src/index.ts +2 -2
  76. package/src/internal-utils/__tests__/operationToPatches.test.ts +12 -10
  77. package/src/internal-utils/__tests__/patchToOperations.test.ts +3 -2
  78. package/src/internal-utils/__tests__/values.test.ts +3 -2
  79. package/src/internal-utils/applyPatch.ts +7 -9
  80. package/src/internal-utils/create-test-snapshot.ts +1 -1
  81. package/src/internal-utils/drag-selection.test.ts +1 -1
  82. package/src/internal-utils/operationToPatches.ts +4 -6
  83. package/src/internal-utils/parse-blocks.test.ts +1 -1
  84. package/src/internal-utils/parse-blocks.ts +8 -7
  85. package/src/internal-utils/slate-children-to-blocks.ts +1 -1
  86. package/src/internal-utils/slate-utils.ts +1 -1
  87. package/src/internal-utils/validateValue.ts +4 -6
  88. package/src/internal-utils/values.ts +5 -5
  89. package/src/plugins/plugin.decorator-shortcut.ts +1 -1
  90. package/src/plugins/plugin.markdown.test.tsx +1 -1
  91. package/src/plugins/plugin.markdown.tsx +1 -1
  92. package/src/selectors/selector.get-selection-text.test.ts +1 -1
  93. package/src/selectors/selector.get-trimmed-selection.test.ts +1 -1
package/lib/index.d.cts CHANGED
@@ -64,7 +64,6 @@ import {
64
64
  Values,
65
65
  } from 'xstate'
66
66
  import {GuardArgs} from 'xstate/guards'
67
- import {PortableTextMemberSchemaTypes as PortableTextMemberSchemaTypes_2} from '..'
68
67
 
69
68
  declare type AbstractBehaviorEvent =
70
69
  | {
@@ -1455,7 +1454,7 @@ declare const editorMachine: StateMachine<
1455
1454
  converters: Set<Converter>
1456
1455
  keyGenerator: () => string
1457
1456
  pendingEvents: never[]
1458
- schema: PortableTextMemberSchemaTypes_2
1457
+ schema: EditorSchema
1459
1458
  selection: null
1460
1459
  initialReadOnly: boolean
1461
1460
  maxBlocks: number | undefined
@@ -4965,7 +4964,65 @@ export declare type EditorProviderProps = {
4965
4964
  /**
4966
4965
  * @public
4967
4966
  */
4968
- export declare type EditorSchema = PortableTextMemberSchemaTypes
4967
+ export declare type EditorSchema = {
4968
+ annotations: ReadonlyArray<
4969
+ BaseDefinition & {
4970
+ fields: ReadonlyArray<{
4971
+ name: string
4972
+ type: string
4973
+ }>
4974
+ }
4975
+ >
4976
+ block: {
4977
+ name: string
4978
+ }
4979
+ blockObjects: ReadonlyArray<
4980
+ BaseDefinition & {
4981
+ fields: ReadonlyArray<{
4982
+ name: string
4983
+ type: string
4984
+ }>
4985
+ }
4986
+ >
4987
+ decorators: ReadonlyArray<
4988
+ BaseDefinition & {
4989
+ /**
4990
+ * @deprecated
4991
+ * Use `name` instead
4992
+ */
4993
+ value: string
4994
+ }
4995
+ >
4996
+ inlineObjects: ReadonlyArray<
4997
+ BaseDefinition & {
4998
+ fields: ReadonlyArray<{
4999
+ name: string
5000
+ type: string
5001
+ }>
5002
+ }
5003
+ >
5004
+ span: {
5005
+ name: string
5006
+ }
5007
+ styles: ReadonlyArray<
5008
+ BaseDefinition & {
5009
+ /**
5010
+ * @deprecated
5011
+ * Use `name` instead
5012
+ */
5013
+ value: string
5014
+ }
5015
+ >
5016
+ lists: ReadonlyArray<
5017
+ BaseDefinition & {
5018
+ /**
5019
+ * @deprecated
5020
+ * Use `name` instead
5021
+ */
5022
+ value: string
5023
+ }
5024
+ >
5025
+ }
4969
5026
 
4970
5027
  /** @public */
4971
5028
  export declare type EditorSelection = {
@@ -5153,6 +5210,7 @@ declare type InternalEditor = Editor & {
5153
5210
  editable: EditableAPI
5154
5211
  editorActor: EditorActor
5155
5212
  slateEditor: SlateEditor
5213
+ legacySchema: PortableTextMemberSchemaTypes
5156
5214
  }
5157
5215
  }
5158
5216
 
package/lib/index.d.ts CHANGED
@@ -64,7 +64,6 @@ import {
64
64
  Values,
65
65
  } from 'xstate'
66
66
  import {GuardArgs} from 'xstate/guards'
67
- import {PortableTextMemberSchemaTypes as PortableTextMemberSchemaTypes_2} from '..'
68
67
 
69
68
  declare type AbstractBehaviorEvent =
70
69
  | {
@@ -1455,7 +1454,7 @@ declare const editorMachine: StateMachine<
1455
1454
  converters: Set<Converter>
1456
1455
  keyGenerator: () => string
1457
1456
  pendingEvents: never[]
1458
- schema: PortableTextMemberSchemaTypes_2
1457
+ schema: EditorSchema
1459
1458
  selection: null
1460
1459
  initialReadOnly: boolean
1461
1460
  maxBlocks: number | undefined
@@ -4965,7 +4964,65 @@ export declare type EditorProviderProps = {
4965
4964
  /**
4966
4965
  * @public
4967
4966
  */
4968
- export declare type EditorSchema = PortableTextMemberSchemaTypes
4967
+ export declare type EditorSchema = {
4968
+ annotations: ReadonlyArray<
4969
+ BaseDefinition & {
4970
+ fields: ReadonlyArray<{
4971
+ name: string
4972
+ type: string
4973
+ }>
4974
+ }
4975
+ >
4976
+ block: {
4977
+ name: string
4978
+ }
4979
+ blockObjects: ReadonlyArray<
4980
+ BaseDefinition & {
4981
+ fields: ReadonlyArray<{
4982
+ name: string
4983
+ type: string
4984
+ }>
4985
+ }
4986
+ >
4987
+ decorators: ReadonlyArray<
4988
+ BaseDefinition & {
4989
+ /**
4990
+ * @deprecated
4991
+ * Use `name` instead
4992
+ */
4993
+ value: string
4994
+ }
4995
+ >
4996
+ inlineObjects: ReadonlyArray<
4997
+ BaseDefinition & {
4998
+ fields: ReadonlyArray<{
4999
+ name: string
5000
+ type: string
5001
+ }>
5002
+ }
5003
+ >
5004
+ span: {
5005
+ name: string
5006
+ }
5007
+ styles: ReadonlyArray<
5008
+ BaseDefinition & {
5009
+ /**
5010
+ * @deprecated
5011
+ * Use `name` instead
5012
+ */
5013
+ value: string
5014
+ }
5015
+ >
5016
+ lists: ReadonlyArray<
5017
+ BaseDefinition & {
5018
+ /**
5019
+ * @deprecated
5020
+ * Use `name` instead
5021
+ */
5022
+ value: string
5023
+ }
5024
+ >
5025
+ }
4969
5026
 
4970
5027
  /** @public */
4971
5028
  export declare type EditorSelection = {
@@ -5153,6 +5210,7 @@ declare type InternalEditor = Editor & {
5153
5210
  editable: EditableAPI
5154
5211
  editorActor: EditorActor
5155
5212
  slateEditor: SlateEditor
5213
+ legacySchema: PortableTextMemberSchemaTypes
5156
5214
  }
5157
5215
  }
5158
5216
 
package/lib/index.js CHANGED
@@ -1050,18 +1050,18 @@ const debug = debugWithName("component:Editable"), PLACEHOLDER_STYLE = {
1050
1050
  useImperativeHandle(forwardedRef, () => ref.current);
1051
1051
  const editorActor = useContext(EditorActorContext), readOnly = useSelector(editorActor, (s) => s.matches({
1052
1052
  "edit mode": "read only"
1053
- })), schemaTypes = useSelector(editorActor, (s_0) => s_0.context.schema), slateEditor = useSlate(), rangeDecorationsActor = useActorRef(rangeDecorationsMachine, {
1053
+ })), slateEditor = useSlate(), rangeDecorationsActor = useActorRef(rangeDecorationsMachine, {
1054
1054
  input: {
1055
1055
  rangeDecorations: rangeDecorations ?? [],
1056
1056
  readOnly,
1057
- schema: schemaTypes,
1057
+ schema: editorActor.getSnapshot().context.schema,
1058
1058
  slateEditor,
1059
1059
  skipSetup: !editorActor.getSnapshot().matches({
1060
1060
  setup: "setting up"
1061
1061
  })
1062
1062
  }
1063
1063
  });
1064
- useSelector(rangeDecorationsActor, (s_1) => s_1.context.updateCount);
1064
+ useSelector(rangeDecorationsActor, (s_0) => s_0.context.updateCount);
1065
1065
  const decorate = useMemo(() => createDecorate(rangeDecorationsActor), [rangeDecorationsActor]);
1066
1066
  useEffect(() => {
1067
1067
  rangeDecorationsActor.send({
@@ -1073,17 +1073,15 @@ const debug = debugWithName("component:Editable"), PLACEHOLDER_STYLE = {
1073
1073
  type: "range decorations updated",
1074
1074
  rangeDecorations: rangeDecorations ?? []
1075
1075
  });
1076
- }, [rangeDecorationsActor, rangeDecorations]);
1077
- const blockTypeName = schemaTypes.block.name;
1078
- useMemo(() => {
1076
+ }, [rangeDecorationsActor, rangeDecorations]), useMemo(() => {
1079
1077
  if (readOnly)
1080
1078
  return debug("Editable is in read only mode"), slateEditor;
1081
1079
  const withHotKeys = createWithHotkeys(editorActor, portableTextEditor, hotkeys);
1082
1080
  return debug("Editable is in edit mode"), withHotKeys(slateEditor);
1083
1081
  }, [editorActor, hotkeys, portableTextEditor, readOnly, slateEditor]);
1084
- const renderElement = useCallback((eProps) => /* @__PURE__ */ jsx(Element$1, { ...eProps, readOnly, renderBlock, renderChild, renderListItem, renderStyle, schemaTypes, spellCheck }), [schemaTypes, spellCheck, readOnly, renderBlock, renderChild, renderListItem, renderStyle]), renderLeaf = useCallback((lProps) => {
1082
+ const renderElement = useCallback((eProps) => /* @__PURE__ */ jsx(Element$1, { ...eProps, readOnly, renderBlock, renderChild, renderListItem, renderStyle, schemaTypes: portableTextEditor.schemaTypes, spellCheck }), [portableTextEditor, spellCheck, readOnly, renderBlock, renderChild, renderListItem, renderStyle]), renderLeaf = useCallback((lProps) => {
1085
1083
  if (lProps.leaf._type === "span") {
1086
- let rendered = /* @__PURE__ */ jsx(Leaf, { ...lProps, editorActor, schemaTypes, renderAnnotation, renderChild, renderDecorator, readOnly });
1084
+ let rendered = /* @__PURE__ */ jsx(Leaf, { ...lProps, editorActor, schemaTypes: portableTextEditor.schemaTypes, renderAnnotation, renderChild, renderDecorator, readOnly });
1087
1085
  if (renderPlaceholder && lProps.leaf.placeholder && lProps.text.text === "")
1088
1086
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1089
1087
  /* @__PURE__ */ jsx("span", { style: PLACEHOLDER_STYLE, contentEditable: !1, children: renderPlaceholder() }),
@@ -1095,10 +1093,10 @@ const debug = debugWithName("component:Editable"), PLACEHOLDER_STYLE = {
1095
1093
  })), rendered;
1096
1094
  }
1097
1095
  return lProps.children;
1098
- }, [editorActor, readOnly, renderAnnotation, renderChild, renderDecorator, renderPlaceholder, schemaTypes]), restoreSelectionFromProps = useCallback(() => {
1096
+ }, [editorActor, portableTextEditor, readOnly, renderAnnotation, renderChild, renderDecorator, renderPlaceholder]), restoreSelectionFromProps = useCallback(() => {
1099
1097
  if (propsSelection) {
1100
1098
  debug(`Selection from props ${JSON.stringify(propsSelection)}`);
1101
- const normalizedSelection = normalizeSelection(propsSelection, fromSlateValue(slateEditor.children, blockTypeName));
1099
+ const normalizedSelection = normalizeSelection(propsSelection, fromSlateValue(slateEditor.children, editorActor.getSnapshot().context.schema.block.name));
1102
1100
  if (normalizedSelection !== null) {
1103
1101
  debug(`Normalized selection from props ${JSON.stringify(normalizedSelection)}`);
1104
1102
  const slateRange = toSlateRange(normalizedSelection, slateEditor);
@@ -1108,7 +1106,7 @@ const debug = debugWithName("component:Editable"), PLACEHOLDER_STYLE = {
1108
1106
  }), slateEditor.onChange());
1109
1107
  }
1110
1108
  }
1111
- }, [blockTypeName, editorActor, propsSelection, slateEditor]);
1109
+ }, [editorActor, propsSelection, slateEditor]);
1112
1110
  useEffect(() => {
1113
1111
  const onReady = editorActor.on("ready", () => {
1114
1112
  rangeDecorationsActor.send({
@@ -1181,14 +1179,14 @@ const debug = debugWithName("component:Editable"), PLACEHOLDER_STYLE = {
1181
1179
  }
1182
1180
  }, [onCut, editorActor, slateEditor]), handlePaste = useCallback((event_1) => {
1183
1181
  const value = PortableTextEditor.getValue(portableTextEditor), path = (slateEditor.selection ? slateRangeToSelection({
1184
- schema: schemaTypes,
1182
+ schema: editorActor.getSnapshot().context.schema,
1185
1183
  editor: slateEditor,
1186
1184
  range: slateEditor.selection
1187
1185
  }) : null)?.focus.path || [], onPasteResult = onPaste?.({
1188
1186
  event: event_1,
1189
1187
  value,
1190
1188
  path,
1191
- schemaTypes
1189
+ schemaTypes: portableTextEditor.schemaTypes
1192
1190
  });
1193
1191
  if (onPasteResult || !slateEditor.selection)
1194
1192
  event_1.preventDefault(), editorActor.send({
@@ -1261,7 +1259,7 @@ const debug = debugWithName("component:Editable"), PLACEHOLDER_STYLE = {
1261
1259
  });
1262
1260
  }
1263
1261
  debug("No result from custom paste handler, pasting normally");
1264
- }, [editorActor, onPaste, portableTextEditor, schemaTypes, slateEditor]), handleOnFocus = useCallback((event_2) => {
1262
+ }, [editorActor, onPaste, portableTextEditor, slateEditor]), handleOnFocus = useCallback((event_2) => {
1265
1263
  if (onFocus && onFocus(event_2), !event_2.isDefaultPrevented()) {
1266
1264
  const selection_3 = PortableTextEditor.getSelection(portableTextEditor);
1267
1265
  selection_3 === null && (Transforms.select(slateEditor, Editor.start(slateEditor, [])), slateEditor.onChange()), editorActor.send({