@portabletext/editor 1.19.0 → 1.20.0

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/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "@sanity/schema";
2
2
  import { defineType, defineField, isKeySegment, isPortableTextTextBlock, isPortableTextSpan as isPortableTextSpan$1, isPortableTextListBlock } from "@sanity/types";
3
3
  import startCase from "lodash.startcase";
4
- import { jsx, Fragment, jsxs } from "react/jsx-runtime";
4
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
5
5
  import { useSelector, useActorRef } from "@xstate/react";
6
6
  import isEqual from "lodash/isEqual.js";
7
7
  import noop from "lodash/noop.js";
@@ -10,7 +10,6 @@ import { Editor, Element as Element$1, Range, Point, Text, Path, Transforms, Ope
10
10
  import { useSlateStatic, ReactEditor, useSelected, withReact, Slate, useSlate, Editable } from "slate-react";
11
11
  import debug$k from "debug";
12
12
  import { c } from "react-compiler-runtime";
13
- import { styled } from "styled-components";
14
13
  import uniq from "lodash/uniq.js";
15
14
  import { Subject } from "rxjs";
16
15
  import { useEffectEvent } from "use-effect-event";
@@ -377,171 +376,19 @@ function isEqualToEmptyEditor(children, schemaTypes) {
377
376
  const IS_PROCESSING_REMOTE_CHANGES = /* @__PURE__ */ new WeakMap(), IS_DRAGGING = /* @__PURE__ */ new WeakMap(), IS_DRAGGING_BLOCK_ELEMENT = /* @__PURE__ */ new WeakMap(), IS_DRAGGING_ELEMENT_TARGET = /* @__PURE__ */ new WeakMap(), IS_DRAGGING_BLOCK_TARGET_POSITION = /* @__PURE__ */ new WeakMap(), KEY_TO_SLATE_ELEMENT = /* @__PURE__ */ new WeakMap(), KEY_TO_VALUE_ELEMENT = /* @__PURE__ */ new WeakMap(), SLATE_TO_PORTABLE_TEXT_RANGE = /* @__PURE__ */ new WeakMap(), DefaultObject = (props) => {
378
377
  const $ = c(4);
379
378
  let t0;
380
- $[0] !== props.value ? (t0 = JSON.stringify(props.value, null, 2), $[0] = props.value, $[1] = t0) : t0 = $[1];
379
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = {
380
+ userSelect: "none"
381
+ }, $[0] = t0) : t0 = $[0];
381
382
  let t1;
382
- return $[2] !== t0 ? (t1 = /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("pre", { children: t0 }) }), $[2] = t0, $[3] = t1) : t1 = $[3], t1;
383
+ return $[1] !== props.value._key || $[2] !== props.value._type ? (t1 = /* @__PURE__ */ jsxs("div", { style: t0, children: [
384
+ "[",
385
+ props.value._type,
386
+ ": ",
387
+ props.value._key,
388
+ "]"
389
+ ] }), $[1] = props.value._key, $[2] = props.value._type, $[3] = t1) : t1 = $[3], t1;
383
390
  };
384
391
  DefaultObject.displayName = "DefaultObject";
385
- const DefaultBlockObject = styled.div`
386
- user-select: none;
387
- border: ${(props) => props.selected ? "1px solid blue" : "1px solid transparent"};
388
- `;
389
- styled.span`
390
- background: #999;
391
- border: ${(props) => props.selected ? "1px solid blue" : "1px solid transparent"};
392
- `;
393
- const DefaultListItem = styled.div`
394
- &.pt-list-item {
395
- width: fit-content;
396
- position: relative;
397
- display: block;
398
-
399
- /* Important 'transform' in order to force refresh the ::before and ::after rules
400
- in Webkit: https://stackoverflow.com/a/21947628/831480
401
- */
402
- transform: translateZ(0);
403
- margin-left: ${(props) => getLeftPositionForListLevel(props.listLevel)};
404
- }
405
- &.pt-list-item > .pt-list-item-inner {
406
- display: flex;
407
- margin: 0;
408
- padding: 0;
409
- &:before {
410
- justify-content: flex-start;
411
- vertical-align: top;
412
- }
413
- }
414
- &.pt-list-item-bullet > .pt-list-item-inner:before {
415
- content: '${(props) => getContentForListLevelAndStyle(props.listLevel, props.listStyle)}';
416
- font-size: 0.4375rem; /* 7px */
417
- line-height: 1.5rem; /* Same as body text */
418
- /* Optical alignment */
419
- position: relative;
420
- }
421
- }
422
- &.pt-list-item-bullet > .pt-list-item-inner {
423
- &:before {
424
- min-width: 1.5rem; /* Make sure space between bullet and text never shrinks */
425
- }
426
- }
427
- &.pt-list-item-number {
428
- counter-increment: ${(props) => getCounterIncrementForListLevel(props.listLevel)};
429
- counter-reset: ${(props) => getCounterResetForListLevel(props.listLevel)};
430
- }
431
- & + :not(.pt-list-item-number) {
432
- counter-reset: listItemNumber;
433
- }
434
- &.pt-list-item-number > .pt-list-item-inner:before {
435
- content: ${(props) => getCounterContentForListLevel(props.listLevel)};
436
- min-width: 1.5rem; /* Make sure space between number and text never shrinks */
437
- /* Optical alignment */
438
- position: relative;
439
- top: 1px;
440
- }
441
- `, DefaultListItemInner = styled.div``;
442
- function getLeftPositionForListLevel(level) {
443
- switch (Number(level)) {
444
- case 1:
445
- return "1.5em";
446
- case 2:
447
- return "3em";
448
- case 3:
449
- return "4.5em";
450
- case 4:
451
- return "6em";
452
- case 5:
453
- return "7.5em";
454
- case 6:
455
- return "9em";
456
- case 7:
457
- return "10.5em";
458
- case 8:
459
- return "12em";
460
- case 9:
461
- return "13.5em";
462
- case 10:
463
- return "15em";
464
- default:
465
- return "0em";
466
- }
467
- }
468
- const bullets = ["\u25CF", "\u25CB", "\u25A0"];
469
- function getContentForListLevelAndStyle(level, style) {
470
- const normalizedLevel = (level - 1) % 3;
471
- return style === "bullet" ? bullets[normalizedLevel] : "*";
472
- }
473
- function getCounterIncrementForListLevel(level) {
474
- switch (level) {
475
- case 1:
476
- return "listItemNumber";
477
- case 2:
478
- return "listItemAlpha";
479
- case 3:
480
- return "listItemRoman";
481
- case 4:
482
- return "listItemNumberNext";
483
- case 5:
484
- return "listItemLetterNext";
485
- case 6:
486
- return "listItemRomanNext";
487
- case 7:
488
- return "listItemNumberNextNext";
489
- case 8:
490
- return "listItemAlphaNextNext";
491
- case 9:
492
- return "listItemRomanNextNext";
493
- default:
494
- return "listItemNumberNextNextNext";
495
- }
496
- }
497
- function getCounterResetForListLevel(level) {
498
- switch (level) {
499
- case 1:
500
- return "listItemAlpha";
501
- case 2:
502
- return "listItemRoman";
503
- case 3:
504
- return "listItemNumberNext";
505
- case 4:
506
- return "listItemLetterNext";
507
- case 5:
508
- return "listItemRomanNext";
509
- case 6:
510
- return "listItemNumberNextNext";
511
- case 7:
512
- return "listItemAlphaNextNext";
513
- case 8:
514
- return "listItemRomanNextNext";
515
- case 9:
516
- return "listItemNumberNextNextNext";
517
- default:
518
- return "listItemNumberNextNextNext";
519
- }
520
- }
521
- function getCounterContentForListLevel(level) {
522
- switch (level) {
523
- case 1:
524
- return "counter(listItemNumber) '. '";
525
- case 2:
526
- return "counter(listItemAlpha, lower-alpha) '. '";
527
- case 3:
528
- return "counter(listItemRoman, lower-roman) '. '";
529
- case 4:
530
- return "counter(listItemNumberNext) '. '";
531
- case 5:
532
- return "counter(listItemLetterNext, lower-alpha) '. '";
533
- case 6:
534
- return "counter(listItemRomanNext, lower-roman) '. '";
535
- case 7:
536
- return "counter(listItemNumberNextNext) '. '";
537
- case 8:
538
- return "counter(listItemAlphaNextNext, lower-alpha) '. '";
539
- case 9:
540
- return "counter(listItemRomanNextNext, lower-roman) '. '";
541
- default:
542
- return "counter(listItemNumberNextNextNext) '. '";
543
- }
544
- }
545
392
  const debug$j = debugWithName("components:DraggableBlock"), DraggableBlock = (t0) => {
546
393
  const $ = c(51), {
547
394
  children,
@@ -747,7 +594,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
747
594
  let level;
748
595
  if (isListItem && (typeof element.level == "number" && (level = element.level), className += ` pt-list-item pt-list-item-${element.listItem} pt-list-item-level-${level || 1}`), editor.isListBlock(value) && isListItem && element.listItem) {
749
596
  const listType = schemaTypes.lists.find((item_0) => item_0.value === element.listItem);
750
- renderListItem && listType ? renderedBlock = renderListItem({
597
+ renderListItem && listType && (renderedBlock = renderListItem({
751
598
  block: value,
752
599
  children: renderedBlock,
753
600
  focused,
@@ -757,7 +604,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
757
604
  schemaType: listType,
758
605
  level: value.level || 1,
759
606
  editorElementRef: blockRef
760
- }) : renderedBlock = /* @__PURE__ */ jsx(DefaultListItem, { listStyle: value.listItem || schemaTypes.lists[0].value, listLevel: value.level || 1, children: /* @__PURE__ */ jsx(DefaultListItemInner, { children: renderedBlock }) });
607
+ }));
761
608
  }
762
609
  const renderProps = Object.defineProperty({
763
610
  children: renderedBlock,
@@ -803,10 +650,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
803
650
  }
804
651
  return /* @__PURE__ */ jsxs("div", { ...attributes, className, children: [
805
652
  children,
806
- /* @__PURE__ */ jsxs(DraggableBlock, { element, readOnly, blockRef, children: [
807
- renderedBlockFromProps && /* @__PURE__ */ jsx("div", { ref: blockRef, contentEditable: !1, children: renderedBlockFromProps }),
808
- !renderedBlockFromProps && /* @__PURE__ */ jsx(DefaultBlockObject, { selected, children: /* @__PURE__ */ jsx(DefaultObject, { value }) })
809
- ] })
653
+ /* @__PURE__ */ jsx(DraggableBlock, { element, readOnly, blockRef, children: /* @__PURE__ */ jsx("div", { ref: blockRef, contentEditable: !1, children: renderedBlockFromProps || /* @__PURE__ */ jsx(DefaultObject, { value }) }) })
810
654
  ] }, element._key);
811
655
  };
812
656
  Element.displayName = "Element";
@@ -5704,10 +5548,22 @@ const editorMachine = setup({
5704
5548
  input: {}
5705
5549
  },
5706
5550
  actions: {
5551
+ "add behavior to context": assign({
5552
+ behaviors: ({
5553
+ context,
5554
+ event
5555
+ }) => (assertEvent(event, "add behavior"), /* @__PURE__ */ new Set([...context.behaviors, event.behavior]))
5556
+ }),
5557
+ "remove behavior from context": assign({
5558
+ behaviors: ({
5559
+ context,
5560
+ event
5561
+ }) => (assertEvent(event, "remove behavior"), context.behaviors.delete(event.behavior), /* @__PURE__ */ new Set([...context.behaviors]))
5562
+ }),
5707
5563
  "assign behaviors": assign({
5708
5564
  behaviors: ({
5709
5565
  event
5710
- }) => (assertEvent(event, "update behaviors"), event.behaviors)
5566
+ }) => (assertEvent(event, "update behaviors"), new Set(event.behaviors))
5711
5567
  }),
5712
5568
  "assign schema": assign({
5713
5569
  schema: ({
@@ -5754,7 +5610,7 @@ const editorMachine = setup({
5754
5610
  const defaultAction = event.behaviorEvent.type === "copy" || event.behaviorEvent.type === "key.down" || event.behaviorEvent.type === "key.up" || event.behaviorEvent.type === "paste" ? void 0 : {
5755
5611
  ...event.behaviorEvent,
5756
5612
  editor: event.editor
5757
- }, eventBehaviors = context.behaviors.filter((behavior) => behavior.on === event.behaviorEvent.type);
5613
+ }, eventBehaviors = [...context.behaviors.values()].filter((behavior) => behavior.on === event.behaviorEvent.type);
5758
5614
  if (eventBehaviors.length === 0) {
5759
5615
  if (!defaultAction)
5760
5616
  return;
@@ -5837,7 +5693,7 @@ const editorMachine = setup({
5837
5693
  context: ({
5838
5694
  input
5839
5695
  }) => ({
5840
- behaviors: input.behaviors ?? coreBehaviors,
5696
+ behaviors: new Set(input.behaviors ?? coreBehaviors),
5841
5697
  keyGenerator: input.keyGenerator,
5842
5698
  pendingEvents: [],
5843
5699
  schema: input.schema,
@@ -5847,6 +5703,12 @@ const editorMachine = setup({
5847
5703
  value: input.value
5848
5704
  }),
5849
5705
  on: {
5706
+ "add behavior": {
5707
+ actions: "add behavior to context"
5708
+ },
5709
+ "remove behavior": {
5710
+ actions: "remove behavior from context"
5711
+ },
5850
5712
  unset: {
5851
5713
  actions: emit(({
5852
5714
  event
@@ -6172,6 +6034,15 @@ function createEditorFromActor(editorActor) {
6172
6034
  editorActorSnapshot: editorActor.getSnapshot(),
6173
6035
  slateEditorInstance: slateEditor.instance
6174
6036
  }),
6037
+ registerBehavior: (config) => (editorActor.send({
6038
+ type: "add behavior",
6039
+ behavior: config.behavior
6040
+ }), () => {
6041
+ editorActor.send({
6042
+ type: "remove behavior",
6043
+ behavior: config.behavior
6044
+ });
6045
+ }),
6175
6046
  send: (event) => {
6176
6047
  editorActor.send(event);
6177
6048
  },