import React, { useEffect, useState } from 'react'; interface Props { theme: 'light'|'dark'; onToggleTheme: ()=>void; onLogin: ()=>void; market?: string; } export const LoginScreen: React.FC = ({ theme, onToggleTheme, onLogin, market='en-US' }) => { const [bgUrl,setBgUrl] = useState(null); const [attribution,setAttribution] = useState(''); useEffect(()=>{ let cancelled = false; fetch(`https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=${market}`) .then(r=> r.ok ? r.json(): Promise.reject(r.status)) .then(json=>{ if (cancelled) return; if (json?.images?.[0]) { const img = json.images[0]; setBgUrl('https://www.bing.com' + img.url); setAttribution(img.copyright || ''); } }) .catch(()=>{ /* silent fallback */ }); return ()=> { cancelled = true; }; }, [market]); const providerName: string = (typeof __OIDC_PROVIDER__ !== 'undefined' && __OIDC_PROVIDER__) || 'Identity Provider'; return (

IMAP Client

Secure self‑hosted mail dashboard. Sign in with your identity provider.

{attribution && (
{attribution}
)}
); }; const cardStyle: React.CSSProperties = { width:'min(420px, 100%)', backdropFilter:'blur(16px)', background:'var(--card-bg)', border:'1px solid var(--card-border)', padding:'32px 34px 40px', borderRadius:20, boxShadow:'0 8px 32px -4px rgba(0,0,0,0.35)', }; const primaryButtonStyle: React.CSSProperties = { all:'unset', cursor:'pointer', background:'linear-gradient(90deg,var(--btn-a),var(--btn-b))', color:'#fff', fontWeight:600, padding:'14px 22px', borderRadius:12, fontSize:15, letterSpacing:0.3, textAlign:'center', boxShadow:'0 4px 18px -4px rgba(0,0,0,0.4)', transition:'transform .15s ease, box-shadow .15s ease' }; const iconButtonStyle: React.CSSProperties = { all:'unset', cursor:'pointer', width:44, height:44, display:'grid', placeItems:'center', fontSize:20, background:'var(--icon-btn-bg)', border:'1px solid var(--icon-btn-border)', borderRadius:12, boxShadow:'0 4px 14px -4px rgba(0,0,0,0.4)', transition:'background .2s' };