@tutti-os/workbench-surface 0.0.43 → 0.0.45

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.
@@ -273,24 +273,51 @@
273
273
  transition: background-color 160ms ease;
274
274
  }
275
275
 
276
- .workbench-window-traffic-light:hover,
277
- .workbench-window-traffic-light:focus-visible {
276
+ .workbench-window-traffic-light__icon {
277
+ position: absolute;
278
+ z-index: 1;
279
+ inset: 5px;
280
+ width: 10px;
281
+ height: 10px;
282
+ color: color-mix(in srgb, #000 68%, transparent);
283
+ opacity: 0;
284
+ pointer-events: none;
285
+ transition: opacity 120ms ease;
286
+ }
287
+
288
+ .workbench-window-traffic-lights:hover .workbench-window-traffic-light,
289
+ .workbench-window-traffic-lights:focus-within .workbench-window-traffic-light {
278
290
  opacity: 1;
291
+ }
292
+
293
+ .workbench-window-traffic-light:focus-visible {
279
294
  outline: none;
280
295
  }
281
296
 
282
- .workbench-window-traffic-light[data-workbench-traffic-light="close"]:hover::before,
283
- .workbench-window-traffic-light[data-workbench-traffic-light="close"]:focus-visible::before {
297
+ .workbench-window-traffic-lights:hover .workbench-window-traffic-light__icon,
298
+ .workbench-window-traffic-lights:focus-within
299
+ .workbench-window-traffic-light__icon {
300
+ opacity: 1;
301
+ }
302
+
303
+ .workbench-window-traffic-lights:hover
304
+ .workbench-window-traffic-light[data-workbench-traffic-light="close"]::before,
305
+ .workbench-window-traffic-lights:focus-within
306
+ .workbench-window-traffic-light[data-workbench-traffic-light="close"]::before {
284
307
  background-color: #ff5f57;
285
308
  }
286
309
 
287
- .workbench-window-traffic-light[data-workbench-traffic-light="minimize"]:hover::before,
288
- .workbench-window-traffic-light[data-workbench-traffic-light="minimize"]:focus-visible::before {
310
+ .workbench-window-traffic-lights:hover
311
+ .workbench-window-traffic-light[data-workbench-traffic-light="minimize"]::before,
312
+ .workbench-window-traffic-lights:focus-within
313
+ .workbench-window-traffic-light[data-workbench-traffic-light="minimize"]::before {
289
314
  background-color: #ffbd2e;
290
315
  }
291
316
 
292
- .workbench-window-traffic-light[data-workbench-traffic-light="maximize"]:hover::before,
293
- .workbench-window-traffic-light[data-workbench-traffic-light="maximize"]:focus-visible::before {
317
+ .workbench-window-traffic-lights:hover
318
+ .workbench-window-traffic-light[data-workbench-traffic-light="maximize"]::before,
319
+ .workbench-window-traffic-lights:focus-within
320
+ .workbench-window-traffic-light[data-workbench-traffic-light="maximize"]::before {
294
321
  background-color: #28c840;
295
322
  }
296
323
 
@@ -533,6 +560,7 @@
533
560
  }
534
561
 
535
562
  .workbench-mission-control {
563
+ z-index: var(--z-tooltip, 100700);
536
564
  opacity: 1;
537
565
  }
538
566
 
@@ -607,6 +635,7 @@
607
635
  100%
608
636
  );
609
637
  box-shadow: none;
638
+ pointer-events: auto;
610
639
  transition:
611
640
  width 180ms cubic-bezier(0.22, 1, 0.36, 1),
612
641
  background-color 160ms ease,
@@ -733,7 +762,7 @@
733
762
  background: transparent;
734
763
  box-shadow: none;
735
764
  overflow: visible;
736
- pointer-events: auto;
765
+ pointer-events: none;
737
766
  transition: width 220ms cubic-bezier(0.22, 1, 0.36, 1);
738
767
  -webkit-app-region: no-drag;
739
768
  }
@@ -772,7 +801,7 @@
772
801
  background: transparent;
773
802
  box-shadow: none;
774
803
  line-height: 0;
775
- pointer-events: auto;
804
+ pointer-events: none;
776
805
  transition: width 600ms cubic-bezier(0.16, 1, 0.3, 1);
777
806
  -webkit-app-region: no-drag;
778
807
  }
@@ -827,6 +856,7 @@
827
856
  overflow: visible;
828
857
  padding: 0 var(--desktop-dock-items-padding)
829
858
  var(--desktop-dock-items-padding-block-end);
859
+ pointer-events: none;
830
860
  scroll-behavior: smooth;
831
861
  scrollbar-width: none;
832
862
  }
@@ -1114,6 +1144,7 @@
1114
1144
  justify-content: center;
1115
1145
  overflow: visible;
1116
1146
  line-height: 0;
1147
+ pointer-events: auto;
1117
1148
  }
1118
1149
 
1119
1150
  .desktop-dock[data-dock-placement="left"] .desktop-dock__slot {
@@ -23,6 +23,18 @@ test("traffic lights keep visual layout while expanding the pointer hit area", (
23
23
  css,
24
24
  /\.workbench-window-traffic-light::before\s*{[^}]*inset:\s*4px;[^}]*content:\s*"";[^}]*transition:\s*background-color 160ms ease;/s
25
25
  );
26
+ assert.match(
27
+ css,
28
+ /\.workbench-window-traffic-light__icon\s*{[^}]*inset:\s*5px;[^}]*width:\s*10px;[^}]*height:\s*10px;[^}]*opacity:\s*0;[^}]*transition:\s*opacity 120ms ease;/s
29
+ );
30
+ assert.match(
31
+ css,
32
+ /\.workbench-window-traffic-lights:hover\s+\.workbench-window-traffic-light__icon,\s*\.workbench-window-traffic-lights:focus-within\s+\.workbench-window-traffic-light__icon\s*{[^}]*opacity:\s*1;/s
33
+ );
34
+ assert.match(
35
+ css,
36
+ /\.workbench-window-traffic-lights:hover\s+\.workbench-window-traffic-light\[data-workbench-traffic-light="close"\]::before,\s*\.workbench-window-traffic-lights:focus-within\s+\.workbench-window-traffic-light\[data-workbench-traffic-light="close"\]::before\s*{[^}]*background-color:\s*#ff5f57;/s
37
+ );
26
38
  });
27
39
 
28
40
  test("floating window corner resize handles do not intrude further than the edge handles", () => {
@@ -50,6 +62,31 @@ test("mission control hidden presentation windows are invisible and inert", () =
50
62
  );
51
63
  });
52
64
 
65
+ test("mission control overlay lets layout controls sit above dialog overlays", () => {
66
+ const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
67
+ const source = readFileSync(
68
+ resolve("src/mission-control/WorkbenchMissionControlOverlay.tsx"),
69
+ "utf8"
70
+ );
71
+
72
+ assert.match(
73
+ css,
74
+ /\.workbench-mission-control\s*{[^}]*z-index:\s*var\(--z-tooltip,\s*100700\);/s
75
+ );
76
+ assert.match(
77
+ source,
78
+ /className="workbench-mission-control pointer-events-none absolute inset-0 overflow-hidden"/
79
+ );
80
+ assert.match(
81
+ source,
82
+ /className="workbench-mission-control__layout-dock desktop-dock-plate pointer-events-auto"/
83
+ );
84
+ assert.match(
85
+ css,
86
+ /\.desktop-dock-plate\.workbench-mission-control__layout-dock\s*{[^}]*pointer-events:\s*auto;/s
87
+ );
88
+ });
89
+
53
90
  test("dialog popover node layer sits above dialog overlays and remains clickable", () => {
54
91
  const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
55
92
 
@@ -92,6 +129,25 @@ test("dock retained entry removal animates width and icon exit", () => {
92
129
  assert.match(css, /@keyframes desktop-dock-separator-collapse-left/);
93
130
  });
94
131
 
132
+ test("dock transparent hover padding lets clicks reach windows behind it", () => {
133
+ const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
134
+
135
+ assert.match(
136
+ css,
137
+ /\.desktop-dock-plate\s*{[^}]*pointer-events:\s*none;[^}]*transition:\s*width 220ms/s
138
+ );
139
+ assert.match(
140
+ css,
141
+ /\.desktop-dock\s*{[^}]*pointer-events:\s*none;[^}]*transition:\s*width 600ms/s
142
+ );
143
+ assert.match(css, /\.desktop-dock__items\s*{[^}]*pointer-events:\s*none;/s);
144
+ assert.match(css, /\.desktop-dock__slot\s*{[^}]*pointer-events:\s*auto;/s);
145
+ assert.match(
146
+ css,
147
+ /\.desktop-dock__hover-panel\s*{[^}]*pointer-events:\s*auto;/s
148
+ );
149
+ });
150
+
95
151
  test("dock badge chrome uses inverted outlines and 11px count text", () => {
96
152
  const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
97
153
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workbench-surface",
3
- "version": "0.0.43",
3
+ "version": "0.0.45",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -34,10 +34,10 @@
34
34
  "@tutti-os/config-tsconfig": "0.0.0"
35
35
  },
36
36
  "dependencies": {
37
- "@tutti-os/ui-i18n-runtime": "0.0.43",
38
- "@tutti-os/ui-react-hooks": "0.0.43",
39
- "@tutti-os/workbench-snapshot": "0.0.43",
40
- "@tutti-os/ui-system": "0.0.43"
37
+ "@tutti-os/ui-i18n-runtime": "0.0.45",
38
+ "@tutti-os/ui-react-hooks": "0.0.45",
39
+ "@tutti-os/workbench-snapshot": "0.0.45",
40
+ "@tutti-os/ui-system": "0.0.45"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "react": "^19.1.0",