// SR SOFT — App shell: Navbar + Hero + page composition // (Sections live in sections.jsx) const { useState, useEffect, useRef, useMemo } = React; // ── Reveal hook (IntersectionObserver) ────────────────────────── function useReveal() { useEffect(() => { const els = document.querySelectorAll(".reveal:not(.in)"); if (!("IntersectionObserver" in window)) { els.forEach((el) => el.classList.add("in")); return; } const io = new IntersectionObserver( (entries) => { entries.forEach((e) => { if (e.isIntersecting) { e.target.classList.add("in"); io.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: "0px 0px -40px 0px" } ); els.forEach((el) => io.observe(el)); return () => io.disconnect(); }); } // ── Navbar ─────────────────────────────────────────────────────── const NAV_LINKS = [ { href: "#home", label: "Home" }, { href: "#servizi", label: "Servizi" }, { href: "#metodo", label: "Metodo" }, { href: "#soluzioni", label: "Soluzioni" }, { href: "#tecnologie", label: "Tecnologie" }, { href: "#contatti", label: "Contatti" }, ]; function Navbar() { const [scrolled, setScrolled] = useState(false); const [open, setOpen] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 12); onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); useEffect(() => { document.body.style.overflow = open ? "hidden" : ""; }, [open]); const close = () => setOpen(false); return (
{NAV_LINKS.map((l) => ( {l.label} ))} Parliamo del tuo progetto
); } function Arrow({ size = 14 }) { return ( ); } // ── Hero ───────────────────────────────────────────────────────── function Hero({ headline }) { const words = headline.split(" "); return (
Consulenza · Sviluppo · Integrazione

{words.map((w, i) => ( {w} {i < words.length - 1 ? " " : ""} ))}

SR SOFT affianca le aziende nell'analisi, progettazione e sviluppo di soluzioni digitali personalizzate: gestionali, piattaforme web, app mobile, integrazioni API e automazioni per rendere il lavoro più efficiente, controllabile e scalabile.

Raccontaci il tuo progetto Scopri cosa realizziamo
Disponibili Q2 2026 Progetti attivi 11 Tempo medio analisi 2 settimane Uptime medio 99.4%
); } function HeroVisual() { const ref = useRef(null); usePointerParallax(ref, 16); return (
{/* Rotating rings */}
{/* Network lines + nodes + packets */} {/* Terminal card */}
~/srsoft/analyze.ts
// analisi processo cliente
const flow = await analyze(
  "ordini → magazzino → fatturazione"
)
return flow.optimize().automate()
{/* Dashboard card */}
Operativo · Real-time ↑ 24%
Processi
Uptime
Manuale
{/* Floating chips */}
Integrazione API · OK
Build #214 · passed
); } function Sparkline() { const path = "M 0 40 L 28 32 L 56 36 L 84 22 L 112 28 L 140 14 L 168 20 L 196 8 L 224 16 L 252 4"; return ( ); } // ── App composition ───────────────────────────────────────────── const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#e94f37", "headline": "Progettiamo e sviluppiamo sistemi digitali su misura per far evolvere la tua azienda.", "density": "regular", "showGrid": true, "aurora": true, "spotlight": true }/*EDITMODE-END*/; const HEADLINES = [ "Progettiamo e sviluppiamo sistemi digitali su misura per far evolvere la tua azienda.", "Trasformiamo processi complessi in soluzioni digitali semplici, scalabili e potenti.", "Consulenza informatica e software su misura per aziende che vogliono crescere.", ]; const ACCENTS = ["#e94f37", "#ff8c73", "#f59e0b", "#34d399", "#a78bfa"]; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); useReveal(); useEffect(() => { const root = document.documentElement; root.style.setProperty("--accent", t.accent); root.style.setProperty("--accent-glow", hexA(t.accent, 0.32)); document.body.dataset.density = t.density; document.body.dataset.aurora = t.aurora ? "on" : "off"; document.body.dataset.spot = t.spotlight ? "on" : "off"; }, [t.accent, t.density, t.aurora, t.spotlight]); useEffect(() => { const grid = document.querySelector(".hero-grid-bg"); if (grid) grid.style.display = t.showGrid ? "" : "none"; }, [t.showGrid]); useMethodProgress(); return (