@portabletext/editor 1.23.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +249 -62
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/{selector.is-selection-collapsed.cjs → selector.is-active-style.cjs} +158 -3
  4. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -0
  5. package/lib/_chunks-cjs/util.slice-blocks.cjs +23 -9
  6. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  7. package/lib/_chunks-es/behavior.core.js +225 -38
  8. package/lib/_chunks-es/behavior.core.js.map +1 -1
  9. package/lib/_chunks-es/{selector.is-selection-collapsed.js → selector.is-active-style.js} +159 -4
  10. package/lib/_chunks-es/selector.is-active-style.js.map +1 -0
  11. package/lib/_chunks-es/util.slice-blocks.js +23 -9
  12. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  13. package/lib/behaviors/index.cjs +27 -27
  14. package/lib/behaviors/index.cjs.map +1 -1
  15. package/lib/behaviors/index.d.cts +2830 -139
  16. package/lib/behaviors/index.d.ts +2830 -139
  17. package/lib/behaviors/index.js +1 -1
  18. package/lib/index.cjs +695 -526
  19. package/lib/index.cjs.map +1 -1
  20. package/lib/index.d.cts +8950 -246
  21. package/lib/index.d.ts +8950 -246
  22. package/lib/index.js +696 -525
  23. package/lib/index.js.map +1 -1
  24. package/lib/selectors/index.cjs +24 -171
  25. package/lib/selectors/index.cjs.map +1 -1
  26. package/lib/selectors/index.d.cts +73 -0
  27. package/lib/selectors/index.d.ts +73 -0
  28. package/lib/selectors/index.js +3 -151
  29. package/lib/selectors/index.js.map +1 -1
  30. package/package.json +11 -10
  31. package/src/behavior-actions/behavior.action.data-transfer-set.ts +7 -0
  32. package/src/behavior-actions/behavior.action.insert-blocks.ts +61 -0
  33. package/src/behavior-actions/behavior.actions.ts +159 -83
  34. package/src/behaviors/behavior.core.annotations.ts +29 -0
  35. package/src/behaviors/behavior.core.block-objects.ts +13 -13
  36. package/src/behaviors/behavior.core.decorators.ts +19 -0
  37. package/src/behaviors/behavior.core.deserialize.ts +46 -0
  38. package/src/behaviors/behavior.core.lists.ts +57 -23
  39. package/src/behaviors/behavior.core.serialize.ts +44 -0
  40. package/src/behaviors/behavior.core.style.ts +19 -0
  41. package/src/behaviors/behavior.core.ts +19 -0
  42. package/src/behaviors/behavior.types.ts +126 -89
  43. package/src/converters/converter.json.ts +53 -0
  44. package/src/converters/converter.portable-text.deserialize.test.ts +686 -0
  45. package/src/converters/converter.portable-text.ts +59 -0
  46. package/src/converters/converter.text-html.deserialize.test.ts +349 -0
  47. package/src/converters/converter.text-html.serialize.test.ts +233 -0
  48. package/src/converters/converter.text-html.ts +61 -0
  49. package/src/converters/converter.text-plain.test.ts +241 -0
  50. package/src/converters/converter.text-plain.ts +91 -0
  51. package/src/converters/converter.ts +65 -0
  52. package/src/converters/converters.ts +11 -0
  53. package/src/editor/Editable.tsx +3 -13
  54. package/src/editor/create-editor.ts +48 -6
  55. package/src/editor/editor-machine.ts +56 -2
  56. package/src/editor/editor-selector.ts +1 -0
  57. package/src/editor/editor-snapshot.ts +5 -0
  58. package/src/editor/plugins/create-with-event-listeners.ts +82 -106
  59. package/src/internal-utils/asserters.ts +9 -0
  60. package/src/internal-utils/mime-type.ts +1 -0
  61. package/src/internal-utils/parse-blocks.ts +136 -0
  62. package/src/internal-utils/test-key-generator.ts +9 -0
  63. package/src/selectors/selector.get-selected-spans.test.ts +1 -0
  64. package/src/selectors/selector.get-selection-text.test.ts +1 -0
  65. package/src/selectors/selector.is-active-decorator.test.ts +1 -0
  66. package/src/utils/util.slice-blocks.test.ts +87 -0
  67. package/src/utils/util.slice-blocks.ts +27 -10
  68. package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs.map +0 -1
  69. package/lib/_chunks-es/selector.is-selection-collapsed.js.map +0 -1
  70. package/src/editor/plugins/__tests__/createWithInsertData.test.tsx +0 -181
  71. package/src/editor/plugins/createWithInsertData.ts +0 -425
@@ -1,7 +1,50 @@
1
+ import { isActiveAnnotation, getFocusBlockObject, getNextBlock, getPreviousBlock, isSelectionCollapsed, getFocusTextBlock, isActiveDecorator, isActiveListItem, getFocusSpan, getFocusListBlock, getSelectedBlocks, createGuards, isActiveStyle } from "./selector.is-active-style.js";
1
2
  import { isPortableTextTextBlock } from "@sanity/types";
2
- import { getFocusBlockObject, getNextBlock, getPreviousBlock, isSelectionCollapsed, getFocusTextBlock, getFocusSpan, getFocusListBlock, getSelectedBlocks, createGuards } from "./selector.is-selection-collapsed.js";
3
3
  import { isEmptyTextBlock } from "./util.is-empty-text-block.js";
4
- const IS_MAC = typeof window < "u" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent), modifiers = {
4
+ function isCustomBehaviorEvent(event) {
5
+ return event.type.startsWith("custom.");
6
+ }
7
+ function raise(event) {
8
+ return {
9
+ type: "raise",
10
+ event
11
+ };
12
+ }
13
+ function defineBehavior(behavior) {
14
+ return behavior;
15
+ }
16
+ const toggleAnnotationOff = {
17
+ on: "annotation.toggle",
18
+ guard: ({
19
+ context,
20
+ event
21
+ }) => isActiveAnnotation(event.annotation.name)({
22
+ context
23
+ }),
24
+ actions: [({
25
+ event
26
+ }) => [raise({
27
+ type: "annotation.remove",
28
+ annotation: event.annotation
29
+ })]]
30
+ }, toggleAnnotationOn = {
31
+ on: "annotation.toggle",
32
+ guard: ({
33
+ context,
34
+ event
35
+ }) => !isActiveAnnotation(event.annotation.name)({
36
+ context
37
+ }),
38
+ actions: [({
39
+ event
40
+ }) => [raise({
41
+ type: "annotation.add",
42
+ annotation: event.annotation
43
+ })]]
44
+ }, coreAnnotationBehaviors = {
45
+ toggleAnnotationOff,
46
+ toggleAnnotationOn
47
+ }, IS_MAC = typeof window < "u" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent), modifiers = {
5
48
  alt: "altKey",
6
49
  control: "ctrlKey",
7
50
  meta: "metaKey",
@@ -113,18 +156,6 @@ function toKeyName(name) {
113
156
  const keyName = name.toLowerCase();
114
157
  return aliases[keyName] ?? keyName;
115
158
  }
116
- function isCustomBehaviorEvent(event) {
117
- return event.type.startsWith("custom.");
118
- }
119
- function raise(event) {
120
- return {
121
- type: "raise",
122
- event
123
- };
124
- }
125
- function defineBehavior(behavior) {
126
- return behavior;
127
- }
128
159
  const arrowDownOnLonelyBlockObject = {
129
160
  on: "key.down",
130
161
  guard: ({
@@ -138,10 +169,10 @@ const arrowDownOnLonelyBlockObject = {
138
169
  });
139
170
  return isArrowDown && focusBlockObject && !nextBlock;
140
171
  },
141
- actions: [() => [{
172
+ actions: [() => [raise({
142
173
  type: "insert.text block",
143
174
  placement: "after"
144
- }]]
175
+ })]]
145
176
  }, arrowUpOnLonelyBlockObject = {
146
177
  on: "key.down",
147
178
  guard: ({
@@ -155,12 +186,12 @@ const arrowDownOnLonelyBlockObject = {
155
186
  });
156
187
  return isArrowUp && focusBlockObject && !previousBlock;
157
188
  },
158
- actions: [() => [{
189
+ actions: [() => [raise({
159
190
  type: "insert.text block",
160
191
  placement: "before"
161
- }, {
192
+ }), raise({
162
193
  type: "select.previous block"
163
- }]]
194
+ })]]
164
195
  }, breakingBlockObject = {
165
196
  on: "insert.break",
166
197
  guard: ({
@@ -173,10 +204,10 @@ const arrowDownOnLonelyBlockObject = {
173
204
  context
174
205
  }) && focusBlockObject !== void 0;
175
206
  },
176
- actions: [() => [{
207
+ actions: [() => [raise({
177
208
  type: "insert.text block",
178
209
  placement: "after"
179
- }]]
210
+ })]]
180
211
  }, deletingEmptyTextBlockAfterBlockObject = {
181
212
  on: "delete.backward",
182
213
  guard: ({
@@ -197,10 +228,10 @@ const arrowDownOnLonelyBlockObject = {
197
228
  actions: [(_, {
198
229
  focusTextBlock,
199
230
  previousBlock
200
- }) => [{
231
+ }) => [raise({
201
232
  type: "delete.block",
202
233
  blockPath: focusTextBlock.path
203
- }, {
234
+ }), raise({
204
235
  type: "select",
205
236
  selection: {
206
237
  anchor: {
@@ -212,7 +243,7 @@ const arrowDownOnLonelyBlockObject = {
212
243
  offset: 0
213
244
  }
214
245
  }
215
- }]]
246
+ })]]
216
247
  }, deletingEmptyTextBlockBeforeBlockObject = {
217
248
  on: "delete.forward",
218
249
  guard: ({
@@ -233,10 +264,10 @@ const arrowDownOnLonelyBlockObject = {
233
264
  actions: [(_, {
234
265
  focusTextBlock,
235
266
  nextBlock
236
- }) => [{
267
+ }) => [raise({
237
268
  type: "delete.block",
238
269
  blockPath: focusTextBlock.path
239
- }, {
270
+ }), raise({
240
271
  type: "select",
241
272
  selection: {
242
273
  anchor: {
@@ -248,7 +279,7 @@ const arrowDownOnLonelyBlockObject = {
248
279
  offset: 0
249
280
  }
250
281
  }
251
- }]]
282
+ })]]
252
283
  }, coreBlockObjectBehaviors = {
253
284
  arrowDownOnLonelyBlockObject,
254
285
  arrowUpOnLonelyBlockObject,
@@ -256,6 +287,36 @@ const arrowDownOnLonelyBlockObject = {
256
287
  deletingEmptyTextBlockAfterBlockObject,
257
288
  deletingEmptyTextBlockBeforeBlockObject
258
289
  }, coreDecoratorBehaviors = {
290
+ toggleDecoratorOff: {
291
+ on: "decorator.toggle",
292
+ guard: ({
293
+ context,
294
+ event
295
+ }) => isActiveDecorator(event.decorator)({
296
+ context
297
+ }),
298
+ actions: [({
299
+ event
300
+ }) => [raise({
301
+ type: "decorator.remove",
302
+ decorator: event.decorator
303
+ })]]
304
+ },
305
+ toggleDecoratorOn: {
306
+ on: "decorator.toggle",
307
+ guard: ({
308
+ context,
309
+ event
310
+ }) => !isActiveDecorator(event.decorator)({
311
+ context
312
+ }),
313
+ actions: [({
314
+ event
315
+ }) => [raise({
316
+ type: "decorator.add",
317
+ decorator: event.decorator
318
+ })]]
319
+ },
259
320
  strongShortcut: {
260
321
  on: "key.down",
261
322
  guard: ({
@@ -300,7 +361,63 @@ const arrowDownOnLonelyBlockObject = {
300
361
  decorator: "code"
301
362
  })]]
302
363
  }
303
- }, MAX_LIST_LEVEL = 10, clearListOnBackspace = {
364
+ }, coreDeserializeBehavior = {
365
+ on: "deserialize",
366
+ guard: ({
367
+ context,
368
+ event
369
+ }) => {
370
+ const deserializeEvents = context.converters.flatMap((converter) => {
371
+ const data = event.dataTransfer.getData(converter.mimeType);
372
+ return data ? [converter.deserialize({
373
+ context,
374
+ event: {
375
+ type: "deserialize",
376
+ data
377
+ }
378
+ })] : [];
379
+ });
380
+ return deserializeEvents.find((deserializeEvent) => deserializeEvent.type === "deserialization.success") || {
381
+ type: "deserialization.failure",
382
+ mimeType: "*/*",
383
+ reason: deserializeEvents.map((deserializeEvent) => deserializeEvent.type === "deserialization.failure" ? deserializeEvent.reason : "").join(", ")
384
+ };
385
+ },
386
+ actions: [({
387
+ event
388
+ }, deserializeEvent) => [raise({
389
+ ...deserializeEvent,
390
+ dataTransfer: event.dataTransfer
391
+ })]]
392
+ }, MAX_LIST_LEVEL = 10, toggleListItemOff = {
393
+ on: "list item.toggle",
394
+ guard: ({
395
+ context,
396
+ event
397
+ }) => isActiveListItem(event.listItem)({
398
+ context
399
+ }),
400
+ actions: [({
401
+ event
402
+ }) => [raise({
403
+ type: "list item.remove",
404
+ listItem: event.listItem
405
+ })]]
406
+ }, toggleListItemOn = {
407
+ on: "list item.toggle",
408
+ guard: ({
409
+ context,
410
+ event
411
+ }) => !isActiveListItem(event.listItem)({
412
+ context
413
+ }),
414
+ actions: [({
415
+ event
416
+ }) => [raise({
417
+ type: "list item.add",
418
+ listItem: event.listItem
419
+ })]]
420
+ }, clearListOnBackspace = {
304
421
  on: "delete.backward",
305
422
  guard: ({
306
423
  context
@@ -318,11 +435,11 @@ const arrowDownOnLonelyBlockObject = {
318
435
  },
319
436
  actions: [(_, {
320
437
  focusTextBlock
321
- }) => [{
438
+ }) => [raise({
322
439
  type: "text block.unset",
323
440
  props: ["listItem", "level"],
324
441
  at: focusTextBlock.path
325
- }]]
442
+ })]]
326
443
  }, unindentListOnBackspace = {
327
444
  on: "delete.backward",
328
445
  guard: ({
@@ -343,11 +460,11 @@ const arrowDownOnLonelyBlockObject = {
343
460
  actions: [(_, {
344
461
  focusTextBlock,
345
462
  level
346
- }) => [{
463
+ }) => [raise({
347
464
  type: "text block.set",
348
465
  level,
349
466
  at: focusTextBlock.path
350
- }]]
467
+ })]]
351
468
  }, clearListOnEnter = {
352
469
  on: "insert.break",
353
470
  guard: ({
@@ -364,11 +481,11 @@ const arrowDownOnLonelyBlockObject = {
364
481
  },
365
482
  actions: [(_, {
366
483
  focusListBlock
367
- }) => [{
484
+ }) => [raise({
368
485
  type: "text block.unset",
369
486
  props: ["listItem", "level"],
370
487
  at: focusListBlock.path
371
- }]]
488
+ })]]
372
489
  }, indentListOnTab = {
373
490
  on: "key.down",
374
491
  guard: ({
@@ -389,7 +506,7 @@ const arrowDownOnLonelyBlockObject = {
389
506
  },
390
507
  actions: [(_, {
391
508
  selectedListBlocks
392
- }) => selectedListBlocks.map((selectedListBlock) => ({
509
+ }) => selectedListBlocks.map((selectedListBlock) => raise({
393
510
  type: "text block.set",
394
511
  level: Math.min(MAX_LIST_LEVEL, Math.max(1, selectedListBlock.node.level + 1)),
395
512
  at: selectedListBlock.path
@@ -414,17 +531,83 @@ const arrowDownOnLonelyBlockObject = {
414
531
  },
415
532
  actions: [(_, {
416
533
  selectedListBlocks
417
- }) => selectedListBlocks.map((selectedListBlock) => ({
534
+ }) => selectedListBlocks.map((selectedListBlock) => raise({
418
535
  type: "text block.set",
419
536
  level: Math.min(MAX_LIST_LEVEL, Math.max(1, selectedListBlock.node.level - 1)),
420
537
  at: selectedListBlock.path
421
538
  }))]
422
539
  }, coreListBehaviors = {
540
+ toggleListItemOff,
541
+ toggleListItemOn,
423
542
  clearListOnBackspace,
424
543
  unindentListOnBackspace,
425
544
  clearListOnEnter,
426
545
  indentListOnTab,
427
546
  unindentListOnShiftTab
547
+ }, coreSerializeBehaviors = {
548
+ serialize: {
549
+ on: "serialize",
550
+ guard: ({
551
+ context,
552
+ event
553
+ }) => {
554
+ if (context.converters.length === 0)
555
+ return !1;
556
+ const serializeEvents = context.converters.map((converter) => converter.serialize({
557
+ context,
558
+ event
559
+ }));
560
+ return serializeEvents.length === 0 ? !1 : serializeEvents;
561
+ },
562
+ actions: [({
563
+ event
564
+ }, serializeEvents) => serializeEvents.map((serializeEvent) => raise({
565
+ ...serializeEvent,
566
+ dataTransfer: event.dataTransfer
567
+ }))]
568
+ },
569
+ "serialization.success": {
570
+ on: "serialization.success",
571
+ actions: [({
572
+ event
573
+ }) => [raise({
574
+ type: "data transfer.set",
575
+ data: event.data,
576
+ dataTransfer: event.dataTransfer,
577
+ mimeType: event.mimeType
578
+ })]]
579
+ }
580
+ }, toggleStyleOff = {
581
+ on: "style.toggle",
582
+ guard: ({
583
+ context,
584
+ event
585
+ }) => isActiveStyle(event.style)({
586
+ context
587
+ }),
588
+ actions: [({
589
+ event
590
+ }) => [raise({
591
+ type: "style.remove",
592
+ style: event.style
593
+ })]]
594
+ }, toggleStyleOn = {
595
+ on: "style.toggle",
596
+ guard: ({
597
+ context,
598
+ event
599
+ }) => !isActiveStyle(event.style)({
600
+ context
601
+ }),
602
+ actions: [({
603
+ event
604
+ }) => [raise({
605
+ type: "style.add",
606
+ style: event.style
607
+ })]]
608
+ }, coreStyleBehaviors = {
609
+ toggleStyleOff,
610
+ toggleStyleOn
428
611
  }, softReturn = {
429
612
  on: "insert.soft break",
430
613
  actions: [() => [{
@@ -432,11 +615,15 @@ const arrowDownOnLonelyBlockObject = {
432
615
  text: `
433
616
  `
434
617
  }]]
435
- }, coreBehaviors = [softReturn, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab], coreBehavior = {
618
+ }, coreBehaviors = [softReturn, coreAnnotationBehaviors.toggleAnnotationOff, coreAnnotationBehaviors.toggleAnnotationOn, coreDecoratorBehaviors.toggleDecoratorOff, coreDecoratorBehaviors.toggleDecoratorOn, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreDeserializeBehavior, coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.toggleListItemOff, coreListBehaviors.toggleListItemOn, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreSerializeBehaviors.serialize, coreSerializeBehaviors["serialization.success"], coreStyleBehaviors.toggleStyleOff, coreStyleBehaviors.toggleStyleOn], coreBehavior = {
436
619
  softReturn,
620
+ annotation: coreAnnotationBehaviors,
437
621
  decorators: coreDecoratorBehaviors,
622
+ deserialize: coreDeserializeBehavior,
438
623
  blockObjects: coreBlockObjectBehaviors,
439
- lists: coreListBehaviors
624
+ lists: coreListBehaviors,
625
+ ...coreSerializeBehaviors,
626
+ style: coreSerializeBehaviors
440
627
  };
441
628
  export {
442
629
  coreBehavior,
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.js","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.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, PortableTextTextBlock} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'blur'\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'focus'\n }\n | {\n type: 'insert.block object'\n placement: 'auto' | 'after' | 'before'\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.inline object'\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.break'\n }\n | {\n type: 'insert.soft break'\n }\n | {\n type: 'insert.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'style.toggle'\n style: string\n }\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: DataTransfer\n }\n | {\n type: 'key.down'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'key.up'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'paste'\n data: DataTransfer\n }\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 `custom.${TType}` = `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 BehaviorActionIntend =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'decorator.add'\n decorator: string\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: '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: 'insert.text block'\n placement: 'auto' | 'after' | 'before'\n textBlock?: {\n children?: PortableTextTextBlock['children']\n }\n }\n | {\n type: 'list item.add'\n listItem: string\n }\n | {\n type: 'list item.remove'\n listItem: string\n }\n | {\n type: 'move.block'\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: 'move.block down'\n at: [KeyedSegment]\n }\n | {\n type: 'move.block up'\n at: [KeyedSegment]\n }\n | {\n type: 'noop'\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'effect'\n effect: () => void\n }\n | {\n type: 'select.previous block'\n }\n | {\n type: 'select.next block'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'text block.set'\n at: [KeyedSegment]\n level?: number\n listItem?: string\n style?: string\n }\n | {\n type: 'text block.unset'\n at: [KeyedSegment]\n props: Array<'level' | 'listItem' | 'style'>\n }\n\n/**\n * @beta\n */\nexport type BehaviorAction = OmitFromUnion<\n BehaviorActionIntend,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorActionIntend, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = BehaviorEvent,\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<BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = ({\n context,\n event,\n}: {\n context: EditorContext\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse> = (\n {\n context,\n event,\n }: {\n context: EditorContext\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorActionIntend>\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 BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n\n/**\n * @beta\n */\nexport type BlockOffset = {\n path: [KeyedSegment]\n offset: number\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} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const nextBlock = selectors.getNextBlock({context})\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [{type: 'insert.text block', placement: 'after'}]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const previousBlock = selectors.getPreviousBlock({context})\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [\n () => [\n {type: 'insert.text block', placement: 'before'},\n {type: 'select.previous block'},\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const collapsedSelection = selectors.isSelectionCollapsed({context})\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [{type: 'insert.text block', placement: 'after'}]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const previousBlock = selectors.getPreviousBlock({context})\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 {\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n },\n {\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: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const nextBlock = selectors.getNextBlock({context})\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 {\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n },\n {\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 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: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'em'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n 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: 'key.down',\n guard: ({context, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'code'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\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} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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 {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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 {\n type: 'text block.set',\n level,\n at: focusTextBlock.path,\n },\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusListBlock = selectors.getFocusListBlock({context})\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 {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n },\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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 type: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n at: selectedListBlock.path,\n })),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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 type: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n at: selectedListBlock.path,\n })),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreListBehaviors} from './behavior.core.lists'\nimport {defineBehavior} from './behavior.types'\n\nconst softReturn = defineBehavior({\n on: 'insert.soft break',\n actions: [() => [{type: 'insert.text', text: '\\n'}]],\n})\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n softReturn,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\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]\n\n/**\n * @beta\n */\nexport const coreBehavior = {\n softReturn,\n decorators: coreDecoratorBehaviors,\n blockObjects: coreBlockObjectBehaviors,\n lists: coreListBehaviors,\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","isCustomBehaviorEvent","type","startsWith","raise","defineBehavior","behavior","arrowDownOnLonelyBlockObject","on","guard","context","isArrowDown","keyboardEvent","focusBlockObject","selectors","nextBlock","actions","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","selection","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","MAX_LIST_LEVEL","clearListOnBackspace","focusSpan","children","_key","level","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","block","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","softReturn","text","coreBehaviors","coreBehavior","blockObjects","lists"],"mappings":"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"}
1
+ {"version":3,"file":"behavior.core.js","sources":["../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.deserialize.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.serialize.ts","../../src/behaviors/behavior.core.style.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n }\n | {\n type: 'insert.block object'\n placement: 'auto' | 'after' | 'before'\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.inline object'\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.break'\n }\n | {\n type: 'insert.soft break'\n }\n | {\n type: '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: 'insert.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'insert.text block'\n placement: 'auto' | 'after' | 'before'\n textBlock?: {\n children?: PortableTextTextBlock['children']\n }\n }\n | {\n type: 'list item.add'\n listItem: string\n }\n | {\n type: 'list item.remove'\n listItem: string\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'move.block'\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: 'move.block down'\n at: [KeyedSegment]\n }\n | {\n type: 'move.block up'\n at: [KeyedSegment]\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'select.previous block'\n }\n | {\n type: 'select.next block'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | {\n type: 'text block.set'\n at: [KeyedSegment]\n level?: number\n listItem?: string\n style?: string\n }\n | {\n type: 'text block.unset'\n at: [KeyedSegment]\n props: Array<'level' | 'listItem' | 'style'>\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n | 'deserialization.failure'\n | 'deserialization.success'\n | 'serialization.failure'\n | 'serialization.success'\n > & {dataTransfer: DataTransfer})\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: DataTransfer\n }\n | {\n type: 'deserialize'\n dataTransfer: DataTransfer\n }\n | {\n type: 'key.down'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'key.up'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'paste'\n data: DataTransfer\n }\n | {\n type: 'serialize'\n originEvent: 'copy' | 'cut' | 'unknown'\n dataTransfer: DataTransfer\n }\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 `custom.${TType}` = `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 BehaviorActionIntend =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**\n * @beta\n */\nexport type BehaviorAction = OmitFromUnion<\n BehaviorActionIntend,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorActionIntend, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = PickFromUnion<\n BehaviorEvent,\n 'type',\n TBehaviorEventType\n >,\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<BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = ({\n context,\n event,\n}: {\n context: EditorContext\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse> = (\n {\n context,\n event,\n }: {\n context: EditorContext\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorActionIntend>\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 BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n\n/**\n * @beta\n */\nexport type BlockOffset = {\n path: [KeyedSegment]\n offset: number\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst toggleAnnotationOff = defineBehavior({\n on: 'annotation.toggle',\n guard: ({context, event}) =>\n selectors.isActiveAnnotation(event.annotation.name)({context}),\n actions: [\n ({event}) => [\n raise({type: 'annotation.remove', annotation: event.annotation}),\n ],\n ],\n})\n\nconst toggleAnnotationOn = defineBehavior({\n on: 'annotation.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveAnnotation(event.annotation.name)({context}),\n actions: [\n ({event}) => [\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n toggleAnnotationOff,\n toggleAnnotationOn,\n}\n","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 {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: 'key.down',\n guard: ({context, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const nextBlock = selectors.getNextBlock({context})\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const previousBlock = selectors.getPreviousBlock({context})\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [\n () => [\n raise({type: 'insert.text block', placement: 'before'}),\n raise({type: 'select.previous block'}),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const collapsedSelection = selectors.isSelectionCollapsed({context})\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const previousBlock = selectors.getPreviousBlock({context})\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 blockPath: 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: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const nextBlock = selectors.getNextBlock({context})\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 blockPath: 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 deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n toggleDecoratorOff: defineBehavior({\n on: 'decorator.toggle',\n guard: ({context, event}) =>\n selectors.isActiveDecorator(event.decorator)({context}),\n actions: [\n ({event}) => [\n raise({type: 'decorator.remove', decorator: event.decorator}),\n ],\n ],\n }),\n toggleDecoratorOn: defineBehavior({\n on: 'decorator.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveDecorator(event.decorator)({context}),\n actions: [\n ({event}) => [raise({type: 'decorator.add', decorator: event.decorator})],\n ],\n }),\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'em'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n 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: 'key.down',\n guard: ({context, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'code'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import {defineBehavior, raise} from './behavior.types'\n\nexport const coreDeserializeBehavior = defineBehavior({\n on: 'deserialize',\n guard: ({context, event}) => {\n const deserializeEvents = context.converters.flatMap((converter) => {\n const data = event.dataTransfer.getData(converter.mimeType)\n\n if (!data) {\n return []\n }\n\n return [\n converter.deserialize({context, event: {type: 'deserialize', data}}),\n ]\n })\n\n const firstSuccess = deserializeEvents.find(\n (deserializeEvent) => deserializeEvent.type === 'deserialization.success',\n )\n\n if (!firstSuccess) {\n return {\n type: 'deserialization.failure',\n mimeType: '*/*',\n reason: deserializeEvents\n .map((deserializeEvent) =>\n deserializeEvent.type === 'deserialization.failure'\n ? deserializeEvent.reason\n : '',\n )\n .join(', '),\n } as const\n }\n\n return firstSuccess\n },\n actions: [\n ({event}, deserializeEvent) => [\n raise({\n ...deserializeEvent,\n dataTransfer: event.dataTransfer,\n }),\n ],\n ],\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 toggleListItemOff = defineBehavior({\n on: 'list item.toggle',\n guard: ({context, event}) =>\n selectors.isActiveListItem(event.listItem)({context}),\n actions: [\n ({event}) => [\n raise({\n type: 'list item.remove',\n listItem: event.listItem,\n }),\n ],\n ],\n})\n\nconst toggleListItemOn = defineBehavior({\n on: 'list item.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveListItem(event.listItem)({context}),\n actions: [\n ({event}) => [\n raise({\n type: 'list item.add',\n listItem: event.listItem,\n }),\n ],\n ],\n})\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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: 'text block.set',\n level,\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusListBlock = selectors.getFocusListBlock({context})\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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n toggleListItemOff,\n toggleListItemOn,\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {defineBehavior, raise} from './behavior.types'\n\nexport const coreSerializeBehaviors = {\n 'serialize': defineBehavior({\n on: 'serialize',\n guard: ({context, event}) => {\n if (context.converters.length === 0) {\n return false\n }\n\n const serializeEvents = context.converters.map((converter) =>\n converter.serialize({context, event}),\n )\n\n if (serializeEvents.length === 0) {\n return false\n }\n\n return serializeEvents\n },\n actions: [\n ({event}, serializeEvents) =>\n serializeEvents.map((serializeEvent) =>\n raise({\n ...serializeEvent,\n dataTransfer: event.dataTransfer,\n }),\n ),\n ],\n }),\n 'serialization.success': defineBehavior({\n on: 'serialization.success',\n actions: [\n ({event}) => [\n raise({\n type: 'data transfer.set',\n data: event.data,\n dataTransfer: event.dataTransfer,\n mimeType: event.mimeType,\n }),\n ],\n ],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst toggleStyleOff = defineBehavior({\n on: 'style.toggle',\n guard: ({context, event}) => selectors.isActiveStyle(event.style)({context}),\n actions: [({event}) => [raise({type: 'style.remove', style: event.style})]],\n})\n\nconst toggleStyleOn = defineBehavior({\n on: 'style.toggle',\n guard: ({context, event}) => !selectors.isActiveStyle(event.style)({context}),\n actions: [({event}) => [raise({type: 'style.add', style: event.style})]],\n})\n\nexport const coreStyleBehaviors = {\n toggleStyleOff,\n toggleStyleOn,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreDeserializeBehavior} from './behavior.core.deserialize'\nimport {coreListBehaviors} from './behavior.core.lists'\nimport {coreSerializeBehaviors} from './behavior.core.serialize'\nimport {coreStyleBehaviors} from './behavior.core.style'\nimport {defineBehavior} from './behavior.types'\n\nconst softReturn = defineBehavior({\n on: 'insert.soft break',\n actions: [() => [{type: 'insert.text', text: '\\n'}]],\n})\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n softReturn,\n coreAnnotationBehaviors.toggleAnnotationOff,\n coreAnnotationBehaviors.toggleAnnotationOn,\n coreDecoratorBehaviors.toggleDecoratorOff,\n coreDecoratorBehaviors.toggleDecoratorOn,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreDeserializeBehavior,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.toggleListItemOff,\n coreListBehaviors.toggleListItemOn,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreSerializeBehaviors.serialize,\n coreSerializeBehaviors['serialization.success'],\n coreStyleBehaviors.toggleStyleOff,\n coreStyleBehaviors.toggleStyleOn,\n]\n\n/**\n * @beta\n */\nexport const coreBehavior = {\n softReturn,\n annotation: coreAnnotationBehaviors,\n decorators: coreDecoratorBehaviors,\n deserialize: coreDeserializeBehavior,\n blockObjects: coreBlockObjectBehaviors,\n lists: coreListBehaviors,\n ...coreSerializeBehaviors,\n style: coreSerializeBehaviors,\n}\n"],"names":["isCustomBehaviorEvent","event","type","startsWith","raise","defineBehavior","behavior","toggleAnnotationOff","on","guard","context","selectors","annotation","name","actions","toggleAnnotationOn","coreAnnotationBehaviors","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","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","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","selection","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","toggleDecoratorOff","decorator","toggleDecoratorOn","strongShortcut","schema","decorators","some","value","emShortcut","underlineShortcut","codeShortcut","coreDeserializeBehavior","deserializeEvents","converters","flatMap","converter","data","dataTransfer","getData","mimeType","deserialize","find","deserializeEvent","reason","map","join","MAX_LIST_LEVEL","toggleListItemOff","listItem","toggleListItemOn","clearListOnBackspace","focusSpan","children","_key","level","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","block","isListBlock","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreSerializeBehaviors","serializeEvents","serialize","serializeEvent","toggleStyleOff","style","toggleStyleOn","coreStyleBehaviors","softReturn","text","coreBehaviors","coreBehavior","blockObjects","lists"],"mappings":"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"}