@portabletext/editor 1.41.3 → 1.41.4

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 (48) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +52 -28
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +11 -11
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/editor-provider.cjs +24 -21
  6. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs +2 -2
  8. package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.get-text-before.cjs +2 -2
  10. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  11. package/lib/_chunks-cjs/selector.is-active-style.cjs +240 -0
  12. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -0
  13. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs +300 -218
  14. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
  15. package/lib/_chunks-es/behavior.core.js +27 -3
  16. package/lib/_chunks-es/behavior.core.js.map +1 -1
  17. package/lib/_chunks-es/behavior.markdown.js +1 -1
  18. package/lib/_chunks-es/editor-provider.js +5 -2
  19. package/lib/_chunks-es/editor-provider.js.map +1 -1
  20. package/lib/_chunks-es/selector.get-focus-inline-object.js +1 -1
  21. package/lib/_chunks-es/selector.get-text-before.js +1 -1
  22. package/lib/_chunks-es/selector.is-active-style.js +243 -0
  23. package/lib/_chunks-es/selector.is-active-style.js.map +1 -0
  24. package/lib/_chunks-es/selector.is-overlapping-selection.js +298 -217
  25. package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
  26. package/lib/behaviors/index.cjs +9 -9
  27. package/lib/behaviors/index.cjs.map +1 -1
  28. package/lib/behaviors/index.js +1 -1
  29. package/lib/index.cjs +75 -102
  30. package/lib/index.cjs.map +1 -1
  31. package/lib/index.js +66 -93
  32. package/lib/index.js.map +1 -1
  33. package/lib/plugins/index.cjs +6 -6
  34. package/lib/plugins/index.cjs.map +1 -1
  35. package/lib/plugins/index.js +1 -1
  36. package/lib/selectors/index.cjs +36 -36
  37. package/lib/selectors/index.cjs.map +1 -1
  38. package/lib/selectors/index.js +4 -4
  39. package/package.json +1 -1
  40. package/src/behaviors/behavior.core.dnd.ts +27 -0
  41. package/src/behaviors/behavior.core.ts +2 -0
  42. package/src/behaviors/behavior.default.ts +4 -0
  43. package/src/editor/Editable.tsx +22 -40
  44. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +0 -322
  45. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +0 -1
  46. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +0 -324
  47. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +0 -1
  48. package/src/internal-utils/dragging-on-drag-origin.ts +0 -22
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- var selector_isAtTheStartOfBlock = require("./selector.is-at-the-start-of-block.cjs"), types = require("@sanity/types"), util_sliceBlocks = require("./util.slice-blocks.cjs");
2
+ var selector_isOverlappingSelection = require("./selector.is-overlapping-selection.cjs"), types = require("@sanity/types"), util_sliceBlocks = require("./util.slice-blocks.cjs");
3
3
  const IS_MAC = typeof window < "u" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent), modifiers = {
4
4
  alt: "altKey",
5
5
  control: "ctrlKey",
@@ -144,10 +144,10 @@ const addAnnotationOnCollapsedSelection = {
144
144
  guard: ({
145
145
  snapshot
146
146
  }) => {
147
- if (!selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot))
147
+ if (!selector_isOverlappingSelection.isSelectionCollapsed(snapshot))
148
148
  return !1;
149
- const caretWordSelection = selector_isAtTheStartOfBlock.getCaretWordSelection(snapshot);
150
- return !caretWordSelection || !selector_isAtTheStartOfBlock.isSelectionExpanded({
149
+ const caretWordSelection = selector_isOverlappingSelection.getCaretWordSelection(snapshot);
150
+ return !caretWordSelection || !selector_isOverlappingSelection.isSelectionExpanded({
151
151
  context: {
152
152
  ...snapshot.context,
153
153
  selection: caretWordSelection
@@ -175,9 +175,9 @@ const addAnnotationOnCollapsedSelection = {
175
175
  snapshot,
176
176
  event
177
177
  }) => {
178
- if (!isHotkey("ArrowDown", event.originEvent) || !selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot))
178
+ if (!isHotkey("ArrowDown", event.originEvent) || !selector_isOverlappingSelection.isSelectionCollapsed(snapshot))
179
179
  return !1;
180
- const focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), nextBlock = selector_isAtTheStartOfBlock.getNextBlock(snapshot);
180
+ const focusBlockObject = selector_isOverlappingSelection.getFocusBlockObject(snapshot), nextBlock = selector_isOverlappingSelection.getNextBlock(snapshot);
181
181
  return focusBlockObject && !nextBlock;
182
182
  },
183
183
  actions: [({
@@ -195,9 +195,9 @@ const addAnnotationOnCollapsedSelection = {
195
195
  snapshot,
196
196
  event
197
197
  }) => {
198
- if (!isHotkey("ArrowUp", event.originEvent) || !selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot))
198
+ if (!isHotkey("ArrowUp", event.originEvent) || !selector_isOverlappingSelection.isSelectionCollapsed(snapshot))
199
199
  return !1;
200
- const focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), previousBlock = selector_isAtTheStartOfBlock.getPreviousBlock(snapshot);
200
+ const focusBlockObject = selector_isOverlappingSelection.getFocusBlockObject(snapshot), previousBlock = selector_isOverlappingSelection.getPreviousBlock(snapshot);
201
201
  return focusBlockObject && !previousBlock;
202
202
  },
203
203
  actions: [({
@@ -214,8 +214,8 @@ const addAnnotationOnCollapsedSelection = {
214
214
  guard: ({
215
215
  snapshot
216
216
  }) => {
217
- const focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot);
218
- return selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot) && focusBlockObject !== void 0;
217
+ const focusBlockObject = selector_isOverlappingSelection.getFocusBlockObject(snapshot);
218
+ return selector_isOverlappingSelection.isSelectionCollapsed(snapshot) && focusBlockObject !== void 0;
219
219
  },
220
220
  actions: [({
221
221
  snapshot
@@ -232,9 +232,9 @@ const addAnnotationOnCollapsedSelection = {
232
232
  snapshot,
233
233
  event
234
234
  }) => {
235
- if (!selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot))
235
+ if (!selector_isOverlappingSelection.isSelectionCollapsed(snapshot))
236
236
  return !1;
237
- const focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), previousBlock = selector_isAtTheStartOfBlock.getPreviousBlock(snapshot);
237
+ const focusBlockObject = selector_isOverlappingSelection.getFocusBlockObject(snapshot), previousBlock = selector_isOverlappingSelection.getPreviousBlock(snapshot);
238
238
  return event.position.isEditor && event.position.block === "start" && focusBlockObject && !previousBlock;
239
239
  },
240
240
  actions: [({
@@ -252,9 +252,9 @@ const addAnnotationOnCollapsedSelection = {
252
252
  snapshot,
253
253
  event
254
254
  }) => {
255
- if (!selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot))
255
+ if (!selector_isOverlappingSelection.isSelectionCollapsed(snapshot))
256
256
  return !1;
257
- const focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), nextBlock = selector_isAtTheStartOfBlock.getNextBlock(snapshot);
257
+ const focusBlockObject = selector_isOverlappingSelection.getFocusBlockObject(snapshot), nextBlock = selector_isOverlappingSelection.getNextBlock(snapshot);
258
258
  return event.position.isEditor && event.position.block === "end" && focusBlockObject && !nextBlock;
259
259
  },
260
260
  actions: [({
@@ -271,7 +271,7 @@ const addAnnotationOnCollapsedSelection = {
271
271
  guard: ({
272
272
  snapshot
273
273
  }) => {
274
- const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), previousBlock = selector_isAtTheStartOfBlock.getPreviousBlock(snapshot);
274
+ const focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), previousBlock = selector_isOverlappingSelection.getPreviousBlock(snapshot);
275
275
  return !focusTextBlock || !selectionCollapsed || !previousBlock ? !1 : util_sliceBlocks.isEmptyTextBlock(focusTextBlock.node) && !types.isPortableTextTextBlock(previousBlock.node) ? {
276
276
  focusTextBlock,
277
277
  previousBlock
@@ -301,7 +301,7 @@ const addAnnotationOnCollapsedSelection = {
301
301
  guard: ({
302
302
  snapshot
303
303
  }) => {
304
- const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), nextBlock = selector_isAtTheStartOfBlock.getNextBlock(snapshot);
304
+ const focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), nextBlock = selector_isOverlappingSelection.getNextBlock(snapshot);
305
305
  return !focusTextBlock || !selectionCollapsed || !nextBlock ? !1 : util_sliceBlocks.isEmptyTextBlock(focusTextBlock.node) && !types.isPortableTextTextBlock(nextBlock.node) ? {
306
306
  focusTextBlock,
307
307
  nextBlock
@@ -379,15 +379,39 @@ const addAnnotationOnCollapsedSelection = {
379
379
  decorator: "code"
380
380
  })]]
381
381
  }
382
- }, breakingAtTheEndOfTextBlock = {
382
+ }, coreDndBehaviors = [
383
+ /**
384
+ * When dragging over the drag origin, we don't want to show the caret in the
385
+ * text.
386
+ */
387
+ {
388
+ on: "drag.dragover",
389
+ guard: ({
390
+ snapshot,
391
+ event
392
+ }) => {
393
+ const dragOrigin = snapshot.beta.internalDrag?.origin;
394
+ return dragOrigin ? selector_isOverlappingSelection.isOverlappingSelection(event.position.selection)({
395
+ ...snapshot,
396
+ context: {
397
+ ...snapshot.context,
398
+ selection: dragOrigin.selection
399
+ }
400
+ }) : !1;
401
+ },
402
+ actions: [() => [{
403
+ type: "noop"
404
+ }]]
405
+ }
406
+ ], breakingAtTheEndOfTextBlock = {
383
407
  on: "insert.break",
384
408
  guard: ({
385
409
  snapshot
386
410
  }) => {
387
- const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot);
411
+ const focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot);
388
412
  if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed)
389
413
  return !1;
390
- const atTheEndOfBlock = selector_isAtTheStartOfBlock.isAtTheEndOfBlock(focusTextBlock)(snapshot), focusListItem = focusTextBlock.node.listItem, focusLevel = focusTextBlock.node.level;
414
+ const atTheEndOfBlock = selector_isOverlappingSelection.isAtTheEndOfBlock(focusTextBlock)(snapshot), focusListItem = focusTextBlock.node.listItem, focusLevel = focusTextBlock.node.level;
391
415
  return atTheEndOfBlock ? {
392
416
  focusListItem,
393
417
  focusLevel
@@ -419,11 +443,11 @@ const addAnnotationOnCollapsedSelection = {
419
443
  guard: ({
420
444
  snapshot
421
445
  }) => {
422
- const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot);
446
+ const focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot);
423
447
  if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed)
424
448
  return !1;
425
- const focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot), focusDecorators = focusSpan?.node.marks?.filter((mark) => snapshot.context.schema.decorators.some((decorator) => decorator.value === mark) ?? []), focusAnnotations = focusSpan?.node.marks?.filter((mark) => !snapshot.context.schema.decorators.some((decorator) => decorator.value === mark)) ?? [], focusListItem = focusTextBlock.node.listItem, focusLevel = focusTextBlock.node.level;
426
- return selector_isAtTheStartOfBlock.isAtTheStartOfBlock(focusTextBlock)(snapshot) ? {
449
+ const focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot), focusDecorators = focusSpan?.node.marks?.filter((mark) => snapshot.context.schema.decorators.some((decorator) => decorator.value === mark) ?? []), focusAnnotations = focusSpan?.node.marks?.filter((mark) => !snapshot.context.schema.decorators.some((decorator) => decorator.value === mark)) ?? [], focusListItem = focusTextBlock.node.listItem, focusLevel = focusTextBlock.node.level;
450
+ return selector_isOverlappingSelection.isAtTheStartOfBlock(focusTextBlock)(snapshot) ? {
427
451
  focusAnnotations,
428
452
  focusDecorators,
429
453
  focusListItem,
@@ -461,7 +485,7 @@ const addAnnotationOnCollapsedSelection = {
461
485
  guard: ({
462
486
  snapshot
463
487
  }) => {
464
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot);
488
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot);
465
489
  return !selectionCollapsed || !focusTextBlock || !focusSpan ? !1 : focusTextBlock.node.children[0]._key === focusSpan.node._key && snapshot.context.selection?.focus.offset === 0 && focusTextBlock.node.level === 1 ? {
466
490
  focusTextBlock
467
491
  } : !1;
@@ -478,7 +502,7 @@ const addAnnotationOnCollapsedSelection = {
478
502
  guard: ({
479
503
  snapshot
480
504
  }) => {
481
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot);
505
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot);
482
506
  return !selectionCollapsed || !focusTextBlock || !focusSpan ? !1 : focusTextBlock.node.children[0]._key === focusSpan.node._key && snapshot.context.selection?.focus.offset === 0 && focusTextBlock.node.level !== void 0 && focusTextBlock.node.level > 1 ? {
483
507
  focusTextBlock,
484
508
  level: focusTextBlock.node.level - 1
@@ -499,7 +523,7 @@ const addAnnotationOnCollapsedSelection = {
499
523
  guard: ({
500
524
  snapshot
501
525
  }) => {
502
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusListBlock = selector_isAtTheStartOfBlock.getFocusListBlock(snapshot);
526
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusListBlock = selector_isOverlappingSelection.getFocusListBlock(snapshot);
503
527
  return !selectionCollapsed || !focusListBlock || !util_sliceBlocks.isEmptyTextBlock(focusListBlock.node) ? !1 : {
504
528
  focusListBlock
505
529
  };
@@ -519,7 +543,7 @@ const addAnnotationOnCollapsedSelection = {
519
543
  }) => {
520
544
  if (!isHotkey("Tab", event.originEvent))
521
545
  return !1;
522
- const selectedBlocks = selector_isAtTheStartOfBlock.getSelectedBlocks(snapshot), guards = selector_isAtTheStartOfBlock.createGuards(snapshot.context), selectedListBlocks = selectedBlocks.flatMap((block) => guards.isListBlock(block.node) ? [{
546
+ const selectedBlocks = selector_isOverlappingSelection.getSelectedBlocks(snapshot), guards = selector_isOverlappingSelection.createGuards(snapshot.context), selectedListBlocks = selectedBlocks.flatMap((block) => guards.isListBlock(block.node) ? [{
523
547
  node: block.node,
524
548
  path: block.path
525
549
  }] : []);
@@ -544,7 +568,7 @@ const addAnnotationOnCollapsedSelection = {
544
568
  }) => {
545
569
  if (!isHotkey("Shift+Tab", event.originEvent))
546
570
  return !1;
547
- const selectedBlocks = selector_isAtTheStartOfBlock.getSelectedBlocks(snapshot), guards = selector_isAtTheStartOfBlock.createGuards(snapshot.context), selectedListBlocks = selectedBlocks.flatMap((block) => guards.isListBlock(block.node) ? [{
571
+ const selectedBlocks = selector_isOverlappingSelection.getSelectedBlocks(snapshot), guards = selector_isOverlappingSelection.createGuards(snapshot.context), selectedListBlocks = selectedBlocks.flatMap((block) => guards.isListBlock(block.node) ? [{
548
572
  node: block.node,
549
573
  path: block.path
550
574
  }] : []);
@@ -567,7 +591,7 @@ const addAnnotationOnCollapsedSelection = {
567
591
  clearListOnEnter,
568
592
  indentListOnTab,
569
593
  unindentListOnShiftTab
570
- }, coreBehaviors = [coreAnnotationBehaviors.addAnnotationOnCollapsedSelection, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreBlockObjectBehaviors.clickingAboveLonelyBlockObject, coreBlockObjectBehaviors.clickingBelowLonelyBlockObject, coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock, coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock];
594
+ }, coreBehaviors = [coreAnnotationBehaviors.addAnnotationOnCollapsedSelection, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, ...coreDndBehaviors, coreBlockObjectBehaviors.clickingAboveLonelyBlockObject, coreBlockObjectBehaviors.clickingBelowLonelyBlockObject, coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock, coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock];
571
595
  exports.coreBehaviors = coreBehaviors;
572
596
  exports.defineBehavior = defineBehavior;
573
597
  exports.isClipboardBehaviorEvent = isClipboardBehaviorEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.cjs","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {BlockWithOptionalKey} from '../types/block-with-optional-key'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | InternalBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n\ntype BehaviorEventTypeNamespace =\n | SyntheticBehaviorEventNamespace\n | InternalBehaviorEventNamespace\n | NativeBehaviorEventNamespace\n | CustomBehaviorEventNamespace\n\ntype SyntheticBehaviorEventType<\n TNamespace extends SyntheticBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype InternalBehaviorEventType<\n TNamespace extends InternalBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype NativeBehaviorEventType<\n TNamespace extends NativeBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype CustomBehaviorEventType<\n TNamespace extends CustomBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\nexport type NamespacedBehaviorEventType<\n TNamespace extends BehaviorEventTypeNamespace | '',\n> = TNamespace extends ''\n ? BehaviorEvent['type']\n : Extract<BehaviorEvent['type'], TNamespace | `${TNamespace}.${string}`>\n\n/**\n * @beta\n */\nexport type ExternalSyntheticBehaviorEvent = {\n type: SyntheticBehaviorEventType<'insert', 'block object'>\n placement: InsertPlacement\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n}\n\n/**************************************\n * Synthetic events\n **************************************/\n\ntype SyntheticBehaviorEventNamespace =\n | 'annotation'\n | 'block'\n | 'blur'\n | 'data transfer'\n | 'decorator'\n | 'delete'\n | 'deserialization'\n | 'focus'\n | 'history'\n | 'insert'\n | 'list item'\n | 'move'\n | 'select'\n | 'serialization'\n | 'style'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: SyntheticBehaviorEventType<'annotation', 'add'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'annotation', 'remove'>\n annotation: {\n name: string\n }\n }\n | {\n type: SyntheticBehaviorEventType<'annotation', 'toggle'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'block', 'set'>\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: SyntheticBehaviorEventType<'block', 'unset'>\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: SyntheticBehaviorEventType<'blur'>\n }\n | {\n type: SyntheticBehaviorEventType<'data transfer', 'set'>\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'add'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'remove'>\n decorator: string\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'toggle'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: SyntheticBehaviorEventType<'delete'>\n selection: NonNullable<EditorSelection>\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'backward'>\n unit: TextUnit\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'block'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'forward'>\n unit: TextUnit\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'text'>\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: SyntheticBehaviorEventType<'focus'>\n }\n | {\n type: SyntheticBehaviorEventType<'history', 'redo'>\n }\n | {\n type: SyntheticBehaviorEventType<'history', 'undo'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'blocks'>\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'inline object'>\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'break'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'soft break'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'block'>\n block: BlockWithOptionalKey\n placement: InsertPlacement\n select?: 'start' | 'end' | 'none'\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'span'>\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'text'>\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'add'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'remove'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'toggle'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block'>\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block down'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block up'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'select'>\n selection: EditorSelection\n }\n | {\n type: SyntheticBehaviorEventType<'select', 'previous block'>\n select?: 'start' | 'end'\n }\n | {\n type: SyntheticBehaviorEventType<'select', 'next block'>\n select?: 'start' | 'end'\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'add'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'remove'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'toggle'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'deserialization', 'success'>\n mimeType: MIMEType\n data: Array<PortableTextBlock>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: SyntheticBehaviorEventType<'deserialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: SyntheticBehaviorEventType<'serialization', 'success'>\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: SyntheticBehaviorEventType<'serialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\n/**************************************\n * Native events\n **************************************/\n\ntype NativeBehaviorEventNamespace =\n | 'clipboard'\n | 'drag'\n | 'input'\n | 'keyboard'\n | 'mouse'\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | ClipboardBehaviorEvent\n | DragBehaviorEvent\n | InputBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\n\ntype ClipboardBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'clipboard', 'copy'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'clipboard', 'cut'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'clipboard', 'paste'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'drag', 'dragstart'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'drag', 'drag'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragend'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragenter'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragover'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'drop'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragleave'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\n/**\n * Used to represent native InputEvents that hold a DataTransfer object.\n *\n * These can either be one of:\n *\n * - insertFromPaste\n * - insertFromPasteAsQuotation\n * - insertFromDrop\n * - insertReplacementText\n * - insertFromYank\n */\nexport type InputBehaviorEvent = {\n type: NativeBehaviorEventType<'input', '*'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n}\n\nexport function isInputBehaviorEvent(\n event: BehaviorEvent,\n): event is InputBehaviorEvent {\n return event.type.startsWith('input.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'keyboard', 'keydown'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: NativeBehaviorEventType<'keyboard', 'keyup'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type InternalBehaviorEvent =\n | {\n type: InternalBehaviorEventType<'deserialize'>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: InternalBehaviorEventType<'serialize'>\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: NativeBehaviorEventType<'mouse', 'click'>\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**************************************\n * Custom events\n **************************************/\n\ntype CustomBehaviorEventNamespace = 'custom'\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends CustomBehaviorEventType<\n 'custom',\n TType\n > = CustomBehaviorEventType<'custom', TType>,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event:\n | InternalBehaviorEvent\n | SyntheticBehaviorEvent\n | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**************************************\n * Internal events\n **************************************/\n\ntype InternalBehaviorEventNamespace = 'deserialize' | 'serialize'\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: InternalBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\ntype ResolveBehaviorEvent<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n> = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends `${infer TNamespace}.*`\n ? TNamespace extends BehaviorEventTypeNamespace\n ? PickFromUnion<\n BehaviorEvent,\n 'type',\n NamespacedBehaviorEventType<TNamespace>\n >\n : never\n : TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends BehaviorEvent['type']\n ? PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n : never\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n ResolveBehaviorEvent<TBehaviorEventType> = ResolveBehaviorEvent<TBehaviorEventType>,\n> = {\n /**\n * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<\n TBehaviorEventType,\n TPayload\n > = ResolveBehaviorEvent<TBehaviorEventType, TPayload>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\n if (!isArrowDown) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return focusBlockObject && !nextBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (!isArrowUp) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return focusBlockObject && !previousBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n select: 'none',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isInputBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","block","_type","schema","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","getFocusBlockObject","clickingAboveLonelyBlockObject","position","isEditor","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","at","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","_key","props","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}
1
+ {"version":3,"file":"behavior.core.cjs","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.dnd.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {BlockWithOptionalKey} from '../types/block-with-optional-key'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | InternalBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n\ntype BehaviorEventTypeNamespace =\n | SyntheticBehaviorEventNamespace\n | InternalBehaviorEventNamespace\n | NativeBehaviorEventNamespace\n | CustomBehaviorEventNamespace\n\ntype SyntheticBehaviorEventType<\n TNamespace extends SyntheticBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype InternalBehaviorEventType<\n TNamespace extends InternalBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype NativeBehaviorEventType<\n TNamespace extends NativeBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype CustomBehaviorEventType<\n TNamespace extends CustomBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\nexport type NamespacedBehaviorEventType<\n TNamespace extends BehaviorEventTypeNamespace | '',\n> = TNamespace extends ''\n ? BehaviorEvent['type']\n : Extract<BehaviorEvent['type'], TNamespace | `${TNamespace}.${string}`>\n\n/**\n * @beta\n */\nexport type ExternalSyntheticBehaviorEvent = {\n type: SyntheticBehaviorEventType<'insert', 'block object'>\n placement: InsertPlacement\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n}\n\n/**************************************\n * Synthetic events\n **************************************/\n\ntype SyntheticBehaviorEventNamespace =\n | 'annotation'\n | 'block'\n | 'blur'\n | 'data transfer'\n | 'decorator'\n | 'delete'\n | 'deserialization'\n | 'focus'\n | 'history'\n | 'insert'\n | 'list item'\n | 'move'\n | 'select'\n | 'serialization'\n | 'style'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: SyntheticBehaviorEventType<'annotation', 'add'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'annotation', 'remove'>\n annotation: {\n name: string\n }\n }\n | {\n type: SyntheticBehaviorEventType<'annotation', 'toggle'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'block', 'set'>\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: SyntheticBehaviorEventType<'block', 'unset'>\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: SyntheticBehaviorEventType<'blur'>\n }\n | {\n type: SyntheticBehaviorEventType<'data transfer', 'set'>\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'add'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'remove'>\n decorator: string\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'toggle'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: SyntheticBehaviorEventType<'delete'>\n selection: NonNullable<EditorSelection>\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'backward'>\n unit: TextUnit\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'block'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'forward'>\n unit: TextUnit\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'text'>\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: SyntheticBehaviorEventType<'focus'>\n }\n | {\n type: SyntheticBehaviorEventType<'history', 'redo'>\n }\n | {\n type: SyntheticBehaviorEventType<'history', 'undo'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'blocks'>\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'inline object'>\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'break'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'soft break'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'block'>\n block: BlockWithOptionalKey\n placement: InsertPlacement\n select?: 'start' | 'end' | 'none'\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'span'>\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'text'>\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'add'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'remove'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'toggle'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block'>\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block down'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block up'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'select'>\n selection: EditorSelection\n }\n | {\n type: SyntheticBehaviorEventType<'select', 'previous block'>\n select?: 'start' | 'end'\n }\n | {\n type: SyntheticBehaviorEventType<'select', 'next block'>\n select?: 'start' | 'end'\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'add'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'remove'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'toggle'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'deserialization', 'success'>\n mimeType: MIMEType\n data: Array<PortableTextBlock>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: SyntheticBehaviorEventType<'deserialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: SyntheticBehaviorEventType<'serialization', 'success'>\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: SyntheticBehaviorEventType<'serialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\n/**************************************\n * Native events\n **************************************/\n\ntype NativeBehaviorEventNamespace =\n | 'clipboard'\n | 'drag'\n | 'input'\n | 'keyboard'\n | 'mouse'\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | ClipboardBehaviorEvent\n | DragBehaviorEvent\n | InputBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\n\ntype ClipboardBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'clipboard', 'copy'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'clipboard', 'cut'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'clipboard', 'paste'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'drag', 'dragstart'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'drag', 'drag'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragend'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragenter'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragover'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'drop'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragleave'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\n/**\n * Used to represent native InputEvents that hold a DataTransfer object.\n *\n * These can either be one of:\n *\n * - insertFromPaste\n * - insertFromPasteAsQuotation\n * - insertFromDrop\n * - insertReplacementText\n * - insertFromYank\n */\nexport type InputBehaviorEvent = {\n type: NativeBehaviorEventType<'input', '*'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n}\n\nexport function isInputBehaviorEvent(\n event: BehaviorEvent,\n): event is InputBehaviorEvent {\n return event.type.startsWith('input.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'keyboard', 'keydown'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: NativeBehaviorEventType<'keyboard', 'keyup'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type InternalBehaviorEvent =\n | {\n type: InternalBehaviorEventType<'deserialize'>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: InternalBehaviorEventType<'serialize'>\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: NativeBehaviorEventType<'mouse', 'click'>\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**************************************\n * Custom events\n **************************************/\n\ntype CustomBehaviorEventNamespace = 'custom'\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends CustomBehaviorEventType<\n 'custom',\n TType\n > = CustomBehaviorEventType<'custom', TType>,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event:\n | InternalBehaviorEvent\n | SyntheticBehaviorEvent\n | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**************************************\n * Internal events\n **************************************/\n\ntype InternalBehaviorEventNamespace = 'deserialize' | 'serialize'\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: InternalBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\ntype ResolveBehaviorEvent<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n> = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends `${infer TNamespace}.*`\n ? TNamespace extends BehaviorEventTypeNamespace\n ? PickFromUnion<\n BehaviorEvent,\n 'type',\n NamespacedBehaviorEventType<TNamespace>\n >\n : never\n : TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends BehaviorEvent['type']\n ? PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n : never\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n ResolveBehaviorEvent<TBehaviorEventType> = ResolveBehaviorEvent<TBehaviorEventType>,\n> = {\n /**\n * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<\n TBehaviorEventType,\n TPayload\n > = ResolveBehaviorEvent<TBehaviorEventType, TPayload>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\n if (!isArrowDown) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return focusBlockObject && !nextBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (!isArrowUp) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return focusBlockObject && !previousBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\nexport const coreDndBehaviors = [\n /**\n * When dragging over the drag origin, we don't want to show the caret in the\n * text.\n */\n defineBehavior({\n on: 'drag.dragover',\n guard: ({snapshot, event}) => {\n const dragOrigin = snapshot.beta.internalDrag?.origin\n const draggingOverDragOrigin = dragOrigin\n ? selectors.isOverlappingSelection(event.position.selection)({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: dragOrigin.selection,\n },\n })\n : false\n\n return draggingOverDragOrigin\n },\n actions: [() => [{type: 'noop'}]],\n }),\n]\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n select: 'none',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreDndBehaviors} from './behavior.core.dnd'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n ...coreDndBehaviors,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isInputBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","block","_type","schema","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","getFocusBlockObject","clickingAboveLonelyBlockObject","position","isEditor","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","at","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","coreDndBehaviors","dragOrigin","beta","internalDrag","origin","isOverlappingSelection","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","_key","props","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- var types = require("@sanity/types"), util_sliceBlocks = require("./util.slice-blocks.cjs"), selector_isAtTheStartOfBlock = require("./selector.is-at-the-start-of-block.cjs"), selector_getTextBefore = require("./selector.get-text-before.cjs"), behavior_core = require("./behavior.core.cjs");
2
+ var types = require("@sanity/types"), util_sliceBlocks = require("./util.slice-blocks.cjs"), selector_isOverlappingSelection = require("./selector.is-overlapping-selection.cjs"), selector_getTextBefore = require("./selector.get-text-before.cjs"), behavior_core = require("./behavior.core.cjs");
3
3
  function createMarkdownBehaviors(config) {
4
4
  const automaticBlockquoteOnSpace = behavior_core.defineBehavior({
5
5
  on: "insert.text",
@@ -9,10 +9,10 @@ function createMarkdownBehaviors(config) {
9
9
  }) => {
10
10
  if (event.text !== " ")
11
11
  return !1;
12
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot);
12
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot);
13
13
  if (!selectionCollapsed || !focusTextBlock || !focusSpan)
14
14
  return !1;
15
- const previousInlineObject = selector_isAtTheStartOfBlock.getPreviousInlineObject(snapshot), blockOffset = util_sliceBlocks.spanSelectionPointToBlockOffset({
15
+ const previousInlineObject = selector_isOverlappingSelection.getPreviousInlineObject(snapshot), blockOffset = util_sliceBlocks.spanSelectionPointToBlockOffset({
16
16
  value: snapshot.context.value,
17
17
  selectionPoint: {
18
18
  path: [{
@@ -67,10 +67,10 @@ function createMarkdownBehaviors(config) {
67
67
  const hrCharacter = event.text === "-" ? "-" : event.text === "*" ? "*" : event.text === "_" ? "_" : void 0;
68
68
  if (hrCharacter === void 0)
69
69
  return !1;
70
- const hrObject = config.horizontalRuleObject?.(snapshot.context), focusBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot);
70
+ const hrObject = config.horizontalRuleObject?.(snapshot.context), focusBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot);
71
71
  if (!hrObject || !focusBlock || !selectionCollapsed)
72
72
  return !1;
73
- const previousInlineObject = selector_isAtTheStartOfBlock.getPreviousInlineObject(snapshot), textBefore = selector_getTextBefore.getBlockTextBefore(snapshot), hrBlockOffsets = {
73
+ const previousInlineObject = selector_isOverlappingSelection.getPreviousInlineObject(snapshot), textBefore = selector_getTextBefore.getBlockTextBefore(snapshot), hrBlockOffsets = {
74
74
  anchor: {
75
75
  path: focusBlock.path,
76
76
  offset: 0
@@ -112,7 +112,7 @@ function createMarkdownBehaviors(config) {
112
112
  snapshot,
113
113
  event
114
114
  }) => {
115
- const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.(snapshot.context), focusBlock = selector_isAtTheStartOfBlock.getFocusBlock(snapshot);
115
+ const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.(snapshot.context), focusBlock = selector_isOverlappingSelection.getFocusBlock(snapshot);
116
116
  return !hrCharacters || !hrObject || !focusBlock ? !1 : {
117
117
  hrCharacters,
118
118
  hrObject,
@@ -162,7 +162,7 @@ function createMarkdownBehaviors(config) {
162
162
  }) => {
163
163
  if (event.text !== " ")
164
164
  return !1;
165
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot);
165
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot);
166
166
  if (!selectionCollapsed || !focusTextBlock || !focusSpan)
167
167
  return !1;
168
168
  const blockOffset = util_sliceBlocks.spanSelectionPointToBlockOffset({
@@ -178,7 +178,7 @@ function createMarkdownBehaviors(config) {
178
178
  });
179
179
  if (!blockOffset)
180
180
  return !1;
181
- const previousInlineObject = selector_isAtTheStartOfBlock.getPreviousInlineObject(snapshot), blockText = util_sliceBlocks.getTextBlockText(focusTextBlock.node), markdownHeadingSearch = /^#+/.exec(blockText), level = markdownHeadingSearch ? markdownHeadingSearch[0].length : void 0, caretAtTheEndOfHeading = blockOffset.offset === level;
181
+ const previousInlineObject = selector_isOverlappingSelection.getPreviousInlineObject(snapshot), blockText = util_sliceBlocks.getTextBlockText(focusTextBlock.node), markdownHeadingSearch = /^#+/.exec(blockText), level = markdownHeadingSearch ? markdownHeadingSearch[0].length : void 0, caretAtTheEndOfHeading = blockOffset.offset === level;
182
182
  if (previousInlineObject || !caretAtTheEndOfHeading)
183
183
  return !1;
184
184
  const style = level !== void 0 ? config.headingStyle?.({
@@ -223,7 +223,7 @@ function createMarkdownBehaviors(config) {
223
223
  guard: ({
224
224
  snapshot
225
225
  }) => {
226
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot);
226
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot);
227
227
  if (!selectionCollapsed || !focusTextBlock || !focusSpan)
228
228
  return !1;
229
229
  const atTheBeginningOfBLock = focusTextBlock.node.children[0]._key === focusSpan.node._key && snapshot.context.selection?.focus.offset === 0, defaultStyle = config.defaultStyle?.(snapshot.context);
@@ -250,10 +250,10 @@ function createMarkdownBehaviors(config) {
250
250
  }) => {
251
251
  if (event.text !== " ")
252
252
  return !1;
253
- const selectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed(snapshot), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock(snapshot), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan(snapshot);
253
+ const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), focusTextBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot);
254
254
  if (!selectionCollapsed || !focusTextBlock || !focusSpan)
255
255
  return !1;
256
- const previousInlineObject = selector_isAtTheStartOfBlock.getPreviousInlineObject(snapshot), blockOffset = util_sliceBlocks.spanSelectionPointToBlockOffset({
256
+ const previousInlineObject = selector_isOverlappingSelection.getPreviousInlineObject(snapshot), blockOffset = util_sliceBlocks.spanSelectionPointToBlockOffset({
257
257
  value: snapshot.context.value,
258
258
  selectionPoint: {
259
259
  path: [{