// Winkz Designs 2026, CLIENT PORTAL LOGIN (function () { const { useState } = React; const { Icon, Reveal } = window; const GRAD = 'linear-gradient(120deg,#F23BFE,#79BAFF,#2DE3EA)'; const PERKS = [ ['LayoutDashboard', 'Live project board', 'Every milestone, deliverable and open question in one place, updated as we build.'], ['MessageSquare', 'Direct line to your team', 'Thread comments straight onto designs and pages. No email chains, no lost feedback.'], ['FileText', 'Invoices & contracts', 'Scope, agreements and payment history, always downloadable.'], ['Activity', 'Site health & analytics', 'Uptime, Core Web Vitals and traffic for the sites we maintain.'], ]; function Field({ label, type, name, autoComplete, placeholder, trailing }) { const [focus, setFocus] = useState(false); return ( ); } function Toggle({ on, onChange, children }) { return ( ); } function CardShell({ children }) { return (
{children}
); } function CardHead({ icon, title, kicker }) { return (
{title} {kicker}
); } const backLink = (label, onClick) => ( ); function LoginCard({ onNavigate }) { const [view, setView] = useState('signin'); // signin | invite | forgot | sent const [busy, setBusy] = useState(false); const [remember, setRemember] = useState(true); const [resetTo, setResetTo] = useState(''); const submitSignIn = (e) => { e.preventDefault(); setBusy(true); setTimeout(() => { setBusy(false); setView('invite'); }, 1000); }; const submitReset = (e) => { e.preventDefault(); setResetTo(new FormData(e.target).get('email') || 'your inbox'); setBusy(true); setTimeout(() => { setBusy(false); setView('sent'); }, 1000); }; if (view === 'invite') return (

If you're an active client, your account manager sends credentials when your project kicks off. Can't find them? Email design@winkzdesigns.com and we'll resend in minutes.

{backLink('Back to sign in', () => setView('signin'))}
); if (view === 'sent') return (

If {resetTo} matches a portal account, a reset link is in your inbox within a minute or two. The link expires after 30 minutes for security.

Nothing after five minutes? Check spam, then email design@winkzdesigns.com and we'll reset it by hand.
{backLink('Back to sign in', () => setView('signin'))}
); if (view === 'forgot') return (

Enter the email on your portal account and we'll send a secure link to set a new password.

{backLink('Back to sign in', () => setView('signin'))}
); return (
setView('forgot')} style={{ background: 'none', border: 'none', padding: 0, cursor: 'pointer', fontFamily: 'var(--font-body)', fontSize: 12.5, color: 'var(--winkz-blue)' }}>Forgot?} /> Keep me signed in on this device
Not a client yet
); } function LoginPage({ onNavigate }) { return (
{window.WinkzStreams && }
Client portal

Your project,
in plain sight.

Sign in to track your build, review work, leave feedback and handle the paperwork, without chasing anyone for an update.

{PERKS.map(([icon, title, body]) => (
{title}
{body}
))}

Sessions are encrypted end to end. We never store card details in the portal.

); } window.LoginPage = LoginPage; })();