-
{index}
+
+ {index}
{label}
@@ -81,21 +82,24 @@ export default function Configurator() {
How it works
-
- {steps.map((step, i) => (
-
- ))}
+ {/* Vertical accent line + steps */}
+
+
+
+ {steps.map((step, i) => (
+
+ ))}
+
{/* Trust signal */}
-
+
No commitment required
-
@@ -103,7 +107,15 @@ export default function Configurator() {
{/* ── Right: Wizard ───────────────────────────────────────────── */}
-
+
+ {/* Radial gradient glow — top-left warmth */}
+
diff --git a/src/components/sections/Hero.tsx b/src/components/sections/Hero.tsx
index 9960915..dd06870 100644
--- a/src/components/sections/Hero.tsx
+++ b/src/components/sections/Hero.tsx
@@ -3,7 +3,7 @@
import { motion } from 'framer-motion';
import { useTranslations } from 'next-intl';
import { cn } from '@/lib/utils';
-import { viewportOnce } from '@/lib/animations';
+
import Button from '@/components/ui/Button';
import HeroGeometric from '@/components/icons/HeroGeometric';
@@ -100,40 +100,20 @@ const ctaVariant = {
},
};
-// Trust strip slide in from left
-const trustVariant = {
- hidden: { opacity: 0, x: -32 },
+// Decorative separator line fade-in — after subtitle
+const separatorVariant = {
+ hidden: { opacity: 0, scaleX: 0 },
visible: {
opacity: 1,
- x: 0,
+ scaleX: 1,
transition: {
- duration: 0.55,
- delay: 0.9,
+ duration: 0.6,
+ delay: 0.65,
ease: [0.16, 1, 0.3, 1] as [number, number, number, number],
},
},
};
-// Gradient stops for each avatar circle — subtle variations on the primary palette
-const AVATAR_GRADIENTS = [
- 'linear-gradient(135deg, rgba(0,100,148,0.35), rgba(91,164,217,0.45))',
- 'linear-gradient(135deg, rgba(91,164,217,0.40), rgba(0,100,148,0.30))',
- 'linear-gradient(135deg, rgba(0,100,148,0.28), rgba(91,164,217,0.38))',
-] as const;
-
-function AvatarCircle({ index }: { index: number }) {
- return (
-
0 && '-ml-2',
- )}
- style={{ background: AVATAR_GRADIENTS[index] }}
- aria-hidden="true"
- />
- );
-}
-
export default function Hero() {
const t = useTranslations('hero');
@@ -187,7 +167,7 @@ export default function Hero() {
/>
{/* ─── Content ──────────────────────────────────────────────────── */}
-
+
{/* Eyebrow */}
+ {/* Decorative gradient separator */}
+
+
{/* CTA row */}
{t('cta')}
-
-
- {/* Trust proof strip */}
-
- {/* Overlapping avatar circles */}
-
-
- {t('trust')}
-
-
{/* Bottom fade-out to next section */}
diff --git a/src/components/sections/Philosophy.tsx b/src/components/sections/Philosophy.tsx
index 4fe5780..72a669c 100644
--- a/src/components/sections/Philosophy.tsx
+++ b/src/components/sections/Philosophy.tsx
@@ -108,7 +108,7 @@ function PhilosophyPillar({
{/* Content */}
{String(index + 1).padStart(2, '0')}
@@ -132,7 +132,7 @@ function AbstractGeometry() {
className="absolute inset-0 overflow-hidden rounded-xl"
aria-hidden="true"
>
- {/* Primary large circle */}
+ {/* Primary large circle — filled radial glow */}
+ {/* Large circle ring — border only, ~40% opacity */}
+
+
{/* Secondary circle, bottom-left */}
+ {/* Second smaller ring — bottom-left */}
+
+
{/* Diagonal grid */}
- {/* Accent rectangle top-left */}
+ {/* Diagonal line crossing the composition */}
+
+
+ {/* Accent rectangle top-left, rotated */}
+ {/* Second rotated rectangle outline — center */}
+
+
{/* Floating dot cluster center-right */}
- {/* Thin arc line */}
+ {/* Small dot cluster upper-left */}
+
+
+ {/* Thin dashed arc */}
+
+ {/* Navy bottom overlay that fades upward — gives depth to pull-quote */}
+
);
}
@@ -319,6 +397,7 @@ export default function Philosophy() {
'bg-surface-high rounded-xl p-6 shadow-subtle',
'max-w-[320px] w-[calc(100%-2.5rem)] lg:max-w-[340px]',
'z-10',
+ 'border-l-[3px] border-primary',
)}
>
{/* CornerBracket top-right decoration */}
diff --git a/src/components/sections/Process.tsx b/src/components/sections/Process.tsx
index 503bad2..46cc154 100644
--- a/src/components/sections/Process.tsx
+++ b/src/components/sections/Process.tsx
@@ -54,27 +54,36 @@ function StepCard({ numeral, stepKey, Icon }: { numeral: string; stepKey: string
+ {/* Top accent strip — gradient from primary-dark to primary */}
+
+
{/* Ghosted numeral — scales up on scroll */}
{numeral}
- {/* Icon */}
+ {/* Icon container */}
{/* Title */}
@@ -111,26 +120,71 @@ export default function Process() {
{/* ── Header column ── */}
-
+ {/* Vertical accent bar left of heading */}
+
{/* ── Steps column ── */}
-
- {STEPS.map((step) => (
-
- ))}
-
+
+ {/* Dashed connector line — visible on sm+ grid layouts only */}
+
+
+
+
+
+ {STEPS.map((step) => (
+
+ ))}
+
+
diff --git a/src/components/sections/SelectedWorks.tsx b/src/components/sections/SelectedWorks.tsx
index 4f80ca0..0af7258 100644
--- a/src/components/sections/SelectedWorks.tsx
+++ b/src/components/sections/SelectedWorks.tsx
@@ -92,97 +92,278 @@ const comingSoonVariants = {
function GeometricPlaceholder({
variant = 'featured',
+ cardVariant = 'default',
className,
}: {
variant?: 'featured' | 'small';
+ cardVariant?: 'default' | 'nimara' | 'amador';
className?: string;
}) {
const isFeatured = variant === 'featured';
+ // Different gradient bases per card so secondary cards look distinct
+ const gradientMap = {
+ default: 'from-primary-dark/90 to-primary/70',
+ nimara: 'from-navy/95 to-primary-dark/75',
+ amador: 'from-[#1a3a4a]/95 to-primary/60',
+ };
+
return (
- {/* Abstract geometric shapes */}
- {/* Large circle top-right */}
-
- {/* Medium circle bottom-left */}
-
- {/* Diagonal stripes overlay */}
-
- {/* Small accent rectangle */}
-
- {/* Thin horizontal line accent */}
-
- {/* Grid-dot accent */}
-
+
+ {isFeatured ? (
+ /* ── Featured (Monaco): blueprint feel ── */
+ <>
+ {/* Large filled circle top-right */}
+
+ {/* Large circle ring — blueprint layer */}
+
+ {/* Medium circle bottom-left */}
+
+ {/* Subtle grid overlay (blueprint feel) */}
+
+ {/* Diagonal stripes very subtle */}
+
+ {/* Small dot cluster */}
+
+ {/* Blueprint horizontal line — wide, white/20 */}
+
+ {/* Second thinner line below */}
+
+ {/* Accent rotated rectangle */}
+
+ {/* Small diagonal accent line */}
+
+ >
+ ) : cardVariant === 'nimara' ? (
+ /* ── Port Nimara: horizontal bands + arc ── */
+ <>
+ {/* Large arc ring top-left */}
+
+ {/* Smaller ring center */}
+
+ {/* Horizontal rule band */}
+
+ {/* Fine horizontal lines */}
+
+
+ {/* Dot cluster top-right */}
+
+ {/* Diagonal line */}
+
+ >
+ ) : (
+ /* ── Port Amador: triangular/radial composition ── */
+ <>
+ {/* Central radial glow */}
+
+ {/* Diamond/rotated square accent */}
+
+ {/* Diagonal stripes (different angle) */}
+
+ {/* Top horizontal line */}
+
+ {/* Small filled rectangle */}
+
+ {/* Dot accent bottom-right */}
+
+ >
+ )}
- {/* Bottom gradient fade */}
-
+
+ {/* Bottom gradient fade — card bg color bleed for text readability */}
+
);
}
// ─── Tag Chip ─────────────────────────────────────────────────────────────────
-function TagChip({ label }: { label: string }) {
+function TagChip({ label, showDot = false }: { label: string; showDot?: boolean }) {
return (
-
+
+ {showDot && (
+
+ )}
{label}
);
@@ -203,6 +384,7 @@ function FeaturedCard({ project, readLabel }: { project: Project; readLabel: str
{/* Geometric image placeholder */}
@@ -210,8 +392,8 @@ function FeaturedCard({ project, readLabel }: { project: Project; readLabel: str
{/* Tags */}
- {project.tags.map((tag) => (
-
+ {project.tags.map((tag, i) => (
+ 0} />
))}
@@ -230,16 +412,15 @@ function FeaturedCard({ project, readLabel }: { project: Project; readLabel: str
href={`/work/${project.slug}`}
className={cn(
'inline-flex items-center gap-2 text-sm font-medium text-primary-dark',
- 'transition-gap duration-200 group/link',
- 'mt-1',
+ 'mt-1 group/link',
)}
>
-
+
{readLabel}
@@ -249,7 +430,14 @@ function FeaturedCard({ project, readLabel }: { project: Project; readLabel: str
// ─── Small Card ───────────────────────────────────────────────────────────────
+const SLUG_TO_VARIANT: Record = {
+ 'port-nimara': 'nimara',
+ 'port-amador': 'amador',
+};
+
function SmallCard({ project, readLabel }: { project: Project; readLabel: string }) {
+ const cardVariant = SLUG_TO_VARIANT[project.slug] ?? 'nimara';
+
return (
@@ -280,8 +469,8 @@ function SmallCard({ project, readLabel }: { project: Project; readLabel: string
{/* Tags */}
- {project.tags.map((tag) => (
-
+ {project.tags.map((tag, i) => (
+ 0} />
))}
@@ -300,12 +489,12 @@ function SmallCard({ project, readLabel }: { project: Project; readLabel: string
href={`/work/${project.slug}`}
className="inline-flex items-center gap-1.5 text-xs font-medium text-primary-dark group/link"
>
-
+
{readLabel}
@@ -368,14 +557,21 @@ export default function SelectedWorks() {
0% { background-position: 0 0, 100% 0, 100% 100%, 0 100%; }
100% { background-position: 100% 0, 100% 100%, 0 100%, 0 0; }
}
+ @keyframes coming-soon-bg-pulse {
+ 0%, 100% { background-color: var(--color-surface-low); }
+ 50% { background-color: var(--color-surface); }
+ }
@keyframes coming-soon-fade {
0%, 100% { opacity: 0; }
50% { opacity: 1; }
}
+ .coming-soon-card {
+ animation: coming-soon-bg-pulse 4s ease-in-out infinite;
+ }
.coming-soon-pulse {
background: radial-gradient(
ellipse at center,
- rgba(91, 164, 217, 0.04) 0%,
+ rgba(91, 164, 217, 0.06) 0%,
transparent 70%
);
animation: coming-soon-fade 4s ease-in-out infinite;
diff --git a/src/components/sections/ServicesOverview.tsx b/src/components/sections/ServicesOverview.tsx
index 5aeba1f..58cb32b 100644
--- a/src/components/sections/ServicesOverview.tsx
+++ b/src/components/sections/ServicesOverview.tsx
@@ -44,7 +44,16 @@ export default function ServicesOverview() {
const t = useTranslations();
return (
-
+
{/* Section header */}
@@ -75,8 +84,8 @@ export default function ServicesOverview() {
variants={revealVariants}
className={cn(
'relative flex flex-col p-8 bg-surface',
- 'transition-colors duration-200 ease-out',
- 'hover:bg-surface-high',
+ 'transition-all duration-200 ease-out',
+ 'hover:bg-surface-high hover:shadow-subtle',
)}
>
{/* Ghosted numeral */}
@@ -102,7 +111,7 @@ export default function ServicesOverview() {
>
{feature}
@@ -120,18 +129,33 @@ export default function ServicesOverview() {
initial="hidden"
whileInView="visible"
viewport={viewportOnce}
- className="mt-16 flex flex-col items-center gap-4"
+ className="mt-16 flex items-center gap-6"
>
- {/* Decorative rule */}
+ {/* Left horizontal rule */}
-
+
{t('services.aiNarrative')}
+
+ {/* Right horizontal rule */}
+
diff --git a/src/components/sections/TrustBar.tsx b/src/components/sections/TrustBar.tsx
index 193be20..8ea5d9f 100644
--- a/src/components/sections/TrustBar.tsx
+++ b/src/components/sections/TrustBar.tsx
@@ -49,17 +49,29 @@ function TrustCard({ item, index, t }: TrustCardProps) {
+ {/* Top accent gradient bar — fades in on hover */}
+
+
{/* Icon with scale-bounce on scroll reveal */}
@@ -99,8 +111,16 @@ export default function TrustBar() {
return (
+ {/* Gradient bridge — blends hero surface-high into this section */}
+
{/* Stagger wrapper — triggers children revealVariants on scroll */}