@getmicdrop/venue-calendar 4.0.52 → 4.0.54
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/{CarouselView.legacy-BmYDMNDe.js → CarouselView.legacy-BnpF5veq.js} +7 -7
- package/dist/{CarouselView.legacy-BmYDMNDe.js.map → CarouselView.legacy-BnpF5veq.js.map} +1 -1
- package/dist/{CartView-4HmCFkp9.js → CartView-DAGCIiPW.js} +135 -135
- package/dist/{CartView-4HmCFkp9.js.map → CartView-DAGCIiPW.js.map} +1 -1
- package/dist/{Checkout-hBdJY0vn.js → Checkout-BNUcnVqY.js} +118 -118
- package/dist/Checkout-BNUcnVqY.js.map +1 -0
- package/dist/{Checkout-ZPerGgig.js → Checkout-DRiXexjl.js} +198 -198
- package/dist/Checkout-DRiXexjl.js.map +1 -0
- package/dist/{Checkout.legacy-Bzg6GVQC.js → Checkout.legacy-DW_HnIdJ.js} +14 -8
- package/dist/Checkout.legacy-DW_HnIdJ.js.map +1 -0
- package/dist/{CheckoutTimer-yNMdROpw.js → CheckoutTimer-BDIenRyO.js} +2 -2
- package/dist/{CheckoutTimer-yNMdROpw.js.map → CheckoutTimer-BDIenRyO.js.map} +1 -1
- package/dist/{CollectionView-DbHetbgj.js → CollectionView-Dww4iuh6.js} +15 -15
- package/dist/{CollectionView-DbHetbgj.js.map → CollectionView-Dww4iuh6.js.map} +1 -1
- package/dist/{CollectionView.legacy-CPzXR3_m.js → CollectionView.legacy-BVkf712w.js} +31 -31
- package/dist/{CollectionView.legacy-CPzXR3_m.js.map → CollectionView.legacy-BVkf712w.js.map} +1 -1
- package/dist/{Event-CHzUFY5p.js → Event-C136pj0g.js} +74 -74
- package/dist/{Event-CHzUFY5p.js.map → Event-C136pj0g.js.map} +1 -1
- package/dist/{EventDetailsView-CGvqsrYl.js → EventDetailsView-lFoAqGfU.js} +2 -2
- package/dist/{EventDetailsView-CGvqsrYl.js.map → EventDetailsView-lFoAqGfU.js.map} +1 -1
- package/dist/{FeaturedView.legacy-C1bIqfjK.js → FeaturedView.legacy-Y5x48BNX.js} +20 -20
- package/dist/{FeaturedView.legacy-C1bIqfjK.js.map → FeaturedView.legacy-Y5x48BNX.js.map} +1 -1
- package/dist/{GalleryCard-Be4xa4TJ.js → GalleryCard-BiTDWmTW.js} +17 -17
- package/dist/{GalleryCard-Be4xa4TJ.js.map → GalleryCard-BiTDWmTW.js.map} +1 -1
- package/dist/{GalleryView.legacy-heZGamzA.js → GalleryView.legacy-2R-LCFNV.js} +5 -5
- package/dist/{GalleryView.legacy-heZGamzA.js.map → GalleryView.legacy-2R-LCFNV.js.map} +1 -1
- package/dist/{GroupedListView.legacy-BFAO666M.js → GroupedListView.legacy-ChfEfIyz.js} +32 -32
- package/dist/{GroupedListView.legacy-BFAO666M.js.map → GroupedListView.legacy-ChfEfIyz.js.map} +1 -1
- package/dist/{SeriesPage-CcCgnE1U.js → SeriesPage-CyHj_HwR.js} +5 -5
- package/dist/{SeriesPage-CcCgnE1U.js.map → SeriesPage-CyHj_HwR.js.map} +1 -1
- package/dist/{SeriesPage.legacy-D7nb4a8N.js → SeriesPage.legacy-Bd3NnKa8.js} +27 -27
- package/dist/{SeriesPage.legacy-D7nb4a8N.js.map → SeriesPage.legacy-Bd3NnKa8.js.map} +1 -1
- package/dist/{Success-BmyPuc0H.js → Success-Dbwc9f8F.js} +27 -27
- package/dist/{Success-BmyPuc0H.js.map → Success-Dbwc9f8F.js.map} +1 -1
- package/dist/{Success.legacy-BK9xb7v0.js → Success.legacy-BoKh1cBe.js} +3 -3
- package/dist/{Success.legacy-BK9xb7v0.js.map → Success.legacy-BoKh1cBe.js.map} +1 -1
- package/dist/{VenueCalendar-DMFCxXA1.js → VenueCalendar-BysKrSpJ.js} +1832 -1829
- package/dist/{VenueCalendar-DMFCxXA1.js.map → VenueCalendar-BysKrSpJ.js.map} +1 -1
- package/dist/{ViewTicketsEmbed-DDxWQPgl.js → ViewTicketsEmbed-bZrOJEeo.js} +2 -2
- package/dist/{ViewTicketsEmbed-DDxWQPgl.js.map → ViewTicketsEmbed-bZrOJEeo.js.map} +1 -1
- package/dist/{colors-BZoMuXdh.js → colors-CmP-sSZD.js} +2 -8
- package/dist/colors-CmP-sSZD.js.map +1 -0
- package/dist/{data-toggle-store.svelte-DB5xgrbx.js → data-toggle-store.svelte-Dy0O2Ndi.js} +2 -2
- package/dist/{data-toggle-store.svelte-DB5xgrbx.js.map → data-toggle-store.svelte-Dy0O2Ndi.js.map} +1 -1
- package/dist/{labels-BhI7l0P7.js → labels-DjKR57fF.js} +2 -2
- package/dist/{labels-BhI7l0P7.js.map → labels-DjKR57fF.js.map} +1 -1
- package/dist/{transform-Cll4_pVF.js → transform-DiMdqML7.js} +6 -6
- package/dist/{transform-Cll4_pVF.js.map → transform-DiMdqML7.js.map} +1 -1
- package/dist/venue-calendar.es.js +1 -1
- package/dist/venue-calendar.iife.js +24 -24
- package/dist/venue-calendar.iife.js.map +1 -1
- package/dist/venue-calendar.umd.js +24 -24
- package/dist/venue-calendar.umd.js.map +1 -1
- package/package.json +2 -2
- package/dist/Checkout-ZPerGgig.js.map +0 -1
- package/dist/Checkout-hBdJY0vn.js.map +0 -1
- package/dist/Checkout.legacy-Bzg6GVQC.js.map +0 -1
- package/dist/colors-BZoMuXdh.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event-CHzUFY5p.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/tokens/spacing.js","../node_modules/@getmicdrop/svelte-components/dist/components/Layout/Grid.svelte","../src/lib/public-calendar-flow/HeroImage.svelte","../src/lib/public-calendar-flow/EventHeader.svelte","../src/lib/utils/haptic.ts","../src/lib/public-calendar-flow/TicketCard.svelte","../src/lib/public-calendar-flow/BookingWidget.svelte","../src/lib/public-calendar-flow/AboutSection.svelte","../src/lib/public-calendar-flow/PerformerGrid.svelte","../src/lib/public-calendar-flow/FaqAccordion.svelte","../src/lib/public-calendar-flow/MobileCta.svelte","../src/lib/public-calendar-flow/PromoCodeInput.svelte","../src/lib/public-calendar-flow/ShowtimeDesigns.svelte","../src/lib/browse-widgets/event-teaser/tokens.ts","../src/lib/browse-widgets/event-teaser/EventTeaser.svelte","../src/lib/public-calendar-flow/Event.svelte"],"sourcesContent":["/**\n * @packageDocumentation\n * Tailwind-compatible spacing scale.\n */\nexport const spacing = {\n 'px': '1px',\n '0': '0px',\n '0.5': '0.125rem',\n '1': '0.25rem',\n '1.5': '0.375rem',\n '2': '0.5rem',\n '2.5': '0.625rem',\n '3': '0.75rem',\n '3.5': '0.875rem',\n '4': '1rem',\n '5': '1.25rem',\n '6': '1.5rem',\n '7': '1.75rem',\n '8': '2rem',\n '9': '2.25rem',\n '10': '2.5rem',\n '11': '2.75rem',\n '12': '3rem',\n '14': '3.5rem',\n '16': '4rem',\n '20': '5rem',\n '24': '6rem',\n '28': '7rem',\n '32': '8rem',\n '36': '9rem',\n '40': '10rem',\n '44': '11rem',\n '48': '12rem',\n '52': '13rem',\n '56': '14rem',\n '60': '15rem',\n '64': '16rem',\n '72': '18rem',\n '80': '20rem',\n '96': '24rem',\n};\nexport const spacingAliases = {\n xs: spacing['1'],\n sm: spacing['2'],\n md: spacing['4'],\n lg: spacing['6'],\n xl: spacing['8'],\n '2xl': spacing['12'],\n '3xl': spacing['16'],\n cardPadding: spacing['4'],\n modalPadding: spacing['6'],\n formGap: spacing['4'],\n buttonPaddingX: spacing['4'],\n buttonPaddingY: spacing['2'],\n inputPaddingX: spacing['3'],\n inputPaddingY: spacing['2'],\n tableCellPaddingX: spacing['4'],\n tableCellPaddingY: spacing['3'],\n};\n/**\n * Gap scale for flex/grid layouts.\n * Consolidates gap mappings from Stack and Grid components.\n *\n * ## Canonical axis (R-TOKEN-01): `gapScale.semantic`\n * **`gapScale.semantic` is the canonical gap axis.** Always reach for a\n * semantic key first — it encodes layout *intent* (`content`, `section`,\n * `layout`, …) instead of raw pixel counts.\n *\n * ## Escape hatch: `gapScale.numeric`\n * Use the numeric axis only when you need an exact Tailwind step that has no\n * semantic equivalent (e.g. `gapScale.numeric['1.5']` for an 6px inline\n * nudge). Prefer semantic wherever intent is expressible.\n *\n * ## Deprecated axes\n * `gapScale.legacy` and `gapScale.grid` are redundant duplicates of\n * `semantic`/`numeric` with less expressive names. They remain spread into\n * `gapMap` so existing string keys still resolve without a breaking change.\n * **Migrate callers to the semantic axis; these axes will be removed in the\n * next minor.** See the per-member `@deprecated` JSDoc for the exact\n * migration mapping.\n */\nexport const gapScale = {\n // Semantic names (preferred)\n semantic: {\n minimal: 'gap-1', // 4px - Very compact spacing\n compact: 'gap-1.5', // 6px - Slightly more than minimal\n item: 'gap-2', // 8px - Between list items\n group: 'gap-3', // 12px - Between related elements\n tight: 'gap-4', // 16px - Tight grid/content spacing\n content: 'gap-4', // 16px - Default content spacing\n card: 'gap-5', // 20px - Card internal spacing\n standard: 'gap-6', // 24px - Standard grid spacing\n section: 'gap-6', // 24px - Between sections\n spacious: 'gap-8', // 32px - Spacious grid items\n layout: 'gap-8', // 32px - Major layout divisions\n page: 'gap-12', // 48px - Page-level spacing\n },\n // Numeric scale (Tailwind spacing)\n numeric: {\n '0': 'gap-0',\n '1': 'gap-1',\n '1.5': 'gap-1.5',\n '2': 'gap-2',\n '3': 'gap-3',\n '4': 'gap-4',\n '6': 'gap-6',\n '8': 'gap-8',\n '12': 'gap-12',\n '16': 'gap-16',\n },\n /**\n * @deprecated Redundant duplicate of the `numeric`/`semantic` axes.\n * Migrate each member to its `semantic` equivalent (or `numeric` escape\n * hatch): `none`→`numeric['0']`, `xs`→`semantic.minimal`,\n * `sm`→`semantic.item`, `md`→`semantic.content`, `lg`→`semantic.section`,\n * `xl`→`semantic.layout`. Kept working via `gapMap` for now; removed in the\n * next minor.\n */\n legacy: {\n none: 'gap-0',\n xs: 'gap-1', // Use 'minimal' instead\n sm: 'gap-2', // Use 'item' instead\n md: 'gap-4', // Use 'content' instead\n lg: 'gap-6', // Use 'section' instead\n xl: 'gap-8', // Use 'layout' instead\n },\n /**\n * @deprecated Redundant duplicate of the `semantic` axis. The `grid-`\n * prefix carries no distinct value — `grid-tight`→`semantic.content`\n * (gap-4), `grid-standard`→`semantic.standard` (gap-6),\n * `grid-spacious`→`semantic.spacious` (gap-8). Kept working via `gapMap`\n * for now; removed in the next minor.\n */\n grid: {\n 'grid-tight': 'gap-4', // 16px - Tight grid items\n 'grid-standard': 'gap-6', // 24px - Standard grid items\n 'grid-spacious': 'gap-8', // 32px - Spacious grid items\n },\n};\n/** Combined gap map for component use */\nexport const gapMap = {\n ...gapScale.numeric,\n ...gapScale.legacy,\n ...gapScale.semantic,\n ...gapScale.grid,\n};\n/**\n * Align scale for flex layouts (items-*)\n */\nexport const alignScale = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n/**\n * Justify scale for flex layouts (justify-*)\n */\nexport const justifyScale = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { gapMap, type GapKey } from '../../tokens/spacing.js';\n\n /**\n * Grid - Responsive grid container with automatic column sizing\n *\n * Use Grid for laying out cards, stats, or any items in a responsive grid.\n * Automatically stacks on mobile and expands on larger screens.\n *\n * @example Numeric gap\n * <Grid cols=\"3\" gap=\"6\">\n * <StatsCard>Revenue</StatsCard>\n * <StatsCard>Users</StatsCard>\n * <StatsCard>Orders</StatsCard>\n * </Grid>\n *\n * @example Semantic gap (recommended)\n * <Grid cols=\"3\" gap=\"section\">\n * <Card>Card 1</Card>\n * <Card>Card 2</Card>\n * <Card>Card 3</Card>\n * </Grid>\n *\n * @example Auto-fit columns\n * <Grid cols=\"auto\" minWidth=\"300px\" gap=\"section\">\n * {#each items as item}\n * <Card>{item.name}</Card>\n * {/each}\n * </Grid>\n *\n * @example 12-column layout grid\n * <Grid cols=\"12\" gap=\"none\">\n * <div class=\"col-span-4\">Sidebar</div>\n * <div class=\"col-span-8\">Content</div>\n * </Grid>\n *\n * Semantic Gap Values (from tokens/spacing.ts):\n * - none: 0px - No gap (for 12-col layouts)\n * - xs: 4px (1) - Extra small gap\n * - sm: 8px (2) - Small gap\n * - tight: 16px (4) - Tight grid items (alias: md, content)\n * - standard: 24px (6) - Standard grid items (alias: lg, section)\n * - spacious: 32px (8) - Spacious grid items (alias: xl, layout)\n */\n\n interface Props {\n /** Number of columns or 'auto' for auto-fit */\n cols?: '1' | '2' | '3' | '4' | '5' | '6' | '12' | 'auto';\n /** Gap between grid items - semantic names or Tailwind spacing scale */\n gap?: GapKey;\n /** Minimum width for auto-fit columns (only used when cols='auto') */\n minWidth?: string;\n /** HTML element to render as */\n as?: 'div' | 'section' | 'ul';\n /** Additional CSS classes */\n class?: string;\n /** Child content */\n children?: Snippet;\n }\n\n let {\n cols = '3',\n gap = '4',\n minWidth = '280px',\n as = 'div',\n class: className = '',\n children\n }: Props = $props();\n\n // Responsive column mappings - stack on mobile, expand on larger screens\n const colsMap: Record<string, string> = {\n '1': 'grid-cols-1',\n '2': 'grid-cols-1 md:grid-cols-2',\n '3': 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n '4': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n '5': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5',\n '6': 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6',\n '12': 'grid-cols-12',\n 'auto': '' // Uses inline style\n };\n\n let gridStyle = $derived(\n cols === 'auto'\n ? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr));`\n : ''\n );\n\n let classes = $derived(\n [\n 'grid',\n cols !== 'auto' ? colsMap[cols] : '',\n gapMap[gap] || 'gap-4',\n className\n ].filter(Boolean).join(' ')\n );\n</script>\n\r\n<svelte:element this={as} class={classes} style={gridStyle || undefined}>\r\n {@render children?.()}\r\n</svelte:element>\r\n","<script lang=\"ts\">\r\n\tinterface Props {\r\n\t\tsrc: string;\r\n\t\talt: string;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { src, alt, labels = {}, }: Props = $props();\r\n</script>\r\n\r\n<div class=\"hero-container relative w-full overflow-hidden rounded-xl bg-surface-secondary\">\r\n\t<!-- @component-image-escape: scoped-CSS selector targets this img; aria-hidden not supported by SC Image -->\r\n\t<img\r\n\t\t{src}\r\n\t\talt=\"\"\r\n\t\tclass=\"hero-blur\"\r\n\t\tloading=\"eager\"\r\n\t\taria-hidden=\"true\"\r\n\t/>\r\n\t<!-- @component-image-escape: scoped-CSS selector targets this img -->\r\n\t<img\r\n\t\t{src}\r\n\t\t{alt}\r\n\t\tclass=\"hero-image\"\r\n\t\tloading=\"eager\"\r\n\t/>\r\n</div>\r\n\r\n<style>\r\n\t.hero-container {\r\n\t\tmax-height: 37.5rem;\r\n\t\tmin-height: 12rem;\r\n\t}\r\n\r\n\t/* Blurred zoomed copy as backdrop */\r\n\t.hero-blur {\r\n\t\tposition: absolute;\r\n\t\tinset: 0;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tobject-fit: cover;\r\n\t\ttransform: scale(1.15);\r\n\t\tfilter: blur(16px) saturate(1.2);\r\n\t}\r\n\r\n\t/* Main image on top, contained */\r\n\t.hero-image {\r\n\t\tposition: relative;\r\n\t\twidth: 100%;\r\n\t\tobject-fit: contain;\r\n\t\tmax-height: 37.5rem;\r\n\t\tmin-height: 12rem;\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Calendar, Location, Share, Theater, Time, User } from 'carbon-icons-svelte';\r\n\timport { Heading, Button } from '@getmicdrop/svelte-components';\r\n\timport { toast } from '@getmicdrop/svelte-components/toast';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport type { EventData, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tformatFullDateCompact,\r\n\t\tformatEventTime,\r\n\t\tformatTimeRange,\r\n\t\tformatDoorsTime,\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\thideDateTime?: boolean;\r\n\t\thideVenue?: boolean;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, hideDateTime = false, hideVenue = false, labels = {}, }: Props = $props();\r\n\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(event.totalTicketsRemaining, event.totalTicketsCapacity)\r\n\t);\r\n\tlet scarcityText = $derived(\r\n\t\tgetScarcityText(scarcityLevel, event.totalTicketsRemaining, 'event')\r\n\t);\r\n\r\n\tlet ageText = $derived((() => {\r\n\t\tif (!event.displayAgeRestriction) return null;\r\n\t\tif (event.ageRestriction && event.ageRestriction > 0) {\r\n\t\t\treturn `Ages ${event.ageRestriction}+`;\r\n\t\t}\r\n\t\treturn 'All ages';\r\n\t})());\r\n\r\n\tasync function shareEvent() {\r\n\t\tconst url = typeof window !== 'undefined'\r\n\t\t\t? `${window.location.origin}/e/${event.id}-${event.slug}`\r\n\t\t\t: '#';\r\n\t\tconst shareData = { url };\r\n\r\n\t\tif (navigator.share) {\r\n\t\t\ttry {\r\n\t\t\t\tawait navigator.share(shareData);\r\n\t\t\t} catch (err: unknown) {\r\n\t\t\t\tif (err instanceof Error && err.name !== 'AbortError') {\r\n\t\t\t\t\tfallbackShare(url);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfallbackShare(url);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction fallbackShare(url: string) {\r\n\t\tnavigator.clipboard.writeText(url).then(() => {\r\n\t\t\ttoast.success('Link copied to clipboard!');\r\n\t\t}).catch(() => {\r\n\t\t\t// duration: Infinity keeps the URL visible so users can still copy\r\n\t\t\t// it manually after clipboard API failure (Codex review of #103)\r\n\t\t\ttoast.error('Could not copy link — select the URL below to copy', {\r\n\t\t\t\tdescription: url,\r\n\t\t\t\tduration: Infinity,\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n</script>\r\n\r\n<div class=\"flex flex-col gap-4\">\r\n\t<div class=\"flex items-start gap-3 flex-wrap\">\r\n\t\t<Heading level={1} size=\"xl\" weight=\"bold\" class=\"sm:text-2xl leading-tight\">\r\n\t\t\t{event.title}\r\n\t\t</Heading>\r\n\t\t{#if scarcityText && event.status === 'on_sale'}\r\n\t\t\t<ScarcityBadge\r\n\t\t\t\tremaining={event.totalTicketsRemaining}\r\n\t\t\t\ttotal={event.totalTicketsCapacity}\r\n\t\t\t\tcontext=\"event\"\r\n\t\t\t/>\r\n\t\t{/if}\r\n\t</div>\r\n\r\n\t<!-- Share -->\r\n\t<Button variant=\"ghost\" size=\"xs\" class=\"self-start\" onclick={shareEvent}>\r\n\t\t<Share size={16} class=\"shrink-0\" />\r\n\t\tShare\r\n\t</Button>\r\n\r\n\t{#if !hideDateTime}\r\n\t\t<!-- Date -->\r\n\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t<Calendar size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t<span class=\"body-md font-medium\">{formatFullDateCompact(event.startDateTime, event.timezone)}</span>\r\n\t\t</div>\r\n\r\n\t\t<!-- Time + doors -->\r\n\t\t{#if event.displayStartTime !== false}\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<Time size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<div class=\"flex flex-col gap-0.5\">\r\n\t\t\t\t\t{#if event.displayEndTime !== false}\r\n\t\t\t\t\t\t<span class=\"body-md font-medium\">{formatTimeRange(event.startDateTime, event.endDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t<span class=\"body-md font-medium\">{formatEventTime(event.startDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{#if event.displayDoorsTime !== false && event.doorsOpenTime}\r\n\t\t\t\t\t\t<span class=\"caption\">Doors open {formatDoorsTime(event.doorsOpenTime, event.timezone)}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t{:else if event.displayDoorsTime !== false && event.doorsOpenTime}\r\n\t\t\t<!-- No start/end time, but doors time is shown -->\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<Time size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<span class=\"body-md font-medium\">Doors open {formatDoorsTime(event.doorsOpenTime, event.timezone)}</span>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t{/if}\r\n\r\n\t{#if !hideVenue}\r\n\t\t<!-- Venue + address -->\r\n\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t<Location size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t<div class=\"flex flex-col gap-0.5\">\r\n\t\t\t\t<span class=\"body-md font-medium\">{event.venue.name}</span>\r\n\t\t\t\t{#if event.venue.address}\r\n\t\t\t\t\t<span class=\"caption\">{event.venue.address}</span>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Stage name -->\r\n\t\t{#if event.stageName}\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<Theater size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<span class=\"body-md font-medium\">{event.stageName}</span>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Age restriction -->\r\n\t\t{#if ageText}\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<User size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<span class=\"body-md font-medium\">{ageText}</span>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t{/if}\r\n</div>","/**\r\n * Haptic feedback helper.\r\n *\r\n * One call site for `navigator.vibrate` so consumers don't repeat the\r\n * SSR + capability check. Android browsers vibrate; iOS Safari silently\r\n * no-ops (Apple deliberate — they reserve haptics for native apps via\r\n * the Taptic Engine, no web API exposed). Future-proof: if Apple ever\r\n * ships a web haptic API, swap the impl here and every consumer gets it.\r\n *\r\n * Styles:\r\n * - 'light' (8ms) — UI tick on small interactions (ticket +/-, tap)\r\n * - 'medium' (18ms) — committed state change (drawer snap, month flip)\r\n * - 'heavy' (32ms) — destructive / important confirmations\r\n */\r\nexport function tick(style: 'light' | 'medium' | 'heavy' = 'light'): void {\r\n\tif (typeof window === 'undefined') return;\r\n\tif (typeof navigator === 'undefined' || !navigator.vibrate) return;\r\n\tconst ms = style === 'light' ? 8 : style === 'medium' ? 18 : 32;\r\n\tnavigator.vibrate(ms);\r\n}\r\n","<script lang=\"ts\">\r\n\timport { Add, Subtract } from 'carbon-icons-svelte';\r\n\timport { Badge, Button, Heading, Input, Text, asTicketId, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { TicketId, USD } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport { tick } from '$lib/utils/haptic';\r\n\timport type { TicketTypeData, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText,\r\n\t\tformatSmartSalesDate,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tticket: TicketTypeData;\r\n\t\tquantity: number;\r\n\t\tonQuantityChange: (ticketId: TicketId, quantity: number) => void;\r\n\t\tdonationAmount?: string;\r\n\t\tonDonationChange?: (ticketId: TicketId, amount: string) => void;\r\n\t\tisRevealedByPromo?: boolean;\r\n\t\tisDiscountedByPromo?: boolean;\r\n\t\tdiscountedPrice?: number | null;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tticket,\r\n\t\tquantity,\r\n\t\tonQuantityChange,\r\n\t\tdonationAmount = '',\r\n\t\tonDonationChange,\r\n\t\tisRevealedByPromo = false,\r\n\t\tisDiscountedByPromo = false,\r\n\t\tdiscountedPrice = null,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\t// --- State detection ---\r\n\tlet isDonation = $derived(ticket.isDonation || ticket.ticketType === 2);\r\n\tlet isSoldOut = $derived(ticket.status === 'sold_out' || ticket.quantityAvailable === 0);\r\n\tlet isComingSoon = $derived(ticket.status === 'coming_soon');\r\n\tlet isSalesEnded = $derived(ticket.status === 'sales_ended');\r\n\tlet isDisabled = $derived(isSoldOut || isComingSoon || isSalesEnded);\r\n\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(ticket.quantityAvailable, ticket.quantityTotal)\r\n\t);\r\n\tlet scarcityText = $derived(getScarcityText(scarcityLevel, ticket.quantityAvailable, 'ticket'));\r\n\r\n\t// Donation validation\r\n\tlet donationValue = $derived(parseFloat(donationAmount) || 0);\r\n\tlet donationError = $derived(\r\n\t\tisDonation && donationAmount !== '' && donationValue < 1 ? 'Minimum $1.00' : ''\r\n\t);\r\n\tlet isDonationValid = $derived(!isDonation || (donationAmount !== '' && donationValue >= 1));\r\n\r\n\tlet canDecrement = $derived(quantity > 0);\r\n\tlet canIncrement = $derived(\r\n\t\t!isDisabled &&\r\n\t\tquantity < ticket.maxPerOrder &&\r\n\t\tquantity < ticket.quantityAvailable &&\r\n\t\tisDonationValid\r\n\t);\r\n\r\n\tfunction decrement() {\r\n\t\tif (canDecrement) {\r\n\t\t\t// If decrementing would go below minimum, jump to 0 (remove from cart)\r\n\t\t\tconst newQty = quantity - 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty < ticket.minPerOrder ? 0 : newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction increment() {\r\n\t\tif (canIncrement) {\r\n\t\t\t// If at 0, jump to minimum purchase quantity\r\n\t\t\tconst newQty = quantity === 0 ? ticket.minPerOrder : quantity + 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tlet donationInputValue = $state(donationAmount);\r\n\r\n\t// Sync external donationAmount prop to local state\r\n\t$effect(() => {\r\n\t\tdonationInputValue = donationAmount;\r\n\t});\r\n\r\n\t// Push local changes upstream\r\n\tfunction syncDonation() {\r\n\t\tif (donationInputValue !== donationAmount) {\r\n\t\t\t// eslint-disable-next-line micdrop/boundary-only-as-cast -- API response mapper: ticket.id arrives as raw number from server\r\n\t\tonDonationChange?.(asTicketId(ticket.id), donationInputValue);\r\n\t\t}\r\n\t}\r\n\r\n\t// Price display — show total inclusive of fees (matching production TicketBlock.svelte)\r\n\tlet totalPrice = $derived(isDonation ? 0 : ticket.price + (ticket.price === 0 ? 0 : ticket.fee));\r\n\tlet priceDisplay = $derived(\r\n\t\tisDonation ? '' : ticket.price === 0 ? (labels.free || 'Free') : `{formatCurrency(totalPrice as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}`\r\n\t);\r\n\tlet feeCaption = $derived(\r\n\t\t!isDonation && ticket.fee > 0 && ticket.price > 0 ? `incl. {formatCurrency(ticket.fee as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)} ${labels.fee || 'fee'}` : ''\r\n\t);\r\n\r\n\t// Sales start display for coming soon tickets\r\n\tlet salesStartDisplay = $derived(\r\n\t\tisComingSoon && ticket.salesStartDate\r\n\t\t\t? `Sales start ${formatSmartSalesDate(ticket.salesStartDate)}`\r\n\t\t\t: isComingSoon\r\n\t\t\t\t? 'Coming soon'\r\n\t\t\t\t: ''\r\n\t);\r\n</script>\r\n\r\n<article\r\n\tclass=\"ticket-card rounded-lg border p-4 transition-all\"\r\n\tclass:disabled-ticket={isDisabled}\r\n\tclass:revealed={isRevealedByPromo && !isDisabled}\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t<div class=\"vc-flex-between-start gap-4\">\r\n\t\t<!-- Ticket info -->\r\n\t\t<div class=\"flex-1 min-w-0\">\r\n\t\t\t<div class=\"flex-row-2 flex-wrap\">\r\n\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\">\r\n\t\t\t\t\t{ticket.name}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{#if isSoldOut}\r\n\t\t\t\t\t<Badge variant=\"error\">{labels.soldOut || 'Sold out'}</Badge>\r\n\t\t\t\t{:else if isSalesEnded}\r\n\t\t\t\t\t<Badge variant=\"neutral\">Sales ended</Badge>\r\n\t\t\t\t{:else if isRevealedByPromo}\r\n\t\t\t\t\t<Badge variant=\"success\">Unlocked</Badge>\r\n\t\t\t\t{:else if isDiscountedByPromo}\r\n\t\t\t\t\t<Badge variant=\"green\">Discount applied</Badge>\r\n\t\t\t\t{:else if scarcityText && !isComingSoon}\r\n\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\tremaining={ticket.quantityAvailable}\r\n\t\t\t\t\t\ttotal={ticket.quantityTotal}\r\n\t\t\t\t\t\tcontext=\"ticket\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t{#if ticket.description}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1 line-clamp-2\">\r\n\t\t\t\t\t{ticket.description}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Price row -->\r\n\t\t\t<div class=\"flex-row-2 mt-2\">\r\n\t\t\t\t{#if isDonation}\r\n\t\t\t\t\t<!-- Donation: $ input -->\r\n\t\t\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t\t\t<div class=\"donation-input-wrapper\" oninput={syncDonation}>\r\n\t\t\t\t\t\t<Input\r\n\t\t\t\t\t\t\tlabel=\"Donation amount\"\r\n\t\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\tplaceholder=\"0.00\"\r\n\t\t\t\t\t\t\tbind:value={donationInputValue}\r\n\t\t\t\t\t\t\tdisabled={isDisabled}\r\n\t\t\t\t\t\t\terrorText={donationError}\r\n\t\t\t\t\t\t\tcolor={donationError ? 'red' : 'base'}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{:else if isDiscountedByPromo && discountedPrice !== null}\r\n\t\t\t\t\t<!-- Discounted: strikethrough original total + discounted total (both inclusive of fee) -->\r\n\t\t\t\t\t{@const discountedTotal = discountedPrice + (discountedPrice === 0 ? 0 : ticket.fee)}\r\n\t\t\t\t\t<span class=\"price-strikethrough\">{formatCurrency(totalPrice as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t<span class=\"price-discounted\">{formatCurrency(discountedTotal as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{:else if isComingSoon}\r\n\t\t\t\t\t<!-- Coming soon: show price dimmed -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-muted\">{priceDisplay}</span>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<!-- Standard price -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-primary\">{priceDisplay}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Coming soon / sales ended message -->\r\n\t\t\t{#if salesStartDisplay}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1.5\">\r\n\t\t\t\t\t{salesStartDisplay}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\r\n\t\t<!-- Quantity controls -->\r\n\t\t<div class=\"flex items-center quantity-selector\">\r\n\t\t\t{#if isSoldOut || isComingSoon || isSalesEnded}\r\n\t\t\t\t<!-- No controls for coming soon / sales ended -->\r\n\t\t\t{:else}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={decrement}\r\n\t\t\t\t\tdisabled={!canDecrement}\r\n\t\t\t\t\taria-label=\"{labels.decrease || 'Decrease'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Subtract size={16} />\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tclass=\"qty-display\"\r\n\t\t\t\t\taria-live=\"polite\"\r\n\t\t\t\t\taria-label=\"{ticket.name} {labels.quantity || 'quantity'}: {quantity}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{quantity}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={increment}\r\n\t\t\t\t\tdisabled={!canIncrement}\r\n\t\t\t\t\taria-label=\"{labels.increase || 'Increase'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Add size={16} />\r\n\t\t\t\t</Button>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* Card states using HSL CSS variables (matching TicketBlock.svelte) */\r\n\t.ticket-card {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 220 13% 91%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 0 0% 100%)));\r\n\t}\r\n\r\n\t.ticket-card.revealed {\r\n\t\tborder-color: hsl(var(--accent-success) / 50%);\r\n\t\tbackground-color: hsl(var(--accent-success) / 8%);\r\n\t}\r\n\r\n\t.ticket-card.disabled-ticket {\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t/* Quantity selector */\r\n\t.quantity-selector {\r\n\t\tgap: 0.5rem;\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t.qty-display {\r\n\t\tmin-width: 2rem;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 1.125rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--text-primary, 222 47% 11%));\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t/* Discounted price green text */\r\n\t.price-discounted {\r\n\t\tfont-size: 0.875rem;\r\n\t\tline-height: 1.25rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t/* Donation input wrapper */\r\n\t.donation-input-wrapper {\r\n\t\tmin-width: 10rem;\r\n\t}\r\n\r\n .ticket-card {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 215 19% 35%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 222 47% 11%)));\r\n\t }\r\n }\r\n\r\n .ticket-card.revealed {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--accent-success)); /* green-700 */\r\n\t\tbackground-color: hsl(var(--accent-success));\r\n\t }\r\n }\r\n\r\n .qty-display {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tcolor: hsl(var(--text-primary, 0 0% 100%));\r\n\t }\r\n }\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Calendar } from 'carbon-icons-svelte';\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport { Badge, Button, Card, Heading, Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport type { EventData, OrderTotals, CtaConfig, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tgetCtaConfig,\r\n\t\tgetPriceDisplay,\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText,\r\n\t\tformatBrowseDate,\r\n\t\tformatEventTime,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\timport OrderSummary from './OrderSummary.svelte';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\torderTotals: OrderTotals;\r\n\t\thasSelectedTickets: boolean;\r\n\t\tonCheckout: () => void;\r\n\t\tpromoApplied?: boolean;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, orderTotals, hasSelectedTickets, onCheckout, promoApplied = false, labels = {}, }: Props = $props();\r\n\r\n\tlet ctaConfig: CtaConfig = $derived(getCtaConfig(event));\r\n\tlet priceDisplay = $derived(getPriceDisplay(event));\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(event.totalTicketsRemaining, event.totalTicketsCapacity)\r\n\t);\r\n\tlet scarcityText = $derived(\r\n\t\tgetScarcityText(scarcityLevel, event.totalTicketsRemaining, 'event')\r\n\t);\r\n\tlet isFreeEvent = $derived(\r\n\t\tevent.tickets.filter((t) => t.status === 'on_sale' && !t.isHidden).every((t) => t.price === 0)\r\n\t);\r\n\r\n\tfunction scrollToTickets() {\r\n\t\tif (typeof document === 'undefined') return;\r\n\t\tconst section = document.getElementById('ticket-section');\r\n\t\tif (section) {\r\n\t\t\tsection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<!--\r\n\tBookingWidget: Airbnb-style sticky sidebar card.\r\n\tTransitions from \"informational\" to \"cart\" mode with no skeleton placeholders.\r\n\tPassword protection is handled at the widget/browse level, not on the event page.\r\n-->\r\n{#if event.status === 'on_sale' && hasSelectedTickets}\r\n\t<!--\r\n\t\tFILLED STATE: cap the card to the viewport so a long order summary\r\n\t\tcan't push the Checkout button below the fold. Only the ticket-line\r\n\t\tlist scrolls; the totals block and Checkout button stay pinned, so\r\n\t\tthe buyer always sees Subtotal / Fees / Tax / Total and what they're\r\n\t\tabout to click.\r\n\t-->\r\n\t<Card border padding={false} class=\"flex flex-col max-h-[calc(100vh-1.5rem)] rounded-xl shadow-lg overflow-hidden bg-surface-secondary\">\r\n\t\t<div\r\n\t\t\tclass=\"flex flex-col flex-1 min-h-0\"\r\n\t\t\tstyle=\"animation: widgetFadeIn {DURATION.normal}ms ease-out;\"\r\n\t\t>\r\n\t\t\t<!-- Scrollable: ticket-line items only -->\r\n\t\t\t<div class=\"p-5 pb-3 flex-1 overflow-y-auto min-h-0\">\r\n\t\t\t\t<OrderSummary {orderTotals} mode=\"lines\" {labels} />\r\n\t\t\t</div>\r\n\t\t\t<!-- Pinned: totals + Checkout button -->\r\n\t\t\t<div class=\"px-5 pt-3 pb-5 shrink-0 border-t border-default space-y-3\">\r\n\t\t\t\t<OrderSummary {orderTotals} mode=\"totals\" {labels} />\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tonclick={onCheckout}\r\n\t\t\t\t>\r\n\t\t\t\t\t{#if isFreeEvent}\r\n\t\t\t\t\t\t{event.isRegistrationEvent ? (labels.reserveASpot || 'Reserve a spot') : (labels.getTickets || 'Get tickets')} · Free\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t{labels.checkout || 'Checkout'} · {formatCurrency(orderTotals.total as USD)}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</Card>\r\n{:else}\r\n<Card border padding={false} class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\">\r\n\t<div class=\"p-5\">\r\n\t\t{#if event.status === 'on_sale' && !ctaConfig.disabled}\r\n\t\t\t<!-- ON SALE: informational empty state (filled state handled in the sibling branch above) -->\r\n\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t<!-- Price display -->\r\n\t\t\t\t<div class=\"flex items-baseline gap-2\">\r\n\t\t\t\t\t{#if priceDisplay}\r\n\t\t\t\t\t\t<span class=\"price-lg text-color-primary text-xl\">\r\n\t\t\t\t\t\t\t{priceDisplay}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t{:else if isFreeEvent}\r\n\t\t\t\t\t\t<span class=\"price-lg text-color-primary text-xl\">\r\n\t\t\t\t\t\t\tFree\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Event date/time summary (compact) -->\r\n\t\t\t\t<div class=\"flex items-center gap-2\">\r\n\t\t\t\t\t<Calendar size={16} class=\"shrink-0 icon-muted\" />\r\n\t\t\t\t\t{#if event.displayStartTime !== false}\r\n\t\t\t\t\t\t<span class=\"body-sm\">{formatBrowseDate(event.startDateTime, event.timezone)} · {formatEventTime(event.startDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t<span class=\"body-sm\">{formatBrowseDate(event.startDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Scarcity badge -->\r\n\t\t\t\t{#if scarcityText}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\t\tremaining={event.totalTicketsRemaining}\r\n\t\t\t\t\t\t\ttotal={event.totalTicketsCapacity}\r\n\t\t\t\t\t\t\tcontext=\"event\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{/if}\r\n\r\n\t\t\t\t<!-- Promo applied badge -->\r\n\t\t\t\t{#if promoApplied}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<Badge variant=\"success\">{labels.promoApplied || 'Promo applied'}</Badge>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{/if}\r\n\r\n\t\t\t\t<!-- Divider -->\r\n\t\t\t\t<div class=\"divider\"></div>\r\n\r\n\t\t\t\t<!-- CTA: scroll to ticket section. Label + disabled state come from\r\n\t\t\t\t ctaConfig so this widget agrees with MobileCta in all states\r\n\t\t\t\t (incl. on_sale events whose startDateTime is in the past). -->\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tonclick={scrollToTickets}\r\n\t\t\t\t>\r\n\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{:else}\r\n\t\t\t<!-- DISABLED STATES: cancelled, past, sales_ended, coming_soon, sold_out,\r\n\t\t\t plus on_sale events that ctaConfig has computed as disabled\r\n\t\t\t (e.g. all tickets soldOut, sales window closed). One branch,\r\n\t\t\t one source of truth — ctaConfig.text / .disabled / .reason. -->\r\n\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t<Heading weight=\"semibold\">\r\n\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{#if ctaConfig.reason}\r\n\t\t\t\t\t<Text size=\"sm\" color=\"secondary\" class=\"block\">\r\n\t\t\t\t\t\t{ctaConfig.reason}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{/if}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tdisabled={true}\r\n\t\t\t\t>\r\n\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t</div>\r\n</Card>\r\n{/if}\r\n\r\n<style>\r\n\t@keyframes widgetFadeIn {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t * The filled-state card uses max-h-[calc(100vh-1.5rem)] inline (see Card\r\n\t * class above) to cap height to the viewport so the Checkout button\r\n\t * never falls below the fold when many ticket types are selected.\r\n\t * 1.5rem reserves a bottom gap; sticky parent is top-0 so no top offset.\r\n\t */\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Section, Text } from '@getmicdrop/svelte-components';\r\n\r\n\tinterface Props {\r\n\t\tdescription: string;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { description, labels = {}, }: Props = $props();\r\n\r\n\tlet paragraphs = $derived(\r\n\t\tdescription.split('\\n\\n').filter((p) => p.trim().length > 0)\r\n\t);\r\n</script>\r\n\r\n<Section title=\"About\" titleSize=\"lg\" gap=\"3\">\r\n\t<div class=\"space-y-4\">\r\n\t\t{#each paragraphs as paragraph}\r\n\t\t\t<Text size=\"sm\" color=\"secondary\" leading=\"relaxed\" class=\"block\">\r\n\t\t\t\t{paragraph}\r\n\t\t\t</Text>\r\n\t\t{/each}\r\n\t</div>\r\n</Section>\r\n","<script lang=\"ts\">\r\n\timport { Avatar, Card, Heading, Section } from '@getmicdrop/svelte-components';\r\n\timport type { PerformerData } from '$lib/public-calendar-flow/types';\r\n\r\n\tinterface Props {\r\n\t\tperformers: PerformerData[];\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { performers, labels = {}, }: Props = $props();\r\n</script>\r\n\r\n{#if performers.length > 0}\r\n\t<Section title=\"Performers\" titleSize=\"lg\" gap=\"4\">\r\n\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\r\n\t\t\t{#each performers as performer (performer.id)}\r\n\t\t\t\t<Card padding={false} class=\"flex items-center gap-3 p-3 bg-surface-secondary shadow-none\">\r\n\t\t\t\t\t<Avatar\r\n\t\t\t\t\t\tsrc={performer.profileImage || ''}\r\n\t\t\t\t\t\talt={performer.displayName}\r\n\t\t\t\t\t\tinitials={performer.displayName.charAt(0)}\r\n\t\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\t\tclass=\"shrink-0 rounded-lg\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<div class=\"min-w-0\">\r\n\t\t\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\" class=\"truncate\">\r\n\t\t\t\t\t\t\t{performer.displayName}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</Card>\r\n\t\t\t{/each}\r\n\t\t</div>\r\n\t</Section>\r\n{/if}\r\n\r\n","<script lang=\"ts\">\r\n\timport { Accordion, AccordionItem, Section } from '@getmicdrop/svelte-components';\r\n\timport type { FAQItem } from '$lib/public-calendar-flow/types';\r\n\r\n\tinterface Props {\r\n\t\tfaqs: FAQItem[];\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { faqs, labels = {}, }: Props = $props();\r\n</script>\r\n\r\n{#if faqs.length > 0}\r\n\t<Section title=\"Frequently asked questions\" titleSize=\"lg\" gap=\"3\">\r\n\t\t<Accordion flush variant=\"ghost\">\r\n\t\t\t{#each faqs as faq (faq.question)}\r\n\t\t\t\t<AccordionItem>\r\n\t\t\t\t\t{#snippet header()}{faq.question}{/snippet}\r\n\t\t\t\t\t{faq.answer}\r\n\t\t\t\t</AccordionItem>\r\n\t\t\t{/each}\r\n\t\t</Accordion>\r\n\t</Section>\r\n{/if}\r\n","<script lang=\"ts\">\r\n\timport { Button, Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport type { EventData, OrderTotals, CtaConfig } from '$lib/public-calendar-flow/types';\r\n\timport { getCtaConfig, getPriceDisplay } from '$lib/public-calendar-flow/defaults';\r\n\timport OrderSummary from './OrderSummary.svelte';\r\n\timport { tick } from '$lib/utils/haptic';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\torderTotals: OrderTotals;\r\n\t\thasSelectedTickets: boolean;\r\n\t\tonCheckout: () => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, orderTotals, hasSelectedTickets, onCheckout, labels = {} }: Props = $props();\r\n\r\n\tlet ctaConfig: CtaConfig = $derived(getCtaConfig(event));\r\n\tlet priceDisplay = $derived(getPriceDisplay(event));\r\n\tlet totalTicketCount = $derived(\r\n\t\torderTotals.lines.reduce((sum, l) => sum + l.quantity, 0)\r\n\t);\r\n\tlet isFreeEvent = $derived(\r\n\t\tevent.tickets.filter((t) => t.status === 'on_sale' && !t.isHidden).every((t) => t.price === 0)\r\n\t);\r\n\r\n\t// State machine: 'peek' = collapsed bar, 'open' = full drawer. ONE\r\n\t// physical element resizes between the two — no second flyout.\r\n\tlet mode = $state<'peek' | 'open'>('peek');\r\n\r\n\t// Fire a medium-strength haptic tick on every snap transition. Android\r\n\t// users feel it; iOS silently no-ops. Skip the first effect run so we\r\n\t// don't pulse on mount.\r\n\tlet prevModeForHaptic: 'peek' | 'open' | null = $state(null);\r\n\t$effect(() => {\r\n\t\tif (prevModeForHaptic !== null && prevModeForHaptic !== mode) {\r\n\t\t\ttick('medium');\r\n\t\t}\r\n\t\tprevModeForHaptic = mode;\r\n\t});\r\n\r\n\t// Defensive: if tickets get removed while the drawer is open, snap\r\n\t// closed. Otherwise the sheet stays at stale openHeight with no body\r\n\t// to render, showing a white block over the page.\r\n\t$effect(() => {\r\n\t\tif (!hasSelectedTickets) mode = 'peek';\r\n\t});\r\n\r\n\tconst PEEK_H = 80;\r\n\tlet bodyEl = $state<HTMLDivElement | null>(null);\r\n\tlet viewportH = $state(800);\r\n\t$effect(() => {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst sync = () => (viewportH = window.innerHeight);\r\n\t\tsync();\r\n\t\twindow.addEventListener('resize', sync, { passive: true });\r\n\t\treturn () => window.removeEventListener('resize', sync);\r\n\t});\r\n\r\n\t// Measure intrinsic content height — drawer snaps to fit-content, no whitespace.\r\n\tlet openHeight = $state(0);\r\n\t$effect(() => {\r\n\t\tif (!bodyEl || typeof ResizeObserver === 'undefined') return;\r\n\t\tfunction measure() {\r\n\t\t\tif (!bodyEl) return;\r\n\t\t\t// bodyEl has flex:1 1 auto so its scrollHeight equals its stretched\r\n\t\t\t// box height (= what we're trying to compute). Feedback loop. Use\r\n\t\t\t// firstElementChild's offsetHeight — OrderSummary's intrinsic size.\r\n\t\t\tconst inner = bodyEl.firstElementChild as HTMLElement | null;\r\n\t\t\tconst innerH = inner?.offsetHeight ?? 0;\r\n\t\t\tconst total = PEEK_H + innerH + 76 + 8;\r\n\t\t\topenHeight = Math.min(total, Math.round(viewportH * 0.9));\r\n\t\t}\r\n\t\tmeasure();\r\n\t\tconst ro = new ResizeObserver(measure);\r\n\t\tconst inner = bodyEl.firstElementChild as HTMLElement | null;\r\n\t\tif (inner) ro.observe(inner);\r\n\t\treturn () => ro.disconnect();\r\n\t});\r\n\r\n\tfunction scrollToTickets() {\r\n\t\tif (typeof document === 'undefined') return;\r\n\t\tconst sections = document.querySelectorAll<HTMLElement>('#ticket-section');\r\n\t\tfor (const section of sections) {\r\n\t\t\tif (section.offsetParent !== null) {\r\n\t\t\t\tsection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handleBarClick() {\r\n\t\tif (ctaConfig.disabled) return;\r\n\t\tif (!hasSelectedTickets) {\r\n\t\t\tscrollToTickets();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// Toggle: peek → open, open → peek. Tapping the grab area / bar at\r\n\t\t// either state moves to the other state.\r\n\t\tmode = mode === 'peek' ? 'open' : 'peek';\r\n\t}\r\n\r\n\tfunction handleDrawerCheckout() {\r\n\t\tmode = 'peek';\r\n\t\tonCheckout();\r\n\t}\r\n\r\n\tfunction closeDrawer() {\r\n\t\tmode = 'peek';\r\n\t}\r\n\r\n\tfunction ticketsLabel(n: number): string {\r\n\t\treturn n === 1 ? (labels.ticket || 'ticket') : (labels.tickets || 'tickets');\r\n\t}\r\n\r\n\t// === Drag mechanics — vaul-inspired =====================================\r\n\t//\r\n\t// Pointer Events instead of touch-only (mouse + touch + stylus, one path).\r\n\t// Track positions over a short rolling window to compute velocity for\r\n\t// \"flick\" detection. Resistance (rubber-band) beyond bounds. Body\r\n\t// scroll-vs-drag arbitration: at body scrollTop>0, drag is just body\r\n\t// scroll; only when at top do downward drags close the drawer.\r\n\tlet dragStartY = 0;\r\n\tlet dragStartHeight = 0;\r\n\tlet dragDeltaY = $state(0);\r\n\tlet isDragging = $state(false);\r\n\tlet pointerId = $state<number | null>(null);\r\n\tlet dragTarget = $state<HTMLElement | null>(null);\r\n\r\n\t// Rolling history for velocity: [{y, t}, ...]. Keep last ~5 samples.\r\n\tlet history: { y: number; t: number }[] = [];\r\n\r\n\tfunction recordSample(y: number) {\r\n\t\tconst t = performance.now();\r\n\t\thistory.push({ y, t });\r\n\t\t// Keep ~120ms of history — enough to compute a stable velocity\r\n\t\t// without overweighting old samples.\r\n\t\twhile (history.length > 0 && t - history[0].t > 120) history.shift();\r\n\t}\r\n\r\n\tfunction computeVelocity(): number {\r\n\t\tif (history.length < 2) return 0;\r\n\t\tconst first = history[0];\r\n\t\tconst last = history[history.length - 1];\r\n\t\tconst dt = last.t - first.t;\r\n\t\tif (dt <= 0) return 0;\r\n\t\treturn (last.y - first.y) / dt; // px/ms — positive = downward\r\n\t}\r\n\r\n\tfunction handlePointerDown(e: PointerEvent) {\r\n\t\t// Drag is disabled entirely when there's nothing to expand to —\r\n\t\t// otherwise the user can pull the sheet up against undefined open\r\n\t\t// state and the layout breaks.\r\n\t\tif (!hasSelectedTickets) return;\r\n\t\t// Only primary pointer; don't capture if click landed on a button.\r\n\t\tif (e.button !== 0 && e.pointerType === 'mouse') return;\r\n\t\tconst t = e.target as HTMLElement | null;\r\n\t\tif (t?.closest('button, a, input, select, textarea, [role=\"button\"]')) return;\r\n\r\n\t\t// Body scroll arbitration: if user starts the drag inside the\r\n\t\t// drawer body AND the body is scrolled past 0, this gesture is\r\n\t\t// body-scroll, not drawer-drag. Let it pass through.\r\n\t\tconst body = bodyEl;\r\n\t\tif (mode === 'open' && body && body.contains(t) && body.scrollTop > 0) return;\r\n\r\n\t\tdragStartY = e.clientY;\r\n\t\tdragStartHeight = mode === 'open' ? openHeight : PEEK_H;\r\n\t\tdragDeltaY = 0;\r\n\t\thistory = [];\r\n\t\trecordSample(e.clientY);\r\n\t\tisDragging = true;\r\n\t\tpointerId = e.pointerId;\r\n\t\tdragTarget = e.currentTarget as HTMLElement;\r\n\t\tdragTarget.setPointerCapture(e.pointerId);\r\n\t}\r\n\r\n\tfunction handlePointerMove(e: PointerEvent) {\r\n\t\tif (!isDragging || e.pointerId !== pointerId) return;\r\n\t\tconst dy = e.clientY - dragStartY;\r\n\t\trecordSample(e.clientY);\r\n\t\t// Rubber-band with a HARD CAP so the sheet can never exceed a tiny\r\n\t\t// fraction past the bounds. Without the cap, even a small multiplier\r\n\t\t// lets enthusiastic drags reach absurd heights — which then \"slowly\r\n\t\t// retracts\" on release looks broken.\r\n\t\tconst RUBBER_RESISTANCE = 0.15;\r\n\t\tconst MAX_OVERSHOOT = 24;\r\n\t\tconst rawHeight = dragStartHeight - dy;\r\n\t\tlet finalHeight: number;\r\n\t\tif (rawHeight > openHeight) {\r\n\t\t\tconst overshoot = Math.min((rawHeight - openHeight) * RUBBER_RESISTANCE, MAX_OVERSHOOT);\r\n\t\t\tfinalHeight = openHeight + overshoot;\r\n\t\t} else if (rawHeight < PEEK_H) {\r\n\t\t\tconst overshoot = Math.min((PEEK_H - rawHeight) * RUBBER_RESISTANCE, MAX_OVERSHOOT);\r\n\t\t\tfinalHeight = PEEK_H - overshoot;\r\n\t\t} else {\r\n\t\t\tfinalHeight = rawHeight;\r\n\t\t}\r\n\t\tdragDeltaY = dragStartHeight - finalHeight;\r\n\t}\r\n\r\n\tfunction handlePointerUp(e: PointerEvent) {\r\n\t\tif (!isDragging || e.pointerId !== pointerId) return;\r\n\t\tconst v = computeVelocity(); // px/ms, downward positive\r\n\t\tconst dy = dragDeltaY;\r\n\r\n\t\t// Snap decision combines distance + velocity. Strong flick beats\r\n\t\t// distance threshold; slow drag needs to clear midpoint.\r\n\t\tconst FLICK_VELOCITY = 0.5; // px/ms — calibrated to typical \"flick\"\r\n\t\tconst POSITION_THRESHOLD = (openHeight - PEEK_H) / 2;\r\n\r\n\t\tif (mode === 'open') {\r\n\t\t\t// Started open. Snap closed if dragged down enough OR flicked down.\r\n\t\t\tif (dy > POSITION_THRESHOLD || v > FLICK_VELOCITY) {\r\n\t\t\t\tmode = 'peek';\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Started peek. Snap open if dragged up enough OR flicked up.\r\n\t\t\tconst upward = -dy;\r\n\t\t\tif (upward > 40 || v < -FLICK_VELOCITY) {\r\n\t\t\t\tmode = 'open';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisDragging = false;\r\n\t\tdragDeltaY = 0;\r\n\t\thistory = [];\r\n\t\tdragTarget?.releasePointerCapture(e.pointerId);\r\n\t\tdragTarget = null;\r\n\t\tpointerId = null;\r\n\t}\r\n\r\n\tfunction handlePointerCancel(e: PointerEvent) {\r\n\t\tisDragging = false;\r\n\t\tdragDeltaY = 0;\r\n\t\thistory = [];\r\n\t\tif (dragTarget && pointerId !== null) {\r\n\t\t\ttry {\r\n\t\t\t\tdragTarget.releasePointerCapture(pointerId);\r\n\t\t\t} catch {\r\n\t\t\t\t// pointer already released\r\n\t\t\t}\r\n\t\t}\r\n\t\tdragTarget = null;\r\n\t\tpointerId = null;\r\n\t}\r\n\r\n\t// Live sheet height: while dragging, follow the finger; on release,\r\n\t// snap to mode via CSS transition.\r\n\tlet liveHeight = $derived.by(() => {\r\n\t\tif (!hasSelectedTickets) return PEEK_H;\r\n\t\tif (isDragging) return Math.max(PEEK_H * 0.5, dragStartHeight - dragDeltaY);\r\n\t\treturn mode === 'open' ? openHeight : PEEK_H;\r\n\t});\r\n\r\n\t// Body reveal progress 0→1 as sheet grows peek→open. Used to fade the\r\n\t// order summary in during drag, not just on release.\r\n\tlet revealProgress = $derived.by(() => {\r\n\t\tconst range = Math.max(1, openHeight - PEEK_H);\r\n\t\treturn Math.min(1, Math.max(0, (liveHeight - PEEK_H) / range));\r\n\t});\r\n</script>\r\n\r\n<!-- Backdrop scrim. Tap-to-close. -->\r\n{#if hasSelectedTickets}\r\n\t<!-- svelte-ignore a11y_click_events_have_key_events -->\r\n\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t<div\r\n\t\tclass=\"md:hidden fixed inset-0 z-40 transition-all duration-300 ease-out\"\r\n\t\tclass:scrim-open={mode === 'open'}\r\n\t\tclass:scrim-closed={mode === 'peek'}\r\n\t\tonclick={closeDrawer}\r\n\t\taria-hidden={mode !== 'open'}\r\n\t></div>\r\n{/if}\r\n\r\n<!-- Unified sheet. -->\r\n<!-- @tokens-px-escape: `env(safe-area-inset-bottom, 0px)` fallback requires literal px per CSS spec; iOS safe-area can't be expressed as a token. -->\r\n<!-- @modal-escape: bespoke draggable bottom-sheet (pointer-drag peek/open gesture, live height) — SC Modal cannot express a drag-to-dismiss sheet -->\r\n<!-- svelte-ignore a11y_click_events_have_key_events -->\r\n<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n<div\r\n\tclass=\"peek-sheet md:hidden fixed bottom-0 left-0 right-0 z-50 bg-bg-primary\"\r\n\tclass:peek-sheet--dragging={isDragging}\r\n\tclass:peek-sheet--open={mode === 'open'}\r\n\tstyle:height=\"{liveHeight}px\"\r\n\tstyle=\"padding-bottom: env(safe-area-inset-bottom, 0px);\"\r\n\trole=\"dialog\"\r\n\ttabindex=\"-1\"\r\n\taria-modal={mode === 'open'}\r\n\taria-label={labels.orderSummary || 'Order summary'}\r\n\tonpointerdown={handlePointerDown}\r\n\tonpointermove={handlePointerMove}\r\n\tonpointerup={handlePointerUp}\r\n\tonpointercancel={handlePointerCancel}\r\n>\r\n\t<!-- Top region — tap-to-open + drag handle. Fixed PEEK_H tall so the\r\n\t content row's vertical position is identical regardless of whether\r\n\t the grab handle is present. Grab handle is absolute-positioned so\r\n\t it doesn't push the row down. -->\r\n\t<div\r\n\t\tclass=\"peek-sheet__top\"\r\n\t\tonclick={hasSelectedTickets ? handleBarClick : undefined}\r\n\t>\r\n\t\t{#if hasSelectedTickets}\r\n\t\t\t<div class=\"peek-sheet__grab\" aria-hidden=\"true\">\r\n\t\t\t\t<div class=\"peek-sheet__pill\"></div>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<div class=\"peek-sheet__row flex items-center justify-between gap-3 px-4\">\r\n\t\t\t<div class=\"flex-1 min-w-0\">\r\n\t\t\t\t{#if hasSelectedTickets}\r\n\t\t\t\t\t<Text size=\"sm\" class=\"font-semibold tabular-nums\">\r\n\t\t\t\t\t\t{totalTicketCount} {ticketsLabel(totalTicketCount)} ·\r\n\t\t\t\t\t\t{#if isFreeEvent}\r\n\t\t\t\t\t\t\t{labels.free || 'Free'}\r\n\t\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t\t{formatCurrency(orderTotals.total as USD)}\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{:else if priceDisplay && !ctaConfig.disabled}\r\n\t\t\t\t\t<Text size=\"sm\" class=\"font-semibold block\">\r\n\t\t\t\t\t\t{priceDisplay}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{:else if ctaConfig.reason}\r\n\t\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block\">\r\n\t\t\t\t\t\t{ctaConfig.reason}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t{#if mode === 'peek'}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tdisabled={ctaConfig.disabled}\r\n\t\t\t\t\tonclick={(e) => {\r\n\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\tif (ctaConfig.disabled) return;\r\n\t\t\t\t\t\tif (hasSelectedTickets) {\r\n\t\t\t\t\t\t\tonCheckout();\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollToTickets();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tclass=\"shrink-0 min-w-32\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{#if hasSelectedTickets}\r\n\t\t\t\t\t\t{labels.checkout || 'Checkout'}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</Button>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t{#if hasSelectedTickets}\r\n\t\t<div\r\n\t\t\tbind:this={bodyEl}\r\n\t\t\tclass=\"peek-sheet__body\"\r\n\t\t\tstyle:opacity={revealProgress}\r\n\t\t>\r\n\t\t\t<OrderSummary {orderTotals} {labels} />\r\n\t\t</div>\r\n\r\n\t\t{#if mode === 'open'}\r\n\t\t\t<div class=\"peek-sheet__actions\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tdisabled={ctaConfig.disabled}\r\n\t\t\t\t\tonclick={handleDrawerCheckout}\r\n\t\t\t\t>\r\n\t\t\t\t\t{#if isFreeEvent}\r\n\t\t\t\t\t\t{event.isRegistrationEvent\r\n\t\t\t\t\t\t\t? (labels.reserveASpot || 'Reserve a spot')\r\n\t\t\t\t\t\t\t: (labels.getTickets || 'Get tickets')}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t{labels.checkout || 'Checkout'} · {formatCurrency(orderTotals.total as USD)}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.peek-sheet {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\toverflow: hidden;\r\n\t\t/* iOS-spec cubic-bezier from Apple's UIView spring-like easing. */\r\n\t\ttransition: height 350ms cubic-bezier(0.32, 0.72, 0, 1);\r\n\t\twill-change: height;\r\n\t\tbox-shadow:\r\n\t\t\t0 -8px 24px color-mix(in srgb, hsl(var(--overlay-bg)) 8%, transparent),\r\n\t\t\t0 -2px 6px color-mix(in srgb, hsl(var(--overlay-bg)) 6%, transparent);\r\n\t\t/* touch-action: pan-y on the sheet root lets pointer events fire for\r\n\t\t * vertical drag while still allowing native scroll inside .peek-sheet__body\r\n\t\t * which has its own touch-action setting. */\r\n\t\ttouch-action: pan-y;\r\n\t}\r\n\t.peek-sheet--open {\r\n\t\tborder-top-left-radius: 24px;\r\n\t\tborder-top-right-radius: 24px;\r\n\t\tbox-shadow:\r\n\t\t\t0 -8px 32px color-mix(in srgb, hsl(var(--overlay-bg)) 12%, transparent),\r\n\t\t\t0 -2px 8px color-mix(in srgb, hsl(var(--overlay-bg)) 8%, transparent);\r\n\t}\r\n\t.peek-sheet--dragging {\r\n\t\ttransition: none;\r\n\t}\r\n\r\n\t.peek-sheet__top {\r\n\t\tposition: relative;\r\n\t\tflex-shrink: 0;\r\n\t\theight: 80px; /* matches PEEK_H — bar content vertical position\r\n\t\t * never shifts based on grab-handle presence. */\r\n\t\t/* Grab area: forbid all default browser gestures so pointer events\r\n\t\t * arrive cleanly. iOS specifically requires `none` here or it tries\r\n\t\t * to consume the drag for page-scroll. */\r\n\t\ttouch-action: none;\r\n\t\tuser-select: none;\r\n\t\t-webkit-user-select: none;\r\n\t}\r\n\r\n\t.peek-sheet__row {\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t/* Grab handle absolute-positioned at the top center so it never shifts\r\n\t * the row content vertically. Only renders when hasSelectedTickets. */\r\n\t.peek-sheet__grab {\r\n\t\tposition: absolute;\r\n\t\ttop: 8px;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\tpointer-events: none;\r\n\t}\r\n\t.peek-sheet__pill {\r\n\t\twidth: 40px;\r\n\t\theight: 4px;\r\n\t\tborder-radius: 9999px;\r\n\t\tbackground-color: color-mix(in srgb, hsl(var(--text-tertiary)) 30%, transparent);\r\n\t}\r\n\r\n\t.peek-sheet__body {\r\n\t\tflex: 1 1 auto;\r\n\t\tmin-height: 0;\r\n\t\toverflow-y: auto;\r\n\t\toverscroll-behavior: contain;\r\n\t\tpadding: 0 16px 8px;\r\n\t\t/* Body opacity is driven from JS (revealProgress) so it tracks the\r\n\t\t * sheet height during drag instead of only fading in on release.\r\n\t\t * Body owns its own pan-y so internal touch-scroll works without\r\n\t\t * interfering with the sheet's drag handler. */\r\n\t\ttouch-action: pan-y;\r\n\t}\r\n\t/* Smooth fade when not actively dragging (release/tap-open animations). */\r\n\t.peek-sheet:not(.peek-sheet--dragging) .peek-sheet__body {\r\n\t\ttransition: opacity 250ms cubic-bezier(0.32, 0.72, 0, 1);\r\n\t}\r\n\r\n\t.peek-sheet__actions {\r\n\t\tflex-shrink: 0;\r\n\t\tpadding: 12px 16px 16px;\r\n\t\tborder-top: 1px solid;\r\n\t\tborder-color: color-mix(in srgb, var(--color-stroke-secondary) 50%, transparent);\r\n\t}\r\n\r\n\t.scrim-closed {\r\n\t\topacity: 0;\r\n\t\tpointer-events: none;\r\n\t\tbackground-color: transparent;\r\n\t\tbackdrop-filter: none;\r\n\t}\r\n\t.scrim-open {\r\n\t\topacity: 1;\r\n\t\tpointer-events: auto;\r\n\t\tbackground-color: color-mix(in srgb, hsl(var(--overlay-bg)) 35%, transparent);\r\n\t\tbackdrop-filter: blur(8px);\r\n\t\t-webkit-backdrop-filter: blur(8px);\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Input, Button } from '@getmicdrop/svelte-components';\r\n\timport type { PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tpromoState: PromoCodeState;\r\n\t\tonApply: (code: string) => void;\r\n\t\tonRemove: () => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { promoState, onApply, onRemove, labels = {}, }: Props = $props();\r\n\r\n\tlet isExpanded = $state(false);\r\n\tlet inputValue = $state('');\r\n\r\n\tfunction handleApply() {\r\n\t\tconst trimmed = inputValue.trim();\r\n\t\tif (!trimmed) return;\r\n\t\tonApply(trimmed);\r\n\t}\r\n\r\n\tfunction handleRemove() {\r\n\t\tinputValue = '';\r\n\t\tonRemove();\r\n\t}\r\n\r\n\tfunction handleKeydown(e: KeyboardEvent) {\r\n\t\tif (e.key === 'Enter') {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleApply();\r\n\t\t}\r\n\t}\r\n\r\n\t// Auto-expand when promo is applied (e.g. on restore)\r\n\tlet shouldExpand = $derived(promoState.isApplied || isExpanded);\r\n</script>\r\n\r\n<div class=\"promo-section\" role=\"group\" aria-labelledby=\"promo-label\">\r\n\t<span id=\"promo-label\" class=\"sr-only\">Promo code entry</span>\r\n\t{#if !shouldExpand}\r\n\t\t<Button variant=\"link\" onclick={() => (isExpanded = true)}>\r\n\t\t\t{labels.havePromoCode || 'Have a promo code?'}\r\n\t\t</Button>\r\n\t{:else}\r\n\t\t<div\r\n\t\t\tclass=\"space-y-2\"\r\n\t\t\tstyle=\"animation: promoSlideIn {DURATION.normal}ms ease-out;\"\r\n\t\t>\r\n\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t<div class=\"promo-input-wrapper\" onkeydown={handleKeydown}>\r\n\t\t\t\t<div class=\"flex-1\">\r\n\t\t\t\t\t<Input\r\n\t\t\t\t\t\tlabel={labels.promoCode || 'Promo code'}\r\n\t\t\t\t\t\tplaceholder={labels.enterCode || 'Enter code'}\r\n\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\tbind:value={inputValue}\r\n\t\t\t\t\t\tdisabled={promoState.isApplied || promoState.isValidating}\r\n\t\t\t\t\t\terrorText={promoState.error || ''}\r\n\t\t\t\t\t\tcolor={promoState.error ? 'red' : 'base'}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t{#if promoState.isApplied}\r\n\t\t\t\t\t<Button variant=\"outline\" onclick={handleRemove} class=\"h-10 self-start mt-5\" aria-label={labels.removePromoCode || 'Remove promo code'}>\r\n\t\t\t\t\t\t{labels.remove || 'Remove'}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\tonclick={handleApply}\r\n\t\t\t\t\t\tdisabled={promoState.isValidating || !inputValue.trim()}\r\n\t\t\t\t\t\tclass=\"h-10 self-start mt-5\"\r\n\t\t\t\t\t\taria-label={promoState.isValidating ? (labels.checkingPromoCode || 'Checking promo code') : (labels.applyPromoCode || 'Apply promo code')}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{promoState.isValidating ? (labels.checking || 'Checking...') : (labels.apply || 'Apply')}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Success hint -->\r\n\t\t\t{#if promoState.hint}\r\n\t\t\t\t<p class=\"promo-message success body-sm\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t\t\t{promoState.hint}\r\n\t\t\t\t</p>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.promo-section {\r\n\t\tmargin-top: 1rem;\r\n\t}\r\n\r\n\t.promo-input-wrapper {\r\n\t\tdisplay: flex;\r\n\t\tgap: 0.5rem;\r\n\t\talign-items: flex-start;\r\n\t}\r\n\r\n\t.promo-message {\r\n\t\tmargin-top: 0.5rem;\r\n\t}\r\n\r\n\t.promo-message.success {\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t@keyframes promoSlideIn {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Button, Text } from '@getmicdrop/svelte-components';\r\n\timport type { EventData } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tformatFullDateCompact,\r\n\t\tformatEventTime,\r\n\t\tformatBrowseDate\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\tonShowtimeClick?: (occurrence: { id: number; slug: string }) => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, onShowtimeClick = undefined, labels = {}, }: Props = $props();\r\n\r\n\t// --- Data ---\r\n\ttype GroupedOccurrences = {\r\n\t\tdateLabel: string;\r\n\t\tdateKey: string;\r\n\t\toccurrences: NonNullable<EventData['seriesOccurrences']>;\r\n\t}[];\r\n\r\n\tlet groupedOccurrences: GroupedOccurrences = $derived((() => {\r\n\t\tif (!event.seriesOccurrences) return [];\r\n\t\tconst groups: Map<string, { dateLabel: string; occurrences: NonNullable<EventData['seriesOccurrences']> }> = new Map();\r\n\t\tfor (const occ of event.seriesOccurrences) {\r\n\t\t\tconst dateKey = formatBrowseDate(occ.startDateTime, event.timezone);\r\n\t\t\tif (!groups.has(dateKey)) {\r\n\t\t\t\tgroups.set(dateKey, {\r\n\t\t\t\t\tdateLabel: formatFullDateCompact(occ.startDateTime, event.timezone),\r\n\t\t\t\t\toccurrences: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tgroups.get(dateKey)!.occurrences.push(occ);\r\n\t\t}\r\n\t\treturn [...groups.entries()].map(([dateKey, g]) => ({\r\n\t\t\tdateKey,\r\n\t\t\tdateLabel: g.dateLabel,\r\n\t\t\toccurrences: g.occurrences\r\n\t\t}));\r\n\t})());\r\n\r\n\tfunction handleShowtimeClick(occ: { id: number; slug: string }) {\r\n\t\tif (onShowtimeClick) {\r\n\t\t\tonShowtimeClick(occ);\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<section>\r\n\t<div class=\"space-y-4\">\r\n\t\t{#each groupedOccurrences as group (group.dateKey)}\r\n\t\t\t<div>\r\n\t\t\t\t<Text size=\"sm\" class=\"font-semibold block mb-2\">\r\n\t\t\t\t\t{group.dateLabel}\r\n\t\t\t\t</Text>\r\n\t\t\t\t<div class=\"space-y-2\">\r\n\t\t\t\t\t{#each group.occurrences as occ (occ.id)}\r\n\t\t\t\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\tclass=\"row-a border-default bg-surface-primary hover:bg-surface-secondary\"\r\n\t\t\t\t\t\t\tclass:row-disabled={occ.ctaDisabled}\r\n\t\t\t\t\t\t\tonclick={() => !occ.ctaDisabled && handleShowtimeClick({ id: occ.id, slug: occ.slug })}\r\n\t\t\t\t\t\t\tonkeydown={(e: KeyboardEvent) => e.key === 'Enter' && !occ.ctaDisabled && handleShowtimeClick({ id: occ.id, slug: occ.slug })}\r\n\t\t\t\t\t\t\ttabindex={occ.ctaDisabled ? -1 : 0}\r\n\t\t\t\t\t\t\trole=\"link\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{#if event.displayStartTime !== false}\r\n\t\t\t\t\t\t\t\t<Text size=\"sm\" class=\"font-medium\">\r\n\t\t\t\t\t\t\t\t\t{formatEventTime(occ.startDateTime, event.timezone)}\r\n\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t\tvariant={occ.ctaDisabled ? 'alternative' : 'default'}\r\n\t\t\t\t\t\t\t\tdisabled={occ.ctaDisabled}\r\n\t\t\t\t\t\t\t\tclass=\"shrink-0 pointer-events-none\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{occ.ctaText}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t{/each}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t{/each}\r\n\t</div>\r\n</section>\r\n\r\n<style>\r\n\t/* === Shared === */\r\n\t.row-disabled {\r\n\t\topacity: 0.5;\r\n\t\tcursor: default;\r\n\t}\r\n\r\n\t/* === Design A: Full-width rows === */\r\n\t.row-a {\r\n\t\twidth: 100%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t\tgap: 0.75rem;\r\n\t\tpadding: 0.75rem;\r\n\t\tborder-radius: 0.5rem;\r\n\t\tborder-width: 1px;\r\n\t\tborder-style: solid;\r\n\t\tcursor: pointer;\r\n\t\ttransition-property: all;\r\n\t\ttransition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\r\n\t\ttransition-duration: 150ms;\r\n\t}\r\n\r\n\t.row-a:hover:not(.row-disabled) {\r\n\t\tborder-color: hsl(var(--stroke-primary)); /* gray-300 */\r\n\t}\r\n\r\n .row-a:hover:not(.row-disabled) {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--stroke-primary)); /* gray-600 */\r\n\t }\r\n }\r\n</style>\r\n","/**\r\n * EventTeaser — Density + Layout tokens\r\n *\r\n * Two orthogonal knobs:\r\n * - layout: structural DOM shape (image on top, image on left, micro cell)\r\n * - density: scalar size (padding, gap, type-scale)\r\n *\r\n * Density tokens that are scalar values live as CSS custom properties on the\r\n * teaser element (see EventTeaser.svelte). Props passed to SC primitives\r\n * (Badge size, Button size) live here in TS because SC accepts a string union.\r\n */\r\n\r\nexport type TeaserLayout = 'vertical' | 'horizontal' | 'micro';\r\nexport type TeaserDensity = 'micro' | 'compact' | 'standard' | 'featured';\r\n\r\nexport interface TeaserToken {\r\n\tbadgeSize: 'xs' | 'sm';\r\n\tpillSize: 'xs' | 'sm';\r\n}\r\n\r\nexport const TEASER_DENSITY: Record<TeaserDensity, TeaserToken> = {\r\n\tmicro: { badgeSize: 'xs', pillSize: 'xs' },\r\n\tcompact: { badgeSize: 'sm', pillSize: 'xs' },\r\n\tstandard: { badgeSize: 'sm', pillSize: 'xs' },\r\n\tfeatured: { badgeSize: 'sm', pillSize: 'sm' },\r\n};\r\n","<script lang=\"ts\">\r\n\t/**\r\n\t * EventTeaser — the canonical event card.\r\n\t *\r\n\t * One primitive, two knobs:\r\n\t * layout = 'vertical' | 'horizontal' | 'micro'\r\n\t * density = 'micro' | 'compact' | 'standard' | 'featured'\r\n\t *\r\n\t * Solves the historical two-block padding gap by using a stretched-link\r\n\t * pattern: the title link's ::before pseudo covers the whole article, so the\r\n\t * entire card is one click target. Time pill <Button>s sit on top via\r\n\t * relative z-index, keeping them independently clickable. One padded\r\n\t * content container, one rhythm, no compound margins.\r\n\t */\r\n\timport { Badge, BlurBackdropImage, Button } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../../components/ScarcityBadge.svelte';\r\n\timport { formatBrowseDate, formatEventTime } from '$lib/utils/datetime.js';\r\n\timport { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n\timport { getBrowseStatus, getSeriesBrowseStatus, isEventUnavailable, badgeVariant } from '$lib/browse-widgets/status';\r\n\timport { buildEventHref } from '$lib/url-manager/params';\r\n\timport type { BrowseEvent, GroupedEvent } from '$lib/browse-widgets/types';\r\n\timport {\r\n\t\tTEASER_DENSITY,\r\n\t\ttype TeaserDensity,\r\n\t\ttype TeaserLayout,\r\n\t} from './tokens';\r\n\r\n\tinterface Props {\r\n\t\tgrouped: GroupedEvent;\r\n\t\tlayout?: TeaserLayout;\r\n\t\tdensity?: TeaserDensity;\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t\t/** Show truncated description (only honored at standard/featured density). */\r\n\t\tshowDescription?: boolean;\r\n\t\t/** Hide the date line. Set true when the consuming layout already shows\r\n\t\t * the date elsewhere (e.g. List view's left date rail). */\r\n\t\thideDate?: boolean;\r\n\t}\r\n\r\n\tlet {\r\n\t\tgrouped,\r\n\t\tlayout = 'vertical',\r\n\t\tdensity = 'standard',\r\n\t\toneventClick,\r\n\t\tlabels = {},\r\n\t\tshowDescription = false,\r\n\t\thideDate = false,\r\n\t}: Props = $props();\r\n\r\n\tlet event = $derived(grouped.event);\r\n\tlet token = $derived(TEASER_DENSITY[density]);\r\n\t// Series cards use the series-aware aggregator (only badge if EVERY\r\n\t// instance shares the status); single-event cards use the canonical\r\n\t// per-event computation.\r\n\tlet browseStatus = $derived(\r\n\t\tgrouped.isSeries\r\n\t\t\t? getSeriesBrowseStatus(grouped.instances, labels)\r\n\t\t\t: getBrowseStatus(event, labels)\r\n\t);\r\n\tlet isUnavailable = $derived(isEventUnavailable(browseStatus));\r\n\tlet eventHref = $derived(buildEventHref(event));\r\n\tlet titleId = $derived(`teaser-title-${event.eventID}`);\r\n\r\n\tlet allowDescription = $derived(\r\n\t\tshowDescription &&\r\n\t\t\t!!event.description &&\r\n\t\t\t(density === 'standard' || density === 'featured')\r\n\t);\r\n\tlet allowDate = $derived(!hideDate && density !== 'micro' && !!event.startDateTime);\r\n\r\n\t// All pills visible — with tightened mobile padding the content area\r\n\t// fits 2 pills per row, so even 6-showtime series like Comedy Marathon\r\n\t// stay under ~120px tall without needing a \"+N more\" cap.\r\n\tlet visibleInstances = $derived(grouped.instances);\r\n\r\n\tfunction ariaLabel() {\r\n\t\tconst parts = [event.name];\r\n\t\tif (event.startDateTime) {\r\n\t\t\tparts.push(`on ${formatBrowseDate(event.startDateTime, event.timeZone)}`);\r\n\t\t}\r\n\t\tif (grouped.isSeries) {\r\n\t\t\tparts.push(`${grouped.instances.length} showtimes available`);\r\n\t\t} else if (event.startDateTime) {\r\n\t\t\tparts.push(`at ${formatEventTime(event.startDateTime, event.timeZone)}`);\r\n\t\t}\r\n\t\tif (browseStatus) parts.push(browseStatus.text);\r\n\t\treturn parts.join(', ');\r\n\t}\r\n\r\n\tfunction onPillClick(instance: BrowseEvent, e: MouseEvent) {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\toneventClick?.(instance);\r\n\t}\r\n</script>\r\n\r\n<article\r\n\tclass=\"event-teaser relative rounded-lg border bg-card border-border overflow-hidden flex flex-col\"\r\n\tdata-layout={layout}\r\n\tdata-density={density}\r\n\taria-labelledby={titleId}\r\n>\r\n\t<div class=\"event-teaser__poster w-full aspect-video bg-muted shrink-0 overflow-hidden\">\r\n\t\t<BlurBackdropImage\r\n\t\t\tsrc={event.imageUrl}\r\n\t\t\tfallback={PLACEHOLDER_IMAGE}\r\n\t\t\tclass=\"event-teaser__poster-fill\"\r\n\t\t/>\r\n\t</div>\r\n\r\n\t<div class=\"event-teaser__content flex flex-col flex-1 min-w-0\">\r\n\t\t<header class=\"event-teaser__header\">\r\n\t\t\t<h3\r\n\t\t\t\tclass=\"event-teaser__title font-semibold text-text-primary m-0\"\r\n\t\t\t\tid={titleId}\r\n\t\t\t>\r\n\t\t\t\t{#if browseStatus}\r\n\t\t\t\t\t<span class=\"event-teaser__badge\">\r\n\t\t\t\t\t\t<Badge variant={badgeVariant(browseStatus.type)} size={token.badgeSize}>\r\n\t\t\t\t\t\t\t{browseStatus.text}\r\n\t\t\t\t\t\t</Badge>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t{:else if !grouped.isSeries && event.ticketsTotal && (event.ticketsTotal > 0 || event.ticketsRemaining === 0)}\r\n\t\t\t\t\t<!-- ScarcityBadge fallback (Only N left / Selling fast) is for\r\n\t\t\t\t\t single-event cards only. For series, the rep event's solo\r\n\t\t\t\t\t ticket count is misleading — a 4-show series where only the\r\n\t\t\t\t\t first show is sold out would falsely show \"Sold out\" on the\r\n\t\t\t\t\t series card. Series badges go through getSeriesBrowseStatus\r\n\t\t\t\t\t (above) which is null for mixed states; let it be null. -->\r\n\t\t\t\t\t<span class=\"event-teaser__badge\">\r\n\t\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\t\tremaining={event.ticketsRemaining ?? 0}\r\n\t\t\t\t\t\t\ttotal={event.ticketsTotal ?? 0}\r\n\t\t\t\t\t\t\tcontext=\"browse\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t{/if}\r\n\t\t\t\t<a\r\n\t\t\t\t\tclass=\"event-teaser__title-link\"\r\n\t\t\t\t\thref={eventHref}\r\n\t\t\t\t\tonclick={(e) => {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\toneventClick?.(event);\r\n\t\t\t\t\t}}\r\n\t\t\t\t\taria-label={ariaLabel()}\r\n\t\t\t\t>\r\n\t\t\t\t\t{event.name}\r\n\t\t\t\t</a>\r\n\t\t\t</h3>\r\n\t\t</header>\r\n\r\n\t\t{#if allowDate}\r\n\t\t\t<time\r\n\t\t\t\tclass=\"event-teaser__date text-text-secondary font-medium\"\r\n\t\t\t\tdatetime={event.startDateTime}\r\n\t\t\t>\r\n\t\t\t\t{formatBrowseDate(event.startDateTime, event.timeZone)}\r\n\t\t\t</time>\r\n\t\t{/if}\r\n\r\n\t\t{#if grouped.isSeries}\r\n\t\t\t<div class=\"event-teaser__pills flex flex-wrap gap-2 relative\">\r\n\t\t\t\t{#each visibleInstances as instance (instance.eventID)}\r\n\t\t\t\t\t{@const instStatus = getBrowseStatus(instance, labels)}\r\n\t\t\t\t\t{@const instSoldOut = instStatus?.type === 'sold_out'}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\thref={buildEventHref(instance)}\r\n\t\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\t\tsize={token.pillSize}\r\n\t\t\t\t\t\tonclick={(e) => onPillClick(instance, e)}\r\n\t\t\t\t\t\taria-label=\"{event.name} at {formatEventTime(instance.startDateTime, instance.timeZone)}{instSoldOut ? ', sold out' : ''}\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{formatEventTime(instance.startDateTime, instance.timeZone)}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/each}\r\n\t\t\t</div>\r\n\t\t{:else if event.startDateTime}\r\n\t\t\t<div class=\"event-teaser__pills flex flex-wrap gap-2 relative\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\thref={eventHref}\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize={token.pillSize}\r\n\t\t\t\t\tonclick={(e) => onPillClick(event, e)}\r\n\t\t\t\t\taria-label=\"{event.name} at {formatEventTime(event.startDateTime, event.timeZone)}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{formatEventTime(event.startDateTime, event.timeZone)}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t{#if allowDescription}\r\n\t\t\t<p class=\"event-teaser__description text-sm text-text-secondary m-0\">{event.description}</p>\r\n\t\t{/if}\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* === Shell motion === */\r\n\t.event-teaser {\r\n\t\ttransition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;\r\n\t\t/* Fill the grid cell so cards in the same row equalize height. Image\r\n\t\t * stays anchored to top via aspect-video; the content stack absorbs\r\n\t\t * the extra. Cards look uniform regardless of title length / pill\r\n\t\t * count / badge presence. */\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t.event-teaser:hover {\r\n\t\tborder-color: var(--color-stroke-primary, currentColor);\r\n\t\ttransform: translateY(-2px);\r\n\t\tbox-shadow: 0 4px 12px color-mix(in srgb, black 10%, transparent);\r\n\t}\r\n\r\n\t.event-teaser:active {\r\n\t\ttransform: translateY(0);\r\n\t}\r\n\r\n\t/* === Layout: horizontal (List) — always image-left, never stacks. ===\r\n\t * Sizes mirror v1 ListView at every breakpoint.\r\n\t * Poster keeps 16:9. When content (title + badge + multi-pill row) is\r\n\t * taller than the natural poster height, align-items:center distributes\r\n\t * the extra height above AND below the poster — reads as intentional\r\n\t * vertical centering, not orphaned blank space below the image.\r\n\t *\r\n\t * Padding + gap progression: 8 / 12 / 16 (space-2 / 3 / 4) — tighter\r\n\t * than the previous 8 / 16 / 24 which made desktop/tablet cards feel\r\n\t * loose with a lot of empty space between the image and content. Same\r\n\t * value used for inner padding AND poster-to-content gap so the cards\r\n\t * read uniformly at every breakpoint. */\r\n\t.event-teaser[data-layout='horizontal'] {\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t\tpadding: 0.5rem;\r\n\t\tgap: 0.5rem;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.event-teaser[data-layout='horizontal'] {\r\n\t\t\tpadding: 0.75rem; /* 12px = space-3 */\r\n\t\t\tgap: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-layout='horizontal'] {\r\n\t\t\tpadding: 1rem; /* 16px = space-4 */\r\n\t\t\tgap: 1rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Drop the content's own padding when in horizontal layout — the article\r\n\t * shell provides it. Keeps the gap rhythm intact. */\r\n\t.event-teaser[data-layout='horizontal'] .event-teaser__content {\r\n\t\tpadding: 0;\r\n\t}\r\n\r\n\t/* Poster gets its own rounded corners since it's no longer flush against\r\n\t * the article's clipped edge. */\r\n\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\tborder-radius: 0.5rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\t\tborder-radius: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Sizes mirror v1 ListView at every breakpoint:\r\n\t * mobile w-24 (6rem / 96px)\r\n\t * tablet w-28 (7rem / 112px)\r\n\t * desktop w-52 (13rem / 208px)\r\n\t * Aspect ratio stays 16:9 via the .event-teaser__poster base rules. */\r\n\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\twidth: 6rem;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\t\twidth: var(--teaser-poster-width, 7rem);\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\t\twidth: var(--teaser-poster-width-lg, 13rem);\r\n\t\t}\r\n\t}\r\n\r\n\t/* === Layout: micro centers content === */\r\n\t.event-teaser[data-layout='micro'] .event-teaser__content {\r\n\t\ttext-align: center;\r\n\t\talign-items: stretch;\r\n\t}\r\n\r\n\t:global(.event-teaser__poster .event-teaser__poster-fill) {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t/* === Content stack — single padded container, single rhythm. */\r\n\t.event-teaser__content {\r\n\t\tpadding: var(--teaser-padding);\r\n\t\tgap: var(--teaser-gap);\r\n\t}\r\n\r\n\t/* === Density tokens (CSS-only — scalar values that drive padding/gap/type) === */\r\n\t.event-teaser[data-density='micro'] {\r\n\t\t--teaser-padding: 0.25rem;\r\n\t\t--teaser-gap: 0.25rem;\r\n\t\t--teaser-title-size: 0.8125rem;\r\n\t\t--teaser-title-leading: 1.2;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 0.6875rem;\r\n\t}\r\n\r\n\t/* At micro density: drop the outer card chrome. The day cell already\r\n\t * provides the bg/border framing. Without this, every cell looks like\r\n\t * a card-inside-a-card (two borders, two paddings, two radii) — too busy\r\n\t * at 130-150px wide. The teaser becomes just image + title + pills. */\r\n\t.event-teaser[data-density='micro'] {\r\n\t\tborder: 0;\r\n\t\tbackground: transparent;\r\n\t\tborder-radius: 0;\r\n\t\toverflow: visible;\r\n\t}\r\n\t.event-teaser[data-density='micro']:hover {\r\n\t\tborder-color: transparent;\r\n\t\ttransform: none;\r\n\t\tbox-shadow: none;\r\n\t}\r\n\t/* Re-clip the poster's own corners since the outer overflow no longer\r\n\t * clips. Keep the image rounded so it doesn't look ragged. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__poster {\r\n\t\tborder-radius: 0.375rem;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Micro density centered title. Badge floats right-of-title via the\r\n\t * .event-teaser__badge float pattern (defined below) — no header-level\r\n\t * flex/column override needed because the badge is now an in-flow child\r\n\t * of the h3, not a sibling. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__title {\r\n\t\ttext-align: center;\r\n\t}\r\n\t.event-teaser[data-density='compact'] {\r\n\t\t--teaser-padding: 0.75rem;\r\n\t\t--teaser-gap: 0.5rem;\r\n\t\t--teaser-title-size: 1rem;\r\n\t\t--teaser-title-leading: 1.3;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 0.875rem;\r\n\t}\r\n\t.event-teaser[data-density='standard'] {\r\n\t\t--teaser-padding: 1rem; /* token: space-4 (was 0.875/14px, off-grid) */\r\n\t\t--teaser-gap: 0.5rem;\r\n\t\t--teaser-title-size: 1rem;\r\n\t\t--teaser-title-leading: 1.3;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 0.875rem;\r\n\t}\r\n\t.event-teaser[data-density='featured'] {\r\n\t\t--teaser-padding: 1.25rem;\r\n\t\t--teaser-gap: 0.75rem;\r\n\t\t--teaser-title-size: 1.25rem;\r\n\t\t--teaser-title-leading: 1.3;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 1rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-density='compact'] {\r\n\t\t\t--teaser-padding: 1rem;\r\n\t\t\t--teaser-title-size: 1.0625rem; /* parity with standard at desktop */\r\n\t\t}\r\n\t\t.event-teaser[data-density='standard'] {\r\n\t\t\t--teaser-padding: 1rem;\r\n\t\t\t--teaser-title-size: 1.0625rem;\r\n\t\t}\r\n\t\t.event-teaser[data-density='featured'] {\r\n\t\t\t--teaser-padding: 1.5rem;\r\n\t\t\t--teaser-title-size: 1.375rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Horizontal layout (List): 3-line clamp so Dave Martinez et al fit\r\n\t * after the float-right badge eats line 1. */\r\n\t.event-teaser[data-layout='horizontal'] {\r\n\t\t--teaser-title-clamp: 3;\r\n\t}\r\n\r\n\t/* Micro density (Calendar tile): badge sits on its OWN row above the\r\n\t * title, not floated inline. Tile is too narrow (~128px) for the\r\n\t * float-right pattern to work — short first words like \"Dave\" or\r\n\t * \"DJ\" land next to the badge and the title fractures. Block badge\r\n\t * on its own row keeps the title full-width and readable. Three-line\r\n\t * clamp covers the longest worst-case title (33 chars at 13px = ~2.1\r\n\t * lines, round up to 3 with safety margin). */\r\n\t.event-teaser[data-density='micro'] {\r\n\t\t--teaser-title-clamp: 3;\r\n\t}\r\n\t.event-teaser[data-density='micro'] .event-teaser__badge {\r\n\t\tfloat: none;\r\n\t\tdisplay: block;\r\n\t\tmargin: 0 auto 0.25rem;\r\n\t}\r\n\t/* The badge sits inside the .event-teaser__title h3, so its block\r\n\t * height counts against the title's max-height clamp. Drop the clamp\r\n\t * for micro so the badge row + 3 title lines both fit. The cell's\r\n\t * own height auto-grows; rows in the calendar grid equalize anyway. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__title {\r\n\t\tmax-height: none;\r\n\t}\r\n\r\n\t/* Horizontal layout below sm bumps title down one notch (16px → 14px).\r\n\t * The narrow row + image already eats ~150px on mobile; smaller title\r\n\t * keeps two lines visible without the row growing too tall. */\r\n\t@media (max-width: 639px) {\r\n\t\t.event-teaser[data-layout='horizontal'] {\r\n\t\t\t--teaser-title-size: 0.875rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* === Title type size + soft clamp via max-height + overflow ===\r\n\t * Switched off -webkit-box because float on .event-teaser__badge needs\r\n\t * regular block flow to wrap title text around it. max-height +\r\n\t * overflow:hidden trims overflow without losing the float behavior.\r\n\t * Clamp = lines * line-height; line-height is unitless, so we multiply\r\n\t * via calc on a stand-in 1em. */\r\n\t.event-teaser__title {\r\n\t\tfont-size: var(--teaser-title-size);\r\n\t\tline-height: var(--teaser-title-leading);\r\n\t\tmax-height: calc(var(--teaser-title-leading) * var(--teaser-title-clamp) * 1em);\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Badge floats right-of-title so long names dodge it on line 1 then use\r\n\t * the full content width on subsequent lines. Sits above the stretched\r\n\t * link via z-index so its pointer events still hit. */\r\n\t.event-teaser__badge {\r\n\t\tfloat: right;\r\n\t\tmargin-left: 0.5rem;\r\n\t\tmargin-bottom: 0.25rem;\r\n\t\tposition: relative;\r\n\t\tz-index: 2;\r\n\t}\r\n\r\n\t/* === Stretched link === */\r\n\t.event-teaser__title-link {\r\n\t\tcolor: inherit;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.event-teaser__title-link::before {\r\n\t\tcontent: '';\r\n\t\tposition: absolute;\r\n\t\tinset: 0;\r\n\t\tz-index: 1;\r\n\t}\r\n\t.event-teaser__title-link:focus-visible {\r\n\t\toutline: 2px solid var(--color-focus-ring, currentColor);\r\n\t\toutline-offset: 2px;\r\n\t}\r\n\r\n\t.event-teaser__date {\r\n\t\tfont-size: var(--teaser-date-size);\r\n\t}\r\n\r\n\t/* === Pills sit above stretched-link pseudo === */\r\n\t.event-teaser__pills {\r\n\t\tz-index: 2;\r\n\t}\r\n\r\n\t.event-teaser[data-layout='micro'] .event-teaser__pills {\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t/* Sold-out time pills render IDENTICALLY to other pills — per project\r\n\t * rule [[feedback_sold_out_clickable]], we don't dim or otherwise\r\n\t * visually differentiate sold-out states. The pill stays full\r\n\t * opacity, full color; user clicks through and gets the waitlist\r\n\t * option on the event page. aria-label still announces \"sold out\"\r\n\t * for screen readers. */\r\n\r\n\t/* At micro density: stack pills vertically, each full-width. Mirrors v1\r\n\t * calendar where 2+ showtimes per day was the most common case and the\r\n\t * \"wrap horizontal pills\" approach produced awkward 2-row near-fits. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__pills {\r\n\t\tflex-direction: column;\r\n\t\tgap: 0.25rem;\r\n\t}\r\n\t.event-teaser[data-density='micro'] .event-teaser__pills :global(> *) {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t/* === Description clamp === */\r\n\t.event-teaser__description {\r\n\t\tdisplay: -webkit-box;\r\n\t\t-webkit-line-clamp: 2;\r\n\t\tline-clamp: 2;\r\n\t\t-webkit-box-orient: vertical;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.event-teaser,\r\n\t\t.event-teaser:hover {\r\n\t\t\ttransform: none;\r\n\t\t\ttransition: none;\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n // @currency-escape: event price display\r\n\timport { createLogger, Grid, Heading, Text, asTicketId } from '@getmicdrop/svelte-components';\r\n\timport { toast } from '@getmicdrop/svelte-components/toast';\r\n\timport type { TicketId } from '@getmicdrop/svelte-components';\r\n\timport type { EventData, OrderTotals, OrderLine, PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tcalculateTax,\r\n\t\tcreateDefaultPromoState,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\timport HeroImage from './HeroImage.svelte';\r\n\timport EventHeader from './EventHeader.svelte';\r\n\timport TicketCard from './TicketCard.svelte';\r\n\timport BookingWidget from './BookingWidget.svelte';\r\n\timport AboutSection from './AboutSection.svelte';\r\n\timport PerformerGrid from './PerformerGrid.svelte';\r\n\timport FaqAccordion from './FaqAccordion.svelte';\r\n\timport MobileCta from './MobileCta.svelte';\r\n\timport PromoCodeInput from './PromoCodeInput.svelte';\r\n\timport ShowtimeDesigns from './ShowtimeDesigns.svelte';\r\n\timport EventTeaser from '$lib/browse-widgets/event-teaser/EventTeaser.svelte';\r\n\timport { groupEventsBySeries } from '$lib/browse-widgets/utils';\r\n\timport type { BrowseEvent } from '$lib/browse-widgets/types';\r\n\timport { mergeLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n\r\n\tconst logger = createLogger('Event');\r\n\r\n\t// Production component. Pure event renderer — no mock data, no toggle\r\n\t// store, no showcase wiring. Showcase variants live in\r\n\t// `ShowcaseEvent.svelte`, which picks a mock and renders <Event /> with it.\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\tonCheckout?: (orderTotals: OrderTotals) => void;\r\n\t\tonPromoApply?: (code: string) => Promise<PromoCodeState>;\r\n\t\tonPromoRemove?: () => void;\r\n\t\tonCollectionEventClick?: (event: { id?: number | string; slug: string }) => void;\r\n\t\tonShowtimeClick?: (occurrence: { id: number; slug: string }) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tevent,\r\n\t\tonCheckout: onCheckoutProp = undefined,\r\n\t\tonPromoApply: onPromoApplyProp = undefined,\r\n\t\tonPromoRemove: onPromoRemoveProp = undefined,\r\n\t\tonCollectionEventClick: onCollectionEventClickProp = undefined,\r\n\t\tonShowtimeClick: onShowtimeClickProp = undefined,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\tconst mergedLabels = $derived(mergeLabels(labels));\r\n\r\n\t// Ticket quantities keyed by ticket ID\r\n\tlet quantities: Record<TicketId, number> = $state({});\r\n\r\n\t// Promo code state\r\n\tlet promoState = $state<PromoCodeState>(createDefaultPromoState());\r\n\r\n\t// Donation amounts keyed by ticket ID\r\n\tlet donationAmounts: Record<TicketId, string> = $state({});\r\n\r\n\t// Reset cart-related state when the event identity changes. Covers both\r\n\t// showcase-mode mock swaps and production navigation between events.\r\n\t$effect(() => {\r\n\t\tconst _id = event.id;\r\n\t\tquantities = {};\r\n\t\tpromoState = createDefaultPromoState();\r\n\t\tdonationAmounts = {};\r\n\t});\r\n\r\n\t// Visible tickets (account for promo reveals)\r\n\tlet visibleTickets = $derived(\r\n\t\tevent.tickets.filter((t) => {\r\n\t\t\tif (!t.isHidden) return true;\r\n\t\t\tif (promoState.revealHiddenTickets) return true;\r\n\t\t\treturn promoState.revealTicketIds.includes(t.id);\r\n\t\t})\r\n\t);\r\n\r\n\t// Group tickets by section\r\n\tlet groupedTickets = $derived((() => {\r\n\t\tconst groups: Record<string, typeof visibleTickets> = {};\r\n\t\tfor (const ticket of visibleTickets) {\r\n\t\t\tconst section = ticket.sectionName || '_default';\r\n\t\t\tif (!groups[section]) groups[section] = [];\r\n\t\t\tgroups[section].push(ticket);\r\n\t\t}\r\n\t\treturn groups;\r\n\t})());\r\n\r\n\tlet hasMultipleSections = $derived(\r\n\t\tObject.keys(groupedTickets).filter((k) => k !== '_default').length > 0\r\n\t);\r\n\r\n\t// Show tickets for on_sale AND sold_out events (sold out shows them as disabled)\r\n\tlet isOnSale = $derived(event.status === 'on_sale');\r\n\tlet showTicketCards = $derived(\r\n\t\t(event.status === 'on_sale' || event.status === 'sold_out') && visibleTickets.length > 0\r\n\t);\r\n\r\n\t// Calculate order totals (with donation amounts and promo discounts)\r\n\tlet orderTotals: OrderTotals = $derived((() => {\r\n\t\tconst lines: OrderLine[] = [];\r\n\t\tlet subtotal = 0;\r\n\t\tlet fees = 0;\r\n\t\tlet promoDiscount = 0;\r\n\r\n\t\tfor (const ticket of event.tickets) {\r\n\t\t\tconst qty = quantities[ticket.id] ?? 0;\r\n\t\t\tif (qty <= 0) continue;\r\n\r\n\t\t\tconst isDonation = ticket.isDonation || ticket.ticketType === 2;\r\n\t\t\tconst basePrice = isDonation ? (parseFloat(donationAmounts[ticket.id]) || 0) : ticket.price;\r\n\t\t\tconst ticketFee = isDonation ? 0 : ticket.fee;\r\n\r\n\t\t\t// Calculate promo discount for this ticket\r\n\t\t\tlet ticketDiscount = 0;\r\n\t\t\tif (promoState.isApplied && promoState.discountAmount > 0 && !isDonation) {\r\n\t\t\t\tconst eligible = promoState.discountTicketIds.length === 0 || promoState.discountTicketIds.includes(ticket.id);\r\n\t\t\t\tif (eligible) {\r\n\t\t\t\t\tif (promoState.discountType === '%') {\r\n\t\t\t\t\t\tticketDiscount = basePrice * (promoState.discountAmount / 100);\r\n\t\t\t\t\t} else if (promoState.discountType === '$') {\r\n\t\t\t\t\t\tticketDiscount = Math.min(promoState.discountAmount, basePrice);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst effectivePrice = Math.max(0, basePrice - ticketDiscount);\r\n\t\t\tconst ticketSubtotal = effectivePrice * qty;\r\n\t\t\tconst totalTicketFee = ticketFee * qty;\r\n\r\n\t\t\tlines.push({\r\n\t\t\t\tticketId: asTicketId(ticket.id),\r\n\t\t\t\tticketName: ticket.name,\r\n\t\t\t\tquantity: qty,\r\n\t\t\t\tunitPrice: effectivePrice,\r\n\t\t\t\tfee: ticketFee,\r\n\t\t\t\tsubtotal: ticketSubtotal\r\n\t\t\t});\r\n\r\n\t\t\tsubtotal += ticketSubtotal;\r\n\t\t\tfees += totalTicketFee;\r\n\t\t\tpromoDiscount += ticketDiscount * qty;\r\n\t\t}\r\n\r\n\t\tconst taxes = calculateTax(subtotal + fees, event.venue.taxPercentage);\r\n\r\n\t\treturn {\r\n\t\t\tlines,\r\n\t\t\tsubtotal,\r\n\t\t\tfees,\r\n\t\t\ttaxes,\r\n\t\t\ttotal: subtotal + fees + taxes,\r\n\t\t\tpromoDiscount,\r\n\t\t\tgiftCardAmount: 0\r\n\t\t};\r\n\t})());\r\n\r\n\tlet hasSelectedTickets = $derived(orderTotals.lines.length > 0);\r\n\r\n\t// Series occurrences — group by date for same-day shows\r\n\tlet isSeries = $derived(!!event.eventSeriesId);\r\n\r\n\t// Collection — loose grouping of different events\r\n\tlet isCollection = $derived(!!event.collectionId);\r\n\r\n\t// Full-width layout mode (no sidebar)\r\n\tlet isFullWidth = $derived(isSeries || isCollection);\r\n\r\n\t// Collection events normalized to the canonical BrowseEvent shape and\r\n\t// grouped via groupEventsBySeries so EventTeaser can render them through\r\n\t// the design-system primitive instead of a feature-tree-crossing\r\n\t// GalleryCard. CollectionEvent uses id/image; BrowseEvent uses\r\n\t// eventID/imageUrl + a YYYY-MM-DD date derived from startDateTime.\r\n\tlet collectionTeaserGroups = $derived(\r\n\t\tgroupEventsBySeries(\r\n\t\t\t(event.collectionEvents ?? []).map<BrowseEvent>((ce) => ({\r\n\t\t\t\teventID: ce.id,\r\n\t\t\t\tname: ce.name,\r\n\t\t\t\tdate: ce.startDateTime.slice(0, 10),\r\n\t\t\t\tstartDateTime: ce.startDateTime,\r\n\t\t\t\timageUrl: ce.image,\r\n\t\t\t\t// browse-widgets/types narrows out 'past' (it computes past-ness\r\n\t\t\t\t// from endDateTime at runtime); coerce to the closest unbookable\r\n\t\t\t\t// status that the canonical union accepts.\r\n\t\t\t\tstatus: ce.status === 'past' ? 'sales_ended' : ce.status,\r\n\t\t\t\tslug: ce.slug,\r\n\t\t\t\ttimeZone: event.timezone,\r\n\t\t\t\tticketsRemaining: ce.ticketsRemaining,\r\n\t\t\t\tticketsTotal: ce.ticketsTotal,\r\n\t\t\t}))\r\n\t\t)\r\n\t);\r\n\r\n\tfunction handleCollectionEventClick(clicked: BrowseEvent) {\r\n\t\tconst out = { id: clicked.eventID, slug: clicked.slug ?? '' };\r\n\t\tif (onCollectionEventClickProp) {\r\n\t\t\tonCollectionEventClickProp(out);\r\n\t\t} else {\r\n\t\t\tlogger.info('Navigate to collection event:', out.slug);\r\n\t\t}\r\n\t}\r\n\r\n\t// --- Handlers ---\r\n\tfunction handleQuantityChange(ticketId: TicketId, qty: number) {\r\n\t\tquantities = { ...quantities, [ticketId]: qty };\r\n\t}\r\n\r\n\tfunction handleDonationChange(ticketId: TicketId, amount: string) {\r\n\t\tdonationAmounts = { ...donationAmounts, [ticketId]: amount };\r\n\t}\r\n\r\n\tfunction handleCheckout() {\r\n\t\tif (onCheckoutProp) {\r\n\t\t\tonCheckoutProp(orderTotals);\r\n\t\t} else {\r\n\t\t\t// @toast-escape: showcase-only fallback (no onCheckoutProp wired); toast used for dev visibility\r\n\t\t\tlogger.info('Checkout:', orderTotals);\r\n\t\t\tconst count = orderTotals.lines.reduce((s, l) => s + l.quantity, 0);\r\n\t\t\ttoast.info(`Proceeding to checkout with ${count} ticket(s) totaling $${orderTotals.total.toFixed(2)}`);\r\n\t\t}\r\n\t}\r\n\r\n\t// --- Promo handlers ---\r\n\t// Showcase test codes: REVEAL (unlocks hidden tickets), DISCOUNT10 (10% off), VIP20 ($20 off + reveal)\r\n\tfunction handlePromoApply(code: string) {\r\n\t\tif (onPromoApplyProp) {\r\n\t\t\t// Production mode: async API validation\r\n\t\t\tpromoState = { ...promoState, isValidating: true, error: '', hint: '' };\r\n\t\t\tonPromoApplyProp(code).then((result) => {\r\n\t\t\t\tpromoState = result;\r\n\t\t\t}).catch(() => {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\t...createDefaultPromoState(),\r\n\t\t\t\t\tcode: code.toUpperCase(),\r\n\t\t\t\t\terror: 'Failed to validate promo code'\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Showcase mode: mock validation\r\n\t\tconst upper = code.toUpperCase();\r\n\t\tpromoState = { ...promoState, isValidating: true, error: '', hint: '' };\r\n\r\n\t\t// Simulate async validation\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (upper === 'REVEAL') {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\tisApplied: true,\r\n\t\t\t\t\tisValidating: false,\r\n\t\t\t\t\terror: '',\r\n\t\t\t\t\thint: `${upper} applied. Hidden tickets are now visible.`,\r\n\t\t\t\t\tdiscountAmount: 0,\r\n\t\t\t\t\tdiscountType: '',\r\n\t\t\t\t\tdiscountTicketIds: [],\r\n\t\t\t\t\trevealHiddenTickets: true,\r\n\t\t\t\t\trevealTicketIds: []\r\n\t\t\t\t};\r\n\t\t\t} else if (upper === 'DISCOUNT10') {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\tisApplied: true,\r\n\t\t\t\t\tisValidating: false,\r\n\t\t\t\t\terror: '',\r\n\t\t\t\t\thint: `${upper} applied. 10% off all tickets.`,\r\n\t\t\t\t\tdiscountAmount: 10,\r\n\t\t\t\t\tdiscountType: '%',\r\n\t\t\t\t\tdiscountTicketIds: [],\r\n\t\t\t\t\trevealHiddenTickets: false,\r\n\t\t\t\t\trevealTicketIds: []\r\n\t\t\t\t};\r\n\t\t\t} else if (upper === 'VIP20') {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\tisApplied: true,\r\n\t\t\t\t\tisValidating: false,\r\n\t\t\t\t\terror: '',\r\n\t\t\t\t\thint: `${upper} applied. $20 off + hidden tickets revealed.`,\r\n\t\t\t\t\tdiscountAmount: 20,\r\n\t\t\t\t\tdiscountType: '$',\r\n\t\t\t\t\tdiscountTicketIds: [],\r\n\t\t\t\t\trevealHiddenTickets: true,\r\n\t\t\t\t\trevealTicketIds: []\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\t...createDefaultPromoState(),\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\terror: 'Invalid promo code'\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}, 800);\r\n\t}\r\n\r\n\tfunction handlePromoRemove() {\r\n\t\t// Always clean up hidden ticket quantities locally\r\n\t\tconst hiddenIds = event.tickets.filter((t) => t.isHidden).map((t) => t.id);\r\n\t\tconst newQuantities = { ...quantities };\r\n\t\tfor (const id of hiddenIds) {\r\n\t\t\tdelete newQuantities[id];\r\n\t\t}\r\n\t\tquantities = newQuantities;\r\n\t\tpromoState = createDefaultPromoState();\r\n\r\n\t\t// Notify production caller\r\n\t\tif (onPromoRemoveProp) {\r\n\t\t\tonPromoRemoveProp();\r\n\t\t}\r\n\t}\r\n\r\n\t// Compute per-ticket promo info\r\n\tfunction getTicketPromoInfo(ticketId: TicketId, ticket: { price: number; isDonation: boolean; isHidden: boolean; ticketType?: number }) {\r\n\t\tconst isDonation = ticket.isDonation || ticket.ticketType === 2;\r\n\t\tconst isRevealed = ticket.isHidden && (promoState.revealHiddenTickets || promoState.revealTicketIds.includes(ticketId));\r\n\r\n\t\tlet isDiscounted = false;\r\n\t\tlet discountedPrice: number | null = null;\r\n\r\n\t\tif (promoState.isApplied && promoState.discountAmount > 0 && !isDonation) {\r\n\t\t\tconst eligible = promoState.discountTicketIds.length === 0 || promoState.discountTicketIds.includes(ticketId);\r\n\t\t\tif (eligible) {\r\n\t\t\t\tisDiscounted = true;\r\n\t\t\t\tif (promoState.discountType === '%') {\r\n\t\t\t\t\tdiscountedPrice = ticket.price * (1 - promoState.discountAmount / 100);\r\n\t\t\t\t} else if (promoState.discountType === '$') {\r\n\t\t\t\t\tdiscountedPrice = Math.max(0, ticket.price - promoState.discountAmount);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn { isRevealed, isDiscounted, discountedPrice };\r\n\t}\r\n</script>\r\n\r\n<div class=\"w-full min-h-screen bg-surface-primary text-color-primary\">\r\n\t<div class=\"max-w-6xl mx-auto px-4 py-6 md:px-6 md:py-8\">\r\n\r\n\t\t<!-- Shared desktop content (rendered via snippet to avoid duplication) -->\r\n\t\t{#snippet desktopContent()}\r\n\t\t\t<!-- Hero image -->\r\n\t\t\t<HeroImage src={event.imageUrl} alt={event.title}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\r\n\t\t\t<!-- Event header (title, date, venue, stage, age, scarcity badge) -->\r\n\t\t\t<EventHeader {event} hideDateTime={isFullWidth} hideVenue={isCollection}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\r\n\t\t\t<!-- INLINE TICKET SELECTION (hidden for series/collection — no single-event tickets) -->\r\n\t\t\t{#if showTicketCards && !isFullWidth}\r\n\t\t\t\t<section id=\"ticket-section\">\r\n\t\t\t\t\t<Heading size=\"xl\" weight=\"semibold\" class=\"mb-4\">\r\n\t\t\t\t\t\t{isOnSale ? (labels.selectTickets || 'Select tickets') : (labels.ticketsTab || 'Tickets')}\r\n\t\t\t\t\t</Heading>\r\n\r\n\t\t\t\t\t{#if hasMultipleSections}\r\n\t\t\t\t\t\t<!-- Sectioned tickets -->\r\n\t\t\t\t\t\t{#each Object.entries(groupedTickets) as [sectionName, sectionTickets] (sectionName)}\r\n\t\t\t\t\t\t\t<div class=\"mb-6 last:mb-0\">\r\n\t\t\t\t\t\t\t\t{#if sectionName !== '_default'}\r\n\t\t\t\t\t\t\t\t\t<Heading level={3} size=\"sm\" weight=\"semibold\" class=\"mb-3\">\r\n\t\t\t\t\t\t\t\t\t\t{sectionName}\r\n\t\t\t\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t<!-- TODO: swap back to <Stack gap=\"3\"> once SC merges the\r\n\t\t\t\t\t\t\t\t ambiguous-Stack-export fix (see open issue). The root\r\n\t\t\t\t\t\t\t\t index.js does `export *` from both primitives/ and\r\n\t\t\t\t\t\t\t\t patterns/layout/, both of which contribute Stack, so\r\n\t\t\t\t\t\t\t\t the browser refuses to resolve `import { Stack }`. -->\r\n\t\t\t\t\t\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t\t\t\t\t\t{#each sectionTickets as ticket (ticket.id)}\r\n\t\t\t\t\t\t\t\t\t\t{@const promoInfo = getTicketPromoInfo(asTicketId(ticket.id), ticket)}\r\n\t\t\t\t\t\t\t\t\t\t<TicketCard\r\n\t\t\t\t\t\t\t\t\t\t\t{ticket}\r\n\t\t\t\t\t\t\t\t\t\t\tquantity={quantities[ticket.id] ?? 0}\r\n\t\t\t\t\t\t\t\t\t\t\tonQuantityChange={handleQuantityChange}\r\n\t\t\t\t\t\t\t\t\t\t\tdonationAmount={donationAmounts[ticket.id] ?? ''}\r\n\t\t\t\t\t\t\t\t\t\t\tonDonationChange={handleDonationChange}\r\n\t\t\t\t\t\t\t\t\t\t\tisRevealedByPromo={promoInfo.isRevealed}\r\n\t\t\t\t\t\t\t\t\t\t\tisDiscountedByPromo={promoInfo.isDiscounted}\r\n\t\t\t\t\t\t\t\t\t\t\tdiscountedPrice={promoInfo.discountedPrice}\r\n\t\t\t\t\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t<!-- Flat ticket list. Same TODO as the sectioned branch above:\r\n\t\t\t\t\t\t swap to <Stack gap=\"3\"> once SC's root index.js no longer\r\n\t\t\t\t\t\t star-exports Stack from two sibling trees. -->\r\n\t\t\t\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t\t\t\t{#each visibleTickets as ticket (ticket.id)}\r\n\t\t\t\t\t\t\t\t{@const promoInfo = getTicketPromoInfo(asTicketId(ticket.id), ticket)}\r\n\t\t\t\t\t\t\t\t<TicketCard\r\n\t\t\t\t\t\t\t\t\t{ticket}\r\n\t\t\t\t\t\t\t\t\tquantity={quantities[ticket.id] ?? 0}\r\n\t\t\t\t\t\t\t\t\tonQuantityChange={handleQuantityChange}\r\n\t\t\t\t\t\t\t\t\tdonationAmount={donationAmounts[ticket.id] ?? ''}\r\n\t\t\t\t\t\t\t\t\tonDonationChange={handleDonationChange}\r\n\t\t\t\t\t\t\t\t\tisRevealedByPromo={promoInfo.isRevealed}\r\n\t\t\t\t\t\t\t\t\tisDiscountedByPromo={promoInfo.isDiscounted}\r\n\t\t\t\t\t\t\t\t\tdiscountedPrice={promoInfo.discountedPrice}\r\n\t\t\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t<!-- Promo code input: only show when event is on sale -->\r\n\t\t\t\t\t{#if isOnSale}\r\n\t\t\t\t\t\t<PromoCodeInput\r\n\t\t\t\t\t\t\t{promoState}\r\n\t\t\t\t\t\t\tonApply={handlePromoApply}\r\n\t\t\t\t\t\t\tonRemove={handlePromoRemove}\r\n\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Showtimes (series — primary content, before About) -->\r\n\t\t\t{#if isSeries}\r\n\t\t\t\t<section>\r\n\t\t\t\t\t<Heading size=\"xl\" weight=\"semibold\" class=\"mb-4\">Upcoming Shows</Heading>\r\n\t\t\t\t\t<ShowtimeDesigns {event} onShowtimeClick={onShowtimeClickProp}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Collection: About goes above event widgets -->\r\n\t\t\t{#if isCollection}\r\n\t\t\t\t<AboutSection description={event.description}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Collection events grid (widgets) -->\r\n\t\t\t{#if isCollection}\r\n\t\t\t\t<section>\r\n\t\t\t\t\t<Heading size=\"xl\" weight=\"semibold\" class=\"mb-4\">Events</Heading>\r\n\t\t\t\t\t<Grid cols=\"auto\" minWidth=\"240px\" gap=\"6\">\r\n\t\t\t\t\t\t{#each collectionTeaserGroups as g (g.event.eventID)}\r\n\t\t\t\t\t\t\t<EventTeaser\r\n\t\t\t\t\t\t\t\tgrouped={g}\r\n\t\t\t\t\t\t\t\tlayout=\"vertical\"\r\n\t\t\t\t\t\t\t\tdensity=\"standard\"\r\n\t\t\t\t\t\t\t\toneventClick={handleCollectionEventClick}\r\n\t\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t</Grid>\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- About section (non-collection) -->\r\n\t\t\t{#if !isCollection}\r\n\t\t\t\t<AboutSection description={event.description}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Performers (hidden for series/collection) -->\r\n\t\t\t{#if !isFullWidth}\r\n\t\t\t\t<PerformerGrid performers={event.performers}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- FAQs (hidden for collection — FAQs are per-venue, not per-collection) -->\r\n\t\t\t{#if event.faqs.length > 0 && !isCollection}\r\n\t\t\t\t<FaqAccordion faqs={event.faqs}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Disclaimer -->\r\n\t\t\t{#if event.disclaimer}\r\n\t\t\t\t<section class=\"pt-4 border-t border-default\">\r\n\t\t\t\t\t<Text size=\"xs\" color=\"muted\" leading=\"relaxed\" class=\"block\">\r\n\t\t\t\t\t\t{event.disclaimer}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\t\t{/snippet}\r\n\r\n\t\t<!-- ============================================== -->\r\n\t\t<!-- DESKTOP LAYOUT -->\r\n\t\t<!-- ============================================== -->\r\n\t\t{#if isFullWidth}\r\n\t\t\t<!-- Series/Collection: full-width single column (no sidebar) -->\r\n\t\t\t<div class=\"hidden md:block space-y-8\">\r\n\t\t\t\t{@render desktopContent()}\r\n\t\t\t</div>\r\n\t\t{:else}\r\n\t\t\t<!-- Regular: two-column Airbnb split (1fr 360px) -->\r\n\t\t\t<div class=\"hidden md:grid grid-cols-booking-split gap-8 items-start\">\r\n\t\t\t\t<div class=\"space-y-8\">\r\n\t\t\t\t\t{@render desktopContent()}\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"sticky top-6\">\r\n\t\t\t\t\t<BookingWidget\r\n\t\t\t\t\t\t{event}\r\n\t\t\t\t\t\t{orderTotals}\r\n\t\t\t\t\t\t{hasSelectedTickets}\r\n\t\t\t\t\t\tonCheckout={handleCheckout}\r\n\t\t\t\t\t\tpromoApplied={promoState.isApplied}\r\n\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- ============================================== -->\r\n\t\t<!-- MOBILE: Single column with fixed bottom CTA -->\r\n\t\t<!-- ============================================== -->\r\n\t\t<div class=\"md:hidden space-y-6\" class:pb-24={!isFullWidth}>\r\n\t\t\t{@render desktopContent()}\r\n\t\t</div>\r\n\r\n\t\t<!-- Mobile: Fixed bottom CTA bar (DICE-style) — hidden for series/collection -->\r\n\t\t{#if !isFullWidth}\r\n\t\t\t<div class=\"md:hidden\">\r\n\t\t\t\t<MobileCta\r\n\t\t\t\t\t{event}\r\n\t\t\t\t\t{orderTotals}\r\n\t\t\t\t\t{hasSelectedTickets}\r\n\t\t\t\t\tonCheckout={handleCheckout}\r\n\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t</div>\r\n</div>\r\n\r\n"],"names":["gapScale","gapMap","cols","gap","minWidth","as","className","colsMap","gridStyle","$","classes","$$element","$$anchor","$$props","div","root","img","img_1","hideDateTime","hideVenue","scarcityLevel","getScarcityLevel","scarcityText","getScarcityText","ageText","shareEvent","url","shareData","err","fallbackShare","toast","div_1","Heading","node","ScarcityBadge","$$render","consequent","Button","node_2","Share","div_2","fragment_3","Calendar","span","node_5","div_3","root_5","Time","div_4","node_7","span_1","root_6","formatTimeRange","span_2","root_7","formatEventTime","consequent_1","alternate","span_3","root_8","formatDoorsTime","consequent_2","div_5","root_9","span_4","node_10","consequent_3","consequent_4","formatFullDateCompact","consequent_5","div_6","fragment_4","Location","div_7","node_12","span_5","span_6","root_11","text_7","consequent_6","div_8","root_12","Theater","span_7","node_15","consequent_7","div_9","root_13","User","span_8","node_17","consequent_8","text_6","consequent_9","tick","style","ms","donationAmount","isRevealedByPromo","isDiscountedByPromo","discountedPrice","labels","isDonation","isSoldOut","isComingSoon","isSalesEnded","isDisabled","donationValue","donationError","isDonationValid","canDecrement","canIncrement","decrement","newQty","asTicketId","increment","donationInputValue","syncDonation","totalPrice","priceDisplay","feeCaption","salesStartDisplay","formatSmartSalesDate","article","Badge","Text","Input","node_4","$$value","discountedTotal","fragment_9","root_15","formatCurrency","root_16","fragment_10","root_18","consequent_10","consequent_11","node_9","Subtract","Add","consequent_12","alternate_1","DURATION","promoApplied","ctaConfig","getCtaConfig","getPriceDisplay","isFreeEvent","t","scrollToTickets","section","Card","root_2","OrderSummary","node_1","node_3","$0","text_1","root_10","formatBrowseDate","root_14","node_13","root_17","node_14","text_8","node_16","text_9","alternate_2","alternate_3","paragraphs","p","Section","root_1","paragraph","performer","$1","Avatar","text","Accordion","faq","AccordionItem","totalTicketCount","sum","l","mode","prevModeForHaptic","PEEK_H","bodyEl","viewportH","sync","openHeight","measure","innerH","total","ro","inner","sections","handleBarClick","handleDrawerCheckout","closeDrawer","ticketsLabel","n","dragStartY","dragStartHeight","dragDeltaY","isDragging","pointerId","dragTarget","history","recordSample","y","computeVelocity","first","last","dt","handlePointerDown","e","body","handlePointerMove","dy","RUBBER_RESISTANCE","MAX_OVERSHOOT","rawHeight","finalHeight","overshoot","handlePointerUp","v","FLICK_VELOCITY","POSITION_THRESHOLD","handlePointerCancel","liveHeight","revealProgress","range","text_2","text_4","fragment_13","styles_1","classes_1","styles","$$args","isExpanded","inputValue","handleApply","trimmed","handleRemove","handleKeydown","shouldExpand","root_3","$2","$3","onShowtimeClick","groupedOccurrences","groups","occ","dateKey","g","handleShowtimeClick","group","TEASER_DENSITY","layout","density","showDescription","hideDate","event","token","browseStatus","getSeriesBrowseStatus","getBrowseStatus","isEventUnavailable","eventHref","buildEventHref","titleId","allowDescription","allowDate","visibleInstances","ariaLabel","parts","onPillClick","instance","BlurBackdropImage","PLACEHOLDER_IMAGE","header","h3","badgeVariant","a","time","root_4","instStatus","instSoldOut","node_6","text_5","logger","createLogger","onCheckoutProp","onPromoApplyProp","onPromoRemoveProp","onCollectionEventClickProp","onShowtimeClickProp","mergedLabels","mergeLabels","quantities","promoState","createDefaultPromoState","donationAmounts","visibleTickets","groupedTickets","ticket","hasMultipleSections","k","isOnSale","showTicketCards","orderTotals","lines","subtotal","fees","promoDiscount","qty","basePrice","ticketFee","ticketDiscount","effectivePrice","ticketSubtotal","totalTicketFee","taxes","calculateTax","hasSelectedTickets","isSeries","isCollection","isFullWidth","collectionTeaserGroups","groupEventsBySeries","ce","handleCollectionEventClick","clicked","out","handleQuantityChange","ticketId","handleDonationChange","amount","handleCheckout","count","s","handlePromoApply","code","result","upper","handlePromoRemove","hiddenIds","newQuantities","id","getTicketPromoInfo","isRevealed","isDiscounted","desktopContent","HeroImage","EventHeader","section_1","sectionName","sectionTickets","$$item","$$array","promoInfo","TicketCard","PromoCodeInput","section_2","ShowtimeDesigns","AboutSection","section_3","Grid","EventTeaser","PerformerGrid","FaqAccordion","section_4","root_22","node_20","root_24","node_22","root_25","node_23","BookingWidget","node_24","node_21","node_25","div_10","root_26","MobileCta","node_27"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"Event-C136pj0g.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/tokens/spacing.js","../node_modules/@getmicdrop/svelte-components/dist/components/Layout/Grid.svelte","../src/lib/public-calendar-flow/HeroImage.svelte","../src/lib/public-calendar-flow/EventHeader.svelte","../src/lib/utils/haptic.ts","../src/lib/public-calendar-flow/TicketCard.svelte","../src/lib/public-calendar-flow/BookingWidget.svelte","../src/lib/public-calendar-flow/AboutSection.svelte","../src/lib/public-calendar-flow/PerformerGrid.svelte","../src/lib/public-calendar-flow/FaqAccordion.svelte","../src/lib/public-calendar-flow/MobileCta.svelte","../src/lib/public-calendar-flow/PromoCodeInput.svelte","../src/lib/public-calendar-flow/ShowtimeDesigns.svelte","../src/lib/browse-widgets/event-teaser/tokens.ts","../src/lib/browse-widgets/event-teaser/EventTeaser.svelte","../src/lib/public-calendar-flow/Event.svelte"],"sourcesContent":["/**\n * @packageDocumentation\n * Tailwind-compatible spacing scale.\n */\nexport const spacing = {\n 'px': '1px',\n '0': '0px',\n '0.5': '0.125rem',\n '1': '0.25rem',\n '1.5': '0.375rem',\n '2': '0.5rem',\n '2.5': '0.625rem',\n '3': '0.75rem',\n '3.5': '0.875rem',\n '4': '1rem',\n '5': '1.25rem',\n '6': '1.5rem',\n '7': '1.75rem',\n '8': '2rem',\n '9': '2.25rem',\n '10': '2.5rem',\n '11': '2.75rem',\n '12': '3rem',\n '14': '3.5rem',\n '16': '4rem',\n '20': '5rem',\n '24': '6rem',\n '28': '7rem',\n '32': '8rem',\n '36': '9rem',\n '40': '10rem',\n '44': '11rem',\n '48': '12rem',\n '52': '13rem',\n '56': '14rem',\n '60': '15rem',\n '64': '16rem',\n '72': '18rem',\n '80': '20rem',\n '96': '24rem',\n};\nexport const spacingAliases = {\n xs: spacing['1'],\n sm: spacing['2'],\n md: spacing['4'],\n lg: spacing['6'],\n xl: spacing['8'],\n '2xl': spacing['12'],\n '3xl': spacing['16'],\n cardPadding: spacing['4'],\n modalPadding: spacing['6'],\n formGap: spacing['4'],\n buttonPaddingX: spacing['4'],\n buttonPaddingY: spacing['2'],\n inputPaddingX: spacing['3'],\n inputPaddingY: spacing['2'],\n tableCellPaddingX: spacing['4'],\n tableCellPaddingY: spacing['3'],\n};\n/**\n * Gap scale for flex/grid layouts.\n * Consolidates gap mappings from Stack and Grid components.\n *\n * ## Canonical axis (R-TOKEN-01): `gapScale.semantic`\n * **`gapScale.semantic` is the canonical gap axis.** Always reach for a\n * semantic key first — it encodes layout *intent* (`content`, `section`,\n * `layout`, …) instead of raw pixel counts.\n *\n * ## Escape hatch: `gapScale.numeric`\n * Use the numeric axis only when you need an exact Tailwind step that has no\n * semantic equivalent (e.g. `gapScale.numeric['1.5']` for an 6px inline\n * nudge). Prefer semantic wherever intent is expressible.\n *\n * ## Deprecated axes\n * `gapScale.legacy` and `gapScale.grid` are redundant duplicates of\n * `semantic`/`numeric` with less expressive names. They remain spread into\n * `gapMap` so existing string keys still resolve without a breaking change.\n * **Migrate callers to the semantic axis; these axes will be removed in the\n * next minor.** See the per-member `@deprecated` JSDoc for the exact\n * migration mapping.\n */\nexport const gapScale = {\n // Semantic names (preferred)\n semantic: {\n minimal: 'gap-1', // 4px - Very compact spacing\n compact: 'gap-1.5', // 6px - Slightly more than minimal\n item: 'gap-2', // 8px - Between list items\n group: 'gap-3', // 12px - Between related elements\n tight: 'gap-4', // 16px - Tight grid/content spacing\n content: 'gap-4', // 16px - Default content spacing\n card: 'gap-5', // 20px - Card internal spacing\n standard: 'gap-6', // 24px - Standard grid spacing\n section: 'gap-6', // 24px - Between sections\n spacious: 'gap-8', // 32px - Spacious grid items\n layout: 'gap-8', // 32px - Major layout divisions\n page: 'gap-12', // 48px - Page-level spacing\n },\n // Numeric scale (Tailwind spacing)\n numeric: {\n '0': 'gap-0',\n '1': 'gap-1',\n '1.5': 'gap-1.5',\n '2': 'gap-2',\n '3': 'gap-3',\n '4': 'gap-4',\n '6': 'gap-6',\n '8': 'gap-8',\n '12': 'gap-12',\n '16': 'gap-16',\n },\n /**\n * @deprecated Redundant duplicate of the `numeric`/`semantic` axes.\n * Migrate each member to its `semantic` equivalent (or `numeric` escape\n * hatch): `none`→`numeric['0']`, `xs`→`semantic.minimal`,\n * `sm`→`semantic.item`, `md`→`semantic.content`, `lg`→`semantic.section`,\n * `xl`→`semantic.layout`. Kept working via `gapMap` for now; removed in the\n * next minor.\n */\n legacy: {\n none: 'gap-0',\n xs: 'gap-1', // Use 'minimal' instead\n sm: 'gap-2', // Use 'item' instead\n md: 'gap-4', // Use 'content' instead\n lg: 'gap-6', // Use 'section' instead\n xl: 'gap-8', // Use 'layout' instead\n },\n /**\n * @deprecated Redundant duplicate of the `semantic` axis. The `grid-`\n * prefix carries no distinct value — `grid-tight`→`semantic.content`\n * (gap-4), `grid-standard`→`semantic.standard` (gap-6),\n * `grid-spacious`→`semantic.spacious` (gap-8). Kept working via `gapMap`\n * for now; removed in the next minor.\n */\n grid: {\n 'grid-tight': 'gap-4', // 16px - Tight grid items\n 'grid-standard': 'gap-6', // 24px - Standard grid items\n 'grid-spacious': 'gap-8', // 32px - Spacious grid items\n },\n};\n/** Combined gap map for component use */\nexport const gapMap = {\n ...gapScale.numeric,\n ...gapScale.legacy,\n ...gapScale.semantic,\n ...gapScale.grid,\n};\n/**\n * Align scale for flex layouts (items-*)\n */\nexport const alignScale = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n/**\n * Justify scale for flex layouts (justify-*)\n */\nexport const justifyScale = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { gapMap, type GapKey } from '../../tokens/spacing.js';\n\n /**\n * Grid - Responsive grid container with automatic column sizing\n *\n * Use Grid for laying out cards, stats, or any items in a responsive grid.\n * Automatically stacks on mobile and expands on larger screens.\n *\n * @example Numeric gap\n * <Grid cols=\"3\" gap=\"6\">\n * <StatsCard>Revenue</StatsCard>\n * <StatsCard>Users</StatsCard>\n * <StatsCard>Orders</StatsCard>\n * </Grid>\n *\n * @example Semantic gap (recommended)\n * <Grid cols=\"3\" gap=\"section\">\n * <Card>Card 1</Card>\n * <Card>Card 2</Card>\n * <Card>Card 3</Card>\n * </Grid>\n *\n * @example Auto-fit columns\n * <Grid cols=\"auto\" minWidth=\"300px\" gap=\"section\">\n * {#each items as item}\n * <Card>{item.name}</Card>\n * {/each}\n * </Grid>\n *\n * @example 12-column layout grid\n * <Grid cols=\"12\" gap=\"none\">\n * <div class=\"col-span-4\">Sidebar</div>\n * <div class=\"col-span-8\">Content</div>\n * </Grid>\n *\n * Semantic Gap Values (from tokens/spacing.ts):\n * - none: 0px - No gap (for 12-col layouts)\n * - xs: 4px (1) - Extra small gap\n * - sm: 8px (2) - Small gap\n * - tight: 16px (4) - Tight grid items (alias: md, content)\n * - standard: 24px (6) - Standard grid items (alias: lg, section)\n * - spacious: 32px (8) - Spacious grid items (alias: xl, layout)\n */\n\n interface Props {\n /** Number of columns or 'auto' for auto-fit */\n cols?: '1' | '2' | '3' | '4' | '5' | '6' | '12' | 'auto';\n /** Gap between grid items - semantic names or Tailwind spacing scale */\n gap?: GapKey;\n /** Minimum width for auto-fit columns (only used when cols='auto') */\n minWidth?: string;\n /** HTML element to render as */\n as?: 'div' | 'section' | 'ul';\n /** Additional CSS classes */\n class?: string;\n /** Child content */\n children?: Snippet;\n }\n\n let {\n cols = '3',\n gap = '4',\n minWidth = '280px',\n as = 'div',\n class: className = '',\n children\n }: Props = $props();\n\n // Responsive column mappings - stack on mobile, expand on larger screens\n const colsMap: Record<string, string> = {\n '1': 'grid-cols-1',\n '2': 'grid-cols-1 md:grid-cols-2',\n '3': 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n '4': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n '5': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5',\n '6': 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6',\n '12': 'grid-cols-12',\n 'auto': '' // Uses inline style\n };\n\n let gridStyle = $derived(\n cols === 'auto'\n ? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr));`\n : ''\n );\n\n let classes = $derived(\n [\n 'grid',\n cols !== 'auto' ? colsMap[cols] : '',\n gapMap[gap] || 'gap-4',\n className\n ].filter(Boolean).join(' ')\n );\n</script>\n\r\n<svelte:element this={as} class={classes} style={gridStyle || undefined}>\r\n {@render children?.()}\r\n</svelte:element>\r\n","<script lang=\"ts\">\r\n\tinterface Props {\r\n\t\tsrc: string;\r\n\t\talt: string;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { src, alt, labels = {}, }: Props = $props();\r\n</script>\r\n\r\n<div class=\"hero-container relative w-full overflow-hidden rounded-xl bg-surface-secondary\">\r\n\t<!-- @component-image-escape: scoped-CSS selector targets this img; aria-hidden not supported by SC Image -->\r\n\t<img\r\n\t\t{src}\r\n\t\talt=\"\"\r\n\t\tclass=\"hero-blur\"\r\n\t\tloading=\"eager\"\r\n\t\taria-hidden=\"true\"\r\n\t/>\r\n\t<!-- @component-image-escape: scoped-CSS selector targets this img -->\r\n\t<img\r\n\t\t{src}\r\n\t\t{alt}\r\n\t\tclass=\"hero-image\"\r\n\t\tloading=\"eager\"\r\n\t/>\r\n</div>\r\n\r\n<style>\r\n\t.hero-container {\r\n\t\tmax-height: 37.5rem;\r\n\t\tmin-height: 12rem;\r\n\t}\r\n\r\n\t/* Blurred zoomed copy as backdrop */\r\n\t.hero-blur {\r\n\t\tposition: absolute;\r\n\t\tinset: 0;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tobject-fit: cover;\r\n\t\ttransform: scale(1.15);\r\n\t\tfilter: blur(16px) saturate(1.2);\r\n\t}\r\n\r\n\t/* Main image on top, contained */\r\n\t.hero-image {\r\n\t\tposition: relative;\r\n\t\twidth: 100%;\r\n\t\tobject-fit: contain;\r\n\t\tmax-height: 37.5rem;\r\n\t\tmin-height: 12rem;\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Calendar, Location, Share, Theater, Time, User } from 'carbon-icons-svelte';\r\n\timport { Heading, Button } from '@getmicdrop/svelte-components';\r\n\timport { toast } from '@getmicdrop/svelte-components/toast';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport type { EventData, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tformatFullDateCompact,\r\n\t\tformatEventTime,\r\n\t\tformatTimeRange,\r\n\t\tformatDoorsTime,\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\thideDateTime?: boolean;\r\n\t\thideVenue?: boolean;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, hideDateTime = false, hideVenue = false, labels = {}, }: Props = $props();\r\n\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(event.totalTicketsRemaining, event.totalTicketsCapacity)\r\n\t);\r\n\tlet scarcityText = $derived(\r\n\t\tgetScarcityText(scarcityLevel, event.totalTicketsRemaining, 'event')\r\n\t);\r\n\r\n\tlet ageText = $derived((() => {\r\n\t\tif (!event.displayAgeRestriction) return null;\r\n\t\tif (event.ageRestriction && event.ageRestriction > 0) {\r\n\t\t\treturn `Ages ${event.ageRestriction}+`;\r\n\t\t}\r\n\t\treturn 'All ages';\r\n\t})());\r\n\r\n\tasync function shareEvent() {\r\n\t\tconst url = typeof window !== 'undefined'\r\n\t\t\t? `${window.location.origin}/e/${event.id}-${event.slug}`\r\n\t\t\t: '#';\r\n\t\tconst shareData = { url };\r\n\r\n\t\tif (navigator.share) {\r\n\t\t\ttry {\r\n\t\t\t\tawait navigator.share(shareData);\r\n\t\t\t} catch (err: unknown) {\r\n\t\t\t\tif (err instanceof Error && err.name !== 'AbortError') {\r\n\t\t\t\t\tfallbackShare(url);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfallbackShare(url);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction fallbackShare(url: string) {\r\n\t\tnavigator.clipboard.writeText(url).then(() => {\r\n\t\t\ttoast.success('Link copied to clipboard!');\r\n\t\t}).catch(() => {\r\n\t\t\t// duration: Infinity keeps the URL visible so users can still copy\r\n\t\t\t// it manually after clipboard API failure (Codex review of #103)\r\n\t\t\ttoast.error('Could not copy link — select the URL below to copy', {\r\n\t\t\t\tdescription: url,\r\n\t\t\t\tduration: Infinity,\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n</script>\r\n\r\n<div class=\"flex flex-col gap-4\">\r\n\t<div class=\"flex items-start gap-3 flex-wrap\">\r\n\t\t<Heading level={1} size=\"xl\" weight=\"bold\" class=\"sm:text-2xl leading-tight\">\r\n\t\t\t{event.title}\r\n\t\t</Heading>\r\n\t\t{#if scarcityText && event.status === 'on_sale'}\r\n\t\t\t<ScarcityBadge\r\n\t\t\t\tremaining={event.totalTicketsRemaining}\r\n\t\t\t\ttotal={event.totalTicketsCapacity}\r\n\t\t\t\tcontext=\"event\"\r\n\t\t\t/>\r\n\t\t{/if}\r\n\t</div>\r\n\r\n\t<!-- Share -->\r\n\t<Button variant=\"ghost\" size=\"xs\" class=\"self-start\" onclick={shareEvent}>\r\n\t\t<Share size={16} class=\"shrink-0\" />\r\n\t\tShare\r\n\t</Button>\r\n\r\n\t{#if !hideDateTime}\r\n\t\t<!-- Date -->\r\n\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t<Calendar size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t<span class=\"body-md font-medium\">{formatFullDateCompact(event.startDateTime, event.timezone)}</span>\r\n\t\t</div>\r\n\r\n\t\t<!-- Time + doors -->\r\n\t\t{#if event.displayStartTime !== false}\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<Time size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<div class=\"flex flex-col gap-0.5\">\r\n\t\t\t\t\t{#if event.displayEndTime !== false}\r\n\t\t\t\t\t\t<span class=\"body-md font-medium\">{formatTimeRange(event.startDateTime, event.endDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t<span class=\"body-md font-medium\">{formatEventTime(event.startDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{#if event.displayDoorsTime !== false && event.doorsOpenTime}\r\n\t\t\t\t\t\t<span class=\"caption\">Doors open {formatDoorsTime(event.doorsOpenTime, event.timezone)}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t{:else if event.displayDoorsTime !== false && event.doorsOpenTime}\r\n\t\t\t<!-- No start/end time, but doors time is shown -->\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<Time size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<span class=\"body-md font-medium\">Doors open {formatDoorsTime(event.doorsOpenTime, event.timezone)}</span>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t{/if}\r\n\r\n\t{#if !hideVenue}\r\n\t\t<!-- Venue + address -->\r\n\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t<Location size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t<div class=\"flex flex-col gap-0.5\">\r\n\t\t\t\t<span class=\"body-md font-medium\">{event.venue.name}</span>\r\n\t\t\t\t{#if event.venue.address}\r\n\t\t\t\t\t<span class=\"caption\">{event.venue.address}</span>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<!-- Stage name -->\r\n\t\t{#if event.stageName}\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<Theater size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<span class=\"body-md font-medium\">{event.stageName}</span>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Age restriction -->\r\n\t\t{#if ageText}\r\n\t\t\t<div class=\"flex items-start gap-3\">\r\n\t\t\t\t<User size={16} class=\"shrink-0 mt-0.5 icon-muted\" />\r\n\t\t\t\t<span class=\"body-md font-medium\">{ageText}</span>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t{/if}\r\n</div>","/**\r\n * Haptic feedback helper.\r\n *\r\n * One call site for `navigator.vibrate` so consumers don't repeat the\r\n * SSR + capability check. Android browsers vibrate; iOS Safari silently\r\n * no-ops (Apple deliberate — they reserve haptics for native apps via\r\n * the Taptic Engine, no web API exposed). Future-proof: if Apple ever\r\n * ships a web haptic API, swap the impl here and every consumer gets it.\r\n *\r\n * Styles:\r\n * - 'light' (8ms) — UI tick on small interactions (ticket +/-, tap)\r\n * - 'medium' (18ms) — committed state change (drawer snap, month flip)\r\n * - 'heavy' (32ms) — destructive / important confirmations\r\n */\r\nexport function tick(style: 'light' | 'medium' | 'heavy' = 'light'): void {\r\n\tif (typeof window === 'undefined') return;\r\n\tif (typeof navigator === 'undefined' || !navigator.vibrate) return;\r\n\tconst ms = style === 'light' ? 8 : style === 'medium' ? 18 : 32;\r\n\tnavigator.vibrate(ms);\r\n}\r\n","<script lang=\"ts\">\r\n\timport { Add, Subtract } from 'carbon-icons-svelte';\r\n\timport { Badge, Button, Heading, Input, Text, asTicketId, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { TicketId, USD } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport { tick } from '$lib/utils/haptic';\r\n\timport type { TicketTypeData, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText,\r\n\t\tformatSmartSalesDate,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tticket: TicketTypeData;\r\n\t\tquantity: number;\r\n\t\tonQuantityChange: (ticketId: TicketId, quantity: number) => void;\r\n\t\tdonationAmount?: string;\r\n\t\tonDonationChange?: (ticketId: TicketId, amount: string) => void;\r\n\t\tisRevealedByPromo?: boolean;\r\n\t\tisDiscountedByPromo?: boolean;\r\n\t\tdiscountedPrice?: number | null;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tticket,\r\n\t\tquantity,\r\n\t\tonQuantityChange,\r\n\t\tdonationAmount = '',\r\n\t\tonDonationChange,\r\n\t\tisRevealedByPromo = false,\r\n\t\tisDiscountedByPromo = false,\r\n\t\tdiscountedPrice = null,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\t// --- State detection ---\r\n\tlet isDonation = $derived(ticket.isDonation || ticket.ticketType === 2);\r\n\tlet isSoldOut = $derived(ticket.status === 'sold_out' || ticket.quantityAvailable === 0);\r\n\tlet isComingSoon = $derived(ticket.status === 'coming_soon');\r\n\tlet isSalesEnded = $derived(ticket.status === 'sales_ended');\r\n\tlet isDisabled = $derived(isSoldOut || isComingSoon || isSalesEnded);\r\n\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(ticket.quantityAvailable, ticket.quantityTotal)\r\n\t);\r\n\tlet scarcityText = $derived(getScarcityText(scarcityLevel, ticket.quantityAvailable, 'ticket'));\r\n\r\n\t// Donation validation\r\n\tlet donationValue = $derived(parseFloat(donationAmount) || 0);\r\n\tlet donationError = $derived(\r\n\t\tisDonation && donationAmount !== '' && donationValue < 1 ? 'Minimum $1.00' : ''\r\n\t);\r\n\tlet isDonationValid = $derived(!isDonation || (donationAmount !== '' && donationValue >= 1));\r\n\r\n\tlet canDecrement = $derived(quantity > 0);\r\n\tlet canIncrement = $derived(\r\n\t\t!isDisabled &&\r\n\t\tquantity < ticket.maxPerOrder &&\r\n\t\tquantity < ticket.quantityAvailable &&\r\n\t\tisDonationValid\r\n\t);\r\n\r\n\tfunction decrement() {\r\n\t\tif (canDecrement) {\r\n\t\t\t// If decrementing would go below minimum, jump to 0 (remove from cart)\r\n\t\t\tconst newQty = quantity - 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty < ticket.minPerOrder ? 0 : newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction increment() {\r\n\t\tif (canIncrement) {\r\n\t\t\t// If at 0, jump to minimum purchase quantity\r\n\t\t\tconst newQty = quantity === 0 ? ticket.minPerOrder : quantity + 1;\r\n\t\t\tonQuantityChange(asTicketId(ticket.id), newQty);\r\n\t\t\ttick('light');\r\n\t\t}\r\n\t}\r\n\r\n\tlet donationInputValue = $state(donationAmount);\r\n\r\n\t// Sync external donationAmount prop to local state\r\n\t$effect(() => {\r\n\t\tdonationInputValue = donationAmount;\r\n\t});\r\n\r\n\t// Push local changes upstream\r\n\tfunction syncDonation() {\r\n\t\tif (donationInputValue !== donationAmount) {\r\n\t\t\t// eslint-disable-next-line micdrop/boundary-only-as-cast -- API response mapper: ticket.id arrives as raw number from server\r\n\t\tonDonationChange?.(asTicketId(ticket.id), donationInputValue);\r\n\t\t}\r\n\t}\r\n\r\n\t// Price display — show total inclusive of fees (matching production TicketBlock.svelte)\r\n\tlet totalPrice = $derived(isDonation ? 0 : ticket.price + (ticket.price === 0 ? 0 : ticket.fee));\r\n\tlet priceDisplay = $derived(\r\n\t\tisDonation ? '' : ticket.price === 0 ? (labels.free || 'Free') : `{formatCurrency(totalPrice as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}`\r\n\t);\r\n\tlet feeCaption = $derived(\r\n\t\t!isDonation && ticket.fee > 0 && ticket.price > 0 ? `incl. {formatCurrency(ticket.fee as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)} ${labels.fee || 'fee'}` : ''\r\n\t);\r\n\r\n\t// Sales start display for coming soon tickets\r\n\tlet salesStartDisplay = $derived(\r\n\t\tisComingSoon && ticket.salesStartDate\r\n\t\t\t? `Sales start ${formatSmartSalesDate(ticket.salesStartDate)}`\r\n\t\t\t: isComingSoon\r\n\t\t\t\t? 'Coming soon'\r\n\t\t\t\t: ''\r\n\t);\r\n</script>\r\n\r\n<article\r\n\tclass=\"ticket-card rounded-lg border p-4 transition-all\"\r\n\tclass:disabled-ticket={isDisabled}\r\n\tclass:revealed={isRevealedByPromo && !isDisabled}\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t<div class=\"vc-flex-between-start gap-4\">\r\n\t\t<!-- Ticket info -->\r\n\t\t<div class=\"flex-1 min-w-0\">\r\n\t\t\t<div class=\"flex-row-2 flex-wrap\">\r\n\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\">\r\n\t\t\t\t\t{ticket.name}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{#if isSoldOut}\r\n\t\t\t\t\t<Badge variant=\"error\">{labels.soldOut || 'Sold out'}</Badge>\r\n\t\t\t\t{:else if isSalesEnded}\r\n\t\t\t\t\t<Badge variant=\"neutral\">Sales ended</Badge>\r\n\t\t\t\t{:else if isRevealedByPromo}\r\n\t\t\t\t\t<Badge variant=\"success\">Unlocked</Badge>\r\n\t\t\t\t{:else if isDiscountedByPromo}\r\n\t\t\t\t\t<Badge variant=\"green\">Discount applied</Badge>\r\n\t\t\t\t{:else if scarcityText && !isComingSoon}\r\n\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\tremaining={ticket.quantityAvailable}\r\n\t\t\t\t\t\ttotal={ticket.quantityTotal}\r\n\t\t\t\t\t\tcontext=\"ticket\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t{#if ticket.description}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1 line-clamp-2\">\r\n\t\t\t\t\t{ticket.description}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Price row -->\r\n\t\t\t<div class=\"flex-row-2 mt-2\">\r\n\t\t\t\t{#if isDonation}\r\n\t\t\t\t\t<!-- Donation: $ input -->\r\n\t\t\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t\t\t<div class=\"donation-input-wrapper\" oninput={syncDonation}>\r\n\t\t\t\t\t\t<Input\r\n\t\t\t\t\t\t\tlabel=\"Donation amount\"\r\n\t\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\tplaceholder=\"0.00\"\r\n\t\t\t\t\t\t\tbind:value={donationInputValue}\r\n\t\t\t\t\t\t\tdisabled={isDisabled}\r\n\t\t\t\t\t\t\terrorText={donationError}\r\n\t\t\t\t\t\t\tcolor={donationError ? 'red' : 'base'}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{:else if isDiscountedByPromo && discountedPrice !== null}\r\n\t\t\t\t\t<!-- Discounted: strikethrough original total + discounted total (both inclusive of fee) -->\r\n\t\t\t\t\t{@const discountedTotal = discountedPrice + (discountedPrice === 0 ? 0 : ticket.fee)}\r\n\t\t\t\t\t<span class=\"price-strikethrough\">{formatCurrency(totalPrice as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t<span class=\"price-discounted\">{formatCurrency(discountedTotal as USD /* FIXME(canonical-cleanup:toFixed): this cast bypasses the brand boundary; replace with toCents/toUSD at the API-response-transform layer. */)}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{:else if isComingSoon}\r\n\t\t\t\t\t<!-- Coming soon: show price dimmed -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-muted\">{priceDisplay}</span>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<!-- Standard price -->\r\n\t\t\t\t\t<span class=\"price-lg text-color-primary\">{priceDisplay}</span>\r\n\t\t\t\t\t{#if feeCaption}\r\n\t\t\t\t\t\t<span class=\"price-fee\">{feeCaption}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Coming soon / sales ended message -->\r\n\t\t\t{#if salesStartDisplay}\r\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1.5\">\r\n\t\t\t\t\t{salesStartDisplay}\r\n\t\t\t\t</Text>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\r\n\t\t<!-- Quantity controls -->\r\n\t\t<div class=\"flex items-center quantity-selector\">\r\n\t\t\t{#if isSoldOut || isComingSoon || isSalesEnded}\r\n\t\t\t\t<!-- No controls for coming soon / sales ended -->\r\n\t\t\t{:else}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={decrement}\r\n\t\t\t\t\tdisabled={!canDecrement}\r\n\t\t\t\t\taria-label=\"{labels.decrease || 'Decrease'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Subtract size={16} />\r\n\t\t\t\t</Button>\r\n\r\n\t\t\t\t<span\r\n\t\t\t\t\tclass=\"qty-display\"\r\n\t\t\t\t\taria-live=\"polite\"\r\n\t\t\t\t\taria-label=\"{ticket.name} {labels.quantity || 'quantity'}: {quantity}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{quantity}\r\n\t\t\t\t</span>\r\n\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize=\"icon-lg\"\r\n\t\t\t\t\tonclick={increment}\r\n\t\t\t\t\tdisabled={!canIncrement}\r\n\t\t\t\t\taria-label=\"{labels.increase || 'Increase'} {ticket.name} {labels.quantity || 'quantity'}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Add size={16} />\r\n\t\t\t\t</Button>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* Card states using HSL CSS variables (matching TicketBlock.svelte) */\r\n\t.ticket-card {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 220 13% 91%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 0 0% 100%)));\r\n\t}\r\n\r\n\t.ticket-card.revealed {\r\n\t\tborder-color: hsl(var(--accent-success) / 50%);\r\n\t\tbackground-color: hsl(var(--accent-success) / 8%);\r\n\t}\r\n\r\n\t.ticket-card.disabled-ticket {\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t/* Quantity selector */\r\n\t.quantity-selector {\r\n\t\tgap: 0.5rem;\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t.qty-display {\r\n\t\tmin-width: 2rem;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 1.125rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--text-primary, 222 47% 11%));\r\n\t\tuser-select: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t/* Discounted price green text */\r\n\t.price-discounted {\r\n\t\tfont-size: 0.875rem;\r\n\t\tline-height: 1.25rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t/* Donation input wrapper */\r\n\t.donation-input-wrapper {\r\n\t\tmin-width: 10rem;\r\n\t}\r\n\r\n .ticket-card {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--stroke-secondary, 215 19% 35%));\r\n\t\tbackground-color: hsl(var(--ts-card-bg, var(--bg-primary, 222 47% 11%)));\r\n\t }\r\n }\r\n\r\n .ticket-card.revealed {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--accent-success)); /* green-700 */\r\n\t\tbackground-color: hsl(var(--accent-success));\r\n\t }\r\n }\r\n\r\n .qty-display {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tcolor: hsl(var(--text-primary, 0 0% 100%));\r\n\t }\r\n }\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Calendar } from 'carbon-icons-svelte';\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport { Badge, Button, Card, Heading, Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n\timport type { EventData, OrderTotals, CtaConfig, ScarcityLevel } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tgetCtaConfig,\r\n\t\tgetPriceDisplay,\r\n\t\tgetScarcityLevel,\r\n\t\tgetScarcityText,\r\n\t\tformatBrowseDate,\r\n\t\tformatEventTime,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\timport OrderSummary from './OrderSummary.svelte';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\torderTotals: OrderTotals;\r\n\t\thasSelectedTickets: boolean;\r\n\t\tonCheckout: () => void;\r\n\t\tpromoApplied?: boolean;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, orderTotals, hasSelectedTickets, onCheckout, promoApplied = false, labels = {}, }: Props = $props();\r\n\r\n\tlet ctaConfig: CtaConfig = $derived(getCtaConfig(event));\r\n\tlet priceDisplay = $derived(getPriceDisplay(event));\r\n\tlet scarcityLevel: ScarcityLevel = $derived(\r\n\t\tgetScarcityLevel(event.totalTicketsRemaining, event.totalTicketsCapacity)\r\n\t);\r\n\tlet scarcityText = $derived(\r\n\t\tgetScarcityText(scarcityLevel, event.totalTicketsRemaining, 'event')\r\n\t);\r\n\tlet isFreeEvent = $derived(\r\n\t\tevent.tickets.filter((t) => t.status === 'on_sale' && !t.isHidden).every((t) => t.price === 0)\r\n\t);\r\n\r\n\tfunction scrollToTickets() {\r\n\t\tif (typeof document === 'undefined') return;\r\n\t\tconst section = document.getElementById('ticket-section');\r\n\t\tif (section) {\r\n\t\t\tsection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<!--\r\n\tBookingWidget: Airbnb-style sticky sidebar card.\r\n\tTransitions from \"informational\" to \"cart\" mode with no skeleton placeholders.\r\n\tPassword protection is handled at the widget/browse level, not on the event page.\r\n-->\r\n{#if event.status === 'on_sale' && hasSelectedTickets}\r\n\t<!--\r\n\t\tFILLED STATE: cap the card to the viewport so a long order summary\r\n\t\tcan't push the Checkout button below the fold. Only the ticket-line\r\n\t\tlist scrolls; the totals block and Checkout button stay pinned, so\r\n\t\tthe buyer always sees Subtotal / Fees / Tax / Total and what they're\r\n\t\tabout to click.\r\n\t-->\r\n\t<Card border padding={false} class=\"flex flex-col max-h-[calc(100vh-1.5rem)] rounded-xl shadow-lg overflow-hidden bg-surface-secondary\">\r\n\t\t<div\r\n\t\t\tclass=\"flex flex-col flex-1 min-h-0\"\r\n\t\t\tstyle=\"animation: widgetFadeIn {DURATION.normal}ms ease-out;\"\r\n\t\t>\r\n\t\t\t<!-- Scrollable: ticket-line items only -->\r\n\t\t\t<div class=\"p-5 pb-3 flex-1 overflow-y-auto min-h-0\">\r\n\t\t\t\t<OrderSummary {orderTotals} mode=\"lines\" {labels} />\r\n\t\t\t</div>\r\n\t\t\t<!-- Pinned: totals + Checkout button -->\r\n\t\t\t<div class=\"px-5 pt-3 pb-5 shrink-0 border-t border-default space-y-3\">\r\n\t\t\t\t<OrderSummary {orderTotals} mode=\"totals\" {labels} />\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tonclick={onCheckout}\r\n\t\t\t\t>\r\n\t\t\t\t\t{#if isFreeEvent}\r\n\t\t\t\t\t\t{event.isRegistrationEvent ? (labels.reserveASpot || 'Reserve a spot') : (labels.getTickets || 'Get tickets')} · Free\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t{labels.checkout || 'Checkout'} · {formatCurrency(orderTotals.total as USD)}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</Card>\r\n{:else}\r\n<Card border padding={false} class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\">\r\n\t<div class=\"p-5\">\r\n\t\t{#if event.status === 'on_sale' && !ctaConfig.disabled}\r\n\t\t\t<!-- ON SALE: informational empty state (filled state handled in the sibling branch above) -->\r\n\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t<!-- Price display -->\r\n\t\t\t\t<div class=\"flex items-baseline gap-2\">\r\n\t\t\t\t\t{#if priceDisplay}\r\n\t\t\t\t\t\t<span class=\"price-lg text-color-primary text-xl\">\r\n\t\t\t\t\t\t\t{priceDisplay}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t{:else if isFreeEvent}\r\n\t\t\t\t\t\t<span class=\"price-lg text-color-primary text-xl\">\r\n\t\t\t\t\t\t\tFree\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Event date/time summary (compact) -->\r\n\t\t\t\t<div class=\"flex items-center gap-2\">\r\n\t\t\t\t\t<Calendar size={16} class=\"shrink-0 icon-muted\" />\r\n\t\t\t\t\t{#if event.displayStartTime !== false}\r\n\t\t\t\t\t\t<span class=\"body-sm\">{formatBrowseDate(event.startDateTime, event.timezone)} · {formatEventTime(event.startDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t<span class=\"body-sm\">{formatBrowseDate(event.startDateTime, event.timezone)}</span>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- Scarcity badge -->\r\n\t\t\t\t{#if scarcityText}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\t\tremaining={event.totalTicketsRemaining}\r\n\t\t\t\t\t\t\ttotal={event.totalTicketsCapacity}\r\n\t\t\t\t\t\t\tcontext=\"event\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{/if}\r\n\r\n\t\t\t\t<!-- Promo applied badge -->\r\n\t\t\t\t{#if promoApplied}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<Badge variant=\"success\">{labels.promoApplied || 'Promo applied'}</Badge>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{/if}\r\n\r\n\t\t\t\t<!-- Divider -->\r\n\t\t\t\t<div class=\"divider\"></div>\r\n\r\n\t\t\t\t<!-- CTA: scroll to ticket section. Label + disabled state come from\r\n\t\t\t\t ctaConfig so this widget agrees with MobileCta in all states\r\n\t\t\t\t (incl. on_sale events whose startDateTime is in the past). -->\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tonclick={scrollToTickets}\r\n\t\t\t\t>\r\n\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{:else}\r\n\t\t\t<!-- DISABLED STATES: cancelled, past, sales_ended, coming_soon, sold_out,\r\n\t\t\t plus on_sale events that ctaConfig has computed as disabled\r\n\t\t\t (e.g. all tickets soldOut, sales window closed). One branch,\r\n\t\t\t one source of truth — ctaConfig.text / .disabled / .reason. -->\r\n\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t<Heading weight=\"semibold\">\r\n\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{#if ctaConfig.reason}\r\n\t\t\t\t\t<Text size=\"sm\" color=\"secondary\" class=\"block\">\r\n\t\t\t\t\t\t{ctaConfig.reason}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{/if}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tdisabled={true}\r\n\t\t\t\t>\r\n\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t</div>\r\n</Card>\r\n{/if}\r\n\r\n<style>\r\n\t@keyframes widgetFadeIn {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t * The filled-state card uses max-h-[calc(100vh-1.5rem)] inline (see Card\r\n\t * class above) to cap height to the viewport so the Checkout button\r\n\t * never falls below the fold when many ticket types are selected.\r\n\t * 1.5rem reserves a bottom gap; sticky parent is top-0 so no top offset.\r\n\t */\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Section, Text } from '@getmicdrop/svelte-components';\r\n\r\n\tinterface Props {\r\n\t\tdescription: string;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { description, labels = {}, }: Props = $props();\r\n\r\n\tlet paragraphs = $derived(\r\n\t\tdescription.split('\\n\\n').filter((p) => p.trim().length > 0)\r\n\t);\r\n</script>\r\n\r\n<Section title=\"About\" titleSize=\"lg\" gap=\"3\">\r\n\t<div class=\"space-y-4\">\r\n\t\t{#each paragraphs as paragraph}\r\n\t\t\t<Text size=\"sm\" color=\"secondary\" leading=\"relaxed\" class=\"block\">\r\n\t\t\t\t{paragraph}\r\n\t\t\t</Text>\r\n\t\t{/each}\r\n\t</div>\r\n</Section>\r\n","<script lang=\"ts\">\r\n\timport { Avatar, Card, Heading, Section } from '@getmicdrop/svelte-components';\r\n\timport type { PerformerData } from '$lib/public-calendar-flow/types';\r\n\r\n\tinterface Props {\r\n\t\tperformers: PerformerData[];\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { performers, labels = {}, }: Props = $props();\r\n</script>\r\n\r\n{#if performers.length > 0}\r\n\t<Section title=\"Performers\" titleSize=\"lg\" gap=\"4\">\r\n\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\r\n\t\t\t{#each performers as performer (performer.id)}\r\n\t\t\t\t<Card padding={false} class=\"flex items-center gap-3 p-3 bg-surface-secondary shadow-none\">\r\n\t\t\t\t\t<Avatar\r\n\t\t\t\t\t\tsrc={performer.profileImage || ''}\r\n\t\t\t\t\t\talt={performer.displayName}\r\n\t\t\t\t\t\tinitials={performer.displayName.charAt(0)}\r\n\t\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\t\tclass=\"shrink-0 rounded-lg\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<div class=\"min-w-0\">\r\n\t\t\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\" class=\"truncate\">\r\n\t\t\t\t\t\t\t{performer.displayName}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</Card>\r\n\t\t\t{/each}\r\n\t\t</div>\r\n\t</Section>\r\n{/if}\r\n\r\n","<script lang=\"ts\">\r\n\timport { Accordion, AccordionItem, Section } from '@getmicdrop/svelte-components';\r\n\timport type { FAQItem } from '$lib/public-calendar-flow/types';\r\n\r\n\tinterface Props {\r\n\t\tfaqs: FAQItem[];\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { faqs, labels = {}, }: Props = $props();\r\n</script>\r\n\r\n{#if faqs.length > 0}\r\n\t<Section title=\"Frequently asked questions\" titleSize=\"lg\" gap=\"3\">\r\n\t\t<Accordion flush variant=\"ghost\">\r\n\t\t\t{#each faqs as faq (faq.question)}\r\n\t\t\t\t<AccordionItem>\r\n\t\t\t\t\t{#snippet header()}{faq.question}{/snippet}\r\n\t\t\t\t\t{faq.answer}\r\n\t\t\t\t</AccordionItem>\r\n\t\t\t{/each}\r\n\t\t</Accordion>\r\n\t</Section>\r\n{/if}\r\n","<script lang=\"ts\">\r\n\timport { Button, Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport type { EventData, OrderTotals, CtaConfig } from '$lib/public-calendar-flow/types';\r\n\timport { getCtaConfig, getPriceDisplay } from '$lib/public-calendar-flow/defaults';\r\n\timport OrderSummary from './OrderSummary.svelte';\r\n\timport { tick } from '$lib/utils/haptic';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\torderTotals: OrderTotals;\r\n\t\thasSelectedTickets: boolean;\r\n\t\tonCheckout: () => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, orderTotals, hasSelectedTickets, onCheckout, labels = {} }: Props = $props();\r\n\r\n\tlet ctaConfig: CtaConfig = $derived(getCtaConfig(event));\r\n\tlet priceDisplay = $derived(getPriceDisplay(event));\r\n\tlet totalTicketCount = $derived(\r\n\t\torderTotals.lines.reduce((sum, l) => sum + l.quantity, 0)\r\n\t);\r\n\tlet isFreeEvent = $derived(\r\n\t\tevent.tickets.filter((t) => t.status === 'on_sale' && !t.isHidden).every((t) => t.price === 0)\r\n\t);\r\n\r\n\t// State machine: 'peek' = collapsed bar, 'open' = full drawer. ONE\r\n\t// physical element resizes between the two — no second flyout.\r\n\tlet mode = $state<'peek' | 'open'>('peek');\r\n\r\n\t// Fire a medium-strength haptic tick on every snap transition. Android\r\n\t// users feel it; iOS silently no-ops. Skip the first effect run so we\r\n\t// don't pulse on mount.\r\n\tlet prevModeForHaptic: 'peek' | 'open' | null = $state(null);\r\n\t$effect(() => {\r\n\t\tif (prevModeForHaptic !== null && prevModeForHaptic !== mode) {\r\n\t\t\ttick('medium');\r\n\t\t}\r\n\t\tprevModeForHaptic = mode;\r\n\t});\r\n\r\n\t// Defensive: if tickets get removed while the drawer is open, snap\r\n\t// closed. Otherwise the sheet stays at stale openHeight with no body\r\n\t// to render, showing a white block over the page.\r\n\t$effect(() => {\r\n\t\tif (!hasSelectedTickets) mode = 'peek';\r\n\t});\r\n\r\n\tconst PEEK_H = 80;\r\n\tlet bodyEl = $state<HTMLDivElement | null>(null);\r\n\tlet viewportH = $state(800);\r\n\t$effect(() => {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst sync = () => (viewportH = window.innerHeight);\r\n\t\tsync();\r\n\t\twindow.addEventListener('resize', sync, { passive: true });\r\n\t\treturn () => window.removeEventListener('resize', sync);\r\n\t});\r\n\r\n\t// Measure intrinsic content height — drawer snaps to fit-content, no whitespace.\r\n\tlet openHeight = $state(0);\r\n\t$effect(() => {\r\n\t\tif (!bodyEl || typeof ResizeObserver === 'undefined') return;\r\n\t\tfunction measure() {\r\n\t\t\tif (!bodyEl) return;\r\n\t\t\t// bodyEl has flex:1 1 auto so its scrollHeight equals its stretched\r\n\t\t\t// box height (= what we're trying to compute). Feedback loop. Use\r\n\t\t\t// firstElementChild's offsetHeight — OrderSummary's intrinsic size.\r\n\t\t\tconst inner = bodyEl.firstElementChild as HTMLElement | null;\r\n\t\t\tconst innerH = inner?.offsetHeight ?? 0;\r\n\t\t\tconst total = PEEK_H + innerH + 76 + 8;\r\n\t\t\topenHeight = Math.min(total, Math.round(viewportH * 0.9));\r\n\t\t}\r\n\t\tmeasure();\r\n\t\tconst ro = new ResizeObserver(measure);\r\n\t\tconst inner = bodyEl.firstElementChild as HTMLElement | null;\r\n\t\tif (inner) ro.observe(inner);\r\n\t\treturn () => ro.disconnect();\r\n\t});\r\n\r\n\tfunction scrollToTickets() {\r\n\t\tif (typeof document === 'undefined') return;\r\n\t\tconst sections = document.querySelectorAll<HTMLElement>('#ticket-section');\r\n\t\tfor (const section of sections) {\r\n\t\t\tif (section.offsetParent !== null) {\r\n\t\t\t\tsection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handleBarClick() {\r\n\t\tif (ctaConfig.disabled) return;\r\n\t\tif (!hasSelectedTickets) {\r\n\t\t\tscrollToTickets();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// Toggle: peek → open, open → peek. Tapping the grab area / bar at\r\n\t\t// either state moves to the other state.\r\n\t\tmode = mode === 'peek' ? 'open' : 'peek';\r\n\t}\r\n\r\n\tfunction handleDrawerCheckout() {\r\n\t\tmode = 'peek';\r\n\t\tonCheckout();\r\n\t}\r\n\r\n\tfunction closeDrawer() {\r\n\t\tmode = 'peek';\r\n\t}\r\n\r\n\tfunction ticketsLabel(n: number): string {\r\n\t\treturn n === 1 ? (labels.ticket || 'ticket') : (labels.tickets || 'tickets');\r\n\t}\r\n\r\n\t// === Drag mechanics — vaul-inspired =====================================\r\n\t//\r\n\t// Pointer Events instead of touch-only (mouse + touch + stylus, one path).\r\n\t// Track positions over a short rolling window to compute velocity for\r\n\t// \"flick\" detection. Resistance (rubber-band) beyond bounds. Body\r\n\t// scroll-vs-drag arbitration: at body scrollTop>0, drag is just body\r\n\t// scroll; only when at top do downward drags close the drawer.\r\n\tlet dragStartY = 0;\r\n\tlet dragStartHeight = 0;\r\n\tlet dragDeltaY = $state(0);\r\n\tlet isDragging = $state(false);\r\n\tlet pointerId = $state<number | null>(null);\r\n\tlet dragTarget = $state<HTMLElement | null>(null);\r\n\r\n\t// Rolling history for velocity: [{y, t}, ...]. Keep last ~5 samples.\r\n\tlet history: { y: number; t: number }[] = [];\r\n\r\n\tfunction recordSample(y: number) {\r\n\t\tconst t = performance.now();\r\n\t\thistory.push({ y, t });\r\n\t\t// Keep ~120ms of history — enough to compute a stable velocity\r\n\t\t// without overweighting old samples.\r\n\t\twhile (history.length > 0 && t - history[0].t > 120) history.shift();\r\n\t}\r\n\r\n\tfunction computeVelocity(): number {\r\n\t\tif (history.length < 2) return 0;\r\n\t\tconst first = history[0];\r\n\t\tconst last = history[history.length - 1];\r\n\t\tconst dt = last.t - first.t;\r\n\t\tif (dt <= 0) return 0;\r\n\t\treturn (last.y - first.y) / dt; // px/ms — positive = downward\r\n\t}\r\n\r\n\tfunction handlePointerDown(e: PointerEvent) {\r\n\t\t// Drag is disabled entirely when there's nothing to expand to —\r\n\t\t// otherwise the user can pull the sheet up against undefined open\r\n\t\t// state and the layout breaks.\r\n\t\tif (!hasSelectedTickets) return;\r\n\t\t// Only primary pointer; don't capture if click landed on a button.\r\n\t\tif (e.button !== 0 && e.pointerType === 'mouse') return;\r\n\t\tconst t = e.target as HTMLElement | null;\r\n\t\tif (t?.closest('button, a, input, select, textarea, [role=\"button\"]')) return;\r\n\r\n\t\t// Body scroll arbitration: if user starts the drag inside the\r\n\t\t// drawer body AND the body is scrolled past 0, this gesture is\r\n\t\t// body-scroll, not drawer-drag. Let it pass through.\r\n\t\tconst body = bodyEl;\r\n\t\tif (mode === 'open' && body && body.contains(t) && body.scrollTop > 0) return;\r\n\r\n\t\tdragStartY = e.clientY;\r\n\t\tdragStartHeight = mode === 'open' ? openHeight : PEEK_H;\r\n\t\tdragDeltaY = 0;\r\n\t\thistory = [];\r\n\t\trecordSample(e.clientY);\r\n\t\tisDragging = true;\r\n\t\tpointerId = e.pointerId;\r\n\t\tdragTarget = e.currentTarget as HTMLElement;\r\n\t\tdragTarget.setPointerCapture(e.pointerId);\r\n\t}\r\n\r\n\tfunction handlePointerMove(e: PointerEvent) {\r\n\t\tif (!isDragging || e.pointerId !== pointerId) return;\r\n\t\tconst dy = e.clientY - dragStartY;\r\n\t\trecordSample(e.clientY);\r\n\t\t// Rubber-band with a HARD CAP so the sheet can never exceed a tiny\r\n\t\t// fraction past the bounds. Without the cap, even a small multiplier\r\n\t\t// lets enthusiastic drags reach absurd heights — which then \"slowly\r\n\t\t// retracts\" on release looks broken.\r\n\t\tconst RUBBER_RESISTANCE = 0.15;\r\n\t\tconst MAX_OVERSHOOT = 24;\r\n\t\tconst rawHeight = dragStartHeight - dy;\r\n\t\tlet finalHeight: number;\r\n\t\tif (rawHeight > openHeight) {\r\n\t\t\tconst overshoot = Math.min((rawHeight - openHeight) * RUBBER_RESISTANCE, MAX_OVERSHOOT);\r\n\t\t\tfinalHeight = openHeight + overshoot;\r\n\t\t} else if (rawHeight < PEEK_H) {\r\n\t\t\tconst overshoot = Math.min((PEEK_H - rawHeight) * RUBBER_RESISTANCE, MAX_OVERSHOOT);\r\n\t\t\tfinalHeight = PEEK_H - overshoot;\r\n\t\t} else {\r\n\t\t\tfinalHeight = rawHeight;\r\n\t\t}\r\n\t\tdragDeltaY = dragStartHeight - finalHeight;\r\n\t}\r\n\r\n\tfunction handlePointerUp(e: PointerEvent) {\r\n\t\tif (!isDragging || e.pointerId !== pointerId) return;\r\n\t\tconst v = computeVelocity(); // px/ms, downward positive\r\n\t\tconst dy = dragDeltaY;\r\n\r\n\t\t// Snap decision combines distance + velocity. Strong flick beats\r\n\t\t// distance threshold; slow drag needs to clear midpoint.\r\n\t\tconst FLICK_VELOCITY = 0.5; // px/ms — calibrated to typical \"flick\"\r\n\t\tconst POSITION_THRESHOLD = (openHeight - PEEK_H) / 2;\r\n\r\n\t\tif (mode === 'open') {\r\n\t\t\t// Started open. Snap closed if dragged down enough OR flicked down.\r\n\t\t\tif (dy > POSITION_THRESHOLD || v > FLICK_VELOCITY) {\r\n\t\t\t\tmode = 'peek';\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Started peek. Snap open if dragged up enough OR flicked up.\r\n\t\t\tconst upward = -dy;\r\n\t\t\tif (upward > 40 || v < -FLICK_VELOCITY) {\r\n\t\t\t\tmode = 'open';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisDragging = false;\r\n\t\tdragDeltaY = 0;\r\n\t\thistory = [];\r\n\t\tdragTarget?.releasePointerCapture(e.pointerId);\r\n\t\tdragTarget = null;\r\n\t\tpointerId = null;\r\n\t}\r\n\r\n\tfunction handlePointerCancel(e: PointerEvent) {\r\n\t\tisDragging = false;\r\n\t\tdragDeltaY = 0;\r\n\t\thistory = [];\r\n\t\tif (dragTarget && pointerId !== null) {\r\n\t\t\ttry {\r\n\t\t\t\tdragTarget.releasePointerCapture(pointerId);\r\n\t\t\t} catch {\r\n\t\t\t\t// pointer already released\r\n\t\t\t}\r\n\t\t}\r\n\t\tdragTarget = null;\r\n\t\tpointerId = null;\r\n\t}\r\n\r\n\t// Live sheet height: while dragging, follow the finger; on release,\r\n\t// snap to mode via CSS transition.\r\n\tlet liveHeight = $derived.by(() => {\r\n\t\tif (!hasSelectedTickets) return PEEK_H;\r\n\t\tif (isDragging) return Math.max(PEEK_H * 0.5, dragStartHeight - dragDeltaY);\r\n\t\treturn mode === 'open' ? openHeight : PEEK_H;\r\n\t});\r\n\r\n\t// Body reveal progress 0→1 as sheet grows peek→open. Used to fade the\r\n\t// order summary in during drag, not just on release.\r\n\tlet revealProgress = $derived.by(() => {\r\n\t\tconst range = Math.max(1, openHeight - PEEK_H);\r\n\t\treturn Math.min(1, Math.max(0, (liveHeight - PEEK_H) / range));\r\n\t});\r\n</script>\r\n\r\n<!-- Backdrop scrim. Tap-to-close. -->\r\n{#if hasSelectedTickets}\r\n\t<!-- svelte-ignore a11y_click_events_have_key_events -->\r\n\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t<div\r\n\t\tclass=\"md:hidden fixed inset-0 z-40 transition-all duration-300 ease-out\"\r\n\t\tclass:scrim-open={mode === 'open'}\r\n\t\tclass:scrim-closed={mode === 'peek'}\r\n\t\tonclick={closeDrawer}\r\n\t\taria-hidden={mode !== 'open'}\r\n\t></div>\r\n{/if}\r\n\r\n<!-- Unified sheet. -->\r\n<!-- @tokens-px-escape: `env(safe-area-inset-bottom, 0px)` fallback requires literal px per CSS spec; iOS safe-area can't be expressed as a token. -->\r\n<!-- @modal-escape: bespoke draggable bottom-sheet (pointer-drag peek/open gesture, live height) — SC Modal cannot express a drag-to-dismiss sheet -->\r\n<!-- svelte-ignore a11y_click_events_have_key_events -->\r\n<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n<div\r\n\tclass=\"peek-sheet md:hidden fixed bottom-0 left-0 right-0 z-50 bg-bg-primary\"\r\n\tclass:peek-sheet--dragging={isDragging}\r\n\tclass:peek-sheet--open={mode === 'open'}\r\n\tstyle:height=\"{liveHeight}px\"\r\n\tstyle=\"padding-bottom: env(safe-area-inset-bottom, 0px);\"\r\n\trole=\"dialog\"\r\n\ttabindex=\"-1\"\r\n\taria-modal={mode === 'open'}\r\n\taria-label={labels.orderSummary || 'Order summary'}\r\n\tonpointerdown={handlePointerDown}\r\n\tonpointermove={handlePointerMove}\r\n\tonpointerup={handlePointerUp}\r\n\tonpointercancel={handlePointerCancel}\r\n>\r\n\t<!-- Top region — tap-to-open + drag handle. Fixed PEEK_H tall so the\r\n\t content row's vertical position is identical regardless of whether\r\n\t the grab handle is present. Grab handle is absolute-positioned so\r\n\t it doesn't push the row down. -->\r\n\t<div\r\n\t\tclass=\"peek-sheet__top\"\r\n\t\tonclick={hasSelectedTickets ? handleBarClick : undefined}\r\n\t>\r\n\t\t{#if hasSelectedTickets}\r\n\t\t\t<div class=\"peek-sheet__grab\" aria-hidden=\"true\">\r\n\t\t\t\t<div class=\"peek-sheet__pill\"></div>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<div class=\"peek-sheet__row flex items-center justify-between gap-3 px-4\">\r\n\t\t\t<div class=\"flex-1 min-w-0\">\r\n\t\t\t\t{#if hasSelectedTickets}\r\n\t\t\t\t\t<Text size=\"sm\" class=\"font-semibold tabular-nums\">\r\n\t\t\t\t\t\t{totalTicketCount} {ticketsLabel(totalTicketCount)} ·\r\n\t\t\t\t\t\t{#if isFreeEvent}\r\n\t\t\t\t\t\t\t{labels.free || 'Free'}\r\n\t\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t\t{formatCurrency(orderTotals.total as USD)}\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{:else if priceDisplay && !ctaConfig.disabled}\r\n\t\t\t\t\t<Text size=\"sm\" class=\"font-semibold block\">\r\n\t\t\t\t\t\t{priceDisplay}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{:else if ctaConfig.reason}\r\n\t\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block\">\r\n\t\t\t\t\t\t{ctaConfig.reason}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t{#if mode === 'peek'}\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tdisabled={ctaConfig.disabled}\r\n\t\t\t\t\tonclick={(e) => {\r\n\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\tif (ctaConfig.disabled) return;\r\n\t\t\t\t\t\tif (hasSelectedTickets) {\r\n\t\t\t\t\t\t\tonCheckout();\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollToTickets();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tclass=\"shrink-0 min-w-32\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{#if hasSelectedTickets}\r\n\t\t\t\t\t\t{labels.checkout || 'Checkout'}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t{ctaConfig.text}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</Button>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t{#if hasSelectedTickets}\r\n\t\t<div\r\n\t\t\tbind:this={bodyEl}\r\n\t\t\tclass=\"peek-sheet__body\"\r\n\t\t\tstyle:opacity={revealProgress}\r\n\t\t>\r\n\t\t\t<OrderSummary {orderTotals} {labels} />\r\n\t\t</div>\r\n\r\n\t\t{#if mode === 'open'}\r\n\t\t\t<div class=\"peek-sheet__actions\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant=\"default\"\r\n\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\tdisabled={ctaConfig.disabled}\r\n\t\t\t\t\tonclick={handleDrawerCheckout}\r\n\t\t\t\t>\r\n\t\t\t\t\t{#if isFreeEvent}\r\n\t\t\t\t\t\t{event.isRegistrationEvent\r\n\t\t\t\t\t\t\t? (labels.reserveASpot || 'Reserve a spot')\r\n\t\t\t\t\t\t\t: (labels.getTickets || 'Get tickets')}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t{labels.checkout || 'Checkout'} · {formatCurrency(orderTotals.total as USD)}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.peek-sheet {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\toverflow: hidden;\r\n\t\t/* iOS-spec cubic-bezier from Apple's UIView spring-like easing. */\r\n\t\ttransition: height 350ms cubic-bezier(0.32, 0.72, 0, 1);\r\n\t\twill-change: height;\r\n\t\tbox-shadow:\r\n\t\t\t0 -8px 24px color-mix(in srgb, hsl(var(--overlay-bg)) 8%, transparent),\r\n\t\t\t0 -2px 6px color-mix(in srgb, hsl(var(--overlay-bg)) 6%, transparent);\r\n\t\t/* touch-action: pan-y on the sheet root lets pointer events fire for\r\n\t\t * vertical drag while still allowing native scroll inside .peek-sheet__body\r\n\t\t * which has its own touch-action setting. */\r\n\t\ttouch-action: pan-y;\r\n\t}\r\n\t.peek-sheet--open {\r\n\t\tborder-top-left-radius: 24px;\r\n\t\tborder-top-right-radius: 24px;\r\n\t\tbox-shadow:\r\n\t\t\t0 -8px 32px color-mix(in srgb, hsl(var(--overlay-bg)) 12%, transparent),\r\n\t\t\t0 -2px 8px color-mix(in srgb, hsl(var(--overlay-bg)) 8%, transparent);\r\n\t}\r\n\t.peek-sheet--dragging {\r\n\t\ttransition: none;\r\n\t}\r\n\r\n\t.peek-sheet__top {\r\n\t\tposition: relative;\r\n\t\tflex-shrink: 0;\r\n\t\theight: 80px; /* matches PEEK_H — bar content vertical position\r\n\t\t * never shifts based on grab-handle presence. */\r\n\t\t/* Grab area: forbid all default browser gestures so pointer events\r\n\t\t * arrive cleanly. iOS specifically requires `none` here or it tries\r\n\t\t * to consume the drag for page-scroll. */\r\n\t\ttouch-action: none;\r\n\t\tuser-select: none;\r\n\t\t-webkit-user-select: none;\r\n\t}\r\n\r\n\t.peek-sheet__row {\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t/* Grab handle absolute-positioned at the top center so it never shifts\r\n\t * the row content vertically. Only renders when hasSelectedTickets. */\r\n\t.peek-sheet__grab {\r\n\t\tposition: absolute;\r\n\t\ttop: 8px;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\tpointer-events: none;\r\n\t}\r\n\t.peek-sheet__pill {\r\n\t\twidth: 40px;\r\n\t\theight: 4px;\r\n\t\tborder-radius: 9999px;\r\n\t\tbackground-color: color-mix(in srgb, hsl(var(--text-tertiary)) 30%, transparent);\r\n\t}\r\n\r\n\t.peek-sheet__body {\r\n\t\tflex: 1 1 auto;\r\n\t\tmin-height: 0;\r\n\t\toverflow-y: auto;\r\n\t\toverscroll-behavior: contain;\r\n\t\tpadding: 0 16px 8px;\r\n\t\t/* Body opacity is driven from JS (revealProgress) so it tracks the\r\n\t\t * sheet height during drag instead of only fading in on release.\r\n\t\t * Body owns its own pan-y so internal touch-scroll works without\r\n\t\t * interfering with the sheet's drag handler. */\r\n\t\ttouch-action: pan-y;\r\n\t}\r\n\t/* Smooth fade when not actively dragging (release/tap-open animations). */\r\n\t.peek-sheet:not(.peek-sheet--dragging) .peek-sheet__body {\r\n\t\ttransition: opacity 250ms cubic-bezier(0.32, 0.72, 0, 1);\r\n\t}\r\n\r\n\t.peek-sheet__actions {\r\n\t\tflex-shrink: 0;\r\n\t\tpadding: 12px 16px 16px;\r\n\t\tborder-top: 1px solid;\r\n\t\tborder-color: color-mix(in srgb, var(--color-stroke-secondary) 50%, transparent);\r\n\t}\r\n\r\n\t.scrim-closed {\r\n\t\topacity: 0;\r\n\t\tpointer-events: none;\r\n\t\tbackground-color: transparent;\r\n\t\tbackdrop-filter: none;\r\n\t}\r\n\t.scrim-open {\r\n\t\topacity: 1;\r\n\t\tpointer-events: auto;\r\n\t\tbackground-color: color-mix(in srgb, hsl(var(--overlay-bg)) 35%, transparent);\r\n\t\tbackdrop-filter: blur(8px);\r\n\t\t-webkit-backdrop-filter: blur(8px);\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Input, Button } from '@getmicdrop/svelte-components';\r\n\timport type { PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tpromoState: PromoCodeState;\r\n\t\tonApply: (code: string) => void;\r\n\t\tonRemove: () => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { promoState, onApply, onRemove, labels = {}, }: Props = $props();\r\n\r\n\tlet isExpanded = $state(false);\r\n\tlet inputValue = $state('');\r\n\r\n\tfunction handleApply() {\r\n\t\tconst trimmed = inputValue.trim();\r\n\t\tif (!trimmed) return;\r\n\t\tonApply(trimmed);\r\n\t}\r\n\r\n\tfunction handleRemove() {\r\n\t\tinputValue = '';\r\n\t\tonRemove();\r\n\t}\r\n\r\n\tfunction handleKeydown(e: KeyboardEvent) {\r\n\t\tif (e.key === 'Enter') {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleApply();\r\n\t\t}\r\n\t}\r\n\r\n\t// Auto-expand when promo is applied (e.g. on restore)\r\n\tlet shouldExpand = $derived(promoState.isApplied || isExpanded);\r\n</script>\r\n\r\n<div class=\"promo-section\" role=\"group\" aria-labelledby=\"promo-label\">\r\n\t<span id=\"promo-label\" class=\"sr-only\">Promo code entry</span>\r\n\t{#if !shouldExpand}\r\n\t\t<Button variant=\"link\" onclick={() => (isExpanded = true)}>\r\n\t\t\t{labels.havePromoCode || 'Have a promo code?'}\r\n\t\t</Button>\r\n\t{:else}\r\n\t\t<div\r\n\t\t\tclass=\"space-y-2\"\r\n\t\t\tstyle=\"animation: promoSlideIn {DURATION.normal}ms ease-out;\"\r\n\t\t>\r\n\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t<div class=\"promo-input-wrapper\" onkeydown={handleKeydown}>\r\n\t\t\t\t<div class=\"flex-1\">\r\n\t\t\t\t\t<Input\r\n\t\t\t\t\t\tlabel={labels.promoCode || 'Promo code'}\r\n\t\t\t\t\t\tplaceholder={labels.enterCode || 'Enter code'}\r\n\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\tbind:value={inputValue}\r\n\t\t\t\t\t\tdisabled={promoState.isApplied || promoState.isValidating}\r\n\t\t\t\t\t\terrorText={promoState.error || ''}\r\n\t\t\t\t\t\tcolor={promoState.error ? 'red' : 'base'}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t{#if promoState.isApplied}\r\n\t\t\t\t\t<Button variant=\"outline\" onclick={handleRemove} class=\"h-10 self-start mt-5\" aria-label={labels.removePromoCode || 'Remove promo code'}>\r\n\t\t\t\t\t\t{labels.remove || 'Remove'}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\tonclick={handleApply}\r\n\t\t\t\t\t\tdisabled={promoState.isValidating || !inputValue.trim()}\r\n\t\t\t\t\t\tclass=\"h-10 self-start mt-5\"\r\n\t\t\t\t\t\taria-label={promoState.isValidating ? (labels.checkingPromoCode || 'Checking promo code') : (labels.applyPromoCode || 'Apply promo code')}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{promoState.isValidating ? (labels.checking || 'Checking...') : (labels.apply || 'Apply')}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Success hint -->\r\n\t\t\t{#if promoState.hint}\r\n\t\t\t\t<p class=\"promo-message success body-sm\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t\t\t{promoState.hint}\r\n\t\t\t\t</p>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.promo-section {\r\n\t\tmargin-top: 1rem;\r\n\t}\r\n\r\n\t.promo-input-wrapper {\r\n\t\tdisplay: flex;\r\n\t\tgap: 0.5rem;\r\n\t\talign-items: flex-start;\r\n\t}\r\n\r\n\t.promo-message {\r\n\t\tmargin-top: 0.5rem;\r\n\t}\r\n\r\n\t.promo-message.success {\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t@keyframes promoSlideIn {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\timport { Button, Text } from '@getmicdrop/svelte-components';\r\n\timport type { EventData } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tformatFullDateCompact,\r\n\t\tformatEventTime,\r\n\t\tformatBrowseDate\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\tonShowtimeClick?: (occurrence: { id: number; slug: string }) => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { event, onShowtimeClick = undefined, labels = {}, }: Props = $props();\r\n\r\n\t// --- Data ---\r\n\ttype GroupedOccurrences = {\r\n\t\tdateLabel: string;\r\n\t\tdateKey: string;\r\n\t\toccurrences: NonNullable<EventData['seriesOccurrences']>;\r\n\t}[];\r\n\r\n\tlet groupedOccurrences: GroupedOccurrences = $derived((() => {\r\n\t\tif (!event.seriesOccurrences) return [];\r\n\t\tconst groups: Map<string, { dateLabel: string; occurrences: NonNullable<EventData['seriesOccurrences']> }> = new Map();\r\n\t\tfor (const occ of event.seriesOccurrences) {\r\n\t\t\tconst dateKey = formatBrowseDate(occ.startDateTime, event.timezone);\r\n\t\t\tif (!groups.has(dateKey)) {\r\n\t\t\t\tgroups.set(dateKey, {\r\n\t\t\t\t\tdateLabel: formatFullDateCompact(occ.startDateTime, event.timezone),\r\n\t\t\t\t\toccurrences: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tgroups.get(dateKey)!.occurrences.push(occ);\r\n\t\t}\r\n\t\treturn [...groups.entries()].map(([dateKey, g]) => ({\r\n\t\t\tdateKey,\r\n\t\t\tdateLabel: g.dateLabel,\r\n\t\t\toccurrences: g.occurrences\r\n\t\t}));\r\n\t})());\r\n\r\n\tfunction handleShowtimeClick(occ: { id: number; slug: string }) {\r\n\t\tif (onShowtimeClick) {\r\n\t\t\tonShowtimeClick(occ);\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<section>\r\n\t<div class=\"space-y-4\">\r\n\t\t{#each groupedOccurrences as group (group.dateKey)}\r\n\t\t\t<div>\r\n\t\t\t\t<Text size=\"sm\" class=\"font-semibold block mb-2\">\r\n\t\t\t\t\t{group.dateLabel}\r\n\t\t\t\t</Text>\r\n\t\t\t\t<div class=\"space-y-2\">\r\n\t\t\t\t\t{#each group.occurrences as occ (occ.id)}\r\n\t\t\t\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\tclass=\"row-a border-default bg-surface-primary hover:bg-surface-secondary\"\r\n\t\t\t\t\t\t\tclass:row-disabled={occ.ctaDisabled}\r\n\t\t\t\t\t\t\tonclick={() => !occ.ctaDisabled && handleShowtimeClick({ id: occ.id, slug: occ.slug })}\r\n\t\t\t\t\t\t\tonkeydown={(e: KeyboardEvent) => e.key === 'Enter' && !occ.ctaDisabled && handleShowtimeClick({ id: occ.id, slug: occ.slug })}\r\n\t\t\t\t\t\t\ttabindex={occ.ctaDisabled ? -1 : 0}\r\n\t\t\t\t\t\t\trole=\"link\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{#if event.displayStartTime !== false}\r\n\t\t\t\t\t\t\t\t<Text size=\"sm\" class=\"font-medium\">\r\n\t\t\t\t\t\t\t\t\t{formatEventTime(occ.startDateTime, event.timezone)}\r\n\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t\tvariant={occ.ctaDisabled ? 'alternative' : 'default'}\r\n\t\t\t\t\t\t\t\tdisabled={occ.ctaDisabled}\r\n\t\t\t\t\t\t\t\tclass=\"shrink-0 pointer-events-none\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{occ.ctaText}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t{/each}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t{/each}\r\n\t</div>\r\n</section>\r\n\r\n<style>\r\n\t/* === Shared === */\r\n\t.row-disabled {\r\n\t\topacity: 0.5;\r\n\t\tcursor: default;\r\n\t}\r\n\r\n\t/* === Design A: Full-width rows === */\r\n\t.row-a {\r\n\t\twidth: 100%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t\tgap: 0.75rem;\r\n\t\tpadding: 0.75rem;\r\n\t\tborder-radius: 0.5rem;\r\n\t\tborder-width: 1px;\r\n\t\tborder-style: solid;\r\n\t\tcursor: pointer;\r\n\t\ttransition-property: all;\r\n\t\ttransition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\r\n\t\ttransition-duration: 150ms;\r\n\t}\r\n\r\n\t.row-a:hover:not(.row-disabled) {\r\n\t\tborder-color: hsl(var(--stroke-primary)); /* gray-300 */\r\n\t}\r\n\r\n .row-a:hover:not(.row-disabled) {\r\n &:is([data-theme=\"dark\"], [data-theme=\"dark\"] *) {\r\n\t\tborder-color: hsl(var(--stroke-primary)); /* gray-600 */\r\n\t }\r\n }\r\n</style>\r\n","/**\r\n * EventTeaser — Density + Layout tokens\r\n *\r\n * Two orthogonal knobs:\r\n * - layout: structural DOM shape (image on top, image on left, micro cell)\r\n * - density: scalar size (padding, gap, type-scale)\r\n *\r\n * Density tokens that are scalar values live as CSS custom properties on the\r\n * teaser element (see EventTeaser.svelte). Props passed to SC primitives\r\n * (Badge size, Button size) live here in TS because SC accepts a string union.\r\n */\r\n\r\nexport type TeaserLayout = 'vertical' | 'horizontal' | 'micro';\r\nexport type TeaserDensity = 'micro' | 'compact' | 'standard' | 'featured';\r\n\r\nexport interface TeaserToken {\r\n\tbadgeSize: 'xs' | 'sm';\r\n\tpillSize: 'xs' | 'sm';\r\n}\r\n\r\nexport const TEASER_DENSITY: Record<TeaserDensity, TeaserToken> = {\r\n\tmicro: { badgeSize: 'xs', pillSize: 'xs' },\r\n\tcompact: { badgeSize: 'sm', pillSize: 'xs' },\r\n\tstandard: { badgeSize: 'sm', pillSize: 'xs' },\r\n\tfeatured: { badgeSize: 'sm', pillSize: 'sm' },\r\n};\r\n","<script lang=\"ts\">\r\n\t/**\r\n\t * EventTeaser — the canonical event card.\r\n\t *\r\n\t * One primitive, two knobs:\r\n\t * layout = 'vertical' | 'horizontal' | 'micro'\r\n\t * density = 'micro' | 'compact' | 'standard' | 'featured'\r\n\t *\r\n\t * Solves the historical two-block padding gap by using a stretched-link\r\n\t * pattern: the title link's ::before pseudo covers the whole article, so the\r\n\t * entire card is one click target. Time pill <Button>s sit on top via\r\n\t * relative z-index, keeping them independently clickable. One padded\r\n\t * content container, one rhythm, no compound margins.\r\n\t */\r\n\timport { Badge, BlurBackdropImage, Button } from '@getmicdrop/svelte-components';\r\n\timport ScarcityBadge from '../../../components/ScarcityBadge.svelte';\r\n\timport { formatBrowseDate, formatEventTime } from '$lib/utils/datetime.js';\r\n\timport { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n\timport { getBrowseStatus, getSeriesBrowseStatus, isEventUnavailable, badgeVariant } from '$lib/browse-widgets/status';\r\n\timport { buildEventHref } from '$lib/url-manager/params';\r\n\timport type { BrowseEvent, GroupedEvent } from '$lib/browse-widgets/types';\r\n\timport {\r\n\t\tTEASER_DENSITY,\r\n\t\ttype TeaserDensity,\r\n\t\ttype TeaserLayout,\r\n\t} from './tokens';\r\n\r\n\tinterface Props {\r\n\t\tgrouped: GroupedEvent;\r\n\t\tlayout?: TeaserLayout;\r\n\t\tdensity?: TeaserDensity;\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t\t/** Show truncated description (only honored at standard/featured density). */\r\n\t\tshowDescription?: boolean;\r\n\t\t/** Hide the date line. Set true when the consuming layout already shows\r\n\t\t * the date elsewhere (e.g. List view's left date rail). */\r\n\t\thideDate?: boolean;\r\n\t}\r\n\r\n\tlet {\r\n\t\tgrouped,\r\n\t\tlayout = 'vertical',\r\n\t\tdensity = 'standard',\r\n\t\toneventClick,\r\n\t\tlabels = {},\r\n\t\tshowDescription = false,\r\n\t\thideDate = false,\r\n\t}: Props = $props();\r\n\r\n\tlet event = $derived(grouped.event);\r\n\tlet token = $derived(TEASER_DENSITY[density]);\r\n\t// Series cards use the series-aware aggregator (only badge if EVERY\r\n\t// instance shares the status); single-event cards use the canonical\r\n\t// per-event computation.\r\n\tlet browseStatus = $derived(\r\n\t\tgrouped.isSeries\r\n\t\t\t? getSeriesBrowseStatus(grouped.instances, labels)\r\n\t\t\t: getBrowseStatus(event, labels)\r\n\t);\r\n\tlet isUnavailable = $derived(isEventUnavailable(browseStatus));\r\n\tlet eventHref = $derived(buildEventHref(event));\r\n\tlet titleId = $derived(`teaser-title-${event.eventID}`);\r\n\r\n\tlet allowDescription = $derived(\r\n\t\tshowDescription &&\r\n\t\t\t!!event.description &&\r\n\t\t\t(density === 'standard' || density === 'featured')\r\n\t);\r\n\tlet allowDate = $derived(!hideDate && density !== 'micro' && !!event.startDateTime);\r\n\r\n\t// All pills visible — with tightened mobile padding the content area\r\n\t// fits 2 pills per row, so even 6-showtime series like Comedy Marathon\r\n\t// stay under ~120px tall without needing a \"+N more\" cap.\r\n\tlet visibleInstances = $derived(grouped.instances);\r\n\r\n\tfunction ariaLabel() {\r\n\t\tconst parts = [event.name];\r\n\t\tif (event.startDateTime) {\r\n\t\t\tparts.push(`on ${formatBrowseDate(event.startDateTime, event.timeZone)}`);\r\n\t\t}\r\n\t\tif (grouped.isSeries) {\r\n\t\t\tparts.push(`${grouped.instances.length} showtimes available`);\r\n\t\t} else if (event.startDateTime) {\r\n\t\t\tparts.push(`at ${formatEventTime(event.startDateTime, event.timeZone)}`);\r\n\t\t}\r\n\t\tif (browseStatus) parts.push(browseStatus.text);\r\n\t\treturn parts.join(', ');\r\n\t}\r\n\r\n\tfunction onPillClick(instance: BrowseEvent, e: MouseEvent) {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\toneventClick?.(instance);\r\n\t}\r\n</script>\r\n\r\n<article\r\n\tclass=\"event-teaser relative rounded-lg border bg-card border-border overflow-hidden flex flex-col\"\r\n\tdata-layout={layout}\r\n\tdata-density={density}\r\n\taria-labelledby={titleId}\r\n>\r\n\t<div class=\"event-teaser__poster w-full aspect-video bg-muted shrink-0 overflow-hidden\">\r\n\t\t<BlurBackdropImage\r\n\t\t\tsrc={event.imageUrl}\r\n\t\t\tfallback={PLACEHOLDER_IMAGE}\r\n\t\t\tclass=\"event-teaser__poster-fill\"\r\n\t\t/>\r\n\t</div>\r\n\r\n\t<div class=\"event-teaser__content flex flex-col flex-1 min-w-0\">\r\n\t\t<header class=\"event-teaser__header\">\r\n\t\t\t<h3\r\n\t\t\t\tclass=\"event-teaser__title font-semibold text-text-primary m-0\"\r\n\t\t\t\tid={titleId}\r\n\t\t\t>\r\n\t\t\t\t{#if browseStatus}\r\n\t\t\t\t\t<span class=\"event-teaser__badge\">\r\n\t\t\t\t\t\t<Badge variant={badgeVariant(browseStatus.type)} size={token.badgeSize}>\r\n\t\t\t\t\t\t\t{browseStatus.text}\r\n\t\t\t\t\t\t</Badge>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t{:else if !grouped.isSeries && event.ticketsTotal && (event.ticketsTotal > 0 || event.ticketsRemaining === 0)}\r\n\t\t\t\t\t<!-- ScarcityBadge fallback (Only N left / Selling fast) is for\r\n\t\t\t\t\t single-event cards only. For series, the rep event's solo\r\n\t\t\t\t\t ticket count is misleading — a 4-show series where only the\r\n\t\t\t\t\t first show is sold out would falsely show \"Sold out\" on the\r\n\t\t\t\t\t series card. Series badges go through getSeriesBrowseStatus\r\n\t\t\t\t\t (above) which is null for mixed states; let it be null. -->\r\n\t\t\t\t\t<span class=\"event-teaser__badge\">\r\n\t\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\t\tremaining={event.ticketsRemaining ?? 0}\r\n\t\t\t\t\t\t\ttotal={event.ticketsTotal ?? 0}\r\n\t\t\t\t\t\t\tcontext=\"browse\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t{/if}\r\n\t\t\t\t<a\r\n\t\t\t\t\tclass=\"event-teaser__title-link\"\r\n\t\t\t\t\thref={eventHref}\r\n\t\t\t\t\tonclick={(e) => {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\toneventClick?.(event);\r\n\t\t\t\t\t}}\r\n\t\t\t\t\taria-label={ariaLabel()}\r\n\t\t\t\t>\r\n\t\t\t\t\t{event.name}\r\n\t\t\t\t</a>\r\n\t\t\t</h3>\r\n\t\t</header>\r\n\r\n\t\t{#if allowDate}\r\n\t\t\t<time\r\n\t\t\t\tclass=\"event-teaser__date text-text-secondary font-medium\"\r\n\t\t\t\tdatetime={event.startDateTime}\r\n\t\t\t>\r\n\t\t\t\t{formatBrowseDate(event.startDateTime, event.timeZone)}\r\n\t\t\t</time>\r\n\t\t{/if}\r\n\r\n\t\t{#if grouped.isSeries}\r\n\t\t\t<div class=\"event-teaser__pills flex flex-wrap gap-2 relative\">\r\n\t\t\t\t{#each visibleInstances as instance (instance.eventID)}\r\n\t\t\t\t\t{@const instStatus = getBrowseStatus(instance, labels)}\r\n\t\t\t\t\t{@const instSoldOut = instStatus?.type === 'sold_out'}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\thref={buildEventHref(instance)}\r\n\t\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\t\tsize={token.pillSize}\r\n\t\t\t\t\t\tonclick={(e) => onPillClick(instance, e)}\r\n\t\t\t\t\t\taria-label=\"{event.name} at {formatEventTime(instance.startDateTime, instance.timeZone)}{instSoldOut ? ', sold out' : ''}\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{formatEventTime(instance.startDateTime, instance.timeZone)}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/each}\r\n\t\t\t</div>\r\n\t\t{:else if event.startDateTime}\r\n\t\t\t<div class=\"event-teaser__pills flex flex-wrap gap-2 relative\">\r\n\t\t\t\t<Button\r\n\t\t\t\t\thref={eventHref}\r\n\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\tsize={token.pillSize}\r\n\t\t\t\t\tonclick={(e) => onPillClick(event, e)}\r\n\t\t\t\t\taria-label=\"{event.name} at {formatEventTime(event.startDateTime, event.timeZone)}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{formatEventTime(event.startDateTime, event.timeZone)}\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t{#if allowDescription}\r\n\t\t\t<p class=\"event-teaser__description text-sm text-text-secondary m-0\">{event.description}</p>\r\n\t\t{/if}\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* === Shell motion === */\r\n\t.event-teaser {\r\n\t\ttransition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;\r\n\t\t/* Fill the grid cell so cards in the same row equalize height. Image\r\n\t\t * stays anchored to top via aspect-video; the content stack absorbs\r\n\t\t * the extra. Cards look uniform regardless of title length / pill\r\n\t\t * count / badge presence. */\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t.event-teaser:hover {\r\n\t\tborder-color: var(--color-stroke-primary, currentColor);\r\n\t\ttransform: translateY(-2px);\r\n\t\tbox-shadow: 0 4px 12px color-mix(in srgb, black 10%, transparent);\r\n\t}\r\n\r\n\t.event-teaser:active {\r\n\t\ttransform: translateY(0);\r\n\t}\r\n\r\n\t/* === Layout: horizontal (List) — always image-left, never stacks. ===\r\n\t * Sizes mirror v1 ListView at every breakpoint.\r\n\t * Poster keeps 16:9. When content (title + badge + multi-pill row) is\r\n\t * taller than the natural poster height, align-items:center distributes\r\n\t * the extra height above AND below the poster — reads as intentional\r\n\t * vertical centering, not orphaned blank space below the image.\r\n\t *\r\n\t * Padding + gap progression: 8 / 12 / 16 (space-2 / 3 / 4) — tighter\r\n\t * than the previous 8 / 16 / 24 which made desktop/tablet cards feel\r\n\t * loose with a lot of empty space between the image and content. Same\r\n\t * value used for inner padding AND poster-to-content gap so the cards\r\n\t * read uniformly at every breakpoint. */\r\n\t.event-teaser[data-layout='horizontal'] {\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t\tpadding: 0.5rem;\r\n\t\tgap: 0.5rem;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.event-teaser[data-layout='horizontal'] {\r\n\t\t\tpadding: 0.75rem; /* 12px = space-3 */\r\n\t\t\tgap: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-layout='horizontal'] {\r\n\t\t\tpadding: 1rem; /* 16px = space-4 */\r\n\t\t\tgap: 1rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Drop the content's own padding when in horizontal layout — the article\r\n\t * shell provides it. Keeps the gap rhythm intact. */\r\n\t.event-teaser[data-layout='horizontal'] .event-teaser__content {\r\n\t\tpadding: 0;\r\n\t}\r\n\r\n\t/* Poster gets its own rounded corners since it's no longer flush against\r\n\t * the article's clipped edge. */\r\n\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\tborder-radius: 0.5rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\t\tborder-radius: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Sizes mirror v1 ListView at every breakpoint:\r\n\t * mobile w-24 (6rem / 96px)\r\n\t * tablet w-28 (7rem / 112px)\r\n\t * desktop w-52 (13rem / 208px)\r\n\t * Aspect ratio stays 16:9 via the .event-teaser__poster base rules. */\r\n\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\twidth: 6rem;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\t\twidth: var(--teaser-poster-width, 7rem);\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-layout='horizontal'] .event-teaser__poster {\r\n\t\t\twidth: var(--teaser-poster-width-lg, 13rem);\r\n\t\t}\r\n\t}\r\n\r\n\t/* === Layout: micro centers content === */\r\n\t.event-teaser[data-layout='micro'] .event-teaser__content {\r\n\t\ttext-align: center;\r\n\t\talign-items: stretch;\r\n\t}\r\n\r\n\t:global(.event-teaser__poster .event-teaser__poster-fill) {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t/* === Content stack — single padded container, single rhythm. */\r\n\t.event-teaser__content {\r\n\t\tpadding: var(--teaser-padding);\r\n\t\tgap: var(--teaser-gap);\r\n\t}\r\n\r\n\t/* === Density tokens (CSS-only — scalar values that drive padding/gap/type) === */\r\n\t.event-teaser[data-density='micro'] {\r\n\t\t--teaser-padding: 0.25rem;\r\n\t\t--teaser-gap: 0.25rem;\r\n\t\t--teaser-title-size: 0.8125rem;\r\n\t\t--teaser-title-leading: 1.2;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 0.6875rem;\r\n\t}\r\n\r\n\t/* At micro density: drop the outer card chrome. The day cell already\r\n\t * provides the bg/border framing. Without this, every cell looks like\r\n\t * a card-inside-a-card (two borders, two paddings, two radii) — too busy\r\n\t * at 130-150px wide. The teaser becomes just image + title + pills. */\r\n\t.event-teaser[data-density='micro'] {\r\n\t\tborder: 0;\r\n\t\tbackground: transparent;\r\n\t\tborder-radius: 0;\r\n\t\toverflow: visible;\r\n\t}\r\n\t.event-teaser[data-density='micro']:hover {\r\n\t\tborder-color: transparent;\r\n\t\ttransform: none;\r\n\t\tbox-shadow: none;\r\n\t}\r\n\t/* Re-clip the poster's own corners since the outer overflow no longer\r\n\t * clips. Keep the image rounded so it doesn't look ragged. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__poster {\r\n\t\tborder-radius: 0.375rem;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Micro density centered title. Badge floats right-of-title via the\r\n\t * .event-teaser__badge float pattern (defined below) — no header-level\r\n\t * flex/column override needed because the badge is now an in-flow child\r\n\t * of the h3, not a sibling. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__title {\r\n\t\ttext-align: center;\r\n\t}\r\n\t.event-teaser[data-density='compact'] {\r\n\t\t--teaser-padding: 0.75rem;\r\n\t\t--teaser-gap: 0.5rem;\r\n\t\t--teaser-title-size: 1rem;\r\n\t\t--teaser-title-leading: 1.3;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 0.875rem;\r\n\t}\r\n\t.event-teaser[data-density='standard'] {\r\n\t\t--teaser-padding: 1rem; /* token: space-4 (was 0.875/14px, off-grid) */\r\n\t\t--teaser-gap: 0.5rem;\r\n\t\t--teaser-title-size: 1rem;\r\n\t\t--teaser-title-leading: 1.3;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 0.875rem;\r\n\t}\r\n\t.event-teaser[data-density='featured'] {\r\n\t\t--teaser-padding: 1.25rem;\r\n\t\t--teaser-gap: 0.75rem;\r\n\t\t--teaser-title-size: 1.25rem;\r\n\t\t--teaser-title-leading: 1.3;\r\n\t\t--teaser-title-clamp: 2;\r\n\t\t--teaser-date-size: 1rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-teaser[data-density='compact'] {\r\n\t\t\t--teaser-padding: 1rem;\r\n\t\t\t--teaser-title-size: 1.0625rem; /* parity with standard at desktop */\r\n\t\t}\r\n\t\t.event-teaser[data-density='standard'] {\r\n\t\t\t--teaser-padding: 1rem;\r\n\t\t\t--teaser-title-size: 1.0625rem;\r\n\t\t}\r\n\t\t.event-teaser[data-density='featured'] {\r\n\t\t\t--teaser-padding: 1.5rem;\r\n\t\t\t--teaser-title-size: 1.375rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Horizontal layout (List): 3-line clamp so Dave Martinez et al fit\r\n\t * after the float-right badge eats line 1. */\r\n\t.event-teaser[data-layout='horizontal'] {\r\n\t\t--teaser-title-clamp: 3;\r\n\t}\r\n\r\n\t/* Micro density (Calendar tile): badge sits on its OWN row above the\r\n\t * title, not floated inline. Tile is too narrow (~128px) for the\r\n\t * float-right pattern to work — short first words like \"Dave\" or\r\n\t * \"DJ\" land next to the badge and the title fractures. Block badge\r\n\t * on its own row keeps the title full-width and readable. Three-line\r\n\t * clamp covers the longest worst-case title (33 chars at 13px = ~2.1\r\n\t * lines, round up to 3 with safety margin). */\r\n\t.event-teaser[data-density='micro'] {\r\n\t\t--teaser-title-clamp: 3;\r\n\t}\r\n\t.event-teaser[data-density='micro'] .event-teaser__badge {\r\n\t\tfloat: none;\r\n\t\tdisplay: block;\r\n\t\tmargin: 0 auto 0.25rem;\r\n\t}\r\n\t/* The badge sits inside the .event-teaser__title h3, so its block\r\n\t * height counts against the title's max-height clamp. Drop the clamp\r\n\t * for micro so the badge row + 3 title lines both fit. The cell's\r\n\t * own height auto-grows; rows in the calendar grid equalize anyway. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__title {\r\n\t\tmax-height: none;\r\n\t}\r\n\r\n\t/* Horizontal layout below sm bumps title down one notch (16px → 14px).\r\n\t * The narrow row + image already eats ~150px on mobile; smaller title\r\n\t * keeps two lines visible without the row growing too tall. */\r\n\t@media (max-width: 639px) {\r\n\t\t.event-teaser[data-layout='horizontal'] {\r\n\t\t\t--teaser-title-size: 0.875rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* === Title type size + soft clamp via max-height + overflow ===\r\n\t * Switched off -webkit-box because float on .event-teaser__badge needs\r\n\t * regular block flow to wrap title text around it. max-height +\r\n\t * overflow:hidden trims overflow without losing the float behavior.\r\n\t * Clamp = lines * line-height; line-height is unitless, so we multiply\r\n\t * via calc on a stand-in 1em. */\r\n\t.event-teaser__title {\r\n\t\tfont-size: var(--teaser-title-size);\r\n\t\tline-height: var(--teaser-title-leading);\r\n\t\tmax-height: calc(var(--teaser-title-leading) * var(--teaser-title-clamp) * 1em);\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Badge floats right-of-title so long names dodge it on line 1 then use\r\n\t * the full content width on subsequent lines. Sits above the stretched\r\n\t * link via z-index so its pointer events still hit. */\r\n\t.event-teaser__badge {\r\n\t\tfloat: right;\r\n\t\tmargin-left: 0.5rem;\r\n\t\tmargin-bottom: 0.25rem;\r\n\t\tposition: relative;\r\n\t\tz-index: 2;\r\n\t}\r\n\r\n\t/* === Stretched link === */\r\n\t.event-teaser__title-link {\r\n\t\tcolor: inherit;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.event-teaser__title-link::before {\r\n\t\tcontent: '';\r\n\t\tposition: absolute;\r\n\t\tinset: 0;\r\n\t\tz-index: 1;\r\n\t}\r\n\t.event-teaser__title-link:focus-visible {\r\n\t\toutline: 2px solid var(--color-focus-ring, currentColor);\r\n\t\toutline-offset: 2px;\r\n\t}\r\n\r\n\t.event-teaser__date {\r\n\t\tfont-size: var(--teaser-date-size);\r\n\t}\r\n\r\n\t/* === Pills sit above stretched-link pseudo === */\r\n\t.event-teaser__pills {\r\n\t\tz-index: 2;\r\n\t}\r\n\r\n\t.event-teaser[data-layout='micro'] .event-teaser__pills {\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t/* Sold-out time pills render IDENTICALLY to other pills — per project\r\n\t * rule [[feedback_sold_out_clickable]], we don't dim or otherwise\r\n\t * visually differentiate sold-out states. The pill stays full\r\n\t * opacity, full color; user clicks through and gets the waitlist\r\n\t * option on the event page. aria-label still announces \"sold out\"\r\n\t * for screen readers. */\r\n\r\n\t/* At micro density: stack pills vertically, each full-width. Mirrors v1\r\n\t * calendar where 2+ showtimes per day was the most common case and the\r\n\t * \"wrap horizontal pills\" approach produced awkward 2-row near-fits. */\r\n\t.event-teaser[data-density='micro'] .event-teaser__pills {\r\n\t\tflex-direction: column;\r\n\t\tgap: 0.25rem;\r\n\t}\r\n\t.event-teaser[data-density='micro'] .event-teaser__pills :global(> *) {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t/* === Description clamp === */\r\n\t.event-teaser__description {\r\n\t\tdisplay: -webkit-box;\r\n\t\t-webkit-line-clamp: 2;\r\n\t\tline-clamp: 2;\r\n\t\t-webkit-box-orient: vertical;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.event-teaser,\r\n\t\t.event-teaser:hover {\r\n\t\t\ttransform: none;\r\n\t\t\ttransition: none;\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n // @currency-escape: event price display\r\n\timport { createLogger, Grid, Heading, Text, asTicketId } from '@getmicdrop/svelte-components';\r\n\timport { toast } from '@getmicdrop/svelte-components/toast';\r\n\timport type { TicketId } from '@getmicdrop/svelte-components';\r\n\timport type { EventData, OrderTotals, OrderLine, PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport {\r\n\t\tcalculateTax,\r\n\t\tcreateDefaultPromoState,\r\n\t\tDURATION\r\n\t} from '$lib/public-calendar-flow/defaults';\r\n\r\n\timport HeroImage from './HeroImage.svelte';\r\n\timport EventHeader from './EventHeader.svelte';\r\n\timport TicketCard from './TicketCard.svelte';\r\n\timport BookingWidget from './BookingWidget.svelte';\r\n\timport AboutSection from './AboutSection.svelte';\r\n\timport PerformerGrid from './PerformerGrid.svelte';\r\n\timport FaqAccordion from './FaqAccordion.svelte';\r\n\timport MobileCta from './MobileCta.svelte';\r\n\timport PromoCodeInput from './PromoCodeInput.svelte';\r\n\timport ShowtimeDesigns from './ShowtimeDesigns.svelte';\r\n\timport EventTeaser from '$lib/browse-widgets/event-teaser/EventTeaser.svelte';\r\n\timport { groupEventsBySeries } from '$lib/browse-widgets/utils';\r\n\timport type { BrowseEvent } from '$lib/browse-widgets/types';\r\n\timport { mergeLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n\r\n\tconst logger = createLogger('Event');\r\n\r\n\t// Production component. Pure event renderer — no mock data, no toggle\r\n\t// store, no showcase wiring. Showcase variants live in\r\n\t// `ShowcaseEvent.svelte`, which picks a mock and renders <Event /> with it.\r\n\tinterface Props {\r\n\t\tevent: EventData;\r\n\t\tonCheckout?: (orderTotals: OrderTotals) => void;\r\n\t\tonPromoApply?: (code: string) => Promise<PromoCodeState>;\r\n\t\tonPromoRemove?: () => void;\r\n\t\tonCollectionEventClick?: (event: { id?: number | string; slug: string }) => void;\r\n\t\tonShowtimeClick?: (occurrence: { id: number; slug: string }) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tevent,\r\n\t\tonCheckout: onCheckoutProp = undefined,\r\n\t\tonPromoApply: onPromoApplyProp = undefined,\r\n\t\tonPromoRemove: onPromoRemoveProp = undefined,\r\n\t\tonCollectionEventClick: onCollectionEventClickProp = undefined,\r\n\t\tonShowtimeClick: onShowtimeClickProp = undefined,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\tconst mergedLabels = $derived(mergeLabels(labels));\r\n\r\n\t// Ticket quantities keyed by ticket ID\r\n\tlet quantities: Record<TicketId, number> = $state({});\r\n\r\n\t// Promo code state\r\n\tlet promoState = $state<PromoCodeState>(createDefaultPromoState());\r\n\r\n\t// Donation amounts keyed by ticket ID\r\n\tlet donationAmounts: Record<TicketId, string> = $state({});\r\n\r\n\t// Reset cart-related state when the event identity changes. Covers both\r\n\t// showcase-mode mock swaps and production navigation between events.\r\n\t$effect(() => {\r\n\t\tconst _id = event.id;\r\n\t\tquantities = {};\r\n\t\tpromoState = createDefaultPromoState();\r\n\t\tdonationAmounts = {};\r\n\t});\r\n\r\n\t// Visible tickets (account for promo reveals)\r\n\tlet visibleTickets = $derived(\r\n\t\tevent.tickets.filter((t) => {\r\n\t\t\tif (!t.isHidden) return true;\r\n\t\t\tif (promoState.revealHiddenTickets) return true;\r\n\t\t\treturn promoState.revealTicketIds.includes(t.id);\r\n\t\t})\r\n\t);\r\n\r\n\t// Group tickets by section\r\n\tlet groupedTickets = $derived((() => {\r\n\t\tconst groups: Record<string, typeof visibleTickets> = {};\r\n\t\tfor (const ticket of visibleTickets) {\r\n\t\t\tconst section = ticket.sectionName || '_default';\r\n\t\t\tif (!groups[section]) groups[section] = [];\r\n\t\t\tgroups[section].push(ticket);\r\n\t\t}\r\n\t\treturn groups;\r\n\t})());\r\n\r\n\tlet hasMultipleSections = $derived(\r\n\t\tObject.keys(groupedTickets).filter((k) => k !== '_default').length > 0\r\n\t);\r\n\r\n\t// Show tickets for on_sale AND sold_out events (sold out shows them as disabled)\r\n\tlet isOnSale = $derived(event.status === 'on_sale');\r\n\tlet showTicketCards = $derived(\r\n\t\t(event.status === 'on_sale' || event.status === 'sold_out') && visibleTickets.length > 0\r\n\t);\r\n\r\n\t// Calculate order totals (with donation amounts and promo discounts)\r\n\tlet orderTotals: OrderTotals = $derived((() => {\r\n\t\tconst lines: OrderLine[] = [];\r\n\t\tlet subtotal = 0;\r\n\t\tlet fees = 0;\r\n\t\tlet promoDiscount = 0;\r\n\r\n\t\tfor (const ticket of event.tickets) {\r\n\t\t\tconst qty = quantities[ticket.id] ?? 0;\r\n\t\t\tif (qty <= 0) continue;\r\n\r\n\t\t\tconst isDonation = ticket.isDonation || ticket.ticketType === 2;\r\n\t\t\tconst basePrice = isDonation ? (parseFloat(donationAmounts[ticket.id]) || 0) : ticket.price;\r\n\t\t\tconst ticketFee = isDonation ? 0 : ticket.fee;\r\n\r\n\t\t\t// Calculate promo discount for this ticket\r\n\t\t\tlet ticketDiscount = 0;\r\n\t\t\tif (promoState.isApplied && promoState.discountAmount > 0 && !isDonation) {\r\n\t\t\t\tconst eligible = promoState.discountTicketIds.length === 0 || promoState.discountTicketIds.includes(ticket.id);\r\n\t\t\t\tif (eligible) {\r\n\t\t\t\t\tif (promoState.discountType === '%') {\r\n\t\t\t\t\t\tticketDiscount = basePrice * (promoState.discountAmount / 100);\r\n\t\t\t\t\t} else if (promoState.discountType === '$') {\r\n\t\t\t\t\t\tticketDiscount = Math.min(promoState.discountAmount, basePrice);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst effectivePrice = Math.max(0, basePrice - ticketDiscount);\r\n\t\t\tconst ticketSubtotal = effectivePrice * qty;\r\n\t\t\tconst totalTicketFee = ticketFee * qty;\r\n\r\n\t\t\tlines.push({\r\n\t\t\t\tticketId: asTicketId(ticket.id),\r\n\t\t\t\tticketName: ticket.name,\r\n\t\t\t\tquantity: qty,\r\n\t\t\t\tunitPrice: effectivePrice,\r\n\t\t\t\tfee: ticketFee,\r\n\t\t\t\tsubtotal: ticketSubtotal\r\n\t\t\t});\r\n\r\n\t\t\tsubtotal += ticketSubtotal;\r\n\t\t\tfees += totalTicketFee;\r\n\t\t\tpromoDiscount += ticketDiscount * qty;\r\n\t\t}\r\n\r\n\t\tconst taxes = calculateTax(subtotal + fees, event.venue.taxPercentage);\r\n\r\n\t\treturn {\r\n\t\t\tlines,\r\n\t\t\tsubtotal,\r\n\t\t\tfees,\r\n\t\t\ttaxes,\r\n\t\t\ttotal: subtotal + fees + taxes,\r\n\t\t\tpromoDiscount,\r\n\t\t\tgiftCardAmount: 0\r\n\t\t};\r\n\t})());\r\n\r\n\tlet hasSelectedTickets = $derived(orderTotals.lines.length > 0);\r\n\r\n\t// Series occurrences — group by date for same-day shows\r\n\tlet isSeries = $derived(!!event.eventSeriesId);\r\n\r\n\t// Collection — loose grouping of different events\r\n\tlet isCollection = $derived(!!event.collectionId);\r\n\r\n\t// Full-width layout mode (no sidebar)\r\n\tlet isFullWidth = $derived(isSeries || isCollection);\r\n\r\n\t// Collection events normalized to the canonical BrowseEvent shape and\r\n\t// grouped via groupEventsBySeries so EventTeaser can render them through\r\n\t// the design-system primitive instead of a feature-tree-crossing\r\n\t// GalleryCard. CollectionEvent uses id/image; BrowseEvent uses\r\n\t// eventID/imageUrl + a YYYY-MM-DD date derived from startDateTime.\r\n\tlet collectionTeaserGroups = $derived(\r\n\t\tgroupEventsBySeries(\r\n\t\t\t(event.collectionEvents ?? []).map<BrowseEvent>((ce) => ({\r\n\t\t\t\teventID: ce.id,\r\n\t\t\t\tname: ce.name,\r\n\t\t\t\tdate: ce.startDateTime.slice(0, 10),\r\n\t\t\t\tstartDateTime: ce.startDateTime,\r\n\t\t\t\timageUrl: ce.image,\r\n\t\t\t\t// browse-widgets/types narrows out 'past' (it computes past-ness\r\n\t\t\t\t// from endDateTime at runtime); coerce to the closest unbookable\r\n\t\t\t\t// status that the canonical union accepts.\r\n\t\t\t\tstatus: ce.status === 'past' ? 'sales_ended' : ce.status,\r\n\t\t\t\tslug: ce.slug,\r\n\t\t\t\ttimeZone: event.timezone,\r\n\t\t\t\tticketsRemaining: ce.ticketsRemaining,\r\n\t\t\t\tticketsTotal: ce.ticketsTotal,\r\n\t\t\t}))\r\n\t\t)\r\n\t);\r\n\r\n\tfunction handleCollectionEventClick(clicked: BrowseEvent) {\r\n\t\tconst out = { id: clicked.eventID, slug: clicked.slug ?? '' };\r\n\t\tif (onCollectionEventClickProp) {\r\n\t\t\tonCollectionEventClickProp(out);\r\n\t\t} else {\r\n\t\t\tlogger.info('Navigate to collection event:', out.slug);\r\n\t\t}\r\n\t}\r\n\r\n\t// --- Handlers ---\r\n\tfunction handleQuantityChange(ticketId: TicketId, qty: number) {\r\n\t\tquantities = { ...quantities, [ticketId]: qty };\r\n\t}\r\n\r\n\tfunction handleDonationChange(ticketId: TicketId, amount: string) {\r\n\t\tdonationAmounts = { ...donationAmounts, [ticketId]: amount };\r\n\t}\r\n\r\n\tfunction handleCheckout() {\r\n\t\tif (onCheckoutProp) {\r\n\t\t\tonCheckoutProp(orderTotals);\r\n\t\t} else {\r\n\t\t\t// @toast-escape: showcase-only fallback (no onCheckoutProp wired); toast used for dev visibility\r\n\t\t\tlogger.info('Checkout:', orderTotals);\r\n\t\t\tconst count = orderTotals.lines.reduce((s, l) => s + l.quantity, 0);\r\n\t\t\ttoast.info(`Proceeding to checkout with ${count} ticket(s) totaling $${orderTotals.total.toFixed(2)}`);\r\n\t\t}\r\n\t}\r\n\r\n\t// --- Promo handlers ---\r\n\t// Showcase test codes: REVEAL (unlocks hidden tickets), DISCOUNT10 (10% off), VIP20 ($20 off + reveal)\r\n\tfunction handlePromoApply(code: string) {\r\n\t\tif (onPromoApplyProp) {\r\n\t\t\t// Production mode: async API validation\r\n\t\t\tpromoState = { ...promoState, isValidating: true, error: '', hint: '' };\r\n\t\t\tonPromoApplyProp(code).then((result) => {\r\n\t\t\t\tpromoState = result;\r\n\t\t\t}).catch(() => {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\t...createDefaultPromoState(),\r\n\t\t\t\t\tcode: code.toUpperCase(),\r\n\t\t\t\t\terror: 'Failed to validate promo code'\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Showcase mode: mock validation\r\n\t\tconst upper = code.toUpperCase();\r\n\t\tpromoState = { ...promoState, isValidating: true, error: '', hint: '' };\r\n\r\n\t\t// Simulate async validation\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (upper === 'REVEAL') {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\tisApplied: true,\r\n\t\t\t\t\tisValidating: false,\r\n\t\t\t\t\terror: '',\r\n\t\t\t\t\thint: `${upper} applied. Hidden tickets are now visible.`,\r\n\t\t\t\t\tdiscountAmount: 0,\r\n\t\t\t\t\tdiscountType: '',\r\n\t\t\t\t\tdiscountTicketIds: [],\r\n\t\t\t\t\trevealHiddenTickets: true,\r\n\t\t\t\t\trevealTicketIds: []\r\n\t\t\t\t};\r\n\t\t\t} else if (upper === 'DISCOUNT10') {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\tisApplied: true,\r\n\t\t\t\t\tisValidating: false,\r\n\t\t\t\t\terror: '',\r\n\t\t\t\t\thint: `${upper} applied. 10% off all tickets.`,\r\n\t\t\t\t\tdiscountAmount: 10,\r\n\t\t\t\t\tdiscountType: '%',\r\n\t\t\t\t\tdiscountTicketIds: [],\r\n\t\t\t\t\trevealHiddenTickets: false,\r\n\t\t\t\t\trevealTicketIds: []\r\n\t\t\t\t};\r\n\t\t\t} else if (upper === 'VIP20') {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\tisApplied: true,\r\n\t\t\t\t\tisValidating: false,\r\n\t\t\t\t\terror: '',\r\n\t\t\t\t\thint: `${upper} applied. $20 off + hidden tickets revealed.`,\r\n\t\t\t\t\tdiscountAmount: 20,\r\n\t\t\t\t\tdiscountType: '$',\r\n\t\t\t\t\tdiscountTicketIds: [],\r\n\t\t\t\t\trevealHiddenTickets: true,\r\n\t\t\t\t\trevealTicketIds: []\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\tpromoState = {\r\n\t\t\t\t\t...createDefaultPromoState(),\r\n\t\t\t\t\tcode: upper,\r\n\t\t\t\t\terror: 'Invalid promo code'\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}, 800);\r\n\t}\r\n\r\n\tfunction handlePromoRemove() {\r\n\t\t// Always clean up hidden ticket quantities locally\r\n\t\tconst hiddenIds = event.tickets.filter((t) => t.isHidden).map((t) => t.id);\r\n\t\tconst newQuantities = { ...quantities };\r\n\t\tfor (const id of hiddenIds) {\r\n\t\t\tdelete newQuantities[id];\r\n\t\t}\r\n\t\tquantities = newQuantities;\r\n\t\tpromoState = createDefaultPromoState();\r\n\r\n\t\t// Notify production caller\r\n\t\tif (onPromoRemoveProp) {\r\n\t\t\tonPromoRemoveProp();\r\n\t\t}\r\n\t}\r\n\r\n\t// Compute per-ticket promo info\r\n\tfunction getTicketPromoInfo(ticketId: TicketId, ticket: { price: number; isDonation: boolean; isHidden: boolean; ticketType?: number }) {\r\n\t\tconst isDonation = ticket.isDonation || ticket.ticketType === 2;\r\n\t\tconst isRevealed = ticket.isHidden && (promoState.revealHiddenTickets || promoState.revealTicketIds.includes(ticketId));\r\n\r\n\t\tlet isDiscounted = false;\r\n\t\tlet discountedPrice: number | null = null;\r\n\r\n\t\tif (promoState.isApplied && promoState.discountAmount > 0 && !isDonation) {\r\n\t\t\tconst eligible = promoState.discountTicketIds.length === 0 || promoState.discountTicketIds.includes(ticketId);\r\n\t\t\tif (eligible) {\r\n\t\t\t\tisDiscounted = true;\r\n\t\t\t\tif (promoState.discountType === '%') {\r\n\t\t\t\t\tdiscountedPrice = ticket.price * (1 - promoState.discountAmount / 100);\r\n\t\t\t\t} else if (promoState.discountType === '$') {\r\n\t\t\t\t\tdiscountedPrice = Math.max(0, ticket.price - promoState.discountAmount);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn { isRevealed, isDiscounted, discountedPrice };\r\n\t}\r\n</script>\r\n\r\n<div class=\"w-full min-h-screen bg-surface-primary text-color-primary\">\r\n\t<div class=\"max-w-6xl mx-auto px-4 py-6 md:px-6 md:py-8\">\r\n\r\n\t\t<!-- Shared desktop content (rendered via snippet to avoid duplication) -->\r\n\t\t{#snippet desktopContent()}\r\n\t\t\t<!-- Hero image -->\r\n\t\t\t<HeroImage src={event.imageUrl} alt={event.title}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\r\n\t\t\t<!-- Event header (title, date, venue, stage, age, scarcity badge) -->\r\n\t\t\t<EventHeader {event} hideDateTime={isFullWidth} hideVenue={isCollection}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\r\n\t\t\t<!-- INLINE TICKET SELECTION (hidden for series/collection — no single-event tickets) -->\r\n\t\t\t{#if showTicketCards && !isFullWidth}\r\n\t\t\t\t<section id=\"ticket-section\">\r\n\t\t\t\t\t<Heading size=\"xl\" weight=\"semibold\" class=\"mb-4\">\r\n\t\t\t\t\t\t{isOnSale ? (labels.selectTickets || 'Select tickets') : (labels.ticketsTab || 'Tickets')}\r\n\t\t\t\t\t</Heading>\r\n\r\n\t\t\t\t\t{#if hasMultipleSections}\r\n\t\t\t\t\t\t<!-- Sectioned tickets -->\r\n\t\t\t\t\t\t{#each Object.entries(groupedTickets) as [sectionName, sectionTickets] (sectionName)}\r\n\t\t\t\t\t\t\t<div class=\"mb-6 last:mb-0\">\r\n\t\t\t\t\t\t\t\t{#if sectionName !== '_default'}\r\n\t\t\t\t\t\t\t\t\t<Heading level={3} size=\"sm\" weight=\"semibold\" class=\"mb-3\">\r\n\t\t\t\t\t\t\t\t\t\t{sectionName}\r\n\t\t\t\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t<!-- TODO: swap back to <Stack gap=\"3\"> once SC merges the\r\n\t\t\t\t\t\t\t\t ambiguous-Stack-export fix (see open issue). The root\r\n\t\t\t\t\t\t\t\t index.js does `export *` from both primitives/ and\r\n\t\t\t\t\t\t\t\t patterns/layout/, both of which contribute Stack, so\r\n\t\t\t\t\t\t\t\t the browser refuses to resolve `import { Stack }`. -->\r\n\t\t\t\t\t\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t\t\t\t\t\t{#each sectionTickets as ticket (ticket.id)}\r\n\t\t\t\t\t\t\t\t\t\t{@const promoInfo = getTicketPromoInfo(asTicketId(ticket.id), ticket)}\r\n\t\t\t\t\t\t\t\t\t\t<TicketCard\r\n\t\t\t\t\t\t\t\t\t\t\t{ticket}\r\n\t\t\t\t\t\t\t\t\t\t\tquantity={quantities[ticket.id] ?? 0}\r\n\t\t\t\t\t\t\t\t\t\t\tonQuantityChange={handleQuantityChange}\r\n\t\t\t\t\t\t\t\t\t\t\tdonationAmount={donationAmounts[ticket.id] ?? ''}\r\n\t\t\t\t\t\t\t\t\t\t\tonDonationChange={handleDonationChange}\r\n\t\t\t\t\t\t\t\t\t\t\tisRevealedByPromo={promoInfo.isRevealed}\r\n\t\t\t\t\t\t\t\t\t\t\tisDiscountedByPromo={promoInfo.isDiscounted}\r\n\t\t\t\t\t\t\t\t\t\t\tdiscountedPrice={promoInfo.discountedPrice}\r\n\t\t\t\t\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t<!-- Flat ticket list. Same TODO as the sectioned branch above:\r\n\t\t\t\t\t\t swap to <Stack gap=\"3\"> once SC's root index.js no longer\r\n\t\t\t\t\t\t star-exports Stack from two sibling trees. -->\r\n\t\t\t\t\t\t<div class=\"space-y-3\">\r\n\t\t\t\t\t\t\t{#each visibleTickets as ticket (ticket.id)}\r\n\t\t\t\t\t\t\t\t{@const promoInfo = getTicketPromoInfo(asTicketId(ticket.id), ticket)}\r\n\t\t\t\t\t\t\t\t<TicketCard\r\n\t\t\t\t\t\t\t\t\t{ticket}\r\n\t\t\t\t\t\t\t\t\tquantity={quantities[ticket.id] ?? 0}\r\n\t\t\t\t\t\t\t\t\tonQuantityChange={handleQuantityChange}\r\n\t\t\t\t\t\t\t\t\tdonationAmount={donationAmounts[ticket.id] ?? ''}\r\n\t\t\t\t\t\t\t\t\tonDonationChange={handleDonationChange}\r\n\t\t\t\t\t\t\t\t\tisRevealedByPromo={promoInfo.isRevealed}\r\n\t\t\t\t\t\t\t\t\tisDiscountedByPromo={promoInfo.isDiscounted}\r\n\t\t\t\t\t\t\t\t\tdiscountedPrice={promoInfo.discountedPrice}\r\n\t\t\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t<!-- Promo code input: only show when event is on sale -->\r\n\t\t\t\t\t{#if isOnSale}\r\n\t\t\t\t\t\t<PromoCodeInput\r\n\t\t\t\t\t\t\t{promoState}\r\n\t\t\t\t\t\t\tonApply={handlePromoApply}\r\n\t\t\t\t\t\t\tonRemove={handlePromoRemove}\r\n\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Showtimes (series — primary content, before About) -->\r\n\t\t\t{#if isSeries}\r\n\t\t\t\t<section>\r\n\t\t\t\t\t<Heading size=\"xl\" weight=\"semibold\" class=\"mb-4\">Upcoming Shows</Heading>\r\n\t\t\t\t\t<ShowtimeDesigns {event} onShowtimeClick={onShowtimeClickProp}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Collection: About goes above event widgets -->\r\n\t\t\t{#if isCollection}\r\n\t\t\t\t<AboutSection description={event.description}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Collection events grid (widgets) -->\r\n\t\t\t{#if isCollection}\r\n\t\t\t\t<section>\r\n\t\t\t\t\t<Heading size=\"xl\" weight=\"semibold\" class=\"mb-4\">Events</Heading>\r\n\t\t\t\t\t<Grid cols=\"auto\" minWidth=\"240px\" gap=\"6\">\r\n\t\t\t\t\t\t{#each collectionTeaserGroups as g (g.event.eventID)}\r\n\t\t\t\t\t\t\t<EventTeaser\r\n\t\t\t\t\t\t\t\tgrouped={g}\r\n\t\t\t\t\t\t\t\tlayout=\"vertical\"\r\n\t\t\t\t\t\t\t\tdensity=\"standard\"\r\n\t\t\t\t\t\t\t\toneventClick={handleCollectionEventClick}\r\n\t\t\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t</Grid>\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- About section (non-collection) -->\r\n\t\t\t{#if !isCollection}\r\n\t\t\t\t<AboutSection description={event.description}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Performers (hidden for series/collection) -->\r\n\t\t\t{#if !isFullWidth}\r\n\t\t\t\t<PerformerGrid performers={event.performers}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- FAQs (hidden for collection — FAQs are per-venue, not per-collection) -->\r\n\t\t\t{#if event.faqs.length > 0 && !isCollection}\r\n\t\t\t\t<FaqAccordion faqs={event.faqs}\r\n\t\t\t\tlabels={mergedLabels} />\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Disclaimer -->\r\n\t\t\t{#if event.disclaimer}\r\n\t\t\t\t<section class=\"pt-4 border-t border-default\">\r\n\t\t\t\t\t<Text size=\"xs\" color=\"muted\" leading=\"relaxed\" class=\"block\">\r\n\t\t\t\t\t\t{event.disclaimer}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t</section>\r\n\t\t\t{/if}\r\n\t\t{/snippet}\r\n\r\n\t\t<!-- ============================================== -->\r\n\t\t<!-- DESKTOP LAYOUT -->\r\n\t\t<!-- ============================================== -->\r\n\t\t{#if isFullWidth}\r\n\t\t\t<!-- Series/Collection: full-width single column (no sidebar) -->\r\n\t\t\t<div class=\"hidden md:block space-y-8\">\r\n\t\t\t\t{@render desktopContent()}\r\n\t\t\t</div>\r\n\t\t{:else}\r\n\t\t\t<!-- Regular: two-column Airbnb split (1fr 360px) -->\r\n\t\t\t<div class=\"hidden md:grid grid-cols-booking-split gap-8 items-start\">\r\n\t\t\t\t<div class=\"space-y-8\">\r\n\t\t\t\t\t{@render desktopContent()}\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"sticky top-6\">\r\n\t\t\t\t\t<BookingWidget\r\n\t\t\t\t\t\t{event}\r\n\t\t\t\t\t\t{orderTotals}\r\n\t\t\t\t\t\t{hasSelectedTickets}\r\n\t\t\t\t\t\tonCheckout={handleCheckout}\r\n\t\t\t\t\t\tpromoApplied={promoState.isApplied}\r\n\t\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- ============================================== -->\r\n\t\t<!-- MOBILE: Single column with fixed bottom CTA -->\r\n\t\t<!-- ============================================== -->\r\n\t\t<div class=\"md:hidden space-y-6\" class:pb-24={!isFullWidth}>\r\n\t\t\t{@render desktopContent()}\r\n\t\t</div>\r\n\r\n\t\t<!-- Mobile: Fixed bottom CTA bar (DICE-style) — hidden for series/collection -->\r\n\t\t{#if !isFullWidth}\r\n\t\t\t<div class=\"md:hidden\">\r\n\t\t\t\t<MobileCta\r\n\t\t\t\t\t{event}\r\n\t\t\t\t\t{orderTotals}\r\n\t\t\t\t\t{hasSelectedTickets}\r\n\t\t\t\t\tonCheckout={handleCheckout}\r\n\t\t\t\t\tlabels={mergedLabels}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t</div>\r\n</div>\r\n\r\n"],"names":["gapScale","gapMap","cols","gap","minWidth","as","className","colsMap","gridStyle","$","classes","$$element","$$anchor","$$props","div","root","img","img_1","hideDateTime","hideVenue","scarcityLevel","getScarcityLevel","scarcityText","getScarcityText","ageText","shareEvent","url","shareData","err","fallbackShare","toast","div_1","Heading","node","ScarcityBadge","$$render","consequent","Button","node_2","Share","div_2","fragment_3","Calendar","span","node_5","div_3","root_5","Time","div_4","node_7","span_1","root_6","formatTimeRange","span_2","root_7","formatEventTime","consequent_1","alternate","span_3","root_8","formatDoorsTime","consequent_2","div_5","root_9","span_4","node_10","consequent_3","consequent_4","formatFullDateCompact","consequent_5","div_6","fragment_4","Location","div_7","node_12","span_5","span_6","root_11","text_7","consequent_6","div_8","root_12","Theater","span_7","node_15","consequent_7","div_9","root_13","User","span_8","node_17","consequent_8","text_6","consequent_9","tick","style","ms","donationAmount","isRevealedByPromo","isDiscountedByPromo","discountedPrice","labels","isDonation","isSoldOut","isComingSoon","isSalesEnded","isDisabled","donationValue","donationError","isDonationValid","canDecrement","canIncrement","decrement","newQty","asTicketId","increment","donationInputValue","syncDonation","totalPrice","priceDisplay","feeCaption","salesStartDisplay","formatSmartSalesDate","article","Badge","Text","Input","node_4","$$value","discountedTotal","fragment_9","root_15","formatCurrency","root_16","fragment_10","root_18","consequent_10","consequent_11","node_9","Subtract","Add","consequent_12","alternate_1","DURATION","promoApplied","ctaConfig","getCtaConfig","getPriceDisplay","isFreeEvent","t","scrollToTickets","section","Card","root_2","OrderSummary","node_1","node_3","$0","text_1","root_10","formatBrowseDate","root_14","node_13","root_17","node_14","text_8","node_16","text_9","alternate_2","alternate_3","paragraphs","p","Section","root_1","paragraph","performer","$1","Avatar","text","Accordion","faq","AccordionItem","totalTicketCount","sum","l","mode","prevModeForHaptic","PEEK_H","bodyEl","viewportH","sync","openHeight","measure","innerH","total","ro","inner","sections","handleBarClick","handleDrawerCheckout","closeDrawer","ticketsLabel","n","dragStartY","dragStartHeight","dragDeltaY","isDragging","pointerId","dragTarget","history","recordSample","y","computeVelocity","first","last","dt","handlePointerDown","e","body","handlePointerMove","dy","RUBBER_RESISTANCE","MAX_OVERSHOOT","rawHeight","finalHeight","overshoot","handlePointerUp","v","FLICK_VELOCITY","POSITION_THRESHOLD","handlePointerCancel","liveHeight","revealProgress","range","text_2","text_4","fragment_13","styles_1","classes_1","styles","$$args","isExpanded","inputValue","handleApply","trimmed","handleRemove","handleKeydown","shouldExpand","root_3","$2","$3","onShowtimeClick","groupedOccurrences","groups","occ","dateKey","g","handleShowtimeClick","group","TEASER_DENSITY","layout","density","showDescription","hideDate","event","token","browseStatus","getSeriesBrowseStatus","getBrowseStatus","isEventUnavailable","eventHref","buildEventHref","titleId","allowDescription","allowDate","visibleInstances","ariaLabel","parts","onPillClick","instance","BlurBackdropImage","PLACEHOLDER_IMAGE","header","h3","badgeVariant","a","time","root_4","instStatus","instSoldOut","node_6","text_5","logger","createLogger","onCheckoutProp","onPromoApplyProp","onPromoRemoveProp","onCollectionEventClickProp","onShowtimeClickProp","mergedLabels","mergeLabels","quantities","promoState","createDefaultPromoState","donationAmounts","visibleTickets","groupedTickets","ticket","hasMultipleSections","k","isOnSale","showTicketCards","orderTotals","lines","subtotal","fees","promoDiscount","qty","basePrice","ticketFee","ticketDiscount","effectivePrice","ticketSubtotal","totalTicketFee","taxes","calculateTax","hasSelectedTickets","isSeries","isCollection","isFullWidth","collectionTeaserGroups","groupEventsBySeries","ce","handleCollectionEventClick","clicked","out","handleQuantityChange","ticketId","handleDonationChange","amount","handleCheckout","count","s","handlePromoApply","code","result","upper","handlePromoRemove","hiddenIds","newQuantities","id","getTicketPromoInfo","isRevealed","isDiscounted","desktopContent","HeroImage","EventHeader","section_1","sectionName","sectionTickets","$$item","$$array","promoInfo","TicketCard","PromoCodeInput","section_2","ShowtimeDesigns","AboutSection","section_3","Grid","EventTeaser","PerformerGrid","FaqAccordion","section_4","root_22","node_20","root_24","node_22","root_25","node_23","BookingWidget","node_24","node_21","node_25","div_10","root_26","MobileCta","node_27"],"mappings":"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","x_google_ignoreList":[0,1]}
|