'use client' import { motion, MotionConfig, useInView, AnimatePresence, useScroll, useTransform, useReducedMotion, useMotionValue, useSpring, type Variants, } from "framer-motion"; import { Megaphone, MessageSquare, LineChart, Users, Wrench, ClipboardCheck, Mail, Phone, Menu, X } from "lucide-react"; import React, { useRef, useEffect, useState, useCallback } from 'react' import { Plus_Jakarta_Sans } from "next/font/google"; const headingFont = Plus_Jakarta_Sans({ subsets: ["latin"], weight: ["700", "800"], display: "swap", }); import { Manrope } from "next/font/google"; const sytuacjeFont = Manrope({ subsets: ["latin"], weight: ["700", "800"], display: "swap", }); /* ========================================================= Prime Code — Neo-Editorial+, full-bleed video hero Tekst zachowany 1:1 ========================================================= */ export default function Home() { const [openIndex, setOpenIndex] = useState(null) const [activeSection, setActiveSection] = useState('PrimeCode') const [mobileOpen, setMobileOpen] = useState(false); // blokuj scroll body, gdy menu otwarte useEffect(() => { document.body.style.overflow = mobileOpen ? "hidden" : ""; return () => { document.body.style.overflow = ""; }; }, [mobileOpen]); useEffect(() => { const sections = document.querySelectorAll('section[id]') const obs = new IntersectionObserver( (entries) => entries.forEach((e) => e.isIntersecting && setActiveSection(e.target.id)), { rootMargin: '-55% 0px -45% 0px' } ) sections.forEach((s) => obs.observe(s)) return () => obs.disconnect() }, []) const navItems = [ { id: 'PrimeCode', label: 'O nas' }, { id: 'Sytuacje', label: 'Wyzwania' }, { id: 'Partner', label: 'Twoje potrzeby' }, { id: 'Model', label: 'Model Prime Code' }, { id: 'CoPotrafimy', label: 'Co potrafimy?' }, { id: 'JakDzialamy', label: 'Jak działamy?' }, { id: 'PomogliśmyCaseStudies', label: 'Pomogliśmy' }, { id: 'Kontakt', label: 'Kontakt' }, ] const caseStudies = [ { title: 'Firma kosmetyczna', short: 'Nowa strategia detaliczna i transformacja doświadczenia klientek w salonach.', details: [ 'Opracowanie nowej strategii detalicznej, integrującej sprzedaż z usługami.', 'Zaprojektowanie atmosfery sklepów oraz selekcja unikalnego asortymentu.', 'Transformacja komunikacji – od eksperckiej wiedzy do relacji opartej na empatii.', 'Redefinicja propozycji wartości – skupienie na doświadczeniu troski o zdrowie i piękno.', 'Stworzenie concept store’u jako pełnego doświadczenia marki.', 'Przejście z jednego formatu sklepu na trzy lepiej dopasowane formaty detaliczne.', 'Zmiana podejścia operacyjnego: od 4P do 7P, z naciskiem na doświadczenie klientki.', ], }, { title: 'Firma paliwowa', short: 'Integracja doświadczenia na stacjach z tożsamością marki i branding sensoryczny.', details: [ 'Integracja strategii marki ze strategią doświadczeń klienta.', 'Badania neuromarketingowe i ponad 100 rekomendacji optymalizacyjnych.', 'Wielowarstwowa propozycja wartości – od tankowania po rozbudowane doświadczenie marki.', 'Identyfikacja momentów prawdy i plan zarządzania nimi.', 'Mapa ścieżek klienta z instrukcją optymalizacji.', 'Projekt atmosfery stacji (kolorystyka, zapach, układ).', 'Kompleksowy branding sensoryczny angażujący wszystkie zmysły.', 'Standardy obsługi klienta odzwierciedlające wartości marki.', 'Mapa wdrożenia z harmonogramem i wytycznymi operacyjnymi.', ], }, { title: 'Firma technologiczna', short: 'Nowa architektura marki, system kompetencji i kultura klientocentryczna.', details: [ 'Zaprojektowanie struktury organizacyjnej i systemu kompetencji.', 'Redefinicja architektury marki (przejście z house of brands na branded house).', 'System zarządzania wartością klienta – poziom strategiczny, operacyjny i personalny.', '„Playbooki” wdrażające pozycjonowanie do działań codziennych.', 'Usługi o wysokiej wartości dodanej, zmieniające postrzeganie firmy.', 'Model „high tech + high touch” łączący technologie z uważnością na klienta.', 'Strategia CRM wspierająca długofalowe relacje i wzrost.', ], }, ] // Dlaczego (treść 1:1) const why = { p1: ( <> 76% konsumentów oczekuje, że marka będzie przewidywać ich potrzeby, nie tylko reagować (Salesforce, 2023). ), p2: ( <> Pokolenie Z nie buduje lojalności przez reklamy. Buduje ją przez wartość, użyteczność i autentyczność. Aż 65% młodych konsumentów deklaruje, że lojalność wobec marki zależy od spójnych i realnych doświadczeń (McKinsey, 2023). ), bulletsIntro: 'Marka nie żyje w kampaniach. Żyje w:', bullets: [ 'chatbotach, landingach, mailach i pushach,', 'procesach sprzedażowych i onboardingowych,', 'sposobie, w jaki działa Twój model cenowy, UX i obsługa klienta.', ], p3: ( <> Jeśli to wszystko nie gra razem, marka traci moc.
I traci klientów. Według badania PwC aż 32% klientów porzuca markę po jednej złej interakcji, nawet jeśli wcześniej byli zadowoleni. ), } const [expandedIndex, setExpandedIndex] = useState(null); // === NOWE tiles (podmień całą dotychczasową definicję) === // === KAFELKI z jednolitym punktorowaniem === const tiles = [ { title: "Brand Daily Scan™ – diagnoza w rytmie codzienności", short: "Błyskawiczna analiza punktów styku, decyzji, procesów i sygnałów marki.", output: "Mapa luk, insighty, benchmarki, rekomendacje.", efekt: "Mapa luk i niespójności, insighty z rzeczywistego użycia marki, benchmarki branżowe oraz rekomendacje naprawcze i wzmacniające.", details: ( <>

Nie patrzymy na markę z dystansu. Wchodzimy w jej codzienne tętno. Skupiamy się na tym, co naprawdę generuje doświadczenie klienta:

{/* stałe, eleganckie kropki */}
  • punkty styku (touchpointy),
  • mikrodecyzje zespołów,
  • automatyczne procesy i sygnały marki.
), }, { title: "Synchronizacja rytmu – faza pacingu", short: "Zgrywamy Twoje działania z logiką marki. Automatyzujemy. Personalizujemy.", output: "Roadmapa wdrożenia z KPI i zestawem eksperymentów.", efekt: "„Zgrane zegary” marki, marketingu, sprzedaży i obsługi; klarowne KPI oraz szybkie testy hipotez.", details: ( <>

Integrujemy markę z codzienną dynamiką operacyjną. Nie robimy rewolucji — synchronizujemy rytm:

{/* stałe, eleganckie kropki */}
  • automatyzujemy to, co można,
  • personalizujemy to, co warto,
  • urealniamy to, co obiecujesz jako marka.
), }, { title: "Wdrożenie i skalowanie", short: "Marka w akcji: od call center i e-maili po pricing, CRM i fizyczną dostępność.", output: "Efektywność, zaangażowanie, lojalność.", efekt: "Wzrost efektywności działań marketingowych, wyższe zaangażowanie użytkowników, zwiększenie lojalności i retencji — zmierzone.", details: ( <>

Marka przestaje być tylko deklaracją. Zaczyna działać w realnym czasie i miejscu:

{/* stałe, eleganckie kropki */}
  • w aplikacji i e-mailach,
  • w polityce cenowej i mechanizmach CRM,
  • w sklepie internetowym i na półce w punkcie sprzedaży.
), }, ]; const scrollToIntegration = useCallback(() => { document.getElementById('DlaczegoIntegracji')?.scrollIntoView({ behavior: 'smooth' }) }, []) return (
{/* Subtelny akcent kolorystyczny + siatka */} {/* Pasek postępu scrolla */} {/* NAV */} {mobileOpen && ( <> {/* półprzezroczyste tło – kliknięcie zamyka */} setMobileOpen(false)} /> {/* sam panel */} )} {/* było: */} {/* PRZEJŚCIE/WIPE */} {/* SYTUACJE — horyzontalne wejścia kart */} {/* PARTNER */} {/* JAK DZIAŁAMY */} {/* KONTAKT */}
{/* tło: stonowany niebieski gradient (mniej jaskrawy) */}
{/* główny gradient – desat + ciut ciemniej */}
{/* delikatne „wygaszenie” bielą – tonuje bez zmiany koloru */}
{/* bardzo subtelne rozświetlenie jak wcześniej, ale słabsze */}
{/* hairline’y */}
{/* LEWA: nagłówek + CTA (biel jak na screenie) */}

Zacznij od eksperymentu

Zobacz, co marka może zrobić — w 7 dni.

{/* Lokalizacje – chipsy/glass */}
Warszawa Kraków Gdańsk Wrocław — działamy zdalnie i hybrydowo
{/* CTA – biała i obrysowana, jak na zrzucie */}
{/* PRAWA: karta kontaktowa – jasna, z cieniem (jak na screenie) */} {/* cienka chłodna linia u góry karty (bardzo subtelna) */}
{/* Mail i telefon – osobne linie z ikonkami */}
{/* FOOTER */}

© 2025 Prime Code

{/* QUICK CONTACT */}
) } /* ============================ VISUAL LAYER ============================ */ function BackgroundGrid() { // pastelowy akcent + siatka + bardzo delikatny „glow” od góry return (
) } function ScrollProgress() { const { scrollYProgress } = useScroll() const scaleX = useTransform(scrollYProgress, [0, 1], [0, 1]) return ( ) } /** Miękki „wipe” między sekcjami (kolorowy, ale subtelny) */ function SectionWipe() { return (
) } function Header({ title, className = "", gradient = "none", }: { title: string; className?: string; // --- w sygnaturze Header: gradient?: "none" | "warm" | "cool" | "coolSoft" | "sunset" | "bloom" | "bloomSoft" | "bloomReverse" | "prime" | "primeSoft" | "primeReverse"; }) { const TEXT = { warm: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#FDBA74_0%,#F97316_55%,#F472B6_100%)]", cool: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#0284C7_0%,#2563EB_55%,#4F46E5_100%)]", coolSoft: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#38BDF8_0%,#3B82F6_55%,#6366F1_100%)]", sunset: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#FF7A00_0%,#FF3D81_70%)]", // NOWE — motyw PRIME (Twoje kolory) prime: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#F28241_0%,#CC2E47_100%)]", primeSoft: // delikatniejsza, nadal kończy się #8C2E47 jako najciemniejszym "text-transparent bg-clip-text bg-[linear-gradient(90deg,#F7B891_0%,#F28241_45%,#8C2E47_100%)]", primeReverse: // jeśli potrzebujesz odwróconego kierunku, też kończymy #8C2E47 "text-transparent bg-clip-text bg-[linear-gradient(90deg,#F28241_0%,#8C2E47_100%)]", // Twoja wersja bloom: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#F59E0B,#F97316)]", // Subtelniejsza na białym tle (lekko rozjaśnione odcienie) bloomSoft: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#0E3E59_0%,#E68A56_40%,#96402A_56%,#C96A58_78%,#9A3A56_100%)]", // Odwrócony kierunek (ciepłe → chłodne) bloomReverse: "text-transparent bg-clip-text bg-[linear-gradient(90deg,#8C2E47_0%,#BF533B_24%,#731702_45%,#F28241_70%,#083A59_100%)]", none: "", } as const; const RULE = { warm: "linear-gradient(90deg,rgba(253,186,116,.9),rgba(249,115,22,.9),rgba(244,114,182,.9))", cool: "linear-gradient(90deg,rgba(2,132,199,.9),rgba(37,99,235,.9),rgba(79,70,229,.9))", coolSoft: "linear-gradient(90deg,rgba(56,189,248,.9),rgba(59,130,246,.9),rgba(99,102,241,.9))", sunset: "linear-gradient(90deg,#FF7A00,#FF3D81)", bloom: "linear-gradient(90deg,#8C2E47,#083A59,#F28241,#731702,#BF533B)", bloomSoft: "linear-gradient(90deg,#0E3E59,#E68A56,#96402A,#C96A58,#9A3A56)", bloomReverse: "linear-gradient(90deg,#8C2E47,#BF533B,#731702,#F28241,#083A59)", none: "linear-gradient(90deg,rgba(0,0,0,.12),rgba(0,0,0,.12))", // NOWE — motyw PRIME (Twoje kolory) prime: "linear-gradient(90deg,#F28241,#8C2E47)", primeSoft: "linear-gradient(90deg,#F7B891,#F28241,#8C2E47)", primeReverse: "linear-gradient(90deg,#F28241,#8C2E47)", } as const; return (

{title}

{/*
*/}
); } function BackgroundMedia({ src, poster, sectionRef, // zostawiamy sygnaturę, ale hooka nie używamy }: { src: string; poster?: string; sectionRef: React.RefObject; }) { return (
{/* delikatne overlaye jak wcześniej */}
); } type HeroPixabayBGProps = { onScrollDown: () => void; src?: string; poster?: string; }; function HeroPixabayBG({ onScrollDown, src = "/visuals/20072-307163785_small.mp4", poster = "/visuals/pixabay_bg_poster.jpg", }: HeroPixabayBGProps) { const sectionRef = React.useRef(null); // 1) fail-safe: po montażu i tak pokaż treść (gdyby iOS nie wyzwolił IO) const [mounted, setMounted] = React.useState(false); React.useEffect(() => setMounted(true), []); // 2) parallax const { scrollYProgress } = useScroll({ target: sectionRef, offset: ["start start", "end start"] }); const titleY = useTransform(scrollYProgress, [0, 1], ["0%", "-6%"]); const canParallax = mounted; // 3) łagodniejszy trigger + margines const seen = useInView(sectionRef, { once: true, amount: 0.3, margin: "-10% 0px -10% 0px" }); // 4) jeśli widoczny LUB zamontowany – pokazuj (koniec „pustki” na starcie) const ready = seen || mounted; // --- warianty --- const h1V: Variants = { hidden: { opacity: 0, y: 40, filter: "blur(4px)" }, show: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 1.2, ease: [0.22, 1, 0.36, 1] } }, }; const stackHero: Variants = { hidden: { opacity: 0, y: 14 }, show: { opacity: 1, y: 0, transition: { duration: 0.8, ease: "easeOut", when: "beforeChildren", delayChildren: 0.3, staggerChildren: 0.22 }, }, }; const itemHero: Variants = { hidden: { opacity: 0, y: 16 }, show: { opacity: 1, y: 0, transition: { duration: 0.85, ease: "easeOut" } }, }; const ruleHero: Variants = { hidden: { opacity: 0, scaleX: 0 }, show: { opacity: 1, scaleX: 1, transition: { duration: 0.95, ease: "easeOut" } }, }; return (
{/* WŁAŚCIWE LOGO – większe i wyśrodkowane na mobile, z offsetem w lewo od md */}

Prime Code

{/* === COPY (z mobilnym scrimem) === */} {/* wrapper: tło pod tekstem tylko na mobile */}
{/* scrim (tylko mobile) */}
{/* właściwa treść */}
Integrujemy markę w codziennych działaniach Marka, która działa codziennie. W czasie rzeczywistym. W każdym punkcie styku. W Prime Code integrujemy markę z tym, co najważniejsze – realnymi działaniami, danymi, technologią i zespołami. Nie tworzymy kampanii dla samej widoczności. Projektujemy mechanizmy wzrostu, w których marka staje się fundamentem operacyjnym: w komunikacji, sprzedaży, doświadczeniu klienta, polityce cenowej i kanałach dystrybucji. Bo marka to nie tylko opowieść. To system. Aktywny, skalowalny, zsynchronizowany z organizacją.
); } // H1: wolno, z lekkim blur-em const h1Slow: Variants = { hidden: { opacity: 0, y: 30, filter: "blur(3px)" }, show: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 1.15, ease: [0.16, 1, 0.3, 1] }, }, }; // Kontener reszty treści (start po H1); w środku będzie stagger const stack: Variants = { hidden: { opacity: 0, y: 12 }, show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: "easeOut", when: "beforeChildren", // Stagger – wolniejszy rytm staggerChildren: 0.18, delayChildren: 0.12, }, }, }; // Pojedyncze elementy treści (H2, lead, akapity) const itemSlow: Variants = { hidden: { opacity: 0, y: 12 }, show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: "easeOut" }, }, }; // Niebieska linia pod leadem – ładne „narysowanie” // było: duration ~1.2, x:56 const itemV: Variants = { hidden: (fromLeft: boolean) => ({ opacity: 0, x: fromLeft ? -72 : 72, y: 8, filter: "blur(8px)", }), show: { opacity: 1, x: 0, y: 0, filter: "blur(0px)", transition: { duration: 1.45, ease: [0.22, 1, 0.36, 1] }, // wolniej }, }; type WhyContent = { p1: React.ReactElement; p2: React.ReactElement; bulletsIntro: string; bullets: string[]; p3: React.ReactElement; }; function DlaczegoIntegracjiWarm({ why }: { why: WhyContent }) { const items: React.ReactNode[] = [ why.p1, why.p2, (

{why.bulletsIntro}

    {why.bullets.map((b, i) => (
  • {b}
  • ))}
), why.p3, ]; // ——— Tytuł: powolne wejście + delikatny parallax kursorem ——— const titleRef = React.useRef(null); const mx = useMotionValue(0); const my = useMotionValue(0); const onMoveTitle = (e: React.PointerEvent) => { const r = titleRef.current?.getBoundingClientRect(); if (!r) return; mx.set((e.clientX - (r.left + r.width / 2)) / r.width); my.set((e.clientY - (r.top + r.height / 2)) / r.height); }; const onLeaveTitle = () => { mx.set(0); my.set(0); }; const titleV: Variants = { hidden: { opacity: 0, y: 22, filter: "blur(6px)" }, show: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 1.4, ease: [0.22, 1, 0.36, 1] }, }, }; const GRAD_H_L = "linear-gradient(90deg, rgba(253,186,116,1) 0%, rgba(249,115,22,1) 55%, rgba(244,114,182,1) 100%)"; const GRAD_H_R = "linear-gradient(270deg, rgba(253,186,116,1) 0%, rgba(249,115,22,1) 55%, rgba(244,114,182,1) 100%)"; const GRAD_V = "linear-gradient(180deg, rgba(253,186,116,1) 0%, rgba(249,115,22,1) 55%, rgba(244,114,182,1) 100%)"; const itemV: Variants = { hidden: (fromLeft: boolean) => ({ opacity: 0, x: fromLeft ? -64 : 64, y: 8, filter: "blur(8px)" }), show: { opacity: 1, x: 0, y: 0, filter: "blur(0px)", transition: { duration: 1.3, ease: [0.22, 1, 0.36, 1] } }, }; return (
Dlaczego integracja marki to konieczność? {/* */}
{items.map((node, i) => { const fromLeft = i % 2 === 0; return (
{node}
); })}
); } /* narożnik w kształcie „L” (po lewej lub prawej), rysowany bez zwiększania box height */ function BracketCorner({ side, gradH, gradV, }: { side: "left" | "right"; gradH: string; gradV: string; }) { const vLineV: Variants = { hidden: { opacity: 0.9, scaleY: 0 }, show: { opacity: 1, scaleY: 1, transition: { duration: 1.15, ease: "easeOut" } }, }; const hLineV: Variants = { hidden: { opacity: 0.9, scaleX: 0 }, show: { opacity: 1, scaleX: 1, transition: { duration: 1.15, ease: "easeOut", delay: 0.05 } }, }; return (
{/* pionowa kreska */} {/* pozioma kreska */}
); } // function FancySeparator({ className = "" }: { className?: string }) { // return ( //
// {/* główna linia (gradient, przygaszone końce) */} //
// {/* subtelny highlight nad linią */} //
// {/* delikatny glow */} //
//
// ); // } /* ======================= CZY ZNASZ TE SYTUACJE? (nowa wersja) ======================= */ // === ANIMACJE SEKCJI "SYTUACJE" === function SytuacjeSection() { // warianty: nagłówek i siatka wchodzą dopiero przy wejściu w viewport const sectionV: Variants = { hidden: { opacity: 0, y: 18, filter: 'blur(6px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration: 0.55, ease: 'easeOut' }, }, }; // siatka – tylko steruje staggerem dzieci const gridV: Variants = { hidden: { opacity: 1 }, // niewidoczność trzymamy na kartach show: { opacity: 1, transition: { delayChildren: 0.12, staggerChildren: 0.08, ease: 'easeOut', }, }, }; const items = [ { title: 'Brak spójności w komunikacji', text: 'Różne działy (np. marketing, sprzedaż, obsługa klienta) komunikują się w różnym tonie i z odmiennym przekazem.', Icon: MessageSquare, accent: 'from-sky-300 to-blue-500', // było: from-sky-400 to-blue-500 }, { title: 'Realizacja działań promocyjnych bez odniesienia do tożsamości marki', text: 'Firma wdraża modne działania (np. TikTok, influencerzy, AI copywriting) bez filtrowania ich przez tożsamość i wartości marki.', Icon: Megaphone, accent: 'from-cyan-300 to-sky-500', // było: from-cyan-400 to-sky-600 }, { title: 'Problemy w skalowaniu działań', text: 'Przy szybkim wzroście lub ekspansji różne zespoły zaczynają prowadzić działania niespójne z tożsamością marki.', Icon: LineChart, accent: 'from-blue-300 to-indigo-500', // było: from-blue-400 to-indigo-600 }, { title: 'Zmiany w zespole / outsourcing marketingu', text: 'Nowe osoby lub agencje marketingowe nie rozumieją w pełni marki i działają według własnych schematów.', Icon: Users, accent: 'from-sky-300 to-blue-500', }, { title: 'Brak narzędzi lub procesów ułatwiających pracę z marką', text: 'Pracownicy nie mają dostępu do aktualnych wytycznych (brand plan, key visuals, archetypy, kroki milowe).', Icon: Wrench, accent: 'from-cyan-300 to-blue-500', // łagodniej }, { title: 'Brak mierzalnego modelu integracji marki', text: 'Firma nie ma sposobu, by sprawdzić, czy kampania, post czy oferta są zgodne z marką.', Icon: ClipboardCheck, accent: 'from-sky-300 to-indigo-500', }, ]; return (
{/* tło + delikatne rozświetlenie na wejściu */} {/* nagłówek wsuwa się miękko przy wejściu w viewport */}
{/* siatka – karty z kaskadą */} {items.map((it, i) => ( ))}
); } function SituationCardLite({ index, title, text, Icon, accent, }: { index: number; title: string; text: string; Icon: React.ComponentType>; accent: string; }) { const fromLeft = index % 2 === 0; // wariant pojedynczej karty – krótkie i miękkie wejście const cardV: Variants = { hidden: { opacity: 0, y: 12, x: fromLeft ? -6 : 6, scale: 0.985, filter: 'blur(4px)', }, show: { opacity: 1, y: 0, x: 0, scale: 1, filter: 'blur(0px)', transition: { duration: 0.45, ease: 'easeOut' }, }, }; return ( {/* cienka linia akcentowa u góry */}
{/* ultra-delikatny pattern w tle */}

{title}

{text}

); } /* --------------------------- Płynące tło (scroll) --------------------------- */ /* ---------------------- TŁO SEKCJI: siatka + belka ---------------------- */ /* ---------------------- TŁO SEKCJI: siatka + ciepło/zimny split + belka ---------------------- */ function SytuacjeBackground() { const ref = React.useRef(null); const { scrollYProgress } = useScroll({ target: ref, offset: ['start end', 'end start'] }); const prefersReduced = useReducedMotion(); // >>> ważne: dopiero po mountcie włączamy x/y const [mounted, setMounted] = React.useState(false); React.useEffect(() => setMounted(true), []); const y = useTransform(scrollYProgress, [0, 1], prefersReduced ? [0, 0] : [8, -8]); const x = useTransform(scrollYProgress, [0, 1], prefersReduced ? [0, 0] : [-6, 6]); return (
); } // --- PartnerSection: nagłówek + wcześniejszy start listy --- function PartnerSection() { const items = [ 'myśli procesami, nie kanałami?', 'łączy branding z danymi, CX i automatyzacją?', 'projektuje mechanizmy wzrostu, a nie tylko „fajny content”?', 'wdraża AI w obsłudze marki, zamiast tylko mówić o trendach?', 'testuje i optymalizuje, zamiast zgadywać?', ]; const headingV: Variants = { hidden: { opacity: 0, y: 14, filter: 'blur(6px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1] } }, }; return (
{/* Kreski w tle — ważne: z-0 (nad tłem sekcji), pointer-events-none */} {/* */} {/* Treść nad kreskami */}
); } // --- NumberedList: kontrola wcześniejszego wyzwalania + tempa --- function NumberedList({ items, viewportMargin = '0px', startDelay = 0.02, stagger = 0.24, itemDuration = 0.9, }: { items: string[]; viewportMargin?: string; startDelay?: number; stagger?: number; itemDuration?: number; }) { return ( // NumberedList — wymagaj większej części elementu w kadrze {items.map((t, i) => ( ))} ); } // --- NumberedRow: wolniejsze pojedyncze wejście (bez zmiany kolorów punktów) --- function NumberedRow({ index, text, duration }: { index: number; text: string; duration: number }) { const n = String(index + 1).padStart(2, '0'); const [first, ...rest] = text.split(' '); const restText = rest.join(' '); const itemV = { hidden: { opacity: 0, y: 14, filter: 'blur(6px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration, ease: [0.22, 1, 0.36, 1] } }, } as const; return (
{n}
{first} {restText}
); } /* ======================= MODEL PRIME CODE — fixed ======================= */ type ModelTile = { title: string; short: string; output: string; efekt: string; details: React.ReactNode; }; function ModelSection({ tiles }: { tiles: ModelTile[] }) { const [openIndex, setOpenIndex] = useState(null); // <- tylko jedna otwarta const headingV: Variants = { hidden: { opacity: 0, y: 18, filter: 'blur(6px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration: 0.55, ease: 'easeOut' } }, }; const gridV: Variants = { hidden: { opacity: 1 }, show: { opacity: 1, transition: { delayChildren: 0.12, staggerChildren: 0.08, ease: 'easeOut' } }, }; return (

W klasycznym ujęciu marka to obietnica. W dzisiejszej rzeczywistości to{' '} system działania. Prime Code traktuje markę jak{' '} system operacyjny firmy: regulujący rytm decyzji, komunikacji i doświadczeń klienta. Spójność przestaje być tylko kwestią estetyki a staje się{' '} mierzalnym źródłem przewagi.

{tiles.map((t, i) => ( setOpenIndex(prev => (prev === i ? null : i))} // <- tylko jedna otwarta /> ))}
); } function ModelCard({ index, tile, open, onToggle, }: { index: number; tile: ModelTile; open: boolean; onToggle: () => void; }) { const fromLeft = index % 2 === 0; const cardV: Variants = { hidden: { opacity: 0, y: 12, x: fromLeft ? -6 : 6, scale: 0.985, filter: 'blur(4px)' }, show: { opacity: 1, y: 0, x: 0, scale: 1, filter: 'blur(0px)', transition: { duration: 0.45, ease: 'easeOut' } }, }; return (
{String(index + 1).padStart(2, '0')}

{tile.title}

{tile.short}

{!open && ( )}
{open && (
{tile.details}

Output: {tile.output}

Efekt: {tile.efekt}

)}
); } /* =================== CO POTRAFIMY — ostre, czyste =================== */ function CoPotrafimySection() { // dokładnie te teksty z Twojej pierwotnej wersji const items = [ "Projektujemy marki, które rosną dzięki danym i doświadczeniu użytkownika", "Tworzymy systemy komunikacji, a nie tylko tone of voice", "Zarządzamy marką tak jak innowacyjnym produktem lub usługą: zwinnie, testy, feedback, iteracje", "Wdrażamy AI w miejscach, które mają znaczenie dla doświadczenia marki", "Projektujemy onboarding, optymalizujemy punkty styku z klientem i mechanizmy wzrostu", "Projektujemy szablony i piszemy playbooki dla marketingu, sprzedaży, HR i obsługi klienta z marką w centrum", ]; const prefersReduced = (useReducedMotion() ?? false); const titleV: Variants = { hidden: { opacity: 0, y: 22, filter: "blur(6px)" }, show: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 1.0, ease: [0.22, 1, 0.36, 1] } }, }; const gridV: Variants = { hidden: {}, show: { transition: { delayChildren: 0.12, staggerChildren: 0.08 } } }; return (
{/* */}
Co potrafimy? {/* */}
{items.map((txt, i) => ( ))}
); } /* ---------- KARTA: ostre krawędzie, bez dodatkowych tekstów ---------- */ function CoCard({ index, text, prefersReduced, }: { index: number; text: string; prefersReduced: boolean; }) { const fromLeft = index % 2 === 0; const cardV: Variants = { hidden: { opacity: 0, y: 14, x: fromLeft ? -8 : 8, scale: 0.985, filter: "blur(6px)" }, show: { opacity: 1, y: 0, x: 0, scale: 1, filter: "blur(0px)", transition: { duration: 0.55, ease: "easeOut" } }, }; // micro-tilt (z poszanowaniem prefers-reduced-motion) const rx = useMotionValue(0); const ry = useMotionValue(0); const rotateX = useSpring(useTransform(ry, [-0.5, 0.5], [6, -6]), { stiffness: 140, damping: 12 }); const rotateY = useSpring(useTransform(rx, [-0.5, 0.5], [-6, 6]), { stiffness: 140, damping: 12 }); const onMove = (e: React.PointerEvent) => { const r = (e.currentTarget as HTMLElement).getBoundingClientRect(); rx.set((e.clientX - (r.left + r.width / 2)) / r.width); ry.set((e.clientY - (r.top + r.height / 2)) / r.height); }; return ( { rx.set(0); ry.set(0); }} style={prefersReduced ? undefined : { rotateX, rotateY }} className="group relative overflow-hidden rounded-none bg-white/70 backdrop-blur-xl ring-1 ring-black/10 shadow-[0_10px_28px_rgba(16,24,40,0.08)]" > {/* cienka ciepła belka u góry */}
{/* bardzo subtelny pattern w tle */}
{/* jednorazowy „shine” przy wejściu w viewport */} {/* pionowy akcent (spójny z całą stroną) */}
{/* numer — można zostawić (to nie “tekst” dodany, a etykieta) */}
{String(index + 1).padStart(2, "0")}
{/* wyłącznie główny tekst z pierwotnej listy */}

{text}

); } /* ---------- tło: animowana, cienka „nić” w gradiencie (zero glow) ---------- */ function FlowThread({ className = "" }: { className?: string }) { return (
{/* miękkie esy-floresy za kartami, ale bardzo subtelne */} {/* maska wygładzająca brzegi sekcji */}
); } function RiskFreeSection() { const items = [ 'mini-audyt doświadczeń i danych', 'mapa punktów styku', 'insighty do poprawy spójności i skuteczności', '1 eksperyment do wdrożenia natychmiast', ]; // nagłówek — miękko, jak w "Sytuacjach" const headingV: Variants = { hidden: { opacity: 0, y: 16, filter: 'blur(6px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration: 0.55, ease: 'easeOut' }, }, }; // siatka — kontroluje kaskadę kart const gridV: Variants = { hidden: {}, show: { transition: { delayChildren: 0.12, staggerChildren: 0.14 }, }, }; return (
{/* Nagłówek */}
Brand Daily Test W 7 dni pokażemy Ci realne luki, szanse i jeden test do wdrożenia od ręki.
{/* Karty – chłodna paleta + shine + kolejność */} {items.map((t, i) => ( ))} {/* CTA pod siatką */} Efekty zanim podejmiesz decyzję o dalszej współpracy.
); } function RiskFreeCard({ index, text }: { index: number; text: string }) { const fromLeft = index % 2 === 0; const cardV: Variants = { hidden: { opacity: 0, y: 14, x: fromLeft ? -8 : 8, scale: 0.985, filter: 'blur(6px)', }, show: { opacity: 1, y: 0, x: 0, scale: 1, filter: 'blur(0px)', transition: { duration: 0.55, ease: 'easeOut' }, }, }; return ( {/* cienka chłodna linia jak w „Sytuacjach” */}
{/* delikatny pattern + shine-once */}
{/* chłodny punkt — zostaje kolorystyka z „Sytuacji” */}

{text}

); } function RiskFreeBackground() { const ref = React.useRef(null); const { scrollYProgress } = useScroll({ target: ref, offset: ['start end', 'end start'] }); const prefersReduced = useReducedMotion(); const [mounted, setMounted] = React.useState(false); React.useEffect(() => setMounted(true), []); const y = useTransform(scrollYProgress, [0, 1], prefersReduced ? [0, 0] : [8, -8]); const x = useTransform(scrollYProgress, [0, 1], prefersReduced ? [0, 0] : [-6, 6]); return (
); } function PomoglismySection({ caseStudies, openIndex, setOpenIndex, }: { caseStudies: { title: string; short: string; details: string[] }[]; openIndex: number | null; setOpenIndex: (i: number | null) => void; }) { const helpedItems: string[] = [ 'Ponad 20 firmom farmaceutycznym', 'Ponad 20 firmom FMCG', 'Ponad 15 firmom B2B', '10 firmom technologicznym i startupom', '4 bankom i 3 firmom ubezpieczeniowym', '5 instytucjom edukacyjnym', 'Firmom z branży rozrywkowej, modowej, przemysłowej, wydawniczej, rolniczej i wielu innych', 'Globalnym centralom koncernów z USA, Kanady, Niemiec, Wielkiej Brytanii, Hiszpanii, Węgier i Polski', ]; // ten sam feeling co „Dlaczego” const titleV: Variants = { hidden: { opacity: 0, y: 22, filter: 'blur(6px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration: 1.0, ease: [0.22, 1, 0.36, 1] } }, }; const listV: Variants = { hidden: { opacity: 0, y: 10, filter: 'blur(4px)' }, show: { opacity: 1, y: 0, filter: 'blur(0px)', transition: { duration: 0.55, ease: 'easeOut', when: 'beforeChildren', delayChildren: 0.06, staggerChildren: 0.1 }, }, }; const rowV: Variants = { hidden: { opacity: 0, y: 8 }, show: { opacity: 1, y: 0, transition: { duration: 0.45, ease: 'easeOut' } }, }; return (
{/* */} {/* Tytuł w ciepłej tonacji + separator jak w „Dlaczego” */}
Pomogliśmy {/* */}
{/* Panel z wypunktowaniem – dwie kolumny od md */}
{/* cienka ciepła linia u góry + bardzo subtelny pattern, spójny z „Dlaczego” */}
    {helpedItems.map((txt, i) => ( {/* kropka-gradient z jednorazowym pulsem */} {/* shimmer przez wiersz */} {txt} ))}
); } // mały helper — darmowe zdjęcia Unsplash (no-copyright) const CASE_IMAGES: Record = { "Firma kosmetyczna": "https://images.unsplash.com/photo-1522335789203-aabd1fc54bc9?q=80&w=1600&auto=format&fit=crop", "Firma paliwowa": "/visuals/fuel-station.jpg", "Firma technologiczna": "https://images.unsplash.com/photo-1522071820081-009f0129c71c?q=80&w=1600&auto=format&fit=crop", }; const genericImage = "https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?q=80&w=1600&auto=format&fit=crop"; const getCaseImage = (title: string, override?: string) => override ?? CASE_IMAGES[title] ?? genericImage; function CaseStudiesSection({ caseStudies, }: { caseStudies: { title: string; short: string; details: string[]; image?: string }[]; }) { // lokalny stan: tylko jedna karta otwarta w tej sekcji const [openCard, setOpenCard] = React.useState(null); const headingV: Variants = { hidden: { opacity: 0, y: 16, filter: "blur(6px)" }, show: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 0.55, ease: "easeOut" } }, }; const gridV: Variants = { hidden: {}, show: { transition: { delayChildren: 0.2, staggerChildren: 0.18 } }, }; const cardV: Variants = { hidden: { opacity: 0, y: 12, filter: "blur(4px)", scale: 0.985 }, show: { opacity: 1, y: 0, filter: "blur(0px)", scale: 1, transition: { duration: 0.45, ease: "easeOut" } }, }; return (
{/* Nagłówek */}
Krótko i konkretnie — przykłady wdrożeń, które przełożyły się na wynik.
{/* 3 kolumny na dużych, 1 kolumna poniżej */} {caseStudies.map((study, i) => ( setOpenCard(prev => (prev === i ? null : i))} // tylko kliknięty kafelek title={study.title} short={study.short} details={study.details} imageSrc={getCaseImage(study.title, study.image)} variants={cardV} /> ))}
); } /* ---------------- KARTA ---------------- */ type CSCardProps = { index: number; isOpen: boolean; onToggle: () => void; title: string; short: string; details: string[]; imageSrc?: string; variants: Variants; }; function CSCard({ index, isOpen, onToggle, title, short, details, imageSrc, variants, }: CSCardProps) { return ( {imageSrc && ( )}
{/* kropka – idealne koło, nie zdeformuje się */}

{title}

{short}

{isOpen && ( {details.map((d, idx) => (
  • {d}
  • ))}
    )}
    ); }