Plan Your Show Season

Use our Venue Hire Estimator to explore the hire model that best suits your production, event or creative use. The estimate is indicative only and final quotes are subject to availability, production requirements and venue approval.

import { useState, useMemo } from "react"; import { Calendar, Sparkles, Users, Video, HelpCircle, ArrowRight, ArrowLeft, Mail, CheckCircle2, Info, RotateCcw, ChevronDown, ChevronUp, Copy, Check, MapPin } from "lucide-react"; // ---------- THEME ---------- const COL = { bg0: "#000000", bg1: "#031c22", panel: "rgba(5,46,56,0.5)", panelBorder: "rgba(205,247,246,0.14)", teal: "#052E38", cyan: "#CDF7F6", cyanDim: "#8ecfce", mauve: "#9E788F", mauveBright: "#c09aaf", burgundy: "#410A11", cream: "#e6f2f3", dim: "#6e9ea5", }; const wrapStyle = { background:`radial-gradient(ellipse 70% 55% at 12% 0%,rgba(158,120,143,0.22),transparent 50%),radial-gradient(ellipse 60% 45% at 88% 0%,rgba(5,46,56,0.75),transparent 50%),linear-gradient(180deg,${COL.bg1} 0%,${COL.bg0} 100%)`, minHeight:"100%", color:COL.cream, fontFamily:"ui-sans-serif,system-ui,sans-serif", }; // ---------- HELPERS ---------- function fmtMoney(n) { if(n==null||isNaN(n))return"—"; return"$"+Math.round(n).toLocaleString("en-AU"); } function num(v){const n=Number(v);return isNaN(n)?0:n;} function gst(exAmt){const ex=Math.round(exAmt),inc=Math.round(exAmt*1.1),g=inc-ex;return{ex,g,inc};} // ---------- RATES ---------- const SHOWROOM_FLEXI={ "Up to 60 minutes":{model:"Showroom Flexi-Share",off:290,peak:360,share:0.25}, "61–75 minutes":{model:"Showroom Extended Flexi 75",off:330,peak:400,share:0.25}, "76–90 minutes":{model:"Showroom Extended Flexi 90",off:380,peak:450,share:0.275}, }; const SHOWROOM_LOCKOUT_RATE={off:460,peak:570}; const WEEKLY_LOCKOUT_FLAT_RATE=3100; const WEEKLY_PERF_CAP=6; const WEEKLY_PREOPENING_HOURS_CAP=12; const CLUBROOM_WEEKLY_BUMPIN_CAP=8; const CLUBROOM_WEEKLY_SHOWDAY_CAP=3; const CLUBROOM_WEEKLY_LOCKOUT_FLAT_RATE=1000; const CLUBROOM_FLEXI={ "Up to 60 minutes":{model:"Clubroom Flexi-Share",off:110,peak:160,share:0.25}, "61–75 minutes":{model:"Clubroom Extended Flexi 75",off:135,peak:190,share:0.25}, "76–90 minutes":{model:"Clubroom Extended Flexi 90",off:160,peak:220,share:0.25}, }; const CLUBROOM_DEV={model:"Clubroom Development Share",off:75,peak:100,share:0.35}; const CLUBROOM_TRYOUT={3:{model:"Clubroom Tryout Package",base:300},4:{model:"Clubroom Tryout Package",base:380}}; const SINGLE_RATES={ Showroom:{"Up to 4 hrs":{model:"Showroom Simple Single Event",off:390,peak:460},"Up to 6 hrs":{model:"Showroom Standard Single Event",off:500,peak:620},"8–10 hrs":{model:"Showroom Full-Day Single Event",off:750,peak:950,from:true}}, Clubroom:{"Up to 4 hrs":{model:"Clubroom Simple Single Event",off:180,peak:240},"Up to 6 hrs":{model:"Clubroom Standard Single Event",off:250,peak:330},"8–10 hrs":{model:"Clubroom Full-Day Single Event",off:450,peak:600,from:true}}, }; const ARTWORK_NOTES={"Finished artwork":"Great — please provide artwork in the requested formats if proceeding.","Needs resizing":"Minor resizing may be reviewed once artwork is supplied.","May need design support":"A $70 + GST cost-recovery design fee may apply if branded artwork creation, redesign or substantial resizing is required."}; const LOCKOUT_STRUCTURE_OPTIONS=["One calendar week","Multiple calendar weeks","Scattered dates / not within one calendar week","Not sure yet"]; const WEEKLY_PERF_BAND_OPTIONS=["Up to 6 performances","More than 6 performances","Not sure yet"]; const WEEKLY_PREOPENING_ACCESS_OPTIONS=["Up to 12 hours","More than 12 hours","Not sure yet"]; const CLUBROOM_WEEKLY_ACCESS_OPTIONS=["Within these allowances","I'll need more access than this","Not sure yet"]; const DEV_FLAG_OPTIONS=["Yes, it is mainly a development / trial-season booking","No, it is a standard public season","Not sure"]; function devIsYes(a){return typeof a.development_flag==="string"&&a.development_flag.startsWith("Yes");} const SPACE_CAPACITY={Showroom:100,Clubroom:35}; function spaceLabel(opt){if(opt==="Showroom")return`The Showroom (up to ${SPACE_CAPACITY.Showroom} capacity)`;if(opt==="Clubroom")return`The Clubroom (up to ${SPACE_CAPACITY.Clubroom} capacity)`;return opt;} // ---------- STEPS ---------- function getTicketedSteps(a){ const base=[ {field:"space",q:"Which space are you interested in?",sub:"Not sure? We'll suggest one based on your answers.",type:"select",options:["Showroom","Clubroom","Not sure"]}, {field:"runtime_band",q:"What is the running time of your show?",type:"select",options:["Up to 60 minutes","61–75 minutes","76–90 minutes","Over 90 minutes"]}, {field:"footprint",q:"What best describes your production footprint?",sub:"A 55-minute show with a fixed set isn't really a Flexi season — this is the detail that matters most.",type:"select",options:["Minimal / mobile","Light set but resettable","Fixed set, storage or complex tech","Not sure"]}, {field:"development_flag",q:"Is this primarily a development, reading, tryout or trial-season booking?",sub:"This helps us assess whether the Clubroom Development Share or Tryout Package may be suitable.",type:"select",options:DEV_FLAG_OPTIONS}, ]; const overrideTriggered=a.footprint==="Fixed set, storage or complex tech"||a.runtime_band==="Over 90 minutes"; if(!overrideTriggered){ const capNote=a.space==="Clubroom"?`The Clubroom holds up to ${SPACE_CAPACITY.Clubroom} patrons.`:a.space==="Showroom"?`The Showroom holds up to ${SPACE_CAPACITY.Showroom} patrons.`:`The Showroom holds up to ${SPACE_CAPACITY.Showroom} patrons; the Clubroom holds up to ${SPACE_CAPACITY.Clubroom} patrons.`; return[...base,{field:"offpeak_perfs",q:"How many Mon–Thu (off-peak) performances?",type:"number"},{field:"peak_perfs",q:"How many Fri–Sun (peak) performances?",type:"number"},{field:"ticket_price",q:"What's your average ticket price?",type:"number",prefix:"$"},{field:"avg_attendance",q:"Expected average attendance per performance?",sub:capNote,type:"number"}]; } const steps=[...base,{field:"lockout_structure",q:"How is your Lock-Out season structured?",sub:"Weekly Lock-Out applies to suitable productions within one calendar week. Multi-week or unusual schedules are quoted individually.",type:"select",options:LOCKOUT_STRUCTURE_OPTIONS}]; if(a.lockout_structure==="One calendar week"){ steps.push({field:"weekly_perf_band",q:"How many performances are planned within the calendar week?",sub:"The standard Weekly Lock-Out package includes up to 6 performances.",type:"select",options:WEEKLY_PERF_BAND_OPTIONS}); if(a.weekly_perf_band==="Up to 6 performances"){ if(a.space==="Clubroom")steps.push({field:"weekly_clubroom_access_band",q:"How much bump-in and show-day access will you need?",sub:`The Clubroom Weekly Lock-Out allowance includes up to ${CLUBROOM_WEEKLY_BUMPIN_CAP} hours bump-in access (one day) and up to ${CLUBROOM_WEEKLY_SHOWDAY_CAP} hours access per show day. Extra sessions or additional loading are quoted upon enquiry.`,type:"select",options:CLUBROOM_WEEKLY_ACCESS_OPTIONS}); else steps.push({field:"weekly_preopening_access_band",q:"How much total pre-opening access will you need for bump-in, technical plotting and dress runs?",sub:"The standard Weekly Lock-Out package includes up to 12 hours of pre-opening access.",type:"select",options:WEEKLY_PREOPENING_ACCESS_OPTIONS}); } }else if(a.lockout_structure==="Scattered dates / not within one calendar week"){ steps.push({field:"daily_lockout_offpeak_perfs",q:"How many Mon–Thu Lock-Out performance days are planned across the season?",type:"number"},{field:"daily_lockout_peak_perfs",q:"How many Fri–Sun Lock-Out performance days are planned across the season?",type:"number"}); } return steps; } const STEPS={ single:[{field:"space",q:"Which space are you interested in?",type:"select",options:["Showroom","Clubroom","Not sure"]},{field:"access_band",q:"How much total same-day access do you need?",sub:"Includes setup, technical checks, the event itself, pack-down and venue reset.",type:"select",options:["Up to 4 hrs","Up to 6 hrs","8–10 hrs","Not sure"]},{field:"day_type",q:"Preferred day type?",type:"select",options:["Mon–Thu","Fri–Sun","Not sure"]},{field:"event_type",q:"What type of event is it?",type:"select",options:["Launch","Talk / panel","Showcase","Fundraiser","Private event","Filmed / commercial capture","Other"]},{field:"prior_bumpin",q:"Will you need prior-day bump-in?",type:"select",options:["No","Maybe","Yes"]}], noncommercial:[{field:"space",q:"Which space are you interested in?",type:"select",options:["Showroom","Clubroom","Not sure"]},{field:"hours",q:"How many hours do you need?",sub:"Minimum 3-hour booking applies.",type:"number"},{field:"day_type",q:"Preferred day type?",type:"select",options:["Mon–Thu","Fri","Sat–Sun","Not sure"]},{field:"use_type",q:"What are you using the room for?",type:"select",options:["Rehearsal","Audition","Reading","Creative development","Self-tape","Other"]}], commercial:[{field:"space",q:"Which space are you interested in?",type:"select",options:["Showroom","Clubroom","Not sure"]},{field:"hours",q:"Estimated access hours?",type:"number"},{field:"commercial_type",q:"What type of use is this?",type:"select",options:["Commercial filming","Content shoot","Corporate","Brand activation","Private event","Other"]},{field:"people_count",q:"Approximate crew or guest numbers?",type:"number"},{field:"external_suppliers",q:"Any external suppliers or equipment?",type:"select",options:["Yes","No","Not sure"]}], }; const PATHWAY_LABEL={ticketed:"Ticketed Season",single:"Single Event",noncommercial:"Rehearsal / Development",commercial:"Commercial / Private Use"}; // ---------- CALCULATIONS (logic unchanged; flexi/package results gain offp/peakp/offRate/peakRate) ---------- function computeTicketed(a){ const offp=num(a.offpeak_perfs),peakp=num(a.peak_perfs),total=offp+peakp; const price=num(a.ticket_price),att=num(a.avg_attendance); const gross=total*price*att,nbo=gross*0.9; const unsureFootprint=a.footprint==="Not sure"; let space=a.space,spaceNote=""; if(space==="Not sure"){ if(a.footprint==="Fixed set, storage or complex tech"){space="Showroom";spaceNote="Suggested Showroom because of your production footprint — venue review recommended.";} else if(devIsYes(a)&&att<=30){space="Clubroom";spaceNote="Suggested Clubroom — development-style work at this scale is a strong fit.";} else if(att<=30){space="Clubroom";spaceNote="Suggested Clubroom based on expected attendance — venue review recommended.";} else if(att<=40){space="Clubroom";spaceNote="Could suit Clubroom or Showroom at this attendance — venue review recommended.";} else{space="Showroom";spaceNote="Suggested Showroom based on expected attendance — venue review recommended.";} } const capacity=SPACE_CAPACITY[space]; if(capacity&&att>capacity)return{kind:"quote-only",model:"Capacity Exceeded — Custom Quote",space,amount:null,gross,nbo,why:`Your expected average attendance of ${att} exceeds the ${space}'s maximum capacity of ${capacity}.`,note:"Please contact us directly to discuss options, including the other space or alternative scheduling.",spaceNote}; const overRuntime=a.runtime_band==="Over 90 minutes",fixedFootprint=a.footprint==="Fixed set, storage or complex tech"; if(overRuntime||fixedFootprint){ if(a.lockout_structure==="One calendar week"){ if(a.weekly_perf_band==="More than 6 performances")return{kind:"quote-only",model:"Custom Weekly Lock-Out Quote",space,amount:null,why:"Your season includes more than 6 performances within the calendar week, which falls outside our standard Weekly Lock-Out package.",note:"Please send us your proposed schedule and we'll prepare a tailored quote.",spaceNote}; if(a.weekly_perf_band==="Not sure yet")return{kind:"quote-only",model:"Weekly Lock-Out — Venue Review Required",space,amount:null,why:"We need to confirm whether your season fits within the standard Weekly Lock-Out performance allowance.",note:"Please send us your proposed schedule and we'll help assess the best hire model.",spaceNote}; if(a.weekly_perf_band==="Up to 6 performances"){ if(space==="Clubroom"){ if(a.weekly_clubroom_access_band==="I'll need more access than this")return{kind:"quote-only",model:"Custom Weekly Lock-Out Quote",space,amount:null,why:`Your production requires more access than our standard Clubroom Weekly Lock-Out allowances (up to ${CLUBROOM_WEEKLY_BUMPIN_CAP} hours bump-in, up to ${CLUBROOM_WEEKLY_SHOWDAY_CAP} hours per show day), so this needs a custom quote.`,note:"Please send us your access requirements and we'll prepare a tailored quote.",spaceNote}; if(a.weekly_clubroom_access_band==="Not sure yet")return{kind:"quote-only",model:"Weekly Lock-Out — Venue Review Required",space,amount:null,why:"We need to confirm your bump-in and show-day access requirements before confirming whether the Clubroom Weekly Lock-Out allowances apply.",note:"Please send us your expected bump-in and show-day access needs.",spaceNote}; if(a.weekly_clubroom_access_band==="Within these allowances")return{kind:"lockout-flat",model:"Clubroom Weekly Lock-Out",space:"Clubroom",amount:CLUBROOM_WEEKLY_LOCKOUT_FLAT_RATE,weeklyRate:CLUBROOM_WEEKLY_LOCKOUT_FLAT_RATE,perfAllowance:WEEKLY_PERF_CAP,bumpinHoursAllowance:CLUBROOM_WEEKLY_BUMPIN_CAP,showdayHoursAllowance:CLUBROOM_WEEKLY_SHOWDAY_CAP,why:`Your production appears to fit within our standard Weekly Lock-Out package: one calendar week, up to 6 performances, up to ${CLUBROOM_WEEKLY_BUMPIN_CAP} hours bump-in access and up to ${CLUBROOM_WEEKLY_SHOWDAY_CAP} hours access per show day.`,note:`The package includes up to ${CLUBROOM_WEEKLY_BUMPIN_CAP} hours bump-in access (one day) and up to ${CLUBROOM_WEEKLY_SHOWDAY_CAP} hours access per show day. Extra sessions or additional loading are quoted upon enquiry. Scheduling is subject to venue approval and availability.`,spaceNote}; return{kind:"quote-only",model:"Weekly Lock-Out — Pending Details",space,amount:null,why:"We just need your bump-in and show-day access requirements to confirm eligibility.",note:"Our team will follow up to confirm.",spaceNote}; } if(a.weekly_preopening_access_band==="More than 12 hours")return{kind:"quote-only",model:"Custom Weekly Lock-Out Quote",space,amount:null,why:"Your production requires more than 12 hours of pre-opening access for bump-in, technical plotting or dress runs, which falls outside our standard Weekly Lock-Out package.",note:"Please send us your access requirements and we'll prepare a tailored quote.",spaceNote}; if(a.weekly_preopening_access_band==="Not sure yet")return{kind:"quote-only",model:"Weekly Lock-Out — Venue Review Required",space,amount:null,why:"We need to confirm your pre-opening access requirements before confirming whether the Weekly Lock-Out package applies.",note:"Please send us your expected bump-in, tech plotting and dress run needs.",spaceNote}; if(a.weekly_preopening_access_band==="Up to 12 hours"&&space==="Showroom")return{kind:"lockout-flat",model:"Showroom Weekly Lock-Out",space:"Showroom",amount:WEEKLY_LOCKOUT_FLAT_RATE,weeklyRate:WEEKLY_LOCKOUT_FLAT_RATE,perfAllowance:WEEKLY_PERF_CAP,preopeningHoursAllowance:WEEKLY_PREOPENING_HOURS_CAP,why:"Your production appears to fit within our standard Weekly Lock-Out package: one calendar week, up to 6 performances and up to 12 hours of pre-opening access.",note:"The package includes up to 12 hours total pre-opening access for bump-in, technical plotting and dress runs. Scheduling of those hours is subject to venue approval and availability.",spaceNote}; return{kind:"quote-only",model:"Weekly Lock-Out — Pending Details",space,amount:null,why:"We just need your pre-opening access requirements to confirm eligibility.",note:"Our team will follow up to confirm.",spaceNote}; } return{kind:"quote-only",model:"Weekly Lock-Out — Pending Details",space,amount:null,why:"We just need your performance schedule to confirm eligibility.",note:"Our team will follow up to confirm.",spaceNote}; } if(a.lockout_structure==="Multiple calendar weeks")return{kind:"quote-only",model:"Custom Multi-Week Lock-Out Quote",space,amount:null,why:"Your season appears to require Lock-Out access across multiple calendar weeks.",note:"Discounted arrangements may be available for suitable multi-week bookings. Final pricing depends on the number of weeks, performance schedule, access requirements, storage, technical needs and availability.",spaceNote}; if(a.lockout_structure==="Scattered dates / not within one calendar week"){ const dOffp=num(a.daily_lockout_offpeak_perfs),dPeakp=num(a.daily_lockout_peak_perfs); if(space==="Showroom")return{kind:"lockout",model:"Showroom Daily Lock-Out",space,amount:dOffp*SHOWROOM_LOCKOUT_RATE.off+dPeakp*SHOWROOM_LOCKOUT_RATE.peak,offp:dOffp,peakp:dPeakp,offRate:SHOWROOM_LOCKOUT_RATE.off,peakRate:SHOWROOM_LOCKOUT_RATE.peak,why:"Your production requires Lock-Out access but is not structured as a single calendar-week season, so this estimate is based on Daily Lock-Out rates.",note:"Final quote depends on access, footprint, technical requirements and availability.",spaceNote}; return{kind:"quote-only",model:"Clubroom Daily Lock-Out / Custom Quote",space:"Clubroom",amount:null,why:"Your production may require Lock-Out access in the Clubroom, which needs to be quoted individually.",note:"Please send us your proposed schedule and access requirements.",spaceNote}; } return{kind:"quote-only",model:"Lock-Out — Venue Review Required",space,amount:null,why:"Your production appears to require Lock-Out access, but we need to review the schedule and access pattern before recommending a model.",note:"Please send us your proposed dates, performance schedule and access requirements.",spaceNote}; } if(space==="Clubroom"){ if(CLUBROOM_TRYOUT[total]){ const pkg=CLUBROOM_TRYOUT[total],shareAmt=nbo*0.25,peakHeavy=peakp>=Math.ceil(total/2); return{kind:"package",model:pkg.model,space,amount:Math.max(pkg.base,shareAmt),base:pkg.base,shareAmt,sharePct:0.25,gross,nbo,offp,peakp,why:"A 3–4 performance Clubroom season can help you test the work, build word-of-mouth and keep upfront risk lower.",note:"Calculated as the greater of the package base or 25% of estimated Net Box Office. $300 for 3 performances / $380 for 4 performances. Final approval is subject to venue availability, production suitability and scheduling.",peakHeavyNote:peakHeavy?"Because this package includes a high proportion of Fri–Sun sessions, final approval is subject to venue review and availability.":null,spaceNote}; } if(devIsYes(a)){ const base=offp*CLUBROOM_DEV.off+peakp*CLUBROOM_DEV.peak,shareAmt=nbo*CLUBROOM_DEV.share; return{kind:"flexi",model:CLUBROOM_DEV.model,space,amount:Math.max(base,shareAmt),base,shareAmt,sharePct:CLUBROOM_DEV.share,gross,nbo,offp,peakp,offRate:CLUBROOM_DEV.off,peakRate:CLUBROOM_DEV.peak,why:"Your project reads as a development-style season, suited to our venue-approved Clubroom Development Share model.",note:unsureFootprint?'Footprint marked "not sure" — venue review recommended.':"",spaceNote}; } const tier=CLUBROOM_FLEXI[a.runtime_band]; if(tier){const base=offp*tier.off+peakp*tier.peak,shareAmt=nbo*tier.share;return{kind:"flexi",model:tier.model,space,amount:Math.max(base,shareAmt),base,shareAmt,sharePct:tier.share,gross,nbo,offp,peakp,offRate:tier.off,peakRate:tier.peak,why:`Your show runs ${a.runtime_band.toLowerCase()} and looks like a great fit for a low-footprint shared-use model in the Clubroom.`,note:unsureFootprint?'Footprint marked "not sure" — venue review recommended.':"",spaceNote};} } if(space==="Showroom"){ const tier=SHOWROOM_FLEXI[a.runtime_band]; if(tier){const base=offp*tier.off+peakp*tier.peak,shareAmt=nbo*tier.share;return{kind:"flexi",model:tier.model,space,amount:Math.max(base,shareAmt),base,shareAmt,sharePct:tier.share,gross,nbo,offp,peakp,offRate:tier.off,peakRate:tier.peak,why:`Your show runs ${a.runtime_band.toLowerCase()} and looks like a great fit for a low-footprint shared-use model in the Showroom.`,note:unsureFootprint?'Footprint marked "not sure" — venue review recommended.':"",spaceNote};} } return{kind:"quote-only",model:"Custom review required",space,amount:null,gross,nbo,why:"We need a little more detail to match you to a model.",note:"Our team will follow up directly.",spaceNote}; } function computeSingleRows(a){ const bumpinNote=a.prior_bumpin&&a.prior_bumpin!=="No"?"Prior-day bump-in is quoted separately.":""; if(a.event_type==="Filmed / commercial capture"){const spaces=a.space==="Not sure"?["Showroom","Clubroom"]:[a.space];return spaces.map(sp=>({kind:"commercial-route",model:"Commercial / Private / Content Use",space:sp,hourlyRate:sp==="Showroom"?75:50,why:"Filming or commercial capture is the primary purpose, so this routes to our Commercial Use pricing.",note:["This use type requires a custom quote. The starting rate is shown for guidance only.",bumpinNote].filter(Boolean).join(" ")}));} const spaces=a.space==="Not sure"?["Showroom","Clubroom"]:[a.space]; const bands=a.access_band==="Not sure"?["Up to 4 hrs","Up to 6 hrs","8–10 hrs"]:[a.access_band]; const rows=[]; spaces.forEach(sp=>bands.forEach(band=>{const rate=SINGLE_RATES[sp][band];let amount=null,rangeLow=null,rangeHigh=null;if(a.day_type==="Not sure"){rangeLow=rate.off;rangeHigh=rate.peak;}else amount=a.day_type==="Fri–Sun"?rate.peak:rate.off;rows.push({kind:"single",model:rate.model,space:sp,band,from:!!rate.from,amount,rangeLow,rangeHigh,why:`A one-off booking in the ${sp} for ${band.toLowerCase()} of total access.`,note:["Access includes setup, technical checks, event duration, pack-down and venue reset.",bumpinNote].filter(Boolean).join(" ")});})); return rows; } function rateForNonCommercial(space,day){if(space==="Showroom"){if(day==="Mon–Thu")return 45;if(day==="Fri")return 55;return 55*1.10;}if(day==="Sat–Sun")return 35*1.15;return 35;} function computeNonCommercialRows(a){ const hours=num(a.hours),billed=Math.max(hours,3),note=hours<3?"Minimum 3-hour booking applies — shown using 3 hours.":"Minimum 3-hour booking applies."; const spaces=a.space==="Not sure"?["Showroom","Clubroom"]:[a.space];const rows=[]; spaces.forEach(sp=>{const days=a.day_type==="Not sure"?(sp==="Showroom"?["Mon–Thu","Fri","Sat–Sun"]:["Mon–Thu","Sat–Sun"]):[a.day_type];days.forEach(day=>{const rate=rateForNonCommercial(sp,day),label=sp==="Clubroom"&&day==="Mon–Thu"?"Mon–Fri":day;rows.push({kind:"noncommercial",space:sp,dayLabel:label,rate,hours:billed,amount:rate*billed,why:`${sp} hire for ${a.use_type?a.use_type.toLowerCase():"your session"}, billed hourly.`,note});});}); return rows; } function computeCommercialRows(a){ const hours=num(a.hours),people=num(a.people_count); const supplierNote=a.external_suppliers==="Yes"?" Because you noted external suppliers/equipment, please share full technical details so we can scope your quote.":""; const baseNote="This use type requires a custom quote. The starting rate is shown for guidance only. Minimum booking applies."+supplierNote; const candidateSpaces=a.space==="Not sure"?["Showroom","Clubroom"]:[a.space]; const fittingSpaces=people>0?candidateSpaces.filter(sp=>!SPACE_CAPACITY[sp]||people<=SPACE_CAPACITY[sp]):candidateSpaces; if(fittingSpaces.length===0){const overBoth=people>SPACE_CAPACITY.Showroom;return[{kind:"quote-only",model:"Commercial Use — Capacity Review Required",space:candidateSpaces.includes("Showroom")?"Showroom":candidateSpaces[0],amount:null,why:overBoth?`Your expected crew or guest numbers (${people}) exceed the maximum capacity of both spaces. The Showroom holds up to ${SPACE_CAPACITY.Showroom} and the Clubroom holds up to ${SPACE_CAPACITY.Clubroom}.`:`Your expected crew or guest numbers (${people}) exceed the ${a.space}'s maximum capacity of ${SPACE_CAPACITY[a.space]}. The Showroom holds up to ${SPACE_CAPACITY.Showroom} — please consider enquiring about that space instead.`,note:"Please contact us directly to discuss your requirements."}];} return fittingSpaces.map(sp=>({kind:"commercial",space:sp,rate:sp==="Showroom"?75:50,hours,amount:hours>0?hours*(sp==="Showroom"?75:50):null,why:`Starting hourly rate for ${a.commercial_type?a.commercial_type.toLowerCase():"commercial use"} in the ${sp}.`,note:baseNote})); } // ---------- UI PRIMITIVES ---------- function Panel({children,style}){return
{children}
;} function GoldButton({children,onClick,disabled,icon,secondary}){ return secondary ? :; } function ProgressBar({value}){return
;} function OptionCard({label,selected,onClick}){return;} function PathwayCard({icon,title,desc,onClick}){return;} function InfoPanel({children}){return
{children}
;} function Row({label,value,highlight}){return
{label}{value}
;} function CalcBox({children}){return
{children}
;} function AccessNoteFull(){return
Access & Bump-In Note

The theatres are located on Level 1 and are accessed by stairs only, with 25 steps from street level to the venue foyer. There is no wheelchair access due to the building's age and configuration. Please take this into account when planning bump-in, equipment, props, set pieces, accessibility requirements or external suppliers.

;} function AccessNoteShort(){return
Venue Access Note

The theatres are on Level 1 and accessed by stairs only. Please let us know if your production has specific access, bump-in or equipment requirements.

;} function TextField({label,value,onChange,type="text",placeholder}){return
onChange(e.target.value)} className="w-full rounded-lg px-3 py-2 outline-none text-sm" style={{background:"rgba(5,46,56,0.4)",border:`1px solid ${COL.panelBorder}`,color:COL.cream}}/>
;} function TextArea({label,value,onChange}){return