basis-design 0.1.0 → 0.2.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.
@@ -1,1067 +1,1146 @@
1
- .app {
2
- position: relative;
3
- display: grid;
4
- grid-template-columns: var(--chat-width, 380px) minmax(0, 1fr);
5
- height: 100vh;
6
- height: 100dvh;
7
- overflow: hidden;
8
- }
9
-
10
- .app[data-chat-hidden] {
11
- grid-template-columns: minmax(0, 1fr);
12
- }
13
-
14
- .app[data-chat-hidden] > aside {
15
- display: none;
16
- }
17
-
18
- .resizer {
19
- position: absolute;
20
- top: 0;
21
- bottom: 0;
22
- left: var(--chat-width, 380px);
23
- z-index: 10;
24
- width: 9px;
25
- translate: -50% 0;
26
- cursor: col-resize;
27
- touch-action: none;
28
- }
29
-
30
- .resizer::after {
31
- content: "";
32
- position: absolute;
33
- inset: 0 4px;
34
- background: transparent;
35
- transition: background-color 120ms ease;
36
- }
37
-
38
- .resizer:hover::after,
39
- .resizer:focus-visible::after,
40
- :global(body[data-resizing]) .resizer::after {
41
- background: var(--app-signal);
42
- }
43
-
44
- .resizer:focus-visible {
45
- outline: none;
46
- }
47
-
48
- :global(body[data-resizing]) {
49
- cursor: col-resize;
50
- user-select: none;
51
- }
52
-
53
- /* The preview must not swallow pointer events (or animate) while the splitter is dragged. */
54
- :global(body[data-resizing]) .main {
55
- pointer-events: none;
56
- }
57
-
58
- .chatToggle {
59
- position: relative;
60
- display: grid;
61
- flex: none;
62
- place-items: center;
63
- width: 30px;
64
- height: 30px;
65
- margin-left: -4px;
66
- padding: 0;
67
- border: 0;
68
- border-radius: 6px;
69
- background: transparent;
70
- color: var(--app-muted);
71
- cursor: pointer;
72
- transition:
73
- background-color 120ms ease,
74
- color 120ms ease;
75
- }
76
-
77
- .chatToggle:hover {
78
- background: var(--app-ink-3);
79
- color: var(--app-text);
80
- }
81
-
82
- .chatToggle svg {
83
- width: 16px;
84
- height: 16px;
85
- fill: none;
86
- stroke: currentColor;
87
- stroke-width: 1.3;
88
- stroke-linecap: round;
89
- stroke-linejoin: round;
90
- }
91
-
92
- .chatToggleDot {
93
- position: absolute;
94
- top: 5px;
95
- right: 5px;
96
- width: 6px;
97
- height: 6px;
98
- border-radius: 50%;
99
- background: var(--app-signal);
100
- animation: blink 900ms ease-in-out infinite;
101
- }
102
-
103
- @keyframes blink {
104
- 50% {
105
- opacity: 0.3;
106
- }
107
- }
108
-
109
- .main {
110
- display: flex;
111
- flex-direction: column;
112
- min-width: 0;
113
- min-height: 0;
114
- }
115
-
116
- .bar {
117
- display: flex;
118
- align-items: center;
119
- gap: 16px;
120
- height: var(--app-bar-height);
121
- padding: 0 14px;
122
- border-bottom: 1px solid var(--app-line);
123
- background: var(--app-ink);
124
- color: var(--app-text);
125
- }
126
-
127
- .brand {
128
- display: inline-flex;
129
- flex: none;
130
- align-items: center;
131
- gap: 8px;
132
- font-size: 14px;
133
- font-weight: 700;
134
- letter-spacing: -0.01em;
135
- }
136
-
137
- .brandMark {
138
- /* The Basis mark (src/icon.svg without its tile): two components on a base, in the signal colour. */
139
- flex: none;
140
- width: 16px;
141
- height: 16px;
142
- background: var(--app-signal);
143
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Crect width='18' height='18' rx='4'/%3E%3Crect x='22' width='18' height='18' rx='9'/%3E%3Crect y='23' width='40' height='17' rx='4'/%3E%3C/svg%3E")
144
- center / contain no-repeat;
145
- }
146
-
147
- .pages {
148
- display: flex;
149
- align-self: stretch;
150
- gap: 2px;
151
- margin-left: 12px;
152
- }
153
-
154
- .pages button {
155
- position: relative;
156
- padding: 0 10px;
157
- white-space: nowrap;
158
- border: 0;
159
- background: transparent;
160
- color: var(--app-muted);
161
- font: inherit;
162
- font-size: 13px;
163
- cursor: pointer;
164
- transition: color 120ms ease;
165
- }
166
-
167
- .pages button:hover {
168
- color: var(--app-text);
169
- }
170
-
171
- .pages button[aria-current="page"] {
172
- color: var(--app-text);
173
- }
174
-
175
- .pages button[aria-current="page"]::after {
176
- content: "";
177
- position: absolute;
178
- right: 10px;
179
- bottom: -1px;
180
- left: 10px;
181
- height: 2px;
182
- border-radius: 2px;
183
- background: var(--app-signal);
184
- }
185
-
186
- .actions {
187
- display: flex;
188
- margin-left: auto;
189
- flex: none;
190
- align-items: center;
191
- gap: 8px;
192
- }
193
-
194
- .themeToggle {
195
- display: inline-flex;
196
- padding: 2px;
197
- border: 1px solid var(--app-line);
198
- border-radius: 7px;
199
- }
200
-
201
- .themeToggle button {
202
- height: 24px;
203
- padding: 0 9px;
204
- border: 0;
205
- border-radius: 5px;
206
- background: transparent;
207
- color: var(--app-muted);
208
- font: inherit;
209
- font-size: 12px;
210
- cursor: pointer;
211
- }
212
-
213
- .themeToggle button[aria-pressed="true"] {
214
- background: var(--app-ink-3);
215
- color: var(--app-text);
216
- }
217
-
218
- .chromeButton,
219
- .primaryButton {
220
- height: 30px;
221
- padding: 0 11px;
222
- border-radius: 6px;
223
- font: inherit;
224
- font-size: 12.5px;
225
- white-space: nowrap;
226
- cursor: pointer;
227
- transition:
228
- background-color 120ms ease,
229
- color 120ms ease,
230
- transform 80ms ease;
231
- }
232
-
233
- .chromeButton {
234
- border: 1px solid var(--app-line);
235
- background: transparent;
236
- color: var(--app-text);
237
- }
238
-
239
- .chromeButton:hover:not(:disabled) {
240
- background: var(--app-ink-3);
241
- }
242
-
243
- .primaryButton {
244
- border: 0;
245
- background: var(--app-signal);
246
- color: var(--app-ink);
247
- font-weight: 650;
248
- }
249
-
250
- .chromeButton:disabled,
251
- .primaryButton:disabled {
252
- opacity: 0.4;
253
- cursor: default;
254
- }
255
-
256
- .chromeButton:active:not(:disabled),
257
- .primaryButton:active:not(:disabled) {
258
- transform: scale(0.97);
259
- }
260
-
261
- .stage {
262
- display: flex;
263
- flex: 1;
264
- min-height: 0;
265
- }
266
-
267
- .canvas {
268
- position: relative;
269
- flex: 1;
270
- min-width: 0;
271
- min-height: 0;
272
- }
273
-
274
- .loading {
275
- padding: 40px;
276
- color: var(--app-subtle);
277
- }
278
-
279
- /* History menu */
280
-
281
- .menuRoot {
282
- position: relative;
283
- display: flex;
284
- gap: 8px;
285
- }
286
-
287
- .menu {
288
- position: absolute;
289
- top: calc(100% + 6px);
290
- right: 0;
291
- z-index: 20;
292
- width: 320px;
293
- max-height: 60vh;
294
- padding: 6px;
295
- overflow-y: auto;
296
- border: 1px solid var(--app-line);
297
- border-radius: 10px;
298
- background: var(--app-ink-2);
299
- box-shadow: 0 18px 40px rgb(0 0 0 / 0.35);
300
- }
301
-
302
- .menuItem {
303
- display: grid;
304
- gap: 2px;
305
- width: 100%;
306
- padding: 8px 10px;
307
- border: 1px solid transparent;
308
- border-radius: 6px;
309
- background: transparent;
310
- color: var(--app-text);
311
- font: inherit;
312
- text-align: left;
313
- cursor: pointer;
314
- }
315
-
316
- .menuItem:hover {
317
- background: var(--app-ink-3);
318
- }
319
-
320
- .menuItem[aria-current="true"] {
321
- border-color: color-mix(in srgb, var(--app-signal) 45%, transparent);
322
- }
323
-
324
- .menuHint {
325
- margin: 4px 8px 6px;
326
- color: var(--app-subtle);
327
- font-size: 11.5px;
328
- }
329
-
330
- .menuLabel {
331
- display: -webkit-box;
332
- overflow: hidden;
333
- color: var(--app-muted);
334
- font-size: 12px;
335
- line-height: 1.4;
336
- -webkit-box-orient: vertical;
337
- -webkit-line-clamp: 2;
338
- }
339
-
340
- .menuTitle {
341
- font-size: 12.5px;
342
- font-weight: 600;
343
- }
344
-
345
- .current {
346
- margin-left: 6px;
347
- padding: 1px 6px;
348
- border-radius: 999px;
349
- background: color-mix(in srgb, var(--app-signal) 18%, transparent);
350
- color: var(--app-signal);
351
- font-family: var(--app-mono);
352
- font-size: 10px;
353
- font-weight: 500;
354
- }
355
-
356
- .muted {
357
- overflow: hidden;
358
- color: var(--app-subtle);
359
- font-family: var(--app-mono);
360
- font-size: 11px;
361
- text-overflow: ellipsis;
362
- white-space: nowrap;
363
- }
364
-
365
- /* Inspecting a past version */
366
-
367
- .inspect {
368
- flex: none;
369
- max-height: 45vh;
370
- overflow-y: auto;
371
- border-bottom: 1px solid var(--app-line);
372
- background: color-mix(in srgb, var(--app-signal) 7%, var(--app-ink));
373
- color: var(--app-text);
374
- }
375
-
376
- .inspectRow {
377
- position: sticky;
378
- top: 0;
379
- z-index: 1;
380
- background: inherit;
381
- display: flex;
382
- flex-wrap: wrap;
383
- align-items: center;
384
- gap: 10px;
385
- padding: 10px 14px;
386
- }
387
-
388
- .inspectStep {
389
- display: flex;
390
- gap: 4px;
391
- }
392
-
393
- .inspectText {
394
- display: grid;
395
- flex: 1;
396
- gap: 2px;
397
- min-width: 180px;
398
- font-size: 12.5px;
399
- }
400
-
401
- .inspectToggle {
402
- height: 30px;
403
- padding: 0 10px;
404
- border: 0;
405
- border-radius: 6px;
406
- background: transparent;
407
- color: var(--app-signal);
408
- font: inherit;
409
- font-size: 12.5px;
410
- text-decoration: underline;
411
- text-underline-offset: 3px;
412
- cursor: pointer;
413
- }
414
-
415
- .inspectToggle:disabled {
416
- color: var(--app-muted);
417
- text-decoration: none;
418
- cursor: default;
419
- }
420
-
421
- .canvas[data-inspecting] {
422
- box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--app-signal) 55%, transparent);
423
- }
424
-
425
- .diff {
426
- display: grid;
427
- grid-template-columns: minmax(180px, 1.2fr) 1fr 1fr;
428
- gap: 4px 16px;
429
- padding: 4px 14px 14px;
430
- font-family: var(--app-mono);
431
- font-size: 11.5px;
432
- }
433
-
434
- .diffRow {
435
- display: contents;
436
- }
437
-
438
- .diffHead {
439
- padding-bottom: 4px;
440
- border-bottom: 1px dashed var(--app-line);
441
- color: var(--app-subtle);
442
- }
443
-
444
- .diffPath {
445
- color: var(--app-text);
446
- overflow-wrap: anywhere;
447
- }
448
-
449
- .diffValue {
450
- display: inline-flex;
451
- align-items: center;
452
- gap: 6px;
453
- min-width: 0;
454
- color: var(--app-muted);
455
- overflow-wrap: anywhere;
456
- }
457
-
458
- .diffSwatch {
459
- flex: none;
460
- width: 12px;
461
- height: 12px;
462
- border: 1px solid var(--app-line);
463
- border-radius: 3px;
464
- }
465
-
466
- .diffMissing {
467
- color: var(--app-subtle);
468
- }
469
-
470
- .codeDiff {
471
- padding: 0 14px 14px;
472
- }
473
-
474
- .codeDiff p {
475
- margin: 0 0 8px;
476
- white-space: normal;
477
- }
478
-
479
- .codeDiff pre {
480
- margin: 0;
481
- padding: 10px 12px;
482
- overflow-x: auto;
483
- border-radius: 8px;
484
- background: var(--app-ink);
485
- color: var(--app-muted);
486
- font-family: var(--app-mono);
487
- font-size: 11.5px;
488
- line-height: 1.5;
489
- }
490
-
491
- .codeDiff [data-kind="add"] {
492
- color: var(--app-signal);
493
- }
494
-
495
- .codeDiff [data-kind="del"] {
496
- color: var(--app-danger);
497
- }
498
-
499
- .codeDiff [data-kind="hunk"] {
500
- color: var(--app-subtle);
501
- }
502
-
503
- .frame {
504
- display: block;
505
- width: 100%;
506
- height: 100%;
507
- border: 0;
508
- background: transparent;
509
- }
510
-
511
- /* Export dialog */
512
-
513
- a.primaryButton {
514
- display: inline-flex;
515
- align-items: center;
516
- text-decoration: none;
517
- }
518
-
519
- .kit {
520
- display: grid;
521
- gap: 12px;
522
- min-height: 0;
523
- margin: 0 18px;
524
- overflow-y: auto;
525
- font-size: 12.5px;
526
- line-height: 1.5;
527
- }
528
-
529
- .kitIntro {
530
- margin: 0;
531
- color: var(--app-muted);
532
- }
533
-
534
- .kitWarning,
535
- .kitError {
536
- margin: 0;
537
- padding: 8px 10px;
538
- border-radius: 6px;
539
- background: color-mix(in srgb, var(--app-danger) 14%, var(--app-ink));
540
- }
541
-
542
- .kitError {
543
- background: transparent;
544
- padding: 0;
545
- color: var(--app-danger);
546
- }
547
-
548
- .kitSuccess {
549
- margin: 0;
550
- color: var(--app-signal);
551
- }
552
-
553
- .kitSuccess code,
554
- .kitConflicts code {
555
- font-family: var(--app-mono);
556
- font-size: 11.5px;
557
- overflow-wrap: anywhere;
558
- }
559
-
560
- .kitFiles {
561
- display: grid;
562
- gap: 6px;
563
- padding: 10px 12px;
564
- border-radius: 8px;
565
- background: var(--app-ink-2);
566
- }
567
-
568
- .kitFiles ul,
569
- .kitConflicts ul {
570
- display: grid;
571
- gap: 2px;
572
- max-height: 180px;
573
- margin: 0;
574
- padding: 0;
575
- overflow-y: auto;
576
- list-style: none;
577
- font-family: var(--app-mono);
578
- font-size: 11.5px;
579
- }
580
-
581
- .kitFiles li {
582
- display: flex;
583
- justify-content: space-between;
584
- gap: 12px;
585
- }
586
-
587
- .kitWrite {
588
- display: grid;
589
- gap: 6px;
590
- }
591
-
592
- .kitWrite label {
593
- font-weight: 600;
594
- }
595
-
596
- .kitWriteRow {
597
- display: flex;
598
- gap: 8px;
599
- }
600
-
601
- .kitWriteRow input {
602
- flex: 1;
603
- min-width: 0;
604
- height: 30px;
605
- padding: 0 10px;
606
- border: 1px solid var(--app-line);
607
- border-radius: 6px;
608
- background: var(--app-ink-2);
609
- color: var(--app-text);
610
- font-family: var(--app-mono);
611
- font-size: 12px;
612
- }
613
-
614
- .kitWriteRow input:focus {
615
- border-color: color-mix(in srgb, var(--app-signal) 55%, var(--app-line));
616
- outline: none;
617
- }
618
-
619
- .kitConflicts {
620
- display: grid;
621
- justify-items: start;
622
- gap: 6px;
623
- padding: 10px 12px;
624
- border: 1px solid color-mix(in srgb, var(--app-danger) 45%, var(--app-line));
625
- border-radius: 8px;
626
- }
627
-
628
- .kitConflicts p {
629
- margin: 0;
630
- }
631
-
632
- .dialog {
633
- width: min(760px, calc(100vw - 32px));
634
- max-height: calc(100vh - 64px);
635
- padding: 0;
636
- border: 1px solid var(--app-line);
637
- border-radius: 12px;
638
- background: var(--app-ink);
639
- color: var(--app-text);
640
- box-shadow: 0 30px 80px rgb(0 0 0 / 0.45);
641
- }
642
-
643
- .dialog::backdrop {
644
- background: rgb(10 10 8 / 0.55);
645
- backdrop-filter: blur(2px);
646
- }
647
-
648
- .dialog[open] {
649
- animation: rise 220ms cubic-bezier(0.2, 0, 0, 1);
650
- }
651
-
652
- .dialogInner {
653
- display: flex;
654
- flex-direction: column;
655
- max-height: calc(100vh - 66px);
656
- }
657
-
658
- .dialogHeader {
659
- display: flex;
660
- align-items: flex-start;
661
- justify-content: space-between;
662
- gap: 16px;
663
- padding: 18px 18px 12px;
664
- }
665
-
666
- .dialogHeader h2 {
667
- margin: 0;
668
- font-size: 16px;
669
- font-weight: 700;
670
- }
671
-
672
- .dialogHeader p {
673
- margin: 4px 0 0;
674
- color: var(--app-muted);
675
- font-size: 12.5px;
676
- overflow-wrap: anywhere;
677
- }
678
-
679
- .dialogHeader code {
680
- font-family: var(--app-mono);
681
- font-size: 11.5px;
682
- }
683
-
684
- .formatTabs {
685
- display: flex;
686
- gap: 4px;
687
- padding: 0 18px 12px;
688
- }
689
-
690
- .formatTabs button {
691
- height: 28px;
692
- padding: 0 10px;
693
- border: 1px solid var(--app-line);
694
- border-radius: 6px;
695
- background: transparent;
696
- color: var(--app-muted);
697
- font: inherit;
698
- font-size: 12.5px;
699
- cursor: pointer;
700
- }
701
-
702
- .formatTabs button[aria-selected="true"] {
703
- border-color: transparent;
704
- background: var(--app-ink-3);
705
- color: var(--app-text);
706
- }
707
-
708
- .code {
709
- flex: 1;
710
- min-height: 0;
711
- margin: 0 18px;
712
- padding: 14px;
713
- overflow: auto;
714
- border-radius: 8px;
715
- background: var(--app-ink-2);
716
- color: var(--app-text);
717
- font-family: var(--app-mono);
718
- font-size: 12px;
719
- line-height: 1.55;
720
- }
721
-
722
- .dialogFooter {
723
- display: flex;
724
- align-items: center;
725
- justify-content: flex-end;
726
- gap: 8px;
727
- padding: 14px 18px 18px;
728
- }
729
-
730
- .dialogFooter .muted {
731
- margin-right: auto;
732
- }
733
-
734
- @keyframes rise {
735
- from {
736
- opacity: 0;
737
- transform: translateY(8px);
738
- }
739
- }
740
-
741
- @media (max-width: 900px) {
742
- .app {
743
- grid-template-columns: 1fr;
744
- grid-template-rows: minmax(0, 1fr) minmax(0, 45vh);
745
- }
746
-
747
- .app > aside {
748
- order: 2;
749
- border-top: 1px solid var(--app-line);
750
- border-right: 0;
751
- }
752
-
753
- .resizer {
754
- display: none;
755
- }
756
-
757
- .app[data-chat-hidden] {
758
- grid-template-rows: minmax(0, 1fr);
759
- }
760
- }
761
-
762
- .createDialog {
763
- width: min(480px, calc(100vw - 32px));
764
- }
765
-
766
- .createFields {
767
- display: grid;
768
- gap: 6px;
769
- margin: 0 18px;
770
- font-size: 12.5px;
771
- line-height: 1.5;
772
- }
773
-
774
- .createFields label {
775
- font-weight: 600;
776
- }
777
-
778
- .createFields label .muted {
779
- margin-left: 4px;
780
- font-weight: 400;
781
- }
782
-
783
- .createFields p {
784
- margin: 0 0 6px;
785
- font-size: 12px;
786
- }
787
-
788
- .createFields input,
789
- .createFields textarea {
790
- width: 100%;
791
- padding: 6px 10px;
792
- border: 1px solid var(--app-line);
793
- border-radius: 6px;
794
- background: var(--app-ink-2);
795
- color: var(--app-text);
796
- font: inherit;
797
- }
798
-
799
- .createFields input {
800
- height: 32px;
801
- }
802
-
803
- .createFields textarea {
804
- resize: vertical;
805
- }
806
-
807
- .createFields input:focus,
808
- .createFields textarea:focus {
809
- border-color: color-mix(in srgb, var(--app-signal) 55%, var(--app-line));
810
- outline: none;
811
- }
812
-
813
- .versionSelect {
814
- display: flex;
815
- align-items: center;
816
- gap: 8px;
817
- min-width: 0;
818
- color: var(--app-muted);
819
- font-size: 12px;
820
- }
821
-
822
- .versionSelect select {
823
- max-width: 320px;
824
- height: 30px;
825
- padding: 0 8px;
826
- border: 1px solid var(--app-line);
827
- border-radius: 6px;
828
- background: var(--app-ink-2);
829
- color: var(--app-text);
830
- font: inherit;
831
- font-size: 12.5px;
832
- }
833
-
834
- .reviewImpact {
835
- display: flex;
836
- flex-wrap: wrap;
837
- align-items: center;
838
- gap: 6px;
839
- padding: 0 14px 10px;
840
- font-size: 12px;
841
- }
842
-
843
- .reviewChip {
844
- height: 24px;
845
- padding: 0 9px;
846
- border: 1px solid var(--app-line);
847
- border-radius: 999px;
848
- background: transparent;
849
- color: var(--app-muted);
850
- font: inherit;
851
- font-size: 12px;
852
- cursor: pointer;
853
- transition:
854
- background-color 120ms ease,
855
- color 120ms ease,
856
- border-color 120ms ease;
857
- }
858
-
859
- .reviewChip:hover {
860
- color: var(--app-text);
861
- }
862
-
863
- .reviewChip[aria-pressed="true"] {
864
- border-color: color-mix(in srgb, var(--app-signal) 50%, var(--app-line));
865
- background: color-mix(in srgb, var(--app-signal) 12%, transparent);
866
- color: var(--app-text);
867
- }
868
-
869
- .chromeButton[data-confirming] {
870
- border-color: color-mix(in srgb, var(--app-danger) 60%, var(--app-line));
871
- color: var(--app-danger);
872
- }
873
-
874
- .projectRoot {
875
- position: relative;
876
- flex: none;
877
- }
878
-
879
- .projectButton {
880
- display: inline-flex;
881
- align-items: center;
882
- gap: 8px;
883
- min-width: 0;
884
- max-width: 220px;
885
- height: 32px;
886
- padding: 0 8px;
887
- border: 1px solid transparent;
888
- border-radius: 7px;
889
- background: transparent;
890
- color: var(--app-text);
891
- font: inherit;
892
- font-size: 14px;
893
- font-weight: 700;
894
- letter-spacing: -0.01em;
895
- cursor: pointer;
896
- transition:
897
- background-color 120ms ease,
898
- border-color 120ms ease;
899
- }
900
-
901
- .projectButton:hover,
902
- .projectButton[aria-expanded="true"] {
903
- border-color: var(--app-line);
904
- background: var(--app-ink-2);
905
- }
906
-
907
- .projectButton svg {
908
- flex: none;
909
- width: 14px;
910
- height: 14px;
911
- fill: none;
912
- stroke: var(--app-muted);
913
- stroke-width: 1.4;
914
- stroke-linecap: round;
915
- stroke-linejoin: round;
916
- }
917
-
918
- .projectName {
919
- overflow: hidden;
920
- text-overflow: ellipsis;
921
- white-space: nowrap;
922
- }
923
-
924
- .projectMenu {
925
- right: auto;
926
- left: 0;
927
- width: 360px;
928
- }
929
-
930
- .projectRow {
931
- display: flex;
932
- align-items: center;
933
- gap: 2px;
934
- }
935
-
936
- .projectRow .menuItem {
937
- flex: 1;
938
- min-width: 0;
939
- }
940
-
941
- .projectRow .menuItem:disabled {
942
- opacity: 0.45;
943
- cursor: default;
944
- }
945
-
946
- .projectDir {
947
- overflow: hidden;
948
- color: var(--app-subtle);
949
- font-family: var(--app-mono);
950
- font-size: 10.5px;
951
- text-overflow: ellipsis;
952
- white-space: nowrap;
953
- }
954
-
955
- .projectRemove {
956
- flex: none;
957
- width: 26px;
958
- height: 26px;
959
- border: 0;
960
- border-radius: 6px;
961
- background: transparent;
962
- color: var(--app-subtle);
963
- font: inherit;
964
- font-size: 15px;
965
- cursor: pointer;
966
- }
967
-
968
- .projectRemove:hover {
969
- background: var(--app-ink-3);
970
- color: var(--app-text);
971
- }
972
-
973
- .projectRepo {
974
- display: grid;
975
- gap: 8px;
976
- padding: 10px 12px;
977
- border-top: 1px solid var(--app-line);
978
- font-size: 12px;
979
- }
980
-
981
- .projectCheck {
982
- display: flex;
983
- gap: 8px;
984
- align-items: flex-start;
985
- color: var(--app-muted);
986
- font-size: 12px;
987
- line-height: 1.45;
988
- }
989
-
990
- .projectRepoHint {
991
- color: var(--app-muted);
992
- line-height: 1.45;
993
- }
994
-
995
- .projectRepoActions {
996
- display: flex;
997
- gap: 6px;
998
- }
999
-
1000
- .projectActions {
1001
- display: flex;
1002
- gap: 6px;
1003
- margin-top: 6px;
1004
- padding: 8px 4px 2px;
1005
- border-top: 1px solid var(--app-line);
1006
- }
1007
-
1008
- .projectError {
1009
- margin: 0 6px 6px;
1010
- padding: 8px 10px;
1011
- border-radius: 6px;
1012
- background: color-mix(in srgb, var(--app-danger) 14%, var(--app-ink));
1013
- color: var(--app-text);
1014
- font-size: 12px;
1015
- }
1016
-
1017
- .projectStart {
1018
- display: grid;
1019
- gap: 6px;
1020
- margin: 0;
1021
- padding: 0;
1022
- border: 0;
1023
- }
1024
-
1025
- .projectStart legend {
1026
- margin-bottom: 6px;
1027
- padding: 0;
1028
- font-weight: 600;
1029
- }
1030
-
1031
- .projectStart label {
1032
- display: flex;
1033
- align-items: center;
1034
- gap: 8px;
1035
- font-weight: 400;
1036
- }
1037
-
1038
- .switching {
1039
- position: fixed;
1040
- inset: 0;
1041
- z-index: 50;
1042
- display: grid;
1043
- place-items: center;
1044
- background: rgb(10 10 8 / 0.45);
1045
- backdrop-filter: blur(2px);
1046
- }
1047
-
1048
- .switchingCard {
1049
- padding: 12px 18px;
1050
- border: 1px solid var(--app-line);
1051
- border-radius: 10px;
1052
- background: var(--app-ink);
1053
- color: var(--app-text);
1054
- font-size: 13px;
1055
- box-shadow: 0 20px 60px rgb(0 0 0 / 0.4);
1056
- }
1057
-
1058
- /* The field styles above are for text inputs; radios keep their native size. */
1059
- .createFields input[type="radio"] {
1060
- width: auto;
1061
- height: auto;
1062
- margin: 0;
1063
- padding: 0;
1064
- border: 0;
1065
- background: none;
1066
- accent-color: var(--app-signal);
1067
- }
1
+ .app {
2
+ position: relative;
3
+ display: grid;
4
+ grid-template-columns: var(--chat-width, 380px) minmax(0, 1fr);
5
+ height: 100vh;
6
+ height: 100dvh;
7
+ overflow: hidden;
8
+ }
9
+
10
+ .app[data-chat-hidden] {
11
+ grid-template-columns: minmax(0, 1fr);
12
+ }
13
+
14
+ .app[data-chat-hidden] > aside {
15
+ display: none;
16
+ }
17
+
18
+ .resizer {
19
+ position: absolute;
20
+ top: 0;
21
+ bottom: 0;
22
+ left: var(--chat-width, 380px);
23
+ z-index: 10;
24
+ width: 9px;
25
+ translate: -50% 0;
26
+ cursor: col-resize;
27
+ touch-action: none;
28
+ }
29
+
30
+ .resizer::after {
31
+ content: "";
32
+ position: absolute;
33
+ inset: 0 4px;
34
+ background: transparent;
35
+ transition: background-color 120ms ease;
36
+ }
37
+
38
+ .resizer:hover::after,
39
+ .resizer:focus-visible::after,
40
+ :global(body[data-resizing]) .resizer::after {
41
+ background: var(--app-signal);
42
+ }
43
+
44
+ .resizer:focus-visible {
45
+ outline: none;
46
+ }
47
+
48
+ :global(body[data-resizing]) {
49
+ cursor: col-resize;
50
+ user-select: none;
51
+ }
52
+
53
+ /* The preview must not swallow pointer events (or animate) while the splitter is dragged. */
54
+ :global(body[data-resizing]) .main {
55
+ pointer-events: none;
56
+ }
57
+
58
+ .chatToggle {
59
+ position: relative;
60
+ display: grid;
61
+ flex: none;
62
+ place-items: center;
63
+ width: 30px;
64
+ height: 30px;
65
+ margin-left: -4px;
66
+ padding: 0;
67
+ border: 0;
68
+ border-radius: 6px;
69
+ background: transparent;
70
+ color: var(--app-muted);
71
+ cursor: pointer;
72
+ transition:
73
+ background-color 120ms ease,
74
+ color 120ms ease;
75
+ }
76
+
77
+ .chatToggle:hover {
78
+ background: var(--app-ink-3);
79
+ color: var(--app-text);
80
+ }
81
+
82
+ .chatToggle svg {
83
+ width: 16px;
84
+ height: 16px;
85
+ fill: none;
86
+ stroke: currentColor;
87
+ stroke-width: 1.3;
88
+ stroke-linecap: round;
89
+ stroke-linejoin: round;
90
+ }
91
+
92
+ .chatToggleDot {
93
+ position: absolute;
94
+ top: 5px;
95
+ right: 5px;
96
+ width: 6px;
97
+ height: 6px;
98
+ border-radius: 50%;
99
+ background: var(--app-signal);
100
+ animation: blink 900ms ease-in-out infinite;
101
+ }
102
+
103
+ @keyframes blink {
104
+ 50% {
105
+ opacity: 0.3;
106
+ }
107
+ }
108
+
109
+ .main {
110
+ display: flex;
111
+ flex-direction: column;
112
+ min-width: 0;
113
+ min-height: 0;
114
+ }
115
+
116
+ .bar {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: 16px;
120
+ height: var(--app-bar-height);
121
+ padding: 0 14px;
122
+ border-bottom: 1px solid var(--app-line);
123
+ background: var(--app-ink);
124
+ color: var(--app-text);
125
+ }
126
+
127
+ .brand {
128
+ display: inline-flex;
129
+ flex: none;
130
+ align-items: center;
131
+ gap: 8px;
132
+ font-size: 14px;
133
+ font-weight: 700;
134
+ letter-spacing: -0.01em;
135
+ }
136
+
137
+ .brandMark {
138
+ /* The Basis mark (src/icon.svg without its tile): two components on a base, in the signal colour. */
139
+ flex: none;
140
+ width: 16px;
141
+ height: 16px;
142
+ background: var(--app-signal);
143
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Crect width='18' height='18' rx='4'/%3E%3Crect x='22' width='18' height='18' rx='9'/%3E%3Crect y='23' width='40' height='17' rx='4'/%3E%3C/svg%3E")
144
+ center / contain no-repeat;
145
+ }
146
+
147
+ .pages {
148
+ display: flex;
149
+ align-self: stretch;
150
+ gap: 2px;
151
+ margin-left: 12px;
152
+ }
153
+
154
+ .pages button {
155
+ position: relative;
156
+ padding: 0 10px;
157
+ white-space: nowrap;
158
+ border: 0;
159
+ background: transparent;
160
+ color: var(--app-muted);
161
+ font: inherit;
162
+ font-size: 13px;
163
+ cursor: pointer;
164
+ transition: color 120ms ease;
165
+ }
166
+
167
+ .pages button:hover {
168
+ color: var(--app-text);
169
+ }
170
+
171
+ .pages button[aria-current="page"] {
172
+ color: var(--app-text);
173
+ }
174
+
175
+ .pages button[aria-current="page"]::after {
176
+ content: "";
177
+ position: absolute;
178
+ right: 10px;
179
+ bottom: -1px;
180
+ left: 10px;
181
+ height: 2px;
182
+ border-radius: 2px;
183
+ background: var(--app-signal);
184
+ }
185
+
186
+ .actions {
187
+ display: flex;
188
+ margin-left: auto;
189
+ flex: none;
190
+ align-items: center;
191
+ gap: 8px;
192
+ }
193
+
194
+ .themeToggle {
195
+ display: inline-flex;
196
+ padding: 2px;
197
+ border: 1px solid var(--app-line);
198
+ border-radius: 7px;
199
+ }
200
+
201
+ .themeToggle button {
202
+ height: 24px;
203
+ padding: 0 9px;
204
+ border: 0;
205
+ border-radius: 5px;
206
+ background: transparent;
207
+ color: var(--app-muted);
208
+ font: inherit;
209
+ font-size: 12px;
210
+ cursor: pointer;
211
+ }
212
+
213
+ .themeToggle button[aria-pressed="true"] {
214
+ background: var(--app-ink-3);
215
+ color: var(--app-text);
216
+ }
217
+
218
+ .chromeButton,
219
+ .primaryButton {
220
+ height: 30px;
221
+ padding: 0 11px;
222
+ border-radius: 6px;
223
+ font: inherit;
224
+ font-size: 12.5px;
225
+ white-space: nowrap;
226
+ cursor: pointer;
227
+ transition:
228
+ background-color 120ms ease,
229
+ color 120ms ease,
230
+ transform 80ms ease;
231
+ }
232
+
233
+ .chromeButton {
234
+ border: 1px solid var(--app-line);
235
+ background: transparent;
236
+ color: var(--app-text);
237
+ }
238
+
239
+ .chromeButton:hover:not(:disabled) {
240
+ background: var(--app-ink-3);
241
+ }
242
+
243
+ .primaryButton {
244
+ border: 0;
245
+ background: var(--app-signal);
246
+ color: var(--app-ink);
247
+ font-weight: 650;
248
+ }
249
+
250
+ .chromeButton:disabled,
251
+ .primaryButton:disabled {
252
+ opacity: 0.4;
253
+ cursor: default;
254
+ }
255
+
256
+ .chromeButton:active:not(:disabled),
257
+ .primaryButton:active:not(:disabled) {
258
+ transform: scale(0.97);
259
+ }
260
+
261
+ .stage {
262
+ display: flex;
263
+ flex: 1;
264
+ min-height: 0;
265
+ }
266
+
267
+ .canvas {
268
+ position: relative;
269
+ flex: 1;
270
+ min-width: 0;
271
+ min-height: 0;
272
+ }
273
+
274
+ .loading {
275
+ padding: 40px;
276
+ color: var(--app-subtle);
277
+ }
278
+
279
+ /* History menu */
280
+
281
+ .menuRoot {
282
+ position: relative;
283
+ display: flex;
284
+ gap: 8px;
285
+ }
286
+
287
+ .menu {
288
+ position: absolute;
289
+ top: calc(100% + 6px);
290
+ right: 0;
291
+ z-index: 20;
292
+ width: 320px;
293
+ max-height: 60vh;
294
+ padding: 6px;
295
+ overflow-y: auto;
296
+ border: 1px solid var(--app-line);
297
+ border-radius: 10px;
298
+ background: var(--app-ink-2);
299
+ box-shadow: 0 18px 40px rgb(0 0 0 / 0.35);
300
+ }
301
+
302
+ .menuItem {
303
+ display: grid;
304
+ gap: 2px;
305
+ width: 100%;
306
+ padding: 8px 10px;
307
+ border: 1px solid transparent;
308
+ border-radius: 6px;
309
+ background: transparent;
310
+ color: var(--app-text);
311
+ font: inherit;
312
+ text-align: left;
313
+ cursor: pointer;
314
+ }
315
+
316
+ .menuItem:hover {
317
+ background: var(--app-ink-3);
318
+ }
319
+
320
+ .menuItem[aria-current="true"] {
321
+ border-color: color-mix(in srgb, var(--app-signal) 45%, transparent);
322
+ }
323
+
324
+ .menuHint {
325
+ margin: 4px 8px 6px;
326
+ color: var(--app-subtle);
327
+ font-size: 11.5px;
328
+ }
329
+
330
+ .menuLabel {
331
+ display: -webkit-box;
332
+ overflow: hidden;
333
+ color: var(--app-muted);
334
+ font-size: 12px;
335
+ line-height: 1.4;
336
+ -webkit-box-orient: vertical;
337
+ -webkit-line-clamp: 2;
338
+ }
339
+
340
+ .menuTitle {
341
+ font-size: 12.5px;
342
+ font-weight: 600;
343
+ }
344
+
345
+ .current {
346
+ margin-left: 6px;
347
+ padding: 1px 6px;
348
+ border-radius: 999px;
349
+ background: color-mix(in srgb, var(--app-signal) 18%, transparent);
350
+ color: var(--app-signal);
351
+ font-family: var(--app-mono);
352
+ font-size: 10px;
353
+ font-weight: 500;
354
+ }
355
+
356
+ .muted {
357
+ overflow: hidden;
358
+ color: var(--app-subtle);
359
+ font-family: var(--app-mono);
360
+ font-size: 11px;
361
+ text-overflow: ellipsis;
362
+ white-space: nowrap;
363
+ }
364
+
365
+ /* Inspecting a past version */
366
+
367
+ .inspect {
368
+ flex: none;
369
+ max-height: 45vh;
370
+ overflow-y: auto;
371
+ border-bottom: 1px solid var(--app-line);
372
+ background: color-mix(in srgb, var(--app-signal) 7%, var(--app-ink));
373
+ color: var(--app-text);
374
+ }
375
+
376
+ .inspectRow {
377
+ position: sticky;
378
+ top: 0;
379
+ z-index: 1;
380
+ background: inherit;
381
+ display: flex;
382
+ flex-wrap: wrap;
383
+ align-items: center;
384
+ gap: 10px;
385
+ padding: 10px 14px;
386
+ }
387
+
388
+ .inspectStep {
389
+ display: flex;
390
+ gap: 4px;
391
+ }
392
+
393
+ .inspectText {
394
+ display: grid;
395
+ flex: 1;
396
+ gap: 2px;
397
+ min-width: 180px;
398
+ font-size: 12.5px;
399
+ }
400
+
401
+ .inspectToggle {
402
+ height: 30px;
403
+ padding: 0 10px;
404
+ border: 0;
405
+ border-radius: 6px;
406
+ background: transparent;
407
+ color: var(--app-signal);
408
+ font: inherit;
409
+ font-size: 12.5px;
410
+ text-decoration: underline;
411
+ text-underline-offset: 3px;
412
+ cursor: pointer;
413
+ }
414
+
415
+ .inspectToggle:disabled {
416
+ color: var(--app-muted);
417
+ text-decoration: none;
418
+ cursor: default;
419
+ }
420
+
421
+ .canvas[data-inspecting] {
422
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--app-signal) 55%, transparent);
423
+ }
424
+
425
+ .diff {
426
+ display: grid;
427
+ grid-template-columns: minmax(180px, 1.2fr) 1fr 1fr;
428
+ gap: 4px 16px;
429
+ padding: 4px 14px 14px;
430
+ font-family: var(--app-mono);
431
+ font-size: 11.5px;
432
+ }
433
+
434
+ .diffRow {
435
+ display: contents;
436
+ }
437
+
438
+ .diffHead {
439
+ padding-bottom: 4px;
440
+ border-bottom: 1px dashed var(--app-line);
441
+ color: var(--app-subtle);
442
+ }
443
+
444
+ .diffPath {
445
+ color: var(--app-text);
446
+ overflow-wrap: anywhere;
447
+ }
448
+
449
+ .diffValue {
450
+ display: inline-flex;
451
+ align-items: center;
452
+ gap: 6px;
453
+ min-width: 0;
454
+ color: var(--app-muted);
455
+ overflow-wrap: anywhere;
456
+ }
457
+
458
+ .diffSwatch {
459
+ flex: none;
460
+ width: 12px;
461
+ height: 12px;
462
+ border: 1px solid var(--app-line);
463
+ border-radius: 3px;
464
+ }
465
+
466
+ .diffMissing {
467
+ color: var(--app-subtle);
468
+ }
469
+
470
+ .codeDiff {
471
+ padding: 0 14px 14px;
472
+ }
473
+
474
+ .codeDiff p {
475
+ margin: 0 0 8px;
476
+ white-space: normal;
477
+ }
478
+
479
+ .codeDiff pre {
480
+ margin: 0;
481
+ padding: 10px 12px;
482
+ overflow-x: auto;
483
+ border-radius: 8px;
484
+ background: var(--app-ink);
485
+ color: var(--app-muted);
486
+ font-family: var(--app-mono);
487
+ font-size: 11.5px;
488
+ line-height: 1.5;
489
+ }
490
+
491
+ .codeDiff [data-kind="add"] {
492
+ color: var(--app-signal);
493
+ }
494
+
495
+ .codeDiff [data-kind="del"] {
496
+ color: var(--app-danger);
497
+ }
498
+
499
+ .codeDiff [data-kind="hunk"] {
500
+ color: var(--app-subtle);
501
+ }
502
+
503
+ .frame {
504
+ display: block;
505
+ width: 100%;
506
+ height: 100%;
507
+ border: 0;
508
+ background: transparent;
509
+ }
510
+
511
+ /* Export dialog */
512
+
513
+ a.primaryButton {
514
+ display: inline-flex;
515
+ align-items: center;
516
+ text-decoration: none;
517
+ }
518
+
519
+ .kit {
520
+ display: grid;
521
+ gap: 12px;
522
+ min-height: 0;
523
+ margin: 0 18px;
524
+ overflow-y: auto;
525
+ font-size: 12.5px;
526
+ line-height: 1.5;
527
+ }
528
+
529
+ .kitIntro {
530
+ margin: 0;
531
+ color: var(--app-muted);
532
+ }
533
+
534
+ .kitWarning,
535
+ .kitError {
536
+ margin: 0;
537
+ padding: 8px 10px;
538
+ border-radius: 6px;
539
+ background: color-mix(in srgb, var(--app-danger) 14%, var(--app-ink));
540
+ }
541
+
542
+ .kitError {
543
+ background: transparent;
544
+ padding: 0;
545
+ color: var(--app-danger);
546
+ }
547
+
548
+ .kitNote {
549
+ margin: 0;
550
+ color: var(--app-muted);
551
+ }
552
+
553
+ .kitNote code {
554
+ font-family: var(--app-mono);
555
+ font-size: 11.5px;
556
+ }
557
+
558
+ .kitSuccess {
559
+ margin: 0;
560
+ color: var(--app-signal);
561
+ }
562
+
563
+ .kitSuccess code,
564
+ .kitConflicts code {
565
+ font-family: var(--app-mono);
566
+ font-size: 11.5px;
567
+ overflow-wrap: anywhere;
568
+ }
569
+
570
+ .kitFiles {
571
+ display: grid;
572
+ gap: 6px;
573
+ padding: 10px 12px;
574
+ border-radius: 8px;
575
+ background: var(--app-ink-2);
576
+ }
577
+
578
+ .kitFiles ul,
579
+ .kitConflicts ul {
580
+ display: grid;
581
+ gap: 2px;
582
+ max-height: 180px;
583
+ margin: 0;
584
+ padding: 0;
585
+ overflow-y: auto;
586
+ list-style: none;
587
+ font-family: var(--app-mono);
588
+ font-size: 11.5px;
589
+ }
590
+
591
+ .kitFiles li {
592
+ display: flex;
593
+ justify-content: space-between;
594
+ gap: 12px;
595
+ }
596
+
597
+ .kitWrite {
598
+ display: grid;
599
+ gap: 6px;
600
+ }
601
+
602
+ .kitWrite label {
603
+ font-weight: 600;
604
+ }
605
+
606
+ .kitWriteRow {
607
+ display: flex;
608
+ gap: 8px;
609
+ }
610
+
611
+ .kitWriteRow input {
612
+ flex: 1;
613
+ min-width: 0;
614
+ height: 30px;
615
+ padding: 0 10px;
616
+ border: 1px solid var(--app-line);
617
+ border-radius: 6px;
618
+ background: var(--app-ink-2);
619
+ color: var(--app-text);
620
+ font-family: var(--app-mono);
621
+ font-size: 12px;
622
+ }
623
+
624
+ .kitWriteRow input:focus {
625
+ border-color: color-mix(in srgb, var(--app-signal) 55%, var(--app-line));
626
+ outline: none;
627
+ }
628
+
629
+ .kitConflicts {
630
+ display: grid;
631
+ justify-items: start;
632
+ gap: 6px;
633
+ padding: 10px 12px;
634
+ border: 1px solid color-mix(in srgb, var(--app-danger) 45%, var(--app-line));
635
+ border-radius: 8px;
636
+ }
637
+
638
+ .kitConflicts p {
639
+ margin: 0;
640
+ }
641
+
642
+ .dialog {
643
+ width: min(760px, calc(100vw - 32px));
644
+ max-height: calc(100vh - 64px);
645
+ padding: 0;
646
+ border: 1px solid var(--app-line);
647
+ border-radius: 12px;
648
+ background: var(--app-ink);
649
+ color: var(--app-text);
650
+ box-shadow: 0 30px 80px rgb(0 0 0 / 0.45);
651
+ }
652
+
653
+ .dialog::backdrop {
654
+ background: rgb(10 10 8 / 0.55);
655
+ backdrop-filter: blur(2px);
656
+ }
657
+
658
+ .dialog[open] {
659
+ animation: rise 220ms cubic-bezier(0.2, 0, 0, 1);
660
+ }
661
+
662
+ .dialogInner {
663
+ display: flex;
664
+ flex-direction: column;
665
+ max-height: calc(100vh - 66px);
666
+ }
667
+
668
+ .dialogHeader {
669
+ display: flex;
670
+ align-items: flex-start;
671
+ justify-content: space-between;
672
+ gap: 16px;
673
+ padding: 18px 18px 12px;
674
+ }
675
+
676
+ .dialogHeader h2 {
677
+ margin: 0;
678
+ font-size: 16px;
679
+ font-weight: 700;
680
+ }
681
+
682
+ .dialogHeader p {
683
+ margin: 4px 0 0;
684
+ color: var(--app-muted);
685
+ font-size: 12.5px;
686
+ overflow-wrap: anywhere;
687
+ }
688
+
689
+ .dialogHeader code {
690
+ font-family: var(--app-mono);
691
+ font-size: 11.5px;
692
+ }
693
+
694
+ .formatTabs {
695
+ display: flex;
696
+ gap: 4px;
697
+ padding: 0 18px 12px;
698
+ }
699
+
700
+ .formatTabs button {
701
+ height: 28px;
702
+ padding: 0 10px;
703
+ border: 1px solid var(--app-line);
704
+ border-radius: 6px;
705
+ background: transparent;
706
+ color: var(--app-muted);
707
+ font: inherit;
708
+ font-size: 12.5px;
709
+ cursor: pointer;
710
+ }
711
+
712
+ .formatTabs button[aria-selected="true"] {
713
+ border-color: transparent;
714
+ background: var(--app-ink-3);
715
+ color: var(--app-text);
716
+ }
717
+
718
+ .code {
719
+ flex: 1;
720
+ min-height: 0;
721
+ margin: 0 18px;
722
+ padding: 14px;
723
+ overflow: auto;
724
+ border-radius: 8px;
725
+ background: var(--app-ink-2);
726
+ color: var(--app-text);
727
+ font-family: var(--app-mono);
728
+ font-size: 12px;
729
+ line-height: 1.55;
730
+ }
731
+
732
+ .dialogFooter {
733
+ display: flex;
734
+ align-items: center;
735
+ justify-content: flex-end;
736
+ gap: 8px;
737
+ padding: 14px 18px 18px;
738
+ }
739
+
740
+ .dialogFooter .muted {
741
+ margin-right: auto;
742
+ }
743
+
744
+ @keyframes rise {
745
+ from {
746
+ opacity: 0;
747
+ transform: translateY(8px);
748
+ }
749
+ }
750
+
751
+ @media (max-width: 900px) {
752
+ .app {
753
+ grid-template-columns: 1fr;
754
+ grid-template-rows: minmax(0, 1fr) minmax(0, 45vh);
755
+ }
756
+
757
+ .app > aside {
758
+ order: 2;
759
+ border-top: 1px solid var(--app-line);
760
+ border-right: 0;
761
+ }
762
+
763
+ .resizer {
764
+ display: none;
765
+ }
766
+
767
+ .app[data-chat-hidden] {
768
+ grid-template-rows: minmax(0, 1fr);
769
+ }
770
+ }
771
+
772
+ .createDialog {
773
+ width: min(480px, calc(100vw - 32px));
774
+ }
775
+
776
+ .createFields {
777
+ display: grid;
778
+ gap: 6px;
779
+ margin: 0 18px;
780
+ font-size: 12.5px;
781
+ line-height: 1.5;
782
+ }
783
+
784
+ .createFields label {
785
+ font-weight: 600;
786
+ }
787
+
788
+ .createFields label .muted {
789
+ margin-left: 4px;
790
+ font-weight: 400;
791
+ }
792
+
793
+ .createFields p {
794
+ margin: 0 0 6px;
795
+ font-size: 12px;
796
+ }
797
+
798
+ /* Text fields only: a checkbox or radio given full width and 32px height grows into a large square. */
799
+ .createFields input:not([type="checkbox"], [type="radio"]),
800
+ .createFields textarea {
801
+ width: 100%;
802
+ padding: 6px 10px;
803
+ border: 1px solid var(--app-line);
804
+ border-radius: 6px;
805
+ background: var(--app-ink-2);
806
+ color: var(--app-text);
807
+ font: inherit;
808
+ }
809
+
810
+ .createFields input:not([type="checkbox"], [type="radio"]) {
811
+ height: 32px;
812
+ }
813
+
814
+ .createFields input:is([type="checkbox"], [type="radio"]) {
815
+ flex: none;
816
+ width: 14px;
817
+ height: 14px;
818
+ margin: 2px 0 0;
819
+ accent-color: var(--app-signal);
820
+ }
821
+
822
+ /* A folder path and its Browse button. */
823
+ .folderRow {
824
+ display: flex;
825
+ gap: 6px;
826
+ }
827
+
828
+ .folderRow input {
829
+ flex: 1;
830
+ min-width: 0;
831
+ }
832
+
833
+ .folderRow button {
834
+ flex: none;
835
+ }
836
+
837
+ .repoSuggestions {
838
+ display: grid;
839
+ gap: 6px;
840
+ margin-top: 4px;
841
+ }
842
+
843
+ .repoSuggestions > div {
844
+ display: flex;
845
+ flex-wrap: wrap;
846
+ gap: 6px;
847
+ }
848
+
849
+ .repoChip {
850
+ max-width: 100%;
851
+ overflow: hidden;
852
+ padding: 3px 10px;
853
+ border: 1px solid var(--app-line);
854
+ border-radius: 999px;
855
+ background: var(--app-ink-2);
856
+ color: var(--app-text);
857
+ font: inherit;
858
+ font-size: 12px;
859
+ text-overflow: ellipsis;
860
+ white-space: nowrap;
861
+ cursor: pointer;
862
+ }
863
+
864
+ .repoChip:hover {
865
+ border-color: var(--app-muted);
866
+ }
867
+
868
+ .repoChip[aria-pressed="true"] {
869
+ border-color: var(--app-signal);
870
+ color: var(--app-signal);
871
+ }
872
+
873
+ .createFields textarea {
874
+ resize: vertical;
875
+ }
876
+
877
+ .createFields input:focus,
878
+ .createFields textarea:focus {
879
+ border-color: color-mix(in srgb, var(--app-signal) 55%, var(--app-line));
880
+ outline: none;
881
+ }
882
+
883
+ .versionSelect {
884
+ display: flex;
885
+ align-items: center;
886
+ gap: 8px;
887
+ min-width: 0;
888
+ color: var(--app-muted);
889
+ font-size: 12px;
890
+ }
891
+
892
+ .versionSelect select {
893
+ max-width: 320px;
894
+ height: 30px;
895
+ padding: 0 8px;
896
+ border: 1px solid var(--app-line);
897
+ border-radius: 6px;
898
+ background: var(--app-ink-2);
899
+ color: var(--app-text);
900
+ font: inherit;
901
+ font-size: 12.5px;
902
+ }
903
+
904
+ .reviewImpact {
905
+ display: flex;
906
+ flex-wrap: wrap;
907
+ align-items: center;
908
+ gap: 6px;
909
+ padding: 0 14px 10px;
910
+ font-size: 12px;
911
+ }
912
+
913
+ .reviewChip {
914
+ height: 24px;
915
+ padding: 0 9px;
916
+ border: 1px solid var(--app-line);
917
+ border-radius: 999px;
918
+ background: transparent;
919
+ color: var(--app-muted);
920
+ font: inherit;
921
+ font-size: 12px;
922
+ cursor: pointer;
923
+ transition:
924
+ background-color 120ms ease,
925
+ color 120ms ease,
926
+ border-color 120ms ease;
927
+ }
928
+
929
+ .reviewChip:hover {
930
+ color: var(--app-text);
931
+ }
932
+
933
+ .reviewChip[aria-pressed="true"] {
934
+ border-color: color-mix(in srgb, var(--app-signal) 50%, var(--app-line));
935
+ background: color-mix(in srgb, var(--app-signal) 12%, transparent);
936
+ color: var(--app-text);
937
+ }
938
+
939
+ .chromeButton[data-confirming] {
940
+ border-color: color-mix(in srgb, var(--app-danger) 60%, var(--app-line));
941
+ color: var(--app-danger);
942
+ }
943
+
944
+ .projectRoot {
945
+ position: relative;
946
+ flex: none;
947
+ }
948
+
949
+ .projectButton {
950
+ display: inline-flex;
951
+ align-items: center;
952
+ gap: 8px;
953
+ min-width: 0;
954
+ max-width: 220px;
955
+ height: 32px;
956
+ padding: 0 8px;
957
+ border: 1px solid transparent;
958
+ border-radius: 7px;
959
+ background: transparent;
960
+ color: var(--app-text);
961
+ font: inherit;
962
+ font-size: 14px;
963
+ font-weight: 700;
964
+ letter-spacing: -0.01em;
965
+ cursor: pointer;
966
+ transition:
967
+ background-color 120ms ease,
968
+ border-color 120ms ease;
969
+ }
970
+
971
+ .projectButton:hover,
972
+ .projectButton[aria-expanded="true"] {
973
+ border-color: var(--app-line);
974
+ background: var(--app-ink-2);
975
+ }
976
+
977
+ /* A newer starter template is waiting in the project menu. */
978
+ .updateDot {
979
+ flex: none;
980
+ width: 7px;
981
+ height: 7px;
982
+ border-radius: 50%;
983
+ background: var(--app-signal);
984
+ }
985
+
986
+ .projectButton svg {
987
+ flex: none;
988
+ width: 14px;
989
+ height: 14px;
990
+ fill: none;
991
+ stroke: var(--app-muted);
992
+ stroke-width: 1.4;
993
+ stroke-linecap: round;
994
+ stroke-linejoin: round;
995
+ }
996
+
997
+ .projectName {
998
+ overflow: hidden;
999
+ text-overflow: ellipsis;
1000
+ white-space: nowrap;
1001
+ }
1002
+
1003
+ .projectMenu {
1004
+ right: auto;
1005
+ left: 0;
1006
+ width: 360px;
1007
+ }
1008
+
1009
+ .projectRow {
1010
+ display: flex;
1011
+ align-items: center;
1012
+ gap: 2px;
1013
+ }
1014
+
1015
+ .projectRow .menuItem {
1016
+ flex: 1;
1017
+ min-width: 0;
1018
+ }
1019
+
1020
+ .projectRow .menuItem:disabled {
1021
+ opacity: 0.45;
1022
+ cursor: default;
1023
+ }
1024
+
1025
+ .projectDir {
1026
+ overflow: hidden;
1027
+ color: var(--app-subtle);
1028
+ font-family: var(--app-mono);
1029
+ font-size: 10.5px;
1030
+ text-overflow: ellipsis;
1031
+ white-space: nowrap;
1032
+ }
1033
+
1034
+ .projectRemove {
1035
+ flex: none;
1036
+ width: 26px;
1037
+ height: 26px;
1038
+ border: 0;
1039
+ border-radius: 6px;
1040
+ background: transparent;
1041
+ color: var(--app-subtle);
1042
+ font: inherit;
1043
+ font-size: 15px;
1044
+ cursor: pointer;
1045
+ }
1046
+
1047
+ .projectRemove:hover {
1048
+ background: var(--app-ink-3);
1049
+ color: var(--app-text);
1050
+ }
1051
+
1052
+ .projectRepo {
1053
+ display: grid;
1054
+ gap: 8px;
1055
+ padding: 10px 12px;
1056
+ border-top: 1px solid var(--app-line);
1057
+ font-size: 12px;
1058
+ }
1059
+
1060
+ .projectCheck {
1061
+ display: flex;
1062
+ gap: 8px;
1063
+ align-items: flex-start;
1064
+ color: var(--app-muted);
1065
+ font-size: 12px;
1066
+ line-height: 1.45;
1067
+ }
1068
+
1069
+ .projectRepoHint {
1070
+ color: var(--app-muted);
1071
+ line-height: 1.45;
1072
+ }
1073
+
1074
+ .projectRepoActions {
1075
+ display: flex;
1076
+ gap: 6px;
1077
+ }
1078
+
1079
+ .projectActions {
1080
+ display: flex;
1081
+ gap: 6px;
1082
+ margin-top: 6px;
1083
+ padding: 8px 4px 2px;
1084
+ border-top: 1px solid var(--app-line);
1085
+ }
1086
+
1087
+ .projectError {
1088
+ margin: 0 6px 6px;
1089
+ padding: 8px 10px;
1090
+ border-radius: 6px;
1091
+ background: color-mix(in srgb, var(--app-danger) 14%, var(--app-ink));
1092
+ color: var(--app-text);
1093
+ font-size: 12px;
1094
+ }
1095
+
1096
+ .projectStart {
1097
+ display: grid;
1098
+ gap: 6px;
1099
+ margin: 0;
1100
+ padding: 0;
1101
+ border: 0;
1102
+ }
1103
+
1104
+ .projectStart legend {
1105
+ margin-bottom: 6px;
1106
+ padding: 0;
1107
+ font-weight: 600;
1108
+ }
1109
+
1110
+ .projectStart label {
1111
+ display: flex;
1112
+ align-items: center;
1113
+ gap: 8px;
1114
+ font-weight: 400;
1115
+ }
1116
+
1117
+ .switching {
1118
+ position: fixed;
1119
+ inset: 0;
1120
+ z-index: 50;
1121
+ display: grid;
1122
+ place-items: center;
1123
+ background: rgb(10 10 8 / 0.45);
1124
+ backdrop-filter: blur(2px);
1125
+ }
1126
+
1127
+ .switchingCard {
1128
+ padding: 12px 18px;
1129
+ border: 1px solid var(--app-line);
1130
+ border-radius: 10px;
1131
+ background: var(--app-ink);
1132
+ color: var(--app-text);
1133
+ font-size: 13px;
1134
+ box-shadow: 0 20px 60px rgb(0 0 0 / 0.4);
1135
+ }
1136
+
1137
+ /* The field styles above are for text inputs; radios keep their native size. */
1138
+ .createFields input[type="radio"] {
1139
+ width: auto;
1140
+ height: auto;
1141
+ margin: 0;
1142
+ padding: 0;
1143
+ border: 0;
1144
+ background: none;
1145
+ accent-color: var(--app-signal);
1146
+ }