Skip to content

Commit df029ad

Browse files
committed
Merge branch '5.x' of github.com:pestphp/pestphp.com into 5.x
2 parents f945f16 + 927a0e9 commit df029ad

7 files changed

Lines changed: 69 additions & 15 deletions

File tree

public/www/index-4850bc89.css

Lines changed: 0 additions & 1 deletion
This file was deleted.

public/www/index-75b02b45.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/www/index.html

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,9 @@
8282
]
8383
}
8484
</script>
85-
<script type="module" crossorigin src="/www/index.d486ec1a.js"></script>
86-
<link rel="stylesheet" href="/www/index-4850bc89.css">
85+
<script>try { if (+sessionStorage.getItem('pest-scroll') > 100) document.documentElement.classList.add('no-intro'); } catch (e) {}</script>
86+
<script type="module" crossorigin src="/www/index.34cf911c.js"></script>
87+
<link rel="stylesheet" href="/www/index-75b02b45.css">
8788
</head>
8889

8990
<body x-data="{ mobileMenuIsOpen: false }" class="font-synthesis-none overflow-x-clip bg-zinc-900 font-sans text-zinc-200 antialiased selection:bg-rose-600 selection:text-white">
@@ -666,7 +667,12 @@ <h3 class="font-display font-stretch-112% text-balance text-xl font-bold">Loved
666667
<section aria-label="Get started" class="relative border-y border-zinc-700">
667668
<span class="-left-1.25 -top-1.25 size-2.25 before:w-2.25 after:h-2.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
668669
<span class="-right-1.25 -top-1.25 size-2.25 before:w-2.25 after:h-2.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
669-
<div class="bg-size-[56px_56px] mask-[radial-gradient(ellipse_70%_90%_at_50%_45%,#000_30%,transparent_75%)] absolute inset-0 bg-[linear-gradient(var(--color-zinc-700)_1px,transparent_1px),linear-gradient(90deg,var(--color-zinc-700)_1px,transparent_1px)] opacity-50"></div>
670+
<div class="bg-size-[56px_56px] mask-[radial-gradient(ellipse_70%_90%_at_50%_45%,#000_30%,transparent_75%)] absolute inset-0 bg-[linear-gradient(var(--color-zinc-700)_1px,transparent_1px),linear-gradient(90deg,var(--color-zinc-700)_1px,transparent_1px)] opacity-50" x-data x-init="$el.querySelectorAll('[data-beam]').forEach(b => { const roll = () => { const h = b.dataset.beam === 'x'; const lines = Math.floor((h ? $el.clientHeight : $el.clientWidth) / 56); b.style[h ? 'top' : 'left'] = 56 * (1 + Math.floor(Math.random() * (lines - 1))) + 'px'; b.style.setProperty('--beam-duration', (4 + 8 * Math.random()).toFixed(1) + 's'); b.style.animationDirection = Math.random() < 0.5 ? 'reverse' : 'normal'; }; roll(); b.addEventListener('animationiteration', roll) })">
671+
<span data-beam="x" class="animate-beam-x motion-reduce:hidden absolute inset-x-0 top-28 h-px bg-[linear-gradient(90deg,transparent,var(--color-rose-500),transparent)] bg-size-[160px_100%] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:7s]"></span>
672+
<span data-beam="x" class="animate-beam-x motion-reduce:hidden absolute inset-x-0 top-56 h-px bg-[linear-gradient(90deg,transparent,var(--color-rose-500),transparent)] bg-size-[160px_100%] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:11s] [--beam-delay:5.5s]"></span>
673+
<span data-beam="y" class="animate-beam-y motion-reduce:hidden absolute inset-y-0 left-70 w-px bg-[linear-gradient(180deg,transparent,var(--color-rose-500),transparent)] bg-size-[100%_160px] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:13s] [--beam-delay:3.5s]"></span>
674+
<span data-beam="y" class="animate-beam-y motion-reduce:hidden absolute inset-y-0 left-140 w-px bg-[linear-gradient(180deg,transparent,var(--color-rose-500),transparent)] bg-size-[100%_160px] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:8s] [--beam-delay:1s]"></span>
675+
</div>
670676
<div class="relative mx-auto flex max-w-2xl flex-col items-center px-5 py-20 text-center lg:py-24">
671677
<h2 class="font-display font-stretch-112% text-balance text-3xl font-extrabold tracking-tight sm:text-4xl">Bring back the joy of testing. <em class="text-rose-500">Again.</em></h2>
672678
<p class="mt-4 text-pretty text-lg text-zinc-400">The biggest release of Pest yet — for most suites, a one-line upgrade.</p>
@@ -684,8 +690,9 @@ <h2 class="font-display font-stretch-112% text-balance text-3xl font-extrabold t
684690
</section>
685691
</main>
686692

687-
<footer class="container mx-auto px-5 pb-8 pt-16 sm:px-10">
688-
<nav aria-label="Footer" class="columns-2 gap-x-6 lg:columns-3">
693+
<footer class="pb-8">
694+
<div class="container relative mx-auto border-b border-zinc-700 px-5 pb-6 pt-16 sm:border-x sm:px-10">
695+
<nav aria-label="Footer" class="columns-2 gap-x-6 lg:columns-3">
689696
<div class="mb-10 break-inside-avoid">
690697
<h3 class="mb-4 flex items-center gap-2.5 font-mono text-2xs font-bold uppercase tracking-widest text-zinc-500"><span class="text-rose-500">//</span> what's new</h3>
691698
<ul class="space-y-3 text-sm">
@@ -764,8 +771,12 @@ <h3 class="mb-4 flex items-center gap-2.5 font-mono text-2xs font-bold uppercase
764771
<li><a class="text-zinc-400 underline-offset-4 transition-colors hover:text-zinc-200 hover:underline" href="/docs/why-pest">Why Pest</a></li>
765772
</ul>
766773
</div>
767-
</nav>
768-
<div class="mt-14 flex flex-col items-start justify-between gap-4 border-t border-zinc-700 pt-8 text-xs text-zinc-400 sm:flex-row sm:items-center">
774+
</nav>
775+
<span class="-bottom-1.25 size-2.25 before:w-2.25 after:h-2.25 -left-1.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
776+
<span class="-bottom-1.25 -right-1.25 size-2.25 before:w-2.25 after:h-2.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
777+
</div>
778+
<div class="container mx-auto px-5 pt-8 sm:px-10">
779+
<div class="flex flex-col items-start justify-between gap-4 text-xs text-zinc-400 sm:flex-row sm:items-center">
769780
<div class="font-mono">© 2026 PestPHP — A project by <a class="font-medium underline underline-offset-4 hover:no-underline" href="https://pinkary.com/@nunomaduro">Nuno Maduro</a>. Designed by <a class="font-medium underline-offset-4 underline hover:no-underline" href="https://nunoguerra.com/?ref=nunomaduro">Nuno Guerra</a>.</div>
770781
<div class="flex items-center gap-5 font-mono">
771782
<a class="underline-offset-4 hover:underline" href="/llms.txt">/llms.txt</a>
@@ -775,7 +786,9 @@ <h3 class="mb-4 flex items-center gap-2.5 font-mono text-2xs font-bold uppercase
775786
</div>
776787
<svg aria-hidden="true" class="mt-10 h-auto w-full fill-white/10" viewBox="0 0 381 100" xmlns="http://www.w3.org/2000/svg">
777788
<use href="#pest-wordmark" />
789+
<use href="#pest-wordmark" class="animate-trace motion-reduce:hidden fill-none stroke-rose-500/60 drop-shadow-[0_0_4px_var(--color-rose-500)] [stroke-dasharray:40_360] stroke-[0.3]" />
778790
</svg>
791+
</div>
779792
</footer>
780793

781794

resources/www/index.html

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
]
8383
}
8484
</script>
85+
<script>try { if (+sessionStorage.getItem('pest-scroll') > 100) document.documentElement.classList.add('no-intro'); } catch (e) {}</script>
8586
</head>
8687

8788
<body x-data="{ mobileMenuIsOpen: false }" class="font-synthesis-none overflow-x-clip bg-zinc-900 font-sans text-zinc-200 antialiased selection:bg-rose-600 selection:text-white">
@@ -664,7 +665,12 @@ <h3 class="font-display font-stretch-112% text-balance text-xl font-bold">Loved
664665
<section aria-label="Get started" class="relative border-y border-zinc-700">
665666
<span class="-left-1.25 -top-1.25 size-2.25 before:w-2.25 after:h-2.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
666667
<span class="-right-1.25 -top-1.25 size-2.25 before:w-2.25 after:h-2.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
667-
<div class="bg-size-[56px_56px] mask-[radial-gradient(ellipse_70%_90%_at_50%_45%,#000_30%,transparent_75%)] absolute inset-0 bg-[linear-gradient(var(--color-zinc-700)_1px,transparent_1px),linear-gradient(90deg,var(--color-zinc-700)_1px,transparent_1px)] opacity-50"></div>
668+
<div class="bg-size-[56px_56px] mask-[radial-gradient(ellipse_70%_90%_at_50%_45%,#000_30%,transparent_75%)] absolute inset-0 bg-[linear-gradient(var(--color-zinc-700)_1px,transparent_1px),linear-gradient(90deg,var(--color-zinc-700)_1px,transparent_1px)] opacity-50" x-data x-init="$el.querySelectorAll('[data-beam]').forEach(b => { const roll = () => { const h = b.dataset.beam === 'x'; const lines = Math.floor((h ? $el.clientHeight : $el.clientWidth) / 56); b.style[h ? 'top' : 'left'] = 56 * (1 + Math.floor(Math.random() * (lines - 1))) + 'px'; b.style.setProperty('--beam-duration', (4 + 8 * Math.random()).toFixed(1) + 's'); b.style.animationDirection = Math.random() < 0.5 ? 'reverse' : 'normal'; }; roll(); b.addEventListener('animationiteration', roll) })">
669+
<span data-beam="x" class="animate-beam-x motion-reduce:hidden absolute inset-x-0 top-28 h-px bg-[linear-gradient(90deg,transparent,var(--color-rose-500),transparent)] bg-size-[160px_100%] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:7s]"></span>
670+
<span data-beam="x" class="animate-beam-x motion-reduce:hidden absolute inset-x-0 top-56 h-px bg-[linear-gradient(90deg,transparent,var(--color-rose-500),transparent)] bg-size-[160px_100%] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:11s] [--beam-delay:5.5s]"></span>
671+
<span data-beam="y" class="animate-beam-y motion-reduce:hidden absolute inset-y-0 left-70 w-px bg-[linear-gradient(180deg,transparent,var(--color-rose-500),transparent)] bg-size-[100%_160px] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:13s] [--beam-delay:3.5s]"></span>
672+
<span data-beam="y" class="animate-beam-y motion-reduce:hidden absolute inset-y-0 left-140 w-px bg-[linear-gradient(180deg,transparent,var(--color-rose-500),transparent)] bg-size-[100%_160px] bg-no-repeat drop-shadow-[0_0_6px_var(--color-rose-500)] [--beam-duration:8s] [--beam-delay:1s]"></span>
673+
</div>
668674
<div class="relative mx-auto flex max-w-2xl flex-col items-center px-5 py-20 text-center lg:py-24">
669675
<h2 class="font-display font-stretch-112% text-balance text-3xl font-extrabold tracking-tight sm:text-4xl">Bring back the joy of testing. <em class="text-rose-500">Again.</em></h2>
670676
<p class="mt-4 text-pretty text-lg text-zinc-400">The biggest release of Pest yet — for most suites, a one-line upgrade.</p>
@@ -682,8 +688,9 @@ <h2 class="font-display font-stretch-112% text-balance text-3xl font-extrabold t
682688
</section>
683689
</main>
684690

685-
<footer class="container mx-auto px-5 pb-8 pt-16 sm:px-10">
686-
<nav aria-label="Footer" class="columns-2 gap-x-6 lg:columns-3">
691+
<footer class="pb-8">
692+
<div class="container relative mx-auto border-b border-zinc-700 px-5 pb-6 pt-16 sm:border-x sm:px-10">
693+
<nav aria-label="Footer" class="columns-2 gap-x-6 lg:columns-3">
687694
<div class="mb-10 break-inside-avoid">
688695
<h3 class="mb-4 flex items-center gap-2.5 font-mono text-2xs font-bold uppercase tracking-widest text-zinc-500"><span class="text-rose-500">//</span> what's new</h3>
689696
<ul class="space-y-3 text-sm">
@@ -762,8 +769,12 @@ <h3 class="mb-4 flex items-center gap-2.5 font-mono text-2xs font-bold uppercase
762769
<li><a class="text-zinc-400 underline-offset-4 transition-colors hover:text-zinc-200 hover:underline" href="/docs/why-pest">Why Pest</a></li>
763770
</ul>
764771
</div>
765-
</nav>
766-
<div class="mt-14 flex flex-col items-start justify-between gap-4 border-t border-zinc-700 pt-8 text-xs text-zinc-400 sm:flex-row sm:items-center">
772+
</nav>
773+
<span class="-bottom-1.25 size-2.25 before:w-2.25 after:h-2.25 -left-1.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
774+
<span class="-bottom-1.25 -right-1.25 size-2.25 before:w-2.25 after:h-2.25 pointer-events-none absolute z-10 before:absolute before:left-0 before:top-1 before:h-px before:bg-rose-500 before:content-[''] after:absolute after:left-1 after:top-0 after:w-px after:bg-rose-500 after:content-['']"></span>
775+
</div>
776+
<div class="container mx-auto px-5 pt-8 sm:px-10">
777+
<div class="flex flex-col items-start justify-between gap-4 text-xs text-zinc-400 sm:flex-row sm:items-center">
767778
<div class="font-mono">© 2026 PestPHP — A project by <a class="font-medium underline underline-offset-4 hover:no-underline" href="https://pinkary.com/@nunomaduro">Nuno Maduro</a>. Designed by <a class="font-medium underline-offset-4 underline hover:no-underline" href="https://nunoguerra.com/?ref=nunomaduro">Nuno Guerra</a>.</div>
768779
<div class="flex items-center gap-5 font-mono">
769780
<a class="underline-offset-4 hover:underline" href="/llms.txt">/llms.txt</a>
@@ -773,7 +784,9 @@ <h3 class="mb-4 flex items-center gap-2.5 font-mono text-2xs font-bold uppercase
773784
</div>
774785
<svg aria-hidden="true" class="mt-10 h-auto w-full fill-white/10" viewBox="0 0 381 100" xmlns="http://www.w3.org/2000/svg">
775786
<use href="#pest-wordmark" />
787+
<use href="#pest-wordmark" class="animate-trace motion-reduce:hidden fill-none stroke-rose-500/60 drop-shadow-[0_0_4px_var(--color-rose-500)] [stroke-dasharray:40_360] stroke-[0.3]" />
776788
</svg>
789+
</div>
777790
</footer>
778791

779792
<script type="module" src="/main.js"></script>

resources/www/main.css

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@
4848
20%, 100% { background-position-y: calc(100% + 160px); }
4949
}
5050

51+
/* footer watermark: a neon segment traces the letter outlines.
52+
Offset shifts by exactly one dash period (40 + 360) per cycle, so the loop is seamless. */
53+
--animate-trace: trace 6s linear infinite;
54+
55+
@keyframes trace {
56+
to {
57+
stroke-dashoffset: -400;
58+
}
59+
}
60+
5161
/* hero intro: PEST wordmark flickers in CRT-style, then the overlay fades out */
5262
--animate-crt-in: crt-in 0.6s linear forwards;
5363

@@ -118,3 +128,13 @@ button {
118128
[x-tooltip] {
119129
cursor: help;
120130
}
131+
132+
/* refresh while scrolled past the hero: skip the intro and every enter animation
133+
(set as `no-intro` on <html> by the inline head script, pre-paint) */
134+
.no-intro [class*='motion-preset'],
135+
.no-intro .animate-border-in {
136+
animation: none !important;
137+
}
138+
.no-intro .animate-intro-out {
139+
display: none;
140+
}

resources/www/main.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,13 @@ document.addEventListener('alpine:init', () => {
4040
}));
4141
});
4242

43+
// Remember the scroll position across refreshes: the inline <head> script adds
44+
// `no-intro` on <html> when the page reloads scrolled past the hero, so the
45+
// enter animations (header, rails, grid, intro) only play at the top.
46+
try { sessionStorage.removeItem('pest-scroll') } catch (e) {}
47+
addEventListener('pagehide', () => {
48+
try { sessionStorage.setItem('pest-scroll', scrollY) } catch (e) {}
49+
})
50+
4351
window.Alpine = Alpine
4452
Alpine.start()

0 commit comments

Comments
 (0)