feat: redesign page heroes, implement organic markers, and streamline contact flow
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 6s
Build & Deploy / 🧪 QA (push) Failing after 1m24s
Build & Deploy / 🏗️ Build (push) Failing after 4m3s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 5s

- Refined hero sections for About, Blog, Websites, and Case Studies for a bespoke industrial entry point.
- Redesigned Marker component using layered SVG paths for an organic, hand-drawn highlighter effect.
- Restored technical precision in ArchitectureVisualizer with refined line thickness.
- Streamlined contact page by removing generic headers and prioritizing the configurator/gateway.
- Updated technical references to reflect self-hosted Gitea infrastructure.
- Cleaned up unused imports and addressed linting warnings across modified pages.
This commit is contained in:
2026-02-16 19:34:08 +01:00
parent cb32b9d62f
commit 9cfe7ee9e5
58 changed files with 3231 additions and 1592 deletions

View File

@@ -2,6 +2,7 @@
import React from "react";
import { motion } from "framer-motion";
import { cn } from "../utils/cn";
/**
* TECHNICAL MARKER COMPONENT
@@ -19,24 +20,70 @@ export const Marker: React.FC<MarkerProps> = ({
children,
delay = 0,
className = "",
color = "rgba(255,235,59,0.95)",
color = "rgba(255,235,59,0.7)",
}) => {
return (
<span className={`relative inline-block px-1 ${className}`}>
<motion.span
initial={{ scaleX: 0, opacity: 0 }}
whileInView={{ scaleX: 1, opacity: 1 }}
viewport={{ once: true, margin: "-5%" }}
transition={{
duration: 1.2,
delay: delay + 0.1,
ease: [0.23, 1, 0.32, 1],
}}
className="absolute inset-0 z-[-1] -skew-x-6 rotate-[-1deg] translate-y-1 transform-gpu origin-left"
style={{ backgroundColor: color }}
<span className={cn("relative inline px-1", className)}>
<svg
className="absolute inset-x-0 bottom-0 top-0 h-full w-full pointer-events-none z-[-1]"
preserveAspectRatio="none"
viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
/>
<span className="relative z-10 text-slate-900">{children}</span>
>
{/* Organic Stroke 1: Main body */}
<motion.path
d="M 0,85 C 10,87 25,82 40,84 C 55,86 75,81 90,83 C 95,84 100,85 100,85"
vectorEffect="non-scaling-stroke"
initial={{ pathLength: 0, opacity: 0 }}
whileInView={{ pathLength: 1, opacity: 1 }}
viewport={{ once: true, margin: "-5%" }}
transition={{
duration: 1.5,
delay: delay + 0.1,
ease: [0.23, 1, 0.32, 1],
}}
stroke={color}
strokeWidth="60"
strokeLinecap="round"
fill="none"
/>
{/* Organic Stroke 2: Variation for overlap */}
<motion.path
d="M 5,82 C 20,80 40,85 60,82 C 80,79 95,84 100,83"
vectorEffect="non-scaling-stroke"
initial={{ pathLength: 0, opacity: 0 }}
whileInView={{ pathLength: 1, opacity: 0.6 }}
viewport={{ once: true, margin: "-5%" }}
transition={{
duration: 1.8,
delay: delay + 0.3,
ease: [0.23, 1, 0.32, 1],
}}
stroke={color}
strokeWidth="35"
strokeLinecap="round"
fill="none"
/>
{/* Organic Stroke 3: Rough edge details */}
<motion.path
d="M 0,88 C 15,90 35,85 55,87 C 75,89 90,84 100,86"
vectorEffect="non-scaling-stroke"
initial={{ pathLength: 0, opacity: 0 }}
whileInView={{ pathLength: 1, opacity: 0.4 }}
viewport={{ once: true, margin: "-5%" }}
transition={{
duration: 1.2,
delay: delay + 0.2,
ease: [0.23, 1, 0.32, 1],
}}
stroke={color}
strokeWidth="15"
strokeLinecap="round"
fill="none"
/>
</svg>
<span className="relative z-10 text-inherit">{children}</span>
</span>
);
};