@ai-matrx/canvas 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -3,8 +3,13 @@
3
3
  /*
4
4
  * @ai-matrx/canvas — structural CSS (C26).
5
5
  *
6
- * Every colour comes from a --mxc-* token. Hosts set the token VALUES (see
7
- * tokens.css for the shipped defaults); this sheet never hardcodes a colour.
6
+ * Every colour and size comes from a --mxc-* token. Hosts set the token VALUES
7
+ * (tokens.css ships defaults that follow a design-system theme when one is
8
+ * present); this sheet never hardcodes a colour.
9
+ *
10
+ * The look: panes are cards (radius, hairline border) on the column's frame
11
+ * background, separated by a gap that is also the split handle — the Claude
12
+ * desktop / Codex canvas.
8
13
  */
9
14
 
10
15
  .mxc-column {
@@ -15,15 +20,17 @@
15
20
  height: 100%;
16
21
  min-height: 0;
17
22
  flex: none;
18
- background: var(--mxc-bg);
23
+ background: var(--mxc-frame-bg);
19
24
  color: var(--mxc-fg);
20
- border-left: 1px solid var(--mxc-border);
25
+ border-left: var(--mxc-column-border-width, 0px) solid var(--mxc-border);
21
26
  /* The column owns the top edge of the window: no header sits above it. */
22
27
  padding-top: var(--mxc-safe-top, 0px);
23
28
  isolation: isolate;
29
+ font-family: inherit;
24
30
  }
25
31
 
26
- .mxc-column[data-fullscreen] {
32
+ .mxc-column[data-fullscreen],
33
+ .mxc-column[data-placement="fill"] {
27
34
  width: 100%;
28
35
  border-left: 0;
29
36
  }
@@ -51,10 +58,21 @@
51
58
  user-select: none !important;
52
59
  }
53
60
 
61
+ :root[data-mxc-resizing="row"],
62
+ :root[data-mxc-resizing="row"] * {
63
+ cursor: row-resize !important;
64
+ }
65
+
54
66
  .mxc-layout {
55
67
  flex: 1 1 auto;
56
68
  min-height: 0;
57
69
  display: flex;
70
+ padding: var(--mxc-gap);
71
+ }
72
+
73
+ .mxc-column[data-placement="docked"]:not([data-fullscreen]) > .mxc-layout {
74
+ /* The gap on the left edge is the width handle's room. */
75
+ padding-left: max(var(--mxc-gap), 0px);
58
76
  }
59
77
 
60
78
  .mxc-split {
@@ -74,45 +92,53 @@
74
92
  display: flex;
75
93
  }
76
94
 
95
+ /* The gap between cards IS the handle: transparent, tinted on hover and drag. */
77
96
  .mxc-split-handle {
78
97
  flex: none;
79
- background: var(--mxc-border);
80
- touch-action: none;
81
98
  position: relative;
99
+ touch-action: none;
100
+ border-radius: 999px;
101
+ background: transparent;
102
+ transition: background-color 120ms ease-out;
82
103
  }
83
104
 
84
105
  .mxc-split[data-orientation="horizontal"] > .mxc-split-handle {
85
- width: 1px;
106
+ width: max(var(--mxc-gap), 1px);
86
107
  cursor: col-resize;
87
108
  }
88
109
 
89
110
  .mxc-split[data-orientation="vertical"] > .mxc-split-handle {
90
- height: 1px;
111
+ height: max(var(--mxc-gap), 1px);
91
112
  cursor: row-resize;
92
113
  }
93
114
 
94
- /* A wide invisible grab area around the 1px line. */
115
+ /* A grab area at least 7px wide around a thin gap. */
95
116
  .mxc-split-handle::after {
96
117
  content: "";
97
118
  position: absolute;
98
119
  inset: -3px;
99
120
  }
100
121
 
101
- .mxc-split-handle:hover {
102
- background: var(--mxc-accent);
122
+ .mxc-split-handle:hover,
123
+ .mxc-split-handle:active {
124
+ background: var(--mxc-handle-hover);
103
125
  }
104
126
 
105
- .mxc-pane {
127
+ /* ── panel (THE chrome) ─────────────────────────────────────────────────── */
128
+
129
+ .mxc-panel {
106
130
  flex: 1 1 auto;
107
131
  min-width: 0;
108
132
  min-height: 0;
133
+ width: 100%;
134
+ height: 100%;
109
135
  display: flex;
110
136
  flex-direction: column;
137
+ overflow: hidden;
138
+ border: 1px solid var(--mxc-border);
139
+ border-radius: var(--mxc-radius);
111
140
  background: var(--mxc-bg);
112
- }
113
-
114
- .mxc-pane[data-drop] {
115
- box-shadow: inset 0 0 0 2px var(--mxc-accent);
141
+ color: var(--mxc-fg);
116
142
  }
117
143
 
118
144
  .mxc-pane-header {
@@ -120,14 +146,133 @@
120
146
  display: flex;
121
147
  align-items: center;
122
148
  gap: 0.25rem;
123
- height: var(--mxc-header-h, 2.75rem);
124
- padding: 0 0.25rem 0 0.375rem;
125
- border-bottom: 1px solid var(--mxc-border);
149
+ height: var(--mxc-header-h, 2.25rem);
150
+ padding: 0 0.375rem 0 0.375rem;
126
151
  background: var(--mxc-header-bg);
152
+ min-width: 0;
127
153
  }
128
154
 
129
- .mxc-tabs {
155
+ .mxc-panel-title {
156
+ flex: 0 1 auto;
157
+ min-width: 0;
158
+ display: inline-flex;
159
+ align-items: center;
160
+ gap: 0.375rem;
161
+ padding: 0 0.375rem;
162
+ overflow: hidden;
163
+ font-size: 0.75rem;
164
+ font-weight: 500;
165
+ line-height: 1rem;
166
+ color: var(--mxc-title-fg);
167
+ white-space: nowrap;
168
+ text-overflow: ellipsis;
169
+ user-select: none;
170
+ }
171
+
172
+ .mxc-panel-title[data-draggable] {
173
+ cursor: grab;
174
+ }
175
+
176
+ .mxc-title-icon {
177
+ flex: none;
178
+ width: 0.875rem;
179
+ height: 0.875rem;
180
+ color: var(--mxc-muted);
181
+ }
182
+
183
+ /* After the title or tabs: grows to fill the header (a browser bar, "+ new"). */
184
+ .mxc-pane-leading {
185
+ flex: 1 1 0;
186
+ min-width: 0;
187
+ display: flex;
188
+ align-items: center;
189
+ gap: 0.125rem;
190
+ }
191
+
192
+ .mxc-pane-leading:empty {
193
+ min-width: 0.25rem;
194
+ }
195
+
196
+ .mxc-pane-actions {
197
+ flex: none;
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 0.125rem;
201
+ }
202
+
203
+ .mxc-pane-body {
204
+ position: relative;
130
205
  flex: 1 1 auto;
206
+ min-height: 0;
207
+ display: flex;
208
+ flex-direction: column;
209
+ }
210
+
211
+ /* ── header buttons ─────────────────────────────────────────────────────── */
212
+
213
+ .mxc-icon-button {
214
+ position: relative;
215
+ flex: none;
216
+ display: inline-flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ width: 1.5rem;
220
+ height: 1.5rem;
221
+ padding: 0;
222
+ border: 0;
223
+ border-radius: 0.375rem;
224
+ background: transparent;
225
+ color: var(--mxc-muted);
226
+ cursor: pointer;
227
+ outline: none;
228
+ transition: background-color 120ms ease-out, color 120ms ease-out;
229
+ }
230
+
231
+ .mxc-icon-button[data-size="md"] {
232
+ width: 1.75rem;
233
+ height: 1.75rem;
234
+ }
235
+
236
+ .mxc-icon-button svg {
237
+ width: 0.875rem;
238
+ height: 0.875rem;
239
+ }
240
+
241
+ .mxc-icon-button[data-size="md"] svg {
242
+ width: 1rem;
243
+ height: 1rem;
244
+ }
245
+
246
+ .mxc-icon-button:hover,
247
+ .mxc-icon-button[data-state="open"],
248
+ .mxc-icon-button[aria-pressed="true"] {
249
+ background: var(--mxc-hover);
250
+ color: var(--mxc-fg);
251
+ }
252
+
253
+ .mxc-icon-button:focus-visible {
254
+ box-shadow: 0 0 0 2px var(--mxc-ring);
255
+ }
256
+
257
+ .mxc-icon-button[data-available="false"] {
258
+ cursor: default;
259
+ color: var(--mxc-disabled);
260
+ background: transparent;
261
+ }
262
+
263
+ /* Touch screens: a 40px hit area around the 24px button. */
264
+ @media (pointer: coarse) {
265
+ .mxc-icon-button::after {
266
+ content: "";
267
+ position: absolute;
268
+ inset: -0.5rem;
269
+ }
270
+ }
271
+
272
+ /* ── tabs ───────────────────────────────────────────────────────────────── */
273
+
274
+ .mxc-tabs {
275
+ flex: 0 1 auto;
131
276
  min-width: 0;
132
277
  display: flex;
133
278
  align-items: center;
@@ -141,93 +286,170 @@
141
286
  }
142
287
 
143
288
  .mxc-tab {
144
- flex: none;
145
- display: inline-flex;
289
+ position: relative;
290
+ flex: 0 1 10rem;
291
+ min-width: 4.5rem;
292
+ max-width: 10rem;
293
+ display: flex;
146
294
  align-items: center;
147
295
  gap: 0.375rem;
148
- max-width: 13rem;
149
- height: 1.875rem;
296
+ height: 1.75rem;
150
297
  padding: 0 0.25rem 0 0.5rem;
151
- border-radius: 0.5rem;
152
- font-size: 0.8125rem;
153
- line-height: 1;
298
+ border-radius: 0.375rem;
299
+ font-size: 0.75rem;
300
+ line-height: 1rem;
154
301
  color: var(--mxc-muted);
155
- cursor: pointer;
302
+ cursor: default;
156
303
  user-select: none;
304
+ outline: none;
157
305
  }
158
306
 
159
307
  .mxc-tab:hover {
160
308
  background: var(--mxc-hover);
161
- color: var(--mxc-fg);
162
309
  }
163
310
 
164
311
  .mxc-tab[data-active] {
165
312
  background: var(--mxc-tab-active-bg);
166
313
  color: var(--mxc-fg);
314
+ box-shadow: var(--mxc-tab-active-shadow);
167
315
  }
168
316
 
169
317
  .mxc-pane:not([data-focused]) .mxc-tab[data-active] {
170
- background: var(--mxc-hover);
318
+ color: var(--mxc-title-fg);
171
319
  }
172
320
 
173
321
  .mxc-tab:focus-visible {
174
- outline: 2px solid var(--mxc-accent);
175
- outline-offset: -2px;
322
+ box-shadow: 0 0 0 2px var(--mxc-ring);
176
323
  }
177
324
 
178
325
  .mxc-tab-icon {
179
326
  flex: none;
327
+ display: inline-flex;
180
328
  width: 0.875rem;
181
329
  height: 0.875rem;
330
+ opacity: 0.75;
331
+ }
332
+
333
+ .mxc-tab-icon svg,
334
+ .mxc-favicon {
335
+ width: 0.875rem;
336
+ height: 0.875rem;
337
+ }
338
+
339
+ .mxc-favicon {
340
+ border-radius: 0.125rem;
182
341
  }
183
342
 
184
343
  .mxc-tab-title {
344
+ flex: 1 1 auto;
185
345
  min-width: 0;
186
346
  overflow: hidden;
187
347
  text-overflow: ellipsis;
188
348
  white-space: nowrap;
189
349
  }
190
350
 
351
+ .mxc-tab-note {
352
+ flex: none;
353
+ font-size: 0.6875rem;
354
+ color: var(--mxc-disabled);
355
+ }
356
+
191
357
  .mxc-tab-close {
192
358
  flex: none;
193
359
  display: inline-flex;
194
360
  align-items: center;
195
361
  justify-content: center;
196
- width: 1.25rem;
197
- height: 1.25rem;
362
+ width: 1rem;
363
+ height: 1rem;
364
+ padding: 0;
198
365
  border: 0;
199
- border-radius: 0.375rem;
366
+ border-radius: 0.25rem;
200
367
  background: transparent;
201
- color: inherit;
368
+ color: var(--mxc-muted);
202
369
  opacity: 0;
203
370
  cursor: pointer;
371
+ outline: none;
372
+ }
373
+
374
+ .mxc-tab-close svg {
375
+ width: 0.75rem;
376
+ height: 0.75rem;
204
377
  }
205
378
 
206
379
  .mxc-tab:hover .mxc-tab-close,
207
380
  .mxc-tab[data-active] .mxc-tab-close,
208
381
  .mxc-tab-close:focus-visible {
209
- opacity: 0.7;
382
+ opacity: 1;
210
383
  }
211
384
 
212
385
  .mxc-tab-close:hover {
213
- opacity: 1;
214
386
  background: var(--mxc-hover);
387
+ color: var(--mxc-fg);
215
388
  }
216
389
 
217
- .mxc-pane-actions {
390
+ .mxc-tab-close:focus-visible {
391
+ box-shadow: 0 0 0 2px var(--mxc-ring);
392
+ }
393
+
394
+ /* ── browser bar ────────────────────────────────────────────────────────── */
395
+
396
+ /* In a body column it keeps its own height; in a header's leading slot it fills the width. */
397
+ .mxc-browser-bar {
218
398
  flex: none;
399
+ min-width: 0;
219
400
  display: flex;
220
401
  align-items: center;
402
+ gap: 0.125rem;
403
+ height: 2.5rem;
404
+ padding: 0 0.375rem;
221
405
  }
222
406
 
223
- .mxc-pane-body {
224
- position: relative;
407
+ .mxc-pane-leading > .mxc-browser-bar {
225
408
  flex: 1 1 auto;
226
- min-height: 0;
409
+ height: auto;
410
+ padding: 0;
411
+ }
412
+
413
+ .mxc-address-form {
414
+ flex: 1 1 auto;
415
+ min-width: 4rem;
416
+ margin: 0 0 0 0.25rem;
417
+ }
418
+
419
+ .mxc-address {
420
+ width: 100%;
421
+ height: 1.75rem;
422
+ padding: 0 0.75rem;
423
+ border: 1px solid var(--mxc-border);
424
+ border-radius: 999px;
425
+ background: var(--mxc-input-bg);
426
+ color: var(--mxc-fg);
427
+ font: inherit;
428
+ font-size: 0.75rem;
429
+ text-align: center;
430
+ outline: none;
431
+ }
432
+
433
+ .mxc-address::placeholder {
434
+ color: var(--mxc-muted);
435
+ }
436
+
437
+ .mxc-address:focus {
438
+ background: var(--mxc-tab-active-bg);
439
+ text-align: left;
440
+ box-shadow: 0 0 0 2px var(--mxc-ring);
441
+ }
442
+
443
+ .mxc-browser-bar-trailing {
444
+ flex: none;
227
445
  display: flex;
228
- flex-direction: column;
446
+ align-items: center;
447
+ gap: 0.125rem;
448
+ margin-left: 0.25rem;
229
449
  }
230
450
 
451
+ /* ── bodies ─────────────────────────────────────────────────────────────── */
452
+
231
453
  .mxc-item {
232
454
  flex: 1 1 auto;
233
455
  min-height: 0;
@@ -240,6 +462,15 @@
240
462
  display: none;
241
463
  }
242
464
 
465
+ /* Where a host's native view sits (a desktop browser tab). */
466
+ .mxc-native-body {
467
+ flex: 1 1 auto;
468
+ min-height: 0;
469
+ margin: 0 var(--mxc-native-inset, 0.375rem) var(--mxc-native-inset, 0.375rem);
470
+ border-radius: calc(var(--mxc-radius) - 2px);
471
+ background: var(--mxc-tab-active-bg);
472
+ }
473
+
243
474
  .mxc-loading {
244
475
  flex: 1 1 auto;
245
476
  background: linear-gradient(90deg, transparent, var(--mxc-hover), transparent);
@@ -252,15 +483,27 @@
252
483
  to { background-position: -200% 0; }
253
484
  }
254
485
 
255
- .mxc-problem,
256
- .mxc-empty {
486
+ /* The one-line honest state ("No changes to show", "Files · next release"). */
487
+ .mxc-empty-line {
488
+ flex: 1 1 auto;
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ min-height: 3rem;
493
+ padding: 0 1rem;
494
+ font-size: 0.75rem;
495
+ color: var(--mxc-muted);
496
+ text-align: center;
497
+ }
498
+
499
+ .mxc-problem {
257
500
  margin: auto;
258
501
  display: flex;
259
502
  flex-direction: column;
260
503
  align-items: center;
261
504
  gap: 0.5rem;
262
505
  padding: 1.5rem;
263
- font-size: 0.875rem;
506
+ font-size: 0.8125rem;
264
507
  color: var(--mxc-muted);
265
508
  text-align: center;
266
509
  }
@@ -322,6 +565,8 @@
322
565
  color: var(--mxc-muted);
323
566
  }
324
567
 
568
+ /* ── menu ───────────────────────────────────────────────────────────────── */
569
+
325
570
  .mxc-menu {
326
571
  z-index: var(--mxc-menu-z, 10000);
327
572
  min-width: 11rem;
@@ -330,7 +575,7 @@
330
575
  border-radius: 0.625rem;
331
576
  background: var(--mxc-bg);
332
577
  color: var(--mxc-fg);
333
- box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.35);
578
+ box-shadow: var(--mxc-float-shadow);
334
579
  font-size: 0.8125rem;
335
580
  }
336
581
 
@@ -366,6 +611,44 @@
366
611
  background: var(--mxc-border);
367
612
  }
368
613
 
614
+ /* ── overlay (the DOM default for tooltips and drop indicators) ─────────── */
615
+
616
+ .mxc-overlay {
617
+ position: fixed;
618
+ inset: 0;
619
+ z-index: var(--mxc-overlay-z, 10001);
620
+ pointer-events: none;
621
+ }
622
+
623
+ .mxc-tooltip {
624
+ position: fixed;
625
+ max-width: 18rem;
626
+ padding: 0.25rem 0.5rem;
627
+ border-radius: 0.375rem;
628
+ background: var(--mxc-tooltip-bg);
629
+ color: var(--mxc-tooltip-fg);
630
+ font-size: 0.75rem;
631
+ line-height: 1rem;
632
+ white-space: nowrap;
633
+ overflow: hidden;
634
+ text-overflow: ellipsis;
635
+ box-shadow: var(--mxc-float-shadow);
636
+ }
637
+
638
+ .mxc-tooltip[data-side="top"] {
639
+ transform: translateY(-100%);
640
+ }
641
+
642
+ .mxc-drop-indicator {
643
+ position: fixed;
644
+ border-radius: var(--mxc-radius);
645
+ box-shadow: inset 0 0 0 2px var(--mxc-accent);
646
+ background: var(--mxc-accent-soft);
647
+ opacity: 0.6;
648
+ }
649
+
650
+ /* ── toggle ─────────────────────────────────────────────────────────────── */
651
+
369
652
  .mxc-toggle {
370
653
  position: relative;
371
654
  display: inline-flex;
@@ -414,7 +697,7 @@
414
697
  display: none !important;
415
698
  }
416
699
 
417
- /* Phones: the canvas is a full-screen layer over the app. */
700
+ /* Phones: the canvas is a full-screen layer over the app, edge to edge. */
418
701
  @media (max-width: 767px) {
419
702
  .mxc-phone-only {
420
703
  display: inline-flex !important;
@@ -425,7 +708,7 @@
425
708
  display: none !important;
426
709
  }
427
710
 
428
- .mxc-column {
711
+ .mxc-column[data-placement="docked"] {
429
712
  position: fixed;
430
713
  inset: 0;
431
714
  z-index: var(--mxc-mobile-z, 60);
@@ -433,6 +716,16 @@
433
716
  border-left: 0;
434
717
  padding-top: env(safe-area-inset-top, 0px);
435
718
  padding-bottom: env(safe-area-inset-bottom, 0px);
719
+ --mxc-gap: 0px;
720
+ --mxc-radius: 0px;
721
+ }
722
+
723
+ .mxc-column[data-placement="docked"] .mxc-panel {
724
+ border-width: 0;
725
+ }
726
+
727
+ .mxc-column[data-placement="docked"] .mxc-split-handle {
728
+ background: var(--mxc-border);
436
729
  }
437
730
 
438
731
  .mxc-width-handle {
@@ -448,4 +741,8 @@
448
741
  height: 1px;
449
742
  cursor: row-resize;
450
743
  }
744
+
745
+ .mxc-pane-header {
746
+ height: var(--mxc-header-h-phone, 2.75rem);
747
+ }
451
748
  }