@getmicdrop/venue-calendar 4.0.62 → 4.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/{CarouselView.legacy-OqDwg3YF.js → CarouselView.legacy-B4dmOmg6.js} +3 -3
  2. package/dist/{CarouselView.legacy-OqDwg3YF.js.map → CarouselView.legacy-B4dmOmg6.js.map} +1 -1
  3. package/dist/{CartView-Bq5Pk1zj.js → CartView-kqUZBGpU.js} +3 -3
  4. package/dist/{CartView-Bq5Pk1zj.js.map → CartView-kqUZBGpU.js.map} +1 -1
  5. package/dist/{Checkout-D3FX9O-e.js → Checkout-C0x-bS6h.js} +112 -90
  6. package/dist/{Checkout-D3FX9O-e.js.map → Checkout-C0x-bS6h.js.map} +1 -1
  7. package/dist/{Checkout-BxlujpAi.js → Checkout-DConUsDx.js} +5 -5
  8. package/dist/{Checkout-BxlujpAi.js.map → Checkout-DConUsDx.js.map} +1 -1
  9. package/dist/{Checkout.legacy-U4ggCcmK.js → Checkout.legacy-R-EhfHV-.js} +4 -4
  10. package/dist/{Checkout.legacy-U4ggCcmK.js.map → Checkout.legacy-R-EhfHV-.js.map} +1 -1
  11. package/dist/{CheckoutTimer-C4kUtUM-.js → CheckoutTimer-B7ilb5yz.js} +2 -2
  12. package/dist/{CheckoutTimer-C4kUtUM-.js.map → CheckoutTimer-B7ilb5yz.js.map} +1 -1
  13. package/dist/{CollectionView-DnqqOZlG.js → CollectionView-Chx2gZi9.js} +5 -5
  14. package/dist/{CollectionView-DnqqOZlG.js.map → CollectionView-Chx2gZi9.js.map} +1 -1
  15. package/dist/{CollectionView.legacy-k3eto9xC.js → CollectionView.legacy-Bz7MZc_d.js} +3 -3
  16. package/dist/{CollectionView.legacy-k3eto9xC.js.map → CollectionView.legacy-Bz7MZc_d.js.map} +1 -1
  17. package/dist/{Event-4yNODl4I.js → Event-Rr8PlUUQ.js} +4 -4
  18. package/dist/{Event-4yNODl4I.js.map → Event-Rr8PlUUQ.js.map} +1 -1
  19. package/dist/{EventDetailsView-BqrD0_UR.js → EventDetailsView-V9ot4_05.js} +5 -5
  20. package/dist/{EventDetailsView-BqrD0_UR.js.map → EventDetailsView-V9ot4_05.js.map} +1 -1
  21. package/dist/{FeaturedView.legacy-Nw3oHN_6.js → FeaturedView.legacy-sPdXFbtd.js} +2 -2
  22. package/dist/{FeaturedView.legacy-Nw3oHN_6.js.map → FeaturedView.legacy-sPdXFbtd.js.map} +1 -1
  23. package/dist/{GalleryCard-B_h38gjq.js → GalleryCard-Cg746_4p.js} +2 -2
  24. package/dist/{GalleryCard-B_h38gjq.js.map → GalleryCard-Cg746_4p.js.map} +1 -1
  25. package/dist/{GalleryView.legacy-CXARJbod.js → GalleryView.legacy-DwXpqJQk.js} +3 -3
  26. package/dist/{GalleryView.legacy-CXARJbod.js.map → GalleryView.legacy-DwXpqJQk.js.map} +1 -1
  27. package/dist/{GroupedListView.legacy-CVKs-84L.js → GroupedListView.legacy-Cvlohg0H.js} +2 -2
  28. package/dist/{GroupedListView.legacy-CVKs-84L.js.map → GroupedListView.legacy-Cvlohg0H.js.map} +1 -1
  29. package/dist/OrderSummary-DSFp-LYT.js +496 -0
  30. package/dist/{OrderSummary-Bzh5dIoC.js.map → OrderSummary-DSFp-LYT.js.map} +1 -1
  31. package/dist/{PromoCodeInput-MLvun7BN.js → PromoCodeInput-Z96Jxbqq.js} +3 -3
  32. package/dist/{PromoCodeInput-MLvun7BN.js.map → PromoCodeInput-Z96Jxbqq.js.map} +1 -1
  33. package/dist/{SeriesPage-CQqB-ogK.js → SeriesPage-OSFghrKu.js} +5 -5
  34. package/dist/{SeriesPage-CQqB-ogK.js.map → SeriesPage-OSFghrKu.js.map} +1 -1
  35. package/dist/{SeriesPage.legacy-C0RHliiv.js → SeriesPage.legacy-DmnH3x5t.js} +2 -2
  36. package/dist/{SeriesPage.legacy-C0RHliiv.js.map → SeriesPage.legacy-DmnH3x5t.js.map} +1 -1
  37. package/dist/{Success-CLwAH9KC.js → Success-CaCG95BV.js} +6 -6
  38. package/dist/{Success-CLwAH9KC.js.map → Success-CaCG95BV.js.map} +1 -1
  39. package/dist/{Success.legacy-BeT_kPBR.js → Success.legacy-DqyTto5K.js} +2 -2
  40. package/dist/{Success.legacy-BeT_kPBR.js.map → Success.legacy-DqyTto5K.js.map} +1 -1
  41. package/dist/{VenueCalendar-BW3z2VPQ.js → VenueCalendar-D8NsQUaM.js} +14 -14
  42. package/dist/{VenueCalendar-BW3z2VPQ.js.map → VenueCalendar-D8NsQUaM.js.map} +1 -1
  43. package/dist/{ViewTicketsEmbed-BMvKHo_v.js → ViewTicketsEmbed-DUMSBTMV.js} +2 -2
  44. package/dist/{ViewTicketsEmbed-BMvKHo_v.js.map → ViewTicketsEmbed-DUMSBTMV.js.map} +1 -1
  45. package/dist/{data-toggle-store.svelte-BW7PSkAS.js → data-toggle-store.svelte-CFExWcyA.js} +2 -2
  46. package/dist/{data-toggle-store.svelte-BW7PSkAS.js.map → data-toggle-store.svelte-CFExWcyA.js.map} +1 -1
  47. package/dist/{transform-0OglVsGh.js → transform-XHY0K9GS.js} +2 -2
  48. package/dist/{transform-0OglVsGh.js.map → transform-XHY0K9GS.js.map} +1 -1
  49. package/dist/venue-calendar.es.js +1 -1
  50. package/dist/venue-calendar.iife.js +32 -32
  51. package/dist/venue-calendar.iife.js.map +1 -1
  52. package/dist/venue-calendar.umd.js +29 -29
  53. package/dist/venue-calendar.umd.js.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/OrderSummary-Bzh5dIoC.js +0 -466
@@ -1 +1 @@
1
- {"version":3,"file":"OrderSummary-Bzh5dIoC.js","sources":["../src/lib/api/cta.ts","../src/lib/public-calendar-flow/defaults.ts","../src/lib/public-calendar-flow/OrderSummary.svelte"],"sourcesContent":["/**\r\n * CTA state computation.\r\n *\r\n * Pure function (no I/O) — derives the buy-button state from an event and\r\n * its ticket list. Lives in `api/` because it is the canonical, single\r\n * source of truth that replaces the duplicate implementations previously\r\n * scattered across utils/api.js, core/api-client.js, and a few components.\r\n */\r\n\r\n// Import from the specific subpath (not the bare entry) so the api/\r\n// bundle doesn't pull in the entire SC component graph (Accordion etc.)\r\n// and break `npm run build:api`.\r\nimport {\r\n formatDateRaw,\r\n formatTime,\r\n} from '@getmicdrop/svelte-components/utils/formatters';\r\n\r\nexport interface CtaStateOptions {\r\n cancelled?: boolean;\r\n isRegistration?: boolean;\r\n waitlistEnabled?: boolean;\r\n}\r\n\r\nexport interface CtaState {\r\n text: string;\r\n disabled: boolean;\r\n reason:\r\n | 'cancelled'\r\n | 'event_past'\r\n | 'no_tickets'\r\n | 'available'\r\n | 'coming_soon'\r\n | 'sold_out_waitlist'\r\n | 'sold_out'\r\n | 'sales_ended'\r\n | 'hidden_only';\r\n}\r\n\r\ninterface CtaEvent {\r\n startDateTime?: string | null;\r\n endDateTime?: string | null;\r\n hasPurchasableHiddenTickets?: boolean;\r\n}\r\n\r\ninterface CtaTicket {\r\n salesChannel?: number;\r\n salesBegin?: string | null;\r\n salesStart?: string | null;\r\n saleBegin?: string | null;\r\n onSaleStart?: string | null;\r\n salesEnd?: string | null;\r\n saleEnd?: string | null;\r\n onSaleEnd?: string | null;\r\n remainingCapacity?: number | null;\r\n quantityRemaining?: number | null;\r\n quantity?: number | null;\r\n soldOut?: boolean;\r\n isHidden?: boolean;\r\n visibility?: number;\r\n}\r\n\r\n// A hidden ticket (visibility>=2 or isHidden) that's still on sale drives the\r\n// \"Sales ended\" / \"Sold out\" / \"No tickets\" → \"Get tickets\" override. The user\r\n// just needs the promo code to see it.\r\nexport function isHiddenTicketPurchasable(ticket: CtaTicket): boolean {\r\n if (!ticket) return false;\r\n const isHidden =\r\n ticket.isHidden === true ||\r\n (typeof ticket.visibility === 'number' && ticket.visibility >= 2);\r\n if (!isHidden) return false;\r\n if (ticket.salesChannel === 2) return false;\r\n\r\n const now = new Date();\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n if (salesBegin && new Date(salesBegin) > now) return false;\r\n if (salesEnd && new Date(salesEnd) < now) return false;\r\n\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n if (isSoldOut) return false;\r\n\r\n return true;\r\n}\r\n\r\nexport function computeCtaState(\r\n event: CtaEvent,\r\n tickets: CtaTicket[] | undefined,\r\n options: CtaStateOptions = {}\r\n): CtaState {\r\n const {\r\n cancelled = false,\r\n isRegistration = false,\r\n waitlistEnabled = false,\r\n } = options;\r\n const now = new Date();\r\n\r\n if (cancelled)\r\n return { text: 'Cancelled', disabled: true, reason: 'cancelled' };\r\n\r\n const eventEnd = event.endDateTime || event.startDateTime;\r\n if (eventEnd && new Date(eventEnd) < now) {\r\n return { text: 'Sales ended', disabled: true, reason: 'event_past' };\r\n }\r\n\r\n const hiddenAvailable =\r\n event?.hasPurchasableHiddenTickets === true ||\r\n (Array.isArray(tickets) && tickets.some(isHiddenTicketPurchasable));\r\n\r\n const publicTickets = (tickets || []).filter(\r\n t =>\r\n t.salesChannel !== 2 &&\r\n !t.isHidden &&\r\n !(typeof t.visibility === 'number' && t.visibility >= 2)\r\n );\r\n if (publicTickets.length === 0) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n return {\r\n text: 'No tickets available',\r\n disabled: true,\r\n reason: 'no_tickets',\r\n };\r\n }\r\n\r\n let hasPurchasable = false;\r\n let allSoldOut = true;\r\n let allComingSoon = true;\r\n let earliestSalesStart: Date | null = null;\r\n\r\n for (const ticket of publicTickets) {\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n\r\n const isScheduled = salesBegin ? new Date(salesBegin) > now : false;\r\n const hasSalesEnded = salesEnd ? new Date(salesEnd) < now : false;\r\n const isPurchasable = !isSoldOut && !isScheduled && !hasSalesEnded;\r\n\r\n if (isPurchasable) hasPurchasable = true;\r\n if (!isSoldOut) allSoldOut = false;\r\n if (!isScheduled) allComingSoon = false;\r\n\r\n if (isScheduled && salesBegin && !isSoldOut && !hasSalesEnded) {\r\n const startDate = new Date(salesBegin);\r\n if (!earliestSalesStart || startDate < earliestSalesStart) {\r\n earliestSalesStart = startDate;\r\n }\r\n }\r\n }\r\n\r\n if (hasPurchasable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'available',\r\n };\r\n }\r\n\r\n if (allComingSoon && earliestSalesStart) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n const diffMs = earliestSalesStart.getTime() - now.getTime();\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n let dateText: string;\r\n if (diffHours < 24) {\r\n dateText = formatTime(earliestSalesStart, { hour12: true }, 'en-US');\r\n } else if (diffDays <= 7) {\r\n dateText = formatDateRaw(\r\n earliestSalesStart,\r\n { weekday: 'short', hour: 'numeric', minute: '2-digit', hour12: true },\r\n 'en-US'\r\n );\r\n } else {\r\n const d = formatDateRaw(\r\n earliestSalesStart,\r\n { month: 'short', day: 'numeric' },\r\n 'en-US'\r\n );\r\n const t = formatTime(earliestSalesStart, { hour12: true }, 'en-US');\r\n dateText = `${d} ${t}`;\r\n }\r\n return {\r\n text: `On sale ${dateText}`,\r\n disabled: true,\r\n reason: 'coming_soon',\r\n };\r\n }\r\n\r\n if (allSoldOut) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n if (waitlistEnabled) {\r\n return {\r\n text: 'Join Waitlist',\r\n disabled: false,\r\n reason: 'sold_out_waitlist',\r\n };\r\n }\r\n return { text: 'Sold out', disabled: true, reason: 'sold_out' };\r\n }\r\n\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n\r\n return { text: 'Sales ended', disabled: true, reason: 'sales_ended' };\r\n}\r\n","// @currency-escape: feeCents / 100 in calculateServiceFee is arithmetic,\r\n// not display. Produces a dollar-magnitude number used in the fee formula\r\n// `price * (feePercentage / 100) + feeCents / 100`. Per Atlas\r\n// utility-currency convergence record; the no-handrolled-currency\r\n// ESLint rule's divideByHundred detector treats variable-name `Cents`\r\n// as drift but here it's real math.\r\n\r\n// Premium Ticket Experience — Constants & Defaults\r\n// Used by all design variants. DO NOT MODIFY per-variant.\r\n\r\nimport type {\r\n EventData,\r\n TicketTypeData,\r\n ScarcityLevel,\r\n CtaConfig,\r\n PromoCodeState,\r\n} from './types';\r\nimport { computeCtaState } from '$lib/api';\r\nimport type { Cents } from '@getmicdrop/svelte-components';\r\nimport {\r\n formatDate as scFormatDate,\r\n formatTime as scFormatTime,\r\n roundCurrency,\r\n} from '@getmicdrop/svelte-components';\r\nimport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n} from '$lib/utils/datetime.js';\r\n\r\n// --- Re-export production date/time formatters (timezone-aware) ---\r\nexport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n};\r\n\r\n// --- Scarcity Badge Rules ---\r\nexport const SCARCITY_THRESHOLDS = {\r\n SOLD_OUT: 0,\r\n URGENT: 0.1, // ≤10% remaining → urgent (\"Only X left\")\r\n LOW: 0.2, // ≤20% remaining (80%+ sold) → \"Selling fast\"\r\n MAX_EXACT_COUNT: 20, // Don't show exact count above 20\r\n} as const;\r\n\r\nexport function getScarcityLevel(\r\n remaining: number,\r\n total: number\r\n): ScarcityLevel {\r\n if (total === 0) return 'none';\r\n if (remaining <= 0) return 'sold_out';\r\n const pct = remaining / total;\r\n if (pct <= SCARCITY_THRESHOLDS.URGENT) return 'urgent';\r\n if (pct <= SCARCITY_THRESHOLDS.LOW) return 'low';\r\n return 'none';\r\n}\r\n\r\nexport function getScarcityText(\r\n level: ScarcityLevel,\r\n remaining: number,\r\n context: 'browse' | 'event' | 'ticket',\r\n options?: { isFree?: boolean }\r\n): string | null {\r\n if (level === 'none') return null;\r\n if (level === 'sold_out') return 'Sold out';\r\n // No scarcity badges on free events/tickets — nothing to lose = no urgency\r\n if (options?.isFree) return null;\r\n if (\r\n level === 'urgent' &&\r\n context !== 'browse' &&\r\n remaining <= SCARCITY_THRESHOLDS.MAX_EXACT_COUNT\r\n ) {\r\n return `Only ${remaining} left`;\r\n }\r\n if (level === 'low' || level === 'urgent') return 'Selling fast';\r\n return null;\r\n}\r\n\r\n// --- CTA Rules ---\r\n// Delegates to production computeCtaState() but adapts our EventData shape.\r\n// Components keep calling getCtaConfig(event) — internal logic is production-aligned.\r\nexport function getCtaConfig(event: EventData): CtaConfig {\r\n // Map our EventData tickets to the shape computeCtaState expects.\r\n // `isHidden` flows through so computeCtaState can apply the hidden-only\r\n // \"Sales ended\" → \"Get tickets\" override (MIC-1039).\r\n const apiTickets = event.tickets.map(t => ({\r\n salesBegin: t.salesStartDate,\r\n salesEnd: t.salesEndDate,\r\n remainingCapacity: t.quantityAvailable,\r\n totalCapacity: t.quantityTotal,\r\n soldOut: t.status === 'sold_out',\r\n salesChannel: 1, // All our tickets are online (not \"at the door only\")\r\n isHidden: t.isHidden,\r\n }));\r\n\r\n // Handle statuses that computeCtaState doesn't compute from tickets\r\n if (event.status === 'cancelled') {\r\n return {\r\n text: 'Cancelled',\r\n disabled: true,\r\n reason: 'This event has been cancelled',\r\n };\r\n }\r\n if (event.status === 'past') {\r\n return {\r\n text: 'Event ended',\r\n disabled: true,\r\n reason: 'This event has ended',\r\n };\r\n }\r\n\r\n const result = computeCtaState(\r\n { startDateTime: event.startDateTime, endDateTime: event.endDateTime },\r\n apiTickets,\r\n {\r\n cancelled: false,\r\n isRegistration: event.isRegistrationEvent,\r\n waitlistEnabled: false,\r\n }\r\n );\r\n\r\n return {\r\n text: result.text,\r\n disabled: result.disabled,\r\n reason: result.disabled ? toFriendlyReason(result.reason) : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * computeCtaState() returns machine-enum reasons ('event_past', 'sold_out',\r\n * 'coming_soon', etc) intended for branching, not display. The BookingWidget\r\n * and MobileCta render `reason` directly as supplementary copy below the\r\n * button text — which leaks raw enum strings to users.\r\n *\r\n * Map each enum to a friendly sentence, OR return undefined when the button\r\n * `text` already says everything (\"Sales ended\" / \"Sold out\" — no need for\r\n * a second line repeating it).\r\n */\r\nfunction toFriendlyReason(reason: string | undefined): string | undefined {\r\n if (!reason) return undefined;\r\n switch (reason) {\r\n case 'cancelled':\r\n return 'This event has been cancelled.';\r\n case 'event_past':\r\n return 'This event has already happened.';\r\n case 'no_tickets':\r\n return 'There are no tickets configured for this event.';\r\n case 'coming_soon':\r\n return undefined; // text already shows \"On sale <date>\"\r\n case 'sold_out':\r\n return undefined; // text already shows \"Sold out\"\r\n case 'sold_out_waitlist':\r\n return 'All tickets are claimed. Join the waitlist to be notified.';\r\n case 'sales_ended':\r\n return undefined; // text already shows \"Sales ended\"\r\n default:\r\n return undefined; // unknown enum — never leak it\r\n }\r\n}\r\n\r\n// --- Price Display Rules (from DECISIONS.md #1) ---\r\nexport function getPriceDisplay(event: EventData): string | null {\r\n const visibleTickets = event.tickets.filter(\r\n t => t.status === 'on_sale' && !t.isHidden\r\n );\r\n if (visibleTickets.length === 0) return null;\r\n\r\n const hasDonation = visibleTickets.some(\r\n t => t.isDonation || t.ticketType === 2\r\n );\r\n const paidTickets = visibleTickets.filter(\r\n t => !t.isDonation && t.ticketType !== 2\r\n );\r\n const hasFree = paidTickets.some(t => t.price === 0);\r\n const pricedTickets = paidTickets.filter(t => t.price > 0);\r\n\r\n // Only donation tickets → \"Donation\"\r\n if (pricedTickets.length === 0 && !hasFree && hasDonation) return 'Donation';\r\n\r\n // Only free tickets (no paid, no donation) → null (BookingWidget shows \"Free\" via isFreeEvent)\r\n if (pricedTickets.length === 0 && hasFree) return null;\r\n\r\n const minPrice = Math.min(...pricedTickets.map(t => t.price));\r\n\r\n // Free + paid → \"Free\" (free dominates the display)\r\n if (hasFree) return null;\r\n\r\n // Donation + paid → \"From $X\" (donation is an alternative option)\r\n if (hasDonation) return `From $${minPrice}`;\r\n\r\n // Single paid ticket type → \"$X\"\r\n if (pricedTickets.length === 1) return `$${minPrice}`;\r\n\r\n // Multiple paid ticket types → \"From $X\"\r\n return `From $${minPrice}`;\r\n}\r\n\r\n// --- Fee Calculation ---\r\nexport function calculateFee(\r\n price: number,\r\n feePercentage: number,\r\n feeCents: Cents\r\n): number {\r\n return roundCurrency(price * (feePercentage / 100) + feeCents / 100);\r\n}\r\n\r\nexport function calculateTax(amount: number, taxPercentage: number): number {\r\n return roundCurrency(amount * (taxPercentage / 100));\r\n}\r\n\r\n// --- Date Formatting ---\r\n// PREFERRED: Use the timezone-aware production formatters re-exported above:\r\n// formatBrowseDate(iso, tz) → \"Fri, Feb 20\"\r\n// formatFullDateCompact(iso, tz) → \"Friday, February 20\"\r\n// formatEventTime(iso, tz) → \"8:00 PM\"\r\n// formatTimeRange(start, end, tz) → \"8:00 PM - 10:00 PM\"\r\n// formatDoorsTime(doors, tz) → \"7:00 PM\"\r\n//\r\n// DEPRECATED: The functions below are backward-compatible wrappers for variants\r\n// not yet migrated to timezone-aware formatters. They use browser-local timezone.\r\n// Migrate to the production formatters above when updating each variant.\r\n\r\n/** @deprecated Use formatBrowseDate(dateStr, timezone) instead */\r\nexport function formatDate(dateStr: string): string {\r\n return scFormatDate(dateStr, { weekday: 'short', year: undefined });\r\n}\r\n\r\n/** @deprecated Use formatEventTime(dateStr, timezone) instead */\r\nexport function formatTime(dateStr: string): string {\r\n return scFormatTime(dateStr);\r\n}\r\n\r\n/** @deprecated Use formatBrowseDate + formatTimeRange instead */\r\nexport function formatDateRange(start: string, end: string): string {\r\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n return `${formatBrowseDate(start, tz)} · ${formatTimeRange(start, end, tz)}`;\r\n}\r\n\r\n// --- Animation Durations ---\r\nexport const DURATION = {\r\n instant: 100,\r\n micro: 150,\r\n fast: 200,\r\n normal: 300,\r\n slow: 400,\r\n elaborate: 600,\r\n} as const;\r\n\r\n// --- Smart Sales Date Formatting ---\r\n// Ported from production TicketBlock.svelte — smart thresholds for human-readable dates\r\nexport function formatSmartSalesDate(dateStr: string): string {\r\n if (!dateStr) return '';\r\n const date = new Date(dateStr);\r\n const now = new Date();\r\n const diffMs = date.getTime() - now.getTime();\r\n const diffMinutes = Math.round(diffMs / (1000 * 60));\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n\r\n // < 1 hour: \"in X minutes\"\r\n if (diffMinutes > 0 && diffMinutes < 60) {\r\n const mins = Math.max(1, diffMinutes);\r\n return `in ${mins} minute${mins !== 1 ? 's' : ''}`;\r\n }\r\n\r\n // 1-24 hours: \"in X hours\"\r\n if (diffHours > 0 && diffHours < 24) {\r\n const hours = Math.max(1, Math.round(diffHours));\r\n return `in ${hours} hour${hours !== 1 ? 's' : ''}`;\r\n }\r\n\r\n // Tomorrow: \"tomorrow at X PM\"\r\n const tomorrow = new Date(now);\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n if (date.toDateString() === tomorrow.toDateString()) {\r\n const timeStr = scFormatTime(\r\n date,\r\n { hour: 'numeric', minute: '2-digit' },\r\n 'en-US'\r\n );\r\n return `tomorrow at ${timeStr}`;\r\n }\r\n\r\n // 2-7 days: \"on Friday at X PM\"\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n if (diffDays > 0 && diffDays <= 7) {\r\n const dayName = new Intl.DateTimeFormat('en-US', {\r\n weekday: 'long',\r\n }).format(date);\r\n const timeStr = scFormatTime(\r\n date,\r\n { hour: 'numeric', minute: '2-digit' },\r\n 'en-US'\r\n );\r\n return `on ${dayName} at ${timeStr}`;\r\n }\r\n\r\n // > 7 days: \"on Mar 15\"\r\n const dateFormatted = new Intl.DateTimeFormat('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n }).format(date);\r\n return `on ${dateFormatted}`;\r\n}\r\n\r\n// --- Promo Code State Factory ---\r\nexport function createDefaultPromoState(): PromoCodeState {\r\n return {\r\n code: '',\r\n isApplied: false,\r\n isValidating: false,\r\n error: '',\r\n hint: '',\r\n discountAmount: 0,\r\n discountType: '',\r\n discountTicketIds: [],\r\n revealHiddenTickets: false,\r\n revealTicketIds: [],\r\n };\r\n}\r\n\r\n// --- Ticket helpers ---\r\nexport function getAvailableTickets(\r\n tickets: TicketTypeData[]\r\n): TicketTypeData[] {\r\n return tickets.filter(t => !t.isHidden && t.status === 'on_sale');\r\n}\r\n","<script lang=\"ts\">\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport { Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { OrderTotals } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\torderTotals: OrderTotals;\r\n\t\tlabels?: Record<string, string>;\r\n\t\t/**\r\n\t\t * Which section to render.\r\n\t\t * - `full` (default): ticket lines + totals stacked together.\r\n\t\t * - `lines` : ticket-line items only. Use when the parent scrolls\r\n\t\t * this section in a flex column.\r\n\t\t * - `totals` : subtotal/fees/taxes/promo/total only. Use in a fixed\r\n\t\t * footer alongside the action button.\r\n\t\t *\r\n\t\t * Splitting via `lines` / `totals` lets the sticky sidebars scroll\r\n\t\t * just the variable-length ticket list while keeping the summary\r\n\t\t * block and CTA always visible.\r\n\t\t */\r\n\t\tmode?: 'full' | 'lines' | 'totals';\r\n\t}\r\n\r\n\tlet { orderTotals, labels = {}, mode = 'full' }: Props = $props();\r\n</script>\r\n\r\n<div\r\n\tclass=\"space-y-2\"\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t{#if mode !== 'totals'}\r\n\t\t<!-- Line items -->\r\n\t\t{#each orderTotals.lines as line (line.ticketId)}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\">{line.quantity}x {line.ticketName}</Text>\r\n\t\t\t\t<Text size=\"sm\">{formatCurrency(line.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/each}\r\n\t{/if}\r\n\r\n\t{#if mode !== 'lines'}\r\n\t\t<!-- Subtotal. In `totals` mode the parent supplies the separator above\r\n\t\t this block (BookingWidget wraps the totals block in border-t); a\r\n\t\t second internal border would render as a double line. Only show\r\n\t\t the internal border-t in `full` mode where lines + totals stack\r\n\t\t in one container with no external separator. -->\r\n\t\t{#if mode === 'full' && orderTotals.lines.length > 1}\r\n\t\t\t<div class=\"flex justify-between pt-1 border-t border-default\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{:else if orderTotals.lines.length > 1}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Fees -->\r\n\t\t{#if orderTotals.fees > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.serviceFees || 'Service fees'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.fees as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Taxes -->\r\n\t\t{#if orderTotals.taxes > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.taxes || 'Taxes'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.taxes as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Promo discount -->\r\n\t\t{#if orderTotals.promoDiscount > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">{labels.promoDiscount || 'Promo discount'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">-{formatCurrency(orderTotals.promoDiscount as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Total -->\r\n\t\t<div class=\"flex justify-between pt-2 border-t border-default\">\r\n\t\t\t<Text size=\"base\" class=\"font-semibold\">{labels.total || 'Total'}</Text>\r\n\t\t\t<Text size=\"base\" class=\"font-semibold\">{formatCurrency(orderTotals.total as USD)}</Text>\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n"],"names":["isHiddenTicketPurchasable","ticket","now","salesBegin","salesEnd","remaining","computeCtaState","event","tickets","options","cancelled","isRegistration","waitlistEnabled","eventEnd","hiddenAvailable","publicTickets","t","hasPurchasable","allSoldOut","allComingSoon","earliestSalesStart","isSoldOut","isScheduled","hasSalesEnded","startDate","diffMs","diffHours","diffDays","dateText","formatTime","formatDateRaw","d","SCARCITY_THRESHOLDS","getScarcityLevel","total","pct","getScarcityText","level","context","getCtaConfig","apiTickets","result","toFriendlyReason","reason","getPriceDisplay","visibleTickets","hasDonation","paidTickets","hasFree","pricedTickets","minPrice","calculateTax","amount","taxPercentage","roundCurrency","DURATION","formatSmartSalesDate","dateStr","date","diffMinutes","mins","hours","tomorrow","scFormatTime","dayName","timeStr","createDefaultPromoState","labels","$","$$props","mode","div","root","node_1","line","div_1","root_2","Text","node_2","text","node_3","formatCurrency","$$render","consequent","div_2","root_6","node_6","node_7","$0","text_3","div_3","root_9","node_8","node_9","text_5","consequent_1","consequent_2","div_4","root_12","node_11","node_12","text_7","consequent_3","div_5","root_15","node_14","node_15","text_9","consequent_4","div_6","root_18","node_17","node_18","text_11","consequent_5","div_7","node_16","node_19","node_20","text_13","consequent_6"],"mappings":"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"}
1
+ {"version":3,"file":"OrderSummary-DSFp-LYT.js","sources":["../src/lib/api/cta.ts","../src/lib/public-calendar-flow/defaults.ts","../src/lib/public-calendar-flow/OrderSummary.svelte"],"sourcesContent":["/**\r\n * CTA state computation.\r\n *\r\n * Pure function (no I/O) — derives the buy-button state from an event and\r\n * its ticket list. Lives in `api/` because it is the canonical, single\r\n * source of truth that replaces the duplicate implementations previously\r\n * scattered across utils/api.js, core/api-client.js, and a few components.\r\n */\r\n\r\n// Import from the specific subpath (not the bare entry) so the api/\r\n// bundle doesn't pull in the entire SC component graph (Accordion etc.)\r\n// and break `npm run build:api`.\r\nimport {\r\n formatDateRaw,\r\n formatTime,\r\n} from '@getmicdrop/svelte-components/utils/formatters';\r\n\r\nexport interface CtaStateOptions {\r\n cancelled?: boolean;\r\n isRegistration?: boolean;\r\n waitlistEnabled?: boolean;\r\n}\r\n\r\nexport interface CtaState {\r\n text: string;\r\n disabled: boolean;\r\n reason:\r\n | 'cancelled'\r\n | 'event_past'\r\n | 'no_tickets'\r\n | 'available'\r\n | 'coming_soon'\r\n | 'sold_out_waitlist'\r\n | 'sold_out'\r\n | 'sales_ended'\r\n | 'hidden_only';\r\n}\r\n\r\ninterface CtaEvent {\r\n startDateTime?: string | null;\r\n endDateTime?: string | null;\r\n hasPurchasableHiddenTickets?: boolean;\r\n}\r\n\r\ninterface CtaTicket {\r\n salesChannel?: number;\r\n salesBegin?: string | null;\r\n salesStart?: string | null;\r\n saleBegin?: string | null;\r\n onSaleStart?: string | null;\r\n salesEnd?: string | null;\r\n saleEnd?: string | null;\r\n onSaleEnd?: string | null;\r\n remainingCapacity?: number | null;\r\n quantityRemaining?: number | null;\r\n quantity?: number | null;\r\n soldOut?: boolean;\r\n isHidden?: boolean;\r\n visibility?: number;\r\n}\r\n\r\n// A hidden ticket (visibility>=2 or isHidden) that's still on sale drives the\r\n// \"Sales ended\" / \"Sold out\" / \"No tickets\" → \"Get tickets\" override. The user\r\n// just needs the promo code to see it.\r\nexport function isHiddenTicketPurchasable(ticket: CtaTicket): boolean {\r\n if (!ticket) return false;\r\n const isHidden =\r\n ticket.isHidden === true ||\r\n (typeof ticket.visibility === 'number' && ticket.visibility >= 2);\r\n if (!isHidden) return false;\r\n if (ticket.salesChannel === 2) return false;\r\n\r\n const now = new Date();\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n if (salesBegin && new Date(salesBegin) > now) return false;\r\n if (salesEnd && new Date(salesEnd) < now) return false;\r\n\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n if (isSoldOut) return false;\r\n\r\n return true;\r\n}\r\n\r\nexport function computeCtaState(\r\n event: CtaEvent,\r\n tickets: CtaTicket[] | undefined,\r\n options: CtaStateOptions = {}\r\n): CtaState {\r\n const {\r\n cancelled = false,\r\n isRegistration = false,\r\n waitlistEnabled = false,\r\n } = options;\r\n const now = new Date();\r\n\r\n if (cancelled)\r\n return { text: 'Cancelled', disabled: true, reason: 'cancelled' };\r\n\r\n const eventEnd = event.endDateTime || event.startDateTime;\r\n if (eventEnd && new Date(eventEnd) < now) {\r\n return { text: 'Sales ended', disabled: true, reason: 'event_past' };\r\n }\r\n\r\n const hiddenAvailable =\r\n event?.hasPurchasableHiddenTickets === true ||\r\n (Array.isArray(tickets) && tickets.some(isHiddenTicketPurchasable));\r\n\r\n const publicTickets = (tickets || []).filter(\r\n t =>\r\n t.salesChannel !== 2 &&\r\n !t.isHidden &&\r\n !(typeof t.visibility === 'number' && t.visibility >= 2)\r\n );\r\n if (publicTickets.length === 0) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n return {\r\n text: 'No tickets available',\r\n disabled: true,\r\n reason: 'no_tickets',\r\n };\r\n }\r\n\r\n let hasPurchasable = false;\r\n let allSoldOut = true;\r\n let allComingSoon = true;\r\n let earliestSalesStart: Date | null = null;\r\n\r\n for (const ticket of publicTickets) {\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n\r\n const isScheduled = salesBegin ? new Date(salesBegin) > now : false;\r\n const hasSalesEnded = salesEnd ? new Date(salesEnd) < now : false;\r\n const isPurchasable = !isSoldOut && !isScheduled && !hasSalesEnded;\r\n\r\n if (isPurchasable) hasPurchasable = true;\r\n if (!isSoldOut) allSoldOut = false;\r\n if (!isScheduled) allComingSoon = false;\r\n\r\n if (isScheduled && salesBegin && !isSoldOut && !hasSalesEnded) {\r\n const startDate = new Date(salesBegin);\r\n if (!earliestSalesStart || startDate < earliestSalesStart) {\r\n earliestSalesStart = startDate;\r\n }\r\n }\r\n }\r\n\r\n if (hasPurchasable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'available',\r\n };\r\n }\r\n\r\n if (allComingSoon && earliestSalesStart) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n const diffMs = earliestSalesStart.getTime() - now.getTime();\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n let dateText: string;\r\n if (diffHours < 24) {\r\n dateText = formatTime(earliestSalesStart, { hour12: true }, 'en-US');\r\n } else if (diffDays <= 7) {\r\n dateText = formatDateRaw(\r\n earliestSalesStart,\r\n { weekday: 'short', hour: 'numeric', minute: '2-digit', hour12: true },\r\n 'en-US'\r\n );\r\n } else {\r\n const d = formatDateRaw(\r\n earliestSalesStart,\r\n { month: 'short', day: 'numeric' },\r\n 'en-US'\r\n );\r\n const t = formatTime(earliestSalesStart, { hour12: true }, 'en-US');\r\n dateText = `${d} ${t}`;\r\n }\r\n return {\r\n text: `On sale ${dateText}`,\r\n disabled: true,\r\n reason: 'coming_soon',\r\n };\r\n }\r\n\r\n if (allSoldOut) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n if (waitlistEnabled) {\r\n return {\r\n text: 'Join Waitlist',\r\n disabled: false,\r\n reason: 'sold_out_waitlist',\r\n };\r\n }\r\n return { text: 'Sold out', disabled: true, reason: 'sold_out' };\r\n }\r\n\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n\r\n return { text: 'Sales ended', disabled: true, reason: 'sales_ended' };\r\n}\r\n","// @currency-escape: feeCents / 100 in calculateServiceFee is arithmetic,\r\n// not display. Produces a dollar-magnitude number used in the fee formula\r\n// `price * (feePercentage / 100) + feeCents / 100`. Per Atlas\r\n// utility-currency convergence record; the no-handrolled-currency\r\n// ESLint rule's divideByHundred detector treats variable-name `Cents`\r\n// as drift but here it's real math.\r\n\r\n// Premium Ticket Experience — Constants & Defaults\r\n// Used by all design variants. DO NOT MODIFY per-variant.\r\n\r\nimport type {\r\n EventData,\r\n TicketTypeData,\r\n ScarcityLevel,\r\n CtaConfig,\r\n PromoCodeState,\r\n} from './types';\r\nimport { computeCtaState } from '$lib/api';\r\nimport type { Cents } from '@getmicdrop/svelte-components';\r\nimport {\r\n formatDate as scFormatDate,\r\n formatTime as scFormatTime,\r\n roundCurrency,\r\n} from '@getmicdrop/svelte-components';\r\nimport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n} from '$lib/utils/datetime.js';\r\n\r\n// --- Re-export production date/time formatters (timezone-aware) ---\r\nexport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n};\r\n\r\n// --- Scarcity Badge Rules ---\r\nexport const SCARCITY_THRESHOLDS = {\r\n SOLD_OUT: 0,\r\n URGENT: 0.1, // ≤10% remaining → urgent (\"Only X left\")\r\n LOW: 0.2, // ≤20% remaining (80%+ sold) → \"Selling fast\"\r\n MAX_EXACT_COUNT: 20, // Don't show exact count above 20\r\n} as const;\r\n\r\nexport function getScarcityLevel(\r\n remaining: number,\r\n total: number\r\n): ScarcityLevel {\r\n if (total === 0) return 'none';\r\n if (remaining <= 0) return 'sold_out';\r\n const pct = remaining / total;\r\n if (pct <= SCARCITY_THRESHOLDS.URGENT) return 'urgent';\r\n if (pct <= SCARCITY_THRESHOLDS.LOW) return 'low';\r\n return 'none';\r\n}\r\n\r\nexport function getScarcityText(\r\n level: ScarcityLevel,\r\n remaining: number,\r\n context: 'browse' | 'event' | 'ticket',\r\n options?: { isFree?: boolean }\r\n): string | null {\r\n if (level === 'none') return null;\r\n if (level === 'sold_out') return 'Sold out';\r\n // No scarcity badges on free events/tickets — nothing to lose = no urgency\r\n if (options?.isFree) return null;\r\n if (\r\n level === 'urgent' &&\r\n context !== 'browse' &&\r\n remaining <= SCARCITY_THRESHOLDS.MAX_EXACT_COUNT\r\n ) {\r\n return `Only ${remaining} left`;\r\n }\r\n if (level === 'low' || level === 'urgent') return 'Selling fast';\r\n return null;\r\n}\r\n\r\n// --- CTA Rules ---\r\n// Delegates to production computeCtaState() but adapts our EventData shape.\r\n// Components keep calling getCtaConfig(event) — internal logic is production-aligned.\r\nexport function getCtaConfig(event: EventData): CtaConfig {\r\n // Map our EventData tickets to the shape computeCtaState expects.\r\n // `isHidden` flows through so computeCtaState can apply the hidden-only\r\n // \"Sales ended\" → \"Get tickets\" override (MIC-1039).\r\n const apiTickets = event.tickets.map(t => ({\r\n salesBegin: t.salesStartDate,\r\n salesEnd: t.salesEndDate,\r\n remainingCapacity: t.quantityAvailable,\r\n totalCapacity: t.quantityTotal,\r\n soldOut: t.status === 'sold_out',\r\n salesChannel: 1, // All our tickets are online (not \"at the door only\")\r\n isHidden: t.isHidden,\r\n }));\r\n\r\n // Handle statuses that computeCtaState doesn't compute from tickets\r\n if (event.status === 'cancelled') {\r\n return {\r\n text: 'Cancelled',\r\n disabled: true,\r\n reason: 'This event has been cancelled',\r\n };\r\n }\r\n if (event.status === 'past') {\r\n return {\r\n text: 'Event ended',\r\n disabled: true,\r\n reason: 'This event has ended',\r\n };\r\n }\r\n\r\n const result = computeCtaState(\r\n { startDateTime: event.startDateTime, endDateTime: event.endDateTime },\r\n apiTickets,\r\n {\r\n cancelled: false,\r\n isRegistration: event.isRegistrationEvent,\r\n waitlistEnabled: false,\r\n }\r\n );\r\n\r\n return {\r\n text: result.text,\r\n disabled: result.disabled,\r\n reason: result.disabled ? toFriendlyReason(result.reason) : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * computeCtaState() returns machine-enum reasons ('event_past', 'sold_out',\r\n * 'coming_soon', etc) intended for branching, not display. The BookingWidget\r\n * and MobileCta render `reason` directly as supplementary copy below the\r\n * button text — which leaks raw enum strings to users.\r\n *\r\n * Map each enum to a friendly sentence, OR return undefined when the button\r\n * `text` already says everything (\"Sales ended\" / \"Sold out\" — no need for\r\n * a second line repeating it).\r\n */\r\nfunction toFriendlyReason(reason: string | undefined): string | undefined {\r\n if (!reason) return undefined;\r\n switch (reason) {\r\n case 'cancelled':\r\n return 'This event has been cancelled.';\r\n case 'event_past':\r\n return 'This event has already happened.';\r\n case 'no_tickets':\r\n return 'There are no tickets configured for this event.';\r\n case 'coming_soon':\r\n return undefined; // text already shows \"On sale <date>\"\r\n case 'sold_out':\r\n return undefined; // text already shows \"Sold out\"\r\n case 'sold_out_waitlist':\r\n return 'All tickets are claimed. Join the waitlist to be notified.';\r\n case 'sales_ended':\r\n return undefined; // text already shows \"Sales ended\"\r\n default:\r\n return undefined; // unknown enum — never leak it\r\n }\r\n}\r\n\r\n// --- Price Display Rules (from DECISIONS.md #1) ---\r\nexport function getPriceDisplay(event: EventData): string | null {\r\n const visibleTickets = event.tickets.filter(\r\n t => t.status === 'on_sale' && !t.isHidden\r\n );\r\n if (visibleTickets.length === 0) return null;\r\n\r\n const hasDonation = visibleTickets.some(\r\n t => t.isDonation || t.ticketType === 2\r\n );\r\n const paidTickets = visibleTickets.filter(\r\n t => !t.isDonation && t.ticketType !== 2\r\n );\r\n const hasFree = paidTickets.some(t => t.price === 0);\r\n const pricedTickets = paidTickets.filter(t => t.price > 0);\r\n\r\n // Only donation tickets → \"Donation\"\r\n if (pricedTickets.length === 0 && !hasFree && hasDonation) return 'Donation';\r\n\r\n // Only free tickets (no paid, no donation) → null (BookingWidget shows \"Free\" via isFreeEvent)\r\n if (pricedTickets.length === 0 && hasFree) return null;\r\n\r\n const minPrice = Math.min(...pricedTickets.map(t => t.price));\r\n\r\n // Free + paid → \"Free\" (free dominates the display)\r\n if (hasFree) return null;\r\n\r\n // Donation + paid → \"From $X\" (donation is an alternative option)\r\n if (hasDonation) return `From $${minPrice}`;\r\n\r\n // Single paid ticket type → \"$X\"\r\n if (pricedTickets.length === 1) return `$${minPrice}`;\r\n\r\n // Multiple paid ticket types → \"From $X\"\r\n return `From $${minPrice}`;\r\n}\r\n\r\n// --- Fee Calculation ---\r\nexport function calculateFee(\r\n price: number,\r\n feePercentage: number,\r\n feeCents: Cents\r\n): number {\r\n return roundCurrency(price * (feePercentage / 100) + feeCents / 100);\r\n}\r\n\r\nexport function calculateTax(amount: number, taxPercentage: number): number {\r\n return roundCurrency(amount * (taxPercentage / 100));\r\n}\r\n\r\n// --- Date Formatting ---\r\n// PREFERRED: Use the timezone-aware production formatters re-exported above:\r\n// formatBrowseDate(iso, tz) → \"Fri, Feb 20\"\r\n// formatFullDateCompact(iso, tz) → \"Friday, February 20\"\r\n// formatEventTime(iso, tz) → \"8:00 PM\"\r\n// formatTimeRange(start, end, tz) → \"8:00 PM - 10:00 PM\"\r\n// formatDoorsTime(doors, tz) → \"7:00 PM\"\r\n//\r\n// DEPRECATED: The functions below are backward-compatible wrappers for variants\r\n// not yet migrated to timezone-aware formatters. They use browser-local timezone.\r\n// Migrate to the production formatters above when updating each variant.\r\n\r\n/** @deprecated Use formatBrowseDate(dateStr, timezone) instead */\r\nexport function formatDate(dateStr: string): string {\r\n return scFormatDate(dateStr, { weekday: 'short', year: undefined });\r\n}\r\n\r\n/** @deprecated Use formatEventTime(dateStr, timezone) instead */\r\nexport function formatTime(dateStr: string): string {\r\n return scFormatTime(dateStr);\r\n}\r\n\r\n/** @deprecated Use formatBrowseDate + formatTimeRange instead */\r\nexport function formatDateRange(start: string, end: string): string {\r\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n return `${formatBrowseDate(start, tz)} · ${formatTimeRange(start, end, tz)}`;\r\n}\r\n\r\n// --- Animation Durations ---\r\nexport const DURATION = {\r\n instant: 100,\r\n micro: 150,\r\n fast: 200,\r\n normal: 300,\r\n slow: 400,\r\n elaborate: 600,\r\n} as const;\r\n\r\n// --- Smart Sales Date Formatting ---\r\n// Ported from production TicketBlock.svelte — smart thresholds for human-readable dates\r\nexport function formatSmartSalesDate(dateStr: string): string {\r\n if (!dateStr) return '';\r\n const date = new Date(dateStr);\r\n const now = new Date();\r\n const diffMs = date.getTime() - now.getTime();\r\n const diffMinutes = Math.round(diffMs / (1000 * 60));\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n\r\n // < 1 hour: \"in X minutes\"\r\n if (diffMinutes > 0 && diffMinutes < 60) {\r\n const mins = Math.max(1, diffMinutes);\r\n return `in ${mins} minute${mins !== 1 ? 's' : ''}`;\r\n }\r\n\r\n // 1-24 hours: \"in X hours\"\r\n if (diffHours > 0 && diffHours < 24) {\r\n const hours = Math.max(1, Math.round(diffHours));\r\n return `in ${hours} hour${hours !== 1 ? 's' : ''}`;\r\n }\r\n\r\n // Tomorrow: \"tomorrow at X PM\"\r\n const tomorrow = new Date(now);\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n if (date.toDateString() === tomorrow.toDateString()) {\r\n const timeStr = scFormatTime(\r\n date,\r\n { hour: 'numeric', minute: '2-digit' },\r\n 'en-US'\r\n );\r\n return `tomorrow at ${timeStr}`;\r\n }\r\n\r\n // 2-7 days: \"on Friday at X PM\"\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n if (diffDays > 0 && diffDays <= 7) {\r\n const dayName = new Intl.DateTimeFormat('en-US', {\r\n weekday: 'long',\r\n }).format(date);\r\n const timeStr = scFormatTime(\r\n date,\r\n { hour: 'numeric', minute: '2-digit' },\r\n 'en-US'\r\n );\r\n return `on ${dayName} at ${timeStr}`;\r\n }\r\n\r\n // > 7 days: \"on Mar 15\"\r\n const dateFormatted = new Intl.DateTimeFormat('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n }).format(date);\r\n return `on ${dateFormatted}`;\r\n}\r\n\r\n// --- Promo Code State Factory ---\r\nexport function createDefaultPromoState(): PromoCodeState {\r\n return {\r\n code: '',\r\n isApplied: false,\r\n isValidating: false,\r\n error: '',\r\n hint: '',\r\n discountAmount: 0,\r\n discountType: '',\r\n discountTicketIds: [],\r\n revealHiddenTickets: false,\r\n revealTicketIds: [],\r\n };\r\n}\r\n\r\n// --- Ticket helpers ---\r\nexport function getAvailableTickets(\r\n tickets: TicketTypeData[]\r\n): TicketTypeData[] {\r\n return tickets.filter(t => !t.isHidden && t.status === 'on_sale');\r\n}\r\n","<script lang=\"ts\">\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport { Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { OrderTotals } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\torderTotals: OrderTotals;\r\n\t\tlabels?: Record<string, string>;\r\n\t\t/**\r\n\t\t * Which section to render.\r\n\t\t * - `full` (default): ticket lines + totals stacked together.\r\n\t\t * - `lines` : ticket-line items only. Use when the parent scrolls\r\n\t\t * this section in a flex column.\r\n\t\t * - `totals` : subtotal/fees/taxes/promo/total only. Use in a fixed\r\n\t\t * footer alongside the action button.\r\n\t\t *\r\n\t\t * Splitting via `lines` / `totals` lets the sticky sidebars scroll\r\n\t\t * just the variable-length ticket list while keeping the summary\r\n\t\t * block and CTA always visible.\r\n\t\t */\r\n\t\tmode?: 'full' | 'lines' | 'totals';\r\n\t}\r\n\r\n\tlet { orderTotals, labels = {}, mode = 'full' }: Props = $props();\r\n</script>\r\n\r\n<div\r\n\tclass=\"space-y-2\"\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t{#if mode !== 'totals'}\r\n\t\t<!-- Line items -->\r\n\t\t{#each orderTotals.lines as line (line.ticketId)}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\">{line.quantity}x {line.ticketName}</Text>\r\n\t\t\t\t<Text size=\"sm\">{formatCurrency(line.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/each}\r\n\t{/if}\r\n\r\n\t{#if mode !== 'lines'}\r\n\t\t<!-- Subtotal. In `totals` mode the parent supplies the separator above\r\n\t\t this block (BookingWidget wraps the totals block in border-t); a\r\n\t\t second internal border would render as a double line. Only show\r\n\t\t the internal border-t in `full` mode where lines + totals stack\r\n\t\t in one container with no external separator. -->\r\n\t\t{#if mode === 'full' && orderTotals.lines.length > 1}\r\n\t\t\t<div class=\"flex justify-between pt-1 border-t border-default\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{:else if orderTotals.lines.length > 1}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Fees -->\r\n\t\t{#if orderTotals.fees > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.serviceFees || 'Service fees'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.fees as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Taxes -->\r\n\t\t{#if orderTotals.taxes > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.taxes || 'Taxes'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.taxes as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Promo discount -->\r\n\t\t{#if orderTotals.promoDiscount > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">{labels.promoDiscount || 'Promo discount'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">-{formatCurrency(orderTotals.promoDiscount as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Gift card — deduction from the amount due; `total` already reflects it -->\r\n\t\t{#if orderTotals.giftCardAmount > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">{labels.giftCard || 'Gift card'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">-{formatCurrency(orderTotals.giftCardAmount as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Total -->\r\n\t\t<div class=\"flex justify-between pt-2 border-t border-default\">\r\n\t\t\t<Text size=\"base\" class=\"font-semibold\">{labels.total || 'Total'}</Text>\r\n\t\t\t<Text size=\"base\" class=\"font-semibold\">{formatCurrency(orderTotals.total as USD)}</Text>\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n"],"names":["isHiddenTicketPurchasable","ticket","now","salesBegin","salesEnd","remaining","computeCtaState","event","tickets","options","cancelled","isRegistration","waitlistEnabled","eventEnd","hiddenAvailable","publicTickets","t","hasPurchasable","allSoldOut","allComingSoon","earliestSalesStart","isSoldOut","isScheduled","hasSalesEnded","startDate","diffMs","diffHours","diffDays","dateText","formatTime","formatDateRaw","d","SCARCITY_THRESHOLDS","getScarcityLevel","total","pct","getScarcityText","level","context","getCtaConfig","apiTickets","result","toFriendlyReason","reason","getPriceDisplay","visibleTickets","hasDonation","paidTickets","hasFree","pricedTickets","minPrice","calculateTax","amount","taxPercentage","roundCurrency","DURATION","formatSmartSalesDate","dateStr","date","diffMinutes","mins","hours","tomorrow","scFormatTime","dayName","timeStr","createDefaultPromoState","labels","$","$$props","mode","div","root","node_1","line","div_1","root_2","Text","node_2","text","node_3","formatCurrency","$$render","consequent","div_2","root_6","node_6","node_7","$0","text_3","div_3","root_9","node_8","node_9","text_5","consequent_1","consequent_2","div_4","root_12","node_11","node_12","text_7","consequent_3","div_5","root_15","node_14","node_15","text_9","consequent_4","div_6","root_18","node_17","node_18","text_11","consequent_5","div_7","root_21","node_20","node_21","text_13","consequent_6","div_8","node_19","node_22","node_23","text_15","consequent_7"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import "svelte/internal/disclose-version";
2
2
  import * as e from "svelte/internal/client";
3
- import { f as Q, aJ as j, ad as ke, I as te, B as R, ab as ye, ac as be, e as G } from "./VenueCalendar-BW3z2VPQ.js";
3
+ import { f as Q, aJ as j, ad as ke, I as te, B as R, ab as ye, ac as be, e as G } from "./VenueCalendar-D8NsQUaM.js";
4
4
  import { H as Pe } from "./Heading-AFd3o0xt.js";
5
5
  import { T as $ } from "./Text-CXR2fhx6.js";
6
6
  import "svelte/transition";
7
7
  import "svelte/easing";
8
- import { g as Se, b as qe, f as De, D as ae } from "./OrderSummary-Bzh5dIoC.js";
8
+ import { g as Se, b as qe, f as De, D as ae } from "./OrderSummary-DSFp-LYT.js";
9
9
  function ee(w = "light") {
10
10
  if (typeof window > "u" || typeof navigator > "u" || !navigator.vibrate) return;
11
11
  const t = w === "light" ? 8 : w === "medium" ? 18 : 32;
@@ -412,4 +412,4 @@ export {
412
412
  Ke as T,
413
413
  ee as t
414
414
  };
415
- //# sourceMappingURL=PromoCodeInput-MLvun7BN.js.map
415
+ //# sourceMappingURL=PromoCodeInput-Z96Jxbqq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromoCodeInput-MLvun7BN.js","sources":["../src/lib/utils/haptic.ts","../src/lib/public-calendar-flow/TicketCard.svelte","../src/lib/public-calendar-flow/PromoCodeInput.svelte"],"sourcesContent":["/**\r\n * Haptic feedback helper.\r\n *\r\n * One call site for `navigator.vibrate` so consumers don't repeat the\r\n * SSR + capability check. Android browsers vibrate; iOS Safari silently\r\n * no-ops (Apple deliberate — they reserve haptics for native apps via\r\n * the Taptic Engine, no web API exposed). Future-proof: if Apple ever\r\n * ships a web haptic API, swap the impl here and every consumer gets it.\r\n *\r\n * Styles:\r\n * - 'light' (8ms) — UI tick on small interactions (ticket +/-, tap)\r\n * - 'medium' (18ms) — committed state change (drawer snap, month flip)\r\n * - 'heavy' (32ms) — destructive / important confirmations\r\n */\r\nexport function tick(style: 'light' | 'medium' | 'heavy' = 'light'): void {\r\n\tif (typeof window === 'undefined') return;\r\n\tif (typeof navigator === 'undefined' || !navigator.vibrate) return;\r\n\tconst ms = style === 'light' ? 8 : style === 'medium' ? 18 : 32;\r\n\tnavigator.vibrate(ms);\r\n}\r\n","<script lang=\"ts\">\r\n\timport { Add, Subtract } from 'carbon-icons-svelte';\r\n\timport { Badge, Button, Heading, Input, Text, asTicketId, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { TicketId, USD } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport { tick } from '$lib/utils/haptic';\r\n\timport type { TicketTypeData, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText,\r\n\t\tformatSmartSalesDate,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tticket: TicketTypeData;\r\n\t\tquantity: number;\r\n\t\tonQuantityChange: (ticketId: TicketId, quantity: number) => void;\r\n\t\tdonationAmount?: string;\r\n\t\tonDonationChange?: (ticketId: TicketId, amount: string) => void;\r\n\t\tisRevealedByPromo?: boolean;\r\n\t\tisDiscountedByPromo?: boolean;\r\n\t\tdiscountedPrice?: number | null;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tticket,\r\n\t\tquantity,\r\n\t\tonQuantityChange,\r\n\t\tdonationAmount = '',\r\n\t\tonDonationChange,\r\n\t\tisRevealedByPromo = false,\r\n\t\tisDiscountedByPromo = false,\r\n\t\tdiscountedPrice = null,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\t// --- State detection ---\r\n\tlet isDonation = $derived(ticket.isDonation || ticket.ticketType === 2);\r\n\tlet isSoldOut = $derived(ticket.status === 'sold_out' || ticket.quantityAvailable === 0);\r\n\tlet isComingSoon = $derived(ticket.status === 'coming_soon');\r\n\tlet isSalesEnded = $derived(ticket.status === 'sales_ended');\r\n\tlet isDisabled = $derived(isSoldOut || isComingSoon || isSalesEnded);\r\n\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(ticket.quantityAvailable, ticket.quantityTotal)\r\n\t);\r\n\tlet scarcityText = $derived(getScarcityText(scarcityLevel, ticket.quantityAvailable, 'ticket'));\r\n\r\n\t// Donation validation\r\n\tlet donationValue = $derived(parseFloat(donationAmount) || 0);\r\n\tlet donationError = $derived(\r\n\t\tisDonation && donationAmount !== '' && donationValue < 1 ? 'Minimum $1.00' : ''\r\n\t);\r\n\tlet isDonationValid = $derived(!isDonation || (donationAmount !== '' && donationValue >= 1));\r\n\r\n\tlet canDecrement = $derived(quantity > 0);\r\n\tlet canIncrement = $derived(\r\n\t\t!isDisabled &&\r\n\t\tquantity < ticket.maxPerOrder &&\r\n\t\tquantity < ticket.quantityAvailable &&\r\n\t\tisDonationValid\r\n\t);\r\n\r\n\tfunction decrement() {\r\n\t\tif (canDecrement) {\r\n\t\t\t// If decrementing would go below minimum, jump to 0 (remove from cart)\r\n\t\t\tconst newQty = quantity - 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty < ticket.minPerOrder ? 0 : newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction increment() {\r\n\t\tif (canIncrement) {\r\n\t\t\t// If at 0, jump to minimum purchase quantity\r\n\t\t\tconst newQty = quantity === 0 ? ticket.minPerOrder : quantity + 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tlet donationInputValue = $state(donationAmount);\r\n\r\n\t// Sync external donationAmount prop to local state\r\n\t$effect(() => {\r\n\t\tdonationInputValue = donationAmount;\r\n\t});\r\n\r\n\t// Push local changes upstream\r\n\tfunction syncDonation() {\r\n\t\tif (donationInputValue !== donationAmount) {\r\n\t\t\t// eslint-disable-next-line micdrop/boundary-only-as-cast -- API response mapper: ticket.id arrives as raw number from server\r\n\t\tonDonationChange?.(asTicketId(ticket.id), donationInputValue);\r\n\t\t}\r\n\t}\r\n\r\n\t// Price display — show total inclusive of fees (matching production TicketBlock.svelte)\r\n\tlet totalPrice = $derived(isDonation ? 0 : ticket.price + (ticket.price === 0 ? 0 : ticket.fee));\r\n\tlet priceDisplay = $derived(\r\n\t\tisDonation ? '' : ticket.price === 0 ? (labels.free || 'Free') : formatCurrency(totalPrice as USD)\r\n\t);\r\n\tlet feeCaption = $derived(\r\n\t\t!isDonation && ticket.fee > 0 && ticket.price > 0 ? `incl. ${formatCurrency(ticket.fee as USD)} ${labels.fee || 'fee'}` : ''\r\n\t);\r\n\r\n\t// Sales start display for coming soon tickets\r\n\tlet salesStartDisplay = $derived(\r\n\t\tisComingSoon && ticket.salesStartDate\r\n\t\t\t? `Sales start ${formatSmartSalesDate(ticket.salesStartDate)}`\r\n\t\t\t: isComingSoon\r\n\t\t\t\t? 'Coming soon'\r\n\t\t\t\t: ''\r\n\t);\r\n</script>\r\n\r\n<article\r\n\tclass=\"ticket-card rounded-lg border p-4 transition-all\"\r\n\tclass:disabled-ticket={isDisabled}\r\n\tclass:revealed={isRevealedByPromo && !isDisabled}\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t<div class=\"vc-flex-between-start gap-4\">\r\n\t\t<!-- Ticket info -->\r\n\t\t<div class=\"flex-1 min-w-0\">\r\n\t\t\t<div class=\"flex-row-2 flex-wrap\">\r\n\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\">\r\n\t\t\t\t\t{ticket.name}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{#if isSoldOut}\r\n\t\t\t\t\t<Badge variant=\"error\">{labels.soldOut || 'Sold out'}</Badge>\r\n\t\t\t\t{:else if isSalesEnded}\r\n\t\t\t\t\t<Badge variant=\"neutral\">Sales ended</Badge>\r\n\t\t\t\t{:else if isRevealedByPromo}\r\n\t\t\t\t\t<Badge variant=\"success\">Unlocked</Badge>\r\n\t\t\t\t{:else if isDiscountedByPromo}\r\n\t\t\t\t\t<Badge variant=\"green\">Discount applied</Badge>\r\n\t\t\t\t{:else if scarcityText && !isComingSoon}\r\n\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\tremaining={ticket.quantityAvailable}\r\n\t\t\t\t\t\ttotal={ticket.quantityTotal}\r\n\t\t\t\t\t\tcontext=\"ticket\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t{#if ticket.description}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1 line-clamp-2\">\r\n\t\t\t\t\t{ticket.description}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Price row -->\r\n\t\t\t<div class=\"flex-row-2 mt-2\">\r\n\t\t\t\t{#if isDonation}\r\n\t\t\t\t\t<!-- Donation: $ input -->\r\n\t\t\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t\t\t<div class=\"donation-input-wrapper\" oninput={syncDonation}>\r\n\t\t\t\t\t\t<Input\r\n\t\t\t\t\t\t\tlabel=\"Donation amount\"\r\n\t\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\tplaceholder=\"0.00\"\r\n\t\t\t\t\t\t\tbind:value={donationInputValue}\r\n\t\t\t\t\t\t\tdisabled={isDisabled}\r\n\t\t\t\t\t\t\terrorText={donationError}\r\n\t\t\t\t\t\t\tcolor={donationError ? 'red' : 'base'}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{:else if isDiscountedByPromo && discountedPrice !== null}\r\n\t\t\t\t\t<!-- Discounted: strikethrough original total + discounted total (both inclusive of fee) -->\r\n\t\t\t\t\t{@const discountedTotal = discountedPrice + (discountedPrice === 0 ? 0 : ticket.fee)}\r\n\t\t\t\t\t<span class=\"price-strikethrough\">{formatCurrency(totalPrice as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t<span class=\"price-discounted\">{formatCurrency(discountedTotal as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{:else if isComingSoon}\r\n\t\t\t\t\t<!-- Coming soon: show price dimmed -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-muted\">{priceDisplay}</span>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<!-- Standard price -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-primary\">{priceDisplay}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Coming soon / sales ended message -->\r\n\t\t\t{#if salesStartDisplay}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1.5\">\r\n\t\t\t\t\t{salesStartDisplay}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\r\n\t\t<!-- Quantity controls -->\r\n\t\t<div class=\"flex items-center quantity-selector\">\r\n\t\t\t{#if isSoldOut || isComingSoon || isSalesEnded}\r\n\t\t\t\t<!-- No controls for coming soon / sales ended -->\r\n\t\t\t{:else}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={decrement}\r\n\t\t\t\t\tdisabled={!canDecrement}\r\n\t\t\t\t\taria-label=\"{labels.decrease || 'Decrease'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Subtract size={16} />\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tclass=\"qty-display\"\r\n\t\t\t\t\taria-live=\"polite\"\r\n\t\t\t\t\taria-label=\"{ticket.name} {labels.quantity || 'quantity'}: {quantity}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{quantity}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={increment}\r\n\t\t\t\t\tdisabled={!canIncrement}\r\n\t\t\t\t\taria-label=\"{labels.increase || 'Increase'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Add size={16} />\r\n\t\t\t\t</Button>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* Card states using HSL CSS variables (matching TicketBlock.svelte) */\r\n\t.ticket-card {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 220 13% 91%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 0 0% 100%)));\r\n\t}\r\n\r\n\t.ticket-card.revealed {\r\n\t\tborder-color: hsl(var(--accent-success) / 50%);\r\n\t\tbackground-color: hsl(var(--accent-success) / 8%);\r\n\t}\r\n\r\n\t.ticket-card.disabled-ticket {\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t/* Quantity selector */\r\n\t.quantity-selector {\r\n\t\tgap: 0.5rem;\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t.qty-display {\r\n\t\tmin-width: 2rem;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 1.125rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--text-primary, 222 47% 11%));\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t/* Discounted price green text */\r\n\t.price-discounted {\r\n\t\tfont-size: 0.875rem;\r\n\t\tline-height: 1.25rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t/* Donation input wrapper */\r\n\t.donation-input-wrapper {\r\n\t\tmin-width: 10rem;\r\n\t}\r\n\r\n .ticket-card {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 215 19% 35%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 222 47% 11%)));\r\n\t }\r\n }\r\n\r\n .ticket-card.revealed {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--accent-success)); /* green-700 */\r\n\t\tbackground-color: hsl(var(--accent-success));\r\n\t }\r\n }\r\n\r\n .qty-display {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tcolor: hsl(var(--text-primary, 0 0% 100%));\r\n\t }\r\n }\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Input, Button } from '@getmicdrop/svelte-components';\r\n\timport type { PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tpromoState: PromoCodeState;\r\n\t\tonApply: (code: string) => void;\r\n\t\tonRemove: () => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { promoState, onApply, onRemove, labels = {}, }: Props = $props();\r\n\r\n\tlet isExpanded = $state(false);\r\n\tlet inputValue = $state('');\r\n\r\n\tfunction handleApply() {\r\n\t\tconst trimmed = inputValue.trim();\r\n\t\tif (!trimmed) return;\r\n\t\tonApply(trimmed);\r\n\t}\r\n\r\n\tfunction handleRemove() {\r\n\t\tinputValue = '';\r\n\t\tonRemove();\r\n\t}\r\n\r\n\tfunction handleKeydown(e: KeyboardEvent) {\r\n\t\tif (e.key === 'Enter') {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleApply();\r\n\t\t}\r\n\t}\r\n\r\n\t// Auto-expand when promo is applied (e.g. on restore)\r\n\tlet shouldExpand = $derived(promoState.isApplied || isExpanded);\r\n</script>\r\n\r\n<div class=\"promo-section\" role=\"group\" aria-labelledby=\"promo-label\">\r\n\t<span id=\"promo-label\" class=\"sr-only\">Promo code entry</span>\r\n\t{#if !shouldExpand}\r\n\t\t<Button variant=\"link\" onclick={() => (isExpanded = true)}>\r\n\t\t\t{labels.havePromoCode || 'Have a promo code?'}\r\n\t\t</Button>\r\n\t{:else}\r\n\t\t<div\r\n\t\t\tclass=\"space-y-2\"\r\n\t\t\tstyle=\"animation: promoSlideIn {DURATION.normal}ms ease-out;\"\r\n\t\t>\r\n\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t<div class=\"promo-input-wrapper\" onkeydown={handleKeydown}>\r\n\t\t\t\t<div class=\"flex-1\">\r\n\t\t\t\t\t<Input\r\n\t\t\t\t\t\tlabel={labels.promoCode || 'Promo code'}\r\n\t\t\t\t\t\tplaceholder={labels.enterCode || 'Enter code'}\r\n\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\tbind:value={inputValue}\r\n\t\t\t\t\t\tdisabled={promoState.isApplied || promoState.isValidating}\r\n\t\t\t\t\t\terrorText={promoState.error || ''}\r\n\t\t\t\t\t\tcolor={promoState.error ? 'red' : 'base'}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t{#if promoState.isApplied}\r\n\t\t\t\t\t<Button variant=\"outline\" onclick={handleRemove} class=\"h-10 self-start mt-5\" aria-label={labels.removePromoCode || 'Remove promo code'}>\r\n\t\t\t\t\t\t{labels.remove || 'Remove'}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\tonclick={handleApply}\r\n\t\t\t\t\t\tdisabled={promoState.isValidating || !inputValue.trim()}\r\n\t\t\t\t\t\tclass=\"h-10 self-start mt-5\"\r\n\t\t\t\t\t\taria-label={promoState.isValidating ? (labels.checkingPromoCode || 'Checking promo code') : (labels.applyPromoCode || 'Apply promo code')}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{promoState.isValidating ? (labels.checking || 'Checking...') : (labels.apply || 'Apply')}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Success hint -->\r\n\t\t\t{#if promoState.hint}\r\n\t\t\t\t<p class=\"promo-message success body-sm\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t\t\t{promoState.hint}\r\n\t\t\t\t</p>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.promo-section {\r\n\t\tmargin-top: 1rem;\r\n\t}\r\n\r\n\t.promo-input-wrapper {\r\n\t\tdisplay: flex;\r\n\t\tgap: 0.5rem;\r\n\t\talign-items: flex-start;\r\n\t}\r\n\r\n\t.promo-message {\r\n\t\tmargin-top: 0.5rem;\r\n\t}\r\n\r\n\t.promo-message.success {\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t@keyframes promoSlideIn {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n</style>\r\n"],"names":["tick","style","ms","donationAmount","isRevealedByPromo","isDiscountedByPromo","discountedPrice","labels","$","$$props","isDonation","isSoldOut","isComingSoon","isSalesEnded","isDisabled","scarcityLevel","getScarcityLevel","scarcityText","getScarcityText","donationValue","donationError","isDonationValid","canDecrement","canIncrement","decrement","newQty","asTicketId","increment","donationInputValue","syncDonation","totalPrice","priceDisplay","formatCurrency","feeCaption","salesStartDisplay","formatSmartSalesDate","article","root","div","div_1","div_2","Heading","node","Badge","$$anchor","ScarcityBadge","$$render","consequent","consequent_1","consequent_3","consequent_4","Text","consequent_5","div_3","node_2","div_4","root_13","Input","node_4","$$value","discountedTotal","span","fragment_9","span_1","span_2","root_15","consequent_7","span_3","root_16","span_4","fragment_10","span_5","root_18","consequent_10","consequent_9","alternate","consequent_11","div_5","Button","node_9","Subtract","span_6","node_10","Add","consequent_12","alternate_1","classes","DURATION","isExpanded","inputValue","handleApply","trimmed","handleRemove","handleKeydown","e","shouldExpand","root_3","$2","$3","node_1","p","root_8","consequent_2"],"mappings":"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"}
1
+ {"version":3,"file":"PromoCodeInput-Z96Jxbqq.js","sources":["../src/lib/utils/haptic.ts","../src/lib/public-calendar-flow/TicketCard.svelte","../src/lib/public-calendar-flow/PromoCodeInput.svelte"],"sourcesContent":["/**\r\n * Haptic feedback helper.\r\n *\r\n * One call site for `navigator.vibrate` so consumers don't repeat the\r\n * SSR + capability check. Android browsers vibrate; iOS Safari silently\r\n * no-ops (Apple deliberate — they reserve haptics for native apps via\r\n * the Taptic Engine, no web API exposed). Future-proof: if Apple ever\r\n * ships a web haptic API, swap the impl here and every consumer gets it.\r\n *\r\n * Styles:\r\n * - 'light' (8ms) — UI tick on small interactions (ticket +/-, tap)\r\n * - 'medium' (18ms) — committed state change (drawer snap, month flip)\r\n * - 'heavy' (32ms) — destructive / important confirmations\r\n */\r\nexport function tick(style: 'light' | 'medium' | 'heavy' = 'light'): void {\r\n\tif (typeof window === 'undefined') return;\r\n\tif (typeof navigator === 'undefined' || !navigator.vibrate) return;\r\n\tconst ms = style === 'light' ? 8 : style === 'medium' ? 18 : 32;\r\n\tnavigator.vibrate(ms);\r\n}\r\n","<script lang=\"ts\">\r\n\timport { Add, Subtract } from 'carbon-icons-svelte';\r\n\timport { Badge, Button, Heading, Input, Text, asTicketId, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { TicketId, USD } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport { tick } from '$lib/utils/haptic';\r\n\timport type { TicketTypeData, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText,\r\n\t\tformatSmartSalesDate,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tticket: TicketTypeData;\r\n\t\tquantity: number;\r\n\t\tonQuantityChange: (ticketId: TicketId, quantity: number) => void;\r\n\t\tdonationAmount?: string;\r\n\t\tonDonationChange?: (ticketId: TicketId, amount: string) => void;\r\n\t\tisRevealedByPromo?: boolean;\r\n\t\tisDiscountedByPromo?: boolean;\r\n\t\tdiscountedPrice?: number | null;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tticket,\r\n\t\tquantity,\r\n\t\tonQuantityChange,\r\n\t\tdonationAmount = '',\r\n\t\tonDonationChange,\r\n\t\tisRevealedByPromo = false,\r\n\t\tisDiscountedByPromo = false,\r\n\t\tdiscountedPrice = null,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\t// --- State detection ---\r\n\tlet isDonation = $derived(ticket.isDonation || ticket.ticketType === 2);\r\n\tlet isSoldOut = $derived(ticket.status === 'sold_out' || ticket.quantityAvailable === 0);\r\n\tlet isComingSoon = $derived(ticket.status === 'coming_soon');\r\n\tlet isSalesEnded = $derived(ticket.status === 'sales_ended');\r\n\tlet isDisabled = $derived(isSoldOut || isComingSoon || isSalesEnded);\r\n\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(ticket.quantityAvailable, ticket.quantityTotal)\r\n\t);\r\n\tlet scarcityText = $derived(getScarcityText(scarcityLevel, ticket.quantityAvailable, 'ticket'));\r\n\r\n\t// Donation validation\r\n\tlet donationValue = $derived(parseFloat(donationAmount) || 0);\r\n\tlet donationError = $derived(\r\n\t\tisDonation && donationAmount !== '' && donationValue < 1 ? 'Minimum $1.00' : ''\r\n\t);\r\n\tlet isDonationValid = $derived(!isDonation || (donationAmount !== '' && donationValue >= 1));\r\n\r\n\tlet canDecrement = $derived(quantity > 0);\r\n\tlet canIncrement = $derived(\r\n\t\t!isDisabled &&\r\n\t\tquantity < ticket.maxPerOrder &&\r\n\t\tquantity < ticket.quantityAvailable &&\r\n\t\tisDonationValid\r\n\t);\r\n\r\n\tfunction decrement() {\r\n\t\tif (canDecrement) {\r\n\t\t\t// If decrementing would go below minimum, jump to 0 (remove from cart)\r\n\t\t\tconst newQty = quantity - 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty < ticket.minPerOrder ? 0 : newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction increment() {\r\n\t\tif (canIncrement) {\r\n\t\t\t// If at 0, jump to minimum purchase quantity\r\n\t\t\tconst newQty = quantity === 0 ? ticket.minPerOrder : quantity + 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tlet donationInputValue = $state(donationAmount);\r\n\r\n\t// Sync external donationAmount prop to local state\r\n\t$effect(() => {\r\n\t\tdonationInputValue = donationAmount;\r\n\t});\r\n\r\n\t// Push local changes upstream\r\n\tfunction syncDonation() {\r\n\t\tif (donationInputValue !== donationAmount) {\r\n\t\t\t// eslint-disable-next-line micdrop/boundary-only-as-cast -- API response mapper: ticket.id arrives as raw number from server\r\n\t\tonDonationChange?.(asTicketId(ticket.id), donationInputValue);\r\n\t\t}\r\n\t}\r\n\r\n\t// Price display — show total inclusive of fees (matching production TicketBlock.svelte)\r\n\tlet totalPrice = $derived(isDonation ? 0 : ticket.price + (ticket.price === 0 ? 0 : ticket.fee));\r\n\tlet priceDisplay = $derived(\r\n\t\tisDonation ? '' : ticket.price === 0 ? (labels.free || 'Free') : formatCurrency(totalPrice as USD)\r\n\t);\r\n\tlet feeCaption = $derived(\r\n\t\t!isDonation && ticket.fee > 0 && ticket.price > 0 ? `incl. ${formatCurrency(ticket.fee as USD)} ${labels.fee || 'fee'}` : ''\r\n\t);\r\n\r\n\t// Sales start display for coming soon tickets\r\n\tlet salesStartDisplay = $derived(\r\n\t\tisComingSoon && ticket.salesStartDate\r\n\t\t\t? `Sales start ${formatSmartSalesDate(ticket.salesStartDate)}`\r\n\t\t\t: isComingSoon\r\n\t\t\t\t? 'Coming soon'\r\n\t\t\t\t: ''\r\n\t);\r\n</script>\r\n\r\n<article\r\n\tclass=\"ticket-card rounded-lg border p-4 transition-all\"\r\n\tclass:disabled-ticket={isDisabled}\r\n\tclass:revealed={isRevealedByPromo && !isDisabled}\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t<div class=\"vc-flex-between-start gap-4\">\r\n\t\t<!-- Ticket info -->\r\n\t\t<div class=\"flex-1 min-w-0\">\r\n\t\t\t<div class=\"flex-row-2 flex-wrap\">\r\n\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\">\r\n\t\t\t\t\t{ticket.name}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{#if isSoldOut}\r\n\t\t\t\t\t<Badge variant=\"error\">{labels.soldOut || 'Sold out'}</Badge>\r\n\t\t\t\t{:else if isSalesEnded}\r\n\t\t\t\t\t<Badge variant=\"neutral\">Sales ended</Badge>\r\n\t\t\t\t{:else if isRevealedByPromo}\r\n\t\t\t\t\t<Badge variant=\"success\">Unlocked</Badge>\r\n\t\t\t\t{:else if isDiscountedByPromo}\r\n\t\t\t\t\t<Badge variant=\"green\">Discount applied</Badge>\r\n\t\t\t\t{:else if scarcityText && !isComingSoon}\r\n\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\tremaining={ticket.quantityAvailable}\r\n\t\t\t\t\t\ttotal={ticket.quantityTotal}\r\n\t\t\t\t\t\tcontext=\"ticket\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t{#if ticket.description}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1 line-clamp-2\">\r\n\t\t\t\t\t{ticket.description}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Price row -->\r\n\t\t\t<div class=\"flex-row-2 mt-2\">\r\n\t\t\t\t{#if isDonation}\r\n\t\t\t\t\t<!-- Donation: $ input -->\r\n\t\t\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t\t\t<div class=\"donation-input-wrapper\" oninput={syncDonation}>\r\n\t\t\t\t\t\t<Input\r\n\t\t\t\t\t\t\tlabel=\"Donation amount\"\r\n\t\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\tplaceholder=\"0.00\"\r\n\t\t\t\t\t\t\tbind:value={donationInputValue}\r\n\t\t\t\t\t\t\tdisabled={isDisabled}\r\n\t\t\t\t\t\t\terrorText={donationError}\r\n\t\t\t\t\t\t\tcolor={donationError ? 'red' : 'base'}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{:else if isDiscountedByPromo && discountedPrice !== null}\r\n\t\t\t\t\t<!-- Discounted: strikethrough original total + discounted total (both inclusive of fee) -->\r\n\t\t\t\t\t{@const discountedTotal = discountedPrice + (discountedPrice === 0 ? 0 : ticket.fee)}\r\n\t\t\t\t\t<span class=\"price-strikethrough\">{formatCurrency(totalPrice as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t<span class=\"price-discounted\">{formatCurrency(discountedTotal as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{:else if isComingSoon}\r\n\t\t\t\t\t<!-- Coming soon: show price dimmed -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-muted\">{priceDisplay}</span>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<!-- Standard price -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-primary\">{priceDisplay}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Coming soon / sales ended message -->\r\n\t\t\t{#if salesStartDisplay}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1.5\">\r\n\t\t\t\t\t{salesStartDisplay}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\r\n\t\t<!-- Quantity controls -->\r\n\t\t<div class=\"flex items-center quantity-selector\">\r\n\t\t\t{#if isSoldOut || isComingSoon || isSalesEnded}\r\n\t\t\t\t<!-- No controls for coming soon / sales ended -->\r\n\t\t\t{:else}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={decrement}\r\n\t\t\t\t\tdisabled={!canDecrement}\r\n\t\t\t\t\taria-label=\"{labels.decrease || 'Decrease'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Subtract size={16} />\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tclass=\"qty-display\"\r\n\t\t\t\t\taria-live=\"polite\"\r\n\t\t\t\t\taria-label=\"{ticket.name} {labels.quantity || 'quantity'}: {quantity}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{quantity}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={increment}\r\n\t\t\t\t\tdisabled={!canIncrement}\r\n\t\t\t\t\taria-label=\"{labels.increase || 'Increase'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Add size={16} />\r\n\t\t\t\t</Button>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* Card states using HSL CSS variables (matching TicketBlock.svelte) */\r\n\t.ticket-card {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 220 13% 91%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 0 0% 100%)));\r\n\t}\r\n\r\n\t.ticket-card.revealed {\r\n\t\tborder-color: hsl(var(--accent-success) / 50%);\r\n\t\tbackground-color: hsl(var(--accent-success) / 8%);\r\n\t}\r\n\r\n\t.ticket-card.disabled-ticket {\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t/* Quantity selector */\r\n\t.quantity-selector {\r\n\t\tgap: 0.5rem;\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t.qty-display {\r\n\t\tmin-width: 2rem;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 1.125rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--text-primary, 222 47% 11%));\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t/* Discounted price green text */\r\n\t.price-discounted {\r\n\t\tfont-size: 0.875rem;\r\n\t\tline-height: 1.25rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t/* Donation input wrapper */\r\n\t.donation-input-wrapper {\r\n\t\tmin-width: 10rem;\r\n\t}\r\n\r\n .ticket-card {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 215 19% 35%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 222 47% 11%)));\r\n\t }\r\n }\r\n\r\n .ticket-card.revealed {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--accent-success)); /* green-700 */\r\n\t\tbackground-color: hsl(var(--accent-success));\r\n\t }\r\n }\r\n\r\n .qty-display {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tcolor: hsl(var(--text-primary, 0 0% 100%));\r\n\t }\r\n }\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Input, Button } from '@getmicdrop/svelte-components';\r\n\timport type { PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tpromoState: PromoCodeState;\r\n\t\tonApply: (code: string) => void;\r\n\t\tonRemove: () => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { promoState, onApply, onRemove, labels = {}, }: Props = $props();\r\n\r\n\tlet isExpanded = $state(false);\r\n\tlet inputValue = $state('');\r\n\r\n\tfunction handleApply() {\r\n\t\tconst trimmed = inputValue.trim();\r\n\t\tif (!trimmed) return;\r\n\t\tonApply(trimmed);\r\n\t}\r\n\r\n\tfunction handleRemove() {\r\n\t\tinputValue = '';\r\n\t\tonRemove();\r\n\t}\r\n\r\n\tfunction handleKeydown(e: KeyboardEvent) {\r\n\t\tif (e.key === 'Enter') {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleApply();\r\n\t\t}\r\n\t}\r\n\r\n\t// Auto-expand when promo is applied (e.g. on restore)\r\n\tlet shouldExpand = $derived(promoState.isApplied || isExpanded);\r\n</script>\r\n\r\n<div class=\"promo-section\" role=\"group\" aria-labelledby=\"promo-label\">\r\n\t<span id=\"promo-label\" class=\"sr-only\">Promo code entry</span>\r\n\t{#if !shouldExpand}\r\n\t\t<Button variant=\"link\" onclick={() => (isExpanded = true)}>\r\n\t\t\t{labels.havePromoCode || 'Have a promo code?'}\r\n\t\t</Button>\r\n\t{:else}\r\n\t\t<div\r\n\t\t\tclass=\"space-y-2\"\r\n\t\t\tstyle=\"animation: promoSlideIn {DURATION.normal}ms ease-out;\"\r\n\t\t>\r\n\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t<div class=\"promo-input-wrapper\" onkeydown={handleKeydown}>\r\n\t\t\t\t<div class=\"flex-1\">\r\n\t\t\t\t\t<Input\r\n\t\t\t\t\t\tlabel={labels.promoCode || 'Promo code'}\r\n\t\t\t\t\t\tplaceholder={labels.enterCode || 'Enter code'}\r\n\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\tbind:value={inputValue}\r\n\t\t\t\t\t\tdisabled={promoState.isApplied || promoState.isValidating}\r\n\t\t\t\t\t\terrorText={promoState.error || ''}\r\n\t\t\t\t\t\tcolor={promoState.error ? 'red' : 'base'}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t{#if promoState.isApplied}\r\n\t\t\t\t\t<Button variant=\"outline\" onclick={handleRemove} class=\"h-10 self-start mt-5\" aria-label={labels.removePromoCode || 'Remove promo code'}>\r\n\t\t\t\t\t\t{labels.remove || 'Remove'}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\tonclick={handleApply}\r\n\t\t\t\t\t\tdisabled={promoState.isValidating || !inputValue.trim()}\r\n\t\t\t\t\t\tclass=\"h-10 self-start mt-5\"\r\n\t\t\t\t\t\taria-label={promoState.isValidating ? (labels.checkingPromoCode || 'Checking promo code') : (labels.applyPromoCode || 'Apply promo code')}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{promoState.isValidating ? (labels.checking || 'Checking...') : (labels.apply || 'Apply')}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Success hint -->\r\n\t\t\t{#if promoState.hint}\r\n\t\t\t\t<p class=\"promo-message success body-sm\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t\t\t{promoState.hint}\r\n\t\t\t\t</p>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.promo-section {\r\n\t\tmargin-top: 1rem;\r\n\t}\r\n\r\n\t.promo-input-wrapper {\r\n\t\tdisplay: flex;\r\n\t\tgap: 0.5rem;\r\n\t\talign-items: flex-start;\r\n\t}\r\n\r\n\t.promo-message {\r\n\t\tmargin-top: 0.5rem;\r\n\t}\r\n\r\n\t.promo-message.success {\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t@keyframes promoSlideIn {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n</style>\r\n"],"names":["tick","style","ms","donationAmount","isRevealedByPromo","isDiscountedByPromo","discountedPrice","labels","$","$$props","isDonation","isSoldOut","isComingSoon","isSalesEnded","isDisabled","scarcityLevel","getScarcityLevel","scarcityText","getScarcityText","donationValue","donationError","isDonationValid","canDecrement","canIncrement","decrement","newQty","asTicketId","increment","donationInputValue","syncDonation","totalPrice","priceDisplay","formatCurrency","feeCaption","salesStartDisplay","formatSmartSalesDate","article","root","div","div_1","div_2","Heading","node","Badge","$$anchor","ScarcityBadge","$$render","consequent","consequent_1","consequent_3","consequent_4","Text","consequent_5","div_3","node_2","div_4","root_13","Input","node_4","$$value","discountedTotal","span","fragment_9","span_1","span_2","root_15","consequent_7","span_3","root_16","span_4","fragment_10","span_5","root_18","consequent_10","consequent_9","alternate","consequent_11","div_5","Button","node_9","Subtract","span_6","node_10","Add","consequent_12","alternate_1","classes","DURATION","isExpanded","inputValue","handleApply","trimmed","handleRemove","handleKeydown","e","shouldExpand","root_3","$2","$3","node_1","p","root_8","consequent_2"],"mappings":"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"}
@@ -1,17 +1,17 @@
1
1
  import "svelte/internal/disclose-version";
2
2
  import * as e from "svelte/internal/client";
3
3
  import { g as E } from "./__SKIP_NAVIGATION__-CJ96TTPE.js";
4
- import { E as w } from "./Event-4yNODl4I.js";
5
- import { u as S } from "./VenueCalendar-BW3z2VPQ.js";
4
+ import { E as w } from "./Event-Rr8PlUUQ.js";
5
+ import { u as S } from "./VenueCalendar-D8NsQUaM.js";
6
6
  import "svelte/transition";
7
7
  import "svelte/easing";
8
- import { a as C } from "./transform-0OglVsGh.js";
8
+ import { a as C } from "./transform-XHY0K9GS.js";
9
9
  function R(f, a) {
10
10
  e.push(a, !0);
11
11
  const m = S("SeriesPage");
12
12
  let r = e.state(!1), i = e.state(null);
13
13
  typeof window < "u" && new URLSearchParams(window.location.search).get("legacy") === "1" && e.set(r, !0), e.user_effect(() => {
14
- e.get(r) && !e.get(i) && (m.warn("[VC] DEPRECATED: ?legacy=1 fallback for SeriesPage retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md."), import("./SeriesPage.legacy-C0RHliiv.js").then((t) => {
14
+ e.get(r) && !e.get(i) && (m.warn("[VC] DEPRECATED: ?legacy=1 fallback for SeriesPage retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md."), import("./SeriesPage.legacy-DmnH3x5t.js").then((t) => {
15
15
  e.set(i, t.default, !0);
16
16
  }).catch(() => {
17
17
  e.set(r, !1);
@@ -52,4 +52,4 @@ function R(f, a) {
52
52
  export {
53
53
  R as default
54
54
  };
55
- //# sourceMappingURL=SeriesPage-CQqB-ogK.js.map
55
+ //# sourceMappingURL=SeriesPage-OSFghrKu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SeriesPage-CQqB-ogK.js","sources":["../src/components/Views/SeriesPage.svelte"],"sourcesContent":["<script lang=\"ts\">\r\n\timport { goto } from '$app/navigation';\r\n\timport AirbnbSplitMain from '$lib/public-calendar-flow/Event.svelte';\r\n\timport { createLogger } from '@getmicdrop/svelte-components';\r\n\timport { transformSeriesPageData } from '$lib/public-calendar-flow/transform';\r\n\r\n\tconst logger = createLogger('SeriesPage');\r\n\r\n\t// --- Legacy fallback ---\r\n\t// RETIREMENT: 2026-08-13 — see docs/LEGACY_RETIREMENT.md.\r\n\tlet useLegacy = $state(false);\r\n\tlet LegacyComponent: any = $state(null);\r\n\r\n\tif (typeof window !== 'undefined') {\r\n\t\tconst params = new URLSearchParams(window.location.search);\r\n\t\tif (params.get('legacy') === '1') {\r\n\t\t\tuseLegacy = true;\r\n\t\t}\r\n\t}\r\n\r\n\t$effect(() => {\r\n\t\tif (useLegacy && !LegacyComponent) {\r\n\t\t\tlogger.warn(\r\n\t\t\t\t'[VC] DEPRECATED: ?legacy=1 fallback for SeriesPage retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md.'\r\n\t\t\t);\r\n\t\t\timport('./SeriesPage.legacy.svelte').then((m) => {\r\n\t\t\t\tLegacyComponent = m.default;\r\n\t\t\t}).catch(() => {\r\n\t\t\t\tuseLegacy = false;\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n\r\n\t// --- Props (matches old SeriesPage external interface) ---\r\n\tinterface Props {\r\n\t\tseries: any;\r\n\t\tonNavigateToOccurrence?: (id: number, slug: string, name?: string) => void;\r\n\t}\r\n\r\n\tlet {\r\n\t\tseries,\r\n\t\tonNavigateToOccurrence = undefined,\r\n\t}: Props = $props();\r\n\r\n\t// Transform series data to EventData for AirbnbSplitMain\r\n\tlet eventData = $derived(series ? transformSeriesPageData(series) : null);\r\n\r\n\t// Handle occurrence click — delegate to callback or navigate directly\r\n\tfunction handleShowtimeClick(occurrence: { id: number; slug: string }): void {\r\n\t\tif (onNavigateToOccurrence) {\r\n\t\t\tonNavigateToOccurrence(occurrence.id, occurrence.slug);\r\n\t\t} else {\r\n\t\t\t// @url-builder-escape: widget-internal route; SC's url-builders cover /a admin paths, not embedded calendar navigation.\r\n\t\t\tgoto(`/${occurrence.id}/${occurrence.slug}`);\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n{#if useLegacy && LegacyComponent}\r\n\t<svelte:component this={LegacyComponent}\r\n\t\t{series}\r\n\t\t{onNavigateToOccurrence}\r\n\t/>\r\n{:else if eventData}\r\n\t<AirbnbSplitMain\r\n\t\tevent={eventData}\r\n\t\tonShowtimeClick={handleShowtimeClick}\r\n\t/>\r\n{/if}\r\n\r\n"],"names":["logger","createLogger","useLegacy","$","LegacyComponent","m","onNavigateToOccurrence","eventData","$$props","transformSeriesPageData","handleShowtimeClick","occurrence","goto","$$anchor","$$component","AirbnbSplitMain","$$render","consequent","consequent_1"],"mappings":";;;;;;;;iBAAA;;QAMOA,IAASC,EAAa,YAAY;MAIpCC,IAAYC,EAAA,MAAO,EAAK,GACxBC,IAAuBD,EAAA,MAAO,IAAI;SAE3B,SAAW,WACF,gBAAgB,OAAO,SAAS,MAAM,EAC9C,IAAI,QAAQ,MAAM,OAC5BA,EAAA,IAAAD,GAAY,EAAI,GAIlBC,EAAA,kBAAc;UACTD,CAAS,KAAA,CAAAC,EAAA,IAAKC,CAAe,MAChCJ,EAAO,KACN,0GAA0G,GAEpG,OAAA,iCAA4B,EAAE,KAAI,CAAEK,MAAM;YAChDD,GAAkBC,EAAE,SAAO,EAAA;AAAA,IAC5B,CAAC,EAAE,MAAK,MAAO;AACd,MAAAF,EAAA,IAAAD,GAAY,EAAK;AAAA,IAClB,CAAC;AAAA,EAEH,CAAC;AAUA,MAAAI,2CAAyB,MAAS,GAI/BC,IAASJ,EAAA,QAAA,MAAAK,EAAA,SAAqBC,EAAuBD,EAAA,MAAA,IAAW,IAAI;WAG/DE,EAAoBC,GAAgD;AACxE,IAAAL,EAAsB,IACzBA,EAAsB,EAACK,EAAW,IAAIA,EAAW,IAAI,IAGrDC,MAASD,EAAW,EAAE,IAAIA,EAAW,IAAI,EAAA;AAAA,EAE3C;;;;;iCAIwBP,CAAe,GAAA,CAAAS,GAAAC,MAAA;;;;;;mBAErCR,EAAsB;AAAA;;;;AAGvBS,MAAAA,EAAeF,GAAA;AAAA;uBACRN,CAAS;AAAA;yBACCG;AAAA;;;YARdR,CAAS,KAAAC,EAAA,IAAIC,CAAe,IAAAY,EAAAC,CAAA,IAAAd,EAAA,IAKvBI,CAAS,KAAAS,EAAAE,GAAA,CAAA;AAAA;;;AAPX;"}
1
+ {"version":3,"file":"SeriesPage-OSFghrKu.js","sources":["../src/components/Views/SeriesPage.svelte"],"sourcesContent":["<script lang=\"ts\">\r\n\timport { goto } from '$app/navigation';\r\n\timport AirbnbSplitMain from '$lib/public-calendar-flow/Event.svelte';\r\n\timport { createLogger } from '@getmicdrop/svelte-components';\r\n\timport { transformSeriesPageData } from '$lib/public-calendar-flow/transform';\r\n\r\n\tconst logger = createLogger('SeriesPage');\r\n\r\n\t// --- Legacy fallback ---\r\n\t// RETIREMENT: 2026-08-13 — see docs/LEGACY_RETIREMENT.md.\r\n\tlet useLegacy = $state(false);\r\n\tlet LegacyComponent: any = $state(null);\r\n\r\n\tif (typeof window !== 'undefined') {\r\n\t\tconst params = new URLSearchParams(window.location.search);\r\n\t\tif (params.get('legacy') === '1') {\r\n\t\t\tuseLegacy = true;\r\n\t\t}\r\n\t}\r\n\r\n\t$effect(() => {\r\n\t\tif (useLegacy && !LegacyComponent) {\r\n\t\t\tlogger.warn(\r\n\t\t\t\t'[VC] DEPRECATED: ?legacy=1 fallback for SeriesPage retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md.'\r\n\t\t\t);\r\n\t\t\timport('./SeriesPage.legacy.svelte').then((m) => {\r\n\t\t\t\tLegacyComponent = m.default;\r\n\t\t\t}).catch(() => {\r\n\t\t\t\tuseLegacy = false;\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n\r\n\t// --- Props (matches old SeriesPage external interface) ---\r\n\tinterface Props {\r\n\t\tseries: any;\r\n\t\tonNavigateToOccurrence?: (id: number, slug: string, name?: string) => void;\r\n\t}\r\n\r\n\tlet {\r\n\t\tseries,\r\n\t\tonNavigateToOccurrence = undefined,\r\n\t}: Props = $props();\r\n\r\n\t// Transform series data to EventData for AirbnbSplitMain\r\n\tlet eventData = $derived(series ? transformSeriesPageData(series) : null);\r\n\r\n\t// Handle occurrence click — delegate to callback or navigate directly\r\n\tfunction handleShowtimeClick(occurrence: { id: number; slug: string }): void {\r\n\t\tif (onNavigateToOccurrence) {\r\n\t\t\tonNavigateToOccurrence(occurrence.id, occurrence.slug);\r\n\t\t} else {\r\n\t\t\t// @url-builder-escape: widget-internal route; SC's url-builders cover /a admin paths, not embedded calendar navigation.\r\n\t\t\tgoto(`/${occurrence.id}/${occurrence.slug}`);\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n{#if useLegacy && LegacyComponent}\r\n\t<svelte:component this={LegacyComponent}\r\n\t\t{series}\r\n\t\t{onNavigateToOccurrence}\r\n\t/>\r\n{:else if eventData}\r\n\t<AirbnbSplitMain\r\n\t\tevent={eventData}\r\n\t\tonShowtimeClick={handleShowtimeClick}\r\n\t/>\r\n{/if}\r\n\r\n"],"names":["logger","createLogger","useLegacy","$","LegacyComponent","m","onNavigateToOccurrence","eventData","$$props","transformSeriesPageData","handleShowtimeClick","occurrence","goto","$$anchor","$$component","AirbnbSplitMain","$$render","consequent","consequent_1"],"mappings":";;;;;;;;iBAAA;;QAMOA,IAASC,EAAa,YAAY;MAIpCC,IAAYC,EAAA,MAAO,EAAK,GACxBC,IAAuBD,EAAA,MAAO,IAAI;SAE3B,SAAW,WACF,gBAAgB,OAAO,SAAS,MAAM,EAC9C,IAAI,QAAQ,MAAM,OAC5BA,EAAA,IAAAD,GAAY,EAAI,GAIlBC,EAAA,kBAAc;UACTD,CAAS,KAAA,CAAAC,EAAA,IAAKC,CAAe,MAChCJ,EAAO,KACN,0GAA0G,GAEpG,OAAA,iCAA4B,EAAE,KAAI,CAAEK,MAAM;YAChDD,GAAkBC,EAAE,SAAO,EAAA;AAAA,IAC5B,CAAC,EAAE,MAAK,MAAO;AACd,MAAAF,EAAA,IAAAD,GAAY,EAAK;AAAA,IAClB,CAAC;AAAA,EAEH,CAAC;AAUA,MAAAI,2CAAyB,MAAS,GAI/BC,IAASJ,EAAA,QAAA,MAAAK,EAAA,SAAqBC,EAAuBD,EAAA,MAAA,IAAW,IAAI;WAG/DE,EAAoBC,GAAgD;AACxE,IAAAL,EAAsB,IACzBA,EAAsB,EAACK,EAAW,IAAIA,EAAW,IAAI,IAGrDC,MAASD,EAAW,EAAE,IAAIA,EAAW,IAAI,EAAA;AAAA,EAE3C;;;;;iCAIwBP,CAAe,GAAA,CAAAS,GAAAC,MAAA;;;;;;mBAErCR,EAAsB;AAAA;;;;AAGvBS,MAAAA,EAAeF,GAAA;AAAA;uBACRN,CAAS;AAAA;yBACCG;AAAA;;;YARdR,CAAS,KAAAC,EAAA,IAAIC,CAAe,IAAAY,EAAAC,CAAA,IAAAd,EAAA,IAKvBI,CAAS,KAAAS,EAAAE,GAAA,CAAA;AAAA;;;AAPX;"}
@@ -1,6 +1,6 @@
1
1
  import "svelte/internal/disclose-version";
2
2
  import * as e from "svelte/internal/client";
3
- import { aT as ue, s as J, P as pe, b1 as K, b2 as be, ae as xe } from "./VenueCalendar-BW3z2VPQ.js";
3
+ import { aT as ue, s as J, P as pe, b1 as K, b2 as be, ae as xe } from "./VenueCalendar-D8NsQUaM.js";
4
4
  import "svelte/transition";
5
5
  import "svelte/easing";
6
6
  var Ne = e.from_html('<span class="venue-separator svelte-4y42r2">&#183;</span> <span class="venue-location svelte-4y42r2"> </span>', 1), qe = e.from_html('<p class="series-summary svelte-4y42r2"> </p>'), Te = e.from_html('<div class="series-description svelte-4y42r2"> </div>'), ke = e.from_html('<div class="empty-dates svelte-4y42r2"><p class="empty-text svelte-4y42r2">No upcoming dates scheduled at this time.</p> <p class="empty-subtext svelte-4y42r2">Check back soon for new announcements.</p></div>'), De = e.from_html('<div class="occurrence-card svelte-4y42r2"><div class="occurrence-info svelte-4y42r2"><div class="occurrence-date svelte-4y42r2"> </div> <div class="occurrence-time svelte-4y42r2"> </div></div> <div class="occurrence-action svelte-4y42r2"><button> </button></div></div>'), Se = e.from_html('<div class="dates-list svelte-4y42r2"></div>'), Ie = e.from_html('<img class="performer-image svelte-4y42r2"/>'), Ae = e.from_html('<div class="performer-placeholder svelte-4y42r2"><svg class="placeholder-icon svelte-4y42r2" fill="currentColor" viewBox="0 0 24 24"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" class="svelte-4y42r2"></path></svg></div>'), Ce = e.from_html('<div class="performer-card svelte-4y42r2"><div class="performer-avatar svelte-4y42r2"><!></div> <h3 class="performer-name svelte-4y42r2"> </h3></div>'), Le = e.from_html('<section class="section svelte-4y42r2"><h2 class="section-heading svelte-4y42r2">Performers</h2> <div class="performers-grid svelte-4y42r2"></div></section>'), we = e.from_html('<div class="faq-item svelte-4y42r2"><p class="faq-question svelte-4y42r2"> </p> <p class="faq-answer svelte-4y42r2"> </p></div>'), ze = e.from_html('<p class="svelte-4y42r2"> </p>'), Ee = e.from_html('<div class="sidebar-section svelte-4y42r2"><h3 class="sidebar-heading svelte-4y42r2">FAQ</h3> <div class="faq-content svelte-4y42r2"><!></div></div>'), Oe = e.from_html('<div class="sidebar-section svelte-4y42r2"><h3 class="sidebar-heading svelte-4y42r2">Important Info</h3> <div class="disclaimer-text svelte-4y42r2"> </div></div>'), Pe = e.from_html('<div class="sidebar-card svelte-4y42r2"><!> <!></div>'), Ze = e.from_html('<div class="series-page svelte-4y42r2"><div class="hero svelte-4y42r2"><div></div> <img class="hero-image svelte-4y42r2"/> <div class="hero-overlay svelte-4y42r2"><div class="hero-content svelte-4y42r2"><span class="series-badge svelte-4y42r2">Recurring Event</span> <h1 class="series-title svelte-4y42r2"> </h1> <div class="series-venue svelte-4y42r2"><span class="svelte-4y42r2"> </span> <!></div></div></div></div> <div class="content-grid svelte-4y42r2"><div class="main-column svelte-4y42r2"><section class="section svelte-4y42r2"><h2 class="section-heading svelte-4y42r2">About this Series</h2> <!> <!></section> <section class="section svelte-4y42r2"><div class="dates-header svelte-4y42r2"><h2 class="section-heading svelte-4y42r2">Upcoming Dates</h2> <span class="dates-count svelte-4y42r2"> </span></div> <!></section> <!></div> <div class="sidebar svelte-4y42r2"><div class="sidebar-sticky svelte-4y42r2"><!></div></div></div></div>');
@@ -191,4 +191,4 @@ e.delegate(["click"]);
191
191
  export {
192
192
  Ue as default
193
193
  };
194
- //# sourceMappingURL=SeriesPage.legacy-C0RHliiv.js.map
194
+ //# sourceMappingURL=SeriesPage.legacy-DmnH3x5t.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SeriesPage.legacy-C0RHliiv.js","sources":["../src/components/Views/SeriesPage.legacy.svelte"],"sourcesContent":["<script>\r\n // @ts-nocheck legacy fallback (legacy=1 path), slated for deletion after VC finalization — not type-maintained\r\n import { getImageUrl } from '$lib/utils/utils.js';\r\n import { formatDate as scFormatDate,\r\n formatTime as scFormatTime, getDefaultTimezone, formatFullName } from '@getmicdrop/svelte-components';\r\n import { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n\r\n let { series, onNavigateToOccurrence } = $props();\r\n\r\n let imageLoaded = $state(false);\r\n\r\n let seriesImage = $derived(\r\n series?.image ? getImageUrl(series.image) : PLACEHOLDER_IMAGE\r\n );\r\n\r\n let tz = $derived(series?.timeZone || getDefaultTimezone());\r\n\r\n function formatDate(iso) {\r\n return scFormatDate(iso, { timeZone: tz });\r\n }\r\n\r\n function formatTime(iso) {\r\n return scFormatTime(iso, { timeZone: tz });\r\n }\r\n\r\n function handleOccurrenceClick(occurrence) {\r\n if (!occurrence.ctaState?.disabled && onNavigateToOccurrence) {\r\n onNavigateToOccurrence(\r\n occurrence.id,\r\n occurrence.slug || '',\r\n occurrence.name || ''\r\n );\r\n }\r\n }\r\n</script>\r\n\r\n{#if series}\r\n <div class=\"series-page\">\r\n <!-- Hero Image -->\r\n <div class=\"hero\">\r\n <div class=\"hero-skeleton\" class:hidden={imageLoaded}></div>\r\n <img\r\n src={seriesImage}\r\n alt={series.title}\r\n class=\"hero-image\"\r\n onload={() => (imageLoaded = true)}\r\n />\r\n <div class=\"hero-overlay\">\r\n <div class=\"hero-content\">\r\n <span class=\"series-badge\">Recurring Event</span>\r\n <h1 class=\"series-title\">{series.title}</h1>\r\n <div class=\"series-venue\">\r\n <span>{series.venue?.name}</span>\r\n {#if series.venue?.googleLocationNameCache}\r\n <span class=\"venue-separator\">&#183;</span>\r\n <span class=\"venue-location\"\r\n >{series.venue.googleLocationNameCache}</span\r\n >\r\n {/if}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Content Grid -->\r\n <div class=\"content-grid\">\r\n <!-- Main Column -->\r\n <div class=\"main-column\">\r\n <!-- About Section -->\r\n <section class=\"section\">\r\n <h2 class=\"section-heading\">About this Series</h2>\r\n {#if series.eventSummary}\r\n <p class=\"series-summary\">{series.eventSummary}</p>\r\n {/if}\r\n {#if series.description}\r\n <div class=\"series-description\">{series.description}</div>\r\n {/if}\r\n </section>\r\n\r\n <!-- Upcoming Dates -->\r\n <section class=\"section\">\r\n <div class=\"dates-header\">\r\n <h2 class=\"section-heading\">Upcoming Dates</h2>\r\n <span class=\"dates-count\"\r\n >{series.occurrences?.length || 0} events</span\r\n >\r\n </div>\r\n\r\n {#if !series.occurrences?.length}\r\n <div class=\"empty-dates\">\r\n <p class=\"empty-text\">\r\n No upcoming dates scheduled at this time.\r\n </p>\r\n <p class=\"empty-subtext\">\r\n Check back soon for new announcements.\r\n </p>\r\n </div>\r\n {:else}\r\n <div class=\"dates-list\">\r\n {#each series.occurrences as occurrence}\r\n <div class=\"occurrence-card\">\r\n <div class=\"occurrence-info\">\r\n <div class=\"occurrence-date\">\r\n {formatDate(occurrence.startDateTime)}\r\n </div>\r\n <div class=\"occurrence-time\">\r\n {formatTime(occurrence.startDateTime)} - {formatTime(\r\n occurrence.endDateTime\r\n )}\r\n </div>\r\n </div>\r\n <div class=\"occurrence-action\">\r\n <button\r\n class=\"cta-button\"\r\n class:cta-disabled={occurrence.ctaState?.disabled}\r\n disabled={occurrence.ctaState?.disabled}\r\n onclick={() => handleOccurrenceClick(occurrence)}\r\n >\r\n {occurrence.ctaState?.text || 'Get tickets'}\r\n </button>\r\n </div>\r\n </div>\r\n {/each}\r\n </div>\r\n {/if}\r\n </section>\r\n\r\n <!-- Performers -->\r\n {#if series.performers?.length}\r\n <section class=\"section\">\r\n <h2 class=\"section-heading\">Performers</h2>\r\n <div class=\"performers-grid\">\r\n {#each series.performers as performer}\r\n <div class=\"performer-card\">\r\n <div class=\"performer-avatar\">\r\n {#if performer.profileImage}\r\n <img\r\n src={getImageUrl(performer.profileImage)}\r\n alt={performer.displayName ||\r\n formatFullName(performer.firstName, performer.lastName)}\r\n class=\"performer-image\"\r\n />\r\n {:else}\r\n <div class=\"performer-placeholder\">\r\n <svg\r\n class=\"placeholder-icon\"\r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"\r\n />\r\n </svg>\r\n </div>\r\n {/if}\r\n </div>\r\n <h3 class=\"performer-name\">\r\n {performer.displayName ||\r\n formatFullName(performer.firstName, performer.lastName)}\r\n </h3>\r\n </div>\r\n {/each}\r\n </div>\r\n </section>\r\n {/if}\r\n </div>\r\n\r\n <!-- Sidebar -->\r\n <div class=\"sidebar\">\r\n <div class=\"sidebar-sticky\">\r\n {#if series.venue?.faq || series.venue?.disclaimer}\r\n <div class=\"sidebar-card\">\r\n {#if series.venue.faq}\r\n <div class=\"sidebar-section\">\r\n <h3 class=\"sidebar-heading\">FAQ</h3>\r\n <div class=\"faq-content\">\r\n {#if Array.isArray(series.venue.faq)}\r\n {#each series.venue.faq as item}\r\n <div class=\"faq-item\">\r\n <p class=\"faq-question\">{item.question}</p>\r\n <p class=\"faq-answer\">{item.answer}</p>\r\n </div>\r\n {/each}\r\n {:else}\r\n <p>{series.venue.faq}</p>\r\n {/if}\r\n </div>\r\n </div>\r\n {/if}\r\n\r\n {#if series.venue.disclaimer}\r\n <div class=\"sidebar-section\">\r\n <h3 class=\"sidebar-heading\">Important Info</h3>\r\n <div class=\"disclaimer-text\">{series.venue.disclaimer}</div>\r\n </div>\r\n {/if}\r\n </div>\r\n {/if}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n{/if}\r\n\r\n<style>\r\n .series-page {\r\n min-height: 100vh;\r\n padding-bottom: 5rem;\r\n background: hsl(var(--surface-primary, 0 0% 100%));\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n /* Hero */\r\n .hero {\r\n position: relative;\r\n width: 100%;\r\n overflow: hidden;\r\n height: 500px;\r\n }\r\n\r\n @media (width <= 768px) {\r\n .hero {\r\n height: 256px;\r\n }\r\n }\r\n\r\n .hero-skeleton {\r\n position: absolute;\r\n inset: 0;\r\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n }\r\n\r\n @keyframes pulse {\r\n 0%,\r\n 100% {\r\n opacity: 1;\r\n }\r\n\r\n 50% {\r\n opacity: 0.5;\r\n }\r\n }\r\n\r\n .hero-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n transition: transform 0.7s ease;\r\n }\r\n\r\n .hero:hover .hero-image {\r\n transform: scale(1.05);\r\n }\r\n\r\n .hero-overlay {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n padding: 1.5rem;\r\n background: linear-gradient(\r\n to top,\r\n color-mix(in srgb, black 90%, transparent),\r\n color-mix(in srgb, black 50%, transparent),\r\n transparent\r\n );\r\n }\r\n\r\n @media (width >= 768px) {\r\n .hero-overlay {\r\n padding: 3rem;\r\n }\r\n }\r\n\r\n .hero-content {\r\n max-width: 64rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n width: 100%;\r\n }\r\n\r\n .series-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 0.25rem 0.75rem;\r\n margin-bottom: 1rem;\r\n font-size: 0.75rem;\r\n line-height: 1rem;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n border-radius: 9999px;\r\n box-shadow:\r\n 0 10px 15px -3px rgb(0 0 0 / 10%),\r\n 0 4px 6px -4px rgb(0 0 0 / 10%);\r\n background: hsl(var(--brand-primary, 224 76% 48%));\r\n color: hsl(var(--text-on-primary, 0 0% 100%));\r\n }\r\n\r\n .series-title {\r\n font-size: 2.25rem;\r\n line-height: 1.1;\r\n font-weight: 700;\r\n margin-bottom: 0.75rem;\r\n letter-spacing: -0.025em;\r\n color: hsl(var(--bg-primary));\r\n text-shadow: 0 2px 8px color-mix(in srgb, black 30%, transparent);\r\n }\r\n\r\n @media (width >= 768px) {\r\n .series-title {\r\n font-size: 3.75rem;\r\n line-height: 1;\r\n }\r\n }\r\n\r\n .series-venue {\r\n font-size: 1.125rem;\r\n line-height: 1.75rem;\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 0.5rem;\r\n font-weight: 500;\r\n color: color-mix(in srgb, white 90%, transparent);\r\n }\r\n\r\n @media (width >= 768px) {\r\n .series-venue {\r\n font-size: 1.25rem;\r\n line-height: 1.75rem;\r\n }\r\n }\r\n\r\n .venue-separator {\r\n display: none;\r\n opacity: 0.6;\r\n }\r\n\r\n @media (width >= 768px) {\r\n .venue-separator {\r\n display: inline;\r\n }\r\n }\r\n\r\n .venue-location {\r\n opacity: 0.75;\r\n }\r\n\r\n /* Content Grid */\r\n .content-grid {\r\n max-width: 64rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n padding: 3rem 1.5rem;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n gap: 3rem;\r\n }\r\n\r\n @media (width >= 768px) {\r\n .content-grid {\r\n padding-top: 5rem;\r\n padding-bottom: 5rem;\r\n }\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .content-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n }\r\n }\r\n\r\n .main-column {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4rem;\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .main-column {\r\n grid-column: span 2 / span 2;\r\n }\r\n }\r\n\r\n .section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1.5rem;\r\n }\r\n\r\n .section-heading {\r\n font-size: 1.875rem;\r\n line-height: 2.25rem;\r\n font-weight: 700;\r\n letter-spacing: -0.025em;\r\n padding-bottom: 1rem;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n border-bottom: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n\r\n .series-summary {\r\n font-size: 1.25rem;\r\n font-weight: 500;\r\n line-height: 1.625;\r\n color: hsl(var(--text-primary, 0 0% 20%));\r\n }\r\n\r\n .series-description {\r\n max-width: none;\r\n white-space: pre-line;\r\n line-height: 1.625;\r\n color: hsl(var(--text-secondary, 0 0% 40%));\r\n }\r\n\r\n /* Upcoming Dates */\r\n .dates-header {\r\n display: flex;\r\n align-items: baseline;\r\n justify-content: space-between;\r\n padding-bottom: 1rem;\r\n border-bottom: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n\r\n .dates-count {\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 500;\r\n color: hsl(var(--text-secondary, 0 0% 45%));\r\n }\r\n\r\n .empty-dates {\r\n padding: 3rem;\r\n border-radius: 1rem;\r\n text-align: center;\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n border: 2px dashed hsl(var(--stroke-secondary, 0 0% 85%));\r\n }\r\n\r\n .empty-text {\r\n font-size: 1.125rem;\r\n line-height: 1.75rem;\r\n font-weight: 500;\r\n color: hsl(var(--text-secondary, 0 0% 45%));\r\n }\r\n\r\n .empty-subtext {\r\n margin-top: 0.5rem;\r\n color: hsl(var(--text-secondary, 0 0% 55%));\r\n }\r\n\r\n .dates-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1rem;\r\n }\r\n\r\n .occurrence-card {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n padding: 1.5rem;\r\n border-radius: 1rem;\r\n transition: all 0.2s;\r\n background: hsl(var(--surface-primary, 0 0% 100%));\r\n border: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n\r\n @media (width >= 640px) {\r\n .occurrence-card {\r\n flex-direction: row;\r\n align-items: center;\r\n }\r\n }\r\n\r\n .occurrence-card:hover {\r\n border-color: hsl(var(--brand-primary, 224 76% 48%));\r\n box-shadow: 0 4px 12px color-mix(in srgb, black 8%, transparent);\r\n }\r\n\r\n .occurrence-info {\r\n margin-bottom: 1rem;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .occurrence-info {\r\n margin-bottom: 0;\r\n }\r\n }\r\n\r\n .occurrence-date {\r\n font-size: 1.25rem;\r\n line-height: 1.75rem;\r\n font-weight: 700;\r\n margin-bottom: 0.25rem;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n .occurrence-time {\r\n font-weight: 500;\r\n color: hsl(var(--text-secondary, 0 0% 45%));\r\n }\r\n\r\n .occurrence-action {\r\n padding-left: 0;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .occurrence-action {\r\n padding-left: 1.5rem;\r\n }\r\n }\r\n\r\n .cta-button {\r\n width: 100%;\r\n padding: 0.75rem 1.5rem;\r\n border-radius: 0.5rem;\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 600;\r\n transition: transform 0.15s;\r\n background: hsl(var(--brand-primary, 224 76% 48%));\r\n color: hsl(var(--text-on-primary, 0 0% 100%));\r\n }\r\n\r\n @media (width >= 640px) {\r\n .cta-button {\r\n width: auto;\r\n }\r\n }\r\n\r\n .cta-button:hover:not(:disabled) {\r\n transform: scale(1.05);\r\n }\r\n\r\n .cta-disabled {\r\n cursor: not-allowed;\r\n background: hsl(var(--surface-secondary, 0 0% 90%));\r\n color: hsl(var(--text-secondary, 0 0% 55%));\r\n }\r\n\r\n /* Performers */\r\n .performers-grid {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: 2rem;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .performers-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n }\r\n }\r\n\r\n .performer-card {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n padding: 1rem;\r\n border-radius: 0.75rem;\r\n transition: background-color 0.15s;\r\n }\r\n\r\n .performer-card:hover {\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n }\r\n\r\n .performer-avatar {\r\n width: 7rem;\r\n height: 7rem;\r\n margin-bottom: 1rem;\r\n border-radius: 9999px;\r\n overflow: hidden;\r\n box-shadow:\r\n 0 4px 6px -1px rgb(0 0 0 / 10%),\r\n 0 2px 4px -2px rgb(0 0 0 / 10%);\r\n background: hsl(var(--surface-secondary, 0 0% 92%));\r\n }\r\n\r\n .performer-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n transition: transform 0.5s ease;\r\n }\r\n\r\n .performer-card:hover .performer-image {\r\n transform: scale(1.1);\r\n }\r\n\r\n .performer-placeholder {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: hsl(var(--text-secondary, 0 0% 60%));\r\n }\r\n\r\n .placeholder-icon {\r\n width: 3rem;\r\n height: 3rem;\r\n opacity: 0.5;\r\n }\r\n\r\n .performer-name {\r\n font-size: 1.125rem;\r\n line-height: 1.75rem;\r\n font-weight: 600;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n /* Sidebar */\r\n .sidebar {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2rem;\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .sidebar {\r\n grid-column: span 1 / span 1;\r\n }\r\n }\r\n\r\n .sidebar-sticky {\r\n position: sticky;\r\n top: 6rem;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2rem;\r\n }\r\n\r\n .sidebar-card {\r\n border-radius: 1rem;\r\n padding: 2rem;\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n border: 1px solid hsl(var(--stroke-secondary, 0 0% 92%));\r\n }\r\n\r\n .sidebar-section {\r\n margin-bottom: 2rem;\r\n }\r\n\r\n .sidebar-section:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .sidebar-heading {\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.1em;\r\n margin-bottom: 1rem;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n .faq-content {\r\n color: hsl(var(--text-secondary, 0 0% 40%));\r\n }\r\n\r\n .faq-item {\r\n margin-bottom: 0.75rem;\r\n }\r\n\r\n .faq-question {\r\n font-weight: 700;\r\n color: hsl(var(--text-primary, 0 0% 20%));\r\n }\r\n\r\n .faq-answer {\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n }\r\n\r\n .disclaimer-text {\r\n font-size: 0.875rem;\r\n line-height: 1.625;\r\n padding: 1rem;\r\n border-radius: 0.5rem;\r\n background: hsl(var(--surface-primary, 0 0% 100%));\r\n color: hsl(var(--text-secondary, 0 0% 40%));\r\n border: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n</style>\r\n"],"names":["imageLoaded","$","seriesImage","getImageUrl","$$props","PLACEHOLDER_IMAGE","tz","getDefaultTimezone","formatDate","iso","scFormatDate","formatTime","scFormatTime","handleOccurrenceClick","occurrence","div","root_1","div_1","div_2","img","div_3","div_4","h1","div_5","span","span_1","fragment_1","text_2","$$render","consequent","div_6","div_7","section","p","root_3","consequent_1","div_8","root_4","consequent_2","section_1","div_9","span_2","div_10","root_5","div_11","root_6","$$anchor","div_12","root_7","div_13","div_14","div_15","div_16","button","classes_1","text_8","alternate","consequent_3","section_2","root_8","div_17","performer","div_18","root_9","div_19","img_1","root_10","$0","$1","formatFullName","div_20","root_11","consequent_4","alternate_1","h3","consequent_5","div_21","div_22","div_23","root_12","div_24","root_13","div_25","item","div_26","root_15","p_1","p_2","text_10","text_11","d","p_3","root_16","text_12","consequent_7","div_27","root_17","div_28","text_13","consequent_8","consequent_9","classes","text_1"],"mappings":"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"}
1
+ {"version":3,"file":"SeriesPage.legacy-DmnH3x5t.js","sources":["../src/components/Views/SeriesPage.legacy.svelte"],"sourcesContent":["<script>\r\n // @ts-nocheck legacy fallback (legacy=1 path), slated for deletion after VC finalization — not type-maintained\r\n import { getImageUrl } from '$lib/utils/utils.js';\r\n import { formatDate as scFormatDate,\r\n formatTime as scFormatTime, getDefaultTimezone, formatFullName } from '@getmicdrop/svelte-components';\r\n import { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n\r\n let { series, onNavigateToOccurrence } = $props();\r\n\r\n let imageLoaded = $state(false);\r\n\r\n let seriesImage = $derived(\r\n series?.image ? getImageUrl(series.image) : PLACEHOLDER_IMAGE\r\n );\r\n\r\n let tz = $derived(series?.timeZone || getDefaultTimezone());\r\n\r\n function formatDate(iso) {\r\n return scFormatDate(iso, { timeZone: tz });\r\n }\r\n\r\n function formatTime(iso) {\r\n return scFormatTime(iso, { timeZone: tz });\r\n }\r\n\r\n function handleOccurrenceClick(occurrence) {\r\n if (!occurrence.ctaState?.disabled && onNavigateToOccurrence) {\r\n onNavigateToOccurrence(\r\n occurrence.id,\r\n occurrence.slug || '',\r\n occurrence.name || ''\r\n );\r\n }\r\n }\r\n</script>\r\n\r\n{#if series}\r\n <div class=\"series-page\">\r\n <!-- Hero Image -->\r\n <div class=\"hero\">\r\n <div class=\"hero-skeleton\" class:hidden={imageLoaded}></div>\r\n <img\r\n src={seriesImage}\r\n alt={series.title}\r\n class=\"hero-image\"\r\n onload={() => (imageLoaded = true)}\r\n />\r\n <div class=\"hero-overlay\">\r\n <div class=\"hero-content\">\r\n <span class=\"series-badge\">Recurring Event</span>\r\n <h1 class=\"series-title\">{series.title}</h1>\r\n <div class=\"series-venue\">\r\n <span>{series.venue?.name}</span>\r\n {#if series.venue?.googleLocationNameCache}\r\n <span class=\"venue-separator\">&#183;</span>\r\n <span class=\"venue-location\"\r\n >{series.venue.googleLocationNameCache}</span\r\n >\r\n {/if}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Content Grid -->\r\n <div class=\"content-grid\">\r\n <!-- Main Column -->\r\n <div class=\"main-column\">\r\n <!-- About Section -->\r\n <section class=\"section\">\r\n <h2 class=\"section-heading\">About this Series</h2>\r\n {#if series.eventSummary}\r\n <p class=\"series-summary\">{series.eventSummary}</p>\r\n {/if}\r\n {#if series.description}\r\n <div class=\"series-description\">{series.description}</div>\r\n {/if}\r\n </section>\r\n\r\n <!-- Upcoming Dates -->\r\n <section class=\"section\">\r\n <div class=\"dates-header\">\r\n <h2 class=\"section-heading\">Upcoming Dates</h2>\r\n <span class=\"dates-count\"\r\n >{series.occurrences?.length || 0} events</span\r\n >\r\n </div>\r\n\r\n {#if !series.occurrences?.length}\r\n <div class=\"empty-dates\">\r\n <p class=\"empty-text\">\r\n No upcoming dates scheduled at this time.\r\n </p>\r\n <p class=\"empty-subtext\">\r\n Check back soon for new announcements.\r\n </p>\r\n </div>\r\n {:else}\r\n <div class=\"dates-list\">\r\n {#each series.occurrences as occurrence}\r\n <div class=\"occurrence-card\">\r\n <div class=\"occurrence-info\">\r\n <div class=\"occurrence-date\">\r\n {formatDate(occurrence.startDateTime)}\r\n </div>\r\n <div class=\"occurrence-time\">\r\n {formatTime(occurrence.startDateTime)} - {formatTime(\r\n occurrence.endDateTime\r\n )}\r\n </div>\r\n </div>\r\n <div class=\"occurrence-action\">\r\n <button\r\n class=\"cta-button\"\r\n class:cta-disabled={occurrence.ctaState?.disabled}\r\n disabled={occurrence.ctaState?.disabled}\r\n onclick={() => handleOccurrenceClick(occurrence)}\r\n >\r\n {occurrence.ctaState?.text || 'Get tickets'}\r\n </button>\r\n </div>\r\n </div>\r\n {/each}\r\n </div>\r\n {/if}\r\n </section>\r\n\r\n <!-- Performers -->\r\n {#if series.performers?.length}\r\n <section class=\"section\">\r\n <h2 class=\"section-heading\">Performers</h2>\r\n <div class=\"performers-grid\">\r\n {#each series.performers as performer}\r\n <div class=\"performer-card\">\r\n <div class=\"performer-avatar\">\r\n {#if performer.profileImage}\r\n <img\r\n src={getImageUrl(performer.profileImage)}\r\n alt={performer.displayName ||\r\n formatFullName(performer.firstName, performer.lastName)}\r\n class=\"performer-image\"\r\n />\r\n {:else}\r\n <div class=\"performer-placeholder\">\r\n <svg\r\n class=\"placeholder-icon\"\r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"\r\n />\r\n </svg>\r\n </div>\r\n {/if}\r\n </div>\r\n <h3 class=\"performer-name\">\r\n {performer.displayName ||\r\n formatFullName(performer.firstName, performer.lastName)}\r\n </h3>\r\n </div>\r\n {/each}\r\n </div>\r\n </section>\r\n {/if}\r\n </div>\r\n\r\n <!-- Sidebar -->\r\n <div class=\"sidebar\">\r\n <div class=\"sidebar-sticky\">\r\n {#if series.venue?.faq || series.venue?.disclaimer}\r\n <div class=\"sidebar-card\">\r\n {#if series.venue.faq}\r\n <div class=\"sidebar-section\">\r\n <h3 class=\"sidebar-heading\">FAQ</h3>\r\n <div class=\"faq-content\">\r\n {#if Array.isArray(series.venue.faq)}\r\n {#each series.venue.faq as item}\r\n <div class=\"faq-item\">\r\n <p class=\"faq-question\">{item.question}</p>\r\n <p class=\"faq-answer\">{item.answer}</p>\r\n </div>\r\n {/each}\r\n {:else}\r\n <p>{series.venue.faq}</p>\r\n {/if}\r\n </div>\r\n </div>\r\n {/if}\r\n\r\n {#if series.venue.disclaimer}\r\n <div class=\"sidebar-section\">\r\n <h3 class=\"sidebar-heading\">Important Info</h3>\r\n <div class=\"disclaimer-text\">{series.venue.disclaimer}</div>\r\n </div>\r\n {/if}\r\n </div>\r\n {/if}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n{/if}\r\n\r\n<style>\r\n .series-page {\r\n min-height: 100vh;\r\n padding-bottom: 5rem;\r\n background: hsl(var(--surface-primary, 0 0% 100%));\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n /* Hero */\r\n .hero {\r\n position: relative;\r\n width: 100%;\r\n overflow: hidden;\r\n height: 500px;\r\n }\r\n\r\n @media (width <= 768px) {\r\n .hero {\r\n height: 256px;\r\n }\r\n }\r\n\r\n .hero-skeleton {\r\n position: absolute;\r\n inset: 0;\r\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n }\r\n\r\n @keyframes pulse {\r\n 0%,\r\n 100% {\r\n opacity: 1;\r\n }\r\n\r\n 50% {\r\n opacity: 0.5;\r\n }\r\n }\r\n\r\n .hero-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n transition: transform 0.7s ease;\r\n }\r\n\r\n .hero:hover .hero-image {\r\n transform: scale(1.05);\r\n }\r\n\r\n .hero-overlay {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n padding: 1.5rem;\r\n background: linear-gradient(\r\n to top,\r\n color-mix(in srgb, black 90%, transparent),\r\n color-mix(in srgb, black 50%, transparent),\r\n transparent\r\n );\r\n }\r\n\r\n @media (width >= 768px) {\r\n .hero-overlay {\r\n padding: 3rem;\r\n }\r\n }\r\n\r\n .hero-content {\r\n max-width: 64rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n width: 100%;\r\n }\r\n\r\n .series-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 0.25rem 0.75rem;\r\n margin-bottom: 1rem;\r\n font-size: 0.75rem;\r\n line-height: 1rem;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n border-radius: 9999px;\r\n box-shadow:\r\n 0 10px 15px -3px rgb(0 0 0 / 10%),\r\n 0 4px 6px -4px rgb(0 0 0 / 10%);\r\n background: hsl(var(--brand-primary, 224 76% 48%));\r\n color: hsl(var(--text-on-primary, 0 0% 100%));\r\n }\r\n\r\n .series-title {\r\n font-size: 2.25rem;\r\n line-height: 1.1;\r\n font-weight: 700;\r\n margin-bottom: 0.75rem;\r\n letter-spacing: -0.025em;\r\n color: hsl(var(--bg-primary));\r\n text-shadow: 0 2px 8px color-mix(in srgb, black 30%, transparent);\r\n }\r\n\r\n @media (width >= 768px) {\r\n .series-title {\r\n font-size: 3.75rem;\r\n line-height: 1;\r\n }\r\n }\r\n\r\n .series-venue {\r\n font-size: 1.125rem;\r\n line-height: 1.75rem;\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 0.5rem;\r\n font-weight: 500;\r\n color: color-mix(in srgb, white 90%, transparent);\r\n }\r\n\r\n @media (width >= 768px) {\r\n .series-venue {\r\n font-size: 1.25rem;\r\n line-height: 1.75rem;\r\n }\r\n }\r\n\r\n .venue-separator {\r\n display: none;\r\n opacity: 0.6;\r\n }\r\n\r\n @media (width >= 768px) {\r\n .venue-separator {\r\n display: inline;\r\n }\r\n }\r\n\r\n .venue-location {\r\n opacity: 0.75;\r\n }\r\n\r\n /* Content Grid */\r\n .content-grid {\r\n max-width: 64rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n padding: 3rem 1.5rem;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n gap: 3rem;\r\n }\r\n\r\n @media (width >= 768px) {\r\n .content-grid {\r\n padding-top: 5rem;\r\n padding-bottom: 5rem;\r\n }\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .content-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n }\r\n }\r\n\r\n .main-column {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4rem;\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .main-column {\r\n grid-column: span 2 / span 2;\r\n }\r\n }\r\n\r\n .section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1.5rem;\r\n }\r\n\r\n .section-heading {\r\n font-size: 1.875rem;\r\n line-height: 2.25rem;\r\n font-weight: 700;\r\n letter-spacing: -0.025em;\r\n padding-bottom: 1rem;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n border-bottom: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n\r\n .series-summary {\r\n font-size: 1.25rem;\r\n font-weight: 500;\r\n line-height: 1.625;\r\n color: hsl(var(--text-primary, 0 0% 20%));\r\n }\r\n\r\n .series-description {\r\n max-width: none;\r\n white-space: pre-line;\r\n line-height: 1.625;\r\n color: hsl(var(--text-secondary, 0 0% 40%));\r\n }\r\n\r\n /* Upcoming Dates */\r\n .dates-header {\r\n display: flex;\r\n align-items: baseline;\r\n justify-content: space-between;\r\n padding-bottom: 1rem;\r\n border-bottom: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n\r\n .dates-count {\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 500;\r\n color: hsl(var(--text-secondary, 0 0% 45%));\r\n }\r\n\r\n .empty-dates {\r\n padding: 3rem;\r\n border-radius: 1rem;\r\n text-align: center;\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n border: 2px dashed hsl(var(--stroke-secondary, 0 0% 85%));\r\n }\r\n\r\n .empty-text {\r\n font-size: 1.125rem;\r\n line-height: 1.75rem;\r\n font-weight: 500;\r\n color: hsl(var(--text-secondary, 0 0% 45%));\r\n }\r\n\r\n .empty-subtext {\r\n margin-top: 0.5rem;\r\n color: hsl(var(--text-secondary, 0 0% 55%));\r\n }\r\n\r\n .dates-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1rem;\r\n }\r\n\r\n .occurrence-card {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n padding: 1.5rem;\r\n border-radius: 1rem;\r\n transition: all 0.2s;\r\n background: hsl(var(--surface-primary, 0 0% 100%));\r\n border: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n\r\n @media (width >= 640px) {\r\n .occurrence-card {\r\n flex-direction: row;\r\n align-items: center;\r\n }\r\n }\r\n\r\n .occurrence-card:hover {\r\n border-color: hsl(var(--brand-primary, 224 76% 48%));\r\n box-shadow: 0 4px 12px color-mix(in srgb, black 8%, transparent);\r\n }\r\n\r\n .occurrence-info {\r\n margin-bottom: 1rem;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .occurrence-info {\r\n margin-bottom: 0;\r\n }\r\n }\r\n\r\n .occurrence-date {\r\n font-size: 1.25rem;\r\n line-height: 1.75rem;\r\n font-weight: 700;\r\n margin-bottom: 0.25rem;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n .occurrence-time {\r\n font-weight: 500;\r\n color: hsl(var(--text-secondary, 0 0% 45%));\r\n }\r\n\r\n .occurrence-action {\r\n padding-left: 0;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .occurrence-action {\r\n padding-left: 1.5rem;\r\n }\r\n }\r\n\r\n .cta-button {\r\n width: 100%;\r\n padding: 0.75rem 1.5rem;\r\n border-radius: 0.5rem;\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 600;\r\n transition: transform 0.15s;\r\n background: hsl(var(--brand-primary, 224 76% 48%));\r\n color: hsl(var(--text-on-primary, 0 0% 100%));\r\n }\r\n\r\n @media (width >= 640px) {\r\n .cta-button {\r\n width: auto;\r\n }\r\n }\r\n\r\n .cta-button:hover:not(:disabled) {\r\n transform: scale(1.05);\r\n }\r\n\r\n .cta-disabled {\r\n cursor: not-allowed;\r\n background: hsl(var(--surface-secondary, 0 0% 90%));\r\n color: hsl(var(--text-secondary, 0 0% 55%));\r\n }\r\n\r\n /* Performers */\r\n .performers-grid {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: 2rem;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .performers-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n }\r\n }\r\n\r\n .performer-card {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n padding: 1rem;\r\n border-radius: 0.75rem;\r\n transition: background-color 0.15s;\r\n }\r\n\r\n .performer-card:hover {\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n }\r\n\r\n .performer-avatar {\r\n width: 7rem;\r\n height: 7rem;\r\n margin-bottom: 1rem;\r\n border-radius: 9999px;\r\n overflow: hidden;\r\n box-shadow:\r\n 0 4px 6px -1px rgb(0 0 0 / 10%),\r\n 0 2px 4px -2px rgb(0 0 0 / 10%);\r\n background: hsl(var(--surface-secondary, 0 0% 92%));\r\n }\r\n\r\n .performer-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n transition: transform 0.5s ease;\r\n }\r\n\r\n .performer-card:hover .performer-image {\r\n transform: scale(1.1);\r\n }\r\n\r\n .performer-placeholder {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: hsl(var(--text-secondary, 0 0% 60%));\r\n }\r\n\r\n .placeholder-icon {\r\n width: 3rem;\r\n height: 3rem;\r\n opacity: 0.5;\r\n }\r\n\r\n .performer-name {\r\n font-size: 1.125rem;\r\n line-height: 1.75rem;\r\n font-weight: 600;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n /* Sidebar */\r\n .sidebar {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2rem;\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .sidebar {\r\n grid-column: span 1 / span 1;\r\n }\r\n }\r\n\r\n .sidebar-sticky {\r\n position: sticky;\r\n top: 6rem;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2rem;\r\n }\r\n\r\n .sidebar-card {\r\n border-radius: 1rem;\r\n padding: 2rem;\r\n background: hsl(var(--surface-secondary, 0 0% 96%));\r\n border: 1px solid hsl(var(--stroke-secondary, 0 0% 92%));\r\n }\r\n\r\n .sidebar-section {\r\n margin-bottom: 2rem;\r\n }\r\n\r\n .sidebar-section:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .sidebar-heading {\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.1em;\r\n margin-bottom: 1rem;\r\n color: hsl(var(--text-primary, 0 0% 10%));\r\n }\r\n\r\n .faq-content {\r\n color: hsl(var(--text-secondary, 0 0% 40%));\r\n }\r\n\r\n .faq-item {\r\n margin-bottom: 0.75rem;\r\n }\r\n\r\n .faq-question {\r\n font-weight: 700;\r\n color: hsl(var(--text-primary, 0 0% 20%));\r\n }\r\n\r\n .faq-answer {\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n }\r\n\r\n .disclaimer-text {\r\n font-size: 0.875rem;\r\n line-height: 1.625;\r\n padding: 1rem;\r\n border-radius: 0.5rem;\r\n background: hsl(var(--surface-primary, 0 0% 100%));\r\n color: hsl(var(--text-secondary, 0 0% 40%));\r\n border: 1px solid hsl(var(--stroke-secondary, 0 0% 90%));\r\n }\r\n</style>\r\n"],"names":["imageLoaded","$","seriesImage","getImageUrl","$$props","PLACEHOLDER_IMAGE","tz","getDefaultTimezone","formatDate","iso","scFormatDate","formatTime","scFormatTime","handleOccurrenceClick","occurrence","div","root_1","div_1","div_2","img","div_3","div_4","h1","div_5","span","span_1","fragment_1","text_2","$$render","consequent","div_6","div_7","section","p","root_3","consequent_1","div_8","root_4","consequent_2","section_1","div_9","span_2","div_10","root_5","div_11","root_6","$$anchor","div_12","root_7","div_13","div_14","div_15","div_16","button","classes_1","text_8","alternate","consequent_3","section_2","root_8","div_17","performer","div_18","root_9","div_19","img_1","root_10","$0","$1","formatFullName","div_20","root_11","consequent_4","alternate_1","h3","consequent_5","div_21","div_22","div_23","root_12","div_24","root_13","div_25","item","div_26","root_15","p_1","p_2","text_10","text_11","d","p_3","root_16","text_12","consequent_7","div_27","root_17","div_28","text_13","consequent_8","consequent_9","classes","text_1"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import "svelte/internal/disclose-version";
2
- import { Y as ie, Z as he, _ as pe, $ as le, a0 as _e, a1 as be, B as K, a2 as ke, a3 as xe, A as ye, a4 as we, a5 as Te, a6 as Ee, t as Y, e as G, a7 as Ce, a8 as Ie, a9 as De, u as ze } from "./VenueCalendar-BW3z2VPQ.js";
2
+ import { Y as ie, Z as he, _ as pe, $ as le, a0 as _e, a1 as be, B as K, a2 as ke, a3 as xe, A as ye, a4 as we, a5 as Te, a6 as Ee, t as Y, e as G, a7 as Ce, a8 as Ie, a9 as De, u as ze } from "./VenueCalendar-D8NsQUaM.js";
3
3
  import * as e from "svelte/internal/client";
4
4
  import "svelte/transition";
5
5
  import "svelte/easing";
6
6
  import { onMount as X } from "svelte";
7
- import { t as Ae } from "./transform-0OglVsGh.js";
8
- import { d as W, m as Pe, a as Se, b as Ue, c as Le } from "./data-toggle-store.svelte-BW7PSkAS.js";
9
- import { O as Ne, a as Re } from "./OrderSummary-Bzh5dIoC.js";
7
+ import { t as Ae } from "./transform-XHY0K9GS.js";
8
+ import { d as W, m as Pe, a as Se, b as Ue, c as Le } from "./data-toggle-store.svelte-CFExWcyA.js";
9
+ import { O as Ne, a as Re } from "./OrderSummary-DSFp-LYT.js";
10
10
  import { H as Oe } from "./Heading-AFd3o0xt.js";
11
11
  import { T as F } from "./Text-CXR2fhx6.js";
12
12
  import { m as Me } from "./labels-CWMBE5R1.js";
@@ -612,7 +612,7 @@ function ct(B, t) {
612
612
  e.push(t, !0);
613
613
  let n = e.state(!1), g = e.state(null);
614
614
  typeof window < "u" && new URLSearchParams(window.location.search).get("legacy") === "1" && e.set(n, !0), e.user_effect(() => {
615
- e.get(n) && !e.get(g) && (Q.warn("[VC] DEPRECATED: ?legacy=1 fallback for Success retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md."), import("./Success.legacy-BeT_kPBR.js").then((r) => {
615
+ e.get(n) && !e.get(g) && (Q.warn("[VC] DEPRECATED: ?legacy=1 fallback for Success retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md."), import("./Success.legacy-DqyTto5K.js").then((r) => {
616
616
  e.set(g, r.default, !0);
617
617
  }).catch(() => {
618
618
  e.set(n, !1);
@@ -729,4 +729,4 @@ function ct(B, t) {
729
729
  export {
730
730
  ct as default
731
731
  };
732
- //# sourceMappingURL=Success-CLwAH9KC.js.map
732
+ //# sourceMappingURL=Success-CaCG95BV.js.map