@tutti-os/workbench-surface 0.0.17 → 0.0.19

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.
@@ -129,6 +129,12 @@
129
129
  backface-visibility: hidden;
130
130
  }
131
131
 
132
+ .workbench-window-shell[data-presentation-visibility="hidden"] {
133
+ visibility: hidden;
134
+ opacity: 0;
135
+ pointer-events: none;
136
+ }
137
+
132
138
  .workbench-window-shell[data-presentation-mode="mission-control"]
133
139
  .workbench-window-shell__content {
134
140
  pointer-events: none;
@@ -244,8 +250,8 @@
244
250
  transform: translateY(0);
245
251
  pointer-events: auto;
246
252
  transition:
247
- opacity 0.16s ease 0.5s,
248
- transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0.5s;
253
+ opacity 0.16s ease,
254
+ transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
249
255
  }
250
256
 
251
257
  .workbench-window[data-display-mode="fullscreen"]:has(
@@ -268,7 +274,7 @@
268
274
  right: 0;
269
275
  left: 0;
270
276
  z-index: 2;
271
- height: 8px;
277
+ height: 16px;
272
278
  pointer-events: auto;
273
279
  }
274
280
 
@@ -739,6 +745,7 @@
739
745
  --desktop-dock-scroll-button-z-index: 120;
740
746
  --desktop-dock-scroll-fade-size: 48px;
741
747
  --desktop-dock-tooltip-gap: 32px;
748
+ --desktop-dock-hover-panel-gap: 12px;
742
749
  position: relative;
743
750
  z-index: 1;
744
751
  display: block;
@@ -1172,12 +1179,33 @@
1172
1179
  animation-name: desktop-dock-minimized-icon-appear-left;
1173
1180
  }
1174
1181
 
1175
- .desktop-dock__slot[data-presence="exiting"],
1182
+ .desktop-dock__slot[data-presence="exiting"] {
1183
+ min-width: 0;
1184
+ animation: desktop-dock-slot-collapse 600ms cubic-bezier(0.4, 0, 0.2, 1) both;
1185
+ pointer-events: none;
1186
+ }
1187
+
1188
+ .desktop-dock[data-dock-placement="left"]
1189
+ .desktop-dock__slot[data-presence="exiting"] {
1190
+ min-height: 0;
1191
+ animation-name: desktop-dock-slot-collapse-left;
1192
+ }
1193
+
1194
+ .desktop-dock__slot[data-presence="exiting"] .desktop-dock__icon-shell {
1195
+ animation: desktop-dock-presence-exit 420ms cubic-bezier(0.4, 0, 0.2, 1) both;
1196
+ }
1197
+
1176
1198
  .desktop-dock__separator[data-presence="exiting"] {
1177
- animation: desktop-dock-presence-exit 600ms cubic-bezier(0.7, 0, 0.84, 0) both;
1199
+ animation: desktop-dock-separator-collapse 600ms cubic-bezier(0.4, 0, 0.2, 1)
1200
+ both;
1178
1201
  pointer-events: none;
1179
1202
  }
1180
1203
 
1204
+ .desktop-dock[data-dock-placement="left"]
1205
+ .desktop-dock__separator[data-presence="exiting"] {
1206
+ animation-name: desktop-dock-separator-collapse-left;
1207
+ }
1208
+
1181
1209
  .desktop-dock__slot--minimized[data-collapsing="true"],
1182
1210
  .desktop-dock__slot--minimized[data-presence="exiting"] {
1183
1211
  min-width: 0;
@@ -1194,6 +1222,11 @@
1194
1222
  animation-name: desktop-dock-minimized-slot-collapse-left;
1195
1223
  }
1196
1224
 
1225
+ .desktop-dock__slot--minimized[data-presence="exiting"]
1226
+ .desktop-dock__icon-shell {
1227
+ animation: none;
1228
+ }
1229
+
1197
1230
  .desktop-dock__slot--minimized[data-collapsing="true"]::before,
1198
1231
  .desktop-dock__slot--minimized[data-presence="exiting"]::before {
1199
1232
  opacity: 0;
@@ -1254,17 +1287,31 @@
1254
1287
 
1255
1288
  .desktop-dock__slot[data-node-state="open"]::before,
1256
1289
  .desktop-dock__slot[data-node-state="minimized"]::before {
1290
+ --desktop-dock-indicator-color: var(--text-tertiary);
1257
1291
  position: absolute;
1258
- bottom: var(--desktop-dock-indicator-offset);
1292
+ bottom: calc(var(--desktop-dock-indicator-offset) - 2px);
1259
1293
  left: 50%;
1260
- width: 4px;
1261
- height: 4px;
1294
+ width: 5px;
1295
+ height: 5px;
1262
1296
  border-radius: 999px;
1263
- background: var(--text-tertiary);
1297
+ background: var(--desktop-dock-indicator-color);
1298
+ box-shadow: 0 0 0 0.5px rgb(0 0 0 / 12%);
1264
1299
  content: "";
1265
1300
  transform: translateX(-50%);
1266
1301
  }
1267
1302
 
1303
+ .desktop-dock__slot[data-node-state="open"][data-wallpaper-tone="dark"]::before,
1304
+ .desktop-dock__slot[data-node-state="minimized"][data-wallpaper-tone="dark"]::before {
1305
+ --desktop-dock-indicator-color: rgb(255 255 255 / 78%);
1306
+ box-shadow: 0 0 0 0.5px rgb(0 0 0 / 42%);
1307
+ }
1308
+
1309
+ .desktop-dock__slot[data-node-state="open"][data-wallpaper-tone="light"]::before,
1310
+ .desktop-dock__slot[data-node-state="minimized"][data-wallpaper-tone="light"]::before {
1311
+ --desktop-dock-indicator-color: rgb(0 0 0 / 46%);
1312
+ box-shadow: 0 0 0 0.5px rgb(255 255 255 / 58%);
1313
+ }
1314
+
1268
1315
  .desktop-dock[data-dock-placement="left"]
1269
1316
  .desktop-dock__slot[data-node-state="open"]::before,
1270
1317
  .desktop-dock[data-dock-placement="left"]
@@ -1272,12 +1319,12 @@
1272
1319
  top: 50%;
1273
1320
  right: auto;
1274
1321
  bottom: auto;
1275
- left: var(--desktop-dock-indicator-offset);
1322
+ left: calc(var(--desktop-dock-indicator-offset) - 2px);
1276
1323
  transform: translateY(-50%);
1277
1324
  }
1278
1325
 
1279
1326
  .desktop-dock__slot[data-node-state="minimized"]::before {
1280
- background: var(--text-tertiary);
1327
+ opacity: 0.72;
1281
1328
  }
1282
1329
 
1283
1330
  .desktop-dock__btn {
@@ -1562,6 +1609,40 @@
1562
1609
  background: color-mix(in srgb, var(--background-panel) 70%, black 4%);
1563
1610
  }
1564
1611
 
1612
+ .desktop-dock__minimized-preview--component {
1613
+ align-items: stretch;
1614
+ justify-content: stretch;
1615
+ gap: 0;
1616
+ padding: 0;
1617
+ background: var(--background-panel);
1618
+ }
1619
+
1620
+ .desktop-dock__minimized-preview--component > * {
1621
+ width: 100%;
1622
+ height: 100%;
1623
+ min-width: 0;
1624
+ min-height: 0;
1625
+ }
1626
+
1627
+ .desktop-dock__minimized-preview-freeze-source {
1628
+ position: absolute;
1629
+ inset: 0;
1630
+ visibility: hidden;
1631
+ pointer-events: none;
1632
+ }
1633
+
1634
+ .desktop-dock__minimized-preview-frozen-content {
1635
+ display: block;
1636
+ overflow: hidden;
1637
+ }
1638
+
1639
+ .desktop-dock__minimized-preview-frozen-content > * {
1640
+ width: 100%;
1641
+ height: 100%;
1642
+ min-width: 0;
1643
+ min-height: 0;
1644
+ }
1645
+
1565
1646
  .desktop-dock__minimized-preview-line {
1566
1647
  display: block;
1567
1648
  width: 74%;
@@ -1730,7 +1811,7 @@
1730
1811
  opacity: 1;
1731
1812
  pointer-events: auto;
1732
1813
  transform: translateX(-50%)
1733
- translateY(calc(-100% - var(--desktop-dock-tooltip-gap, 32px)));
1814
+ translateY(calc(-100% - var(--desktop-dock-hover-panel-gap, 12px)));
1734
1815
  transition:
1735
1816
  opacity 0.12s ease,
1736
1817
  transform 0.12s ease;
@@ -1744,7 +1825,10 @@
1744
1825
  var(--desktop-dock-label-tooltip-anchor-width) / 2
1745
1826
  );
1746
1827
  z-index: var(--workbench-z-dock-tooltip);
1747
- max-width: 220px;
1828
+ box-sizing: border-box;
1829
+ width: max-content;
1830
+ max-width: min(220px, calc(100vw - 32px));
1831
+ overflow: hidden;
1748
1832
  padding: 7px 10px;
1749
1833
  border: 1px solid var(--border-1);
1750
1834
  border-radius: 8px;
@@ -1755,13 +1839,14 @@
1755
1839
  font-weight: 700;
1756
1840
  line-height: 1.3;
1757
1841
  opacity: 1;
1758
- overflow-wrap: anywhere;
1759
1842
  pointer-events: none;
1843
+ text-overflow: ellipsis;
1760
1844
  transform: translateX(-50%)
1761
1845
  translateY(calc(-100% - var(--desktop-dock-tooltip-gap, 32px)));
1762
1846
  transition:
1763
1847
  opacity 0.12s ease,
1764
1848
  transform 0.12s ease;
1849
+ white-space: nowrap;
1765
1850
  }
1766
1851
 
1767
1852
  .desktop-dock__label-tooltip[data-dock-placement="left"] {
@@ -1785,7 +1870,7 @@
1785
1870
  left: calc(
1786
1871
  var(--desktop-dock-hover-panel-anchor-left) +
1787
1872
  var(--desktop-dock-hover-panel-anchor-width) +
1788
- var(--desktop-dock-tooltip-gap, 32px)
1873
+ var(--desktop-dock-hover-panel-gap, 12px)
1789
1874
  );
1790
1875
  transform: translateY(-50%);
1791
1876
  }
@@ -1793,9 +1878,9 @@
1793
1878
  .desktop-dock__hover-panel::before {
1794
1879
  position: absolute;
1795
1880
  right: 0;
1796
- bottom: calc(-1 * var(--desktop-dock-tooltip-gap, 32px));
1881
+ bottom: calc(-1 * var(--desktop-dock-hover-panel-gap, 12px));
1797
1882
  left: 0;
1798
- height: var(--desktop-dock-tooltip-gap, 32px);
1883
+ height: var(--desktop-dock-hover-panel-gap, 12px);
1799
1884
  content: "";
1800
1885
  }
1801
1886
 
@@ -1803,8 +1888,8 @@
1803
1888
  top: 0;
1804
1889
  right: auto;
1805
1890
  bottom: 0;
1806
- left: calc(-1 * var(--desktop-dock-tooltip-gap, 32px));
1807
- width: var(--desktop-dock-tooltip-gap, 32px);
1891
+ left: calc(-1 * var(--desktop-dock-hover-panel-gap, 12px));
1892
+ width: var(--desktop-dock-hover-panel-gap, 12px);
1808
1893
  height: auto;
1809
1894
  }
1810
1895
 
@@ -2162,6 +2247,62 @@ body[data-desktop-dock-minimized-stack-open="true"] .desktop-dock {
2162
2247
  }
2163
2248
  }
2164
2249
 
2250
+ @keyframes desktop-dock-slot-collapse {
2251
+ from {
2252
+ width: var(--desktop-dock-size);
2253
+ height: var(--desktop-dock-size);
2254
+ margin-inline: 0;
2255
+ }
2256
+
2257
+ to {
2258
+ width: 0;
2259
+ height: var(--desktop-dock-size);
2260
+ margin-inline: calc(var(--desktop-dock-gap) / -2);
2261
+ }
2262
+ }
2263
+
2264
+ @keyframes desktop-dock-slot-collapse-left {
2265
+ from {
2266
+ width: var(--desktop-dock-size);
2267
+ height: var(--desktop-dock-size);
2268
+ margin-block: 0;
2269
+ }
2270
+
2271
+ to {
2272
+ width: var(--desktop-dock-size);
2273
+ height: 0;
2274
+ margin-block: calc(var(--desktop-dock-gap) / -2);
2275
+ }
2276
+ }
2277
+
2278
+ @keyframes desktop-dock-separator-collapse {
2279
+ from {
2280
+ width: 1px;
2281
+ margin-inline: 4px;
2282
+ opacity: 1;
2283
+ }
2284
+
2285
+ to {
2286
+ width: 0;
2287
+ margin-inline: calc(var(--desktop-dock-gap) / -2);
2288
+ opacity: 0;
2289
+ }
2290
+ }
2291
+
2292
+ @keyframes desktop-dock-separator-collapse-left {
2293
+ from {
2294
+ height: 1px;
2295
+ margin-block: 4px;
2296
+ opacity: 1;
2297
+ }
2298
+
2299
+ to {
2300
+ height: 0;
2301
+ margin-block: calc(var(--desktop-dock-gap) / -2);
2302
+ opacity: 0;
2303
+ }
2304
+ }
2305
+
2165
2306
  @keyframes desktop-dock-minimized-slot-expand {
2166
2307
  from {
2167
2308
  width: 0;
@@ -2372,7 +2513,7 @@ body[data-desktop-dock-minimized-stack-open="true"] .desktop-dock {
2372
2513
  translate: 0 0;
2373
2514
  }
2374
2515
  45% {
2375
- translate: 0 -29px;
2516
+ translate: 0 -14px;
2376
2517
  }
2377
2518
  }
2378
2519
 
@@ -2382,7 +2523,7 @@ body[data-desktop-dock-minimized-stack-open="true"] .desktop-dock {
2382
2523
  translate: 0 0;
2383
2524
  }
2384
2525
  45% {
2385
- translate: 29px 0;
2526
+ translate: 14px 0;
2386
2527
  }
2387
2528
  }
2388
2529
 
@@ -2755,7 +2896,7 @@ body[data-desktop-dock-minimized-stack-open="true"] .desktop-dock {
2755
2896
 
2756
2897
  animation: workspace-launchpad-hover-panel-enter 160ms
2757
2898
  cubic-bezier(0.16, 1, 0.3, 1) both;
2758
- bottom: calc(100% + var(--desktop-dock-tooltip-gap, 32px));
2899
+ bottom: calc(100% + var(--desktop-dock-tooltip-gap, 12px));
2759
2900
  left: 50%;
2760
2901
  right: auto;
2761
2902
  top: auto;
@@ -12,6 +12,44 @@ test("floating window bodies do not reserve a right-side content margin", () =>
12
12
  );
13
13
  });
14
14
 
15
+ test("mission control hidden presentation windows are invisible and inert", () => {
16
+ const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
17
+
18
+ assert.match(
19
+ css,
20
+ /\.workbench-window-shell\[data-presentation-visibility="hidden"\]\s*{[^}]*visibility:\s*hidden;[^}]*opacity:\s*0;[^}]*pointer-events:\s*none;/s
21
+ );
22
+ });
23
+
24
+ test("dock retained entry removal animates width and icon exit", () => {
25
+ const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
26
+
27
+ assert.match(
28
+ css,
29
+ /\.desktop-dock-plate\s*{[^}]*transition:\s*width 220ms cubic-bezier\(0\.22, 1, 0\.36, 1\);/s
30
+ );
31
+ assert.match(
32
+ css,
33
+ /\.desktop-dock\[data-dock-placement="left"\]\s*{[^}]*transition:\s*height 600ms cubic-bezier\(0\.16, 1, 0\.3, 1\);/s
34
+ );
35
+ assert.match(
36
+ css,
37
+ /\.desktop-dock__slot\[data-presence="exiting"\]\s*{[^}]*animation:\s*desktop-dock-slot-collapse 600ms cubic-bezier\(0\.4, 0, 0\.2, 1\)[^}]*both;/s
38
+ );
39
+ assert.match(
40
+ css,
41
+ /\.desktop-dock__slot\[data-presence="exiting"\]\s+\.desktop-dock__icon-shell\s*{[^}]*animation:\s*desktop-dock-presence-exit 420ms cubic-bezier\(0\.4, 0, 0\.2, 1\)[^}]*both;/s
42
+ );
43
+ assert.match(
44
+ css,
45
+ /\.desktop-dock__separator\[data-presence="exiting"\]\s*{[^}]*animation:\s*desktop-dock-separator-collapse 600ms/s
46
+ );
47
+ assert.match(css, /@keyframes desktop-dock-slot-collapse/);
48
+ assert.match(css, /@keyframes desktop-dock-slot-collapse-left/);
49
+ assert.match(css, /@keyframes desktop-dock-separator-collapse/);
50
+ assert.match(css, /@keyframes desktop-dock-separator-collapse-left/);
51
+ });
52
+
15
53
  test("left dock placement owns vertical frame and popup placement styles", () => {
16
54
  const css = readFileSync(resolve("src/styles/workbench.css"), "utf8");
17
55
 
@@ -29,7 +67,7 @@ test("left dock placement owns vertical frame and popup placement styles", () =>
29
67
  );
30
68
  assert.match(
31
69
  css,
32
- /\.desktop-dock__hover-panel\[data-dock-placement="left"\]\s*{[^}]*left:\s*calc\(\s*var\(--desktop-dock-hover-panel-anchor-left\)\s*\+\s*var\(--desktop-dock-hover-panel-anchor-width\)\s*\+\s*var\(--desktop-dock-tooltip-gap, 32px\)\s*\);/s
70
+ /\.desktop-dock__hover-panel\[data-dock-placement="left"\]\s*{[^}]*left:\s*calc\(\s*var\(--desktop-dock-hover-panel-anchor-left\)\s*\+\s*var\(--desktop-dock-hover-panel-anchor-width\)\s*\+\s*var\(--desktop-dock-hover-panel-gap, 12px\)\s*\);/s
33
71
  );
34
72
  assert.match(
35
73
  css,
@@ -62,7 +100,19 @@ test("left dock placement owns vertical frame and popup placement styles", () =>
62
100
  assert.doesNotMatch(css, /desktop-dock-left-stack-card-fan-in/);
63
101
  assert.match(
64
102
  css,
65
- /\.desktop-dock\[data-dock-placement="left"\]\s+\.desktop-dock__slot\[data-node-state="open"\]::before,[\s\S]*?\.desktop-dock\[data-dock-placement="left"\]\s+\.desktop-dock__slot\[data-node-state="minimized"\]::before\s*{[^}]*right:\s*auto;[^}]*left:\s*var\(--desktop-dock-indicator-offset\);/s
103
+ /\.desktop-dock\[data-dock-placement="left"\]\s+\.desktop-dock__slot\[data-node-state="open"\]::before,[\s\S]*?\.desktop-dock\[data-dock-placement="left"\]\s+\.desktop-dock__slot\[data-node-state="minimized"\]::before\s*{[^}]*right:\s*auto;[^}]*left:\s*calc\(var\(--desktop-dock-indicator-offset\) - 2px\);/s
104
+ );
105
+ assert.match(
106
+ css,
107
+ /\.desktop-dock__slot\[data-node-state="open"\]::before,[\s\S]*?\.desktop-dock__slot\[data-node-state="minimized"\]::before\s*{[^}]*--desktop-dock-indicator-color:\s*var\(--text-tertiary\);[^}]*bottom:\s*calc\(var\(--desktop-dock-indicator-offset\) - 2px\);[^}]*width:\s*5px;[^}]*height:\s*5px;[^}]*background:\s*var\(--desktop-dock-indicator-color\);[^}]*box-shadow:\s*0 0 0 0\.5px rgb\(0 0 0 \/ 12%\);/s
108
+ );
109
+ assert.match(
110
+ css,
111
+ /\.desktop-dock__slot\[data-node-state="open"\]\[data-wallpaper-tone="dark"\]::before,[\s\S]*?\.desktop-dock__slot\[data-node-state="minimized"\]\[data-wallpaper-tone="dark"\]::before\s*{[^}]*--desktop-dock-indicator-color:\s*rgb\(255 255 255 \/ 78%\);[^}]*box-shadow:\s*0 0 0 0\.5px rgb\(0 0 0 \/ 42%\);/s
112
+ );
113
+ assert.match(
114
+ css,
115
+ /\.desktop-dock__slot\[data-node-state="open"\]\[data-wallpaper-tone="light"\]::before,[\s\S]*?\.desktop-dock__slot\[data-node-state="minimized"\]\[data-wallpaper-tone="light"\]::before\s*{[^}]*--desktop-dock-indicator-color:\s*rgb\(0 0 0 \/ 46%\);[^}]*box-shadow:\s*0 0 0 0\.5px rgb\(255 255 255 \/ 58%\);/s
66
116
  );
67
117
  });
68
118
 
@@ -115,12 +165,20 @@ test("dock overflow keeps scroll controls viewport-bound", () => {
115
165
  );
116
166
  assert.match(
117
167
  css,
118
- /\.desktop-dock__hover-panel\s*{[^}]*top:\s*var\(--desktop-dock-hover-panel-anchor-top\);[^}]*pointer-events:\s*auto;[^}]*var\(--desktop-dock-tooltip-gap, 32px\)/s
168
+ /\.desktop-dock\s*{[^}]*--desktop-dock-hover-panel-gap:\s*12px;/s
169
+ );
170
+ assert.match(
171
+ css,
172
+ /\.desktop-dock__hover-panel\s*{[^}]*top:\s*var\(--desktop-dock-hover-panel-anchor-top\);[^}]*pointer-events:\s*auto;[^}]*var\(--desktop-dock-hover-panel-gap, 12px\)/s
119
173
  );
120
174
  assert.match(
121
175
  css,
122
176
  /\.desktop-dock__label-tooltip\s*{[^}]*top:\s*var\(--desktop-dock-label-tooltip-anchor-top\);[^}]*pointer-events:\s*none;[^}]*var\(--desktop-dock-tooltip-gap, 32px\)/s
123
177
  );
178
+ assert.match(
179
+ css,
180
+ /\.desktop-dock__label-tooltip\s*{[^}]*width:\s*max-content;[^}]*overflow:\s*hidden;[^}]*text-overflow:\s*ellipsis;[^}]*white-space:\s*nowrap;/s
181
+ );
124
182
  assert.match(
125
183
  css,
126
184
  /\.desktop-dock__label-tooltip\[data-dock-placement="left"\]\s*{[^}]*left:\s*calc\(\s*var\(--desktop-dock-label-tooltip-anchor-left\)\s*\+\s*var\(--desktop-dock-label-tooltip-anchor-width\)\s*\+\s*var\(--desktop-dock-tooltip-gap, 32px\)\s*\);/s
@@ -173,6 +231,22 @@ test("dock overflow keeps scroll controls viewport-bound", () => {
173
231
  css,
174
232
  /\.desktop-dock\[data-dock-placement="left"\]\s+\.desktop-dock__minimized-preview\s*{[^}]*transform-origin:\s*left center;/s
175
233
  );
234
+ assert.match(
235
+ css,
236
+ /\.desktop-dock__minimized-preview--component\s*{[^}]*padding:\s*0;[^}]*background:\s*var\(--background-panel\);/s
237
+ );
238
+ assert.match(
239
+ css,
240
+ /\.desktop-dock__minimized-preview--component > \*\s*{[^}]*width:\s*100%;[^}]*height:\s*100%;/s
241
+ );
242
+ assert.match(
243
+ css,
244
+ /\.desktop-dock__minimized-preview-freeze-source\s*{[^}]*visibility:\s*hidden;[^}]*pointer-events:\s*none;/s
245
+ );
246
+ assert.match(
247
+ css,
248
+ /\.desktop-dock__minimized-preview-frozen-content\s*{[^}]*display:\s*block;[^}]*overflow:\s*hidden;/s
249
+ );
176
250
  assert.match(css, /\.desktop-dock__slot\s*{[^}]*flex:\s*0 0 auto;/s);
177
251
  assert.match(
178
252
  css,
@@ -223,6 +297,14 @@ test("dock overflow keeps scroll controls viewport-bound", () => {
223
297
  /\.desktop-dock\[data-dock-hover-panel-open="true"\]\s+\.desktop-dock__items\s*{[^}]*mask-image:\s*none;/s
224
298
  );
225
299
  assert.match(css, /@keyframes desktop-dock-bounce-translate/s);
300
+ assert.match(
301
+ css,
302
+ /@keyframes desktop-dock-bounce-translate\s*{[\s\S]*?45%\s*{[^}]*translate:\s*0 -14px;/s
303
+ );
304
+ assert.match(
305
+ css,
306
+ /@keyframes desktop-dock-bounce-translate-left\s*{[\s\S]*?45%\s*{[^}]*translate:\s*14px 0;/s
307
+ );
226
308
  assert.match(
227
309
  css,
228
310
  /\.desktop-dock__slot\[data-bouncing="true"\]\s+\.desktop-dock__icon-content,/s
@@ -12,7 +12,7 @@ declare const workbenchWindowChromeI18nResources: Record<WorkbenchWindowChromeI1
12
12
  declare function createWorkbenchWindowChromeI18nRuntime(runtime: I18nRuntime<string> | undefined): WorkbenchWindowChromeI18nRuntime;
13
13
 
14
14
  declare const workbenchHostI18nNamespace = "workbenchHost";
15
- type WorkbenchHostI18nKey = "actions.close" | "actions.minimize" | "closeWindow" | "dockLabel" | "launch" | "minimizedWindows" | "newWindow" | "scrollDockDown" | "scrollDockLeft" | "scrollDockRight" | "scrollDockUp" | "windowStatus.active" | "windowStatus.minimized" | "windowStatus.open";
15
+ type WorkbenchHostI18nKey = "actions.close" | "actions.minimize" | "closeWindow" | "dockContextMenu.fullscreen" | "dockContextMenu.hide" | "dockContextMenu.keepInDock" | "dockContextMenu.open" | "dockContextMenu.quit" | "dockContextMenu.removeFromDock" | "dockContextMenu.showAllWindows" | "dockLabel" | "launch" | "minimizedWindows" | "newWindow" | "scrollDockDown" | "scrollDockLeft" | "scrollDockRight" | "scrollDockUp" | "windowStatus.active" | "windowStatus.minimized" | "windowStatus.open";
16
16
  type WorkbenchHostI18nRuntime = I18nRuntime<WorkbenchHostI18nKey>;
17
17
  declare const workbenchHostI18nResources: {
18
18
  readonly en: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workbench-surface",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
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.17",
38
- "@tutti-os/ui-react-hooks": "0.0.17",
39
- "@tutti-os/workbench-snapshot": "0.0.17",
40
- "@tutti-os/ui-system": "0.0.17"
37
+ "@tutti-os/ui-i18n-runtime": "0.0.19",
38
+ "@tutti-os/ui-react-hooks": "0.0.19",
39
+ "@tutti-os/workbench-snapshot": "0.0.19",
40
+ "@tutti-os/ui-system": "0.0.19"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "react": "^19.1.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/workbenchWindowI18n.ts","../src/mission-control/workbenchMissionControlI18n.ts","../src/host/workbenchHostI18n.ts"],"sourcesContent":["import {\n createScopedLocaleObjectsI18nModuleManifest,\n createI18nRuntime,\n createScopedI18nRuntime,\n type I18nDictionary,\n type I18nRuntime\n} from \"@tutti-os/ui-i18n-runtime\";\n\ntype WorkbenchWindowChromeI18nLocale = \"en\" | \"zh-CN\";\nexport const workbenchWindowChromeI18nNamespace = \"workbenchWindowChrome\";\nexport const tuttiI18nModule = createScopedLocaleObjectsI18nModuleManifest({\n localeObjectByLocale: {\n en: \"workbenchWindowChromeEn\",\n \"zh-CN\": \"workbenchWindowChromeZhCN\"\n },\n name: \"workbench-window-chrome\",\n namespace: \"workbenchWindowChrome\",\n sourceRoot: \"packages/workbench/surface/src\"\n});\n\nconst workbenchWindowChromeEn = {\n enterFullscreen: \"Full Screen\",\n exitFullscreen: \"Exit Full Screen\"\n} as const satisfies I18nDictionary;\n\nconst workbenchWindowChromeZhCN = {\n enterFullscreen: \"全屏\",\n exitFullscreen: \"取消全屏\"\n} as const satisfies I18nDictionary;\n\nexport type WorkbenchWindowChromeI18nKey = keyof typeof workbenchWindowChromeEn;\n\nexport type WorkbenchWindowChromeI18nRuntime =\n I18nRuntime<WorkbenchWindowChromeI18nKey>;\n\nconst workbenchWindowChromeDefaults: Record<\n WorkbenchWindowChromeI18nLocale,\n I18nDictionary\n> = {\n en: workbenchWindowChromeEn,\n \"zh-CN\": workbenchWindowChromeZhCN\n};\n\nexport const workbenchWindowChromeI18nResources: Record<\n WorkbenchWindowChromeI18nLocale,\n I18nDictionary\n> = {\n en: {\n [workbenchWindowChromeI18nNamespace]: workbenchWindowChromeDefaults.en\n },\n \"zh-CN\": {\n [workbenchWindowChromeI18nNamespace]: workbenchWindowChromeDefaults[\"zh-CN\"]\n }\n};\n\nconst defaultWorkbenchWindowChromeI18n = createI18nRuntime({\n dictionaries: [workbenchWindowChromeI18nResources.en]\n});\n\nexport function createWorkbenchWindowChromeI18nRuntime(\n runtime: I18nRuntime<string> | undefined\n): WorkbenchWindowChromeI18nRuntime {\n return createScopedI18nRuntime<WorkbenchWindowChromeI18nKey>(\n runtime ?? defaultWorkbenchWindowChromeI18n,\n workbenchWindowChromeI18nNamespace\n );\n}\n","import {\n createScopedLocaleObjectsI18nModuleManifest,\n createI18nRuntime,\n createScopedI18nRuntime,\n type I18nDictionary,\n type I18nRuntime\n} from \"@tutti-os/ui-i18n-runtime\";\n\ntype WorkbenchMissionControlI18nLocale = \"en\" | \"zh-CN\";\n\nexport const workbenchMissionControlI18nNamespace = \"workbenchMissionControl\";\n\nexport const tuttiI18nModule = createScopedLocaleObjectsI18nModuleManifest({\n localeObjectByLocale: {\n en: \"workbenchMissionControlEn\",\n \"zh-CN\": \"workbenchMissionControlZhCN\"\n },\n name: \"workbench-mission-control\",\n namespace: \"workbenchMissionControl\",\n sourceRoot: \"packages/workbench/surface/src\"\n});\n\nconst workbenchMissionControlEn = {\n layoutSelectionHint: \"Select multiple windows to arrange\",\n noAvailableLayout: \"No layout fits the selected windows\",\n presets: {\n balanced: \"Balanced layout\",\n column: \"Vertical equal layout\",\n row: \"Horizontal equal layout\"\n }\n} as const satisfies I18nDictionary;\n\nconst workbenchMissionControlZhCN = {\n layoutSelectionHint: \"请选择多个你要整理布局的窗口\",\n noAvailableLayout: \"当前没有可用布局\",\n presets: {\n balanced: \"智能均衡布局\",\n column: \"垂直等分布局\",\n row: \"水平等分布局\"\n }\n} as const satisfies I18nDictionary;\n\nexport type WorkbenchMissionControlI18nKey =\n | \"layoutSelectionHint\"\n | \"noAvailableLayout\"\n | \"presets.balanced\"\n | \"presets.column\"\n | \"presets.row\";\n\nexport type WorkbenchMissionControlI18nRuntime =\n I18nRuntime<WorkbenchMissionControlI18nKey>;\n\nconst workbenchMissionControlDefaults: Record<\n WorkbenchMissionControlI18nLocale,\n I18nDictionary\n> = {\n en: workbenchMissionControlEn,\n \"zh-CN\": workbenchMissionControlZhCN\n};\n\nexport const workbenchMissionControlI18nResources: Record<\n WorkbenchMissionControlI18nLocale,\n I18nDictionary\n> = {\n en: {\n [workbenchMissionControlI18nNamespace]: workbenchMissionControlDefaults.en\n },\n \"zh-CN\": {\n [workbenchMissionControlI18nNamespace]:\n workbenchMissionControlDefaults[\"zh-CN\"]\n }\n};\n\nconst defaultWorkbenchMissionControlI18n = createI18nRuntime({\n dictionaries: [workbenchMissionControlI18nResources.en]\n});\n\nexport function createWorkbenchMissionControlI18nRuntime(\n runtime: I18nRuntime<string> | undefined\n): WorkbenchMissionControlI18nRuntime {\n return createScopedI18nRuntime<WorkbenchMissionControlI18nKey>(\n runtime ?? defaultWorkbenchMissionControlI18n,\n workbenchMissionControlI18nNamespace\n );\n}\n","import {\n createScopedLocaleObjectsI18nModuleManifest,\n createI18nRuntime,\n createScopedI18nRuntime,\n type I18nDictionary,\n type I18nRuntime\n} from \"@tutti-os/ui-i18n-runtime\";\n\ntype WorkbenchHostI18nLocale = \"en\" | \"zh-CN\";\nexport const workbenchHostI18nNamespace = \"workbenchHost\";\nexport const tuttiI18nModule = createScopedLocaleObjectsI18nModuleManifest({\n localeObjectByLocale: {\n en: \"workbenchHostEn\",\n \"zh-CN\": \"workbenchHostZhCN\"\n },\n name: \"workbench-host\",\n namespace: \"workbenchHost\",\n sourceRoot: \"packages/workbench/surface/src\"\n});\n\nconst workbenchHostEn = {\n actions: {\n close: \"Close\",\n minimize: \"Minimize\"\n },\n closeWindow: \"Close {{title}}\",\n dockLabel: \"Workbench dock\",\n launch: \"Open {{title}}\",\n minimizedWindows: \"Minimized windows\",\n newWindow: \"New window\",\n scrollDockDown: \"Scroll dock down\",\n scrollDockLeft: \"Scroll dock left\",\n scrollDockRight: \"Scroll dock right\",\n scrollDockUp: \"Scroll dock up\",\n windowStatus: {\n active: \"Active\",\n minimized: \"Minimized\",\n open: \"Open\"\n }\n} as const satisfies I18nDictionary;\n\nconst workbenchHostZhCN = {\n actions: {\n close: \"关闭\",\n minimize: \"最小化\"\n },\n closeWindow: \"关闭 {{title}}\",\n dockLabel: \"工作台程序坞\",\n launch: \"打开 {{title}}\",\n minimizedWindows: \"已最小化窗口\",\n newWindow: \"新建窗口\",\n scrollDockDown: \"向下滚动程序坞\",\n scrollDockLeft: \"向左滚动程序坞\",\n scrollDockRight: \"向右滚动程序坞\",\n scrollDockUp: \"向上滚动程序坞\",\n windowStatus: {\n active: \"当前窗口\",\n minimized: \"已最小化\",\n open: \"已打开\"\n }\n} as const satisfies I18nDictionary;\n\nexport type WorkbenchHostI18nKey =\n | \"actions.close\"\n | \"actions.minimize\"\n | \"closeWindow\"\n | \"dockLabel\"\n | \"launch\"\n | \"minimizedWindows\"\n | \"newWindow\"\n | \"scrollDockDown\"\n | \"scrollDockLeft\"\n | \"scrollDockRight\"\n | \"scrollDockUp\"\n | \"windowStatus.active\"\n | \"windowStatus.minimized\"\n | \"windowStatus.open\";\n\nexport type WorkbenchHostI18nRuntime = I18nRuntime<WorkbenchHostI18nKey>;\n\nconst workbenchHostDefaults: Record<WorkbenchHostI18nLocale, I18nDictionary> = {\n en: workbenchHostEn,\n \"zh-CN\": workbenchHostZhCN\n};\n\nexport const workbenchHostI18nResources = {\n en: {\n [workbenchHostI18nNamespace]: workbenchHostDefaults.en\n },\n \"zh-CN\": {\n [workbenchHostI18nNamespace]: workbenchHostDefaults[\"zh-CN\"]\n }\n} as const satisfies Record<WorkbenchHostI18nLocale, I18nDictionary>;\n\nconst defaultWorkbenchHostI18n = createI18nRuntime({\n dictionaries: [workbenchHostI18nResources.en]\n});\n\nexport function createWorkbenchHostI18nRuntime(\n runtime: I18nRuntime<string> | undefined\n): WorkbenchHostI18nRuntime {\n return createScopedI18nRuntime<WorkbenchHostI18nKey>(\n runtime ?? defaultWorkbenchHostI18n,\n workbenchHostI18nNamespace\n );\n}\n"],"mappings":"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","names":["createScopedLocaleObjectsI18nModuleManifest","createI18nRuntime","createScopedI18nRuntime","tuttiI18nModule","createScopedLocaleObjectsI18nModuleManifest","createI18nRuntime","createScopedI18nRuntime","tuttiI18nModule"]}