1/* PR preview lifecycle (landing page, "Review" stage). Windows use the
2 dark code surface in both themes; the tab bar follows the page theme. */
3
4.prf {
5 /* CI colors from the brand palette: GitHub's "open = green, merged =
6 purple" convention, in Alchemy's moss and a dusty plum that sits with
7 the terracotta. Solid shades carry cream text; light shades are for
8 icons and text on the dark windows. */
9 --prf-open: #9fc06b;
10 --prf-open-solid: #4f6d35;
11 --prf-merged: #c4a2f0;
12 --prf-merged-solid: #7d4db8;
13 --prf-h: 420px;
14 margin-top: 28px;
15 font-family: var(--alc-font-sans);
16}
17
18/* ---------- tabs ---------- */
19.prf-tabs-row {
20 display: flex;
21 align-items: center;
22 gap: 10px;
23 margin-bottom: 16px;
24}
25.prf-tabs {
26 flex: 1;
27 display: grid;
28 grid-template-columns: repeat(4, minmax(0, 1fr));
29 gap: 4px;
30 /* Extra bottom room: the progress line runs below the highlight. */
31 padding: 4px 4px 13px;
32 border: 1px solid var(--alc-hairline-2);
33 border-radius: 12px;
34 background: var(--alc-bg-elev-1);
35 position: relative;
36}
37.prf-tabs__pill {
38 position: absolute;
39 top: 4px;
40 bottom: 13px;
41 z-index: 0;
42 border-radius: 8px;
43 background: var(--alc-bg);
44 box-shadow: var(--alc-shadow-sm);
45 pointer-events: none;
46 transition:
47 left 380ms cubic-bezier(0.2, 0, 0, 1),
48 width 380ms cubic-bezier(0.2, 0, 0, 1);
49}
50.prf-tab {
51 all: unset;
52 position: relative;
53 z-index: 1;
54 overflow: hidden;
55 display: flex;
56 align-items: center;
57 justify-content: center;
58 gap: 8px;
59 padding: 9px 8px 11px;
60 border-radius: 8px;
61 cursor: pointer;
62 font-size: 13.5px;
63 font-weight: 500;
64 color: var(--alc-fg-3, var(--alc-fg-2));
65 white-space: nowrap;
66 transition:
67 background 160ms ease,
68 color 160ms ease;
69}
70.prf-tab:hover {
71 color: var(--alc-fg-1);
72 background: var(--alc-hairline);
73}
74.prf-tab:focus-visible {
75 outline: 2px solid var(--alc-accent);
76 outline-offset: -2px;
77}
78.prf-tab.is-active {
79 color: var(--alc-fg-1);
80}
81.prf-tab.is-active:hover {
82 background: transparent;
83}
84.prf-tab__num {
85 display: inline-grid;
86 place-items: center;
87 width: 20px;
88 height: 20px;
89 border-radius: 50%;
90 font-family: var(--alc-font-mono);
91 font-size: 11px;
92 border: 1px solid var(--alc-hairline-3);
93 transition: all 160ms ease;
94}
95.prf-tab.is-done .prf-tab__num,
96.prf-tab.is-active .prf-tab__num {
97 border-color: transparent;
98 background: var(--alc-accent);
99 color: var(--alc-fg-on-accent);
100}
101.prf-tabs__track {
102 position: absolute;
103 left: 12px;
104 right: 12px;
105 bottom: 6px;
106 z-index: 2;
107 height: 2px;
108 border-radius: 2px;
109 background: var(--alc-hairline-2);
110 overflow: hidden;
111 pointer-events: none;
112}
113.prf-tabs__progress {
114 display: block;
115 height: 100%;
116 background: var(--alc-accent);
117 transform-origin: left;
118}
119/* Pausing freezes CSS animations too (fades, tab open/close, spinners). */
120.prf.is-paused *,
121.prf.is-paused *::before,
122.prf.is-paused *::after {
123 animation-play-state: paused !important;
124}
125.prf-play {
126 all: unset;
127 flex: none;
128 display: grid;
129 place-items: center;
130 width: 36px;
131 height: 36px;
132 border-radius: 50%;
133 border: 1px solid var(--alc-hairline-2);
134 background: var(--alc-bg-elev-1);
135 color: var(--alc-fg-2);
136 fill: currentColor;
137 cursor: pointer;
138}
139.prf-play:hover {
140 color: var(--alc-fg-1);
141 border-color: var(--alc-accent);
142}
143.prf-play:focus-visible {
144 outline: 2px solid var(--alc-accent);
145}
146
147/* ---------- stage ---------- */
148.prf-stage {
149 display: grid;
150 grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
151 gap: 16px;
152}
153.prf-side {
154 min-width: 0;
155}
156.prf-right {
157 position: relative;
158 min-width: 0;
159}
160
161/* ---------- window chrome ---------- */
162.prf-win {
163 height: var(--prf-h);
164 display: flex;
165 flex-direction: column;
166 min-width: 0;
167 overflow: hidden;
168 border-radius: 12px;
169 border: 1px solid rgba(232, 220, 192, 0.1);
170 background: var(--alc-bg-code);
171 color: var(--alc-code-var);
172 box-shadow:
173 0 1px 0 rgba(255, 255, 255, 0.04) inset,
174 0 14px 40px rgba(0, 0, 0, 0.28);
175}
176.prf-win__bar {
177 flex: none;
178 display: flex;
179 align-items: center;
180 gap: 6px;
181 padding: 10px 14px;
182 border-bottom: 1px solid rgba(232, 220, 192, 0.08);
183 background: rgba(255, 255, 255, 0.025);
184}
185.prf-dot {
186 width: 10px;
187 height: 10px;
188 border-radius: 50%;
189 flex: none;
190}
191.prf-win__title {
192 flex: 1;
193 min-width: 0;
194 margin-left: 8px;
195 overflow: hidden;
196 text-overflow: ellipsis;
197 white-space: nowrap;
198 font-family: var(--alc-font-mono);
199 font-size: 11px;
200 color: var(--alc-code-comment);
201}
202.prf-win__body {
203 flex: 1;
204 min-height: 0;
205 overflow: hidden;
206 display: flex;
207 flex-direction: column;
208}
209.prf-badge {
210 flex: none;
211 padding: 2px 8px;
212 border-radius: 4px;
213 border: 1px solid currentColor;
214 font-family: var(--alc-font-mono);
215 font-size: 10px;
216 font-weight: 700;
217 letter-spacing: 0.14em;
218}
219.prf-badge--green {
220 color: var(--alc-accent-bright);
221}
222.prf-badge--red {
223 color: var(--alc-danger);
224}
225.prf-badge--sky {
226 color: var(--alc-code-type);
227}
228
229/* ---------- shared text bits ---------- */
230.prf-muted {
231 color: var(--alc-code-comment);
232}
233.prf-strong {
234 color: var(--alc-fg-invert);
235 font-weight: 600;
236}
237.prf-small {
238 font-size: 12px;
239}
240.prf-hl {
241 color: var(--alc-code-string);
242}
243.prf-u {
244 text-decoration: underline;
245 font-weight: 600;
246}
247.prf-enter {
248 animation: prf-rise 320ms cubic-bezier(0.2, 0, 0, 1) both;
249}
250@keyframes prf-rise {
251 from {
252 opacity: 0;
253 transform: translateY(6px);
254 }
255}
256@keyframes prf-fade {
257 from {
258 opacity: 0;
259 }
260}
261
262/* status icon: queued ring / spinner / check */
263.prf-si {
264 flex: none;
265 display: inline-grid;
266 place-items: center;
267 width: 16px;
268 height: 16px;
269 border-radius: 50%;
270 font-family: var(--alc-font-mono);
271 font-size: 12px;
272 line-height: 1;
273}
274/* Optical alignment: center each icon on its row's cap height (what the
275 eye reads as the text's middle), not the line box, which carries extra
276 room for descenders. Offsets measured per font and size. */
277.prf-check > .prf-si,
278.prf-job__head > .prf-si,
279.prf-mergebox__ok > .prf-si {
280 translate: 0 -0.5px;
281}
282.prf-job__step > .prf-si,
283.prf-xstep__head > .prf-si {
284 translate: 0 -1px;
285}
286.prf-si--queued {
287 border: 1.5px solid rgba(232, 220, 192, 0.3);
288 width: 12px;
289 height: 12px;
290 margin: 2px;
291}
292.prf-si--run {
293 color: var(--alc-warn);
294}
295.prf-si--ok {
296 background: var(--prf-open-solid);
297 color: var(--alc-fg-on-accent);
298}
299
300/* ---------- pull request ---------- */
301.prf-pr .prf-win__body {
302 display: flex;
303 flex-direction: column;
304}
305.prf-pr__head {
306 padding: 16px 18px 14px;
307 border-bottom: 1px solid rgba(232, 220, 192, 0.08);
308}
309.prf-pr__title {
310 font-size: 17px;
311 font-weight: 600;
312 color: var(--alc-fg-invert);
313 line-height: 1.3;
314}
315.prf-pr__num {
316 font-weight: 400;
317 color: var(--alc-code-comment);
318}
319.prf-pr__meta {
320 display: flex;
321 align-items: center;
322 flex-wrap: wrap;
323 gap: 8px;
324 margin-top: 10px;
325 font-size: 12px;
326}
327.prf-state {
328 display: inline-flex;
329 align-items: center;
330 gap: 5px;
331 padding: 3px 10px;
332 border-radius: 999px;
333 font-size: 12.5px;
334 font-weight: 600;
335 color: var(--alc-fg-on-accent);
336 transition: background 240ms ease;
337}
338.prf-state--open {
339 background: var(--prf-open-solid);
340}
341.prf-state--merged {
342 background: var(--prf-merged-solid);
343}
344.prf-branch {
345 padding: 2px 7px;
346 border-radius: 5px;
347 background: rgba(125, 223, 255, 0.1);
348 color: var(--alc-code-type);
349 font-family: var(--alc-font-mono);
350 font-size: 11.5px;
351}
352.prf-arrow {
353 color: var(--alc-code-comment);
354}
355/* Scrolled to the newest entry from JS; older ones move off the top. */
356.prf-feed {
357 flex: 1;
358 min-height: 0;
359 overflow: hidden;
360 display: flex;
361 flex-direction: column;
362 gap: 12px;
363 padding: 14px 18px 18px;
364}
365.prf-feed > * {
366 flex: none;
367}
368.prf-add {
369 color: var(--prf-open);
370 font-family: var(--alc-font-mono);
371 font-size: 11.5px;
372}
373.prf-del {
374 color: var(--alc-danger);
375 font-family: var(--alc-font-mono);
376 font-size: 11.5px;
377}
378.prf-checks {
379 border: 1px solid rgba(232, 220, 192, 0.1);
380 border-radius: 8px;
381 overflow: hidden;
382}
383.prf-check {
384 display: flex;
385 align-items: center;
386 gap: 10px;
387 padding: 9px 12px;
388 font-size: 12.5px;
389}
390.prf-checks > * + .prf-check {
391 border-top: 1px solid rgba(232, 220, 192, 0.08);
392}
393.prf-check__name {
394 flex: 1;
395 min-width: 0;
396 overflow: hidden;
397 text-overflow: ellipsis;
398 white-space: nowrap;
399 color: var(--alc-fg-invert);
400}
401.prf-check__state {
402 color: var(--alc-code-comment);
403 font-size: 12px;
404}
405.prf-checks .prf-mergebox {
406 border: none;
407 border-top: 1px solid color-mix(in srgb, var(--prf-open) 35%, transparent);
408 border-radius: 0;
409}
410.prf-comment {
411 border: 1px solid rgba(232, 220, 192, 0.12);
412 border-radius: 8px;
413 overflow: hidden;
414}
415.prf-comment__head {
416 display: flex;
417 align-items: center;
418 gap: 7px;
419 padding: 8px 12px;
420 font-size: 12.5px;
421 color: var(--alc-fg-invert);
422 background: rgba(255, 255, 255, 0.03);
423 border-bottom: 1px solid rgba(232, 220, 192, 0.08);
424}
425.prf-avatar {
426 display: grid;
427 place-items: center;
428 width: 20px;
429 height: 20px;
430 border-radius: 50%;
431 background: #14110d;
432 border: 1px solid rgba(232, 220, 192, 0.18);
433}
434.prf-avatar svg {
435 display: block;
436}
437.prf-bot {
438 padding: 0 6px;
439 border: 1px solid rgba(232, 220, 192, 0.25);
440 border-radius: 999px;
441 font-size: 10.5px;
442 color: var(--alc-code-comment);
443}
444.prf-comment__body {
445 padding: 10px 12px 12px;
446 display: grid;
447 gap: 4px;
448}
449.prf-comment__h {
450 font-weight: 600;
451 font-size: 14px;
452 color: var(--alc-fg-invert);
453}
454.prf-url {
455 font-family: var(--alc-font-mono);
456 font-size: 12px;
457 color: var(--alc-code-type);
458 text-decoration: underline;
459 text-underline-offset: 2px;
460}
461.prf-comment code,
462.prf-event code {
463 font-family: var(--alc-font-mono);
464 font-size: 11px;
465 padding: 1px 5px;
466 border-radius: 4px;
467 background: rgba(255, 255, 255, 0.06);
468 color: var(--alc-fg-invert);
469}
470.prf-mergebox {
471 display: flex;
472 align-items: center;
473 justify-content: space-between;
474 gap: 10px;
475 padding: 10px 12px;
476 border: 1px solid color-mix(in srgb, var(--prf-open) 40%, transparent);
477 border-radius: 8px;
478 font-size: 12.5px;
479 color: var(--alc-fg-invert);
480}
481.prf-mergebox__ok {
482 display: flex;
483 align-items: center;
484 gap: 8px;
485}
486.prf-mergebtn {
487 padding: 6px 12px;
488 border-radius: 6px;
489 background: var(--prf-open-solid);
490 color: var(--alc-fg-on-accent);
491 font-weight: 600;
492 font-size: 12.5px;
493 white-space: nowrap;
494 transition:
495 transform 120ms ease,
496 background 120ms ease;
497}
498.prf-mergebtn.is-pressed {
499 transform: scale(0.95);
500 background: var(--prf-merged-solid);
501}
502.prf-event {
503 display: flex;
504 align-items: center;
505 gap: 10px;
506 font-size: 12.5px;
507 color: var(--alc-fg-invert);
508}
509.prf-event__icon {
510 flex: none;
511 display: grid;
512 place-items: center;
513 width: 24px;
514 height: 24px;
515 border-radius: 50%;
516 color: var(--alc-fg-on-accent);
517}
518.prf-event__icon--merged {
519 background: var(--prf-merged-solid);
520}
521.prf-event__icon--you {
522 background: var(--alc-terracotta);
523 font-size: 9.5px;
524 font-weight: 700;
525}
526
527/* ---------- Actions job (expandable) ---------- */
528/* Height 0 <-> auto via a single-row grid. */
529.prf-collapse {
530 display: grid;
531 grid-template-rows: 1fr;
532 transition:
533 grid-template-rows 420ms cubic-bezier(0.2, 0, 0, 1),
534 opacity 260ms ease;
535}
536.prf-collapse > div {
537 min-height: 0;
538 overflow: hidden;
539}
540.prf-collapse.is-closed {
541 grid-template-rows: 0fr;
542 opacity: 0;
543}
544.prf-jobs {
545 flex: 1;
546 min-height: 0;
547 overflow: hidden;
548 display: flex;
549 flex-direction: column;
550 gap: 10px;
551 padding: 14px 16px 16px;
552 font-size: 12.5px;
553}
554.prf-jobs__wait {
555 padding: 2px 4px;
556}
557.prf-job__trigger {
558 padding: 10px 14px 4px;
559 font-family: var(--alc-font-mono);
560 font-size: 11.5px;
561 color: var(--alc-fg-invert);
562 white-space: nowrap;
563 overflow: hidden;
564 text-overflow: ellipsis;
565}
566.prf-job {
567 flex: none;
568 display: flex;
569 flex-direction: column;
570 border: 1px solid rgba(232, 220, 192, 0.1);
571 border-radius: 8px;
572 overflow: hidden;
573}
574.prf-job__head {
575 flex: none;
576 display: flex;
577 align-items: center;
578 gap: 9px;
579 padding: 10px 12px;
580 color: var(--alc-fg-invert);
581 background: rgba(255, 255, 255, 0.03);
582 border-bottom: 1px solid transparent;
583 transition: border-color 300ms ease;
584}
585.prf-job.is-expanded .prf-job__head {
586 border-bottom-color: rgba(232, 220, 192, 0.08);
587}
588.prf-job__head .prf-muted {
589 margin-left: auto;
590 font-size: 11.5px;
591 white-space: nowrap;
592}
593.prf-job__step:last-child {
594 margin-bottom: 6px;
595}
596.prf-job__step {
597 display: flex;
598 align-items: center;
599 gap: 10px;
600 padding: 8px 12px 8px 14px;
601 font-family: var(--alc-font-mono);
602 font-size: 12px;
603 color: var(--alc-code-comment);
604 transition: color 200ms ease;
605}
606.prf-job__step.is-running,
607.prf-job__step.is-success {
608 color: var(--alc-fg-invert);
609}
610.prf-job__done {
611 flex: none;
612 display: flex;
613 align-items: center;
614 gap: 6px;
615 padding: 9px 14px;
616 animation: prf-fade 300ms ease both;
617}
618.prf-job__done .prf-muted {
619 margin-left: 4px;
620 font-size: 11.5px;
621}
622.prf-xstep {
623 display: flex;
624 flex-direction: column;
625 margin: 0 10px 10px;
626 border: 1px solid rgba(232, 220, 192, 0.12);
627 border-radius: 7px;
628 overflow: hidden;
629 background: rgba(0, 0, 0, 0.18);
630 animation: prf-expand 460ms cubic-bezier(0.2, 0, 0, 1) both;
631}
632@keyframes prf-expand {
633 from {
634 opacity: 0;
635 transform: translateY(-4px);
636 clip-path: inset(0 0 100% 0);
637 }
638 to {
639 clip-path: inset(0 0 0 0);
640 }
641}
642.prf-xstep__head {
643 flex: none;
644 display: flex;
645 align-items: center;
646 gap: 10px;
647 padding: 8px 12px;
648 font-family: var(--alc-font-mono);
649 font-size: 12px;
650 color: var(--alc-fg-invert);
651 background: rgba(255, 255, 255, 0.04);
652 border-bottom: 1px solid rgba(232, 220, 192, 0.08);
653}
654.prf-xstep__chev {
655 margin-left: auto;
656 color: var(--alc-code-comment);
657}
658.prf-log {
659 padding: 8px 0 12px;
660 font-family: var(--alc-font-mono);
661 font-size: 12px;
662 line-height: 1.7;
663}
664.prf-log__line {
665 display: flex;
666 gap: 12px;
667 padding: 0 12px 0 0;
668 white-space: pre;
669}
670.prf-log__n {
671 flex: none;
672 width: 26px;
673 text-align: right;
674 color: rgba(232, 220, 192, 0.3);
675 user-select: none;
676}
677.prf-log__t {
678 min-width: 0;
679 overflow: hidden;
680 text-overflow: ellipsis;
681}
682.prf-log__icon {
683 display: inline-block;
684 width: 1.4em;
685}
686
687/* ---------- browser tab (test step) ---------- */
688/* PR window title bar doubles as a browser tab strip. */
689.prf-win__bar--tabs {
690 align-items: flex-end;
691 gap: 6px;
692 padding: 8px 12px 0;
693 background: rgba(0, 0, 0, 0.22);
694}
695.prf-win__bar--tabs .prf-dot {
696 margin-bottom: 11px;
697}
698.prf-win__bar--tabs .prf-dot:nth-child(3) {
699 margin-right: 8px;
700}
701.prf-btab {
702 display: flex;
703 align-items: center;
704 gap: 7px;
705 min-width: 0;
706 max-width: 200px;
707 padding: 7px 12px 8px;
708 border-radius: 7px 7px 0 0;
709 font-size: 11.5px;
710 color: var(--alc-code-comment);
711 white-space: nowrap;
712 overflow: hidden;
713 text-overflow: ellipsis;
714 transition:
715 background 200ms ease,
716 color 200ms ease;
717}
718.prf-btab svg {
719 flex: none;
720}
721.prf-btab.is-active {
722 background: var(--alc-bg-code);
723 color: var(--alc-fg-invert);
724}
725.prf-btab.is-new {
726 animation: prf-tab-grow 320ms cubic-bezier(0.2, 0, 0, 1) both;
727}
728.prf-btab.is-closing {
729 animation: prf-tab-shrink 300ms cubic-bezier(0.4, 0, 1, 1) both;
730}
731@keyframes prf-tab-grow {
732 from {
733 max-width: 0;
734 padding-inline: 0;
735 opacity: 0;
736 }
737}
738@keyframes prf-tab-shrink {
739 to {
740 max-width: 0;
741 padding-inline: 0;
742 opacity: 0;
743 }
744}
745.prf-btab__x {
746 margin-left: 4px;
747 color: var(--alc-code-comment);
748}
749.prf-btab__spin {
750 flex: none;
751 width: 9px;
752 height: 9px;
753 border-radius: 50%;
754 border: 1.5px solid rgba(232, 220, 192, 0.25);
755 border-top-color: var(--alc-accent-bright);
756 animation: prf-spin 700ms linear infinite;
757}
758.prf-pr .prf-win__body {
759 position: relative;
760}
761.prf-pr__url {
762 flex: none;
763 margin: 8px 12px 0;
764 padding: 5px 10px;
765 border-radius: 6px;
766 background: rgba(0, 0, 0, 0.25);
767 font-family: var(--alc-font-mono);
768 font-size: 11px;
769 color: var(--alc-code-comment);
770 white-space: nowrap;
771 overflow: hidden;
772 text-overflow: ellipsis;
773}
774/* The preview page covers the PR while its tab is active. */
775.prf-tabpage {
776 position: absolute;
777 inset: 0;
778 z-index: 2;
779 display: flex;
780 flex-direction: column;
781 background: var(--alc-bg-code);
782 animation: prf-fade 220ms ease both;
783}
784.prf-tabpage.is-closing {
785 animation: prf-fade-out 300ms ease both;
786}
787@keyframes prf-fade-out {
788 to {
789 opacity: 0;
790 }
791}
792.prf-tabwin__url {
793 flex: none;
794 display: flex;
795 align-items: center;
796 gap: 6px;
797 margin: 8px 12px 8px;
798 padding: 5px 10px;
799 border-radius: 6px;
800 background: rgba(0, 0, 0, 0.25);
801 font-family: var(--alc-font-mono);
802 font-size: 11px;
803 color: var(--alc-fg-invert);
804 white-space: nowrap;
805 overflow: hidden;
806}
807.prf-tabwin__url svg {
808 flex: none;
809 color: var(--prf-open);
810}
811.prf-tabwin__driven {
812 margin-left: auto;
813 padding: 1px 7px;
814 border-radius: 999px;
815 background: rgba(232, 176, 74, 0.14);
816 color: var(--alc-warn);
817 font-family: var(--alc-font-sans);
818 font-size: 10.5px;
819}
820.prf-site {
821 flex: 1;
822 min-height: 0;
823 display: flex;
824 flex-direction: column;
825 background: #f4efe2;
826 color: #2a2620;
827}
828.prf-site__loading {
829 margin: auto;
830 width: 26px;
831 height: 26px;
832 border-radius: 50%;
833 border: 3px solid rgba(42, 38, 32, 0.15);
834 border-top-color: #3f5a2a;
835 animation: prf-spin 700ms linear infinite;
836}
837@keyframes prf-spin {
838 to {
839 transform: rotate(1turn);
840 }
841}
842.prf-site__nav {
843 display: flex;
844 align-items: center;
845 justify-content: space-between;
846 padding: 12px 16px;
847 border-bottom: 1px solid rgba(42, 38, 32, 0.1);
848 animation: prf-fade 240ms ease both;
849}
850.prf-site__logo {
851 font-family: var(--alc-font-serif);
852 font-style: italic;
853 font-size: 18px;
854 font-weight: 600;
855}
856.prf-site__upload {
857 padding: 5px 11px;
858 border-radius: 6px;
859 background: #3f5a2a;
860 color: #fbf6ea;
861 font-size: 12px;
862 font-weight: 600;
863}
864.prf-site__grid {
865 flex: 1;
866 min-height: 0;
867 display: grid;
868 grid-template-columns: repeat(3, 1fr);
869 grid-auto-rows: 1fr;
870 gap: 10px;
871 padding: 14px 16px;
872}
873.prf-site__tile {
874 position: relative;
875 overflow: hidden;
876 border-radius: 8px;
877 background: rgba(42, 38, 32, 0.08);
878}
879.prf-site__progress {
880 position: absolute;
881 left: 10px;
882 right: 10px;
883 bottom: 10px;
884 height: 5px;
885 border-radius: 3px;
886 background: rgba(42, 38, 32, 0.12);
887 overflow: hidden;
888}
889.prf-site__progress span {
890 display: block;
891 height: 100%;
892 background: #3f5a2a;
893 transform-origin: left;
894}
895.prf-site__new {
896 position: absolute;
897 top: 8px;
898 left: 8px;
899 padding: 1px 7px;
900 border-radius: 999px;
901 background: #fbf6ea;
902 color: #3f5a2a;
903 font-size: 10.5px;
904 font-weight: 700;
905 letter-spacing: 0.06em;
906 text-transform: uppercase;
907}
908.prf-site__foot {
909 display: flex;
910 align-items: center;
911 gap: 6px;
912 padding: 9px 16px 12px;
913 border-top: 1px solid rgba(42, 38, 32, 0.08);
914 font-size: 11.5px;
915 color: rgba(42, 38, 32, 0.7);
916}
917.prf-site__pulse {
918 width: 7px;
919 height: 7px;
920 border-radius: 50%;
921 background: var(--alc-warn);
922 animation: prf-pulse 1s ease-in-out infinite;
923}
924@keyframes prf-pulse {
925 50% {
926 opacity: 0.3;
927 }
928}
929.prf-site__slow {
930 margin-left: auto;
931 padding: 1px 7px;
932 border-radius: 999px;
933 background: rgba(42, 38, 32, 0.08);
934 font-size: 10.5px;
935}
936.prf-site__ok {
937 width: 14px;
938 height: 14px;
939 font-size: 9px;
940}
941
942/* ---------- responsive ---------- */
943@media (max-width: 880px) {
944 .prf-stage {
945 grid-template-columns: minmax(0, 1fr);
946 }
947 .prf {
948 --prf-h: 340px;
949 }
950}
951@media (max-width: 640px) {
952 .prf-tabs {
953 display: flex;
954 overflow-x: auto;
955 scrollbar-width: none;
956 }
957 .prf-tab {
958 flex: none;
959 padding-inline: 12px;
960 }
961}
962@media (prefers-reduced-motion: reduce) {
963 .prf-enter,
964 .prf-xstep,
965 .prf-job__done,
966 .prf-tabpage,
967 .prf-btab.is-new,
968 .prf-btab.is-closing {
969 animation: none;
970 }
971 .prf-collapse,
972 .prf-tabs__pill {
973 transition: none;
974 }
975}