@jacshuo/onyx 2.1.0 → 2.3.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 (135) hide show
  1. package/README.md +358 -361
  2. package/dist/Chart/BarChart.cjs +1 -1
  3. package/dist/Chart/BarChart.js +1 -1
  4. package/dist/Chart/PieChart.cjs +1 -1
  5. package/dist/Chart/PieChart.js +1 -1
  6. package/dist/Chart/ScatterChart.cjs +1 -1
  7. package/dist/Chart/ScatterChart.js +1 -1
  8. package/dist/Chart/index.cjs +1 -1
  9. package/dist/Chart/index.js +1 -1
  10. package/dist/DataDisplay/VirtualList.cjs +2 -0
  11. package/dist/DataDisplay/VirtualList.css +1 -0
  12. package/dist/DataDisplay/VirtualList.d.cts +5 -0
  13. package/dist/DataDisplay/VirtualList.d.ts +5 -0
  14. package/dist/DataDisplay/VirtualList.js +2 -0
  15. package/dist/DataDisplay/index.cjs +3 -2
  16. package/dist/DataDisplay/index.css +1 -0
  17. package/dist/DataDisplay/index.d.cts +5 -0
  18. package/dist/DataDisplay/index.d.ts +5 -0
  19. package/dist/DataDisplay/index.js +3 -2
  20. package/dist/Extras/DateTimePicker.cjs +1 -0
  21. package/dist/Extras/DateTimePicker.css +1 -0
  22. package/dist/Extras/DateTimePicker.d.cts +5 -0
  23. package/dist/Extras/DateTimePicker.d.ts +5 -0
  24. package/dist/Extras/DateTimePicker.js +1 -0
  25. package/dist/Extras/FileExplorer.cjs +2 -2
  26. package/dist/Extras/FileExplorer.js +2 -2
  27. package/dist/Extras/LoginPanel.cjs +1 -0
  28. package/dist/Extras/LoginPanel.css +1 -0
  29. package/dist/Extras/LoginPanel.d.cts +3 -0
  30. package/dist/Extras/LoginPanel.d.ts +3 -0
  31. package/dist/Extras/LoginPanel.js +1 -0
  32. package/dist/Extras/RichTextEditor.cjs +45 -0
  33. package/dist/Extras/RichTextEditor.css +1 -0
  34. package/dist/Extras/RichTextEditor.d.cts +10 -0
  35. package/dist/Extras/RichTextEditor.d.ts +10 -0
  36. package/dist/Extras/RichTextEditor.js +45 -0
  37. package/dist/Extras/index.cjs +48 -4
  38. package/dist/Extras/index.css +1 -1
  39. package/dist/Extras/index.d.cts +12 -0
  40. package/dist/Extras/index.d.ts +12 -0
  41. package/dist/Extras/index.js +48 -4
  42. package/dist/Forms/Form.cjs +1 -1
  43. package/dist/Forms/Form.js +1 -1
  44. package/dist/Forms/OTPInput.cjs +1 -0
  45. package/dist/Forms/OTPInput.css +1 -0
  46. package/dist/Forms/OTPInput.d.cts +4 -0
  47. package/dist/Forms/OTPInput.d.ts +4 -0
  48. package/dist/Forms/OTPInput.js +1 -0
  49. package/dist/Forms/Select.cjs +1 -1
  50. package/dist/Forms/Select.js +1 -1
  51. package/dist/Forms/index.cjs +1 -1
  52. package/dist/Forms/index.css +1 -0
  53. package/dist/Forms/index.d.cts +4 -0
  54. package/dist/Forms/index.d.ts +4 -0
  55. package/dist/Forms/index.js +1 -1
  56. package/dist/Layout/SplitPanel.cjs +1 -0
  57. package/dist/Layout/SplitPanel.d.cts +3 -0
  58. package/dist/Layout/SplitPanel.d.ts +3 -0
  59. package/dist/Layout/SplitPanel.js +1 -0
  60. package/dist/Layout/index.cjs +1 -1
  61. package/dist/Layout/index.d.cts +3 -0
  62. package/dist/Layout/index.d.ts +3 -0
  63. package/dist/Layout/index.js +1 -1
  64. package/dist/Navigation/Header.cjs +1 -1
  65. package/dist/Navigation/Header.js +1 -1
  66. package/dist/Navigation/RibbonBar.d.cts +3 -3
  67. package/dist/Navigation/RibbonBar.d.ts +3 -3
  68. package/dist/Navigation/SideNav.cjs +1 -1
  69. package/dist/Navigation/SideNav.js +1 -1
  70. package/dist/Navigation/index.cjs +2 -2
  71. package/dist/Navigation/index.d.cts +3 -3
  72. package/dist/Navigation/index.d.ts +3 -3
  73. package/dist/Navigation/index.js +2 -2
  74. package/dist/Primitives/Avatar.cjs +1 -1
  75. package/dist/Primitives/Avatar.js +1 -1
  76. package/dist/Primitives/Badge.cjs +1 -1
  77. package/dist/Primitives/Badge.js +1 -1
  78. package/dist/Primitives/Button.cjs +1 -1
  79. package/dist/Primitives/Button.js +1 -1
  80. package/dist/Primitives/Checkbox.cjs +1 -1
  81. package/dist/Primitives/Checkbox.js +1 -1
  82. package/dist/Primitives/Dropdown.cjs +1 -1
  83. package/dist/Primitives/Dropdown.js +1 -1
  84. package/dist/Primitives/DropdownButton.cjs +1 -1
  85. package/dist/Primitives/DropdownButton.js +1 -1
  86. package/dist/Primitives/Indicator.cjs +1 -1
  87. package/dist/Primitives/Indicator.js +1 -1
  88. package/dist/Primitives/Input.cjs +1 -1
  89. package/dist/Primitives/Input.js +1 -1
  90. package/dist/Primitives/Kbd.cjs +1 -0
  91. package/dist/Primitives/Kbd.css +0 -0
  92. package/dist/Primitives/Kbd.d.cts +6 -0
  93. package/dist/Primitives/Kbd.d.ts +6 -0
  94. package/dist/Primitives/Kbd.js +1 -0
  95. package/dist/Primitives/Label.cjs +1 -1
  96. package/dist/Primitives/Label.js +1 -1
  97. package/dist/Primitives/Radio.cjs +1 -1
  98. package/dist/Primitives/Radio.js +1 -1
  99. package/dist/Primitives/Rating.cjs +2 -0
  100. package/dist/Primitives/Rating.css +0 -0
  101. package/dist/Primitives/Rating.d.cts +4 -0
  102. package/dist/Primitives/Rating.d.ts +4 -0
  103. package/dist/Primitives/Rating.js +2 -0
  104. package/dist/Primitives/Slider.cjs +1 -1
  105. package/dist/Primitives/Slider.js +1 -1
  106. package/dist/Primitives/Switch.cjs +1 -1
  107. package/dist/Primitives/Switch.js +1 -1
  108. package/dist/Primitives/Tag.cjs +1 -1
  109. package/dist/Primitives/Tag.js +1 -1
  110. package/dist/Primitives/index.cjs +2 -1
  111. package/dist/Primitives/index.d.cts +10 -0
  112. package/dist/Primitives/index.d.ts +10 -0
  113. package/dist/Primitives/index.js +2 -1
  114. package/dist/_tsup-dts-rollup.d.cts +990 -3
  115. package/dist/_tsup-dts-rollup.d.ts +990 -3
  116. package/dist/index.cjs +49 -5
  117. package/dist/index.css +1 -1
  118. package/dist/index.d.cts +40 -0
  119. package/dist/index.d.ts +40 -0
  120. package/dist/index.js +49 -5
  121. package/dist/styles/DataDisplay/VirtualList.css +35 -0
  122. package/dist/styles/Extras/DateTimePicker.css +566 -0
  123. package/dist/styles/Extras/LoginPanel.css +16 -0
  124. package/dist/styles/Extras/RichTextEditor.css +908 -0
  125. package/dist/styles/Forms/OTPInput.css +11 -0
  126. package/dist/styles/Layout/SplitPanel.css +15 -0
  127. package/dist/styles/Primitives/Kbd.css +1 -0
  128. package/dist/styles/Primitives/Rating.css +1 -0
  129. package/dist/styles/base.css +312 -7
  130. package/dist/styles.css +770 -7
  131. package/dist/theme.cjs +1 -1
  132. package/dist/theme.d.cts +3 -0
  133. package/dist/theme.d.ts +3 -0
  134. package/dist/theme.js +1 -1
  135. package/package.json +21 -1
@@ -0,0 +1,908 @@
1
+ /* ── RichTextEditor ──────────────────────────────── */
2
+
3
+ .rte-root {
4
+ display: flex;
5
+ flex-direction: column;
6
+ border: 1px solid var(--color-primary-200);
7
+ border-radius: 0.5rem;
8
+ overflow: hidden;
9
+ background: var(--color-white, #fff);
10
+ }
11
+
12
+ .dark .rte-root {
13
+ border-color: var(--color-primary-700);
14
+ background: var(--color-primary-900);
15
+ }
16
+
17
+ /* toolbar ribbon sits at top */
18
+ .rte-ribbon {
19
+ border-bottom: 1px solid var(--color-primary-200);
20
+ flex-shrink: 0;
21
+ }
22
+
23
+ .dark .rte-ribbon {
24
+ border-bottom-color: var(--color-primary-700);
25
+ }
26
+
27
+ /* Body: flex row — editor pane + optional preview pane */
28
+ .rte-body {
29
+ display: flex;
30
+ flex-direction: row;
31
+ flex: 1 1 0;
32
+ overflow: hidden;
33
+ min-height: 0;
34
+ }
35
+
36
+ .rte-editor-pane {
37
+ flex: 1 1 auto;
38
+ overflow-y: auto;
39
+ overscroll-behavior-y: contain;
40
+ position: relative;
41
+ }
42
+
43
+ .rte-preview-pane {
44
+ flex: 0 0 50%;
45
+ max-width: 50%;
46
+ border-left: 1px solid var(--color-primary-200);
47
+ overflow-y: auto;
48
+ overscroll-behavior-y: contain;
49
+ padding: 1rem 1.25rem;
50
+ }
51
+
52
+ .dark .rte-preview-pane {
53
+ border-left-color: var(--color-primary-700);
54
+ }
55
+
56
+ /* On narrow screens stack editor above preview */
57
+ @media (max-width: 640px) {
58
+ .rte-body {
59
+ flex-direction: column;
60
+ }
61
+ .rte-preview-pane {
62
+ flex: 0 0 auto;
63
+ max-width: 100%;
64
+ border-left: none;
65
+ border-top: 1px solid var(--color-primary-200);
66
+ }
67
+ .dark .rte-preview-pane {
68
+ border-top-color: var(--color-primary-700);
69
+ }
70
+ }
71
+
72
+ /* ── Prose styles for preview pane ── */
73
+ .rte-preview-pane .prose {
74
+ font-size: 0.9rem;
75
+ line-height: 1.7;
76
+ color: var(--color-primary-800);
77
+ }
78
+
79
+ .dark .rte-preview-pane .prose {
80
+ color: var(--color-primary-100);
81
+ }
82
+
83
+ .rte-preview-pane .prose h1 { font-size: 1.75rem; font-weight: 700; margin: 0.75rem 0; }
84
+ .rte-preview-pane .prose h2 { font-size: 1.4rem; font-weight: 600; margin: 0.65rem 0; }
85
+ .rte-preview-pane .prose h3 { font-size: 1.15rem; font-weight: 600; margin: 0.5rem 0; }
86
+ .rte-preview-pane .prose h4 { font-size: 1rem; font-weight: 600; margin: 0.4rem 0; }
87
+
88
+ .rte-preview-pane .prose p { margin: 0.5rem 0; }
89
+
90
+ .rte-preview-pane .prose ul { list-style: disc; padding-left: 1.5rem; margin: 0.5rem 0; }
91
+ .rte-preview-pane .prose ol { list-style: decimal; padding-left: 1.5rem; margin: 0.5rem 0; }
92
+ .rte-preview-pane .prose li { margin: 0.2rem 0; }
93
+
94
+ .rte-preview-pane .prose a {
95
+ color: var(--color-primary-500);
96
+ text-decoration: underline;
97
+ }
98
+
99
+ .rte-preview-pane .prose code {
100
+ background: var(--color-primary-100);
101
+ border-radius: 0.25rem;
102
+ padding: 0.1em 0.35em;
103
+ font-family: ui-monospace, monospace;
104
+ font-size: 0.85em;
105
+ }
106
+
107
+ .dark .rte-preview-pane .prose code {
108
+ background: var(--color-primary-800);
109
+ }
110
+
111
+ .rte-preview-pane .prose pre {
112
+ background: var(--color-primary-900);
113
+ color: var(--color-primary-100);
114
+ border-radius: 0.5rem;
115
+ padding: 1rem;
116
+ overflow-x: auto;
117
+ font-family: ui-monospace, monospace;
118
+ font-size: 0.85em;
119
+ margin: 0.75rem 0;
120
+ }
121
+
122
+ .dark .rte-preview-pane .prose pre {
123
+ background: var(--color-primary-800);
124
+ }
125
+
126
+ .rte-preview-pane .prose blockquote {
127
+ border-left: 4px solid var(--color-primary-300);
128
+ padding-left: 1rem;
129
+ color: var(--color-primary-500);
130
+ margin: 0.75rem 0;
131
+ font-style: italic;
132
+ }
133
+
134
+ .dark .rte-preview-pane .prose blockquote {
135
+ border-left-color: var(--color-primary-600);
136
+ color: var(--color-primary-400);
137
+ }
138
+
139
+ .rte-preview-pane .prose table {
140
+ width: 100%;
141
+ border-collapse: collapse;
142
+ margin: 0.75rem 0;
143
+ }
144
+
145
+ .rte-preview-pane .prose th,
146
+ .rte-preview-pane .prose td {
147
+ border: 1px solid var(--color-primary-200);
148
+ padding: 0.4rem 0.75rem;
149
+ text-align: left;
150
+ }
151
+
152
+ .dark .rte-preview-pane .prose th,
153
+ .dark .rte-preview-pane .prose td {
154
+ border-color: var(--color-primary-700);
155
+ }
156
+
157
+ .rte-preview-pane .prose th {
158
+ background: var(--color-primary-50);
159
+ font-weight: 600;
160
+ }
161
+
162
+ .dark .rte-preview-pane .prose th {
163
+ background: var(--color-primary-800);
164
+ }
165
+
166
+ .rte-preview-pane .prose img {
167
+ max-width: 100%;
168
+ border-radius: 0.375rem;
169
+ }
170
+
171
+ .rte-preview-pane .prose hr {
172
+ border: none;
173
+ border-top: 1px solid var(--color-primary-200);
174
+ margin: 1rem 0;
175
+ }
176
+
177
+ .dark .rte-preview-pane .prose hr {
178
+ border-top-color: var(--color-primary-700);
179
+ }
180
+
181
+ /* ── Markdown source textarea ── */
182
+ .rte-markdown-source {
183
+ width: 100%;
184
+ height: 100%;
185
+ resize: none;
186
+ border: none;
187
+ outline: none;
188
+ padding: 1rem 1.25rem;
189
+ font-family: ui-monospace, "Cascadia Code", "Fira Code", monospace;
190
+ font-size: 0.875rem;
191
+ line-height: 1.65;
192
+ background: transparent;
193
+ color: var(--color-primary-900);
194
+ box-sizing: border-box;
195
+ }
196
+
197
+ .dark .rte-markdown-source {
198
+ color: var(--color-primary-100);
199
+ }
200
+
201
+ .rte-markdown-source::placeholder {
202
+ color: var(--color-primary-400);
203
+ }
204
+
205
+ /* ── Status bar ── */
206
+ .rte-statusbar {
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: space-between;
210
+ gap: 0.5rem;
211
+ padding: 0.2rem 0.75rem;
212
+ font-size: 0.7rem;
213
+ color: var(--color-primary-400);
214
+ border-top: 1px solid var(--color-primary-100);
215
+ flex-shrink: 0;
216
+ }
217
+
218
+ .dark .rte-statusbar {
219
+ border-top-color: var(--color-primary-800);
220
+ color: var(--color-primary-500);
221
+ }
222
+
223
+ .rte-statusbar-left {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 0.4rem;
227
+ }
228
+
229
+ .rte-statusbar-right {
230
+ display: flex;
231
+ align-items: center;
232
+ gap: 0.75rem;
233
+ }
234
+
235
+ .rte-statusbar-divider {
236
+ width: 1px;
237
+ height: 1rem;
238
+ background: var(--color-primary-200);
239
+ flex-shrink: 0;
240
+ }
241
+
242
+ .dark .rte-statusbar-divider {
243
+ background: var(--color-primary-700);
244
+ }
245
+
246
+ .rte-statusbar-label {
247
+ font-size: 0.68rem;
248
+ font-weight: 500;
249
+ color: var(--color-primary-500);
250
+ user-select: none;
251
+ }
252
+
253
+ .dark .rte-statusbar-label {
254
+ color: var(--color-primary-400);
255
+ }
256
+
257
+ /* ── ProseMirror editor area ── */
258
+ .ProseMirror {
259
+ outline: none;
260
+ padding: 0.875rem 1.25rem;
261
+ min-height: 180px;
262
+ caret-color: var(--color-primary-600);
263
+ color: var(--color-primary-900);
264
+ font-size: 0.9rem;
265
+ line-height: 1.7;
266
+ }
267
+
268
+ .dark .ProseMirror {
269
+ color: var(--color-primary-100);
270
+ }
271
+
272
+ .ProseMirror p {
273
+ margin: 0.4rem 0;
274
+ }
275
+
276
+ .ProseMirror h1 { font-size: 1.75rem; font-weight: 700; margin: 0.6rem 0; }
277
+ .ProseMirror h2 { font-size: 1.4rem; font-weight: 600; margin: 0.5rem 0; }
278
+ .ProseMirror h3 { font-size: 1.15rem; font-weight: 600; margin: 0.4rem 0; }
279
+ .ProseMirror h4 { font-size: 1rem; font-weight: 600; margin: 0.35rem 0; }
280
+
281
+ .ProseMirror ul { list-style: disc; padding-left: 1.5rem; margin: 0.4rem 0; }
282
+ .ProseMirror ol { list-style: decimal; padding-left: 1.5rem; margin: 0.4rem 0; }
283
+
284
+ .ProseMirror a {
285
+ color: var(--color-primary-500);
286
+ text-decoration: underline;
287
+ cursor: pointer;
288
+ }
289
+
290
+ .ProseMirror code {
291
+ background: var(--color-primary-100);
292
+ border-radius: 0.25rem;
293
+ padding: 0.1em 0.35em;
294
+ font-family: ui-monospace, monospace;
295
+ font-size: 0.85em;
296
+ }
297
+
298
+ .dark .ProseMirror code {
299
+ background: var(--color-primary-800);
300
+ }
301
+
302
+ .ProseMirror pre {
303
+ background: var(--color-primary-900);
304
+ color: var(--color-primary-100);
305
+ border-radius: 0.5rem;
306
+ padding: 0.875rem 1rem;
307
+ overflow-x: auto;
308
+ font-family: ui-monospace, monospace;
309
+ font-size: 0.85em;
310
+ margin: 0.5rem 0;
311
+ }
312
+
313
+ .dark .ProseMirror pre {
314
+ background: var(--color-primary-800);
315
+ }
316
+
317
+ .ProseMirror blockquote {
318
+ border-left: 4px solid var(--color-primary-300);
319
+ padding-left: 1rem;
320
+ color: var(--color-primary-500);
321
+ margin: 0.5rem 0;
322
+ font-style: italic;
323
+ }
324
+
325
+ .dark .ProseMirror blockquote {
326
+ border-left-color: var(--color-primary-600);
327
+ color: var(--color-primary-400);
328
+ }
329
+
330
+ .ProseMirror table {
331
+ border-collapse: collapse;
332
+ margin: 0.5rem 0;
333
+ width: 100%;
334
+ }
335
+
336
+ .ProseMirror th,
337
+ .ProseMirror td {
338
+ border: 1px solid var(--color-primary-200);
339
+ padding: 0.35rem 0.6rem;
340
+ text-align: left;
341
+ vertical-align: top;
342
+ }
343
+
344
+ .dark .ProseMirror th,
345
+ .dark .ProseMirror td {
346
+ border-color: var(--color-primary-700);
347
+ }
348
+
349
+ .ProseMirror th {
350
+ background: var(--color-primary-50);
351
+ font-weight: 600;
352
+ }
353
+
354
+ .dark .ProseMirror th {
355
+ background: var(--color-primary-800);
356
+ }
357
+
358
+ .ProseMirror img {
359
+ max-width: 100%;
360
+ border-radius: 0.375rem;
361
+ display: inline-block;
362
+ }
363
+
364
+ .ProseMirror hr {
365
+ border: none;
366
+ border-top: 1px solid var(--color-primary-200);
367
+ margin: 0.75rem 0;
368
+ }
369
+
370
+ .dark .ProseMirror hr {
371
+ border-top-color: var(--color-primary-700);
372
+ }
373
+
374
+ /* Tiptap placeholder */
375
+ .ProseMirror p.is-editor-empty:first-child::before {
376
+ content: attr(data-placeholder);
377
+ float: left;
378
+ color: var(--color-primary-400);
379
+ pointer-events: none;
380
+ height: 0;
381
+ }
382
+
383
+ /* Selected cell highlight */
384
+ .ProseMirror .selectedCell {
385
+ background: var(--color-primary-100);
386
+ }
387
+
388
+ .dark .ProseMirror .selectedCell {
389
+ background: var(--color-primary-800);
390
+ }
391
+
392
+ /* ── Table column resize handle (prosemirror-tables) ── */
393
+ .ProseMirror .column-resize-handle {
394
+ position: absolute;
395
+ right: -2px;
396
+ top: 0;
397
+ bottom: 0;
398
+ width: 4px;
399
+ background: var(--color-primary-400);
400
+ pointer-events: none;
401
+ opacity: 0;
402
+ transition: opacity 0.15s;
403
+ }
404
+
405
+ /* Show handle on cell hover */
406
+ .ProseMirror th:hover .column-resize-handle,
407
+ .ProseMirror td:hover .column-resize-handle {
408
+ opacity: 1;
409
+ }
410
+
411
+ /* Show handle while dragging */
412
+ .column-resize-dragging .column-resize-handle {
413
+ opacity: 1;
414
+ background: var(--color-primary-500);
415
+ }
416
+
417
+ /* Change cursor on the editor root while resizing */
418
+ .ProseMirror.resize-cursor,
419
+ .column-resize-dragging {
420
+ cursor: col-resize;
421
+ }
422
+
423
+ /* Cells need position:relative so the handle positions inside them */
424
+ .ProseMirror th,
425
+ .ProseMirror td {
426
+ position: relative;
427
+ }
428
+
429
+ /* ── Inline dialog (color picker / URL inputs) ── */
430
+ .rte-inline-dialog {
431
+ position: absolute;
432
+ z-index: 40;
433
+ top: 2.5rem;
434
+ left: 0;
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 0.5rem;
438
+ padding: 0.5rem 0.75rem;
439
+ background: var(--color-white, #fff);
440
+ border: 1px solid var(--color-primary-200);
441
+ border-radius: 0.5rem;
442
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
443
+ min-width: 18rem;
444
+ }
445
+
446
+ .dark .rte-inline-dialog {
447
+ background: var(--color-primary-900);
448
+ border-color: var(--color-primary-700);
449
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
450
+ }
451
+
452
+ .rte-inline-dialog input[type="text"],
453
+ .rte-inline-dialog input[type="url"] {
454
+ flex: 1;
455
+ border: 1px solid var(--color-primary-200);
456
+ border-radius: 0.375rem;
457
+ padding: 0.3rem 0.5rem;
458
+ font-size: 0.8rem;
459
+ outline: none;
460
+ background: transparent;
461
+ color: inherit;
462
+ }
463
+
464
+ .dark .rte-inline-dialog input[type="text"],
465
+ .dark .rte-inline-dialog input[type="url"] {
466
+ border-color: var(--color-primary-700);
467
+ }
468
+
469
+ .rte-inline-dialog input[type="text"]:focus,
470
+ .rte-inline-dialog input[type="url"]:focus {
471
+ border-color: var(--color-primary-400);
472
+ }
473
+
474
+ .rte-inline-dialog button {
475
+ font-size: 0.75rem;
476
+ padding: 0.3rem 0.6rem;
477
+ border-radius: 0.375rem;
478
+ cursor: pointer;
479
+ border: none;
480
+ background: var(--color-primary-600);
481
+ color: #fff;
482
+ font-weight: 500;
483
+ }
484
+
485
+ .rte-inline-dialog button:hover {
486
+ background: var(--color-primary-700);
487
+ }
488
+
489
+ .rte-inline-dialog button.rte-cancel-btn {
490
+ background: var(--color-secondary-200);
491
+ color: var(--color-primary-800);
492
+ }
493
+
494
+ .dark .rte-inline-dialog button.rte-cancel-btn {
495
+ background: var(--color-primary-700);
496
+ color: var(--color-primary-100);
497
+ }
498
+
499
+ /* YouTube embed */
500
+ .ProseMirror div[data-youtube-video] {
501
+ max-width: 100%;
502
+ margin: 0.5rem 0;
503
+ }
504
+
505
+ .ProseMirror div[data-youtube-video] iframe {
506
+ max-width: 100%;
507
+ border-radius: 0.375rem;
508
+ }
509
+
510
+ /* ── Resizable image node view ── */
511
+ .rte-image-wrapper {
512
+ display: inline-block;
513
+ position: relative;
514
+ line-height: 0;
515
+ user-select: none;
516
+ vertical-align: middle;
517
+ }
518
+
519
+ .rte-image-wrapper img {
520
+ display: block;
521
+ max-width: 100%;
522
+ border-radius: 0.25rem;
523
+ }
524
+
525
+ .rte-image-wrapper--selected img {
526
+ outline: 2px solid var(--color-primary-500);
527
+ outline-offset: 2px;
528
+ }
529
+
530
+ /* Resize handles */
531
+ .rte-rh {
532
+ position: absolute;
533
+ width: 9px;
534
+ height: 9px;
535
+ background: var(--color-primary-500);
536
+ border: 1.5px solid #fff;
537
+ border-radius: 2px;
538
+ z-index: 10;
539
+ box-shadow: 0 1px 3px rgba(0,0,0,0.25);
540
+ }
541
+
542
+ .rte-rh--nw { top: -4px; left: -4px; cursor: nw-resize; }
543
+ .rte-rh--ne { top: -4px; right: -4px; cursor: ne-resize; }
544
+ .rte-rh--sw { bottom: -4px; left: -4px; cursor: sw-resize; }
545
+ .rte-rh--se { bottom: -4px; right: -4px; cursor: se-resize; }
546
+ .rte-rh--e { top: 50%; right: -4px; transform: translateY(-50%); cursor: ew-resize; }
547
+
548
+ .rte-rh--nw,
549
+ .rte-rh--ne,
550
+ .rte-rh--sw { pointer-events: none; }
551
+
552
+ .rte-rh--se,
553
+ .rte-rh--e { pointer-events: auto; }
554
+
555
+ /* Size label that appears during/after resize */
556
+ .rte-image-size-label {
557
+ position: absolute;
558
+ bottom: 6px;
559
+ left: 50%;
560
+ transform: translateX(-50%);
561
+ background: rgba(0, 0, 0, 0.62);
562
+ color: #fff;
563
+ font-size: 0.62rem;
564
+ font-weight: 500;
565
+ padding: 1px 5px;
566
+ border-radius: 3px;
567
+ white-space: nowrap;
568
+ pointer-events: none;
569
+ user-select: none;
570
+ }
571
+
572
+ /* ── Video node ───────────────────────────────── */
573
+ .rte-video-wrapper {
574
+ display: block;
575
+ margin: 0.5em 0;
576
+ line-height: 0;
577
+ }
578
+
579
+ .rte-video-wrapper video {
580
+ border-radius: 0.375rem;
581
+ box-shadow: 0 1px 4px rgba(0,0,0,0.10);
582
+ }
583
+
584
+ .rte-video-wrapper--selected video {
585
+ outline: 2px solid var(--color-primary-500);
586
+ outline-offset: 2px;
587
+ }
588
+
589
+ /* ── Embed (iframe) node ──────────────────────── */
590
+ .rte-embed-wrapper {
591
+ display: block;
592
+ margin: 0.5em 0;
593
+ }
594
+
595
+ .rte-embed-wrapper iframe {
596
+ border-radius: 0.375rem;
597
+ box-shadow: 0 1px 4px rgba(0,0,0,0.10);
598
+ }
599
+
600
+ .rte-embed-wrapper--selected iframe {
601
+ outline: 2px solid var(--color-primary-500);
602
+ outline-offset: 2px;
603
+ }
604
+
605
+ /* ── Table Toolbar ────────────────────────────── */
606
+ .rte-tablebar {
607
+ display: flex;
608
+ flex-direction: row;
609
+ align-items: center;
610
+ flex-wrap: wrap;
611
+ gap: 0.1rem 0.25rem;
612
+ padding: 0.3rem 0.75rem;
613
+ background: var(--color-primary-50);
614
+ border-bottom: 1px solid var(--color-primary-200);
615
+ flex-shrink: 0;
616
+ animation: rte-tbar-in 0.15s ease;
617
+ }
618
+
619
+ @keyframes rte-tbar-in {
620
+ from { opacity: 0; transform: translateY(-4px); }
621
+ to { opacity: 1; transform: translateY(0); }
622
+ }
623
+
624
+ .dark .rte-tablebar {
625
+ background: var(--color-primary-900);
626
+ border-bottom-color: var(--color-primary-700);
627
+ }
628
+
629
+ .rte-tbar-group-label {
630
+ font-size: 0.62rem;
631
+ font-weight: 600;
632
+ text-transform: uppercase;
633
+ letter-spacing: 0.04em;
634
+ color: var(--color-primary-400);
635
+ user-select: none;
636
+ padding: 0 0.1rem;
637
+ }
638
+
639
+ .dark .rte-tbar-group-label {
640
+ color: var(--color-primary-500);
641
+ }
642
+
643
+ .rte-tbar-sep {
644
+ width: 1px;
645
+ height: 1.25rem;
646
+ background: var(--color-primary-200);
647
+ flex-shrink: 0;
648
+ margin: 0 0.2rem;
649
+ }
650
+
651
+ .dark .rte-tbar-sep {
652
+ background: var(--color-primary-700);
653
+ }
654
+
655
+ .rte-tbar-btn {
656
+ display: inline-flex;
657
+ align-items: center;
658
+ gap: 0.25rem;
659
+ padding: 0.2rem 0.4rem;
660
+ border: none;
661
+ border-radius: 0.3rem;
662
+ background: transparent;
663
+ color: var(--color-primary-700);
664
+ cursor: pointer;
665
+ font-size: 0.7rem;
666
+ font-weight: 500;
667
+ line-height: 1;
668
+ transition: background 0.12s, color 0.12s;
669
+ white-space: nowrap;
670
+ }
671
+
672
+ .rte-tbar-btn:hover:not(:disabled) {
673
+ background: var(--color-primary-100);
674
+ color: var(--color-primary-900);
675
+ }
676
+
677
+ .rte-tbar-btn:disabled,
678
+ .rte-tbar-btn--disabled {
679
+ opacity: 0.38;
680
+ cursor: not-allowed;
681
+ }
682
+
683
+ .dark .rte-tbar-btn {
684
+ color: var(--color-primary-300);
685
+ }
686
+
687
+ .dark .rte-tbar-btn:hover:not(:disabled) {
688
+ background: var(--color-primary-800);
689
+ color: var(--color-primary-100);
690
+ }
691
+
692
+ .rte-tbar-label {
693
+ font-size: 0.68rem;
694
+ }
695
+
696
+ /* Split picker popover */
697
+ .rte-tbar-split-wrap {
698
+ position: relative;
699
+ display: inline-flex;
700
+ }
701
+
702
+ .rte-tbar-split-picker {
703
+ position: absolute;
704
+ top: calc(100% + 4px);
705
+ left: 0;
706
+ z-index: 50;
707
+ display: flex;
708
+ flex-direction: column;
709
+ gap: 2px;
710
+ padding: 4px;
711
+ background: var(--color-white, #fff);
712
+ border: 1px solid var(--color-primary-200);
713
+ border-radius: 0.4rem;
714
+ box-shadow: 0 4px 12px rgba(0,0,0,0.12);
715
+ min-width: 9rem;
716
+ animation: rte-tbar-in 0.12s ease;
717
+ }
718
+
719
+ .dark .rte-tbar-split-picker {
720
+ background: var(--color-primary-900);
721
+ border-color: var(--color-primary-700);
722
+ box-shadow: 0 4px 12px rgba(0,0,0,0.4);
723
+ }
724
+
725
+ .rte-tbar-split-pick-btn {
726
+ display: flex;
727
+ align-items: center;
728
+ gap: 0.4rem;
729
+ width: 100%;
730
+ padding: 0.3rem 0.5rem;
731
+ font-size: 0.72rem;
732
+ font-weight: 500;
733
+ background: transparent;
734
+ border: none;
735
+ border-radius: 0.3rem;
736
+ color: var(--color-primary-700);
737
+ cursor: pointer;
738
+ text-align: left;
739
+ transition: background 0.1s;
740
+ }
741
+
742
+ .rte-tbar-split-pick-btn:hover {
743
+ background: var(--color-primary-100);
744
+ color: var(--color-primary-900);
745
+ }
746
+
747
+ .dark .rte-tbar-split-pick-btn {
748
+ color: var(--color-primary-300);
749
+ }
750
+
751
+ .dark .rte-tbar-split-pick-btn:hover {
752
+ background: var(--color-primary-800);
753
+ color: var(--color-primary-100);
754
+ }
755
+
756
+ /* ── Find / Replace Bar ───────────────────────── */
757
+ .rte-findbar {
758
+ display: flex;
759
+ flex-direction: column;
760
+ gap: 0.35rem;
761
+ padding: 0.45rem 0.75rem;
762
+ background: var(--color-primary-50);
763
+ border-bottom: 1px solid var(--color-primary-200);
764
+ flex-shrink: 0;
765
+ animation: rte-findbar-in 0.15s ease;
766
+ }
767
+
768
+ @keyframes rte-findbar-in {
769
+ from { opacity: 0; transform: translateY(-6px); }
770
+ to { opacity: 1; transform: translateY(0); }
771
+ }
772
+
773
+ .dark .rte-findbar {
774
+ background: var(--color-primary-950, #0a0a0f);
775
+ border-bottom-color: var(--color-primary-700);
776
+ }
777
+
778
+ .rte-findbar-row {
779
+ display: flex;
780
+ align-items: center;
781
+ gap: 0.35rem;
782
+ }
783
+
784
+ .rte-findbar-icon {
785
+ color: var(--color-primary-400);
786
+ flex-shrink: 0;
787
+ }
788
+
789
+ .rte-findbar-input {
790
+ flex: 1;
791
+ height: 1.75rem;
792
+ padding: 0 0.5rem;
793
+ font-size: 0.8rem;
794
+ border: 1px solid var(--color-primary-200);
795
+ border-radius: 0.375rem;
796
+ outline: none;
797
+ background: var(--color-white, #fff);
798
+ color: var(--color-primary-900);
799
+ transition: border-color 0.15s;
800
+ }
801
+
802
+ .rte-findbar-input:focus {
803
+ border-color: var(--color-primary-400);
804
+ }
805
+
806
+ .dark .rte-findbar-input {
807
+ background: var(--color-primary-900);
808
+ border-color: var(--color-primary-700);
809
+ color: var(--color-primary-100);
810
+ }
811
+
812
+ .dark .rte-findbar-input:focus {
813
+ border-color: var(--color-primary-500);
814
+ }
815
+
816
+ .rte-findbar-count {
817
+ font-size: 0.72rem;
818
+ color: var(--color-primary-400);
819
+ white-space: nowrap;
820
+ min-width: 3.5rem;
821
+ text-align: center;
822
+ }
823
+
824
+ .rte-findbar-btn {
825
+ display: inline-flex;
826
+ align-items: center;
827
+ justify-content: center;
828
+ height: 1.75rem;
829
+ min-width: 1.75rem;
830
+ padding: 0 0.4rem;
831
+ font-size: 0.72rem;
832
+ font-weight: 600;
833
+ border: 1px solid var(--color-primary-200);
834
+ border-radius: 0.375rem;
835
+ background: transparent;
836
+ color: var(--color-primary-600);
837
+ cursor: pointer;
838
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
839
+ }
840
+
841
+ .rte-findbar-btn:hover:not(:disabled) {
842
+ background: var(--color-primary-100);
843
+ border-color: var(--color-primary-300);
844
+ }
845
+
846
+ .rte-findbar-btn:disabled {
847
+ opacity: 0.4;
848
+ cursor: not-allowed;
849
+ }
850
+
851
+ .rte-findbar-btn--active {
852
+ background: var(--color-primary-600);
853
+ color: #fff;
854
+ border-color: var(--color-primary-600);
855
+ }
856
+
857
+ .rte-findbar-btn--active:hover:not(:disabled) {
858
+ background: var(--color-primary-700);
859
+ }
860
+
861
+ .rte-findbar-btn--close {
862
+ color: var(--color-primary-400);
863
+ border-color: transparent;
864
+ margin-left: 0.15rem;
865
+ }
866
+
867
+ .rte-findbar-btn--close:hover:not(:disabled) {
868
+ background: var(--color-danger-100);
869
+ color: var(--color-danger-600);
870
+ border-color: transparent;
871
+ }
872
+
873
+ .rte-findbar-btn--action {
874
+ min-width: auto;
875
+ padding: 0 0.6rem;
876
+ font-size: 0.72rem;
877
+ }
878
+
879
+ .dark .rte-findbar-btn {
880
+ border-color: var(--color-primary-700);
881
+ color: var(--color-primary-300);
882
+ }
883
+
884
+ .dark .rte-findbar-btn:hover:not(:disabled) {
885
+ background: var(--color-primary-800);
886
+ border-color: var(--color-primary-600);
887
+ }
888
+
889
+ /* ── Search highlight decorations ── */
890
+ .rte-search-match {
891
+ background: color-mix(in srgb, var(--color-warning-400) 40%, transparent);
892
+ border-radius: 2px;
893
+ }
894
+
895
+ .rte-search-current {
896
+ background: color-mix(in srgb, var(--color-warning-500) 70%, transparent);
897
+ border-radius: 2px;
898
+ outline: 1px solid var(--color-warning-500);
899
+ }
900
+
901
+ .dark .rte-search-match {
902
+ background: color-mix(in srgb, var(--color-warning-600) 40%, transparent);
903
+ }
904
+
905
+ .dark .rte-search-current {
906
+ background: color-mix(in srgb, var(--color-warning-500) 60%, transparent);
907
+ outline-color: var(--color-warning-400);
908
+ }