@onereach/ui-components 2.68.0-beta.2034.0 → 2.68.0-beta.2049.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 (97) hide show
  1. package/dist/bundled/v2/{OrCode-edc7a1f5.js → OrCode-b9332066.js} +2 -115
  2. package/dist/bundled/v2/{OrConfirm-56d01cff.js → OrConfirm-19758dae.js} +1 -1
  3. package/dist/bundled/v2/OrModal-71d33219.js +202 -0
  4. package/dist/bundled/v2/OrRichTextEditor-99131fc7.js +36843 -0
  5. package/dist/bundled/v2/components/index.d.ts +1 -0
  6. package/dist/bundled/v2/components/index.js +7 -3
  7. package/dist/bundled/v2/components/or-code/index.js +4 -2
  8. package/dist/bundled/v2/components/or-confirm/index.js +3 -2
  9. package/dist/bundled/v2/components/or-modal/index.js +2 -1
  10. package/dist/bundled/v2/components/or-rich-text-editor-v3/OrRichTextEditor.stories3.d.ts +12 -0
  11. package/dist/bundled/v2/components/or-rich-text-editor-v3/OrRichTextEditor.vue.d.ts +149 -0
  12. package/dist/bundled/v2/components/or-rich-text-editor-v3/index.d.ts +1 -0
  13. package/dist/bundled/v2/components/or-rich-text-editor-v3/index.js +25 -0
  14. package/dist/bundled/v2/components/or-rich-text-editor-v3/styles.d.ts +6 -0
  15. package/dist/bundled/v2/index.es-3f39f316.js +115 -0
  16. package/dist/bundled/v2/index.js +8 -4
  17. package/dist/bundled/{v3/OrModal.vue_vue_type_script_lang-a1ed2ebb.js → v2/useFocusTrap-d744652a.js} +4 -126
  18. package/dist/bundled/v3/{OrCode.vue_vue_type_script_lang-ef5e7f04.js → OrCode.vue_vue_type_script_lang-5fe573eb.js} +3 -116
  19. package/dist/bundled/v3/{OrConfirm.vue_vue_type_script_lang-0f16fc67.js → OrConfirm.vue_vue_type_script_lang-4451e782.js} +2 -2
  20. package/dist/bundled/v3/OrMenu-08aa60de.js +29 -0
  21. package/dist/bundled/v3/{OrModal-868160ef.js → OrModal-bbabef06.js} +1 -1
  22. package/dist/bundled/v3/OrModal.vue_vue_type_script_lang-a599dfe7.js +128 -0
  23. package/dist/bundled/v3/OrRichTextEditor.vue_vue_type_script_lang-18daa6a2.js +36723 -0
  24. package/dist/bundled/v3/{OrTabs.vue_vue_type_script_lang-ca57f9d9.js → OrTabs.vue_vue_type_script_lang-2fdbd2f2.js} +10 -36
  25. package/dist/bundled/v3/components/index.d.ts +1 -0
  26. package/dist/bundled/v3/components/index.js +10 -5
  27. package/dist/bundled/v3/components/or-code/index.js +5 -3
  28. package/dist/bundled/v3/components/or-confirm/index.js +4 -3
  29. package/dist/bundled/v3/components/or-modal/index.js +2 -1
  30. package/dist/bundled/v3/components/or-rich-text-editor-v3/OrRichTextEditor.stories3.d.ts +12 -0
  31. package/dist/bundled/v3/components/or-rich-text-editor-v3/OrRichTextEditor.vue.d.ts +149 -0
  32. package/dist/bundled/v3/components/or-rich-text-editor-v3/index.d.ts +1 -0
  33. package/dist/bundled/v3/components/or-rich-text-editor-v3/index.js +26 -0
  34. package/dist/bundled/v3/components/or-rich-text-editor-v3/styles.d.ts +6 -0
  35. package/dist/bundled/v3/components/or-tabs-v3/index.js +2 -1
  36. package/dist/bundled/v3/index.es-3f39f316.js +115 -0
  37. package/dist/bundled/v3/index.js +278 -182
  38. package/dist/bundled/{v2/OrModal-a5411b0d.js → v3/useFocusTrap-d21726e3.js} +3 -200
  39. package/dist/esm/v2/OrRichTextEditor-dd129ce6.js +533 -0
  40. package/dist/esm/v2/components/index.d.ts +1 -0
  41. package/dist/esm/v2/components/index.js +21 -0
  42. package/dist/esm/v2/components/or-rich-text-editor-v3/OrRichTextEditor.stories3.d.ts +12 -0
  43. package/dist/esm/v2/components/or-rich-text-editor-v3/OrRichTextEditor.vue.d.ts +149 -0
  44. package/dist/esm/v2/components/or-rich-text-editor-v3/index.d.ts +1 -0
  45. package/dist/esm/v2/components/or-rich-text-editor-v3/index.js +41 -0
  46. package/dist/esm/v2/components/or-rich-text-editor-v3/styles.d.ts +6 -0
  47. package/dist/esm/v2/index.js +21 -0
  48. package/dist/esm/v3/OrRichTextEditor-3f24fee0.js +503 -0
  49. package/dist/esm/v3/components/index.d.ts +1 -0
  50. package/dist/esm/v3/components/index.js +21 -0
  51. package/dist/esm/v3/components/or-rich-text-editor-v3/OrRichTextEditor.stories3.d.ts +12 -0
  52. package/dist/esm/v3/components/or-rich-text-editor-v3/OrRichTextEditor.vue.d.ts +149 -0
  53. package/dist/esm/v3/components/or-rich-text-editor-v3/index.d.ts +1 -0
  54. package/dist/esm/v3/components/or-rich-text-editor-v3/index.js +40 -0
  55. package/dist/esm/v3/components/or-rich-text-editor-v3/styles.d.ts +6 -0
  56. package/dist/esm/v3/index.js +21 -0
  57. package/package.json +21 -1
  58. package/src/components/index.ts +1 -0
  59. package/src/components/or-rich-text-editor-v3/OrRichTextEditor.docs.mdx +16 -0
  60. package/src/components/or-rich-text-editor-v3/OrRichTextEditor.stories3.ts +62 -0
  61. package/src/components/or-rich-text-editor-v3/OrRichTextEditor.vue +555 -0
  62. package/src/components/or-rich-text-editor-v3/index.ts +1 -0
  63. package/src/components/or-rich-text-editor-v3/styles.ts +65 -0
  64. package/dist/bundled/v2/components/or-empty-state-v3/OrEmptyState.stories3.d.ts +0 -24
  65. package/dist/bundled/v2/components/or-empty-state-v3/OrEmptyState.vue.d.ts +0 -101
  66. package/dist/bundled/v2/components/or-empty-state-v3/index.d.ts +0 -3
  67. package/dist/bundled/v2/components/or-empty-state-v3/index.js +0 -162
  68. package/dist/bundled/v2/components/or-empty-state-v3/props.d.ts +0 -4
  69. package/dist/bundled/v2/components/or-empty-state-v3/styles.d.ts +0 -10
  70. package/dist/bundled/v2/components/or-empty-state-v3/types.d.ts +0 -2
  71. package/dist/bundled/v3/components/or-empty-state-v3/OrEmptyState.stories3.d.ts +0 -24
  72. package/dist/bundled/v3/components/or-empty-state-v3/OrEmptyState.vue.d.ts +0 -101
  73. package/dist/bundled/v3/components/or-empty-state-v3/index.d.ts +0 -3
  74. package/dist/bundled/v3/components/or-empty-state-v3/index.js +0 -134
  75. package/dist/bundled/v3/components/or-empty-state-v3/props.d.ts +0 -4
  76. package/dist/bundled/v3/components/or-empty-state-v3/styles.d.ts +0 -10
  77. package/dist/bundled/v3/components/or-empty-state-v3/types.d.ts +0 -2
  78. package/dist/esm/v2/components/or-empty-state-v3/OrEmptyState.stories3.d.ts +0 -24
  79. package/dist/esm/v2/components/or-empty-state-v3/OrEmptyState.vue.d.ts +0 -101
  80. package/dist/esm/v2/components/or-empty-state-v3/index.d.ts +0 -3
  81. package/dist/esm/v2/components/or-empty-state-v3/index.js +0 -159
  82. package/dist/esm/v2/components/or-empty-state-v3/props.d.ts +0 -4
  83. package/dist/esm/v2/components/or-empty-state-v3/styles.d.ts +0 -10
  84. package/dist/esm/v2/components/or-empty-state-v3/types.d.ts +0 -2
  85. package/dist/esm/v3/components/or-empty-state-v3/OrEmptyState.stories3.d.ts +0 -24
  86. package/dist/esm/v3/components/or-empty-state-v3/OrEmptyState.vue.d.ts +0 -101
  87. package/dist/esm/v3/components/or-empty-state-v3/index.d.ts +0 -3
  88. package/dist/esm/v3/components/or-empty-state-v3/index.js +0 -135
  89. package/dist/esm/v3/components/or-empty-state-v3/props.d.ts +0 -4
  90. package/dist/esm/v3/components/or-empty-state-v3/styles.d.ts +0 -10
  91. package/dist/esm/v3/components/or-empty-state-v3/types.d.ts +0 -2
  92. package/src/components/or-empty-state-v3/OrEmptyState.stories3.ts +0 -87
  93. package/src/components/or-empty-state-v3/OrEmptyState.vue +0 -121
  94. package/src/components/or-empty-state-v3/index.ts +0 -3
  95. package/src/components/or-empty-state-v3/props.ts +0 -4
  96. package/src/components/or-empty-state-v3/styles.ts +0 -76
  97. package/src/components/or-empty-state-v3/types.ts +0 -3
@@ -0,0 +1,555 @@
1
+ <template>
2
+ <div
3
+ ref="root"
4
+ v-bind="$attrs"
5
+ :class="rootStyles"
6
+ >
7
+ <or-label>
8
+ {{ description }}
9
+ </or-label>
10
+ <div
11
+ ref="containerRef"
12
+ :class="containerStyles"
13
+ @click="handleEditorClick()"
14
+ >
15
+ <div :class="toolbarContainerStyles">
16
+ <div
17
+ v-for="tool in toolbar"
18
+ :key="tool"
19
+ :class="toolbarStyles"
20
+ >
21
+ <div
22
+ v-for="item in tool"
23
+ :key="item"
24
+ :class="toolbarButtonStyles(item)"
25
+ class="-my-xs"
26
+ >
27
+ <or-icon-button
28
+ v-if="item==='heading'"
29
+ ref="toolbarButtonRef"
30
+ :tooltip="{text: item, placement: 'top'}"
31
+ :icon="{icon: headingIcon, variant: 'inherit', size: 'm'}"
32
+ @click="menuRef.open()"
33
+ />
34
+ <or-icon-button
35
+ v-else
36
+ :tooltip="{text: iconTooltipsEnum[item], placement: 'top'}"
37
+ :icon="{icon: iconsEnum[item], variant: 'inherit', size: 'm'}"
38
+ @click="handleToolbarClick(item)"
39
+ />
40
+ </div>
41
+ </div>
42
+ </div>
43
+ <div
44
+ ref="editorRef"
45
+ :class="editorInputStyles"
46
+ />
47
+ </div>
48
+ <or-menu
49
+ v-if="toolbarButtonRef"
50
+ ref="menuRef"
51
+ :trigger="toolbarButtonRef[getIndexOfHeading].root"
52
+ placement="bottom-start"
53
+ >
54
+ <or-menu-item
55
+ v-for="heading in headingLevels"
56
+ :key="heading"
57
+ @click="handleToolbarClick('heading', heading)"
58
+ >
59
+ Heading {{ heading }}
60
+ </or-menu-item>
61
+ <or-menu-item
62
+ @click="handleToolbarClick('heading')"
63
+ >
64
+ None
65
+ </or-menu-item>
66
+ </or-menu>
67
+ </div>
68
+ </template>
69
+
70
+ <script lang="ts">
71
+ import { defineComponent, ref, onMounted, onBeforeUnmount, computed, watch } from 'vue-demi';
72
+ import { useClassAttribute } from '../../hooks';
73
+ import { useFocusTrap, UseFocusTrapReturn } from '@vueuse/integrations/useFocusTrap';
74
+
75
+ import {
76
+ MarkdownSerializer as ProseMirrorMarkdownSerializer,
77
+ defaultMarkdownSerializer,
78
+ } from 'prosemirror-markdown';
79
+ import { DOMParser as ProseMirrorDOMParser, Node, Mark } from 'prosemirror-model';
80
+ import { marked } from 'marked';
81
+
82
+ import { OrIconButtonV3 as OrIconButton } from '../or-icon-button-v3';
83
+ import { OrLabelV3 as OrLabel } from '../or-label-v3';
84
+ import { OrMenuV3 as OrMenu } from '../or-menu-v3';
85
+ import { OrMenuItemV3 as OrMenuItem } from '../or-menu-item-v3';
86
+
87
+ import {
88
+ EditorContainer,
89
+ ToolbarContainer,
90
+ Toolbar,
91
+ ToolbarButtonActive,
92
+ ToolbarButton,
93
+ EditorInput,
94
+ } from './styles';
95
+
96
+ import { Editor, mergeAttributes } from '@tiptap/core';
97
+ import StarterKit from '@tiptap/starter-kit';
98
+ import Underline from '@tiptap/extension-underline';
99
+ import Link from '@tiptap/extension-link';
100
+ import Highlight from '@tiptap/extension-highlight';
101
+ import Heading, { Level } from '@tiptap/extension-heading';
102
+ import Placeholder from '@tiptap/extension-placeholder';
103
+ import Paragraph from '@tiptap/extension-paragraph';
104
+ import BulletList from '@tiptap/extension-bullet-list';
105
+ import ListItem from '@tiptap/extension-list-item';
106
+ import OrderedList from '@tiptap/extension-ordered-list';
107
+ import Strike from '@tiptap/extension-strike';
108
+ import Italic from '@tiptap/extension-italic';
109
+ import HardBreak from '@tiptap/extension-hard-break';
110
+ import Bold from '@tiptap/extension-bold';
111
+ import CodeBlock from '@tiptap/extension-code-block';
112
+ import Blockquote from '@tiptap/extension-blockquote';
113
+ // import Code from '@tiptap/extension-code';
114
+
115
+ export default defineComponent({
116
+ name: 'OrRichTextEditor',
117
+
118
+ components: {
119
+ OrIconButton,
120
+ OrLabel,
121
+ OrMenuItem,
122
+ OrMenu,
123
+ },
124
+
125
+ inheritAttrs: false,
126
+
127
+ props: {
128
+ modelValue: {
129
+ type: String,
130
+ default: '',
131
+ required: false,
132
+ },
133
+ toolbar: {
134
+ type: Array,
135
+ default: () => [['heading'], ['bold', 'italic', 'strike'], ['underline', 'highlight'], ['link'], ['blockquote', 'codeBlock'], ['bulletList', 'orderedList'], ['undo', 'redo']],
136
+ },
137
+ description: {
138
+ type: String,
139
+ default: '',
140
+ },
141
+ placeholder: {
142
+ type: String,
143
+ default: 'Write something...',
144
+ },
145
+ autofocus: {
146
+ type: Boolean,
147
+ default: false,
148
+ },
149
+ markdownFormat: {
150
+ type: Boolean,
151
+ default: true,
152
+ },
153
+ },
154
+
155
+ emits: ['update:modelValue'],
156
+
157
+ setup(props, { emit }) {
158
+ // Refs
159
+ let editor = null as Editor | null;
160
+ const editorRef = ref<HTMLDivElement>();
161
+ const containerRef = ref<HTMLDivElement>();
162
+ const toolbarButtonRef = ref<InstanceType<typeof OrIconButton>>();
163
+ const menuRef = ref<InstanceType<typeof OrMenu>>();
164
+ const isActive = ref<{[key: string]: boolean;}>({});
165
+ const headingLevels = [1, 2, 3, 4] as Level[];
166
+ const previousHeadingLevel = ref<Level>();
167
+ const activeHeadingLevel = ref<number>(0);
168
+ const markdownOutput = ref<string>('');
169
+ let trap: UseFocusTrapReturn = useFocusTrap(editorRef, {
170
+ immediate: true,
171
+ fallbackFocus: '.container',
172
+ allowOutsideClick: true,
173
+ });
174
+ const iconsEnum = ref<{[key: string]: string;}>({
175
+ bold: 'format_bold',
176
+ italic: 'format_italic',
177
+ underline: 'format_underlined',
178
+ strike: 'format_strikethrough',
179
+ bulletList: 'format_list_bulleted',
180
+ orderedList: 'format_list_numbered',
181
+ link: 'link',
182
+ highlight: 'highlight',
183
+ redo: 'redo',
184
+ undo: 'undo',
185
+ codeBlock: 'code_blocks',
186
+ blockquote: 'format_quote',
187
+ });
188
+ const iconTooltipsEnum = ref<{[key: string]: string;}>({
189
+ bold: 'Bold',
190
+ italic: 'Italic',
191
+ underline: 'Underline',
192
+ strike: 'Strike',
193
+ bulletList: 'Bulleted List',
194
+ orderedList: 'Numbered List',
195
+ link: 'Link',
196
+ highlight: 'Highlight',
197
+ redo: 'Redo',
198
+ undo: 'Undo',
199
+ codeBlock: 'Code Block',
200
+ blockquote: 'Quote',
201
+ });
202
+
203
+ const serializerMarks = {
204
+ ...defaultMarkdownSerializer.marks,
205
+ [Bold.name]: defaultMarkdownSerializer.marks.strong,
206
+ [Strike.name]: {
207
+ open: '~~',
208
+ close: '~~',
209
+ mixable: true,
210
+ expelEnclosingWhitespace: true,
211
+ },
212
+ [Italic.name]: {
213
+ open: '_',
214
+ close: '_',
215
+ mixable: true,
216
+ expelEnclosingWhitespace: true,
217
+ },
218
+ [Highlight.name]: {
219
+ open: '==',
220
+ close: '==',
221
+ mixable: true,
222
+ expelEnclosingWhitespace: true,
223
+ },
224
+ [Link.name]: {
225
+ open(state: any, mark: Mark, parent: Node, index: number) {
226
+ return isPlainURL(mark, parent, index, 1) ? '<' : '[';
227
+ },
228
+ close(state: any, mark: Mark, parent: Node, index: number) {
229
+ const href = mark.attrs.canonicalSrc || mark.attrs.href;
230
+
231
+ return isPlainURL(mark, parent, index, -1)
232
+ ? '>'
233
+ : `](${state.esc(href)}${
234
+ mark.attrs.title ? ` ${state.quote(mark.attrs.title)}` : ''
235
+ })`;
236
+ },
237
+ },
238
+ };
239
+
240
+ const serializerNodes = {
241
+ ...defaultMarkdownSerializer.nodes,
242
+ [Paragraph.name]: defaultMarkdownSerializer.nodes.paragraph,
243
+ [BulletList.name]: defaultMarkdownSerializer.nodes.bullet_list,
244
+ [ListItem.name]: defaultMarkdownSerializer.nodes.list_item,
245
+ [OrderedList.name]: defaultMarkdownSerializer.nodes.ordered_list,
246
+ [HardBreak.name]: defaultMarkdownSerializer.nodes.hard_break,
247
+ [CodeBlock.name]: defaultMarkdownSerializer.nodes.code_block,
248
+ [Blockquote.name]: defaultMarkdownSerializer.nodes.blockquote,
249
+ };
250
+
251
+ onMounted(() => {
252
+ editor = new Editor({
253
+ onUpdate: ({ editor }) => {
254
+ setActiveFormats();
255
+ const html = editor.getHTML();
256
+ const text = editor.getText();
257
+ if (props.markdownFormat) {
258
+ markdownOutput.value = serialize(editor.schema, editor.getJSON());
259
+ emit('update:modelValue', markdownOutput.value);
260
+ } else {
261
+ emit('update:modelValue', text === '' ? text : html);
262
+ }
263
+ },
264
+ onCreate: ({ editor }) => {
265
+ if (props.markdownFormat) {
266
+ const deserialized = deserialize(editor.schema, props.modelValue);
267
+ editor.commands.setContent(deserialized);
268
+ } else {
269
+ editor.commands.setContent(props.modelValue);
270
+ }
271
+ },
272
+ element: editorRef.value,
273
+ autofocus: props.autofocus,
274
+ extensions: [
275
+ StarterKit.configure({
276
+ heading: false,
277
+ }),
278
+ Heading.configure({ levels: headingLevels }).extend({
279
+ levels: headingLevels,
280
+ renderHTML({ node, HTMLAttributes }) {
281
+ return [
282
+ 'h' + node.attrs.level,
283
+ mergeAttributes(HTMLAttributes, {
284
+ class: `typography-headline-${node.attrs.level}`,
285
+ }),
286
+ 0,
287
+ ];
288
+ },
289
+ }),
290
+ Underline,
291
+ Link.configure({
292
+ openOnClick: true,
293
+ linkOnPaste: true,
294
+ autolink: false,
295
+ protocols: ['ftp', 'mailto', 'http', 'https'],
296
+ validate: href => /^https?:\/\//.test(href),
297
+ HTMLAttributes: {
298
+ class: 'text-primary cursor-pointer',
299
+ },
300
+ }),
301
+ Highlight,
302
+ Placeholder
303
+ .configure({
304
+ placeholder: props.placeholder,
305
+ emptyEditorClass: 'is-editor-empty text-outline',
306
+ }),
307
+ ],
308
+ editorProps: {
309
+ attributes: {
310
+ class: 'focus:outline-none',
311
+ },
312
+ },
313
+ });
314
+ setActiveFormats();
315
+ });
316
+
317
+ onBeforeUnmount(() => {
318
+ editor?.destroy();
319
+ });
320
+
321
+ trap.activate();
322
+
323
+ // Computed
324
+ const getIndexOfHeading = computed(() => {
325
+ return props.toolbar.flat().indexOf('heading');
326
+ });
327
+
328
+ const headingIcon = computed(() => {
329
+ if (activeHeadingLevel.value && isActive.value.heading) {
330
+ return `format_h${activeHeadingLevel.value}`;
331
+ }
332
+ return 'format_paragraph';
333
+ });
334
+
335
+ // Methods
336
+ const handleEditorClick = () => {
337
+ setActiveFormats();
338
+ editor?.commands.focus();
339
+ };
340
+
341
+ const handleToolbarClick = (item: string, level?: number) => {
342
+ if (item === 'bulletList' || item === 'orderedList') {
343
+ item === 'bulletList' ? editor?.commands.toggleBulletList() : editor?.commands.toggleOrderedList();
344
+ }
345
+ else if (item === 'link') {
346
+ setLink();
347
+ }
348
+ else if (item === 'blockquote') {
349
+ editor?.chain().focus().toggleBlockquote().run();
350
+ }
351
+ else if (item === 'codeBlock') {
352
+ editor?.chain().focus().toggleCodeBlock().run();
353
+ }
354
+ else if (item === 'heading') {
355
+ if (!level) {
356
+ editor?.commands.toggleHeading({ level: previousHeadingLevel.value as Level });
357
+ activeHeadingLevel.value = 0;
358
+ } else {
359
+ activeHeadingLevel.value = level;
360
+ previousHeadingLevel.value = level as Level;
361
+ editor?.commands.toggleHeading({ level: level as Level });
362
+ }
363
+ editor?.commands.focus();
364
+ }
365
+ else if (item === 'undo' || item === 'redo') {
366
+ item === 'undo' ? editor?.commands.undo() : editor?.commands.redo();
367
+ }
368
+ else {
369
+ editor?.chain().focus().toggleMark(item).run();
370
+ }
371
+ };
372
+
373
+ const setLink = () => {
374
+ const previousUrl = editor?.getAttributes('link').href;
375
+ const url = window.prompt('URL', previousUrl);
376
+
377
+ // cancelled
378
+ if (url === null) {
379
+ return;
380
+ }
381
+
382
+ // empty
383
+ if (url === '') {
384
+ editor?.chain().focus().extendMarkRange('link').unsetLink().run();
385
+ return;
386
+ }
387
+
388
+ // update link
389
+ editor?.chain()
390
+ .focus()
391
+ .extendMarkRange('link')
392
+ .setLink({ href: url })
393
+ .run();
394
+ };
395
+
396
+ const setActiveFormats = () => {
397
+ const toolbarList = props.toolbar.flat() as string[];
398
+ toolbarList.forEach((item) => {
399
+ isActive.value[item] = editor?.isActive(item) || false;
400
+ });
401
+ };
402
+
403
+ // Styles
404
+ const classAttribute = useClassAttribute();
405
+
406
+ const rootStyles = computed(() => {
407
+ return [
408
+ 'or-rich-text-editor',
409
+ classAttribute.value,
410
+ ];
411
+ });
412
+
413
+ const containerStyles = computed(() => {
414
+ return [
415
+ ...EditorContainer,
416
+ ];
417
+ });
418
+
419
+ const toolbarContainerStyles = computed(() => {
420
+ return [
421
+ ...ToolbarContainer,
422
+ ];
423
+ });
424
+
425
+ const toolbarStyles = computed(() => {
426
+ return [
427
+ ...Toolbar,
428
+ ];
429
+ });
430
+
431
+ const editorInputStyles = computed(() => {
432
+ return [
433
+ 'tiptap-editor',
434
+ ...EditorInput,
435
+ ];
436
+ });
437
+
438
+ const toolbarButtonStyles = (item: string) => {
439
+ return [
440
+ // Layout
441
+ 'flex',
442
+ // Spacing
443
+ 'gap-md',
444
+ ...isActive.value[item] ? ToolbarButtonActive : ToolbarButton,
445
+ ];
446
+ };
447
+
448
+ const isPlainURL = (link: Mark, parent: Node, index: number, side: number) => {
449
+ if (link.attrs.title || !/^\w+:/.test(link.attrs.href)) return false;
450
+ const content = parent.child(index + (side < 0 ? -1 : 0));
451
+ if (
452
+ !content.isText ||
453
+ content.text !== link.attrs.href ||
454
+ content.marks[content.marks.length - 1] !== link
455
+ )
456
+ return false;
457
+ if (index === (side < 0 ? 1 : parent.childCount - 1)) return true;
458
+ const next = parent.child(index + (side < 0 ? -2 : 1));
459
+ return !link.isInSet(next.marks);
460
+ };
461
+
462
+ const serialize = (schema: any, content: any) => {
463
+ const proseMirrorDocument = schema.nodeFromJSON(content);
464
+ const serializer = new ProseMirrorMarkdownSerializer(
465
+ serializerNodes,
466
+ serializerMarks,
467
+ );
468
+
469
+ return serializer.serialize(proseMirrorDocument);
470
+ };
471
+
472
+ const deserialize = (schema: any, content: any) => {
473
+ const html = marked.parse(content);
474
+
475
+ if (!html) return null;
476
+
477
+ const parser = new DOMParser();
478
+ const { body } = parser.parseFromString(html, 'text/html');
479
+
480
+ // append original source as a comment that nodes can access
481
+ body.append(document.createComment(content));
482
+
483
+ const state = ProseMirrorDOMParser.fromSchema(schema).parse(body);
484
+ return state.toJSON();
485
+ };
486
+
487
+ //Effects
488
+ watch(() => props.modelValue, (value) => {
489
+ if (value !== editor?.getHTML() && !props.markdownFormat) {
490
+ editor?.commands.setContent(value);
491
+ }
492
+ if (props.markdownFormat && value !== markdownOutput.value) {
493
+ editor?.commands.setContent(markdownOutput.value);
494
+ }
495
+ });
496
+
497
+ return {
498
+ editor,
499
+ editorRef,
500
+ containerRef,
501
+ toolbarButtonRef,
502
+ menuRef,
503
+ iconsEnum,
504
+ handleToolbarClick,
505
+ handleEditorClick,
506
+ isActive,
507
+ iconTooltipsEnum,
508
+ containerStyles,
509
+ toolbarContainerStyles,
510
+ toolbarStyles,
511
+ rootStyles,
512
+ toolbarButtonStyles,
513
+ editorInputStyles,
514
+ getIndexOfHeading,
515
+ headingLevels,
516
+ headingIcon,
517
+ };
518
+ },
519
+ });
520
+ </script>
521
+
522
+ <style lang="scss">
523
+ .tiptap-editor {
524
+ ol { //see if editor can not inherit it
525
+ margin: 0 24px;
526
+ list-style: decimal;
527
+ }
528
+
529
+ ul {
530
+ margin: 0 24px;
531
+ list-style: initial;
532
+ }
533
+
534
+ pre { //TODO: test styles for code block, need to discuss with team
535
+ background-color: rgba($color: #bad1ec, $alpha: .3);
536
+ padding: 4px 8px;
537
+ margin: 4px 0;
538
+ width: 100%;
539
+ border-radius: 4px;
540
+ }
541
+
542
+ blockquote {
543
+ margin: 8px 24px;
544
+ padding: 0 24px;
545
+ border-left: 4px solid #bad1ec;
546
+ }
547
+
548
+ .is-editor-empty::before {
549
+ content: attr(data-placeholder);
550
+ height: 0;
551
+ pointer-events: none;
552
+ float: left;
553
+ }
554
+ }
555
+ </style>
@@ -0,0 +1 @@
1
+ export { default as OrRichTextEditorV3 } from './OrRichTextEditor.vue';
@@ -0,0 +1,65 @@
1
+ export const EditorContainer: string[] = [
2
+ // Colors
3
+ 'border-outline',
4
+ 'dark:border-outline-dark',
5
+ 'focus-within:theme-border-1-primary',
6
+ 'dark:focus-within:theme-border-1-primary-dark',
7
+ 'focus-within:bg-primary-opacity-0-08',
8
+ 'dark:focus-within:bg-primary-opacity-0-08-dark',
9
+ 'focus-within:theme-outline-primary',
10
+ 'dark:focus-within:theme-outline-primary-dark',
11
+
12
+ // Sizing
13
+ 'border-1',
14
+ 'rounded-md',
15
+ ];
16
+
17
+ export const ToolbarContainer: string[] = [
18
+ // Layout
19
+ 'flex',
20
+ //Spacing
21
+ 'py-sm',
22
+ //Sizing
23
+ 'border-b-1',
24
+ //Colors
25
+ 'border-b-outline',
26
+ 'dark:border-b-outline-dark',
27
+ ];
28
+
29
+ export const Toolbar: string[] = [
30
+ // Layout
31
+ 'flex',
32
+ // Spacing
33
+ 'px-sm',
34
+ 'gap-md',
35
+ // Sizing
36
+ 'border-r-1',
37
+ //Colors
38
+ 'border-r-disabled',
39
+ 'dark:border-r-outline-dark',
40
+ // Last child
41
+ 'last-of-type:border-none',
42
+ ];
43
+
44
+ export const ToolbarButton: string[] = [
45
+ // Typography
46
+ 'text-on-disabled',
47
+ 'dark:text-outline-dark',
48
+ ];
49
+
50
+ export const ToolbarButtonActive: string[] = [
51
+ // Typography
52
+ 'text-on-background',
53
+ 'dark:text-on-background-dark',
54
+ ];
55
+
56
+ export const EditorInput: string[] = [
57
+ // Spacing
58
+ 'p-sm',
59
+ // Typography
60
+ 'typography-body-2-regular',
61
+ 'text-on-background',
62
+ 'dark:text-on-background-dark',
63
+ // Sizing
64
+ 'min-h-[88px]',
65
+ ];
@@ -1,24 +0,0 @@
1
- import { Meta, StoryFn } from '@storybook/vue3';
2
- import OrEmptyState from './OrEmptyState.vue';
3
- declare const _default: Meta<import("vue").ComponentOptions<import("vue").default, import("@vue/composition-api").ShallowUnwrapRef<unknown>, import("@vue/composition-api").MethodOptions, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>, import("@vue/composition-api").ExtractPropTypes<import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>>> & Omit<import("vue").VueConstructor<import("vue").default>, never> & (new (...args: any[]) => import("@vue/composition-api").ComponentRenderProxy<{} & {}, import("@vue/composition-api").ShallowUnwrapRef<unknown>, unknown, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").MethodOptions, unknown, unknown, {
4
- [x: string]: ((...args: any[]) => any) | null;
5
- } | string[], {} & {}, {
6
- [x: number]: string;
7
- } | {}, true>)>;
8
- export default _default;
9
- export declare const Default: StoryFn<import("vue").ComponentOptions<import("vue").default, import("@vue/composition-api").ShallowUnwrapRef<unknown>, import("@vue/composition-api").MethodOptions, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>, import("@vue/composition-api").ExtractPropTypes<import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>>> & Omit<import("vue").VueConstructor<import("vue").default>, never> & (new (...args: any[]) => import("@vue/composition-api").ComponentRenderProxy<{} & {}, import("@vue/composition-api").ShallowUnwrapRef<unknown>, unknown, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").MethodOptions, unknown, unknown, {
10
- [x: string]: ((...args: any[]) => any) | null;
11
- } | string[], {} & {}, {
12
- [x: number]: string;
13
- } | {}, true>)>;
14
- export declare const ImageIcon: StoryFn<import("vue").ComponentOptions<import("vue").default, import("@vue/composition-api").ShallowUnwrapRef<unknown>, import("@vue/composition-api").MethodOptions, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>, import("@vue/composition-api").ExtractPropTypes<import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>>> & Omit<import("vue").VueConstructor<import("vue").default>, never> & (new (...args: any[]) => import("@vue/composition-api").ComponentRenderProxy<{} & {}, import("@vue/composition-api").ShallowUnwrapRef<unknown>, unknown, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").MethodOptions, unknown, unknown, {
15
- [x: string]: ((...args: any[]) => any) | null;
16
- } | string[], {} & {}, {
17
- [x: number]: string;
18
- } | {}, true>)>;
19
- export declare const LargeSize: StoryFn<import("vue").ComponentOptions<import("vue").default, import("@vue/composition-api").ShallowUnwrapRef<unknown>, import("@vue/composition-api").MethodOptions, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>, import("@vue/composition-api").ExtractPropTypes<import("@vue/composition-api").ComponentPropsOptions<import("@vue/composition-api").Data>>> & Omit<import("vue").VueConstructor<import("vue").default>, never> & (new (...args: any[]) => import("@vue/composition-api").ComponentRenderProxy<{} & {}, import("@vue/composition-api").ShallowUnwrapRef<unknown>, unknown, import("@vue/composition-api").ComputedOptions, import("@vue/composition-api").MethodOptions, unknown, unknown, {
20
- [x: string]: ((...args: any[]) => any) | null;
21
- } | string[], {} & {}, {
22
- [x: number]: string;
23
- } | {}, true>)>;
24
- export declare const ExtraContentInSlot: StoryFn<typeof OrEmptyState>;