/* ========================================================== organizer-chrome.jsx — Arena Organizer structural chrome Login · Sidebar · Topbar · DocFooter React 18 in-browser Babel (no build step). No import/export. Deps: window.React, window.ORG_NAV ========================================================== */ /* ---------------------------------------------------------- Helpers ---------------------------------------------------------- */ function _initials(displayName) { if (!displayName) return '?'; var parts = String(displayName).trim().split(/\s+/); if (parts.length >= 2) { return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase(); } return parts[0].slice(0, 2).toUpperCase(); } /* ---------------------------------------------------------- OrgLoginScreen Props: onLogin {(email, password) => Promise} loading {boolean} ---------------------------------------------------------- */ window.OrgLoginScreen = function OrgLoginScreen(props) { var onLogin = props.onLogin; var loading = props.loading; var emailState = React.useState(''); var email = emailState[0]; var setEmail = emailState[1]; var passwordState = React.useState(''); var password = passwordState[0]; var setPassword = passwordState[1]; var errorState = React.useState(''); var error = errorState[0]; var setError = errorState[1]; function handleSubmit(e) { if (e && e.preventDefault) e.preventDefault(); if (loading) return; setError(''); Promise.resolve(onLogin(email, password)).catch(function(err) { setError(err && err.message ? err.message : 'Sign-in failed. Please try again.'); }); } function handleKeyDown(e) { if (e.key === 'Enter') handleSubmit(); } return (
{/* Brand lockup */}
A
Arena · studio
Organizer console
{/* Form */}
{error && (
{error}
)}
); }; /* ---------------------------------------------------------- OrgSidebar Props: activePage {string} onNavigate {(pageId) => void} admin {{ email, display_name, role } | null} onLogout {() => void} gameCount {number} ---------------------------------------------------------- */ window.OrgSidebar = function OrgSidebar(props) { var activePage = props.activePage; var onNavigate = props.onNavigate; var admin = props.admin; var onLogout = props.onLogout; var gameCount = props.gameCount; var nav = window.ORG_NAV; var displayName = admin && admin.display_name ? admin.display_name : (admin && admin.email ? admin.email : 'Admin'); var role = admin && admin.role ? admin.role : ''; var initials = _initials(displayName); function resolveCount(item) { if (item.id === 'sessions' && gameCount != null) return gameCount; if (item.count != null) return item.count; return null; } return ( ); }; /* ---------------------------------------------------------- OrgTopbar Props: breadcrumbs {string[]} e.g. ["Workspace","Sessions","Apr 2026"] onNavigate {function} Navigate to a page admin {object} ---------------------------------------------------------- */ window.OrgTopbar = function OrgTopbar(props) { var breadcrumbs = props.breadcrumbs || []; var onNavigate = props.onNavigate; var crumbNodes = breadcrumbs.map(function(crumb, i) { var isLast = i === breadcrumbs.length - 1; return ( {isLast ? {crumb} : crumb} {!isLast && } ); }); return (
{crumbNodes}
); }; /* ---------------------------------------------------------- OrgDocFooter Props: none ---------------------------------------------------------- */ window.OrgDocFooter = function OrgDocFooter() { return (
Arena · Organizer console v0.6 ship order: calendar · ingest · assign · monitor
); };