From e94987e5a4f0890b7617dc36996b2fd673a2f486 Mon Sep 17 00:00:00 2001 From: BFlat Date: Thu, 18 Jun 2026 23:05:09 +0700 Subject: [PATCH] Restyle manifesto "control" emphasis as a tilted marker highlight Swap the underline for a shared MarkerHighlight SVG stroke behind the word. Desktop reveal wipes left-to-right via clip-path instead of scaleX so the stroke is uncovered, not stretched. --- .../src/pages/landing3/landing3.tsx | 69 +++++++++++++------ 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/frontend/apps/artcraft-website/src/pages/landing3/landing3.tsx b/frontend/apps/artcraft-website/src/pages/landing3/landing3.tsx index 6b61ac424b..2d562044d0 100644 --- a/frontend/apps/artcraft-website/src/pages/landing3/landing3.tsx +++ b/frontend/apps/artcraft-website/src/pages/landing3/landing3.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState, useLayoutEffect } from "react"; +import type { ReactNode } from "react"; import { isMobile, isMacOs } from "react-device-detect"; import Lenis from "lenis"; import gsap from "gsap"; @@ -133,6 +134,44 @@ const MANIFESTO_WORDS: ReadonlyArray = [ "shot.", ]; +// Hand-drawn marker stroke (tapered ends, slight middle bulge, gentle tilt) +// that sits behind an emphasized word like a highlighter pass. The wrapping +// span carries `data-manifesto-underline` so the GSAP timeline can sweep it +// in left-to-right; pass `animate={false}` for the static (mobile) version. +const MarkerHighlight = ({ + children, + animate = true, +}: { + children: ReactNode; + animate?: boolean; +}) => ( + + + {children} + +); + // Lazy autoplay video — defers the network fetch + decoder spin-up until // the element is approaching the viewport. Avoids ~7 simultaneous webm // downloads stealing main-thread + bandwidth from the hero animation. @@ -471,19 +510,18 @@ const Landing3 = () => { ); }); - // Phase 1b — once the sentence is fully revealed, draw a blue - // underline in under "control" to land the emphasis. + // Phase 1b — once the sentence is fully revealed, sweep a blue + // highlighter block across "control" to land the emphasis. const manifestoUnderline = manifestoSection.querySelector( "[data-manifesto-underline]", ); if (manifestoUnderline) { gsap.set(manifestoUnderline, { - scaleX: 0, - transformOrigin: "left center", + clipPath: "inset(0 100% 0 0)", }); tl.to( manifestoUnderline, - { scaleX: 1, duration: 4, ease: "power2.out" }, + { clipPath: "inset(0 0% 0 0)", duration: 4, ease: "power2.out" }, ">", ); } @@ -741,9 +779,7 @@ const Landing3 = () => { {MANIFESTO_WORDS.map((w, i) => ( {w === "control" ? ( - - {w} - + {w} ) : ( w )} @@ -800,18 +836,7 @@ const Landing3 = () => { data-manifesto-word className="inline-block opacity-15 will-change-[opacity,transform]" > - {w === "control" ? ( - - {w} - - - ) : ( - w - )} + {w === "control" ? {w} : w} {i < MANIFESTO_WORDS.length - 1 ? " " : ""} ))} @@ -1056,7 +1081,7 @@ const Landing3 = () => {
- {/* Reason #1: Text Prompting Sucks */} + {/* Reason #1: PC - Control Beyond Text Prompting */}
@@ -1071,7 +1096,7 @@ const Landing3 = () => {

- Text Prompting Sucks + Control Beyond Text Prompting