apostrophe 3.47.0 → 3.49.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 (61) hide show
  1. package/CHANGELOG.md +73 -2
  2. package/index.js +20 -2
  3. package/lib/locales.js +1 -1
  4. package/lib/moog-require.js +7 -0
  5. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +12 -2
  6. package/modules/@apostrophecms/any-page-type/index.js +5 -0
  7. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +2 -0
  8. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +7 -24
  9. package/modules/@apostrophecms/asset/index.js +27 -2
  10. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +23 -2
  11. package/modules/@apostrophecms/asset/lib/webpack/src/webpack.config.js +26 -2
  12. package/modules/@apostrophecms/doc/index.js +149 -0
  13. package/modules/@apostrophecms/doc-type/index.js +40 -1
  14. package/modules/@apostrophecms/global/index.js +4 -15
  15. package/modules/@apostrophecms/i18n/i18n/en.json +3 -2
  16. package/modules/@apostrophecms/i18n/index.js +76 -61
  17. package/modules/@apostrophecms/image/index.js +8 -0
  18. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +14 -1
  19. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -60
  20. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +3 -231
  21. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +3 -96
  22. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -99
  23. package/modules/@apostrophecms/login/ui/apos/logic/AposForgotPasswordForm.js +68 -0
  24. package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +239 -0
  25. package/modules/@apostrophecms/login/ui/apos/logic/AposResetPasswordForm.js +105 -0
  26. package/modules/@apostrophecms/login/ui/apos/logic/TheAposLogin.js +107 -0
  27. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +9 -3
  28. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +1 -0
  29. package/modules/@apostrophecms/page/index.js +63 -1
  30. package/modules/@apostrophecms/page-type/index.js +6 -0
  31. package/modules/@apostrophecms/piece-type/index.js +93 -9
  32. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +4 -0
  33. package/modules/@apostrophecms/rich-text-widget/index.js +1 -1
  34. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +14 -10
  35. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +252 -86
  36. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +0 -1
  37. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +0 -1
  38. package/modules/@apostrophecms/rich-text-widget/ui/apos/tiptap-extensions/Image.js +76 -54
  39. package/modules/@apostrophecms/schema/index.js +1 -2
  40. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +35 -7
  41. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +0 -1
  42. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +0 -1
  43. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +0 -1
  44. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +21 -1
  45. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +12 -7
  46. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +7 -1
  47. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +178 -20
  48. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +1 -1
  49. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +4 -6
  50. package/modules/@apostrophecms/ui/ui/apos/scss/mixins/_theme_mixins.scss +1 -0
  51. package/modules/@apostrophecms/util/index.js +5 -6
  52. package/modules/@apostrophecms/util/ui/src/http.js +6 -3
  53. package/modules/@apostrophecms/widget-type/index.js +4 -0
  54. package/package.json +20 -3
  55. package/test/change-doc-ids.js +134 -0
  56. package/test/i18n.js +310 -0
  57. package/test/pieces-children/pieces-malformed-child.js +32 -0
  58. package/test/pieces-malformed.js +33 -0
  59. package/test/widgets-children/widgets-malformed-child.js +32 -0
  60. package/test/widgets-malformed.js +34 -0
  61. package/test/static-i18n.js +0 -105
@@ -1,8 +1,8 @@
1
1
  <template>
2
- <div>
2
+ <div :aria-controls="`insert-menu-${value._id}`" @keydown="handleUIKeydown">
3
3
  <bubble-menu
4
4
  class="bubble-menu"
5
- :tippy-options="{ duration: 100, zIndex: 2000 }"
5
+ :tippy-options="{ maxWidth: 'none', duration: 100, zIndex: 2000 }"
6
6
  :editor="editor"
7
7
  v-if="editor"
8
8
  >
@@ -26,43 +26,64 @@
26
26
  </AposContextMenuDialog>
27
27
  </bubble-menu>
28
28
  <floating-menu
29
- class="apos-rich-text-insert-menu" :should-show="showFloatingMenu"
30
- :editor="editor" :tippy-options="{ duration: 100, zIndex: 2000 }"
31
29
  v-if="editor"
30
+ class="apos-rich-text-insert-menu"
31
+ :tippy-options="{ duration: 100, zIndex: 2000, placement: 'bottom-start' }"
32
+ :should-show="showFloatingMenu"
33
+ :editor="editor"
34
+ role="listbox"
35
+ tabindex="0"
36
+ ref="insertMenu"
37
+ :id="`insert-menu-${value._id}`"
38
+ :key="insertMenuKey"
32
39
  >
33
40
  <div class="apos-rich-text-insert-menu-heading">
34
41
  {{ $t('apostrophe:richTextInsertMenuHeading') }}
35
42
  </div>
36
43
  <div
37
- v-for="(item, index) in insert"
38
- :key="`${item}-${index}`"
39
- class="apos-rich-text-insert-menu-item"
44
+ class="apos-rich-text-insert-menu-wrapper"
45
+ @keydown.prevent.arrow-up="focusInsertMenuItem(true)"
46
+ @keydown.prevent.arrow-down="focusInsertMenuItem()"
47
+ @keydown="closeInsertMenu"
40
48
  >
41
- <div class="apos-rich-text-insert-menu-icon">
42
- <AposIndicator
43
- :icon="insertMenu[item].icon"
44
- :icon-size="35"
45
- class="apos-button__icon"
46
- fill-color="currentColor"
47
- @click="activateInsertMenuItem(item, insertMenu[item])"
48
- />
49
- <component
50
- v-if="item === activeInsertMenuComponent?.name"
51
- :is="activeInsertMenuComponent.component"
52
- :active="true"
53
- :editor="editor"
54
- :options="editorOptions"
55
- @before-commands="removeSlash"
56
- @close="closeInsertMenuItem"
57
- @click.stop="$event => null"
58
- />
59
- </div>
60
- <div
61
- class="apos-rich-text-insert-menu-label"
49
+ <button
50
+ v-for="(item, index) in insert"
51
+ :key="`${item}-${index}`"
52
+ class="apos-rich-text-insert-menu-item"
53
+ role="option"
54
+ data-insert-menu-item
62
55
  @click="activateInsertMenuItem(item, insertMenu[item])"
63
56
  >
64
- <h4>{{ $t(insertMenu[item].label) }}</h4>
65
- <p>{{ $t(insertMenu[item].description) }}</p>
57
+ <div class="apos-rich-text-insert-menu-icon">
58
+ <AposIndicator
59
+ :icon="insertMenu[item].icon"
60
+ :icon-size="24"
61
+ class="apos-button__icon"
62
+ fill-color="currentColor"
63
+ />
64
+ </div>
65
+ <div class="apos-rich-text-insert-menu-label">
66
+ <h4>{{ $t(insertMenu[item].label) }}</h4>
67
+ <p>{{ $t(insertMenu[item].description) }}</p>
68
+ </div>
69
+ </button>
70
+ <div class="apos-rich-text-insert-menu-components">
71
+ <div
72
+ v-for="(item, index) in insert"
73
+ :key="`${item}-${index}-component`"
74
+ >
75
+ <component
76
+ v-if="item === activeInsertMenuComponent?.name"
77
+ :is="activeInsertMenuComponent.component"
78
+ :active="true"
79
+ :editor="editor"
80
+ :options="editorOptions"
81
+ @before-commands="removeSlash"
82
+ @cancel="cancelInsertMenuItem"
83
+ @done="closeInsertMenuItem"
84
+ @close="closeInsertMenuItem"
85
+ />
86
+ </div>
66
87
  </div>
67
88
  </div>
68
89
  </floating-menu>
@@ -85,7 +106,23 @@ import {
85
106
  BubbleMenu,
86
107
  FloatingMenu
87
108
  } from '@tiptap/vue-2';
88
- import StarterKit from '@tiptap/starter-kit';
109
+ // Starter Kit extensions
110
+ import BlockQuote from '@tiptap/extension-blockquote';
111
+ import Bold from '@tiptap/extension-bold';
112
+ import BulletList from '@tiptap/extension-bullet-list';
113
+ import Code from '@tiptap/extension-code';
114
+ import CodeBlock from '@tiptap/extension-code-block';
115
+ import Dropcursor from '@tiptap/extension-dropcursor';
116
+ import Gapcursor from '@tiptap/extension-gapcursor';
117
+ import HardBreak from '@tiptap/extension-hard-break';
118
+ import History from '@tiptap/extension-history';
119
+ import HorizontalRule from '@tiptap/extension-horizontal-rule';
120
+ import Italic from '@tiptap/extension-italic';
121
+ import OrderedList from '@tiptap/extension-ordered-list';
122
+ import Paragraph from '@tiptap/extension-paragraph';
123
+ import Strike from '@tiptap/extension-strike';
124
+ import Text from '@tiptap/extension-text';
125
+ // End starter kit extensions
89
126
  import TextAlign from '@tiptap/extension-text-align';
90
127
  import Highlight from '@tiptap/extension-highlight';
91
128
  import Underline from '@tiptap/extension-underline';
@@ -143,8 +180,11 @@ export default {
143
180
  },
144
181
  pending: null,
145
182
  isFocused: null,
183
+ isShowingInsert: false,
146
184
  showPlaceholder: null,
147
- activeInsertMenuComponent: null
185
+ activeInsertMenuComponent: null,
186
+ suppressInsertMenu: false,
187
+ insertMenuKey: null
148
188
  };
149
189
  },
150
190
  computed: {
@@ -178,10 +218,10 @@ export default {
178
218
  },
179
219
  autofocus() {
180
220
  // Only true for a new rich text widget
181
- return !this.stripPlaceholderBrs(this.value.content).length;
221
+ return !this.value.content.length;
182
222
  },
183
223
  initialContent() {
184
- const content = this.transformNamedAnchors(this.stripPlaceholderBrs(this.value.content));
224
+ const content = this.transformNamedAnchors(this.value.content);
185
225
  if (content.length) {
186
226
  return content;
187
227
  }
@@ -245,17 +285,33 @@ export default {
245
285
  this.emitWidgetUpdate();
246
286
  }
247
287
  }
288
+ },
289
+ isShowingInsert(newVal) {
290
+ if (newVal) {
291
+ this.focusInsertMenuItem(false, 0);
292
+ }
248
293
  }
249
294
  },
250
295
  mounted() {
296
+ this.insertMenuKey = this.generateKey();
251
297
  // Cleanly namespace it so we don't conflict with other uses and instances
252
298
  const CustomPlaceholder = Placeholder.extend();
253
299
  const extensions = [
254
- StarterKit.configure({
255
- document: false,
256
- heading: false,
257
- listItem: false
258
- }),
300
+ BlockQuote,
301
+ Bold,
302
+ BulletList,
303
+ Code,
304
+ CodeBlock,
305
+ Dropcursor,
306
+ Gapcursor,
307
+ HardBreak,
308
+ History,
309
+ HorizontalRule,
310
+ Italic,
311
+ OrderedList,
312
+ Paragraph,
313
+ Strike,
314
+ Text,
259
315
  TextAlign.configure({
260
316
  types: [ 'heading', 'paragraph', 'defaultNode' ]
261
317
  }),
@@ -272,7 +328,7 @@ export default {
272
328
  const text = this.$t(this.placeholderText);
273
329
  return text;
274
330
  },
275
- emptyNodeClass: this.insert.length ? 'apos-is-empty' : 'apos-is-empty-without-insert'
331
+ emptyNodeClass: 'apos-is-empty'
276
332
  }),
277
333
  FloatingMenu
278
334
  ]
@@ -315,6 +371,22 @@ export default {
315
371
  apos.bus.$off('apos-refreshing', this.onAposRefreshing);
316
372
  },
317
373
  methods: {
374
+ generateKey() {
375
+ return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
376
+ },
377
+ handleUIKeydown(e) {
378
+ if (e.key === 'Escape') {
379
+ this.doSuppressInsertMenu();
380
+ } else {
381
+ this.suppressInsertMenu = false;
382
+ }
383
+ },
384
+ doSuppressInsertMenu() {
385
+ this.suppressInsertMenu = true;
386
+ this.activeInsertMenuComponent = null;
387
+ this.insertMenuKey = this.generateKey();
388
+ this.editor.commands.focus();
389
+ },
318
390
  onAposRefreshing(refreshOptions) {
319
391
  if (this.activeInsertMenuComponent) {
320
392
  refreshOptions.refresh = false;
@@ -334,6 +406,7 @@ export default {
334
406
  // least once per second if the user is actively typing
335
407
  return;
336
408
  }
409
+
337
410
  this.pending = setTimeout(() => {
338
411
  this.emitWidgetUpdate();
339
412
  }, 1000);
@@ -343,26 +416,12 @@ export default {
343
416
  clearTimeout(this.pending);
344
417
  this.pending = null;
345
418
  }
346
- let content = this.editor.getHTML();
347
- content = this.restorePlaceholderBrs(content);
419
+ const content = this.editor.getHTML();
348
420
  const widget = this.docFields.data;
349
421
  widget.content = content;
350
422
  // ... removes need for deep watching in parent
351
423
  this.$emit('update', { ...widget });
352
424
  },
353
- // Restore placeholder BRs for empty paragraphs. ProseMirror adds these
354
- // temporarily so the editing experience doesn't break due to contenteditable
355
- // issues with empty paragraphs, but strips them on save; however
356
- // seeing them while editing creates a WYSIWYG expectation
357
- // on the user's part, so we must maintain them
358
- restorePlaceholderBrs(html) {
359
- return html.replace(/<(p[^>]*)>(\s*)<\/p>/gi, '<$1><br /></p>');
360
- },
361
- // Strip the placeholder BRs again when populating the editor.
362
- // Otherwise they get doubled by ProseMirror
363
- stripPlaceholderBrs(html) {
364
- return html.replace(/<(p[^>]*)>\s*<br \/>\s*<\/p>/gi, '<$1></p>');
365
- },
366
425
  // Legacy content may have `id` and `name` attributes on anchor tags
367
426
  // but our tiptap anchor extension needs them on a separate `span`, so nest
368
427
  // a span to migrate this content for each relevant anchor tag encountered
@@ -485,24 +544,34 @@ export default {
485
544
  types: this.tiptapTypes
486
545
  }));
487
546
  },
488
- showFloatingMenu({ state }) {
489
- if (!this.insertMenu || !this.insert.length) {
547
+ showFloatingMenu({
548
+ state, oldState
549
+ }) {
550
+ const hasChanges = JSON.stringify(state?.doc.toJSON()) !== JSON.stringify(oldState?.doc.toJSON());
551
+ const { $to } = state.selection;
552
+
553
+ if (
554
+ !this.insertMenu ||
555
+ !this.insert.length ||
556
+ !hasChanges ||
557
+ ($to.nodeAfter && $to.nodeAfter.text) ||
558
+ this.suppressInsertMenu
559
+ ) {
560
+ this.isShowingInsert = false;
490
561
  return false;
491
562
  }
492
- const { $from, $to } = state.selection;
563
+
493
564
  if (state.selection.empty) {
494
565
  if ($to.nodeBefore && $to.nodeBefore.text) {
495
566
  const text = $to.nodeBefore.text;
496
- // Only show when the user has just entered a '/' character or
497
- // an insert menu component is active
498
- if (text === '/') {
567
+ if (text.slice(-1) === '/') {
568
+ this.isShowingInsert = true;
499
569
  return true;
500
570
  }
501
571
  }
502
- return false;
503
- } else if (state.doc.textBetween($from, $to, ' ') === '/') {
504
- return true;
505
572
  }
573
+
574
+ this.isShowingInsert = false;
506
575
  return false;
507
576
  },
508
577
  activateInsertMenuItem(name, info) {
@@ -536,6 +605,38 @@ export default {
536
605
  closeInsertMenuItem() {
537
606
  this.removeSlash();
538
607
  this.activeInsertMenuComponent = null;
608
+ },
609
+ cancelInsertMenuItem() {
610
+ this.doSuppressInsertMenu();
611
+ },
612
+ closeInsertMenu(e) {
613
+ if (
614
+ [ 'ArrowUp', 'ArrowDown', 'Enter', ' ' ].includes(e.key) ||
615
+ this.activeInsertMenuComponent
616
+ ) {
617
+ return;
618
+ }
619
+ this.editor.commands.focus();
620
+ this.activeInsertMenuComponent = null;
621
+ // Only insert character keys
622
+ if (e.key.length === 1) {
623
+ this.editor.commands.insertContent(e.key);
624
+ }
625
+ },
626
+ focusInsertMenuItem(prev = false, index) {
627
+ if (this.activeInsertMenuComponent) {
628
+ return;
629
+ }
630
+ const buttons = Array.from(this.$refs.insertMenu.$el.querySelectorAll('[data-insert-menu-item]'));
631
+ const currentIndex = buttons.findIndex(el => el === document.activeElement);
632
+ let targetIndex = prev ? currentIndex - 1 : currentIndex + 1;
633
+ if (targetIndex >= buttons.length) {
634
+ targetIndex = 0;
635
+ }
636
+ if (targetIndex < 0) {
637
+ targetIndex = buttons.length - 1;
638
+ }
639
+ buttons[index || targetIndex]?.focus();
539
640
  }
540
641
  }
541
642
  };
@@ -569,8 +670,10 @@ function traverseNextNode(node) {
569
670
 
570
671
  .apos-rich-text-toolbar__inner {
571
672
  display: flex;
673
+ flex-wrap: wrap;
572
674
  align-items: stretch;
573
- height: 35px;
675
+ max-width: 100%;
676
+ height: auto;
574
677
  background-color: var(--a-background-primary);
575
678
  color: var(--a-text-primary);
576
679
  border-radius: var(--a-border-radius);
@@ -580,27 +683,41 @@ function traverseNextNode(node) {
580
683
  background-color: var(--a-base-9);
581
684
  }
582
685
 
686
+ .apos-rich-text-editor__editor ::v-deep .ProseMirror {
687
+ @include apos-transition();
688
+ }
689
+
583
690
  .apos-rich-text-editor__editor ::v-deep .ProseMirror:focus {
584
691
  outline: none;
585
692
  }
586
693
 
587
- .apos-rich-text-editor__editor ::v-deep .ProseMirror:focus p.apos-is-empty::before,
588
- .apos-rich-text-editor__editor.apos-is-visually-empty ::v-deep .ProseMirror:focus p:first-of-type::before {
694
+ .apos-rich-text-editor__editor ::v-deep .ProseMirror {
695
+ padding: 10px 0;
696
+ }
697
+
698
+ .apos-rich-text-editor__editor ::v-deep .ProseMirror:focus p.apos-is-empty::after {
699
+ display: block;
700
+ margin: 5px 0 10px;
701
+ color: var(--a-primary-transparent-50);
702
+ font-size: var(--a-type-smaller);
703
+ text-transform: uppercase;
704
+ letter-spacing: 0.5px;
705
+ font-weight: 600;
706
+ border-top: 1px solid var(--a-primary-transparent-50);
707
+ padding-top: 5px;
589
708
  content: attr(data-placeholder);
590
- float: left;
591
709
  pointer-events: none;
592
- height: 0;
593
- color: var(--a-base-4);
594
710
  }
595
711
 
596
712
  .apos-rich-text-editor__editor {
597
713
  @include apos-transition();
598
714
  position: relative;
599
715
  border-radius: var(--a-border-radius);
600
- box-shadow: 0 0 0 1px transparent;
716
+ background-color: transparent;
601
717
  }
602
718
  .apos-rich-text-editor__editor.apos-is-visually-empty {
603
- box-shadow: 0 0 0 1px var(--a-primary-transparent-50);
719
+ background-color: var(--a-primary-transparent-10);
720
+ min-height: 50px;
604
721
  }
605
722
  .apos-rich-text-editor__editor_after {
606
723
  @include type-small;
@@ -613,9 +730,7 @@ function traverseNextNode(node) {
613
730
  width: 200px;
614
731
  height: 10px;
615
732
  margin: auto;
616
- margin-top: 7.5px;
617
- margin-bottom: 7.5px;
618
- color: var(--a-base-5);
733
+ color: var(--a-primary-transparent-50);
619
734
  opacity: 0;
620
735
  visibility: hidden;
621
736
  pointer-events: none;
@@ -666,12 +781,9 @@ function traverseNextNode(node) {
666
781
  }
667
782
 
668
783
  .apos-rich-text-insert-menu {
669
- display: flex;
670
- flex-direction: column;
671
784
  cursor: pointer;
672
785
  user-select: none;
673
- gap: 16px;
674
- padding: 16px;
786
+ min-width: 350px;
675
787
  border-radius: var(--a-border-radius);
676
788
  box-shadow: var(--a-box-shadow);
677
789
  background-color: var(--a-background-primary);
@@ -681,33 +793,87 @@ function traverseNextNode(node) {
681
793
  font-size: var(--a-type-base);
682
794
  }
683
795
 
796
+ .apos-rich-text-insert-menu-wrapper {
797
+ display: flex;
798
+ flex-direction: column;
799
+ }
800
+
684
801
  .apos-rich-text-insert-menu-item {
802
+ all: unset;
685
803
  display: flex;
686
804
  flex-direction: row;
687
- gap: 16px;
805
+ align-items: center;
806
+ gap: 12px;
807
+ padding: 14px 16px;
808
+ border-bottom: 1px solid var(--a-base-9);
809
+ @include apos-transition();
810
+ &:last-of-type {
811
+ border-bottom: none;
812
+ }
688
813
  &:hover {
689
- color: var(--a-text-primary);
814
+ background-color: var(--a-primary-transparent-10);
815
+ }
816
+ &:active, &:focus {
817
+ background-color: var(--a-primary);
818
+ color: var(--a-white);
690
819
  }
691
820
  }
692
821
 
693
822
  .apos-rich-text-insert-menu-label {
694
823
  display: flex;
695
824
  flex-direction: column;
825
+ gap: 5px;
696
826
  h4, p {
697
- margin: 4px;
827
+ margin: 0;
698
828
  font-family: var(--a-family-default);
699
- font-size: var(--a-type-base);
700
829
  }
701
830
  h4 {
702
- font-weight: bold;
831
+ font-weight: 500;
832
+ font-size: var(--a-type-large);
833
+ }
834
+ p {
835
+ font-size: var(--a-type-label);
703
836
  }
704
837
  }
705
838
  .apos-rich-text-insert-menu-icon {
706
- // Positions the popover meaningfully
707
839
  position: relative;
840
+ display: flex;
841
+ width: 40px;
842
+ height: 40px;
843
+ align-items: center;
844
+ justify-content: center;
845
+ border: 1px solid var(--a-base-8);
846
+ color: var(--a-text-primary);
847
+ background-color: var(--a-white);
848
+ border-radius: var(--a-border-radius);
708
849
  }
709
850
 
710
851
  .apos-rich-text-insert-menu-heading {
711
- color: var(--a-base-5);
852
+ padding: 12px 16px;
853
+ background-color: var(--a-base-9);
854
+ color: var(--a-base-2);
855
+ font-weight: 500;
856
+ border-bottom: 1px solid var(--a-base-7);
857
+ font-size: var(--a-type-label);
858
+ letter-spacing: 0.25px;
859
+ }
860
+
861
+ ::v-deep .ProseMirror {
862
+ > * + * {
863
+ margin-top: 0.75em;
864
+ }
865
+ }
866
+
867
+ ::v-deep .ProseMirror-gapcursor {
868
+ position: relative;
869
+ display: block;
870
+ height: 20px;
871
+
872
+ &:after {
873
+ width: 1px;
874
+ height: 20px;
875
+ border-left: 1px solid #000;
876
+ border-top: 0 none;
877
+ }
712
878
  }
713
879
  </style>
@@ -33,7 +33,6 @@
33
33
  :schema="schema"
34
34
  :trigger-validation="triggerValidation"
35
35
  v-model="docFields"
36
- :utility-rail="false"
37
36
  :modifiers="formModifiers"
38
37
  :key="lastSelectionTime"
39
38
  :generation="generation"
@@ -33,7 +33,6 @@
33
33
  :schema="schema"
34
34
  :trigger-validation="triggerValidation"
35
35
  v-model="docFields"
36
- :utility-rail="false"
37
36
  :modifiers="formModifiers"
38
37
  :key="lastSelectionTime"
39
38
  :generation="generation"