@meta-1/editor 0.0.27

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 (130) hide show
  1. package/README.md +458 -0
  2. package/package.json +100 -0
  3. package/src/editor/constants.tsx +66 -0
  4. package/src/editor/container.css +46 -0
  5. package/src/editor/control/character-count/index.tsx +39 -0
  6. package/src/editor/control/drag-handle/index.tsx +85 -0
  7. package/src/editor/control/drag-handle/use.content.actions.ts +71 -0
  8. package/src/editor/control/drag-handle/use.data.ts +29 -0
  9. package/src/editor/control/drag-handle/use.handle.id.ts +6 -0
  10. package/src/editor/control/index.tsx +35 -0
  11. package/src/editor/editor.css +626 -0
  12. package/src/editor/extension/block-quote-figure/BlockquoteFigure.ts +73 -0
  13. package/src/editor/extension/block-quote-figure/Quote/Quote.ts +31 -0
  14. package/src/editor/extension/block-quote-figure/Quote/index.ts +1 -0
  15. package/src/editor/extension/block-quote-figure/QuoteCaption/QuoteCaption.ts +54 -0
  16. package/src/editor/extension/block-quote-figure/QuoteCaption/index.ts +1 -0
  17. package/src/editor/extension/block-quote-figure/index.ts +1 -0
  18. package/src/editor/extension/document/index.ts +5 -0
  19. package/src/editor/extension/figcaption/Figcaption.ts +90 -0
  20. package/src/editor/extension/figcaption/index.ts +1 -0
  21. package/src/editor/extension/figure/Figure.ts +62 -0
  22. package/src/editor/extension/figure/index.ts +1 -0
  23. package/src/editor/extension/font-size/FontSize.ts +64 -0
  24. package/src/editor/extension/font-size/index.ts +1 -0
  25. package/src/editor/extension/global-drag-handle/clipboard-serializer.ts +28 -0
  26. package/src/editor/extension/global-drag-handle/index.ts +377 -0
  27. package/src/editor/extension/heading/index.ts +13 -0
  28. package/src/editor/extension/horizontal-rule/HorizontalRule.ts +10 -0
  29. package/src/editor/extension/horizontal-rule/index.ts +1 -0
  30. package/src/editor/extension/image/index.ts +5 -0
  31. package/src/editor/extension/image-block/ImageBlock.ts +103 -0
  32. package/src/editor/extension/image-block/components/ImageBlockMenu.tsx +100 -0
  33. package/src/editor/extension/image-block/components/ImageBlockView.tsx +47 -0
  34. package/src/editor/extension/image-block/components/ImageBlockWidth.tsx +40 -0
  35. package/src/editor/extension/image-block/index.ts +1 -0
  36. package/src/editor/extension/image-upload/ImageUpload.ts +58 -0
  37. package/src/editor/extension/image-upload/index.ts +1 -0
  38. package/src/editor/extension/image-upload/view/ImageUpload.tsx +27 -0
  39. package/src/editor/extension/image-upload/view/ImageUploader.tsx +64 -0
  40. package/src/editor/extension/image-upload/view/hooks.ts +109 -0
  41. package/src/editor/extension/image-upload/view/index.tsx +1 -0
  42. package/src/editor/extension/index.ts +30 -0
  43. package/src/editor/extension/link/Link.ts +39 -0
  44. package/src/editor/extension/link/index.ts +1 -0
  45. package/src/editor/extension/multi-column/Column.ts +33 -0
  46. package/src/editor/extension/multi-column/Columns.ts +65 -0
  47. package/src/editor/extension/multi-column/index.ts +2 -0
  48. package/src/editor/extension/multi-column/menus/ColumnsMenu.tsx +82 -0
  49. package/src/editor/extension/multi-column/menus/index.ts +1 -0
  50. package/src/editor/extension/selection/Selection.ts +36 -0
  51. package/src/editor/extension/selection/index.ts +1 -0
  52. package/src/editor/extension/slash-command/MenuList.tsx +145 -0
  53. package/src/editor/extension/slash-command/groups.ts +153 -0
  54. package/src/editor/extension/slash-command/index.ts +277 -0
  55. package/src/editor/extension/slash-command/types.ts +25 -0
  56. package/src/editor/extension/table/Cell.ts +126 -0
  57. package/src/editor/extension/table/Header.ts +89 -0
  58. package/src/editor/extension/table/Row.ts +8 -0
  59. package/src/editor/extension/table/Table.ts +9 -0
  60. package/src/editor/extension/table/index.ts +4 -0
  61. package/src/editor/extension/table/menus/TableColumn/index.tsx +73 -0
  62. package/src/editor/extension/table/menus/TableColumn/utils.ts +38 -0
  63. package/src/editor/extension/table/menus/TableRow/index.tsx +74 -0
  64. package/src/editor/extension/table/menus/TableRow/utils.ts +38 -0
  65. package/src/editor/extension/table/menus/index.tsx +2 -0
  66. package/src/editor/extension/table/utils.ts +258 -0
  67. package/src/editor/extension/task-item/index.ts +1 -0
  68. package/src/editor/extension/task-item/task-item.ts +225 -0
  69. package/src/editor/extension/task-list/index.ts +1 -0
  70. package/src/editor/extension/task-list/task-list.ts +81 -0
  71. package/src/editor/extension/trailing-node/index.ts +1 -0
  72. package/src/editor/extension/trailing-node/trailing-node.ts +70 -0
  73. package/src/editor/extension/unique-id/index.ts +1 -0
  74. package/src/editor/extension/unique-id/uniqueId.ts +123 -0
  75. package/src/editor/hooks.ts +264 -0
  76. package/src/editor/index.tsx +53 -0
  77. package/src/editor/menus/LinkMenu/LinkMenu.tsx +75 -0
  78. package/src/editor/menus/LinkMenu/index.tsx +1 -0
  79. package/src/editor/menus/TextMenu/TextMenu.tsx +193 -0
  80. package/src/editor/menus/TextMenu/components/AIDropdown.tsx +140 -0
  81. package/src/editor/menus/TextMenu/components/ContentTypePicker.tsx +76 -0
  82. package/src/editor/menus/TextMenu/components/EditLinkPopover.tsx +25 -0
  83. package/src/editor/menus/TextMenu/components/FontFamilyPicker.tsx +84 -0
  84. package/src/editor/menus/TextMenu/components/FontSizePicker.tsx +56 -0
  85. package/src/editor/menus/TextMenu/hooks/useTextmenuCommands.ts +96 -0
  86. package/src/editor/menus/TextMenu/hooks/useTextmenuContentTypes.ts +86 -0
  87. package/src/editor/menus/TextMenu/hooks/useTextmenuStates.ts +50 -0
  88. package/src/editor/menus/TextMenu/index.tsx +2 -0
  89. package/src/editor/menus/types.ts +21 -0
  90. package/src/editor/panels/Colorpicker/ColorButton.tsx +35 -0
  91. package/src/editor/panels/Colorpicker/Colorpicker.tsx +67 -0
  92. package/src/editor/panels/Colorpicker/index.tsx +2 -0
  93. package/src/editor/panels/LinkEditorPanel/LinkEditorPanel.tsx +76 -0
  94. package/src/editor/panels/LinkEditorPanel/index.tsx +1 -0
  95. package/src/editor/panels/LinkPreviewPanel/LinkPreviewPanel.tsx +32 -0
  96. package/src/editor/panels/LinkPreviewPanel/index.tsx +1 -0
  97. package/src/editor/panels/index.tsx +3 -0
  98. package/src/editor/types.tsx +38 -0
  99. package/src/editor/ui/Button/Button.tsx +70 -0
  100. package/src/editor/ui/Button/index.tsx +2 -0
  101. package/src/editor/ui/Dropdown/Dropdown.tsx +39 -0
  102. package/src/editor/ui/Dropdown/index.tsx +1 -0
  103. package/src/editor/ui/Icon.tsx +21 -0
  104. package/src/editor/ui/Loader/Loader.tsx +39 -0
  105. package/src/editor/ui/Loader/index.ts +1 -0
  106. package/src/editor/ui/Loader/types.ts +7 -0
  107. package/src/editor/ui/Panel/index.tsx +109 -0
  108. package/src/editor/ui/PopoverMenu.tsx +127 -0
  109. package/src/editor/ui/Spinner/Spinner.tsx +10 -0
  110. package/src/editor/ui/Spinner/index.tsx +1 -0
  111. package/src/editor/ui/Surface.tsx +27 -0
  112. package/src/editor/ui/Textarea/Textarea.tsx +20 -0
  113. package/src/editor/ui/Textarea/index.tsx +1 -0
  114. package/src/editor/ui/Toggle/Toggle.tsx +39 -0
  115. package/src/editor/ui/Toggle/index.tsx +1 -0
  116. package/src/editor/ui/Toolbar.tsx +107 -0
  117. package/src/editor/ui/Tooltip/index.tsx +77 -0
  118. package/src/editor/ui/Tooltip/types.ts +17 -0
  119. package/src/editor/utils/cssVar.ts +14 -0
  120. package/src/editor/utils/getRenderContainer.ts +39 -0
  121. package/src/editor/utils/index.ts +16 -0
  122. package/src/editor/utils/isCustomNodeSelected.ts +47 -0
  123. package/src/editor/utils/isTextSelected.ts +25 -0
  124. package/src/editor/utils/locale.ts +5 -0
  125. package/src/editor/viewer/index.tsx +26 -0
  126. package/src/globals.css +1 -0
  127. package/src/index.ts +7 -0
  128. package/src/locales/en-us.ts +133 -0
  129. package/src/locales/zh-cn.ts +133 -0
  130. package/src/locales/zh-tw.ts +133 -0
@@ -0,0 +1,626 @@
1
+ @import "../globals.css";
2
+
3
+ .ProseMirror {
4
+ --margin-y: 1rem;
5
+ @apply selection:bg-muted;
6
+ }
7
+
8
+ /** 图片上传 start **/
9
+ .ProseMirror .node-imageUpload {
10
+ transition: border 0.16s cubic-bezier(0.45, 0.05, 0.55, 0.95);
11
+ @apply rounded-lg border-2 border-dotted border-foreground/20;
12
+ @apply hover:border-foreground/40;
13
+ }
14
+
15
+ .ProseMirror .node-imageUpload.has-focus,
16
+ .ProseMirror .node-imageUpload:has(.is-active) {
17
+ @apply border-foreground/50;
18
+ }
19
+
20
+ /** 图片上传 end **/
21
+
22
+ /* 引用 start */
23
+ .ProseMirror figure[data-type="blockquoteFigure"] {
24
+ @apply my-[var(--margin-y)] text-secondary-foreground;
25
+ }
26
+
27
+ .ProseMirror > blockquote blockquote,
28
+ .ProseMirror [data-type="blockquoteFigure"] blockquote {
29
+ @apply m-0;
30
+ }
31
+
32
+ .ProseMirror > blockquote blockquote > :first-child,
33
+ .ProseMirror [data-type="blockquoteFigure"] blockquote > :first-child {
34
+ @apply mt-0;
35
+ }
36
+
37
+ .ProseMirror > blockquote blockquote > :last-child,
38
+ .ProseMirror [data-type="blockquoteFigure"] blockquote > :last-child {
39
+ @apply mb-0;
40
+ }
41
+
42
+ .ProseMirror [data-type="blockquoteFigure"] > div {
43
+ @apply border-0 border-l-4 border-primary px-4 py-2;
44
+ }
45
+
46
+ .ProseMirror [data-type="blockquoteFigure"] > blockquote {
47
+ @apply text-lg leading-7;
48
+ }
49
+
50
+ .ProseMirror [data-type="blockquoteFigure"] figcaption {
51
+ @apply mt-2 overflow-hidden text-xs text-right text-secondary-foreground/50;
52
+ }
53
+
54
+ /* 引用 end */
55
+
56
+ /* columns start */
57
+ .ProseMirror [data-type="columns"] {
58
+ margin-top: 3.5rem;
59
+ margin-bottom: 3rem;
60
+ display: grid;
61
+ gap: 1rem;
62
+ }
63
+
64
+ .ProseMirror [data-type="columns"].layout-sidebar-left {
65
+ grid-template-columns: 40fr 60fr;
66
+ }
67
+
68
+ .ProseMirror [data-type="columns"].layout-sidebar-right {
69
+ grid-template-columns: 60fr 40fr;
70
+ }
71
+
72
+ .ProseMirror [data-type="columns"].layout-two-column {
73
+ grid-template-columns: 1fr 1fr;
74
+ }
75
+
76
+ .ProseMirror [data-type="column"] {
77
+ overflow: auto;
78
+ }
79
+
80
+ /* columns end */
81
+
82
+ /* 代码块,代码段 start */
83
+ .ProseMirror code {
84
+ @apply rounded-sm caret-white bg-black/80 text-white shadow-sm px-1 py-0.5 selection:bg-white/20;
85
+ font-family:
86
+ ui-monospace,
87
+ SFMono-Regular,
88
+ Menlo,
89
+ Monaco,
90
+ Consolas,
91
+ Liberation Mono,
92
+ Courier New,
93
+ monospace;
94
+ }
95
+
96
+ .ProseMirror pre {
97
+ @apply my-[var(--margin-y)] rounded-lg border border-black/10 bg-black/80 p-4 text-white caret-white;
98
+ }
99
+
100
+ .ProseMirror pre code {
101
+ @apply bg-transparent p-0 text-inherit shadow-none;
102
+ }
103
+
104
+ .ProseMirror pre .hljs-comment,
105
+ .ProseMirror pre .hljs-quote {
106
+ @apply text-[rgb(163,163,163)];
107
+ }
108
+
109
+ .ProseMirror pre .hljs-attribute,
110
+ .ProseMirror pre .hljs-link,
111
+ .ProseMirror pre .hljs-name,
112
+ .ProseMirror pre .hljs-regexp,
113
+ .ProseMirror pre .hljs-selector-class,
114
+ .ProseMirror pre .hljs-selector-id,
115
+ .ProseMirror pre .hljs-tag,
116
+ .ProseMirror pre .hljs-template-variable,
117
+ .ProseMirror pre .hljs-variable {
118
+ @apply text-[rgb(252,165,165)];
119
+ }
120
+
121
+ .ProseMirror pre .hljs-built_in,
122
+ .ProseMirror pre .hljs-builtin-name,
123
+ .ProseMirror pre .hljs-literal,
124
+ .ProseMirror pre .hljs-meta,
125
+ .ProseMirror pre .hljs-number,
126
+ .ProseMirror pre .hljs-params,
127
+ .ProseMirror pre .hljs-type {
128
+ @apply text-[rgb(253,186,116)];
129
+ }
130
+
131
+ .ProseMirror pre .hljs-bullet,
132
+ .ProseMirror pre .hljs-string,
133
+ .ProseMirror pre .hljs-symbol {
134
+ @apply text-[rgb(190,242,100)];
135
+ }
136
+
137
+ .ProseMirror pre .hljs-section,
138
+ .ProseMirror pre .hljs-title {
139
+ @apply text-[rgb(253,224,71)];
140
+ }
141
+
142
+ .ProseMirror pre .hljs-keyword,
143
+ .ProseMirror pre .hljs-selector-tag {
144
+ @apply text-[rgb(94,234,212)];
145
+ }
146
+
147
+ .ProseMirror pre .hljs-emphasis {
148
+ font-style: italic;
149
+ }
150
+
151
+ .ProseMirror pre .hljs-strong {
152
+ font-weight: 700;
153
+ }
154
+
155
+ /* 代码块,代码段 end */
156
+
157
+ .ProseMirror .collaboration-cursor__caret {
158
+ pointer-events: none;
159
+ position: relative;
160
+ margin-left: -1px;
161
+ margin-right: -1px;
162
+ overflow-wrap: normal;
163
+ word-break: normal;
164
+ border-right-width: 1px;
165
+ border-left-width: 1px;
166
+ --tw-border-opacity: 1;
167
+ border-color: rgb(0 0 0 / var(--tw-border-opacity));
168
+ }
169
+
170
+ .ProseMirror .collaboration-cursor__label {
171
+ position: absolute;
172
+ left: -1px;
173
+ top: -1.4em;
174
+ -webkit-user-select: none;
175
+ -moz-user-select: none;
176
+ user-select: none;
177
+ white-space: nowrap;
178
+ @apply rounded-md rounded-tl-none leading-4 font-semibold text-black;
179
+ }
180
+
181
+ /* 列表 start */
182
+ .ProseMirror ol {
183
+ list-style-type: decimal;
184
+ }
185
+
186
+ .ProseMirror ul {
187
+ list-style-type: disc;
188
+ }
189
+
190
+ .ProseMirror ol,
191
+ .ProseMirror ul {
192
+ margin-top: 1.5rem;
193
+ margin-bottom: 1.5rem;
194
+ padding: 0 2rem;
195
+ }
196
+
197
+ .ProseMirror ol:first-child,
198
+ .ProseMirror ul:first-child {
199
+ margin-top: 0;
200
+ }
201
+
202
+ .ProseMirror ol:last-child,
203
+ .ProseMirror ul:last-child {
204
+ margin-bottom: 0;
205
+ }
206
+
207
+ .ProseMirror ol li,
208
+ .ProseMirror ol ol,
209
+ .ProseMirror ol ul,
210
+ .ProseMirror ul li,
211
+ .ProseMirror ul ol,
212
+ .ProseMirror ul ul {
213
+ margin-top: 0.25rem;
214
+ margin-bottom: 0.25rem;
215
+ }
216
+
217
+ .ProseMirror > ol,
218
+ .ProseMirror > ul {
219
+ margin-top: 1rem;
220
+ margin-bottom: 1rem;
221
+ }
222
+
223
+ .ProseMirror > ol:first-child,
224
+ .ProseMirror > ul:first-child {
225
+ margin-top: 0;
226
+ }
227
+
228
+ .ProseMirror > ol:last-child,
229
+ .ProseMirror > ul:last-child {
230
+ margin-bottom: 0;
231
+ }
232
+
233
+ .ProseMirror ul[data-type="taskList"] {
234
+ list-style-type: none;
235
+ padding: 0;
236
+ }
237
+
238
+ .ProseMirror ul[data-type="taskList"] p {
239
+ margin: 0;
240
+ }
241
+
242
+ .ProseMirror ul[data-type="taskList"] li {
243
+ display: flex;
244
+ }
245
+
246
+ .ProseMirror ul[data-type="taskList"] li > label {
247
+ margin-top: 0.25rem;
248
+ margin-right: 0.5rem;
249
+ flex: 1 1 auto;
250
+ flex-shrink: 0;
251
+ flex-grow: 0;
252
+ -webkit-user-select: none;
253
+ -moz-user-select: none;
254
+ user-select: none;
255
+ }
256
+
257
+ .ProseMirror ul[data-type="taskList"] li > div {
258
+ flex: 1 1 auto;
259
+ }
260
+
261
+ .ProseMirror ul[data-type="taskList"] li[data-checked="true"] {
262
+ text-decoration-line: line-through;
263
+ }
264
+
265
+ /* 列表 end */
266
+
267
+ /* 空 start */
268
+ .ProseMirror .is-empty:before {
269
+ pointer-events: none;
270
+ float: left;
271
+ height: 0;
272
+ width: 100%;
273
+ color: rgba(0, 0, 0, 0.4);
274
+ }
275
+
276
+ /* 空 end */
277
+
278
+ /** 表格 start **/
279
+ /* .ProseMirror .tableWrapper {} */
280
+
281
+ .ProseMirror table {
282
+ margin-top: 1rem;
283
+ margin-bottom: 1rem;
284
+ box-sizing: border-box;
285
+ width: 100%;
286
+ border-collapse: collapse;
287
+ border-radius: 0.25rem;
288
+ border-color: rgba(0, 0, 0, 0.1);
289
+ }
290
+
291
+ .ProseMirror table td,
292
+ .ProseMirror table th {
293
+ @apply border;
294
+ position: relative;
295
+ min-width: 100px;
296
+ border-width: 1px;
297
+ padding: 0.5rem;
298
+ text-align: left;
299
+ vertical-align: top;
300
+ }
301
+
302
+ .ProseMirror table td:first-of-type:not(a),
303
+ .ProseMirror table th:first-of-type:not(a) {
304
+ margin-top: 0;
305
+ }
306
+
307
+ .ProseMirror table td p,
308
+ .ProseMirror table th p {
309
+ margin: 0;
310
+ }
311
+
312
+ .ProseMirror table td p + p,
313
+ .ProseMirror table th p + p {
314
+ margin-top: 0.75rem;
315
+ }
316
+
317
+ .ProseMirror table th {
318
+ font-weight: 700;
319
+ }
320
+
321
+ .ProseMirror table .column-resize-handle {
322
+ pointer-events: none;
323
+ position: absolute;
324
+ bottom: -2px;
325
+ right: -0.25rem;
326
+ top: 0;
327
+ display: flex;
328
+ width: 0.5rem;
329
+ }
330
+
331
+ .ProseMirror table .column-resize-handle:before {
332
+ margin-left: 0.5rem;
333
+ height: 100%;
334
+ width: 1px;
335
+ background-color: rgba(0, 0, 0, 0.2);
336
+ }
337
+
338
+ .ProseMirror table .column-resize-handle:before {
339
+ content: "";
340
+ }
341
+
342
+ .ProseMirror table .selectedCell {
343
+ @apply border bg-muted/30;
344
+ border-style: double;
345
+ }
346
+
347
+ .ProseMirror table .grip-column,
348
+ .ProseMirror table .grip-row {
349
+ @apply bg-muted/50;
350
+ position: absolute;
351
+ z-index: 10;
352
+ display: flex;
353
+ cursor: pointer;
354
+ align-items: center;
355
+ justify-content: center;
356
+ }
357
+
358
+ .ProseMirror table .grip-column {
359
+ @apply border-l border-b;
360
+ left: 0;
361
+ top: -0.75rem;
362
+ margin-left: -1px;
363
+ height: 0.75rem;
364
+ width: calc(100% + 1px);
365
+ }
366
+
367
+ .ProseMirror table .grip-column.selected:before,
368
+ .ProseMirror table .grip-column:hover:before {
369
+ content: "";
370
+ width: 0.625rem;
371
+ }
372
+
373
+ .ProseMirror table .grip-column:hover {
374
+ @apply bg-muted;
375
+ }
376
+
377
+ .ProseMirror table .grip-column:hover:before {
378
+ @apply border-b-2 border-dotted border-foreground/40;
379
+ }
380
+
381
+ .ProseMirror table .grip-column.last {
382
+ border-top-right-radius: 0.125rem;
383
+ }
384
+
385
+ .ProseMirror table .grip-column.selected {
386
+ @apply shadow-sm border-border;
387
+ }
388
+
389
+ .ProseMirror table .grip-column.selected:before {
390
+ @apply border-b-2 border-dotted border-foreground/60;
391
+ }
392
+
393
+ .ProseMirror table .grip-column.first {
394
+ @apply border-l-transparent;
395
+ border-top-left-radius: 0.125rem;
396
+ }
397
+
398
+ .ProseMirror table .grip-row {
399
+ @apply border-t border-r;
400
+ left: -0.75rem;
401
+ top: 0;
402
+ margin-top: -1px;
403
+ height: calc(100% + 1px);
404
+ width: 0.75rem;
405
+ }
406
+
407
+ .ProseMirror table .grip-row.selected:before,
408
+ .ProseMirror table .grip-row:hover:before {
409
+ height: 0.625rem;
410
+ content: "";
411
+ }
412
+
413
+ .ProseMirror table .grip-row:hover {
414
+ @apply bg-muted;
415
+ }
416
+
417
+ .ProseMirror table .grip-row:hover:before {
418
+ @apply border-l-2 border-dotted border-foreground/40;
419
+ }
420
+
421
+ .ProseMirror table .grip-row.selected {
422
+ @apply shadow-sm border-border;
423
+ }
424
+
425
+ .ProseMirror table .grip-row.selected:before {
426
+ @apply border-l-2 border-dotted border-foreground/60;
427
+ }
428
+
429
+ .ProseMirror table .grip-row.first {
430
+ @apply border-t-transparent;
431
+ border-top-left-radius: 0.125rem;
432
+ }
433
+
434
+ .ProseMirror table .grip-row.last {
435
+ border-bottom-left-radius: 0.125rem;
436
+ }
437
+
438
+ /** 表格 end **/
439
+
440
+ /** 普通段落 start **/
441
+ .ProseMirror p {
442
+ margin-top: 1rem;
443
+ margin-bottom: 1rem;
444
+ line-height: 1.625;
445
+ }
446
+
447
+ .ProseMirror p:first-child {
448
+ margin-top: 0;
449
+ }
450
+
451
+ .ProseMirror p:last-child {
452
+ margin-bottom: 0;
453
+ }
454
+
455
+ /** 普通段落 end **/
456
+
457
+ .ProseMirror ol p,
458
+ .ProseMirror ul p {
459
+ margin-top: 0;
460
+ margin-bottom: 0.25rem;
461
+ }
462
+
463
+ /** 标题 start **/
464
+ .ProseMirror h1 {
465
+ font-size: 1.875rem;
466
+ line-height: 2.25rem;
467
+ }
468
+
469
+ .ProseMirror h2 {
470
+ font-size: 1.5rem;
471
+ line-height: 2rem;
472
+ }
473
+
474
+ .ProseMirror h3 {
475
+ font-size: 1.25rem;
476
+ line-height: 1.75rem;
477
+ }
478
+
479
+ .ProseMirror h4 {
480
+ font-size: 1.125rem;
481
+ line-height: 1.75rem;
482
+ }
483
+
484
+ .ProseMirror h5 {
485
+ font-size: 1rem;
486
+ line-height: 1.5rem;
487
+ }
488
+
489
+ .ProseMirror h6 {
490
+ font-size: 0.875rem;
491
+ line-height: 1.25rem;
492
+ }
493
+
494
+ .ProseMirror h1,
495
+ .ProseMirror h2,
496
+ .ProseMirror h3,
497
+ .ProseMirror h4,
498
+ .ProseMirror h5,
499
+ .ProseMirror h6 {
500
+ font-weight: 700;
501
+ }
502
+
503
+ .ProseMirror h1,
504
+ .ProseMirror h2,
505
+ .ProseMirror h3 {
506
+ margin-top: 1.5rem;
507
+ margin-bottom: 1.5rem;
508
+ }
509
+
510
+ .ProseMirror h4,
511
+ .ProseMirror h5,
512
+ .ProseMirror h6 {
513
+ margin-top: 1rem;
514
+ margin-bottom: 1rem;
515
+ }
516
+
517
+ /** 标题 end **/
518
+
519
+ .ProseMirror a.link {
520
+ @apply text-primary font-bold;
521
+ }
522
+
523
+ .ProseMirror mark {
524
+ border-radius: 0.125rem;
525
+ --tw-bg-opacity: 1;
526
+ background-color: rgb(239 68 68 / var(--tw-bg-opacity));
527
+ -webkit-box-decoration-break: clone;
528
+ box-decoration-break: clone;
529
+ padding: 0.25rem 0;
530
+ color: inherit;
531
+ }
532
+
533
+ .ProseMirror img {
534
+ height: auto;
535
+ width: 100%;
536
+ max-width: 100%;
537
+ }
538
+
539
+ .ProseMirror [data-type="horizontalRule"] {
540
+ margin-top: 1rem;
541
+ margin-bottom: 1rem;
542
+ cursor: pointer;
543
+ padding-top: 0.5rem;
544
+ padding-bottom: 0.5rem;
545
+ transition-property: all;
546
+ transition-duration: 0.1s;
547
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
548
+ animation-duration: 0.1s;
549
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
550
+ }
551
+
552
+ .ProseMirror [data-type="horizontalRule"]:first-child {
553
+ margin-top: 0;
554
+ }
555
+
556
+ .ProseMirror [data-type="horizontalRule"].ProseMirror-selectednode {
557
+ @apply bg-muted;
558
+ }
559
+
560
+ .ProseMirror [data-type="horizontalRule"].ProseMirror-selectednode hr {
561
+ @apply border-t border-foreground/50;
562
+ }
563
+
564
+ .ProseMirror
565
+ [data-type="horizontalRule"]:hover:not(.ProseMirror [data-type="horizontalRule"].ProseMirror-selectednode) {
566
+ @apply bg-muted/60;
567
+ }
568
+
569
+ .ProseMirror [data-type="horizontalRule"] hr {
570
+ @apply border-t border-foreground/30;
571
+ }
572
+
573
+ .ProseMirror {
574
+ z-index: 0;
575
+ caret-color: #000;
576
+ outline-width: 0;
577
+ }
578
+
579
+ .ProseMirror > * {
580
+ margin-left: auto;
581
+ margin-right: auto;
582
+ }
583
+
584
+ .ProseMirror .selection {
585
+ display: inline;
586
+ }
587
+
588
+ .ProseMirror > .react-renderer {
589
+ margin-top: 1rem;
590
+ margin-bottom: 1rem;
591
+ }
592
+
593
+ .ProseMirror > .react-renderer:first-child {
594
+ margin-top: 0;
595
+ }
596
+
597
+ .ProseMirror > .react-renderer:last-child {
598
+ margin-bottom: 0;
599
+ }
600
+
601
+ .ProseMirror.resize-cursor {
602
+ cursor: col-resize;
603
+ }
604
+
605
+ .ProseMirror .ProseMirror-gapcursor {
606
+ position: relative;
607
+ margin-left: auto;
608
+ margin-right: auto;
609
+ width: 100%;
610
+ max-width: 42rem;
611
+ }
612
+
613
+ .ProseMirror .ProseMirror-gapcursor:after {
614
+ top: -1.5em;
615
+ left: 0;
616
+ right: 0;
617
+ margin-left: auto;
618
+ margin-right: auto;
619
+ width: 100%;
620
+ max-width: 42rem;
621
+ border-top-color: rgba(0, 0, 0, 0.4);
622
+ }
623
+
624
+ [data-theme="slash-command"] {
625
+ width: 1000vw;
626
+ }
@@ -0,0 +1,73 @@
1
+ import { mergeAttributes } from "@tiptap/core";
2
+
3
+ import { Figure } from "../figure";
4
+ import { Quote } from "./Quote";
5
+ import { QuoteCaption } from "./QuoteCaption";
6
+
7
+ declare module "@tiptap/core" {
8
+ interface Commands<ReturnType> {
9
+ blockquoteFigure: {
10
+ setBlockquote: () => ReturnType;
11
+ };
12
+ }
13
+ }
14
+
15
+ export const BlockquoteFigure = Figure.extend({
16
+ name: "blockquoteFigure",
17
+
18
+ group: "block",
19
+
20
+ content: "quote quoteCaption",
21
+
22
+ isolating: true,
23
+
24
+ addExtensions() {
25
+ return [Quote, QuoteCaption];
26
+ },
27
+
28
+ renderHTML({ HTMLAttributes }) {
29
+ return ["figure", mergeAttributes(HTMLAttributes, { "data-type": this.name }), ["div", {}, 0]];
30
+ },
31
+
32
+ addKeyboardShortcuts() {
33
+ return {
34
+ Enter: () => false,
35
+ };
36
+ },
37
+
38
+ addAttributes() {
39
+ return {
40
+ ...this.parent?.(),
41
+ };
42
+ },
43
+
44
+ addCommands() {
45
+ return {
46
+ setBlockquote:
47
+ () =>
48
+ ({ state, chain }) => {
49
+ const position = state.selection.$from.start();
50
+ const selectionContent = state.selection.content();
51
+
52
+ return chain()
53
+ .focus()
54
+ .insertContent({
55
+ type: this.name,
56
+ content: [
57
+ {
58
+ type: "quote",
59
+ content: selectionContent.content.toJSON() || [],
60
+ },
61
+ {
62
+ type: "quoteCaption",
63
+ },
64
+ ],
65
+ })
66
+ .focus(position + 1)
67
+ .run();
68
+ },
69
+ };
70
+ },
71
+ });
72
+
73
+ export default BlockquoteFigure;
@@ -0,0 +1,31 @@
1
+ import { Node } from "@tiptap/core";
2
+
3
+ export const Quote = Node.create({
4
+ name: "quote",
5
+
6
+ content: "text*",
7
+
8
+ defining: true,
9
+
10
+ marks: "",
11
+
12
+ parseHTML() {
13
+ return [
14
+ {
15
+ tag: "blockquote",
16
+ },
17
+ ];
18
+ },
19
+
20
+ renderHTML({ HTMLAttributes }) {
21
+ return ["blockquote", HTMLAttributes, 0];
22
+ },
23
+
24
+ addKeyboardShortcuts() {
25
+ return {
26
+ Backspace: () => false,
27
+ };
28
+ },
29
+ });
30
+
31
+ export default Quote;
@@ -0,0 +1 @@
1
+ export { Quote } from "./Quote";