PluginProbe
GutSlider – All in One Slider and Carousel Blocks for Gutenberg / trunk
GutSlider – All in One Slider and Carousel Blocks for Gutenberg vtrunk
3.1.0 3.0.0 2.13.2 2.13.1 2.13.0 trunk 1.0.0 2.1.0 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.2.1 2.2.2 2.3.0 2.4.0 2.5.1 2.5.3 2.5.4 2.5.5 2.6.1 All 56 releases
slider-blocks / admin / css / admin.css

admin.css in GutSlider – All in One Slider and Carousel Blocks for Gutenberg trunk, at admin/css/admin.css

2,388 lines 47.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * GutSlider admin dashboard.
3 *
4 * A small design system: tokens, shell, cards, controls.
5 * Scoped under .gs-app so nothing leaks into wp-admin.
6 */
7
8 /* ------------------------------------------------------------------
9 * 1. Tokens
10 * ---------------------------------------------------------------- */
11
12 .gs-app {
13 /* Brand */
14 --gs-brand: #5325e8;
15 --gs-brand-hover: #451dcc;
16 --gs-brand-soft: #efebfe;
17 --gs-brand-line: #d9cffb;
18 --gs-brand-ring: rgba(83, 37, 232, 0.28);
19 --gs-brand-grad: linear-gradient(135deg, #6a45f0 0%, #5325e8 55%, #3f1bbd 100%);
20
21 /* Surfaces */
22 --gs-bg: #f4f5f8;
23 --gs-surface: #fff;
24 --gs-surface-2: #fafafc;
25 --gs-surface-sunk: #f1f2f7;
26
27 /* Lines */
28 --gs-line: #e4e6ec;
29 --gs-line-strong: #d3d7e0;
30
31 /* Text */
32 --gs-text: #12141c;
33 --gs-text-2: #5c6275;
34 --gs-text-3: #8a90a2;
35
36 /* Status */
37 --gs-ok: #12855a;
38 --gs-ok-soft: #e4f5ee;
39 --gs-danger: #c0362c;
40 --gs-danger-soft: #fdeceb;
41 --gs-gold: #b45309;
42 --gs-gold-soft: #fdf2e3;
43
44 /* Shape */
45 --gs-r-sm: 8px;
46 --gs-r-md: 10px;
47 --gs-r: 14px;
48 --gs-r-lg: 18px;
49 --gs-r-full: 999px;
50
51 /* Elevation */
52 --gs-shadow-sm: 0 1px 2px rgba(20, 22, 43, 0.05);
53 --gs-shadow: 0 1px 2px rgba(20, 22, 43, 0.05), 0 8px 24px -12px rgba(20, 22, 43, 0.16);
54 --gs-shadow-lg: 0 24px 60px -24px rgba(20, 22, 43, 0.3), 0 2px 6px rgba(20, 22, 43, 0.06);
55
56 /* Motion */
57 --gs-ease: cubic-bezier(0.32, 0.72, 0, 1);
58 --gs-fast: 140ms var(--gs-ease);
59 --gs-mid: 240ms var(--gs-ease);
60 }
61
62 .gs-app[data-gs-theme='dark'],
63 .gs-app.gs-dark {
64 --gs-brand: #9b83ff;
65 --gs-brand-hover: #b09dff;
66 --gs-brand-soft: #241f3d;
67 --gs-brand-line: #362f5c;
68 --gs-brand-ring: rgba(155, 131, 255, 0.35);
69 --gs-brand-grad: linear-gradient(135deg, #7a5df0 0%, #5f3fd8 55%, #4529ad 100%);
70
71 --gs-bg: #0e0f1a;
72 --gs-surface: #16182a;
73 --gs-surface-2: #1b1d31;
74 --gs-surface-sunk: #101223;
75
76 --gs-line: #262a44;
77 --gs-line-strong: #343956;
78
79 --gs-text: #f2f3fa;
80 --gs-text-2: #a5a9c4;
81 --gs-text-3: #767b9b;
82
83 --gs-ok: #48d39a;
84 --gs-ok-soft: #12281f;
85 --gs-danger: #ff8079;
86 --gs-danger-soft: #2c1917;
87 --gs-gold: #e0b055;
88 --gs-gold-soft: #2a2113;
89
90 --gs-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
91 --gs-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 10px 30px -14px rgba(0, 0, 0, 0.7);
92 --gs-shadow-lg: 0 28px 70px -28px rgba(0, 0, 0, 0.85), 0 2px 6px rgba(0, 0, 0, 0.4);
93 }
94
95 /* ------------------------------------------------------------------
96 * 2. wp-admin reset
97 * ---------------------------------------------------------------- */
98
99 body.gutslider-admin-page #wpcontent {
100 padding-left: 0;
101 }
102
103 body.gutslider-admin-page #wpbody-content {
104 padding-bottom: 0;
105 }
106
107 /* The shell prints its own footer bar, so the wp-admin one is redundant. */
108 body.gutslider-admin-page #wpfooter {
109 display: none;
110 }
111
112 /* Hide third-party nags printed outside our shell. Notices we render
113 inside .gs-app (settings errors, for example) are kept and restyled. */
114 body.gutslider-admin-page #wpbody-content > .notice,
115 body.gutslider-admin-page #wpbody-content > .update-nag,
116 body.gutslider-admin-page #wpbody-content > div.error,
117 body.gutslider-admin-page #wpbody-content > div.updated {
118 display: none;
119 }
120
121 body.gutslider-admin-page #wpbody-content > .notice.gs-keep {
122 display: block;
123 }
124
125 /* ------------------------------------------------------------------
126 * 3. Shell
127 * ---------------------------------------------------------------- */
128
129 .gs-app {
130 box-sizing: border-box;
131 display: flex;
132 flex-direction: column;
133 min-height: calc(100vh - 32px);
134 margin: 0;
135 background: var(--gs-bg);
136 color: var(--gs-text);
137 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, Roboto, 'Helvetica Neue', Arial, sans-serif;
138 font-size: 14px;
139 line-height: 1.6;
140 -webkit-font-smoothing: antialiased;
141 -moz-osx-font-smoothing: grayscale;
142 }
143
144 .gs-app *,
145 .gs-app *::before,
146 .gs-app *::after {
147 box-sizing: border-box;
148 }
149
150 .gs-app :focus-visible {
151 outline: 2px solid var(--gs-brand);
152 outline-offset: 2px;
153 border-radius: var(--gs-r-sm);
154 }
155
156 .gs-app :focus:not(:focus-visible) {
157 outline: none;
158 box-shadow: none;
159 }
160
161 /* Our components set display on a class, which outranks the UA's
162 [hidden] { display: none } attribute rule. Restore it. */
163 .gs-app [hidden] {
164 display: none;
165 }
166
167 .gs-shell {
168 width: 100%;
169 max-width: 1248px;
170 margin: 0 auto;
171 padding: 0 24px;
172 }
173
174 .gs-main {
175 display: block;
176 flex: 1 0 auto;
177 padding-bottom: 56px;
178 }
179
180 .gs-stack {
181 display: flex;
182 flex-direction: column;
183 gap: 40px;
184 }
185
186 .gs-stack--sm {
187 gap: 12px;
188 }
189
190 /* ------------------------------------------------------------------
191 * 4. Top bar
192 * ---------------------------------------------------------------- */
193
194 .gs-bar {
195 position: sticky;
196 top: 32px;
197 z-index: 40;
198 background: color-mix(in srgb, var(--gs-surface) 82%, transparent);
199 backdrop-filter: saturate(180%) blur(14px);
200 -webkit-backdrop-filter: saturate(180%) blur(14px);
201 border-bottom: 1px solid var(--gs-line);
202 }
203
204 @supports not (background: color-mix(in srgb, red 50%, blue)) {
205 .gs-bar {
206 background: var(--gs-surface);
207 }
208 }
209
210 /* Three tracks so the nav stays optically centred whatever flanks it. */
211 .gs-bar__inner {
212 display: grid;
213 grid-template-columns: 1fr auto 1fr;
214 align-items: center;
215 gap: 24px;
216 max-width: 1440px;
217 margin: 0 auto;
218 padding: 0 28px;
219 height: 60px;
220 }
221
222 .gs-brand {
223 display: flex;
224 align-items: center;
225 gap: 10px;
226 text-decoration: none;
227 color: var(--gs-text);
228 justify-self: start;
229 min-width: 0;
230 }
231
232 .gs-brand:hover,
233 .gs-brand:focus {
234 color: var(--gs-text);
235 }
236
237 .gs-brand__mark {
238 display: grid;
239 place-items: center;
240 width: 26px;
241 height: 26px;
242 flex-shrink: 0;
243 border-radius: var(--gs-r-sm);
244 background: var(--gs-brand);
245 color: #fff;
246 }
247
248 .gs-brand__mark svg {
249 width: 14px;
250 height: 14px;
251 display: block;
252 }
253
254 .gs-brand__name {
255 font-size: 15px;
256 font-weight: 650;
257 letter-spacing: -0.013em;
258 }
259
260 .gs-chip {
261 display: inline-flex;
262 align-items: center;
263 height: 20px;
264 padding: 0 7px;
265 border-radius: 6px;
266 font-size: 11px;
267 font-weight: 550;
268 letter-spacing: 0;
269 background: var(--gs-surface-2);
270 color: var(--gs-text-2);
271 border: 1px solid var(--gs-line);
272 }
273
274 .gs-chip--pro {
275 padding: 0 8px;
276 font-size: 10px;
277 font-weight: 700;
278 letter-spacing: 0.06em;
279 background: var(--gs-brand-soft);
280 color: var(--gs-brand);
281 border-color: transparent;
282 }
283
284 /* Nav */
285
286 .gs-nav {
287 display: flex;
288 align-items: center;
289 gap: 2px;
290 min-width: 0;
291 overflow-x: auto;
292 scrollbar-width: none;
293 }
294
295 .gs-nav::-webkit-scrollbar {
296 display: none;
297 }
298
299 .gs-nav__link {
300 position: relative;
301 display: inline-flex;
302 align-items: center;
303 height: 32px;
304 padding: 0 12px;
305 border-radius: var(--gs-r-sm);
306 font-size: 13.5px;
307 font-weight: 550;
308 text-decoration: none;
309 white-space: nowrap;
310 color: var(--gs-text-2);
311 transition:
312 color var(--gs-fast),
313 background var(--gs-fast);
314 }
315
316 .gs-nav__link:hover {
317 color: var(--gs-text);
318 background: var(--gs-surface-sunk);
319 }
320
321 .gs-nav__link.is-active {
322 color: var(--gs-brand);
323 background: var(--gs-brand-soft);
324 font-weight: 600;
325 }
326
327 .gs-bar__actions {
328 display: flex;
329 align-items: center;
330 gap: 8px;
331 justify-self: end;
332 }
333
334 .gs-icon-btn {
335 display: grid;
336 place-items: center;
337 width: 32px;
338 height: 32px;
339 padding: 0;
340 border: 1px solid var(--gs-line);
341 border-radius: var(--gs-r-sm);
342 background: var(--gs-surface);
343 color: var(--gs-text-2);
344 cursor: pointer;
345 text-decoration: none;
346 transition: all var(--gs-fast);
347 }
348
349 .gs-icon-btn:hover {
350 background: var(--gs-surface-2);
351 border-color: var(--gs-line-strong);
352 color: var(--gs-text);
353 }
354
355 .gs-icon {
356 width: 16px;
357 height: 16px;
358 flex-shrink: 0;
359 }
360
361 .gs-icon--moon {
362 display: none;
363 }
364
365 .gs-app[data-gs-theme='dark'] .gs-icon--sun {
366 display: none;
367 }
368
369 .gs-app[data-gs-theme='dark'] .gs-icon--moon {
370 display: block;
371 }
372
373 /* ------------------------------------------------------------------
374 * 5. Buttons & links
375 * ---------------------------------------------------------------- */
376
377 .gs-btn {
378 position: relative;
379 display: inline-flex;
380 align-items: center;
381 justify-content: center;
382 gap: 7px;
383 height: 36px;
384 padding: 0 14px;
385 border: 1px solid transparent;
386 border-radius: var(--gs-r-sm);
387 font-family: inherit;
388 font-size: 13.5px;
389 font-weight: 600;
390 line-height: 1;
391 text-decoration: none;
392 white-space: nowrap;
393 cursor: pointer;
394 transition:
395 transform var(--gs-fast),
396 background var(--gs-fast),
397 border-color var(--gs-fast),
398 color var(--gs-fast),
399 box-shadow var(--gs-fast);
400 }
401
402 .gs-btn:active {
403 transform: translateY(1px);
404 }
405
406 .gs-btn--sm {
407 height: 32px;
408 padding: 0 12px;
409 font-size: 12.5px;
410 }
411
412 .gs-btn--primary {
413 background: var(--gs-brand);
414 color: #fff;
415 box-shadow: 0 1px 2px rgba(18, 20, 28, 0.08);
416 }
417
418 .gs-btn--primary:hover,
419 .gs-btn--primary:focus {
420 background: var(--gs-brand-hover);
421 color: #fff;
422 }
423
424 .gs-btn--quiet {
425 background: var(--gs-surface);
426 border-color: var(--gs-line-strong);
427 color: var(--gs-text);
428 box-shadow: var(--gs-shadow-sm);
429 }
430
431 .gs-btn--quiet:hover,
432 .gs-btn--quiet:focus {
433 background: var(--gs-surface-2);
434 border-color: var(--gs-text-3);
435 color: var(--gs-text);
436 }
437
438 .gs-btn--ghost {
439 background: transparent;
440 color: var(--gs-text-2);
441 }
442
443 .gs-btn--ghost:hover,
444 .gs-btn--ghost:focus {
445 background: var(--gs-surface-sunk);
446 color: var(--gs-text);
447 }
448
449 .gs-btn--invert {
450 background: #fff;
451 color: #1d1638;
452 }
453
454 .gs-btn--invert:hover,
455 .gs-btn--invert:focus {
456 background: #f1eefc;
457 color: #1d1638;
458 }
459
460 .gs-btn[disabled],
461 .gs-btn.is-busy {
462 pointer-events: none;
463 opacity: 0.65;
464 }
465
466 .gs-btn__spinner {
467 display: none;
468 width: 14px;
469 height: 14px;
470 border-radius: 50%;
471 border: 2px solid currentcolor;
472 border-top-color: transparent;
473 animation: gs-spin 0.6s linear infinite;
474 }
475
476 .gs-btn.is-busy .gs-btn__spinner {
477 display: block;
478 }
479
480 .gs-btn.is-busy .gs-kbd {
481 display: none;
482 }
483
484 @keyframes gs-spin {
485 to {
486 transform: rotate(360deg);
487 }
488 }
489
490 .gs-link {
491 display: inline-flex;
492 align-items: center;
493 gap: 5px;
494 color: var(--gs-brand);
495 font-weight: 600;
496 font-size: 13px;
497 text-decoration: none;
498 transition: opacity var(--gs-fast);
499 }
500
501 .gs-link:hover,
502 .gs-link:focus {
503 color: var(--gs-brand-hover);
504 text-decoration: underline;
505 text-underline-offset: 3px;
506 }
507
508 .gs-link--sm {
509 font-size: 12.5px;
510 color: var(--gs-text-2);
511 font-weight: 550;
512 }
513
514 .gs-link--sm:hover {
515 color: var(--gs-brand);
516 }
517
518 .gs-kbd {
519 display: inline-flex;
520 align-items: center;
521 justify-content: center;
522 min-width: 20px;
523 height: 20px;
524 padding: 0 5px;
525 border-radius: 5px;
526 background: rgba(255, 255, 255, 0.18);
527 border: 1px solid rgba(255, 255, 255, 0.22);
528 font-family: inherit;
529 font-size: 11px;
530 font-weight: 600;
531 line-height: 1;
532 }
533
534 /* ------------------------------------------------------------------
535 * 6. Typography helpers
536 * ---------------------------------------------------------------- */
537
538 .gs-app h1,
539 .gs-app h2,
540 .gs-app h3 {
541 margin: 0;
542 color: var(--gs-text);
543 font-weight: 650;
544 letter-spacing: -0.02em;
545 line-height: 1.25;
546 }
547
548 .gs-app p {
549 margin: 0;
550 }
551
552 .gs-eyebrow {
553 display: inline-block;
554 font-size: 10.5px;
555 font-weight: 700;
556 letter-spacing: 0.08em;
557 text-transform: uppercase;
558 color: var(--gs-brand);
559 }
560
561 .gs-page-head {
562 display: flex;
563 align-items: flex-end;
564 justify-content: space-between;
565 gap: 24px;
566 flex-wrap: wrap;
567 padding-top: 40px;
568 }
569
570 .gs-page-head__actions {
571 display: flex;
572 align-items: center;
573 gap: 10px;
574 flex-wrap: wrap;
575 }
576
577 .gs-page-title {
578 font-size: 23px;
579 letter-spacing: -0.026em;
580 }
581
582 .gs-page-sub {
583 max-width: 68ch;
584 margin-top: 5px;
585 font-size: 13.5px;
586 color: var(--gs-text-2);
587 }
588
589 /* Status pill — licence state in the page header. */
590
591 .gs-pill {
592 display: inline-flex;
593 align-items: center;
594 gap: 7px;
595 padding: 7px 12px;
596 border-radius: var(--gs-r-full);
597 font-size: 12.5px;
598 font-weight: 550;
599 background: var(--gs-ok-soft);
600 color: var(--gs-ok);
601 }
602
603 .gs-pill__dot {
604 width: 7px;
605 height: 7px;
606 border-radius: 50%;
607 background: currentcolor;
608 }
609
610 .gs-pill--expiring {
611 background: var(--gs-gold-soft);
612 color: var(--gs-gold);
613 }
614
615 .gs-pill--inactive {
616 background: var(--gs-danger-soft);
617 color: var(--gs-danger);
618 }
619
620 .gs-count {
621 flex-shrink: 0;
622 padding: 6px 12px;
623 border-radius: var(--gs-r-full);
624 background: var(--gs-surface);
625 border: 1px solid var(--gs-line);
626 font-size: 12.5px;
627 font-weight: 600;
628 font-variant-numeric: tabular-nums;
629 color: var(--gs-text-2);
630 }
631
632 /* ------------------------------------------------------------------
633 * 7. Dashboard layout
634 * ---------------------------------------------------------------- */
635
636 .gs-page {
637 display: flex;
638 flex-direction: column;
639 gap: 22px;
640
641 /* Matches the top opening on the blocks and settings screens. */
642 padding-top: 40px;
643 padding-bottom: 40px;
644 }
645
646 .gs-page .gs-page-head {
647 padding-top: 0;
648 }
649
650 /* Top banner — licence prompts and similar, supplied by filter. */
651
652 .gs-banner {
653 display: flex;
654 align-items: center;
655 gap: 14px;
656 flex-wrap: wrap;
657 padding: 16px 18px;
658 border-radius: var(--gs-r);
659 border: 1px solid var(--gs-line);
660 background: var(--gs-surface);
661 box-shadow: var(--gs-shadow-sm);
662 }
663
664 .gs-banner__icon {
665 display: grid;
666 place-items: center;
667 width: 36px;
668 height: 36px;
669 flex-shrink: 0;
670 border-radius: var(--gs-r-sm);
671 border: 1px solid var(--gs-line);
672 background: var(--gs-brand-soft);
673 color: var(--gs-brand);
674 }
675
676 .gs-banner__text {
677 flex: 1;
678 min-width: 220px;
679 }
680
681 .gs-banner__title {
682 display: block;
683 font-size: 14px;
684 font-weight: 620;
685 color: var(--gs-text);
686 }
687
688 .gs-banner__sub {
689 margin-top: 2px;
690 font-size: 12.5px;
691 line-height: 1.5;
692 color: var(--gs-text-2);
693 }
694
695 /* Toned banners keep a hairline border tinted from their own accent, so the
696 edge reads as intentional rather than as a colour block on the page. */
697
698 .gs-banner--warning {
699 border-color: #f0ddc2;
700 border-color: color-mix(in srgb, var(--gs-gold) 20%, transparent);
701 background: var(--gs-gold-soft);
702 }
703
704 .gs-banner--warning .gs-banner__icon {
705 border-color: #f0ddc2;
706 border-color: color-mix(in srgb, var(--gs-gold) 20%, transparent);
707 background: var(--gs-surface);
708 color: var(--gs-gold);
709 }
710
711 .gs-banner--error {
712 border-color: #f7d7d4;
713 border-color: color-mix(in srgb, var(--gs-danger) 20%, transparent);
714 background: var(--gs-danger-soft);
715 }
716
717 .gs-banner--error .gs-banner__icon {
718 border-color: #f7d7d4;
719 border-color: color-mix(in srgb, var(--gs-danger) 20%, transparent);
720 background: var(--gs-surface);
721 color: var(--gs-danger);
722 }
723
724 .gs-banner--info {
725 border-color: var(--gs-brand-line);
726 background: var(--gs-brand-soft);
727 }
728
729 .gs-banner--info .gs-banner__icon {
730 border-color: var(--gs-brand-line);
731 background: var(--gs-surface);
732 }
733
734 /* Metric row */
735
736 .gs-metrics {
737 display: grid;
738 grid-template-columns: repeat(4, minmax(0, 1fr));
739 gap: 16px;
740 }
741
742 .gs-metric {
743 display: flex;
744 flex-direction: column;
745 gap: 10px;
746 padding: 18px;
747 border-radius: var(--gs-r);
748 background: var(--gs-surface);
749 border: 1px solid var(--gs-line);
750 }
751
752 .gs-metric__head {
753 display: flex;
754 align-items: center;
755 justify-content: space-between;
756 gap: 10px;
757 }
758
759 .gs-metric__label {
760 font-size: 12.5px;
761 font-weight: 550;
762 color: var(--gs-text-2);
763 }
764
765 .gs-metric__icon {
766 display: grid;
767 place-items: center;
768 width: 26px;
769 height: 26px;
770 flex-shrink: 0;
771 border-radius: 7px;
772 background: var(--gs-brand-soft);
773 color: var(--gs-brand);
774 }
775
776 .gs-metric__icon .gs-icon {
777 width: 14px;
778 height: 14px;
779 }
780
781 .gs-metric__value {
782 display: flex;
783 align-items: baseline;
784 gap: 6px;
785 font-size: 30px;
786 font-weight: 680;
787 line-height: 1;
788 letter-spacing: -0.033em;
789 font-variant-numeric: tabular-nums;
790 }
791
792 .gs-metric__unit {
793 font-size: 13px;
794 font-weight: 550;
795 letter-spacing: 0;
796 color: var(--gs-text-3);
797 }
798
799 .gs-metric__foot {
800 font-size: 12px;
801 color: var(--gs-text-3);
802 }
803
804 /* Two-column body */
805
806 .gs-cols {
807 display: grid;
808 grid-template-columns: minmax(0, 1fr) 372px;
809 align-items: start;
810 gap: 22px;
811 }
812
813 .gs-col {
814 display: flex;
815 flex-direction: column;
816 gap: 22px;
817 min-width: 0;
818 }
819
820 /* ------------------------------------------------------------------
821 * 8. Cards & grids
822 * ---------------------------------------------------------------- */
823
824 .gs-shell.gs-stack {
825 padding-top: 40px;
826 padding-bottom: 40px;
827 }
828
829 /* The stack already opens with 40px, so the head must not add its own. */
830 .gs-shell.gs-stack > .gs-page-head {
831 padding-top: 0;
832 }
833
834 .gs-grid {
835 display: grid;
836 gap: 16px;
837 }
838
839 .gs-grid--cards {
840 grid-template-columns: repeat(auto-fill, minmax(268px, 1fr));
841 }
842
843 /* ------------------------------------------------------------------
844 * 8. Cards
845 * ---------------------------------------------------------------- */
846
847 .gs-card {
848 display: flex;
849 flex-direction: column;
850 border-radius: var(--gs-r);
851 background: var(--gs-surface);
852 border: 1px solid var(--gs-line);
853 text-decoration: none;
854 color: inherit;
855 transition:
856 border-color var(--gs-mid),
857 box-shadow var(--gs-mid);
858 }
859
860 /* Flush cards let their header, list and footer own the edges. */
861 .gs-card--flush {
862 overflow: hidden;
863 }
864
865 .gs-card--pad {
866 gap: 16px;
867 padding: 18px;
868 }
869
870 .gs-card__head {
871 display: flex;
872 align-items: center;
873 justify-content: space-between;
874 gap: 16px;
875 padding: 16px 18px;
876 border-bottom: 1px solid var(--gs-line);
877 }
878
879 /* Inside a padded card the header is just the top row, not a band. */
880 .gs-card__head--plain {
881 padding: 0;
882 border-bottom: 0;
883 }
884
885 .gs-card__head--tight {
886 padding: 15px 18px 11px;
887 border-bottom: 0;
888 }
889
890 .gs-card__heading {
891 font-size: 15px;
892 font-weight: 620;
893 letter-spacing: -0.008em;
894 }
895
896 .gs-card__sub {
897 margin-top: 3px;
898 font-size: 12.5px;
899 line-height: 1.5;
900 color: var(--gs-text-3);
901 }
902
903 .gs-card__body {
904 display: flex;
905 flex-direction: column;
906 gap: 5px;
907 align-items: flex-start;
908 padding: 16px;
909 }
910
911 .gs-card__body .gs-card__sub {
912 color: var(--gs-text-2);
913 }
914
915 .gs-card__foot {
916 display: flex;
917 align-items: center;
918 justify-content: space-between;
919 gap: 16px;
920 flex-wrap: wrap;
921 padding: 13px 18px;
922 background: var(--gs-surface-2);
923 border-top: 1px solid var(--gs-line);
924 }
925
926 .gs-card__summary {
927 font-size: 12.5px;
928 color: var(--gs-text-2);
929 font-variant-numeric: tabular-nums;
930 }
931
932 .gs-card--link:hover,
933 .gs-card--link:focus {
934 border-color: var(--gs-brand);
935 box-shadow: var(--gs-shadow);
936 color: inherit;
937 }
938
939 /* ------------------------------------------------------------------
940 * 8b. Block rows
941 * ---------------------------------------------------------------- */
942
943 .gs-rows {
944 --gs-row-h: 62px;
945 --gs-row-gap: 8px;
946
947 display: flex;
948 flex-direction: column;
949 gap: var(--gs-row-gap);
950
951 /* Exactly five rows, then scroll — the card must not run the length
952 of the page. Scroll chaining is left alone so the wheel carries on
953 down the page once the list bottoms out. */
954 max-height: calc((5 * var(--gs-row-h)) + (4 * var(--gs-row-gap)) + 28px);
955 overflow-y: auto;
956 padding: 14px;
957 }
958
959 .gs-row {
960 display: flex;
961 align-items: center;
962 gap: 12px;
963 padding: 12px 16px;
964 border-radius: var(--gs-r-md);
965 background: var(--gs-surface);
966 border: 1px solid var(--gs-line);
967 transition:
968 border-color var(--gs-fast),
969 background var(--gs-fast);
970 }
971
972 .gs-row:hover {
973 border-color: var(--gs-line-strong);
974 }
975
976 .gs-row.is-dirty {
977 border-color: var(--gs-brand);
978 background: var(--gs-brand-soft);
979 }
980
981 .gs-row.is-hidden {
982 display: none;
983 }
984
985 .gs-row__icon {
986 display: grid;
987 place-items: center;
988 width: 34px;
989 height: 34px;
990 flex-shrink: 0;
991 border-radius: 9px;
992 background: var(--gs-brand-soft);
993 color: var(--gs-brand);
994 }
995
996 .gs-row__icon .gs-icon {
997 width: 17px;
998 height: 17px;
999 }
1000
1001 .gs-row__text {
1002 display: flex;
1003 flex-direction: column;
1004 gap: 2px;
1005 flex: 1;
1006 min-width: 0;
1007 }
1008
1009 /* Pinned line heights: the row must measure a predictable --gs-row-h so
1010 the list crops to a whole number of rows. */
1011 .gs-row__name {
1012 font-size: 13.5px;
1013 font-weight: 600;
1014 line-height: 18px;
1015 color: var(--gs-text);
1016 }
1017
1018 /* Off and locked blocks recede without disappearing. */
1019 .gs-row.is-off .gs-row__icon,
1020 .gs-row.is-locked .gs-row__icon {
1021 background: var(--gs-surface-2);
1022 color: var(--gs-text-3);
1023 }
1024
1025 .gs-row.is-off .gs-row__name,
1026 .gs-row.is-locked .gs-row__name {
1027 color: var(--gs-text-2);
1028 }
1029
1030 .gs-row__desc {
1031 font-size: 12px;
1032 line-height: 16px;
1033 color: var(--gs-text-3);
1034 overflow: hidden;
1035 text-overflow: ellipsis;
1036 white-space: nowrap;
1037 }
1038
1039 /* ------------------------------------------------------------------
1040 * 8c. Get started
1041 * ---------------------------------------------------------------- */
1042
1043 .gs-progress {
1044 display: flex;
1045 align-items: center;
1046 gap: 10px;
1047 flex-shrink: 0;
1048 }
1049
1050 .gs-progress__count {
1051 font-size: 12px;
1052 font-weight: 550;
1053 color: var(--gs-text-2);
1054 white-space: nowrap;
1055 }
1056
1057 .gs-progress__track {
1058 display: block;
1059 width: 96px;
1060 height: 6px;
1061 border-radius: var(--gs-r-full);
1062 background: var(--gs-line);
1063 overflow: hidden;
1064 }
1065
1066 .gs-progress__fill {
1067 display: block;
1068 height: 100%;
1069 border-radius: inherit;
1070 background: var(--gs-brand);
1071 transition: width 600ms var(--gs-ease);
1072 }
1073
1074 .gs-steps {
1075 display: grid;
1076 grid-template-columns: repeat(3, minmax(0, 1fr));
1077 gap: 12px;
1078 }
1079
1080 .gs-step {
1081 display: flex;
1082 flex-direction: column;
1083 align-items: flex-start;
1084 gap: 8px;
1085 padding: 14px;
1086 border-radius: var(--gs-r-md);
1087 background: var(--gs-surface-2);
1088 border: 1px solid var(--gs-line);
1089 }
1090
1091 .gs-step.is-done {
1092 background: var(--gs-brand-soft);
1093 border-color: var(--gs-brand-line);
1094 }
1095
1096 .gs-step__top {
1097 display: flex;
1098 align-items: center;
1099 gap: 8px;
1100 }
1101
1102 .gs-step__n {
1103 font-size: 12px;
1104 font-weight: 700;
1105 letter-spacing: 0.04em;
1106 color: var(--gs-text-3);
1107 font-variant-numeric: tabular-nums;
1108 }
1109
1110 .gs-step__check {
1111 display: grid;
1112 place-items: center;
1113 width: 18px;
1114 height: 18px;
1115 flex-shrink: 0;
1116 border-radius: 50%;
1117 background: var(--gs-brand);
1118 color: #fff;
1119 }
1120
1121 .gs-step__check .gs-icon {
1122 width: 11px;
1123 height: 11px;
1124 stroke-width: 3;
1125 }
1126
1127 .gs-step__title {
1128 font-size: 13.5px;
1129 font-weight: 600;
1130 }
1131
1132 .gs-step__text {
1133 font-size: 12.5px;
1134 line-height: 1.5;
1135 color: var(--gs-text-2);
1136 }
1137
1138 /* ------------------------------------------------------------------
1139 * 8d. Walkthrough
1140 * ---------------------------------------------------------------- */
1141
1142 .gs-video {
1143 position: relative;
1144 display: block;
1145 width: 100%;
1146 height: 196px;
1147 padding: 0;
1148 border: 0;
1149 background: #14152a;
1150 cursor: pointer;
1151 overflow: hidden;
1152 }
1153
1154 .gs-video__stage {
1155 position: absolute;
1156 inset: 0;
1157 display: flex;
1158 flex-direction: column;
1159 align-items: center;
1160 justify-content: center;
1161 gap: 14px;
1162 background:
1163 radial-gradient(ellipse 55% 60% at 50% 15%, rgba(83, 37, 232, 0.9) 0%, rgba(83, 37, 232, 0) 100%);
1164 }
1165
1166 .gs-video__slides {
1167 display: flex;
1168 align-items: center;
1169 gap: 8px;
1170 height: 104px;
1171 }
1172
1173 .gs-video__slide {
1174 width: 34px;
1175 height: 72px;
1176 border-radius: var(--gs-r-sm);
1177 background: rgba(255, 255, 255, 0.06);
1178 border: 1px solid rgba(255, 255, 255, 0.2);
1179 }
1180
1181 .gs-video__slide--main {
1182 width: 150px;
1183 height: 104px;
1184 background: rgba(255, 255, 255, 0.12);
1185 }
1186
1187 .gs-video__dots {
1188 display: flex;
1189 align-items: center;
1190 gap: 6px;
1191 }
1192
1193 .gs-video__dot {
1194 width: 6px;
1195 height: 6px;
1196 border-radius: 50%;
1197 background: rgba(255, 255, 255, 0.35);
1198 }
1199
1200 .gs-video__dot.is-active {
1201 background: #fff;
1202 }
1203
1204 .gs-video__play {
1205 position: absolute;
1206 top: 50%;
1207 left: 50%;
1208 display: grid;
1209 place-items: center;
1210 width: 52px;
1211 height: 52px;
1212 transform: translate(-50%, -50%);
1213 border-radius: 50%;
1214 background: rgba(255, 255, 255, 0.95);
1215 color: var(--gs-brand);
1216 box-shadow: 0 6px 20px rgba(11, 11, 20, 0.35);
1217 transition: transform var(--gs-mid);
1218 }
1219
1220 .gs-video__play .gs-icon {
1221 width: 19px;
1222 height: 19px;
1223 margin-left: 2px;
1224 }
1225
1226 .gs-video:hover .gs-video__play {
1227 transform: translate(-50%, -50%) scale(1.06);
1228 }
1229
1230 .gs-video iframe {
1231 position: absolute;
1232 inset: 0;
1233 width: 100%;
1234 height: 100%;
1235 border: 0;
1236 }
1237
1238 /* ------------------------------------------------------------------
1239 * 8e. What's new
1240 * ---------------------------------------------------------------- */
1241
1242 .gs-news {
1243 display: flex;
1244 flex-direction: column;
1245 gap: 12px;
1246 margin: 0;
1247 padding: 0;
1248 list-style: none;
1249 }
1250
1251 .gs-news__item {
1252 display: flex;
1253 align-items: flex-start;
1254 gap: 10px;
1255 margin: 0;
1256 }
1257
1258 .gs-news__text {
1259 flex: 1;
1260 font-size: 12.5px;
1261 line-height: 1.45;
1262 color: var(--gs-text-2);
1263 }
1264
1265 /* ------------------------------------------------------------------
1266 * 8f. Help & support
1267 * ---------------------------------------------------------------- */
1268
1269 .gs-help {
1270 display: flex;
1271 align-items: center;
1272 gap: 11px;
1273 padding: 12px 18px;
1274 border-top: 1px solid var(--gs-line);
1275 text-decoration: none;
1276 color: inherit;
1277 transition: background var(--gs-fast);
1278 }
1279
1280 .gs-help:hover,
1281 .gs-help:focus {
1282 background: var(--gs-surface-2);
1283 color: inherit;
1284 }
1285
1286 .gs-help__icon {
1287 display: grid;
1288 place-items: center;
1289 width: 30px;
1290 height: 30px;
1291 flex-shrink: 0;
1292 border-radius: var(--gs-r-sm);
1293 background: var(--gs-brand-soft);
1294 color: var(--gs-brand);
1295 }
1296
1297 .gs-help__icon .gs-icon {
1298 width: 15px;
1299 height: 15px;
1300 }
1301
1302 .gs-help__text {
1303 display: flex;
1304 flex-direction: column;
1305 gap: 2px;
1306 flex: 1;
1307 min-width: 0;
1308 }
1309
1310 .gs-help__title {
1311 font-size: 13px;
1312 font-weight: 600;
1313 }
1314
1315 .gs-help__sub {
1316 font-size: 12px;
1317 color: var(--gs-text-3);
1318 }
1319
1320 .gs-help__chevron {
1321 flex-shrink: 0;
1322 color: var(--gs-text-3);
1323 }
1324
1325 /* ------------------------------------------------------------------
1326 * 8g. More from the workshop
1327 * ---------------------------------------------------------------- */
1328
1329 .gs-workshop {
1330 display: flex;
1331 flex-direction: column;
1332 gap: 14px;
1333 padding-top: 12px;
1334 }
1335
1336 .gs-workshop__grid {
1337 display: grid;
1338 grid-template-columns: repeat(3, minmax(0, 1fr));
1339 align-items: stretch;
1340 gap: 16px;
1341 }
1342
1343 .gs-workshop__grid .gs-card {
1344 gap: 8px;
1345 }
1346
1347 .gs-product__top {
1348 display: flex;
1349 align-items: center;
1350 gap: 10px;
1351 }
1352
1353 .gs-product__title {
1354 font-size: 14px;
1355 font-weight: 600;
1356 color: var(--gs-text);
1357 }
1358
1359 /* ------------------------------------------------------------------
1360 * 8h. App footer
1361 * ---------------------------------------------------------------- */
1362
1363 .gs-appfoot {
1364 flex-shrink: 0;
1365 background: var(--gs-surface);
1366 border-top: 1px solid var(--gs-line);
1367 }
1368
1369 .gs-appfoot__inner {
1370 display: flex;
1371 align-items: center;
1372 justify-content: space-between;
1373 gap: 16px;
1374 flex-wrap: wrap;
1375 max-width: 1248px;
1376 margin: 0 auto;
1377 padding: 16px 24px;
1378 font-size: 12.5px;
1379 color: var(--gs-text-3);
1380 }
1381
1382 .gs-appfoot__link {
1383 color: var(--gs-text-2);
1384 }
1385
1386 .gs-appfoot__link:hover {
1387 color: var(--gs-brand);
1388 }
1389
1390 /* ------------------------------------------------------------------
1391 * 9. Blocks toolbar
1392 * ---------------------------------------------------------------- */
1393
1394 .gs-toolbar {
1395 position: sticky;
1396 top: 96px;
1397 z-index: 20;
1398 display: flex;
1399 align-items: center;
1400 gap: 12px;
1401 flex-wrap: wrap;
1402 padding: 12px;
1403 margin-top: -16px;
1404 border-radius: var(--gs-r);
1405 background: color-mix(in srgb, var(--gs-surface) 88%, transparent);
1406 backdrop-filter: saturate(180%) blur(12px);
1407 -webkit-backdrop-filter: saturate(180%) blur(12px);
1408 border: 1px solid var(--gs-line);
1409 box-shadow: var(--gs-shadow-sm);
1410 }
1411
1412 @supports not (background: color-mix(in srgb, red 50%, blue)) {
1413 .gs-toolbar {
1414 background: var(--gs-surface);
1415 }
1416 }
1417
1418 .gs-search {
1419 position: relative;
1420 display: flex;
1421 align-items: center;
1422 flex: 1 1 240px;
1423 min-width: 200px;
1424 }
1425
1426 .gs-search .gs-icon {
1427 position: absolute;
1428 left: 12px;
1429 color: var(--gs-text-3);
1430 pointer-events: none;
1431 }
1432
1433 /* Typed selector: wp-admin styles `input[type="search"]`, which would
1434 otherwise outrank a bare class and drop the padding for the icon. */
1435 input.gs-search__input {
1436 width: 100%;
1437 height: 38px;
1438 margin: 0;
1439 padding: 0 44px 0 36px;
1440 border: 1px solid var(--gs-line-strong);
1441 border-radius: var(--gs-r-sm);
1442 background: var(--gs-surface);
1443 color: var(--gs-text);
1444 font-family: inherit;
1445 font-size: 13.5px;
1446 line-height: 1;
1447 box-shadow: none;
1448 transition:
1449 border-color var(--gs-fast),
1450 box-shadow var(--gs-fast);
1451 -webkit-appearance: none;
1452 appearance: none;
1453 }
1454
1455 input.gs-search__input::placeholder {
1456 color: var(--gs-text-3);
1457 }
1458
1459 input.gs-search__input:focus {
1460 outline: none;
1461 border-color: var(--gs-brand);
1462 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1463 }
1464
1465 input.gs-search__input::-webkit-search-cancel-button {
1466 -webkit-appearance: none;
1467 }
1468
1469 .gs-search__kbd {
1470 position: absolute;
1471 right: 10px;
1472 background: var(--gs-surface-sunk);
1473 border-color: var(--gs-line);
1474 color: var(--gs-text-3);
1475 pointer-events: none;
1476 transition: opacity var(--gs-fast);
1477 }
1478
1479 .gs-search__input:focus ~ .gs-search__kbd,
1480 .gs-search__input:not(:placeholder-shown) ~ .gs-search__kbd {
1481 opacity: 0;
1482 }
1483
1484 /* Compact variant for card headers, where the field sits beside a title. */
1485 .gs-search--sm {
1486 flex: 0 0 220px;
1487 min-width: 0;
1488 }
1489
1490 .gs-search--sm .gs-icon {
1491 left: 10px;
1492 width: 14px;
1493 height: 14px;
1494 }
1495
1496 .gs-search--sm input.gs-search__input {
1497 height: 34px;
1498 padding: 0 12px 0 32px;
1499 border-color: var(--gs-line);
1500 background: var(--gs-surface-2);
1501 font-size: 13px;
1502 }
1503
1504 .gs-segment {
1505 display: inline-flex;
1506 gap: 2px;
1507 padding: 3px;
1508 border-radius: var(--gs-r-sm);
1509 background: var(--gs-surface-sunk);
1510 border: 1px solid var(--gs-line);
1511 }
1512
1513 .gs-segment__btn {
1514 height: 30px;
1515 padding: 0 12px;
1516 border: 0;
1517 border-radius: 6px;
1518 background: transparent;
1519 color: var(--gs-text-2);
1520 font-family: inherit;
1521 font-size: 12.5px;
1522 font-weight: 600;
1523 cursor: pointer;
1524 transition:
1525 background var(--gs-fast),
1526 color var(--gs-fast);
1527 }
1528
1529 .gs-segment__btn:hover {
1530 color: var(--gs-text);
1531 }
1532
1533 .gs-segment__btn.is-active {
1534 background: var(--gs-surface);
1535 color: var(--gs-text);
1536 box-shadow: var(--gs-shadow-sm);
1537 }
1538
1539 .gs-toolbar__actions {
1540 display: flex;
1541 gap: 8px;
1542 margin-left: auto;
1543 }
1544
1545 /* ------------------------------------------------------------------
1546 * 10. Block cards
1547 * ---------------------------------------------------------------- */
1548
1549 .gs-block {
1550 position: relative;
1551 display: flex;
1552 flex-direction: column;
1553 padding: 18px;
1554 border-radius: var(--gs-r);
1555 background: var(--gs-surface);
1556 border: 1px solid var(--gs-line);
1557 box-shadow: var(--gs-shadow-sm);
1558 transition:
1559 transform var(--gs-mid),
1560 box-shadow var(--gs-mid),
1561 border-color var(--gs-mid),
1562 opacity var(--gs-mid);
1563 }
1564
1565 .gs-block::before {
1566 content: '';
1567 position: absolute;
1568 inset: 0;
1569 border-radius: inherit;
1570 padding: 1px;
1571 background: var(--gs-brand-grad);
1572 -webkit-mask:
1573 linear-gradient(#000 0 0) content-box,
1574 linear-gradient(#000 0 0);
1575 -webkit-mask-composite: xor;
1576 mask:
1577 linear-gradient(#000 0 0) content-box,
1578 linear-gradient(#000 0 0);
1579 mask-composite: exclude;
1580 opacity: 0;
1581 transition: opacity var(--gs-mid);
1582 pointer-events: none;
1583 }
1584
1585 .gs-block:hover {
1586 transform: translateY(-2px);
1587 box-shadow: var(--gs-shadow);
1588 }
1589
1590 .gs-block:hover::before {
1591 opacity: 0.55;
1592 }
1593
1594 .gs-block.is-off {
1595 background: var(--gs-surface-2);
1596 }
1597
1598 .gs-block.is-off .gs-block__title,
1599 .gs-block.is-off .gs-block__text {
1600 opacity: 0.62;
1601 }
1602
1603 .gs-block.is-locked {
1604 background: var(--gs-surface-2);
1605 }
1606
1607 .gs-block.is-dirty {
1608 border-color: var(--gs-brand);
1609 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1610 }
1611
1612 .gs-block.is-hidden {
1613 display: none;
1614 }
1615
1616 .gs-block__head {
1617 display: flex;
1618 align-items: center;
1619 justify-content: space-between;
1620 gap: 10px;
1621 margin-bottom: 7px;
1622 }
1623
1624 .gs-block__title {
1625 font-size: 15px;
1626 font-weight: 640;
1627 }
1628
1629 .gs-block__text {
1630 flex: 1;
1631 font-size: 13px;
1632 line-height: 1.55;
1633 color: var(--gs-text-2);
1634 margin-bottom: 16px;
1635 }
1636
1637 .gs-block__foot {
1638 display: flex;
1639 align-items: center;
1640 justify-content: space-between;
1641 gap: 10px;
1642 padding-top: 14px;
1643 margin-top: 14px;
1644 border-top: 1px solid var(--gs-line);
1645 }
1646
1647 .gs-tag {
1648 display: inline-flex;
1649 align-items: center;
1650 flex-shrink: 0;
1651 height: 21px;
1652 padding: 0 8px;
1653 border-radius: 6px;
1654 background: var(--gs-surface-2);
1655 border: 1px solid var(--gs-line);
1656 font-size: 10.5px;
1657 font-weight: 600;
1658 letter-spacing: 0.03em;
1659 color: var(--gs-text-2);
1660 }
1661
1662 .gs-tag--pro {
1663 background: var(--gs-brand-soft);
1664 border-color: var(--gs-brand-line);
1665 color: var(--gs-brand);
1666 }
1667
1668 /* Release-note tags. */
1669
1670 .gs-tag--new {
1671 background: var(--gs-brand-soft);
1672 border-color: transparent;
1673 color: var(--gs-brand);
1674 }
1675
1676 .gs-tag--improved {
1677 background: var(--gs-ok-soft);
1678 border-color: transparent;
1679 color: var(--gs-ok);
1680 }
1681
1682 .gs-tag--fixed {
1683 background: var(--gs-gold-soft);
1684 border-color: transparent;
1685 color: var(--gs-gold);
1686 }
1687
1688 .gs-lock {
1689 display: inline-flex;
1690 align-items: center;
1691 justify-content: center;
1692 gap: 6px;
1693 height: 28px;
1694 min-width: 34px;
1695 padding: 0 9px;
1696 flex-shrink: 0;
1697 border-radius: var(--gs-r-full);
1698 background: var(--gs-surface-2);
1699 border: 1px solid var(--gs-line);
1700 color: var(--gs-text-3);
1701 font-size: 12px;
1702 font-weight: 650;
1703 text-decoration: none;
1704 transition: all var(--gs-fast);
1705 }
1706
1707 .gs-lock:hover,
1708 .gs-lock:focus {
1709 background: var(--gs-brand-soft);
1710 border-color: var(--gs-brand-line);
1711 color: var(--gs-brand);
1712 }
1713
1714 .gs-lock .gs-icon {
1715 width: 13px;
1716 height: 13px;
1717 }
1718
1719 /* ------------------------------------------------------------------
1720 * 11. Switch
1721 * ---------------------------------------------------------------- */
1722
1723 .gs-switch {
1724 position: relative;
1725 display: inline-flex;
1726 flex-shrink: 0;
1727 cursor: pointer;
1728 }
1729
1730 .gs-switch__input {
1731 position: absolute;
1732 width: 100%;
1733 height: 100%;
1734 margin: 0;
1735 opacity: 0;
1736 cursor: pointer;
1737 }
1738
1739 .gs-switch__track {
1740 display: block;
1741 width: 34px;
1742 height: 20px;
1743 padding: 2px;
1744 border-radius: var(--gs-r-full);
1745 background: var(--gs-line-strong);
1746 transition: background var(--gs-mid);
1747 }
1748
1749 .gs-switch__thumb {
1750 display: block;
1751 width: 16px;
1752 height: 16px;
1753 border-radius: 50%;
1754 background: #fff;
1755 box-shadow: 0 1px 2px rgba(18, 20, 28, 0.25);
1756 transform: translateX(0);
1757 transition: transform var(--gs-mid);
1758 }
1759
1760 .gs-switch__input:checked ~ .gs-switch__track {
1761 background: var(--gs-brand);
1762 }
1763
1764 .gs-switch__input:checked ~ .gs-switch__track .gs-switch__thumb {
1765 transform: translateX(14px);
1766 }
1767
1768 .gs-switch__input:focus-visible ~ .gs-switch__track {
1769 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1770 }
1771
1772 .gs-switch--lg .gs-switch__track {
1773 width: 48px;
1774 height: 27px;
1775 }
1776
1777 .gs-switch--lg .gs-switch__thumb {
1778 width: 21px;
1779 height: 21px;
1780 }
1781
1782 .gs-switch--lg .gs-switch__input:checked ~ .gs-switch__track .gs-switch__thumb {
1783 transform: translateX(21px);
1784 }
1785
1786 .gs-switch--danger .gs-switch__input:checked ~ .gs-switch__track {
1787 background: var(--gs-danger);
1788 }
1789
1790 /* ------------------------------------------------------------------
1791 * 12. Empty state & notes
1792 * ---------------------------------------------------------------- */
1793
1794 .gs-empty {
1795 display: flex;
1796 flex-direction: column;
1797 align-items: center;
1798 gap: 12px;
1799 padding: 56px 24px;
1800 border-radius: var(--gs-r);
1801 border: 1px dashed var(--gs-line-strong);
1802 color: var(--gs-text-3);
1803 text-align: center;
1804 }
1805
1806 .gs-empty .gs-icon {
1807 width: 28px;
1808 height: 28px;
1809 }
1810
1811 /* Inside a card the empty state is a quiet strip, not a dashed panel. */
1812 .gs-empty--sm {
1813 gap: 8px;
1814 padding: 28px 18px;
1815 border: 0;
1816 border-radius: 0;
1817 font-size: 13px;
1818 }
1819
1820 .gs-empty--sm .gs-icon {
1821 width: 20px;
1822 height: 20px;
1823 }
1824
1825 .gs-note {
1826 display: flex;
1827 align-items: flex-start;
1828 gap: 12px;
1829 padding: 16px 18px;
1830 border-radius: var(--gs-r);
1831 background: var(--gs-surface-2);
1832 border: 1px solid var(--gs-line);
1833 font-size: 13px;
1834 color: var(--gs-text-2);
1835 }
1836
1837 .gs-note .gs-icon {
1838 color: var(--gs-text-3);
1839 margin-top: 2px;
1840 }
1841
1842 .gs-note .gs-link {
1843 font-size: inherit;
1844 }
1845
1846 /* ------------------------------------------------------------------
1847 * 13. Settings
1848 * ---------------------------------------------------------------- */
1849
1850 .gs-settings {
1851 display: grid;
1852 grid-template-columns: 200px minmax(0, 1fr);
1853 gap: 32px;
1854 align-items: start;
1855 }
1856
1857 .gs-sidenav {
1858 position: sticky;
1859 top: 112px;
1860 display: flex;
1861 flex-direction: column;
1862 gap: 2px;
1863 }
1864
1865 .gs-sidenav__link {
1866 display: flex;
1867 align-items: center;
1868 gap: 10px;
1869 padding: 9px 12px;
1870 border-radius: var(--gs-r-sm);
1871 font-size: 13.5px;
1872 font-weight: 600;
1873 color: var(--gs-text-2);
1874 text-decoration: none;
1875 transition:
1876 background var(--gs-fast),
1877 color var(--gs-fast);
1878 }
1879
1880 .gs-sidenav__link:hover {
1881 background: var(--gs-surface-sunk);
1882 color: var(--gs-text);
1883 }
1884
1885 .gs-sidenav__link.is-active {
1886 background: var(--gs-brand-soft);
1887 color: var(--gs-brand);
1888 }
1889
1890 /* A single full-width column of panels. .gs-settings__body is the same
1891 thing sitting in the settings grid's content column. */
1892 .gs-panels,
1893 .gs-settings__body {
1894 display: flex;
1895 flex-direction: column;
1896 gap: 16px;
1897 min-width: 0;
1898 }
1899
1900 .gs-panel {
1901 padding: 24px;
1902 border-radius: var(--gs-r);
1903 background: var(--gs-surface);
1904 border: 1px solid var(--gs-line);
1905 box-shadow: var(--gs-shadow-sm);
1906 scroll-margin-top: 120px;
1907 }
1908
1909 .gs-panel__head {
1910 margin-bottom: 20px;
1911 }
1912
1913 .gs-panel__title {
1914 font-size: 16px;
1915 }
1916
1917 .gs-panel__sub {
1918 margin-top: 3px;
1919 font-size: 13px;
1920 color: var(--gs-text-2);
1921 }
1922
1923 .gs-field {
1924 display: grid;
1925 grid-template-columns: minmax(0, 1fr) auto;
1926 gap: 24px;
1927 align-items: center;
1928 padding: 18px 0;
1929 border-top: 1px solid var(--gs-line);
1930 }
1931
1932 .gs-field:first-of-type {
1933 border-top: 0;
1934 padding-top: 0;
1935 }
1936
1937 .gs-field:last-child {
1938 padding-bottom: 0;
1939 }
1940
1941 .gs-field__label label,
1942 .gs-field__name {
1943 display: block;
1944 font-size: 14px;
1945 font-weight: 620;
1946 color: var(--gs-text);
1947 }
1948
1949 .gs-field__help {
1950 max-width: 62ch;
1951 margin-top: 4px;
1952 font-size: 12.5px;
1953 line-height: 1.6;
1954 color: var(--gs-text-2);
1955 }
1956
1957 .gs-field--danger .gs-field__label label {
1958 color: var(--gs-danger);
1959 }
1960
1961 .gs-radio-cards {
1962 display: grid;
1963 grid-template-columns: repeat(2, minmax(150px, 1fr));
1964 gap: 10px;
1965 }
1966
1967 .gs-radio-card {
1968 position: relative;
1969 display: flex;
1970 align-items: flex-start;
1971 gap: 10px;
1972 padding: 13px 14px;
1973 border-radius: var(--gs-r-sm);
1974 background: var(--gs-surface);
1975 border: 1px solid var(--gs-line-strong);
1976 cursor: pointer;
1977 transition:
1978 border-color var(--gs-fast),
1979 background var(--gs-fast),
1980 box-shadow var(--gs-fast);
1981 }
1982
1983 .gs-radio-card input {
1984 position: absolute;
1985 opacity: 0;
1986 width: 0;
1987 height: 0;
1988 margin: 0;
1989 }
1990
1991 .gs-radio-card:hover {
1992 border-color: var(--gs-text-3);
1993 }
1994
1995 .gs-radio-card.is-active {
1996 border-color: var(--gs-brand);
1997 background: var(--gs-brand-soft);
1998 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1999 }
2000
2001 .gs-radio-card__body {
2002 display: flex;
2003 flex-direction: column;
2004 gap: 2px;
2005 }
2006
2007 .gs-radio-card__title {
2008 font-size: 13.5px;
2009 font-weight: 620;
2010 color: var(--gs-text);
2011 }
2012
2013 .gs-radio-card__text {
2014 font-size: 12px;
2015 color: var(--gs-text-2);
2016 }
2017
2018 .gs-radio-card__mark {
2019 width: 16px;
2020 height: 16px;
2021 margin-left: auto;
2022 flex-shrink: 0;
2023 border-radius: 50%;
2024 border: 2px solid var(--gs-line-strong);
2025 transition:
2026 border-color var(--gs-fast),
2027 box-shadow var(--gs-fast);
2028 }
2029
2030 .gs-radio-card.is-active .gs-radio-card__mark {
2031 border-color: var(--gs-brand);
2032 box-shadow:
2033 inset 0 0 0 3px var(--gs-surface),
2034 inset 0 0 0 10px var(--gs-brand);
2035 }
2036
2037 .gs-panel--info {
2038 background: var(--gs-surface-2);
2039 }
2040
2041 .gs-defs {
2042 display: grid;
2043 grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
2044 gap: 16px;
2045 margin: 0;
2046 }
2047
2048 .gs-defs > div {
2049 display: flex;
2050 flex-direction: column;
2051 gap: 2px;
2052 }
2053
2054 .gs-defs dt {
2055 font-size: 12px;
2056 font-weight: 600;
2057 color: var(--gs-text-3);
2058 }
2059
2060 .gs-defs dd {
2061 margin: 0;
2062 font-size: 14px;
2063 font-weight: 620;
2064 font-variant-numeric: tabular-nums;
2065 color: var(--gs-text);
2066 }
2067
2068 /* ------------------------------------------------------------------
2069 * 14. Save bar
2070 * ---------------------------------------------------------------- */
2071
2072 /* Kept in the layout so the slide-in can animate; visibility (rather than
2073 display) keeps it out of the accessibility tree while it is parked. */
2074 .gs-savebar {
2075 position: fixed;
2076 left: 50%;
2077 bottom: 28px;
2078 z-index: 60;
2079 transform: translate(-50%, 150%);
2080 transition:
2081 transform 380ms var(--gs-ease),
2082 opacity var(--gs-mid),
2083 visibility 0s linear 380ms;
2084 opacity: 0;
2085 visibility: hidden;
2086 }
2087
2088 .gs-savebar.is-visible {
2089 transform: translate(-50%, 0);
2090 opacity: 1;
2091 visibility: visible;
2092 transition-delay: 0s;
2093 }
2094
2095 .gs-savebar__inner {
2096 display: flex;
2097 align-items: center;
2098 gap: 14px;
2099 padding: 10px 10px 10px 18px;
2100 border-radius: var(--gs-r-full);
2101 background: #1a1c30;
2102 border: 1px solid rgba(255, 255, 255, 0.1);
2103 box-shadow: var(--gs-shadow-lg);
2104 color: #fff;
2105 }
2106
2107 .gs-app[data-gs-theme='dark'] .gs-savebar__inner {
2108 background: #23263e;
2109 }
2110
2111 .gs-savebar__dot {
2112 width: 8px;
2113 height: 8px;
2114 border-radius: 50%;
2115 background: #ffc25c;
2116 box-shadow: 0 0 0 0 rgba(255, 194, 92, 0.6);
2117 animation: gs-pulse 2.2s ease-out infinite;
2118 }
2119
2120 @keyframes gs-pulse {
2121 0% {
2122 box-shadow: 0 0 0 0 rgba(255, 194, 92, 0.6);
2123 }
2124
2125 70% {
2126 box-shadow: 0 0 0 8px rgba(255, 194, 92, 0);
2127 }
2128
2129 100% {
2130 box-shadow: 0 0 0 0 rgba(255, 194, 92, 0);
2131 }
2132 }
2133
2134 .gs-savebar__text {
2135 font-size: 13.5px;
2136 font-weight: 600;
2137 white-space: nowrap;
2138 font-variant-numeric: tabular-nums;
2139 }
2140
2141 .gs-savebar__actions {
2142 display: flex;
2143 align-items: center;
2144 gap: 6px;
2145 }
2146
2147 .gs-savebar .gs-btn--ghost {
2148 color: rgba(255, 255, 255, 0.62);
2149 height: 36px;
2150 }
2151
2152 .gs-savebar .gs-btn--ghost:hover {
2153 background: rgba(255, 255, 255, 0.1);
2154 color: #fff;
2155 }
2156
2157 .gs-savebar .gs-btn--primary {
2158 height: 36px;
2159 }
2160
2161 /* ------------------------------------------------------------------
2162 * 15. Toasts
2163 * ---------------------------------------------------------------- */
2164
2165 .gs-toasts {
2166 position: fixed;
2167 right: 24px;
2168 bottom: 24px;
2169 z-index: 70;
2170 display: flex;
2171 flex-direction: column;
2172 gap: 8px;
2173 pointer-events: none;
2174 }
2175
2176 .gs-toast {
2177 display: flex;
2178 align-items: center;
2179 gap: 10px;
2180 padding: 11px 16px;
2181 border-radius: var(--gs-r-full);
2182 background: var(--gs-surface);
2183 border: 1px solid var(--gs-line);
2184 box-shadow: var(--gs-shadow-lg);
2185 font-size: 13px;
2186 font-weight: 600;
2187 color: var(--gs-text);
2188 pointer-events: auto;
2189 animation: gs-toast-in 320ms var(--gs-ease);
2190 }
2191
2192 .gs-toast.is-out {
2193 animation: gs-toast-out 240ms var(--gs-ease) forwards;
2194 }
2195
2196 .gs-toast__icon {
2197 display: grid;
2198 place-items: center;
2199 width: 18px;
2200 height: 18px;
2201 border-radius: 50%;
2202 background: var(--gs-ok-soft);
2203 color: var(--gs-ok);
2204 flex-shrink: 0;
2205 }
2206
2207 .gs-toast__icon .gs-icon {
2208 width: 11px;
2209 height: 11px;
2210 }
2211
2212 .gs-toast--error .gs-toast__icon {
2213 background: var(--gs-danger-soft);
2214 color: var(--gs-danger);
2215 }
2216
2217 @keyframes gs-toast-in {
2218 from {
2219 opacity: 0;
2220 transform: translateY(12px) scale(0.96);
2221 }
2222
2223 to {
2224 opacity: 1;
2225 transform: translateY(0) scale(1);
2226 }
2227 }
2228
2229 @keyframes gs-toast-out {
2230 to {
2231 opacity: 0;
2232 transform: translateY(6px) scale(0.98);
2233 }
2234 }
2235
2236 /* ------------------------------------------------------------------
2237 * 16. Responsive
2238 * ---------------------------------------------------------------- */
2239
2240 @media (max-width: 1240px) {
2241 .gs-cols {
2242 grid-template-columns: minmax(0, 1fr);
2243 }
2244
2245 /* The sidebar cards read better side by side once they drop below. */
2246 .gs-col--side {
2247 display: grid;
2248 grid-template-columns: repeat(2, minmax(0, 1fr));
2249 align-items: start;
2250 }
2251 }
2252
2253 @media (max-width: 1100px) {
2254 .gs-metrics {
2255 grid-template-columns: repeat(2, minmax(0, 1fr));
2256 }
2257
2258 .gs-workshop__grid {
2259 grid-template-columns: repeat(2, minmax(0, 1fr));
2260 }
2261
2262 .gs-settings {
2263 grid-template-columns: 1fr;
2264 }
2265
2266 .gs-sidenav {
2267 position: static;
2268 flex-direction: row;
2269 overflow-x: auto;
2270 padding-bottom: 4px;
2271 }
2272 }
2273
2274 @media (max-width: 782px) {
2275 .gs-app {
2276 margin-left: -10px;
2277 min-height: calc(100vh - 46px);
2278 }
2279
2280 .gs-bar {
2281 top: 46px;
2282 }
2283
2284 /* Stack the three bar tracks: brand and actions share a row, the nav
2285 runs full width underneath. */
2286 .gs-bar__inner {
2287 height: auto;
2288 min-height: 60px;
2289 padding: 10px 16px;
2290 grid-template-columns: minmax(0, 1fr) auto;
2291 gap: 10px;
2292 }
2293
2294 .gs-nav {
2295 order: 3;
2296 grid-column: 1 / -1;
2297 }
2298
2299 .gs-shell {
2300 padding: 0 16px;
2301 }
2302
2303 .gs-appfoot__inner {
2304 padding: 16px;
2305 }
2306
2307 .gs-toolbar {
2308 position: static;
2309 margin-top: 0;
2310 }
2311
2312 .gs-toolbar__actions {
2313 margin-left: 0;
2314 width: 100%;
2315 }
2316
2317 .gs-toolbar__actions .gs-btn {
2318 flex: 1;
2319 }
2320
2321 .gs-metrics,
2322 .gs-steps,
2323 .gs-workshop__grid,
2324 .gs-col--side,
2325 .gs-radio-cards {
2326 grid-template-columns: 1fr;
2327 }
2328
2329 .gs-card__head {
2330 flex-direction: column;
2331 align-items: stretch;
2332 }
2333
2334 .gs-search--sm {
2335 flex: 1 1 auto;
2336 }
2337
2338 .gs-row__desc {
2339 white-space: normal;
2340 }
2341
2342 .gs-field {
2343 grid-template-columns: 1fr;
2344 gap: 14px;
2345 align-items: start;
2346 }
2347
2348 .gs-savebar {
2349 left: 16px;
2350 right: 16px;
2351 bottom: 16px;
2352 transform: translateY(150%);
2353 }
2354
2355 .gs-savebar.is-visible {
2356 transform: translateY(0);
2357 }
2358
2359 .gs-savebar__inner {
2360 justify-content: space-between;
2361 }
2362
2363 .gs-savebar .gs-kbd {
2364 display: none;
2365 }
2366
2367 .gs-toasts {
2368 left: 16px;
2369 right: 16px;
2370 bottom: 84px;
2371 align-items: center;
2372 }
2373 }
2374
2375 /* ------------------------------------------------------------------
2376 * 17. Motion preferences
2377 * ---------------------------------------------------------------- */
2378
2379 @media (prefers-reduced-motion: reduce) {
2380 .gs-app *,
2381 .gs-app *::before,
2382 .gs-app *::after {
2383 animation-duration: 0.01ms !important;
2384 animation-iteration-count: 1 !important;
2385 transition-duration: 0.01ms !important;
2386 }
2387 }
2388