@getmicdrop/venue-calendar 4.0.79 → 4.0.81

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 (125) hide show
  1. package/README.md +173 -128
  2. package/dist/{CarouselView.legacy-CsMGxVbb.js → CarouselView.legacy-Bn76lnuH.js} +3 -3
  3. package/dist/{CarouselView.legacy-CsMGxVbb.js.map → CarouselView.legacy-Bn76lnuH.js.map} +1 -1
  4. package/dist/{CartView-BOaZufWZ.js → CartView-lR1zLxmN.js} +277 -280
  5. package/dist/CartView-lR1zLxmN.js.map +1 -0
  6. package/dist/{Checkout-bkXNpxIB.js → Checkout-D5mXj5zN.js} +69 -73
  7. package/dist/Checkout-D5mXj5zN.js.map +1 -0
  8. package/dist/Checkout-KyLZlwLk.js +1673 -0
  9. package/dist/Checkout-KyLZlwLk.js.map +1 -0
  10. package/dist/{Checkout.legacy-BOPwZMyO.js → Checkout.legacy-Dl8Oh7y3.js} +95 -99
  11. package/dist/Checkout.legacy-Dl8Oh7y3.js.map +1 -0
  12. package/dist/CheckoutTimer-Deo1mLnO.js +141 -0
  13. package/dist/CheckoutTimer-Deo1mLnO.js.map +1 -0
  14. package/dist/CollectionView-C1O9xfVC.js +338 -0
  15. package/dist/CollectionView-C1O9xfVC.js.map +1 -0
  16. package/dist/{CollectionView.legacy-Dw-J6Ycd.js → CollectionView.legacy-DK_mCA_g.js} +21 -24
  17. package/dist/{CollectionView.legacy-Dw-J6Ycd.js.map → CollectionView.legacy-DK_mCA_g.js.map} +1 -1
  18. package/dist/Event-B5WRygEf.js +2240 -0
  19. package/dist/Event-B5WRygEf.js.map +1 -0
  20. package/dist/EventPage-f1AOk4Jb.js +577 -0
  21. package/dist/EventPage-f1AOk4Jb.js.map +1 -0
  22. package/dist/{EventPage.legacy-Br2M8N9-.js → EventPage.legacy-Bk3PJyJs.js} +408 -411
  23. package/dist/EventPage.legacy-Bk3PJyJs.js.map +1 -0
  24. package/dist/{FeaturedView.legacy-B86kMzvH.js → FeaturedView.legacy-BzCt1X1W.js} +18 -18
  25. package/dist/{FeaturedView.legacy-B86kMzvH.js.map → FeaturedView.legacy-BzCt1X1W.js.map} +1 -1
  26. package/dist/{GalleryCard-CTsYUZu6.js → GalleryCard-C1EKGErR.js} +14 -14
  27. package/dist/{GalleryCard-CTsYUZu6.js.map → GalleryCard-C1EKGErR.js.map} +1 -1
  28. package/dist/{GalleryView.legacy-uIexOsl5.js → GalleryView.legacy-BmQtZKl7.js} +3 -3
  29. package/dist/{GalleryView.legacy-uIexOsl5.js.map → GalleryView.legacy-BmQtZKl7.js.map} +1 -1
  30. package/dist/{GroupedListView.legacy-DMAwHQ9T.js → GroupedListView.legacy-D72fbNfA.js} +21 -21
  31. package/dist/{GroupedListView.legacy-DMAwHQ9T.js.map → GroupedListView.legacy-D72fbNfA.js.map} +1 -1
  32. package/dist/Heading-Bwevh2c4.js +81 -0
  33. package/dist/Heading-Bwevh2c4.js.map +1 -0
  34. package/dist/ModalHeader-DKwE5ZYZ.js +22 -0
  35. package/dist/ModalHeader-DKwE5ZYZ.js.map +1 -0
  36. package/dist/OrderSummarySkeleton-DKWKZNLL.js +632 -0
  37. package/dist/OrderSummarySkeleton-DKWKZNLL.js.map +1 -0
  38. package/dist/{ScarcityBadge-D9RzN3Tz.js → ScarcityBadge-3cFxTOCh.js} +25 -29
  39. package/dist/{ScarcityBadge-D9RzN3Tz.js.map → ScarcityBadge-3cFxTOCh.js.map} +1 -1
  40. package/dist/{SeriesPage-D0pf6VuS.js → SeriesPage-Cq4Q8Vah.js} +17 -21
  41. package/dist/{SeriesPage-D0pf6VuS.js.map → SeriesPage-Cq4Q8Vah.js.map} +1 -1
  42. package/dist/{SeriesPage.legacy-VYpfyT7B.js → SeriesPage.legacy-zvgW0S_y.js} +67 -71
  43. package/dist/SeriesPage.legacy-zvgW0S_y.js.map +1 -0
  44. package/dist/{Success-Dxgbo_Ct.js → Success-kyiEO6_Z.js} +186 -175
  45. package/dist/{Success-Dxgbo_Ct.js.map → Success-kyiEO6_Z.js.map} +1 -1
  46. package/dist/{Success.legacy-umzUtow7.js → Success.legacy-BxKYmXgz.js} +53 -57
  47. package/dist/{Success.legacy-umzUtow7.js.map → Success.legacy-BxKYmXgz.js.map} +1 -1
  48. package/dist/Text-_bLxSPv-.js +158 -0
  49. package/dist/Text-_bLxSPv-.js.map +1 -0
  50. package/dist/{VenueCalendar-D9TCV_XB.js → VenueCalendar-d8u6MKEu.js} +8131 -22680
  51. package/dist/VenueCalendar-d8u6MKEu.js.map +1 -0
  52. package/dist/ViewTicketsEmbed-DquJJVIK.js +2081 -0
  53. package/dist/ViewTicketsEmbed-DquJJVIK.js.map +1 -0
  54. package/dist/__SKIP_NAVIGATION__-CmipjatL.js +18 -0
  55. package/dist/__SKIP_NAVIGATION__-CmipjatL.js.map +1 -0
  56. package/dist/api/api.cjs +1 -1
  57. package/dist/api/api.cjs.map +1 -1
  58. package/dist/api/api.mjs +482 -374
  59. package/dist/api/api.mjs.map +1 -1
  60. package/dist/api/cta.d.ts +2 -10
  61. package/dist/api/transformers/address.d.ts +18 -0
  62. package/dist/api/transformers/cart.d.ts +19 -0
  63. package/dist/api/transformers/collection.d.ts +12 -0
  64. package/dist/api/transformers/event.d.ts +50 -1
  65. package/dist/api/transformers/giftCard.d.ts +11 -0
  66. package/dist/api/transformers/index.d.ts +10 -3
  67. package/dist/api/transformers/performer.d.ts +8 -0
  68. package/dist/api/transformers/series.d.ts +12 -0
  69. package/dist/api/types.d.ts +423 -383
  70. package/dist/api-BzICORqy.js +6 -0
  71. package/dist/{api-DFMsiBOR.js.map → api-BzICORqy.js.map} +1 -1
  72. package/dist/colors-CmP-sSZD.js.map +1 -1
  73. package/dist/{data-toggle-store.svelte-DtDqN-QD.js → data-toggle-store.svelte-BGbzblUJ.js} +10 -15
  74. package/dist/data-toggle-store.svelte-BGbzblUJ.js.map +1 -0
  75. package/dist/index-BsWecoW1.js +63 -0
  76. package/dist/index-BsWecoW1.js.map +1 -0
  77. package/dist/labels-Bj_cocb1.js +966 -0
  78. package/dist/labels-Bj_cocb1.js.map +1 -0
  79. package/dist/seo/seo.cjs +1 -1
  80. package/dist/seo/seo.cjs.map +1 -1
  81. package/dist/seo/seo.mjs +131 -122
  82. package/dist/seo/seo.mjs.map +1 -1
  83. package/dist/transform-D7Oe8jUp.js +276 -0
  84. package/dist/transform-D7Oe8jUp.js.map +1 -0
  85. package/dist/types/index.d.ts +45 -0
  86. package/dist/venue-calendar.css +1 -1
  87. package/dist/venue-calendar.es.js +31 -37
  88. package/dist/venue-calendar.es.js.map +1 -1
  89. package/dist/venue-calendar.iife.js +40 -107
  90. package/dist/venue-calendar.iife.js.map +1 -1
  91. package/dist/venue-calendar.umd.js +38 -125
  92. package/dist/venue-calendar.umd.js.map +1 -1
  93. package/package.json +170 -169
  94. package/dist/CartView-BOaZufWZ.js.map +0 -1
  95. package/dist/Checkout-DD6ZTUh-.js +0 -1531
  96. package/dist/Checkout-DD6ZTUh-.js.map +0 -1
  97. package/dist/Checkout-bkXNpxIB.js.map +0 -1
  98. package/dist/Checkout.legacy-BOPwZMyO.js.map +0 -1
  99. package/dist/CheckoutTimer-CHoKjZyH.js +0 -35
  100. package/dist/CheckoutTimer-CHoKjZyH.js.map +0 -1
  101. package/dist/CollectionView-Ce-OAEC4.js +0 -148
  102. package/dist/CollectionView-Ce-OAEC4.js.map +0 -1
  103. package/dist/Event-rdstzev0.js +0 -1910
  104. package/dist/Event-rdstzev0.js.map +0 -1
  105. package/dist/EventPage-B8VRC83d.js +0 -336
  106. package/dist/EventPage-B8VRC83d.js.map +0 -1
  107. package/dist/EventPage.legacy-Br2M8N9-.js.map +0 -1
  108. package/dist/Heading-AFd3o0xt.js +0 -44
  109. package/dist/Heading-AFd3o0xt.js.map +0 -1
  110. package/dist/OrderSummarySkeleton-dDKUH741.js +0 -16
  111. package/dist/OrderSummarySkeleton-dDKUH741.js.map +0 -1
  112. package/dist/SeriesPage.legacy-VYpfyT7B.js.map +0 -1
  113. package/dist/Text-CXR2fhx6.js +0 -54
  114. package/dist/Text-CXR2fhx6.js.map +0 -1
  115. package/dist/VenueCalendar-D9TCV_XB.js.map +0 -1
  116. package/dist/ViewTicketsEmbed-Bt05E5Ex.js +0 -2039
  117. package/dist/ViewTicketsEmbed-Bt05E5Ex.js.map +0 -1
  118. package/dist/__SKIP_NAVIGATION__-CJ96TTPE.js +0 -7
  119. package/dist/__SKIP_NAVIGATION__-CJ96TTPE.js.map +0 -1
  120. package/dist/api-DFMsiBOR.js +0 -12
  121. package/dist/data-toggle-store.svelte-DtDqN-QD.js.map +0 -1
  122. package/dist/labels-CClq3Rb9.js +0 -659
  123. package/dist/labels-CClq3Rb9.js.map +0 -1
  124. package/dist/transform-CWf-YI_e.js +0 -275
  125. package/dist/transform-CWf-YI_e.js.map +0 -1
@@ -1,383 +1,423 @@
1
- /**
2
- * API Types for MicDrop Public Checkout API
3
- *
4
- * These types define the shape of API requests and responses
5
- * for the public checkout flow (no authentication required).
6
- */
7
-
8
- import type { EventId, SeriesId } from '@getmicdrop/svelte-components';
9
-
10
- // ============================================================================
11
- // Payment & Orders
12
- // ============================================================================
13
-
14
- export interface PaymentIntentRequest {
15
- IP?: string;
16
- productQuantities: Record<string | number, number>;
17
- }
18
-
19
- export interface PaymentIntentResponse {
20
- client_secret: string;
21
- amount: number;
22
- amount_total: number;
23
- tax_amount_exclusive?: number;
24
- service_fee?: number;
25
- discount?: number;
26
- gift_card_amount?: number;
27
- gift_card_code?: string;
28
- stripe_publishable_key?: string;
29
- }
30
-
31
- export interface CompleteReservationResponse {
32
- success: boolean;
33
- message?: string;
34
- error?: string;
35
- }
36
-
37
- export interface CancelReservationResponse {
38
- success: boolean;
39
- message?: string;
40
- error?: string;
41
- }
42
-
43
- export interface CreateOrderRequest {
44
- eventId: string | number;
45
- promoCode?: string;
46
- }
47
-
48
- export interface CreateOrderResponse {
49
- uuid: string;
50
- }
51
-
52
- export interface ValidatePaymentRequest {
53
- id: string;
54
- paymentIntentId: string;
55
- tickets: Record<string | number, number>;
56
- firstName: string;
57
- lastName: string;
58
- email: string;
59
- paymentMethod: string;
60
- mailingList?: boolean;
61
- saleType?: string;
62
- attendees?: AttendeeInfo[];
63
- }
64
-
65
- export interface AttendeeInfo {
66
- ticketId: string | number;
67
- firstName: string;
68
- lastName: string;
69
- email: string;
70
- }
71
-
72
- export interface ValidatePaymentResponse {
73
- success: boolean;
74
- status: string;
75
- orderUUID?: string;
76
- error?: string;
77
- }
78
-
79
- // ============================================================================
80
- // Session Management
81
- // ============================================================================
82
-
83
- export interface ExtendSessionRequest {
84
- orderUuid: string;
85
- }
86
-
87
- export interface ExtendSessionResponse {
88
- success: boolean;
89
- newExpiryTime?: string;
90
- remainingExtensions?: number;
91
- error?: string;
92
- /**
93
- * HTTP status code from the backend on failure. Populated on non-OK
94
- * responses so callers can distinguish "session already expired"
95
- * (typically 410 Gone) from "max extensions reached" or generic 5xx.
96
- * Undefined on network errors and on success.
97
- */
98
- statusCode?: number;
99
- }
100
-
101
- export interface SessionStatus {
102
- expiresAt?: string;
103
- extensionCount?: number;
104
- remainingExtensions?: number;
105
- canExtend?: boolean;
106
- reservationCount?: number;
107
- error?: string;
108
- // 404 from /orders/session/{uuid}: the cart's reservations are
109
- // gone (expired or never existed). Callers polling on an interval
110
- // MUST treat this as terminal and stop — see CartView.svelte.
111
- notFound?: boolean;
112
- }
113
-
114
- // ============================================================================
115
- // Promo Codes
116
- // ============================================================================
117
-
118
- export interface PromoValidationResponse {
119
- valid: boolean;
120
- revealHiddenTickets?: boolean;
121
- revealTicketIds?: number[];
122
- provideDiscount?: boolean;
123
- discountType?: 'percentage' | 'fixed';
124
- amount?: number;
125
- code?: string;
126
- error?: string;
127
- }
128
-
129
- export interface HasPromoCodesResponse {
130
- hasPromoCodes: boolean;
131
- }
132
-
133
- // ============================================================================
134
- // Orders
135
- // ============================================================================
136
-
137
- export interface Order {
138
- uuid: string;
139
- id?: number;
140
- customerEmail: string;
141
- customerFirstName?: string;
142
- customerLastName?: string;
143
- status: string;
144
- totalAmount: number;
145
- subtotal?: number;
146
- serviceFeesAmount: number;
147
- taxAmount: number;
148
- discount?: number;
149
- paymentIntentId?: string;
150
- paymentMethod?: string;
151
- purchasedTickets: PurchasedTicket[];
152
- createdAt?: string;
153
- updatedAt?: string;
154
- }
155
-
156
- export interface PurchasedTicket {
157
- uuid: string;
158
- id?: number;
159
- ticketNumber?: string;
160
- orderId?: string | number;
161
- attendeeFirstName?: string;
162
- attendeeLastName?: string;
163
- attendeeEmail?: string;
164
- ticketName: string;
165
- ticketTypeId?: number;
166
- purchasePrice: number;
167
- status?: string;
168
- checkedIn?: boolean;
169
- checkedInAt?: string;
170
- }
171
-
172
- // ============================================================================
173
- // Events
174
- // ============================================================================
175
-
176
- export interface Event {
177
- eventID: number;
178
- id?: number;
179
- name: string;
180
- title?: string;
181
- slug?: string;
182
- description?: string;
183
- date: string;
184
- startDateTime?: string;
185
- endDateTime?: string;
186
- doorsOpenTime?: string;
187
- timezone?: string;
188
- venueId?: number;
189
- venueName?: string;
190
- venueAddress?: string;
191
- location?: string;
192
- imageUrl?: string;
193
- imageURL?: string;
194
- status?: string;
195
- isPublished?: boolean;
196
- isCancelled?: boolean;
197
- availableTickets?: AvailableTicket[];
198
- ticketsAvailable?: number;
199
- ticketsSold?: number;
200
- minPrice?: number;
201
- maxPrice?: number;
202
- ctaText?: string;
203
- ctaState?: 'available' | 'sold_out' | 'coming_soon' | 'ended';
204
- showPerformers?: boolean;
205
- eventSeriesId?: number;
206
- seriesInstanceNumber?: number;
207
- }
208
-
209
- export interface AvailableTicket {
210
- id: number;
211
- name: string;
212
- description?: string;
213
- price: number;
214
- quantity: number;
215
- quantitySold?: number;
216
- quantityAvailable?: number;
217
- minPerOrder?: number;
218
- maxPerOrder?: number;
219
- saleStartDate?: string;
220
- saleEndDate?: string;
221
- isHidden?: boolean;
222
- revealWithPromoCode?: boolean;
223
- ticketType?: number; // 0 = GA, 1 = assigned
224
- sectionId?: number;
225
- sortOrder?: number;
226
- }
227
-
228
- export interface EventPerformersResponse {
229
- performers: Performer[];
230
- showPerformers: boolean;
231
- }
232
-
233
- export interface Performer {
234
- id: number;
235
- displayName: string;
236
- avatar?: string;
237
- order?: number;
238
- }
239
-
240
- // ============================================================================
241
- // Venues
242
- // ============================================================================
243
-
244
- export interface Venue {
245
- id: number;
246
- name: string;
247
- slug?: string;
248
- address?: string;
249
- googleLocationNameCache?: string;
250
- city?: string;
251
- state?: string;
252
- zipCode?: string;
253
- country?: string;
254
- timezone?: string;
255
- logoUrl?: string;
256
- serviceFeePercentage?: number;
257
- serviceFeeCents?: number;
258
- taxPercentage?: number;
259
- organizationId?: number;
260
- }
261
-
262
- // ============================================================================
263
- // Series
264
- // ============================================================================
265
-
266
- export interface SeriesOccurrence {
267
- eventId: EventId;
268
- date: string;
269
- startDateTime: string;
270
- endDateTime?: string;
271
- instanceNumber: number;
272
- status: string;
273
- ticketsAvailable?: number;
274
- ctaState?: string;
275
- }
276
-
277
- export interface SeriesOccurrencesResponse {
278
- seriesId: SeriesId;
279
- occurrences: SeriesOccurrence[];
280
- }
281
-
282
- // ============================================================================
283
- // Series Page
284
- // ============================================================================
285
-
286
- export interface SeriesPageData {
287
- id: number;
288
- title: string;
289
- description: string;
290
- eventSummary?: string;
291
- image?: string;
292
- timeZone: string;
293
- venue: {
294
- id: number;
295
- name: string;
296
- location?: string;
297
- googleLocationNameCache?: string;
298
- faq?: Array<{ question: string; answer: string }> | string;
299
- disclaimer?: string;
300
- };
301
- performers: Array<{
302
- displayName: string;
303
- firstName?: string;
304
- lastName?: string;
305
- profileImage?: string;
306
- }>;
307
- occurrences: Array<{
308
- id: number;
309
- slug: string;
310
- startDateTime: string;
311
- endDateTime: string;
312
- ctaState: {
313
- text: string;
314
- disabled: boolean;
315
- reason?: string;
316
- };
317
- }>;
318
- }
319
-
320
- // ============================================================================
321
- // Entity resolution (type-agnostic public id → concrete entity)
322
- // ============================================================================
323
-
324
- /**
325
- * Response shape of `/api/v2/public/resolve/{id}`. The embed deep-link is
326
- * type-agnostic (`#{id}-{slug}`), so the backend resolves which kind of entity
327
- * the id points at; `data` is the corresponding event / series / collection
328
- * payload (same shape the dedicated fetchers return for that type).
329
- */
330
- export interface ResolvedEntity {
331
- type: 'event' | 'series' | 'collection';
332
- id: string | number;
333
- title?: string;
334
- data: any;
335
- }
336
-
337
- // ============================================================================
338
- // Public Collection
339
- // ============================================================================
340
-
341
- export interface PublicCollectionData {
342
- id: number;
343
- collectionTitle: string;
344
- summary?: string;
345
- description?: string;
346
- coverImage?: string;
347
- events: Array<{
348
- id: number;
349
- title: string;
350
- slug?: string;
351
- startDateTime?: string;
352
- endDateTime?: string;
353
- image?: string;
354
- status?: string;
355
- venue?: { name: string };
356
- minPrice?: number;
357
- }>;
358
- }
359
-
360
- // ============================================================================
361
- // API Configuration
362
- // ============================================================================
363
-
364
- export interface ApiConfig {
365
- baseUrl?: string;
366
- timeout?: number;
367
- /** Number of additional attempts after the first try (default: 2 = 3 total tries). */
368
- retries?: number;
369
- /** Base delay before the first retry; doubles each attempt (default: 500ms). */
370
- retryDelay?: number;
371
- onError?: (error: Error) => void;
372
- }
373
-
374
- // ============================================================================
375
- // Generic API Response
376
- // ============================================================================
377
-
378
- export interface ApiResponse<T> {
379
- success: boolean;
380
- data?: T;
381
- error?: string;
382
- statusCode?: number;
383
- }
1
+ /**
2
+ * API Types for MicDrop Public Checkout API
3
+ *
4
+ * These types define the shape of API requests and responses
5
+ * for the public checkout flow (no authentication required).
6
+ */
7
+
8
+ import type { EventId, SeriesId } from '@getmicdrop/svelte-components';
9
+
10
+ // ============================================================================
11
+ // Payment & Orders
12
+ // ============================================================================
13
+
14
+ export interface PaymentIntentRequest {
15
+ IP?: string;
16
+ productQuantities: Record<string | number, number>;
17
+ }
18
+
19
+ export interface PaymentIntentResponse {
20
+ client_secret: string;
21
+ amount: number;
22
+ amount_total: number;
23
+ tax_amount_exclusive?: number;
24
+ service_fee?: number;
25
+ discount?: number;
26
+ gift_card_amount?: number;
27
+ gift_card_code?: string;
28
+ stripe_publishable_key?: string;
29
+ }
30
+
31
+ export interface CompleteReservationResponse {
32
+ success: boolean;
33
+ message?: string;
34
+ error?: string;
35
+ }
36
+
37
+ export interface CancelReservationResponse {
38
+ success: boolean;
39
+ message?: string;
40
+ error?: string;
41
+ }
42
+
43
+ export interface CreateOrderRequest {
44
+ eventId: string | number;
45
+ promoCode?: string;
46
+ }
47
+
48
+ export interface CreateOrderResponse {
49
+ uuid: string;
50
+ }
51
+
52
+ export interface ValidatePaymentRequest {
53
+ id: string;
54
+ paymentIntentId: string;
55
+ tickets: Record<string | number, number>;
56
+ firstName: string;
57
+ lastName: string;
58
+ email: string;
59
+ paymentMethod: string;
60
+ mailingList?: boolean;
61
+ saleType?: string;
62
+ attendees?: AttendeeInfo[];
63
+ }
64
+
65
+ export interface AttendeeInfo {
66
+ ticketId: string | number;
67
+ firstName: string;
68
+ lastName: string;
69
+ email: string;
70
+ }
71
+
72
+ export interface ValidatePaymentResponse {
73
+ success: boolean;
74
+ status: string;
75
+ orderUUID?: string;
76
+ error?: string;
77
+ }
78
+
79
+ // ============================================================================
80
+ // Session Management
81
+ // ============================================================================
82
+
83
+ export interface ExtendSessionRequest {
84
+ orderUuid: string;
85
+ }
86
+
87
+ export interface ExtendSessionResponse {
88
+ success: boolean;
89
+ newExpiryTime?: string;
90
+ remainingExtensions?: number;
91
+ error?: string;
92
+ /**
93
+ * HTTP status code from the backend on failure. Populated on non-OK
94
+ * responses so callers can distinguish "session already expired"
95
+ * (typically 410 Gone) from "max extensions reached" or generic 5xx.
96
+ * Undefined on network errors and on success.
97
+ */
98
+ statusCode?: number;
99
+ }
100
+
101
+ export interface SessionStatus {
102
+ expiresAt?: string;
103
+ extensionCount?: number;
104
+ remainingExtensions?: number;
105
+ canExtend?: boolean;
106
+ reservationCount?: number;
107
+ error?: string;
108
+ // 404 from /orders/session/{uuid}: the cart's reservations are
109
+ // gone (expired or never existed). Callers polling on an interval
110
+ // MUST treat this as terminal and stop — see CartView.svelte.
111
+ notFound?: boolean;
112
+ }
113
+
114
+ // ============================================================================
115
+ // Promo Codes
116
+ // ============================================================================
117
+
118
+ export interface PromoValidationResponse {
119
+ valid: boolean;
120
+ revealHiddenTickets?: boolean;
121
+ revealTicketIds?: number[];
122
+ provideDiscount?: boolean;
123
+ discountType?: 'percentage' | 'fixed';
124
+ amount?: number;
125
+ code?: string;
126
+ error?: string;
127
+ }
128
+
129
+ export interface HasPromoCodesResponse {
130
+ hasPromoCodes: boolean;
131
+ }
132
+
133
+ // ============================================================================
134
+ // Orders
135
+ // ============================================================================
136
+
137
+ export interface Order {
138
+ uuid: string;
139
+ id?: number;
140
+ customerEmail: string;
141
+ customerFirstName?: string;
142
+ customerLastName?: string;
143
+ status: string;
144
+ totalAmount: number;
145
+ subtotal?: number;
146
+ serviceFeesAmount: number;
147
+ taxAmount: number;
148
+ discount?: number;
149
+ paymentIntentId?: string;
150
+ paymentMethod?: string;
151
+ purchasedTickets: PurchasedTicket[];
152
+ createdAt?: string;
153
+ updatedAt?: string;
154
+ }
155
+
156
+ export interface PurchasedTicket {
157
+ uuid: string;
158
+ id?: number;
159
+ ticketNumber?: string;
160
+ orderId?: string | number;
161
+ attendeeFirstName?: string;
162
+ attendeeLastName?: string;
163
+ attendeeEmail?: string;
164
+ ticketName: string;
165
+ ticketTypeId?: number;
166
+ purchasePrice: number;
167
+ status?: string;
168
+ checkedIn?: boolean;
169
+ checkedInAt?: string;
170
+ }
171
+
172
+ // ============================================================================
173
+ // Events
174
+ // ============================================================================
175
+
176
+ export interface Event {
177
+ eventID: number;
178
+ id?: number;
179
+ name: string;
180
+ title?: string;
181
+ slug?: string;
182
+ description?: string;
183
+ date: string;
184
+ startDateTime?: string;
185
+ endDateTime?: string;
186
+ doorsOpenTime?: string;
187
+ timezone?: string;
188
+ venueId?: number;
189
+ venueName?: string;
190
+ venueAddress?: string;
191
+ location?: string;
192
+ imageUrl?: string;
193
+ imageURL?: string;
194
+ status?: string;
195
+ isPublished?: boolean;
196
+ isCancelled?: boolean;
197
+ availableTickets?: AvailableTicket[];
198
+ ticketsAvailable?: number;
199
+ ticketsSold?: number;
200
+ minPrice?: number;
201
+ maxPrice?: number;
202
+ ctaText?: string;
203
+ ctaState?: 'available' | 'sold_out' | 'coming_soon' | 'ended';
204
+ showPerformers?: boolean;
205
+ eventSeriesId?: number;
206
+ seriesInstanceNumber?: number;
207
+ // ── Passthrough seams (events convergence) ─────────────────────────────
208
+ // Carried verbatim from the wire by parseEvent so view-shape projections
209
+ // (utils/event-transform.js, public-calendar-flow/transform.ts) compose the
210
+ // canonical instead of reading wire fields directly. The object-valued
211
+ // fields are intentionally raw (see composition note in
212
+ // api/transformers/event.ts) — their consumers own the wire variance.
213
+ timeZone?: string;
214
+ eventSummary?: string;
215
+ password?: string;
216
+ hasPassword?: boolean;
217
+ disclaimer?: string;
218
+ ticketType?: number;
219
+ eventTicketingType?: number;
220
+ ageRestriction?: number;
221
+ displayAgeRestriction?: boolean;
222
+ displayStartTime?: boolean;
223
+ displayEndTime?: boolean;
224
+ displayDoorsTime?: boolean;
225
+ collectionId?: number;
226
+ ticketsRemaining?: number;
227
+ ticketsTotal?: number;
228
+ hasHiddenTickets?: boolean;
229
+ stage?: { name?: string } | null;
230
+ stageName?: string;
231
+ // Widget-filter dimensions on the public month feeds (saved-widget engine):
232
+ // stage/category/performer/collection data the embed adapts onto the SC
233
+ // FilterableEvent view (lib/widget-filters.js).
234
+ stageId?: number;
235
+ eventCategoryTypes?: number[] | null;
236
+ publicPerformers?: Array<{
237
+ id?: number;
238
+ displayName?: string;
239
+ image?: string;
240
+ }> | null;
241
+ collectionIds?: number[] | null;
242
+ venue?: Record<string, any>;
243
+ performers?: Record<string, any>[];
244
+ faqs?: Record<string, any>[];
245
+ showtimes?: Record<string, any>[];
246
+ purchasedTickets?: Record<string, any>[];
247
+ }
248
+
249
+ export interface AvailableTicket {
250
+ id: number;
251
+ name: string;
252
+ description?: string;
253
+ price: number;
254
+ quantity: number;
255
+ quantitySold?: number;
256
+ quantityAvailable?: number;
257
+ minPerOrder?: number;
258
+ maxPerOrder?: number;
259
+ saleStartDate?: string;
260
+ saleEndDate?: string;
261
+ isHidden?: boolean;
262
+ revealWithPromoCode?: boolean;
263
+ ticketType?: number; // 0 = GA, 1 = assigned
264
+ sectionId?: number;
265
+ sortOrder?: number;
266
+ }
267
+
268
+ export interface EventPerformersResponse {
269
+ performers: Performer[];
270
+ showPerformers: boolean;
271
+ }
272
+
273
+ export interface Performer {
274
+ id: number;
275
+ displayName: string;
276
+ avatar?: string;
277
+ order?: number;
278
+ }
279
+
280
+ // ============================================================================
281
+ // Venues
282
+ // ============================================================================
283
+
284
+ export interface Venue {
285
+ id: number;
286
+ name: string;
287
+ slug?: string;
288
+ address?: string;
289
+ googleLocationNameCache?: string;
290
+ city?: string;
291
+ state?: string;
292
+ zipCode?: string;
293
+ country?: string;
294
+ timezone?: string;
295
+ logoUrl?: string;
296
+ serviceFeePercentage?: number;
297
+ serviceFeeCents?: number;
298
+ taxPercentage?: number;
299
+ organizationId?: number;
300
+ }
301
+
302
+ // ============================================================================
303
+ // Series
304
+ // ============================================================================
305
+
306
+ export interface SeriesOccurrence {
307
+ eventId: EventId;
308
+ date: string;
309
+ startDateTime: string;
310
+ endDateTime?: string;
311
+ instanceNumber: number;
312
+ status: string;
313
+ ticketsAvailable?: number;
314
+ ctaState?: string;
315
+ }
316
+
317
+ export interface SeriesOccurrencesResponse {
318
+ seriesId: SeriesId;
319
+ occurrences: SeriesOccurrence[];
320
+ }
321
+
322
+ // ============================================================================
323
+ // Series Page
324
+ // ============================================================================
325
+
326
+ export interface SeriesPageData {
327
+ id: number;
328
+ title: string;
329
+ description: string;
330
+ eventSummary?: string;
331
+ image?: string;
332
+ timeZone: string;
333
+ venue: {
334
+ id: number;
335
+ name: string;
336
+ location?: string;
337
+ googleLocationNameCache?: string;
338
+ faq?: Array<{ question: string; answer: string }> | string;
339
+ disclaimer?: string;
340
+ };
341
+ performers: Array<{
342
+ displayName: string;
343
+ firstName?: string;
344
+ lastName?: string;
345
+ profileImage?: string;
346
+ }>;
347
+ occurrences: Array<{
348
+ id: number;
349
+ slug: string;
350
+ startDateTime: string;
351
+ endDateTime: string;
352
+ ctaState: {
353
+ text: string;
354
+ disabled: boolean;
355
+ reason?: string;
356
+ };
357
+ }>;
358
+ }
359
+
360
+ // ============================================================================
361
+ // Entity resolution (type-agnostic public id → concrete entity)
362
+ // ============================================================================
363
+
364
+ /**
365
+ * Response shape of `/api/v2/public/resolve/{id}`. The embed deep-link is
366
+ * type-agnostic (`#{id}-{slug}`), so the backend resolves which kind of entity
367
+ * the id points at; `data` is the corresponding event / series / collection
368
+ * payload (same shape the dedicated fetchers return for that type).
369
+ */
370
+ export interface ResolvedEntity {
371
+ type: 'event' | 'series' | 'collection';
372
+ id: string | number;
373
+ title?: string;
374
+ data: any;
375
+ }
376
+
377
+ // ============================================================================
378
+ // Public Collection
379
+ // ============================================================================
380
+
381
+ export interface PublicCollectionData {
382
+ id: number;
383
+ collectionTitle: string;
384
+ summary?: string;
385
+ description?: string;
386
+ coverImage?: string;
387
+ events: Array<{
388
+ id: number;
389
+ title: string;
390
+ slug?: string;
391
+ startDateTime?: string;
392
+ endDateTime?: string;
393
+ image?: string;
394
+ status?: string;
395
+ venue?: { name: string };
396
+ minPrice?: number;
397
+ }>;
398
+ }
399
+
400
+ // ============================================================================
401
+ // API Configuration
402
+ // ============================================================================
403
+
404
+ export interface ApiConfig {
405
+ baseUrl?: string;
406
+ timeout?: number;
407
+ /** Number of additional attempts after the first try (default: 2 = 3 total tries). */
408
+ retries?: number;
409
+ /** Base delay before the first retry; doubles each attempt (default: 500ms). */
410
+ retryDelay?: number;
411
+ onError?: (_error: Error) => void;
412
+ }
413
+
414
+ // ============================================================================
415
+ // Generic API Response
416
+ // ============================================================================
417
+
418
+ export interface ApiResponse<T> {
419
+ success: boolean;
420
+ data?: T;
421
+ error?: string;
422
+ statusCode?: number;
423
+ }