react-next-editor-js 0.1.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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +877 -0
  3. package/dist/chunk-3QWXTDLY.cjs +486 -0
  4. package/dist/chunk-3QWXTDLY.cjs.map +1 -0
  5. package/dist/chunk-5F6SPYCN.cjs +180 -0
  6. package/dist/chunk-5F6SPYCN.cjs.map +1 -0
  7. package/dist/chunk-6NTSXJX4.js +174 -0
  8. package/dist/chunk-6NTSXJX4.js.map +1 -0
  9. package/dist/chunk-7VYJDBH7.js +261 -0
  10. package/dist/chunk-7VYJDBH7.js.map +1 -0
  11. package/dist/chunk-DBSFCCBG.cjs +1712 -0
  12. package/dist/chunk-DBSFCCBG.cjs.map +1 -0
  13. package/dist/chunk-EFE6RHDL.cjs +4 -0
  14. package/dist/chunk-EFE6RHDL.cjs.map +1 -0
  15. package/dist/chunk-G6YRIEK4.js +3 -0
  16. package/dist/chunk-G6YRIEK4.js.map +1 -0
  17. package/dist/chunk-GFNFJ3FL.cjs +119 -0
  18. package/dist/chunk-GFNFJ3FL.cjs.map +1 -0
  19. package/dist/chunk-IG2YLUFW.js +114 -0
  20. package/dist/chunk-IG2YLUFW.js.map +1 -0
  21. package/dist/chunk-JQXTWLHL.js +176 -0
  22. package/dist/chunk-JQXTWLHL.js.map +1 -0
  23. package/dist/chunk-NJCEHQV3.cjs +454 -0
  24. package/dist/chunk-NJCEHQV3.cjs.map +1 -0
  25. package/dist/chunk-O4GTLC3T.js +478 -0
  26. package/dist/chunk-O4GTLC3T.js.map +1 -0
  27. package/dist/chunk-ODHABIIC.cjs +82 -0
  28. package/dist/chunk-ODHABIIC.cjs.map +1 -0
  29. package/dist/chunk-PZ5AY32C.js +9 -0
  30. package/dist/chunk-PZ5AY32C.js.map +1 -0
  31. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  32. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  33. package/dist/chunk-QIUIYBCZ.js +80 -0
  34. package/dist/chunk-QIUIYBCZ.js.map +1 -0
  35. package/dist/chunk-QROUNVQK.js +450 -0
  36. package/dist/chunk-QROUNVQK.js.map +1 -0
  37. package/dist/chunk-T6FR37IC.js +41 -0
  38. package/dist/chunk-T6FR37IC.js.map +1 -0
  39. package/dist/chunk-TI44I654.cjs +265 -0
  40. package/dist/chunk-TI44I654.cjs.map +1 -0
  41. package/dist/chunk-TXPLBAH5.cjs +47 -0
  42. package/dist/chunk-TXPLBAH5.cjs.map +1 -0
  43. package/dist/chunk-U3O54IYI.cjs +187 -0
  44. package/dist/chunk-U3O54IYI.cjs.map +1 -0
  45. package/dist/chunk-VLC7SZMT.js +1669 -0
  46. package/dist/chunk-VLC7SZMT.js.map +1 -0
  47. package/dist/core/index.cjs +232 -0
  48. package/dist/core/index.cjs.map +1 -0
  49. package/dist/core/index.d.cts +122 -0
  50. package/dist/core/index.d.ts +122 -0
  51. package/dist/core/index.js +7 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/defaults-EQD5QKCU.js +4 -0
  54. package/dist/defaults-EQD5QKCU.js.map +1 -0
  55. package/dist/defaults-MLYXD2BG.cjs +49 -0
  56. package/dist/defaults-MLYXD2BG.cjs.map +1 -0
  57. package/dist/docx-BUrf4PFj.d.ts +49 -0
  58. package/dist/docx-DLfSdvXm.d.cts +49 -0
  59. package/dist/docx-LDETXV3L.js +5 -0
  60. package/dist/docx-LDETXV3L.js.map +1 -0
  61. package/dist/docx-N2LKIOK3.cjs +14 -0
  62. package/dist/docx-N2LKIOK3.cjs.map +1 -0
  63. package/dist/export/index.cjs +54 -0
  64. package/dist/export/index.cjs.map +1 -0
  65. package/dist/export/index.d.cts +60 -0
  66. package/dist/export/index.d.ts +60 -0
  67. package/dist/export/index.js +9 -0
  68. package/dist/export/index.js.map +1 -0
  69. package/dist/html-5BXJPQU3.js +7 -0
  70. package/dist/html-5BXJPQU3.js.map +1 -0
  71. package/dist/html-KU2KHLRF.cjs +24 -0
  72. package/dist/html-KU2KHLRF.cjs.map +1 -0
  73. package/dist/import/index.cjs +15 -0
  74. package/dist/import/index.cjs.map +1 -0
  75. package/dist/import/index.d.cts +37 -0
  76. package/dist/import/index.d.ts +37 -0
  77. package/dist/import/index.js +6 -0
  78. package/dist/import/index.js.map +1 -0
  79. package/dist/index.cjs +1035 -0
  80. package/dist/index.cjs.map +1 -0
  81. package/dist/index.d.cts +248 -0
  82. package/dist/index.d.ts +248 -0
  83. package/dist/index.js +885 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/persistence/index.cjs +37 -0
  86. package/dist/persistence/index.cjs.map +1 -0
  87. package/dist/persistence/index.d.cts +279 -0
  88. package/dist/persistence/index.d.ts +279 -0
  89. package/dist/persistence/index.js +4 -0
  90. package/dist/persistence/index.js.map +1 -0
  91. package/dist/sanitize-7IZ-SW1f.d.ts +361 -0
  92. package/dist/sanitize-CvmgqbsA.d.cts +361 -0
  93. package/dist/server/index.cjs +400 -0
  94. package/dist/server/index.cjs.map +1 -0
  95. package/dist/server/index.d.cts +229 -0
  96. package/dist/server/index.d.ts +229 -0
  97. package/dist/server/index.js +390 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/styles.css +680 -0
  100. package/dist/types-B4z0Quvv.d.cts +193 -0
  101. package/dist/types-B4z0Quvv.d.ts +193 -0
  102. package/package.json +183 -0
@@ -0,0 +1,680 @@
1
+ /**
2
+ * react-next-editor stylesheet.
3
+ *
4
+ * Theming is driven entirely by CSS custom properties (F-10.5); override any
5
+ * `--rne-*` token on `.rne-root` (or a parent) to restyle without forking. All
6
+ * selectors are scoped under `.rne-root` so multiple instances and the host app
7
+ * never collide (F-10.10). Fully responsive (mobile → desktop).
8
+ */
9
+
10
+ .rne-root {
11
+ /* ---- Design tokens (override to theme) ---- */
12
+ --rne-font-family: 'Times New Roman', Georgia, serif;
13
+ --rne-font-size: 12pt;
14
+ --rne-text-color: #1a1a1a;
15
+ --rne-background: #f3f4f6;
16
+ --rne-canvas-background: #f3f4f6;
17
+ --rne-page-background: #ffffff;
18
+ --rne-accent: #df4a36;
19
+ --rne-toolbar-background: #ffffff;
20
+ --rne-toolbar-color: #2c2c2c;
21
+ --rne-toolbar-active-background: #fde8e4;
22
+ --rne-border-color: #d8dadf;
23
+ --rne-border-radius: 6px;
24
+ --rne-selection-color: #b9d4ff;
25
+ --rne-page-width: 210mm;
26
+ --rne-page-padding: 25.4mm;
27
+ --rne-toolbar-height: 44px;
28
+
29
+ display: flex;
30
+ flex-direction: column;
31
+ width: 100%;
32
+ height: 100%;
33
+ min-height: 0;
34
+ color: var(--rne-text-color);
35
+ background: var(--rne-background);
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ .rne-root *,
40
+ .rne-root *::before,
41
+ .rne-root *::after {
42
+ box-sizing: border-box;
43
+ }
44
+
45
+ /* ---- Toolbar ---- */
46
+ .rne-toolbar {
47
+ display: flex;
48
+ flex-wrap: wrap;
49
+ align-items: center;
50
+ gap: 2px;
51
+ padding: 4px 6px;
52
+ background: var(--rne-toolbar-background);
53
+ color: var(--rne-toolbar-color);
54
+ border-bottom: 1px solid var(--rne-border-color);
55
+ min-height: var(--rne-toolbar-height);
56
+ }
57
+
58
+ .rne-toolbar--sticky {
59
+ position: sticky;
60
+ top: 0;
61
+ z-index: 5;
62
+ }
63
+
64
+ .rne-toolbar-group {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 1px;
68
+ }
69
+
70
+ .rne-toolbar-separator {
71
+ width: 1px;
72
+ align-self: stretch;
73
+ margin: 4px 4px;
74
+ background: var(--rne-border-color);
75
+ }
76
+
77
+ .rne-btn {
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ gap: 4px;
82
+ min-width: 30px;
83
+ height: 30px;
84
+ padding: 0 6px;
85
+ border: 1px solid transparent;
86
+ border-radius: var(--rne-border-radius);
87
+ background: transparent;
88
+ color: inherit;
89
+ font: inherit;
90
+ font-size: 14px;
91
+ line-height: 1;
92
+ cursor: pointer;
93
+ user-select: none;
94
+ transition: background-color 0.12s ease, border-color 0.12s ease;
95
+ }
96
+
97
+ .rne-btn:hover:not(:disabled) {
98
+ background: rgba(0, 0, 0, 0.06);
99
+ }
100
+
101
+ .rne-btn:focus-visible {
102
+ outline: 2px solid var(--rne-accent);
103
+ outline-offset: 1px;
104
+ }
105
+
106
+ .rne-btn--active {
107
+ background: var(--rne-toolbar-active-background);
108
+ border-color: var(--rne-accent);
109
+ color: var(--rne-accent);
110
+ }
111
+
112
+ .rne-btn:disabled {
113
+ opacity: 0.4;
114
+ cursor: not-allowed;
115
+ }
116
+
117
+ .rne-btn-icon {
118
+ width: 16px;
119
+ height: 16px;
120
+ display: inline-block;
121
+ fill: currentColor;
122
+ }
123
+
124
+ .rne-select {
125
+ height: 30px;
126
+ max-width: 150px;
127
+ padding: 0 4px;
128
+ border: 1px solid var(--rne-border-color);
129
+ border-radius: var(--rne-border-radius);
130
+ background: var(--rne-toolbar-background);
131
+ color: inherit;
132
+ font: inherit;
133
+ font-size: 13px;
134
+ cursor: pointer;
135
+ }
136
+
137
+ .rne-color-btn {
138
+ position: relative;
139
+ }
140
+
141
+ .rne-color-swatch {
142
+ display: block;
143
+ width: 16px;
144
+ height: 4px;
145
+ margin-top: 2px;
146
+ border-radius: 1px;
147
+ }
148
+
149
+ .rne-color-popover {
150
+ position: absolute;
151
+ top: 100%;
152
+ left: 0;
153
+ z-index: 20;
154
+ display: grid;
155
+ grid-template-columns: repeat(8, 1fr);
156
+ gap: 4px;
157
+ margin-top: 2px;
158
+ padding: 8px;
159
+ background: var(--rne-toolbar-background);
160
+ border: 1px solid var(--rne-border-color);
161
+ border-radius: var(--rne-border-radius);
162
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);
163
+ }
164
+
165
+ .rne-color-cell {
166
+ width: 18px;
167
+ height: 18px;
168
+ border: 1px solid rgba(0, 0, 0, 0.15);
169
+ border-radius: 3px;
170
+ cursor: pointer;
171
+ padding: 0;
172
+ }
173
+
174
+ .rne-color-cell:hover {
175
+ transform: scale(1.12);
176
+ }
177
+
178
+ /* ---- Canvas + page surface (single-flow model, G-1 = A) ---- */
179
+ .rne-canvas {
180
+ flex: 1 1 auto;
181
+ min-height: 0;
182
+ overflow: auto;
183
+ background: var(--rne-canvas-background);
184
+ padding: 24px 16px;
185
+ display: flex;
186
+ justify-content: center;
187
+ -webkit-overflow-scrolling: touch;
188
+ }
189
+
190
+ .rne-page {
191
+ width: var(--rne-page-width);
192
+ max-width: 100%;
193
+ min-height: 60vh;
194
+ padding: var(--rne-page-padding);
195
+ background: var(--rne-page-background);
196
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12), 0 8px 24px rgba(0, 0, 0, 0.08);
197
+ border-radius: 2px;
198
+ }
199
+
200
+ .rne-canvas--plain {
201
+ padding: 0;
202
+ }
203
+
204
+ .rne-canvas--plain .rne-page {
205
+ box-shadow: none;
206
+ border-radius: 0;
207
+ padding: 16px;
208
+ }
209
+
210
+ /* ---- Visual pagination (G-1 = B): discrete on-screen page sheets ---- */
211
+ .rne-canvas--paged {
212
+ align-items: flex-start;
213
+ /* `safe` centring keeps the left edge reachable when the page (fixed width)
214
+ is wider than the viewport, so the canvas scrolls horizontally instead of
215
+ clipping (responsive on small screens). */
216
+ justify-content: safe center;
217
+ }
218
+
219
+ .rne-paged {
220
+ position: relative;
221
+ width: var(--rne-page-w, 794px);
222
+ flex: 0 0 auto;
223
+ margin: 0 auto;
224
+ }
225
+
226
+ /* Background layer: white page sheets + repeating header/footer, drawn behind. */
227
+ .rne-page-bg {
228
+ position: absolute;
229
+ top: 0;
230
+ left: 0;
231
+ width: var(--rne-page-w, 794px);
232
+ z-index: 0;
233
+ pointer-events: none;
234
+ }
235
+
236
+ .rne-page-sheet {
237
+ position: absolute;
238
+ left: 0;
239
+ background: var(--rne-page-background, #fff);
240
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12), 0 8px 24px rgba(0, 0, 0, 0.08);
241
+ }
242
+
243
+ .rne-page-header,
244
+ .rne-page-footer {
245
+ font-size: 10pt;
246
+ color: #6b7280;
247
+ white-space: nowrap;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+
252
+ /* Content layer sits above the sheets, inset by the page margins. */
253
+ .rne-mount--paged {
254
+ position: relative;
255
+ z-index: 1;
256
+ }
257
+
258
+ .rne-mount--paged .ProseMirror {
259
+ position: relative;
260
+ z-index: 1;
261
+ box-sizing: content-box;
262
+ width: var(--rne-content-w, 743px);
263
+ padding-top: var(--rne-mt, 96px);
264
+ padding-left: var(--rne-ml, 96px);
265
+ padding-right: 0;
266
+ padding-bottom: 0;
267
+ }
268
+
269
+ /* Transparent spacers create the visual gap between pages (sheets show through).
270
+ Rendered as a block-level element so they break the inline flow cleanly at a
271
+ block boundary or inside a paragraph (line-level split). */
272
+ .rne-page-spacer {
273
+ display: block;
274
+ width: 100%;
275
+ user-select: none;
276
+ pointer-events: none;
277
+ }
278
+
279
+ /* Spacer that splits a paragraph mid-block: must not be selectable or carry a
280
+ caret, and must collapse to nothing horizontally. */
281
+ .rne-page-spacer--inline {
282
+ margin: 0;
283
+ padding: 0;
284
+ }
285
+
286
+ /* ---- ProseMirror base (inlined so consumers import only this stylesheet) ---- */
287
+ .rne-root .ProseMirror {
288
+ position: relative;
289
+ word-wrap: break-word;
290
+ white-space: pre-wrap;
291
+ -webkit-font-variant-ligatures: none;
292
+ font-variant-ligatures: none;
293
+ font-feature-settings: 'liga' 0;
294
+ }
295
+
296
+ .rne-root .ProseMirror pre {
297
+ white-space: pre-wrap;
298
+ }
299
+
300
+ .rne-root .ProseMirror li {
301
+ position: relative;
302
+ }
303
+
304
+ .rne-root .ProseMirror-hideselection *::selection {
305
+ background: transparent;
306
+ }
307
+
308
+ .rne-root .ProseMirror-hideselection {
309
+ caret-color: transparent;
310
+ }
311
+
312
+ .rne-root .ProseMirror [draggable][contenteditable='false'] {
313
+ user-select: text;
314
+ }
315
+
316
+ .rne-root .ProseMirror-selectednode {
317
+ outline: 2px solid var(--rne-accent);
318
+ }
319
+
320
+ .rne-root .ProseMirror li.ProseMirror-selectednode {
321
+ outline: none;
322
+ }
323
+
324
+ .rne-root .ProseMirror .tableWrapper {
325
+ overflow-x: auto;
326
+ margin: 0 0 0.8em;
327
+ }
328
+
329
+ /* ---- Editing surface (ProseMirror owns this DOM) ---- */
330
+ .rne-root .ProseMirror {
331
+ outline: none;
332
+ font-family: var(--rne-font-family);
333
+ font-size: var(--rne-font-size);
334
+ line-height: 1.5;
335
+ color: var(--rne-text-color);
336
+ }
337
+
338
+ .rne-root .ProseMirror[contenteditable='false'] {
339
+ cursor: default;
340
+ }
341
+
342
+ .rne-root .ProseMirror ::selection {
343
+ background: var(--rne-selection-color);
344
+ }
345
+
346
+ .rne-root .ProseMirror p {
347
+ margin: 0 0 0.55em;
348
+ }
349
+
350
+ .rne-root .ProseMirror h1,
351
+ .rne-root .ProseMirror h2,
352
+ .rne-root .ProseMirror h3,
353
+ .rne-root .ProseMirror h4,
354
+ .rne-root .ProseMirror h5,
355
+ .rne-root .ProseMirror h6 {
356
+ margin: 0.6em 0 0.35em;
357
+ line-height: 1.25;
358
+ font-weight: 700;
359
+ }
360
+
361
+ .rne-root .ProseMirror h1 { font-size: 2em; }
362
+ .rne-root .ProseMirror h2 { font-size: 1.6em; }
363
+ .rne-root .ProseMirror h3 { font-size: 1.3em; }
364
+ .rne-root .ProseMirror h4 { font-size: 1.15em; }
365
+ .rne-root .ProseMirror h5 { font-size: 1em; }
366
+ .rne-root .ProseMirror h6 { font-size: 0.9em; }
367
+
368
+ .rne-root .ProseMirror a {
369
+ color: var(--rne-accent);
370
+ text-decoration: underline;
371
+ }
372
+
373
+ .rne-root .ProseMirror ul,
374
+ .rne-root .ProseMirror ol {
375
+ margin: 0 0 0.55em;
376
+ padding-left: 1.7em;
377
+ }
378
+
379
+ .rne-root .ProseMirror blockquote.rne-blockquote {
380
+ margin: 0 0 0.6em;
381
+ padding-left: 1em;
382
+ border-left: 3px solid var(--rne-border-color);
383
+ color: #555;
384
+ }
385
+
386
+ .rne-root .ProseMirror hr.rne-hr {
387
+ border: none;
388
+ border-top: 1px solid var(--rne-border-color);
389
+ margin: 1em 0;
390
+ }
391
+
392
+ .rne-root .ProseMirror code.rne-inline-code {
393
+ font-family: 'Courier New', monospace;
394
+ font-size: 0.92em;
395
+ background: rgba(0, 0, 0, 0.06);
396
+ border-radius: 3px;
397
+ padding: 0 3px;
398
+ }
399
+
400
+ .rne-root .ProseMirror img.rne-image {
401
+ max-width: 100%;
402
+ height: auto;
403
+ vertical-align: baseline;
404
+ }
405
+
406
+ .rne-root .ProseMirror img.ProseMirror-selectednode {
407
+ outline: 2px solid var(--rne-accent);
408
+ }
409
+
410
+ /* Page break */
411
+ .rne-root .ProseMirror .rne-page-break {
412
+ height: 0;
413
+ margin: 1.2em 0;
414
+ border-top: 2px dashed var(--rne-accent);
415
+ position: relative;
416
+ }
417
+
418
+ .rne-root .ProseMirror .rne-page-break::after {
419
+ content: 'Page break';
420
+ position: absolute;
421
+ top: -0.75em;
422
+ right: 0;
423
+ font-size: 10px;
424
+ color: var(--rne-accent);
425
+ background: var(--rne-page-background);
426
+ padding: 0 4px;
427
+ }
428
+
429
+ /* Task lists */
430
+ .rne-root .ProseMirror ul.rne-task-list {
431
+ list-style: none;
432
+ padding-left: 0.3em;
433
+ }
434
+
435
+ .rne-root .ProseMirror li.rne-task-item {
436
+ display: flex;
437
+ align-items: flex-start;
438
+ gap: 0.5em;
439
+ }
440
+
441
+ .rne-root .ProseMirror .rne-task-checkbox {
442
+ flex: 0 0 auto;
443
+ width: 16px;
444
+ height: 16px;
445
+ margin-top: 0.2em;
446
+ border: 1.5px solid #888;
447
+ border-radius: 3px;
448
+ cursor: pointer;
449
+ background: #fff;
450
+ }
451
+
452
+ .rne-root .ProseMirror li[data-checked='true'] > .rne-task-checkbox {
453
+ background: var(--rne-accent);
454
+ border-color: var(--rne-accent);
455
+ position: relative;
456
+ }
457
+
458
+ .rne-root .ProseMirror li[data-checked='true'] > .rne-task-checkbox::after {
459
+ content: '';
460
+ position: absolute;
461
+ left: 4px;
462
+ top: 1px;
463
+ width: 4px;
464
+ height: 8px;
465
+ border: solid #fff;
466
+ border-width: 0 2px 2px 0;
467
+ transform: rotate(45deg);
468
+ }
469
+
470
+ .rne-root .ProseMirror li[data-checked='true'] > .rne-task-content {
471
+ text-decoration: line-through;
472
+ color: #888;
473
+ }
474
+
475
+ .rne-root .ProseMirror .rne-task-content {
476
+ flex: 1 1 auto;
477
+ }
478
+
479
+ /* Tables */
480
+ .rne-root .ProseMirror table {
481
+ border-collapse: collapse;
482
+ table-layout: fixed;
483
+ width: 100%;
484
+ margin: 0 0 0.8em;
485
+ overflow: hidden;
486
+ }
487
+
488
+ .rne-root .ProseMirror td,
489
+ .rne-root .ProseMirror th {
490
+ border: 1px solid #b6b9c0;
491
+ padding: 5px 8px;
492
+ vertical-align: top;
493
+ position: relative;
494
+ }
495
+
496
+ .rne-root .ProseMirror th {
497
+ background: #f0f1f4;
498
+ font-weight: 700;
499
+ text-align: left;
500
+ }
501
+
502
+ .rne-root .ProseMirror .selectedCell::after {
503
+ content: '';
504
+ position: absolute;
505
+ inset: 0;
506
+ background: rgba(64, 132, 255, 0.18);
507
+ pointer-events: none;
508
+ }
509
+
510
+ .rne-root .ProseMirror .column-resize-handle {
511
+ position: absolute;
512
+ right: -2px;
513
+ top: 0;
514
+ bottom: 0;
515
+ width: 4px;
516
+ background: var(--rne-accent);
517
+ cursor: col-resize;
518
+ }
519
+
520
+ .rne-root .ProseMirror.resize-cursor {
521
+ cursor: col-resize;
522
+ }
523
+
524
+ /* Placeholder */
525
+ .rne-root .ProseMirror .rne-empty:first-child::before {
526
+ content: attr(data-placeholder);
527
+ color: #9aa0a6;
528
+ pointer-events: none;
529
+ height: 0;
530
+ float: left;
531
+ }
532
+
533
+ /* Gapcursor */
534
+ .rne-root .ProseMirror-gapcursor {
535
+ display: none;
536
+ pointer-events: none;
537
+ position: absolute;
538
+ }
539
+
540
+ .rne-root .ProseMirror-gapcursor:after {
541
+ content: '';
542
+ display: block;
543
+ position: absolute;
544
+ top: -2px;
545
+ width: 20px;
546
+ border-top: 1px solid black;
547
+ animation: rne-blink 1.1s steps(2, start) infinite;
548
+ }
549
+
550
+ @keyframes rne-blink {
551
+ to {
552
+ visibility: hidden;
553
+ }
554
+ }
555
+
556
+ /* Status bar */
557
+ .rne-statusbar {
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: space-between;
561
+ gap: 12px;
562
+ padding: 3px 10px;
563
+ font-size: 12px;
564
+ color: #5f6368;
565
+ background: var(--rne-toolbar-background);
566
+ border-top: 1px solid var(--rne-border-color);
567
+ }
568
+
569
+ .rne-status-badge {
570
+ display: inline-flex;
571
+ align-items: center;
572
+ gap: 5px;
573
+ }
574
+
575
+ .rne-status-dot {
576
+ width: 8px;
577
+ height: 8px;
578
+ border-radius: 50%;
579
+ background: #9aa0a6;
580
+ }
581
+
582
+ .rne-status-dot--savedLocal,
583
+ .rne-status-dot--savingLocal { background: #f4b400; }
584
+ .rne-status-dot--synced { background: #34a853; }
585
+ .rne-status-dot--syncing { background: #4285f4; }
586
+ .rne-status-dot--syncFailed { background: var(--rne-accent); }
587
+ .rne-status-dot--offline { background: #9aa0a6; }
588
+
589
+ /* Error fallback (error boundary) */
590
+ .rne-error {
591
+ padding: 24px;
592
+ margin: 16px;
593
+ border: 1px solid var(--rne-accent);
594
+ border-radius: var(--rne-border-radius);
595
+ background: #fff5f3;
596
+ color: #7a1e10;
597
+ }
598
+
599
+ .rne-error button {
600
+ margin-top: 12px;
601
+ padding: 6px 14px;
602
+ border: 1px solid var(--rne-accent);
603
+ border-radius: var(--rne-border-radius);
604
+ background: var(--rne-accent);
605
+ color: #fff;
606
+ cursor: pointer;
607
+ }
608
+
609
+ /* ---- Responsive ---- */
610
+ @media (max-width: 768px) {
611
+ .rne-canvas {
612
+ padding: 12px 8px;
613
+ }
614
+ .rne-page {
615
+ --rne-page-padding: 16px;
616
+ width: 100%;
617
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
618
+ }
619
+ .rne-toolbar {
620
+ flex-wrap: nowrap;
621
+ overflow-x: auto;
622
+ scrollbar-width: thin;
623
+ }
624
+ .rne-select {
625
+ max-width: 110px;
626
+ }
627
+ }
628
+
629
+ @media (max-width: 480px) {
630
+ .rne-page {
631
+ --rne-page-padding: 12px;
632
+ }
633
+ .rne-btn {
634
+ min-width: 28px;
635
+ height: 28px;
636
+ }
637
+ }
638
+
639
+ /* ---- Print ---- */
640
+ @media print {
641
+ .rne-toolbar,
642
+ .rne-statusbar {
643
+ display: none !important;
644
+ }
645
+ .rne-root,
646
+ .rne-canvas {
647
+ background: #fff;
648
+ overflow: visible;
649
+ padding: 0;
650
+ display: block;
651
+ }
652
+ .rne-page {
653
+ box-shadow: none;
654
+ width: auto;
655
+ border-radius: 0;
656
+ }
657
+ .rne-root .ProseMirror .rne-page-break {
658
+ border: none;
659
+ break-after: page;
660
+ page-break-after: always;
661
+ }
662
+ .rne-root .ProseMirror .rne-page-break::after {
663
+ display: none;
664
+ }
665
+ /* In print, the browser paginates natively via @page — drop the on-screen
666
+ pagination overlay so it doesn't add phantom gaps. */
667
+ .rne-page-bg {
668
+ display: none !important;
669
+ }
670
+ .rne-page-spacer {
671
+ display: none !important;
672
+ }
673
+ .rne-mount--paged .ProseMirror {
674
+ width: auto;
675
+ padding: 0;
676
+ }
677
+ .rne-paged {
678
+ width: auto;
679
+ }
680
+ }