@goodfellow-cms/admin 0.0.0-stage → 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.
package/styles.css ADDED
@@ -0,0 +1,1228 @@
1
+ /*
2
+ * Styles for Goodfellow's admin panel. Plain CSS with gfa- prefixed classes,
3
+ * so they never depend on or leak into the site's own styles.
4
+ */
5
+ /* Each color is light-dark(light, dark): light-dark() picks by color-scheme, which follows
6
+ * the computer's setting unless the admin panel's color menu chose (data-gfa-theme). */
7
+ :root {
8
+ color-scheme: light dark;
9
+ --gfa-bg: light-dark(#f8fafc, #0b1120);
10
+ --gfa-surface: light-dark(#ffffff, #111827);
11
+ --gfa-text: light-dark(#0f172a, #e2e8f0);
12
+ --gfa-muted: light-dark(#64748b, #94a3b8);
13
+ --gfa-border: light-dark(#e2e8f0, #1f2937);
14
+ --gfa-input-border: light-dark(#cbd5e1, #475569);
15
+ --gfa-accent: light-dark(#2563eb, #60a5fa);
16
+ --gfa-accent-text: light-dark(#ffffff, #0b1120);
17
+ --gfa-current-bg: light-dark(#eff6ff, #172554);
18
+ --gfa-danger: light-dark(#dc2626, #f87171);
19
+ --gfa-danger-border: light-dark(#fecaca, #7f1d1d);
20
+ --gfa-success-bg: light-dark(#ecfdf5, #052e1c);
21
+ --gfa-success-text: light-dark(#065f46, #6ee7b7);
22
+ --gfa-success-border: light-dark(#a7f3d0, #065f46);
23
+ --gfa-error-bg: light-dark(#fef2f2, #3b0d0d);
24
+ --gfa-error-text: light-dark(#991b1b, #fca5a5);
25
+ --gfa-demo-bg: light-dark(#fef9c3, #422006);
26
+ --gfa-demo-border: light-dark(#fde68a, #854d0e);
27
+ --gfa-demo-text: light-dark(#713f12, #fde68a);
28
+ --gfa-checker: light-dark(#f1f5f9, #1e293b);
29
+ --gfa-checker-alt: light-dark(#ffffff, #0f172a);
30
+ --gfa-radius: 6px;
31
+ --gfa-topbar-height: 52px;
32
+ --gfa-code-active-line: light-dark(rgb(37 99 235 / 0.06), rgb(96 165 250 / 0.08));
33
+ --gfa-code-selection: light-dark(rgb(37 99 235 / 0.2), rgb(96 165 250 / 0.3));
34
+ }
35
+
36
+ :root[data-gfa-theme="light"] {
37
+ color-scheme: light;
38
+ }
39
+
40
+ :root[data-gfa-theme="dark"] {
41
+ color-scheme: dark;
42
+ }
43
+
44
+ html,
45
+ body,
46
+ #gf-admin {
47
+ height: 100%;
48
+ margin: 0;
49
+ }
50
+
51
+ .gfa-app {
52
+ display: flex;
53
+ flex-direction: column;
54
+ height: 100%;
55
+ background: var(--gfa-bg);
56
+ color: var(--gfa-text);
57
+ font:
58
+ 15px / 1.5 ui-sans-serif,
59
+ system-ui,
60
+ -apple-system,
61
+ "Segoe UI",
62
+ sans-serif;
63
+ }
64
+
65
+ .gfa-app *,
66
+ .gfa-app *::before,
67
+ .gfa-app *::after,
68
+ .gfa-sign-in,
69
+ .gfa-sign-in *,
70
+ .gfa-dialog,
71
+ .gfa-dialog * {
72
+ box-sizing: border-box;
73
+ }
74
+
75
+ .gfa-topbar {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 24px;
79
+ height: var(--gfa-topbar-height);
80
+ flex-shrink: 0;
81
+ padding: 0 16px;
82
+ background: var(--gfa-surface);
83
+ border-bottom: 1px solid var(--gfa-border);
84
+ }
85
+
86
+ .gfa-demo-banner {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ gap: 12px;
91
+ flex-shrink: 0;
92
+ padding: 6px 16px;
93
+ background: var(--gfa-demo-bg);
94
+ border-bottom: 1px solid var(--gfa-demo-border);
95
+ color: var(--gfa-demo-text);
96
+ font-size: 14px;
97
+ }
98
+
99
+ .gfa-brand {
100
+ font-weight: 700;
101
+ white-space: nowrap;
102
+ overflow: hidden;
103
+ text-overflow: ellipsis;
104
+ max-width: 220px;
105
+ }
106
+
107
+ .gfa-nav {
108
+ display: flex;
109
+ gap: 4px;
110
+ flex: 1;
111
+ overflow-x: auto;
112
+ }
113
+
114
+ .gfa-nav a,
115
+ .gfa-tab {
116
+ padding: 6px 12px;
117
+ border-radius: var(--gfa-radius);
118
+ border: 0;
119
+ background: none;
120
+ color: var(--gfa-muted);
121
+ font: inherit;
122
+ text-decoration: none;
123
+ white-space: nowrap;
124
+ cursor: pointer;
125
+ }
126
+
127
+ .gfa-nav a:hover,
128
+ .gfa-tab:hover {
129
+ background: var(--gfa-bg);
130
+ color: var(--gfa-text);
131
+ }
132
+
133
+ .gfa-nav a[aria-current="page"],
134
+ .gfa-tab[aria-current="page"],
135
+ .gfa-tab[aria-selected="true"] {
136
+ background: var(--gfa-current-bg);
137
+ color: var(--gfa-accent);
138
+ font-weight: 600;
139
+ }
140
+
141
+ .gfa-topbar-link {
142
+ color: var(--gfa-accent);
143
+ white-space: nowrap;
144
+ }
145
+
146
+ .gfa-content {
147
+ flex: 1;
148
+ min-height: 0;
149
+ overflow: auto;
150
+ }
151
+
152
+ .gfa-screen {
153
+ max-width: 960px;
154
+ margin: 0 auto;
155
+ padding: 24px 16px;
156
+ }
157
+
158
+ .gfa-screen-header {
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: space-between;
162
+ gap: 16px;
163
+ margin-bottom: 16px;
164
+ }
165
+
166
+ .gfa-header-actions {
167
+ display: flex;
168
+ flex-wrap: wrap;
169
+ gap: 8px;
170
+ }
171
+
172
+ .gfa-screen-header h1,
173
+ .gfa-screen > h1 {
174
+ margin: 0;
175
+ font-size: 24px;
176
+ }
177
+
178
+ .gfa-section-title {
179
+ margin: 16px 0 0;
180
+ font-size: 17px;
181
+ }
182
+
183
+ .gfa-button {
184
+ display: inline-flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ gap: 6px;
188
+ min-height: 36px;
189
+ padding: 0 14px;
190
+ border-radius: var(--gfa-radius);
191
+ border: 1px solid var(--gfa-border);
192
+ font: inherit;
193
+ font-weight: 500;
194
+ text-decoration: none;
195
+ white-space: nowrap;
196
+ cursor: pointer;
197
+ }
198
+
199
+ .gfa-button:disabled {
200
+ opacity: 0.5;
201
+ cursor: not-allowed;
202
+ }
203
+
204
+ .gfa-button:focus-visible,
205
+ .gfa-input:focus-visible,
206
+ .gfa-nav a:focus-visible,
207
+ .gfa-tab:focus-visible {
208
+ outline: 2px solid var(--gfa-accent);
209
+ outline-offset: 2px;
210
+ }
211
+
212
+ .gfa-button-primary {
213
+ background: var(--gfa-accent);
214
+ border-color: var(--gfa-accent);
215
+ color: var(--gfa-accent-text);
216
+ }
217
+
218
+ .gfa-button-secondary {
219
+ background: var(--gfa-surface);
220
+ color: var(--gfa-text);
221
+ }
222
+
223
+ .gfa-button-ghost {
224
+ background: transparent;
225
+ border-color: transparent;
226
+ color: var(--gfa-text);
227
+ }
228
+
229
+ .gfa-button-ghost:hover:not(:disabled),
230
+ .gfa-button-secondary:hover:not(:disabled) {
231
+ background: var(--gfa-bg);
232
+ }
233
+
234
+ .gfa-button-danger {
235
+ background: var(--gfa-surface);
236
+ border-color: var(--gfa-danger-border);
237
+ color: var(--gfa-danger);
238
+ }
239
+
240
+ .gfa-table {
241
+ width: 100%;
242
+ border-collapse: collapse;
243
+ background: var(--gfa-surface);
244
+ border: 1px solid var(--gfa-border);
245
+ border-radius: var(--gfa-radius);
246
+ }
247
+
248
+ .gfa-table th,
249
+ .gfa-table td {
250
+ padding: 10px 12px;
251
+ border-bottom: 1px solid var(--gfa-border);
252
+ text-align: left;
253
+ vertical-align: middle;
254
+ }
255
+
256
+ .gfa-table th {
257
+ font-size: 13px;
258
+ font-weight: 600;
259
+ color: var(--gfa-muted);
260
+ }
261
+
262
+ .gfa-row-actions {
263
+ display: flex;
264
+ flex-wrap: wrap;
265
+ gap: 4px;
266
+ justify-content: flex-end;
267
+ }
268
+
269
+ .gfa-link-strong {
270
+ color: var(--gfa-text);
271
+ font-weight: 600;
272
+ }
273
+
274
+ .gfa-form {
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: 16px;
278
+ max-width: 640px;
279
+ }
280
+
281
+ .gfa-field {
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: 4px;
285
+ }
286
+
287
+ .gfa-label {
288
+ font-weight: 600;
289
+ font-size: 14px;
290
+ }
291
+
292
+ .gfa-hint {
293
+ margin: 0;
294
+ color: var(--gfa-muted);
295
+ font-size: 13px;
296
+ }
297
+
298
+ .gfa-error-text {
299
+ margin: 0;
300
+ color: var(--gfa-error-text);
301
+ font-size: 13px;
302
+ }
303
+
304
+ .gfa-input {
305
+ width: 100%;
306
+ min-height: 38px;
307
+ padding: 6px 10px;
308
+ border: 1px solid var(--gfa-input-border);
309
+ border-radius: var(--gfa-radius);
310
+ background: var(--gfa-surface);
311
+ color: var(--gfa-text);
312
+ font: inherit;
313
+ }
314
+
315
+ .gfa-input[aria-invalid="true"] {
316
+ border-color: var(--gfa-danger);
317
+ }
318
+
319
+ .gfa-code {
320
+ font-family: ui-monospace, "SFMono-Regular", Menlo, monospace;
321
+ font-size: 13px;
322
+ line-height: 1.6;
323
+ resize: vertical;
324
+ }
325
+
326
+ .gfa-checkbox {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 8px;
330
+ }
331
+
332
+ .gfa-color-grid {
333
+ display: grid;
334
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
335
+ gap: 12px 16px;
336
+ }
337
+
338
+ .gfa-color-input {
339
+ display: flex;
340
+ gap: 8px;
341
+ }
342
+
343
+ .gfa-color-input input[type="color"] {
344
+ width: 44px;
345
+ height: 38px;
346
+ padding: 2px;
347
+ border: 1px solid var(--gfa-input-border);
348
+ border-radius: var(--gfa-radius);
349
+ background: var(--gfa-surface);
350
+ flex-shrink: 0;
351
+ }
352
+
353
+ .gfa-tabs {
354
+ display: flex;
355
+ flex-wrap: wrap;
356
+ gap: 4px;
357
+ margin-bottom: 16px;
358
+ }
359
+
360
+ .gfa-notice {
361
+ margin: 0 0 12px;
362
+ padding: 10px 14px;
363
+ border-radius: var(--gfa-radius);
364
+ background: var(--gfa-surface);
365
+ border: 1px solid var(--gfa-border);
366
+ }
367
+
368
+ .gfa-notice p {
369
+ margin: 0 0 8px;
370
+ }
371
+
372
+ .gfa-notice-success {
373
+ background: var(--gfa-success-bg);
374
+ border-color: var(--gfa-success-border);
375
+ color: var(--gfa-success-text);
376
+ }
377
+
378
+ .gfa-notice-error {
379
+ background: var(--gfa-error-bg);
380
+ border-color: var(--gfa-danger-border);
381
+ color: var(--gfa-error-text);
382
+ }
383
+
384
+ .gfa-details summary {
385
+ cursor: pointer;
386
+ margin-bottom: 8px;
387
+ }
388
+
389
+ .gfa-details pre {
390
+ white-space: pre-wrap;
391
+ font-size: 12px;
392
+ margin: 0 0 8px;
393
+ }
394
+
395
+ .gfa-dialog {
396
+ width: min(520px, calc(100vw - 32px));
397
+ padding: 24px;
398
+ border: 0;
399
+ border-radius: 10px;
400
+ color: var(--gfa-text);
401
+ font:
402
+ 15px / 1.5 ui-sans-serif,
403
+ system-ui,
404
+ -apple-system,
405
+ "Segoe UI",
406
+ sans-serif;
407
+ box-shadow: 0 20px 50px rgb(15 23 42 / 0.25);
408
+ }
409
+
410
+ .gfa-dialog::backdrop {
411
+ background: rgb(15 23 42 / 0.4);
412
+ }
413
+
414
+ .gfa-dialog-title {
415
+ margin: 0 0 16px;
416
+ font-size: 20px;
417
+ }
418
+
419
+ .gfa-dialog-actions {
420
+ display: flex;
421
+ justify-content: flex-end;
422
+ gap: 8px;
423
+ margin-top: 8px;
424
+ }
425
+
426
+ .gfa-editor {
427
+ position: relative;
428
+ display: flex;
429
+ flex-direction: column;
430
+ height: 100%;
431
+ }
432
+
433
+ .gfa-editor-status {
434
+ position: absolute;
435
+ z-index: 10;
436
+ bottom: 16px;
437
+ left: 50%;
438
+ transform: translateX(-50%);
439
+ width: min(560px, calc(100% - 32px));
440
+ box-shadow: 0 8px 24px rgb(15 23 42 / 0.15);
441
+ }
442
+
443
+ .gfa-editor-status .gfa-notice {
444
+ margin: 0;
445
+ }
446
+
447
+ .gfa-layout-screen {
448
+ display: flex;
449
+ flex-direction: column;
450
+ height: 100%;
451
+ }
452
+
453
+ .gfa-layout-screen > .gfa-tabs {
454
+ margin: 0;
455
+ padding: 8px 16px;
456
+ background: var(--gfa-surface);
457
+ border-bottom: 1px solid var(--gfa-border);
458
+ }
459
+
460
+ .gfa-layout-screen > .gfa-editor {
461
+ flex: 1;
462
+ min-height: 0;
463
+ }
464
+
465
+ .gfa-split {
466
+ display: grid;
467
+ grid-template-columns: minmax(360px, 1fr) minmax(0, 1.2fr);
468
+ height: 100%;
469
+ }
470
+
471
+ .gfa-split-main {
472
+ padding: 24px;
473
+ overflow: auto;
474
+ }
475
+
476
+ .gfa-split-preview {
477
+ position: relative;
478
+ border-left: 1px solid var(--gfa-border);
479
+ background: var(--gfa-surface);
480
+ min-height: 0;
481
+ }
482
+
483
+ .gfa-preview {
484
+ position: absolute;
485
+ inset: 0;
486
+ overflow: hidden;
487
+ }
488
+
489
+ .gfa-preview iframe {
490
+ border: 0;
491
+ transform-origin: 0 0;
492
+ background: #fff;
493
+ }
494
+
495
+ .gfa-menus {
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: 16px;
499
+ max-width: 760px;
500
+ }
501
+
502
+ .gfa-menu {
503
+ display: flex;
504
+ flex-direction: column;
505
+ gap: 12px;
506
+ }
507
+
508
+ .gfa-menu-item {
509
+ padding: 12px;
510
+ background: var(--gfa-surface);
511
+ border: 1px solid var(--gfa-border);
512
+ border-radius: var(--gfa-radius);
513
+ }
514
+
515
+ .gfa-menu-children {
516
+ display: flex;
517
+ flex-direction: column;
518
+ gap: 8px;
519
+ margin: 8px 0 0 24px;
520
+ padding-left: 12px;
521
+ border-left: 2px solid var(--gfa-border);
522
+ }
523
+
524
+ .gfa-menu-children .gfa-button {
525
+ align-self: flex-start;
526
+ }
527
+
528
+ .gfa-link-row {
529
+ display: grid;
530
+ grid-template-columns: 1fr 1fr auto;
531
+ gap: 8px;
532
+ align-items: end;
533
+ }
534
+
535
+ .gfa-link-row-actions {
536
+ display: flex;
537
+ gap: 2px;
538
+ }
539
+
540
+ .gfa-menu-actions,
541
+ .gfa-inline-form {
542
+ display: flex;
543
+ gap: 8px;
544
+ align-items: end;
545
+ }
546
+
547
+ .gfa-inline-form .gfa-field {
548
+ flex: 1;
549
+ max-width: 320px;
550
+ }
551
+
552
+ .gfa-visually-hidden {
553
+ position: absolute;
554
+ width: 1px;
555
+ height: 1px;
556
+ overflow: hidden;
557
+ clip: rect(0 0 0 0);
558
+ white-space: nowrap;
559
+ }
560
+
561
+ @media (max-width: 900px) {
562
+ .gfa-split {
563
+ grid-template-columns: 1fr;
564
+ grid-template-rows: auto 480px;
565
+ height: auto;
566
+ }
567
+
568
+ .gfa-split-preview {
569
+ border-left: 0;
570
+ border-top: 1px solid var(--gfa-border);
571
+ }
572
+
573
+ .gfa-link-row {
574
+ grid-template-columns: 1fr;
575
+ }
576
+ }
577
+
578
+ .gfa-sign-in {
579
+ max-width: 560px;
580
+ margin: 48px auto;
581
+ padding: 32px;
582
+ background: var(--gfa-surface);
583
+ border: 1px solid var(--gfa-border);
584
+ border-radius: 10px;
585
+ color: var(--gfa-text);
586
+ font:
587
+ 15px / 1.5 ui-sans-serif,
588
+ system-ui,
589
+ -apple-system,
590
+ "Segoe UI",
591
+ sans-serif;
592
+ }
593
+
594
+ .gfa-sign-in h1 {
595
+ margin: 0 0 8px;
596
+ font-size: 24px;
597
+ }
598
+
599
+ .gfa-sign-in-token {
600
+ margin-top: 24px;
601
+ }
602
+
603
+ .gfa-sign-in-token summary {
604
+ cursor: pointer;
605
+ font-weight: 600;
606
+ margin-bottom: 12px;
607
+ }
608
+
609
+ .gfa-steps {
610
+ margin: 0;
611
+ padding-left: 20px;
612
+ }
613
+
614
+ .gfa-steps > li + li {
615
+ margin-top: 16px;
616
+ }
617
+
618
+ .gfa-steps p {
619
+ margin: 0 0 8px;
620
+ }
621
+
622
+ .gfa-token-links {
623
+ margin: 0 0 8px;
624
+ padding-left: 18px;
625
+ }
626
+
627
+ .gfa-token-links a {
628
+ color: var(--gfa-accent);
629
+ font-weight: 600;
630
+ }
631
+
632
+ .gfa-block {
633
+ display: block;
634
+ }
635
+
636
+ .gfa-account {
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 8px;
640
+ white-space: nowrap;
641
+ }
642
+
643
+ .gfa-account img {
644
+ border-radius: 50%;
645
+ }
646
+
647
+ .gfa-deploy {
648
+ font-size: 13px;
649
+ padding: 4px 10px;
650
+ border-radius: 999px;
651
+ white-space: nowrap;
652
+ background: var(--gfa-bg);
653
+ color: var(--gfa-muted);
654
+ }
655
+
656
+ .gfa-deploy-live {
657
+ background: var(--gfa-success-bg);
658
+ color: var(--gfa-success-text);
659
+ }
660
+
661
+ .gfa-deploy-failed {
662
+ background: var(--gfa-error-bg);
663
+ color: var(--gfa-error-text);
664
+ }
665
+
666
+ .gfa-deploy a {
667
+ color: inherit;
668
+ }
669
+
670
+ .gfa-tabs-title {
671
+ align-self: center;
672
+ margin: 0 8px 0 4px;
673
+ font-weight: 600;
674
+ }
675
+
676
+ .gfa-layout-body {
677
+ flex: 1;
678
+ min-height: 0;
679
+ overflow: auto;
680
+ }
681
+
682
+ .gfa-layout-body > .gfa-editor {
683
+ height: 100%;
684
+ }
685
+
686
+ .gfa-editor-puck {
687
+ flex: 1;
688
+ min-height: 0;
689
+ }
690
+
691
+ .gfa-editor-notice {
692
+ padding: 8px 16px;
693
+ background: var(--gfa-surface);
694
+ border-bottom: 1px solid var(--gfa-border);
695
+ font-size: 14px;
696
+ }
697
+
698
+ .gfa-template-help p {
699
+ display: inline;
700
+ margin: 0 8px 0 0;
701
+ color: var(--gfa-muted);
702
+ }
703
+
704
+ .gfa-template-help ul {
705
+ display: inline;
706
+ margin: 0;
707
+ padding: 0;
708
+ list-style: none;
709
+ }
710
+
711
+ .gfa-template-help-item {
712
+ display: inline-block;
713
+ margin: 2px 12px 2px 0;
714
+ }
715
+
716
+ .gfa-template-help code {
717
+ padding: 1px 4px;
718
+ border-radius: 4px;
719
+ background: var(--gfa-bg);
720
+ border: 1px solid var(--gfa-border);
721
+ }
722
+
723
+ .gfa-field-editor {
724
+ display: flex;
725
+ flex-direction: column;
726
+ gap: 12px;
727
+ }
728
+
729
+ .gfa-field-editor-row {
730
+ display: grid;
731
+ grid-template-columns: 1fr 1fr auto;
732
+ gap: 8px;
733
+ align-items: start;
734
+ }
735
+
736
+ .gfa-choices {
737
+ display: flex;
738
+ flex-direction: column;
739
+ gap: 8px;
740
+ margin: 0;
741
+ padding: 0;
742
+ border: 0;
743
+ }
744
+
745
+ .gfa-choices > .gfa-button {
746
+ align-self: flex-start;
747
+ }
748
+
749
+ /* Inputs and help text inside Puck's sidebar, for entry fields Puck has no input of its own for. */
750
+ .gfa-puck-input {
751
+ box-sizing: border-box;
752
+ width: 100%;
753
+ padding: 10px 12px;
754
+ border: 1px solid var(--puck-color-grey-09, #dcdcdc);
755
+ border-radius: 4px;
756
+ background: var(--puck-color-white, #fff);
757
+ font: inherit;
758
+ font-size: 14px;
759
+ }
760
+
761
+ .gfa-puck-hint {
762
+ margin: 6px 0 0;
763
+ color: var(--gfa-muted);
764
+ font-size: 13px;
765
+ }
766
+
767
+ .gfa-ai {
768
+ display: flex;
769
+ flex-direction: column;
770
+ gap: 12px;
771
+ padding: 16px;
772
+ font:
773
+ 14px / 1.5 ui-sans-serif,
774
+ system-ui,
775
+ -apple-system,
776
+ "Segoe UI",
777
+ sans-serif;
778
+ }
779
+
780
+ .gfa-ai,
781
+ .gfa-ai * {
782
+ box-sizing: border-box;
783
+ }
784
+
785
+ .gfa-ai-title {
786
+ margin: 0;
787
+ font-size: 16px;
788
+ }
789
+
790
+ .gfa-ai textarea {
791
+ resize: vertical;
792
+ }
793
+
794
+ .gfa-ai-actions {
795
+ display: flex;
796
+ gap: 8px;
797
+ }
798
+
799
+ .gfa-ai-service summary {
800
+ cursor: pointer;
801
+ font-weight: 600;
802
+ }
803
+
804
+ .gfa-ai-settings {
805
+ margin-top: 12px;
806
+ }
807
+
808
+ .gfa-screen-wide {
809
+ max-width: 1200px;
810
+ }
811
+
812
+ .gfa-media-search {
813
+ max-width: 320px;
814
+ margin-bottom: 16px;
815
+ }
816
+
817
+ .gfa-dropzone {
818
+ position: relative;
819
+ min-height: 160px;
820
+ padding: 12px;
821
+ border: 2px dashed transparent;
822
+ border-radius: var(--gfa-radius);
823
+ }
824
+
825
+ .gfa-dropzone-over {
826
+ border-color: var(--gfa-accent);
827
+ background: rgb(37 99 235 / 0.05);
828
+ }
829
+
830
+ .gfa-dropzone-hint {
831
+ position: absolute;
832
+ inset: auto 0 12px;
833
+ text-align: center;
834
+ font-weight: 600;
835
+ color: var(--gfa-accent);
836
+ }
837
+
838
+ .gfa-media-grid {
839
+ display: grid;
840
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
841
+ gap: 16px;
842
+ margin: 0;
843
+ padding: 0;
844
+ list-style: none;
845
+ }
846
+
847
+ .gfa-media-picker {
848
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
849
+ max-height: 50vh;
850
+ overflow: auto;
851
+ }
852
+
853
+ .gfa-media-card {
854
+ display: flex;
855
+ flex-direction: column;
856
+ gap: 8px;
857
+ padding: 8px;
858
+ background: var(--gfa-surface);
859
+ border: 1px solid var(--gfa-border);
860
+ border-radius: var(--gfa-radius);
861
+ }
862
+
863
+ .gfa-media-pick {
864
+ width: 100%;
865
+ font: inherit;
866
+ text-align: left;
867
+ cursor: pointer;
868
+ }
869
+
870
+ .gfa-media-pick:hover,
871
+ .gfa-media-pick:focus-visible {
872
+ border-color: var(--gfa-accent);
873
+ }
874
+
875
+ .gfa-media-thumb {
876
+ display: block;
877
+ width: 100%;
878
+ aspect-ratio: 4 / 3;
879
+ object-fit: contain;
880
+ background: repeating-conic-gradient(var(--gfa-checker) 0 25%, var(--gfa-checker-alt) 0 50%) 50% / 16px 16px;
881
+ border-radius: 4px;
882
+ }
883
+
884
+ .gfa-media-file {
885
+ display: grid;
886
+ place-items: center;
887
+ font-weight: 700;
888
+ color: var(--gfa-muted);
889
+ background: var(--gfa-bg);
890
+ }
891
+
892
+ .gfa-media-name {
893
+ overflow: hidden;
894
+ font-size: 13px;
895
+ text-overflow: ellipsis;
896
+ white-space: nowrap;
897
+ }
898
+
899
+ .gfa-media-actions {
900
+ display: flex;
901
+ flex-wrap: wrap;
902
+ gap: 4px;
903
+ }
904
+
905
+ .gfa-media-chooser {
906
+ display: flex;
907
+ align-items: center;
908
+ gap: 8px;
909
+ margin-top: 8px;
910
+ }
911
+
912
+ .gfa-media-chooser .gfa-media-chosen {
913
+ width: 72px;
914
+ flex-shrink: 0;
915
+ }
916
+
917
+ .gfa-media-chooser-actions {
918
+ display: flex;
919
+ flex-wrap: wrap;
920
+ gap: 4px;
921
+ }
922
+
923
+ .gfa-media-puck-field .gfa-media-chooser {
924
+ margin-top: 0;
925
+ padding: 0 16px 16px;
926
+ font:
927
+ 14px / 1.5 ui-sans-serif,
928
+ system-ui,
929
+ sans-serif;
930
+ }
931
+
932
+ .gfa-media-actions .gfa-button,
933
+ .gfa-media-chooser .gfa-button {
934
+ min-height: 30px;
935
+ padding: 0 10px;
936
+ font-size: 13px;
937
+ }
938
+
939
+ .gfa-font-picker {
940
+ position: relative;
941
+ }
942
+
943
+ .gfa-font-list {
944
+ position: absolute;
945
+ top: 100%;
946
+ left: 0;
947
+ right: 0;
948
+ z-index: 20;
949
+ max-height: 320px;
950
+ margin: 4px 0 0;
951
+ padding: 4px;
952
+ overflow-y: auto;
953
+ list-style: none;
954
+ border: 1px solid var(--gfa-border);
955
+ border-radius: var(--gfa-radius);
956
+ background: var(--gfa-surface);
957
+ box-shadow: 0 8px 24px rgb(15 23 42 / 0.12);
958
+ }
959
+
960
+ .gfa-font-option {
961
+ display: flex;
962
+ align-items: baseline;
963
+ justify-content: space-between;
964
+ gap: 12px;
965
+ padding: 8px 10px;
966
+ border-radius: 4px;
967
+ font-size: 17px;
968
+ cursor: pointer;
969
+ }
970
+
971
+ .gfa-font-option-active {
972
+ background: var(--gfa-bg);
973
+ }
974
+
975
+ .gfa-font-option[aria-selected="true"] {
976
+ font-weight: 600;
977
+ }
978
+
979
+ .gfa-font-category,
980
+ .gfa-font-empty {
981
+ color: var(--gfa-muted);
982
+ font-size: 13px;
983
+ font-weight: 400;
984
+ }
985
+
986
+ .gfa-font-empty {
987
+ padding: 8px 10px;
988
+ }
989
+
990
+ .gfa-block-list {
991
+ display: flex;
992
+ flex-direction: column;
993
+ max-width: 720px;
994
+ margin: 0;
995
+ padding: 0;
996
+ list-style: none;
997
+ border: 1px solid var(--gfa-border);
998
+ border-radius: var(--gfa-radius);
999
+ background: var(--gfa-surface);
1000
+ }
1001
+
1002
+ .gfa-block-row {
1003
+ display: flex;
1004
+ align-items: center;
1005
+ justify-content: space-between;
1006
+ gap: 12px;
1007
+ padding: 8px 12px;
1008
+ }
1009
+
1010
+ .gfa-block-row + .gfa-block-row {
1011
+ border-top: 1px solid var(--gfa-border);
1012
+ }
1013
+
1014
+ .gfa-block-grid {
1015
+ display: grid;
1016
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1017
+ gap: 16px;
1018
+ margin: 8px 0 0;
1019
+ padding: 0;
1020
+ list-style: none;
1021
+ }
1022
+
1023
+ .gfa-block-card {
1024
+ display: flex;
1025
+ flex-direction: column;
1026
+ align-items: flex-start;
1027
+ gap: 12px;
1028
+ padding: 16px;
1029
+ border: 1px solid var(--gfa-border);
1030
+ border-radius: var(--gfa-radius);
1031
+ background: var(--gfa-surface);
1032
+ }
1033
+
1034
+ .gfa-block-image {
1035
+ width: 100%;
1036
+ aspect-ratio: 16 / 9;
1037
+ object-fit: cover;
1038
+ object-position: top;
1039
+ border: 1px solid var(--gfa-border);
1040
+ border-radius: 4px;
1041
+ }
1042
+
1043
+ .gfa-block-text {
1044
+ flex: 1;
1045
+ }
1046
+
1047
+ .gfa-block-title {
1048
+ display: flex;
1049
+ flex-wrap: wrap;
1050
+ align-items: center;
1051
+ gap: 8px;
1052
+ margin: 0 0 4px;
1053
+ font-size: 16px;
1054
+ }
1055
+
1056
+ .gfa-badge {
1057
+ padding: 1px 8px;
1058
+ border-radius: 999px;
1059
+ background: var(--gfa-success-bg);
1060
+ color: var(--gfa-success-text);
1061
+ font-size: 12px;
1062
+ font-weight: 600;
1063
+ }
1064
+
1065
+ .gfa-block-added {
1066
+ color: var(--gfa-muted);
1067
+ font-size: 14px;
1068
+ font-weight: 600;
1069
+ }
1070
+
1071
+ .gfa-markdown-tabs {
1072
+ display: flex;
1073
+ gap: 4px;
1074
+ margin-bottom: 8px;
1075
+ }
1076
+
1077
+ .gfa-markdown-source {
1078
+ width: 100%;
1079
+ min-height: 24rem;
1080
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1081
+ font-size: 13px;
1082
+ line-height: 1.5;
1083
+ resize: vertical;
1084
+ }
1085
+
1086
+ /*
1087
+ * Items have no blocks, so the item editor leaves out Puck's Blocks and Outline
1088
+ * buttons, always the first two in its side bar (after the legacy side bar's,
1089
+ * which only shows on wide screens, when the AI assistant is off).
1090
+ */
1091
+ .gfa-editor-entry.gfa-editor-ai nav[class*="_Nav_"] > ul > li:nth-child(-n + 2),
1092
+ .gfa-editor-entry:not(.gfa-editor-ai) nav[class*="_Nav_"] > ul > li:nth-child(n + 2):nth-child(-n + 3) {
1093
+ display: none;
1094
+ }
1095
+
1096
+ /* The formatted editor is as tall as the Markdown one. */
1097
+ .gfa-markdown-formatted [class*="_RichTextEditor--editor_"] {
1098
+ min-height: 24rem;
1099
+ }
1100
+
1101
+ .gfa-block-pending {
1102
+ display: inline-flex;
1103
+ align-items: center;
1104
+ gap: 8px;
1105
+ }
1106
+
1107
+ /* Blocks marked to add or remove, published together. */
1108
+ .gfa-block-pending-bar {
1109
+ position: sticky;
1110
+ top: 0;
1111
+ z-index: 5;
1112
+ display: flex;
1113
+ flex-wrap: wrap;
1114
+ align-items: center;
1115
+ justify-content: space-between;
1116
+ gap: 12px;
1117
+ margin: 16px 0;
1118
+ padding: 12px 16px;
1119
+ background: var(--gfa-surface);
1120
+ border: 1px solid var(--gfa-accent);
1121
+ border-radius: var(--gfa-radius);
1122
+ }
1123
+
1124
+ .gfa-block-pending-bar ul {
1125
+ margin: 4px 0 0;
1126
+ padding-left: 20px;
1127
+ }
1128
+
1129
+ .gfa-block-pending-bar .gfa-dialog-actions {
1130
+ margin: 0;
1131
+ }
1132
+
1133
+ .gfa-code-editor .cm-editor {
1134
+ max-height: 70vh;
1135
+ }
1136
+
1137
+ /*
1138
+ * Puck's colors, dark when the admin panel is: its scales run the other way
1139
+ * round, so its light tints become dark ones. They override Puck's own, which
1140
+ * are in its puck-tokens layer. The canvas shows the site in its own colors.
1141
+ */
1142
+ :root {
1143
+ --puck-color-grey-01: light-dark(#181818, #f8fafc);
1144
+ --puck-color-grey-02: light-dark(#292929, #f1f5f9);
1145
+ --puck-color-grey-03: light-dark(#404040, #e2e8f0);
1146
+ --puck-color-grey-04: light-dark(#5a5a5a, #cbd5e1);
1147
+ --puck-color-grey-05: light-dark(#767676, #94a3b8);
1148
+ --puck-color-grey-06: light-dark(#949494, #7c8aa0);
1149
+ --puck-color-grey-07: light-dark(#ababab, #64748b);
1150
+ --puck-color-grey-08: light-dark(#c3c3c3, #475569);
1151
+ --puck-color-grey-09: light-dark(#dcdcdc, #334155);
1152
+ --puck-color-grey-10: light-dark(#efefef, #1e293b);
1153
+ --puck-color-grey-11: light-dark(#f5f5f5, #172033);
1154
+ --puck-color-grey-12: light-dark(#fafafa, #0f172a);
1155
+ --puck-color-azure-01: light-dark(#00175d, #eff6ff);
1156
+ --puck-color-azure-02: light-dark(#002c77, #dbeafe);
1157
+ --puck-color-azure-03: light-dark(#014292, #bfdbfe);
1158
+ --puck-color-azure-04: light-dark(#0158ad, #93c5fd);
1159
+ --puck-color-azure-05: light-dark(#3479be, #60a5fa);
1160
+ --puck-color-azure-06: light-dark(#6499cf, #3b82f6);
1161
+ --puck-color-azure-07: light-dark(#88b0da, #2563eb);
1162
+ --puck-color-azure-08: light-dark(#abc7e5, #1d4ed8);
1163
+ --puck-color-azure-09: light-dark(#cfdff0, #1e3a8a);
1164
+ --puck-color-azure-10: light-dark(#e7eef7, #172554);
1165
+ --puck-color-azure-11: light-dark(#f3f6fb, #111c3d);
1166
+ --puck-color-azure-12: light-dark(#f7faff, #0f1a33);
1167
+ --puck-color-rose-01: light-dark(#4a001c, #fef8fc);
1168
+ --puck-color-rose-02: light-dark(#670833, #faf4f8);
1169
+ --puck-color-rose-03: light-dark(#87114c, #f6eaf1);
1170
+ --puck-color-rose-04: light-dark(#a81a66, #efd6e3);
1171
+ --puck-color-rose-05: light-dark(#bc5089, #e3b8cf);
1172
+ --puck-color-rose-06: light-dark(#cc7ca5, #d89aba);
1173
+ --puck-color-rose-07: light-dark(#d89aba, #cc7ca5);
1174
+ --puck-color-rose-08: light-dark(#e3b8cf, #bc5089);
1175
+ --puck-color-rose-09: light-dark(#efd6e3, #a81a66);
1176
+ --puck-color-rose-10: light-dark(#f6eaf1, #87114c);
1177
+ --puck-color-rose-11: light-dark(#faf4f8, #670833);
1178
+ --puck-color-rose-12: light-dark(#fef8fc, #4a001c);
1179
+ --puck-color-green-01: light-dark(#002000, #f3fcf4);
1180
+ --puck-color-green-02: light-dark(#043604, #eff8f0);
1181
+ --puck-color-green-03: light-dark(#084e08, #ddf3e0);
1182
+ --puck-color-green-04: light-dark(#0c680c, #b8e8bf);
1183
+ --puck-color-green-05: light-dark(#1d882f, #7dd78b);
1184
+ --puck-color-green-06: light-dark(#2faa53, #56c16f);
1185
+ --puck-color-green-07: light-dark(#56c16f, #2faa53);
1186
+ --puck-color-green-08: light-dark(#7dd78b, #1d882f);
1187
+ --puck-color-green-09: light-dark(#b8e8bf, #0c680c);
1188
+ --puck-color-green-10: light-dark(#ddf3e0, #084e08);
1189
+ --puck-color-green-11: light-dark(#eff8f0, #043604);
1190
+ --puck-color-green-12: light-dark(#f3fcf4, #002000);
1191
+ --puck-color-yellow-01: light-dark(#211000, #fcfaf0);
1192
+ --puck-color-yellow-02: light-dark(#362700, #f9f7ed);
1193
+ --puck-color-yellow-03: light-dark(#4c4000, #f3efd9);
1194
+ --puck-color-yellow-04: light-dark(#645a00, #e6deb1);
1195
+ --puck-color-yellow-05: light-dark(#877614, #d4c474);
1196
+ --puck-color-yellow-06: light-dark(#ab9429, #bfac4e);
1197
+ --puck-color-yellow-07: light-dark(#bfac4e, #ab9429);
1198
+ --puck-color-yellow-08: light-dark(#d4c474, #877614);
1199
+ --puck-color-yellow-09: light-dark(#e6deb1, #645a00);
1200
+ --puck-color-yellow-10: light-dark(#f3efd9, #4c4000);
1201
+ --puck-color-yellow-11: light-dark(#f9f7ed, #362700);
1202
+ --puck-color-yellow-12: light-dark(#fcfaf0, #211000);
1203
+ --puck-color-red-01: light-dark(#4c0000, #fff9fa);
1204
+ --puck-color-red-02: light-dark(#6a0a10, #faf4f5);
1205
+ --puck-color-red-03: light-dark(#8a1422, #f6eaec);
1206
+ --puck-color-red-04: light-dark(#ac1f35, #efd7db);
1207
+ --puck-color-red-05: light-dark(#bf5366, #e4b9c2);
1208
+ --puck-color-red-06: light-dark(#ce7e8e, #d99ca8);
1209
+ --puck-color-red-07: light-dark(#d99ca8, #ce7e8e);
1210
+ --puck-color-red-08: light-dark(#e4b9c2, #bf5366);
1211
+ --puck-color-red-09: light-dark(#efd7db, #ac1f35);
1212
+ --puck-color-red-10: light-dark(#f6eaec, #8a1422);
1213
+ --puck-color-red-11: light-dark(#faf4f5, #6a0a10);
1214
+ --puck-color-red-12: light-dark(#fff9fa, #4c0000);
1215
+ --puck-color-black: light-dark(#000000, #f1f5f9);
1216
+ --puck-color-white: light-dark(#ffffff, #111827);
1217
+ }
1218
+
1219
+ .gfa-theme-menu {
1220
+ min-height: 32px;
1221
+ padding: 4px 8px;
1222
+ border: 1px solid var(--gfa-input-border);
1223
+ border-radius: var(--gfa-radius);
1224
+ background: var(--gfa-surface);
1225
+ color: var(--gfa-text);
1226
+ font: inherit;
1227
+ font-size: 14px;
1228
+ }