quilt-vanilla 0.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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/action-icons.d.ts +18 -0
  4. package/dist/action-icons.d.ts.map +1 -0
  5. package/dist/action-icons.js +36 -0
  6. package/dist/action-icons.js.map +1 -0
  7. package/dist/chrome-icons.d.ts +3 -0
  8. package/dist/chrome-icons.d.ts.map +1 -0
  9. package/dist/chrome-icons.js +32 -0
  10. package/dist/chrome-icons.js.map +1 -0
  11. package/dist/corners.d.ts +8 -0
  12. package/dist/corners.d.ts.map +1 -0
  13. package/dist/corners.js +205 -0
  14. package/dist/corners.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +5 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lifetime.d.ts +10 -0
  20. package/dist/lifetime.d.ts.map +1 -0
  21. package/dist/lifetime.js +44 -0
  22. package/dist/lifetime.js.map +1 -0
  23. package/dist/menu.d.ts +10 -0
  24. package/dist/menu.d.ts.map +1 -0
  25. package/dist/menu.js +356 -0
  26. package/dist/menu.js.map +1 -0
  27. package/dist/panes.d.ts +13 -0
  28. package/dist/panes.d.ts.map +1 -0
  29. package/dist/panes.js +58 -0
  30. package/dist/panes.js.map +1 -0
  31. package/dist/picker.d.ts +6 -0
  32. package/dist/picker.d.ts.map +1 -0
  33. package/dist/picker.js +112 -0
  34. package/dist/picker.js.map +1 -0
  35. package/dist/registry.d.ts +25 -0
  36. package/dist/registry.d.ts.map +1 -0
  37. package/dist/registry.js +39 -0
  38. package/dist/registry.js.map +1 -0
  39. package/dist/renderer.d.ts +3 -0
  40. package/dist/renderer.d.ts.map +1 -0
  41. package/dist/renderer.js +570 -0
  42. package/dist/renderer.js.map +1 -0
  43. package/dist/resize.d.ts +7 -0
  44. package/dist/resize.d.ts.map +1 -0
  45. package/dist/resize.js +56 -0
  46. package/dist/resize.js.map +1 -0
  47. package/dist/shortcuts.d.ts +6 -0
  48. package/dist/shortcuts.d.ts.map +1 -0
  49. package/dist/shortcuts.js +64 -0
  50. package/dist/shortcuts.js.map +1 -0
  51. package/dist/styles.css +842 -0
  52. package/dist/tab-bar.d.ts +6 -0
  53. package/dist/tab-bar.d.ts.map +1 -0
  54. package/dist/tab-bar.js +336 -0
  55. package/dist/tab-bar.js.map +1 -0
  56. package/dist/tab-tooltip.d.ts +4 -0
  57. package/dist/tab-tooltip.d.ts.map +1 -0
  58. package/dist/tab-tooltip.js +95 -0
  59. package/dist/tab-tooltip.js.map +1 -0
  60. package/dist/tabs.d.ts +15 -0
  61. package/dist/tabs.d.ts.map +1 -0
  62. package/dist/tabs.js +126 -0
  63. package/dist/tabs.js.map +1 -0
  64. package/dist/theme.d.ts +206 -0
  65. package/dist/theme.d.ts.map +1 -0
  66. package/dist/theme.js +166 -0
  67. package/dist/theme.js.map +1 -0
  68. package/dist/types.d.ts +66 -0
  69. package/dist/types.d.ts.map +1 -0
  70. package/dist/types.js +2 -0
  71. package/dist/types.js.map +1 -0
  72. package/dist/windows.d.ts +23 -0
  73. package/dist/windows.d.ts.map +1 -0
  74. package/dist/windows.js +247 -0
  75. package/dist/windows.js.map +1 -0
  76. package/package.json +50 -0
  77. package/src/action-icons.ts +40 -0
  78. package/src/chrome-icons.ts +30 -0
  79. package/src/corners.ts +259 -0
  80. package/src/index.ts +27 -0
  81. package/src/lifetime.ts +46 -0
  82. package/src/menu.ts +432 -0
  83. package/src/panes.ts +76 -0
  84. package/src/picker.ts +114 -0
  85. package/src/registry.ts +46 -0
  86. package/src/renderer.ts +654 -0
  87. package/src/resize.ts +65 -0
  88. package/src/shortcuts.ts +90 -0
  89. package/src/styles.css +842 -0
  90. package/src/tab-bar.ts +382 -0
  91. package/src/tab-tooltip.ts +96 -0
  92. package/src/tabs.ts +129 -0
  93. package/src/theme.ts +211 -0
  94. package/src/types.ts +67 -0
  95. package/src/windows.ts +244 -0
@@ -0,0 +1,842 @@
1
+ .layouts {
2
+ position: relative;
3
+ width: 100%;
4
+ height: 100%;
5
+ min-height: 0;
6
+ color: var(--layouts-text, #e5e9f0);
7
+ background: var(--layouts-bg, #161a20);
8
+ font-family: var(--layouts-font-family, system-ui, sans-serif);
9
+ font-size: var(--layouts-font-size, 13px);
10
+ line-height: 1.45;
11
+ isolation: isolate;
12
+ }
13
+ .layouts *,
14
+ .layouts *::before,
15
+ .layouts *::after {
16
+ box-sizing: border-box;
17
+ }
18
+ .layouts [hidden] {
19
+ display: none !important;
20
+ }
21
+ .layouts-stage {
22
+ position: absolute;
23
+ inset: 0;
24
+ overflow: auto;
25
+ }
26
+ .layouts-node {
27
+ position: absolute;
28
+ min-width: 0;
29
+ min-height: 0;
30
+ }
31
+ .layouts-group {
32
+ display: flex;
33
+ flex-direction: column;
34
+ background: var(--layouts-panel, #1d222a);
35
+ }
36
+ .layouts-group::before {
37
+ content: '';
38
+ position: absolute;
39
+ inset: 0;
40
+ z-index: 3;
41
+ pointer-events: none;
42
+ border: 1px solid;
43
+ border-color: var(--layouts-edge-top, var(--layouts-line, #39414e))
44
+ var(--layouts-edge-right, var(--layouts-line, #39414e))
45
+ var(--layouts-edge-bottom, var(--layouts-line, #39414e))
46
+ var(--layouts-edge-left, var(--layouts-line, #39414e));
47
+ }
48
+ .layouts-header {
49
+ height: var(--layouts-header-height, 34px);
50
+ flex: 0 0 var(--layouts-header-height, 34px);
51
+ display: flex;
52
+ align-items: center;
53
+ background: var(--layouts-header, #242a34);
54
+ border-bottom: 1px solid var(--layouts-line, #39414e);
55
+ padding: 4px 6px;
56
+ gap: 2px;
57
+ }
58
+ .layouts-tabs {
59
+ display: flex;
60
+ flex: 1;
61
+ min-width: 0;
62
+ overflow: auto;
63
+ scrollbar-width: thin;
64
+ height: 100%;
65
+ gap: 3px;
66
+ }
67
+ .layouts-button,
68
+ .layouts-tab {
69
+ appearance: none;
70
+ border: 0;
71
+ background: transparent;
72
+ color: var(--layouts-muted, #a2acba);
73
+ font: inherit;
74
+ padding: 5px 9px;
75
+ cursor: pointer;
76
+ border-radius: var(--layouts-radius, 5px);
77
+ white-space: nowrap;
78
+ }
79
+ .layouts-tab {
80
+ border-radius: 0;
81
+ border-bottom: 2px solid transparent;
82
+ text-overflow: ellipsis;
83
+ max-width: 240px;
84
+ overflow: hidden;
85
+ }
86
+ .layouts-tab[aria-selected='true'] {
87
+ color: var(--layouts-text, #e5e9f0);
88
+ background: var(--layouts-panel, #1d222a);
89
+ }
90
+ .layouts-button:hover:not(:disabled),
91
+ .layouts-tab:hover {
92
+ color: var(--layouts-text, #e5e9f0);
93
+ background: color-mix(in srgb, var(--layouts-text, #e5e9f0) 8%, transparent);
94
+ }
95
+ .layouts-button:disabled {
96
+ opacity: 0.4;
97
+ cursor: default;
98
+ }
99
+ .layouts :focus-visible {
100
+ outline: 2px solid var(--layouts-focus, #b3decf);
101
+ outline-offset: -2px;
102
+ }
103
+ .layouts .layouts-menu:focus-visible {
104
+ outline: none;
105
+ }
106
+ /* Arrow-key navigation activates the focused tab; its background marks selection. */
107
+ .layouts .layouts-tab[aria-selected='true']:focus-visible {
108
+ outline: none;
109
+ }
110
+ .layouts-body {
111
+ position: relative;
112
+ flex: 1;
113
+ min-height: 0;
114
+ min-width: 0;
115
+ overflow: hidden;
116
+ }
117
+ .layouts-pane {
118
+ width: 100%;
119
+ height: 100%;
120
+ overflow: auto;
121
+ }
122
+ .layouts-divider {
123
+ position: absolute;
124
+ z-index: 3;
125
+ touch-action: none;
126
+ background: var(--layouts-bg, #161a20);
127
+ }
128
+ .layouts-divider[data-axis='horizontal'] {
129
+ cursor: col-resize;
130
+ }
131
+ .layouts-divider[data-axis='vertical'] {
132
+ cursor: row-resize;
133
+ }
134
+ .layouts-divider:hover:not([aria-disabled='true']),
135
+ .layouts-divider:focus-visible {
136
+ background: var(--layouts-accent, #8bbaaa);
137
+ }
138
+ .layouts-divider[aria-disabled='true'] {
139
+ cursor: default;
140
+ }
141
+ .layouts-resizing {
142
+ user-select: none;
143
+ }
144
+ .layouts-placeholder {
145
+ padding: 24px;
146
+ color: var(--layouts-muted, #a2acba);
147
+ }
148
+ .layouts-status {
149
+ position: absolute;
150
+ bottom: 12px;
151
+ left: 12px;
152
+ max-width: min(560px, 90%);
153
+ padding: 10px 14px;
154
+ background: var(--layouts-header, #242a34);
155
+ border: 1px solid var(--layouts-line, #39414e);
156
+ border-radius: var(--layouts-radius, 5px);
157
+ z-index: 20;
158
+ }
159
+ .layouts-status:empty {
160
+ display: none;
161
+ }
162
+ .layouts-menu {
163
+ position: fixed;
164
+ margin: 0;
165
+ padding: 5px;
166
+ width: 240px;
167
+ max-height: min(520px, 70vh);
168
+ overflow: auto;
169
+ background: var(--layouts-header, #242a34);
170
+ color: var(--layouts-text, #e5e9f0);
171
+ border: 1px solid var(--layouts-line, #39414e);
172
+ border-radius: var(--layouts-radius, 7px);
173
+ box-shadow: 0 12px 40px #0005;
174
+ }
175
+ .layouts-menu .layouts-button {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 10px;
179
+ width: 100%;
180
+ text-align: left;
181
+ white-space: normal;
182
+ }
183
+ .layouts-menu::backdrop {
184
+ background: transparent;
185
+ }
186
+ .layouts-group[data-drop]::after {
187
+ content: '';
188
+ position: absolute;
189
+ inset: 0;
190
+ z-index: 5;
191
+ pointer-events: none;
192
+ background: color-mix(in srgb, var(--layouts-accent, #8bbaaa) 22%, transparent);
193
+ border: 2px solid var(--layouts-accent, #8bbaaa);
194
+ }
195
+ .layouts-group[data-drop='left']::after {
196
+ right: 50%;
197
+ }
198
+ .layouts-group[data-drop='right']::after {
199
+ left: 50%;
200
+ }
201
+ .layouts-group[data-drop='top']::after {
202
+ bottom: 50%;
203
+ }
204
+ .layouts-group[data-drop='bottom']::after {
205
+ top: 50%;
206
+ }
207
+ .layouts-companion {
208
+ position: fixed;
209
+ inset: 0;
210
+ display: flex;
211
+ flex-direction: column;
212
+ }
213
+ .layouts-companion-bar {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: space-between;
217
+ flex: 0 0 38px;
218
+ background: var(--layouts-header, #242a34);
219
+ border-bottom: 1px solid var(--layouts-line, #39414e);
220
+ padding: 0 10px;
221
+ }
222
+ .layouts-companion > .layouts-pane {
223
+ flex: 1;
224
+ min-height: 0;
225
+ height: auto;
226
+ }
227
+
228
+ /* Each tab responds to its allocated width, not the whole viewport. */
229
+ .layouts-tab-item {
230
+ position: relative;
231
+ display: flex;
232
+ flex: 0 1 180px;
233
+ min-width: 32px;
234
+ container: layouts-tab / inline-size;
235
+ border-radius: var(--layouts-radius, 5px);
236
+ }
237
+ .layouts-tab-item[data-active='true'] {
238
+ min-width: 56px;
239
+ background: var(--layouts-panel, #1d222a);
240
+ }
241
+ .layouts-tab-item .layouts-tab {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 7px;
245
+ flex: 1;
246
+ min-width: 0;
247
+ border: 0;
248
+ background: transparent;
249
+ padding: 0 8px;
250
+ }
251
+ .layouts-tab-icon {
252
+ flex: 0 0 var(--layouts-icon-size, 16px);
253
+ width: var(--layouts-icon-size, 16px);
254
+ height: var(--layouts-icon-size, 16px);
255
+ display: inline-flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ }
259
+ .layouts-tab-icon > * {
260
+ width: var(--layouts-icon-size, 16px);
261
+ height: var(--layouts-icon-size, 16px);
262
+ }
263
+ .layouts-tab-label {
264
+ overflow: hidden;
265
+ text-overflow: ellipsis;
266
+ }
267
+ .layouts-tab-item .layouts-tab-close {
268
+ flex: 0 0 22px;
269
+ align-self: center;
270
+ width: 22px;
271
+ height: 100%;
272
+ max-height: 24px;
273
+ padding: 0;
274
+ margin-right: 3px;
275
+ }
276
+ @container layouts-tab (max-width: 130px) {
277
+ .layouts-tab-close {
278
+ display: none;
279
+ }
280
+ .layouts-tab-item[data-active='true'] > .layouts-tab-close {
281
+ display: block;
282
+ }
283
+ }
284
+ @container layouts-tab (max-width: 95px) {
285
+ .layouts-tab-label {
286
+ display: none;
287
+ }
288
+ .layouts-tab-item .layouts-tab {
289
+ justify-content: center;
290
+ padding-inline: 4px;
291
+ }
292
+ }
293
+ .layouts-tab-item[data-tab-drop]::after {
294
+ content: '';
295
+ position: absolute;
296
+ top: 2px;
297
+ bottom: 2px;
298
+ left: 0;
299
+ width: 2px;
300
+ background: var(--layouts-accent, #8bbaaa);
301
+ pointer-events: none;
302
+ }
303
+ .layouts-tab-item[data-tab-drop='after']::after {
304
+ left: auto;
305
+ right: 0;
306
+ }
307
+
308
+ .layouts-picker {
309
+ width: min(340px, calc(100vw - 16px));
310
+ }
311
+ .layouts-picker-search {
312
+ width: 100%;
313
+ padding: 10px;
314
+ border: 1px solid var(--layouts-line, #39414e);
315
+ border-radius: var(--layouts-radius, 5px);
316
+ background: var(--layouts-panel, #1d222a);
317
+ color: var(--layouts-text, #e5e9f0);
318
+ font: inherit;
319
+ }
320
+ .layouts-picker-list {
321
+ max-height: 280px;
322
+ overflow: auto;
323
+ margin-top: 5px;
324
+ }
325
+ .layouts-picker-option {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 10px;
329
+ padding: 10px;
330
+ cursor: pointer;
331
+ border-radius: var(--layouts-radius, 5px);
332
+ }
333
+ .layouts-picker-option[aria-selected='true'],
334
+ .layouts-picker-option:hover {
335
+ background: color-mix(in srgb, var(--layouts-accent, #8bbaaa) 20%, transparent);
336
+ }
337
+ .layouts-picker-option strong,
338
+ .layouts-picker-option small {
339
+ display: block;
340
+ }
341
+ .layouts-picker-option small,
342
+ .layouts-picker-status {
343
+ color: var(--layouts-muted, #a2acba);
344
+ }
345
+ .layouts-picker-status {
346
+ padding: 10px;
347
+ }
348
+
349
+ /* Consumer-owned scrollbar roles also apply to nested application content. */
350
+ .layouts,
351
+ .layouts * {
352
+ scrollbar-width: thin;
353
+ scrollbar-color: var(--layouts-scrollbar-thumb, var(--layouts-line, #39414e))
354
+ var(--layouts-scrollbar-track, transparent);
355
+ }
356
+ .layouts ::-webkit-scrollbar {
357
+ width: var(--layouts-scrollbar-size, 6px);
358
+ height: var(--layouts-scrollbar-size, 6px);
359
+ }
360
+ .layouts ::-webkit-scrollbar-thumb {
361
+ background: var(--layouts-scrollbar-thumb, var(--layouts-line, #39414e));
362
+ border-radius: var(--layouts-radius, 5px);
363
+ }
364
+ .layouts ::-webkit-scrollbar-track {
365
+ background: var(--layouts-scrollbar-track, transparent);
366
+ }
367
+ .layouts-submenu {
368
+ position: relative;
369
+ }
370
+ .layouts-submenu > button {
371
+ width: 100%;
372
+ text-align: left;
373
+ }
374
+ .layouts-submenu-content {
375
+ display: flex;
376
+ flex-direction: column;
377
+ padding: 4px;
378
+ border: 1px solid var(--layouts-line);
379
+ background: var(--layouts-panel);
380
+ }
381
+ .layouts-menu:has(.layouts-submenu-content:not([hidden])) {
382
+ min-width: 300px;
383
+ }
384
+ .layouts-corner {
385
+ position: absolute;
386
+ display: var(--layouts-corner-handle-display, block);
387
+ width: var(--layouts-corner-handle-size, 8px);
388
+ height: var(--layouts-corner-handle-size, 8px);
389
+ padding: 0;
390
+ border: 0;
391
+ background: transparent;
392
+ z-index: 3;
393
+ touch-action: none;
394
+ cursor: crosshair;
395
+ }
396
+ .layouts-corner::after {
397
+ content: '';
398
+ position: absolute;
399
+ inset: 2px;
400
+ border-style: solid;
401
+ border-width: var(--layouts-corner-handle-border-width, 2px 0 0 2px);
402
+ border-color: var(--layouts-corner-handle-color, var(--layouts-muted));
403
+ border-radius: var(--layouts-corner-handle-radius, 0px);
404
+ background: var(--layouts-corner-handle-fill, transparent);
405
+ opacity: var(--layouts-corner-handle-opacity, 0.35);
406
+ }
407
+ .layouts-corner:hover::after {
408
+ opacity: 1;
409
+ }
410
+ .layouts-corner[data-corner='tl'] {
411
+ top: var(--layouts-corner-handle-inset, 0px);
412
+ left: var(--layouts-corner-handle-inset, 0px);
413
+ }
414
+ .layouts-corner[data-corner='tr'] {
415
+ top: var(--layouts-corner-handle-inset, 0px);
416
+ right: var(--layouts-corner-handle-inset, 0px);
417
+ transform: rotate(90deg);
418
+ }
419
+ .layouts-corner[data-corner='br'] {
420
+ bottom: var(--layouts-corner-handle-inset, 0px);
421
+ right: var(--layouts-corner-handle-inset, 0px);
422
+ transform: rotate(180deg);
423
+ }
424
+ .layouts-corner[data-corner='bl'] {
425
+ bottom: var(--layouts-corner-handle-inset, 0px);
426
+ left: var(--layouts-corner-handle-inset, 0px);
427
+ transform: rotate(270deg);
428
+ }
429
+ .layouts-group[data-corner-preview] {
430
+ outline: 2px solid var(--layouts-accent);
431
+ outline-offset: -2px;
432
+ }
433
+
434
+ .layouts-menu:has(.layouts-submenu) {
435
+ overflow: visible;
436
+ }
437
+ .layouts-submenu-content {
438
+ position: absolute;
439
+ top: 0;
440
+ left: calc(100% - 1px);
441
+ width: 200px;
442
+ box-shadow: 0 8px 24px #0005;
443
+ border-radius: var(--layouts-radius, 5px);
444
+ }
445
+ .layouts-submenu[data-side='left'] .layouts-submenu-content {
446
+ left: auto;
447
+ right: calc(100% - 1px);
448
+ }
449
+ .layouts-menu:has(.layouts-submenu-content:not([hidden])) {
450
+ min-width: 0;
451
+ }
452
+
453
+ .layouts-corner-overlay {
454
+ position: fixed;
455
+ inset: 0;
456
+ pointer-events: none;
457
+ z-index: 100;
458
+ }
459
+ .layouts-corner-preview {
460
+ position: fixed;
461
+ box-sizing: border-box;
462
+ border: 2px solid var(--layouts-accent);
463
+ display: grid;
464
+ place-items: center;
465
+ overflow: hidden;
466
+ }
467
+ .layouts-corner-preview[data-corner-preview='split'],
468
+ .layouts-corner-preview[data-corner-preview='join-target'] {
469
+ background: color-mix(in srgb, var(--layouts-accent) 16%, transparent);
470
+ }
471
+ .layouts-corner-preview[data-corner-preview='join-source'] {
472
+ border-style: dashed;
473
+ background: color-mix(in srgb, var(--layouts-bg) 65%, transparent);
474
+ }
475
+ .layouts-corner-preview[data-corner-preview='join'] {
476
+ border-width: 3px;
477
+ }
478
+ .layouts-corner-label {
479
+ background: var(--layouts-panel);
480
+ color: var(--layouts-text);
481
+ padding: 6px 10px;
482
+ border-radius: var(--layouts-radius);
483
+ text-align: center;
484
+ }
485
+ .layouts-corner-label:empty {
486
+ display: none;
487
+ }
488
+
489
+ /* Themeable density affects chrome only; structural divider gaps stay in layout JSON. */
490
+ .layouts-menu button,
491
+ .layouts-picker button {
492
+ min-height: var(--layouts-control-height, 28px);
493
+ }
494
+ .layouts-menu {
495
+ padding: var(--layouts-spacing, 5px);
496
+ }
497
+
498
+ /* Tapered chrome overlays the pane; only its painted footprint intercepts input. */
499
+ .layouts-group[data-tab-bar='tapered'] > .layouts-header {
500
+ position: absolute;
501
+ inset: 0 auto auto 0;
502
+ z-index: 2;
503
+ max-width: 100%;
504
+ border-bottom-color: transparent;
505
+ }
506
+ .layouts-group[data-tab-bar='tapered'] .layouts-tab-item {
507
+ flex-basis: var(--layouts-tab-preferred-width, 180px);
508
+ }
509
+ .layouts-header > .layouts-button {
510
+ display: inline-flex;
511
+ align-items: center;
512
+ justify-content: center;
513
+ flex-shrink: 0;
514
+ height: 100%;
515
+ padding: 0 7px;
516
+ }
517
+ .layouts-tab-cap {
518
+ position: absolute;
519
+ left: 100%;
520
+ top: 0;
521
+ height: calc(100% + 1px);
522
+ overflow: visible;
523
+ pointer-events: none;
524
+ }
525
+ .layouts-tab-cap path {
526
+ fill: var(--layouts-header, #242a34);
527
+ pointer-events: visiblePainted;
528
+ }
529
+ .layouts-header.layouts-tab-measure {
530
+ position: fixed !important;
531
+ inset: -10000px auto auto -10000px !important;
532
+ width: max-content !important;
533
+ max-width: none !important;
534
+ visibility: hidden;
535
+ pointer-events: none;
536
+ }
537
+ .layouts-tab-measure .layouts-tabs {
538
+ flex: none;
539
+ overflow: visible;
540
+ }
541
+ .layouts-tab-measure .layouts-tab-item {
542
+ container: none;
543
+ flex: none;
544
+ width: max-content;
545
+ min-width: 0;
546
+ max-width: 180px;
547
+ }
548
+ .layouts-tab-measure .layouts-tab-label {
549
+ display: block;
550
+ }
551
+ .layouts-tab-measure .layouts-tab-close {
552
+ display: block;
553
+ }
554
+ .layouts-group[data-tab-bar-filled='false'] .layouts-tab-label {
555
+ display: block;
556
+ }
557
+ .layouts-group[data-tab-bar-filled='false'] .layouts-tab-close {
558
+ display: block;
559
+ }
560
+ .layouts-group[data-tab-bar-filled='false'] .layouts-tab {
561
+ padding: 0 8px;
562
+ justify-content: flex-start;
563
+ }
564
+
565
+ .layouts-tab-measure .layouts-tab {
566
+ flex: none;
567
+ max-width: none;
568
+ }
569
+ .layouts-group[data-tab-bar-filled='false'] .layouts-tab-item {
570
+ flex-shrink: 0;
571
+ }
572
+
573
+ .layouts-tab-outline {
574
+ position: absolute;
575
+ left: 0;
576
+ top: 0;
577
+ z-index: 3;
578
+ pointer-events: none;
579
+ }
580
+ .layouts-tab-outline path {
581
+ fill: none;
582
+ stroke: var(--layouts-line, #39414e);
583
+ stroke-width: 1px;
584
+ vector-effect: non-scaling-stroke;
585
+ pointer-events: none;
586
+ }
587
+
588
+ .layouts-chrome-icon {
589
+ display: inline-block;
590
+ width: var(--layouts-icon-size, 16px);
591
+ height: var(--layouts-icon-size, 16px);
592
+ vertical-align: middle;
593
+ pointer-events: none;
594
+ }
595
+
596
+ /* A reserved left rail keeps pane content clear of icon-only controls. */
597
+ .layouts-group[data-tab-placement='left'] {
598
+ flex-direction: row;
599
+ }
600
+ .layouts-group[data-tab-placement='left'] > .layouts-header {
601
+ position: relative;
602
+ inset: auto;
603
+ width: var(--layouts-header-width, 32px);
604
+ height: 100%;
605
+ flex: 0 0 var(--layouts-header-width, 32px);
606
+ flex-direction: column;
607
+ padding: 4px;
608
+ border-bottom: 0;
609
+ border-right: 1px solid var(--layouts-line, #39414e);
610
+ min-height: 0;
611
+ gap: 4px;
612
+ }
613
+ .layouts-group[data-tab-placement='left'] .layouts-tabs {
614
+ flex-direction: column;
615
+ width: 100%;
616
+ height: auto;
617
+ min-height: 0;
618
+ overflow-x: hidden;
619
+ overflow-y: auto;
620
+ }
621
+ .layouts-group[data-tab-placement='left'] .layouts-tab-item {
622
+ flex: 0 0 30px;
623
+ min-width: 0;
624
+ width: 100%;
625
+ height: 30px;
626
+ }
627
+ .layouts-group[data-tab-placement='left'] .layouts-tab-item .layouts-tab {
628
+ padding: 0;
629
+ justify-content: center;
630
+ border-radius: var(--layouts-radius, 5px);
631
+ }
632
+ .layouts-group[data-tab-placement='left'] .layouts-tab-label,
633
+ .layouts-group[data-tab-placement='left'] .layouts-tab-item > .layouts-tab-close {
634
+ display: none;
635
+ }
636
+ .layouts-group[data-tab-placement='left'] > .layouts-header > .layouts-button {
637
+ flex: 0 0 30px;
638
+ height: 30px;
639
+ width: 100%;
640
+ padding: 0;
641
+ }
642
+ .layouts-group[data-tab-placement='left'] .layouts-tab-item[data-tab-drop]::after {
643
+ inset: 0 2px auto;
644
+ width: auto;
645
+ height: 2px;
646
+ }
647
+ .layouts-group[data-tab-placement='left'] .layouts-tab-item[data-tab-drop='after']::after {
648
+ inset: auto 2px 0;
649
+ }
650
+
651
+ .layouts-group[data-tab-placement='left'][data-tab-bar='tapered'] > .layouts-header {
652
+ position: absolute;
653
+ inset: 0 auto auto 0;
654
+ border-right-color: transparent;
655
+ }
656
+ .layouts-group[data-tab-placement='left'] .layouts-tab-cap {
657
+ left: 0;
658
+ top: 100%;
659
+ }
660
+ .layouts-group[data-tab-placement='left'] > .layouts-header > .layouts-button .layouts-chrome-icon {
661
+ transform: rotate(90deg);
662
+ }
663
+
664
+ .layouts-picker-persistent {
665
+ position: absolute;
666
+ z-index: 3;
667
+ left: 50%;
668
+ top: calc(50% + var(--layouts-header-height, 32px) / 2);
669
+ transform: translate(-50%, -50%);
670
+ width: min(340px, calc(100% - 16px));
671
+ max-height: calc(100% - var(--layouts-header-height, 32px) - 16px);
672
+ box-sizing: border-box;
673
+ }
674
+
675
+ .layouts-tab-tooltip {
676
+ position: fixed;
677
+ z-index: 1000;
678
+ pointer-events: none;
679
+ max-width: min(280px, calc(100vw - 16px));
680
+ padding: 6px 9px;
681
+ border: 1px solid var(--layouts-line, #39414e);
682
+ border-radius: var(--layouts-radius, 5px);
683
+ background: var(--layouts-panel, #1d222a);
684
+ color: var(--layouts-text, #e5e9f0);
685
+ box-shadow: 0 3px 12px #0003;
686
+ font-size: 12px;
687
+ line-height: 1.4;
688
+ overflow-wrap: anywhere;
689
+ }
690
+
691
+ /* Gapless frozen boundaries are decorative and never intercept pane input. */
692
+ [data-frozen-border='horizontal']::after,
693
+ [data-frozen-border='vertical']::after {
694
+ content: '';
695
+ position: absolute;
696
+ z-index: 4;
697
+ pointer-events: none;
698
+ background: var(--layouts-frozen-pane-border, var(--layouts-line, #39414e));
699
+ }
700
+ [data-frozen-border='horizontal']::after {
701
+ left: calc(var(--layouts-frozen-boundary) - 1px);
702
+ top: 0;
703
+ width: 1px;
704
+ height: 100%;
705
+ }
706
+ [data-frozen-border='vertical']::after {
707
+ top: calc(var(--layouts-frozen-boundary) - 1px);
708
+ left: 0;
709
+ height: 1px;
710
+ width: 100%;
711
+ }
712
+
713
+ /* The split owns shared frozen borders; descendants omit those same edges. */
714
+ .layouts-group[data-shared-edges~='top'] {
715
+ --layouts-edge-top: transparent;
716
+ }
717
+ .layouts-group[data-shared-edges~='right'] {
718
+ --layouts-edge-right: transparent;
719
+ }
720
+ .layouts-group[data-shared-edges~='bottom'] {
721
+ --layouts-edge-bottom: transparent;
722
+ }
723
+ .layouts-group[data-shared-edges~='left'] {
724
+ --layouts-edge-left: transparent;
725
+ }
726
+
727
+ .layouts-tabs:empty {
728
+ display: none;
729
+ }
730
+
731
+ .layouts-empty {
732
+ position: absolute;
733
+ inset: 0;
734
+ width: 100%;
735
+ height: 100%;
736
+ padding: 0;
737
+ border: 0;
738
+ border-radius: 0;
739
+ background: transparent;
740
+ color: var(--layouts-line, #39414e);
741
+ cursor: pointer;
742
+ }
743
+ .layouts-empty:disabled {
744
+ cursor: default;
745
+ }
746
+ .layouts-empty:focus-visible {
747
+ outline: 1px solid var(--layouts-accent, #8bbaaa);
748
+ outline-offset: -3px;
749
+ }
750
+ .layouts-empty > svg {
751
+ display: block;
752
+ width: 100%;
753
+ height: 100%;
754
+ pointer-events: none;
755
+ fill: none;
756
+ stroke: currentColor;
757
+ stroke-width: 1;
758
+ }
759
+
760
+ .layouts-picker-search:focus,
761
+ .layouts-picker-search:focus-visible {
762
+ outline: none;
763
+ box-shadow: none;
764
+ }
765
+
766
+ .layouts-group[data-tab-attachment='floating'][data-tab-bar] > .layouts-header {
767
+ position: absolute;
768
+ inset: var(--layouts-floating-inset-y, 8px) auto auto var(--layouts-floating-inset-x, 8px);
769
+ max-width: calc(100% - 2 * var(--layouts-floating-inset-x, 8px));
770
+ max-height: calc(100% - 2 * var(--layouts-floating-inset-y, 8px));
771
+ border-color: transparent;
772
+ box-shadow: inset 0 0 0 1px var(--layouts-line, #39414e);
773
+ }
774
+ .layouts-header[data-tab-bar-shape='rounded'] {
775
+ border-radius: var(--layouts-radius, 5px);
776
+ }
777
+
778
+ .layouts-group[data-tab-attachment='floating'][data-tab-bar]
779
+ > .layouts-header[data-tab-corners='rounded'] {
780
+ border-radius: var(--layouts-radius, 5px);
781
+ box-shadow: inset 0 0 0 1px var(--layouts-line, #39414e);
782
+ }
783
+ .layouts-group[data-tab-attachment='floating'][data-tab-bar]
784
+ > .layouts-header[data-tab-corners='capsule'] {
785
+ border-radius: 999px;
786
+ }
787
+ .layouts-group[data-tab-attachment='floating'][data-tab-bar]
788
+ > .layouts-header[data-tab-corners='fitted'] {
789
+ border-radius: 0;
790
+ }
791
+
792
+ /* Display is independent of orientation; automatic follows each tab's width. */
793
+ @container layouts-tab (min-width: 96px) {
794
+ .layouts-group[data-tab-placement='left'][data-tab-display='automatic'] .layouts-tab-label {
795
+ display: block;
796
+ }
797
+ .layouts-group[data-tab-placement='left'][data-tab-display='automatic']
798
+ .layouts-tab-item
799
+ .layouts-tab {
800
+ padding: 0 8px;
801
+ justify-content: flex-start;
802
+ }
803
+ }
804
+ .layouts-group[data-tab-placement='left'][data-tab-display='automatic'] > .layouts-header {
805
+ min-width: max(32px, calc(var(--layouts-icon-size, 16px) + 10px));
806
+ }
807
+ .layouts-group[data-tab-placement='left'][data-tab-display='automatic']
808
+ .layouts-tab-item[data-active='true']:has(> .layouts-tab-close) {
809
+ flex-direction: column;
810
+ flex-basis: 52px;
811
+ height: 52px;
812
+ }
813
+ .layouts-group[data-tab-placement='left'][data-tab-display='automatic']
814
+ .layouts-tab-item[data-active='true']:has(> .layouts-tab-close)
815
+ > .layouts-tab {
816
+ flex: 0 0 30px;
817
+ width: 100%;
818
+ }
819
+ .layouts-group[data-tab-placement='left'][data-tab-display='automatic']
820
+ .layouts-tab-item[data-active='true']
821
+ > .layouts-tab-close {
822
+ display: block;
823
+ flex: 0 0 22px;
824
+ height: 22px;
825
+ margin: 0;
826
+ }
827
+ .layouts-group[data-tab-display='compact'] .layouts-tab-label,
828
+ .layouts-group[data-tab-display='compact'] .layouts-tab-close,
829
+ .layouts-header[data-tab-display='compact'] .layouts-tab-label,
830
+ .layouts-header[data-tab-display='compact'] .layouts-tab-close {
831
+ display: none;
832
+ }
833
+ .layouts-group[data-tab-display='compact'] .layouts-tab-item .layouts-tab,
834
+ .layouts-header[data-tab-display='compact'] .layouts-tab-item .layouts-tab {
835
+ justify-content: center;
836
+ padding-inline: 8px;
837
+ }
838
+ .layouts-group[data-tab-placement='top'][data-tab-display='compact'] .layouts-tab-item,
839
+ .layouts-header.layouts-tab-measure[data-tab-display='compact'] .layouts-tab-item {
840
+ flex: 0 0 calc(var(--layouts-icon-size, 16px) + 16px);
841
+ min-width: calc(var(--layouts-icon-size, 16px) + 16px);
842
+ }