// site-tickets-submit.jsx — Tickets & venues + Submit a film form.
function Tickets({ navigate }) {
const d = useSite();
const page = d.festival.ticketsPage || {};
return (
{page.eyebrow || ("Box Office \u00b7 " + d.festival.year)}
{page.heading || "Tickets"}
{page.body || "Eight nights of student short cinema. Most screenings are free with online RSVP; the closing Paper Bird Awards night at SCALE is ticketed."}
{/* tiers */}
Passes & tickets
{d.tickets.map((t, i) => {
const free = String(t.price) === "0";
const feature = i === 2;
return (
0{i + 1}
{feature && Best value }
{free ? "Free" : "£" + t.price}
{t.name}
{t.desc}
t.link ? window.open(t.link, "_blank", "noopener") : null}>
{free ? "Reserve" : "Buy"}
);
})}
{/* venues */}
Venues
Where it happens.
{d.venues.map((v) => (
{v.name}
{v.address}
{v.capacity > 0 &&
Capacity {v.capacity}
}
))}
{/* info strip */}
{[["Access", "All venues are step-free. Captioned and relaxed screenings are marked in the programme."], ["Box office", "Opens one hour before the first daily screening. Card only at the door."], ["Students", "LJMU students attend free with valid ID — reserve seats online in advance."]].map(([h, b]) => (
))}
{/* Schedule strip */}
{(d.schedule || []).length > 0 && (
Schedule
Eight nights.
{d.schedule.map((s) => (
{s.date}
{s.time}
{s.title}
{s.venue}
{s.strand}
))}
)}
);
}
// ── Submit ───────────────────────────────────────────────────────────────────
function renderSubmissionBody(text) {
if (!text) return null;
return text.split(/\n\n+/).map((para, i) => {
const lines = para.split("\n").filter(l => l.trim());
if (!lines.length) return null;
const isList = lines.every(l => /^[-•]/.test(l.trim()));
if (isList) return (
{lines.map((line, j) => (
—
{line.replace(/^[-•]\s*/, "")}
))}
);
return (
{lines.map((line, j) => (
{line}{j < lines.length - 1 && }
))}
);
});
}
function Submit({ navigate }) {
const d = useSite();
const sub = d.festival.submissions || {};
const sections = sub.sections || [];
const box = sub.box || {};
const submitOpen = box.submitOpen !== false;
return (
{/* Dark hero */}
{sub.heroEyebrow || ("Submissions \u00b7 " + d.festival.year)}
{sub.heroTitle || "Submit a film."}
{sub.heroLead || "We accept short films from students at film schools and universities worldwide."}
{/* Left: editorial content sections */}
{sections.map((sec, i) => (
{sec.title}
{sec.title}.
{renderSubmissionBody(sec.body)}
))}
{/* Right: sticky submission box */}
);
}
Object.assign(window, { Tickets, Submit });