@richscripts/richtexteditor 2.4.0 → 2.4.1

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 (58) 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 +11 -1
  7. package/richtexteditor/CHANGELOG.md +326 -1
  8. package/richtexteditor/all_plugins.js +14959 -4832
  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 +14959 -4832
  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/crossreference.js +408 -0
  21. package/richtexteditor/plugins/documentimport.js +915 -21
  22. package/richtexteditor/plugins/documentoutline.js +5 -4
  23. package/richtexteditor/plugins/docxexport.js +960 -0
  24. package/richtexteditor/plugins/draghandle.js +309 -0
  25. package/richtexteditor/plugins/footnotes.js +398 -0
  26. package/richtexteditor/plugins/formatpainter.js +298 -0
  27. package/richtexteditor/plugins/formattingmarks.js +246 -0
  28. package/richtexteditor/plugins/html2pdf.js +108 -4
  29. package/richtexteditor/plugins/imageeditor.js +37 -7
  30. package/richtexteditor/plugins/insertgallery.js +553 -170
  31. package/richtexteditor/plugins/keyboarda11y.js +316 -0
  32. package/richtexteditor/plugins/linenumbers.js +352 -0
  33. package/richtexteditor/plugins/linkchecker.js +396 -0
  34. package/richtexteditor/plugins/mentionplugin.js +4 -3
  35. package/richtexteditor/plugins/mergefields.js +328 -0
  36. package/richtexteditor/plugins/multilevellist.js +137 -0
  37. package/richtexteditor/plugins/pagination.js +505 -0
  38. package/richtexteditor/plugins/pdfexport.js +1137 -0
  39. package/richtexteditor/plugins/permanentpen.js +211 -0
  40. package/richtexteditor/plugins/revisionhistory.js +47 -34
  41. package/richtexteditor/plugins/rtlui.js +150 -0
  42. package/richtexteditor/plugins/sanitizer.js +486 -0
  43. package/richtexteditor/plugins/slashcommand.js +142 -17
  44. package/richtexteditor/plugins/spellcheck.js +6 -3
  45. package/richtexteditor/plugins/tableofcontents.js +353 -0
  46. package/richtexteditor/plugins/tabletools.js +342 -0
  47. package/richtexteditor/plugins/textdirection.js +313 -0
  48. package/richtexteditor/plugins/trackedchanges.js +37 -6
  49. package/richtexteditor/plugins/tui.image-editor/tui-code-snippet.min.js +1 -1
  50. package/richtexteditor/plugins/tui.image-editor/tui-color-picker.min.js +1 -1
  51. package/richtexteditor/plugins/tui.image-editor/tui-image-editor.min.js +1 -1
  52. package/richtexteditor/plugins/vendor/html2pdf.bundle.min.js +3 -0
  53. package/richtexteditor/plugins/watermark.js +214 -0
  54. package/richtexteditor/plugins/wordexport.js +0 -0
  55. package/richtexteditor/plugins/yjscollab.js +49 -11
  56. package/richtexteditor/rte-config.js +44 -44
  57. package/richtexteditor/rte.js +91 -63
  58. package/richtexteditor/rte_theme_default.css +462 -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,14 @@ 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
+ overflow: hidden;
287
+ background-clip: padding-box;
288
+ }
284
289
 
285
290
  /* Round the toolbar's top corners and the status bar's bottom corners to follow
286
291
  the editor's rounded border (inner radius = outer 10px - 1px border). Without
@@ -402,9 +407,9 @@ rte-resizecorner {
402
407
  }
403
408
 
404
409
 
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. */
410
+ /* Compact selection float toolbar - sized like Google Docs/Notion (~31px tall).
411
+ Was: 5px padding + 30px buttons = 45px tall; keep the floating glyphs
412
+ smaller than the main toolbar so selection actions do not feel oversized. */
408
413
  rte-control-toolbar {
409
414
  display: inline-flex;
410
415
  align-items: center;
@@ -419,7 +424,7 @@ rte-control-toolbar {
419
424
  animation: rteFloatToolbarIn 130ms ease-out;
420
425
  }
421
426
 
422
- /* The generic rte-toolbar-group adds 2px padding �� remove it here so the
427
+ /* The generic rte-toolbar-group adds 2px padding �� remove it here so the
423
428
  buttons fill the bar (smaller chrome, larger-feeling icons). */
424
429
  .rte-modern rte-control-toolbar rte-toolbar-group {
425
430
  padding: 0;
@@ -432,47 +437,47 @@ rte-control-toolbar {
432
437
  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
438
  }
434
439
 
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
- }
440
+ .rte-modern rte-control-toolbar rte-toolbar-button, .rte-modern rte-control-toolbar rte-toolbar-splitbutton, .rte-modern rte-control-toolbar rte-toolbar-dropdown {
441
+ margin: 0;
442
+ border-radius: 6px;
443
+ width: 26px;
444
+ height: 25px;
445
+ padding: 0;
446
+ color: #334155;
447
+ transition: background-color 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 120ms ease;
448
+ }
444
449
 
445
450
  .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
- }
451
+ .rte-modern rte-control-toolbar rte-toolbar-splitbutton svg,
452
+ .rte-modern rte-control-toolbar rte-toolbar-dropdown svg,
453
+ .rte-modern rte-control-toolbar rte-toolbar-arrowbutton svg {
454
+ width: 16px !important;
455
+ height: 16px !important;
456
+ }
452
457
 
453
458
  /* 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
- }
459
+ which inflates the float toolbar's row height �� neutralize it here. */
460
+ .rte-modern rte-control-toolbar rte-line-spliter {
461
+ margin: 0 2px !important;
462
+ height: 14px;
463
+ }
464
+
465
+ .rte-modern rte-control-toolbar rte-toolbar-arrowbutton {
466
+ margin: 0;
467
+ border-radius: 6px;
468
+ height: 25px;
469
+ width: 35px;
470
+ padding-right: 10px;
471
+ background-position: 23px 7px;
472
+ background-size: 10px 10px;
473
+ }
474
+
475
+ .rte-modern rte-control-toolbar rte-line-break {
476
+ width: 1px;
477
+ height: 14px;
478
+ margin: 0 3px;
479
+ background: rgba(148,163,184,.35);
480
+ }
476
481
 
477
482
  .rte-modern rte-control-toolbar rte-toolbar-button:hover,
478
483
  .rte-modern rte-control-toolbar rte-toolbar-splitbutton:hover,
@@ -493,8 +498,8 @@ rte-control-toolbar {
493
498
  box-shadow: inset 0 0 0 1px rgba(37,99,235,.22);
494
499
  }
495
500
 
496
- rte-control-toolbar .rte-link-url-preview {
497
- min-height: 28px;
501
+ rte-control-toolbar .rte-link-url-preview {
502
+ min-height: 28px;
498
503
  border-radius: 999px;
499
504
  background: #f1f7ff;
500
505
  border: 1px solid rgba(29,103,186,.16);
@@ -706,26 +711,26 @@ rte-dropdown-menuitem rte-toolbar-splitbutton-dropdown {
706
711
  padding: 1px;
707
712
  }
708
713
 
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
- }
714
+ rte-toolbar-splitbutton-direct {
715
+ display: inline-flex;
716
+ align-content: center;
717
+ align-items: center;
718
+ justify-content: center;
719
+ width: 24px;
720
+ height: 100%;
721
+ min-height: 18px;
722
+ }
723
+
724
+ rte-toolbar-splitbutton-dropdown {
725
+ border-left: solid 1px transparent;
726
+ width: 14px;
727
+ height: 100%;
728
+ min-height: 18px;
729
+ background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgNTEyIiBjbGFzcz0ic3ZnLWlubGluZS0tZmEgZmEtYW5nbGUtZG93biBmYS13LTEwIj48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik0xNDMgMzUyLjNMNyAyMTYuM2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsMjIuNi0yMi42YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDk2LjQgOTYuNCA5Ni40LTk2LjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsMjIuNiAyMi42YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC0xMzYgMTM2Yy05LjIgOS40LTI0LjQgOS40LTMzLjggMHoiIGNsYXNzPSIiPjwvcGF0aD48L3N2Zz4=');
730
+ background-position: 1px center;
731
+ background-repeat: no-repeat;
732
+ background-size: 12px 12px;
733
+ }
729
734
 
730
735
  rte-color-button-mask {
731
736
  position: absolute;
@@ -773,7 +778,7 @@ rte-color-button-mask {
773
778
  }
774
779
 
775
780
 
776
- /* Rounded interactive states for the desktop toolbar �� matches the selection
781
+ /* Rounded interactive states for the desktop toolbar �� matches the selection
777
782
  float toolbar (7px) and modern editors (Google Docs/Notion). Previously the
778
783
  main toolbar's hover/active/focus highlights were hard squares. */
779
784
  .rte-modern rte-toolbar-button,
@@ -831,7 +836,7 @@ rte-color-button-mask {
831
836
  height: 36px;
832
837
  margin-bottom: -4px;
833
838
  background-position: 23px 8px;
834
- /* Open dropdown reads as a tab connected to its panel �� square the
839
+ /* Open dropdown reads as a tab connected to its panel �� square the
835
840
  bottom corners so the rounded button doesn't detach from the panel. */
836
841
  border-bottom-left-radius: 0;
837
842
  border-bottom-right-radius: 0;
@@ -1565,6 +1570,14 @@ rte-dropdown-panel.rte-panel-backcolor rte-dialog-item-color[rte-tooltip]:hover
1565
1570
  border-color: rgba(0,0,0,.08) !important;
1566
1571
  }
1567
1572
 
1573
+ rte-dropdown-panel.rte-panel-forecolor rte-dialog-item-color[role="menuitem"]:focus-visible,
1574
+ rte-dropdown-panel.rte-panel-backcolor rte-dialog-item-color[role="menuitem"]:focus-visible {
1575
+ outline: 2px solid #1a73e8 !important;
1576
+ outline-offset: 2px !important;
1577
+ transform: scale(1.15) !important;
1578
+ position: relative !important;
1579
+ z-index: 2 !important;
1580
+ }
1568
1581
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-auto,
1569
1582
  rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-auto,
1570
1583
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-more,
@@ -1586,6 +1599,14 @@ rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-more:hover {
1586
1599
  border: 0 !important;
1587
1600
  }
1588
1601
 
1602
+ rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-auto:focus-visible,
1603
+ rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-auto:focus-visible,
1604
+ rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-more:focus-visible,
1605
+ rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-more:focus-visible {
1606
+ outline: 2px solid #1a73e8 !important;
1607
+ outline-offset: 1px !important;
1608
+ background: #f1f5f9 !important;
1609
+ }
1589
1610
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-auto rte-dialog-item-label,
1590
1611
  rte-dropdown-panel.rte-panel-backcolor rte-dialog-line-auto rte-dialog-item-label,
1591
1612
  rte-dropdown-panel.rte-panel-forecolor rte-dialog-line-more rte-dialog-item-label,
@@ -2063,86 +2084,86 @@ rte-floatpanel {
2063
2084
  opacity: 1;
2064
2085
  }
2065
2086
 
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
- }
2087
+ rte-floatpanel rte-toolbar-button:hover {
2088
+ background: #eef5ff;
2089
+ fill: #1559d6;
2090
+ color: #1559d6;
2091
+ box-shadow: inset 0 0 0 1px rgba(37,99,235,.14);
2092
+ transform: translateY(-1px);
2093
+ }
2094
+
2095
+ /* 2026-07-03 paragraph rail icon polish */
2096
+ rte-floatpanel.rte-floatpanel-paragraphop {
2097
+ width: 28px !important;
2098
+ padding: 9px 3px 4px !important;
2099
+ border-color: rgba(148,163,184,.34) !important;
2100
+ border-radius: 11px !important;
2101
+ background: linear-gradient(180deg, rgba(255,255,255,.94) 0%, rgba(248,250,252,.91) 100%) !important;
2102
+ box-shadow: 0 8px 20px rgba(15,23,42,.1), inset 0 1px 0 rgba(255,255,255,.9) !important;
2103
+ opacity: .86 !important;
2104
+ }
2105
+
2106
+ rte-floatpanel.rte-floatpanel-paragraphop::before {
2107
+ top: 4px;
2108
+ width: 10px;
2109
+ height: 3px;
2110
+ background: radial-gradient(circle, #94a3b8 .9px, transparent 1.3px) 0 0 / 4px 3px;
2111
+ opacity: .62;
2112
+ }
2113
+
2114
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-group {
2115
+ padding: 0;
2116
+ }
2117
+
2118
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button {
2119
+ box-sizing: border-box;
2120
+ display: flex;
2121
+ align-items: center;
2122
+ justify-content: center;
2123
+ width: 20px !important;
2124
+ height: 20px !important;
2125
+ min-width: 20px !important;
2126
+ min-height: 20px !important;
2127
+ margin: 1px 0;
2128
+ border-radius: 6px;
2129
+ color: #6b7280;
2130
+ opacity: .8;
2131
+ }
2132
+
2133
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button:hover {
2134
+ background: rgba(37,99,235,.08);
2135
+ color: #1559d6;
2136
+ box-shadow: inset 0 0 0 1px rgba(37,99,235,.1);
2137
+ opacity: 1;
2138
+ transform: translateY(-.5px);
2139
+ }
2140
+
2141
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg {
2142
+ display: block !important;
2143
+ width: 13px !important;
2144
+ height: 13px !important;
2145
+ margin: 0 !important;
2146
+ color: currentColor;
2147
+ pointer-events: none;
2148
+ }
2149
+
2150
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg,
2151
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button svg * {
2152
+ stroke-linecap: round;
2153
+ stroke-linejoin: round;
2154
+ stroke-width: 1.35 !important;
2155
+ }
2156
+
2157
+ rte-floatpanel.rte-floatpanel-paragraphop rte-toolbar-button.rte_command_pmore svg {
2158
+ width: 12px !important;
2159
+ height: 12px !important;
2160
+ opacity: .72;
2161
+ }
2162
+
2163
+
2164
+ .rte-current-item {
2165
+ background-color: #eef2f7;
2166
+ }
2146
2167
 
2147
2168
  /* Optional development toggles for hiding editor chrome can live here. */
2148
2169
 
@@ -2538,6 +2559,25 @@ rte-content::-webkit-scrollbar-thumb:hover {
2538
2559
  flex-wrap: wrap;
2539
2560
  }
2540
2561
 
2562
+ /* The toolbar is a flex row whose children are these two groups. Without a
2563
+ display on the groups themselves the buttons stack vertically and the row
2564
+ collapses to the width of its widest label -- which is exactly what shipped
2565
+ when these rules went missing. */
2566
+ .rte-gallery-browser-toolbar-group {
2567
+ display: flex;
2568
+ align-items: center;
2569
+ gap: 8px;
2570
+ min-width: 0;
2571
+ flex: 1 1 auto;
2572
+ flex-wrap: wrap;
2573
+ }
2574
+
2575
+ .rte-gallery-browser-toolbar-group-right {
2576
+ flex: 0 1 auto;
2577
+ justify-content: flex-end;
2578
+ margin-left: auto;
2579
+ }
2580
+
2541
2581
  .rte-gallery-browser-button {
2542
2582
  border: 1px solid rgba(116, 135, 162, 0.28);
2543
2583
  border-radius: 999px;
@@ -2672,6 +2712,44 @@ rte-content::-webkit-scrollbar-thumb:hover {
2672
2712
  overflow: hidden;
2673
2713
  }
2674
2714
 
2715
+ /* Folders sit in their own container above the image listbox, so the two are
2716
+ separated by a rule rather than running together in one grid. */
2717
+ .rte-gallery-browser-grid-folders {
2718
+ margin-bottom: 14px;
2719
+ padding-bottom: 14px;
2720
+ border-bottom: 1px solid rgba(116, 135, 162, 0.16);
2721
+ }
2722
+
2723
+ /* Folder tiles have no image to show, so the icon is drawn in CSS. The plugin
2724
+ emits an empty div for it -- with no rule here the tile renders blank. */
2725
+ .rte-gallery-browser-thumbnail-folder {
2726
+ background: linear-gradient(180deg, #fffaea 0%, #fdeec4 100%);
2727
+ border-color: rgba(197, 158, 61, 0.32);
2728
+ }
2729
+
2730
+ .rte-gallery-browser-folder-icon {
2731
+ position: relative;
2732
+ width: 60px;
2733
+ height: 42px;
2734
+ border: 1px solid rgba(178, 138, 45, 0.7);
2735
+ border-radius: 7px;
2736
+ background: linear-gradient(180deg, #ffe6a1 0%, #f3c957 100%);
2737
+ box-shadow: 0 8px 16px rgba(140, 100, 20, 0.18);
2738
+ }
2739
+
2740
+ .rte-gallery-browser-folder-icon:before {
2741
+ content: "";
2742
+ position: absolute;
2743
+ left: 7px;
2744
+ top: -9px;
2745
+ width: 25px;
2746
+ height: 13px;
2747
+ border: 1px solid rgba(178, 138, 45, 0.7);
2748
+ border-bottom: 0;
2749
+ border-radius: 6px 6px 0 0;
2750
+ background: linear-gradient(180deg, #fff1c4 0%, #f8d97c 100%);
2751
+ }
2752
+
2675
2753
  .rte-gallery-browser-thumbnail-image {
2676
2754
  max-width: 100%;
2677
2755
  max-height: 100%;
@@ -2887,13 +2965,13 @@ rte-dropdown-panel.rte-panel-insertdocument .rte-dialog-button.rte-button-type-c
2887
2965
  }
2888
2966
 
2889
2967
  /* ===========================================================================
2890
- * 2026-05-08 dialog polish layer �� applies to every editor dialog (insert
2968
+ * 2026-05-08 dialog polish layer �� applies to every editor dialog (insert
2891
2969
  * video / link / image / code / table / find / template / gallery / etc.)
2892
2970
  *
2893
2971
  * Until this layer landed, every dialog inherited `min-width: 300px` from
2894
2972
  * the base `rte-dialog-inner` rule above. That worked for two-button
2895
2973
  * 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
2974
+ * dialog with a textarea �� the input was about 270 px wide once you
2897
2975
  * subtracted the 12 px margin on each side.
2898
2976
  *
2899
2977
  * The rules below set sensible per-dialog defaults, modernise the input
@@ -2970,7 +3048,7 @@ rte-dialog-outer .rte-dialog-line-input textarea:focus {
2970
3048
  box-shadow: 0 0 0 3px rgba(21, 89, 214, 0.16);
2971
3049
  }
2972
3050
 
2973
- /* The label that floats above the input (Url / Width / etc.) �� modern
3051
+ /* The label that floats above the input (Url / Width / etc.) �� modern
2974
3052
  feel: smaller, less shouty colour. */
2975
3053
  rte-dialog-outer .rte-dialog-line-input rte-dialog-input-label {
2976
3054
  font-size: 11px;
@@ -3002,7 +3080,7 @@ rte-dialog-outer rte-dialog-button {
3002
3080
 
3003
3081
  /* === Per-dialog width hints === */
3004
3082
 
3005
- /* Insert video: just a URL textarea �� bigger so users can paste long
3083
+ /* Insert video: just a URL textarea �� bigger so users can paste long
3006
3084
  YouTube / Vimeo links without horizontal scroll. */
3007
3085
  rte-dialog-outer.rte-dialog-insertvideo rte-dialog-inner {
3008
3086
  min-width: 520px;
@@ -3015,7 +3093,7 @@ rte-dialog-outer .rte-dialog-line-url textarea {
3015
3093
  word-break: break-all;
3016
3094
  }
3017
3095
 
3018
- /* Insert link / image-by-url: same family �� bigger than the default, but
3096
+ /* Insert link / image-by-url: same family �� bigger than the default, but
3019
3097
  not as wide as the code editor. */
3020
3098
  rte-dialog-outer.rte-dialog-insertlink rte-dialog-inner,
3021
3099
  rte-dialog-outer.rte-panel-insertimage-byurl rte-dialog-inner,
@@ -3029,13 +3107,13 @@ rte-dialog-outer.rte-dialog-insertcode rte-dialog-inner {
3029
3107
  max-width: min(880px, calc(100vw - 32px));
3030
3108
  }
3031
3109
 
3032
- /* Insert table / find / general �� keep a consistent 460 px floor. */
3110
+ /* Insert table / find / general �� keep a consistent 460 px floor. */
3033
3111
  rte-dialog-outer.rte-panel-find rte-dialog-inner,
3034
3112
  rte-dialog-outer.rte-panel-general rte-dialog-inner {
3035
3113
  min-width: 460px;
3036
3114
  }
3037
3115
 
3038
- /* Insert gallery / template / paste cleanup �� comfortable wide layouts
3116
+ /* Insert gallery / template / paste cleanup �� comfortable wide layouts
3039
3117
  for picking from a grid. */
3040
3118
  rte-dialog-outer.rte-dialog-insertgallery rte-dialog-inner,
3041
3119
  rte-dialog-outer.rte-dialog-inserttemplate rte-dialog-inner,
@@ -3045,7 +3123,7 @@ rte-dialog-outer.rte-dialog-pasteword rte-dialog-inner {
3045
3123
  max-width: min(960px, calc(100vw - 32px));
3046
3124
  }
3047
3125
 
3048
- /* Image editor / HTML2PDF �� full creative surface. */
3126
+ /* Image editor / HTML2PDF �� full creative surface. */
3049
3127
  rte-dialog-outer.rte-dialog-imageeditor rte-dialog-inner,
3050
3128
  rte-dialog-outer.rte-dialog-html2pdf rte-dialog-inner {
3051
3129
  min-width: 760px;
@@ -3561,7 +3639,7 @@ rte-toolbar-dropdown-item:focus-visible {
3561
3639
  box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.12);
3562
3640
  }
3563
3641
 
3564
- /* Dark-mode hover for toolbar dropdown items �� the light-blue gradient above is
3642
+ /* Dark-mode hover for toolbar dropdown items �� the light-blue gradient above is
3565
3643
  light-only; without this it renders washed-out (light gradient + dark-blue
3566
3644
  text) over the dark panel. */
3567
3645
  .rte-dark rte-toolbar-dropdown-item:hover,
@@ -4429,7 +4507,7 @@ rte-dropdown-panel .rte-dialog-button:active {
4429
4507
  }
4430
4508
 
4431
4509
  /* ============================================================ */
4432
- /* Dark mode (UI chrome only �� the document canvas stays white, */
4510
+ /* Dark mode (UI chrome only �� the document canvas stays white, */
4433
4511
  /* like Google Docs' dark UI, so authored content isn't harmed).*/
4434
4512
  /* Explicit dark mode by default; add rte-auto-dark to */
4435
4513
  /* follow prefers-color-scheme; force on with rte-dark. */
@@ -4502,7 +4580,7 @@ rte-dropdown-panel .rte-dialog-button:active {
4502
4580
  }
4503
4581
 
4504
4582
  /* ============================================================ */
4505
- /* Dark mode �� dialog & dropdown panel interiors. */
4583
+ /* Dark mode �� dialog & dropdown panel interiors. */
4506
4584
  /* The dialog surface itself is token-driven (var(--rte- */
4507
4585
  /* surface-raised)); these rules cover the text/inputs/borders */
4508
4586
  /* that don't inherit, so dialogs aren't black-text-on-dark. */
@@ -4597,7 +4675,7 @@ rte-dropdown-panel .rte-dialog-button:active {
4597
4675
  }
4598
4676
  }
4599
4677
 
4600
- /* Dark mode �� floating selection toolbar (rte-control-toolbar). Inside the
4678
+ /* Dark mode �� floating selection toolbar (rte-control-toolbar). Inside the
4601
4679
  editor container, so both the explicit class and the media query reach it. */
4602
4680
  .rte-dark rte-control-toolbar {
4603
4681
  background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
@@ -4617,10 +4695,10 @@ rte-dropdown-panel .rte-dialog-button:active {
4617
4695
  }
4618
4696
  .rte-dark rte-link-url-preview, .rte-dark rte-link-url-preview a { color: #60a5fa; }
4619
4697
 
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;
4698
+ @media (prefers-color-scheme: dark) {
4699
+ .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar {
4700
+ background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
4701
+ border-color: #334155;
4624
4702
  }
4625
4703
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-button,
4626
4704
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-splitbutton,
@@ -4631,189 +4709,189 @@ rte-dropdown-panel .rte-dialog-button:active {
4631
4709
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-button:hover,
4632
4710
  .richtexteditor.rte-auto-dark:not(.rte-light) rte-control-toolbar rte-toolbar-splitbutton:hover,
4633
4711
  .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
-
4712
+ background: #334155;
4713
+ }
4714
+ }
4715
+
4716
+ /* 2026-07-02 toolbar icon polish.
4717
+ Keep this after the token-driven chrome rules so the modern toolbar retains
4718
+ its quiet selected state instead of inheriting the older solid accent fill. */
4719
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4720
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4721
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4722
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4723
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4724
+ box-sizing: border-box;
4725
+ display: inline-flex;
4726
+ align-items: center;
4727
+ justify-content: center;
4728
+ color: var(--rte-icon-color, #5f6368);
4729
+ background-clip: padding-box;
4730
+ transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease, box-shadow 120ms ease;
4731
+ }
4732
+
4733
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button svg,
4734
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton svg,
4735
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton svg {
4736
+ display: block !important;
4737
+ flex: 0 0 auto;
4738
+ width: 20px !important;
4739
+ height: 20px !important;
4740
+ margin: 0 !important;
4741
+ align-self: center !important;
4742
+ color: currentColor;
4743
+ pointer-events: none;
4744
+ }
4745
+
4746
+ .rte-modern rte-control-toolbar rte-toolbar-button svg,
4747
+ .rte-modern rte-control-toolbar rte-toolbar-splitbutton svg,
4748
+ .rte-modern rte-control-toolbar rte-toolbar-arrowbutton svg,
4749
+ .rte-modern rte-dropdown-panel rte-toolbar-button svg {
4750
+ display: block !important;
4751
+ margin: 0 !important;
4752
+ align-self: center !important;
4753
+ color: currentColor;
4754
+ pointer-events: none;
4755
+ }
4756
+
4679
4757
  .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;
4758
+ width: 20px !important;
4759
+ height: 20px !important;
4819
4760
  }
4761
+
4762
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4763
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4764
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4765
+ color: #1559d6;
4766
+ background-color: #f3f8ff;
4767
+ border-color: rgba(37,99,235,.14);
4768
+ }
4769
+
4770
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4771
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4772
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4773
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4774
+ color: #1559d6;
4775
+ fill: currentColor;
4776
+ background-color: #edf6ff;
4777
+ border-color: rgba(37,99,235,.22);
4778
+ box-shadow: inset 0 0 0 1px rgba(37,99,235,.12);
4779
+ }
4780
+
4781
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-disabled,
4782
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-disabled,
4783
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-disabled {
4784
+ color: #9aa0a6;
4785
+ opacity: .62;
4786
+ }
4787
+
4788
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-disabled:hover,
4789
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-disabled:hover,
4790
+ .richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-disabled:hover {
4791
+ color: #9aa0a6;
4792
+ background-color: transparent;
4793
+ border-color: transparent;
4794
+ box-shadow: none;
4795
+ }
4796
+
4797
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4798
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4799
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4800
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4801
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4802
+ color: var(--rte-icon-color, #cbd5e1);
4803
+ }
4804
+
4805
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4806
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4807
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4808
+ color: #e2e8f0;
4809
+ background-color: #334155;
4810
+ border-color: #475569;
4811
+ }
4812
+
4813
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4814
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4815
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4816
+ .rte-dark.richtexteditor.rte-modern.rte-desktop rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4817
+ color: #bfdbfe;
4818
+ background-color: #1e3a5f;
4819
+ border-color: rgba(96,165,250,.46);
4820
+ box-shadow: inset 0 0 0 1px rgba(96,165,250,.24);
4821
+ }
4822
+
4823
+ @media (prefers-color-scheme: dark) {
4824
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button,
4825
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton,
4826
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton,
4827
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-direct,
4828
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton-dropdown {
4829
+ color: var(--rte-icon-color, #cbd5e1);
4830
+ }
4831
+
4832
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button:hover,
4833
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton:hover,
4834
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton:hover {
4835
+ color: #e2e8f0;
4836
+ background-color: #334155;
4837
+ border-color: #475569;
4838
+ }
4839
+
4840
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-button.rte-command-active,
4841
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-arrowbutton.rte-command-active,
4842
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-splitbutton.rte-command-active,
4843
+ .richtexteditor.rte-auto-dark.rte-modern.rte-desktop:not(.rte-light) rte-toolbar.rte-toolbar-desktop rte-toolbar-dropdown.rte-command-active {
4844
+ color: #bfdbfe;
4845
+ background-color: #1e3a5f;
4846
+ border-color: rgba(96,165,250,.46);
4847
+ box-shadow: inset 0 0 0 1px rgba(96,165,250,.24);
4848
+ }
4849
+ }
4850
+
4851
+ /* 2026-07-03 dialog top-chrome guard.
4852
+ Dialogs must clear host sticky menus and also sit above editor dropdown
4853
+ panels, which use a higher default z-index than config.zIndexDialog. */
4854
+ rte-dialog-outer,
4855
+ rte-dialog-float,
4856
+ .rte-alt-editor-popup,
4857
+ .rte-find-replace-dialog,
4858
+ .rte-ai-context-menu,
4859
+ .rte-image-quickbar {
4860
+ --rte-dialog-effective-top-chrome: max(var(--rte-ai-sticky-top-offset, 0px), var(--rte-dialog-detected-top-chrome, 0px));
4861
+ }
4862
+
4863
+ rte-dialog-outer {
4864
+ top: max(0px, var(--rte-dialog-effective-top-chrome)) !important;
4865
+ box-sizing: border-box;
4866
+ padding: 12px;
4867
+ overflow: auto;
4868
+ overscroll-behavior: contain;
4869
+ z-index: 2147483646 !important;
4870
+ }
4871
+
4872
+ rte-dialog-outer rte-dialog-inner {
4873
+ max-height: min(88vh, 760px, calc(100vh - max(32px, calc(var(--rte-dialog-effective-top-chrome) + 32px)))) !important;
4874
+ }
4875
+
4876
+ rte-dialog-float {
4877
+ top: max(12px, calc(var(--rte-dialog-effective-top-chrome) + 12px));
4878
+ max-height: calc(100vh - max(32px, calc(var(--rte-dialog-effective-top-chrome) + 32px)));
4879
+ z-index: 2147483646 !important;
4880
+ }
4881
+
4882
+ rte-dialog-float rte-dialog-inner {
4883
+ max-height: inherit;
4884
+ overflow: auto;
4885
+ }
4886
+
4887
+ .rte-alt-editor-popup,
4888
+ .rte-find-replace-dialog,
4889
+ .rte-ai-context-menu {
4890
+ z-index: 2147483646 !important;
4891
+ }
4892
+
4893
+ .rte-find-replace-dialog {
4894
+ top: max(80px, calc(var(--rte-dialog-effective-top-chrome) + 12px)) !important;
4895
+ max-height: calc(100vh - max(104px, calc(var(--rte-dialog-effective-top-chrome) + 32px)));
4896
+ overflow: auto;
4897
+ }