tiptapify 0.0.35 → 0.0.36

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 (44) hide show
  1. package/README.md +1 -1
  2. package/dist/tiptapify.css +1 -1
  3. package/dist/tiptapify.mjs +33194 -24045
  4. package/dist/tiptapify.umd.js +68 -68
  5. package/package.json +2 -1
  6. package/src/components/Toolbar/media.ts +5 -0
  7. package/src/extensions/charmap/arrows.ts +1227 -0
  8. package/src/extensions/charmap/box_drawing.ts +324 -0
  9. package/src/extensions/charmap/currency.ts +157 -0
  10. package/src/extensions/charmap/cyrillic.ts +646 -0
  11. package/src/extensions/charmap/diacritics.ts +107 -0
  12. package/src/extensions/charmap/extended_letters.ts +1311 -0
  13. package/src/extensions/charmap/greek.ts +443 -0
  14. package/src/extensions/charmap/hebrew.ts +177 -0
  15. package/src/extensions/charmap/index.ts +75 -0
  16. package/src/extensions/charmap/math.ts +2949 -0
  17. package/src/extensions/charmap/punctuation.ts +121 -0
  18. package/src/extensions/charmap/symbols.ts +506 -0
  19. package/src/extensions/charmap/typography.ts +499 -0
  20. package/src/extensions/components/media/charmap/Button.vue +165 -0
  21. package/src/extensions/components/media/emoji/Button.vue +6 -11
  22. package/src/i18n/locales/ar.json +34 -12
  23. package/src/i18n/locales/ch.json +34 -12
  24. package/src/i18n/locales/cz.json +34 -12
  25. package/src/i18n/locales/de.json +34 -12
  26. package/src/i18n/locales/en.json +34 -12
  27. package/src/i18n/locales/es.json +34 -12
  28. package/src/i18n/locales/fi.json +34 -12
  29. package/src/i18n/locales/fr.json +34 -12
  30. package/src/i18n/locales/hu.json +34 -12
  31. package/src/i18n/locales/it.json +34 -12
  32. package/src/i18n/locales/ja.json +34 -12
  33. package/src/i18n/locales/ko.json +34 -12
  34. package/src/i18n/locales/la.json +34 -12
  35. package/src/i18n/locales/lt.json +34 -12
  36. package/src/i18n/locales/nl.json +34 -12
  37. package/src/i18n/locales/pl.json +34 -12
  38. package/src/i18n/locales/pt.json +34 -12
  39. package/src/i18n/locales/ru.json +34 -12
  40. package/src/i18n/locales/se.json +34 -12
  41. package/src/i18n/locales/th.json +34 -12
  42. package/src/i18n/locales/tr.json +34 -12
  43. package/src/i18n/locales/ua.json +34 -12
  44. package/src/i18n/locales/vi.json +34 -12
@@ -0,0 +1,499 @@
1
+ export default [
2
+ {
3
+ "name": "Vertical bar / Pipe",
4
+ "char": "|",
5
+ "codes": [
6
+ "|"
7
+ ]
8
+ },
9
+ {
10
+ "name": "Broken bar",
11
+ "char": "¦",
12
+ "codes": [
13
+ "¦"
14
+ ]
15
+ },
16
+ {
17
+ "name": "Section sign",
18
+ "char": "§",
19
+ "codes": [
20
+ "§"
21
+ ]
22
+ },
23
+ {
24
+ "name": "Copyright sign",
25
+ "char": "©",
26
+ "codes": [
27
+ "©"
28
+ ]
29
+ },
30
+ {
31
+ "name": "Feminine ordinal indicator",
32
+ "char": "ª",
33
+ "codes": [
34
+ "ª"
35
+ ]
36
+ },
37
+ {
38
+ "name": "Degree",
39
+ "char": "°",
40
+ "codes": [
41
+ "°"
42
+ ]
43
+ },
44
+ {
45
+ "name": "Paragraph",
46
+ "char": "¶",
47
+ "codes": [
48
+ "¶"
49
+ ]
50
+ },
51
+ {
52
+ "name": "Middle dot",
53
+ "char": "·",
54
+ "codes": [
55
+ "·"
56
+ ]
57
+ },
58
+ {
59
+ "name": "En dash",
60
+ "char": "–",
61
+ "codes": [
62
+ "–"
63
+ ]
64
+ },
65
+ {
66
+ "name": "Em dash",
67
+ "char": "—",
68
+ "codes": [
69
+ "—"
70
+ ]
71
+ },
72
+ {
73
+ "name": "Horizontal bar",
74
+ "char": "―",
75
+ "codes": [
76
+ "―"
77
+ ]
78
+ },
79
+ {
80
+ "name": "Double vertical line",
81
+ "char": "‖",
82
+ "codes": [
83
+ "‖"
84
+ ]
85
+ },
86
+ {
87
+ "name": "Left single quotation mark",
88
+ "char": "‘",
89
+ "codes": [
90
+ "‘"
91
+ ]
92
+ },
93
+ {
94
+ "name": "Right single quotation mark",
95
+ "char": "’",
96
+ "codes": [
97
+ "’"
98
+ ]
99
+ },
100
+ {
101
+ "name": "Single low-9 quotation mark",
102
+ "char": "‚",
103
+ "codes": [
104
+ "‚"
105
+ ]
106
+ },
107
+ {
108
+ "name": "Left double quotation mark",
109
+ "char": "“",
110
+ "codes": [
111
+ "“"
112
+ ]
113
+ },
114
+ {
115
+ "name": "Right double quotation mark",
116
+ "char": "”",
117
+ "codes": [
118
+ "”"
119
+ ]
120
+ },
121
+ {
122
+ "name": "Double low-9 quotation mark",
123
+ "char": "„",
124
+ "codes": [
125
+ "„ „"
126
+ ]
127
+ },
128
+ {
129
+ "name": "Dagger",
130
+ "char": "†",
131
+ "codes": [
132
+ "†"
133
+ ]
134
+ },
135
+ {
136
+ "name": "Double dagger",
137
+ "char": "‡",
138
+ "codes": [
139
+ "‡"
140
+ ]
141
+ },
142
+ {
143
+ "name": "Bullet",
144
+ "char": "•",
145
+ "codes": [
146
+ "•"
147
+ ]
148
+ },
149
+ {
150
+ "name": "Two dot leader",
151
+ "char": "‥",
152
+ "codes": [
153
+ "‥"
154
+ ]
155
+ },
156
+ {
157
+ "name": "Horizontal ellipsis",
158
+ "char": "…",
159
+ "codes": [
160
+ "…"
161
+ ]
162
+ },
163
+ {
164
+ "name": "Prime",
165
+ "char": "′",
166
+ "codes": [
167
+ "′"
168
+ ]
169
+ },
170
+ {
171
+ "name": "Double prime / Ditto mark",
172
+ "char": "″",
173
+ "codes": [
174
+ "″"
175
+ ]
176
+ },
177
+ {
178
+ "name": "Triple prime",
179
+ "char": "‴",
180
+ "codes": [
181
+ "‴"
182
+ ]
183
+ },
184
+ {
185
+ "name": "Reversed prime",
186
+ "char": "‵",
187
+ "codes": [
188
+ "‵"
189
+ ]
190
+ },
191
+ {
192
+ "name": "Single left-pointing quotation mark",
193
+ "char": "‹",
194
+ "codes": [
195
+ "‹"
196
+ ]
197
+ },
198
+ {
199
+ "name": "Single right-pointing quotation mark",
200
+ "char": "›",
201
+ "codes": [
202
+ "›"
203
+ ]
204
+ },
205
+ {
206
+ "name": "Overline",
207
+ "char": "‾",
208
+ "codes": [
209
+ "‾"
210
+ ]
211
+ },
212
+ {
213
+ "name": "Caret",
214
+ "char": "⁁",
215
+ "codes": [
216
+ "⁁"
217
+ ]
218
+ },
219
+ {
220
+ "name": "Hyphen bullet",
221
+ "char": "⁃",
222
+ "codes": [
223
+ "⁃"
224
+ ]
225
+ },
226
+ {
227
+ "name": "Reversed semicolon",
228
+ "char": "⁏",
229
+ "codes": [
230
+ "⁏"
231
+ ]
232
+ },
233
+ {
234
+ "name": "Care of",
235
+ "char": "℅",
236
+ "codes": [
237
+ "℅"
238
+ ]
239
+ },
240
+ {
241
+ "name": "G script",
242
+ "char": "ℊ",
243
+ "codes": [
244
+ "ℊ"
245
+ ]
246
+ },
247
+ {
248
+ "name": "H script",
249
+ "char": "ℋ",
250
+ "codes": [
251
+ "ℋ"
252
+ ]
253
+ },
254
+ {
255
+ "name": "Black-letter H",
256
+ "char": "ℌ",
257
+ "codes": [
258
+ "ℌ"
259
+ ]
260
+ },
261
+ {
262
+ "name": "I script",
263
+ "char": "ℐ",
264
+ "codes": [
265
+ "ℐ"
266
+ ]
267
+ },
268
+ {
269
+ "name": "I script / Image",
270
+ "char": "ℑ",
271
+ "codes": [
272
+ "ℑ"
273
+ ]
274
+ },
275
+ {
276
+ "name": "L script / Laplace",
277
+ "char": "ℒ",
278
+ "codes": [
279
+ "ℒ"
280
+ ]
281
+ },
282
+ {
283
+ "name": "L script",
284
+ "char": "ℓ",
285
+ "codes": [
286
+ "ℓ"
287
+ ]
288
+ },
289
+ {
290
+ "name": "Numero",
291
+ "char": "№",
292
+ "codes": [
293
+ "№"
294
+ ]
295
+ },
296
+ {
297
+ "name": "Sound recording copyright",
298
+ "char": "℗",
299
+ "codes": [
300
+ "℗"
301
+ ]
302
+ },
303
+ {
304
+ "name": "P script",
305
+ "char": "℘",
306
+ "codes": [
307
+ "℘"
308
+ ]
309
+ },
310
+ {
311
+ "name": "R Script",
312
+ "char": "ℛ",
313
+ "codes": [
314
+ "ℛ"
315
+ ]
316
+ },
317
+ {
318
+ "name": "Prescription take",
319
+ "char": "℞",
320
+ "codes": [
321
+ "℞"
322
+ ]
323
+ },
324
+ {
325
+ "name": "Trade mark sign",
326
+ "char": "™",
327
+ "codes": [
328
+ "™"
329
+ ]
330
+ },
331
+ {
332
+ "name": "Black-letter z",
333
+ "char": "ℨ",
334
+ "codes": [
335
+ "ℨ"
336
+ ]
337
+ },
338
+ {
339
+ "name": "B script",
340
+ "char": "ℬ",
341
+ "codes": [
342
+ "ℬ"
343
+ ]
344
+ },
345
+ {
346
+ "name": "Black-letter C",
347
+ "char": "ℭ",
348
+ "codes": [
349
+ "ℭ"
350
+ ]
351
+ },
352
+ {
353
+ "name": "Elementary charge / E script",
354
+ "char": "ℯ",
355
+ "codes": [
356
+ "ℯ"
357
+ ]
358
+ },
359
+ {
360
+ "name": "E script",
361
+ "char": "ℰ",
362
+ "codes": [
363
+ "ℰ"
364
+ ]
365
+ },
366
+ {
367
+ "name": "F script",
368
+ "char": "ℱ",
369
+ "codes": [
370
+ "ℱ "
371
+ ]
372
+ },
373
+ {
374
+ "name": "M script",
375
+ "char": "ℳ",
376
+ "codes": [
377
+ "ℳ"
378
+ ]
379
+ },
380
+ {
381
+ "name": "o script",
382
+ "char": "ℴ",
383
+ "codes": [
384
+ "ℴ"
385
+ ]
386
+ },
387
+ {
388
+ "name": "Vertical ellipsis",
389
+ "char": "⋮",
390
+ "codes": [
391
+ "⋮"
392
+ ]
393
+ },
394
+ {
395
+ "name": "Mid line horizontal ellipsis",
396
+ "char": "⋯",
397
+ "codes": [
398
+ "⋯"
399
+ ]
400
+ },
401
+ {
402
+ "name": "Up right diagonal ellipsis",
403
+ "char": "⋰",
404
+ "codes": [
405
+ "⋰"
406
+ ]
407
+ },
408
+ {
409
+ "name": "Down right diagonal ellipsis",
410
+ "char": "⋱",
411
+ "codes": [
412
+ "⋱"
413
+ ]
414
+ },
415
+ {
416
+ "name": "Bottom right crop mark",
417
+ "char": "⌌",
418
+ "codes": [
419
+ "⌌"
420
+ ]
421
+ },
422
+ {
423
+ "name": "Bottom left crop mark",
424
+ "char": "⌍",
425
+ "codes": [
426
+ "⌍"
427
+ ]
428
+ },
429
+ {
430
+ "name": "Top right crop mark",
431
+ "char": "⌎",
432
+ "codes": [
433
+ "⌎"
434
+ ]
435
+ },
436
+ {
437
+ "name": "Top left crop mark",
438
+ "char": "⌏",
439
+ "codes": [
440
+ "⌏"
441
+ ]
442
+ },
443
+ {
444
+ "name": "Top left corner",
445
+ "char": "⌜",
446
+ "codes": [
447
+ "⌜"
448
+ ]
449
+ },
450
+ {
451
+ "name": "Top right corner",
452
+ "char": "⌝",
453
+ "codes": [
454
+ "⌝"
455
+ ]
456
+ },
457
+ {
458
+ "name": "Bottom left corner",
459
+ "char": "⌞",
460
+ "codes": [
461
+ "⌞"
462
+ ]
463
+ },
464
+ {
465
+ "name": "Bottom right corner",
466
+ "char": "⌟",
467
+ "codes": [
468
+ "⌟"
469
+ ]
470
+ },
471
+ {
472
+ "name": "Frown",
473
+ "char": "⌢",
474
+ "codes": [
475
+ "⌢"
476
+ ]
477
+ },
478
+ {
479
+ "name": "Smile",
480
+ "char": "⌣",
481
+ "codes": [
482
+ "⌣"
483
+ ]
484
+ },
485
+ {
486
+ "name": "Circled S",
487
+ "char": "Ⓢ",
488
+ "codes": [
489
+ "Ⓢ"
490
+ ]
491
+ },
492
+ {
493
+ "name": "Vertical separator",
494
+ "char": "❘",
495
+ "codes": [
496
+ "❘"
497
+ ]
498
+ }
499
+ ]
@@ -0,0 +1,165 @@
1
+ <script lang="ts" setup>
2
+ import { Editor } from '@tiptap/vue-3'
3
+ import tiptapifyCharMap from "@tiptapify/extensions/charmap"
4
+ import { computed, inject, Ref, ref, watch } from 'vue'
5
+ import * as mdi from '@mdi/js'
6
+
7
+ defineProps({
8
+ variantBtn: { type: String, default: 'flat' },
9
+ })
10
+
11
+ const editor = inject('tiptapifyEditor') as Ref<Editor>
12
+ const { t } = inject('tiptapifyI18n') as any
13
+
14
+ const filter = ref(null)
15
+ const tab = ref('punctuation')
16
+ const sorted = tiptapifyCharMap.sort((previous, current) => {
17
+ if (previous.order < current.order) {
18
+ return -1
19
+ }
20
+ if (previous.order > current.order) {
21
+ return 1
22
+ }
23
+
24
+ return 0
25
+ })
26
+
27
+ if (!tab.value && sorted.length > 0) {
28
+ tab.value = sorted[0].name
29
+ }
30
+ const chars = computed(() => sorted.map(item => { return { group: item.name, emojis: item.items } }))
31
+ const charMapRef = ref(JSON.parse(JSON.stringify(chars.value)))
32
+
33
+ const handleCharacterClick = (charItem: any) => {
34
+ editor.value.chain().focus().insertContent(charItem.char).run()
35
+ }
36
+
37
+ const filterChars = (filterValue: string) => {
38
+ resetFilter()
39
+ if (!filterValue) {
40
+ return
41
+ }
42
+
43
+ const filtered: any[] = []
44
+
45
+ const groupItems = charMapRef.value.find((item: any) => item.group === tab.value)
46
+ if (groupItems?.emojis) {
47
+ groupItems.emojis.forEach((item: any) => {
48
+ if (item.name.toLowerCase().match(filterValue)) {
49
+ filtered.push(item)
50
+ }
51
+ })
52
+
53
+ groupItems.emojis = filtered
54
+ }
55
+ }
56
+
57
+ const resetFilter = () => {
58
+ charMapRef.value = JSON.parse(JSON.stringify(chars.value))
59
+ }
60
+
61
+ watch(() => tab.value, () => {
62
+ resetFilter()
63
+ filter.value = null
64
+ })
65
+
66
+ </script>
67
+
68
+ <template>
69
+ <VBtn :id="`tiptapify-charmap-button-${editor.instanceId}`" :variant="variantBtn" size="32" @click="console.log('click charmap')">
70
+ <VTooltip activator="parent">
71
+ {{ t('media.charmap.title') }}
72
+ </VTooltip>
73
+ <VIcon :icon="`mdiSvg:${mdi.mdiAppleKeyboardCommand}`" tag="svg" size="small" />
74
+ </VBtn>
75
+
76
+ <VMenu :activator="`#tiptapify-charmap-button-${editor.instanceId}`" :close-on-content-click="false">
77
+ <VSheet class="pa-2" max-width="580">
78
+ <div class="d-flex flex-row">
79
+ <VTabs v-model="tab" mandatory direction="vertical" color="primary" density="compact">
80
+ <VTab
81
+ v-for="item of charMapRef"
82
+ :text="item.group"
83
+ :value="item.group"
84
+ :key="item.group"
85
+ density="compact"
86
+ rounded
87
+ size="small"
88
+ >
89
+ {{ t(`media.charmap.categories.${item.group}`) }}
90
+ </VTab>
91
+ </VTabs>
92
+
93
+ <div class="d-flex flex-column">
94
+ <VTextField
95
+ v-model="filter"
96
+ :label="t('media.charmap.search')"
97
+ density="compact"
98
+ variant="solo"
99
+ :prepend-inner-icon="`mdiSvg:${mdi.mdiMagnify}`"
100
+ class="mb-2 tiptapify-charmap-search"
101
+ hide-details
102
+ clearable
103
+ @update:model-value="filterChars($event)"
104
+ @click:clear="resetFilter"
105
+ />
106
+ <div class="tiptapify-charmap-container">
107
+ <VWindow v-model="tab" direction="vertical">
108
+ <VWindowItem v-for="item of charMapRef" :value="item.group" :transition="false" :reverse-transition="false">
109
+ <div
110
+ v-for="charItem in item.emojis"
111
+ class="tiptapify-charmap-container-item"
112
+ @click="handleCharacterClick(charItem)"
113
+ :title="charItem.name"
114
+ >
115
+ <div class="tiptapify-charmap-container-item__overlay">
116
+ <span>
117
+ {{ charItem.char }}
118
+ </span>
119
+ </div>
120
+ </div>
121
+ </VWindowItem>
122
+ </VWindow>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ </VSheet>
127
+ </VMenu>
128
+ </template>
129
+
130
+ <style scoped lang="scss">
131
+ .tiptapify-charmap-container {
132
+ width: 360px;
133
+ height: 550px;
134
+ overflow-y: auto;
135
+
136
+ border: 1px solid rgba(var(--v-theme-on-background), calc(var(--v-border-opacity)));
137
+ border-radius: 8px;
138
+ box-shadow: 0 0 5px rgba(var(--v-theme-on-background), calc(var(--v-border-opacity))) inset;
139
+ }
140
+
141
+ .tiptapify-charmap-container-item__overlay {
142
+ display: flex;
143
+ justify-content: center;
144
+ align-items: center;
145
+ width: 32px;
146
+ height: 32px;
147
+ border-radius: 5px;
148
+ z-index: 1;
149
+ }
150
+
151
+ .tiptapify-charmap-container-item {
152
+ position: relative;
153
+ display: inline-flex;
154
+ justify-content: center;
155
+ align-items: center;
156
+ cursor: pointer;
157
+ width: 32px;
158
+ height: 32px;
159
+ transition: background-color 0.2s ease-in-out;
160
+ }
161
+
162
+ .tiptapify-charmap-container-item:hover .tiptapify-emoji-container-item__overlay {
163
+ background-color: rgba(var(--v-theme-on-background), calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)));
164
+ }
165
+ </style>
@@ -67,12 +67,7 @@ watch(() => tab.value, () => {
67
67
  </script>
68
68
 
69
69
  <template>
70
- <VBtn
71
- :id="`tiptapify-emoji-button-${editor.instanceId}`"
72
- :color="editor.isActive('image') ? 'primary' : ''"
73
- :variant="variantBtn"
74
- size="32"
75
- >
70
+ <VBtn :id="`tiptapify-emoji-button-${editor.instanceId}`" color="" :variant="variantBtn" size="32">
76
71
  <VTooltip activator="parent">
77
72
  {{ t('media.emoji.title') }}
78
73
  </VTooltip>
@@ -92,14 +87,14 @@ watch(() => tab.value, () => {
92
87
  rounded
93
88
  size="small"
94
89
  >
95
- {{ t(`media.emoji.${item.group}`) }}
90
+ {{ t(`media.emoji.categories.${item.group}`) }}
96
91
  </VTab>
97
92
  </VTabs>
98
93
 
99
94
  <div>
100
95
  <VTextField
101
96
  v-model="filter"
102
- label="Filter emoji"
97
+ :label="t('media.emoji.search')"
103
98
  density="compact"
104
99
  variant="solo"
105
100
  :prepend-inner-icon="`mdiSvg:${mdi.mdiMagnify}`"
@@ -119,9 +114,9 @@ watch(() => tab.value, () => {
119
114
  :title="emojiItem.name"
120
115
  >
121
116
  <div class="tiptapify-emoji-container-item__overlay">
122
- <span>
123
- {{ emojiItem.char }}
124
- </span>
117
+ <span>
118
+ {{ emojiItem.char }}
119
+ </span>
125
120
  </div>
126
121
  </div>
127
122
  </VWindowItem>