react-dockable-desktop 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -67,6 +67,27 @@
67
67
  --panel-card-border: rgba(255, 255, 255, 0.1);
68
68
  --panel-text: var(--text-primary);
69
69
  --panel-title-color: var(--accent-color, #38bdf8);
70
+ /* ── Panel Overlay — Toolbar ── */
71
+ --panel-toolbar-padding: 8px;
72
+ --panel-toolbar-gap: 4px;
73
+ --panel-toolbar-btn-size: 32px;
74
+ --panel-toolbar-btn-radius: 6px;
75
+ --panel-toolbar-fg: rgba(255, 255, 255, 0.65);
76
+ --panel-toolbar-fg-hover: rgba(255, 255, 255, 0.95);
77
+ --panel-toolbar-btn-hover-bg: var(--toolbar-btn-hover-bg, rgba(255, 255, 255, 0.08));
78
+ --panel-toolbar-btn-active-bg: var(--toolbar-btn-radio-active-bg, rgba(56, 189, 248, 0.14));
79
+ --panel-toolbar-btn-active-color: var(--tab-icon-active, #38bdf8);
80
+ --panel-toolbar-separator-color: var(--toolbar-separator-color, rgba(255, 255, 255, 0.09));
81
+ /* ── Panel Overlay — Floating Window ── */
82
+ --panel-float-bg: rgba(22, 24, 34, 0.92);
83
+ --panel-float-border: rgba(255, 255, 255, 0.1);
84
+ --panel-float-radius: 8px;
85
+ --panel-float-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
86
+ --panel-float-shadow-active: 0 8px 28px rgba(0, 0, 0, 0.55);
87
+ --panel-float-header-bg: var(--window-header-bg, rgba(0, 0, 0, 0.25));
88
+ --panel-float-header-bg-active: var(--window-header-bg, rgba(0, 0, 0, 0.25));
89
+ --panel-float-title-color: var(--window-text, #f8f9fa);
90
+ --panel-float-title-color-active: var(--window-text, #f8f9fa);
70
91
  }
71
92
 
72
93
  html,
@@ -652,26 +673,6 @@ body.resizing-col-active * {
652
673
  box-shadow: none;
653
674
  }
654
675
 
655
- /* Anchor Button Icon Rotations - Base line sits at the bottom in default 0deg state */
656
- .anchor-icon {
657
- transition: transform 0.2s ease, color 0.2s ease;
658
- }
659
- .anchor-sticky-right {
660
- /* Rotates -90deg so the bottom flat line sits on the right-hand side */
661
- transform: rotate(-90deg);
662
- color: var(--accent-color, #38bdf8);
663
- }
664
- .anchor-sticky-bottom {
665
- /* No rotation: the bottom flat line stays on the bottom */
666
- transform: rotate(0deg);
667
- color: var(--accent-color, #38bdf8);
668
- }
669
- .anchor-sticky-both {
670
- /* Rotates -45deg so the bottom flat line sits on the bottom-right corner */
671
- transform: rotate(-45deg);
672
- color: var(--accent-color, #38bdf8);
673
- filter: drop-shadow(0 0 4px var(--accent-glow));
674
- }
675
676
 
676
677
  .floating-window-titlebar {
677
678
  padding: 8px 14px;
@@ -705,57 +706,145 @@ body.resizing-col-active * {
705
706
  cursor: grabbing;
706
707
  }
707
708
 
708
- /* VS Code-style context menu */
709
- .react-contexify {
710
- background-color: #1e1e1e !important;
711
- border: 1px solid #454545 !important;
712
- box-shadow: 0 5px 20px rgba(0, 0, 0, 0.5) !important;
713
- border-radius: 5px !important;
714
- padding: 4px 0 !important;
715
- min-width: 220px !important;
716
- z-index: 99999 !important;
709
+ /* ==========================================================================
710
+ CONTEXT MENU (.dw-context-menu)
711
+ ========================================================================== */
712
+
713
+ /* Icon slot used by both context menu items and toolbar flyout items.
714
+ Fixed width keeps text columns aligned regardless of SVG size. */
715
+ .wm-menu-icon {
716
+ width: 14px;
717
+ display: inline-flex;
718
+ align-items: center;
719
+ justify-content: center;
720
+ flex-shrink: 0;
717
721
  }
718
722
 
719
- .react-contexify .react-contexify__item__content {
720
- color: #cccccc !important;
721
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif !important;
722
- font-size: 13px !important;
723
- padding: 5px 22px 5px 10px !important;
724
- letter-spacing: 0.01em !important;
723
+ .dw-context-menu {
724
+ position: fixed;
725
+ z-index: 9500;
726
+ background: var(--sidebar-bg, #1e2024);
727
+ border: 1px solid var(--sidebar-border, rgba(255, 255, 255, 0.08));
728
+ border-radius: 6px;
729
+ padding: 4px 0;
730
+ min-width: 220px;
731
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);
732
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
733
+ font-size: 13px;
734
+ animation: dw-context-menu-in 0.1s cubic-bezier(0.16, 1, 0.3, 1);
735
+ outline: none;
725
736
  }
726
737
 
727
- .react-contexify .react-contexify__item:not(.react-contexify__item--disabled):hover > .react-contexify__item__content {
728
- background-color: #094771 !important;
729
- color: #ffffff !important;
738
+ @keyframes dw-context-menu-in {
739
+ from { opacity: 0; transform: scale(0.97); }
740
+ to { opacity: 1; transform: scale(1); }
730
741
  }
731
742
 
732
- .react-contexify .react-contexify__separator {
733
- background-color: #454545 !important;
734
- margin: 4px 0 !important;
743
+ .dw-context-menu--submenu {
744
+ z-index: 9501;
735
745
  }
736
746
 
737
- .react-contexify .react-contexify__item-row {
738
- gap: 10px !important;
747
+ .dw-context-menu__separator {
748
+ height: 1px;
749
+ background: var(--sidebar-border, rgba(255, 255, 255, 0.08));
750
+ margin: 4px 8px;
751
+ border: none;
739
752
  }
740
753
 
741
- /* Let the wrapper class own the column width — library container defers to it */
742
- .react-contexify .react-contexify__item-icon {
743
- width: auto !important;
744
- flex-shrink: 0 !important;
754
+ .dw-context-menu__item {
755
+ display: flex;
756
+ align-items: center;
757
+ width: calc(100% - 8px);
758
+ margin: 0 4px;
759
+ padding: 5px 8px;
760
+ gap: 8px;
761
+ background: none;
762
+ border: none;
763
+ border-radius: 4px;
764
+ color: var(--sidebar-text-title, #cccccc);
765
+ cursor: pointer;
766
+ text-align: start;
767
+ white-space: nowrap;
768
+ letter-spacing: 0.01em;
769
+ box-sizing: border-box;
770
+ font-size: inherit;
771
+ font-family: inherit;
745
772
  }
746
773
 
747
- /* Icon slot: fixed width so all text aligns regardless of SVG size.
748
- Override this class to change the icon column width globally. */
749
- .wm-menu-icon {
750
- width: 14px;
774
+ .dw-context-menu__item:hover:not(:disabled):not(.dw-context-menu__item--disabled) {
775
+ background-color: var(--toolbar-btn-hover-bg, rgba(255, 255, 255, 0.07));
776
+ color: var(--sidebar-text-title, #f8f9fa);
777
+ }
778
+
779
+ .dw-context-menu__item:disabled,
780
+ .dw-context-menu__item--disabled {
781
+ opacity: 0.38;
782
+ cursor: default;
783
+ pointer-events: none;
784
+ }
785
+
786
+ .dw-context-menu__item--has-submenu.dw-context-menu__item--submenu-open {
787
+ background-color: var(--toolbar-btn-radio-active-bg, rgba(9, 71, 113, 0.35));
788
+ }
789
+
790
+ .dw-context-menu__icon {
791
+ width: 16px;
792
+ min-width: 16px;
751
793
  display: inline-flex;
752
794
  align-items: center;
753
795
  justify-content: center;
754
796
  flex-shrink: 0;
797
+ color: inherit;
798
+ opacity: 0.85;
799
+ }
800
+
801
+ .dw-context-menu__label {
802
+ flex: 1;
803
+ overflow: hidden;
804
+ text-overflow: ellipsis;
805
+ }
806
+
807
+ .dw-context-menu__chevron {
808
+ flex-shrink: 0;
809
+ margin-left: auto;
810
+ padding-left: 12px;
811
+ font-size: 14px;
812
+ line-height: 1;
813
+ opacity: 0.6;
755
814
  }
756
815
 
757
- .react-contexify .react-contexify__item-label {
758
- text-align: left !important;
816
+ [dir="rtl"] .dw-context-menu__chevron {
817
+ margin-left: 0;
818
+ margin-right: auto;
819
+ padding-left: 0;
820
+ padding-right: 12px;
821
+ transform: scaleX(-1);
822
+ }
823
+
824
+ [dir="rtl"] .dw-context-menu__checkbox {
825
+ margin-left: 0;
826
+ margin-right: auto;
827
+ padding-left: 0;
828
+ padding-right: 12px;
829
+ }
830
+
831
+ .dw-context-menu__checkbox {
832
+ width: 14px;
833
+ min-width: 14px;
834
+ height: 14px;
835
+ flex-shrink: 0;
836
+ margin-left: auto;
837
+ padding-left: 12px;
838
+ display: inline-flex;
839
+ align-items: center;
840
+ justify-content: center;
841
+ color: var(--tab-icon-active, #38bdf8);
842
+ box-sizing: content-box;
843
+ opacity: 0.6;
844
+ }
845
+
846
+ .dw-context-menu__checkbox--checked {
847
+ opacity: 1;
759
848
  }
760
849
 
761
850
  /* Drag split target drop zone overlays */
@@ -1008,6 +1097,16 @@ body.resizing-col-active * {
1008
1097
  --panel-card-border: rgba(0, 0, 0, 0.08);
1009
1098
  --panel-text: #212529;
1010
1099
  --panel-title-color: #0066cc;
1100
+ /* ── Panel Overlay — Toolbar (light) ── */
1101
+ --panel-toolbar-fg: rgba(0, 0, 0, 0.55);
1102
+ --panel-toolbar-fg-hover: rgba(0, 0, 0, 0.85);
1103
+ --panel-toolbar-btn-hover-bg: rgba(0, 0, 0, 0.08);
1104
+ --panel-toolbar-separator-color: rgba(0, 0, 0, 0.1);
1105
+ /* ── Panel Overlay — Floating Window (light) ── */
1106
+ --panel-float-bg: rgba(255, 255, 255, 0.96);
1107
+ --panel-float-border: rgba(0, 0, 0, 0.1);
1108
+ --panel-float-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
1109
+ --panel-float-shadow-active: 0 8px 28px rgba(0, 0, 0, 0.2);
1011
1110
  }
1012
1111
 
1013
1112
  /* ==========================================================================
@@ -1114,23 +1213,20 @@ body.resizing-col-active * {
1114
1213
  position: relative !important;
1115
1214
  }
1116
1215
  [data-workspace-skin="macos"] .floating-window-titlebar .floating-window-title {
1117
- position: absolute !important;
1118
- left: 0 !important;
1119
- right: 0 !important;
1120
- text-align: center !important;
1121
1216
  pointer-events: none !important;
1122
1217
  margin: 0 !important;
1123
- justify-content: center !important;
1218
+ margin-inline-start: 0.5rem !important;
1219
+ flex: 1 !important;
1220
+ min-width: 0 !important;
1221
+ justify-content: flex-end !important;
1124
1222
  }
1125
1223
  [data-workspace-skin="macos"] .floating-window-titlebar .floating-window-title > * {
1126
1224
  pointer-events: auto;
1127
1225
  }
1128
1226
  [data-workspace-skin="macos"] .floating-window-titlebar .fw-titlebar-actions {
1129
1227
  flex-direction: row-reverse !important;
1130
- position: relative !important;
1131
- z-index: 1 !important;
1132
1228
  }
1133
- [data-workspace-skin="macos"] .custom-tab-btn:not(.btn-anchor-tab) svg {
1229
+ [data-workspace-skin="macos"] .custom-tab-btn svg {
1134
1230
  display: none !important;
1135
1231
  }
1136
1232
  [data-workspace-skin="macos"] .btn-close-tab {
@@ -1142,39 +1238,6 @@ body.resizing-col-active * {
1142
1238
  [data-workspace-skin="macos"] .btn-maximize-tab {
1143
1239
  background-color: #27c93f !important; /* Green (Maximize) */
1144
1240
  }
1145
- [data-workspace-skin="macos"] .btn-anchor-tab {
1146
- /* Default: Neutral Graphite/Slate dot when inactive */
1147
- background-color: #8e8e93 !important;
1148
- }
1149
- /* When inactive (no sticky values) - show as a neutral grey macOS dot */
1150
- [data-workspace-skin="macos"] .btn-anchor-tab:not(:has(.anchor-sticky-right)):not(:has(.anchor-sticky-bottom)):not(:has(.anchor-sticky-both)) {
1151
- background-color: #8e8e93 !important;
1152
- }
1153
- [data-workspace-skin="macos"][data-color-scheme="light"] .btn-anchor-tab:not(:has(.anchor-sticky-right)):not(:has(.anchor-sticky-bottom)):not(:has(.anchor-sticky-both)) {
1154
- background-color: #a4a4a8 !important;
1155
- }
1156
-
1157
- /* macOS Active Snapped Dot State: Solid active blue with high-contrast yellow icon */
1158
- [data-workspace-skin="macos"] .btn-anchor-tab:has(.anchor-sticky-right),
1159
- [data-workspace-skin="macos"] .btn-anchor-tab:has(.anchor-sticky-bottom),
1160
- [data-workspace-skin="macos"] .btn-anchor-tab:has(.anchor-sticky-both) {
1161
- background-color: #007aff !important;
1162
- border: 1px solid rgba(0,0,0,0.15) !important;
1163
- }
1164
-
1165
- /* Ensure the anchor icon displays cleanly and is centered inside the macOS dot */
1166
- [data-workspace-skin="macos"] .btn-anchor-tab {
1167
- display: flex !important;
1168
- align-items: center !important;
1169
- justify-content: center !important;
1170
- }
1171
- [data-workspace-skin="macos"] .btn-anchor-tab svg {
1172
- display: block !important;
1173
- color: #ffbd2e !important; /* Premium macOS system yellow */
1174
- width: 9px !important;
1175
- height: 9px !important;
1176
- flex-shrink: 0;
1177
- }
1178
1241
 
1179
1242
  /* Panel Icon Styling and Alignment */
1180
1243
  .workspace-tab-icon,
@@ -1185,7 +1248,7 @@ body.resizing-col-active * {
1185
1248
  flex-shrink: 0;
1186
1249
  vertical-align: middle;
1187
1250
  line-height: 1;
1188
- margin-right: 4px !important; /* Forces the gap between the icon and the text title */
1251
+ margin-inline-end: 4px !important; /* Forces the gap between the icon and the text title */
1189
1252
  }
1190
1253
 
1191
1254
  .workspace-tab-icon svg,
@@ -1514,27 +1577,18 @@ body.resizing-col-active * {
1514
1577
  ========================================================================== */
1515
1578
 
1516
1579
  /* --------------------------------------------------------------------------
1517
- vscode — Accent Bar (2 px, rounded chip, near-zero fill)
1580
+ vscode — Accent Bar (2 px bar, fully transparent fill — faithful to VS Code)
1518
1581
  -------------------------------------------------------------------------- */
1519
1582
  [data-workspace-skin="vscode"] {
1520
- --tab-btn-active-bg: rgba(255, 255, 255, 0.07);
1521
- --tab-btn-active-radius: 6px;
1583
+ --tab-btn-active-bg: transparent;
1522
1584
  --tab-accent-bar-width: 2px;
1523
- --toolbar-btn-radio-active-bg: rgba(255, 255, 255, 0.07);
1585
+ --toolbar-btn-radio-active-bg: transparent;
1524
1586
  --toolbar-accent-bar-width: 2px;
1525
1587
  }
1526
1588
  [data-workspace-skin="vscode"] .sidebar-tab-btn.active {
1527
1589
  border-top: 1px solid transparent !important;
1528
1590
  border-bottom: 1px solid transparent !important;
1529
1591
  }
1530
- [data-workspace-skin="vscode"] .toolbar-strip .toolbar-btn-radio.active,
1531
- [data-workspace-skin="vscode"] .toolbar-strip .toolbar-btn-group.active {
1532
- border-radius: 6px !important;
1533
- }
1534
- [data-workspace-skin="vscode"][data-color-scheme="light"] {
1535
- --tab-btn-active-bg: rgba(0, 0, 0, 0.06);
1536
- --toolbar-btn-radio-active-bg: rgba(0, 0, 0, 0.06);
1537
- }
1538
1592
 
1539
1593
  /* --------------------------------------------------------------------------
1540
1594
  chrome — Tab Shape (sidebar bridge, toolbar accent-tinted)
@@ -1569,6 +1623,7 @@ body.resizing-col-active * {
1569
1623
  [data-workspace-skin="slate"] .sidebar-tab-btn.active {
1570
1624
  border-top: 1px solid transparent !important;
1571
1625
  border-bottom: 1px solid transparent !important;
1626
+ margin: 0 !important;
1572
1627
  }
1573
1628
  [data-workspace-skin="slate"] .toolbar-strip .toolbar-btn-radio.active,
1574
1629
  [data-workspace-skin="slate"] .toolbar-strip .toolbar-btn-group.active {
@@ -1580,7 +1635,7 @@ body.resizing-col-active * {
1580
1635
  }
1581
1636
 
1582
1637
  /* --------------------------------------------------------------------------
1583
- nord — Nordic Dot (zero fill, zero bar, 4 px accent dot via ::after)
1638
+ nord — Nordic Line (zero fill, zero bar, 16×2 px accent line via ::after)
1584
1639
  -------------------------------------------------------------------------- */
1585
1640
  [data-workspace-skin="nord"] {
1586
1641
  --tab-btn-active-bg: transparent;
@@ -1602,9 +1657,9 @@ body.resizing-col-active * {
1602
1657
  bottom: 5px;
1603
1658
  left: 50%;
1604
1659
  transform: translateX(-50%);
1605
- width: 4px;
1606
- height: 4px;
1607
- border-radius: 50%;
1660
+ width: 16px;
1661
+ height: 2px;
1662
+ border-radius: 1px;
1608
1663
  background-color: var(--tab-icon-active);
1609
1664
  }
1610
1665
  [data-workspace-skin="nord"] .toolbar-strip .toolbar-btn-radio.active,
@@ -1625,9 +1680,9 @@ body.resizing-col-active * {
1625
1680
  bottom: 4px;
1626
1681
  left: 50%;
1627
1682
  transform: translateX(-50%);
1628
- width: 4px;
1629
- height: 4px;
1630
- border-radius: 50%;
1683
+ width: 14px;
1684
+ height: 2px;
1685
+ border-radius: 1px;
1631
1686
  background-color: var(--tab-icon-active);
1632
1687
  }
1633
1688
  [data-workspace-skin="nord"] .toolbar-strip.bottom .toolbar-btn-radio.active::after,
@@ -1637,9 +1692,9 @@ body.resizing-col-active * {
1637
1692
  top: 4px;
1638
1693
  left: 50%;
1639
1694
  transform: translateX(-50%);
1640
- width: 4px;
1641
- height: 4px;
1642
- border-radius: 50%;
1695
+ width: 14px;
1696
+ height: 2px;
1697
+ border-radius: 1px;
1643
1698
  background-color: var(--tab-icon-active);
1644
1699
  }
1645
1700
 
@@ -1722,57 +1777,34 @@ body.resizing-col-active * {
1722
1777
  }
1723
1778
 
1724
1779
  /* --------------------------------------------------------------------------
1725
- macos — Glass Merge (frosted glass, rounded outer corners, no bar)
1780
+ macos — Glass Chip (full-round floating chip, accent fill + white ring)
1781
+ Inspired by macOS app icon strip conventions: Xcode, Logic Pro, System Settings.
1782
+ A contained chip that floats inside the strip — not an edge-connecting bridge.
1726
1783
  -------------------------------------------------------------------------- */
1727
1784
  [data-workspace-skin="macos"] {
1728
- --tab-btn-active-bg: rgba(255, 255, 255, 0.16);
1785
+ --tab-btn-active-bg: rgba(56, 189, 248, 0.2);
1786
+ --tab-btn-active-width: 36px;
1787
+ --tab-btn-active-radius: 10px;
1788
+ --tab-btn-active-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
1729
1789
  --tab-accent-bar-width: 0px;
1730
- --toolbar-btn-radio-active-bg: rgba(255, 255, 255, 0.16);
1790
+ --toolbar-btn-radio-active-bg: rgba(56, 189, 248, 0.2);
1791
+ --toolbar-btn-active-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
1731
1792
  --toolbar-accent-bar-width: 0px;
1732
1793
  }
1733
- [data-workspace-skin="macos"] .sidebar-tabs-strip.left .sidebar-tab-btn.active {
1734
- border-radius: 0 10px 10px 0 !important;
1735
- backdrop-filter: blur(8px) saturate(160%);
1736
- -webkit-backdrop-filter: blur(8px) saturate(160%);
1737
- border-left: none !important;
1738
- }
1739
- [data-workspace-skin="macos"] .sidebar-tabs-strip.right .sidebar-tab-btn.active {
1740
- border-radius: 10px 0 0 10px !important;
1741
- backdrop-filter: blur(8px) saturate(160%);
1742
- -webkit-backdrop-filter: blur(8px) saturate(160%);
1743
- border-right: none !important;
1744
- }
1745
- [data-workspace-skin="macos"] .toolbar-strip.left .toolbar-btn-radio.active,
1746
- [data-workspace-skin="macos"] .toolbar-strip.left .toolbar-btn-group.active {
1747
- border-radius: 0 10px 10px 0 !important;
1748
- border-left: none !important;
1749
- backdrop-filter: blur(8px) saturate(160%);
1750
- -webkit-backdrop-filter: blur(8px) saturate(160%);
1751
- }
1752
- [data-workspace-skin="macos"] .toolbar-strip.right .toolbar-btn-radio.active,
1753
- [data-workspace-skin="macos"] .toolbar-strip.right .toolbar-btn-group.active {
1754
- border-radius: 10px 0 0 10px !important;
1755
- border-right: none !important;
1756
- backdrop-filter: blur(8px) saturate(160%);
1757
- -webkit-backdrop-filter: blur(8px) saturate(160%);
1758
- }
1759
- [data-workspace-skin="macos"] .toolbar-strip.top .toolbar-btn-radio.active,
1760
- [data-workspace-skin="macos"] .toolbar-strip.top .toolbar-btn-group.active {
1761
- border-radius: 0 0 10px 10px !important;
1762
- border-bottom: none !important;
1763
- backdrop-filter: blur(8px) saturate(160%);
1764
- -webkit-backdrop-filter: blur(8px) saturate(160%);
1794
+ [data-workspace-skin="macos"] .sidebar-tab-btn.active {
1795
+ border-top: 1px solid transparent !important;
1796
+ border-bottom: 1px solid transparent !important;
1797
+ margin: 0 !important;
1765
1798
  }
1766
- [data-workspace-skin="macos"] .toolbar-strip.bottom .toolbar-btn-radio.active,
1767
- [data-workspace-skin="macos"] .toolbar-strip.bottom .toolbar-btn-group.active {
1768
- border-radius: 10px 10px 0 0 !important;
1769
- border-top: none !important;
1770
- backdrop-filter: blur(8px) saturate(160%);
1771
- -webkit-backdrop-filter: blur(8px) saturate(160%);
1799
+ [data-workspace-skin="macos"] .toolbar-strip .toolbar-btn-radio.active,
1800
+ [data-workspace-skin="macos"] .toolbar-strip .toolbar-btn-group.active {
1801
+ border-radius: 10px !important;
1772
1802
  }
1773
1803
  [data-workspace-skin="macos"][data-color-scheme="light"] {
1774
- --tab-btn-active-bg: rgba(255, 255, 255, 0.72);
1775
- --toolbar-btn-radio-active-bg: rgba(255, 255, 255, 0.72);
1804
+ --tab-btn-active-bg: rgba(0, 102, 204, 0.16);
1805
+ --tab-btn-active-shadow: inset 0 0 0 1px rgba(0, 102, 204, 0.3);
1806
+ --toolbar-btn-radio-active-bg: rgba(0, 102, 204, 0.16);
1807
+ --toolbar-btn-active-shadow: inset 0 0 0 1px rgba(0, 102, 204, 0.3);
1776
1808
  }
1777
1809
 
1778
1810
  /* --- Modern Sidebar and Tabs UI Theme Customizations --- */
@@ -2215,33 +2247,34 @@ html:not(.enable-animations) *::after {
2215
2247
  animation: fadeIn 0.15s ease-out;
2216
2248
  }
2217
2249
 
2218
- .edge-preview-left {
2219
- left: 0;
2220
- top: 0;
2221
- bottom: 0;
2222
- width: 30%;
2223
- }
2224
-
2225
- .edge-preview-right {
2226
- right: 0;
2227
- top: 0;
2228
- bottom: 0;
2229
- width: 30%;
2250
+ /* Workspace corner anchor drop zones */
2251
+ .fw-corner-zone {
2252
+ position: absolute;
2253
+ width: 80px;
2254
+ height: 80px;
2255
+ border: 2px dashed var(--accent-color, #38bdf8);
2256
+ border-radius: 8px;
2257
+ background: rgba(56, 189, 248, 0.06);
2258
+ pointer-events: auto;
2259
+ z-index: 10000;
2260
+ opacity: 0.55;
2261
+ transition: opacity 0.15s ease, background 0.15s ease, border-style 0.15s ease;
2262
+ }
2263
+ .fw-corner-zone--top-left { top: 0; left: 0; }
2264
+ .fw-corner-zone--top-right { top: 0; right: 0; }
2265
+ .fw-corner-zone--bottom-left { bottom: 0; left: 0; }
2266
+ .fw-corner-zone--bottom-right { bottom: 0; right: 0; }
2267
+ .fw-corner-zone--hovered {
2268
+ opacity: 1;
2269
+ background: rgba(56, 189, 248, 0.18);
2270
+ border-style: solid;
2230
2271
  }
2231
2272
 
2232
- .edge-preview-top {
2233
- top: 0;
2234
- left: 0;
2235
- right: 0;
2236
- height: 30%;
2237
- }
2273
+ [dir="rtl"] .fw-corner-zone--top-right { right: auto; left: 0; }
2274
+ [dir="rtl"] .fw-corner-zone--top-left { left: auto; right: 0; }
2275
+ [dir="rtl"] .fw-corner-zone--bottom-right { right: auto; left: 0; }
2276
+ [dir="rtl"] .fw-corner-zone--bottom-left { left: auto; right: 0; }
2238
2277
 
2239
- .edge-preview-bottom {
2240
- bottom: 0;
2241
- left: 0;
2242
- right: 0;
2243
- height: 30%;
2244
- }
2245
2278
 
2246
2279
  /*
2247
2280
  * Counteract scale for canvas and its siblings inside Luciad containers.
@@ -2268,14 +2301,6 @@ html:not(.enable-animations) *::after {
2268
2301
  RTL (Right-to-Left) Support
2269
2302
  ========================================== */
2270
2303
 
2271
- [dir="rtl"] .workspace-tab-bar {
2272
- flex-direction: row-reverse !important;
2273
- }
2274
-
2275
- [dir="rtl"] .tab-headers-container {
2276
- flex-direction: row-reverse !important;
2277
- }
2278
-
2279
2304
  [dir="rtl"] .workspace-tab {
2280
2305
  border-right: none !important;
2281
2306
  border-left: 1px solid var(--border-panel) !important;
@@ -2311,23 +2336,10 @@ html:not(.enable-animations) *::after {
2311
2336
  margin-right: auto !important;
2312
2337
  }
2313
2338
 
2314
- /* Floating window title bar adjustments */
2315
- [dir="rtl"] [data-workspace-skin="vscode"] .floating-window-titlebar,
2316
- [dir="rtl"] [data-workspace-skin="chrome"] .floating-window-titlebar,
2317
- [dir="rtl"] [data-workspace-skin="slate"] .floating-window-titlebar {
2318
- flex-direction: row-reverse !important;
2319
- }
2320
-
2321
- [dir="rtl"] [data-workspace-skin="vscode"] .floating-window-titlebar .fw-titlebar-actions,
2322
- [dir="rtl"] [data-workspace-skin="chrome"] .floating-window-titlebar .fw-titlebar-actions,
2323
- [dir="rtl"] [data-workspace-skin="slate"] .floating-window-titlebar .fw-titlebar-actions {
2324
- flex-direction: row-reverse !important;
2325
- }
2326
-
2327
- [dir="rtl"] .floating-window-title {
2328
- margin-right: 0 !important;
2329
- margin-left: auto !important;
2330
- }
2339
+ /* Floating window title bar RTL — inherited direction:rtl on the titlebar flex container
2340
+ moves buttons (last in DOM) to the LEFT and title (first in DOM) to the RIGHT.
2341
+ No explicit row-reverse needed; only prevent the button group from reordering internally. */
2342
+ [dir="rtl"] .fw-titlebar-actions { flex-direction: row; }
2331
2343
 
2332
2344
  /* Side Panels transitions slide-in direction */
2333
2345
  [dir="rtl"] .v2-side-panel-left {
@@ -2363,15 +2375,19 @@ html:not(.enable-animations) *::after {
2363
2375
 
2364
2376
  /* macOS Skin - RTL floating window titlebar overrides
2365
2377
  Dots must stay on the LEFT in both LTR and RTL (real macOS behavior).
2366
- Title is absolutely centered, so no direction-specific adjustment needed.
2367
- In RTL, row-reverse naturally places the button group on the left. */
2368
- [dir="rtl"][data-workspace-skin="macos"] .floating-window-titlebar {
2369
- flex-direction: row-reverse !important;
2378
+ In RTL context flex-direction:row flows items right-to-left, so
2379
+ DOM [title][buttons] title at RIGHT, buttons at LEFT. */
2380
+ [dir="rtl"] [data-workspace-skin="macos"] .floating-window-titlebar {
2381
+ flex-direction: row !important;
2370
2382
  }
2371
-
2372
- /* Button group: keep dots in correct visual order (Red → Yellow → Green)
2373
- from left to right regardless of text direction */
2374
- [dir="rtl"][data-workspace-skin="macos"] .floating-window-titlebar .fw-titlebar-actions {
2383
+ /* Title: pack icon+text toward the visual right (flex-start = right in RTL) */
2384
+ [dir="rtl"] [data-workspace-skin="macos"] .floating-window-titlebar .floating-window-title {
2385
+ justify-content: flex-start !important;
2386
+ }
2387
+ /* Button group: keep dots in correct visual order (Red → Yellow → Green, close at far left).
2388
+ direction:rtl (inherited) + flex-direction:row = right-to-left → DOM first item (more) at right,
2389
+ last item (close) at left. */
2390
+ [dir="rtl"] [data-workspace-skin="macos"] .floating-window-titlebar .fw-titlebar-actions {
2375
2391
  flex-direction: row !important;
2376
2392
  }
2377
2393
 
@@ -2381,6 +2397,70 @@ html:not(.enable-animations) *::after {
2381
2397
  margin-right: 2px !important;
2382
2398
  }
2383
2399
 
2400
+ /* ── Sidebar strips — separator border, accent indicator, drawer shadow ──
2401
+ direction: rtl (inherited from workspace root) reverses the flex row so
2402
+ .left strips move visually to the RIGHT and .right strips to the LEFT.
2403
+ All physical border-left/border-right and box-shadow directions must swap. */
2404
+
2405
+ [dir="rtl"] .sidebar-tabs-strip.left {
2406
+ border-left: 1px solid var(--sidebar-border) !important;
2407
+ border-right: none !important;
2408
+ }
2409
+ [dir="rtl"] .sidebar-tabs-strip.right {
2410
+ border-right: 1px solid var(--sidebar-border) !important;
2411
+ border-left: none !important;
2412
+ }
2413
+
2414
+ [dir="rtl"] .sidebar-tabs-strip.left .sidebar-tab-btn.active {
2415
+ border-left: none !important;
2416
+ border-right: var(--tab-accent-bar-width) solid var(--tab-icon-active) !important;
2417
+ margin-left: -2px !important;
2418
+ margin-right: 0 !important;
2419
+ }
2420
+ [dir="rtl"] .sidebar-tabs-strip.right .sidebar-tab-btn.active {
2421
+ border-right: none !important;
2422
+ border-left: var(--tab-accent-bar-width) solid var(--tab-icon-active) !important;
2423
+ margin-right: -2px !important;
2424
+ margin-left: 0 !important;
2425
+ }
2426
+
2427
+ [dir="rtl"] .sidebar-content-drawer.left {
2428
+ border-left: 1px solid var(--sidebar-border) !important;
2429
+ border-right: none !important;
2430
+ box-shadow: -4px 0 16px rgba(0, 0, 0, 0.12);
2431
+ }
2432
+ [dir="rtl"] .sidebar-content-drawer.right {
2433
+ border-right: 1px solid var(--sidebar-border) !important;
2434
+ border-left: none !important;
2435
+ box-shadow: 4px 0 16px rgba(0, 0, 0, 0.12);
2436
+ }
2437
+
2438
+ /* obsidian & tokyo — flip the inset glow X offset sign */
2439
+ [dir="rtl"] [data-workspace-skin="obsidian"] .sidebar-tabs-strip.left .sidebar-tab-btn.active {
2440
+ box-shadow: var(--tab-btn-active-shadow), inset -3px 0 8px rgba(255, 255, 255, 0.08) !important;
2441
+ }
2442
+ [dir="rtl"] [data-workspace-skin="obsidian"] .sidebar-tabs-strip.right .sidebar-tab-btn.active {
2443
+ box-shadow: var(--tab-btn-active-shadow), inset 3px 0 8px rgba(255, 255, 255, 0.08) !important;
2444
+ }
2445
+ [dir="rtl"] [data-workspace-skin="tokyo"] .sidebar-tabs-strip.left .sidebar-tab-btn.active {
2446
+ box-shadow: var(--tab-btn-active-shadow), inset -3px 0 12px rgba(122, 162, 247, 0.18) !important;
2447
+ }
2448
+ [dir="rtl"] [data-workspace-skin="tokyo"] .sidebar-tabs-strip.right .sidebar-tab-btn.active {
2449
+ box-shadow: var(--tab-btn-active-shadow), inset 3px 0 12px rgba(122, 162, 247, 0.18) !important;
2450
+ }
2451
+
2452
+ /* chrome — swap the capsule border-radius when strips change sides */
2453
+ [dir="rtl"] [data-workspace-skin="chrome"] .sidebar-tabs-strip.left .sidebar-tab-btn.active {
2454
+ border-radius: 10px 0 0 10px !important;
2455
+ margin-left: 0 !important;
2456
+ margin-right: 0 !important;
2457
+ }
2458
+ [dir="rtl"] [data-workspace-skin="chrome"] .sidebar-tabs-strip.right .sidebar-tab-btn.active {
2459
+ border-radius: 0 10px 10px 0 !important;
2460
+ margin-right: 0 !important;
2461
+ margin-left: 0 !important;
2462
+ }
2463
+
2384
2464
  /* ==========================================================================
2385
2465
  FRAMEWORK-AGNOSTIC UTILITY CLASSES
2386
2466
  (replaces Bootstrap utility class dependencies)
@@ -2996,11 +3076,19 @@ html:not(.enable-animations) *::after {
2996
3076
  to { opacity: 1; transform: scale(1); }
2997
3077
  }
2998
3078
 
2999
- /* Horizontal layout for top/bottom toolbars */
3000
- .toolbar-group-flyout.top,
3001
- .toolbar-group-flyout.bottom {
3002
- flex-direction: row;
3003
- min-width: unset;
3079
+ /* Animation origin matches the edge closest to the toolbar button */
3080
+ .toolbar-group-flyout.left { transform-origin: top left; }
3081
+ .toolbar-group-flyout.right { transform-origin: top right; }
3082
+ .toolbar-group-flyout.top { transform-origin: top left; }
3083
+ .toolbar-group-flyout.bottom { transform-origin: bottom left; }
3084
+ /* RTL: physical sides swap, so animation origin flips horizontally */
3085
+ [dir="rtl"] .toolbar-group-flyout.left { transform-origin: top right; }
3086
+ [dir="rtl"] .toolbar-group-flyout.right { transform-origin: top left; }
3087
+ [dir="rtl"] .toolbar-group-flyout.top { transform-origin: top right; }
3088
+ [dir="rtl"] .toolbar-group-flyout.bottom { transform-origin: bottom right; }
3089
+
3090
+ [dir="rtl"] .toolbar-group-flyout-label {
3091
+ text-align: right;
3004
3092
  }
3005
3093
 
3006
3094
  .toolbar-group-flyout-item {
@@ -3014,7 +3102,7 @@ html:not(.enable-animations) *::after {
3014
3102
  color: var(--sidebar-text-title, var(--text-primary));
3015
3103
  cursor: pointer;
3016
3104
  width: 100%;
3017
- text-align: left;
3105
+ text-align: start;
3018
3106
  font-size: 0.8125rem;
3019
3107
  font-family: inherit;
3020
3108
  flex-shrink: 0;
@@ -3045,13 +3133,6 @@ html:not(.enable-animations) *::after {
3045
3133
  justify-content: center;
3046
3134
  }
3047
3135
 
3048
- /* top/bottom flyout: icon only, hide label and shortcut */
3049
- .toolbar-group-flyout.top .toolbar-group-flyout-label,
3050
- .toolbar-group-flyout.bottom .toolbar-group-flyout-label,
3051
- .toolbar-group-flyout.top .toolbar-group-flyout-shortcut,
3052
- .toolbar-group-flyout.bottom .toolbar-group-flyout-shortcut {
3053
- display: none;
3054
- }
3055
3136
 
3056
3137
  .toolbar-group-flyout-label {
3057
3138
  flex: 1;
@@ -3074,13 +3155,6 @@ html:not(.enable-animations) *::after {
3074
3155
  flex-shrink: 0;
3075
3156
  }
3076
3157
 
3077
- /* Vertical separator for horizontal flyout */
3078
- .toolbar-group-flyout.top .toolbar-group-flyout-sep,
3079
- .toolbar-group-flyout.bottom .toolbar-group-flyout-sep {
3080
- width: 1px;
3081
- height: 16px;
3082
- margin: auto 2px;
3083
- }
3084
3158
 
3085
3159
  /* Button base — used in ConfirmationForm and similar dialogs */
3086
3160
  .dw-btn {
@@ -3264,3 +3338,568 @@ html:not(.enable-animations) *::after {
3264
3338
  /* Note: touch-action and -webkit-overflow-scrolling intentionally omitted — they cause iOS Safari
3265
3339
  to fire pointercancel before the 300ms long-press timer can activate tab drag */
3266
3340
  .tab-headers-container::-webkit-scrollbar { display: none; }
3341
+
3342
+ /* ==========================================================================
3343
+ PANEL OVERLAY — Per-skin token overrides
3344
+ ========================================================================== */
3345
+
3346
+ [data-workspace-skin="vscode"] {
3347
+ --panel-toolbar-btn-hover-bg: rgba(255, 255, 255, 0.12);
3348
+ }
3349
+
3350
+ [data-workspace-skin="macos"] {
3351
+ --panel-toolbar-btn-hover-bg: rgba(255, 255, 255, 0.18);
3352
+ }
3353
+
3354
+ [data-workspace-skin="slate"] {
3355
+ --panel-toolbar-btn-active-color: #60a5fa;
3356
+ --panel-toolbar-btn-active-bg: rgba(96, 165, 250, 0.15);
3357
+ }
3358
+
3359
+ [data-workspace-skin="nord"] {
3360
+ --panel-toolbar-btn-active-color: #88c0d0;
3361
+ --panel-toolbar-btn-active-bg: rgba(136, 192, 208, 0.15);
3362
+ }
3363
+
3364
+ [data-workspace-skin="obsidian"] {
3365
+ --panel-toolbar-btn-active-color: #a78bfa;
3366
+ --panel-toolbar-btn-active-bg: rgba(167, 139, 250, 0.15);
3367
+ }
3368
+
3369
+ [data-workspace-skin="tokyo"] {
3370
+ --panel-toolbar-btn-active-color: #7aa2f7;
3371
+ --panel-toolbar-btn-active-bg: rgba(122, 162, 247, 0.15);
3372
+ }
3373
+
3374
+ /* ==========================================================================
3375
+ PANEL OVERLAY — PanelToolbar + PanelFloatingWindow
3376
+ ========================================================================== */
3377
+
3378
+ /* ── Root container ── */
3379
+ .dw-panel-overlay-root {
3380
+ position: relative;
3381
+ width: 100%;
3382
+ height: 100%;
3383
+ overflow: hidden;
3384
+ }
3385
+
3386
+ /* ── Toolbar container ── */
3387
+ .dw-panel-toolbar {
3388
+ position: absolute;
3389
+ z-index: 5;
3390
+ pointer-events: none;
3391
+ display: flex;
3392
+ align-items: center;
3393
+ gap: var(--panel-toolbar-gap, 4px);
3394
+ padding: var(--panel-toolbar-padding, 8px);
3395
+ box-sizing: border-box;
3396
+ }
3397
+
3398
+ .dw-panel-toolbar--top,
3399
+ .dw-panel-toolbar--bottom {
3400
+ flex-direction: row;
3401
+ }
3402
+
3403
+ .dw-panel-toolbar--left,
3404
+ .dw-panel-toolbar--right {
3405
+ flex-direction: column;
3406
+ }
3407
+
3408
+ /* Restore pointer-events on every direct child */
3409
+ .dw-panel-toolbar > * {
3410
+ pointer-events: auto;
3411
+ }
3412
+
3413
+ /* ── Toolbar button (shared by ToolbarButton + ToolbarToggle) ── */
3414
+ .dw-panel-toolbar-btn {
3415
+ display: inline-flex;
3416
+ align-items: center;
3417
+ justify-content: center;
3418
+ width: var(--panel-toolbar-btn-size, 32px);
3419
+ height: var(--panel-toolbar-btn-size, 32px);
3420
+ flex-shrink: 0;
3421
+ border-radius: var(--panel-toolbar-btn-radius, 6px);
3422
+ border: none;
3423
+ background: transparent;
3424
+ color: var(--panel-toolbar-fg, rgba(255, 255, 255, 0.65));
3425
+ cursor: pointer;
3426
+ padding: 0;
3427
+ transition: background 0.12s ease, color 0.12s ease, transform 0.1s ease, border-color 0.12s ease;
3428
+ }
3429
+
3430
+ .dw-panel-toolbar-btn:hover:not(:disabled) {
3431
+ background: var(--panel-toolbar-btn-hover-bg, rgba(255, 255, 255, 0.15));
3432
+ color: var(--panel-toolbar-fg-hover, rgba(255, 255, 255, 0.95));
3433
+ transform: scale(1.07);
3434
+ }
3435
+
3436
+ .dw-panel-toolbar-btn:active:not(:disabled) {
3437
+ transform: scale(0.94);
3438
+ }
3439
+
3440
+ .dw-panel-toolbar-btn--active {
3441
+ background: var(--panel-toolbar-btn-active-bg, rgba(56, 189, 248, 0.14));
3442
+ color: var(--panel-toolbar-btn-active-color, #38bdf8);
3443
+ }
3444
+
3445
+ .dw-panel-toolbar-btn--active:hover:not(:disabled) {
3446
+ background: var(--panel-toolbar-btn-active-bg, rgba(56, 189, 248, 0.22));
3447
+ }
3448
+
3449
+ .dw-panel-toolbar-btn:disabled {
3450
+ opacity: 0.38;
3451
+ cursor: not-allowed;
3452
+ }
3453
+
3454
+ /* ── Toolbar strip variants ── */
3455
+ .dw-panel-toolbar[data-variant="frosted"] {
3456
+ background: rgba(15, 20, 30, 0.55);
3457
+ backdrop-filter: blur(10px) saturate(150%);
3458
+ -webkit-backdrop-filter: blur(10px) saturate(150%);
3459
+ }
3460
+ .dw-panel-toolbar[data-variant="solid"] {
3461
+ background: var(--bg-tab-bar, #0d0f16);
3462
+ }
3463
+ [data-color-scheme="light"] .dw-panel-toolbar[data-variant="frosted"] {
3464
+ background: rgba(233, 236, 239, 0.72);
3465
+ }
3466
+ .dw-panel-toolbar--top[data-variant="frosted"],
3467
+ .dw-panel-toolbar--top[data-variant="solid"] {
3468
+ border-bottom: 1px solid var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
3469
+ }
3470
+ .dw-panel-toolbar--bottom[data-variant="frosted"],
3471
+ .dw-panel-toolbar--bottom[data-variant="solid"] {
3472
+ border-top: 1px solid var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
3473
+ }
3474
+ .dw-panel-toolbar--left[data-variant="frosted"],
3475
+ .dw-panel-toolbar--left[data-variant="solid"] {
3476
+ border-right: 1px solid var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
3477
+ }
3478
+ .dw-panel-toolbar--right[data-variant="frosted"],
3479
+ .dw-panel-toolbar--right[data-variant="solid"] {
3480
+ border-left: 1px solid var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
3481
+ }
3482
+
3483
+ /* ── Button variants — toolbar-level default ── */
3484
+
3485
+ /* soft */
3486
+ .dw-panel-toolbar[data-btn-variant="soft"] .dw-panel-toolbar-btn,
3487
+ .dw-panel-toolbar-btn[data-variant="soft"] {
3488
+ background: rgba(255, 255, 255, 0.06);
3489
+ }
3490
+ .dw-panel-toolbar[data-btn-variant="soft"] .dw-panel-toolbar-btn:hover:not(:disabled),
3491
+ .dw-panel-toolbar-btn[data-variant="soft"]:hover:not(:disabled) {
3492
+ background: rgba(255, 255, 255, 0.15);
3493
+ }
3494
+ [data-color-scheme="light"] .dw-panel-toolbar[data-btn-variant="soft"] .dw-panel-toolbar-btn,
3495
+ [data-color-scheme="light"] .dw-panel-toolbar-btn[data-variant="soft"] {
3496
+ background: rgba(0, 0, 0, 0.04);
3497
+ }
3498
+ [data-color-scheme="light"] .dw-panel-toolbar[data-btn-variant="soft"] .dw-panel-toolbar-btn:hover:not(:disabled),
3499
+ [data-color-scheme="light"] .dw-panel-toolbar-btn[data-variant="soft"]:hover:not(:disabled) {
3500
+ background: rgba(0, 0, 0, 0.08);
3501
+ }
3502
+
3503
+ /* outlined */
3504
+ .dw-panel-toolbar[data-btn-variant="outlined"] .dw-panel-toolbar-btn,
3505
+ .dw-panel-toolbar-btn[data-variant="outlined"] {
3506
+ border: 1px solid var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.18));
3507
+ }
3508
+ .dw-panel-toolbar[data-btn-variant="outlined"] .dw-panel-toolbar-btn:hover:not(:disabled),
3509
+ .dw-panel-toolbar-btn[data-variant="outlined"]:hover:not(:disabled) {
3510
+ background: rgba(255, 255, 255, 0.12);
3511
+ border-color: rgba(255, 255, 255, 0.38);
3512
+ }
3513
+ [data-color-scheme="light"] .dw-panel-toolbar[data-btn-variant="outlined"] .dw-panel-toolbar-btn:hover:not(:disabled),
3514
+ [data-color-scheme="light"] .dw-panel-toolbar-btn[data-variant="outlined"]:hover:not(:disabled) {
3515
+ background: rgba(0, 0, 0, 0.06);
3516
+ border-color: rgba(0, 0, 0, 0.25);
3517
+ }
3518
+
3519
+ /* filled */
3520
+ .dw-panel-toolbar[data-btn-variant="filled"] .dw-panel-toolbar-btn,
3521
+ .dw-panel-toolbar-btn[data-variant="filled"] {
3522
+ background: var(--panel-toolbar-btn-active-bg, rgba(56, 189, 248, 0.2));
3523
+ color: var(--panel-toolbar-btn-active-color, #38bdf8);
3524
+ border: 1px solid var(--panel-toolbar-btn-active-color, #38bdf8);
3525
+ }
3526
+ .dw-panel-toolbar[data-btn-variant="filled"] .dw-panel-toolbar-btn:hover:not(:disabled),
3527
+ .dw-panel-toolbar-btn[data-variant="filled"]:hover:not(:disabled) {
3528
+ background: var(--panel-toolbar-btn-active-color, #38bdf8);
3529
+ color: #000;
3530
+ border-color: transparent;
3531
+ }
3532
+
3533
+ /* ── Separator ── */
3534
+ .dw-panel-toolbar__sep {
3535
+ flex-shrink: 0;
3536
+ background: var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
3537
+ align-self: center;
3538
+ }
3539
+
3540
+ .dw-panel-toolbar--top .dw-panel-toolbar__sep,
3541
+ .dw-panel-toolbar--bottom .dw-panel-toolbar__sep {
3542
+ width: 1px;
3543
+ height: 18px;
3544
+ }
3545
+
3546
+ .dw-panel-toolbar--left .dw-panel-toolbar__sep,
3547
+ .dw-panel-toolbar--right .dw-panel-toolbar__sep {
3548
+ height: 1px;
3549
+ width: 18px;
3550
+ }
3551
+
3552
+ /* ── Spacer — pushes subsequent items to the opposite end ── */
3553
+ .dw-panel-toolbar__spacer {
3554
+ flex: 1;
3555
+ pointer-events: none;
3556
+ }
3557
+
3558
+ /* ── ToolbarItem wrapper (restores pointer-events for custom controls) ── */
3559
+ .dw-panel-toolbar__item {
3560
+ display: inline-flex;
3561
+ align-items: center;
3562
+ pointer-events: auto;
3563
+ }
3564
+
3565
+ /* ── ToolbarCenter — absolutely centered, independent of left/right widths ── */
3566
+ .dw-panel-toolbar__center {
3567
+ position: absolute;
3568
+ display: flex;
3569
+ align-items: center;
3570
+ gap: var(--panel-toolbar-gap, 4px);
3571
+ pointer-events: none;
3572
+ }
3573
+ .dw-panel-toolbar__center > * {
3574
+ pointer-events: auto;
3575
+ }
3576
+ /* Horizontal toolbars: center horizontally */
3577
+ .dw-panel-toolbar--top .dw-panel-toolbar__center,
3578
+ .dw-panel-toolbar--bottom .dw-panel-toolbar__center {
3579
+ flex-direction: row;
3580
+ top: 0;
3581
+ bottom: 0;
3582
+ left: 50%;
3583
+ transform: translateX(-50%);
3584
+ }
3585
+ /* Vertical toolbars: center vertically */
3586
+ .dw-panel-toolbar--left .dw-panel-toolbar__center,
3587
+ .dw-panel-toolbar--right .dw-panel-toolbar__center {
3588
+ flex-direction: column;
3589
+ left: 0;
3590
+ right: 0;
3591
+ top: 50%;
3592
+ transform: translateY(-50%);
3593
+ }
3594
+
3595
+ /* ── ToolbarSearchInput ── */
3596
+ .dw-panel-toolbar-search {
3597
+ display: inline-flex;
3598
+ align-items: center;
3599
+ gap: 4px;
3600
+ }
3601
+
3602
+ .dw-panel-toolbar-search__input {
3603
+ height: var(--panel-toolbar-btn-size, 28px);
3604
+ width: 200px;
3605
+ border: 1px solid var(--panel-toolbar-separator-color, rgba(255, 255, 255, 0.15));
3606
+ border-radius: var(--panel-toolbar-btn-radius, 6px);
3607
+ background: rgba(0, 0, 0, 0.18);
3608
+ color: inherit;
3609
+ padding: 0 8px;
3610
+ font-size: 12px;
3611
+ outline: none;
3612
+ box-sizing: border-box;
3613
+ }
3614
+
3615
+ .dw-panel-toolbar-search__input::placeholder {
3616
+ opacity: 0.45;
3617
+ }
3618
+
3619
+ .dw-panel-toolbar-search__input:focus {
3620
+ border-color: var(--panel-toolbar-btn-active-color, #38bdf8);
3621
+ }
3622
+
3623
+ .dw-panel-toolbar-search__dropdown {
3624
+ background: var(--panel-float-bg, rgba(22, 24, 34, 0.95));
3625
+ border: 1px solid var(--panel-float-border, rgba(255, 255, 255, 0.1));
3626
+ border-radius: var(--panel-float-radius, 8px);
3627
+ box-shadow: var(--panel-float-shadow-active, 0 8px 28px rgba(0, 0, 0, 0.55));
3628
+ overflow: hidden;
3629
+ max-height: 300px;
3630
+ overflow-y: auto;
3631
+ }
3632
+
3633
+ .dw-panel-toolbar-search__group {
3634
+ padding: 6px 12px 2px;
3635
+ font-size: 10px;
3636
+ font-weight: 600;
3637
+ text-transform: uppercase;
3638
+ letter-spacing: 0.05em;
3639
+ opacity: 0.45;
3640
+ }
3641
+
3642
+ .dw-panel-toolbar-search__item {
3643
+ display: flex;
3644
+ align-items: center;
3645
+ gap: 8px;
3646
+ width: 100%;
3647
+ padding: 7px 12px;
3648
+ border: none;
3649
+ background: transparent;
3650
+ color: inherit;
3651
+ text-align: start;
3652
+ cursor: pointer;
3653
+ font-size: 12px;
3654
+ }
3655
+
3656
+ .dw-panel-toolbar-search__item:hover {
3657
+ background: var(--panel-toolbar-btn-hover-bg, rgba(255, 255, 255, 0.08));
3658
+ }
3659
+
3660
+ .dw-panel-toolbar-search__item-icon { flex-shrink: 0; opacity: 0.7; }
3661
+ .dw-panel-toolbar-search__item-label { flex: 1; }
3662
+ .dw-panel-toolbar-search__item-desc { opacity: 0.45; font-size: 11px; }
3663
+
3664
+ /* ── Floating window ── */
3665
+ .dw-panel-float {
3666
+ position: absolute;
3667
+ min-width: 120px;
3668
+ min-height: 60px;
3669
+ display: flex;
3670
+ flex-direction: column;
3671
+ border-radius: var(--panel-float-radius, 8px);
3672
+ background: var(--panel-float-bg, rgba(22, 24, 34, 0.92));
3673
+ border: 1px solid var(--panel-float-border, rgba(255, 255, 255, 0.1));
3674
+ box-shadow: var(--panel-float-shadow, 0 4px 16px rgba(0, 0, 0, 0.35));
3675
+ backdrop-filter: blur(8px);
3676
+ overflow: hidden;
3677
+ }
3678
+
3679
+ .dw-panel-float--active {
3680
+ box-shadow: var(--panel-float-shadow-active, 0 8px 28px rgba(0, 0, 0, 0.55));
3681
+ }
3682
+
3683
+ .dw-panel-float__header {
3684
+ display: flex;
3685
+ align-items: center;
3686
+ gap: 6px;
3687
+ padding: 0 8px;
3688
+ height: 28px;
3689
+ flex-shrink: 0;
3690
+ background: var(--panel-float-header-bg, rgba(255, 255, 255, 0.04));
3691
+ cursor: grab;
3692
+ user-select: none;
3693
+ }
3694
+
3695
+ .dw-panel-float__header:active {
3696
+ cursor: grabbing;
3697
+ }
3698
+
3699
+ .dw-panel-float--active .dw-panel-float__header {
3700
+ background: var(--panel-float-header-bg-active, rgba(56, 189, 248, 0.08));
3701
+ }
3702
+
3703
+ .dw-panel-float__title {
3704
+ flex: 1;
3705
+ font-size: 11px;
3706
+ font-weight: 500;
3707
+ color: var(--panel-float-title-color, rgba(255, 255, 255, 0.6));
3708
+ overflow: hidden;
3709
+ text-overflow: ellipsis;
3710
+ white-space: nowrap;
3711
+ }
3712
+
3713
+ .dw-panel-float--active .dw-panel-float__title {
3714
+ color: var(--panel-float-title-color-active, rgba(255, 255, 255, 0.9));
3715
+ }
3716
+
3717
+ .dw-panel-float__icon {
3718
+ flex-shrink: 0;
3719
+ width: 14px;
3720
+ height: 14px;
3721
+ display: flex;
3722
+ align-items: center;
3723
+ justify-content: center;
3724
+ opacity: 0.7;
3725
+ color: var(--panel-float-title-color, rgba(255, 255, 255, 0.6));
3726
+ }
3727
+ .dw-panel-float--active .dw-panel-float__icon {
3728
+ opacity: 1;
3729
+ color: var(--panel-float-title-color-active, rgba(255, 255, 255, 0.9));
3730
+ }
3731
+
3732
+ .dw-panel-float__close {
3733
+ display: inline-flex;
3734
+ align-items: center;
3735
+ justify-content: center;
3736
+ width: 18px;
3737
+ height: 18px;
3738
+ flex-shrink: 0;
3739
+ background: var(--custom-btn-bg, rgba(255, 255, 255, 0.03));
3740
+ border: 1px solid var(--custom-btn-border, rgba(255, 255, 255, 0.05));
3741
+ color: var(--text-secondary, #94a3b8);
3742
+ cursor: pointer;
3743
+ border-radius: 4px;
3744
+ padding: 0;
3745
+ line-height: 1;
3746
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
3747
+ }
3748
+
3749
+ .dw-panel-float__close:hover {
3750
+ background-color: var(--custom-btn-hover-bg, rgba(255, 255, 255, 0.12));
3751
+ color: var(--custom-btn-hover-color, #ffffff);
3752
+ border-color: var(--custom-btn-border, rgba(255, 255, 255, 0.05));
3753
+ transform: scale(1.05);
3754
+ }
3755
+
3756
+ .dw-panel-float__body {
3757
+ flex: 1;
3758
+ overflow: auto;
3759
+ min-height: 0;
3760
+ }
3761
+
3762
+ /* Resize grip — bottom-right corner */
3763
+ .dw-panel-float__resize {
3764
+ position: absolute;
3765
+ bottom: 0;
3766
+ right: 0;
3767
+ width: 12px;
3768
+ height: 12px;
3769
+ cursor: nwse-resize;
3770
+ }
3771
+
3772
+ /* ── Docking drop zones (visible while dragging a floating window) ── */
3773
+ .dw-panel-float-dropzone {
3774
+ position: absolute;
3775
+ width: 80px;
3776
+ height: 80px;
3777
+ border: 2px dashed var(--accent-color, #38bdf8);
3778
+ border-radius: 8px;
3779
+ background: rgba(56, 189, 248, 0.06);
3780
+ pointer-events: none;
3781
+ z-index: 200;
3782
+ opacity: 0.55;
3783
+ transition: opacity 0.15s ease, background 0.15s ease, border-style 0.15s ease;
3784
+ }
3785
+
3786
+ .dw-panel-float-dropzone--hovered {
3787
+ opacity: 1;
3788
+ background: rgba(56, 189, 248, 0.18);
3789
+ border-style: solid;
3790
+ }
3791
+
3792
+ .dw-panel-float-dropzone--top-left { top: 8px; left: 8px; }
3793
+ .dw-panel-float-dropzone--top-right { top: 8px; right: 8px; }
3794
+ .dw-panel-float-dropzone--bottom-left { bottom: 8px; left: 8px; }
3795
+ .dw-panel-float-dropzone--bottom-right { bottom: 8px; right: 8px; }
3796
+
3797
+ [dir="rtl"] .dw-panel-float-dropzone--top-right { right: auto; left: 8px; }
3798
+ [dir="rtl"] .dw-panel-float-dropzone--top-left { left: auto; right: 8px; }
3799
+ [dir="rtl"] .dw-panel-float-dropzone--bottom-right { right: auto; left: 8px; }
3800
+ [dir="rtl"] .dw-panel-float-dropzone--bottom-left { left: auto; right: 8px; }
3801
+
3802
+ [dir="rtl"] .dw-panel-float__title { text-align: right; }
3803
+
3804
+ /* ── Toast ── */
3805
+
3806
+ /* Color tokens — match confirmation-alert-* palette exactly */
3807
+ :root {
3808
+ --toast-info-color: #67e8f9;
3809
+ --toast-success-color: #4ade80;
3810
+ --toast-warning-color: #fbbf24;
3811
+ --toast-error-color: #f87171;
3812
+ --toast-bg: #2a2d32;
3813
+ --toast-border: rgba(255, 255, 255, 0.14);
3814
+ }
3815
+ [data-color-scheme="light"] {
3816
+ --toast-info-color: #0369a1;
3817
+ --toast-success-color: #15803d;
3818
+ --toast-warning-color: #b45309;
3819
+ --toast-error-color: #b91c1c;
3820
+ --toast-bg: #ffffff;
3821
+ --toast-border: rgba(0, 0, 0, 0.14);
3822
+ }
3823
+
3824
+ /* Position containers */
3825
+ .dw-toast-container {
3826
+ position: fixed; z-index: 10100;
3827
+ display: flex; gap: 8px; padding: 16px;
3828
+ pointer-events: none;
3829
+ box-sizing: border-box;
3830
+ }
3831
+ .dw-toast-container--top-right { top: var(--dw-toast-offset-top, 0px); right: 0; flex-direction: column; }
3832
+ .dw-toast-container--top-left { top: var(--dw-toast-offset-top, 0px); left: 0; flex-direction: column; }
3833
+ .dw-toast-container--bottom-right { bottom: var(--dw-toast-offset-bottom, 0px); right: 0; flex-direction: column-reverse; }
3834
+ .dw-toast-container--bottom-left { bottom: var(--dw-toast-offset-bottom, 0px); left: 0; flex-direction: column-reverse; }
3835
+ /* newestOnTop override inverts the column direction */
3836
+ .dw-toast-container--newest-top.dw-toast-container--bottom-right,
3837
+ .dw-toast-container--newest-top.dw-toast-container--bottom-left { flex-direction: column; }
3838
+ .dw-toast-container--newest-bottom.dw-toast-container--top-right,
3839
+ .dw-toast-container--newest-bottom.dw-toast-container--top-left { flex-direction: column-reverse; }
3840
+
3841
+ /* Individual toast — base card */
3842
+ .dw-toast {
3843
+ pointer-events: all; position: relative; overflow: hidden;
3844
+ display: flex; align-items: flex-start; gap: 10px;
3845
+ padding: 20px 14px; border-radius: 6px;
3846
+ background: var(--toast-bg, #2a2d32);
3847
+ border: 1px solid var(--toast-border, rgba(255,255,255,0.14)); border-inline-start-width: 3px;
3848
+ box-shadow: 0 8px 24px rgba(0,0,0,.4), 0 2px 8px rgba(0,0,0,.2);
3849
+ color: var(--sidebar-text-title, #cccccc);
3850
+ font-size: 13.5px; line-height: 1.4; width: 100%;
3851
+ transition: opacity 200ms ease, transform 200ms ease,
3852
+ max-height 300ms ease, padding 300ms ease, margin 300ms ease;
3853
+ }
3854
+ /* Reserve space for the absolute-positioned close button */
3855
+ .dw-toast:has(.dw-toast__close) { padding-inline-end: 32px; }
3856
+
3857
+ /* Type-specific: solid background, accent inline-start border only */
3858
+ .dw-toast--info { border-inline-start-color: var(--toast-info-color); }
3859
+ .dw-toast--success { border-inline-start-color: var(--toast-success-color); }
3860
+ .dw-toast--warning { border-inline-start-color: var(--toast-warning-color); }
3861
+ .dw-toast--error { border-inline-start-color: var(--toast-error-color); }
3862
+
3863
+ /* Entry animation classes toggled by JS on next frame */
3864
+ .dw-toast--entering { opacity: 0; transform: translateX(110%); }
3865
+ .dw-toast--entering-left { opacity: 0; transform: translateX(-110%); }
3866
+ .dw-toast--fade-entering { opacity: 0; transform: translateX(0); }
3867
+ .dw-toast--visible { opacity: 1; transform: translateX(0); }
3868
+ /* Exit: fade out + height collapse for gravity slide effect */
3869
+ .dw-toast--exiting {
3870
+ opacity: 0; max-height: 0 !important;
3871
+ padding-top: 0; padding-bottom: 0; margin: 0;
3872
+ }
3873
+
3874
+ /* Icon */
3875
+ .dw-toast__icon { flex-shrink: 0; width: 16px; height: 16px; margin-top: 1px; }
3876
+ .dw-toast--info .dw-toast__icon { color: var(--toast-info-color); }
3877
+ .dw-toast--success .dw-toast__icon { color: var(--toast-success-color); }
3878
+ .dw-toast--warning .dw-toast__icon { color: var(--toast-warning-color); }
3879
+ .dw-toast--error .dw-toast__icon { color: var(--toast-error-color); }
3880
+
3881
+ /* Body & close button */
3882
+ .dw-toast__body { flex: 1; min-width: 0; word-break: break-word; }
3883
+ .dw-toast__close {
3884
+ position: absolute; top: 8px; inset-inline-end: 10px;
3885
+ background: none; border: none; cursor: pointer;
3886
+ opacity: .5; padding: 2px; color: inherit; line-height: 1;
3887
+ }
3888
+ .dw-toast__close:hover { opacity: 1; }
3889
+
3890
+ /* Progress bar */
3891
+ .dw-toast__progress {
3892
+ position: absolute; bottom: 0; left: 0; right: 0; height: 3px;
3893
+ transform-origin: left; animation: dw-toast-shrink linear forwards;
3894
+ }
3895
+ .dw-toast--paused .dw-toast__progress { animation-play-state: paused; }
3896
+ .dw-toast--info .dw-toast__progress { background: var(--toast-info-color); }
3897
+ .dw-toast--success .dw-toast__progress { background: var(--toast-success-color); }
3898
+ .dw-toast--warning .dw-toast__progress { background: var(--toast-warning-color); }
3899
+ .dw-toast--error .dw-toast__progress { background: var(--toast-error-color); }
3900
+
3901
+ @keyframes dw-toast-shrink { from { transform: scaleX(1); } to { transform: scaleX(0); } }
3902
+
3903
+ /* Toast RTL: flip icon/body order and progress bar collapse direction */
3904
+ [dir="rtl"] .dw-toast { flex-direction: row-reverse; }
3905
+ [dir="rtl"] .dw-toast__progress { transform-origin: right; }