@getmicdrop/venue-calendar 4.0.125 → 4.0.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CartView-B9aFeiLN.js +2509 -0
- package/dist/CartView-B9aFeiLN.js.map +1 -0
- package/dist/Checkout-48xwm6As.js +4162 -0
- package/dist/Checkout-48xwm6As.js.map +1 -0
- package/dist/Checkout-BVgVrBY9.js +1854 -0
- package/dist/Checkout-BVgVrBY9.js.map +1 -0
- package/dist/CheckoutTimer-BhCgZiZx.js +147 -0
- package/dist/CheckoutTimer-BhCgZiZx.js.map +1 -0
- package/dist/{ClockIcon-DUp81xG2.js → ClockIcon-CbNo7ZIv.js} +2 -2
- package/dist/{ClockIcon-DUp81xG2.js.map → ClockIcon-CbNo7ZIv.js.map} +1 -1
- package/dist/{CollectionView-Da8CtR_v.js → CollectionView-C8-jKGCR.js} +73 -64
- package/dist/CollectionView-C8-jKGCR.js.map +1 -0
- package/dist/{Event-Dar8qTBL.js → Event-D9bFJ0Ad.js} +1483 -1530
- package/dist/{Event-Dar8qTBL.js.map → Event-D9bFJ0Ad.js.map} +1 -1
- package/dist/EventPage-Dr0IT4V9.js +987 -0
- package/dist/EventPage-Dr0IT4V9.js.map +1 -0
- package/dist/{Heading-Ct46UKqZ.js → Heading-W0r66xC8.js} +4 -4
- package/dist/{Heading-Ct46UKqZ.js.map → Heading-W0r66xC8.js.map} +1 -1
- package/dist/{ScarcityBadge-CLGfFdip.js → ScarcityBadge-D-FV75Zp.js} +12 -12
- package/dist/{ScarcityBadge-CLGfFdip.js.map → ScarcityBadge-D-FV75Zp.js.map} +1 -1
- package/dist/{SeriesPage-Domli2DO.js → SeriesPage-BQVJzHqW.js} +9 -9
- package/dist/{SeriesPage-Domli2DO.js.map → SeriesPage-BQVJzHqW.js.map} +1 -1
- package/dist/{Spinner-hHCfLq0h.js → Spinner-BCYe2kk8.js} +2 -2
- package/dist/{Spinner-hHCfLq0h.js.map → Spinner-BCYe2kk8.js.map} +1 -1
- package/dist/{Success-UXcETPIK.js → Success-zPOifwK_.js} +129 -124
- package/dist/Success-zPOifwK_.js.map +1 -0
- package/dist/{Text-VgIrXS47.js → Text-DZBYT4iQ.js} +19 -19
- package/dist/{Text-VgIrXS47.js.map → Text-DZBYT4iQ.js.map} +1 -1
- package/dist/{VenueCalendar-jQ0Aqqfg.js → VenueCalendar-759NANbc.js} +5015 -4436
- package/dist/VenueCalendar-759NANbc.js.map +1 -0
- package/dist/{ViewTicketsEmbed-DbPq0_bS.js → ViewTicketsEmbed-DvT73NsI.js} +5 -5
- package/dist/{ViewTicketsEmbed-DbPq0_bS.js.map → ViewTicketsEmbed-DvT73NsI.js.map} +1 -1
- package/dist/api/api.cjs +1 -1
- package/dist/api/api.cjs.map +1 -1
- package/dist/api/api.mjs +14 -3
- package/dist/api/api.mjs.map +1 -1
- package/dist/{labels-sHSRa0-J.js → labels-BZI8MJxH.js} +286 -234
- package/dist/labels-BZI8MJxH.js.map +1 -0
- package/dist/{modalManager.svelte-D3qpQ7Uc.js → modalManager.svelte-BXQjP4sY.js} +2 -2
- package/dist/{modalManager.svelte-D3qpQ7Uc.js.map → modalManager.svelte-BXQjP4sY.js.map} +1 -1
- package/dist/{promo-CQWo5Cx1.js → promo-Cmms6651.js} +2 -2
- package/dist/{promo-CQWo5Cx1.js.map → promo-Cmms6651.js.map} +1 -1
- package/dist/seo/seo.cjs +1 -1
- package/dist/seo/seo.cjs.map +1 -1
- package/dist/seo/seo.mjs +5 -2
- package/dist/seo/seo.mjs.map +1 -1
- package/dist/shareCopyFeedback.svelte-Cade1Zzk.js +114 -0
- package/dist/shareCopyFeedback.svelte-Cade1Zzk.js.map +1 -0
- package/dist/{showcase-state-options-DbyTvFOY.js → showcase-state-options-DjWk_E2A.js} +57 -80
- package/dist/showcase-state-options-DjWk_E2A.js.map +1 -0
- package/dist/transform-KCOEf0qs.js +271 -0
- package/dist/transform-KCOEf0qs.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/{utm-CJgBRDqR.js → utm-BFAXxrou.js} +2 -2
- package/dist/utm-BFAXxrou.js.map +1 -0
- package/dist/venue-calendar.css +1 -1
- package/dist/venue-calendar.es.js +6 -6
- package/dist/venue-calendar.iife.js +115 -52
- package/dist/venue-calendar.iife.js.map +1 -1
- package/dist/venue-calendar.umd.js +108 -45
- package/dist/venue-calendar.umd.js.map +1 -1
- package/package.json +18 -6
- package/dist/CartView-CzHz504D.js +0 -2474
- package/dist/CartView-CzHz504D.js.map +0 -1
- package/dist/Checkout-DR_Utigo.js +0 -1062
- package/dist/Checkout-DR_Utigo.js.map +0 -1
- package/dist/Checkout-rsrsQdGd.js +0 -1731
- package/dist/Checkout-rsrsQdGd.js.map +0 -1
- package/dist/CheckoutTimer-DpOaUXJL.js +0 -141
- package/dist/CheckoutTimer-DpOaUXJL.js.map +0 -1
- package/dist/CollectionView-Da8CtR_v.js.map +0 -1
- package/dist/EventPage-CteVMZby.js +0 -995
- package/dist/EventPage-CteVMZby.js.map +0 -1
- package/dist/Success-UXcETPIK.js.map +0 -1
- package/dist/VenueCalendar-jQ0Aqqfg.js.map +0 -1
- package/dist/labels-sHSRa0-J.js.map +0 -1
- package/dist/showcase-state-options-DbyTvFOY.js.map +0 -1
- package/dist/transform-ChAUdz2-.js +0 -364
- package/dist/transform-ChAUdz2-.js.map +0 -1
- package/dist/utm-CJgBRDqR.js.map +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import "svelte/internal/disclose-version";
|
|
2
|
+
import * as e from "svelte/internal/client";
|
|
3
|
+
import { u as g } from "./VenueCalendar-759NANbc.js";
|
|
4
|
+
var h = e.from_svg('<path d="M216,112v96a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V112A16,16,0,0,1,56,96h64v48a8,8,0,0,0,16,0V96h64A16,16,0,0,1,216,112ZM136,43.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,69.66L120,43.31V96h16Z"></path>'), m = e.from_svg('<path d="M176,104h24a8,8,0,0,1,8,8v96a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V112a8,8,0,0,1,8-8H80" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></path><polyline points="88 64 128 24 168 64" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="128" y1="24" x2="128" y2="136" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line>', 1), y = e.from_svg('<svg aria-hidden="true" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><!></svg>');
|
|
5
|
+
function E(r, t) {
|
|
6
|
+
e.push(t, !0);
|
|
7
|
+
let o = e.prop(t, "size", 3, "24"), c = e.prop(t, "color", 3, "currentColor"), a = e.prop(t, "class", 3, "");
|
|
8
|
+
const l = g();
|
|
9
|
+
let s = e.derived(() => t.weight ?? l?.weight ?? "regular");
|
|
10
|
+
var n = y();
|
|
11
|
+
let u;
|
|
12
|
+
var p = e.child(n);
|
|
13
|
+
{
|
|
14
|
+
var f = (i) => {
|
|
15
|
+
var d = h();
|
|
16
|
+
e.append(i, d);
|
|
17
|
+
}, v = (i) => {
|
|
18
|
+
var d = m();
|
|
19
|
+
e.next(2), e.append(i, d);
|
|
20
|
+
};
|
|
21
|
+
e.if(p, (i) => {
|
|
22
|
+
e.get(s) === "fill" ? i(f) : i(v, -1);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
e.reset(n), e.template_effect(() => {
|
|
26
|
+
e.set_class(n, 0, e.clsx(a())), e.set_attribute(n, "width", o()), e.set_attribute(n, "height", o()), u = e.set_style(n, "", u, { color: c() });
|
|
27
|
+
}), e.append(r, n), e.pop();
|
|
28
|
+
}
|
|
29
|
+
var w = e.from_svg('<path d="M128,16a88.1,88.1,0,0,0-88,88c0,75.3,80,132.17,83.41,134.55a8,8,0,0,0,9.18,0C136,236.17,216,179.3,216,104A88.1,88.1,0,0,0,128,16Zm0,56a32,32,0,1,1-32,32A32,32,0,0,1,128,72Z"></path>'), x = e.from_svg('<circle cx="128" cy="104" r="32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></circle><path d="M208,104c0,72-80,128-80,128S48,176,48,104a80,80,0,0,1,160,0Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></path>', 1), k = e.from_svg('<svg aria-hidden="true" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><!></svg>');
|
|
30
|
+
function R(r, t) {
|
|
31
|
+
e.push(t, !0);
|
|
32
|
+
let o = e.prop(t, "size", 3, "24"), c = e.prop(t, "color", 3, "currentColor"), a = e.prop(t, "class", 3, "");
|
|
33
|
+
const l = g();
|
|
34
|
+
let s = e.derived(() => t.weight ?? l?.weight ?? "regular");
|
|
35
|
+
var n = k();
|
|
36
|
+
let u;
|
|
37
|
+
var p = e.child(n);
|
|
38
|
+
{
|
|
39
|
+
var f = (i) => {
|
|
40
|
+
var d = w();
|
|
41
|
+
e.append(i, d);
|
|
42
|
+
}, v = (i) => {
|
|
43
|
+
var d = x();
|
|
44
|
+
e.next(), e.append(i, d);
|
|
45
|
+
};
|
|
46
|
+
e.if(p, (i) => {
|
|
47
|
+
e.get(s) === "fill" ? i(f) : i(v, -1);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
e.reset(n), e.template_effect(() => {
|
|
51
|
+
e.set_class(n, 0, e.clsx(a())), e.set_attribute(n, "width", o()), e.set_attribute(n, "height", o()), u = e.set_style(n, "", u, { color: c() });
|
|
52
|
+
}), e.append(r, n), e.pop();
|
|
53
|
+
}
|
|
54
|
+
async function _(r) {
|
|
55
|
+
if (typeof navigator < "u" && navigator.clipboard && typeof navigator.clipboard.writeText == "function")
|
|
56
|
+
try {
|
|
57
|
+
return await navigator.clipboard.writeText(r), !0;
|
|
58
|
+
} catch {
|
|
59
|
+
}
|
|
60
|
+
return C(r);
|
|
61
|
+
}
|
|
62
|
+
function C(r) {
|
|
63
|
+
if (typeof document > "u" || typeof document.execCommand != "function")
|
|
64
|
+
return !1;
|
|
65
|
+
const t = document.activeElement, o = document.getSelection(), c = o ? Array.from({ length: o.rangeCount }, (l, s) => o.getRangeAt(s).cloneRange()) : [], a = document.createElement("textarea");
|
|
66
|
+
try {
|
|
67
|
+
return a.value = r, a.setAttribute("readonly", ""), a.style.position = "fixed", a.style.top = "-9999px", a.style.left = "-9999px", a.style.opacity = "0", document.body.appendChild(a), a.select(), a.setSelectionRange(0, r.length), document.execCommand("copy");
|
|
68
|
+
} catch {
|
|
69
|
+
return !1;
|
|
70
|
+
} finally {
|
|
71
|
+
if (a.remove(), o) {
|
|
72
|
+
o.removeAllRanges();
|
|
73
|
+
for (const l of c)
|
|
74
|
+
o.addRange(l);
|
|
75
|
+
}
|
|
76
|
+
t?.focus?.();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function b(r) {
|
|
80
|
+
if (typeof navigator < "u" && typeof navigator.share == "function")
|
|
81
|
+
try {
|
|
82
|
+
return await navigator.share({ url: r }), "shared";
|
|
83
|
+
} catch (t) {
|
|
84
|
+
if (t?.name === "AbortError")
|
|
85
|
+
return "shared";
|
|
86
|
+
}
|
|
87
|
+
return await _(r) ? "copied" : "failed";
|
|
88
|
+
}
|
|
89
|
+
function S() {
|
|
90
|
+
let r = e.state("idle"), t = e.state(""), o;
|
|
91
|
+
async function c(l) {
|
|
92
|
+
const s = await b(l);
|
|
93
|
+
s === "copied" ? (e.set(t, ""), e.set(r, "copied"), clearTimeout(o), o = setTimeout(() => e.set(r, "idle"), 2500)) : s === "failed" && (clearTimeout(o), e.set(r, "failed"), e.set(t, l, !0));
|
|
94
|
+
}
|
|
95
|
+
function a() {
|
|
96
|
+
clearTimeout(o);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
get copyState() {
|
|
100
|
+
return e.get(r);
|
|
101
|
+
},
|
|
102
|
+
get copyFailedUrl() {
|
|
103
|
+
return e.get(t);
|
|
104
|
+
},
|
|
105
|
+
share: c,
|
|
106
|
+
dispose: a
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
E,
|
|
111
|
+
R as L,
|
|
112
|
+
S as c
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=shareCopyFeedback.svelte-Cade1Zzk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shareCopyFeedback.svelte-Cade1Zzk.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/phosphor/ExportIcon.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/phosphor/LocationIcon.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/copyToClipboard.js","../src/lib/public-calendar-flow/shareEventLink.ts","../src/lib/public-calendar-flow/shareCopyFeedback.svelte.ts"],"sourcesContent":["<script lang=\"ts\">\r\n /**\r\n * Export — Phosphor icon (canonical Micdrop icon family).\r\n * Outline by default; pass `weight=\"fill\"` for solid, or let a stateful parent\r\n * (NavItem / Tabs / BottomNav / status badge) drive it via icon-weight context.\r\n */\r\n import { useIconWeight, type IconWeight } from './iconWeight.js';\r\n\r\n interface Props {\r\n /** Pixel size (width + height). */\r\n size?: string;\r\n /** Icon color; defaults to `currentColor` (inherits text color). */\r\n color?: string;\r\n /** Extra classes. */\r\n class?: string;\r\n /** `regular` (outline) or `fill` (solid). Overrides ambient state weight. */\r\n weight?: IconWeight;\r\n }\r\n\r\n let { size = '24', color = 'currentColor', class: className = '', weight }: Props = $props();\r\n\r\n const ctx = useIconWeight();\r\n let resolved: IconWeight = $derived(weight ?? ctx?.weight ?? 'regular');\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 256 256\"\r\n fill=\"currentColor\"\r\n style:color={color}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n {#if resolved === 'fill'}<path d=\"M216,112v96a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V112A16,16,0,0,1,56,96h64v48a8,8,0,0,0,16,0V96h64A16,16,0,0,1,216,112ZM136,43.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,69.66L120,43.31V96h16Z\"/>{:else}<path d=\"M176,104h24a8,8,0,0,1,8,8v96a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V112a8,8,0,0,1,8-8H80\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><polyline points=\"88 64 128 24 168 64\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"128\" y1=\"24\" x2=\"128\" y2=\"136\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>{/if}\r\n</svg>\r\n","<script lang=\"ts\">\r\n /**\r\n * Location — Phosphor icon (canonical Micdrop icon family).\r\n * Outline by default; pass `weight=\"fill\"` for solid, or let a stateful parent\r\n * (NavItem / Tabs / BottomNav / status badge) drive it via icon-weight context.\r\n */\r\n import { useIconWeight, type IconWeight } from './iconWeight.js';\r\n\r\n interface Props {\r\n /** Pixel size (width + height). */\r\n size?: string;\r\n /** Icon color; defaults to `currentColor` (inherits text color). */\r\n color?: string;\r\n /** Extra classes. */\r\n class?: string;\r\n /** `regular` (outline) or `fill` (solid). Overrides ambient state weight. */\r\n weight?: IconWeight;\r\n }\r\n\r\n let { size = '24', color = 'currentColor', class: className = '', weight }: Props = $props();\r\n\r\n const ctx = useIconWeight();\r\n let resolved: IconWeight = $derived(weight ?? ctx?.weight ?? 'regular');\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 256 256\"\r\n fill=\"currentColor\"\r\n style:color={color}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n {#if resolved === 'fill'}<path d=\"M128,16a88.1,88.1,0,0,0-88,88c0,75.3,80,132.17,83.41,134.55a8,8,0,0,0,9.18,0C136,236.17,216,179.3,216,104A88.1,88.1,0,0,0,128,16Zm0,56a32,32,0,1,1-32,32A32,32,0,0,1,128,72Z\"/>{:else}<circle cx=\"128\" cy=\"104\" r=\"32\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M208,104c0,72-80,128-80,128S48,176,48,104a80,80,0,0,1,160,0Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>{/if}\r\n</svg>\r\n","/**\n * Copy-to-clipboard utility — resolves `true` ONLY on a real successful write.\n *\n * The whole point of this canonical: callers fire their own \"Copied!\" toast\n * ONLY when this resolves `true`. It NEVER resolves `true` unless the text\n * actually landed on the clipboard, so a permission-denied / insecure-context /\n * no-API failure can no longer masquerade as success — killing the \"lying\n * toast\" bug where a button claimed it copied when nothing was copied.\n *\n * Strategy (best → fallback, never throws):\n * 1. Async Clipboard API (`navigator.clipboard.writeText`) when available\n * (secure context, granted permission) — AWAITED; resolves `true` only\n * when that promise resolves. On rejection it falls through (2) rather\n * than reporting success.\n * 2. Legacy `document.execCommand('copy')` for older / insecure (non-HTTPS)\n * contexts — returns its REAL success boolean.\n * 3. `false` on any failure (rejected write, no clipboard API, no DOM,\n * thrown exception).\n *\n * @param text - The text to place on the clipboard.\n * @returns Promise resolving `true` iff the write actually succeeded, else `false`.\n *\n * @example\n * if (await copyToClipboard(shareUrl)) toast.success('Link copied');\n * else toast.error(\"Couldn't copy — try selecting and copying manually\");\n */\nexport async function copyToClipboard(text) {\n // 1. Async Clipboard API — preferred; only present in secure contexts.\n if (typeof navigator !== 'undefined' &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n }\n catch {\n // Permission denied / insecure context / transient failure — do NOT\n // report success. Fall through to the legacy path and let it decide.\n }\n }\n // 2. Legacy execCommand fallback — older browsers / insecure (non-HTTPS).\n return copyViaExecCommand(text);\n}\n/**\n * Legacy `document.execCommand('copy')` path. Returns its real success boolean\n * and never throws. Used when the async Clipboard API is unavailable or its\n * write rejected.\n *\n * @param text - The text to copy.\n * @returns `true` iff `execCommand('copy')` reported success.\n */\nfunction copyViaExecCommand(text) {\n if (typeof document === 'undefined' ||\n typeof document.execCommand !== 'function') {\n return false;\n }\n // Preserve what the user had selected/focused — selecting our textarea would\n // otherwise blow away their current selection (e.g. text they were copying by hand).\n const prevActive = document.activeElement;\n const selection = document.getSelection();\n const savedRanges = selection\n ? Array.from({ length: selection.rangeCount }, (_, i) => selection.getRangeAt(i).cloneRange())\n : [];\n const textarea = document.createElement('textarea');\n try {\n textarea.value = text;\n // Read-only + off-screen so it never flashes, scrolls, or steals focus.\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.top = '-9999px';\n textarea.style.left = '-9999px';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n textarea.setSelectionRange(0, text.length);\n return document.execCommand('copy');\n }\n catch {\n return false;\n }\n finally {\n textarea.remove();\n // Restore the user's prior selection + focus, on success AND failure.\n if (selection) {\n selection.removeAllRanges();\n for (const range of savedRanges)\n selection.addRange(range);\n }\n prevActive?.focus?.();\n }\n}\n","import { copyToClipboard } from '@getmicdrop/svelte-components';\r\n\r\n/**\r\n * Outcome of a share attempt, mapped by the caller to its own inline feedback.\r\n *\r\n * - `shared` — the native share sheet handled it (or the user cancelled). No\r\n * inline feedback: the OS UI already spoke, and a cancel must stay quiet.\r\n * - `copied` — the link landed on the clipboard via the SC canonical.\r\n * - `failed` — the clipboard write was blocked; surface the URL for manual copy.\r\n */\r\nexport type ShareLinkResult = 'shared' | 'copied' | 'failed';\r\n\r\n/**\r\n * Share-link decision — the ONE copy of the native-share/clipboard logic that\r\n * used to be duplicated across the event header and the confirmation sidebar.\r\n *\r\n * 1. Native share sheet when the browser exposes `navigator.share`. A user\r\n * cancel (AbortError) ends quietly — returns `shared`, no fallback.\r\n * 2. Otherwise (no share API, or a non-cancel share failure) copy the URL via\r\n * the SC canonical `copyToClipboard`, which resolves `true` ONLY on a real\r\n * write and falls back to `execCommand` on the insecure (http embed) hosts\r\n * where the async Clipboard API is unavailable — the exact context the old\r\n * raw `navigator.clipboard.writeText` threw in.\r\n *\r\n * VC has no toasts (standalone embeddable widget, no Toaster mounted), so this\r\n * returns a result the caller renders inline rather than firing feedback here.\r\n *\r\n * @param url - The link to share.\r\n */\r\nexport async function shareEventLink(url: string): Promise<ShareLinkResult> {\r\n if (\r\n typeof navigator !== 'undefined' &&\r\n typeof navigator.share === 'function'\r\n ) {\r\n try {\r\n await navigator.share({ url });\r\n return 'shared';\r\n } catch (err: unknown) {\r\n // User dismissed the share sheet — leave it there, no fallback. Browsers\r\n // reject with a DOMException named 'AbortError', and DOMException is NOT\r\n // `instanceof Error`, so match on the name alone (not the prototype).\r\n if ((err as { name?: string } | null)?.name === 'AbortError') {\r\n return 'shared';\r\n }\r\n // Any other failure falls through to the clipboard fallback below.\r\n }\r\n }\r\n\r\n return (await copyToClipboard(url)) ? 'copied' : 'failed';\r\n}\r\n","import { shareEventLink } from '$lib/public-calendar-flow/shareEventLink';\r\n\r\n/**\r\n * Share-link copy feedback — the ONE copy of the inline state machine that used\r\n * to be hand-rolled identically in the event header and the confirmation\r\n * sidebar. It owns the reactive `copyState`/`copyFailedUrl` and the reset timer,\r\n * delegating the native-share/clipboard decision to `shareEventLink`.\r\n *\r\n * VC has no toasts, so feedback is inline: `copied` briefly swaps the button\r\n * label, `failed` reveals the URL for manual copy. Native share (or a user\r\n * cancel) leaves the state untouched — the OS UI already spoke.\r\n *\r\n * Call `dispose()` from the consumer's `onDestroy` to clear the pending timer.\r\n */\r\nexport function createShareCopyFeedback() {\r\n let copyState = $state<'idle' | 'copied' | 'failed'>('idle');\r\n let copyFailedUrl = $state('');\r\n let resetTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n async function share(url: string) {\r\n const result = await shareEventLink(url);\r\n if (result === 'copied') {\r\n copyFailedUrl = '';\r\n copyState = 'copied';\r\n clearTimeout(resetTimer);\r\n resetTimer = setTimeout(() => (copyState = 'idle'), 2500);\r\n } else if (result === 'failed') {\r\n // Copy blocked — reveal the URL inline so the buyer can select it manually.\r\n clearTimeout(resetTimer);\r\n copyState = 'failed';\r\n copyFailedUrl = url;\r\n }\r\n // 'shared' → native sheet handled it (or user cancelled); no inline feedback.\r\n }\r\n\r\n function dispose() {\r\n clearTimeout(resetTimer);\r\n }\r\n\r\n return {\r\n get copyState() {\r\n return copyState;\r\n },\r\n get copyFailedUrl() {\r\n return copyFailedUrl;\r\n },\r\n share,\r\n dispose,\r\n };\r\n}\r\n"],"names":["size","$","$$props","color","className","ctx","useIconWeight","resolved","svg","root_2","path","root","$$render","consequent","alternate","styles","copyToClipboard","text","copyViaExecCommand","prevActive","selection","savedRanges","_","i","textarea","range","shareEventLink","url","err","createShareCopyFeedback","copyState","copyFailedUrl","resetTimer","share","result","dispose"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import * as
|
|
3
|
-
function e(n, s,
|
|
4
|
-
const o = /* @__PURE__ */ new Date(),
|
|
1
|
+
import { aR as D, T as w } from "./VenueCalendar-759NANbc.js";
|
|
2
|
+
import * as a from "svelte/internal/client";
|
|
3
|
+
function e(n, s, p = 0) {
|
|
4
|
+
const o = /* @__PURE__ */ new Date(), f = (5 - o.getUTCDay() + 7) % 7 || 7, r = new Date(
|
|
5
|
+
// @datetime-escape: mock/demo fixture data — not a live datetime path
|
|
5
6
|
Date.UTC(o.getUTCFullYear(), o.getUTCMonth(), o.getUTCDate())
|
|
6
7
|
);
|
|
7
|
-
r.setUTCDate(r.getUTCDate() +
|
|
8
|
-
const
|
|
9
|
-
return `${
|
|
8
|
+
r.setUTCDate(r.getUTCDate() + f + n);
|
|
9
|
+
const h = r.getUTCFullYear(), g = String(r.getUTCMonth() + 1).padStart(2, "0"), y = String(r.getUTCDate()).padStart(2, "0"), T = String(s).padStart(2, "0"), b = String(p).padStart(2, "0");
|
|
10
|
+
return `${h}-${g}-${y}T${T}:${b}:00-08:00`;
|
|
10
11
|
}
|
|
11
|
-
function
|
|
12
|
+
function u(n) {
|
|
12
13
|
return e(n, 0).slice(0, 10);
|
|
13
14
|
}
|
|
14
|
-
const
|
|
15
|
+
const v = {
|
|
15
16
|
id: 101,
|
|
16
17
|
name: "The Laugh Factory",
|
|
17
18
|
address: "8001 Sunset Blvd, Los Angeles, CA 90046",
|
|
18
|
-
timezone:
|
|
19
|
+
timezone: w(),
|
|
19
20
|
serviceFeePercentage: 10,
|
|
20
21
|
serviceFeeCents: 0,
|
|
21
22
|
taxPercentage: 9.5,
|
|
22
23
|
contactEmail: "help@thelaughfactory.com"
|
|
23
|
-
},
|
|
24
|
+
}, P = [
|
|
24
25
|
{
|
|
25
26
|
id: 1,
|
|
26
27
|
displayName: "Dave Martinez",
|
|
@@ -36,7 +37,7 @@ const k = {
|
|
|
36
37
|
displayName: "Mike Thompson",
|
|
37
38
|
profileImage: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&h=200&fit=crop"
|
|
38
39
|
}
|
|
39
|
-
],
|
|
40
|
+
], k = [
|
|
40
41
|
{
|
|
41
42
|
question: "What time do doors open?",
|
|
42
43
|
answer: "Doors open at 7:00 PM, one hour before showtime. We recommend arriving early to get the best seats."
|
|
@@ -53,7 +54,7 @@ const k = {
|
|
|
53
54
|
question: "Is the venue accessible?",
|
|
54
55
|
answer: "Yes, the venue is fully wheelchair accessible with ADA-compliant seating available. Please contact us to reserve accessible seating."
|
|
55
56
|
}
|
|
56
|
-
],
|
|
57
|
+
], m = [
|
|
57
58
|
{
|
|
58
59
|
id: 101,
|
|
59
60
|
name: "General Admission",
|
|
@@ -196,7 +197,7 @@ const k = {
|
|
|
196
197
|
isDonation: !1,
|
|
197
198
|
isHidden: !1
|
|
198
199
|
}
|
|
199
|
-
], l = /* @__PURE__ */ new Date(), c = new Date(l.getFullYear(), l.getMonth(), l.getDate() + 21), d = `${c.getFullYear()}-${String(c.getMonth() + 1).padStart(2, "0")}-${String(c.getDate()).padStart(2, "0")}`,
|
|
200
|
+
], l = /* @__PURE__ */ new Date(), c = new Date(l.getFullYear(), l.getMonth(), l.getDate() + 21), d = `${c.getFullYear()}-${String(c.getMonth() + 1).padStart(2, "0")}-${String(c.getDate()).padStart(2, "0")}`, i = {
|
|
200
201
|
id: 2405,
|
|
201
202
|
title: "Friday Night Comedy Throwdown",
|
|
202
203
|
slug: "friday-night-comedy-throwdown",
|
|
@@ -212,10 +213,10 @@ Whether you're a comedy regular or a first-timer, this show delivers. Grab your
|
|
|
212
213
|
timezone: D,
|
|
213
214
|
imageUrl: "/posters/Friday Night Showdown.jpg",
|
|
214
215
|
// wide landscape 800×400
|
|
215
|
-
venue:
|
|
216
|
-
performers:
|
|
217
|
-
tickets:
|
|
218
|
-
faqs:
|
|
216
|
+
venue: v,
|
|
217
|
+
performers: P,
|
|
218
|
+
tickets: m,
|
|
219
|
+
faqs: k,
|
|
219
220
|
disclaimer: "",
|
|
220
221
|
status: "on_sale",
|
|
221
222
|
isPasswordProtected: !1,
|
|
@@ -227,25 +228,25 @@ Whether you're a comedy regular or a first-timer, this show delivers. Grab your
|
|
|
227
228
|
displayDoorsTime: !0
|
|
228
229
|
};
|
|
229
230
|
({
|
|
230
|
-
...
|
|
231
|
+
...i,
|
|
231
232
|
// square 3000×3000
|
|
232
|
-
date:
|
|
233
|
+
date: u(1),
|
|
233
234
|
startDateTime: e(1, 21),
|
|
234
235
|
endDateTime: e(1, 23),
|
|
235
|
-
tickets:
|
|
236
|
+
tickets: m.map((n) => ({
|
|
236
237
|
...n,
|
|
237
238
|
quantityAvailable: 0,
|
|
238
239
|
status: "sold_out"
|
|
239
240
|
}))
|
|
240
241
|
});
|
|
241
|
-
const
|
|
242
|
-
...
|
|
242
|
+
const A = {
|
|
243
|
+
...i,
|
|
243
244
|
id: 2407,
|
|
244
245
|
title: "Open Mic Night",
|
|
245
246
|
slug: "open-mic-night",
|
|
246
247
|
imageUrl: "/posters/OpenMic-Twitter.jpg",
|
|
247
248
|
// wide landscape 2127×1075
|
|
248
|
-
date:
|
|
249
|
+
date: u(-2),
|
|
249
250
|
startDateTime: e(-2, 19),
|
|
250
251
|
endDateTime: e(-2, 21),
|
|
251
252
|
displayDoorsTime: !1,
|
|
@@ -271,20 +272,11 @@ const _ = {
|
|
|
271
272
|
totalTicketsCapacity: 50
|
|
272
273
|
};
|
|
273
274
|
({
|
|
274
|
-
...
|
|
275
|
+
...i,
|
|
275
276
|
seriesOccurrences: (e(0, 19), e(0, 20, 30), e(0, 20), e(0, 21, 30), e(0, 21, 30), e(0, 23), e(7, 20), e(7, 22), e(14, 20), e(14, 22), e(21, 20), e(21, 22))
|
|
276
277
|
});
|
|
277
|
-
|
|
278
|
-
...
|
|
279
|
-
startDateTime: e(0, 20),
|
|
280
|
-
endDateTime: e(0, 21, 30)
|
|
281
|
-
});
|
|
282
|
-
({
|
|
283
|
-
...t,
|
|
284
|
-
collectionEvents: (e(0, 20), e(1, 21), e(2, 14), e(7, 20), e(8, 19), e(8, 22))
|
|
285
|
-
});
|
|
286
|
-
const A = {
|
|
287
|
-
...t,
|
|
278
|
+
const _ = {
|
|
279
|
+
...i,
|
|
288
280
|
id: 2408,
|
|
289
281
|
title: "Stand-Up Comedy Workshop",
|
|
290
282
|
slug: "standup-comedy-workshop",
|
|
@@ -314,7 +306,7 @@ const A = {
|
|
|
314
306
|
totalTicketsRemaining: 8,
|
|
315
307
|
totalTicketsCapacity: 12
|
|
316
308
|
}, x = {
|
|
317
|
-
...
|
|
309
|
+
...i,
|
|
318
310
|
id: 2414,
|
|
319
311
|
title: "Charity Comedy Benefit",
|
|
320
312
|
slug: "charity-comedy-benefit",
|
|
@@ -356,60 +348,45 @@ const A = {
|
|
|
356
348
|
totalTicketsCapacity: 300
|
|
357
349
|
};
|
|
358
350
|
({
|
|
359
|
-
...
|
|
351
|
+
...i,
|
|
360
352
|
tickets: (e(9, 10), e(-10, 23, 59))
|
|
361
353
|
});
|
|
362
354
|
({
|
|
363
|
-
...
|
|
364
|
-
});
|
|
365
|
-
({
|
|
366
|
-
...t
|
|
367
|
-
});
|
|
368
|
-
({
|
|
369
|
-
...t
|
|
370
|
-
});
|
|
371
|
-
({
|
|
372
|
-
...t
|
|
373
|
-
});
|
|
374
|
-
({
|
|
375
|
-
...t,
|
|
376
|
-
performers: [
|
|
377
|
-
...u
|
|
378
|
-
]
|
|
355
|
+
...i
|
|
379
356
|
});
|
|
380
357
|
({
|
|
381
|
-
...
|
|
358
|
+
...i
|
|
382
359
|
});
|
|
383
360
|
({
|
|
384
|
-
...
|
|
361
|
+
...i
|
|
385
362
|
});
|
|
386
|
-
class
|
|
363
|
+
class q {
|
|
387
364
|
#e;
|
|
388
365
|
get current() {
|
|
389
|
-
return
|
|
366
|
+
return a.get(this.#e);
|
|
390
367
|
}
|
|
391
368
|
set current(s) {
|
|
392
|
-
|
|
369
|
+
a.set(this.#e, s, !0);
|
|
393
370
|
}
|
|
394
371
|
#t;
|
|
395
372
|
get options() {
|
|
396
|
-
return
|
|
373
|
+
return a.get(this.#t);
|
|
397
374
|
}
|
|
398
375
|
set options(s) {
|
|
399
|
-
|
|
376
|
+
a.set(this.#t, s, !0);
|
|
400
377
|
}
|
|
401
378
|
#a;
|
|
402
379
|
get isActive() {
|
|
403
|
-
return
|
|
380
|
+
return a.get(this.#a);
|
|
404
381
|
}
|
|
405
382
|
set isActive(s) {
|
|
406
|
-
|
|
383
|
+
a.set(this.#a, s, !0);
|
|
407
384
|
}
|
|
408
385
|
constructor() {
|
|
409
|
-
this.#e =
|
|
386
|
+
this.#e = a.state("default"), this.#t = a.state(a.proxy([])), this.#a = a.state(!1);
|
|
410
387
|
}
|
|
411
388
|
}
|
|
412
|
-
const C = new
|
|
389
|
+
const C = new q(), t = {
|
|
413
390
|
success: "bg-accent-success",
|
|
414
391
|
info: "bg-sky-500",
|
|
415
392
|
brand: "bg-brand-primary",
|
|
@@ -418,30 +395,30 @@ const C = new S(), a = {
|
|
|
418
395
|
};
|
|
419
396
|
function H() {
|
|
420
397
|
return [
|
|
421
|
-
{ value: "default", label: "Standard", color:
|
|
422
|
-
{ value: "free", label: "Free", color:
|
|
423
|
-
{ value: "donation", label: "Donation", color:
|
|
424
|
-
{ value: "registration", label: "Registration", color:
|
|
425
|
-
{ value: "timer_warning", label: "Timer warning", color:
|
|
426
|
-
{ value: "expired", label: "Expired", color:
|
|
427
|
-
{ value: "promo", label: "Promo discount", color:
|
|
398
|
+
{ value: "default", label: "Standard", color: t.success },
|
|
399
|
+
{ value: "free", label: "Free", color: t.info },
|
|
400
|
+
{ value: "donation", label: "Donation", color: t.danger },
|
|
401
|
+
{ value: "registration", label: "Registration", color: t.brand },
|
|
402
|
+
{ value: "timer_warning", label: "Timer warning", color: t.warningSubtle },
|
|
403
|
+
{ value: "expired", label: "Expired", color: t.danger },
|
|
404
|
+
{ value: "promo", label: "Promo discount", color: t.success }
|
|
428
405
|
];
|
|
429
406
|
}
|
|
430
407
|
function F() {
|
|
431
408
|
return [
|
|
432
|
-
{ value: "default", label: "Standard", color:
|
|
433
|
-
{ value: "free", label: "Free", color:
|
|
434
|
-
{ value: "registration", label: "Registration", color:
|
|
435
|
-
{ value: "donation", label: "Donation", color:
|
|
409
|
+
{ value: "default", label: "Standard", color: t.success },
|
|
410
|
+
{ value: "free", label: "Free", color: t.info },
|
|
411
|
+
{ value: "registration", label: "Registration", color: t.brand },
|
|
412
|
+
{ value: "donation", label: "Donation", color: t.danger }
|
|
436
413
|
];
|
|
437
414
|
}
|
|
438
415
|
export {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
416
|
+
_ as a,
|
|
417
|
+
A as b,
|
|
418
|
+
i as c,
|
|
442
419
|
C as d,
|
|
443
420
|
H as e,
|
|
444
421
|
F as g,
|
|
445
422
|
x as m
|
|
446
423
|
};
|
|
447
|
-
//# sourceMappingURL=showcase-state-options-
|
|
424
|
+
//# sourceMappingURL=showcase-state-options-DjWk_E2A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showcase-state-options-DjWk_E2A.js","sources":["../src/lib/public-calendar-flow/mock-data.ts","../src/lib/public-calendar-flow/data-toggle-store.svelte.ts","../src/lib/public-calendar-flow/showcase-state-options.ts"],"sourcesContent":["import { getDefaultTimezone } from '@getmicdrop/svelte-components/utils/timezones';\r\nimport { DEFAULT_TIMEZONE } from '$lib/utils/timezone.js';\r\n// Premium Ticket Experience — Mock Data\r\n// Realistic event data for all design variants. DO NOT MODIFY per-variant.\r\n\r\nimport type {\r\n EventData,\r\n PerformerData,\r\n FAQItem,\r\n VenueData,\r\n TicketTypeData,\r\n} from './types';\r\n\r\n// All dates here are anchored to \"the upcoming Friday at 8pm\" so the showcase\r\n// stays in the future regardless of when it's loaded. Hardcoded calendar dates\r\n// rot every few months and cause `event_past` CTAs even when status === 'on_sale'.\r\nfunction showcaseDate(\r\n daysFromFriday: number,\r\n hour: number,\r\n minute = 0\r\n): string {\r\n const now = new Date(); // @datetime-escape: mock/demo fixture data — not a live datetime path\r\n const day = now.getUTCDay(); // 0=Sun..6=Sat\r\n const daysToFriday = (5 - day + 7) % 7 || 7; // always the NEXT Friday (never today)\r\n // The marker must sit WITHIN the `new Date(...)` expression's own line span —\r\n // the rule matches comments on lines [node.start, node.end], so a marker on\r\n // the line ABOVE is silently ignored (vc#609). On a multi-line construction\r\n // that means trailing the opening line, not preceding it.\r\n const base = new Date( // @datetime-escape: mock/demo fixture data — not a live datetime path\r\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())\r\n );\r\n base.setUTCDate(base.getUTCDate() + daysToFriday + daysFromFriday);\r\n const y = base.getUTCFullYear();\r\n const m = String(base.getUTCMonth() + 1).padStart(2, '0');\r\n const d = String(base.getUTCDate()).padStart(2, '0');\r\n const hh = String(hour).padStart(2, '0');\r\n const mm = String(minute).padStart(2, '0');\r\n return `${y}-${m}-${d}T${hh}:${mm}:00-08:00`;\r\n}\r\n\r\nfunction showcaseDateOnly(daysFromFriday: number): string {\r\n return showcaseDate(daysFromFriday, 0).slice(0, 10);\r\n}\r\n\r\n// --- Venue ---\r\nexport const mockVenue: VenueData = {\r\n id: 101,\r\n name: 'The Laugh Factory',\r\n address: '8001 Sunset Blvd, Los Angeles, CA 90046',\r\n timezone: getDefaultTimezone(),\r\n serviceFeePercentage: 10,\r\n serviceFeeCents: 0,\r\n taxPercentage: 9.5,\r\n contactEmail: 'help@thelaughfactory.com',\r\n};\r\n\r\n// --- Performers ---\r\nexport const mockPerformers: PerformerData[] = [\r\n {\r\n id: 1,\r\n displayName: 'Dave Martinez',\r\n profileImage:\r\n 'https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?w=200&h=200&fit=crop',\r\n },\r\n {\r\n id: 2,\r\n displayName: 'Sarah Chen',\r\n profileImage:\r\n 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200&h=200&fit=crop',\r\n },\r\n {\r\n id: 3,\r\n displayName: 'Mike Thompson',\r\n profileImage:\r\n 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&h=200&fit=crop',\r\n },\r\n];\r\n\r\n// --- FAQs ---\r\nexport const mockFaqs: FAQItem[] = [\r\n {\r\n question: 'What time do doors open?',\r\n answer:\r\n 'Doors open at 7:00 PM, one hour before showtime. We recommend arriving early to get the best seats.',\r\n },\r\n {\r\n question: 'Is there a drink minimum?',\r\n answer:\r\n 'Yes, there is a 2-drink minimum per person. Both alcoholic and non-alcoholic beverages count toward the minimum.',\r\n },\r\n {\r\n question: 'Can I get a refund?',\r\n answer:\r\n 'Tickets are non-refundable but can be transferred to another person up to 24 hours before the show. Contact us for transfers.',\r\n },\r\n {\r\n question: 'Is the venue accessible?',\r\n answer:\r\n 'Yes, the venue is fully wheelchair accessible with ADA-compliant seating available. Please contact us to reserve accessible seating.',\r\n },\r\n];\r\n\r\n// --- Ticket Types ---\r\nexport const mockTickets: TicketTypeData[] = [\r\n\t{\r\n\t\tid: 101,\r\n\t\tname: 'General Admission',\r\n\t\tdescription: 'Standard seating in the main room',\r\n\t\tprice: 25,\r\n\t\tfee: 2.5,\r\n\t\tquantityAvailable: 12,\r\n\t\tquantityTotal: 150,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 8,\r\n\t\tstatus: 'on_sale',\r\n\t\tsalesEndDate: '2026-02-20T20:00:00-08:00',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 102,\r\n\t\tname: 'VIP Front Row',\r\n\t\tdescription: 'Premium seats in the first two rows with a complimentary drink',\r\n\t\tprice: 55,\r\n\t\tfee: 5.5,\r\n\t\tquantityAvailable: 3,\r\n\t\tquantityTotal: 20,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 4,\r\n\t\tstatus: 'on_sale',\r\n\t\tsalesEndDate: '2026-02-20T20:00:00-08:00',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 103,\r\n\t\tname: 'Table for 4',\r\n\t\tdescription: 'Reserved table for four guests with bottle service',\r\n\t\tprice: 180,\r\n\t\tfee: 18,\r\n\t\tquantityAvailable: 8,\r\n\t\tquantityTotal: 15,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 3,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 104,\r\n\t\tname: 'Student Discount',\r\n\t\tdescription: 'Valid student ID required at the door',\r\n\t\tprice: 15,\r\n\t\tfee: 1.5,\r\n\t\tquantityAvailable: 45,\r\n\t\tquantityTotal: 50,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 2,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 105,\r\n\t\tname: 'Early Bird Special',\r\n\t\tdescription: 'Limited early bird pricing — first come, first served',\r\n\t\tprice: 20,\r\n\t\tfee: 2,\r\n\t\tquantityAvailable: 15,\r\n\t\tquantityTotal: 30,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 4,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 106,\r\n\t\tname: 'Senior (65+)',\r\n\t\tdescription: 'Senior discount with valid ID at the door',\r\n\t\tprice: 18,\r\n\t\tfee: 1.8,\r\n\t\tquantityAvailable: 30,\r\n\t\tquantityTotal: 40,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 4,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 107,\r\n\t\tname: 'Industry Comp',\r\n\t\tdescription: 'Discount for industry professionals — credentials required',\r\n\t\tprice: 12,\r\n\t\tfee: 1.2,\r\n\t\tquantityAvailable: 25,\r\n\t\tquantityTotal: 30,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 2,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 108,\r\n\t\tname: 'Group of 6',\r\n\t\tdescription: 'Reserved booth for six guests with priority seating',\r\n\t\tprice: 240,\r\n\t\tfee: 24,\r\n\t\tquantityAvailable: 5,\r\n\t\tquantityTotal: 8,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 2,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 109,\r\n\t\tname: 'Standing Room',\r\n\t\tdescription: 'Standing room only at the back of the venue',\r\n\t\tprice: 12,\r\n\t\tfee: 1.2,\r\n\t\tquantityAvailable: 50,\r\n\t\tquantityTotal: 60,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 6,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t},\r\n\t{\r\n\t\tid: 110,\r\n\t\tname: 'Day-of Door',\r\n\t\tdescription: 'Day-of pricing for walk-ins — limited availability',\r\n\t\tprice: 35,\r\n\t\tfee: 3.5,\r\n\t\tquantityAvailable: 20,\r\n\t\tquantityTotal: 25,\r\n\t\tminPerOrder: 1,\r\n\t\tmaxPerOrder: 4,\r\n\t\tstatus: 'on_sale',\r\n\t\tisDonation: false,\r\n\t\tisHidden: false\r\n\t}\r\n];\r\n\r\n// --- Main Event (on sale, multiple ticket types, scarcity on VIP) ---\r\n// Computed relative to today (showcase use): always lands ~21 days in the\r\n// future so the BookingWidget renders the on-sale state, not \"Sales ended\".\r\n// Memory: [[user_mastermind_date_awareness]] — never hardcode showcase dates.\r\nconst _now = new Date(); // @datetime-escape: mock/demo fixture data — not a live datetime path\r\nconst _evDate = new Date(_now.getFullYear(), _now.getMonth(), _now.getDate() + 21); // @datetime-escape: mock/demo fixture data — not a live datetime path\r\nconst _ymd = `${_evDate.getFullYear()}-${String(_evDate.getMonth() + 1).padStart(2, '0')}-${String(_evDate.getDate()).padStart(2, '0')}`;\r\n\r\nexport const mockEvent: EventData = {\r\n id: 2405,\r\n title: 'Friday Night Comedy Throwdown',\r\n slug: 'friday-night-comedy-throwdown',\r\n description: `Get ready for the funniest night of the week! The Friday Night Comedy Throwdown brings together three of LA's hottest stand-up comics for two hours of non-stop laughs.\r\n\r\nHeadliner Dave Martinez (as seen on Netflix's \"Comedy Knockout\") brings his signature high-energy style, while Sarah Chen delivers her razor-sharp observational humor that's earned her a devoted following. Host Mike Thompson keeps the energy up between sets with crowd work that'll have you crying laughing.\r\n\r\nWhether you're a comedy regular or a first-timer, this show delivers. Grab your crew, grab some drinks, and prepare to laugh until your abs hurt.`,\r\n\tdate: _ymd,\r\n\tstartDateTime: `${_ymd}T20:00:00-08:00`,\r\n\tendDateTime: `${_ymd}T22:00:00-08:00`,\r\n\tdoorsOpenTime: `${_ymd}T19:00:00-08:00`,\r\n\ttimezone: DEFAULT_TIMEZONE,\r\n\timageUrl: '/posters/Friday Night Showdown.jpg', // wide landscape 800×400\r\n\tvenue: mockVenue,\r\n\tperformers: mockPerformers,\r\n\ttickets: mockTickets,\r\n\tfaqs: mockFaqs,\r\n\tdisclaimer: '',\r\n\tstatus: 'on_sale',\r\n\tisPasswordProtected: false,\r\n\tisRegistrationEvent: false,\r\n\ttotalTicketsRemaining: 68,\r\n\ttotalTicketsCapacity: 265,\r\n\tdisplayStartTime: true,\r\n\tdisplayEndTime: true,\r\n\tdisplayDoorsTime: true\r\n};\r\n\r\n// --- Sold Out Event (no end time shown) ---\r\nexport const mockSoldOutEvent: EventData = {\r\n ...mockEvent,\r\n id: 2406,\r\n title: 'Saturday Night Special',\r\n slug: 'saturday-night-special',\r\n imageUrl: '/posters/the-duel-square.webp', // square 3000×3000\r\n date: showcaseDateOnly(1),\r\n startDateTime: showcaseDate(1, 21),\r\n endDateTime: showcaseDate(1, 23),\r\n displayEndTime: false,\r\n status: 'sold_out',\r\n totalTicketsRemaining: 0,\r\n tickets: mockTickets.map(t => ({\r\n ...t,\r\n quantityAvailable: 0,\r\n status: 'sold_out' as const,\r\n })),\r\n};\r\n\r\n// --- Free Event (no doors time shown) ---\r\nexport const mockFreeEvent: EventData = {\r\n ...mockEvent,\r\n id: 2407,\r\n title: 'Open Mic Night',\r\n slug: 'open-mic-night',\r\n imageUrl: '/posters/OpenMic-Twitter.jpg', // wide landscape 2127×1075\r\n date: showcaseDateOnly(-2),\r\n startDateTime: showcaseDate(-2, 19),\r\n endDateTime: showcaseDate(-2, 21),\r\n displayDoorsTime: false,\r\n description:\r\n 'Free open mic night! Sign up at the door. All skill levels welcome.',\r\n status: 'on_sale',\r\n tickets: [\r\n {\r\n id: 201,\r\n name: 'Free Entry',\r\n description: 'Sign up at the door for a 5-minute set',\r\n price: 0,\r\n fee: 0,\r\n quantityAvailable: 40,\r\n quantityTotal: 50,\r\n minPerOrder: 1,\r\n maxPerOrder: 2,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n ],\r\n totalTicketsRemaining: 40,\r\n totalTicketsCapacity: 50,\r\n};\r\n\r\n// --- Series Event (with occurrences) ---\r\nexport const mockSeriesEvent: EventData = {\r\n ...mockEvent,\r\n id: 2410,\r\n title: 'Improv Throwdown',\r\n slug: 'improv-throwdown',\r\n imageUrl: '/posters/laughlab-tall.webp', // tall portrait 2550×3300\r\n eventSeriesId: 42,\r\n description:\r\n 'Weekly improv comedy show featuring rotating guest performers and audience participation games.',\r\n seriesOccurrences: [\r\n // Same-day shows (Fri Feb 20 — 7pm, 8pm, 9:30pm)\r\n {\r\n id: 2410,\r\n slug: 'improv-throwdown-feb-20-7pm',\r\n startDateTime: showcaseDate(0, 19),\r\n endDateTime: showcaseDate(0, 20, 30),\r\n status: 'sold_out',\r\n ctaText: 'Sold out',\r\n ctaDisabled: true,\r\n },\r\n {\r\n id: 2414,\r\n slug: 'improv-throwdown-feb-20-8pm',\r\n startDateTime: showcaseDate(0, 20),\r\n endDateTime: showcaseDate(0, 21, 30),\r\n status: 'on_sale',\r\n ctaText: 'Get tickets',\r\n ctaDisabled: false,\r\n },\r\n {\r\n id: 2415,\r\n slug: 'improv-throwdown-feb-20-930pm',\r\n startDateTime: showcaseDate(0, 21, 30),\r\n endDateTime: showcaseDate(0, 23),\r\n status: 'on_sale',\r\n ctaText: 'Get tickets',\r\n ctaDisabled: false,\r\n },\r\n // Single show days\r\n {\r\n id: 2411,\r\n slug: 'improv-throwdown-feb-27',\r\n startDateTime: showcaseDate(7, 20),\r\n endDateTime: showcaseDate(7, 22),\r\n status: 'sold_out',\r\n ctaText: 'Sold out',\r\n ctaDisabled: true,\r\n },\r\n {\r\n id: 2412,\r\n slug: 'improv-throwdown-mar-06',\r\n startDateTime: showcaseDate(14, 20),\r\n endDateTime: showcaseDate(14, 22),\r\n status: 'on_sale',\r\n ctaText: 'Get tickets',\r\n ctaDisabled: false,\r\n },\r\n {\r\n id: 2413,\r\n slug: 'improv-throwdown-mar-13',\r\n startDateTime: showcaseDate(21, 20),\r\n endDateTime: showcaseDate(21, 22),\r\n status: 'coming_soon',\r\n ctaText: 'Coming soon',\r\n ctaDisabled: true,\r\n },\r\n ],\r\n};\r\n\r\n// --- Registration Event (workshop — no time shown, just date + doors) ---\r\nexport const mockRegistrationEvent: EventData = {\r\n ...mockEvent,\r\n id: 2408,\r\n title: 'Stand-Up Comedy Workshop',\r\n slug: 'standup-comedy-workshop',\r\n imageUrl: '/posters/stand up 101.png', // 16:9 landscape 1920×1080\r\n description:\r\n 'Learn the fundamentals of stand-up comedy in this 3-hour intensive workshop. Write, refine, and perform your first 5-minute set.',\r\n isRegistrationEvent: true,\r\n displayStartTime: false,\r\n displayEndTime: false,\r\n status: 'on_sale',\r\n tickets: [\r\n {\r\n id: 301,\r\n name: 'Workshop Seat',\r\n description: 'Includes materials and performance slot',\r\n price: 75,\r\n fee: 7.5,\r\n quantityAvailable: 8,\r\n quantityTotal: 12,\r\n minPerOrder: 1,\r\n maxPerOrder: 1,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n ],\r\n totalTicketsRemaining: 8,\r\n totalTicketsCapacity: 12,\r\n};\r\n\r\n// --- Donation Event ---\r\nexport const mockDonationEvent: EventData = {\r\n ...mockEvent,\r\n id: 2414,\r\n title: 'Charity Comedy Benefit',\r\n slug: 'charity-comedy-benefit',\r\n imageUrl: '/posters/Friday Night Showdown.jpg',\r\n description:\r\n 'All proceeds go to the LA Comedy Relief Fund. Choose your own donation amount or grab a standard ticket.',\r\n status: 'on_sale',\r\n tickets: [\r\n {\r\n id: 401,\r\n name: 'Donation',\r\n description: 'Support the cause — choose your amount',\r\n price: 0,\r\n fee: 0,\r\n quantityAvailable: 200,\r\n quantityTotal: 200,\r\n minPerOrder: 1,\r\n maxPerOrder: 10,\r\n status: 'on_sale',\r\n isDonation: true,\r\n isHidden: false,\r\n ticketType: 2,\r\n },\r\n {\r\n id: 402,\r\n name: 'Standard Admission',\r\n description: 'Includes one drink ticket',\r\n price: 30,\r\n fee: 3,\r\n quantityAvailable: 80,\r\n quantityTotal: 100,\r\n minPerOrder: 1,\r\n maxPerOrder: 6,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n ],\r\n totalTicketsRemaining: 280,\r\n totalTicketsCapacity: 300,\r\n};\r\n\r\n// --- Mixed Event (ALL ticket states in one event) ---\r\nexport const mockMixedEvent: EventData = {\r\n ...mockEvent,\r\n id: 2415,\r\n title: 'The Everything Show',\r\n slug: 'the-everything-show',\r\n imageUrl: '/posters/the-duel-square.webp',\r\n description:\r\n 'A showcase event with every ticket state possible — for testing all edge cases.',\r\n status: 'on_sale',\r\n tickets: [\r\n {\r\n id: 501,\r\n name: 'General Admission',\r\n description: 'Standard seating in the main room',\r\n price: 25,\r\n fee: 2.5,\r\n quantityAvailable: 45,\r\n quantityTotal: 150,\r\n minPerOrder: 1,\r\n maxPerOrder: 8,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 502,\r\n name: 'Basic Entry',\r\n price: 15,\r\n fee: 1.5,\r\n quantityAvailable: 60,\r\n quantityTotal: 80,\r\n minPerOrder: 1,\r\n maxPerOrder: 4,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 503,\r\n name: 'VIP Front Row',\r\n description: 'Premium seats with complimentary drink',\r\n price: 75,\r\n fee: 7.5,\r\n quantityAvailable: 2,\r\n quantityTotal: 20,\r\n minPerOrder: 1,\r\n maxPerOrder: 4,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 504,\r\n name: 'Early Bird',\r\n description: 'Limited early bird pricing',\r\n price: 20,\r\n fee: 2,\r\n quantityAvailable: 0,\r\n quantityTotal: 30,\r\n minPerOrder: 1,\r\n maxPerOrder: 4,\r\n status: 'sold_out',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 505,\r\n name: 'Late Night Add-On',\r\n description: 'Access to the after-party at midnight',\r\n price: 40,\r\n fee: 4,\r\n quantityAvailable: 50,\r\n quantityTotal: 50,\r\n minPerOrder: 1,\r\n maxPerOrder: 2,\r\n status: 'coming_soon',\r\n salesStartDate: showcaseDate(9, 10),\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 506,\r\n name: 'Weekend Bundle',\r\n description: 'Includes Saturday + Sunday shows',\r\n price: 45,\r\n fee: 4.5,\r\n quantityAvailable: 0,\r\n quantityTotal: 25,\r\n minPerOrder: 1,\r\n maxPerOrder: 4,\r\n status: 'sales_ended',\r\n salesEndDate: showcaseDate(-10, 23, 59),\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 507,\r\n name: 'Donation',\r\n description: 'Support the performers directly',\r\n price: 0,\r\n fee: 0,\r\n quantityAvailable: 100,\r\n quantityTotal: 100,\r\n minPerOrder: 1,\r\n maxPerOrder: 5,\r\n status: 'on_sale',\r\n isDonation: true,\r\n isHidden: false,\r\n ticketType: 2,\r\n },\r\n {\r\n id: 508,\r\n name: 'Secret VIP Lounge',\r\n description: 'Backstage access with meet & greet',\r\n price: 150,\r\n fee: 15,\r\n quantityAvailable: 10,\r\n quantityTotal: 10,\r\n minPerOrder: 1,\r\n maxPerOrder: 2,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: true,\r\n },\r\n {\r\n id: 509,\r\n name: 'Industry Comp',\r\n description: 'Complimentary ticket for industry professionals',\r\n price: 0,\r\n fee: 0,\r\n quantityAvailable: 20,\r\n quantityTotal: 20,\r\n minPerOrder: 1,\r\n maxPerOrder: 1,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: true,\r\n },\r\n ],\r\n totalTicketsRemaining: 287,\r\n totalTicketsCapacity: 485,\r\n};\r\n\r\n// --- Promo Event (hidden tickets for promo reveal testing) ---\r\nexport const mockPromoEvent: EventData = {\r\n ...mockEvent,\r\n id: 2417,\r\n title: 'Secret Show',\r\n slug: 'secret-show',\r\n imageUrl: '/posters/luke-null-tall.webp',\r\n description:\r\n 'An intimate comedy experience. Some tickets are only available with a promo code.',\r\n status: 'on_sale',\r\n tickets: [\r\n {\r\n id: 701,\r\n name: 'General Admission',\r\n price: 30,\r\n fee: 3,\r\n quantityAvailable: 40,\r\n quantityTotal: 60,\r\n minPerOrder: 1,\r\n maxPerOrder: 6,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 702,\r\n name: 'Premium Seat',\r\n description: 'Reserved seating in rows 1-5',\r\n price: 50,\r\n fee: 5,\r\n quantityAvailable: 15,\r\n quantityTotal: 30,\r\n minPerOrder: 1,\r\n maxPerOrder: 4,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: false,\r\n },\r\n {\r\n id: 703,\r\n name: 'Artist Meet & Greet',\r\n description:\r\n 'Backstage pass with photo opportunity — promo code required',\r\n price: 100,\r\n fee: 10,\r\n quantityAvailable: 8,\r\n quantityTotal: 10,\r\n minPerOrder: 1,\r\n maxPerOrder: 2,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: true,\r\n },\r\n {\r\n id: 704,\r\n name: 'Industry Comp',\r\n description: 'Complimentary entry for industry professionals',\r\n price: 0,\r\n fee: 0,\r\n quantityAvailable: 10,\r\n quantityTotal: 10,\r\n minPerOrder: 1,\r\n maxPerOrder: 1,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: true,\r\n },\r\n ],\r\n totalTicketsRemaining: 73,\r\n totalTicketsCapacity: 110,\r\n};\r\n\r\n// --- Hidden-Only Event (MIC-1039) — no visible tickets, only hidden remain ---\r\n// Lands the user on a page where the only purchasable seats are gated behind\r\n// a promo code. With zero visible tickets the page should suppress the ticket\r\n// list entirely and render only the PromoCodeInput.\r\nexport const mockHiddenOnlyEvent: EventData = {\r\n ...mockEvent,\r\n id: 2419,\r\n title: 'Industry Showcase',\r\n slug: 'industry-showcase',\r\n description:\r\n 'A private comedy showcase. Tickets are only available with a promo code.',\r\n status: 'on_sale',\r\n tickets: [\r\n {\r\n id: 902,\r\n name: 'Industry Comp',\r\n description:\r\n 'Complimentary entry for industry professionals — promo code required',\r\n price: 0,\r\n fee: 0,\r\n quantityAvailable: 15,\r\n quantityTotal: 20,\r\n minPerOrder: 1,\r\n maxPerOrder: 2,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: true,\r\n },\r\n {\r\n id: 903,\r\n name: 'Artist Hold',\r\n description: 'Held for artist guests — promo code required',\r\n price: 50,\r\n fee: 5,\r\n quantityAvailable: 5,\r\n quantityTotal: 10,\r\n minPerOrder: 1,\r\n maxPerOrder: 4,\r\n status: 'on_sale',\r\n isDonation: false,\r\n isHidden: true,\r\n },\r\n ],\r\n totalTicketsRemaining: 0,\r\n totalTicketsCapacity: 0,\r\n};\r\n\r\n// --- Password Protected Event ---\r\nexport const mockPasswordEvent: EventData = {\r\n ...mockEvent,\r\n id: 2409,\r\n title: 'Secret Comedy Club',\r\n slug: 'secret-comedy-club',\r\n imageUrl: '/posters/luke-null-tall.webp', // tall portrait 625×937\r\n description: 'An exclusive underground comedy experience. Password required.',\r\n isPasswordProtected: true,\r\n status: 'on_sale',\r\n};\r\n","export type DataVariant =\r\n\t| 'default'\r\n\t| 'sold_out'\r\n\t| 'free'\r\n\t| 'registration'\r\n\t| 'series'\r\n\t| 'series_instance'\r\n\t| 'collection'\r\n\t| 'donation'\r\n\t| 'mixed'\r\n\t| 'sections'\r\n\t| 'promo'\r\n\t| 'multi_stage'\r\n\t| 'long'\r\n\t| 'wide';\r\n\r\nexport interface ToggleOption {\r\n\tvalue: string;\r\n\tlabel: string;\r\n\tcolor: string;\r\n}\r\n\r\nclass DataToggleStore {\r\n\tcurrent = $state<string>('default');\r\n\toptions = $state<ToggleOption[]>([]);\r\n\tisActive = $state(false);\r\n}\r\n\r\nexport const dataToggleStore = new DataToggleStore();\r\n","/**\r\n * Canonical state-option sets for the public-calendar-flow showcase.\r\n *\r\n * Per R-PATTERN-01 (canonicals-golden-rules.md): function form is the source,\r\n * static snapshots derive at module init. Every showcase surface that drives\r\n * `dataToggleStore` reads its option set from here — Checkout and Success each\r\n * used to inline their own array beside the variant union they switch on, so\r\n * the same `{ default, free, registration, donation }` core lived in several\r\n * places and could drift silently.\r\n *\r\n * A third set, `getShowcaseEventStates`, was removed in #615: its only caller\r\n * was `ShowcaseEvent.svelte`, deleted in the same change as dead code.\r\n *\r\n * Ordering is per-surface and deliberate: Checkout lists donation before\r\n * registration, Success lists registration before donation. The sets stay\r\n * distinct rather than merged so no surface's toggle order changes.\r\n */\r\nimport type { ToggleOption } from '$lib/public-calendar-flow/data-toggle-store.svelte';\r\n\r\n/**\r\n * Categorical hues for the showcase toggle dots — keyed by hue role, not by\r\n * state, so each class is named once and reused across every set.\r\n *\r\n * `info` is raw Tailwind palette (`bg-sky-500`) rather than an SC semantic\r\n * token, carried over verbatim from the arrays this module absorbed. It is the\r\n * one non-token hue here; replacing it is a color-category call, not an\r\n * options-array one.\r\n */\r\nconst HUE = {\r\n\tsuccess: 'bg-accent-success',\r\n\tneutral: 'bg-muted-foreground',\r\n\tinfo: 'bg-sky-500',\r\n\tbrand: 'bg-brand-primary',\r\n\tdanger: 'bg-accent-danger',\r\n\twarning: 'bg-accent-warning',\r\n\twarningSubtle: 'bg-status-warning-bg0',\r\n} as const;\r\n\r\nexport function getShowcaseBrowseStates(): ToggleOption[] {\r\n\treturn [\r\n\t\t{ value: 'default', label: 'Default', color: HUE.success },\r\n\t\t{ value: 'empty', label: 'Empty', color: HUE.neutral },\r\n\t\t{ value: 'sparse', label: '2 events', color: HUE.info },\r\n\t\t{ value: 'busy', label: 'Many events', color: HUE.brand },\r\n\t];\r\n}\r\n\r\nexport function getShowcaseCalendarStates(): ToggleOption[] {\r\n\treturn [\r\n\t\t{ value: 'default', label: 'Default', color: HUE.success },\r\n\t\t{ value: 'empty', label: 'Empty month', color: HUE.neutral },\r\n\t\t{ value: 'busy', label: 'Busy month', color: HUE.brand },\r\n\t];\r\n}\r\n\r\nexport function getShowcaseCheckoutStates(): ToggleOption[] {\r\n\treturn [\r\n\t\t{ value: 'default', label: 'Standard', color: HUE.success },\r\n\t\t{ value: 'free', label: 'Free', color: HUE.info },\r\n\t\t{ value: 'donation', label: 'Donation', color: HUE.danger },\r\n\t\t{ value: 'registration', label: 'Registration', color: HUE.brand },\r\n\t\t{ value: 'timer_warning', label: 'Timer warning', color: HUE.warningSubtle },\r\n\t\t{ value: 'expired', label: 'Expired', color: HUE.danger },\r\n\t\t{ value: 'promo', label: 'Promo discount', color: HUE.success },\r\n\t];\r\n}\r\n\r\nexport function getShowcaseSuccessStates(): ToggleOption[] {\r\n\treturn [\r\n\t\t{ value: 'default', label: 'Standard', color: HUE.success },\r\n\t\t{ value: 'free', label: 'Free', color: HUE.info },\r\n\t\t{ value: 'registration', label: 'Registration', color: HUE.brand },\r\n\t\t{ value: 'donation', label: 'Donation', color: HUE.danger },\r\n\t];\r\n}\r\n/** Static snapshots derived from the functions above — for non-reactive consumers. */\r\nexport const SHOWCASE_BROWSE_STATES = getShowcaseBrowseStates();\r\nexport const SHOWCASE_CALENDAR_STATES = getShowcaseCalendarStates();\r\n"],"names":["showcaseDate","daysFromFriday","hour","minute","now","daysToFriday","base","y","m","d","hh","mm","showcaseDateOnly","mockVenue","getDefaultTimezone","mockPerformers","mockFaqs","mockTickets","_now","_evDate","_ymd","mockEvent","DEFAULT_TIMEZONE","t","mockFreeEvent","mockRegistrationEvent","mockDonationEvent","DataToggleStore","#current","$","#isActive","dataToggleStore","HUE","getShowcaseCheckoutStates","getShowcaseSuccessStates"],"mappings":";;AAgBA,SAASA,EACPC,GACAC,GACAC,IAAS,GACD;AACR,QAAMC,wBAAU,KAAA,GAEVC,KAAgB,IADVD,EAAI,UAAA,IACgB,KAAK,KAAK,GAKpCE,IAAO,IAAI;AAAA;AAAA,IACf,KAAK,IAAIF,EAAI,eAAA,GAAkBA,EAAI,YAAA,GAAeA,EAAI,WAAA,CAAY;AAAA,EAAA;AAEpE,EAAAE,EAAK,WAAWA,EAAK,WAAA,IAAeD,IAAeJ,CAAc;AACjE,QAAMM,IAAID,EAAK,eAAA,GACTE,IAAI,OAAOF,EAAK,YAAA,IAAgB,CAAC,EAAE,SAAS,GAAG,GAAG,GAClDG,IAAI,OAAOH,EAAK,WAAA,CAAY,EAAE,SAAS,GAAG,GAAG,GAC7CI,IAAK,OAAOR,CAAI,EAAE,SAAS,GAAG,GAAG,GACjCS,IAAK,OAAOR,CAAM,EAAE,SAAS,GAAG,GAAG;AACzC,SAAO,GAAGI,CAAC,IAAIC,CAAC,IAAIC,CAAC,IAAIC,CAAE,IAAIC,CAAE;AACnC;AAEA,SAASC,EAAiBX,GAAgC;AACxD,SAAOD,EAAaC,GAAgB,CAAC,EAAE,MAAM,GAAG,EAAE;AACpD;AAGO,MAAMY,IAAuB;AAAA,EAClC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAUC,EAAA;AAAA,EACV,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,cAAc;AAChB,GAGaC,IAAkC;AAAA,EAC7C;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,EAAA;AAEN,GAGaC,IAAsB;AAAA,EACjC;AAAA,IACE,UAAU;AAAA,IACV,QACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,UAAU;AAAA,IACV,QACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,UAAU;AAAA,IACV,QACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,UAAU;AAAA,IACV,QACE;AAAA,EAAA;AAEN,GAGaC,IAAgC;AAAA,EAC5C;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEX;AAAA,IACC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAEZ,GAMMC,wBAAW,KAAA,GACXC,IAAU,IAAI,KAAKD,EAAK,YAAA,GAAeA,EAAK,YAAYA,EAAK,QAAA,IAAY,EAAE,GAC3EE,IAAO,GAAGD,EAAQ,aAAa,IAAI,OAAOA,EAAQ,aAAa,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAQ,QAAA,CAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAEzHE,IAAuB;AAAA,EAClC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKd,MAAMD;AAAA,EACN,eAAe,GAAGA,CAAI;AAAA,EACtB,aAAa,GAAGA,CAAI;AAAA,EACpB,eAAe,GAAGA,CAAI;AAAA,EACtB,UAAUE;AAAA,EACV,UAAU;AAAA;AAAA,EACV,OAAOT;AAAA,EACP,YAAYE;AAAA,EACZ,SAASE;AAAA,EACT,MAAMD;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,kBAAkB;AACnB;AAAA,CAG2C;AAAA,EACzC,GAAGK;AAAA;AAAA,EAKH,MAAMT,EAAiB,CAAC;AAAA,EACxB,eAAeZ,EAAa,GAAG,EAAE;AAAA,EACjC,aAAaA,EAAa,GAAG,EAAE;AAAA,EAI/B,SAASiB,EAAY,IAAI,CAAAM,OAAM;AAAA,IAC7B,GAAGA;AAAA,IACH,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EAAA,EACR;AACJ;AAGO,MAAMC,IAA2B;AAAA,EACtC,GAAGH;AAAA,EACH,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA;AAAA,EACV,MAAMT,EAAiB,EAAE;AAAA,EACzB,eAAeZ,EAAa,IAAI,EAAE;AAAA,EAClC,aAAaA,EAAa,IAAI,EAAE;AAAA,EAChC,kBAAkB;AAAA,EAClB,aACE;AAAA,EACF,QAAQ;AAAA,EACR,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,uBAAuB;AAAA,EACvB,sBAAsB;AACxB;AAAA,CAG0C;AAAA,EACxC,GAAGqB;AAAA,EAQH,oBAKmBrB,EAAa,GAAG,EAAE,GACpBA,EAAa,GAAG,IAAI,EAAE,GAQpBA,EAAa,GAAG,EAAE,GACpBA,EAAa,GAAG,IAAI,EAAE,GAQpBA,EAAa,GAAG,IAAI,EAAE,GACxBA,EAAa,GAAG,EAAE,GAShBA,EAAa,GAAG,EAAE,GACpBA,EAAa,GAAG,EAAE,GAQhBA,EAAa,IAAI,EAAE,GACrBA,EAAa,IAAI,EAAE,GAQjBA,EAAa,IAAI,EAAE,GACrBA,EAAa,IAAI,EAAE;AAMtC;AAGO,MAAMyB,IAAmC;AAAA,EAC9C,GAAGJ;AAAA,EACH,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA;AAAA,EACV,aACE;AAAA,EACF,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,uBAAuB;AAAA,EACvB,sBAAsB;AACxB,GAGaK,IAA+B;AAAA,EAC1C,GAAGL;AAAA,EACH,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,aACE;AAAA,EACF,QAAQ;AAAA,EACR,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,IAEd;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,uBAAuB;AAAA,EACvB,sBAAsB;AACxB;AAAA,CAGyC;AAAA,EACvC,GAAGA;AAAA,EAQH,UAmEoBrB,EAAa,GAAG,EAAE,GAepBA,EAAa,KAAK,IAAI,EAAE;AAkD5C;AAAA,CAGyC;AAAA,EACvC,GAAGqB;AAoEL;AAAA,CAM8C;AAAA,EAC5C,GAAGA;AAwCL;AAAA,CAG4C;AAAA,EAC1C,GAAGA;AAQL;ACnuBA,MAAMM,EAAgB;AAAA;;;;;;;;;;;;;;;;;;;;;EAAtB,cAAA;AACW,SAAAC,KAAAC,EAAA,MAAe,SAAS,aACxBA,EAAA,MAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,GACC,KAAAC,KAAAD,EAAA,MAAO,EAAK;AAAA,EAAA;AACxB;AAEO,MAAME,IAAkB,IAAIJ,EAAA,GCA7BK,IAAM;AAAA,EACX,SAAS;AAAA,EAET,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EAER,eAAe;AAChB;AAmBO,SAASC,IAA4C;AAC3D,SAAO;AAAA,IACN,EAAE,OAAO,WAAW,OAAO,YAAY,OAAOD,EAAI,QAAA;AAAA,IAClD,EAAE,OAAO,QAAQ,OAAO,QAAQ,OAAOA,EAAI,KAAA;AAAA,IAC3C,EAAE,OAAO,YAAY,OAAO,YAAY,OAAOA,EAAI,OAAA;AAAA,IACnD,EAAE,OAAO,gBAAgB,OAAO,gBAAgB,OAAOA,EAAI,MAAA;AAAA,IAC3D,EAAE,OAAO,iBAAiB,OAAO,iBAAiB,OAAOA,EAAI,cAAA;AAAA,IAC7D,EAAE,OAAO,WAAW,OAAO,WAAW,OAAOA,EAAI,OAAA;AAAA,IACjD,EAAE,OAAO,SAAS,OAAO,kBAAkB,OAAOA,EAAI,QAAA;AAAA,EAAQ;AAEhE;AAEO,SAASE,IAA2C;AAC1D,SAAO;AAAA,IACN,EAAE,OAAO,WAAW,OAAO,YAAY,OAAOF,EAAI,QAAA;AAAA,IAClD,EAAE,OAAO,QAAQ,OAAO,QAAQ,OAAOA,EAAI,KAAA;AAAA,IAC3C,EAAE,OAAO,gBAAgB,OAAO,gBAAgB,OAAOA,EAAI,MAAA;AAAA,IAC3D,EAAE,OAAO,YAAY,OAAO,YAAY,OAAOA,EAAI,OAAA;AAAA,EAAO;AAE5D;"}
|