/* ===========================================================================
ARGT Dashboards — shared lib (data + components)
Locked copy verbatim from xyzagency/argt@main:
- artifacts/argt-app/src/lib/dashboard-roles.ts
- artifacts/argt-app/src/lib/role-overview-configs.ts
- artifacts/argt-app/src/lib/ui-copy.ts
- artifacts/argt-console/src/lib/ui-copy.ts
- artifacts/argt-console/src/lib/launch/constants.ts
Do not edit strings here. To change copy, file a proposal in
docs/agents/ui-copy.proposals.md per the template.
=========================================================================== */
/* ---------------------------------------------------------------------------
ROLE IDENTITIES (from dashboard-roles.ts)
--------------------------------------------------------------------------- */
const ROLE_ACCENTS = {
amber: { hex: "#C49800", bright: "#E0B638" },
magenta: { hex: "#B5006A", bright: "#D8288C" }, // matches --pvt-gold/-bright
teal: { hex: "#007A8A", bright: "#10B5C7" },
purple: { hex: "#4C1285", bright: "#7A4FBF" },
};
const DASHBOARD_ROLES = {
customer: {
id: "customer", label: "Attendee", accent: "amber",
eyebrow: "FESTIVAL ACCESS",
title: "Your way in, and your weekend.",
intro: "Your admission ticket and wristband, plus schedule, map, VIP, group orders, and travel for ARGT 2026 at Harbour Pointe in Fort Pierce.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "tickets", label: "Admission Ticket", icon: "ticket" },
{ id: "schedule", label: "Schedule", icon: "calendar" },
{ id: "map", label: "Venue Map", icon: "map" },
{ id: "vip", label: "VIP Add-ons", icon: "crown" },
{ id: "group", label: "Group Orders", icon: "users" },
{ id: "travel", label: "Travel", icon: "plane" },
],
},
fan: {
id: "fan", label: "Fan", accent: "magenta",
eyebrow: "FOR FANS",
title: "Back the artists you want to see.",
intro: "Discover artists, cast votes, save favorites, and follow the leaderboard. $10 per vote, first one free, and 60% goes directly to artist payouts.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "discover", label: "Discover", icon: "headphones" },
{ id: "votes", label: "My Votes", icon: "heart" },
{ id: "saved", label: "Saved", icon: "star" },
{ id: "leaderboard", label: "Leaderboard", icon: "chart" },
{ id: "share", label: "Share", icon: "share" },
{ id: "checkout", label: "Buy Votes", icon: "wallet" },
{ id: "rewards", label: "Rewards", icon: "trophy" },
],
},
creator: {
id: "creator", label: "Creator", accent: "teal",
eyebrow: "FOR CREATORS",
title: "Your next stage is 10,000 ears away.",
intro: "Submit your audition, build your profile, track votes received, and follow the BKK Street Team opportunities.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "status", label: "My Application", icon: "file" },
{ id: "profile", label: "Profile", icon: "person" },
{ id: "auditions", label: "Auditions", icon: "mic" },
{ id: "performance", label: "Performance", icon: "chart" },
{ id: "share", label: "Share Studio", icon: "share" },
{ id: "shows", label: "Shows", icon: "calendar" },
{ id: "opportunities", label: "Opportunities", icon: "briefcase" },
],
},
sponsor: {
id: "sponsor", label: "Sponsor", accent: "amber",
eyebrow: "BRAND PARTNERS",
title: "Activate to 10,000 culture consumers.",
intro: "Tier status, activation planning, asset uploads, payment, hospitality, and post-event recap, all in one place.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Inquiry", icon: "file" },
{ id: "activation", label: "Activation", icon: "megaphone" },
{ id: "assets", label: "Assets", icon: "upload" },
{ id: "payment", label: "Payment", icon: "wallet" },
{ id: "deliverables", label: "Deliverables", icon: "trophy" },
{ id: "recap", label: "Recap", icon: "chart" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
vendor: {
id: "vendor", label: "Vendor", accent: "teal",
eyebrow: "VENDOR VILLAGE",
title: "Sell to a crowd that buys.",
intro: "Application, booth, compliance, payment, logistics, and Vendor Village marketing inclusion.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Application", icon: "file" },
{ id: "booth", label: "Booth", icon: "store" },
{ id: "compliance", label: "Compliance", icon: "shield" },
{ id: "payment", label: "Payment", icon: "wallet" },
{ id: "logistics", label: "Logistics", icon: "package" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
crew: {
id: "crew", label: "Crew", accent: "purple",
eyebrow: "CREW",
title: "Bring the festival to life.",
intro: "Service category, availability, assignments, credentials, portfolio, hours logged, and call sheets.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Apply", icon: "file" },
{ id: "availability", label: "Availability", icon: "calendar" },
{ id: "assignments", label: "Assignments", icon: "list" },
{ id: "credentials", label: "Credentials", icon: "id" },
{ id: "portfolio", label: "Portfolio", icon: "briefcase" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
volunteer: {
id: "volunteer", label: "Volunteer", accent: "magenta",
eyebrow: "VOLUNTEER",
title: "Show up. Make it real.",
intro: "Sign up for shifts, watch training, log hours, claim perks, and get your festival-day check-in QR.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Interest", icon: "file" },
{ id: "shifts", label: "Shifts", icon: "calendar" },
{ id: "training", label: "Training", icon: "graduate" },
{ id: "check-in", label: "Check-In", icon: "qr" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
veterans: {
id: "veterans", label: "Veterans", accent: "amber",
eyebrow: "VETERAN WELLNESS ZONE",
title: "Recognition starts here.",
intro: "Group tickets, Wellness Zone pavilion, recognition moments, and resource kits for veteran organizations partnering with ARGT.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Org Application", icon: "file" },
{ id: "group-tickets", label: "Group Tickets", icon: "ticket" },
{ id: "pavilion", label: "Pavilion", icon: "building" },
{ id: "recognition", label: "Recognition", icon: "shield" },
{ id: "resources", label: "Resources", icon: "list" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
"local-business": {
id: "local-business", label: "Local Business", accent: "teal",
eyebrow: "FORT PIERCE LOCAL",
title: "Festival wristbands. Your customers.",
intro: "Set up your wristband discount, upload your creative, generate your QR code, and watch scans and redemptions in real time during festival weekend.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Business Application", icon: "file" },
{ id: "discount", label: "Discount Setup", icon: "wallet" },
{ id: "creative", label: "Creative", icon: "image" },
{ id: "qr", label: "QR Code", icon: "qr" },
{ id: "performance", label: "Performance", icon: "chart" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
press: {
id: "press", label: "Press", accent: "purple",
eyebrow: "PRESS & MEDIA",
title: "Your credential, your assets, your access.",
intro: "Request credentials, download approved press kit assets, request interview slots, and review story angles curated by the ARGT PR team.",
nav: [
{ id: "overview", label: "Overview", icon: "home" },
{ id: "intake", label: "Credential Request", icon: "file" },
{ id: "assets", label: "Assets", icon: "image" },
{ id: "interviews", label: "Interviews", icon: "chat" },
{ id: "angles", label: "Story Angles", icon: "bulb" },
{ id: "settings", label: "Settings", icon: "gear" },
],
},
};
/* ---------------------------------------------------------------------------
ROLE OVERVIEW CONFIGS (verbatim from role-overview-configs.ts)
--------------------------------------------------------------------------- */
const ROLE_OVERVIEW_CONFIGS = {
sponsor: {
roleSlug: "sponsor", roleLabel: "Sponsor", accent: "amber",
eyebrow: "BRAND PARTNERS",
preIntakeTitle: "Activate to 10,000 culture consumers.",
preIntakeIntro: "Reach Treasure Coast culture-makers and Gen-Z fans face-to-face. Start with a 2-minute inquiry, our partnerships lead replies within 3 business days with tier options.",
reviewTitle: "Application under review.",
reviewIntro: "Our partnerships team is reviewing your inquiry. We respond within 3 business days with tier options, activation scope, and a kickoff call invitation.",
acceptedTitle: "You're an ARGT 2026 sponsor.",
acceptedIntro: "Your sponsor workspace is live. Plan your activation, upload assets, manage payment, track deliverables, and get your post-event recap, all in one place.",
journeySteps: [
{ label: "Apply", desc: "Submit the 3-section inquiry." },
{ label: "Tier locked", desc: "ARGT lead confirms tier + budget." },
{ label: "Activation live", desc: "Assets uploaded, payment cleared." },
{ label: "Recap delivered", desc: "Post-event report within 14 days." },
],
tiles: [
{ label: "Inquiry", desc: "Edit your initial application.", icon: "file" },
{ label: "Activation", desc: "Plan zone, KPIs, hospitality.", icon: "megaphone" },
{ label: "Assets", desc: "Upload logos, creative, copy.", icon: "upload" },
{ label: "Payment", desc: "Tier invoice + Stripe checkout.", icon: "wallet" },
{ label: "Deliverables", desc: "What ARGT owes you, tracked.", icon: "trophy" },
{ label: "Recap", desc: "Post-event report (Sep 30).", icon: "chart" },
],
extraCards: [
{ eyebrow: "HOSPITALITY", title: "VIP allocation", body: "Your tier includes a number of VIP passes — confirmed when ARGT locks your activation scope. Track allocations + plus-ones here." },
{ eyebrow: "CO-MARKETING", title: "Materials inbox", body: "Assets ARGT prepares for sponsor distribution land here: social posts, email blurbs, partner co-branded creative." },
],
ctaPre: "Start inquiry",
ctaReview: "View status",
ctaAccepted: "Open activation",
},
vendor: {
roleSlug: "vendor", roleLabel: "Vendor", accent: "teal",
eyebrow: "VENDOR VILLAGE",
preIntakeTitle: "Sell to a crowd that buys.",
preIntakeIntro: "10,000 attendees. Three days. Real spending power. Apply for a Vendor Village booth, our vendor team reviews weekly and you'll hear back within 7 days.",
reviewTitle: "Your booth application is in review.",
reviewIntro: "Our vendor team reviews applications weekly. You'll hear back within 7 days with booth availability matched to your category preference.",
acceptedTitle: "You're confirmed at the Vendor Village.",
acceptedIntro: "Your booth workspace is live. Confirm your booth details, upload compliance docs, pay your booth fee, and lock in your day-of logistics.",
journeySteps: [
{ label: "Apply", desc: "Tell us about your brand + category." },
{ label: "Approved", desc: "Vendor team confirms your booth." },
{ label: "Compliance done", desc: "Docs + payment cleared." },
{ label: "Vendor weekend", desc: "Sell, network, return next year." },
],
tiles: [
{ label: "Application", desc: "Edit your vendor application.", icon: "file" },
{ label: "Booth", desc: "Location, size, power, water.", icon: "store" },
{ label: "Compliance", desc: "Insurance, permits, food handler.", icon: "shield" },
{ label: "Payment", desc: "Booth fee via Stripe.", icon: "wallet" },
{ label: "Logistics", desc: "Load-in, setup, breakdown.", icon: "package" },
],
ctaPre: "Apply for a booth",
ctaReview: "View status",
ctaAccepted: "Confirm booth details",
},
crew: {
roleSlug: "crew", roleLabel: "Crew", accent: "purple",
eyebrow: "CREW",
preIntakeTitle: "Bring the festival to life.",
preIntakeIntro: "Professional production, lighting, sound, hospitality, security. Tell us your specialty, our production lead matches you to upcoming festival roles within 2 weeks.",
reviewTitle: "Your crew application is in review.",
reviewIntro: "Our production lead is reviewing your skills and availability. We match crew to festival roles as the schedule firms up, usually within 2 weeks.",
acceptedTitle: "Welcome to the ARGT crew roster.",
acceptedIntro: "Your crew workspace is live. Mark your festival-day availability, accept assignments, upload credentials, and keep your portfolio current.",
journeySteps: [
{ label: "Apply", desc: "Service category, portfolio, rates." },
{ label: "On the roster", desc: "Production lead confirms fit." },
{ label: "Assignment", desc: "Specific shifts offered + accepted." },
{ label: "Show weekend", desc: "Call sheets, credentials, on-site." },
],
tiles: [
{ label: "Apply", desc: "Edit your crew application.", icon: "briefcase" },
{ label: "Availability", desc: "Mark your festival days.", icon: "calendar" },
{ label: "Assignments", desc: "Job offers from production.", icon: "list" },
{ label: "Credentials", desc: "Licenses + certifications.", icon: "id" },
{ label: "Portfolio", desc: "Your public reel + bio.", icon: "image" },
],
ctaPre: "Submit application",
ctaReview: "View status",
ctaAccepted: "Mark availability",
},
volunteer: {
roleSlug: "volunteer", roleLabel: "Volunteer", accent: "magenta",
eyebrow: "VOLUNTEER",
preIntakeTitle: "Show up. Make it real.",
preIntakeIntro: "Volunteers run the energy of ARGT. Help with check-in, hospitality, stage transitions, sustainability, and trade 2 shifts for a free festival weekend pass.",
reviewTitle: "We're confirming your volunteer interest.",
reviewIntro: "Once we confirm your interest form, shift sign-ups unlock in your dashboard. Usually takes a few days.",
acceptedTitle: "Welcome to the ARGT volunteer team.",
acceptedIntro: "Your volunteer workspace is live. Sign up for shifts, complete training, and grab your day-of check-in QR. 2 shifts = free festival pass.",
journeySteps: [
{ label: "Interest", desc: "T-shirt size, dietary, availability." },
{ label: "Confirmed", desc: "Welcome email + shift sign-up unlocked." },
{ label: "Trained", desc: "4 short videos, ~30 min total." },
{ label: "Check in", desc: "QR scanned at the volunteer tent." },
],
tiles: [
{ label: "Interest", desc: "Edit your volunteer profile.", icon: "heart" },
{ label: "Shifts", desc: "Sign up for festival shifts.", icon: "calendar" },
{ label: "Training", desc: "4 required modules.", icon: "graduate" },
{ label: "Check-In", desc: "Your day-of festival QR.", icon: "qr" },
],
ctaPre: "Submit interest",
ctaReview: "View status",
ctaAccepted: "Sign up for shifts",
},
veterans: {
roleSlug: "veterans", roleLabel: "Veterans", accent: "amber",
eyebrow: "VETERAN WELLNESS ZONE",
preIntakeTitle: "Recognition starts here.",
preIntakeIntro: "Veteran organizations partner with ARGT for the Wellness Zone pavilion, group ticket allocations, and on-stage recognition. Submit your 501(c)(3), verified in 5 business days.",
reviewTitle: "We're verifying your organization.",
reviewIntro: "We're verifying your 501(c)(3) status and mission alignment, usually 5 business days. Once verified, pavilion + group ticket tools unlock.",
acceptedTitle: "Verified, welcome to the Veteran Wellness Zone.",
acceptedIntro: "Your Veterans workspace is live. Allocate group tickets to members, set your pavilion preferences, schedule recognition moments, and grab resource kits.",
journeySteps: [
{ label: "Apply", desc: "Submit your 501(c)(3) details." },
{ label: "Verified", desc: "Org confirmed; tools unlock." },
{ label: "Pavilion locked", desc: "Table, hospitality, recognition." },
{ label: "Festival weekend", desc: "On-site recognition moments." },
],
tiles: [
{ label: "Org Application", desc: "Edit your org details.", icon: "file" },
{ label: "Group Tickets", desc: "Allocate to members.", icon: "users" },
{ label: "Pavilion", desc: "Table, hospitality, signage.", icon: "building" },
{ label: "Recognition", desc: "On-stage moments.", icon: "trophy" },
{ label: "Resources", desc: "Downloadable kits.", icon: "list" },
],
ctaPre: "Submit org application",
ctaReview: "View status",
ctaAccepted: "Allocate tickets",
},
"local-business": {
roleSlug: "local-business", roleLabel: "Local Business", accent: "teal",
eyebrow: "FORT PIERCE LOCAL",
preIntakeTitle: "Festival wristbands. Your customers.",
preIntakeIntro: "Set up a wristband discount and ARGT attendees scan your QR, redeem your offer, and you get a wave of new customers during the busiest weekend of the year.",
reviewTitle: "We're verifying your business.",
reviewIntro: "We're confirming your Fort Pierce / Treasure Coast business, usually 3 business days. Once verified, discount setup + QR generation unlock.",
acceptedTitle: "Verified, your storefront is connected.",
acceptedIntro: "Your Local Business workspace is live. Set your wristband discount, upload your creative, generate your QR code, and watch live scans during festival weekend.",
journeySteps: [
{ label: "Apply", desc: "Submit business details + address." },
{ label: "Verified", desc: "Fort Pierce / Treasure Coast confirmed." },
{ label: "QR live", desc: "Discount set, creative uploaded." },
{ label: "Festival weekend", desc: "Live scans + redemptions." },
],
tiles: [
{ label: "Business Application", desc: "Edit your business profile.", icon: "store" },
{ label: "Discount Setup", desc: "% off, dates, terms.", icon: "wallet" },
{ label: "Creative", desc: "Logo, hero image, copy.", icon: "image" },
{ label: "QR Code", desc: "Your festival scan code.", icon: "qr" },
{ label: "Performance", desc: "Live scans + redemptions.", icon: "chart" },
],
ctaPre: "Submit application",
ctaReview: "View status",
ctaAccepted: "Set up discount",
},
press: {
roleSlug: "press", roleLabel: "Press", accent: "purple",
eyebrow: "PRESS & MEDIA",
preIntakeTitle: "Your credential, your assets, your access.",
preIntakeIntro: "Photographers, videographers, writers, podcasters, request an ARGT 2026 credential. Approved press unlocks asset downloads, story angles, and interview slot requests.",
reviewTitle: "Your credential request is under review.",
reviewIntro: "Our PR team reviews coverage history to confirm fit. Expect a response within 5 business days. Approved credentials unlock the full asset library + interviews.",
acceptedTitle: "Credential approved.",
acceptedIntro: "Your Press workspace is live. Download the press kit, request interview slots, browse pitch-ready story angles, and manage your outlet info.",
journeySteps: [
{ label: "Apply", desc: "Outlet, role, past coverage URL." },
{ label: "Approved", desc: "PR team confirms credential type." },
{ label: "Equipped", desc: "Press kit + story angles downloaded." },
{ label: "Festival weekend", desc: "On-site Press Lounge access." },
],
tiles: [
{ label: "Credential Request", desc: "Edit your press info.", icon: "file" },
{ label: "Assets", desc: "Hi-res photos, EPK, boilerplate.", icon: "image" },
{ label: "Interviews", desc: "Request slots with founders + artists.", icon: "chat" },
{ label: "Story Angles", desc: "Curated pitch-ready angles.", icon: "bulb" },
],
ctaPre: "Request credential",
ctaReview: "View status",
ctaAccepted: "Open press kit",
},
};
/* ---------------------------------------------------------------------------
SHELL COPY (from argt-app ui-copy.ts)
--------------------------------------------------------------------------- */
const SHELL_COPY = {
brandLabel: "ARGT",
brandSublabelTemplate: "{{roleLabel}} dashboard",
topbar: {
notificationsLabel: "Notifications",
notificationsEmpty: "You're all caught up.",
accountMenu: {
profile: "Profile", settings: "Settings",
switchRole: "Switch role", addAnotherRole: "Add another role",
logout: "Sign out",
},
},
};
/* ---------------------------------------------------------------------------
CONTEXTUAL TOP-BAR DATA — per-role notifications + account-menu quick links.
`nav` values must match a nav id in DASHBOARD_ROLES[role].nav so the bell /
account menu can deep-link straight to the relevant sub-page.
--------------------------------------------------------------------------- */
const ROLE_NOTIFICATIONS = {
customer: [
{ icon: "ticket", title: "Your GA wristbands are ready", body: "2 wristbands confirmed for ARGT 2026. Tap to view and add to wallet.", time: "2h", unread: true, nav: "tickets" },
{ icon: "calendar", title: "Set times just dropped", body: "The full weekend schedule is live. Build your lineup now.", time: "1d", unread: true, nav: "schedule" },
{ icon: "plane", title: "Travel partner rates end soon", body: "Discounted Fort Pierce hotel block closes June 1.", time: "3d", unread: false, nav: "travel" },
],
fan: [
{ icon: "heart", title: "Maya Cole moved up to #2", body: "An artist you backed is climbing the leaderboard. +128 votes today.", time: "30m", unread: true, nav: "votes" },
{ icon: "trophy", title: "You unlocked a $15 ticket credit", body: "3 Backer Votes cast. Your reward is waiting in Rewards.", time: "5h", unread: true, nav: "rewards" },
{ icon: "headphones", title: "12 new auditions to discover", body: "Fresh submissions in genres you follow just went live.", time: "1d", unread: false, nav: "discover" },
],
creator: [
{ icon: "chart", title: "You crossed 1,000 votes", body: "1,284 votes received and rising. See your 30-day performance.", time: "1h", unread: true, nav: "performance" },
{ icon: "file", title: "Round 1 decision window opens", body: "Judges review May 28 to Jun 4. Make sure your application is final.", time: "6h", unread: true, nav: "status" },
{ icon: "briefcase", title: "New BKK Street Team opportunity", body: "A paid showcase slot matches your profile. Review and apply.", time: "2d", unread: false, nav: "opportunities" },
],
sponsor: [
{ icon: "upload", title: "Asset deadline in 5 days", body: "Upload your final logo pack and booth render by June 2.", time: "3h", unread: true, nav: "assets" },
{ icon: "wallet", title: "Invoice ready for activation", body: "Your Gold tier activation invoice is available to review.", time: "1d", unread: true, nav: "payment" },
{ icon: "megaphone", title: "Activation plan approved", body: "The ARGT team signed off on your sampling activation.", time: "2d", unread: false, nav: "activation" },
],
vendor: [
{ icon: "shield", title: "Permit needs one more doc", body: "Upload your COI to finish compliance before move-in.", time: "4h", unread: true, nav: "compliance" },
{ icon: "store", title: "Booth assignment confirmed", body: "You're in the Vendor Village main row, space V-14.", time: "1d", unread: true, nav: "booth" },
{ icon: "package", title: "Load-in window scheduled", body: "Your move-in slot is Friday 7:00 to 9:00 AM.", time: "3d", unread: false, nav: "logistics" },
],
crew: [
{ icon: "list", title: "New assignment: Main Stage", body: "You're slotted for Saturday stage changeover. Review the call sheet.", time: "2h", unread: true, nav: "assignments" },
{ icon: "id", title: "Your credential is ready", body: "All-access crew pass approved. Pick up at the production office.", time: "1d", unread: true, nav: "credentials" },
{ icon: "calendar", title: "Confirm your availability", body: "Add your blackout dates so we can finalize shifts.", time: "2d", unread: false, nav: "availability" },
],
volunteer: [
{ icon: "calendar", title: "2 shifts still open near you", body: "Gate greeter and info booth shifts match your interests.", time: "1h", unread: true, nav: "shifts" },
{ icon: "graduate", title: "1 training module left", body: "Finish Safety Basics to unlock festival-day check-in.", time: "1d", unread: true, nav: "training" },
{ icon: "qr", title: "Your check-in QR is live", body: "Show this at the volunteer tent on festival day.", time: "3d", unread: false, nav: "check-in" },
],
veterans: [
{ icon: "ticket", title: "Group ticket block confirmed", body: "Your reserved block of 40 is held. Assign names anytime.", time: "5h", unread: true, nav: "group-tickets" },
{ icon: "building", title: "Pavilion layout shared", body: "Review your Wellness Zone footprint and load-in plan.", time: "1d", unread: true, nav: "pavilion" },
{ icon: "shield", title: "Recognition moment scheduled", body: "Your org will be recognized Saturday at 6:00 PM, Main Stage.", time: "4d", unread: false, nav: "recognition" },
],
"local-business": [
{ icon: "qr", title: "Your discount QR is live", body: "Print it or add to your storefront. Scans start counting at launch.", time: "2h", unread: true, nav: "qr" },
{ icon: "image", title: "Creative approved", body: "Your storefront tile is approved and live in the wristband guide.", time: "1d", unread: true, nav: "creative" },
{ icon: "chart", title: "First scans are in", body: "12 wristband scans so far this weekend. See live performance.", time: "3d", unread: false, nav: "performance" },
],
press: [
{ icon: "id", title: "Credential approved", body: "Your press pass is confirmed. Pickup details inside.", time: "3h", unread: true, nav: "intake" },
{ icon: "chat", title: "Interview slot offered", body: "A 15-minute artist interview is available Saturday afternoon.", time: "1d", unread: true, nav: "interviews" },
{ icon: "bulb", title: "New story angle curated", body: "The PR team added an angle on the Clean Earth Initiative.", time: "2d", unread: false, nav: "angles" },
],
};
/* Per-role contextual quick links shown in the account menu, above the
universal Switch role / Exit / Sign out actions. */
const ROLE_ACCOUNT_LINKS = {
customer: [{ label: "My tickets", nav: "tickets", icon: "ticket" }, { label: "Travel", nav: "travel", icon: "plane" }],
fan: [{ label: "My votes", nav: "votes", icon: "heart" }, { label: "Rewards", nav: "rewards", icon: "trophy" }, { label: "Vote credits", nav: "checkout", icon: "wallet" }, { label: "Notifications", nav: "notifications", icon: "bell" }, { label: "My submissions", nav: "my-submissions", icon: "file" }, { label: "Setup checklist", nav: "onboarding", icon: "star" }],
creator: [{ label: "Edit profile", nav: "profile", icon: "person" }, { label: "My application", nav: "status", icon: "file" }, { label: "Notifications", nav: "notifications", icon: "bell" }, { label: "My submissions", nav: "my-submissions", icon: "file" }, { label: "Setup checklist", nav: "onboarding", icon: "star" }],
sponsor: [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Payment", nav: "payment", icon: "wallet" }],
vendor: [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Payment", nav: "payment", icon: "wallet" }],
crew: [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Credentials", nav: "credentials", icon: "id" }],
volunteer: [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Check-in QR", nav: "check-in", icon: "qr" }],
veterans: [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Resources", nav: "resources", icon: "list" }],
"local-business": [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Your QR code", nav: "qr", icon: "qr" }],
press: [{ label: "Account settings", nav: "settings", icon: "gear" }, { label: "Credential", nav: "intake", icon: "file" }],
};
/* ---------------------------------------------------------------------------
PERSONAL-ACCESS MODEL — the "you" layer that every account carries on top of
any business role. Two personal contexts:
• Fan — voting / rewards (auto-granted to every account)
• Attendee — the real admission ticket + wristband you scan to get in
The Attendee context becomes active the moment a ticket is HELD on the
account, by any route (bought, group-assigned, gifted, comp). In production
this reads entitlements; here it's a mock with a demo control.
--------------------------------------------------------------------------- */
const PERSONAL_ROLE_IDS = ["fan", "customer"]; // customer == Attendee
const BUSINESS_ROLE_IDS = ["creator", "sponsor", "vendor", "crew", "volunteer", "veterans", "local-business", "press"];
const TICKET_SOURCE_COPY = {
bought: { tag: "Weekend pass", line: "You bought a weekend pass." },
group: { tag: "Group assignment", line: "Assigned to you from a group order." },
gift: { tag: "Gifted pass", line: "A friend sent you a pass." },
comp: { tag: "Complimentary", line: "Complimentary pass on your account." },
};
window.PERSONAL_ROLE_IDS = PERSONAL_ROLE_IDS;
window.BUSINESS_ROLE_IDS = BUSINESS_ROLE_IDS;
window.TICKET_SOURCE_COPY = TICKET_SOURCE_COPY;
window.isBusinessRole = (roleId) => BUSINESS_ROLE_IDS.includes(roleId);
/* ---------------------------------------------------------------------------
CONTEXTUAL SUPPORT — drives the left-rail Support drawer. Each role gets its
own AI greeting, suggested questions, FAQ set, and request categories so help
is about THAT workspace. A general set is the fallback.
--------------------------------------------------------------------------- */
const SUPPORT_CONTEXT = {
customer: {
greeting: "Hi! I'm the ARGT helper. Ask me about your tickets, wristband, schedule, parking, VIP, or group orders.",
chips: ["Where is my wristband?", "Transfer a ticket", "Parking and directions", "Refund policy"],
faqs: [
{ q: "When does my wristband arrive?", a: "Wristbands ship to your address about a week before the festival, around Sep 11. Track yours under Admission Ticket. If it hasn't arrived by Sep 14, open a request and we'll overnight a replacement." },
{ q: "How do I transfer or gift a ticket?", a: "Go to Admission Ticket, then Manage, then Transfer. Enter the recipient's email and they get their own QR. Transfers are free up to 24 hours before doors." },
{ q: "What is the refund policy?", a: "Tickets are refundable up to 30 days before the festival, minus the processing fee. After that they're transferable but not refundable." },
{ q: "Where do I park and how do I get in?", a: "Harbour Pointe is in Fort Pierce. Pre-buy parking under Travel for the closest lots, rideshare drop-off is at Gate B, and doors open at 1 PM." },
{ q: "How do I add VIP?", a: "Add VIP under VIP Add-ons. It includes the elevated viewing deck, premium restrooms, and a dedicated bar, available until it sells out." },
],
categories: ["Tickets and wristband", "Schedule", "VIP and upgrades", "Group orders", "Travel and parking", "Something else"],
},
fan: {
greeting: "Hey! I can help with voting, vote credits, rewards, and the leaderboard.",
chips: ["How do votes work?", "Where are my credits?", "How do I earn rewards?", "What is Clean Earth?"],
faqs: [
{ q: "How does voting work?", a: "Each Backer Vote is $10 and supports an artist's run at ARGT. Cast votes from Discover or any artist page. Your first vote is free." },
{ q: "Where are my vote credits?", a: "Your credit balance is on the Overview and in Buy Votes. Credits never expire during the active phase." },
{ q: "How do I earn ticket rewards?", a: "Every vote after your free one earns $5 off your festival ticket, up to $50. Track it under Rewards." },
{ q: "What is the Clean Earth Initiative?", a: "10% of every vote goes to the Clean Earth Initiative. Your personal share is shown on your Overview." },
],
categories: ["Voting and credits", "Rewards", "Payments", "Account", "Something else"],
},
creator: {
greeting: "Hi! I can help with your application, profile, performance, and BKK Street Team opportunities.",
chips: ["When is my decision?", "Edit my profile", "How are votes counted?", "Apply to an opportunity"],
faqs: [
{ q: "When will I hear back on my application?", a: "Round 1 decisions land between May 28 and Jun 4. You'll get a notification and your My Application status will update automatically." },
{ q: "How do I update my profile?", a: "Open Profile to edit your bio, photos, reel, and links. It goes live the moment you're accepted." },
{ q: "How are votes counted?", a: "Fan votes accrue on your public profile and feed the leaderboard. See the breakdown under Performance." },
{ q: "How do I apply to an opportunity?", a: "Open Opportunities and tap Apply on any matching slot. The ARGT team reviews and responds in your notifications." },
],
categories: ["Application", "Profile", "Performance", "Opportunities", "Payments", "Something else"],
},
sponsor: {
greeting: "Hi! I can help with your activation, asset specs, invoicing, hospitality passes, and recap.",
chips: ["Asset deadlines and specs", "When is my invoice due?", "Hospitality passes", "Edit my activation"],
faqs: [
{ q: "What are the asset deadlines and specs?", a: "Final logos and booth renders are due Jun 2. Specs and templates are under Assets. We'll flag anything that needs a higher-res version." },
{ q: "When is my invoice due and how do I pay?", a: "Your activation invoice is under Payment with terms. Pay by card or ACH, due net 30 from issue." },
{ q: "How do my hospitality passes work?", a: "Hospitality passes are part of your tier and are separate from a personal admission ticket. Assign them under Deliverables. To attend yourself, grab your own ticket in the Attendee dashboard." },
{ q: "Can I still change my activation plan?", a: "Yes, edit your plan under Activation until it's locked by the ARGT team. Big changes may affect your footprint." },
],
categories: ["Activation", "Assets", "Payment and invoicing", "Hospitality", "Recap", "Something else"],
},
vendor: {
greeting: "Hi! I can help with your booth, permits and compliance, load-in, and payment.",
chips: ["My booth assignment", "What permits do I need?", "Load-in window", "Payment status"],
faqs: [
{ q: "Where is my booth and when do I find out?", a: "Your space is confirmed under Booth once assignments lock. You'll get a notification with your row and number." },
{ q: "What compliance documents do I need?", a: "Upload your COI and any required permits under Compliance. Food vendors also need a health permit on file before move-in." },
{ q: "What is my load-in window?", a: "Move-in slots are scheduled under Logistics. Arrive within your window so we can stage the village smoothly." },
{ q: "How do I pay my vendor fee?", a: "Your fee and balance are under Payment. Pay by card or ACH to confirm your space." },
],
categories: ["Booth", "Compliance and permits", "Logistics", "Payment", "Something else"],
},
crew: {
greeting: "Hi! I can help with your assignments, credentials, call sheets, and hours.",
chips: ["My next assignment", "Where is my credential?", "Update availability", "Log my hours"],
faqs: [
{ q: "Where do I see my assignments?", a: "Your shifts and call sheets are under Assignments. Each one lists the stage, time, and lead." },
{ q: "How do I get my credential?", a: "Once approved, your crew pass is under Credentials. Pick it up at the production office on arrival." },
{ q: "How do I set my availability?", a: "Add your available dates and any blackouts under Availability so we can finalize your shifts." },
{ q: "How are my hours tracked and paid?", a: "Logged hours appear under your profile and feed payroll. Flag any discrepancy with a request." },
],
categories: ["Assignments", "Credentials", "Availability", "Hours and pay", "Something else"],
},
volunteer: {
greeting: "Hi! I can help with shifts, training, festival-day check-in, and perks.",
chips: ["Open shifts near me", "Finish my training", "Where is my check-in QR?", "What perks do I get?"],
faqs: [
{ q: "How do I sign up for shifts?", a: "Browse and claim shifts under Shifts. You can swap or drop up to 48 hours before with no penalty." },
{ q: "What training do I need?", a: "Required modules are under Training. Finish them to unlock festival-day check-in." },
{ q: "Where is my check-in QR?", a: "Your check-in QR is under Check-In. Show it at the volunteer tent on festival day." },
{ q: "What do volunteers get?", a: "Work the required shifts and you earn festival entry plus volunteer perks. Details are on your Overview." },
],
categories: ["Shifts", "Training", "Check-in", "Perks", "Something else"],
},
veterans: {
greeting: "Hi! I can help with your group tickets, the Wellness Zone pavilion, recognition, and resources.",
chips: ["Manage group tickets", "Pavilion setup", "Recognition moment", "Resource kits"],
faqs: [
{ q: "How do I assign my group tickets?", a: "Your reserved block is under Group Tickets. Assign names by email and each recipient gets a personal QR." },
{ q: "What is the pavilion setup?", a: "Your Wellness Zone footprint and load-in plan are under Pavilion. Reach out for layout changes." },
{ q: "When is our recognition moment?", a: "Recognition moments are scheduled under Recognition, typically on the Main Stage Saturday evening." },
{ q: "Where are the resource kits?", a: "Downloadable resource kits and signage are under Resources." },
],
categories: ["Group tickets", "Pavilion", "Recognition", "Resources", "Something else"],
},
"local-business": {
greeting: "Hi! I can help with your wristband discount, QR code, creative, and scan performance.",
chips: ["Set up my discount", "Where is my QR code?", "Upload creative", "How do scans work?"],
faqs: [
{ q: "How do I set up my discount?", a: "Define your offer, dates, and terms under Discount Setup. It goes live in the wristband guide once approved." },
{ q: "Where is my QR code?", a: "Your discount QR is under QR Code. Print it or display it at your storefront. Scans start counting at launch." },
{ q: "How do I upload my creative?", a: "Add your logo, hero image, and copy under Creative. We'll review and place it in the wristband guide." },
{ q: "How do I track redemptions?", a: "Live scans and redemptions show under Performance during festival weekend." },
],
categories: ["Discount setup", "QR code", "Creative", "Performance", "Something else"],
},
press: {
greeting: "Hi! I can help with your credential, press assets, interview slots, and story angles.",
chips: ["Credential status", "Download press assets", "Request an interview", "Embargo and usage"],
faqs: [
{ q: "What is my credential status?", a: "Your credential request and approval are under Credential Request. Pickup details arrive by notification once approved." },
{ q: "Where are the press assets?", a: "Approved logos, photos, and the press kit are under Assets, cleared for editorial use." },
{ q: "How do I request an interview?", a: "Open Interviews to see available slots and request one. The PR team confirms in your notifications." },
{ q: "What are the embargo and usage rules?", a: "Usage terms are noted on each asset. Embargoed materials are labeled with their lift date." },
],
categories: ["Credential", "Assets", "Interviews", "Story angles", "Something else"],
},
};
const SUPPORT_GENERAL = {
greeting: "Hi! I'm the ARGT helper. Ask me anything about your account, and I can open a request to a human if you need one.",
chips: ["Festival dates and venue", "Update my account", "Contact a human"],
faqs: [
{ q: "When and where is ARGT 2026?", a: "ARGT 2026 is Sep 18 to 20 at Harbour Pointe in Fort Pierce." },
{ q: "How do I update my account?", a: "Open the account menu in the top right to manage your profile, personal access, and settings." },
],
categories: ["Account", "Billing", "Technical", "Something else"],
};
window.argtSupportContext = (roleId) => SUPPORT_CONTEXT[roleId] || SUPPORT_GENERAL;
/* Demo support requests shown in the Requests tab. */
window.SUPPORT_REQUESTS_SEED = [
{ id: "REQ-4821", subject: "Question about my account", status: "Resolved", when: "Apr 22", last: "Thanks, that's all sorted." },
];
const ROLE_SEARCH_PLACEHOLDERS = {
customer: "Search tickets, schedule, travel…",
fan: "Search artists, shows, votes…",
creator: "Search performances, applications, shows…",
sponsor: "Search activations, deliverables, recap…",
vendor: "Search booth setup, compliance, payment…",
crew: "Search assignments, shifts, credentials…",
volunteer: "Search shifts, training, check-in…",
veterans: "Search group tickets, pavilion, resources…",
"local-business": "Search discount, creative, performance…",
press: "Search assets, interviews, angles…",
};
const FAN_TOPBAR_COPY = {
searchPlaceholder: "Search artists, shows, votes…",
voteCreditsLabel: "Vote credits",
voteCreditsBuyMore: "Buy more",
voteCreditsEmpty: "Get your first credits to vote.",
};
const COMMON_EMPTY_STATES = {
noVotes: { title: "No votes yet", body: "Start voting on auditions to support the artists you want at ARGT 2026.", cta: { label: "Discover auditions" } },
noSaved: { title: "Nothing saved yet", body: "Save artists, shows, and moments to come back to them.", cta: { label: "Browse artists" } },
noTickets: { title: "No tickets yet", body: "When tickets go on sale, your purchases will show up here.", cta: { label: "Get ticket updates" } },
noApplications: { title: "No applications submitted", body: "Apply to perform at ARGT 2026. Submissions stay editable until you submit.", cta: { label: "Start an application" } },
noShows: { title: "No shows scheduled", body: "Once your festival application is approved and slotted, your set details show up here." },
noNotifications:{ title: "You're all caught up", body: "New activity on your account will appear here." },
};
/* ---------------------------------------------------------------------------
ADMIN CONSOLE COPY (argt-console ui-copy.ts)
--------------------------------------------------------------------------- */
const ADMIN_SIDEBAR = [
{ items: [{ id: "home", label: "Home", href: "/home" }] },
{ label: "Festival", items: [
{ id: "festival", label: "Festival settings", href: "/festival" },
{ id: "events", label: "Events", href: "/events" },
{ id: "venues", label: "Venues", href: "/venues" },
{ id: "auditions", label: "Auditions", href: "/auditions" },
{ id: "opportunities", label: "Opportunities", href: "/opportunities" },
{ id: "opportunity-applications", label: "Opportunity applications", href: "/opportunity-applications" },
{ id: "role-intakes", label: "Role intakes", href: "/role-intakes" },
{ id: "sponsors", label: "Sponsors", href: "/sponsors" },
{ id: "products", label: "Products", href: "/products" },
]},
{ label: "Launch", items: [
{ id: "launch-engines", label: "Launch engines", href: "/launch/engines" },
{ id: "launch-tasks", label: "Tasks", href: "/launch/tasks" },
{ id: "launch-checklists", label: "Checklists", href: "/launch/checklists" },
{ id: "launch-comms", label: "Comms calendar", href: "/launch/comms-calendar" },
{ id: "launch-files", label: "Files", href: "/launch/files" },
{ id: "launch-incidents", label: "Incidents", href: "/launch/incidents" },
{ id: "launch-budget", label: "Budget", href: "/launch/budget" },
{ id: "launch-team", label: "Team", href: "/launch/team" },
]},
{ label: "Users + community", items: [
{ id: "users", label: "Users", href: "/users" },
{ id: "members", label: "Members", href: "/members" },
{ id: "creators", label: "Creators", href: "/creators" },
{ id: "creator-types", label: "Creator types", href: "/creator-types" },
{ id: "genres", label: "Genres", href: "/genres" },
{ id: "fraud", label: "Fraud review", href: "/fraud" },
{ id: "account-deletions", label: "Account deletions", href: "/account-deletions" },
]},
{ label: "Voting + gamification", items: [
{ id: "votes", label: "Votes", href: "/votes" },
{ id: "voting-phases", label: "Voting phases", href: "/voting-phases" },
{ id: "vote-credits-admin", label: "Vote credits", href: "/vote-credits-admin" },
{ id: "vote-credit-purchases", label: "Vote credit purchases", href: "/vote-credit-purchases" },
{ id: "bulk-grant-credits", label: "Bulk grant credits", href: "/bulk-grant-credits" },
{ id: "gamification-badges", label: "Badges", href: "/gamification-badges" },
{ id: "gamification-events", label: "Gamification events", href: "/gamification-events" },
]},
{ label: "Campaigns + referrals", items: [
{ id: "campaigns", label: "Campaigns", href: "/campaigns" },
{ id: "announcements", label: "Announcements", href: "/announcements" },
{ id: "promo-codes", label: "Promo codes", href: "/promo-codes" },
{ id: "referrals", label: "Referrals", href: "/referrals" },
{ id: "referral-codes", label: "Referral codes", href: "/referral-codes" },
]},
{ label: "Operations", items: [
{ id: "analytics", label: "Analytics", href: "/analytics" },
{ id: "dashboard-user-data", label: "Dashboard user data", href: "/dashboard-user-data" },
{ id: "stripe-charges", label: "Stripe charges", href: "/stripe-charges" },
{ id: "email-log", label: "Email log", href: "/email-log" },
{ id: "email-preview", label: "Email templates", href: "/email-preview" },
{ id: "alert-outbox", label: "Alert outbox", href: "/alert-outbox" },
{ id: "ai-logs", label: "AI logs", href: "/ai-logs" },
{ id: "media", label: "Media library", href: "/media" },
]},
{ label: "Settings", items: [
{ id: "settings", label: "Settings", href: "/settings" },
]},
];
const ADMIN_TOPBAR = {
searchPlaceholder: "Search users, artists, applications, tasks…",
notificationsLabel: "Notifications",
notificationsEmpty: "Nothing to review.",
messagesLabel: "Messages",
messagesEmpty: "Your inbox is clear.",
accountMenu: { profile: "Profile", settings: "Settings", impersonate: "End impersonation", logout: "Sign out" },
};
const STATUS_BADGES = {
pending: { label: "Pending", tone: "warning" },
underReview: { label: "Under review", tone: "info" },
approved: { label: "Approved", tone: "success" },
rejected: { label: "Rejected", tone: "destructive" },
withdrawn: { label: "Withdrawn", tone: "neutral" },
paid: { label: "Paid", tone: "success" },
refunded: { label: "Refunded", tone: "neutral" },
disputed: { label: "Disputed", tone: "warning" },
failed: { label: "Failed", tone: "destructive" },
draft: { label: "Draft", tone: "neutral" },
published: { label: "Published", tone: "success" },
archived: { label: "Archived", tone: "neutral" },
};
/* ---------------------------------------------------------------------------
LAUNCH CC CONSTANTS (from artifacts/argt-console/src/lib/launch/constants.ts)
--------------------------------------------------------------------------- */
const HARDCODED_TEAM = [
{ id: 1, name: "Kam", role: "Festival Director", color: "#C49800" },
{ id: 2, name: "Jordan", role: "Marketing Lead", color: "#B5006A" },
{ id: 3, name: "Taylor", role: "Sponsor Coordinator", color: "#007A8A" },
{ id: 4, name: "Morgan", role: "Production Manager", color: "#4C1285" },
{ id: 5, name: "Casey", role: "Artist Relations", color: "#00D9B8" },
];
const FESTIVAL_DATE = new Date("2026-09-18T18:00:00-04:00");
const VENUE_NAME = "Harbour Pointe";
const VENUE_CITY = "Fort Pierce";
function computeCurrentWeek() {
const msLeft = FESTIVAL_DATE.getTime() - Date.now();
return Math.max(0, Math.ceil(msLeft / (86_400_000 * 7)));
}
/* ===========================================================================
COMPONENTS
=========================================================================== */
/* Inline SVG icon set — small, no dependency on Phosphor */
const ICON_PATHS = {
home:
{n.body}
{n.cross && {n.roleLabel} ↗}{intro}
{cta && } {statCells &&