+
+
+ Accent · dev
+
+
+
+
+
+ {PRESETS.map((p) => {
+ const active = p.h === h && p.cm === cm;
+ return (
+
+
+
+
+
+
+
+
+ h:{h} cm:{cm}
+
+
+
+
+ );
+}
diff --git a/vibn-frontend/app/(marketing)/new-site.tsx b/vibn-frontend/app/(marketing)/new-site.tsx
index 4ca1646d..a7365dad 100644
--- a/vibn-frontend/app/(marketing)/new-site.tsx
+++ b/vibn-frontend/app/(marketing)/new-site.tsx
@@ -915,10 +915,23 @@ function Hero({ onStart, variant = "quote" }) {
line-height: 0.98;
text-wrap: balance;
position: relative;
- color: var(--fg);
+ /* Silver / brushed-metal heading: bright at the top, fading to a soft
+ pewter at the bottom, clipped to the text. */
+ background-image: linear-gradient(
+ 180deg,
+ oklch(0.99 0.003 80) 0%,
+ oklch(0.86 0.004 80) 42%,
+ oklch(0.66 0.006 80) 100%
+ );
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ -webkit-text-fill-color: transparent;
}
.hero-quote .mark {
+ /* keep the accent word in full color inside the silver heading */
color: var(--accent);
+ -webkit-text-fill-color: var(--accent);
font-family: "Geist", serif;
font-weight: 500;
line-height: 0;
@@ -963,13 +976,62 @@ function Hero({ onStart, variant = "quote" }) {
border-radius: var(--r-xl);
padding: 1px;
background: linear-gradient(180deg,
- oklch(0.50 0.06 35 / 0.6),
+ oklch(0.50 calc(0.06 * var(--accent-cm)) var(--accent-h) / 0.6),
oklch(0.30 0.012 60 / 0.4) 40%,
oklch(0.25 0.012 60 / 0.4));
box-shadow:
0 30px 80px -20px oklch(0 0 0 / 0.6),
0 0 80px -20px var(--accent-glow);
}
+ /* Animated border beam (Magic UI style): a light comet that travels
+ the border, masked to a thin ring and themed to the accent. */
+ .prompt-beam {
+ position: absolute;
+ inset: 0;
+ border-radius: inherit;
+ padding: 1.5px;
+ pointer-events: none;
+ z-index: 2;
+ -webkit-mask:
+ linear-gradient(#000 0 0) content-box,
+ linear-gradient(#000 0 0);
+ mask:
+ linear-gradient(#000 0 0) content-box,
+ linear-gradient(#000 0 0);
+ -webkit-mask-composite: xor;
+ mask-composite: exclude;
+ overflow: hidden;
+ }
+ .prompt-beam::before {
+ content: "";
+ position: absolute;
+ width: 170px;
+ aspect-ratio: 1;
+ offset-path: rect(0 auto auto 0 round var(--r-xl));
+ offset-distance: 0%;
+ offset-anchor: 50% 50%;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--accent) 38%,
+ oklch(0.95 calc(0.05 * var(--accent-cm)) var(--accent-h)) 50%,
+ var(--accent) 62%,
+ transparent
+ );
+ filter: blur(3px);
+ animation: prompt-beam 11s linear infinite;
+ }
+ @keyframes prompt-beam {
+ to {
+ offset-distance: 100%;
+ }
+ }
+ @media (prefers-reduced-motion: reduce) {
+ .prompt-beam::before {
+ animation: none;
+ opacity: 0;
+ }
+ }
.prompt-inner {
background: linear-gradient(180deg, oklch(0.19 0.009 60 / 0.92), oklch(0.17 0.008 60 / 0.92));
border-radius: calc(var(--r-xl) - 1px);
@@ -1037,7 +1099,7 @@ function Hero({ onStart, variant = "quote" }) {
background: var(--accent);
color: var(--accent-fg);
font-weight: 500; font-size: 14px;
- box-shadow: 0 0 0 1px oklch(0.84 0.16 35 / 0.5) inset, 0 8px 28px -8px var(--accent-glow);
+ box-shadow: 0 0 0 1px oklch(0.84 calc(0.16 * var(--accent-cm)) var(--accent-h) / 0.5) inset, 0 8px 28px -8px var(--accent-glow);
transition: transform .12s;
}
.prompt-send:hover { transform: translateY(-1px); }
@@ -1095,17 +1157,17 @@ function Hero({ onStart, variant = "quote" }) {
{/* ambient glows behind hero */}