// Shared shell: nav context, crest, header, footer, small UI atoms. const CTSCShell = (function () { const NavCtx = React.createContext(null); function useNav() { return React.useContext(NavCtx); } // Council crest mark (fallback when no logo uploaded) const CREST_SVG = "data:image/svg+xml," + encodeURIComponent( ""); function Crest({ size = 50 }) { return (
);
}
function StatusBadge({ status }) {
const map = { Approved: 'badge-approved', Pending: 'badge-pending', Draft: 'badge-draft' };
const dot = { Approved: '●', Pending: '◐', Draft: '○' };
return {dot[status] || '○'} {status};
}
// Table-Mountain photo placeholder (decorative) — shows uploaded src if provided
function Photo({ h = 200, tag = 'Photo', style = {}, src, children }) {
if (src) {
return (