PluginProbe
GutSlider – All in One Slider and Carousel Blocks for Gutenberg / 3.0.0
GutSlider – All in One Slider and Carousel Blocks for Gutenberg v3.0.0
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 3.0.0, at admin/css/admin.css

1,915 lines 37.9 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: #5034c5;
15 --gs-brand-hover: #4229ad;
16 --gs-brand-soft: #efecfd;
17 --gs-brand-ring: rgba(80, 52, 197, 0.28);
18 --gs-brand-grad: linear-gradient(135deg, #6a4be0 0%, #5034c5 55%, #3f27a6 100%);
19
20 /* Surfaces */
21 --gs-bg: #f6f7fb;
22 --gs-surface: #fff;
23 --gs-surface-2: #fbfbfe;
24 --gs-surface-sunk: #f1f2f7;
25
26 /* Lines */
27 --gs-line: #e7e8ef;
28 --gs-line-strong: #d8dae4;
29
30 /* Text */
31 --gs-text: #14162b;
32 --gs-text-2: #5c6079;
33 --gs-text-3: #8b8fa6;
34
35 /* Status */
36 --gs-ok: #12855a;
37 --gs-ok-soft: #e6f6ef;
38 --gs-danger: #c0362c;
39 --gs-danger-soft: #fdeceb;
40 --gs-gold: #b7791f;
41 --gs-gold-soft: #fdf3e0;
42
43 /* Shape */
44 --gs-r-sm: 8px;
45 --gs-r: 12px;
46 --gs-r-lg: 18px;
47 --gs-r-full: 999px;
48
49 /* Elevation */
50 --gs-shadow-sm: 0 1px 2px rgba(20, 22, 43, 0.05);
51 --gs-shadow: 0 1px 2px rgba(20, 22, 43, 0.05), 0 8px 24px -12px rgba(20, 22, 43, 0.16);
52 --gs-shadow-lg: 0 24px 60px -24px rgba(20, 22, 43, 0.3), 0 2px 6px rgba(20, 22, 43, 0.06);
53
54 /* Motion */
55 --gs-ease: cubic-bezier(0.32, 0.72, 0, 1);
56 --gs-fast: 140ms var(--gs-ease);
57 --gs-mid: 240ms var(--gs-ease);
58 }
59
60 .gs-app[data-gs-theme='dark'],
61 .gs-app.gs-dark {
62 --gs-brand: #8d76ff;
63 --gs-brand-hover: #a08fff;
64 --gs-brand-soft: #241f3d;
65 --gs-brand-ring: rgba(141, 118, 255, 0.35);
66 --gs-brand-grad: linear-gradient(135deg, #6f56e8 0%, #5b3fd0 55%, #43299f 100%);
67
68 --gs-bg: #0e0f1a;
69 --gs-surface: #16182a;
70 --gs-surface-2: #1b1d31;
71 --gs-surface-sunk: #101223;
72
73 --gs-line: #262a44;
74 --gs-line-strong: #343956;
75
76 --gs-text: #f2f3fa;
77 --gs-text-2: #a5a9c4;
78 --gs-text-3: #767b9b;
79
80 --gs-ok: #48d39a;
81 --gs-ok-soft: #12281f;
82 --gs-danger: #ff8079;
83 --gs-danger-soft: #2c1917;
84 --gs-gold: #e0b055;
85 --gs-gold-soft: #2a2113;
86
87 --gs-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
88 --gs-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 10px 30px -14px rgba(0, 0, 0, 0.7);
89 --gs-shadow-lg: 0 28px 70px -28px rgba(0, 0, 0, 0.85), 0 2px 6px rgba(0, 0, 0, 0.4);
90 }
91
92 /* ------------------------------------------------------------------
93 * 2. wp-admin reset
94 * ---------------------------------------------------------------- */
95
96 body.gutslider-admin-page #wpcontent {
97 padding-left: 0;
98 }
99
100 body.gutslider-admin-page #wpbody-content {
101 padding-bottom: 0;
102 }
103
104 body.gutslider-admin-page #wpfooter {
105 padding-left: 24px;
106 padding-right: 24px;
107 }
108
109 /* Hide third-party nags printed outside our shell. Notices we render
110 inside .gs-app (settings errors, for example) are kept and restyled. */
111 body.gutslider-admin-page #wpbody-content > .notice,
112 body.gutslider-admin-page #wpbody-content > .update-nag,
113 body.gutslider-admin-page #wpbody-content > div.error,
114 body.gutslider-admin-page #wpbody-content > div.updated {
115 display: none;
116 }
117
118 body.gutslider-admin-page #wpbody-content > .notice.gs-keep {
119 display: block;
120 }
121
122 /* ------------------------------------------------------------------
123 * 3. Shell
124 * ---------------------------------------------------------------- */
125
126 .gs-app {
127 box-sizing: border-box;
128 min-height: calc(100vh - 32px);
129 margin: 0;
130 padding-bottom: 96px;
131 background: var(--gs-bg);
132 color: var(--gs-text);
133 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, Roboto, 'Helvetica Neue', Arial, sans-serif;
134 font-size: 14px;
135 line-height: 1.6;
136 -webkit-font-smoothing: antialiased;
137 -moz-osx-font-smoothing: grayscale;
138 }
139
140 .gs-app *,
141 .gs-app *::before,
142 .gs-app *::after {
143 box-sizing: border-box;
144 }
145
146 .gs-app :focus-visible {
147 outline: 2px solid var(--gs-brand);
148 outline-offset: 2px;
149 border-radius: var(--gs-r-sm);
150 }
151
152 .gs-app :focus:not(:focus-visible) {
153 outline: none;
154 box-shadow: none;
155 }
156
157 /* Our components set display on a class, which outranks the UA's
158 [hidden] { display: none } attribute rule. Restore it. */
159 .gs-app [hidden] {
160 display: none;
161 }
162
163 .gs-shell {
164 width: 100%;
165 max-width: 1240px;
166 margin: 0 auto;
167 padding: 0 24px;
168 }
169
170 .gs-main {
171 display: block;
172 }
173
174 .gs-stack {
175 display: flex;
176 flex-direction: column;
177 gap: 40px;
178 }
179
180 .gs-stack--sm {
181 gap: 12px;
182 }
183
184 /* ------------------------------------------------------------------
185 * 4. Top bar
186 * ---------------------------------------------------------------- */
187
188 .gs-bar {
189 position: sticky;
190 top: 32px;
191 z-index: 40;
192 background: color-mix(in srgb, var(--gs-surface) 82%, transparent);
193 backdrop-filter: saturate(180%) blur(14px);
194 -webkit-backdrop-filter: saturate(180%) blur(14px);
195 border-bottom: 1px solid var(--gs-line);
196 }
197
198 @supports not (background: color-mix(in srgb, red 50%, blue)) {
199 .gs-bar {
200 background: var(--gs-surface);
201 }
202 }
203
204 .gs-bar__inner {
205 display: flex;
206 align-items: center;
207 gap: 24px;
208 max-width: 1240px;
209 margin: 0 auto;
210 padding: 0 24px;
211 height: 64px;
212 }
213
214 .gs-brand {
215 display: flex;
216 align-items: center;
217 gap: 10px;
218 text-decoration: none;
219 color: var(--gs-text);
220 flex-shrink: 0;
221 }
222
223 .gs-brand:hover,
224 .gs-brand:focus {
225 color: var(--gs-text);
226 }
227
228 .gs-brand__mark {
229 display: grid;
230 place-items: center;
231 width: 32px;
232 height: 32px;
233 border-radius: var(--gs-r-sm);
234 background: var(--gs-brand-grad);
235 color: #fff;
236 box-shadow: 0 4px 12px -4px var(--gs-brand-ring);
237 }
238
239 .gs-brand__mark svg {
240 width: 17px;
241 height: 17px;
242 display: block;
243 }
244
245 .gs-brand__text {
246 display: flex;
247 align-items: center;
248 gap: 8px;
249 }
250
251 .gs-brand__name {
252 font-size: 15px;
253 font-weight: 650;
254 letter-spacing: -0.01em;
255 }
256
257 .gs-chip {
258 display: inline-flex;
259 align-items: center;
260 height: 20px;
261 padding: 0 8px;
262 border-radius: var(--gs-r-full);
263 font-size: 11px;
264 font-weight: 600;
265 letter-spacing: 0.02em;
266 background: var(--gs-surface-sunk);
267 color: var(--gs-text-3);
268 border: 1px solid var(--gs-line);
269 }
270
271 .gs-chip--pro {
272 background: var(--gs-brand-grad);
273 color: #fff;
274 border-color: transparent;
275 }
276
277 /* Nav */
278
279 .gs-nav {
280 display: flex;
281 align-items: center;
282 gap: 2px;
283 flex: 1;
284 min-width: 0;
285 overflow-x: auto;
286 scrollbar-width: none;
287 }
288
289 .gs-nav::-webkit-scrollbar {
290 display: none;
291 }
292
293 .gs-nav__link {
294 position: relative;
295 display: inline-flex;
296 align-items: center;
297 height: 34px;
298 padding: 0 14px;
299 border-radius: var(--gs-r-sm);
300 font-size: 13.5px;
301 font-weight: 550;
302 text-decoration: none;
303 white-space: nowrap;
304 color: var(--gs-text-2);
305 transition:
306 color var(--gs-fast),
307 background var(--gs-fast);
308 }
309
310 .gs-nav__link:hover {
311 color: var(--gs-text);
312 background: var(--gs-surface-sunk);
313 }
314
315 .gs-nav__link.is-active {
316 color: var(--gs-brand);
317 background: var(--gs-brand-soft);
318 }
319
320 .gs-bar__actions {
321 display: flex;
322 align-items: center;
323 gap: 8px;
324 flex-shrink: 0;
325 }
326
327 .gs-icon-btn {
328 display: grid;
329 place-items: center;
330 width: 34px;
331 height: 34px;
332 padding: 0;
333 border: 1px solid transparent;
334 border-radius: var(--gs-r-sm);
335 background: transparent;
336 color: var(--gs-text-2);
337 cursor: pointer;
338 text-decoration: none;
339 transition: all var(--gs-fast);
340 }
341
342 .gs-icon-btn:hover {
343 background: var(--gs-surface-sunk);
344 border-color: var(--gs-line);
345 color: var(--gs-text);
346 }
347
348 .gs-icon {
349 width: 16px;
350 height: 16px;
351 flex-shrink: 0;
352 }
353
354 .gs-icon--moon {
355 display: none;
356 }
357
358 .gs-app[data-gs-theme='dark'] .gs-icon--sun {
359 display: none;
360 }
361
362 .gs-app[data-gs-theme='dark'] .gs-icon--moon {
363 display: block;
364 }
365
366 /* ------------------------------------------------------------------
367 * 5. Buttons & links
368 * ---------------------------------------------------------------- */
369
370 .gs-btn {
371 position: relative;
372 display: inline-flex;
373 align-items: center;
374 justify-content: center;
375 gap: 8px;
376 height: 40px;
377 padding: 0 18px;
378 border: 1px solid transparent;
379 border-radius: var(--gs-r-sm);
380 font-family: inherit;
381 font-size: 13.5px;
382 font-weight: 600;
383 line-height: 1;
384 text-decoration: none;
385 white-space: nowrap;
386 cursor: pointer;
387 transition:
388 transform var(--gs-fast),
389 background var(--gs-fast),
390 border-color var(--gs-fast),
391 color var(--gs-fast),
392 box-shadow var(--gs-fast);
393 }
394
395 .gs-btn:active {
396 transform: translateY(1px);
397 }
398
399 .gs-btn--sm {
400 height: 32px;
401 padding: 0 12px;
402 font-size: 12.5px;
403 }
404
405 .gs-btn--primary {
406 background: var(--gs-brand);
407 color: #fff;
408 box-shadow:
409 0 1px 2px rgba(20, 22, 43, 0.12),
410 0 6px 16px -8px var(--gs-brand-ring);
411 }
412
413 .gs-btn--primary:hover,
414 .gs-btn--primary:focus {
415 background: var(--gs-brand-hover);
416 color: #fff;
417 }
418
419 .gs-btn--quiet {
420 background: var(--gs-surface);
421 border-color: var(--gs-line-strong);
422 color: var(--gs-text);
423 box-shadow: var(--gs-shadow-sm);
424 }
425
426 .gs-btn--quiet:hover,
427 .gs-btn--quiet:focus {
428 background: var(--gs-surface-2);
429 border-color: var(--gs-text-3);
430 color: var(--gs-text);
431 }
432
433 .gs-btn--ghost {
434 background: transparent;
435 color: var(--gs-text-2);
436 }
437
438 .gs-btn--ghost:hover,
439 .gs-btn--ghost:focus {
440 background: var(--gs-surface-sunk);
441 color: var(--gs-text);
442 }
443
444 .gs-btn--invert {
445 background: #fff;
446 color: #1d1638;
447 }
448
449 .gs-btn--invert:hover,
450 .gs-btn--invert:focus {
451 background: #f1eefc;
452 color: #1d1638;
453 }
454
455 .gs-btn[disabled],
456 .gs-btn.is-busy {
457 pointer-events: none;
458 opacity: 0.65;
459 }
460
461 .gs-btn__spinner {
462 display: none;
463 width: 14px;
464 height: 14px;
465 border-radius: 50%;
466 border: 2px solid currentcolor;
467 border-top-color: transparent;
468 animation: gs-spin 0.6s linear infinite;
469 }
470
471 .gs-btn.is-busy .gs-btn__spinner {
472 display: block;
473 }
474
475 .gs-btn.is-busy .gs-kbd {
476 display: none;
477 }
478
479 @keyframes gs-spin {
480 to {
481 transform: rotate(360deg);
482 }
483 }
484
485 .gs-link {
486 display: inline-flex;
487 align-items: center;
488 gap: 5px;
489 color: var(--gs-brand);
490 font-weight: 600;
491 font-size: 13px;
492 text-decoration: none;
493 transition: opacity var(--gs-fast);
494 }
495
496 .gs-link:hover,
497 .gs-link:focus {
498 color: var(--gs-brand-hover);
499 text-decoration: underline;
500 text-underline-offset: 3px;
501 }
502
503 .gs-link--sm {
504 font-size: 12.5px;
505 color: var(--gs-text-2);
506 font-weight: 550;
507 }
508
509 .gs-link--sm:hover {
510 color: var(--gs-brand);
511 }
512
513 .gs-kbd {
514 display: inline-flex;
515 align-items: center;
516 justify-content: center;
517 min-width: 20px;
518 height: 20px;
519 padding: 0 5px;
520 border-radius: 5px;
521 background: rgba(255, 255, 255, 0.18);
522 border: 1px solid rgba(255, 255, 255, 0.22);
523 font-family: inherit;
524 font-size: 11px;
525 font-weight: 600;
526 line-height: 1;
527 }
528
529 /* ------------------------------------------------------------------
530 * 6. Typography helpers
531 * ---------------------------------------------------------------- */
532
533 .gs-app h1,
534 .gs-app h2,
535 .gs-app h3 {
536 margin: 0;
537 color: var(--gs-text);
538 font-weight: 650;
539 letter-spacing: -0.02em;
540 line-height: 1.25;
541 }
542
543 .gs-app p {
544 margin: 0;
545 }
546
547 .gs-eyebrow {
548 display: inline-block;
549 margin-bottom: 14px;
550 font-size: 11.5px;
551 font-weight: 700;
552 letter-spacing: 0.09em;
553 text-transform: uppercase;
554 color: var(--gs-brand);
555 }
556
557 .gs-eyebrow--light {
558 color: rgba(255, 255, 255, 0.72);
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-title {
571 font-size: 26px;
572 }
573
574 .gs-page-sub {
575 max-width: 62ch;
576 margin-top: 6px;
577 color: var(--gs-text-2);
578 }
579
580 .gs-count {
581 flex-shrink: 0;
582 padding: 6px 12px;
583 border-radius: var(--gs-r-full);
584 background: var(--gs-surface);
585 border: 1px solid var(--gs-line);
586 font-size: 12.5px;
587 font-weight: 600;
588 font-variant-numeric: tabular-nums;
589 color: var(--gs-text-2);
590 }
591
592 .gs-section__head {
593 margin-bottom: 20px;
594 }
595
596 .gs-section__title {
597 font-size: 19px;
598 }
599
600 .gs-section__sub {
601 margin-top: 4px;
602 color: var(--gs-text-2);
603 }
604
605 /* ------------------------------------------------------------------
606 * 7. Hero
607 * ---------------------------------------------------------------- */
608
609 .gs-hero {
610 position: relative;
611 overflow: hidden;
612 padding: 56px 0 52px;
613 background: var(--gs-surface);
614 border-bottom: 1px solid var(--gs-line);
615 }
616
617 .gs-hero::before {
618 content: '';
619 position: absolute;
620 top: -180px;
621 right: -120px;
622 width: 520px;
623 height: 520px;
624 border-radius: 50%;
625 background: radial-gradient(circle, var(--gs-brand-ring) 0%, transparent 68%);
626 opacity: 0.55;
627 pointer-events: none;
628 }
629
630 .gs-hero__grid {
631 position: relative;
632 display: grid;
633 grid-template-columns: minmax(0, 1.15fr) minmax(300px, 0.85fr);
634 gap: 48px;
635 align-items: center;
636 }
637
638 .gs-hero__title {
639 font-size: clamp(28px, 3.4vw, 40px);
640 letter-spacing: -0.03em;
641 }
642
643 .gs-hero__lead {
644 max-width: 52ch;
645 margin-top: 14px;
646 font-size: 15px;
647 color: var(--gs-text-2);
648 }
649
650 .gs-hero__actions {
651 display: flex;
652 gap: 10px;
653 margin-top: 26px;
654 flex-wrap: wrap;
655 }
656
657 .gs-hero__stats {
658 display: grid;
659 gap: 12px;
660 }
661
662 .gs-stat {
663 padding: 18px;
664 border-radius: var(--gs-r);
665 background: var(--gs-surface-2);
666 border: 1px solid var(--gs-line);
667 }
668
669 .gs-stat__value {
670 display: block;
671 font-size: 30px;
672 font-weight: 680;
673 letter-spacing: -0.03em;
674 line-height: 1.1;
675 font-variant-numeric: tabular-nums;
676 }
677
678 .gs-stat__value--sm {
679 font-size: 17px;
680 margin-bottom: 2px;
681 }
682
683 .gs-stat__label {
684 display: block;
685 font-size: 12.5px;
686 font-weight: 600;
687 color: var(--gs-text-2);
688 }
689
690 .gs-stat__meta {
691 display: block;
692 font-size: 12px;
693 color: var(--gs-text-3);
694 }
695
696 .gs-stat--split {
697 display: grid;
698 grid-template-columns: 1fr 1fr;
699 gap: 18px;
700 }
701
702 .gs-stat--split .gs-stat__value {
703 font-size: 22px;
704 }
705
706 .gs-stat--status.is-pro {
707 background: var(--gs-brand-soft);
708 border-color: transparent;
709 }
710
711 .gs-meter {
712 margin-top: 12px;
713 height: 6px;
714 border-radius: var(--gs-r-full);
715 background: var(--gs-surface-sunk);
716 overflow: hidden;
717 }
718
719 .gs-meter__fill {
720 display: block;
721 height: 100%;
722 width: var(--gs-meter, 0%);
723 border-radius: inherit;
724 background: var(--gs-brand-grad);
725 transition: width 600ms var(--gs-ease);
726 }
727
728 /* ------------------------------------------------------------------
729 * 8. Cards & grids
730 * ---------------------------------------------------------------- */
731
732 .gs-section {
733 padding-top: 4px;
734 }
735
736 .gs-shell.gs-stack {
737 padding-top: 40px;
738 padding-bottom: 40px;
739 }
740
741 /* Extra breathing room where content follows the dashboard hero. */
742 .gs-hero + .gs-shell.gs-stack {
743 padding-top: 64px;
744 }
745
746 .gs-grid {
747 display: grid;
748 gap: 16px;
749 }
750
751 /* Stretch, so cards in a row share one height regardless of copy length. */
752 .gs-grid--3 {
753 grid-template-columns: repeat(3, minmax(0, 1fr));
754 align-items: stretch;
755 }
756
757 /* Stacked grids are siblings, not flex children, so they need their own
758 separation — a little more than the in-grid gap to read as a new group. */
759 .gs-grid + .gs-grid {
760 margin-top: 24px;
761 }
762
763 .gs-grid--cards {
764 grid-template-columns: repeat(auto-fill, minmax(268px, 1fr));
765 }
766
767 .gs-card {
768 display: flex;
769 flex-direction: column;
770 gap: 14px;
771 padding: 20px;
772 border-radius: var(--gs-r);
773 background: var(--gs-surface);
774 border: 1px solid var(--gs-line);
775 box-shadow: var(--gs-shadow-sm);
776 text-decoration: none;
777 color: inherit;
778 transition:
779 transform var(--gs-mid),
780 box-shadow var(--gs-mid),
781 border-color var(--gs-mid);
782 }
783
784 .gs-card__body {
785 display: flex;
786 flex-direction: column;
787 gap: 6px;
788 align-items: flex-start;
789 }
790
791 .gs-card__title {
792 font-size: 15px;
793 font-weight: 640;
794 }
795
796 .gs-card__text {
797 font-size: 13.5px;
798 color: var(--gs-text-2);
799 }
800
801 .gs-card--link:hover,
802 .gs-card--link:focus {
803 transform: translateY(-2px);
804 border-color: var(--gs-brand);
805 box-shadow: var(--gs-shadow);
806 color: inherit;
807 }
808
809 .gs-card--link {
810 flex-direction: row;
811 gap: 14px;
812 align-items: flex-start;
813 }
814
815 .gs-card__icon {
816 display: grid;
817 place-items: center;
818 width: 34px;
819 height: 34px;
820 flex-shrink: 0;
821 border-radius: var(--gs-r-sm);
822 background: var(--gs-brand-soft);
823 color: var(--gs-brand);
824 }
825
826 .gs-card--step {
827 flex-direction: row;
828 gap: 14px;
829 align-items: flex-start;
830 }
831
832 .gs-step__n {
833 font-size: 12px;
834 font-weight: 700;
835 letter-spacing: 0.05em;
836 color: var(--gs-text-3);
837 padding-top: 2px;
838 }
839
840 /* Feature row: the walkthrough gets the lion's share of the width, with
841 the numbered steps riding alongside it. */
842 /* The walkthrough still leads, but at a width where its 16:9 frame plus
843 caption lands level with the three steps beside it. Both columns
844 stretch, and the steps share the leftover height evenly. */
845 .gs-grid--feature {
846 grid-template-columns: minmax(0, 1.5fr) minmax(300px, 1fr);
847 align-items: stretch;
848 }
849
850 .gs-grid--feature > .gs-stack {
851 height: 100%;
852 }
853
854 .gs-grid--feature .gs-card--step {
855 flex: 1 1 0;
856 }
857
858 /* The video bleeds to the card edges and leads; copy sits underneath. */
859 .gs-card--media {
860 gap: 0;
861 padding: 0;
862 overflow: hidden;
863 }
864
865 .gs-card--media .gs-card__body {
866 padding: 20px 24px 24px;
867 }
868
869 .gs-card--media:hover {
870 transform: translateY(-2px);
871 box-shadow: var(--gs-shadow);
872 }
873
874 .gs-card__kicker {
875 display: inline-flex;
876 align-items: center;
877 gap: 6px;
878 margin-bottom: 2px;
879 font-size: 11.5px;
880 font-weight: 700;
881 letter-spacing: 0.08em;
882 text-transform: uppercase;
883 color: var(--gs-brand);
884 }
885
886 .gs-card__kicker .gs-icon {
887 width: 13px;
888 height: 13px;
889 }
890
891 .gs-card__title--lg {
892 font-size: 21px;
893 letter-spacing: -0.02em;
894 }
895
896 .gs-embed {
897 position: relative;
898 padding-top: 56.25%;
899 border-radius: var(--gs-r-sm);
900 overflow: hidden;
901 background: var(--gs-surface-sunk);
902 }
903
904 .gs-card--media .gs-embed {
905 border-radius: 0;
906 }
907
908 .gs-embed iframe {
909 position: absolute;
910 inset: 0;
911 width: 100%;
912 height: 100%;
913 border: 0;
914 }
915
916 /* ------------------------------------------------------------------
917 * 9. Blocks toolbar
918 * ---------------------------------------------------------------- */
919
920 .gs-toolbar {
921 position: sticky;
922 top: 96px;
923 z-index: 20;
924 display: flex;
925 align-items: center;
926 gap: 12px;
927 flex-wrap: wrap;
928 padding: 12px;
929 margin-top: -16px;
930 border-radius: var(--gs-r);
931 background: color-mix(in srgb, var(--gs-surface) 88%, transparent);
932 backdrop-filter: saturate(180%) blur(12px);
933 -webkit-backdrop-filter: saturate(180%) blur(12px);
934 border: 1px solid var(--gs-line);
935 box-shadow: var(--gs-shadow-sm);
936 }
937
938 @supports not (background: color-mix(in srgb, red 50%, blue)) {
939 .gs-toolbar {
940 background: var(--gs-surface);
941 }
942 }
943
944 .gs-search {
945 position: relative;
946 display: flex;
947 align-items: center;
948 flex: 1 1 240px;
949 min-width: 200px;
950 }
951
952 .gs-search .gs-icon {
953 position: absolute;
954 left: 12px;
955 color: var(--gs-text-3);
956 pointer-events: none;
957 }
958
959 /* Typed selector: wp-admin styles `input[type="search"]`, which would
960 otherwise outrank a bare class and drop the padding for the icon. */
961 input.gs-search__input {
962 width: 100%;
963 height: 38px;
964 margin: 0;
965 padding: 0 44px 0 36px;
966 border: 1px solid var(--gs-line-strong);
967 border-radius: var(--gs-r-sm);
968 background: var(--gs-surface);
969 color: var(--gs-text);
970 font-family: inherit;
971 font-size: 13.5px;
972 line-height: 1;
973 box-shadow: none;
974 transition:
975 border-color var(--gs-fast),
976 box-shadow var(--gs-fast);
977 -webkit-appearance: none;
978 appearance: none;
979 }
980
981 input.gs-search__input::placeholder {
982 color: var(--gs-text-3);
983 }
984
985 input.gs-search__input:focus {
986 outline: none;
987 border-color: var(--gs-brand);
988 box-shadow: 0 0 0 3px var(--gs-brand-ring);
989 }
990
991 input.gs-search__input::-webkit-search-cancel-button {
992 -webkit-appearance: none;
993 }
994
995 .gs-search__kbd {
996 position: absolute;
997 right: 10px;
998 background: var(--gs-surface-sunk);
999 border-color: var(--gs-line);
1000 color: var(--gs-text-3);
1001 pointer-events: none;
1002 transition: opacity var(--gs-fast);
1003 }
1004
1005 .gs-search__input:focus ~ .gs-search__kbd,
1006 .gs-search__input:not(:placeholder-shown) ~ .gs-search__kbd {
1007 opacity: 0;
1008 }
1009
1010 .gs-segment {
1011 display: inline-flex;
1012 gap: 2px;
1013 padding: 3px;
1014 border-radius: var(--gs-r-sm);
1015 background: var(--gs-surface-sunk);
1016 border: 1px solid var(--gs-line);
1017 }
1018
1019 .gs-segment__btn {
1020 height: 30px;
1021 padding: 0 12px;
1022 border: 0;
1023 border-radius: 6px;
1024 background: transparent;
1025 color: var(--gs-text-2);
1026 font-family: inherit;
1027 font-size: 12.5px;
1028 font-weight: 600;
1029 cursor: pointer;
1030 transition:
1031 background var(--gs-fast),
1032 color var(--gs-fast);
1033 }
1034
1035 .gs-segment__btn:hover {
1036 color: var(--gs-text);
1037 }
1038
1039 .gs-segment__btn.is-active {
1040 background: var(--gs-surface);
1041 color: var(--gs-text);
1042 box-shadow: var(--gs-shadow-sm);
1043 }
1044
1045 .gs-toolbar__actions {
1046 display: flex;
1047 gap: 8px;
1048 margin-left: auto;
1049 }
1050
1051 /* ------------------------------------------------------------------
1052 * 10. Block cards
1053 * ---------------------------------------------------------------- */
1054
1055 .gs-block {
1056 position: relative;
1057 display: flex;
1058 flex-direction: column;
1059 padding: 18px;
1060 border-radius: var(--gs-r);
1061 background: var(--gs-surface);
1062 border: 1px solid var(--gs-line);
1063 box-shadow: var(--gs-shadow-sm);
1064 transition:
1065 transform var(--gs-mid),
1066 box-shadow var(--gs-mid),
1067 border-color var(--gs-mid),
1068 opacity var(--gs-mid);
1069 }
1070
1071 .gs-block::before {
1072 content: '';
1073 position: absolute;
1074 inset: 0;
1075 border-radius: inherit;
1076 padding: 1px;
1077 background: var(--gs-brand-grad);
1078 -webkit-mask:
1079 linear-gradient(#000 0 0) content-box,
1080 linear-gradient(#000 0 0);
1081 -webkit-mask-composite: xor;
1082 mask:
1083 linear-gradient(#000 0 0) content-box,
1084 linear-gradient(#000 0 0);
1085 mask-composite: exclude;
1086 opacity: 0;
1087 transition: opacity var(--gs-mid);
1088 pointer-events: none;
1089 }
1090
1091 .gs-block:hover {
1092 transform: translateY(-2px);
1093 box-shadow: var(--gs-shadow);
1094 }
1095
1096 .gs-block:hover::before {
1097 opacity: 0.55;
1098 }
1099
1100 .gs-block.is-off {
1101 background: var(--gs-surface-2);
1102 }
1103
1104 .gs-block.is-off .gs-block__title,
1105 .gs-block.is-off .gs-block__text {
1106 opacity: 0.62;
1107 }
1108
1109 .gs-block.is-locked {
1110 background: var(--gs-surface-2);
1111 }
1112
1113 .gs-block.is-dirty {
1114 border-color: var(--gs-brand);
1115 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1116 }
1117
1118 .gs-block.is-hidden {
1119 display: none;
1120 }
1121
1122 .gs-block__head {
1123 display: flex;
1124 align-items: center;
1125 justify-content: space-between;
1126 gap: 10px;
1127 margin-bottom: 7px;
1128 }
1129
1130 .gs-block__title {
1131 font-size: 15px;
1132 font-weight: 640;
1133 }
1134
1135 .gs-block__text {
1136 flex: 1;
1137 font-size: 13px;
1138 line-height: 1.55;
1139 color: var(--gs-text-2);
1140 margin-bottom: 16px;
1141 }
1142
1143 .gs-block__foot {
1144 display: flex;
1145 align-items: center;
1146 justify-content: space-between;
1147 gap: 10px;
1148 padding-top: 14px;
1149 margin-top: 14px;
1150 border-top: 1px solid var(--gs-line);
1151 }
1152
1153 .gs-tag {
1154 display: inline-flex;
1155 align-items: center;
1156 height: 20px;
1157 padding: 0 8px;
1158 border-radius: var(--gs-r-full);
1159 background: var(--gs-surface-sunk);
1160 border: 1px solid var(--gs-line);
1161 font-size: 10.5px;
1162 font-weight: 700;
1163 letter-spacing: 0.05em;
1164 text-transform: uppercase;
1165 color: var(--gs-text-3);
1166 }
1167
1168 .gs-tag--pro {
1169 background: var(--gs-gold-soft);
1170 border-color: transparent;
1171 color: var(--gs-gold);
1172 }
1173
1174 .gs-lock {
1175 display: inline-flex;
1176 align-items: center;
1177 gap: 6px;
1178 height: 28px;
1179 padding: 0 12px;
1180 border-radius: var(--gs-r-full);
1181 background: var(--gs-gold-soft);
1182 color: var(--gs-gold);
1183 font-size: 12px;
1184 font-weight: 650;
1185 text-decoration: none;
1186 transition: filter var(--gs-fast);
1187 }
1188
1189 .gs-lock:hover,
1190 .gs-lock:focus {
1191 color: var(--gs-gold);
1192 filter: brightness(0.96);
1193 }
1194
1195 .gs-lock .gs-icon {
1196 width: 13px;
1197 height: 13px;
1198 }
1199
1200 /* ------------------------------------------------------------------
1201 * 11. Switch
1202 * ---------------------------------------------------------------- */
1203
1204 .gs-switch {
1205 position: relative;
1206 display: inline-flex;
1207 flex-shrink: 0;
1208 cursor: pointer;
1209 }
1210
1211 .gs-switch__input {
1212 position: absolute;
1213 width: 100%;
1214 height: 100%;
1215 margin: 0;
1216 opacity: 0;
1217 cursor: pointer;
1218 }
1219
1220 .gs-switch__track {
1221 display: block;
1222 width: 40px;
1223 height: 23px;
1224 padding: 3px;
1225 border-radius: var(--gs-r-full);
1226 background: var(--gs-line-strong);
1227 transition: background var(--gs-mid);
1228 }
1229
1230 .gs-switch__thumb {
1231 display: block;
1232 width: 17px;
1233 height: 17px;
1234 border-radius: 50%;
1235 background: #fff;
1236 box-shadow: 0 1px 3px rgba(20, 22, 43, 0.3);
1237 transform: translateX(0);
1238 transition: transform var(--gs-mid);
1239 }
1240
1241 .gs-switch__input:checked ~ .gs-switch__track {
1242 background: var(--gs-brand);
1243 }
1244
1245 .gs-switch__input:checked ~ .gs-switch__track .gs-switch__thumb {
1246 transform: translateX(17px);
1247 }
1248
1249 .gs-switch__input:focus-visible ~ .gs-switch__track {
1250 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1251 }
1252
1253 .gs-switch--lg .gs-switch__track {
1254 width: 48px;
1255 height: 27px;
1256 }
1257
1258 .gs-switch--lg .gs-switch__thumb {
1259 width: 21px;
1260 height: 21px;
1261 }
1262
1263 .gs-switch--lg .gs-switch__input:checked ~ .gs-switch__track .gs-switch__thumb {
1264 transform: translateX(21px);
1265 }
1266
1267 .gs-switch--danger .gs-switch__input:checked ~ .gs-switch__track {
1268 background: var(--gs-danger);
1269 }
1270
1271 /* ------------------------------------------------------------------
1272 * 12. Empty state & notes
1273 * ---------------------------------------------------------------- */
1274
1275 .gs-empty {
1276 display: flex;
1277 flex-direction: column;
1278 align-items: center;
1279 gap: 12px;
1280 padding: 56px 24px;
1281 border-radius: var(--gs-r);
1282 border: 1px dashed var(--gs-line-strong);
1283 color: var(--gs-text-3);
1284 text-align: center;
1285 }
1286
1287 .gs-empty .gs-icon {
1288 width: 28px;
1289 height: 28px;
1290 }
1291
1292 .gs-note {
1293 display: flex;
1294 align-items: flex-start;
1295 gap: 12px;
1296 padding: 16px 18px;
1297 border-radius: var(--gs-r);
1298 background: var(--gs-surface-2);
1299 border: 1px solid var(--gs-line);
1300 font-size: 13px;
1301 color: var(--gs-text-2);
1302 }
1303
1304 .gs-note .gs-icon {
1305 color: var(--gs-text-3);
1306 margin-top: 2px;
1307 }
1308
1309 .gs-note .gs-link {
1310 font-size: inherit;
1311 }
1312
1313 /* ------------------------------------------------------------------
1314 * 13. Promo band
1315 * ---------------------------------------------------------------- */
1316
1317 .gs-promo {
1318 position: relative;
1319 overflow: hidden;
1320 display: grid;
1321 grid-template-columns: minmax(0, 1.2fr) minmax(240px, 0.8fr);
1322 gap: 40px;
1323 align-items: center;
1324 padding: 40px;
1325 border-radius: var(--gs-r-lg);
1326 background: var(--gs-brand-grad);
1327 color: #fff;
1328 box-shadow: var(--gs-shadow);
1329 }
1330
1331 .gs-promo::after {
1332 content: '';
1333 position: absolute;
1334 right: -80px;
1335 bottom: -140px;
1336 width: 380px;
1337 height: 380px;
1338 border-radius: 50%;
1339 background: rgba(255, 255, 255, 0.08);
1340 pointer-events: none;
1341 }
1342
1343 .gs-promo__copy {
1344 position: relative;
1345 }
1346
1347 .gs-promo__title {
1348 font-size: 26px;
1349 color: #fff;
1350 letter-spacing: -0.03em;
1351 }
1352
1353 .gs-promo__text {
1354 max-width: 48ch;
1355 margin-top: 10px;
1356 color: rgba(255, 255, 255, 0.82);
1357 }
1358
1359 .gs-promo .gs-btn {
1360 margin-top: 22px;
1361 }
1362
1363 .gs-promo__list {
1364 position: relative;
1365 display: grid;
1366 gap: 10px;
1367 margin: 0;
1368 padding: 0;
1369 list-style: none;
1370 }
1371
1372 .gs-promo__list li {
1373 display: flex;
1374 align-items: center;
1375 gap: 10px;
1376 margin: 0;
1377 font-size: 13.5px;
1378 font-weight: 550;
1379 color: rgba(255, 255, 255, 0.92);
1380 }
1381
1382 .gs-promo__list .gs-icon {
1383 width: 15px;
1384 height: 15px;
1385 color: rgba(255, 255, 255, 0.7);
1386 }
1387
1388 /* ------------------------------------------------------------------
1389 * 14. Settings
1390 * ---------------------------------------------------------------- */
1391
1392 .gs-settings {
1393 display: grid;
1394 grid-template-columns: 200px minmax(0, 1fr);
1395 gap: 32px;
1396 align-items: start;
1397 }
1398
1399 .gs-sidenav {
1400 position: sticky;
1401 top: 112px;
1402 display: flex;
1403 flex-direction: column;
1404 gap: 2px;
1405 }
1406
1407 .gs-sidenav__link {
1408 display: flex;
1409 align-items: center;
1410 gap: 10px;
1411 padding: 9px 12px;
1412 border-radius: var(--gs-r-sm);
1413 font-size: 13.5px;
1414 font-weight: 600;
1415 color: var(--gs-text-2);
1416 text-decoration: none;
1417 transition:
1418 background var(--gs-fast),
1419 color var(--gs-fast);
1420 }
1421
1422 .gs-sidenav__link:hover {
1423 background: var(--gs-surface-sunk);
1424 color: var(--gs-text);
1425 }
1426
1427 .gs-sidenav__link.is-active {
1428 background: var(--gs-brand-soft);
1429 color: var(--gs-brand);
1430 }
1431
1432 /* A single full-width column of panels. .gs-settings__body is the same
1433 thing sitting in the settings grid's content column. */
1434 .gs-panels,
1435 .gs-settings__body {
1436 display: flex;
1437 flex-direction: column;
1438 gap: 16px;
1439 min-width: 0;
1440 }
1441
1442 .gs-panel {
1443 padding: 24px;
1444 border-radius: var(--gs-r);
1445 background: var(--gs-surface);
1446 border: 1px solid var(--gs-line);
1447 box-shadow: var(--gs-shadow-sm);
1448 scroll-margin-top: 120px;
1449 }
1450
1451 .gs-panel__head {
1452 margin-bottom: 20px;
1453 }
1454
1455 .gs-panel__title {
1456 font-size: 16px;
1457 }
1458
1459 .gs-panel__sub {
1460 margin-top: 3px;
1461 font-size: 13px;
1462 color: var(--gs-text-2);
1463 }
1464
1465 .gs-field {
1466 display: grid;
1467 grid-template-columns: minmax(0, 1fr) auto;
1468 gap: 24px;
1469 align-items: center;
1470 padding: 18px 0;
1471 border-top: 1px solid var(--gs-line);
1472 }
1473
1474 .gs-field:first-of-type {
1475 border-top: 0;
1476 padding-top: 0;
1477 }
1478
1479 .gs-field:last-child {
1480 padding-bottom: 0;
1481 }
1482
1483 .gs-field__label label,
1484 .gs-field__name {
1485 display: block;
1486 font-size: 14px;
1487 font-weight: 620;
1488 color: var(--gs-text);
1489 }
1490
1491 .gs-field__help {
1492 max-width: 62ch;
1493 margin-top: 4px;
1494 font-size: 12.5px;
1495 line-height: 1.6;
1496 color: var(--gs-text-2);
1497 }
1498
1499 .gs-field--danger .gs-field__label label {
1500 color: var(--gs-danger);
1501 }
1502
1503 .gs-radio-cards {
1504 display: grid;
1505 grid-template-columns: repeat(2, minmax(150px, 1fr));
1506 gap: 10px;
1507 }
1508
1509 .gs-radio-card {
1510 position: relative;
1511 display: flex;
1512 align-items: flex-start;
1513 gap: 10px;
1514 padding: 13px 14px;
1515 border-radius: var(--gs-r-sm);
1516 background: var(--gs-surface);
1517 border: 1px solid var(--gs-line-strong);
1518 cursor: pointer;
1519 transition:
1520 border-color var(--gs-fast),
1521 background var(--gs-fast),
1522 box-shadow var(--gs-fast);
1523 }
1524
1525 .gs-radio-card input {
1526 position: absolute;
1527 opacity: 0;
1528 width: 0;
1529 height: 0;
1530 margin: 0;
1531 }
1532
1533 .gs-radio-card:hover {
1534 border-color: var(--gs-text-3);
1535 }
1536
1537 .gs-radio-card.is-active {
1538 border-color: var(--gs-brand);
1539 background: var(--gs-brand-soft);
1540 box-shadow: 0 0 0 3px var(--gs-brand-ring);
1541 }
1542
1543 .gs-radio-card__body {
1544 display: flex;
1545 flex-direction: column;
1546 gap: 2px;
1547 }
1548
1549 .gs-radio-card__title {
1550 font-size: 13.5px;
1551 font-weight: 620;
1552 color: var(--gs-text);
1553 }
1554
1555 .gs-radio-card__text {
1556 font-size: 12px;
1557 color: var(--gs-text-2);
1558 }
1559
1560 .gs-radio-card__mark {
1561 width: 16px;
1562 height: 16px;
1563 margin-left: auto;
1564 flex-shrink: 0;
1565 border-radius: 50%;
1566 border: 2px solid var(--gs-line-strong);
1567 transition:
1568 border-color var(--gs-fast),
1569 box-shadow var(--gs-fast);
1570 }
1571
1572 .gs-radio-card.is-active .gs-radio-card__mark {
1573 border-color: var(--gs-brand);
1574 box-shadow:
1575 inset 0 0 0 3px var(--gs-surface),
1576 inset 0 0 0 10px var(--gs-brand);
1577 }
1578
1579 .gs-panel--info {
1580 background: var(--gs-surface-2);
1581 }
1582
1583 .gs-defs {
1584 display: grid;
1585 grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1586 gap: 16px;
1587 margin: 0;
1588 }
1589
1590 .gs-defs > div {
1591 display: flex;
1592 flex-direction: column;
1593 gap: 2px;
1594 }
1595
1596 .gs-defs dt {
1597 font-size: 12px;
1598 font-weight: 600;
1599 color: var(--gs-text-3);
1600 }
1601
1602 .gs-defs dd {
1603 margin: 0;
1604 font-size: 14px;
1605 font-weight: 620;
1606 font-variant-numeric: tabular-nums;
1607 color: var(--gs-text);
1608 }
1609
1610 /* ------------------------------------------------------------------
1611 * 15. Save bar
1612 * ---------------------------------------------------------------- */
1613
1614 /* Kept in the layout so the slide-in can animate; visibility (rather than
1615 display) keeps it out of the accessibility tree while it is parked. */
1616 .gs-savebar {
1617 position: fixed;
1618 left: 50%;
1619 bottom: 28px;
1620 z-index: 60;
1621 transform: translate(-50%, 150%);
1622 transition:
1623 transform 380ms var(--gs-ease),
1624 opacity var(--gs-mid),
1625 visibility 0s linear 380ms;
1626 opacity: 0;
1627 visibility: hidden;
1628 }
1629
1630 .gs-savebar.is-visible {
1631 transform: translate(-50%, 0);
1632 opacity: 1;
1633 visibility: visible;
1634 transition-delay: 0s;
1635 }
1636
1637 .gs-savebar__inner {
1638 display: flex;
1639 align-items: center;
1640 gap: 14px;
1641 padding: 10px 10px 10px 18px;
1642 border-radius: var(--gs-r-full);
1643 background: #1a1c30;
1644 border: 1px solid rgba(255, 255, 255, 0.1);
1645 box-shadow: var(--gs-shadow-lg);
1646 color: #fff;
1647 }
1648
1649 .gs-app[data-gs-theme='dark'] .gs-savebar__inner {
1650 background: #23263e;
1651 }
1652
1653 .gs-savebar__dot {
1654 width: 8px;
1655 height: 8px;
1656 border-radius: 50%;
1657 background: #ffc25c;
1658 box-shadow: 0 0 0 0 rgba(255, 194, 92, 0.6);
1659 animation: gs-pulse 2.2s ease-out infinite;
1660 }
1661
1662 @keyframes gs-pulse {
1663 0% {
1664 box-shadow: 0 0 0 0 rgba(255, 194, 92, 0.6);
1665 }
1666
1667 70% {
1668 box-shadow: 0 0 0 8px rgba(255, 194, 92, 0);
1669 }
1670
1671 100% {
1672 box-shadow: 0 0 0 0 rgba(255, 194, 92, 0);
1673 }
1674 }
1675
1676 .gs-savebar__text {
1677 font-size: 13.5px;
1678 font-weight: 600;
1679 white-space: nowrap;
1680 font-variant-numeric: tabular-nums;
1681 }
1682
1683 .gs-savebar__actions {
1684 display: flex;
1685 align-items: center;
1686 gap: 6px;
1687 }
1688
1689 .gs-savebar .gs-btn--ghost {
1690 color: rgba(255, 255, 255, 0.62);
1691 height: 36px;
1692 }
1693
1694 .gs-savebar .gs-btn--ghost:hover {
1695 background: rgba(255, 255, 255, 0.1);
1696 color: #fff;
1697 }
1698
1699 .gs-savebar .gs-btn--primary {
1700 height: 36px;
1701 }
1702
1703 /* ------------------------------------------------------------------
1704 * 16. Toasts
1705 * ---------------------------------------------------------------- */
1706
1707 .gs-toasts {
1708 position: fixed;
1709 right: 24px;
1710 bottom: 24px;
1711 z-index: 70;
1712 display: flex;
1713 flex-direction: column;
1714 gap: 8px;
1715 pointer-events: none;
1716 }
1717
1718 .gs-toast {
1719 display: flex;
1720 align-items: center;
1721 gap: 10px;
1722 padding: 11px 16px;
1723 border-radius: var(--gs-r-full);
1724 background: var(--gs-surface);
1725 border: 1px solid var(--gs-line);
1726 box-shadow: var(--gs-shadow-lg);
1727 font-size: 13px;
1728 font-weight: 600;
1729 color: var(--gs-text);
1730 pointer-events: auto;
1731 animation: gs-toast-in 320ms var(--gs-ease);
1732 }
1733
1734 .gs-toast.is-out {
1735 animation: gs-toast-out 240ms var(--gs-ease) forwards;
1736 }
1737
1738 .gs-toast__icon {
1739 display: grid;
1740 place-items: center;
1741 width: 18px;
1742 height: 18px;
1743 border-radius: 50%;
1744 background: var(--gs-ok-soft);
1745 color: var(--gs-ok);
1746 flex-shrink: 0;
1747 }
1748
1749 .gs-toast__icon .gs-icon {
1750 width: 11px;
1751 height: 11px;
1752 }
1753
1754 .gs-toast--error .gs-toast__icon {
1755 background: var(--gs-danger-soft);
1756 color: var(--gs-danger);
1757 }
1758
1759 @keyframes gs-toast-in {
1760 from {
1761 opacity: 0;
1762 transform: translateY(12px) scale(0.96);
1763 }
1764
1765 to {
1766 opacity: 1;
1767 transform: translateY(0) scale(1);
1768 }
1769 }
1770
1771 @keyframes gs-toast-out {
1772 to {
1773 opacity: 0;
1774 transform: translateY(6px) scale(0.98);
1775 }
1776 }
1777
1778 /* ------------------------------------------------------------------
1779 * 17. Responsive
1780 * ---------------------------------------------------------------- */
1781
1782 @media (max-width: 1100px) {
1783 .gs-grid--3 {
1784 grid-template-columns: repeat(2, minmax(0, 1fr));
1785 }
1786
1787 .gs-grid--feature {
1788 grid-template-columns: minmax(0, 1fr);
1789 }
1790
1791 .gs-hero__grid {
1792 grid-template-columns: 1fr;
1793 gap: 32px;
1794 }
1795
1796 .gs-hero__stats {
1797 grid-template-columns: repeat(3, minmax(0, 1fr));
1798 }
1799
1800 .gs-settings {
1801 grid-template-columns: 1fr;
1802 }
1803
1804 .gs-sidenav {
1805 position: static;
1806 flex-direction: row;
1807 overflow-x: auto;
1808 padding-bottom: 4px;
1809 }
1810 }
1811
1812 @media (max-width: 782px) {
1813 .gs-app {
1814 margin-left: -10px;
1815 min-height: calc(100vh - 46px);
1816 }
1817
1818 .gs-bar {
1819 top: 46px;
1820 }
1821
1822 .gs-bar__inner {
1823 height: auto;
1824 min-height: 60px;
1825 padding: 10px 16px;
1826 flex-wrap: wrap;
1827 gap: 10px;
1828 }
1829
1830 .gs-nav {
1831 order: 3;
1832 width: 100%;
1833 flex: 1 0 100%;
1834 }
1835
1836 .gs-bar__actions {
1837 margin-left: auto;
1838 }
1839
1840 .gs-shell {
1841 padding: 0 16px;
1842 }
1843
1844 .gs-toolbar {
1845 position: static;
1846 margin-top: 0;
1847 }
1848
1849 .gs-toolbar__actions {
1850 margin-left: 0;
1851 width: 100%;
1852 }
1853
1854 .gs-toolbar__actions .gs-btn {
1855 flex: 1;
1856 }
1857
1858 .gs-grid--3,
1859 .gs-hero__stats,
1860 .gs-promo,
1861 .gs-radio-cards {
1862 grid-template-columns: 1fr;
1863 }
1864
1865 .gs-promo {
1866 padding: 28px;
1867 }
1868
1869 .gs-field {
1870 grid-template-columns: 1fr;
1871 gap: 14px;
1872 align-items: start;
1873 }
1874
1875 .gs-savebar {
1876 left: 16px;
1877 right: 16px;
1878 bottom: 16px;
1879 transform: translateY(150%);
1880 }
1881
1882 .gs-savebar.is-visible {
1883 transform: translateY(0);
1884 }
1885
1886 .gs-savebar__inner {
1887 justify-content: space-between;
1888 }
1889
1890 .gs-savebar .gs-kbd {
1891 display: none;
1892 }
1893
1894 .gs-toasts {
1895 left: 16px;
1896 right: 16px;
1897 bottom: 84px;
1898 align-items: center;
1899 }
1900 }
1901
1902 /* ------------------------------------------------------------------
1903 * 18. Motion preferences
1904 * ---------------------------------------------------------------- */
1905
1906 @media (prefers-reduced-motion: reduce) {
1907 .gs-app *,
1908 .gs-app *::before,
1909 .gs-app *::after {
1910 animation-duration: 0.01ms !important;
1911 animation-iteration-count: 1 !important;
1912 transition-duration: 0.01ms !important;
1913 }
1914 }
1915