/* ==========================================================
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 */}
);
};
/* ----------------------------------------------------------
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 (
);
};
/* ----------------------------------------------------------
OrgDocFooter
Props: none
---------------------------------------------------------- */
window.OrgDocFooter = function OrgDocFooter() {
return (
Arena · Organizer console v0.6
ship order: calendar · ingest · assign · monitor
);
};