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.
- package/CHANGELOG.md +73 -2
- package/index.js +20 -2
- package/lib/locales.js +1 -1
- package/lib/moog-require.js +7 -0
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +12 -2
- package/modules/@apostrophecms/any-page-type/index.js +5 -0
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +2 -0
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +7 -24
- package/modules/@apostrophecms/asset/index.js +27 -2
- package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +23 -2
- package/modules/@apostrophecms/asset/lib/webpack/src/webpack.config.js +26 -2
- package/modules/@apostrophecms/doc/index.js +149 -0
- package/modules/@apostrophecms/doc-type/index.js +40 -1
- package/modules/@apostrophecms/global/index.js +4 -15
- package/modules/@apostrophecms/i18n/i18n/en.json +3 -2
- package/modules/@apostrophecms/i18n/index.js +76 -61
- package/modules/@apostrophecms/image/index.js +8 -0
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +14 -1
- package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -60
- package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +3 -231
- package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +3 -96
- package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -99
- package/modules/@apostrophecms/login/ui/apos/logic/AposForgotPasswordForm.js +68 -0
- package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +239 -0
- package/modules/@apostrophecms/login/ui/apos/logic/AposResetPasswordForm.js +105 -0
- package/modules/@apostrophecms/login/ui/apos/logic/TheAposLogin.js +107 -0
- package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +9 -3
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +1 -0
- package/modules/@apostrophecms/page/index.js +63 -1
- package/modules/@apostrophecms/page-type/index.js +6 -0
- package/modules/@apostrophecms/piece-type/index.js +93 -9
- package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +4 -0
- package/modules/@apostrophecms/rich-text-widget/index.js +1 -1
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +14 -10
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +252 -86
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +0 -1
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +0 -1
- package/modules/@apostrophecms/rich-text-widget/ui/apos/tiptap-extensions/Image.js +76 -54
- package/modules/@apostrophecms/schema/index.js +1 -2
- package/modules/@apostrophecms/schema/lib/addFieldTypes.js +35 -7
- package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +0 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +0 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +0 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +21 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +12 -7
- package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +7 -1
- package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +178 -20
- package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +1 -1
- package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +4 -6
- package/modules/@apostrophecms/ui/ui/apos/scss/mixins/_theme_mixins.scss +1 -0
- package/modules/@apostrophecms/util/index.js +5 -6
- package/modules/@apostrophecms/util/ui/src/http.js +6 -3
- package/modules/@apostrophecms/widget-type/index.js +4 -0
- package/package.json +20 -3
- package/test/change-doc-ids.js +134 -0
- package/test/i18n.js +310 -0
- package/test/pieces-children/pieces-malformed-child.js +32 -0
- package/test/pieces-malformed.js +33 -0
- package/test/widgets-children/widgets-malformed-child.js +32 -0
- package/test/widgets-malformed.js +34 -0
- package/test/static-i18n.js +0 -105
package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue
CHANGED
|
@@ -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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
<
|
|
65
|
-
|
|
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
|
-
|
|
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.
|
|
221
|
+
return !this.value.content.length;
|
|
182
222
|
},
|
|
183
223
|
initialContent() {
|
|
184
|
-
const content = this.transformNamedAnchors(this.
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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:
|
|
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
|
-
|
|
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({
|
|
489
|
-
|
|
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
|
-
|
|
563
|
+
|
|
493
564
|
if (state.selection.empty) {
|
|
494
565
|
if ($to.nodeBefore && $to.nodeBefore.text) {
|
|
495
566
|
const text = $to.nodeBefore.text;
|
|
496
|
-
|
|
497
|
-
|
|
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
|
-
|
|
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
|
|
588
|
-
|
|
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
|
-
|
|
716
|
+
background-color: transparent;
|
|
601
717
|
}
|
|
602
718
|
.apos-rich-text-editor__editor.apos-is-visually-empty {
|
|
603
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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>
|