feat: agregar sección 'Así es trabajar conmigo'
Nueva sección FormaTrabajar con 5 tarjetas: Metodología, Quién participa, De dónde partimos, Qué te llevas y Duración. Inspirada en la estructura de en-ti.com, adaptada a la identidad creeer. - Nuevo componente FormaTrabajar.tsx (grid de tarjetas con TarjetaSpotlight) - Nuevo ícono 'reloj' en Icono.tsx - Contenido en lib/content.ts (copy derivado de fuentes aprobadas) - Insertada entre Mecanismo y Disciplinas en page.tsx
This commit is contained in:
1 parent
e0ce0d3b22
commit
544c02ff1f
7 files changed
+132
-20
No files matched your search
@@ -6,6 +6,7 @@ import { PuntosInflexion } from '@/components/sections/PuntosInflexion';
|
|||||||
import { Dolores } from '@/components/sections/Dolores';
|
import { Dolores } from '@/components/sections/Dolores';
|
||||||
import { ParaQuien } from '@/components/sections/ParaQuien';
|
import { ParaQuien } from '@/components/sections/ParaQuien';
|
||||||
import { Mecanismo } from '@/components/sections/Mecanismo';
|
import { Mecanismo } from '@/components/sections/Mecanismo';
|
||||||
|
import { FormaTrabajar } from '@/components/sections/FormaTrabajar';
|
||||||
import { Disciplinas } from '@/components/sections/Disciplinas';
|
import { Disciplinas } from '@/components/sections/Disciplinas';
|
||||||
import { Estratega } from '@/components/sections/Estratega';
|
import { Estratega } from '@/components/sections/Estratega';
|
||||||
import { ComoEmpezar } from '@/components/sections/ComoEmpezar';
|
import { ComoEmpezar } from '@/components/sections/ComoEmpezar';
|
||||||
@@ -34,6 +35,7 @@ export default function Home() {
|
|||||||
<FraseAncla />
|
<FraseAncla />
|
||||||
<Dolores />
|
<Dolores />
|
||||||
<Mecanismo />
|
<Mecanismo />
|
||||||
|
<FormaTrabajar />
|
||||||
<Disciplinas />
|
<Disciplinas />
|
||||||
<ParaQuien />
|
<ParaQuien />
|
||||||
<Estratega />
|
<Estratega />
|
||||||
|
|||||||
@@ -8,10 +8,6 @@ import { Container } from '@/components/primitives/Container';
|
|||||||
import { ProgresoLectura } from '@/components/primitives/ProgresoLectura';
|
import { ProgresoLectura } from '@/components/primitives/ProgresoLectura';
|
||||||
import { header } from '@/lib/content';
|
import { header } from '@/lib/content';
|
||||||
|
|
||||||
// Navy like the hero it sits on, so the top of the page is one block instead of
|
|
||||||
// a white bar stuck over a dark opening. Over the light sections further down it
|
|
||||||
// reads as the brand's own bar rather than as page chrome.
|
|
||||||
//
|
|
||||||
// The header tightens once the reader leaves the hero: less chrome, more page.
|
// The header tightens once the reader leaves the hero: less chrome, more page.
|
||||||
// Client component because the compaction needs scroll state on the <header>
|
// Client component because the compaction needs scroll state on the <header>
|
||||||
// itself; there is no server-rendered data here to lose.
|
// itself; there is no server-rendered data here to lose.
|
||||||
@@ -27,16 +23,16 @@ export function Header() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<header
|
<header
|
||||||
className={`sticky top-0 z-50 relative border-b border-white/10 bg-azul-profundo/90 backdrop-blur transition-[padding] duration-300 motion-reduce:transition-none ${
|
className={`sticky top-0 z-50 relative border-b border-azul-profundo/10 bg-white/80 backdrop-blur transition-[padding] duration-300 motion-reduce:transition-none ${
|
||||||
compacto ? 'py-0' : 'py-3'
|
compacto ? 'py-0' : 'py-3'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<Container className="flex items-center justify-between">
|
<Container className="flex items-center justify-between">
|
||||||
<a href="#top" aria-label="creeer — inicio" className="block transition-transform duration-300 origin-left motion-reduce:transition-none">
|
<a href="#top" aria-label="creeer — inicio" className="block transition-transform duration-300 origin-left motion-reduce:transition-none">
|
||||||
<Wordmark size={compacto ? 'sm' : 'md'} onDark />
|
<Wordmark size={compacto ? 'sm' : 'md'} />
|
||||||
</a>
|
</a>
|
||||||
<nav aria-label="Principal">
|
<nav aria-label="Principal">
|
||||||
<CTA href="#contacto" label={header.cta} variant="dark" />
|
<CTA href="#contacto" label={header.cta} variant="light" />
|
||||||
</nav>
|
</nav>
|
||||||
</Container>
|
</Container>
|
||||||
<ProgresoLectura />
|
<ProgresoLectura />
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
// The names say which ground the button is standing on, not what colour it is:
|
type Variant = 'light' | 'dark' | 'ghost';
|
||||||
// `light` and `ghost` are for light sections, `dark` and `ghostDark` for
|
|
||||||
// azul-profundo. Getting that backwards paints navy on navy.
|
|
||||||
type Variant = 'light' | 'dark' | 'ghost' | 'ghostDark';
|
|
||||||
// Every variant carries border-2 so filled and outlined CTAs line up when
|
// Every variant carries border-2 so filled and outlined CTAs line up when
|
||||||
// they sit side by side.
|
// they sit side by side.
|
||||||
const styles: Record<Variant, string> = {
|
const styles: Record<Variant, string> = {
|
||||||
light: 'border-2 border-transparent bg-azul-profundo text-white hover:bg-azul-profundo/90',
|
light: 'border-2 border-transparent bg-azul-profundo text-white hover:bg-azul-profundo/90',
|
||||||
dark: 'border-2 border-transparent bg-dorado text-white hover:bg-dorado/90',
|
dark: 'border-2 border-transparent bg-dorado text-white hover:bg-dorado/90',
|
||||||
ghost: 'border-2 border-azul-profundo text-azul-profundo hover:bg-azul-profundo hover:text-white',
|
ghost: 'border-2 border-azul-profundo text-azul-profundo hover:bg-azul-profundo hover:text-white',
|
||||||
ghostDark: 'border-2 border-white/45 text-white hover:bg-white hover:text-azul-profundo',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export function CTA({ href, label, variant = 'light', className = '' }: { href: string; label: string; variant?: Variant; className?: string }) {
|
export function CTA({ href, label, variant = 'light', className = '' }: { href: string; label: string; variant?: Variant; className?: string }) {
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ export type IconoNombre =
|
|||||||
| 'plan'
|
| 'plan'
|
||||||
| 'comunicacion'
|
| 'comunicacion'
|
||||||
| 'digital'
|
| 'digital'
|
||||||
| 'experiencias';
|
| 'experiencias'
|
||||||
|
| 'reloj';
|
||||||
|
|
||||||
const PATHS: Record<IconoNombre, ReactNode> = {
|
const PATHS: Record<IconoNombre, ReactNode> = {
|
||||||
// A line dives through two layers down to a core point — "me sumerjo
|
// A line dives through two layers down to a core point — "me sumerjo
|
||||||
@@ -101,6 +102,13 @@ const PATHS: Record<IconoNombre, ReactNode> = {
|
|||||||
<circle cx="12" cy="12" r="9" strokeOpacity={0.55} />
|
<circle cx="12" cy="12" r="9" strokeOpacity={0.55} />
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
|
// Simple clock — "cada proceso tiene su ritmo".
|
||||||
|
reloj: (
|
||||||
|
<>
|
||||||
|
<circle cx="12" cy="12" r="9" />
|
||||||
|
<path d="M12 7v5l3.5 3.5" />
|
||||||
|
</>
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
export function Icono({ nombre, className = '' }: { nombre: IconoNombre; className?: string }) {
|
export function Icono({ nombre, className = '' }: { nombre: IconoNombre; className?: string }) {
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { motion } from 'framer-motion';
|
||||||
|
import { Container } from '@/components/primitives/Container';
|
||||||
|
import { FondoPuntos } from '@/components/primitives/FondoPuntos';
|
||||||
|
import { TarjetaSpotlight } from '@/components/primitives/TarjetaSpotlight';
|
||||||
|
import { Icono, type IconoNombre } from '@/components/primitives/Icono';
|
||||||
|
import { formaTrabajar } from '@/lib/content';
|
||||||
|
import { fadeInUp, staggerContainer, viewportOnce, usePrefersReducedMotion, motionProps } from '@/lib/motion';
|
||||||
|
|
||||||
|
// Reuses existing icons where the metaphor fits; only 'reloj' is new.
|
||||||
|
const ICONOS: IconoNombre[] = [
|
||||||
|
'estrategia', // Metodología — ascending path to a flag
|
||||||
|
'comunicacion', // Quién participa — dialogue bubbles
|
||||||
|
'inmersion', // De dónde partimos — diving through layers
|
||||||
|
'plan', // Qué te llevas — checklist
|
||||||
|
'reloj', // Duración — clock
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Así es trabajar conmigo" — practical details of the engagement.
|
||||||
|
* Inspired by en-ti.com's card-based solutions grid, adapted to creeer's
|
||||||
|
* identity: white cards on gris-claro, dorado accents, TarjetaSpotlight glow.
|
||||||
|
* Sits between Mecanismo (high-level method) and Disciplinas (the tools).
|
||||||
|
*/
|
||||||
|
export function FormaTrabajar() {
|
||||||
|
const reduced = usePrefersReducedMotion();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="bg-gris-claro relative overflow-hidden">
|
||||||
|
<FondoPuntos className="-top-10 -left-12 w-72 md:w-[28rem] text-azul-profundo/[0.06]" distance={32} />
|
||||||
|
<Container className="relative py-16 md:py-24">
|
||||||
|
{/* ── Header ── */}
|
||||||
|
<motion.p
|
||||||
|
variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
||||||
|
className="text-xs tracking-[0.3em] uppercase font-black text-dorado"
|
||||||
|
>
|
||||||
|
{formaTrabajar.eyebrow}
|
||||||
|
</motion.p>
|
||||||
|
<motion.h2
|
||||||
|
variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
||||||
|
className="mt-4 font-sans font-black text-seccion text-azul-profundo"
|
||||||
|
>
|
||||||
|
{formaTrabajar.title}
|
||||||
|
</motion.h2>
|
||||||
|
|
||||||
|
{/* ── Card grid ── */}
|
||||||
|
<motion.ul
|
||||||
|
variants={staggerContainer} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
||||||
|
className="mt-12 grid gap-5 sm:grid-cols-2 lg:grid-cols-3 list-none p-0"
|
||||||
|
>
|
||||||
|
{formaTrabajar.items.map((item, i) => (
|
||||||
|
<motion.li
|
||||||
|
key={item.name}
|
||||||
|
variants={fadeInUp}
|
||||||
|
className="transition-transform duration-300 ease-out hover:-translate-y-1.5 motion-reduce:transform-none motion-reduce:transition-none"
|
||||||
|
>
|
||||||
|
<TarjetaSpotlight className="h-full rounded-2xl border border-white bg-white p-7 transition-[border-color,box-shadow] duration-300 hover:border-dorado/30 hover:shadow-[0_20px_50px_-20px_rgba(196,148,46,0.2)]">
|
||||||
|
{/* Icon */}
|
||||||
|
<div className="grid place-items-center w-14 h-14 rounded-full bg-azul-profundo">
|
||||||
|
<Icono nombre={ICONOS[i]} className="w-7 h-7 text-dorado" />
|
||||||
|
</div>
|
||||||
|
{/* Copy */}
|
||||||
|
<h3 className="mt-5 font-sans font-black text-xl text-azul-profundo">
|
||||||
|
{item.name}
|
||||||
|
</h3>
|
||||||
|
<p className="mt-3 text-gris-medio leading-relaxed text-sm">
|
||||||
|
{item.desc}
|
||||||
|
</p>
|
||||||
|
</TarjetaSpotlight>
|
||||||
|
</motion.li>
|
||||||
|
))}
|
||||||
|
</motion.ul>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -22,21 +22,21 @@ export function Hero({ variant = 'editorial' }: { variant?: Variant }) {
|
|||||||
const clarityBorder = isHormozi ? 'border-b-[5px] border-dorado pb-0.5' : 'border-b-[3px] border-dorado pb-0.5';
|
const clarityBorder = isHormozi ? 'border-b-[5px] border-dorado pb-0.5' : 'border-b-[3px] border-dorado pb-0.5';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="bg-azul-profundo relative overflow-hidden">
|
<section className="bg-white relative overflow-hidden">
|
||||||
{/* Kept clear of the wordmark on narrow screens: at 390px the md field
|
{/* Kept clear of the wordmark on narrow screens: at 390px the md field
|
||||||
reached back across the logotype and the tagline, so the pattern read
|
reached back across the logotype and the tagline, so the pattern read
|
||||||
as collision rather than texture. */}
|
as collision rather than texture. */}
|
||||||
<FondoPuntos className="top-80 -right-20 w-56 md:top-24 md:-right-16 md:w-[28rem] text-white/10" interactivo />
|
<FondoPuntos className="top-80 -right-20 w-56 md:top-24 md:-right-16 md:w-[28rem] text-azul-profundo/10" interactivo />
|
||||||
<FondoPuntos className="bottom-16 -left-20 w-64 md:w-96 text-dorado/20" distance={28} rows={2} />
|
<FondoPuntos className="bottom-16 -left-20 w-64 md:w-96 text-dorado/20" distance={28} rows={2} />
|
||||||
<Container className="relative min-h-[80vh] lg:min-h-[88vh] flex items-center py-16 md:py-24">
|
<Container className="relative min-h-[80vh] lg:min-h-[88vh] flex items-center py-16 md:py-24">
|
||||||
<div className="grid gap-8 lg:gap-14 lg:grid-cols-[1.1fr_0.9fr] lg:items-center w-full">
|
<div className="grid gap-8 lg:gap-14 lg:grid-cols-[1.1fr_0.9fr] lg:items-center w-full">
|
||||||
<motion.div variants={staggerContainer} initial="hidden" animate="visible" {...motionProps(reduced)}
|
<motion.div variants={staggerContainer} initial="hidden" animate="visible" {...motionProps(reduced)}
|
||||||
className="min-w-0 flex flex-col items-center text-center lg:items-start lg:text-left">
|
className="min-w-0 flex flex-col items-center text-center lg:items-start lg:text-left">
|
||||||
<motion.div variants={fadeInUp}><Wordmark size="xl" showTagline onDark /></motion.div>
|
<motion.div variants={fadeInUp}><Wordmark size="xl" showTagline /></motion.div>
|
||||||
<motion.p variants={fadeInUp} className="mt-6 text-xs md:text-sm tracking-[0.3em] uppercase font-black text-dorado">
|
<motion.p variants={fadeInUp} className="mt-6 text-xs md:text-sm tracking-[0.3em] uppercase font-black text-dorado">
|
||||||
{hero.eyebrow}
|
{hero.eyebrow}
|
||||||
</motion.p>
|
</motion.p>
|
||||||
<motion.h1 variants={fadeInUp} className={`mt-8 ${headlineBase} ${headlineSize} text-white`}>
|
<motion.h1 variants={fadeInUp} className={`mt-8 ${headlineBase} ${headlineSize} text-azul-profundo`}>
|
||||||
<TextoDesenfoque
|
<TextoDesenfoque
|
||||||
as="span"
|
as="span"
|
||||||
segments={[
|
segments={[
|
||||||
@@ -51,8 +51,8 @@ export function Hero({ variant = 'editorial' }: { variant?: Variant }) {
|
|||||||
came out ragged and unequal, which read as an accident rather
|
came out ragged and unequal, which read as an accident rather
|
||||||
than as hierarchy. */}
|
than as hierarchy. */}
|
||||||
<motion.div variants={fadeInUp} className="mt-10 w-full flex flex-col md:flex-row items-stretch md:items-center md:w-auto gap-4">
|
<motion.div variants={fadeInUp} className="mt-10 w-full flex flex-col md:flex-row items-stretch md:items-center md:w-auto gap-4">
|
||||||
<CTA href="#contacto" label={hero.cta} variant="dark" className="text-center md:whitespace-nowrap" />
|
<CTA href="#contacto" label={hero.cta} variant="light" className="text-center md:whitespace-nowrap" />
|
||||||
<CTA href="#mecanismo" label={hero.ctaSecundario} variant="ghostDark" className="text-center md:whitespace-nowrap" />
|
<CTA href="#mecanismo" label={hero.ctaSecundario} variant="ghost" className="text-center md:whitespace-nowrap" />
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
{/* Complexity → focus, left unresolved: the hero poses the tension
|
{/* Complexity → focus, left unresolved: the hero poses the tension
|
||||||
@@ -61,7 +61,7 @@ export function Hero({ variant = 'editorial' }: { variant?: Variant }) {
|
|||||||
of the brand's own graphic language at all. */}
|
of the brand's own graphic language at all. */}
|
||||||
<motion.div variants={fadeInUp} initial="hidden" animate="visible" {...motionProps(reduced)}
|
<motion.div variants={fadeInUp} initial="hidden" animate="visible" {...motionProps(reduced)}
|
||||||
className="min-w-0">
|
className="min-w-0">
|
||||||
<SecuenciaClaridad variant="hero" className="w-32 lg:w-full max-w-md mx-auto text-white/70" />
|
<SecuenciaClaridad variant="hero" className="w-32 lg:w-full max-w-md mx-auto text-azul-profundo" />
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@@ -129,6 +129,39 @@ export const mecanismo = {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Practical details of the engagement — what the reader can expect when
|
||||||
|
// working with creeer. Sits between Mecanismo (the high-level HOW) and
|
||||||
|
// Disciplinas (the tools). All copy derived from approved sources:
|
||||||
|
// mecanismo steps, puntosInflexion respuestas, comoEmpezar.
|
||||||
|
// ⚠️ «Duración» left deliberately open — the dueña hasn't specified a
|
||||||
|
// timeline. The card invites a conversation instead of committing a number.
|
||||||
|
export const formaTrabajar = {
|
||||||
|
eyebrow: 'qué esperar',
|
||||||
|
title: 'Así es trabajar conmigo',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
name: 'Metodología',
|
||||||
|
desc: 'Inmersión en tu empresa, desafío de lo que todos dan por hecho y construcción conjunta de tu estrategia.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Quién participa',
|
||||||
|
desc: 'Tú y yo. Sin intermediarios. Trabajo directo con quien toma las decisiones.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'De dónde partimos',
|
||||||
|
desc: 'Tu operación real: números, procesos, equipo. Me sumerjo hasta comprenderla desde dentro.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Qué te llevas',
|
||||||
|
desc: 'Un diagnóstico claro, tus prioridades ordenadas y una estrategia ejecutable. Por escrito, no en tu cabeza.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Duración',
|
||||||
|
desc: 'Cada proceso tiene su ritmo. Lo definimos juntos en la sesión de diagnóstico.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
export const disciplinas = {
|
export const disciplinas = {
|
||||||
eyebrow: 'las herramientas',
|
eyebrow: 'las herramientas',
|
||||||
title: 'Las disciplinas que uso',
|
title: 'Las disciplinas que uso',
|
||||||
|
|||||||
Reference in new issue
Block a user