// app.jsx — main one-pager app. Uses window.Tacho, window.RedlineBar, useTweaks + Tweak* controls. const { useState, useEffect, useRef, useCallback } = React; /* ---------------- icons ---------------- */ const I = { arrow: , mail: , phone: , link: , play: , expand: , close: , award: , doc: }; /* ---------------- data ---------------- */ const EQUIP = [ { name: "Markenstrategie", rpm: 7400, desc: "Ich gebe Marken eine klare Richtung — unverwechselbar positioniert und tragfähig über Jahre." }, { name: "Integrierte Kommunikation", rpm: 7100, desc: "Ich orchestriere alle Kanäle zu einer Stimme, die über jeden Touchpoint konsequent wirkt." }, { name: "Digital Marketing", rpm: 6800, desc: "Ich verbinde Daten, Content und Performance zu Kampagnen, die messbar Resultate liefern." }, { name: "Konzept & Text", rpm: 7600, desc: "Ich schreibe Texte, die ankommen. Und Wirkung zeigen. Mal Fortissimo, mal Pianissimo. Genauso, wie es die Zielgruppe braucht." }]; const PROJECTS = [ { kunde: "Weltbild Schweiz", branche: "Verlag", aufgabe: "Ausarbeitung einer crossmedialen Testimonial-Kampagne für Weltbild, um neue Kundensegmente zu erschliessen.", ergebnis: "Mit Stefanie Heinzmann als Markenbotschafterin konnte Weltbild Schweiz eine jüngere Zielgruppe ansprechen. Die Walliser Pop- und Soulinterpretin verfügt über einen hohen Wiedererkennungswert und verkörpert gleichermassen Bodenständigkeit wie einen modernen Zeitgeist — Werte, die sich auch Weltbild auf die Fahne geschrieben hat. Ebenso konnte der Website-Traffic signifikant gesteigert und die Zahl der Follower auf den sozialen Medien ausgebaut werden." }, { kunde: "Advery", branche: "Werbeagentur / Kommunikation", aufgabe: "Strategische und operative Führung der Kommunikationsagentur Advery — von Positionierung und New Business über Kundenakquisition bis zur Team- und Talententwicklung.", ergebnis: "Aus der Agentur eines sozialintegrativen Ausbildungsbetriebs wurde ein Anbieter, der sich auch bei Kunden ohne sozialen Bezug behauptete — anerkannt für Qualität statt Wohltätigkeit, konkurrenzfähig in der Region und mit gestärkter Auftragslage." }, { kunde: "OPO Oeschger", branche: "Holzhandel / Beschläge", aufgabe: "Marktbearbeitung in der Schweiz und Deutschland, analog und digital — von der Messekonzeption über die Erneuerung sämtlicher Werbemittel bis zur Betreuung des Kundenmagazins und Erschliessung neuer Absatzkanäle.", ergebnis: "Ausbau der Marktpräsenz des Familienunternehmens: Messeauftritte optimiert, Kundenbindung verstärkt und durch die Mitausrichterschaft am Bundesgestaltungswettbewerb «Die Gute Form» (Tischler Schreiner Deutschland) Zugang zu neuen Schreinerei-Adressen für gezielte Angebote erhalten." }]; /* ---------------- scroll helpers ---------------- */ function scrollToId(id) { const el = document.getElementById(id); if (el) {const y = el.getBoundingClientRect().top + window.scrollY - 58;window.scrollTo({ top: y, behavior: 'smooth' });} } function useReveal(dep) { useEffect(() => { const els = [...document.querySelectorAll('.reveal:not(.in)')]; const io = new IntersectionObserver((es) => { es.forEach((e) => {if (e.isIntersecting) {e.target.classList.add('in');io.unobserve(e.target);}}); }, { threshold: .14, rootMargin: '0px 0px -8% 0px' }); els.forEach((el) => io.observe(el)); return () => io.disconnect(); }, [dep]); } /* ---------------- Nav ---------------- */ function Nav({ vocab }) { const [show, setShow] = useState(false); const [open, setOpen] = useState(false); const [active, setActive] = useState('hero'); const links = [ { id: 'fahrer', label: vocab ? 'Der Fahrer' : 'Über mich' }, { id: 'ausstattung', label: vocab ? 'Ausstattung' : 'Leistungen' }, { id: 'serviceheft', label: vocab ? 'Serviceheft' : 'Referenzen' }]; useEffect(() => { const onScroll = () => setShow(window.scrollY > window.innerHeight * 0.62); onScroll();window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); useEffect(() => { const ids = ['hero', ...links.map((l) => l.id)]; const io = new IntersectionObserver((es) => { es.forEach((e) => {if (e.isIntersecting) setActive(e.target.id);}); }, { rootMargin: '-45% 0px -50% 0px' }); ids.forEach((id) => {const el = document.getElementById(id);if (el) io.observe(el);}); return () => io.disconnect(); }, [vocab]); const go = (id) => {setOpen(false);scrollToId(id);}; return ( ); } /* ---------------- Hero ---------------- */ function Hero({ variant, vocab, anim }) { const Name =

MARK
SCHÖNHOLZER

; const role =
Senior Marketing Leader & Senior-Texter · Zürich
; const tag =

40 Jahre Kommunikation. Der Motor läuft auf Hochtouren.

; const cta =
; let inner; if (variant === 'split') { inner =
{role}{Name}{tag}{cta}
; } else if (variant === 'redline') { inner =
{role}{Name}
{tag}
{cta}
; } else {// vollgas inner =
{Name}{role}{tag} {cta}
; } return (
{inner}
SCROLLEN
); } /* ---------------- Der Fahrer ---------------- */ function Fahrer({ vocab }) { return (
{vocab ? 'Über mich' : 'Der Fahrer'}

{vocab ? 'Der Fahrer' : 'Über mich'}

Porträt von Mark Schönholzer
MARK SCHÖNHOLZER
{I.doc} CV als PDF herunterladen

Ich mache Marketing aus Überzeugung. Und nicht, weil ich es gelernt habe. Ich verbinde Strategie, Konzept und Kreation zu Ideen, die Relevanz haben und Wirkung zeigen.

Ich setze um, halte die Fäden zusammen und bewahre einen kühlen Kopf, auch wenn die Hütte brennt. Mit 40 Jahren Erfahrung über Agenturen, Verlage und KMUs hinweg weiss ich, wie Marketing in der Praxis funktioniert. Und nicht nur auf dem Papier.

«ICH ARBEITE MIT KOPF, HERZ UND MANCHMAL AUCH BAUCH.»
40Jahre im Marketing
3Welten: Agentur · Verlag · KMU
Bronze · Dialogmarketing-Preis
); } /* ---------------- Ausstattung (RPM bars) ---------------- */ function EquipRow({ item, idx, anim }) { const fillRef = useRef(null); const rowRef = useRef(null); useEffect(() => { const fill = fillRef.current,row = rowRef.current; if (!fill || !row) return; if (!anim) {fill.style.width = '100%';return;} fill.style.width = '0%'; let raf,started = false; const runFill = () => { if (started) return;started = true; const dur = 1100,delay = idx * 140; const ease = (p) => 1 - Math.pow(1 - p, 3); let t0 = null; const step = (now) => { if (t0 === null) t0 = now; const el = now - t0 - delay; if (el < 0) {raf = requestAnimationFrame(step);return;} const p = Math.min(el / dur, 1); fill.style.width = (ease(p) * 100).toFixed(2) + '%'; if (p < 1) raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); }; const check = () => { const r = row.getBoundingClientRect(); const vh = window.innerHeight || document.documentElement.clientHeight; if (r.top < vh * 0.82 && r.bottom > 0) {runFill();cleanup();} }; const cleanup = () => window.removeEventListener('scroll', check); window.addEventListener('scroll', check, { passive: true }); check(); return () => {cancelAnimationFrame(raf);cleanup();}; }, [anim, idx]); return (
{item.name}
{item.desc}
); } function Ausstattung({ vocab, anim }) { return (
{vocab ? 'Was ich biete' : 'Ausstattung'}

{vocab ? 'Ausstattung' : 'Was ich biete'}

Vier Leistungsfelder · serienmässig
{EQUIP.map((it, i) => )}
); } /* ---------------- Serviceheft ---------------- */ function Serviceheft({ vocab }) { const [zoom, setZoom] = useState(false); useEffect(() => { const onKey = (e) => {if (e.key === 'Escape') setZoom(false);}; if (zoom) {document.body.style.overflow = 'hidden';window.addEventListener('keydown', onKey);} return () => {document.body.style.overflow = '';window.removeEventListener('keydown', onKey);}; }, [zoom]); return (
{vocab ? 'Referenzen & Projekte' : 'Serviceheft'}

{vocab ? 'Serviceheft' : 'Referenzen'}

WAS AUF DEM WEG ZÄHLT:ERGEBNISSE, NICHT NUR NAMEN
BRONZE{I.award}
Auszeichnung & Jury

Schweizer Dialogmarketing-Preis

  • Bronze-Gewinner National Geographic (Anzeige) · EasyJet (E-Mailing)
  • Unabhängiges Jurymitglied Bewertung eingereichter Dialogmarketing-Arbeiten
{PROJECTS.map((p, i) =>
CASE {String(i + 1).padStart(2, '0')}
{p.kunde}
{p.branche}
Aufgabe
{p.aufgabe}
Ergebnis
{p.ergebnis}
)}

Für Branding mit Emotionen

Mal laut, mal leise, mal kraftvoll, mal ruhiger. Gute Kommunikation trifft den richtigen Ton.

{zoom &&
setZoom(false)}>
e.stopPropagation()}>
}
); } /* ---------------- Kontakt ---------------- */ function Kontakt({ vocab }) { return (
{vocab ? 'Lust auf eine Probefahrt?' : 'Kontakt'}

Lassen Sie uns gemeinsam Vollgas geben.

{I.mail}E-Mailmarkschonholzer@gmail.com {I.phone}Telefon079 402 90 72 {I.link}LinkedIn/in/markschoenholzer
{I.doc} CV als PDF herunterladen
markschoenholzer.ch  ·  © {new Date().getFullYear()} Mark Schönholzer  ·  Zürich
); } /* ---------------- Tweaks ---------------- */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "heroVariant": "vollgas", "accent": "#C0392B", "motorVocab": true, "animations": true, "bodyFont": "Trebuchet MS" } /*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const vocab = t.motorVocab; const anim = t.animations; useEffect(() => { document.documentElement.style.setProperty('--accent', t.accent); document.documentElement.style.setProperty('--font-body', `'${t.bodyFont}','Barlow',system-ui,sans-serif`); document.documentElement.setAttribute('data-anim', anim ? 'on' : 'off'); document.documentElement.setAttribute('data-reveal', anim ? 'on' : 'off'); }, [t.accent, t.bodyFont, anim]); useReveal('' + vocab + anim + t.heroVariant); return (