@richscripts/richtexteditor 2.4.0 → 2.4.2

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 (60) hide show
  1. package/migration/README.md +100 -0
  2. package/migration/cli.js +294 -0
  3. package/migration/index.d.ts +18 -0
  4. package/migration/index.js +242 -0
  5. package/migration/report-schema-v2.json +127 -0
  6. package/package.json +14 -2
  7. package/richtexteditor/CHANGELOG.md +326 -1
  8. package/richtexteditor/all_plugins.js +14982 -4831
  9. package/richtexteditor/all_plugins.min.js +62 -42
  10. package/richtexteditor/plugins/accessibilitychecker.js +8 -7
  11. package/richtexteditor/plugins/aitoolkit.css +17 -8
  12. package/richtexteditor/plugins/aitoolkit.js +8 -8
  13. package/richtexteditor/plugins/all_plugins.js +14982 -4831
  14. package/richtexteditor/plugins/all_plugins.min.js +62 -42
  15. package/richtexteditor/plugins/autocorrect.js +353 -0
  16. package/richtexteditor/plugins/bookmarkcard.js +12 -1
  17. package/richtexteditor/plugins/changecase.js +238 -0
  18. package/richtexteditor/plugins/comments.js +15 -28
  19. package/richtexteditor/plugins/contentminimap.js +6 -5
  20. package/richtexteditor/plugins/crdt-engine.js +2201 -198
  21. package/richtexteditor/plugins/crdt-engine.min.js +5 -5
  22. package/richtexteditor/plugins/crossreference.js +408 -0
  23. package/richtexteditor/plugins/documentimport.js +915 -21
  24. package/richtexteditor/plugins/documentoutline.js +5 -4
  25. package/richtexteditor/plugins/docxexport.js +960 -0
  26. package/richtexteditor/plugins/draghandle.js +309 -0
  27. package/richtexteditor/plugins/footnotes.js +398 -0
  28. package/richtexteditor/plugins/formatpainter.js +298 -0
  29. package/richtexteditor/plugins/formattingmarks.js +246 -0
  30. package/richtexteditor/plugins/html2pdf.js +108 -4
  31. package/richtexteditor/plugins/imageeditor.js +37 -7
  32. package/richtexteditor/plugins/insertgallery.js +553 -170
  33. package/richtexteditor/plugins/keyboarda11y.js +316 -0
  34. package/richtexteditor/plugins/linenumbers.js +352 -0
  35. package/richtexteditor/plugins/linkchecker.js +396 -0
  36. package/richtexteditor/plugins/mentionplugin.js +4 -3
  37. package/richtexteditor/plugins/mergefields.js +328 -0
  38. package/richtexteditor/plugins/multilevellist.js +137 -0
  39. package/richtexteditor/plugins/pagination.js +505 -0
  40. package/richtexteditor/plugins/pdfexport.js +1137 -0
  41. package/richtexteditor/plugins/permanentpen.js +211 -0
  42. package/richtexteditor/plugins/revisionhistory.js +47 -34
  43. package/richtexteditor/plugins/rtlui.js +150 -0
  44. package/richtexteditor/plugins/sanitizer.js +510 -0
  45. package/richtexteditor/plugins/slashcommand.js +142 -17
  46. package/richtexteditor/plugins/spellcheck.js +6 -3
  47. package/richtexteditor/plugins/tableofcontents.js +353 -0
  48. package/richtexteditor/plugins/tabletools.js +342 -0
  49. package/richtexteditor/plugins/textdirection.js +313 -0
  50. package/richtexteditor/plugins/trackedchanges.js +37 -6
  51. package/richtexteditor/plugins/tui.image-editor/tui-code-snippet.min.js +1 -1
  52. package/richtexteditor/plugins/tui.image-editor/tui-color-picker.min.js +1 -1
  53. package/richtexteditor/plugins/tui.image-editor/tui-image-editor.min.js +1 -1
  54. package/richtexteditor/plugins/vendor/html2pdf.bundle.min.js +3 -0
  55. package/richtexteditor/plugins/watermark.js +214 -0
  56. package/richtexteditor/plugins/wordexport.js +0 -0
  57. package/richtexteditor/plugins/yjscollab.js +49 -11
  58. package/richtexteditor/rte-config.js +44 -44
  59. package/richtexteditor/rte.js +91 -63
  60. package/richtexteditor/rte_theme_default.css +483 -384
@@ -1,6 +1,6 @@
1
1
 
2
2
  /* ===== Design tokens =====
3
- Override these CSS custom properties to retheme the editor chrome �� the
3
+ Override these CSS custom properties to retheme the editor chrome �� the
4
4
  same architecture CKEditor 5 documents for its --ck-* variables. Icons in
5
5
  rte-config.js use fill/stroke="currentColor" and follow --rte-icon-color.
6
6
  The built-in dark mode (end of this file) is pure token overrides. */
@@ -52,6 +52,11 @@ rte-toolbar-button, rte-toolbar-splitbutton, rte-toolbar-dropdown, rte-toolbar-a
52
52
  max-width: none !important;
53
53
  max-height: none !important;
54
54
  border-radius: 0px !important;
55
+ /* Force a dedicated compositing layer: without this, Chromium can fail to
56
+ repaint the element over sticky/fixed page content (e.g. a sticky header)
57
+ when position and z-index change together, leaving stale pixels on screen. */
58
+ transform: translateZ(0) !important;
59
+ will-change: transform !important;
55
60
  }
56
61
 
57
62
  .richtexteditor.rte-fullpage rte-toolbar {
@@ -182,7 +187,7 @@ rte-codebox {
182
187
  }
183
188
  }
184
189
 
185
- /* 2026-05-19 Reading mode �� hides toolbars + status, leaves only the editing
190
+ /* 2026-05-19 Reading mode �� hides toolbars + status, leaves only the editing
186
191
  surface for distraction-free writing. Toggle via editor.toggleReadingMode(). */
187
192
  .richtexteditor.rte-reading-mode rte-toolbar,
188
193
  .richtexteditor.rte-reading-mode rte-subtoolbar,
@@ -190,35 +195,35 @@ rte-codebox {
190
195
  .richtexteditor.rte-reading-mode rte-plusbtn {
191
196
  display: none !important;
192
197
  }
193
- .richtexteditor.rte-reading-mode {
194
- border: 0 !important;
195
- box-shadow: none !important;
196
- background: #fff !important;
197
- }
198
- .richtexteditor .rte-reading-mode-exit {
199
- display: none;
200
- }
201
- .richtexteditor.rte-reading-mode .rte-reading-mode-exit {
202
- position: absolute;
203
- top: 8px;
204
- right: 8px;
205
- z-index: 12;
206
- display: inline-flex;
207
- align-items: center;
208
- gap: 6px;
209
- padding: 7px 10px;
210
- border: 1px solid rgba(15, 23, 42, .16);
211
- border-radius: 8px;
212
- background: rgba(255, 255, 255, .94);
213
- color: #172033;
214
- box-shadow: 0 8px 22px rgba(15, 23, 42, .12);
215
- font: 600 12px -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
216
- cursor: pointer;
217
- }
218
- .richtexteditor.rte-reading-mode .rte-reading-mode-exit:hover {
219
- background: #f8fafc;
220
- border-color: rgba(37, 99, 235, .35);
221
- }
198
+ .richtexteditor.rte-reading-mode {
199
+ border: 0 !important;
200
+ box-shadow: none !important;
201
+ background: #fff !important;
202
+ }
203
+ .richtexteditor .rte-reading-mode-exit {
204
+ display: none;
205
+ }
206
+ .richtexteditor.rte-reading-mode .rte-reading-mode-exit {
207
+ position: absolute;
208
+ top: 8px;
209
+ right: 8px;
210
+ z-index: 12;
211
+ display: inline-flex;
212
+ align-items: center;
213
+ gap: 6px;
214
+ padding: 7px 10px;
215
+ border: 1px solid rgba(15, 23, 42, .16);
216
+ border-radius: 8px;
217
+ background: rgba(255, 255, 255, .94);
218
+ color: #172033;
219
+ box-shadow: 0 8px 22px rgba(15, 23, 42, .12);
220
+ font: 600 12px -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
221
+ cursor: pointer;
222
+ }
223
+ .richtexteditor.rte-reading-mode .rte-reading-mode-exit:hover {
224
+ background: #f8fafc;
225
+ border-color: rgba(37, 99, 235, .35);
226
+ }
222
227
 
223
228
  /* 2026-05-11 Block drag handles (Notion-style ?? on left edge of blocks).
224
229
  Activated via config.blockDragHandles = true. */
@@ -273,14 +278,20 @@ rte-codebox {
273
278
  border-radius: 0px;
274
279
  }
275
280
 
276
- .richtexteditor.rte-modern {
277
- /* Token-driven so the border themes correctly (dark mode -> #334155);
278
- previously hardcoded #d5d5d5 stayed light-gray on the dark surface. */
279
- border: 1px solid var(--rte-border, #d5d5d5);
280
- border-radius: 10px;
281
- overflow: hidden;
282
- background-clip: padding-box;
283
- }
281
+ .richtexteditor.rte-modern {
282
+ /* Token-driven so the border themes correctly (dark mode -> #334155);
283
+ previously hardcoded #d5d5d5 stayed light-gray on the dark surface. */
284
+ border: 1px solid var(--rte-border, #d5d5d5);
285
+ border-radius: 10px;
286
+ /* Deliberately NOT overflow:hidden. Toolbar dropdown panels
287
+ (rte-dropdown-panel) are absolutely positioned children of this element,
288
+ so clipping here cut off any panel anchored near the right edge: Line
289
+ Height rendered only the "1" of "100%", Paragraphs and Document Outline
290
+ lost 91px. Corner rounding does not depend on this clip - the toolbar and
291
+ status bar round their own corners (see the rule below). */
292
+ overflow: visible;
293
+ background-clip: padding-box;
294
+ }
284
295
 
285
296
  /* Round the toolbar's top corners and the status bar's bottom corners to follow
286
297
  the editor's rounded border (inner radius = outer 10px - 1px border). Without
@@ -402,9 +413,9 @@ rte-resizecorner {
402
413
  }
403
414
 
404
415
 
405
- /* Compact selection float toolbar - sized like Google Docs/Notion (~31px tall).
406
- Was: 5px padding + 30px buttons = 45px tall; keep the floating glyphs
407
- smaller than the main toolbar so selection actions do not feel oversized. */
416
+ /* Compact selection float toolbar - sized like Google Docs/Notion (~31px tall).
417
+ Was: 5px padding + 30px buttons = 45px tall; keep the floating glyphs
418
+ smaller than the main toolbar so selection actions do not feel oversized. */
408
419
  rte-control-toolbar {
409
420
  display: inline-flex;
410
421
  align-items: center;
@@ -419,7 +430,7 @@ rte-control-toolbar {
419
430
  animation: rteFloatToolbarIn 130ms ease-out;
420
431
  }
421
432
 
422
- /* The generic rte-toolbar-group adds 2px padding �� remove it here so the
433
+ /* The generic rte-toolbar-group adds 2px padding �� remove it here so the
423
434
  buttons fill the bar (smaller chrome, larger-feeling icons). */
424
435
  .rte-modern rte-control-toolbar rte-toolbar-group {
425
436
  padding: 0;
@@ -432,47 +443,47 @@ rte-control-toolbar {
432
443
  box-shadow: 0 22px 54px rgba(15,23,42,.2), 0 6px 18px rgba(37,99,235,.1), inset 0 1px 0 rgba(255,255,255,.95);
433
444
  }
434
445
 
435
- .rte-modern rte-control-toolbar rte-toolbar-button, .rte-modern rte-control-toolbar rte-toolbar-splitbutton, .rte-modern rte-control-toolbar rte-toolbar-dropdown {
436
- margin: 0;
437
- border-radius: 6px;
438
- width: 26px;
439
- height: 25px;
440
- padding: 0;
441
- color: #334155;
442
- transition: background-color 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 120ms ease;
443
- }
446
+ .rte-modern rte-control-toolbar rte-toolbar-button, .rte-modern rte-control-toolbar rte-toolbar-splitbutton, .rte-modern rte-control-toolbar rte-toolbar-dropdown {
447
+ margin: 0;
448
+ border-radius: 6px;
449
+ width: 26px;
450
+ height: 25px;
451
+ padding: 0;
452
+ color: #334155;
453
+ transition: background-color 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 120ms ease;
454
+ }
444
455
 
445
456
  .rte-modern rte-control-toolbar rte-toolbar-button svg,
446
- .rte-modern rte-control-toolbar rte-toolbar-splitbutton svg,
447
- .rte-modern rte-control-toolbar rte-toolbar-dropdown svg,
448
- .rte-modern rte-control-toolbar rte-toolbar-arrowbutton svg {
449
- width: 16px !important;
450
- height: 16px !important;
451
- }
457
+ .rte-modern rte-control-toolbar rte-toolbar-splitbutton svg,
458
+ .rte-modern rte-control-toolbar rte-toolbar-dropdown svg,
459
+ .rte-modern rte-control-toolbar rte-toolbar-arrowbutton svg {
460
+ width: 16px !important;
461
+ height: 16px !important;
462
+ }
452
463
 
453
464
  /* The global rte-line-spliter rule carries `margin: 10px auto !important`,
454
- which inflates the float toolbar's row height �� neutralize it here. */
455
- .rte-modern rte-control-toolbar rte-line-spliter {
456
- margin: 0 2px !important;
457
- height: 14px;
458
- }
459
-
460
- .rte-modern rte-control-toolbar rte-toolbar-arrowbutton {
461
- margin: 0;
462
- border-radius: 6px;
463
- height: 25px;
464
- width: 35px;
465
- padding-right: 10px;
466
- background-position: 23px 7px;
467
- background-size: 10px 10px;
468
- }
469
-
470
- .rte-modern rte-control-toolbar rte-line-break {
471
- width: 1px;
472
- height: 14px;
473
- margin: 0 3px;
474
- background: rgba(148,163,184,.35);
475
- }
465
+ which inflates the float toolbar's row height �� neutralize it here. */
466
+ .rte-modern rte-control-toolbar rte-line-spliter {
467
+ margin: 0 2px !important;
468
+ height: 14px;
469
+ }
470
+
471
+ .rte-modern rte-control-toolbar rte-toolbar-arrowbutton {
472
+ margin: 0;
473
+ border-radius: 6px;
474
+ height: 25px;
475
+ width: 35px;
476
+ padding-right: 10px;
477
+ background-position: 23px 7px;
478
+ background-size: 10px 10px;
479
+ }
480
+
481
+ .rte-modern rte-control-toolbar rte-line-break {
482
+ width: 1px;
483
+ height: 14px;
484
+ margin: 0 3px;
485
+ background: rgba(148,163,184,.35);
486
+ }
476
487
 
477
488
  .rte-modern rte-control-toolbar rte-toolbar-button:hover,
478
489
  .rte-modern rte-control-toolbar rte-toolbar-splitbutton:hover,
@@ -493,8 +504,8 @@ rte-control-toolbar {
493
504
  box-shadow: inset 0 0 0 1px rgba(37,99,235,.22);
494
505
  }
495
506
 
496
- rte-control-toolbar .rte-link-url-preview {
497
- min-height: 28px;
507
+ rte-control-toolbar .rte-link-url-preview {
508
+ min-height: 28px;
498
509
  border-radius: 999px;
499
510
  background: #f1f7ff;
500
511
  border: 1px solid rgba(29,103,186,.16);
@@ -706,26 +717,26 @@ rte-dropdown-menuitem rte-toolbar-splitbutton-dropdown {
706
717
  padding: 1px;
707
718
  }
708
719
 
709
- rte-toolbar-splitbutton-direct {
710
- display: inline-flex;
711
- align-content: center;
712
- align-items: center;
713
- justify-content: center;
714
- width: 24px;
715
- height: 100%;
716
- min-height: 18px;
717
- }
718
-
719
- rte-toolbar-splitbutton-dropdown {
720
- border-left: solid 1px transparent;
721
- width: 14px;
722
- height: 100%;
723
- min-height: 18px;
724
- background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgNTEyIiBjbGFzcz0ic3ZnLWlubGluZS0tZmEgZmEtYW5nbGUtZG93biBmYS13LTEwIj48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik0xNDMgMzUyLjNMNyAyMTYuM2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsMjIuNi0yMi42YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDk2LjQgOTYuNCA5Ni40LTk2LjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsMjIuNiAyMi42YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC0xMzYgMTM2Yy05LjIgOS40LTI0LjQgOS40LTMzLjggMHoiIGNsYXNzPSIiPjwvcGF0aD48L3N2Zz4=');
725
- background-position: 1px center;
726
- background-repeat: no-repeat;
727
- background-size: 12px 12px;
728
- }
720
+ rte-toolbar-splitbutton-direct {
721
+ display: inline-flex;
722
+ align-content: center;
723
+ align-items: center;
724
+ justify-content: center;
725
+ width: 24px;
726
+ height: 100%;
727
+ min-height: 18px;
728
+ }
729
+
730
+ rte-toolbar-splitbutton-dropdown {
731
+ border-left: solid 1px transparent;
732
+ width: 14px;
733
+ height: 100%;
734
+ min-height: 18px;
735
+ background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgNTEyIiBjbGFzcz0ic3ZnLWlubGluZS0tZmEgZmEtYW5nbGUtZG93biBmYS13LTEwIj48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik0xNDMgMzUyLjNMNyAyMTYuM2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsMjIuNi0yMi42YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDk2LjQgOTYuNCA5Ni40LTk2LjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsMjIuNiAyMi42YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC0xMzYgMTM2Yy05LjIgOS40LTI0LjQgOS40LTMzLjggMHoiIGNsYXNzPSIiPjwvcGF0aD48L3N2Zz4=');
736
+ background-position: 1px center;
737
+ background-repeat: no-repeat;
738
+ background-size: 12px 12px;
739
+ }
729
740
 
730
741
  rte-color-button-mask {
731
742
  position: absolute;
@@ -773,7 +784,7 @@ rte-color-button-mask {
773
784
  }
774
785
 
775
786
 
776
- /* Rounded interactive states for the desktop toolbar �� matches the selection
787
+ /* Rounded interactive states for the desktop toolbar �� matches the selection
777
788
  float toolbar (7px) and modern editors (Google Docs/Notion). Previously the
778
789
  main toolbar's hover/active/focus highlights were hard squares. */
779
790
  .rte-modern rte-toolbar-button,
@@ -831,7 +842,7 @@ rte-color-button-mask {
831
842
  height: 36px;
832
843
  margin-bottom: -4px;
833
844
  background-position: 23px 8px;
834
- /* Open dropdown reads as a tab connected to its panel �� square the
845
+ /* Open dropdown reads as a tab connected to its panel �� square the
835
846
  bottom corners so the rounded button doesn't detach from the panel. */
836
847
  border-bottom-left-radius: 0;
837
848
  border-bottom-right-radius: 0;
@@ -1565,6 +1576,14 @@ rte-dropdown-panel.rte-panel-backcolor rte-dialog-item-color[rte-tooltip]:hover
1565
1576
  border-color: rgba(0,0,0,.08) !important;
1566
1577
  }
1567
1578
 
1579
+ rte-dropdown-panel.rte-panel-forecolor rte-dialog-item-color[role="menuitem"]:focus-visible,
1580
+ rte-dropdown-panel.rte-panel-backcolor rte-dialog-item-color[role="menuitem"]:focus-visible {
1581
+ outline: 2px solid #1a73e8 !important;
1582
+ outline-offset: 2px !important;
1583
+ transform: scale(1.15) !important;
1584
+ position: relative !important;
1585
+ z-index: 2 !important;
1586
+ }
1568
1587
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-auto,
1569
1588
  rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-auto,
1570
1589
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-more,
@@ -1586,6 +1605,14 @@ rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-more:hover {
1586
1605
  border: 0 !important;
1587
1606
  }
1588
1607
 
1608
+ rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-auto:focus-visible,
1609
+ rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-auto:focus-visible,
1610
+ rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-more:focus-visible,
1611
+ rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-more:focus-visible {
1612
+ outline: 2px solid #1a73e8 !important;
1613
+ outline-offset: 1px !important;
1614
+ background: #f1f5f9 !important;
1615
+ }
1589
1616
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-auto rte-dialog-item-label,
1590
1617
  rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-auto rte-dialog-item-label,
1591
1618
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-more rte-dialog-item-label,
@@ -1965,6 +1992,21 @@ rte-menuspliter {
1965
1992
  margin: 3px 0px 3px 28px;
1966
1993
  }
1967
1994
 
1995
+ /* The panel is shrink-to-fit, so its width is decided by its widest preview —
1996
+ "Headline 1" at 32px — and measured 187px of text inside 187px of space:
1997
+ ZERO tolerance. Whenever the font used at layout time is a hair narrower than
1998
+ the one finally painted (a fallback still in place during a webfont swap, a
1999
+ different platform's metrics), the label overflows and the last character is
2000
+ cut off. Reported from the wild with "Headline 1" clipped.
2001
+
2002
+ A min-width gives the panel slack that does not depend on font metrics
2003
+ matching to the pixel; the previews are nowrap, so slack is the only thing
2004
+ that can absorb the variance. */
2005
+ .rte-dropdown-panel.rte_command_paragraphs,
2006
+ rte-dropdown-panel.rte_command_paragraphs {
2007
+ min-width: 292px;
2008
+ }
2009
+
1968
2010
  .rte_command_paragraphs rte-toolbar-dropdown-item div {
1969
2011
  font-size: 15px;
1970
2012
  margin: 0px;
@@ -2063,86 +2105,86 @@ rte-floatpanel {
2063
2105
  opacity: 1;
2064
2106
  }
2065
2107
 
2066
- rte-floatpanel rte-toolbar-button:hover {
2067
- background: #eef5ff;
2068
- fill: #1559d6;
2069
- color: #1559d6;
2070
- box-shadow: inset 0 0 0 1px rgba(37,99,235,.14);
2071
- transform: translateY(-1px);
2072
- }
2073
-
2074
- /* 2026-07-03 paragraph rail icon polish */
2075
- rte-floatpanel.rte-floatpanel-paragraphop {
2076
- width: 28px !important;
2077
- padding: 9px 3px 4px !important;
2078
- border-color: rgba(148,163,184,.34) !important;
2079
- border-radius: 11px !important;
2080
- background: linear-gradient(180deg, rgba(255,255,255,.94) 0%, rgba(248,250,252,.91) 100%) !important;
2081
- box-shadow: 0 8px 20px rgba(15,23,42,.1), inset 0 1px 0 rgba(255,255,255,.9) !important;
2082
- opacity: .86 !important;
2083
- }
2084
-
2085
- rte-floatpanel.rte-floatpanel-paragraphop::before {
2086
- top: 4px;
2087
- width: 10px;
2088
- height: 3px;
2089
- background: radial-gradient(circle, #94a3b8 .9px, transparent 1.3px) 0 0 / 4px 3px;
2090
- opacity: .62;
2091
- }
2092
-
2093
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-group {
2094
- padding: 0;
2095
- }
2096
-
2097
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button {
2098
- box-sizing: border-box;
2099
- display: flex;
2100
- align-items: center;
2101
- justify-content: center;
2102
- width: 20px !important;
2103
- height: 20px !important;
2104
- min-width: 20px !important;
2105
- min-height: 20px !important;
2106
- margin: 1px 0;
2107
- border-radius: 6px;
2108
- color: #6b7280;
2109
- opacity: .8;
2110
- }
2111
-
2112
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button:hover {
2113
- background: rgba(37,99,235,.08);
2114
- color: #1559d6;
2115
- box-shadow: inset 0 0 0 1px rgba(37,99,235,.1);
2116
- opacity: 1;
2117
- transform: translateY(-.5px);
2118
- }
2119
-
2120
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg {
2121
- display: block !important;
2122
- width: 13px !important;
2123
- height: 13px !important;
2124
- margin: 0 !important;
2125
- color: currentColor;
2126
- pointer-events: none;
2127
- }
2128
-
2129
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg,
2130
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg * {
2131
- stroke-linecap: round;
2132
- stroke-linejoin: round;
2133
- stroke-width: 1.35 !important;
2134
- }
2135
-
2136
- rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button.rte_command_pmore svg {
2137
- width: 12px !important;
2138
- height: 12px !important;
2139
- opacity: .72;
2140
- }
2141
-
2142
-
2143
- .rte-current-item {
2144
- background-color: #eef2f7;
2145
- }
2108
+ rte-floatpanel rte-toolbar-button:hover {
2109
+ background: #eef5ff;
2110
+ fill: #1559d6;
2111
+ color: #1559d6;
2112
+ box-shadow: inset 0 0 0 1px rgba(37,99,235,.14);
2113
+ transform: translateY(-1px);
2114
+ }
2115
+
2116
+ /* 2026-07-03 paragraph rail icon polish */
2117
+ rte-floatpanel.rte-floatpanel-paragraphop {
2118
+ width: 28px !important;
2119
+ padding: 9px 3px 4px !important;
2120
+ border-color: rgba(148,163,184,.34) !important;
2121
+ border-radius: 11px !important;
2122
+ background: linear-gradient(180deg, rgba(255,255,255,.94) 0%, rgba(248,250,252,.91) 100%) !important;
2123
+ box-shadow: 0 8px 20px rgba(15,23,42,.1), inset 0 1px 0 rgba(255,255,255,.9) !important;
2124
+ opacity: .86 !important;
2125
+ }
2126
+
2127
+ rte-floatpanel.rte-floatpanel-paragraphop::before {
2128
+ top: 4px;
2129
+ width: 10px;
2130
+ height: 3px;
2131
+ background: radial-gradient(circle, #94a3b8 .9px, transparent 1.3px) 0 0 / 4px 3px;
2132
+ opacity: .62;
2133
+ }
2134
+
2135
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-group {
2136
+ padding: 0;
2137
+ }
2138
+
2139
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button {
2140
+ box-sizing: border-box;
2141
+ display: flex;
2142
+ align-items: center;
2143
+ justify-content: center;
2144
+ width: 20px !important;
2145
+ height: 20px !important;
2146
+ min-width: 20px !important;
2147
+ min-height: 20px !important;
2148
+ margin: 1px 0;
2149
+ border-radius: 6px;
2150
+ color: #6b7280;
2151
+ opacity: .8;
2152
+ }
2153
+
2154
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button:hover {
2155
+ background: rgba(37,99,235,.08);
2156
+ color: #1559d6;
2157
+ box-shadow: inset 0 0 0 1px rgba(37,99,235,.1);
2158
+ opacity: 1;
2159
+ transform: translateY(-.5px);
2160
+ }
2161
+
2162
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg {
2163
+ display: block !important;
2164
+ width: 13px !important;
2165
+ height: 13px !important;
2166
+ margin: 0 !important;
2167
+ color: currentColor;
2168
+ pointer-events: none;
2169
+ }
2170
+
2171
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg,
2172
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg * {
2173
+ stroke-linecap: round;
2174
+ stroke-linejoin: round;
2175
+ stroke-width: 1.35 !important;
2176
+ }
2177
+
2178
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button.rte_command_pmore svg {
2179
+ width: 12px !important;
2180
+ height: 12px !important;
2181
+ opacity: .72;
2182
+ }
2183
+
2184
+
2185
+ .rte-current-item {
2186
+ background-color: #eef2f7;
2187
+ }
2146
2188
 
2147
2189
  /* Optional development toggles for hiding editor chrome can live here. */
2148
2190
 
@@ -2538,6 +2580,25 @@ rte-content::-webkit-scrollbar-thumb:hover {
2538
2580
  flex-wrap: wrap;
2539
2581
  }
2540
2582
 
2583
+ /* The toolbar is a flex row whose children are these two groups. Without a
2584
+ display on the groups themselves the buttons stack vertically and the row
2585
+ collapses to the width of its widest label -- which is exactly what shipped
2586
+ when these rules went missing. */
2587
+ .rte-gallery-browser-toolbar-group {
2588
+ display: flex;
2589
+ align-items: center;
2590
+ gap: 8px;
2591
+ min-width: 0;
2592
+ flex: 1 1 auto;
2593
+ flex-wrap: wrap;
2594
+ }
2595
+
2596
+ .rte-gallery-browser-toolbar-group-right {
2597
+ flex: 0 1 auto;
2598
+ justify-content: flex-end;
2599
+ margin-left: auto;
2600
+ }
2601
+
2541
2602
  .rte-gallery-browser-button {
2542
2603
  border: 1px solid rgba(116, 135, 162, 0.28);
2543
2604
  border-radius: 999px;
@@ -2672,6 +2733,44 @@ rte-content::-webkit-scrollbar-thumb:hover {
2672
2733
  overflow: hidden;
2673
2734
  }
2674
2735
 
2736
+ /* Folders sit in their own container above the image listbox, so the two are
2737
+ separated by a rule rather than running together in one grid. */
2738
+ .rte-gallery-browser-grid-folders {
2739
+ margin-bottom: 14px;
2740
+ padding-bottom: 14px;
2741
+ border-bottom: 1px solid rgba(116, 135, 162, 0.16);
2742
+ }
2743
+
2744
+ /* Folder tiles have no image to show, so the icon is drawn in CSS. The plugin
2745
+ emits an empty div for it -- with no rule here the tile renders blank. */
2746
+ .rte-gallery-browser-thumbnail-folder {
2747
+ background: linear-gradient(180deg, #fffaea 0%, #fdeec4 100%);
2748
+ border-color: rgba(197, 158, 61, 0.32);
2749
+ }
2750
+
2751
+ .rte-gallery-browser-folder-icon {
2752
+ position: relative;
2753
+ width: 60px;
2754
+ height: 42px;
2755
+ border: 1px solid rgba(178, 138, 45, 0.7);
2756
+ border-radius: 7px;
2757
+ background: linear-gradient(180deg, #ffe6a1 0%, #f3c957 100%);
2758
+ box-shadow: 0 8px 16px rgba(140, 100, 20, 0.18);
2759
+ }
2760
+
2761
+ .rte-gallery-browser-folder-icon:before {
2762
+ content: "";
2763
+ position: absolute;
2764
+ left: 7px;
2765
+ top: -9px;
2766
+ width: 25px;
2767
+ height: 13px;
2768
+ border: 1px solid rgba(178, 138, 45, 0.7);
2769
+ border-bottom: 0;
2770
+ border-radius: 6px 6px 0 0;
2771
+ background: linear-gradient(180deg, #fff1c4 0%, #f8d97c 100%);
2772
+ }
2773
+
2675
2774
  .rte-gallery-browser-thumbnail-image {
2676
2775
  max-width: 100%;
2677
2776
  max-height: 100%;
@@ -2887,13 +2986,13 @@ rte-dropdown-panel.rte-panel-insertdocument .rte-dialog-button.rte-button-type-c
2887
2986
  }
2888
2987
 
2889
2988
  /* ===========================================================================
2890
- * 2026-05-08 dialog polish layer �� applies to every editor dialog (insert
2989
+ * 2026-05-08 dialog polish layer �� applies to every editor dialog (insert
2891
2990
  * video / link / image / code / table / find / template / gallery / etc.)
2892
2991
  *
2893
2992
  * Until this layer landed, every dialog inherited `min-width: 300px` from
2894
2993
  * the base `rte-dialog-inner` rule above. That worked for two-button
2895
2994
  * confirmations but felt cramped for URL fields, code editors, and any
2896
- * dialog with a textarea �� the input was about 270 px wide once you
2995
+ * dialog with a textarea �� the input was about 270 px wide once you
2897
2996
  * subtracted the 12 px margin on each side.
2898
2997
  *
2899
2998
  * The rules below set sensible per-dialog defaults, modernise the input
@@ -2970,7 +3069,7 @@ rte-dialog-outer .rte-dialog-line-input textarea:focus {
2970
3069
  box-shadow: 0 0 0 3px rgba(21, 89, 214, 0.16);
2971
3070
  }
2972
3071
 
2973
- /* The label that floats above the input (Url / Width / etc.) �� modern
3072
+ /* The label that floats above the input (Url / Width / etc.) �� modern
2974
3073
  feel: smaller, less shouty colour. */
2975
3074
  rte-dialog-outer .rte-dialog-line-input rte-dialog-input-label {
2976
3075
  font-size: 11px;
@@ -3002,7 +3101,7 @@ rte-dialog-outer rte-dialog-button {
3002
3101
 
3003
3102
  /* === Per-dialog width hints === */
3004
3103
 
3005
- /* Insert video: just a URL textarea �� bigger so users can paste long
3104
+ /* Insert video: just a URL textarea �� bigger so users can paste long
3006
3105
  YouTube / Vimeo links without horizontal scroll. */
3007
3106
  rte-dialog-outer.rte-dialog-insertvideo rte-dialog-inner {
3008
3107
  min-width: 520px;
@@ -3015,7 +3114,7 @@ rte-dialog-outer .rte-dialog-line-url textarea {
3015
3114
  word-break: break-all;
3016
3115
  }
3017
3116
 
3018
- /* Insert link / image-by-url: same family �� bigger than the default, but
3117
+ /* Insert link / image-by-url: same family �� bigger than the default, but
3019
3118
  not as wide as the code editor. */
3020
3119
  rte-dialog-outer.rte-dialog-insertlink rte-dialog-inner,
3021
3120
  rte-dialog-outer.rte-panel-insertimage-byurl rte-dialog-inner,
@@ -3029,13 +3128,13 @@ rte-dialog-outer.rte-dialog-insertcode rte-dialog-inner {
3029
3128
  max-width: min(880px, calc(100vw - 32px));
3030
3129
  }
3031
3130
 
3032
- /* Insert table / find / general �� keep a consistent 460 px floor. */
3131
+ /* Insert table / find / general �� keep a consistent 460 px floor. */
3033
3132
  rte-dialog-outer.rte-panel-find rte-dialog-inner,
3034
3133
  rte-dialog-outer.rte-panel-general rte-dialog-inner {
3035
3134
  min-width: 460px;
3036
3135
  }
3037
3136
 
3038
- /* Insert gallery / template / paste cleanup �� comfortable wide layouts
3137
+ /* Insert gallery / template / paste cleanup �� comfortable wide layouts
3039
3138
  for picking from a grid. */
3040
3139
  rte-dialog-outer.rte-dialog-insertgallery rte-dialog-inner,
3041
3140
  rte-dialog-outer.rte-dialog-inserttemplate rte-dialog-inner,
@@ -3045,7 +3144,7 @@ rte-dialog-outer.rte-dialog-pasteword rte-dialog-inner {
3045
3144
  max-width: min(960px, calc(100vw - 32px));
3046
3145
  }
3047
3146
 
3048
- /* Image editor / HTML2PDF �� full creative surface. */
3147
+ /* Image editor / HTML2PDF �� full creative surface. */
3049
3148
  rte-dialog-outer.rte-dialog-imageeditor rte-dialog-inner,
3050
3149
  rte-dialog-outer.rte-dialog-html2pdf rte-dialog-inner {
3051
3150
  min-width: 760px;
@@ -3561,7 +3660,7 @@ rte-toolbar-dropdown-item:focus-visible {
3561
3660
  box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.12);
3562
3661
  }
3563
3662
 
3564
- /* Dark-mode hover for toolbar dropdown items �� the light-blue gradient above is
3663
+ /* Dark-mode hover for toolbar dropdown items �� the light-blue gradient above is
3565
3664
  light-only; without this it renders washed-out (light gradient + dark-blue
3566
3665
  text) over the dark panel. */
3567
3666
  .rte-dark rte-toolbar-dropdown-item:hover,
@@ -4429,7 +4528,7 @@ rte-dropdown-panel .rte-dialog-button:active {
4429
4528
  }
4430
4529
 
4431
4530
  /* ============================================================ */
4432
- /* Dark mode (UI chrome only �� the document canvas stays white, */
4531
+ /* Dark mode (UI chrome only �� the document canvas stays white, */
4433
4532
  /* like Google Docs' dark UI, so authored content isn't harmed).*/
4434
4533
  /* Explicit dark mode by default; add rte-auto-dark to */
4435
4534
  /* follow prefers-color-scheme; force on with rte-dark. */
@@ -4502,7 +4601,7 @@ rte-dropdown-panel .rte-dialog-button:active {
4502
4601
  }
4503
4602
 
4504
4603
  /* ============================================================ */
4505
- /* Dark mode �� dialog & dropdown panel interiors. */
4604
+ /* Dark mode �� dialog & dropdown panel interiors. */
4506
4605
  /* The dialog surface itself is token-driven (var(--rte- */
4507
4606
  /* surface-raised)); these rules cover the text/inputs/borders */
4508
4607
  /* that don't inherit, so dialogs aren't black-text-on-dark. */
@@ -4597,7 +4696,7 @@ rte-dropdown-panel .rte-dialog-button:active {
4597
4696
  }
4598
4697
  }
4599
4698
 
4600
- /* Dark mode �� floating selection toolbar (rte-control-toolbar). Inside the
4699
+ /* Dark mode �� floating selection toolbar (rte-control-toolbar). Inside the
4601
4700
  editor container, so both the explicit class and the media query reach it. */
4602
4701
  .rte-dark rte-control-toolbar {
4603
4702
  background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
@@ -4617,10 +4716,10 @@ rte-dropdown-panel .rte-dialog-button:active {
4617
4716
  }
4618
4717
  .rte-dark rte-link-url-preview, .rte-dark rte-link-url-preview a { color: #60a5fa; }
4619
4718
 
4620
- @media (prefers-color-scheme: dark) {
4621
- .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar {
4622
- background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
4623
- border-color: #334155;
4719
+ @media (prefers-color-scheme: dark) {
4720
+ .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar {
4721
+ background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
4722
+ border-color: #334155;
4624
4723
  }
4625
4724
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-button,
4626
4725
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-splitbutton,
@@ -4631,189 +4730,189 @@ rte-dropdown-panel .rte-dialog-button:active {
4631
4730
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-button:hover,
4632
4731
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-splitbutton:hover,
4633
4732
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-dropdown:hover {
4634
- background: #334155;
4635
- }
4636
- }
4637
-
4638
- /* 2026-07-02 toolbar icon polish.
4639
- Keep this after the token-driven chrome rules so the modern toolbar retains
4640
- its quiet selected state instead of inheriting the older solid accent fill. */
4641
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4642
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4643
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4644
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4645
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4646
- box-sizing: border-box;
4647
- display: inline-flex;
4648
- align-items: center;
4649
- justify-content: center;
4650
- color: var(--rte-icon-color, #5f6368);
4651
- background-clip: padding-box;
4652
- transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease, box-shadow 120ms ease;
4653
- }
4654
-
4655
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button svg,
4656
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton svg,
4657
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton svg {
4658
- display: block !important;
4659
- flex: 0 0 auto;
4660
- width: 18px !important;
4661
- height: 18px !important;
4662
- margin: 0 !important;
4663
- align-self: center !important;
4664
- color: currentColor;
4665
- pointer-events: none;
4666
- }
4667
-
4668
- .rte-modern rte-control-toolbar rte-toolbar-button svg,
4669
- .rte-modern rte-control-toolbar rte-toolbar-splitbutton svg,
4670
- .rte-modern rte-control-toolbar rte-toolbar-arrowbutton svg,
4671
- .rte-modern rte-dropdown-panel rte-toolbar-button svg {
4672
- display: block !important;
4673
- margin: 0 !important;
4674
- align-self: center !important;
4675
- color: currentColor;
4676
- pointer-events: none;
4677
- }
4678
-
4733
+ background: #334155;
4734
+ }
4735
+ }
4736
+
4737
+ /* 2026-07-02 toolbar icon polish.
4738
+ Keep this after the token-driven chrome rules so the modern toolbar retains
4739
+ its quiet selected state instead of inheriting the older solid accent fill. */
4740
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4741
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4742
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4743
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4744
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4745
+ box-sizing: border-box;
4746
+ display: inline-flex;
4747
+ align-items: center;
4748
+ justify-content: center;
4749
+ color: var(--rte-icon-color, #5f6368);
4750
+ background-clip: padding-box;
4751
+ transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease, box-shadow 120ms ease;
4752
+ }
4753
+
4754
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button svg,
4755
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton svg,
4756
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton svg {
4757
+ display: block !important;
4758
+ flex: 0 0 auto;
4759
+ width: 20px !important;
4760
+ height: 20px !important;
4761
+ margin: 0 !important;
4762
+ align-self: center !important;
4763
+ color: currentColor;
4764
+ pointer-events: none;
4765
+ }
4766
+
4767
+ .rte-modern rte-control-toolbar rte-toolbar-button svg,
4768
+ .rte-modern rte-control-toolbar rte-toolbar-splitbutton svg,
4769
+ .rte-modern rte-control-toolbar rte-toolbar-arrowbutton svg,
4770
+ .rte-modern rte-dropdown-panel rte-toolbar-button svg {
4771
+ display: block !important;
4772
+ margin: 0 !important;
4773
+ align-self: center !important;
4774
+ color: currentColor;
4775
+ pointer-events: none;
4776
+ }
4777
+
4679
4778
  .rte-modern rte-dropdown-panel rte-toolbar-button svg {
4680
- width: 18px !important;
4681
- height: 18px !important;
4682
- }
4683
-
4684
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4685
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4686
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4687
- color: #1559d6;
4688
- background-color: #f3f8ff;
4689
- border-color: rgba(37,99,235,.14);
4690
- }
4691
-
4692
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4693
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4694
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4695
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4696
- color: #1559d6;
4697
- fill: currentColor;
4698
- background-color: #edf6ff;
4699
- border-color: rgba(37,99,235,.22);
4700
- box-shadow: inset 0 0 0 1px rgba(37,99,235,.12);
4701
- }
4702
-
4703
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-disabled,
4704
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-disabled,
4705
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-disabled {
4706
- color: #9aa0a6;
4707
- opacity: .62;
4708
- }
4709
-
4710
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-disabled:hover,
4711
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-disabled:hover,
4712
- .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-disabled:hover {
4713
- color: #9aa0a6;
4714
- background-color: transparent;
4715
- border-color: transparent;
4716
- box-shadow: none;
4717
- }
4718
-
4719
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4720
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4721
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4722
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4723
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4724
- color: var(--rte-icon-color, #cbd5e1);
4725
- }
4726
-
4727
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4728
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4729
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4730
- color: #e2e8f0;
4731
- background-color: #334155;
4732
- border-color: #475569;
4733
- }
4734
-
4735
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4736
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4737
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4738
- .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4739
- color: #bfdbfe;
4740
- background-color: #1e3a5f;
4741
- border-color: rgba(96,165,250,.46);
4742
- box-shadow: inset 0 0 0 1px rgba(96,165,250,.24);
4743
- }
4744
-
4745
- @media (prefers-color-scheme: dark) {
4746
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4747
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4748
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4749
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4750
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4751
- color: var(--rte-icon-color, #cbd5e1);
4752
- }
4753
-
4754
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4755
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4756
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4757
- color: #e2e8f0;
4758
- background-color: #334155;
4759
- border-color: #475569;
4760
- }
4761
-
4762
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4763
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4764
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4765
- .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4766
- color: #bfdbfe;
4767
- background-color: #1e3a5f;
4768
- border-color: rgba(96,165,250,.46);
4769
- box-shadow: inset 0 0 0 1px rgba(96,165,250,.24);
4770
- }
4771
- }
4772
-
4773
- /* 2026-07-03 dialog top-chrome guard.
4774
- Dialogs must clear host sticky menus and also sit above editor dropdown
4775
- panels, which use a higher default z-index than config.zIndexDialog. */
4776
- rte-dialog-outer,
4777
- rte-dialog-float,
4778
- .rte-alt-editor-popup,
4779
- .rte-find-replace-dialog,
4780
- .rte-ai-context-menu,
4781
- .rte-image-quickbar {
4782
- --rte-dialog-effective-top-chrome: max(var(--rte-ai-sticky-top-offset, 0px), var(--rte-dialog-detected-top-chrome, 0px));
4783
- }
4784
-
4785
- rte-dialog-outer {
4786
- top: max(0px, var(--rte-dialog-effective-top-chrome)) !important;
4787
- box-sizing: border-box;
4788
- padding: 12px;
4789
- overflow: auto;
4790
- overscroll-behavior: contain;
4791
- z-index: 2147483646 !important;
4792
- }
4793
-
4794
- rte-dialog-outer rte-dialog-inner {
4795
- max-height: min(88vh, 760px, calc(100vh - max(32px, calc(var(--rte-dialog-effective-top-chrome) + 32px)))) !important;
4796
- }
4797
-
4798
- rte-dialog-float {
4799
- top: max(12px, calc(var(--rte-dialog-effective-top-chrome) + 12px));
4800
- max-height: calc(100vh - max(32px, calc(var(--rte-dialog-effective-top-chrome) + 32px)));
4801
- z-index: 2147483646 !important;
4802
- }
4803
-
4804
- rte-dialog-float rte-dialog-inner {
4805
- max-height: inherit;
4806
- overflow: auto;
4807
- }
4808
-
4809
- .rte-alt-editor-popup,
4810
- .rte-find-replace-dialog,
4811
- .rte-ai-context-menu {
4812
- z-index: 2147483646 !important;
4813
- }
4814
-
4815
- .rte-find-replace-dialog {
4816
- top: max(80px, calc(var(--rte-dialog-effective-top-chrome) + 12px)) !important;
4817
- max-height: calc(100vh - max(104px, calc(var(--rte-dialog-effective-top-chrome) + 32px)));
4818
- overflow: auto;
4779
+ width: 20px !important;
4780
+ height: 20px !important;
4819
4781
  }
4782
+
4783
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4784
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4785
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4786
+ color: #1559d6;
4787
+ background-color: #f3f8ff;
4788
+ border-color: rgba(37,99,235,.14);
4789
+ }
4790
+
4791
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4792
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4793
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4794
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4795
+ color: #1559d6;
4796
+ fill: currentColor;
4797
+ background-color: #edf6ff;
4798
+ border-color: rgba(37,99,235,.22);
4799
+ box-shadow: inset 0 0 0 1px rgba(37,99,235,.12);
4800
+ }
4801
+
4802
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-disabled,
4803
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-disabled,
4804
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-disabled {
4805
+ color: #9aa0a6;
4806
+ opacity: .62;
4807
+ }
4808
+
4809
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-disabled:hover,
4810
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-disabled:hover,
4811
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-disabled:hover {
4812
+ color: #9aa0a6;
4813
+ background-color: transparent;
4814
+ border-color: transparent;
4815
+ box-shadow: none;
4816
+ }
4817
+
4818
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4819
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4820
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4821
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4822
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4823
+ color: var(--rte-icon-color, #cbd5e1);
4824
+ }
4825
+
4826
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4827
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4828
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4829
+ color: #e2e8f0;
4830
+ background-color: #334155;
4831
+ border-color: #475569;
4832
+ }
4833
+
4834
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4835
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4836
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4837
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4838
+ color: #bfdbfe;
4839
+ background-color: #1e3a5f;
4840
+ border-color: rgba(96,165,250,.46);
4841
+ box-shadow: inset 0 0 0 1px rgba(96,165,250,.24);
4842
+ }
4843
+
4844
+ @media (prefers-color-scheme: dark) {
4845
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4846
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4847
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4848
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4849
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4850
+ color: var(--rte-icon-color, #cbd5e1);
4851
+ }
4852
+
4853
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4854
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4855
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4856
+ color: #e2e8f0;
4857
+ background-color: #334155;
4858
+ border-color: #475569;
4859
+ }
4860
+
4861
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4862
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4863
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4864
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4865
+ color: #bfdbfe;
4866
+ background-color: #1e3a5f;
4867
+ border-color: rgba(96,165,250,.46);
4868
+ box-shadow: inset 0 0 0 1px rgba(96,165,250,.24);
4869
+ }
4870
+ }
4871
+
4872
+ /* 2026-07-03 dialog top-chrome guard.
4873
+ Dialogs must clear host sticky menus and also sit above editor dropdown
4874
+ panels, which use a higher default z-index than config.zIndexDialog. */
4875
+ rte-dialog-outer,
4876
+ rte-dialog-float,
4877
+ .rte-alt-editor-popup,
4878
+ .rte-find-replace-dialog,
4879
+ .rte-ai-context-menu,
4880
+ .rte-image-quickbar {
4881
+ --rte-dialog-effective-top-chrome: max(var(--rte-ai-sticky-top-offset, 0px), var(--rte-dialog-detected-top-chrome, 0px));
4882
+ }
4883
+
4884
+ rte-dialog-outer {
4885
+ top: max(0px, var(--rte-dialog-effective-top-chrome)) !important;
4886
+ box-sizing: border-box;
4887
+ padding: 12px;
4888
+ overflow: auto;
4889
+ overscroll-behavior: contain;
4890
+ z-index: 2147483646 !important;
4891
+ }
4892
+
4893
+ rte-dialog-outer rte-dialog-inner {
4894
+ max-height: min(88vh, 760px, calc(100vh - max(32px, calc(var(--rte-dialog-effective-top-chrome) + 32px)))) !important;
4895
+ }
4896
+
4897
+ rte-dialog-float {
4898
+ top: max(12px, calc(var(--rte-dialog-effective-top-chrome) + 12px));
4899
+ max-height: calc(100vh - max(32px, calc(var(--rte-dialog-effective-top-chrome) + 32px)));
4900
+ z-index: 2147483646 !important;
4901
+ }
4902
+
4903
+ rte-dialog-float rte-dialog-inner {
4904
+ max-height: inherit;
4905
+ overflow: auto;
4906
+ }
4907
+
4908
+ .rte-alt-editor-popup,
4909
+ .rte-find-replace-dialog,
4910
+ .rte-ai-context-menu {
4911
+ z-index: 2147483646 !important;
4912
+ }
4913
+
4914
+ .rte-find-replace-dialog {
4915
+ top: max(80px, calc(var(--rte-dialog-effective-top-chrome) + 12px)) !important;
4916
+ max-height: calc(100vh - max(104px, calc(var(--rte-dialog-effective-top-chrome) + 32px)));
4917
+ overflow: auto;
4918
+ }