@getmicdrop/venue-calendar 4.0.72 → 4.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{CarouselView.legacy-CjlmBP53.js → CarouselView.legacy-bFMNvOxH.js} +3 -3
  2. package/dist/{CarouselView.legacy-CjlmBP53.js.map → CarouselView.legacy-bFMNvOxH.js.map} +1 -1
  3. package/dist/{CartView-B0WQYDRq.js → CartView-XCE6_waU.js} +139 -139
  4. package/dist/{CartView-B0WQYDRq.js.map → CartView-XCE6_waU.js.map} +1 -1
  5. package/dist/{Checkout-DTdGea04.js → Checkout-B2e9_d8f.js} +70 -70
  6. package/dist/Checkout-B2e9_d8f.js.map +1 -0
  7. package/dist/{Checkout-BjEyBaTq.js → Checkout-DmZR38HF.js} +558 -550
  8. package/dist/Checkout-DmZR38HF.js.map +1 -0
  9. package/dist/{Checkout.legacy-CAH2mvU8.js → Checkout.legacy-CcgODm4S.js} +60 -60
  10. package/dist/{Checkout.legacy-CAH2mvU8.js.map → Checkout.legacy-CcgODm4S.js.map} +1 -1
  11. package/dist/{CheckoutTimer-CR9onkjL.js → CheckoutTimer-WPqcb7g2.js} +2 -2
  12. package/dist/{CheckoutTimer-CR9onkjL.js.map → CheckoutTimer-WPqcb7g2.js.map} +1 -1
  13. package/dist/{CollectionView-BEvvjyV1.js → CollectionView-Lnrub2IU.js} +5 -5
  14. package/dist/{CollectionView-BEvvjyV1.js.map → CollectionView-Lnrub2IU.js.map} +1 -1
  15. package/dist/{CollectionView.legacy-CWZTgDhd.js → CollectionView.legacy-0V5eWRxK.js} +32 -32
  16. package/dist/{CollectionView.legacy-CWZTgDhd.js.map → CollectionView.legacy-0V5eWRxK.js.map} +1 -1
  17. package/dist/Event-X8Y0VRCr.js +2188 -0
  18. package/dist/Event-X8Y0VRCr.js.map +1 -0
  19. package/dist/{EventPage-WVvMAUF9.js → EventPage-CqbhyBj_.js} +5 -5
  20. package/dist/{EventPage-WVvMAUF9.js.map → EventPage-CqbhyBj_.js.map} +1 -1
  21. package/dist/EventPage.legacy-Bea0fvpo.js +1300 -0
  22. package/dist/EventPage.legacy-Bea0fvpo.js.map +1 -0
  23. package/dist/{FeaturedView.legacy-MRCiAVjb.js → FeaturedView.legacy-r4hSn4Os.js} +22 -22
  24. package/dist/{FeaturedView.legacy-MRCiAVjb.js.map → FeaturedView.legacy-r4hSn4Os.js.map} +1 -1
  25. package/dist/{GalleryCard-qXTnV5Fm.js → GalleryCard-tPuVFSxE.js} +13 -13
  26. package/dist/{GalleryCard-qXTnV5Fm.js.map → GalleryCard-tPuVFSxE.js.map} +1 -1
  27. package/dist/{GalleryView.legacy-D9ZI5-Qh.js → GalleryView.legacy-DlfpBFmv.js} +3 -3
  28. package/dist/{GalleryView.legacy-D9ZI5-Qh.js.map → GalleryView.legacy-DlfpBFmv.js.map} +1 -1
  29. package/dist/{GroupedListView.legacy-DswMb6rJ.js → GroupedListView.legacy-NW4puRMl.js} +27 -27
  30. package/dist/{GroupedListView.legacy-DswMb6rJ.js.map → GroupedListView.legacy-NW4puRMl.js.map} +1 -1
  31. package/dist/{SeriesPage-Csf1RNhm.js → SeriesPage-83I2ewvU.js} +5 -5
  32. package/dist/{SeriesPage-Csf1RNhm.js.map → SeriesPage-83I2ewvU.js.map} +1 -1
  33. package/dist/{SeriesPage.legacy-CvgXH8hA.js → SeriesPage.legacy-D0yAAI-2.js} +33 -33
  34. package/dist/{SeriesPage.legacy-CvgXH8hA.js.map → SeriesPage.legacy-D0yAAI-2.js.map} +1 -1
  35. package/dist/{Success-CjamYu5g.js → Success-TqzTll3b.js} +130 -131
  36. package/dist/{Success-CjamYu5g.js.map → Success-TqzTll3b.js.map} +1 -1
  37. package/dist/{Success.legacy-BqRg0k88.js → Success.legacy-mwlbZG9E.js} +25 -25
  38. package/dist/{Success.legacy-BqRg0k88.js.map → Success.legacy-mwlbZG9E.js.map} +1 -1
  39. package/dist/{VenueCalendar-DMGL-oTh.js → VenueCalendar-CvFtgW5l.js} +6897 -7487
  40. package/dist/VenueCalendar-CvFtgW5l.js.map +1 -0
  41. package/dist/{ViewTicketsEmbed-DVvtzU2M.js → ViewTicketsEmbed-DT0u_tqQ.js} +20 -20
  42. package/dist/{ViewTicketsEmbed-DVvtzU2M.js.map → ViewTicketsEmbed-DT0u_tqQ.js.map} +1 -1
  43. package/dist/{api-hwRoz8UG.js → api-uMMBEANH.js} +2 -2
  44. package/dist/{api-hwRoz8UG.js.map → api-uMMBEANH.js.map} +1 -1
  45. package/dist/{data-toggle-store.svelte-fE-ftrjt.js → data-toggle-store.svelte-DJugxPYf.js} +2 -2
  46. package/dist/{data-toggle-store.svelte-fE-ftrjt.js.map → data-toggle-store.svelte-DJugxPYf.js.map} +1 -1
  47. package/dist/labels-BCnKUEyK.js +657 -0
  48. package/dist/labels-BCnKUEyK.js.map +1 -0
  49. package/dist/{transform-BVO9yWCH.js → transform-BVccos7m.js} +2 -2
  50. package/dist/{transform-BVO9yWCH.js.map → transform-BVccos7m.js.map} +1 -1
  51. package/dist/types/index.d.ts +20 -17
  52. package/dist/venue-calendar.css +1 -1
  53. package/dist/venue-calendar.es.js +23 -24
  54. package/dist/venue-calendar.iife.js +71 -62
  55. package/dist/venue-calendar.iife.js.map +1 -1
  56. package/dist/venue-calendar.umd.js +68 -71
  57. package/dist/venue-calendar.umd.js.map +1 -1
  58. package/package.json +4 -1
  59. package/dist/Checkout-BjEyBaTq.js.map +0 -1
  60. package/dist/Checkout-DTdGea04.js.map +0 -1
  61. package/dist/Event-QnlYFcmr.js +0 -1789
  62. package/dist/Event-QnlYFcmr.js.map +0 -1
  63. package/dist/EventDetailsView-voE4NIqx.js +0 -1366
  64. package/dist/EventDetailsView-voE4NIqx.js.map +0 -1
  65. package/dist/EventPage.legacy-wzZpuMGf.js +0 -1044
  66. package/dist/EventPage.legacy-wzZpuMGf.js.map +0 -1
  67. package/dist/OrderSummary-Dp1ZPIx-.js +0 -497
  68. package/dist/OrderSummary-Dp1ZPIx-.js.map +0 -1
  69. package/dist/PromoCodeInput-D3FfA0Ar.js +0 -415
  70. package/dist/PromoCodeInput-D3FfA0Ar.js.map +0 -1
  71. package/dist/VenueCalendar-DMGL-oTh.js.map +0 -1
  72. package/dist/WaitlistModal-C0PKN1Fr.js +0 -266
  73. package/dist/WaitlistModal-C0PKN1Fr.js.map +0 -1
  74. package/dist/labels-CWMBE5R1.js +0 -163
  75. package/dist/labels-CWMBE5R1.js.map +0 -1
@@ -1,497 +0,0 @@
1
- import "svelte/internal/disclose-version";
2
- import * as e from "svelte/internal/client";
3
- import { af as A, at as M, Q as j, g as C } from "./VenueCalendar-DMGL-oTh.js";
4
- import { T as v } from "./Text-CXR2fhx6.js";
5
- import "svelte/transition";
6
- import "svelte/easing";
7
- function G(t) {
8
- if (!t || !(t.isHidden === !0 || typeof t.visibility == "number" && t.visibility >= 2) || t.salesChannel === 2) return !1;
9
- const n = /* @__PURE__ */ new Date(), l = t.salesBegin || t.salesStart || t.saleBegin || t.onSaleStart, c = t.salesEnd || t.saleEnd || t.onSaleEnd;
10
- if (l && new Date(l) > n || c && new Date(c) < n) return !1;
11
- const _ = t.remainingCapacity ?? t.quantityRemaining ?? t.quantity;
12
- return !(t.soldOut || _ != null && _ <= 0);
13
- }
14
- function N(t, s, n = {}) {
15
- const {
16
- cancelled: l = !1,
17
- isRegistration: c = !1,
18
- waitlistEnabled: _ = !1
19
- } = n, p = /* @__PURE__ */ new Date();
20
- if (l)
21
- return { text: "Cancelled", disabled: !0, reason: "cancelled" };
22
- const f = t.endDateTime || t.startDateTime;
23
- if (f && new Date(f) < p)
24
- return { text: "Sales ended", disabled: !0, reason: "event_past" };
25
- const E = t?.hasPurchasableHiddenTickets === !0 || Array.isArray(s) && s.some(G), m = (s || []).filter(
26
- (r) => r.salesChannel !== 2 && !r.isHidden && !(typeof r.visibility == "number" && r.visibility >= 2)
27
- );
28
- if (m.length === 0)
29
- return E ? {
30
- text: c ? "Reserve a spot" : "Get tickets",
31
- disabled: !1,
32
- reason: "hidden_only"
33
- } : {
34
- text: "No tickets available",
35
- disabled: !0,
36
- reason: "no_tickets"
37
- };
38
- let S = !1, O = !0, P = !0, x = null;
39
- for (const r of m) {
40
- const T = r.salesBegin || r.salesStart || r.saleBegin || r.onSaleStart, w = r.salesEnd || r.saleEnd || r.onSaleEnd, h = r.remainingCapacity ?? r.quantityRemaining ?? r.quantity, D = r.soldOut || h != null && h <= 0, b = T ? new Date(T) > p : !1, R = w ? new Date(w) < p : !1;
41
- if (!D && !b && !R && (S = !0), D || (O = !1), b || (P = !1), b && T && !D && !R) {
42
- const z = new Date(T);
43
- (!x || z < x) && (x = z);
44
- }
45
- }
46
- if (S)
47
- return {
48
- text: c ? "Reserve a spot" : "Get tickets",
49
- disabled: !1,
50
- reason: "available"
51
- };
52
- if (P && x) {
53
- if (E)
54
- return {
55
- text: c ? "Reserve a spot" : "Get tickets",
56
- disabled: !1,
57
- reason: "hidden_only"
58
- };
59
- const r = x.getTime() - p.getTime(), T = r / (1e3 * 60 * 60), w = r / (1e3 * 60 * 60 * 24);
60
- let h;
61
- if (T < 24)
62
- h = A(x, { hour12: !0 }, "en-US");
63
- else if (w <= 7)
64
- h = M(
65
- x,
66
- { weekday: "short", hour: "numeric", minute: "2-digit", hour12: !0 },
67
- "en-US"
68
- );
69
- else {
70
- const D = M(
71
- x,
72
- { month: "short", day: "numeric" },
73
- "en-US"
74
- ), b = A(x, { hour12: !0 }, "en-US");
75
- h = `${D} ${b}`;
76
- }
77
- return {
78
- text: `On sale ${h}`,
79
- disabled: !0,
80
- reason: "coming_soon"
81
- };
82
- }
83
- return O ? E ? {
84
- text: c ? "Reserve a spot" : "Get tickets",
85
- disabled: !1,
86
- reason: "hidden_only"
87
- } : _ ? {
88
- text: "Join Waitlist",
89
- disabled: !1,
90
- reason: "sold_out_waitlist"
91
- } : { text: "Sold out", disabled: !0, reason: "sold_out" } : E ? {
92
- text: c ? "Reserve a spot" : "Get tickets",
93
- disabled: !1,
94
- reason: "hidden_only"
95
- } : { text: "Sales ended", disabled: !0, reason: "sales_ended" };
96
- }
97
- const H = {
98
- URGENT: 0.1,
99
- // ≤10% remaining → urgent ("Only X left")
100
- LOW: 0.2,
101
- // ≤20% remaining (80%+ sold) → "Selling fast"
102
- MAX_EXACT_COUNT: 20
103
- // Don't show exact count above 20
104
- };
105
- function ne(t, s) {
106
- if (s === 0) return "none";
107
- if (t <= 0) return "sold_out";
108
- const n = t / s;
109
- return n <= H.URGENT ? "urgent" : n <= H.LOW ? "low" : "none";
110
- }
111
- function re(t, s, n, l) {
112
- return t === "none" ? null : t === "sold_out" ? "Sold out" : t === "urgent" && n !== "browse" && s <= H.MAX_EXACT_COUNT ? `Only ${s} left` : t === "low" || t === "urgent" ? "Selling fast" : null;
113
- }
114
- function ie(t) {
115
- const s = t.tickets.map((l) => ({
116
- salesBegin: l.salesStartDate,
117
- salesEnd: l.salesEndDate,
118
- remainingCapacity: l.quantityAvailable,
119
- totalCapacity: l.quantityTotal,
120
- soldOut: l.status === "sold_out",
121
- salesChannel: 1,
122
- // All our tickets are online (not "at the door only")
123
- isHidden: l.isHidden
124
- }));
125
- if (t.status === "cancelled")
126
- return {
127
- text: "Cancelled",
128
- disabled: !0,
129
- reason: "This event has been cancelled"
130
- };
131
- if (t.status === "past")
132
- return {
133
- text: "Event ended",
134
- disabled: !0,
135
- reason: "This event has ended"
136
- };
137
- const n = N(
138
- { startDateTime: t.startDateTime, endDateTime: t.endDateTime },
139
- s,
140
- {
141
- cancelled: !1,
142
- isRegistration: t.isRegistrationEvent,
143
- waitlistEnabled: !1
144
- }
145
- );
146
- return {
147
- text: n.text,
148
- disabled: n.disabled,
149
- reason: n.disabled ? q(n.reason) : void 0
150
- };
151
- }
152
- function q(t) {
153
- if (t)
154
- switch (t) {
155
- case "cancelled":
156
- return "This event has been cancelled.";
157
- case "event_past":
158
- return "This event has already happened.";
159
- case "no_tickets":
160
- return "There are no tickets configured for this event.";
161
- case "coming_soon":
162
- return;
163
- // text already shows "On sale <date>"
164
- case "sold_out":
165
- return;
166
- // text already shows "Sold out"
167
- case "sold_out_waitlist":
168
- return "All tickets are claimed. Join the waitlist to be notified.";
169
- case "sales_ended":
170
- return;
171
- // text already shows "Sales ended"
172
- default:
173
- return;
174
- }
175
- }
176
- function oe(t) {
177
- const s = t.tickets.filter(
178
- (f) => f.status === "on_sale" && !f.isHidden
179
- );
180
- if (s.length === 0) return null;
181
- const n = s.some(
182
- (f) => f.isDonation || f.ticketType === 2
183
- ), l = s.filter(
184
- (f) => !f.isDonation && f.ticketType !== 2
185
- ), c = l.some((f) => f.price === 0), _ = l.filter((f) => f.price > 0);
186
- if (_.length === 0 && !c && n) return "Donation";
187
- if (_.length === 0 && c) return null;
188
- const p = Math.min(..._.map((f) => f.price));
189
- return c ? null : n ? `From $${p}` : _.length === 1 ? `$${p}` : `From $${p}`;
190
- }
191
- function le(t, s) {
192
- return j(t * (s / 100));
193
- }
194
- const B = {
195
- normal: 300
196
- };
197
- function de(t) {
198
- if (!t) return "";
199
- const s = new Date(t), n = /* @__PURE__ */ new Date(), l = s.getTime() - n.getTime(), c = Math.round(l / (1e3 * 60)), _ = l / (1e3 * 60 * 60);
200
- if (c > 0 && c < 60) {
201
- const m = Math.max(1, c);
202
- return `in ${m} minute${m !== 1 ? "s" : ""}`;
203
- }
204
- if (_ > 0 && _ < 24) {
205
- const m = Math.max(1, Math.round(_));
206
- return `in ${m} hour${m !== 1 ? "s" : ""}`;
207
- }
208
- const p = new Date(n);
209
- if (p.setDate(p.getDate() + 1), s.toDateString() === p.toDateString())
210
- return `tomorrow at ${A(
211
- s,
212
- { hour: "numeric", minute: "2-digit" },
213
- "en-US"
214
- )}`;
215
- const f = l / (1e3 * 60 * 60 * 24);
216
- if (f > 0 && f <= 7) {
217
- const m = new Intl.DateTimeFormat("en-US", {
218
- weekday: "long"
219
- }).format(s), S = A(
220
- s,
221
- { hour: "numeric", minute: "2-digit" },
222
- "en-US"
223
- );
224
- return `on ${m} at ${S}`;
225
- }
226
- return `on ${new Intl.DateTimeFormat("en-US", {
227
- month: "short",
228
- day: "numeric"
229
- }).format(s)}`;
230
- }
231
- function ue() {
232
- return {
233
- code: "",
234
- isApplied: !1,
235
- isValidating: !1,
236
- error: "",
237
- hint: "",
238
- discountAmount: 0,
239
- discountType: "",
240
- discountTicketIds: [],
241
- revealHiddenTickets: !1,
242
- revealTicketIds: []
243
- };
244
- }
245
- var I = e.from_html('<div class="flex justify-between"><!> <!></div>'), L = e.from_html('<div class="flex justify-between pt-1 border-t border-default"><!> <!></div>'), X = e.from_html('<div class="flex justify-between"><!> <!></div>'), W = e.from_html('<div class="flex justify-between"><!> <!></div>'), J = e.from_html('<div class="flex justify-between"><!> <!></div>'), Q = e.from_html('<div class="flex justify-between"><!> <!></div>'), V = e.from_html('<div class="flex justify-between"><!> <!></div>'), Y = e.from_html('<!> <!> <!> <!> <!> <div class="flex justify-between pt-2 border-t border-default"><!> <!></div>', 1), K = e.from_html('<div class="space-y-2"><!> <!></div>');
246
- function fe(t, s) {
247
- e.push(s, !0);
248
- let n = e.prop(s, "labels", 19, () => ({})), l = e.prop(s, "mode", 3, "full");
249
- var c = K(), _ = e.child(c);
250
- {
251
- var p = (m) => {
252
- var S = e.comment(), O = e.first_child(S);
253
- e.each(O, 17, () => s.orderTotals.lines, (P) => P.ticketId, (P, x) => {
254
- var r = I(), T = e.child(r);
255
- v(T, {
256
- size: "sm",
257
- children: (h, D) => {
258
- e.next();
259
- var b = e.text();
260
- e.template_effect(() => e.set_text(b, `${e.get(x).quantity ?? ""}x ${e.get(x).ticketName ?? ""}`)), e.append(h, b);
261
- },
262
- $$slots: { default: !0 }
263
- });
264
- var w = e.sibling(T, 2);
265
- v(w, {
266
- size: "sm",
267
- children: (h, D) => {
268
- e.next();
269
- var b = e.text();
270
- e.template_effect((R) => e.set_text(b, R), [() => C(e.get(x).subtotal)]), e.append(h, b);
271
- },
272
- $$slots: { default: !0 }
273
- }), e.reset(r), e.append(P, r);
274
- }), e.append(m, S);
275
- };
276
- e.if(_, (m) => {
277
- l() !== "totals" && m(p);
278
- });
279
- }
280
- var f = e.sibling(_, 2);
281
- {
282
- var E = (m) => {
283
- var S = Y(), O = e.first_child(S);
284
- {
285
- var P = (i) => {
286
- var o = L(), d = e.child(o);
287
- v(d, {
288
- size: "sm",
289
- color: "muted",
290
- children: (u, $) => {
291
- e.next();
292
- var a = e.text();
293
- e.template_effect(() => e.set_text(a, n().subtotal || "Subtotal")), e.append(u, a);
294
- },
295
- $$slots: { default: !0 }
296
- });
297
- var g = e.sibling(d, 2);
298
- v(g, {
299
- size: "sm",
300
- color: "muted",
301
- children: (u, $) => {
302
- e.next();
303
- var a = e.text();
304
- e.template_effect((y) => e.set_text(a, y), [() => C(s.orderTotals.subtotal)]), e.append(u, a);
305
- },
306
- $$slots: { default: !0 }
307
- }), e.reset(o), e.append(i, o);
308
- }, x = (i) => {
309
- var o = X(), d = e.child(o);
310
- v(d, {
311
- size: "sm",
312
- color: "muted",
313
- children: (u, $) => {
314
- e.next();
315
- var a = e.text();
316
- e.template_effect(() => e.set_text(a, n().subtotal || "Subtotal")), e.append(u, a);
317
- },
318
- $$slots: { default: !0 }
319
- });
320
- var g = e.sibling(d, 2);
321
- v(g, {
322
- size: "sm",
323
- color: "muted",
324
- children: (u, $) => {
325
- e.next();
326
- var a = e.text();
327
- e.template_effect((y) => e.set_text(a, y), [() => C(s.orderTotals.subtotal)]), e.append(u, a);
328
- },
329
- $$slots: { default: !0 }
330
- }), e.reset(o), e.append(i, o);
331
- };
332
- e.if(O, (i) => {
333
- l() === "full" && s.orderTotals.lines.length > 1 ? i(P) : s.orderTotals.lines.length > 1 && i(x, 1);
334
- });
335
- }
336
- var r = e.sibling(O, 2);
337
- {
338
- var T = (i) => {
339
- var o = W(), d = e.child(o);
340
- v(d, {
341
- size: "sm",
342
- color: "muted",
343
- children: (u, $) => {
344
- e.next();
345
- var a = e.text();
346
- e.template_effect(() => e.set_text(a, n().serviceFees || "Service fees")), e.append(u, a);
347
- },
348
- $$slots: { default: !0 }
349
- });
350
- var g = e.sibling(d, 2);
351
- v(g, {
352
- size: "sm",
353
- color: "muted",
354
- children: (u, $) => {
355
- e.next();
356
- var a = e.text();
357
- e.template_effect((y) => e.set_text(a, y), [() => C(s.orderTotals.fees)]), e.append(u, a);
358
- },
359
- $$slots: { default: !0 }
360
- }), e.reset(o), e.append(i, o);
361
- };
362
- e.if(r, (i) => {
363
- s.orderTotals.fees > 0 && i(T);
364
- });
365
- }
366
- var w = e.sibling(r, 2);
367
- {
368
- var h = (i) => {
369
- var o = J(), d = e.child(o);
370
- v(d, {
371
- size: "sm",
372
- color: "muted",
373
- children: (u, $) => {
374
- e.next();
375
- var a = e.text();
376
- e.template_effect(() => e.set_text(a, n().taxes || "Taxes")), e.append(u, a);
377
- },
378
- $$slots: { default: !0 }
379
- });
380
- var g = e.sibling(d, 2);
381
- v(g, {
382
- size: "sm",
383
- color: "muted",
384
- children: (u, $) => {
385
- e.next();
386
- var a = e.text();
387
- e.template_effect((y) => e.set_text(a, y), [() => C(s.orderTotals.taxes)]), e.append(u, a);
388
- },
389
- $$slots: { default: !0 }
390
- }), e.reset(o), e.append(i, o);
391
- };
392
- e.if(w, (i) => {
393
- s.orderTotals.taxes > 0 && i(h);
394
- });
395
- }
396
- var D = e.sibling(w, 2);
397
- {
398
- var b = (i) => {
399
- var o = Q(), d = e.child(o);
400
- v(d, {
401
- size: "sm",
402
- color: "success",
403
- children: (u, $) => {
404
- e.next();
405
- var a = e.text();
406
- e.template_effect(() => e.set_text(a, n().promoDiscount || "Promo discount")), e.append(u, a);
407
- },
408
- $$slots: { default: !0 }
409
- });
410
- var g = e.sibling(d, 2);
411
- v(g, {
412
- size: "sm",
413
- color: "success",
414
- children: (u, $) => {
415
- e.next();
416
- var a = e.text();
417
- e.template_effect((y) => e.set_text(a, `-${y ?? ""}`), [() => C(s.orderTotals.promoDiscount)]), e.append(u, a);
418
- },
419
- $$slots: { default: !0 }
420
- }), e.reset(o), e.append(i, o);
421
- };
422
- e.if(D, (i) => {
423
- s.orderTotals.promoDiscount > 0 && i(b);
424
- });
425
- }
426
- var R = e.sibling(D, 2);
427
- {
428
- var U = (i) => {
429
- var o = V(), d = e.child(o);
430
- v(d, {
431
- size: "sm",
432
- color: "success",
433
- children: (u, $) => {
434
- e.next();
435
- var a = e.text();
436
- e.template_effect(() => e.set_text(a, n().giftCard || "Gift card")), e.append(u, a);
437
- },
438
- $$slots: { default: !0 }
439
- });
440
- var g = e.sibling(d, 2);
441
- v(g, {
442
- size: "sm",
443
- color: "success",
444
- children: (u, $) => {
445
- e.next();
446
- var a = e.text();
447
- e.template_effect((y) => e.set_text(a, `-${y ?? ""}`), [() => C(s.orderTotals.giftCardAmount)]), e.append(u, a);
448
- },
449
- $$slots: { default: !0 }
450
- }), e.reset(o), e.append(i, o);
451
- };
452
- e.if(R, (i) => {
453
- s.orderTotals.giftCardAmount > 0 && i(U);
454
- });
455
- }
456
- var z = e.sibling(R, 2), k = e.child(z);
457
- v(k, {
458
- size: "base",
459
- class: "font-semibold",
460
- children: (i, o) => {
461
- e.next();
462
- var d = e.text();
463
- e.template_effect(() => e.set_text(d, n().total || "Total")), e.append(i, d);
464
- },
465
- $$slots: { default: !0 }
466
- });
467
- var F = e.sibling(k, 2);
468
- v(F, {
469
- size: "base",
470
- class: "font-semibold",
471
- children: (i, o) => {
472
- e.next();
473
- var d = e.text();
474
- e.template_effect((g) => e.set_text(d, g), [() => C(s.orderTotals.total)]), e.append(i, d);
475
- },
476
- $$slots: { default: !0 }
477
- }), e.reset(z), e.append(m, S);
478
- };
479
- e.if(f, (m) => {
480
- l() !== "lines" && m(E);
481
- });
482
- }
483
- e.reset(c), e.template_effect(() => e.set_style(c, `transition-duration: ${B.normal}ms;`)), e.append(t, c), e.pop();
484
- }
485
- export {
486
- B as D,
487
- fe as O,
488
- le as a,
489
- re as b,
490
- ue as c,
491
- ie as d,
492
- oe as e,
493
- de as f,
494
- ne as g,
495
- N as h
496
- };
497
- //# sourceMappingURL=OrderSummary-Dp1ZPIx-.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrderSummary-Dp1ZPIx-.js","sources":["../src/lib/api/cta.ts","../src/lib/public-calendar-flow/defaults.ts","../src/lib/public-calendar-flow/OrderSummary.svelte"],"sourcesContent":["/**\r\n * CTA state computation.\r\n *\r\n * Pure function (no I/O) — derives the buy-button state from an event and\r\n * its ticket list. Lives in `api/` because it is the canonical, single\r\n * source of truth that replaces the duplicate implementations previously\r\n * scattered across utils/api.js, core/api-client.js, and a few components.\r\n */\r\n\r\n// Import from the specific subpath (not the bare entry) so the api/\r\n// bundle doesn't pull in the entire SC component graph (Accordion etc.)\r\n// and break `npm run build:api`.\r\nimport {\r\n formatDateRaw,\r\n formatTime,\r\n} from '@getmicdrop/svelte-components/utils/formatters';\r\n\r\nexport interface CtaStateOptions {\r\n cancelled?: boolean;\r\n isRegistration?: boolean;\r\n waitlistEnabled?: boolean;\r\n}\r\n\r\nexport interface CtaState {\r\n text: string;\r\n disabled: boolean;\r\n reason:\r\n | 'cancelled'\r\n | 'event_past'\r\n | 'no_tickets'\r\n | 'available'\r\n | 'coming_soon'\r\n | 'sold_out_waitlist'\r\n | 'sold_out'\r\n | 'sales_ended'\r\n | 'hidden_only';\r\n}\r\n\r\ninterface CtaEvent {\r\n startDateTime?: string | null;\r\n endDateTime?: string | null;\r\n hasPurchasableHiddenTickets?: boolean;\r\n}\r\n\r\ninterface CtaTicket {\r\n salesChannel?: number;\r\n salesBegin?: string | null;\r\n salesStart?: string | null;\r\n saleBegin?: string | null;\r\n onSaleStart?: string | null;\r\n salesEnd?: string | null;\r\n saleEnd?: string | null;\r\n onSaleEnd?: string | null;\r\n remainingCapacity?: number | null;\r\n quantityRemaining?: number | null;\r\n quantity?: number | null;\r\n soldOut?: boolean;\r\n isHidden?: boolean;\r\n visibility?: number;\r\n}\r\n\r\n// A hidden ticket (visibility>=2 or isHidden) that's still on sale drives the\r\n// \"Sales ended\" / \"Sold out\" / \"No tickets\" → \"Get tickets\" override. The user\r\n// just needs the promo code to see it.\r\nexport function isHiddenTicketPurchasable(ticket: CtaTicket): boolean {\r\n if (!ticket) return false;\r\n const isHidden =\r\n ticket.isHidden === true ||\r\n (typeof ticket.visibility === 'number' && ticket.visibility >= 2);\r\n if (!isHidden) return false;\r\n if (ticket.salesChannel === 2) return false;\r\n\r\n const now = new Date();\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n if (salesBegin && new Date(salesBegin) > now) return false;\r\n if (salesEnd && new Date(salesEnd) < now) return false;\r\n\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n if (isSoldOut) return false;\r\n\r\n return true;\r\n}\r\n\r\nexport function computeCtaState(\r\n event: CtaEvent,\r\n tickets: CtaTicket[] | undefined,\r\n options: CtaStateOptions = {}\r\n): CtaState {\r\n const {\r\n cancelled = false,\r\n isRegistration = false,\r\n waitlistEnabled = false,\r\n } = options;\r\n const now = new Date();\r\n\r\n if (cancelled)\r\n return { text: 'Cancelled', disabled: true, reason: 'cancelled' };\r\n\r\n const eventEnd = event.endDateTime || event.startDateTime;\r\n if (eventEnd && new Date(eventEnd) < now) {\r\n return { text: 'Sales ended', disabled: true, reason: 'event_past' };\r\n }\r\n\r\n const hiddenAvailable =\r\n event?.hasPurchasableHiddenTickets === true ||\r\n (Array.isArray(tickets) && tickets.some(isHiddenTicketPurchasable));\r\n\r\n const publicTickets = (tickets || []).filter(\r\n t =>\r\n t.salesChannel !== 2 &&\r\n !t.isHidden &&\r\n !(typeof t.visibility === 'number' && t.visibility >= 2)\r\n );\r\n if (publicTickets.length === 0) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n return {\r\n text: 'No tickets available',\r\n disabled: true,\r\n reason: 'no_tickets',\r\n };\r\n }\r\n\r\n let hasPurchasable = false;\r\n let allSoldOut = true;\r\n let allComingSoon = true;\r\n let earliestSalesStart: Date | null = null;\r\n\r\n for (const ticket of publicTickets) {\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n\r\n const isScheduled = salesBegin ? new Date(salesBegin) > now : false;\r\n const hasSalesEnded = salesEnd ? new Date(salesEnd) < now : false;\r\n const isPurchasable = !isSoldOut && !isScheduled && !hasSalesEnded;\r\n\r\n if (isPurchasable) hasPurchasable = true;\r\n if (!isSoldOut) allSoldOut = false;\r\n if (!isScheduled) allComingSoon = false;\r\n\r\n if (isScheduled && salesBegin && !isSoldOut && !hasSalesEnded) {\r\n const startDate = new Date(salesBegin);\r\n if (!earliestSalesStart || startDate < earliestSalesStart) {\r\n earliestSalesStart = startDate;\r\n }\r\n }\r\n }\r\n\r\n if (hasPurchasable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'available',\r\n };\r\n }\r\n\r\n if (allComingSoon && earliestSalesStart) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n const diffMs = earliestSalesStart.getTime() - now.getTime();\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n let dateText: string;\r\n if (diffHours < 24) {\r\n dateText = formatTime(earliestSalesStart, { hour12: true }, 'en-US');\r\n } else if (diffDays <= 7) {\r\n dateText = formatDateRaw(\r\n earliestSalesStart,\r\n { weekday: 'short', hour: 'numeric', minute: '2-digit', hour12: true },\r\n 'en-US'\r\n );\r\n } else {\r\n const d = formatDateRaw(\r\n earliestSalesStart,\r\n { month: 'short', day: 'numeric' },\r\n 'en-US'\r\n );\r\n const t = formatTime(earliestSalesStart, { hour12: true }, 'en-US');\r\n dateText = `${d} ${t}`;\r\n }\r\n return {\r\n text: `On sale ${dateText}`,\r\n disabled: true,\r\n reason: 'coming_soon',\r\n };\r\n }\r\n\r\n if (allSoldOut) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n if (waitlistEnabled) {\r\n return {\r\n text: 'Join Waitlist',\r\n disabled: false,\r\n reason: 'sold_out_waitlist',\r\n };\r\n }\r\n return { text: 'Sold out', disabled: true, reason: 'sold_out' };\r\n }\r\n\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n\r\n return { text: 'Sales ended', disabled: true, reason: 'sales_ended' };\r\n}\r\n","// @currency-escape: feeCents / 100 in calculateServiceFee is arithmetic,\r\n// not display. Produces a dollar-magnitude number used in the fee formula\r\n// `price * (feePercentage / 100) + feeCents / 100`. Per Atlas\r\n// utility-currency convergence record; the no-handrolled-currency\r\n// ESLint rule's divideByHundred detector treats variable-name `Cents`\r\n// as drift but here it's real math.\r\n\r\n// Premium Ticket Experience — Constants & Defaults\r\n// Used by all design variants. DO NOT MODIFY per-variant.\r\n\r\n// @raw-intl-datetimeformat-escape: formatSmartSalesDate is a date-formatter\r\n// implementation (smart relative-date thresholds → \"on Friday at 8 PM\" / \"on Mar 15\").\r\n// The weekday-long (\"Friday\") and month-short+day (\"Mar 15\") fragments are interpolated\r\n// into smart-threshold strings; SC formatDate/DATE_FORMATS has no preset that emits a\r\n// bare weekday or a bare month+day, so it cannot reproduce these byte-identical fragments.\r\n// This file is the canonical formatter module for public-calendar-flow (it wraps + re-exports\r\n// scFormatDate/scFormatTime), not a call site.\r\n\r\nimport type {\r\n EventData,\r\n TicketTypeData,\r\n ScarcityLevel,\r\n CtaConfig,\r\n PromoCodeState,\r\n} from './types';\r\nimport { computeCtaState } from '$lib/api';\r\nimport type { Cents } from '@getmicdrop/svelte-components';\r\nimport {\r\n formatDate as scFormatDate,\r\n formatTime as scFormatTime,\r\n roundCurrency,\r\n} from '@getmicdrop/svelte-components';\r\nimport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n} from '$lib/utils/datetime.js';\r\n\r\n// --- Re-export production date/time formatters (timezone-aware) ---\r\nexport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n};\r\n\r\n// --- Scarcity Badge Rules ---\r\nexport const SCARCITY_THRESHOLDS = {\r\n SOLD_OUT: 0,\r\n URGENT: 0.1, // ≤10% remaining → urgent (\"Only X left\")\r\n LOW: 0.2, // ≤20% remaining (80%+ sold) → \"Selling fast\"\r\n MAX_EXACT_COUNT: 20, // Don't show exact count above 20\r\n} as const;\r\n\r\nexport function getScarcityLevel(\r\n remaining: number,\r\n total: number\r\n): ScarcityLevel {\r\n if (total === 0) return 'none';\r\n if (remaining <= 0) return 'sold_out';\r\n const pct = remaining / total;\r\n if (pct <= SCARCITY_THRESHOLDS.URGENT) return 'urgent';\r\n if (pct <= SCARCITY_THRESHOLDS.LOW) return 'low';\r\n return 'none';\r\n}\r\n\r\nexport function getScarcityText(\r\n level: ScarcityLevel,\r\n remaining: number,\r\n context: 'browse' | 'event' | 'ticket',\r\n options?: { isFree?: boolean }\r\n): string | null {\r\n if (level === 'none') return null;\r\n if (level === 'sold_out') return 'Sold out';\r\n // No scarcity badges on free events/tickets — nothing to lose = no urgency\r\n if (options?.isFree) return null;\r\n if (\r\n level === 'urgent' &&\r\n context !== 'browse' &&\r\n remaining <= SCARCITY_THRESHOLDS.MAX_EXACT_COUNT\r\n ) {\r\n return `Only ${remaining} left`;\r\n }\r\n if (level === 'low' || level === 'urgent') return 'Selling fast';\r\n return null;\r\n}\r\n\r\n// --- CTA Rules ---\r\n// Delegates to production computeCtaState() but adapts our EventData shape.\r\n// Components keep calling getCtaConfig(event) — internal logic is production-aligned.\r\nexport function getCtaConfig(event: EventData): CtaConfig {\r\n // Map our EventData tickets to the shape computeCtaState expects.\r\n // `isHidden` flows through so computeCtaState can apply the hidden-only\r\n // \"Sales ended\" → \"Get tickets\" override (MIC-1039).\r\n const apiTickets = event.tickets.map(t => ({\r\n salesBegin: t.salesStartDate,\r\n salesEnd: t.salesEndDate,\r\n remainingCapacity: t.quantityAvailable,\r\n totalCapacity: t.quantityTotal,\r\n soldOut: t.status === 'sold_out',\r\n salesChannel: 1, // All our tickets are online (not \"at the door only\")\r\n isHidden: t.isHidden,\r\n }));\r\n\r\n // Handle statuses that computeCtaState doesn't compute from tickets\r\n if (event.status === 'cancelled') {\r\n return {\r\n text: 'Cancelled',\r\n disabled: true,\r\n reason: 'This event has been cancelled',\r\n };\r\n }\r\n if (event.status === 'past') {\r\n return {\r\n text: 'Event ended',\r\n disabled: true,\r\n reason: 'This event has ended',\r\n };\r\n }\r\n\r\n const result = computeCtaState(\r\n { startDateTime: event.startDateTime, endDateTime: event.endDateTime },\r\n apiTickets,\r\n {\r\n cancelled: false,\r\n isRegistration: event.isRegistrationEvent,\r\n waitlistEnabled: false,\r\n }\r\n );\r\n\r\n return {\r\n text: result.text,\r\n disabled: result.disabled,\r\n reason: result.disabled ? toFriendlyReason(result.reason) : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * computeCtaState() returns machine-enum reasons ('event_past', 'sold_out',\r\n * 'coming_soon', etc) intended for branching, not display. The BookingWidget\r\n * and MobileCta render `reason` directly as supplementary copy below the\r\n * button text — which leaks raw enum strings to users.\r\n *\r\n * Map each enum to a friendly sentence, OR return undefined when the button\r\n * `text` already says everything (\"Sales ended\" / \"Sold out\" — no need for\r\n * a second line repeating it).\r\n */\r\nfunction toFriendlyReason(reason: string | undefined): string | undefined {\r\n if (!reason) return undefined;\r\n switch (reason) {\r\n case 'cancelled':\r\n return 'This event has been cancelled.';\r\n case 'event_past':\r\n return 'This event has already happened.';\r\n case 'no_tickets':\r\n return 'There are no tickets configured for this event.';\r\n case 'coming_soon':\r\n return undefined; // text already shows \"On sale <date>\"\r\n case 'sold_out':\r\n return undefined; // text already shows \"Sold out\"\r\n case 'sold_out_waitlist':\r\n return 'All tickets are claimed. Join the waitlist to be notified.';\r\n case 'sales_ended':\r\n return undefined; // text already shows \"Sales ended\"\r\n default:\r\n return undefined; // unknown enum — never leak it\r\n }\r\n}\r\n\r\n// --- Price Display Rules (from DECISIONS.md #1) ---\r\nexport function getPriceDisplay(event: EventData): string | null {\r\n const visibleTickets = event.tickets.filter(\r\n t => t.status === 'on_sale' && !t.isHidden\r\n );\r\n if (visibleTickets.length === 0) return null;\r\n\r\n const hasDonation = visibleTickets.some(\r\n t => t.isDonation || t.ticketType === 2\r\n );\r\n const paidTickets = visibleTickets.filter(\r\n t => !t.isDonation && t.ticketType !== 2\r\n );\r\n const hasFree = paidTickets.some(t => t.price === 0);\r\n const pricedTickets = paidTickets.filter(t => t.price > 0);\r\n\r\n // Only donation tickets → \"Donation\"\r\n if (pricedTickets.length === 0 && !hasFree && hasDonation) return 'Donation';\r\n\r\n // Only free tickets (no paid, no donation) → null (BookingWidget shows \"Free\" via isFreeEvent)\r\n if (pricedTickets.length === 0 && hasFree) return null;\r\n\r\n const minPrice = Math.min(...pricedTickets.map(t => t.price));\r\n\r\n // Free + paid → \"Free\" (free dominates the display)\r\n if (hasFree) return null;\r\n\r\n // Donation + paid → \"From $X\" (donation is an alternative option)\r\n if (hasDonation) return `From $${minPrice}`;\r\n\r\n // Single paid ticket type → \"$X\"\r\n if (pricedTickets.length === 1) return `$${minPrice}`;\r\n\r\n // Multiple paid ticket types → \"From $X\"\r\n return `From $${minPrice}`;\r\n}\r\n\r\n// --- Fee Calculation ---\r\nexport function calculateFee(\r\n price: number,\r\n feePercentage: number,\r\n feeCents: Cents\r\n): number {\r\n return roundCurrency(price * (feePercentage / 100) + feeCents / 100);\r\n}\r\n\r\nexport function calculateTax(amount: number, taxPercentage: number): number {\r\n return roundCurrency(amount * (taxPercentage / 100));\r\n}\r\n\r\n// --- Date Formatting ---\r\n// PREFERRED: Use the timezone-aware production formatters re-exported above:\r\n// formatBrowseDate(iso, tz) → \"Fri, Feb 20\"\r\n// formatFullDateCompact(iso, tz) → \"Friday, February 20\"\r\n// formatEventTime(iso, tz) → \"8:00 PM\"\r\n// formatTimeRange(start, end, tz) → \"8:00 PM - 10:00 PM\"\r\n// formatDoorsTime(doors, tz) → \"7:00 PM\"\r\n//\r\n// DEPRECATED: The functions below are backward-compatible wrappers for variants\r\n// not yet migrated to timezone-aware formatters. They use browser-local timezone.\r\n// Migrate to the production formatters above when updating each variant.\r\n\r\n/** @deprecated Use formatBrowseDate(dateStr, timezone) instead */\r\nexport function formatDate(dateStr: string): string {\r\n return scFormatDate(dateStr, { weekday: 'short', year: undefined });\r\n}\r\n\r\n/** @deprecated Use formatEventTime(dateStr, timezone) instead */\r\nexport function formatTime(dateStr: string): string {\r\n return scFormatTime(dateStr);\r\n}\r\n\r\n/** @deprecated Use formatBrowseDate + formatTimeRange instead */\r\nexport function formatDateRange(start: string, end: string): string {\r\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n return `${formatBrowseDate(start, tz)} · ${formatTimeRange(start, end, tz)}`;\r\n}\r\n\r\n// --- Animation Durations ---\r\nexport const DURATION = {\r\n instant: 100,\r\n micro: 150,\r\n fast: 200,\r\n normal: 300,\r\n slow: 400,\r\n elaborate: 600,\r\n} as const;\r\n\r\n// --- Smart Sales Date Formatting ---\r\n// Ported from production TicketBlock.svelte — smart thresholds for human-readable dates\r\nexport function formatSmartSalesDate(dateStr: string): string {\r\n if (!dateStr) return '';\r\n const date = new Date(dateStr);\r\n const now = new Date();\r\n const diffMs = date.getTime() - now.getTime();\r\n const diffMinutes = Math.round(diffMs / (1000 * 60));\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n\r\n // < 1 hour: \"in X minutes\"\r\n if (diffMinutes > 0 && diffMinutes < 60) {\r\n const mins = Math.max(1, diffMinutes);\r\n return `in ${mins} minute${mins !== 1 ? 's' : ''}`;\r\n }\r\n\r\n // 1-24 hours: \"in X hours\"\r\n if (diffHours > 0 && diffHours < 24) {\r\n const hours = Math.max(1, Math.round(diffHours));\r\n return `in ${hours} hour${hours !== 1 ? 's' : ''}`;\r\n }\r\n\r\n // Tomorrow: \"tomorrow at X PM\"\r\n const tomorrow = new Date(now);\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n if (date.toDateString() === tomorrow.toDateString()) {\r\n const timeStr = scFormatTime(\r\n date,\r\n { hour: 'numeric', minute: '2-digit' },\r\n 'en-US'\r\n );\r\n return `tomorrow at ${timeStr}`;\r\n }\r\n\r\n // 2-7 days: \"on Friday at X PM\"\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n if (diffDays > 0 && diffDays <= 7) {\r\n const dayName = new Intl.DateTimeFormat('en-US', {\r\n weekday: 'long',\r\n }).format(date);\r\n const timeStr = scFormatTime(\r\n date,\r\n { hour: 'numeric', minute: '2-digit' },\r\n 'en-US'\r\n );\r\n return `on ${dayName} at ${timeStr}`;\r\n }\r\n\r\n // > 7 days: \"on Mar 15\"\r\n const dateFormatted = new Intl.DateTimeFormat('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n }).format(date);\r\n return `on ${dateFormatted}`;\r\n}\r\n\r\n// --- Promo Code State Factory ---\r\nexport function createDefaultPromoState(): PromoCodeState {\r\n return {\r\n code: '',\r\n isApplied: false,\r\n isValidating: false,\r\n error: '',\r\n hint: '',\r\n discountAmount: 0,\r\n discountType: '',\r\n discountTicketIds: [],\r\n revealHiddenTickets: false,\r\n revealTicketIds: [],\r\n };\r\n}\r\n\r\n// --- Ticket helpers ---\r\nexport function getAvailableTickets(\r\n tickets: TicketTypeData[]\r\n): TicketTypeData[] {\r\n return tickets.filter(t => !t.isHidden && t.status === 'on_sale');\r\n}\r\n","<script lang=\"ts\">\r\n\timport type { USD } from '@getmicdrop/svelte-components';\r\n\timport { Text, formatCurrency } from '@getmicdrop/svelte-components';\r\n\timport type { OrderTotals } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\torderTotals: OrderTotals;\r\n\t\tlabels?: Record<string, string>;\r\n\t\t/**\r\n\t\t * Which section to render.\r\n\t\t * - `full` (default): ticket lines + totals stacked together.\r\n\t\t * - `lines` : ticket-line items only. Use when the parent scrolls\r\n\t\t * this section in a flex column.\r\n\t\t * - `totals` : subtotal/fees/taxes/promo/total only. Use in a fixed\r\n\t\t * footer alongside the action button.\r\n\t\t *\r\n\t\t * Splitting via `lines` / `totals` lets the sticky sidebars scroll\r\n\t\t * just the variable-length ticket list while keeping the summary\r\n\t\t * block and CTA always visible.\r\n\t\t */\r\n\t\tmode?: 'full' | 'lines' | 'totals';\r\n\t}\r\n\r\n\tlet { orderTotals, labels = {}, mode = 'full' }: Props = $props();\r\n</script>\r\n\r\n<div\r\n\tclass=\"space-y-2\"\r\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n\t{#if mode !== 'totals'}\r\n\t\t<!-- Line items -->\r\n\t\t{#each orderTotals.lines as line (line.ticketId)}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\">{line.quantity}x {line.ticketName}</Text>\r\n\t\t\t\t<Text size=\"sm\">{formatCurrency(line.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/each}\r\n\t{/if}\r\n\r\n\t{#if mode !== 'lines'}\r\n\t\t<!-- Subtotal. In `totals` mode the parent supplies the separator above\r\n\t\t this block (BookingWidget wraps the totals block in border-t); a\r\n\t\t second internal border would render as a double line. Only show\r\n\t\t the internal border-t in `full` mode where lines + totals stack\r\n\t\t in one container with no external separator. -->\r\n\t\t{#if mode === 'full' && orderTotals.lines.length > 1}\r\n\t\t\t<div class=\"flex justify-between pt-1 border-t border-default\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{:else if orderTotals.lines.length > 1}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.subtotal as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Fees -->\r\n\t\t{#if orderTotals.fees > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.serviceFees || 'Service fees'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.fees as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Taxes -->\r\n\t\t{#if orderTotals.taxes > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{labels.taxes || 'Taxes'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"muted\">{formatCurrency(orderTotals.taxes as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Promo discount -->\r\n\t\t{#if orderTotals.promoDiscount > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">{labels.promoDiscount || 'Promo discount'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">-{formatCurrency(orderTotals.promoDiscount as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Gift card — deduction from the amount due; `total` already reflects it -->\r\n\t\t{#if orderTotals.giftCardAmount > 0}\r\n\t\t\t<div class=\"flex justify-between\">\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">{labels.giftCard || 'Gift card'}</Text>\r\n\t\t\t\t<Text size=\"sm\" color=\"success\">-{formatCurrency(orderTotals.giftCardAmount as USD)}</Text>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Total -->\r\n\t\t<div class=\"flex justify-between pt-2 border-t border-default\">\r\n\t\t\t<Text size=\"base\" class=\"font-semibold\">{labels.total || 'Total'}</Text>\r\n\t\t\t<Text size=\"base\" class=\"font-semibold\">{formatCurrency(orderTotals.total as USD)}</Text>\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n"],"names":["isHiddenTicketPurchasable","ticket","now","salesBegin","salesEnd","remaining","computeCtaState","event","tickets","options","cancelled","isRegistration","waitlistEnabled","eventEnd","hiddenAvailable","publicTickets","t","hasPurchasable","allSoldOut","allComingSoon","earliestSalesStart","isSoldOut","isScheduled","hasSalesEnded","startDate","diffMs","diffHours","diffDays","dateText","formatTime","formatDateRaw","d","SCARCITY_THRESHOLDS","getScarcityLevel","total","pct","getScarcityText","level","context","getCtaConfig","apiTickets","result","toFriendlyReason","reason","getPriceDisplay","visibleTickets","hasDonation","paidTickets","hasFree","pricedTickets","minPrice","calculateTax","amount","taxPercentage","roundCurrency","DURATION","formatSmartSalesDate","dateStr","date","diffMinutes","mins","hours","tomorrow","scFormatTime","dayName","timeStr","createDefaultPromoState","labels","$","$$props","mode","div","root","node_1","line","div_1","root_2","Text","node_2","text","node_3","formatCurrency","$$render","consequent","div_2","root_6","node_6","node_7","$0","text_3","div_3","root_9","node_8","node_9","text_5","consequent_1","consequent_2","div_4","root_12","node_11","node_12","text_7","consequent_3","div_5","root_15","node_14","node_15","text_9","consequent_4","div_6","root_18","node_17","node_18","text_11","consequent_5","div_7","root_21","node_20","node_21","text_13","consequent_6","div_8","node_19","node_22","node_23","text_15","consequent_7"],"mappings":"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"}