@getmicdrop/venue-calendar 4.0.95 → 4.0.96
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.
- package/dist/{CartView-Cq0DU1Cy.js → CartView-DC-YjxhJ.js} +721 -726
- package/dist/CartView-DC-YjxhJ.js.map +1 -0
- package/dist/{Checkout-BV5f49vY.js → Checkout-DFEzsNwm.js} +8 -4
- package/dist/Checkout-DFEzsNwm.js.map +1 -0
- package/dist/{Checkout-BA43iGDc.js → Checkout-SGb68I5A.js} +271 -259
- package/dist/Checkout-SGb68I5A.js.map +1 -0
- package/dist/{CheckoutTimer-KyKyInco.js → CheckoutTimer-BUlr4C7O.js} +5 -5
- package/dist/{CheckoutTimer-KyKyInco.js.map → CheckoutTimer-BUlr4C7O.js.map} +1 -1
- package/dist/{ClockIcon-BD24dBol.js → ClockIcon-CI96OiJj.js} +2 -2
- package/dist/{ClockIcon-BD24dBol.js.map → ClockIcon-CI96OiJj.js.map} +1 -1
- package/dist/{CollectionView-CKIxku9-.js → CollectionView-kDS8R_bu.js} +35 -35
- package/dist/CollectionView-kDS8R_bu.js.map +1 -0
- package/dist/{Event-BPdt1Io5.js → Event-DUViqNEG.js} +497 -497
- package/dist/{Event-BPdt1Io5.js.map → Event-DUViqNEG.js.map} +1 -1
- package/dist/{EventPage-DRnTMGTK.js → EventPage-CbYWOehC.js} +6 -6
- package/dist/{EventPage-DRnTMGTK.js.map → EventPage-CbYWOehC.js.map} +1 -1
- package/dist/{Heading-pQuVpBrL.js → Heading-DtOhaDMn.js} +10 -10
- package/dist/{Heading-pQuVpBrL.js.map → Heading-DtOhaDMn.js.map} +1 -1
- package/dist/{ScarcityBadge-DoYdujCs.js → ScarcityBadge-CBKc57di.js} +16 -16
- package/dist/{ScarcityBadge-DoYdujCs.js.map → ScarcityBadge-CBKc57di.js.map} +1 -1
- package/dist/{SeriesPage-vw7Hva9F.js → SeriesPage-BPDSiLWH.js} +5 -5
- package/dist/{SeriesPage-vw7Hva9F.js.map → SeriesPage-BPDSiLWH.js.map} +1 -1
- package/dist/{Spinner-BfFZMaDP.js → Spinner-BUWcjtbI.js} +2 -2
- package/dist/{Spinner-BfFZMaDP.js.map → Spinner-BUWcjtbI.js.map} +1 -1
- package/dist/{Success-Cjj6CC4w.js → Success-6kCesfnC.js} +15 -9
- package/dist/Success-6kCesfnC.js.map +1 -0
- package/dist/{Text-CT79Zi5n.js → Text-B5MZ6L1O.js} +2 -2
- package/dist/{Text-CT79Zi5n.js.map → Text-B5MZ6L1O.js.map} +1 -1
- package/dist/{VenueCalendar-Cz7_VBC6.js → VenueCalendar-BRTDpyWV.js} +1504 -1498
- package/dist/VenueCalendar-BRTDpyWV.js.map +1 -0
- package/dist/{ViewTicketsEmbed-BvCfoKY3.js → ViewTicketsEmbed-BgIXGtz6.js} +5 -5
- package/dist/ViewTicketsEmbed-BgIXGtz6.js.map +1 -0
- package/dist/api/api/transformers/event.d.ts +6 -4
- package/dist/api/api.cjs +1 -1
- package/dist/api/api.cjs.map +1 -1
- package/dist/api/api.mjs +204 -207
- package/dist/api/api.mjs.map +1 -1
- package/dist/{data-toggle-store.svelte-BHwbM34q.js → data-toggle-store.svelte-D3w7V3t9.js} +2 -2
- package/dist/data-toggle-store.svelte-D3w7V3t9.js.map +1 -0
- package/dist/{labels-_x9WkVuZ.js → labels-wyDolzF_.js} +8 -8
- package/dist/labels-wyDolzF_.js.map +1 -0
- package/dist/{modalManager.svelte-Csm1WlvP.js → modalManager.svelte-DBBSS3Zi.js} +2 -2
- package/dist/{modalManager.svelte-Csm1WlvP.js.map → modalManager.svelte-DBBSS3Zi.js.map} +1 -1
- package/dist/seo/seo.cjs.map +1 -1
- package/dist/seo/seo.mjs.map +1 -1
- package/dist/{transform-WRPgSKLN.js → transform-Bcl3riJb.js} +2 -2
- package/dist/{transform-WRPgSKLN.js.map → transform-Bcl3riJb.js.map} +1 -1
- package/dist/venue-calendar.css +1 -1
- package/dist/venue-calendar.es.js +4 -4
- package/dist/venue-calendar.iife.js +33 -33
- package/dist/venue-calendar.iife.js.map +1 -1
- package/dist/venue-calendar.umd.js +33 -33
- package/dist/venue-calendar.umd.js.map +1 -1
- package/package.json +5 -2
- package/dist/CartView-Cq0DU1Cy.js.map +0 -1
- package/dist/Checkout-BA43iGDc.js.map +0 -1
- package/dist/Checkout-BV5f49vY.js.map +0 -1
- package/dist/CollectionView-CKIxku9-.js.map +0 -1
- package/dist/Success-Cjj6CC4w.js.map +0 -1
- package/dist/VenueCalendar-Cz7_VBC6.js.map +0 -1
- package/dist/ViewTicketsEmbed-BvCfoKY3.js.map +0 -1
- package/dist/data-toggle-store.svelte-BHwbM34q.js.map +0 -1
- package/dist/labels-_x9WkVuZ.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getmicdrop/venue-calendar",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.96",
|
|
4
4
|
"description": "A customizable Svelte calendar component for displaying comedy events",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -61,6 +61,9 @@
|
|
|
61
61
|
"cleanup-check": "node scripts/cleanup-on-destroy-check.mjs --report-only",
|
|
62
62
|
"cleanup-check:strict": "node scripts/cleanup-on-destroy-check.mjs --fail-on-new",
|
|
63
63
|
"cleanup-baseline": "node scripts/cleanup-on-destroy-check.mjs --baseline",
|
|
64
|
+
"checkout-lifecycle-check": "node scripts/checkout-lifecycle-check.mjs --report-only",
|
|
65
|
+
"checkout-lifecycle-check:strict": "node scripts/checkout-lifecycle-check.mjs --fail-on-new",
|
|
66
|
+
"checkout-lifecycle-baseline": "node scripts/checkout-lifecycle-check.mjs --baseline",
|
|
64
67
|
"check": "svelte-check --diagnostic-sources \"js,svelte\"",
|
|
65
68
|
"check:all": "svelte-check",
|
|
66
69
|
"test": "vitest run",
|
|
@@ -115,7 +118,7 @@
|
|
|
115
118
|
},
|
|
116
119
|
"devDependencies": {
|
|
117
120
|
"@eslint/js": "^9.39.1",
|
|
118
|
-
"@getmicdrop/svelte-components": "^6.24.
|
|
121
|
+
"@getmicdrop/svelte-components": "^6.24.127",
|
|
119
122
|
"@playwright/test": "^1.60.0",
|
|
120
123
|
"@size-limit/file": "^11.1.0",
|
|
121
124
|
"@sveltejs/adapter-auto": "^6.1.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CartView-Cq0DU1Cy.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/CloseOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/phosphor/InfoIcon.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/OrderSummary/OrderSummary.svelte","../src/lib/utils/promo.ts","../src/lib/constants/scarcity.ts","../src/lib/utils/quantity-clamp.ts","../src/components/Events/Tickets/TicketBlock.svelte","../src/components/Events/Tickets/TicketSkeleton.svelte","../src/components/Events/Tickets/TicketsGroup.svelte","../src/components/Events/Tickets/PromocodeInput.svelte","../src/components/Events/Tickets/OrderSummarySkeleton.svelte","../src/components/Events/Tickets/EventInfoHeader.svelte","../src/components/Views/CartView.svelte"],"sourcesContent":["<script lang=\"ts\">\n interface Props {\n size?: string;\n color?: string;\n class?: string;\n }\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n</svg>\n","<script lang=\"ts\">\n /**\n * Info — Phosphor icon (canonical Micdrop icon family).\n * Outline by default; pass `weight=\"fill\"` for solid, or let a stateful parent\n * (NavItem / Tabs / BottomNav / status badge) drive it via icon-weight context.\n */\n import { useIconWeight, type IconWeight } from './iconWeight.js';\n\n interface Props {\n /** Pixel size (width + height). */\n size?: string;\n /** Icon color; defaults to `currentColor` (inherits text color). */\n color?: string;\n /** Extra classes. */\n class?: string;\n /** `regular` (outline) or `fill` (solid). Overrides ambient state weight. */\n weight?: IconWeight;\n }\n\n let { size = '24', color = 'currentColor', class: className = '', weight }: Props = $props();\n\n const ctx = useIconWeight();\n let resolved: IconWeight = $derived(weight ?? ctx?.weight ?? 'regular');\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n style:color={color}\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n {#if resolved === 'fill'}<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z\"/>{:else}<circle cx=\"128\" cy=\"128\" r=\"96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M120,120a8,8,0,0,1,8,8v40a8,8,0,0,0,8,8\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><circle cx=\"124\" cy=\"84\" r=\"12\"/>{/if}\n</svg>\n","<!-- @currency-escape: the /100 sites here are percentage + intermediate fee arithmetic, not currency display (the actual money display already uses formatCentsAsCurrency). -->\n<script>\n import { formatCurrency, formatCentsAsCurrency } from '../../utils/formatters';\n import { toCents } from '../../types/brands';\nimport { safeFly, safeFade } from '../../utils/transitions.js';\n import { cubicOut } from 'svelte/easing';\n import { ChevronDownOutline, CloseOutline } from '../../primitives/Icons';\n import Spinner from '../../primitives/Spinner/Spinner.svelte';\n import { typography } from '../../tokens/typography';\n import { layers } from '../../tokens/z-index.js';\n import { roundCurrency, normalizeChargeType } from '../../utils/formatters';\n\n /**\n * Default labels for all user-visible strings in OrderSummary.\n * Consumers can override any string via the `labels` prop.\n */\n const defaultLabels = {\n orderSummary: 'Order summary',\n selectTickets: 'Select tickets to continue',\n free: 'Free',\n fullPrice: 'Full Price',\n discount: 'Discount',\n subtotal: 'Subtotal',\n fees: 'Fees',\n taxes: 'Taxes',\n giftCardAppliedLabel: 'Gift Card Applied',\n giftCardBalanceAfterOrder: 'Gift card balance after order',\n amountDue: 'Amount Due',\n fullyCoveredByGiftCard: 'Fully covered by gift card',\n total: 'Total',\n checkoutButtonText: 'Checkout',\n placeOrderButtonText: 'Place order',\n placeOrderTos: 'By selecting Place order, I agree to the',\n termsOfService: 'terms of service',\n checkout: 'Checkout',\n ticketSingular: 'ticket',\n ticketPlural: 'tickets',\n closeOrderSummary: 'Close order summary',\n };\n\n let {\n loading = false,\n quantities = {},\n donationAmounts = {}, // Map of ticketId -> donation amount string\n eventTickets = [],\n checkoutTicket = null,\n isAgreed = true,\n btnText = undefined,\n showTerms = false,\n promoApplied = false,\n promoDiscount = 0,\n currentPromoRule = null,\n executePurchase = null,\n elements = null,\n venueServiceCharge = {\n serviceFeeCents: 0,\n serviceFeePercentage: 0,\n serviceFeeChargeType: 'both',\n maxServiceFeeCents: 0,\n taxPercentage: 0,\n },\n onPriceUpdate,\n giftCardApplied = null, // { code, giftCardAmount, giftCardBalance, stripeAmount, paymentType, requiresStripe }\n taxAmount = null, // Server-provided tax amount in dollars (from Stripe Tax API), null means not yet loaded\n taxLoading = false, // Whether tax is being loaded from server\n /** @type {Partial<typeof defaultLabels>} Override any user-visible string */\n labels: userLabels = {},\n } = $props();\n\n let labels = $derived({ ...defaultLabels, ...userLabels });\n\n // Helper to get effective price for a ticket (handles donation tickets)\n function getEffectivePrice(ticket) {\n // Donation ticket (type 2): use user-entered donation amount\n if (isDonationTicket(ticket)) {\n const donationAmount = donationAmounts[ticket.ID];\n return parseFloat(donationAmount) || 0;\n }\n // Regular ticket: use ticket price\n return parseFloat(ticket.price) || 0;\n }\n\n // Check if ticket is a donation ticket\n // Handle both 'type' and 'ticketType' fields, and coerce to number for comparison\n function isDonationTicket(ticket) {\n const ticketType = ticket.type ?? ticket.ticketType ?? 0;\n return Number(ticketType) === 2;\n }\n\n // Single source of truth for \"is this price free?\" — every free check keys off\n // this so they can't disagree. price arrives wire-typed and can be a number (0)\n // or a string ('0', '0.00', ''), all of which are free; strict `price === 0`\n // disagreed with a loose `price == 0` on strings, so both callers coerce here.\n // A null/undefined/non-numeric price is NOT free — it must never render 'Free'\n // and sell a mispriced ticket for $0; only a value that coerces to exactly 0 is.\n // The 'Free' labels pass the list price; the fee-skip passes the price actually\n // charged (post-discount), so a fully-comped ticket is free for fee purposes.\n function isFreePriceValue(price) {\n if (price == null) return false;\n return Number(price) === 0;\n }\n // Ticket-level free check for the 'Free' labels, which key off the list price.\n function isFreePrice(ticket) {\n return isFreePriceValue(ticket?.price);\n }\n\n let showOrderSummaryOnMobile = $state(false);\n\n function feeFor(price) {\n const chargeType = normalizeChargeType(venueServiceCharge.serviceFeeChargeType || 'both');\n let fee = 0;\n\n if (chargeType === 'fixed' || chargeType === 'both') {\n fee += (venueServiceCharge.serviceFeeCents || 0) / 100;\n }\n if (chargeType === 'percentage' || chargeType === 'both') {\n fee += ((venueServiceCharge.serviceFeePercentage || 0) / 100) * price;\n }\n\n const maxFee = venueServiceCharge.maxServiceFeeCents || 0;\n if (maxFee > 0 && fee > maxFee / 100) {\n fee = maxFee / 100;\n }\n\n return roundCurrency(fee);\n }\n\n function makeOrderSummaryVisible() {\n showOrderSummaryOnMobile = !showOrderSummaryOnMobile;\n }\n\n function getDiscountedPrice(ticket) {\n if (!currentPromoRule?.provideDiscount) return null;\n\n const discountTicketIds = currentPromoRule.discountTicketIds || [];\n if (discountTicketIds.length > 0 && !discountTicketIds.includes(ticket.ID)) {\n return null;\n }\n\n const basePrice = parseFloat(ticket.price) || 0;\n const discountAmount = parseFloat(currentPromoRule?.amount || '0') || 0;\n // Intentional intermediate rounding via .toFixed(2): this is NOT a\n // currency-display string. The result is parsed back to a number by callers\n // and fed into the roundCurrency-wrapped subtotal/fee math. Do not\n // \"canonicalize\" to roundCurrency — the two round half-cents differently\n // (e.g. 1.005 → .toFixed gives \"1.00\", roundCurrency gives 1.01), which\n // shifts displayed totals by a cent.\n if (currentPromoRule.discountType === '%') {\n return (basePrice * (1 - discountAmount / 100)).toFixed(2);\n } else if (currentPromoRule.discountType === '$') {\n return Math.max(0, basePrice - discountAmount).toFixed(2);\n }\n return null;\n }\n\n let totalQuantity = $derived(Object.values(quantities).reduce((sum, q) => sum + q, 0));\n let showFooter = $derived(totalQuantity > 0);\n\n let subtotalWithoutDiscount = $derived(roundCurrency(Object.keys(quantities).reduce((acc, key) => {\n const ticket = eventTickets.find(t => t.ID == key);\n if (!ticket) return acc;\n // For donation tickets, use the donation amount; otherwise use ticket price\n const effectivePrice = getEffectivePrice(ticket);\n return acc + quantities[key] * effectivePrice;\n }, 0)));\n\n let subtotal = $derived(roundCurrency(Object.keys(quantities).reduce((acc, key) => {\n const ticket = eventTickets.find(t => t.ID == key);\n if (!ticket) return acc;\n // For donation tickets, use the donation amount (no discounts apply)\n if (isDonationTicket(ticket)) {\n const effectivePrice = getEffectivePrice(ticket);\n return acc + quantities[key] * effectivePrice;\n }\n // For regular tickets, apply discounts as usual\n const discountedPrice = getDiscountedPrice(ticket);\n const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;\n return acc + quantities[key] * priceToUse;\n }, 0)));\n\n let promoSavings = $derived(currentPromoRule?.provideDiscount ? (subtotalWithoutDiscount - subtotal) : 0);\n\n let fees = $derived(roundCurrency(Object.keys(quantities).reduce((acc, key) => {\n const ticket = eventTickets.find(t => t.ID == key);\n // Skip fees for: no ticket and donation tickets (type 2)\n if (!ticket || isDonationTicket(ticket)) return acc;\n const discountedPrice = getDiscountedPrice(ticket);\n const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;\n // Skip fees for free tickets — evaluated on the price actually charged, so a\n // ticket discounted to $0 by a promo pays no service fee, exactly like a $0\n // ticket. Checking ticket.price here instead would fee a fully-comped ticket.\n if (isFreePriceValue(priceToUse)) return acc;\n return acc + quantities[key] * feeFor(priceToUse);\n }, 0)));\n\n let taxes = $derived(taxAmount !== null && taxAmount !== undefined ? roundCurrency(taxAmount) : 0);\n\n // Gift card derived values\n let giftCardAmountDisplay = $derived(\n giftCardApplied ? formatCentsAsCurrency(toCents(giftCardApplied.giftCardAmount)) : null\n );\n let giftCardRemainingBalance = $derived(\n giftCardApplied ? formatCentsAsCurrency(toCents(giftCardApplied.giftCardBalance - giftCardApplied.giftCardAmount)) : null\n );\n\n // Total accounts for gift card deduction\n let total = $derived(\n roundCurrency(Math.max(0, subtotal + fees + taxes\n - (promoApplied && !currentPromoRule?.provideDiscount ? promoDiscount : 0)\n - (giftCardApplied ? giftCardApplied.giftCardAmount / 100 : 0)\n ))\n );\n\n $effect(() => {\n onPriceUpdate?.({ subtotal, fees, taxes, total, promoSavings });\n });\n</script>\n\n<div\n id=\"orderSummary\"\n class=\"hidden md:block h-fit rounded-lg bg-card border border-border\"\n>\n <div class=\"px-5 py-4 border-b border-border\">\n <h3 class={typography.h3}>\n {labels.orderSummary}\n </h3>\n </div>\n\n <div class=\"px-5 pb-5\">\n {#if totalQuantity === 0}\n <div class=\"py-8 text-center\">\n <p class=\"{typography.smMuted}\">{labels.selectTickets}</p>\n </div>\n {:else}\n {#each Object.keys(quantities) as key (key)}\n {#if quantities[key] > 0}\n {#each eventTickets as ticket (ticket.ID)}\n {#if ticket.ID == key}\n {@const effectivePrice = getEffectivePrice(ticket)}\n {@const isDonation = isDonationTicket(ticket)}\n <div class=\"flex justify-between py-3 border-b border-border/50\">\n <div>\n <p class=\"{typography.label}\">{ticket.name}</p>\n <p class=\"{typography.smMuted}\">\n {#if isFreePrice(ticket) && !isDonation}\n {labels.free} x {quantities[key]}\n {:else if isDonation}\n {formatCurrency(effectivePrice /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)} x {quantities[key]}\n {:else}\n {formatCurrency(ticket.price /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)} x {quantities[key]}\n {/if}\n </p>\n </div>\n <div class=\"{typography.label}\">\n {#if isFreePrice(ticket) && !isDonation}\n {labels.free}\n {:else}\n {formatCurrency((effectivePrice * quantities[key]) /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}\n {/if}\n </div>\n </div>\n {/if}\n {/each}\n {/if}\n {/each}\n\n <div class=\"{`${typography.sm} flex flex-col py-3 gap-2`}\">\n {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}\n <div class=\"flex justify-between tone-secondary\">\n <span>{labels.fullPrice}</span><span>{formatCurrency(subtotalWithoutDiscount /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {/if}\n {#if promoSavings > 0}\n <div class=\"flex justify-between text-accent-success\">\n <span>{labels.discount}</span><span>-{formatCurrency(promoSavings /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}\n <div class=\"flex justify-between text-accent-success\">\n <span>{labels.discount}</span><span>-{formatCurrency(promoDiscount /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {/if}\n <div class=\"flex justify-between tone-secondary\">\n <span>{labels.subtotal}</span><span>{formatCurrency(subtotal /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n <div class=\"flex justify-between tone-secondary\">\n <span>{labels.fees}</span><span>{formatCurrency(fees /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n <div class=\"flex justify-between tone-secondary\">\n <span>{labels.taxes}</span>\n <span>\n {#if taxLoading}\n <span class=\"inline-flex items-center gap-1\"><Spinner size=\"xs\" /> Calculating...</span>\n {:else}\n {formatCurrency(taxes /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}\n {/if}\n </span>\n </div>\n {#if giftCardApplied}\n <div class=\"flex justify-between text-accent-success\">\n <span>{labels.giftCardAppliedLabel}</span>\n <span>-{giftCardAmountDisplay}</span>\n </div>\n {#if giftCardRemainingBalance && (giftCardApplied.giftCardBalance - giftCardApplied.giftCardAmount) > 0}\n <div class=\"flex justify-between tone-muted type-caption\">\n <span>{labels.giftCardBalanceAfterOrder}</span>\n <span>{giftCardRemainingBalance}</span>\n </div>\n {/if}\n {/if}\n </div>\n\n {#if giftCardApplied?.paymentType === 'gift_card_only'}\n <div class=\"flex justify-between py-4 type-subheading border-t border-border\">\n <span class=\"font-semibold tone-primary\">{labels.amountDue}</span>\n <span class=\"font-bold text-accent-success\">$0.00</span>\n </div>\n <p class=\"type-caption tone-muted text-center -mt-2 mb-2\">\n {labels.fullyCoveredByGiftCard}\n </p>\n {:else}\n <div class=\"flex justify-between {typography.h3} py-4 type-subheading border-t border-border\">\n <span>{labels.total}</span><span>{formatCurrency(total /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {/if}\n {/if}\n\n {#if totalQuantity > 0 && showTerms}\n <p class=\"{typography.xsMuted} text-center mb-3\">\n {labels.placeOrderTos} <a href=\"https://get-micdrop.com/tos\" class=\"text-brand-primary underline hover:opacity-80\" target=\"_blank\" rel=\"noopener noreferrer\">{labels.termsOfService}</a>\n </p>\n {/if}\n\n <button\n class=\"w-full h-12 font-semibold rounded-lg flex items-center justify-center transition-colors select-none touch-manipulation {totalQuantity === 0 || !isAgreed || taxLoading ? 'bg-bg-tertiary tone-muted cursor-not-allowed' : 'bg-brand-primary text-white hover:bg-brand-primary/90'}\"\n onclick={() => {\n if (totalQuantity === 0 || !isAgreed || taxLoading) return;\n if (executePurchase) {\n executePurchase(elements);\n } else if (checkoutTicket) {\n checkoutTicket();\n }\n }}\n disabled={totalQuantity === 0 || !isAgreed || taxLoading}\n >\n {#if loading}\n <Spinner size=\"sm\" color=\"white\" />\n {:else}\n <span translate=\"no\">{btnText ?? (showTerms ? labels.placeOrderButtonText : labels.checkoutButtonText)}</span>\n {/if}\n </button>\n </div>\n</div>\n\n{#if showOrderSummaryOnMobile}\n <button\n class=\"md:hidden fixed inset-0 bg-overlay-bg border-none cursor-pointer\"\n style:z-index={layers.overlay}\n onclick={() => (showOrderSummaryOnMobile = false)}\n aria-label={labels.closeOrderSummary}\n transition:safeFade={{ duration: 200 }}\n ></button>\n <div\n in:safeFly={{ y: 800, duration: 300, easing: cubicOut }}\n out:safeFly={{ y: 800, duration: 300, easing: cubicOut }}\n class=\"md:hidden fixed bottom-0 left-0 w-full overflow-x-hidden overflow-y-auto max-h-[80vh] rounded-t-lg shadow-xl bg-card\"\n style:z-index={layers.modal}\n >\n <div class=\"flex flex-row justify-between items-center px-5 py-4 border-b border-border\">\n <h2 class=\"{typography.h2} type-heading\">\n {labels.orderSummary}\n </h2>\n <button\n onclick={() => (showOrderSummaryOnMobile = false)}\n class=\"transition-colors p-2 rounded-lg tone-muted hover:tone-primary hover:bg-bg-secondary\"\n aria-label={labels.closeOrderSummary}\n >\n <CloseOutline class=\"w-7 h-7\" />\n </button>\n </div>\n\n <div class=\"px-5 pb-5\">\n {#each Object.keys(quantities) as key (key)}\n {#if quantities[key] > 0}\n {#each eventTickets as ticket (ticket.ID)}\n {#if ticket.ID == key}\n {@const effectivePrice = getEffectivePrice(ticket)}\n {@const isDonation = isDonationTicket(ticket)}\n <div class=\"flex justify-between py-4 border-b border-border\">\n <div>\n <p class=\"{typography.h5}\">{ticket.name}</p>\n <p class=\"{typography.smMuted}\">\n {#if isFreePrice(ticket) && !isDonation}\n {labels.free} x {quantities[key]}\n {:else if isDonation}\n {formatCurrency(effectivePrice /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)} x {quantities[key]}\n {:else}\n {formatCurrency(ticket.price /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)} x {quantities[key]}\n {/if}\n </p>\n </div>\n <div class=\"{typography.h5}\">\n {#if isFreePrice(ticket) && !isDonation}\n {labels.free}\n {:else}\n {formatCurrency((effectivePrice * quantities[key]) /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}\n {/if}\n </div>\n </div>\n {/if}\n {/each}\n {/if}\n {/each}\n\n <div class=\"flex flex-col py-4 gap-3 tone-secondary\">\n {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}\n <div class=\"flex justify-between\">\n <span>{labels.fullPrice}</span><span>{formatCurrency(subtotalWithoutDiscount /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {/if}\n {#if promoSavings > 0}\n <div class=\"flex justify-between text-accent-success\">\n <span>{labels.discount}</span><span>-{formatCurrency(promoSavings /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}\n <div class=\"flex justify-between text-accent-success\">\n <span>{labels.discount}</span><span>-{formatCurrency(promoDiscount /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {/if}\n <div class=\"flex justify-between\">\n <span>{labels.subtotal}</span><span>{formatCurrency(subtotal /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n <div class=\"flex justify-between\">\n <span>{labels.fees}</span><span>{formatCurrency(fees /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n <div class=\"flex justify-between\">\n <span>{labels.taxes}</span>\n <span>\n {#if taxLoading}\n <span class=\"inline-flex items-center gap-1\"><Spinner size=\"xs\" /> Calculating...</span>\n {:else}\n {formatCurrency(taxes /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}\n {/if}\n </span>\n </div>\n {#if giftCardApplied}\n <div class=\"flex justify-between text-accent-success\">\n <span>{labels.giftCardAppliedLabel}</span>\n <span>-{giftCardAmountDisplay}</span>\n </div>\n {#if giftCardRemainingBalance && (giftCardApplied.giftCardBalance - giftCardApplied.giftCardAmount) > 0}\n <div class=\"flex justify-between tone-muted type-caption\">\n <span>{labels.giftCardBalanceAfterOrder}</span>\n <span>{giftCardRemainingBalance}</span>\n </div>\n {/if}\n {/if}\n </div>\n\n {#if giftCardApplied?.paymentType === 'gift_card_only'}\n <div class=\"flex justify-between py-5 border-t border-border\">\n <span class=\"font-semibold tone-primary\">{labels.amountDue}</span>\n <span class=\"font-bold text-accent-success\">$0.00</span>\n </div>\n <p class=\"type-caption tone-muted text-center -mt-2 mb-2\">\n {labels.fullyCoveredByGiftCard}\n </p>\n {:else}\n <div class=\"flex justify-between {typography.h3} py-5 border-t border-border\">\n <span>{labels.total}</span><span>{formatCurrency(total /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </div>\n {/if}\n </div>\n </div>\n{/if}\n\n{#if showFooter}\n <div\n transition:safeFly={{ y: 100, duration: 200 }}\n class=\"md:hidden fixed bottom-0 left-0 right-0 bg-card border-t border-border shadow-xl p-4 pb-[max(16px,calc(env(safe-area-inset-bottom)+8px))] select-none touch-manipulation\"\n style:z-index={layers.overlay}\n >\n <div class=\"flex items-stretch gap-3\">\n <button class=\"flex flex-col justify-between items-start shrink-0 whitespace-nowrap bg-transparent border-none p-0 cursor-pointer touch-manipulation\" onclick={makeOrderSummaryVisible}>\n <span class=\"{`${typography.sm} flex items-center gap-1 tone-secondary`}\">\n {totalQuantity} {totalQuantity > 1 ? labels.ticketPlural : labels.ticketSingular}\n <ChevronDownOutline class={`w-4 h-4 ${typography.iconMuted} transition-transform duration-200 ${showOrderSummaryOnMobile ? 'rotate-180' : ''}`} />\n </span>\n <span class=\"{typography.h2} type-heading\">{formatCurrency(total /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}</span>\n </button>\n\n <button\n class=\"{`${typography.label} flex-1 min-w-36 h-12 rounded-lg touch-manipulation flex items-center justify-center ${totalQuantity === 0 || !isAgreed || taxLoading ? 'bg-bg-tertiary tone-muted cursor-not-allowed' : 'bg-brand-primary text-white hover:bg-brand-primary/90'}`}\"\n onclick={() => {\n if (taxLoading) return;\n if (executePurchase) {\n executePurchase(elements);\n } else if (checkoutTicket) {\n checkoutTicket();\n }\n }}\n disabled={totalQuantity === 0 || !isAgreed || taxLoading}\n >\n {#if loading}\n <Spinner size=\"sm\" color=\"white\" />\n {:else}\n <span translate=\"no\">{labels.checkout}</span>\n {/if}\n </button>\n </div>\n </div>\n{/if}","// Canonical promo-discount resolver.\n//\n// The promo apply endpoint returns a discount as { amount, discountType } where\n// a percentage promo's `amount` is the raw percent (e.g. 10 for \"10%\"). The\n// order-summary display path stores that raw number in the global\n// `checkout-promo-discount` cookie and subtracts it from the subtotal as if it\n// were dollars — so a \"10%\" promo renders as a flat \"$10 off\" regardless of\n// cart size. PromocodeInput cannot fix this at write-time: it has no subtotal\n// (it can even auto-apply before any ticket is chosen). The correct dollar\n// value is subtotal-dependent, so it must be resolved wherever the subtotal is\n// known, using the stored discount type.\n//\n// Single source of truth for that resolution. Two discountType vocabularies\n// exist in the codebase — the API/cookie form ('percentage' | 'fixed') and the\n// per-ticket/pcf form ('%' | '$') — so both are accepted.\n\n// The meaningful discount-type values. The resolver accepts any string (the\n// value comes from a cookie / promo-change event, i.e. an untyped `string`) and\n// treats anything that isn't a percentage marker as a fixed dollar amount.\nexport type PromoDiscountType =\n | 'percentage'\n | 'fixed'\n | '%'\n | '$'\n | ''\n | null\n | undefined;\n\ntype PromoDiscountTypeInput = PromoDiscountType | string;\n\nfunction isPercentageDiscount(discountType: PromoDiscountTypeInput): boolean {\n return discountType === 'percentage' || discountType === '%';\n}\n\n/**\n * Resolve a promo discount to a dollar amount against the current subtotal.\n *\n * @param subtotal - order subtotal in dollars.\n * @param rawAmount - the discount value from the promo response: a percent for\n * a percentage promo, a dollar amount for a fixed promo.\n * @param discountType - 'percentage'/'%' or 'fixed'/'$' (or empty → fixed).\n * @returns the discount in dollars, clamped to [0, subtotal].\n */\nexport function resolvePromoDiscountDollars(\n subtotal: number,\n rawAmount: number,\n discountType: PromoDiscountTypeInput\n): number {\n if (!(rawAmount > 0) || !(subtotal > 0)) return 0;\n\n const dollars = isPercentageDiscount(discountType)\n ? (subtotal * rawAmount) / 100\n : rawAmount;\n\n const clamped = Math.max(0, Math.min(subtotal, dollars));\n // Round to cents so the deduction matches the currency-formatted display.\n return Math.round(clamped * 100) / 100;\n}\n","/**\n * Scarcity thresholds for ticket availability badges and copy.\n *\n * Source of truth for the three-tier urgency model used on browse\n * surfaces (calendar/list/gallery), event pages, and ticket selection.\n * See docs/checkout-edge-cases.md §6.5.\n *\n * Tiers (by percent of total capacity remaining):\n * - urgent : remaining <= URGENT_PCT% (e.g. 10%) AND remaining <= MAX_EXACT_COUNT\n * -> \"Only N left\" with exact count + flame\n * - low : remaining <= LOW_PCT% (e.g. 25%) AND not urgent\n * -> \"Few tickets left\" / \"Selling fast\" (vague) + flame\n * - plenty : otherwise -> no badge\n * - sold-out: remaining <= 0 -> \"Sold out\"\n *\n * MAX_EXACT_COUNT caps the exact-count copy: even if percent triggers\n * urgent on a huge inventory, we only reveal exact remaining when the\n * absolute number is small enough to feel like genuine scarcity rather\n * than dump-data (\"Only 487 left\").\n */\nexport const SCARCITY_THRESHOLDS = {\n /** Percent remaining at or below which a ticket is \"urgent\" (exact count). */\n URGENT_PCT: 10,\n /** Percent remaining at or below which a ticket is \"low\" (vague badge). */\n LOW_PCT: 25,\n /** Absolute cap on exact-count copy; above this we fall back to vague badge. */\n MAX_EXACT_COUNT: 20,\n} as const;\n\nexport type ScarcityLevel = 'sold-out' | 'urgent' | 'low' | 'plenty';\n\n/**\n * Compute the scarcity level for a (remaining, total) pair.\n *\n * Returns 'plenty' when total <= 0 (we can't compute a percentage; assume\n * unlimited / unknown capacity, no scarcity claim). Returns 'sold-out'\n * defensively for negative remaining.\n */\nexport function computeScarcityLevel(\n remaining: number,\n total: number\n): ScarcityLevel {\n if (remaining <= 0) return 'sold-out';\n if (total <= 0) return 'plenty';\n\n const pct = (remaining / total) * 100;\n const { URGENT_PCT, LOW_PCT, MAX_EXACT_COUNT } = SCARCITY_THRESHOLDS;\n\n if (pct <= URGENT_PCT && remaining <= MAX_EXACT_COUNT) return 'urgent';\n if (pct <= LOW_PCT) return 'low';\n return 'plenty';\n}\n","/**\n * Quantity-clamp utility (MIC-946).\n *\n * Cookie-restored cart quantities can become stale when a ticket's\n * `remainingCapacity` drops or its per-order `maxQuantity` is reduced\n * between sessions. The submit-time oversell modal still catches a\n * runtime race, but we should not start the user with an over-cap\n * selection in the first place.\n *\n * `clampQuantitiesToCapacity` reduces each quantity entry to\n * `min(requested, max(0, remainingCapacity ?? Infinity), maxQuantity || Infinity)`\n * and removes entries that fall to 0 or below. It is a pure helper —\n * no state mutation, returns a fresh object so Svelte 5 runes pick up\n * the change.\n */\n\ninterface CapacityTicket {\n ID: number | string;\n remainingCapacity?: number | null;\n maxQuantity?: number | null;\n [key: string]: unknown;\n}\n\nexport function clampQuantitiesToCapacity(\n quantities: Record<string, number> | null | undefined,\n tickets: CapacityTicket[] | null | undefined\n): Record<string, number> {\n if (!quantities || typeof quantities !== \"object\") return {};\n if (!Array.isArray(tickets) || tickets.length === 0) {\n // No tickets to validate against — preserve only positive integers.\n const passthrough: Record<string, number> = {};\n for (const [id, qty] of Object.entries(quantities)) {\n if (typeof qty === \"number\" && qty > 0) passthrough[id] = qty;\n }\n return passthrough;\n }\n\n const ticketById = new Map<string, CapacityTicket>();\n for (const t of tickets) {\n if (t && t.ID !== undefined && t.ID !== null) {\n ticketById.set(String(t.ID), t);\n }\n }\n\n const clamped: Record<string, number> = {};\n for (const [id, requestedRaw] of Object.entries(quantities)) {\n if (typeof requestedRaw !== \"number\" || !Number.isFinite(requestedRaw)) continue;\n if (requestedRaw <= 0) continue;\n\n const ticket = ticketById.get(String(id));\n let cap = requestedRaw;\n\n if (ticket) {\n const remaining = ticket.remainingCapacity;\n if (typeof remaining === \"number\" && Number.isFinite(remaining)) {\n cap = Math.min(cap, Math.max(0, remaining));\n }\n const perOrderMax = ticket.maxQuantity;\n if (\n typeof perOrderMax === \"number\" &&\n Number.isFinite(perOrderMax) &&\n perOrderMax > 0\n ) {\n cap = Math.min(cap, perOrderMax);\n }\n }\n\n if (cap > 0) clamped[id] = cap;\n }\n\n return clamped;\n}\n","<script>\n import {\n AddIcon,\n SubtractIcon,\n } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\n import { Input, Button, formatCurrency } from '@getmicdrop/svelte-components';\n import { formatSmartSalesDate } from '@getmicdrop/svelte-components/utils/formatters';\n import { formatSalesDate } from '$lib/utils/datetime.js';\n import { computeScarcityLevel } from '$lib/constants/scarcity';\n import ScarcityBadge from '../../ScarcityBadge.svelte';\n\n let {\n title,\n description,\n price,\n fee = '0.00',\n quantity = 0,\n soldOut = false,\n status = null,\n salesBegin = null,\n salesEnd = null,\n remainingCapacity = null,\n totalCapacity = null, // Total ticket capacity for percentage calculation\n minQuantity = 1, // Minimum quantity per order (default 1)\n maxQuantity = null, // Maximum quantity per order (null = unlimited)\n discountedPrice = null, // Discounted price when promo applied\n isRevealed = false, // Badge: Unlocked via promo\n isDiscounted = false, // Badge: Discount applied\n ticketType = 0, // 0 = paid/standard, 1 = registration/free, 2 = donation\n donationAmount = '', // User-entered donation amount (string for input binding)\n onincrement,\n ondecrement,\n ondonationchange, // Callback when donation amount changes\n /**\n * True while a cart create/update network call is in flight. Used\n * to visually disable the +/- buttons so the user sees they can't\n * race the backend write. The CartView handler also guards, so\n * even without this prop the click would be ignored — this is\n * purely a UX hint that something is happening.\n */\n syncing = false,\n labels = {},\n } = $props();\n\n // Donation ticket logic\n const isDonation = $derived(ticketType === 2);\n const donationValue = $derived(parseFloat(donationAmount) || 0);\n const donationError = $derived(\n isDonation && donationAmount !== '' && donationValue < 1\n ? labels.minimumDonation || 'Minimum $1.00'\n : ''\n );\n const isDonationValid = $derived(\n !isDonation || (donationAmount !== '' && donationValue >= 1)\n );\n\n const priceValue = $derived(parseFloat(price) || 0);\n const feeValue = $derived(priceValue === 0 ? 0 : parseFloat(fee) || 0);\n const totalPrice = $derived(formatCurrency(priceValue + feeValue));\n const formattedFee = $derived(formatCurrency(feeValue));\n\n // Calculate discounted totals\n const discountedPriceValue = $derived(\n discountedPrice ? parseFloat(discountedPrice) : null\n );\n const discountedFeeValue = $derived(\n discountedPriceValue === null\n ? 0\n : discountedPriceValue === 0\n ? 0\n : parseFloat(fee) || 0\n );\n const discountedTotalPrice = $derived(\n discountedPriceValue !== null\n ? formatCurrency(discountedPriceValue + discountedFeeValue)\n : null\n );\n\n // Calculate effective total capacity (use totalCapacity if provided, otherwise use remainingCapacity as fallback)\n const effectiveTotalCapacity = $derived(\n totalCapacity ?? remainingCapacity ?? 0\n );\n\n // Scarcity tiers come from the single source of truth in\n // $lib/constants/scarcity so this component and ScarcityBadge agree\n // on what \"urgent\" vs \"low\" means (see docs/checkout-edge-cases.md\n // §6.5). Do not re-introduce inline thresholds here.\n const scarcityInfo = $derived.by(() => {\n const remaining = remainingCapacity ?? 0;\n const total = effectiveTotalCapacity;\n if (total === 0 || status === 'scheduled' || status === 'sales_ended')\n return null;\n if (priceValue === 0) return null; // no scarcity on free tickets\n\n const level = computeScarcityLevel(remaining, total);\n if (level === 'sold-out') return { text: 'Sold out', type: 'sold-out' };\n if (level === 'urgent') {\n return {\n text: `Only ${remaining} left`,\n type: 'scarcity',\n showFlame: true,\n };\n }\n if (level === 'low') {\n return { text: 'Few tickets left', type: 'scarcity', showFlame: true };\n }\n return null;\n });\n\n const showScarcityBadge = $derived(\n scarcityInfo != null && scarcityInfo.type === 'scarcity'\n );\n\n // Short \"Mmm D, h:mm AM\" timestamp for the sales-ended status metadata.\n // Routed through the tz-first canon's formatSalesDate ({month:short, day,\n // h:mm a}), pinned to 'UTC' to preserve the historical clock. Byte-identical\n // to the deprecated SC generic it replaces for the en-US default (proven in\n // datetime-adoption.byte-parity.test.ts); locale now follows the widget's\n // configured locale (the canon's DEFAULT_LOCALE, set from navigator.language)\n // like every other date in this component, instead of the old hardcoded\n // en-US — an intentional alignment, and moot in practice since this field is\n // not currently rendered. Null-safe (returns '' on empty input), so the old\n // falsy guard is no longer needed.\n function displaySalesEndDate(dateString) {\n return formatSalesDate(dateString, 'UTC');\n }\n\n // Smart sales-countdown text comes from the shared svelte-components\n // formatter (formatSmartSalesDate, SC #471) — byte-identical to the inline\n // logic this component originally carried (thresholds, UTC clock time,\n // locale-aware weekday/month names). VC's `labels` object already matches its\n // SmartSalesDateLabels contract, so forwarding it keeps output unchanged. The\n // { text, preposition } wrapper is preserved for existing consumers.\n function formatSmartTime(dateString) {\n return { text: formatSmartSalesDate(dateString, labels), preposition: '' };\n }\n\n // Format sales start with smart thresholds\n function formatSalesStart(dateString) {\n const { text } = formatSmartTime(dateString);\n return text;\n }\n\n // Format sales end with smart thresholds\n function formatSalesEnd(dateString) {\n return formatSmartTime(dateString);\n }\n\n // Check if sales end is imminent (within 24 hours) for styling urgency\n function isSalesEndingSoon(dateString) {\n if (!dateString) return false;\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffHours = diffMs / (1000 * 60 * 60);\n return diffHours > 0 && diffHours <= 24;\n }\n\n const statusInfo = $derived(\n (() => {\n if (!status) return null;\n\n switch (status) {\n case 'scheduled':\n return {\n showAsMessage: true, // Display as inline message instead of badge\n message: (labels.salesStart || 'Sales start {salesStart}').replace(\n '{salesStart}',\n formatSalesStart(salesBegin)\n ),\n };\n case 'on_sale':\n return null; // Don't show badge for normal on-sale status\n case 'sales_ended':\n return {\n badge: labels.statusSalesEnded || 'Sales ended',\n badgeClass: 'badge-ended',\n label: 'Ended',\n date: displaySalesEndDate(salesEnd),\n };\n default:\n return null;\n }\n })()\n );\n</script>\n\n<article\n class=\"ticket-block rounded-lg border transition-all {quantity > 0\n ? 'shadow-sm'\n : ''}\"\n class:selected={quantity > 0}\n class:disabled-ticket={soldOut ||\n status === 'scheduled' ||\n status === 'sales_ended'}\n aria-label=\"{(labels.ticketAriaLabel || '{title} ticket').replace(\n '{title}',\n title\n )}{soldOut ? labels.ticketSoldOutSuffix || ', sold out' : ''}{status ===\n 'scheduled'\n ? labels.ticketSalesNotStartedSuffix || ', sales not yet started'\n : ''}{status === 'sales_ended'\n ? labels.ticketSalesEndedSuffix || ', sales ended'\n : ''}\"\n>\n <div class=\"p-4 pb-0\">\n <!-- Header row: title + stepper -->\n <div class=\"vc-flex-between-start gap-4\">\n <div class=\"flex-1 min-w-0\">\n <h3\n class=\"type-subheading text-primary\"\n id=\"ticket-title-{title?.replace(/\\s+/g, '-').toLowerCase() ||\n 'ticket'}\"\n >\n {title}\n </h3>\n </div>\n\n <!-- Quantity selector (top right) - or sales start message for scheduled tickets -->\n {#if !soldOut && status !== 'scheduled' && status !== 'sales_ended'}\n <div\n class=\"flex items-center quantity-selector\"\n class:active={quantity > 0}\n role=\"group\"\n aria-label={(\n labels.quantitySelector || 'Quantity selector for {title}'\n ).replace('{title}', title)}\n >\n <Button\n variant=\"icon-brand\"\n size=\"icon-sm\"\n onclick={() => ondecrement?.()}\n disabled={quantity === 0 || syncing}\n aria-label={(\n labels.decreaseQuantity || 'Decrease quantity for {title}'\n ).replace('{title}', title)}\n >\n <SubtractIcon size=\"20\" />\n </Button>\n <span\n class=\"qty-display\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n role=\"status\"\n >\n <span class=\"sr-only\">{labels.quantity || 'Quantity:'}</span>\n {quantity}\n </span>\n <Button\n variant=\"icon-brand\"\n size=\"icon-sm\"\n onclick={() => onincrement?.()}\n disabled={(maxQuantity !== null && quantity >= maxQuantity) ||\n (remainingCapacity !== null && quantity >= remainingCapacity) ||\n !isDonationValid ||\n syncing}\n aria-label={(\n labels.increaseQuantity || 'Increase quantity for {title}'\n ).replace('{title}', title)}\n >\n <AddIcon size=\"20\" />\n </Button>\n </div>\n {:else if soldOut}\n <span\n class=\"sold-out-pill type-caption whitespace-nowrap\"\n role=\"status\"\n aria-label={labels.statusSoldOut || 'Sold out'}\n >\n {labels.statusSoldOut || 'Sold out'}\n </span>\n {:else if status === 'scheduled' && statusInfo?.message}\n <span\n class=\"sales-start-badge type-caption text-secondary whitespace-nowrap\"\n role=\"status\"\n >\n {statusInfo.message}\n </span>\n {/if}\n </div>\n </div>\n\n <!-- Horizontal solid divider (touches card edges) -->\n <hr class=\"divider-line my-3\" aria-hidden=\"true\" />\n\n <div class=\"p-4 pt-0\">\n <!-- Price (left aligned, below title) -->\n <div\n class=\"flex-row-2 mb-2\"\n id=\"ticket-price-{title?.replace(/\\s+/g, '-').toLowerCase() || 'ticket'}\"\n >\n {#if isDonation}\n <!-- Donation ticket: show amount input -->\n <div class=\"donation-input-wrapper\">\n <Input\n label={labels.donationAmountLabel || 'Donation amount in dollars'}\n size=\"lg\"\n type=\"text\"\n inputmode=\"decimal\"\n placeholder=\"0.00\"\n value={donationAmount}\n oninputchange={v => ondonationchange?.(v)}\n disabled={soldOut ||\n status === 'scheduled' ||\n status === 'sales_ended'}\n errorText={donationError}\n aria-describedby={donationError\n ? 'donation-error-' + title?.replace(/\\s+/g, '-').toLowerCase()\n : undefined}\n />\n {#if donationError}\n <span\n id=\"donation-error-{title?.replace(/\\s+/g, '-').toLowerCase()}\"\n class=\"sr-only\"\n role=\"alert\"\n >\n {donationError}\n </span>\n {/if}\n </div>\n {:else if discountedTotalPrice !== null}\n <span\n class=\"price-lg text-primary\"\n aria-label=\"Discounted price {discountedTotalPrice}\"\n >{discountedTotalPrice}</span\n >\n <span\n class=\"price-strikethrough\"\n aria-label=\"Original price {totalPrice}\"\n ><span class=\"sr-only\"\n >{labels.originalPrice || 'Original price:'}\n </span>{totalPrice}</span\n >\n <span class=\"price-fee\" aria-hidden=\"true\"\n >{(labels.inclFee || 'incl. {fee} fee').replace(\n '{fee}',\n formattedFee\n )}</span\n >\n <span class=\"sr-only\"\n >{(labels.includingFee || 'including {fee} service fee').replace(\n '{fee}',\n formattedFee\n )}</span\n >\n {:else if priceValue === 0}\n <span class=\"price-lg text-primary\">{labels.free || 'Free'}</span>\n {:else}\n <span class=\"price-lg text-primary\" aria-label=\"Price {totalPrice}\"\n >{totalPrice}</span\n >\n <span class=\"price-fee\" aria-hidden=\"true\"\n >{(labels.inclFee || 'incl. {fee} fee').replace(\n '{fee}',\n formattedFee\n )}</span\n >\n <span class=\"sr-only\"\n >{(labels.includingFee || 'including {fee} service fee').replace(\n '{fee}',\n formattedFee\n )}</span\n >\n {/if}\n </div>\n\n <!-- Discount/Unlocked badges (below price, above description) -->\n {#if isDiscounted || isRevealed}\n <div class=\"flex-row-2 mb-2 flex-wrap\" role=\"status\" aria-live=\"polite\">\n {#if isDiscounted}\n <span class=\"badge badge-discount\">\n {labels.discountApplied || 'Discount applied'}\n </span>\n {/if}\n {#if isRevealed}\n <span class=\"badge badge-unlocked\">\n {labels.unlocked || 'Unlocked'}\n </span>\n {/if}\n </div>\n {/if}\n\n <!-- Description if present -->\n {#if description}\n <p\n class=\"type-body text-secondary mb-3\"\n id=\"ticket-desc-{title?.replace(/\\s+/g, '-').toLowerCase() || 'ticket'}\"\n >\n {description}\n </p>\n {/if}\n\n <!-- Status badges and scarcity -->\n <div class=\"flex-row-2 mb-2 flex-wrap\" role=\"status\">\n {#if statusInfo && statusInfo.badge}\n <span\n class=\"badge {statusInfo.badgeClass}\"\n aria-label=\"{labels.statusLabel || 'Status:'} {statusInfo.badge}\"\n >\n {statusInfo.badge}\n </span>\n {/if}\n {#if showScarcityBadge}\n <ScarcityBadge\n remaining={remainingCapacity ?? 0}\n total={effectiveTotalCapacity}\n context=\"ticket\"\n {labels}\n />\n {/if}\n </div>\n\n <!-- Sales end date (hide for scheduled tickets - sales start shown in header) -->\n {#if salesEnd && status !== 'sales_ended' && status !== 'scheduled'}\n {@const endTime = formatSalesEnd(salesEnd)}\n <p class=\"sales-end-text type-caption\" role=\"status\">\n {labels.salesEndPrefix || 'Sales end'}\n {endTime.text}\n </p>\n {/if}\n </div>\n</article>\n\n<style>\n /*\n * @style-escape: disabled-ticket opacity for sold-out / scheduled /\n * sales-ended cards uses `!important` to win over the dimmed sub-element\n * colours and present the whole card as one muted unit.\n */\n /* Theme-responsive colors using CSS variables with page-specific overrides */\n .ticket-block {\n border-color: hsl(var(--stroke-secondary));\n background-color: hsl(var(--ts-card-bg, var(--bg-primary)));\n }\n\n .ticket-block:hover:not(.selected) {\n border-color: hsl(var(--stroke-primary));\n }\n\n .ticket-block.selected {\n border-color: hsl(var(--brand-primary));\n background-color: hsl(var(--ts-card-bg, var(--bg-primary)));\n box-shadow: 0 1px 2px 0 color-mix(in srgb, black 5%, transparent);\n }\n\n /* Disabled state for sold out, scheduled, or sales ended tickets */\n .ticket-block.disabled-ticket {\n opacity: 0.6 !important;\n }\n\n .ticket-block.disabled-ticket:hover {\n border-color: hsl(var(--stroke-secondary));\n }\n\n .text-primary {\n color: hsl(var(--text-primary));\n }\n\n .text-secondary {\n color: hsl(var(--text-secondary));\n }\n\n .tone-muted {\n color: hsl(var(--text-tertiary, 220 9% 46%));\n }\n\n /* Status badges */\n .badge-scheduled {\n background-color: hsl(var(--status-selling-fast) / 15%);\n color: hsl(var(--status-selling-fast));\n }\n\n .badge-ended {\n background-color: hsl(var(--stroke-secondary));\n color: hsl(var(--text-secondary));\n }\n\n /* Sold-out pill (header right slot when stepper is hidden) */\n .sold-out-pill {\n display: inline-flex;\n align-items: center;\n padding: 0.25rem 0.625rem;\n border-radius: 9999px;\n font-weight: 600;\n background-color: hsl(var(--stroke-secondary));\n color: hsl(var(--text-secondary));\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n /* Quantity selector */\n .quantity-selector {\n gap: 0.5rem;\n user-select: none;\n user-select: none;\n }\n\n .qty-display {\n min-width: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.25rem;\n font-weight: 600;\n color: hsl(var(--text-primary));\n user-select: none;\n user-select: none;\n }\n\n /* Divider line */\n .divider-line {\n height: 1px;\n border: none;\n background-color: hsl(var(--stroke-secondary));\n margin-left: 0;\n margin-right: 0;\n }\n\n /* Sales end date */\n .sales-end-text {\n color: hsl(var(--text-tertiary, 220 9% 46%));\n }\n\n /* Donation input wrapper - contains design system Input */\n .donation-input-wrapper {\n min-width: 10rem;\n }\n</style>\n","<script>\n let { labels = {} } = $props();\n</script>\n\n<div\n class=\"rounded-lg overflow-hidden animate-pulse bg-surface-primary border-default\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label={labels.loadingTicketInfo || \"Loading ticket information\"}\n>\n <span class=\"sr-only\">Loading ticket...</span>\n <div class=\"px-3 py-2.5 rounded-t-lg border-t border-l border-r border-border\" aria-hidden=\"true\">\n <div class=\"skeleton h-4 w-2/3 mb-2\"></div>\n <div class=\"skeleton h-3 w-1/2\"></div>\n </div>\n\n <div class=\"flex items-center gap-2\" aria-hidden=\"true\">\n <div class=\"border w-6 rounded-full h-6 -ml-3 -mt-0.5 bg-card border-border\"></div>\n <hr class=\"skeleton-divider w-full my-3\" />\n <div class=\"border w-6 rounded-full h-6 -mr-3 -mt-0.5 bg-card border-border\"></div>\n </div>\n\n <div class=\"flex justify-between items-center px-3 py-2.5 rounded-b-lg -mt-0.5 border-b border-l border-r border-border\" aria-hidden=\"true\">\n <div class=\"space-y-1\">\n <div class=\"h-4 rounded w-16 bg-bg-tertiary\"></div>\n <div class=\"h-3 rounded w-20 bg-muted\"></div>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <div class=\"w-10 h-10 rounded-md bg-bg-tertiary\"></div>\n <div class=\"w-10 h-10 rounded-md bg-muted\"></div>\n <div class=\"w-10 h-10 rounded-md bg-bg-tertiary\"></div>\n </div>\n </div>\n</div>\n\n<style>\n .skeleton-divider {\n height: 1px;\n border: none;\n background-image: repeating-linear-gradient(\n to right,\n hsl(var(--border)) 0,\n hsl(var(--border)) 12px,\n transparent 10px,\n transparent 20px\n );\n \n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\n background-image: repeating-linear-gradient(\n to right,\n hsl(var(--text-secondary)) 0,\n hsl(var(--text-secondary)) 12px,\n transparent 10px,\n transparent 20px\n );\n }\n }\n\n /* Screen reader only text */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n</style>\n","<!--\n @currency-escape: Two .toFixed(2) sites in the promo-discount calculator\n (lines ~215 + ~217). These compute the DISCOUNTED price string from\n basePrice and a promo discount; the .toFixed(2) is intermediate math\n for a price-shape return value, NOT a final display. The caller wraps\n the result with formatCurrency or similar before rendering. utility-\n currency record documents promo-math .toFixed as canonical exception.\n-->\n<script>\n import { formatCurrency, typography } from '@getmicdrop/svelte-components';\n import TicketBlock from './TicketBlock.svelte';\n import TicketSkeleton from './TicketSkeleton.svelte';\n\n let {\n venueFeesReady = false,\n tickets = [],\n quantities = {},\n donationAmounts = {}, // Map of ticketId -> donation amount string\n handleQuantityChange,\n handleDonationChange, // Callback when donation amount changes: (ticketId, amount) => void\n revealHiddenTickets = false,\n revealTicketIds = [],\n currentPromoRule = null, // Current applied promo code rule\n syncing = false, // True while a cart-sync network call is in flight\n labels = {},\n } = $props();\n\n // Compute ticket status based on salesBegin and salesEnd dates\n function computeTicketStatus(ticket) {\n // If ticket already has a computed status (not from API), use it\n // But ignore API status if we have date fields to check\n const now = new Date();\n\n // Try multiple possible field names for sales begin date\n const salesBeginValue =\n ticket.salesBegin ||\n ticket.salesStart ||\n ticket.saleBegin ||\n ticket.saleStart ||\n ticket.onSaleStart;\n // Try multiple possible field names for sales end date\n const salesEndValue = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\n\n // Check if sales haven't started yet\n if (salesBeginValue) {\n const salesBeginDate = new Date(salesBeginValue);\n if (salesBeginDate > now) {\n return 'scheduled';\n }\n }\n\n // Check if sales have ended\n if (salesEndValue) {\n const salesEndDate = new Date(salesEndValue);\n if (salesEndDate < now) {\n return 'sales_ended';\n }\n }\n\n // Default to on_sale\n return 'on_sale';\n }\n\n // Get sales begin date from ticket (handles multiple field names)\n function getSalesBegin(ticket) {\n return (\n ticket.salesBegin ||\n ticket.salesStart ||\n ticket.saleBegin ||\n ticket.saleStart ||\n ticket.onSaleStart ||\n null\n );\n }\n\n const visibleTickets = $derived(\n tickets.filter(t => {\n // visibility 0 = always visible to customers\n if (t.visibility === 0) return true;\n // visibility 1+ = hidden (only show if promo code reveals)\n if (revealHiddenTickets) return true;\n return revealTicketIds?.includes(t.ID);\n })\n );\n\n // Sort tickets: on-sale first (preserving backend order), then unavailable at bottom\n function sortTicketsByAvailability(ticketList) {\n // Compute status for each ticket and partition into available/unavailable\n const available = [];\n const unavailable = [];\n\n for (const ticket of ticketList) {\n const status = computeTicketStatus(ticket);\n const minQty = ticket.minQuantity ?? 1;\n const remaining = ticket.remainingCapacity;\n // Ticket is effectively sold out if minQuantity > remainingCapacity\n const effectivelySoldOut =\n ticket.soldOut ||\n (remaining !== null && remaining !== undefined && minQty > remaining);\n\n if (status === 'on_sale' && !effectivelySoldOut) {\n available.push(ticket);\n } else {\n unavailable.push(ticket);\n }\n }\n\n // Return available tickets in original order, then unavailable in original order\n return [...available, ...unavailable];\n }\n\n function groupTicketsBySection(tickets) {\n const groups = {};\n for (const ticket of tickets) {\n const sectionName = ticket.TicketSection?.name || labels.other || 'Other';\n if (!groups[sectionName]) {\n groups[sectionName] = [];\n }\n groups[sectionName].push(ticket);\n }\n // Sort tickets within each section: on-sale first, unavailable at bottom\n for (const sectionName of Object.keys(groups)) {\n groups[sectionName] = sortTicketsByAvailability(groups[sectionName]);\n }\n return groups;\n }\n\n const groupedTickets = $derived(groupTicketsBySection(visibleTickets));\n const otherLabel = $derived(labels.other || 'Other');\n const hasMultipleGroups = $derived(\n Object.keys(groupedTickets).filter(n => n !== otherLabel).length > 0\n );\n</script>\n\n{#if venueFeesReady && visibleTickets.length === 0}\n <div\n class=\"empty-state flex flex-col items-center justify-center py-12 px-6 text-center\"\n role=\"status\"\n aria-label={labels.noTicketsAvailable || 'No tickets available'}\n >\n <div class=\"empty-state-icon tone-muted mb-4\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z\"\n />\n <path d=\"M13 5v2\" />\n <path d=\"M13 17v2\" />\n <path d=\"M13 11v2\" />\n </svg>\n </div>\n <h3 class=\"mb-2 {typography.h3}\">\n {labels.noTicketsAvailable || 'No tickets available'}\n </h3>\n <p class=\"type-body tone-secondary max-w-72\">\n {labels.noTicketsAvailableDescription ||\n 'There are currently no tickets available for this event.'}\n </p>\n </div>\n{:else}\n <section aria-label={labels.availableTickets || 'Available tickets'}>\n {#each Object.entries(groupedTickets) as [sectionName, sectionTickets]}\n <div\n class={hasMultipleGroups && sectionName !== otherLabel\n ? 'ticket-section-group border border-border rounded-lg overflow-hidden'\n : ''}\n role=\"group\"\n aria-labelledby={hasMultipleGroups && sectionName !== otherLabel\n ? `section-${sectionName.replace(/\\s+/g, '-').toLowerCase()}`\n : undefined}\n >\n {#if hasMultipleGroups && sectionName !== otherLabel}\n <div class=\"section-header bg-bg-secondary px-5 py-3\">\n <h2\n class=\"type-subheading tone-primary\"\n id=\"section-{sectionName.replace(/\\s+/g, '-').toLowerCase()}\"\n >\n {sectionName}\n </h2>\n </div>\n {/if}\n\n <div\n class=\"space-y-4 {hasMultipleGroups && sectionName !== otherLabel\n ? 'p-4'\n : ''}\"\n role=\"list\"\n aria-label={(\n labels.ticketsInSection || 'Tickets in {section}'\n ).replace('{section}', sectionName)}\n >\n {#if venueFeesReady}\n {#each sectionTickets as ticket}\n {@const isRevealed =\n (ticket.visibility >= 2 && revealHiddenTickets) ||\n revealTicketIds.includes(ticket.ID)}\n {@const discountTicketIds =\n currentPromoRule?.discountTicketIds || []}\n {@const ticketEligibleForDiscount =\n discountTicketIds.length === 0 ||\n discountTicketIds.includes(ticket.ID)}\n {@const hasDiscount =\n currentPromoRule?.provideDiscount &&\n ticketEligibleForDiscount &&\n (currentPromoRule?.discountType === '%' ||\n currentPromoRule?.discountType === '$')}\n {@const discountedPrice = (() => {\n if (!hasDiscount) return null;\n const basePrice = parseFloat(ticket.price) || 0;\n const discountAmount =\n parseFloat(currentPromoRule?.amount || '0') || 0;\n if (currentPromoRule.discountType === '%') {\n return (basePrice * (1 - discountAmount / 100)).toFixed(2);\n } else if (currentPromoRule.discountType === '$') {\n return Math.max(0, basePrice - discountAmount).toFixed(2);\n }\n return null;\n })()}\n {@const computedStatus = computeTicketStatus(ticket)}\n {@const salesBeginDate = getSalesBegin(ticket)}\n {@const minQty = ticket.minQuantity ?? 1}\n {@const remaining = ticket.remainingCapacity}\n {@const effectivelySoldOut =\n ticket.soldOut ||\n (remaining !== null &&\n remaining !== undefined &&\n minQty > remaining)}\n {@const ticketType = ticket.type ?? 0}\n {@const isDonation = ticketType === 2}\n <TicketBlock\n {labels}\n title={ticket.name}\n description={ticket.description}\n price={ticket.price}\n {discountedPrice}\n quantity={quantities[ticket.ID] ?? 0}\n soldOut={effectivelySoldOut}\n status={computedStatus}\n salesBegin={salesBeginDate}\n salesEnd={ticket.salesEnd}\n remainingCapacity={ticket.remainingCapacity}\n totalCapacity={ticket.totalCapacity ??\n ticket.quantity ??\n ticket.remainingCapacity}\n minQuantity={ticket.minQuantity ?? 1}\n maxQuantity={ticket.maxQuantity ?? null}\n {isRevealed}\n isDiscounted={hasDiscount}\n {ticketType}\n donationAmount={donationAmounts[ticket.ID] ?? ''}\n onincrement={() => handleQuantityChange(ticket.ID, 1)}\n ondecrement={() => handleQuantityChange(ticket.ID, -1)}\n ondonationchange={amount =>\n handleDonationChange?.(ticket.ID, amount)}\n {syncing}\n />\n {/each}\n {:else}\n {#each Array(2) as _}\n <TicketSkeleton />\n {/each}\n {/if}\n </div>\n </div>\n {/each}\n </section>\n{/if}\n","<script module>\n import { createLogger, formatCurrency } from '@getmicdrop/svelte-components';\n const logger = createLogger('PromocodeInput');\n</script>\n\n<script>\n import { onMount } from 'svelte';\n import { Input, Button } from '@getmicdrop/svelte-components';\n import { getCookie, setCookie, removeCookie } from '$lib/utils/utils';\n import { validatePromoCode } from '$lib/api';\n\n let { eventID = '', onpromoChange, labels = {} } = $props();\n\n let inputValue = $state('');\n let touched = $state(false);\n let isFocused = $state(false);\n let displayErrorText = $state('');\n let hintText = $state('');\n let isApplied = $state(false);\n let isValidating = $state(false);\n\n // Validate and apply promo code via API\n const applyPromocode = async () => {\n const trimmedCode = inputValue.trim().toUpperCase();\n\n displayErrorText = '';\n hintText = '';\n isApplied = false;\n\n if (!trimmedCode) {\n displayErrorText =\n labels.pleaseEnterPromoCode || 'Please enter a promo code.';\n touched = true;\n return;\n }\n\n isValidating = true;\n\n try {\n const result = await validatePromoCode(eventID, trimmedCode);\n\n if (result.valid) {\n isApplied = true;\n let discount = 0;\n\n // Build hint text based on what the promo provides\n const hints = [];\n\n // Reveal hidden tickets\n if (result.revealHiddenTickets) {\n hints.push(\n labels.hiddenTicketsVisible || 'Hidden tickets are now visible.'\n );\n }\n\n // Calculate discount\n if (result.provideDiscount) {\n const amt = parseFloat(String(result.amount || '0')) || 0;\n discount = amt;\n\n if (result.discountType === 'fixed') {\n // @currency-escape: i18n label template — Crowdin audit pending for non-English locales that may need the same $-drop\n hints.push(\n (\n labels.dollarDiscountAvailable ||\n 'A {amount} discount is available.'\n ).replace(\n '{amount}',\n formatCurrency(\n amt /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */\n )\n )\n );\n } else if (result.discountType === 'percentage') {\n hints.push(\n (\n labels.percentDiscountAvailable ||\n 'A {amount}% discount is available.'\n ).replace('{amount}', String(amt))\n );\n }\n }\n\n hintText =\n hints.length > 0\n ? `${(labels.promoApplied || '{code} applied.').replace('{code}', trimmedCode)} ${hints.join(' ')}`\n : (labels.promoApplied || '{code} applied.').replace(\n '{code}',\n trimmedCode\n );\n\n // Save to cookies - store full promo data for other pages.\n // SameSite=None; Secure so the cookie survives iframe embeds on\n // third-party origins (see §14.2). The pre-existing `1` 3rd arg\n // was being silently ignored by the cookies.ts wrapper (it\n // expects CookieAttributes, not a raw day count) — now passed\n // as { expires: 1, ... } so it actually applies.\n const promoOpts = {\n expires: 1,\n secure: true,\n sameSite: 'none',\n path: '/',\n };\n setCookie(`checkout-promocode-${eventID}`, trimmedCode, promoOpts);\n setCookie('checkout-promo-discount', discount.toString(), promoOpts);\n setCookie(\n `checkout-promo-reveal-${eventID}`,\n result.revealHiddenTickets ? '1' : '0',\n promoOpts\n );\n setCookie(\n `checkout-promo-reveal-ids-${eventID}`,\n JSON.stringify(result.revealTicketIds || []),\n promoOpts\n );\n setCookie(\n `checkout-promo-discount-type-${eventID}`,\n result.discountType || '',\n promoOpts\n );\n\n onpromoChange?.({\n code: trimmedCode,\n error: '',\n hint: hintText,\n discount,\n provideDiscount: result.provideDiscount || false,\n discountType: result.discountType || '',\n discountTicketIds:\n /** @type {any} */ (result).discountTicketIds || [], // Which tickets the discount applies to\n revealHiddenTickets: result.revealHiddenTickets || false,\n revealTicketIds: result.revealTicketIds || [],\n isApplied: true,\n });\n } else {\n displayErrorText =\n labels.invalidOrExpiredPromoCode || 'Invalid or expired promo code.';\n touched = true;\n\n onpromoChange?.({\n code: trimmedCode,\n error: displayErrorText,\n hint: '',\n discount: 0,\n provideDiscount: false,\n discountType: '',\n discountTicketIds: [],\n revealHiddenTickets: false,\n revealTicketIds: [],\n isApplied: false,\n });\n }\n } catch (error) {\n logger.error('Error validating promo code:', error);\n displayErrorText =\n labels.unableToValidatePromoCode ||\n 'Unable to validate promo code. Please try again.';\n touched = true;\n } finally {\n isValidating = false;\n }\n };\n\n // Clear promo code\n const clearPromocode = () => {\n inputValue = '';\n displayErrorText = '';\n hintText = '';\n isApplied = false;\n touched = false;\n\n removeCookie(`checkout-promocode-${eventID}`);\n removeCookie('checkout-promo-discount');\n removeCookie(`checkout-promo-reveal-${eventID}`);\n removeCookie(`checkout-promo-reveal-ids-${eventID}`);\n removeCookie(`checkout-promo-discount-type-${eventID}`);\n\n onpromoChange?.({\n code: '',\n error: '',\n hint: '',\n discount: 0,\n provideDiscount: false,\n discountType: '',\n discountTicketIds: [],\n revealHiddenTickets: false,\n revealTicketIds: [],\n isApplied: false,\n });\n };\n\n // Handle input\n const handleInput = e => {\n inputValue = e.target.value;\n if (displayErrorText) displayErrorText = '';\n };\n\n // Handle Enter key\n const handleKeydown = e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n applyPromocode();\n }\n };\n\n // Load saved promo code on mount\n onMount(() => {\n const saved = getCookie(`checkout-promocode-${eventID}`);\n if (saved) {\n inputValue = saved;\n applyPromocode();\n }\n });\n</script>\n\n<div\n class=\"promo-section p-4 md:p-5\"\n role=\"group\"\n aria-labelledby=\"promo-label\"\n>\n <span id=\"promo-label\" class=\"sr-only\"\n >{labels.promoCodeEntry || 'Promo code entry'}</span\n >\n <div class=\"promo-input-wrapper flex gap-2 items-start\">\n <div class=\"flex-1\">\n <Input\n label={labels.promoCode || 'Promo code'}\n size=\"lg\"\n type=\"text\"\n bind:value={inputValue}\n oninputchange={handleInput}\n onkeydown={handleKeydown}\n onblur={() => (touched = true)}\n disabled={isApplied || isValidating}\n errorText={touched ? displayErrorText : ''}\n aria-describedby={hintText\n ? 'promo-hint'\n : displayErrorText\n ? 'promo-error'\n : undefined}\n />\n </div>\n\n {#if isApplied}\n <div class=\"self-start mt-5\">\n <Button\n variant=\"outline\"\n onclick={clearPromocode}\n class=\"h-10\"\n aria-label=\"{labels.removePromoCode ||\n 'Remove promo code'} {inputValue}\"\n >\n {labels.remove || 'Remove'}\n </Button>\n </div>\n {:else}\n <div class=\"self-start mt-5\">\n <Button\n onclick={applyPromocode}\n disabled={isValidating}\n class=\"h-10\"\n aria-label={isValidating\n ? labels.checkingPromoCode || 'Checking promo code'\n : labels.applyPromoCode || 'Apply promo code'}\n >\n {isValidating\n ? labels.checking || 'Checking...'\n : labels.apply || 'Apply'}\n </Button>\n </div>\n {/if}\n </div>\n\n {#if hintText}\n <p\n id=\"promo-hint\"\n class=\"promo-message success mt-2 body-sm text-accent-success\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {hintText}\n </p>\n {/if}\n {#if displayErrorText && touched}\n <p id=\"promo-error\" class=\"sr-only\" role=\"alert\">{displayErrorText}</p>\n {/if}\n</div>\n\n<style>\n /* Screen reader only text */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n</style>\n","<script>\n let { labels = {} } = $props();\n</script>\n\n<div\n class=\"hidden md:block h-fit rounded-lg p-5 space-y-5 animate-pulse bg-card border border-border\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label={labels.loadingOrderSummary || \"Loading order summary\"}\n>\n <span class=\"sr-only\">Loading order summary...</span>\n <div class=\"h-6 rounded w-2/3 bg-bg-tertiary\" aria-hidden=\"true\"></div>\n\n {#each Array(2) as _}\n <div class=\"flex justify-between items-center pb-4 border-b border-border\" aria-hidden=\"true\">\n <div>\n <div class=\"h-4 rounded w-24 mb-2 bg-bg-tertiary\"></div>\n <div class=\"h-3 rounded w-16 bg-bg-tertiary\"></div>\n </div>\n <div class=\"h-4 rounded w-12 bg-bg-tertiary\"></div>\n </div>\n {/each}\n\n <div class=\"space-y-3 pt-4\" aria-hidden=\"true\">\n <div class=\"flex justify-between\">\n <div class=\"h-4 rounded w-20 bg-bg-tertiary\"></div>\n <div class=\"h-4 rounded w-12 bg-bg-tertiary\"></div>\n </div>\n <div class=\"flex justify-between\">\n <div class=\"h-4 rounded w-16 bg-bg-tertiary\"></div>\n <div class=\"h-4 rounded w-12 bg-bg-tertiary\"></div>\n </div>\n <div class=\"flex justify-between\">\n <div class=\"h-4 rounded w-12 bg-bg-tertiary\"></div>\n <div class=\"h-4 rounded w-12 bg-bg-tertiary\"></div>\n </div>\n </div>\n\n <div class=\"h-10 rounded mt-5 bg-muted\" aria-hidden=\"true\"></div>\n</div>\n\n<style>\n /* Screen reader only text */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n</style>\n","<!-- native-element-exception: VC is an embeddable widget — native <button>s are intentional here (widget-controlled styling on calendar cells, date selectors, checkout/nav CTAs). -->\n<script>\n import { Image, formatCurrency } from '@getmicdrop/svelte-components';\n import { getDefaultTimezone } from '@getmicdrop/svelte-components/utils/timezones';\n import {\n ArrowLeftIcon,\n InfoIcon,\n } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\n import {\n formatFullDate,\n formatEventTime,\n formatTimeRange,\n formatDoorsTime,\n } from '$lib/utils/datetime.js';\n\n /** @type {{\n * event: any;\n * variant?: string;\n * total?: number;\n * onCancel?: (e: MouseEvent) => void;\n * onInfoClick?: (e: MouseEvent) => void;\n * labels?: Record<string, string>;\n * }} */\n let {\n event,\n variant = 'tickets',\n total = 0,\n onCancel = () => {},\n onInfoClick = () => {},\n labels = {},\n } = $props();\n\n // Get timezone from event, default to LA. Read both casings: transformed\n // events carry `timeZone`, raw events carry lowercase `timezone`.\n let timeZone = $derived(\n event.timeZone || event.timezone || getDefaultTimezone()\n );\n\n let showEndTime = $derived(event.displayEndTime === true);\n let showDoorsTime = $derived(event.displayDoorsTime === true);\n\n let isCheckout = $derived(variant === 'checkout');\n let priceDisplay = $derived(\n total > 0\n ? `${formatCurrency(total /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */)}`\n : labels.free || 'Free'\n );\n</script>\n\n<header\n class=\"flex items-center gap-3 px-4 md:px-5 py-4 border-b border-border\"\n>\n <button\n type=\"button\"\n class=\"p-2 -ml-2 rounded-full transition-colors shrink-0 tone-secondary hover:bg-bg-secondary\"\n onclick={onCancel}\n aria-label={isCheckout\n ? labels.goBackToTicketSelection || 'Go back to ticket selection'\n : labels.goBackToEventDetails || 'Go back to event details'}\n >\n <ArrowLeftIcon size=\"20\" />\n </button>\n\n {#if event.image}\n <div\n class=\"w-14 h-14 shrink-0 rounded-md overflow-hidden bg-bg-secondary\"\n aria-hidden=\"true\"\n >\n <Image src={event.image} alt=\"\" class=\"w-full h-full\" />\n </div>\n {/if}\n\n <div class=\"flex-1 min-w-0\">\n <h1 class=\"heading-lg break-words\">{event.name}</h1>\n <div\n class=\"body-sm tone-secondary\"\n aria-label={labels.ariaEventDateTime || 'Event date and time'}\n >\n <p>\n <time datetime={event.startDateTime}\n >{formatFullDate(event.startDateTime, timeZone)}</time\n >\n </p>\n <p>\n {showEndTime && event.endDateTime\n ? formatTimeRange(event.startDateTime, event.endDateTime, timeZone)\n : formatEventTime(event.startDateTime, timeZone)}\n </p>\n {#if showDoorsTime && event.doorsOpenTime}\n <p>\n {(labels.doorsOpen || 'Doors open {time}').replace(\n '{time}',\n formatDoorsTime(event.doorsOpenTime, timeZone)\n )}\n </p>\n {/if}\n </div>\n </div>\n\n {#if isCheckout}\n <div class=\"flex-row-2 shrink-0\">\n <span\n class=\"price-md\"\n aria-label={(labels.ariaOrderTotal || 'Order total: {total}').replace(\n '{total}',\n priceDisplay\n )}>{priceDisplay}</span\n >\n <button\n type=\"button\"\n class=\"sc-btn-icon btn-icon-ghost w-7 h-7\"\n onclick={onInfoClick}\n aria-label={labels.viewOrderDetails || 'View order details'}\n >\n <InfoIcon size=\"20\" />\n </button>\n </div>\n {/if}\n</header>\n\n<style>\n /* Hide info button on desktop - order summary is always visible */\n @media (width >= 872px) {\n .info-btn {\n display: none;\n }\n }\n</style>\n","<!-- native-element-exception: VC is an embeddable widget — native <button>s are intentional here (widget-controlled styling on calendar cells, date selectors, checkout/nav CTAs). -->\n<!-- @fetch-escape: tax-preview deliberately uses raw fetch — a 422 is the EXPECTED \"venue has no tax address\" $0-tax fallback, but the canonical api-client fires the global onError handler on every non-OK response (no per-call suppression option), which would emit API-error noise for this benign case. Raw fetch also preserves same-origin cookie defaults + throw-on-abort semantics the in-flight dedupe relies on. See fetchTaxPreview(). -->\n<script module>\n import {\n createLogger,\n formatCurrency,\n typography,\n } from '@getmicdrop/svelte-components';\n const logger = createLogger('CartView');\n</script>\n\n<script>\n import { onMount, onDestroy } from 'svelte';\n import { goto } from '$app/navigation';\n import {\n trackUTMSource,\n initiateOrder,\n loadCheckoutStateFromCookies,\n clearCheckoutCookies,\n persistCheckoutState,\n ensureOrderIdExists,\n getCookie,\n removeCookie,\n setCookie,\n resolvePromoDiscountDollars,\n } from '$lib/utils/utils.js';\n // DETAIL-mode view shaper under an unambiguous alias — `$lib/api` exports\n // a DIFFERENT `transformEvent` (the canonical domain parseEvent); the name\n // collision previously made this import ambiguous to readers.\n import { transformEvent as transformEventDetail } from '$lib/utils/event-transform.js';\n import {\n fetchEventDetails,\n fetchEventTickets,\n hasPromoCodes,\n getSessionStatus,\n updateCartQuantities,\n } from '$lib/api';\n import { clampQuantitiesToCapacity } from '$lib/utils/quantity-clamp';\n import { trackAddToCart, getAttribution } from '$lib/tracking';\n import TicketsGroup from '../Events/Tickets/TicketsGroup.svelte';\n import PromocodeInput from '../Events/Tickets/PromocodeInput.svelte';\n import OrderSummarySkeleton from '../Events/Tickets/OrderSummarySkeleton.svelte';\n import CheckoutTimer from '$lib/public-calendar-flow/CheckoutTimer.svelte';\n import {\n OrderSummary,\n Modal,\n Button,\n roundCurrency,\n createModalState,\n } from '@getmicdrop/svelte-components';\n import EventInfoHeader from '../Events/Tickets/EventInfoHeader.svelte';\n\n let {\n eventId,\n organizationId = '',\n venueId = '',\n initialEventData = null,\n onNavigateBack,\n onNavigateToCheckout,\n labels = {},\n } = $props();\n\n let venueFeesReady = $state(false);\n\n let event = $state(null);\n let rawEvent = $state(null);\n let tickets = $state([]);\n let isLoading = $state(false);\n let isLoadingEvent = $state(true);\n let error = $state(null);\n let isMounted = $state(false);\n\n let isMobile = $state(false);\n let isSticky = $state(false);\n let sidebarLeft = $state(0);\n let containerRef = $state();\n let stickyRef = $state();\n\n let quantities = $state({});\n let promocode = $state('');\n let promocodeHint = $state('');\n let promocodeError = $state('');\n // Raw promo value from the apply endpoint: a percent for a percentage promo,\n // dollars for a fixed one. Resolve to dollars against the subtotal for display\n // (see `resolvedPromoDiscount`) — never subtract the raw percent directly.\n let promoDiscountAmount = $state(0);\n let promoDiscountType = $state('');\n let showPromoInput = $state(false);\n\n // Cart session timer\n let timerSeconds = $state(0);\n let timerActive = $state(false);\n let timerInterval = null;\n // The 60s server-sync poller. Held on a component-scoped var (not a local\n // const inside startTimer) so onDestroy can clear it — otherwise it survives\n // unmount as a zombie and, on a notFound response, wipes the shared\n // `checkout-cartid` cookie out from under the live checkout page. Mirrors the\n // route fork (checkout/+page.svelte), which clears both intervals on destroy.\n let syncInterval = null;\n /** @type {(() => void) | null} */\n let timerVisibilityHandler = null;\n const cartExpiredModal = createModalState();\n\n // Network error modal states\n const errorModal = createModalState();\n let errorModalType = $state('cart_failed'); // 'cart_failed' | 'cart_success_network_error'\n let cartCreatedSuccessfully = $state(false);\n\n // Partial availability modal states\n const availabilityModal = createModalState();\n let availabilityChanges = $state([]); // Array of {ticketId, ticketName, requestedQty, availableQty}\n\n /** @type {string | number} */\n let lowestPrice = $state(0);\n /** @type {string | number} */\n let highestPrice = $state(0);\n\n let isEventFree = $derived(\n event?.availableTickets\n ?.filter(/** @param {any} t */ t => t.visibility === 0)\n ?.every(/** @param {any} t */ t => t.price === 0)\n );\n\n // Subtotal is calculated client-side (just ticket prices × quantities).\n // Service fee + tax are calculated server-side and returned in the cart response.\n let subtotal = $derived(\n isEventFree\n ? 0\n : roundCurrency(\n Object.entries(quantities).reduce((sum, [id, qty]) => {\n const ticket = event?.availableTickets?.find(\n (/** @type {any} */ t) => t.id == id\n );\n return ticket ? sum + roundCurrency(qty * ticket.price) : sum;\n }, 0)\n )\n );\n\n // Fee/tax/total come from the server after cart creation — not calculated client-side\n let fees = $state(0);\n let taxes = $state(0);\n let taxAmount = $state(0);\n let taxLoading = $state(false);\n let taxAbortController = null;\n let total = $derived(roundCurrency(subtotal + fees + taxes));\n\n // The promo discount shown in the order summary, resolved against the current\n // subtotal: a percentage promo's raw value is a percent, not dollars.\n let resolvedPromoDiscount = $derived(\n resolvePromoDiscountDollars(\n subtotal,\n promoDiscountAmount,\n promoDiscountType\n )\n );\n\n let cartCreating = $state(false);\n let cartJustCreated = false; // Flag to distinguish new carts from stale ones\n\n // Visible to template — when true the +/- buttons are blocked so\n // the user can't race the network. Covers both initial-create and\n // post-create quantity-update paths.\n let cartSyncing = $state(false);\n\n async function handleQuantityChange(id, delta) {\n // Block clicks while a create/update is in flight. The reservation\n // is the source of truth for inventory holds — letting the user\n // change quantities locally without a confirmed backend write\n // means the cart shown to them won't match what's actually held,\n // and the next Checkout click would pay for whatever the backend\n // remembers, not what they saw.\n if (cartSyncing || cartCreating) {\n return;\n }\n\n const newQuantities = {\n ...quantities,\n [id]: Math.max(0, (quantities[id] ?? 0) + delta),\n };\n const totalQty = Object.values(newQuantities).reduce((s, q) => s + q, 0);\n\n // Apply the optimistic local change so the UI feels responsive,\n // then await the backend write before re-enabling buttons.\n quantities = newQuantities;\n if (event) {\n persistCheckoutState({\n eventID: event.eventID,\n quantities,\n promocode,\n promoDiscountAmount,\n tickets: event.availableTickets,\n });\n }\n\n if (totalQty > 0 && !timerActive) {\n // No cart yet — initial create.\n await createCartAndStartTimer();\n } else if (timerActive) {\n // Cart exists — sync the new quantities. Mirrors createCart's\n // disable-button behavior; uses orders-service PUT to replace\n // reservations atomically (releases old, reserves new, keeps\n // the cart UUID + timer/extension state intact).\n const cartId =\n typeof document !== 'undefined'\n ? (getCookie('checkout-cartid') ?? null)\n : null;\n if (!cartId) return;\n cartSyncing = true;\n try {\n const ok = await updateCartQuantities(cartId, quantities);\n if (!ok) {\n logger.warn('Cart quantity sync failed; UI may not match server');\n }\n } finally {\n cartSyncing = false;\n }\n }\n }\n\n async function createCartAndStartTimer() {\n if (cartCreating || timerActive) return;\n cartCreating = true;\n\n try {\n const result = await initiateOrder({\n eventID: event.eventID,\n quantities,\n promoCode: promocode || undefined,\n // Attribution (MISSION-TRUTH C2) rides additively on cart-create.\n attribution: getAttribution(),\n });\n\n if (result?.success && result.uuid) {\n // Cart created — timer starts from server session\n cartJustCreated = true;\n startTimer();\n // Funnel: cart created → add_to_cart moment (never deduped). CartView is\n // outside the inline embed flow, so pass the event's own venue id rather\n // than rely on the init-time global.\n trackAddToCart(\n event.eventID,\n null,\n event.venueID || event.venueId || null\n );\n }\n } catch (err) {\n logger.error('Error creating cart on ticket select:', err);\n } finally {\n cartCreating = false;\n }\n }\n\n function findPriceRange() {\n if (!event?.availableTickets) return;\n\n const visibleTickets = event.availableTickets.filter(\n (/** @type {any} */ t) => t.visibility === 0\n );\n\n const totalPrices = visibleTickets.map(\n (/** @type {any} */ t) => Number(t.price) || 0\n );\n\n if (totalPrices.length === 0) {\n lowestPrice = highestPrice = 0;\n return;\n }\n\n lowestPrice = formatCurrency(\n Math.min(\n ...totalPrices\n ) /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */\n );\n highestPrice = formatCurrency(\n Math.max(\n ...totalPrices\n ) /* FIXME(canonical-cleanup:toFixed): heuristic guess — verify this is USD (not cents); when migrating to TS, add `as USD` brand cast at the API-response-transform layer. */\n );\n }\n\n /**\n * Fetch server-authoritative tax preview from Stripe Tax API.\n * Debounced via AbortController -- only the latest request completes.\n */\n async function fetchTaxPreview() {\n // Build line items from current quantities\n const lineItems = [];\n for (const [id, qty] of Object.entries(quantities)) {\n if (qty <= 0) continue;\n const ticket = event?.availableTickets?.find(t => t.ID == id);\n if (!ticket || ticket.price === 0) continue;\n lineItems.push({\n amountCents: Math.round(ticket.price * 100) * qty,\n reference: `ticket-${id}`,\n quantity: qty,\n });\n }\n\n // No taxable items -- reset to 0\n if (lineItems.length === 0) {\n taxAmount = 0;\n taxes = 0;\n taxLoading = false;\n return;\n }\n\n // Abort any in-flight request\n if (taxAbortController) {\n taxAbortController.abort();\n }\n taxAbortController = new AbortController();\n taxLoading = true;\n\n try {\n // Deliberate raw fetch (see the file-level @fetch-escape note): the\n // canonical api-client would fire its global onError handler on the\n // EXPECTED 422 venue-no-address fallback, emitting spurious error noise.\n const res = await fetch(\n 'https://get-micdrop.com/api/v2/public/tax-preview',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n signal: taxAbortController.signal,\n body: JSON.stringify({\n venueId: Number(event.venueID),\n lineItems,\n }),\n }\n );\n\n if (!res.ok) {\n // 422 is the documented fallback path: the venue has no\n // address configured for Stripe Tax, so the backend returns\n // `{ error: 'venue_no_address', fallback: true }` and we\n // display $0 tax. This is not an error condition — log at\n // debug level so it doesn't flood production consoles for\n // every event hosted by an address-less venue (e.g. test\n // series events). Genuine failures (5xx, network) still log\n // at error level below.\n if (res.status === 422) {\n logger.debug(\n 'Tax preview: venue has no tax address, falling back to 0'\n );\n } else {\n logger.error('Tax preview failed:', res.status);\n }\n taxAmount = 0;\n taxes = 0;\n taxLoading = false;\n return;\n }\n\n const data = await res.json();\n // taxTotal is in cents from the API\n taxAmount = (data.taxTotal ?? 0) / 100;\n taxes = taxAmount;\n } catch (err) {\n if (err.name === 'AbortError') return; // Expected on rapid changes\n logger.error('Tax preview error:', err);\n taxAmount = 0;\n taxes = 0;\n } finally {\n if (!taxAbortController?.signal?.aborted) {\n taxLoading = false;\n }\n }\n }\n\n function applyStoredPromocode() {\n if (!event) return;\n promocode = getCookie(`checkout-promocode-${event.eventID}`) || '';\n const discount = parseFloat(getCookie('checkout-promo-discount') || '0');\n\n promocodeHint = promocode ? `${promocode} applied.` : '';\n promoDiscountAmount = discount;\n promoDiscountType =\n getCookie(`checkout-promo-discount-type-${event.eventID}`) || '';\n }\n\n /**\n * Check if ticket availability has changed since user selected quantities\n * Returns array of changes if any tickets have reduced availability\n */\n async function checkTicketAvailability() {\n try {\n const freshTickets = await fetchEventTickets(eventId);\n const changes = [];\n\n for (const [ticketId, requestedQty] of Object.entries(quantities)) {\n if (requestedQty <= 0) continue;\n\n const freshTicket = /** @type {any} */ (\n freshTickets.find(\n (/** @type {any} */ t) => String(t.id) === String(ticketId)\n )\n );\n if (!freshTicket) continue;\n\n const availableQty =\n freshTicket.remainingCapacity ?? freshTicket.quantity ?? Infinity;\n\n if (availableQty < requestedQty) {\n // Find the ticket name from our stored tickets\n const storedTicket = event?.availableTickets?.find(\n (/** @type {any} */ t) => String(t.id) === String(ticketId)\n );\n changes.push({\n ticketId,\n ticketName: storedTicket?.name || freshTicket?.name || 'Ticket',\n requestedQty,\n availableQty: Math.max(0, availableQty),\n });\n }\n }\n\n return changes;\n } catch (err) {\n logger.error('Error checking ticket availability:', err);\n // On error, proceed with checkout - backend will validate\n return [];\n }\n }\n\n async function goToCheckout() {\n if (!event) return;\n\n isLoading = true;\n cartCreatedSuccessfully = false;\n\n // Check for availability changes before proceeding\n const changes = await checkTicketAvailability();\n if (changes.length > 0) {\n // Some tickets have reduced availability\n isLoading = false;\n availabilityChanges = changes;\n availabilityModal.open();\n return;\n }\n\n await proceedToCheckout();\n }\n\n async function proceedToCheckout() {\n isLoading = true;\n\n persistCheckoutState({\n eventID: event.eventID,\n quantities,\n promocode,\n promoDiscountAmount,\n tickets: event.availableTickets,\n });\n\n // If a cart was already created on ticket-select (cookie present),\n // reuse it. Calling initiateOrder again here would create a second\n // cart UUID and overwrite the cookie, orphaning the first cart's\n // reservations and breaking payment-intent on the new UUID (the\n // reservations workflow is keyed off whichever UUID the backend\n // generated for the *first* call).\n const existingCartId =\n typeof document !== 'undefined'\n ? (getCookie('checkout-cartid') ?? null)\n : null;\n\n if (existingCartId) {\n cartCreatedSuccessfully = true;\n } else {\n try {\n // initiateOrder returns the cart UUID string (or null on error);\n // the previous `result.success` check was a no-op since result\n // was never an object — falsy only when initiateOrder failed.\n const result = await initiateOrder({\n eventID: event.eventID,\n quantities,\n promoCode: promocode || undefined,\n // Attribution (MISSION-TRUTH C2) rides additively on cart-create.\n attribution: getAttribution(),\n });\n\n if (!result) {\n isLoading = false;\n errorModalType = 'cart_failed';\n errorModal.open();\n return;\n }\n\n cartCreatedSuccessfully = true;\n // Funnel: a fresh cart was created here (no existing cart cookie) →\n // add_to_cart moment (never deduped). Guard on `result.success` —\n // initiateOrder returns a truthy `{success:false}` object on failure, so\n // only a genuine create should fire the conversion beacon.\n if (result.success)\n trackAddToCart(\n event.eventID,\n null,\n event.venueID || event.venueId || null\n );\n } catch (err) {\n logger.error('Order initiation failed:', err);\n isLoading = false;\n errorModalType = 'cart_failed';\n errorModal.open();\n return;\n }\n }\n\n // Cart created successfully, now try to navigate\n try {\n if (onNavigateToCheckout) {\n onNavigateToCheckout(eventId, event);\n isLoading = false;\n return;\n }\n\n const params = new URLSearchParams();\n if (organizationId) params.set('orgId', organizationId);\n if (venueId) params.set('venueId', venueId);\n params.set('event_id', eventId);\n params.set('subroute', 'checkout');\n const url = `/?${params.toString()}`;\n goto(url, { noScroll: false });\n isLoading = false;\n } catch (navErr) {\n // Cart was created but navigation failed - tickets are held\n logger.error('Navigation failed after cart creation:', navErr);\n isLoading = false;\n errorModalType = 'cart_success_network_error';\n errorModal.open();\n }\n }\n\n function handleAcceptReducedQuantities() {\n // Update quantities to available amounts\n for (const change of availabilityChanges) {\n if (change.availableQty > 0) {\n quantities[change.ticketId] = change.availableQty;\n } else {\n delete quantities[change.ticketId];\n }\n }\n quantities = { ...quantities }; // Trigger reactivity\n\n availabilityModal.close();\n availabilityChanges = [];\n\n // Check if any tickets remain\n const totalTickets = Object.values(quantities).reduce(\n (sum, qty) => sum + qty,\n 0\n );\n if (totalTickets > 0) {\n proceedToCheckout();\n } else {\n // No tickets left, go back\n goBack();\n }\n }\n\n function handleDeclineReducedQuantities() {\n availabilityModal.close();\n availabilityChanges = [];\n goBack();\n }\n\n function handleErrorModalClose() {\n errorModal.close();\n if (errorModalType === 'cart_failed') {\n // Go back to event page on cart failure\n goBack();\n }\n }\n\n function handleRefreshPage() {\n errorModal.close();\n window.location.reload();\n }\n\n function updateScreenSize() {\n isMobile = window.innerWidth < 767;\n }\n\n let ticking = false;\n\n function handleScroll() {\n if (!ticking) {\n window.requestAnimationFrame(() => {\n updateStickyState();\n ticking = false;\n });\n ticking = true;\n }\n }\n\n function updateStickyState() {\n if (isMobile || !stickyRef || !containerRef) {\n isSticky = false;\n return;\n }\n\n const rect = stickyRef.getBoundingClientRect();\n isSticky = rect.top <= 20;\n\n if (isSticky) {\n const bounds = containerRef.getBoundingClientRect();\n sidebarLeft = bounds.left + bounds.width - 340 - 40;\n }\n }\n\n function goBack() {\n if (event) {\n clearCheckoutCookies(event.eventID);\n }\n if (onNavigateBack) {\n onNavigateBack();\n } else {\n const params = new URLSearchParams(window.location.search);\n params.set('subroute', 'details');\n const url = `/?${params.toString()}`;\n goto(url, { noScroll: false });\n }\n }\n\n // Track the active cart ID for timer persistence\n let activeCartId = null;\n\n async function handleExpiredCart() {\n // Clear stale state\n if (activeCartId) {\n localStorage.removeItem(`checkout-expiry-${activeCartId}`); // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n }\n removeCookie('checkout-cartid');\n activeCartId = null;\n timerActive = false;\n timerSeconds = 0;\n\n // Show expired alert, then auto-recover\n cartExpiredModal.open();\n }\n\n async function startTimer() {\n if (timerActive) return;\n // Single-poller invariant. A prior session's pollers can still be scheduled\n // when we get here — e.g. the local countdown hit 0 (which clears\n // timerInterval and flips timerActive off) but the 60s syncInterval hasn't\n // reached its next self-clearing tick yet. Now that syncInterval is a shared\n // component var, re-entering here would overwrite the handle and orphan the\n // old poller — which, reading the shared timerActive as true again, would\n // keep polling the NEW cartId and wipe the live checkout-cartid cookie on a\n // notFound. Clear both before starting fresh so only one of each ever runs.\n if (timerInterval) clearInterval(timerInterval);\n if (syncInterval) clearInterval(syncInterval);\n timerActive = true;\n\n activeCartId =\n typeof document !== 'undefined'\n ? (getCookie('checkout-cartid') ?? null)\n : null;\n\n timerSeconds = 15 * 60;\n\n if (activeCartId) {\n const storedExpiry = localStorage.getItem(\n // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n `checkout-expiry-${activeCartId}`\n );\n\n if (storedExpiry) {\n // We have localStorage — use it\n const remaining = Math.max(\n 0,\n Math.floor((parseInt(storedExpiry, 10) - Date.now()) / 1000)\n );\n if (remaining > 0) {\n timerSeconds = remaining;\n } else {\n await handleExpiredCart();\n return;\n }\n } else if (cartJustCreated) {\n // Cart was just created in this session — set 15 min\n timerSeconds = 15 * 60;\n localStorage.setItem(\n // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n `checkout-expiry-${activeCartId}`,\n String(Date.now() + 15 * 60 * 1000)\n );\n } else {\n // Stale cookie, no localStorage — this is a leftover from a previous session.\n // Show expired and let user start fresh.\n await handleExpiredCart();\n return;\n }\n }\n\n // Tick every second. The localStorage value (set above and refreshed\n // by the 60s server sync below) is an absolute deadline timestamp, so\n // we recompute `timerSeconds = (deadline - now) / 1000` rather than\n // decrementing — that way a backgrounded tab whose setInterval gets\n // throttled by the browser can't drift away from real elapsed time.\n // When the tab regains focus the next tick (or the visibilitychange\n // handler) recomputes from wall-clock and the display jumps to truth.\n const recomputeFromStoredDeadline = () => {\n if (!activeCartId) return;\n const stored = parseInt(\n localStorage.getItem(`checkout-expiry-${activeCartId}`) || '0', // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n 10\n );\n if (!stored) return;\n timerSeconds = Math.max(0, Math.floor((stored - Date.now()) / 1000));\n };\n\n timerInterval = setInterval(() => {\n recomputeFromStoredDeadline();\n if (timerSeconds <= 0) {\n clearInterval(timerInterval);\n timerActive = false;\n cartExpiredModal.open();\n if (activeCartId)\n localStorage.removeItem(`checkout-expiry-${activeCartId}`); // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n }\n }, 1000);\n\n // Force-recompute on tab focus — a throttled/paused interval may have\n // left the display many minutes behind reality. Stored on a module\n // var so onDestroy can detach it.\n timerVisibilityHandler = () => {\n if (\n typeof document !== 'undefined' &&\n document.visibilityState === 'visible'\n ) {\n recomputeFromStoredDeadline();\n }\n };\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', timerVisibilityHandler);\n }\n if (typeof window !== 'undefined') {\n window.addEventListener('pageshow', timerVisibilityHandler);\n }\n\n // Sync from server every 60s to stay accurate with extensions.\n // 404 (status.notFound) is terminal — the cart's reservations are\n // gone, so polling further produces a console-flooding 404 loop.\n // Treat it like local-timer expiry: clear the cart and show the\n // expired modal.\n syncInterval = setInterval(async () => {\n if (!timerActive || !activeCartId) {\n clearInterval(syncInterval);\n return;\n }\n try {\n const status = await getSessionStatus(activeCartId);\n if (status.notFound) {\n clearInterval(syncInterval);\n const expiredCartId = activeCartId;\n timerActive = false;\n cartExpiredModal.open();\n localStorage.removeItem(`checkout-expiry-${expiredCartId}`); // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n removeCookie('checkout-cartid');\n activeCartId = null;\n return;\n }\n if (!status.error && status.expiresAt) {\n const remaining = Math.max(\n 0,\n Math.floor(\n (new Date(status.expiresAt).getTime() - Date.now()) / 1000\n )\n );\n timerSeconds = remaining;\n localStorage.setItem(\n // @storage-escape: cart checkout-expiry persistence (intentional raw localStorage)\n `checkout-expiry-${activeCartId}`,\n String(new Date(status.expiresAt).getTime())\n );\n }\n } catch {\n /* network blip — keep polling */\n }\n }, 60000);\n }\n\n async function handlePromoChange(data) {\n // PromocodeInput calls this directly with the data object (no .detail wrapper)\n const detail = data?.detail ?? data;\n const { code, discount, discountType } = detail;\n promocode = code || '';\n promoDiscountAmount = discount || 0;\n promoDiscountType = discountType || '';\n promocodeHint = code ? `${code} applied.` : '';\n\n // Update reveal state from promo event\n if (detail.revealHiddenTickets !== undefined && event) {\n setCookie(\n `checkout-promo-reveal-${event.eventID}`,\n detail.revealHiddenTickets ? '1' : '0',\n { path: '/' }\n );\n if (detail.revealTicketIds?.length) {\n setCookie(\n `checkout-promo-reveal-ids-${event.eventID}`,\n JSON.stringify(detail.revealTicketIds),\n { path: '/' }\n );\n }\n\n // Re-fetch tickets with promo code so backend includes revealed hidden tickets\n if (code && detail.revealHiddenTickets) {\n // Share the event-write token: a later promo change (or a fresh\n // loadEventData) must win over this fetch if it resolves out of order.\n const writeId = ++latestEventWrite;\n try {\n const freshTickets = await fetchEventTickets(eventId);\n if (\n writeId === latestEventWrite &&\n freshTickets.length > 0 &&\n event\n ) {\n event = { ...event, availableTickets: freshTickets };\n }\n } catch (err) {\n logger.error('Error re-fetching tickets with promo:', err);\n }\n }\n }\n }\n\n // Read promo data from cookies (set by PromocodeInput on tickets page)\n let revealHiddenTickets = $derived(\n event ? getCookie(`checkout-promo-reveal-${event.eventID}`) === '1' : false\n );\n let revealTicketIds = $derived.by(() => {\n if (!event) return [];\n try {\n const ids = getCookie(`checkout-promo-reveal-ids-${event.eventID}`);\n return ids ? JSON.parse(ids) : [];\n } catch {\n return [];\n }\n });\n\n let isEventEnded = $derived.by(() => {\n if (!event) return false;\n const eventEnd = event.endDateTime || event.startDateTime;\n return eventEnd ? new Date(eventEnd) < new Date() : false;\n });\n\n // Monotonic id for writes to the shared `event`/`tickets` surface. Both\n // loadEventData (mount / eventId change) and handlePromoChange (promo\n // re-fetch) fetch tickets and assign `event`; a slower EARLIER fetch\n // resolving last would clobber the latest data. Each write stamps this id and\n // discards its result if a newer write superseded it. The existing isMounted\n // flag only covers unmount, not overlapping in-flight loads.\n let latestEventWrite = 0;\n\n async function loadEventData() {\n if (!isMounted) {\n return;\n }\n const writeId = ++latestEventWrite;\n if (!eventId) {\n error = labels.noEventIdProvided || 'No event ID provided';\n isLoadingEvent = false;\n return;\n }\n\n isLoadingEvent = true;\n error = null;\n\n try {\n if (initialEventData) {\n // Use server-provided data — skip client-side fetch\n rawEvent = initialEventData;\n if (!isMounted) return;\n event = transformEventDetail(rawEvent);\n tickets = event.availableTickets || [];\n } else {\n try {\n const fetchedEvent = await fetchEventDetails(eventId);\n if (!isMounted || writeId !== latestEventWrite) return;\n rawEvent = fetchedEvent;\n event = transformEventDetail(rawEvent);\n } catch (apiErr) {\n logger.error('Event fetch failed:', apiErr);\n // A superseded load failing must not paint an error over a newer load.\n if (!isMounted || writeId !== latestEventWrite) return;\n error = labels.failedToLoadEvent || 'Failed to load event';\n isLoadingEvent = false;\n return;\n }\n\n try {\n const fetchedTickets = await fetchEventTickets(eventId);\n if (!isMounted || writeId !== latestEventWrite) return;\n tickets = fetchedTickets;\n if (tickets.length > 0) {\n event.availableTickets = tickets;\n }\n } catch (ticketErr) {\n if (!isMounted || writeId !== latestEventWrite) return;\n logger.error('Error fetching tickets:', ticketErr);\n tickets = event.availableTickets || [];\n }\n }\n\n if (event.availableTickets) {\n event.availableTickets.forEach(t => (quantities[t.ID] = 0));\n }\n\n const cookieState = loadCheckoutStateFromCookies(event.eventID);\n // MIC-946: clamp cookie-restored quantities against current\n // remainingCapacity / maxQuantity so a returning user never starts\n // with an over-cap selection. Submit-time oversell modal still\n // catches any race after this point.\n quantities = clampQuantitiesToCapacity(\n cookieState.quantities || {},\n event.availableTickets\n );\n promocode = cookieState.promocode || '';\n promoDiscountAmount = cookieState.promoDiscountAmount || 0;\n\n if (event.eventID) {\n await trackUTMSource(event.eventID);\n if (!isMounted) return;\n }\n\n venueFeesReady = true;\n findPriceRange();\n\n // Start timer if tickets were already selected (page refresh)\n const totalQty = Object.values(quantities).reduce((sum, q) => sum + q, 0);\n if (totalQty > 0) {\n startTimer();\n }\n\n applyStoredPromocode();\n await ensureOrderIdExists(String(event.eventID));\n } catch (err) {\n if (isMounted) {\n logger.error('Error loading event:', err);\n error =\n err.message || labels.failedToLoadEvent || 'Failed to load event';\n }\n } finally {\n if (isMounted) {\n isLoadingEvent = false;\n }\n }\n }\n\n onMount(async () => {\n isMounted = true;\n updateScreenSize();\n window.addEventListener('resize', updateScreenSize);\n window.addEventListener('scroll', handleScroll);\n\n await loadEventData();\n\n // Check promo codes outside reactive tracking to avoid effect loops\n hasPromoCodes(eventId)\n .then(has => {\n showPromoInput = has;\n })\n .catch(() => {\n showPromoInput = true;\n });\n });\n\n onDestroy(() => {\n isMounted = false;\n // Registered synchronously during init (not inside the async onMount,\n // where calling onDestroy after an await throws lifecycle_outside_component).\n window.removeEventListener('resize', updateScreenSize);\n window.removeEventListener('scroll', handleScroll);\n if (timerInterval) clearInterval(timerInterval);\n if (syncInterval) clearInterval(syncInterval);\n if (timerVisibilityHandler) {\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n 'visibilitychange',\n timerVisibilityHandler\n );\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('pageshow', timerVisibilityHandler);\n }\n timerVisibilityHandler = null;\n }\n if (taxAbortController) {\n taxAbortController.abort();\n }\n });\n\n // Re-load event data if eventId changes (e.g., navigating between events).\n // Guard with a ref to prevent re-triggering on unrelated state changes.\n let lastLoadedEventId = null;\n $effect(() => {\n if (isMounted && eventId && eventId !== lastLoadedEventId) {\n lastLoadedEventId = eventId;\n loadEventData();\n }\n });\n\n // Fetch tax preview whenever quantities change and venue data is ready\n $effect(() => {\n // Access quantities to register as dependency\n const totalQty = Object.values(quantities).reduce(\n (sum, qty) => sum + qty,\n 0\n );\n if (venueFeesReady && event && totalQty > 0) {\n fetchTaxPreview();\n } else if (totalQty === 0) {\n taxAmount = 0;\n taxes = 0;\n taxLoading = false;\n }\n });\n</script>\n\n<!-- @pageloader-escape: loader lives inside the themed bg-card cart shell and the\n error branch is a styled go-back *navigation* (not a retry); PageLoader's fixed\n light spinner + danger-Alert/retry-link contract reproduces neither. -->\n<div class=\"px-5 md:px-10 py-12 bg-card\" bind:this={containerRef}>\n {#if isLoadingEvent}\n <div class=\"flex items-center justify-center py-12\" aria-live=\"polite\">\n <p class=\"tone-secondary\">\n {labels.loadingEvent || 'Loading event...'}\n </p>\n </div>\n {:else if error}\n <div class=\"text-center py-8\" role=\"alert\">\n <p class=\"text-accent-danger mb-2\">\n {labels.errorPrefix || 'Error:'}\n {error}\n </p>\n <button\n class=\"go-back-btn text-white mt-4 px-4 py-2 rounded-lg\"\n onclick={goBack}\n aria-label={labels.goBackToEventDetails || 'Go back to event details'}\n >\n {labels.goBack || 'Go back'}\n </button>\n </div>\n {:else if event && isEventEnded}\n <div class=\"text-center py-12\" role=\"alert\">\n <p class=\"mb-2 {typography.h2}\">\n {labels.thisEventHasEnded || 'This event has ended'}\n </p>\n <p class=\"tone-secondary mb-6\">\n {labels.ticketsNoLongerAvailable ||\n 'Tickets are no longer available for this event.'}\n </p>\n <button\n class=\"go-back-btn text-white px-4 py-2 rounded-lg\"\n onclick={goBack}\n aria-label={labels.goBackToEventDetails || 'Go back to event details'}\n >\n {labels.goBack || 'Go back'}\n </button>\n </div>\n {:else if event && isEventEnded}\n <div class=\"text-center py-12\" role=\"alert\">\n <p class=\"mb-2 {typography.h2}\">This event has ended</p>\n <p class=\"tone-secondary mb-6\">\n Tickets are no longer available for this event.\n </p>\n <button\n class=\"go-back-btn px-4 py-2 rounded-lg\"\n onclick={goBack}\n aria-label=\"Go back to event details\"\n >\n Go back\n </button>\n </div>\n {:else if event}\n <div class=\"w-full flex md:gap-5 flex-wrap\" bind:this={stickyRef}>\n <div class=\"flex-1 pb-16 md:pb-0\">\n <div class=\"bg-card border-border rounded-lg md:shadow md:border py-3\">\n <EventInfoHeader {event} onCancel={goBack} {labels} />\n\n {#if timerActive && timerSeconds > 0}\n <div class=\"px-4 md:px-5 pt-3\">\n <CheckoutTimer\n seconds={timerSeconds}\n isUrgent={timerSeconds <= 5 * 60}\n {labels}\n />\n </div>\n {/if}\n\n {#if showPromoInput}\n <div class=\"px-4 md:px-5 pt-3\">\n <PromocodeInput\n eventID={eventId}\n onpromoChange={handlePromoChange}\n {labels}\n />\n </div>\n {/if}\n\n <div class=\"space-y-4 md:px-5\">\n <TicketsGroup\n tickets={event.availableTickets}\n {quantities}\n {handleQuantityChange}\n handleDonationChange={() => {}}\n {revealHiddenTickets}\n {revealTicketIds}\n {venueFeesReady}\n syncing={cartSyncing || cartCreating}\n {labels}\n />\n </div>\n </div>\n </div>\n\n {#if isSticky && !isMobile}\n <!-- svelte-ignore element_invalid_self_closing_tag -->\n <div class=\"hidden md:block w-80 h-[calc(100vh-40px)]\" />\n {/if}\n\n <div\n class=\"w-full md:w-80 flex flex-col transition-all will-change-[left]\"\n class:is-sticky={isSticky}\n style:left={isSticky ? `${sidebarLeft}px` : 'auto'}\n >\n {#if !venueFeesReady}\n <OrderSummarySkeleton />\n {:else if event && event.availableTickets?.length}\n <OrderSummary\n btnText={labels.checkout || 'Checkout'}\n loading={isLoading}\n checkoutTicket={goToCheckout}\n {quantities}\n eventTickets={event.availableTickets}\n promoApplied={!!promocodeHint}\n promoDiscount={resolvedPromoDiscount}\n {taxAmount}\n {taxLoading}\n onPriceUpdate={() => {}}\n />\n {/if}\n </div>\n </div>\n {/if}\n</div>\n\n<!-- Network Error Modal -->\n<Modal\n open={errorModal.isOpen}\n size=\"sm\"\n oncancel={handleErrorModalClose}\n aria-labelledby=\"error-modal-title\"\n>\n {#snippet header()}\n <h3 id=\"error-modal-title\" class=\"heading-lg\">\n {#if errorModalType === 'cart_failed'}\n {labels.unableToReserveTickets || 'Unable to Reserve Tickets'}\n {:else}\n {labels.connectionIssue || 'Connection Issue'}\n {/if}\n </h3>\n {/snippet}\n\n {#snippet body()}\n <div id=\"error-modal-description\">\n {#if errorModalType === 'cart_failed'}\n <p class=\"body-sm\">\n {labels.cartFailedMessage ||\n \"We couldn't reserve your tickets. This may be due to a network issue or the tickets may no longer be available.\"}\n </p>\n <p class=\"tone-secondary mt-2\">\n {labels.pleaseGoBackAndTryAgain || 'Please go back and try again.'}\n </p>\n {:else}\n <p class=\"body-sm\">\n {labels.cartSuccessMessage ||\n 'Good news! Your tickets have been reserved and are being held for you.'}\n </p>\n <p class=\"tone-secondary mt-2\">\n {labels.cartSuccessNetworkError ||\n 'However, we encountered a connection issue. Please refresh the page to continue to checkout.'}\n </p>\n {/if}\n </div>\n {/snippet}\n\n {#snippet footer()}\n <div role=\"group\" aria-label=\"Error modal actions\">\n {#if errorModalType === 'cart_failed'}\n <Button\n variant=\"default\"\n onclick={handleErrorModalClose}\n aria-label={labels.goBack || 'Go back'}\n >\n {labels.goBack || 'Go back'}\n </Button>\n {:else}\n <Button\n variant=\"alternative\"\n onclick={handleErrorModalClose}\n aria-label={labels.cancel || 'Cancel'}\n >\n {labels.cancel || 'Cancel'}\n </Button>\n <Button\n variant=\"default\"\n onclick={handleRefreshPage}\n aria-label={labels.refreshPage || 'Refresh Page'}\n >\n {labels.refreshPage || 'Refresh Page'}\n </Button>\n {/if}\n </div>\n {/snippet}\n</Modal>\n\n<!-- Cart Expired Modal -->\n<!-- @modal-escape: cart-expired alertdialog overlay — SC AlertModal/ConfirmationModal recipe candidate, also blocked by SC Modal default mobile bottom-sheet (awaiting SC #203 variant=\"dialog\") -->\n<Modal\n open={cartExpiredModal.isOpen}\n size=\"sm\"\n persistent\n oncancel={() => {\n cartExpiredModal.close();\n removeCookie('checkout-cartid');\n window.location.reload();\n }}\n aria-labelledby=\"expired-modal-title\"\n>\n {#snippet header()}\n <h3 id=\"expired-modal-title\" class=\"heading-lg\">\n {labels.cartExpiredTitle || 'Your cart has expired'}\n </h3>\n {/snippet}\n\n {#snippet body()}\n <p id=\"expired-modal-description\" class=\"body-sm tone-secondary\">\n {labels.cartExpiredMessage ||\n 'Your cart has expired. Please start your purchase again.'}\n </p>\n {/snippet}\n\n {#snippet footer()}\n <Button\n variant=\"default\"\n onclick={() => {\n cartExpiredModal.close();\n removeCookie('checkout-cartid');\n window.location.reload();\n }}\n >\n {labels.startOver || 'Start over'}\n </Button>\n {/snippet}\n</Modal>\n\n<!-- Partial Availability Modal -->\n<Modal\n open={availabilityModal.isOpen}\n size=\"sm\"\n oncancel={handleDeclineReducedQuantities}\n aria-labelledby=\"availability-modal-title\"\n>\n {#snippet header()}\n <h3 id=\"availability-modal-title\" class=\"heading-lg\">\n {labels.limitedAvailability || 'Limited Availability'}\n </h3>\n {/snippet}\n\n {#snippet body()}\n <div id=\"availability-modal-description\">\n <p class=\"tone-secondary mb-4\">\n {labels.ticketsNoLongerAvailableMessage ||\n 'Some tickets you selected are no longer available in the requested quantities:'}\n </p>\n <ul\n class=\"space-y-2\"\n aria-label={labels.ticketAvailabilityChanges ||\n 'Ticket availability changes'}\n >\n {#each availabilityChanges as change}\n <li class=\"tone-secondary type-body\">\n <span class=\"type-label\">{change.ticketName}:</span>\n {#if change.availableQty > 0}\n {(\n labels.onlyNAvailable ||\n 'Only {available} available (you selected {requested})'\n )\n .replace('{available}', String(change.availableQty))\n .replace('{requested}', String(change.requestedQty))}\n {:else}\n {(\n labels.soldOutYouSelected ||\n 'Sold out (you selected {requested})'\n ).replace('{requested}', String(change.requestedQty))}\n {/if}\n </li>\n {/each}\n </ul>\n {#if availabilityChanges.some(c => c.availableQty > 0)}\n <p class=\"tone-secondary mt-4\">\n {labels.partialAvailabilityContinue ||\n 'Would you like to continue with the available tickets?'}\n </p>\n {:else}\n <p class=\"tone-secondary mt-4\">\n {labels.allTicketsSoldOut ||\n 'Unfortunately, all the tickets you selected have sold out.'}\n </p>\n {/if}\n </div>\n {/snippet}\n\n {#snippet footer()}\n <div role=\"group\" aria-label=\"Availability modal actions\">\n <Button\n variant=\"alternative\"\n onclick={handleDeclineReducedQuantities}\n aria-label={labels.goBack || 'Go back'}\n >\n {labels.goBack || 'Go back'}\n </Button>\n {#if availabilityChanges.some(c => c.availableQty > 0)}\n <Button\n variant=\"default\"\n onclick={handleAcceptReducedQuantities}\n aria-label={labels.continueWithAvailable || 'Continue with available'}\n >\n {labels.continueWithAvailable || 'Continue with available'}\n </Button>\n {/if}\n </div>\n {/snippet}\n</Modal>\n\n<style>\n /* @style-escape: intentional sticky floating-cart panel — position:fixed needs !important to beat base layout specificity; `left` is set imperatively by JS with a transition, so this cannot be a static Tailwind utility class */\n .is-sticky {\n position: fixed !important;\n top: 20px;\n transition: left 0.2s var(--ease-smooth);\n }\n\n .go-back-btn {\n background-color: hsl(var(--brand-primary, 224 76% 48%));\n }\n\n .go-back-btn:hover {\n filter: brightness(0.9);\n }\n</style>\n"],"names":["size","$","$$props","color","className","svg","root","ctx","useIconWeight","resolved","root_2","path","$$render","consequent","alternate","styles","defaultLabels","loading","quantities","donationAmounts","eventTickets","checkoutTicket","isAgreed","btnText","showTerms","promoApplied","promoDiscount","currentPromoRule","executePurchase","elements","venueServiceCharge","giftCardApplied","taxAmount","taxLoading","userLabels","labels","getEffectivePrice","ticket","isDonationTicket","donationAmount","ticketType","isFreePriceValue","price","isFreePrice","showOrderSummaryOnMobile","feeFor","chargeType","normalizeChargeType","fee","maxFee","roundCurrency","makeOrderSummaryVisible","getDiscountedPrice","discountTicketIds","basePrice","discountAmount","totalQuantity","sum","q","showFooter","subtotalWithoutDiscount","acc","key","t","effectivePrice","subtotal","discountedPrice","priceToUse","promoSavings","fees","taxes","giftCardAmountDisplay","formatCentsAsCurrency","toCents","giftCardRemainingBalance","total","div","fragment","div_1","h3","div_2","div_3","p","typography","text_1","$$anchor","node_3","isDonation","div_4","root_1","div_5","p_1","p_2","text_3","$0","text_4","formatCurrency","text_5","consequent_2","div_6","text_6","text_2","consequent_4","consequent_5","div_7","node_1","div_8","span","span_1","text_8","consequent_6","div_9","root_3","span_2","span_3","text_10","div_10","span_4","span_5","text_12","consequent_7","consequent_8","div_11","node_8","span_6","span_7","div_12","span_8","span_9","div_13","span_10","span_11","span_12","root_4","Spinner","node_10","text_19","consequent_9","alternate_2","div_14","fragment_11","span_13","span_14","div_15","root_5","span_15","span_16","text_22","consequent_10","text_20","consequent_11","div_16","fragment_12","span_17","p_3","text_24","text_25","div_17","root_8","span_18","span_19","text_26","consequent_12","alternate_3","text_14","text_16","text_18","alternate_4","p_4","root_10","a","text_28","text_29","consequent_13","button","node_14","span_20","root_11","text_30","consequent_14","alternate_5","button_1","fragment_14","div_18","div_19","h2","button_2","CloseOutline","node_17","div_20","node_20","div_21","root_12","div_22","p_5","p_6","text_33","text_34","text_35","consequent_16","alternate_6","div_23","text_36","text_32","consequent_18","consequent_19","div_24","node_18","div_25","root_13","span_21","span_22","text_38","consequent_20","div_26","span_23","span_24","text_40","div_27","span_25","span_26","text_42","consequent_21","consequent_22","div_28","node_25","span_27","span_28","div_29","span_29","span_30","div_30","span_31","span_32","span_33","node_27","text_49","consequent_23","alternate_8","div_31","fragment_24","span_34","span_35","div_32","span_36","span_37","text_52","consequent_24","text_50","consequent_25","div_33","fragment_25","span_38","p_7","text_54","text_55","div_34","span_39","span_40","text_56","consequent_26","alternate_9","layers","styles_1","text_31","text_44","text_46","text_48","safeFade","safeFly","cubicOut","consequent_27","div_35","root_16","div_36","button_3","span_41","ChevronDownOutline","node_32","span_42","button_4","span_43","text_60","consequent_28","alternate_10","styles_2","consequent_29","text","isPercentageDiscount","discountType","resolvePromoDiscountDollars","rawAmount","dollars","clamped","SCARCITY_THRESHOLDS","computeScarcityLevel","remaining","pct","URGENT_PCT","LOW_PCT","MAX_EXACT_COUNT","clampQuantitiesToCapacity","tickets","passthrough","id","qty","ticketById","requestedRaw","cap","perOrderMax","quantity","soldOut","status","salesBegin","salesEnd","remainingCapacity","totalCapacity","maxQuantity","isRevealed","isDiscounted","syncing","donationValue","donationError","isDonationValid","priceValue","feeValue","totalPrice","formattedFee","discountedPriceValue","discountedFeeValue","discountedTotalPrice","effectiveTotalCapacity","scarcityInfo","level","showScarcityBadge","displaySalesEndDate","dateString","formatSalesDate","formatSmartTime","formatSmartSalesDate","formatSalesStart","formatSalesEnd","statusInfo","article","root_14","$1","Button","SubtractIcon","node_2","AddIcon","classes_1","Input","node_4","v","consequent_3","fragment_2","root_6","fragment_3","root_9","node_9","ScarcityBadge","endTime","classes","$2","venueFeesReady","revealHiddenTickets","revealTicketIds","computeTicketStatus","now","salesBeginValue","salesEndValue","getSalesBegin","visibleTickets","sortTicketsByAvailability","ticketList","available","unavailable","minQty","effectivelySoldOut","groupTicketsBySection","groups","sectionName","groupedTickets","otherLabel","hasMultipleGroups","n","section","$$item","$$array","sectionTickets","consequent_1","ticketEligibleForDiscount","hasDiscount","computedStatus","salesBeginDate","$4","TicketBlock","amount","_","TicketSkeleton","alternate_1","logger","createLogger","eventID","inputValue","touched","displayErrorText","hintText","isApplied","isValidating","applyPromocode","trimmedCode","result","validatePromoCode","discount","hints","amt","promoOpts","setCookie","error","clearPromocode","removeCookie","handleInput","e","handleKeydown","onMount","saved","getCookie","node","$$value","variant","onCancel","onInfoClick","timeZone","getDefaultTimezone","showEndTime","showDoorsTime","isCheckout","priceDisplay","header","ArrowLeftIcon","Image","h1","time","formatDoorsTime","InfoIcon","node_5","$$args","formatFullDate","formatTimeRange","formatEventTime","organizationId","venueId","initialEventData","event","rawEvent","isLoading","isLoadingEvent","isMounted","isMobile","isSticky","sidebarLeft","containerRef","stickyRef","promocode","promocodeHint","promoDiscountAmount","promoDiscountType","showPromoInput","timerSeconds","timerActive","timerInterval","syncInterval","timerVisibilityHandler","cartExpiredModal","createModalState","errorModal","errorModalType","cartCreatedSuccessfully","availabilityModal","availabilityChanges","lowestPrice","highestPrice","isEventFree","taxAbortController","resolvedPromoDiscount","cartCreating","cartJustCreated","cartSyncing","handleQuantityChange","delta","newQuantities","totalQty","s","persistCheckoutState","createCartAndStartTimer","cartId","updateCartQuantities","initiateOrder","getAttribution","startTimer","trackAddToCart","err","findPriceRange","totalPrices","fetchTaxPreview","lineItems","res","data","applyStoredPromocode","checkTicketAvailability","freshTickets","fetchEventTickets","changes","ticketId","requestedQty","freshTicket","availableQty","storedTicket","goToCheckout","proceedToCheckout","params","url","goto","navErr","handleAcceptReducedQuantities","change","goBack","handleDeclineReducedQuantities","handleErrorModalClose","handleRefreshPage","updateScreenSize","ticking","handleScroll","updateStickyState","rect","bounds","clearCheckoutCookies","activeCartId","handleExpiredCart","storedExpiry","recomputeFromStoredDeadline","stored","getSessionStatus","expiredCartId","handlePromoChange","detail","code","writeId","latestEventWrite","ids","isEventEnded","eventEnd","loadEventData","transformEventDetail","fetchedEvent","fetchEventDetails","apiErr","fetchedTickets","ticketErr","cookieState","loadCheckoutStateFromCookies","trackUTMSource","ensureOrderIdExists","hasPromoCodes","has","onDestroy","lastLoadedEventId","EventInfoHeader","CheckoutTimer","PromocodeInput","TicketsGroup","node_6","node_7","OrderSummarySkeleton","OrderSummary","Modal","root_7","fragment_5","fragment_6","p_8","node_13","node_15","h3_1","p_9","node_16","h3_2","root_17","p_10","ul","li","root_15","p_11","c","p_12","root_18","node_19"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|