@ticketlayer/elements 0.2.0

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/cjs/index-DfzcrE9-.js +3598 -0
  4. package/dist/cjs/index.cjs.js +16 -0
  5. package/dist/cjs/loader.cjs.js +12 -0
  6. package/dist/cjs/order-summary-ZMkJ5bez.js +116 -0
  7. package/dist/cjs/sdk-connector-ClDF3013.js +108 -0
  8. package/dist/cjs/ticketlayer-elements.cjs.js +24 -0
  9. package/dist/cjs/tl-buy-modal.cjs.entry.js +127 -0
  10. package/dist/cjs/tl-buy-tickets-button.cjs.entry.js +131 -0
  11. package/dist/cjs/tl-buy-tickets-wrapper.cjs.entry.js +58 -0
  12. package/dist/cjs/tl-cart-badge.cjs.entry.js +109 -0
  13. package/dist/cjs/tl-cart-drawer.cjs.entry.js +67 -0
  14. package/dist/cjs/tl-cart.cjs.entry.js +148 -0
  15. package/dist/cjs/tl-checkout-wrapper.cjs.entry.js +57 -0
  16. package/dist/cjs/tl-event-card.cjs.entry.js +140 -0
  17. package/dist/cjs/tl-event-list.cjs.entry.js +80 -0
  18. package/dist/cjs/tl-login.cjs.entry.js +184 -0
  19. package/dist/cjs/tl-my-orders.cjs.entry.js +123 -0
  20. package/dist/cjs/tl-occurrence-selector_2.cjs.entry.js +754 -0
  21. package/dist/cjs/tl-order-confirmation.cjs.entry.js +146 -0
  22. package/dist/cjs/tl-order-tickets_2.cjs.entry.js +3198 -0
  23. package/dist/cjs/tl-promo-code.cjs.entry.js +75 -0
  24. package/dist/cjs/tl-seat-map.cjs.entry.js +147 -0
  25. package/dist/collection/collection-manifest.json +29 -0
  26. package/dist/collection/components/tl-buy-modal/tl-buy-modal.css +264 -0
  27. package/dist/collection/components/tl-buy-modal/tl-buy-modal.js +249 -0
  28. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.css +120 -0
  29. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.js +412 -0
  30. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.css +23 -0
  31. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.js +192 -0
  32. package/dist/collection/components/tl-cart/tl-cart.css +251 -0
  33. package/dist/collection/components/tl-cart/tl-cart.js +314 -0
  34. package/dist/collection/components/tl-cart-badge/tl-cart-badge.css +138 -0
  35. package/dist/collection/components/tl-cart-badge/tl-cart-badge.js +217 -0
  36. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.css +98 -0
  37. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.js +185 -0
  38. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.css +23 -0
  39. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.js +148 -0
  40. package/dist/collection/components/tl-event-card/event-card-adapter.js +23 -0
  41. package/dist/collection/components/tl-event-card/tl-event-card.css +175 -0
  42. package/dist/collection/components/tl-event-card/tl-event-card.js +205 -0
  43. package/dist/collection/components/tl-event-list/tl-event-list.css +134 -0
  44. package/dist/collection/components/tl-event-list/tl-event-list.js +171 -0
  45. package/dist/collection/components/tl-login/tl-login.css +133 -0
  46. package/dist/collection/components/tl-login/tl-login.js +309 -0
  47. package/dist/collection/components/tl-my-orders/tl-my-orders.css +204 -0
  48. package/dist/collection/components/tl-my-orders/tl-my-orders.js +221 -0
  49. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.css +658 -0
  50. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.js +707 -0
  51. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.css +176 -0
  52. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.js +298 -0
  53. package/dist/collection/components/tl-order-tickets/tl-order-tickets.css +30 -0
  54. package/dist/collection/components/tl-order-tickets/tl-order-tickets.js +122 -0
  55. package/dist/collection/components/tl-promo-code/tl-promo-code.css +106 -0
  56. package/dist/collection/components/tl-promo-code/tl-promo-code.js +181 -0
  57. package/dist/collection/components/tl-seat-map/tl-seat-map.css +85 -0
  58. package/dist/collection/components/tl-seat-map/tl-seat-map.js +366 -0
  59. package/dist/collection/components/tl-ticket/tl-ticket.css +90 -0
  60. package/dist/collection/components/tl-ticket/tl-ticket.js +129 -0
  61. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.css +205 -0
  62. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.js +332 -0
  63. package/dist/collection/index.js +10 -0
  64. package/dist/collection/utils/order-summary.js +101 -0
  65. package/dist/collection/utils/sdk-connector.js +100 -0
  66. package/dist/collection/utils/testing/mock-sdk.js +95 -0
  67. package/dist/components/index.d.ts +35 -0
  68. package/dist/components/index.js +1 -0
  69. package/dist/components/order-summary.js +1 -0
  70. package/dist/components/sdk-connector.js +1 -0
  71. package/dist/components/tl-buy-modal.d.ts +11 -0
  72. package/dist/components/tl-buy-modal.js +1 -0
  73. package/dist/components/tl-buy-tickets-button.d.ts +11 -0
  74. package/dist/components/tl-buy-tickets-button.js +1 -0
  75. package/dist/components/tl-buy-tickets-wrapper.d.ts +11 -0
  76. package/dist/components/tl-buy-tickets-wrapper.js +1 -0
  77. package/dist/components/tl-buy-tickets-wrapper2.js +1 -0
  78. package/dist/components/tl-cart-badge.d.ts +11 -0
  79. package/dist/components/tl-cart-badge.js +1 -0
  80. package/dist/components/tl-cart-drawer.d.ts +11 -0
  81. package/dist/components/tl-cart-drawer.js +1 -0
  82. package/dist/components/tl-cart.d.ts +11 -0
  83. package/dist/components/tl-cart.js +1 -0
  84. package/dist/components/tl-cart2.js +1 -0
  85. package/dist/components/tl-checkout-wrapper.d.ts +11 -0
  86. package/dist/components/tl-checkout-wrapper.js +1 -0
  87. package/dist/components/tl-checkout-wrapper2.js +1 -0
  88. package/dist/components/tl-event-card.d.ts +11 -0
  89. package/dist/components/tl-event-card.js +1 -0
  90. package/dist/components/tl-event-card2.js +1 -0
  91. package/dist/components/tl-event-list.d.ts +11 -0
  92. package/dist/components/tl-event-list.js +1 -0
  93. package/dist/components/tl-login.d.ts +11 -0
  94. package/dist/components/tl-login.js +1 -0
  95. package/dist/components/tl-login2.js +1 -0
  96. package/dist/components/tl-my-orders.d.ts +11 -0
  97. package/dist/components/tl-my-orders.js +1 -0
  98. package/dist/components/tl-occurrence-selector.d.ts +11 -0
  99. package/dist/components/tl-occurrence-selector.js +1 -0
  100. package/dist/components/tl-occurrence-selector2.js +1 -0
  101. package/dist/components/tl-order-confirmation.d.ts +11 -0
  102. package/dist/components/tl-order-confirmation.js +1 -0
  103. package/dist/components/tl-order-tickets.d.ts +11 -0
  104. package/dist/components/tl-order-tickets.js +1 -0
  105. package/dist/components/tl-order-tickets2.js +1 -0
  106. package/dist/components/tl-promo-code.d.ts +11 -0
  107. package/dist/components/tl-promo-code.js +1 -0
  108. package/dist/components/tl-seat-map.d.ts +11 -0
  109. package/dist/components/tl-seat-map.js +1 -0
  110. package/dist/components/tl-ticket-selector.d.ts +11 -0
  111. package/dist/components/tl-ticket-selector.js +1 -0
  112. package/dist/components/tl-ticket-selector2.js +1 -0
  113. package/dist/components/tl-ticket.d.ts +11 -0
  114. package/dist/components/tl-ticket.js +1 -0
  115. package/dist/components/tl-ticket2.js +1 -0
  116. package/dist/elements.docs.d.ts +454 -0
  117. package/dist/elements.docs.json +3008 -0
  118. package/dist/esm/index-Ba-RZTFI.js +3588 -0
  119. package/dist/esm/index.js +4 -0
  120. package/dist/esm/loader.js +10 -0
  121. package/dist/esm/order-summary-BGekdjN9.js +103 -0
  122. package/dist/esm/sdk-connector-CqhvfyKV.js +102 -0
  123. package/dist/esm/ticketlayer-elements.js +20 -0
  124. package/dist/esm/tl-buy-modal.entry.js +125 -0
  125. package/dist/esm/tl-buy-tickets-button.entry.js +129 -0
  126. package/dist/esm/tl-buy-tickets-wrapper.entry.js +56 -0
  127. package/dist/esm/tl-cart-badge.entry.js +107 -0
  128. package/dist/esm/tl-cart-drawer.entry.js +65 -0
  129. package/dist/esm/tl-cart.entry.js +146 -0
  130. package/dist/esm/tl-checkout-wrapper.entry.js +55 -0
  131. package/dist/esm/tl-event-card.entry.js +138 -0
  132. package/dist/esm/tl-event-list.entry.js +78 -0
  133. package/dist/esm/tl-login.entry.js +182 -0
  134. package/dist/esm/tl-my-orders.entry.js +121 -0
  135. package/dist/esm/tl-occurrence-selector_2.entry.js +751 -0
  136. package/dist/esm/tl-order-confirmation.entry.js +144 -0
  137. package/dist/esm/tl-order-tickets_2.entry.js +3195 -0
  138. package/dist/esm/tl-promo-code.entry.js +73 -0
  139. package/dist/esm/tl-seat-map.entry.js +145 -0
  140. package/dist/index.cjs.js +1 -0
  141. package/dist/index.js +1 -0
  142. package/dist/ticketlayer-elements/index.esm.js +1 -0
  143. package/dist/ticketlayer-elements/p-0291df4c.entry.js +1 -0
  144. package/dist/ticketlayer-elements/p-10f01a1f.entry.js +1 -0
  145. package/dist/ticketlayer-elements/p-11273f8f.entry.js +1 -0
  146. package/dist/ticketlayer-elements/p-340ab4f5.entry.js +1 -0
  147. package/dist/ticketlayer-elements/p-41d22d7c.entry.js +1 -0
  148. package/dist/ticketlayer-elements/p-82752e3b.entry.js +1 -0
  149. package/dist/ticketlayer-elements/p-976770f3.entry.js +1 -0
  150. package/dist/ticketlayer-elements/p-9a903ff6.entry.js +1 -0
  151. package/dist/ticketlayer-elements/p-9c9072c8.entry.js +1 -0
  152. package/dist/ticketlayer-elements/p-9d8163d6.entry.js +1 -0
  153. package/dist/ticketlayer-elements/p-BGekdjN9.js +1 -0
  154. package/dist/ticketlayer-elements/p-Ba-RZTFI.js +2 -0
  155. package/dist/ticketlayer-elements/p-CqhvfyKV.js +1 -0
  156. package/dist/ticketlayer-elements/p-a5c90b68.entry.js +1 -0
  157. package/dist/ticketlayer-elements/p-b6d479ad.entry.js +1 -0
  158. package/dist/ticketlayer-elements/p-dd43f015.entry.js +1 -0
  159. package/dist/ticketlayer-elements/p-eb640760.entry.js +1 -0
  160. package/dist/ticketlayer-elements/p-ee3aa227.entry.js +1 -0
  161. package/dist/ticketlayer-elements/p-fb9444c4.entry.js +1 -0
  162. package/dist/ticketlayer-elements/ticketlayer-elements.css +1 -0
  163. package/dist/ticketlayer-elements/ticketlayer-elements.esm.js +1 -0
  164. package/dist/types/components/tl-buy-modal/tl-buy-modal.d.ts +54 -0
  165. package/dist/types/components/tl-buy-tickets-button/tl-buy-tickets-button.d.ts +61 -0
  166. package/dist/types/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.d.ts +52 -0
  167. package/dist/types/components/tl-cart/tl-cart.d.ts +80 -0
  168. package/dist/types/components/tl-cart-badge/tl-cart-badge.d.ts +36 -0
  169. package/dist/types/components/tl-cart-drawer/tl-cart-drawer.d.ts +35 -0
  170. package/dist/types/components/tl-checkout-wrapper/tl-checkout-wrapper.d.ts +39 -0
  171. package/dist/types/components/tl-event-card/event-card-adapter.d.ts +23 -0
  172. package/dist/types/components/tl-event-card/tl-event-card.d.ts +55 -0
  173. package/dist/types/components/tl-event-list/tl-event-list.d.ts +30 -0
  174. package/dist/types/components/tl-login/tl-login.d.ts +59 -0
  175. package/dist/types/components/tl-my-orders/tl-my-orders.d.ts +39 -0
  176. package/dist/types/components/tl-occurrence-selector/tl-occurrence-selector.d.ts +208 -0
  177. package/dist/types/components/tl-order-confirmation/tl-order-confirmation.d.ts +54 -0
  178. package/dist/types/components/tl-order-tickets/tl-order-tickets.d.ts +21 -0
  179. package/dist/types/components/tl-promo-code/tl-promo-code.d.ts +39 -0
  180. package/dist/types/components/tl-seat-map/tl-seat-map.d.ts +68 -0
  181. package/dist/types/components/tl-ticket/tl-ticket.d.ts +28 -0
  182. package/dist/types/components/tl-ticket-selector/tl-ticket-selector.d.ts +78 -0
  183. package/dist/types/components.d.ts +1629 -0
  184. package/dist/types/index.d.ts +14 -0
  185. package/dist/types/stencil-public-runtime.d.ts +1839 -0
  186. package/dist/types/utils/order-summary.d.ts +67 -0
  187. package/dist/types/utils/sdk-connector.d.ts +113 -0
  188. package/dist/types/utils/testing/mock-sdk.d.ts +36 -0
  189. package/elements.catalogue.json +968 -0
  190. package/loader/cdn.js +1 -0
  191. package/loader/index.cjs.js +1 -0
  192. package/loader/index.d.ts +24 -0
  193. package/loader/index.es2017.js +1 -0
  194. package/loader/index.js +2 -0
  195. package/package.json +101 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * SDK Connector
3
+ *
4
+ * Utility to connect external SDK instances to Elements components.
5
+ */
6
+ // The SDK is shared between bundles via the `window.Ticketlayer` registry that
7
+ // @ticketlayer/live publishes (createLiveClient → publishClient). Elements never
8
+ // import the SDK; they read this global and bind to its connector view.
9
+ const READY_EVENT = 'ticketlayer:ready';
10
+ // Back-compat slot for hosts that install a connector manually via setSDK().
11
+ const MANUAL_SLOT = '__TICKETLAYER_SDK__';
12
+ function readGlobalSDK() {
13
+ if (typeof window === 'undefined')
14
+ return null;
15
+ const win = window;
16
+ const reg = win.Ticketlayer;
17
+ return (reg?.getSDK?.() ?? reg?.sdk ?? win[MANUAL_SLOT]) || null;
18
+ }
19
+ /**
20
+ * Manually install an SDK/connector instance (escape hatch). The normal path is
21
+ * for the host to call createLiveClient(), which auto-publishes on the registry.
22
+ */
23
+ export function setSDK(sdk) {
24
+ if (typeof window === 'undefined')
25
+ return;
26
+ window[MANUAL_SLOT] = sdk;
27
+ // Wake any components already awaiting whenSDK().
28
+ window.dispatchEvent(new CustomEvent(READY_EVENT, { detail: sdk }));
29
+ }
30
+ /**
31
+ * Get the SDK instance synchronously. Throws if not yet available - prefer
32
+ * whenSDK() in lifecycle methods so mounting before Live is ready isn't an error.
33
+ */
34
+ export function getSDK() {
35
+ const sdk = readGlobalSDK();
36
+ if (!sdk) {
37
+ throw new Error('[Ticketlayer Elements] SDK not ready. Create a Live client (createLiveClient) ' +
38
+ 'or await whenSDK() before using Elements.');
39
+ }
40
+ return sdk;
41
+ }
42
+ /** True if a client is currently registered. */
43
+ export function hasSDK() {
44
+ return readGlobalSDK() !== null;
45
+ }
46
+ /**
47
+ * Resolve when the SDK is available - immediately if Live is already up, else
48
+ * on the `ticketlayer:ready` event. Replaces busy-wait polling in components.
49
+ */
50
+ export function whenSDK(timeoutMs = 15000) {
51
+ const existing = readGlobalSDK();
52
+ if (existing)
53
+ return Promise.resolve(existing);
54
+ if (typeof window === 'undefined') {
55
+ return Promise.reject(new Error('[Ticketlayer Elements] No window; SDK unavailable.'));
56
+ }
57
+ return new Promise((resolve, reject) => {
58
+ let settled = false;
59
+ const finish = () => {
60
+ const sdk = readGlobalSDK();
61
+ if (sdk && !settled) {
62
+ settled = true;
63
+ cleanup();
64
+ resolve(sdk);
65
+ }
66
+ };
67
+ const cleanup = () => {
68
+ window.removeEventListener(READY_EVENT, finish);
69
+ clearTimeout(timer);
70
+ };
71
+ const timer = setTimeout(() => {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ cleanup();
76
+ reject(new Error('[Ticketlayer Elements] SDK not initialized. Create a Live client before using Elements.'));
77
+ }, timeoutMs);
78
+ window.addEventListener(READY_EVENT, finish);
79
+ // Late-publish race guard: re-check once listener is attached.
80
+ finish();
81
+ });
82
+ }
83
+ /**
84
+ * Subscribe to SDK events (waits for the SDK, returns an unsubscribe function).
85
+ */
86
+ export function onSDKEvent(event, callback) {
87
+ let off = null;
88
+ let cancelled = false;
89
+ whenSDK()
90
+ .then((sdk) => {
91
+ if (cancelled)
92
+ return;
93
+ off = sdk.on(event, callback);
94
+ })
95
+ .catch(() => undefined);
96
+ return () => {
97
+ cancelled = true;
98
+ off?.();
99
+ };
100
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Mock SDK for spec tests. Installs a connector-shaped object on the manual
3
+ * slot the sdk-connector reads, with an in-memory bus so tests can push
4
+ * SDK events (cart:updated, auth:changed, checkout:completed) at components.
5
+ */
6
+ import { setSDK } from "../sdk-connector";
7
+ export function createMockSDK(opts = {}) {
8
+ const handlers = new Map();
9
+ const on = (event, cb) => {
10
+ if (!handlers.has(event))
11
+ handlers.set(event, new Set());
12
+ handlers.get(event).add(cb);
13
+ return () => handlers.get(event)?.delete(cb);
14
+ };
15
+ const off = (event, cb) => {
16
+ handlers.get(event)?.delete(cb);
17
+ };
18
+ const emit = (event, payload) => {
19
+ handlers.get(event)?.forEach((h) => h(payload));
20
+ };
21
+ const authState = opts.authState ?? { customer: null, authenticated: false };
22
+ const eventsManager = {
23
+ list: async () => ({ items: [] }),
24
+ get: async () => null,
25
+ getTicketTypes: async () => [],
26
+ ...opts.events,
27
+ };
28
+ const cartManager = {
29
+ get: async () => null,
30
+ on,
31
+ off,
32
+ addItem: async () => null,
33
+ addItems: async () => null,
34
+ removeItem: async () => null,
35
+ addSeat: async () => null,
36
+ removeSeat: async () => null,
37
+ ...opts.cart,
38
+ };
39
+ const ordersManager = {
40
+ mine: async () => [],
41
+ get: async () => null,
42
+ ticketPdf: async () => new Blob(),
43
+ ...opts.orders,
44
+ };
45
+ const authManager = {
46
+ get customer() {
47
+ return authState.customer;
48
+ },
49
+ get authenticated() {
50
+ return authState.authenticated;
51
+ },
52
+ requestMagicLink: async () => true,
53
+ exchange: async () => ({ customer: authState.customer, authenticated: true }),
54
+ logout: async () => undefined,
55
+ ...opts.auth,
56
+ };
57
+ const presaleManager = {
58
+ redeem: async () => ({ benefit: 'presale.test', alreadyHeld: false }),
59
+ ...opts.presale,
60
+ };
61
+ const sdk = {
62
+ getEventsManager: () => eventsManager,
63
+ getCartManager: () => cartManager,
64
+ getOrdersManager: () => ordersManager,
65
+ on,
66
+ off,
67
+ event: () => ({ openModal: () => undefined }),
68
+ checkout: { openModal: () => undefined, closeModal: () => undefined },
69
+ closeModal: () => undefined,
70
+ emit,
71
+ authState,
72
+ };
73
+ if (!opts.withoutAuth)
74
+ sdk.getAuthManager = () => authManager;
75
+ if (!opts.withoutPresale)
76
+ sdk.getPresaleManager = () => presaleManager;
77
+ return sdk;
78
+ }
79
+ /** Install a mock on the connector's manual slot; returns it for assertions. */
80
+ export function installMockSDK(opts = {}) {
81
+ const sdk = createMockSDK(opts);
82
+ setSDK(sdk);
83
+ return sdk;
84
+ }
85
+ export function clearMockSDK() {
86
+ if (typeof window !== 'undefined')
87
+ delete window.__TICKETLAYER_SDK__;
88
+ }
89
+ /** Let pending promise chains settle before re-rendering. */
90
+ export async function flush(page, rounds = 3) {
91
+ for (let i = 0; i < rounds; i++) {
92
+ await new Promise((r) => setTimeout(r, 0));
93
+ await page.waitForChanges();
94
+ }
95
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Get the base path to where the assets can be found. Use "setAssetPath(path)"
3
+ * if the path needs to be customized.
4
+ */
5
+ export declare const getAssetPath: (path: string) => string;
6
+
7
+ /**
8
+ * Used to manually set the base path where assets can be found.
9
+ * If the script is used as "module", it's recommended to use "import.meta.url",
10
+ * such as "setAssetPath(import.meta.url)". Other options include
11
+ * "setAssetPath(document.currentScript.src)", or using a bundler's replace plugin to
12
+ * dynamically set the path at build time, such as "setAssetPath(process.env.ASSET_PATH)".
13
+ * But do note that this configuration depends on how your script is bundled, or lack of
14
+ * bundling, and where your assets can be loaded from. Additionally custom bundling
15
+ * will have to ensure the static assets are copied to its build directory.
16
+ */
17
+ export declare const setAssetPath: (path: string) => void;
18
+
19
+ /**
20
+ * Used to specify a nonce value that corresponds with an application's CSP.
21
+ * When set, the nonce will be added to all dynamically created script and style tags at runtime.
22
+ * Alternatively, the nonce value can be set on a meta tag in the DOM head
23
+ * (<meta name="csp-nonce" content="{ nonce value here }" />) which
24
+ * will result in the same behavior.
25
+ */
26
+ export declare const setNonce: (nonce: string) => void
27
+
28
+ export interface SetPlatformOptions {
29
+ raf?: (c: FrameRequestCallback) => number;
30
+ ael?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
31
+ rel?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
32
+ }
33
+ export declare const setPlatformOptions: (opts: SetPlatformOptions) => void;
34
+
35
+ export * from '../types';
@@ -0,0 +1 @@
1
+ export{getAssetPath,render,setAssetPath,setNonce,setPlatformOptions}from"@stencil/core/internal/client";export{g as getSDK,h as hasSDK,o as onSDKEvent,s as setSDK,w as whenSDK}from"./sdk-connector.js";export{T as TlBuyTicketsWrapper}from"./tl-buy-tickets-wrapper2.js";export{T as TlCheckoutWrapper}from"./tl-checkout-wrapper2.js";
@@ -0,0 +1 @@
1
+ function n(n,e="GBP"){if(null==n||""===n)return"";const r=new Intl.NumberFormat("en-GB",{style:"currency",currency:e});if("number"==typeof n)return r.format(n/100);const t=Number(n);return Number.isNaN(t)?String(n):r.format(t)}function e(n){return new Date(n).toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"})}function r(n){return new Date(n).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"})}function t(n){return(n.items??[]).filter((n=>!n.type||"ticket"===n.type))}function u(n){return t(n).reduce(((n,e)=>n+(Number(e.quantity)||0)),0)||n.tickets?.length||0}function c(n){return n.eventName||t(n)[0]?.name||n.items?.[0]?.name||null}function i(n,e){const r=n?.customerEmail||n?.customer?.email;if(r)return r;const t=e;return t?.email||null}function s(n){return n?n.replace(/_/g," ").replace(/^\w/,(n=>n.toUpperCase())):""}function a(n){switch(n){case"confirmed":return"success";case"completed":case"fulfilled":return"info";case"pending":case"processing":return"warning";case"cancelled":case"expired":case"failed":return"error";default:return"muted"}}function o(n,e){return n instanceof Error&&n.message?n.message:e}function f(n){return!(!n||"object"!=typeof n||401!==n.status&&403!==n.status&&"NO_SESSION"!==n.code&&"NOT_AUTHENTICATED"!==n.code)}async function l(n,e,r=12){const t=n.getEventsManager(),u=(await t.list({limit:r})).items.slice(0,r);for(const n of u){const r=await t.get(n.id).catch((()=>null)),u=r?.occurrences?.find((n=>n.id===e));if(u)return{eventId:r?.id??n.id,eventName:r?.name??n.name??"",startsAt:u.startsAt??null}}return null}export{n as a,s as b,i as c,e as d,o as e,r as f,t as g,f as i,c as o,l as r,a as s,u as t}
@@ -0,0 +1 @@
1
+ const e="ticketlayer:ready",n="__TICKETLAYER_SDK__";function t(){if("undefined"==typeof window)return null;const e=window,t=e.Ticketlayer;return(t?.getSDK?.()??t?.sdk??e[n])||null}function i(t){"undefined"!=typeof window&&(window[n]=t,window.dispatchEvent(new CustomEvent(e,{detail:t})))}function o(){const e=t();if(!e)throw new Error("[Ticketlayer Elements] SDK not ready. Create a Live client (createLiveClient) or await whenSDK() before using Elements.");return e}function r(){return null!==t()}function l(n=15e3){const i=t();return i?Promise.resolve(i):"undefined"==typeof window?Promise.reject(new Error("[Ticketlayer Elements] No window; SDK unavailable.")):new Promise(((i,o)=>{let r=!1;const l=()=>{const e=t();e&&!r&&(r=!0,w(),i(e))},w=()=>{window.removeEventListener(e,l),clearTimeout(u)},u=setTimeout((()=>{r||(r=!0,w(),o(new Error("[Ticketlayer Elements] SDK not initialized. Create a Live client before using Elements.")))}),n);window.addEventListener(e,l),l()}))}function w(e,n){let t=null,i=!1;return l().then((o=>{i||(t=o.on(e,n))})).catch((()=>{})),()=>{i=!0,t?.()}}export{o as g,r as h,w as o,i as s,l as w}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlBuyModal extends Components.TlBuyModal, HTMLElement {}
4
+ export const TlBuyModal: {
5
+ prototype: TlBuyModal;
6
+ new (): TlBuyModal;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as e,HTMLElement as t,createEvent as r,h as a,Host as i,transformTag as s}from"@stencil/core/internal/client";import{w as o,g as c}from"./sdk-connector.js";import{d as n}from"./tl-occurrence-selector2.js";import{d}from"./tl-ticket-selector2.js";const l=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.tlClose=r(this,"tlClose",7),this.tlCheckout=r(this,"tlCheckout",7),this.tlError=r(this,"tlError",7),this.step="loading",this.eventName="",this.imageUrl="",this.venueLabel="",this.dateSummary="",this.selectedOccurrenceId=null,this.occurrenceCount=0,this.occurrenceLabel="",this.error=null,this.handleOccurrenceSelect=e=>{const t=e.detail.occurrence;this.selectedOccurrenceId=t.id,this.occurrenceLabel=this.labelFor(t),this.step="tickets"},this.handleAdded=()=>{this.step="done"},this.backToDates=()=>{this.selectedOccurrenceId=null,this.step="occurrence"},this.close=()=>this.tlClose.emit(),this.goCheckout=()=>this.tlCheckout.emit()}async componentWillLoad(){if(this.eventId)try{await o();const e=await c().getEventsManager().get(this.eventId);this.eventName=e?.name??"Tickets",this.imageUrl=e?.imageUrl||e?.heroImageUrl||"",this.venueLabel=[e?.venueName,e?.venueCity].filter(Boolean).join(", ");const t=e?.occurrences??[];this.occurrenceCount=t.length,this.dateSummary=this.summariseDates(t);const r=this.occurrenceId??(1===t.length?t[0]?.id:null);r?(this.selectedOccurrenceId=r,this.occurrenceLabel=this.labelFor(t.find((e=>e.id===r))),this.step="tickets"):this.step="occurrence"}catch(e){this.fail(e instanceof Error?e.message:"Could not load this event")}else this.fail("No event specified")}fail(e){this.error=e,this.step="error",this.tlError.emit({message:e})}summariseDates(e){const t=e.map((e=>e.startsAt)).filter((e=>!!e)).sort();if(0===t.length)return"";const r=e=>new Date(e).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"});if(1===t.length)return new Date(t[0]).toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short",year:"numeric"});const a=r(t[0]),i=r(t[t.length-1]);return`${a===i?a:`${a} – ${i}`} · ${t.length} dates`}labelFor(e){return e?.startsAt?new Date(e.startsAt).toLocaleString("en-GB",{weekday:"short",day:"numeric",month:"short",hour:"2-digit",minute:"2-digit"}):""}stepKicker(){switch(this.step){case"occurrence":return"Choose a date";case"tickets":return"Select tickets";case"done":return"Nice one";default:return"Tickets"}}render(){return a(i,{key:"1245e518c2b5232f4d9dba091cf808cd3867fbef"},a("div",{key:"4e770fccdd785444f1cc87df4adab5a5dc1bf58a",class:"overlay",onClick:e=>{e.target===e.currentTarget&&this.close()}},a("div",{key:"57b13dac690028aeebd6a601acfba07f00854c40",class:{panel:!0,"panel--wide":"occurrence"===this.step},role:"dialog","aria-modal":"true","aria-label":this.eventName},a("header",{key:"881e9cc70a0ca25947f272b9ebcb2e6d4b4268f2",class:"panel-header"},this.imageUrl&&a("div",{key:"753f7df1b5118dfacbbc6b89b4e5d7ba114f6cdf",class:"event-thumb",style:{backgroundImage:`url(${this.imageUrl})`}}),a("div",{key:"9aaa32d1add90fabd1b0ea0c100f198962f4e6a5",class:"titles"},a("span",{key:"538032bdf2338206ad763417386852ff97cc472f",class:"kicker"},this.stepKicker()),a("h2",{key:"71429804179e7fbbea1fa90a2937a065517092f5",class:"event-name"},this.eventName),this.venueLabel&&a("p",{key:"dd968b397deab890df3a4fbdff33226e82bd9660",class:"event-meta"},this.venueLabel),this.dateSummary&&a("p",{key:"f40e6049d09b06c9f599e7d14d6fbb43b39b22fd",class:"event-meta"},this.dateSummary)),a("button",{key:"dbe0908f8cd8544654b627921f68cc4961802b77",class:"close-btn","aria-label":"Close",onClick:this.close},a("svg",{key:"23a750830e6e16d28cbcd5025507d25848aaadf7",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},a("path",{key:"e81b8763a5c781f72c1ca8a2113482948e3ba8cc",d:"M6 6l12 12M18 6L6 18","stroke-linecap":"round"})))),a("div",{key:"da71e610f907cf53e78246d2065aaf526d5ceffd",class:"panel-body"},"loading"===this.step&&a("div",{key:"28cbb9a98c7b08fa8dcb9d8d5dfbf3bec93fe38d",class:"state-msg"},a("span",{key:"915c8de87cbdc7da1ccf0622ce6c0f02fccf2cad",class:"spinner"})," Loading…"),"error"===this.step&&a("div",{key:"5785578bfef6f1ee81d938d91ffd3ded975f8c12",class:"state-msg error"},this.error),"occurrence"===this.step&&a("tl-occurrence-selector",{key:"eeb853eab141c3c103015e82d221a140f6a3a109",eventId:this.eventId,onTlSelect:this.handleOccurrenceSelect}),"tickets"===this.step&&this.selectedOccurrenceId&&a("div",{key:"f608f592ba651eb431375433eb4ff9393863ade5",class:"tickets-step"},this.occurrenceCount>1&&a("button",{key:"84adfbdbeaceb2cf4238c6ffd09558b4499ca940",class:"back-link",onClick:this.backToDates},"← Change date"),this.occurrenceLabel&&a("p",{key:"0317e9194049608711e8c622142c3ad2c0a5dc12",class:"occ-label"},this.occurrenceLabel),a("tl-ticket-selector",{key:"27b1e05d9d92fb8d519375e2b27d4b5ea0a4890a",eventId:this.eventId,occurrenceId:this.selectedOccurrenceId,onTlAddToCart:this.handleAdded})),"done"===this.step&&a("div",{key:"0853088206988c66d489f8804df7899821d49e64",class:"done-step"},a("div",{key:"c2955b893c4dffaadcdfd27bee96ef2724a131a6",class:"done-mark"},"🎟️"),a("p",{key:"370c30dfcbc0c25b4794d984dd261a3a5779a9dc",class:"done-title"},"Added to your cart"),a("p",{key:"c462f3c9292740e2fd2c74b173484f80a5dc1a30",class:"done-sub"},"Held for you while you check out."),a("button",{key:"484991f79572e3213ad6413a1af87599880c3643",class:"primary-btn",onClick:this.goCheckout},"Go to checkout"),a("button",{key:"5b4ba5a472b794e8f5af0f131dad1c8c11b869f5",class:"ghost-btn",onClick:this.close},"Keep browsing"))))))}static get style(){return":host{--_bg:var(--tl-background, #ffffff);--_fg:var(--tl-foreground, #111827);--_muted:var(--tl-muted, #f3f4f6);--_muted-fg:var(--tl-muted-foreground, #6b7280);--_border:var(--tl-border, #e5e7eb);--_primary:var(--tl-primary, #6366f1);--_primary-fg:var(--tl-primary-foreground, #ffffff);--_radius:var(--tl-radius-lg, var(--tl-radius, 0.75rem));--_font:var(--tl-font-family, system-ui, -apple-system, sans-serif);font-family:var(--_font)}.overlay{position:fixed;inset:0;z-index:2147483646;display:flex;align-items:center;justify-content:center;padding:16px;background:rgba(8, 8, 16, 0.72);backdrop-filter:blur(4px);animation:tl-fade 0.18s ease-out}.panel{width:100%;max-width:460px;max-height:90vh;display:flex;flex-direction:column;overflow:hidden;background:var(--_bg);color:var(--_fg);border:1px solid var(--_border);border-radius:var(--_radius);box-shadow:0 24px 64px rgba(0, 0, 0, 0.45);animation:tl-rise 0.22s cubic-bezier(0.16, 1, 0.3, 1);transition:max-width 0.25s cubic-bezier(0.16, 1, 0.3, 1)}.panel--wide{max-width:720px}.panel-header{display:flex;align-items:center;gap:14px;padding:16px 18px;border-bottom:1px solid var(--_border)}.event-thumb{flex:none;width:56px;height:56px;border-radius:12px;background-size:cover;background-position:center;background-color:var(--_muted);border:1px solid var(--_border)}.titles{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}.event-meta{margin:0;font-size:0.8rem;color:var(--_muted-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kicker{font-size:0.72rem;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--_primary)}.event-name{margin:0;font-size:1.18rem;font-weight:700;line-height:1.25;color:var(--_fg);overflow:hidden;text-overflow:ellipsis}.close-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:0;border-radius:999px;background:var(--_muted);color:var(--_muted-fg);cursor:pointer;transition:color 0.15s, background 0.15s}.close-btn:hover{color:var(--_fg)}.close-btn svg{width:16px;height:16px}.panel-body{padding:18px 22px 22px;overflow-y:auto}.state-msg{display:flex;align-items:center;justify-content:center;gap:10px;padding:40px 0;color:var(--_muted-fg)}.state-msg.error{color:#b91c1c}.spinner{width:16px;height:16px;border:2px solid var(--_border);border-top-color:var(--_primary);border-radius:999px;animation:tl-spin 0.7s linear infinite}.tickets-step{display:flex;flex-direction:column;gap:6px}.back-link{align-self:flex-start;padding:0;border:0;background:none;color:var(--_primary);font-size:0.85rem;font-weight:500;cursor:pointer}.back-link:hover{text-decoration:underline}.occ-label{margin:2px 0 8px;font-size:0.9rem;font-weight:600;color:var(--_fg)}.done-step{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;padding:16px 0 4px}.done-mark{font-size:2.4rem;line-height:1;margin-bottom:6px}.done-title{margin:0;font-size:1.1rem;font-weight:700;color:var(--_fg)}.done-sub{margin:0 0 14px;font-size:0.9rem;color:var(--_muted-fg)}.primary-btn{width:100%;padding:13px;border:0;border-radius:var(--tl-radius-md, 0.5rem);background:var(--_primary);color:var(--_primary-fg);font-size:0.98rem;font-weight:600;cursor:pointer;transition:opacity 0.15s}.primary-btn:hover{opacity:0.9}.ghost-btn{width:100%;margin-top:8px;padding:12px;border:1px solid var(--_border);border-radius:var(--tl-radius-md, 0.5rem);background:transparent;color:var(--_fg);font-size:0.95rem;font-weight:500;cursor:pointer;transition:background 0.15s}.ghost-btn:hover{background:var(--_muted)}@keyframes tl-fade{from{opacity:0}}@keyframes tl-rise{from{opacity:0;transform:translateY(12px) scale(0.98)}}@keyframes tl-spin{to{transform:rotate(360deg)}}"}},[1,"tl-buy-modal",{eventId:[1,"event-id"],occurrenceId:[1,"occurrence-id"],step:[32],eventName:[32],imageUrl:[32],venueLabel:[32],dateSummary:[32],selectedOccurrenceId:[32],occurrenceCount:[32],occurrenceLabel:[32],error:[32]}]),f=l,b=function(){"undefined"!=typeof customElements&&["tl-buy-modal","tl-occurrence-selector","tl-ticket-selector"].forEach((e=>{switch(e){case"tl-buy-modal":customElements.get(s(e))||customElements.define(s(e),l);break;case"tl-occurrence-selector":customElements.get(s(e))||n();break;case"tl-ticket-selector":customElements.get(s(e))||d()}}))};export{f as TlBuyModal,b as defineCustomElement}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlBuyTicketsButton extends Components.TlBuyTicketsButton, HTMLElement {}
4
+ export const TlBuyTicketsButton: {
5
+ prototype: TlBuyTicketsButton;
6
+ new (): TlBuyTicketsButton;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as t,HTMLElement as e,createEvent as o,h as r,Host as i,transformTag as n}from"@stencil/core/internal/client";import{h as s,g as a}from"./sdk-connector.js";const l={available:{defaultLabel:"Buy Tickets",color:"var(--tl-primary, #e64b12)",hoverColor:"var(--tl-primary, #d4440f)",foreground:"var(--tl-primary-foreground, #ffffff)"},soldOut:{defaultLabel:"Sold Out",color:"#dc2626",hoverColor:"#b91c1c",foreground:"#ffffff"},waitlist:{defaultLabel:"Join Waitlist",color:"#2563eb",hoverColor:"#1d4ed8",foreground:"#ffffff"},comingSoon:{defaultLabel:"On Sale Soon",color:"#d97706",hoverColor:"#b45309",foreground:"#ffffff"}},c=t(class extends e{constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.tlClick=o(this,"tlClick",7),this.state="available",this.variant="primary",this.size="md",this.fullWidth=!1,this.currency="GBP",this.pricePrefix="From",this.disabled=!1,this.isHovered=!1,this.handleClick=()=>{if(!this.disabled&&"soldOut"!==this.state&&"comingSoon"!==this.state&&(this.tlClick.emit({eventId:this.eventId,occurrenceId:this.occurrenceId}),s()))try{a().event(this.eventId).openModal({occurrenceId:this.occurrenceId})}catch(t){console.error("[tl-buy-tickets-button] Failed to open modal:",t)}}}formatPrice(t){const e=t/100,o=e%1!=0;return new Intl.NumberFormat("en-GB",{style:"currency",currency:this.currency,minimumFractionDigits:o?2:0,maximumFractionDigits:o?2:0}).format(e)}getStateConfig(){return l[this.state]}isInteractive(){return!this.disabled&&"soldOut"!==this.state&&"comingSoon"!==this.state}render(){const t=this.getStateConfig(),e=this.label||t.defaultLabel,o=this.isInteractive();return r(i,{key:"10c8c36d12223afcfd13c9807c2ef6b0f4c34266",class:{"full-width":this.fullWidth}},r("button",{key:"c7f6a39a837c90ced0176b5d017687afabf99a5a",type:"button",class:{"buy-button":!0,["variant-"+this.variant]:!0,["size-"+this.size]:!0,disabled:!o,hovered:this.isHovered&&o},style:{"--button-color":t.color,"--button-hover-color":t.hoverColor,"--button-foreground":t.foreground},disabled:!o,onClick:this.handleClick,onMouseEnter:()=>this.isHovered=!0,onMouseLeave:()=>this.isHovered=!1},r("span",{key:"e2bc1edc9fbd2a9c81da8cc3293170b1c4275125",class:"icon"},"soldOut"===this.state&&this.renderSoldOutIcon(),"waitlist"===this.state&&this.renderWaitlistIcon(),"comingSoon"===this.state&&this.renderComingSoonIcon(),"available"===this.state&&this.renderTicketIcon()),r("span",{key:"8371c85dcc24c5ac040744edefe80618421025ef",class:"label"},e),void 0!==this.price&&r("span",{key:"c02cb5b646ade8866deafb9b3e698115abec5708",class:"price"},r("span",{key:"cb0ab272460115a5edebd674362c83711735a70d",class:"price-prefix"},this.pricePrefix),r("span",{key:"e28ba56d3928076b624513de95682351f3e0d92b",class:"price-value"},this.formatPrice(this.price)))))}renderTicketIcon(){return r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},r("path",{d:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z"}),r("path",{d:"M13 5v2"}),r("path",{d:"M13 17v2"}),r("path",{d:"M13 11v2"}))}renderSoldOutIcon(){return r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},r("circle",{cx:"12",cy:"12",r:"10"}),r("path",{d:"m15 9-6 6"}),r("path",{d:"m9 9 6 6"}))}renderWaitlistIcon(){return r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},r("circle",{cx:"12",cy:"12",r:"10"}),r("polyline",{points:"12 6 12 12 16 14"}))}renderComingSoonIcon(){return r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},r("path",{d:"M12 2v4"}),r("path",{d:"m16.2 7.8 2.9-2.9"}),r("path",{d:"M18 12h4"}),r("path",{d:"m16.2 16.2 2.9 2.9"}),r("path",{d:"M12 18v4"}),r("path",{d:"m4.9 19.1 2.9-2.9"}),r("path",{d:"M2 12h4"}),r("path",{d:"m4.9 4.9 2.9 2.9"}))}static get style(){return":host{display:inline-block;font-family:var(--tl-font-family, system-ui, -apple-system, sans-serif)}:host(.full-width){display:block;width:100%}:host(.full-width) .buy-button{width:100%}.buy-button{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;font-weight:600;border:none;cursor:pointer;text-decoration:none;outline:none;transition:all 0.2s ease;white-space:nowrap}.buy-button.variant-primary{background:var(--button-color);color:var(--button-foreground)}.buy-button.variant-secondary{background:color-mix(in srgb, var(--button-color) 15%, transparent);color:var(--button-color)}.buy-button.variant-outline{background:transparent;color:var(--button-color);border:2px solid var(--button-color)}.buy-button.size-sm{padding:0.5rem 1rem;font-size:0.875rem;border-radius:var(--tl-radius-sm, 0.375rem)}.buy-button.size-md{padding:0.75rem 1.5rem;font-size:1rem;border-radius:var(--tl-radius-md, 0.5rem)}.buy-button.size-lg{padding:1rem 2rem;font-size:1.125rem;border-radius:var(--tl-radius-lg, 0.625rem);min-height:51px}.buy-button.hovered:not(.disabled){opacity:0.9;transform:translateY(-1px)}.buy-button.hovered.variant-primary{background:var(--button-hover-color)}.buy-button.disabled{opacity:0.7;cursor:not-allowed}.icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.icon svg{width:1em;height:1em}.label{flex-shrink:0}.price{display:inline-flex;align-items:center;gap:0.25rem;margin-left:0.5rem;white-space:nowrap;opacity:0.9}.price-prefix{opacity:0.7}.price-value{font-weight:700}"}},[1,"tl-buy-tickets-button",{eventId:[1,"event-id"],occurrenceId:[1,"occurrence-id"],state:[1],label:[1],variant:[1],size:[1],fullWidth:[4,"full-width"],price:[2],currency:[1],pricePrefix:[1,"price-prefix"],disabled:[4],isHovered:[32]}]),d=c,u=function(){"undefined"!=typeof customElements&&["tl-buy-tickets-button"].forEach((t=>{"tl-buy-tickets-button"===t&&(customElements.get(n(t))||customElements.define(n(t),c))}))};export{d as TlBuyTicketsButton,u as defineCustomElement}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlBuyTicketsWrapper extends Components.TlBuyTicketsWrapper, HTMLElement {}
4
+ export const TlBuyTicketsWrapper: {
5
+ prototype: TlBuyTicketsWrapper;
6
+ new (): TlBuyTicketsWrapper;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{T as t,d as r}from"./tl-buy-tickets-wrapper2.js";const s=t,o=r;export{s as TlBuyTicketsWrapper,o as defineCustomElement}
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as t,HTMLElement as e,createEvent as s,h as i,Host as r,transformTag as l}from"@stencil/core/internal/client";import{h as a,g as o}from"./sdk-connector.js";const c=t(class extends e{constructor(t){super(),!1!==t&&this.__registerHost(),this.tlComplete=s(this,"tl-complete",7),this.tlError=s(this,"tl-error",7),this.tlClose=s(this,"tl-close",7),this.disabled=!1,this.handleClick=()=>{if(!this.disabled)return a()?void o().event(this.eventId).openModal({occurrenceId:this.occurrenceId,onComplete:t=>{this.tlComplete.emit(t)},onError:t=>{this.tlError.emit({message:t.message})},onClose:()=>{this.tlClose.emit()}}):(console.error("[tl-buy-tickets-wrapper] SDK not initialized. Call setSDK(ticketlayer) first."),void this.tlError.emit({message:"SDK not initialized"}))},this.handleKeyDown=t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.handleClick())}}render(){return i(r,{key:"d6ef81ac9bc1a1194eda1603cbb2a75b355a212e",class:{"tl-buy-tickets-wrapper":!0,"tl-buy-tickets-wrapper--disabled":this.disabled},onClick:this.handleClick,onKeyDown:this.handleKeyDown,role:"button",tabindex:this.disabled?-1:0,"aria-disabled":this.disabled?"true":null},i("slot",{key:"faef5aaad20deaf5e442d688c69105e45f9ee26f"}))}get el(){return this}static get style(){return"tl-buy-tickets-wrapper,.tl-buy-tickets-wrapper{display:inline-block;cursor:pointer}tl-buy-tickets-wrapper:focus,.tl-buy-tickets-wrapper:focus{outline:2px solid var(--tl-ring, #3b82f6);outline-offset:2px;border-radius:var(--tl-radius-sm, 0.25rem)}tl-buy-tickets-wrapper[disabled],tl-buy-tickets-wrapper.tl-buy-tickets-wrapper--disabled,.tl-buy-tickets-wrapper--disabled{cursor:not-allowed;opacity:0.5}"}},[260,"tl-buy-tickets-wrapper",{eventId:[1,"event-id"],occurrenceId:[1,"occurrence-id"],disabled:[4]}]);function n(){"undefined"!=typeof customElements&&["tl-buy-tickets-wrapper"].forEach((t=>{"tl-buy-tickets-wrapper"===t&&(customElements.get(l(t))||customElements.define(l(t),c))}))}export{c as T,n as d}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlCartBadge extends Components.TlCartBadge, HTMLElement {}
4
+ export const TlCartBadge: {
5
+ prototype: TlCartBadge;
6
+ new (): TlCartBadge;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as t,HTMLElement as i,createEvent as e,h as s,transformTag as n}from"@stencil/core/internal/client";import{w as o}from"./sdk-connector.js";const r="tl_cart_count",a=t(class extends i{constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.tlClick=e(this,"tlClick",7),this.showEmpty=!1,this.size="md",this.badgeOnly=!1,this.itemCount=0,this.handleClick=()=>{this.tlClick.emit({itemCount:this.itemCount})}}componentWillLoad(){this.itemCount=this.getPersistedCartCount()}componentDidLoad(){this.subscribeToCartUpdates()}disconnectedCallback(){this.unsubscribe&&this.unsubscribe()}getPersistedCartCount(){if("undefined"==typeof window)return 0;try{const t=localStorage.getItem(r);return t&&parseInt(t,10)||0}catch{return 0}}persistCartCount(t){if("undefined"!=typeof window)try{localStorage.setItem(r,""+t)}catch{}}async subscribeToCartUpdates(){const t=await o().catch((()=>null));if(!t)return;const i=t.getCartManager?.();i&&(this.unsubscribe=i.on?.("cart:updated",(t=>{const i=t?.itemCount||0;console.log("[tl-cart-badge] Cart updated:",i),this.itemCount=i,this.persistCartCount(i)})),i.get?.().then((t=>{const i=t?.itemCount||0;this.itemCount=i,this.persistCartCount(i)})).catch((()=>{})))}renderIcon(){return this.icon?s("span",{class:"icon-text"},this.icon):s("svg",{class:"icon-svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"}))}render(){const t=this.itemCount>0||this.showEmpty,i=this.itemCount>99?"99+":""+this.itemCount;return this.badgeOnly?0===this.itemCount?null:s("span",{class:"badge-only size-"+this.size},i):s("button",{class:"cart-badge size-"+this.size,onClick:this.handleClick,"aria-label":`Cart with ${this.itemCount} items`},this.renderIcon(),t&&this.itemCount>0&&s("span",{class:"badge-count"},i))}static get style(){return":host{display:inline-block}.cart-badge{position:relative;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:var(--tl-spacing-2, 0.5rem);border-radius:var(--tl-radius-md, 0.5rem);color:var(--tl-color-foreground, #111827);transition:background-color 0.2s, transform 0.15s}.cart-badge:hover{background-color:var(--tl-color-muted, #f3f4f6)}.cart-badge:active{transform:scale(0.95)}.cart-badge:focus-visible{outline:2px solid var(--tl-color-primary, #6366f1);outline-offset:2px}.size-sm{padding:var(--tl-spacing-1, 0.25rem)}.size-sm .icon-svg,.size-sm .icon-text{width:18px;height:18px;font-size:18px}.size-md .icon-svg,.size-md .icon-text{width:24px;height:24px;font-size:24px}.size-lg{padding:var(--tl-spacing-3, 0.75rem)}.size-lg .icon-svg,.size-lg .icon-text{width:32px;height:32px;font-size:32px}.icon-svg{width:24px;height:24px;stroke-width:2}.icon-text{line-height:1}.badge-count{position:absolute;top:0;right:0;transform:translate(30%, -30%);min-width:18px;height:18px;padding:0 5px;border-radius:9px;background-color:var(--tl-color-primary, #6366f1);color:var(--tl-color-primary-foreground, #ffffff);font-size:11px;font-weight:600;font-family:var(--tl-font-family, system-ui, sans-serif);display:flex;align-items:center;justify-content:center;line-height:1;box-shadow:0 1px 3px rgba(0, 0, 0, 0.2)}.size-sm .badge-count{min-width:16px;height:16px;font-size:10px;padding:0 4px}.size-lg .badge-count{min-width:22px;height:22px;font-size:13px;padding:0 6px}.badge-only{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background-color:rgba(255, 255, 255, 0.3);color:inherit;font-size:12px;font-weight:600;font-family:var(--tl-font-family, system-ui, sans-serif);line-height:1}.badge-only.size-sm{min-width:18px;height:18px;font-size:11px;padding:0 5px}.badge-only.size-lg{min-width:22px;height:22px;font-size:13px;padding:0 7px}"}},[1,"tl-cart-badge",{showEmpty:[4,"show-empty"],icon:[1],size:[1],badgeOnly:[4,"badge-only"],itemCount:[32]}]),l=a,c=function(){"undefined"!=typeof customElements&&["tl-cart-badge"].forEach((t=>{"tl-cart-badge"===t&&(customElements.get(n(t))||customElements.define(n(t),a))}))};export{l as TlCartBadge,c as defineCustomElement}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlCartDrawer extends Components.TlCartDrawer, HTMLElement {}
4
+ export const TlCartDrawer: {
5
+ prototype: TlCartDrawer;
6
+ new (): TlCartDrawer;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as e,HTMLElement as t,createEvent as r,h as a,Host as s,transformTag as o}from"@stencil/core/internal/client";import{o as i}from"./sdk-connector.js";import{d as n}from"./tl-cart2.js";const d=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.tlOpen=r(this,"tlOpen",7),this.tlClose=r(this,"tlClose",7),this.side="right",this.heading="Your cart",this.open=!1,this.visible=!1,this.onKey=e=>{"Escape"===e.key&&this.visible&&this.setOpen(!1)},this.close=()=>this.setOpen(!1)}connectedCallback(){this.visible=this.open,this.offCart=i("ui:cart-requested",(()=>this.setOpen(!0))),this.offClose=i("ui:modal-close-requested",(()=>this.setOpen(!1))),"undefined"!=typeof document&&document.addEventListener("keydown",this.onKey)}disconnectedCallback(){this.offCart?.(),this.offClose?.(),"undefined"!=typeof document&&document.removeEventListener("keydown",this.onKey)}onOpenProp(e){this.visible=e}setOpen(e){this.visible!==e&&(this.open=e,this.visible=e,e?this.tlOpen.emit():this.tlClose.emit())}render(){return a(s,{key:"5b4dbc69206ef19bcf3b0ba619a67728c8e35e68"},a("div",{key:"0312918752eb5eebb86206be7094c1024dbd3457",class:{overlay:!0,"is-open":this.visible},onClick:e=>{e.target===e.currentTarget&&this.close()}},a("aside",{key:"8c50e6b0cfacf3a881e4ec1ab272ef8da13cd796",class:{panel:!0,["panel--"+this.side]:!0,"is-open":this.visible},role:"dialog","aria-modal":"true","aria-label":this.heading,"aria-hidden":this.visible?"false":"true"},a("header",{key:"ee7efe3700ff05c921f6ace97f39f957ebf6670e",class:"drawer-header"},a("h2",{key:"07841a92eea5bca5db0ebf64df91a14eaa5ecffc",class:"drawer-title"},this.heading),a("button",{key:"c2099831dfaf89b44b7228c1ee5634d61c5af919",class:"close-btn",onClick:this.close,"aria-label":"Close cart"},a("svg",{key:"a2c8e0ecf42e4fe43ca1d6b6ccc6f4687e6af483",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},a("path",{key:"de07e2ce6b0b60a137d8b534826963a03421af7b",d:"M6 6l12 12M18 6L6 18","stroke-linecap":"round"})))),a("div",{key:"f67798d0e026cce074bf15b246cdd3b726be98f6",class:"drawer-body"},a("tl-cart",{key:"1b2a5a44e1862a3b4754bd36e17de063d012453e"})))))}static get watchers(){return{open:[{onOpenProp:0}]}}static get style(){return":host{--_bg:var(--tl-background, #ffffff);--_fg:var(--tl-foreground, #111827);--_muted-fg:var(--tl-muted-foreground, #6b7280);--_muted:var(--tl-muted, #f3f4f6);--_border:var(--tl-border, #e5e7eb);--_font:var(--tl-font-family, system-ui, -apple-system, sans-serif);font-family:var(--_font)}.overlay{position:fixed;inset:0;z-index:2147483640;background:rgba(8, 8, 16, 0.6);backdrop-filter:blur(2px);opacity:0;pointer-events:none;transition:opacity 0.25s ease}.overlay.is-open{opacity:1;pointer-events:auto}.panel{position:fixed;top:0;bottom:0;width:min(420px, 100%);display:flex;flex-direction:column;background:var(--_bg);color:var(--_fg);box-shadow:0 0 48px rgba(0, 0, 0, 0.5);transition:transform 0.28s cubic-bezier(0.16, 1, 0.3, 1);will-change:transform}.panel--right{right:0;border-left:1px solid var(--_border);transform:translateX(100%)}.panel--left{left:0;border-right:1px solid var(--_border);transform:translateX(-100%)}.panel.is-open{transform:translateX(0)}.drawer-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid var(--_border)}.drawer-title{margin:0;font-size:1.1rem;font-weight:700}.close-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:0;border-radius:999px;background:var(--_muted);color:var(--_muted-fg);cursor:pointer;transition:color 0.15s}.close-btn:hover{color:var(--_fg)}.close-btn svg{width:16px;height:16px}.drawer-body{flex:1;overflow-y:auto;padding:18px 20px}"}},[1,"tl-cart-drawer",{side:[1],heading:[1],open:[1028],visible:[32]},void 0,{open:[{onOpenProp:0}]}]),c=d,l=function(){"undefined"!=typeof customElements&&["tl-cart-drawer","tl-cart"].forEach((e=>{switch(e){case"tl-cart-drawer":customElements.get(o(e))||customElements.define(o(e),d);break;case"tl-cart":customElements.get(o(e))||n()}}))};export{c as TlCartDrawer,l as defineCustomElement}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlCart extends Components.TlCart, HTMLElement {}
4
+ export const TlCart: {
5
+ prototype: TlCart;
6
+ new (): TlCart;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{T as t,d as o}from"./tl-cart2.js";const r=t,s=o;export{r as TlCart,s as defineCustomElement}
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as t,HTMLElement as e,createEvent as r,h as o,transformTag as a}from"@stencil/core/internal/client";import{w as i,h as s,g as n}from"./sdk-connector.js";const l=t(class extends e{constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.tlCheckout=r(this,"tlCheckout",7),this.tlItemRemoved=r(this,"tlItemRemoved",7),this.tlCartUpdated=r(this,"tlCartUpdated",7),this.tlError=r(this,"tlError",7),this.showCheckoutButton=!0,this.checkoutLabel="Checkout",this.showRemoveButtons=!0,this.compact=!1,this.cart=null,this.loading=!0,this.error=null,this.removingItemId=null,this.handleCheckout=()=>{this.cart&&this.cart.items.length>0&&this.tlCheckout.emit({cart:this.cart})}}componentWillLoad(){this.loadCart()}componentDidLoad(){this.subscribeToCartUpdates()}disconnectedCallback(){this.unsubscribe&&this.unsubscribe()}async loadCart(){try{console.log("[tl-cart] Loading cart..."),this.loading=!0,this.error=null;const t=await i(),e=t.getCartManager?.();if(e){const t=await e.get();console.log("[tl-cart] Cart loaded:",t),this.cart=t}}catch(t){console.error("[tl-cart] Failed to load cart:",t),this.error=t instanceof Error?t.message:"Failed to load cart",this.tlError.emit({message:this.error})}finally{this.loading=!1}}async subscribeToCartUpdates(){const t=await i().catch((()=>null));if(!t)return;const e=t.getCartManager?.();e&&(this.unsubscribe=e.on?.("cart:updated",(t=>{console.log("[tl-cart] Cart updated:",t),this.cart=t,this.tlCartUpdated.emit({cart:t})})))}async handleRemoveItem(t){if(s()){this.removingItemId=t;try{const e=n(),r=e.getCartManager?.();r&&(await r.removeItem(t),console.log("[tl-cart] Item removed:",t),this.tlItemRemoved.emit({itemId:t}))}catch(t){console.error("[tl-cart] Failed to remove item:",t),this.error=t instanceof Error?t.message:"Failed to remove item",this.tlError.emit({message:this.error})}finally{this.removingItemId=null}}}formatPrice(t,e="GBP"){return new Intl.NumberFormat("en-GB",{style:"currency",currency:e}).format(t/100)}formatDate(t){return new Date(t).toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short",hour:"2-digit",minute:"2-digit"})}renderSkeleton(){return o("div",{class:"skeleton-container"},o("div",{class:"skeleton-item"}),o("div",{class:"skeleton-item"}),o("div",{class:"skeleton-totals"}))}renderEmptyCart(){return o("div",{class:"empty-cart"},o("svg",{class:"empty-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"})),o("p",{class:"empty-title"},"Your cart is empty"),o("p",{class:"empty-message"},"Add tickets to get started"))}renderCartItem(t){const e=this.removingItemId===t.id;return o("div",{class:"cart-item "+(e?"removing":""),key:t.id},o("div",{class:"item-info"},o("p",{class:"item-name"},t.ticketTypeName),!this.compact&&o("p",{class:"item-event"},t.eventName),!this.compact&&t.occurrenceDate&&o("p",{class:"item-date"},this.formatDate(t.occurrenceDate)),o("p",{class:"item-quantity"},"Qty: ",t.quantity)),o("div",{class:"item-actions"},o("p",{class:"item-price"},this.formatPrice(t.totalPrice,t.currency)),this.showRemoveButtons&&o("button",{class:"remove-btn",onClick:()=>this.handleRemoveItem(t.id),disabled:e,"aria-label":"Remove item"},e?o("span",{class:"spinner"}):o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})))))}render(){if(this.loading)return this.renderSkeleton();if(!this.cart||0===this.cart.items.length)return this.renderEmptyCart();const{items:t,subtotal:e,fees:r,total:a,currency:i}=this.cart;return o("div",{class:"cart "+(this.compact?"compact":"")},o("div",{class:"cart-items"},t.map((t=>this.renderCartItem(t)))),o("div",{class:"cart-totals"},!this.compact&&o("div",{class:"total-row subtotal"},o("span",null,"Subtotal"),o("span",null,this.formatPrice(e,i))),r>0&&!this.compact&&o("div",{class:"total-row fees"},o("span",null,"Fees"),o("span",null,this.formatPrice(r,i))),o("div",{class:"total-row total"},o("span",null,"Total"),o("span",null,this.formatPrice(a,i)))),this.showCheckoutButton&&o("button",{class:"checkout-btn",onClick:this.handleCheckout,disabled:0===t.length},this.checkoutLabel))}static get style(){return":host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif)}.skeleton-container{padding:var(--tl-spacing-4, 1rem)}.skeleton-item{height:70px;background:var(--tl-color-muted, #f3f4f6);border-radius:var(--tl-radius-md, 0.5rem);margin-bottom:var(--tl-spacing-3, 0.75rem);animation:pulse 1.5s ease-in-out infinite}.skeleton-totals{height:100px;background:var(--tl-color-muted, #f3f4f6);border-radius:var(--tl-radius-md, 0.5rem);animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.5}}.empty-cart{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--tl-spacing-8, 2rem);text-align:center}.empty-icon{width:48px;height:48px;color:var(--tl-color-muted-foreground, #9ca3af);margin-bottom:var(--tl-spacing-4, 1rem)}.empty-title{margin:0 0 var(--tl-spacing-2, 0.5rem);font-size:16px;font-weight:600;color:var(--tl-color-foreground, #111827)}.empty-message{margin:0;font-size:14px;color:var(--tl-color-muted-foreground, #6b7280)}.cart{background:var(--tl-color-background, #ffffff)}.cart.compact .cart-items{margin-bottom:var(--tl-spacing-2, 0.5rem)}.cart-items{margin-bottom:var(--tl-spacing-4, 1rem)}.cart-item{display:flex;justify-content:space-between;align-items:flex-start;padding:var(--tl-spacing-3, 0.75rem) 0;border-bottom:1px solid var(--tl-color-border, #e5e7eb);transition:opacity 0.2s}.cart-item:last-child{border-bottom:none}.cart-item.removing{opacity:0.5}.item-info{flex:1;min-width:0}.item-name{margin:0;font-weight:600;font-size:15px;color:var(--tl-color-foreground, #111827)}.item-event{margin:var(--tl-spacing-1, 0.25rem) 0 0;font-size:14px;color:var(--tl-color-muted-foreground, #6b7280)}.item-date{margin:var(--tl-spacing-1, 0.25rem) 0 0;font-size:13px;color:var(--tl-color-muted-foreground, #9ca3af)}.item-quantity{margin:var(--tl-spacing-1, 0.25rem) 0 0;font-size:13px;color:var(--tl-color-muted-foreground, #6b7280)}.item-actions{display:flex;align-items:center;gap:var(--tl-spacing-3, 0.75rem);margin-left:var(--tl-spacing-4, 1rem)}.item-price{margin:0;font-weight:600;font-size:15px;color:var(--tl-color-foreground, #111827);white-space:nowrap}.remove-btn{width:28px;height:28px;padding:0;border:none;background:transparent;border-radius:var(--tl-radius-sm, 0.25rem);color:var(--tl-color-muted-foreground, #9ca3af);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color 0.15s, color 0.15s}.remove-btn:hover:not(:disabled){background-color:var(--tl-color-destructive-bg, #fee2e2);color:var(--tl-color-destructive, #ef4444)}.remove-btn:disabled{cursor:not-allowed;opacity:0.5}.remove-btn svg{width:16px;height:16px}.spinner{width:14px;height:14px;border:2px solid var(--tl-color-border, #e5e7eb);border-top-color:var(--tl-color-primary, #6366f1);border-radius:50%;animation:spin 0.6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.cart-totals{padding:var(--tl-spacing-3, 0.75rem) 0;border-top:1px solid var(--tl-color-border, #e5e7eb)}.total-row{display:flex;justify-content:space-between;align-items:center;padding:var(--tl-spacing-1, 0.25rem) 0}.total-row.subtotal,.total-row.fees{font-size:14px;color:var(--tl-color-muted-foreground, #6b7280)}.total-row.total{font-size:16px;font-weight:700;color:var(--tl-color-foreground, #111827);padding-top:var(--tl-spacing-2, 0.5rem);border-top:1px solid var(--tl-color-border, #e5e7eb);margin-top:var(--tl-spacing-2, 0.5rem)}.checkout-btn{width:100%;margin-top:var(--tl-spacing-4, 1rem);padding:var(--tl-spacing-3, 0.75rem) var(--tl-spacing-4, 1rem);border-radius:var(--tl-radius-md, 0.5rem);border:none;background-color:var(--tl-color-primary, #6366f1);color:var(--tl-color-primary-foreground, #ffffff);font-weight:600;font-size:16px;cursor:pointer;transition:opacity 0.15s, transform 0.1s}.checkout-btn:hover:not(:disabled){opacity:0.9}.checkout-btn:active:not(:disabled){transform:scale(0.98)}.checkout-btn:disabled{background-color:var(--tl-color-muted, #d1d5db);color:var(--tl-color-muted-foreground, #6b7280);cursor:not-allowed}.cart.compact .item-info{flex-direction:row;align-items:center}.cart.compact .cart-totals{padding:var(--tl-spacing-2, 0.5rem) 0}.cart.compact .total-row.total{margin-top:0;border-top:none;padding-top:0}"}},[1,"tl-cart",{showCheckoutButton:[4,"show-checkout-button"],checkoutLabel:[1,"checkout-label"],showRemoveButtons:[4,"show-remove-buttons"],compact:[4],cart:[32],loading:[32],error:[32],removingItemId:[32]}]);function c(){"undefined"!=typeof customElements&&["tl-cart"].forEach((t=>{"tl-cart"===t&&(customElements.get(a(t))||customElements.define(a(t),l))}))}export{l as T,c as d}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlCheckoutWrapper extends Components.TlCheckoutWrapper, HTMLElement {}
4
+ export const TlCheckoutWrapper: {
5
+ prototype: TlCheckoutWrapper;
6
+ new (): TlCheckoutWrapper;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{T as o,d as r}from"./tl-checkout-wrapper2.js";const t=o,p=r;export{t as TlCheckoutWrapper,p as defineCustomElement}
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as t,HTMLElement as e,createEvent as r,h as s,Host as o,transformTag as i}from"@stencil/core/internal/client";import{h as c,g as l}from"./sdk-connector.js";const a=t(class extends e{constructor(t){super(),!1!==t&&this.__registerHost(),this.tlComplete=r(this,"tl-complete",7),this.tlError=r(this,"tl-error",7),this.tlClose=r(this,"tl-close",7),this.disabled=!1,this.handleClick=()=>{if(!this.disabled)return c()?void l().checkout.openModal({onComplete:t=>{this.tlComplete.emit(t)},onError:t=>{this.tlError.emit({message:t.message})},onClose:()=>{this.tlClose.emit()}}):(console.error("[tl-checkout-wrapper] SDK not initialized. Call setSDK(ticketlayer) first."),void this.tlError.emit({message:"SDK not initialized"}))},this.handleKeyDown=t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.handleClick())}}render(){return s(o,{key:"ebaae5dd6710ffc5353ece4327012df0332fdbb7",class:{"tl-checkout-wrapper":!0,"tl-checkout-wrapper--disabled":this.disabled},onClick:this.handleClick,onKeyDown:this.handleKeyDown,role:"button",tabindex:this.disabled?-1:0,"aria-disabled":this.disabled?"true":null},s("slot",{key:"0118d9921df5af1ae2376fd4135bac487aac7ebd"}))}get el(){return this}static get style(){return"tl-checkout-wrapper,.tl-checkout-wrapper{display:inline-block;cursor:pointer}tl-checkout-wrapper:focus,.tl-checkout-wrapper:focus{outline:2px solid var(--tl-ring, #3b82f6);outline-offset:2px;border-radius:var(--tl-radius-sm, 0.25rem)}tl-checkout-wrapper[disabled],tl-checkout-wrapper.tl-checkout-wrapper--disabled,.tl-checkout-wrapper--disabled{cursor:not-allowed;opacity:0.5}"}},[260,"tl-checkout-wrapper",{disabled:[4]}]);function n(){"undefined"!=typeof customElements&&["tl-checkout-wrapper"].forEach((t=>{"tl-checkout-wrapper"===t&&(customElements.get(i(t))||customElements.define(i(t),a))}))}export{a as T,n as d}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlEventCard extends Components.TlEventCard, HTMLElement {}
4
+ export const TlEventCard: {
5
+ prototype: TlEventCard;
6
+ new (): TlEventCard;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{T as t,d as o}from"./tl-event-card2.js";const r=t,s=o;export{r as TlEventCard,s as defineCustomElement}
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as e,HTMLElement as t,createEvent as r,h as a,transformTag as i}from"@stencil/core/internal/client";import{w as s}from"./sdk-connector.js";import{e as n}from"./order-summary.js";const o=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.tlClick=r(this,"tlClick",7),this.tlError=r(this,"tlError",7),this.loadedEvent=null,this.loading=!1,this.error=null,this.handleClick=()=>{const e=this.current;e&&(console.log("[tl-event-card] Clicked:",e.id),this.tlClick.emit({eventId:e.id}))}}watchEventId(){this.loadEvent()}async componentWillLoad(){!this.event&&this.eventId&&await this.loadEvent()}async loadEvent(){if(!this.event&&this.eventId)try{this.loading=!0,this.error=null;const e=await s(),t=await e.getEventsManager().get(this.eventId);if(!t)throw new Error("Event not found");this.loadedEvent=function(e){const t=e.occurrences??[],r=t.map((e=>e.startsAt)).filter((e=>!!e)).sort(),a=Date.now(),i=r.find((e=>new Date(e).getTime()>=a))??r[0],s="sold_out"===e.status||t.length>0&&t.every((e=>"sold_out"===e.status));return{id:e.id,name:e.name,...e.shortDescription?{shortDescription:e.shortDescription}:{},...e.imageUrl?{imageUrl:e.imageUrl}:{},...e.venueName?{venue:{id:e.venueId??"",name:e.venueName,city:e.venueCity??""}}:{},...i?{nextOccurrence:{startsAt:i}}:{},availabilityStatus:s?"sold_out":"available"}}(t)}catch(e){console.error("[tl-event-card] Failed to load event:",e),this.error=n(e,"Failed to load event"),this.tlError.emit({message:this.error})}finally{this.loading=!1}}get current(){return this.event??this.loadedEvent}formatDate(e){return new Date(e).toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short",hour:"2-digit",minute:"2-digit"})}getStatusBadgeClass(){const e="status-badge";switch(this.current?.availabilityStatus){case"available":return`${e} status-available`;case"limited":return`${e} status-limited`;case"sold_out":return`${e} status-sold-out`;default:return e}}getStatusLabel(){switch(this.current?.availabilityStatus){case"available":return"Available";case"limited":return"Limited";case"sold_out":return"Sold Out";default:return""}}render(){if(this.loading)return a("div",{class:"event-card card-skeleton","aria-busy":"true"},a("div",{class:"image-container"}),a("div",{class:"content"},a("div",{class:"skeleton-line short"}),a("div",{class:"skeleton-line long"})));if(this.error)return a("div",{class:"event-card card-error"},this.error);const e=this.current;if(!e)return null;const t=e.thumbnailUrl||e.imageUrl;return a("div",{class:"event-card",onClick:this.handleClick},a("div",{class:"image-container"},t?a("img",{src:t,alt:e.name,class:"event-image"}):a("div",{class:"image-placeholder"},a("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"}))),a("div",{class:"status-container"},a("span",{class:this.getStatusBadgeClass()},this.getStatusLabel()))),a("div",{class:"content"},e.category&&a("span",{class:"category"},e.category),a("h3",{class:"title"},e.name),e.nextOccurrence&&a("p",{class:"meta"},a("svg",{class:"icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})),this.formatDate(e.nextOccurrence.startsAt)),e.venue&&a("p",{class:"meta"},a("svg",{class:"icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"}),a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 11a3 3 0 11-6 0 3 3 0 016 0z"})),e.venue.name,", ",e.venue.city),e.shortDescription&&a("p",{class:"description"},e.shortDescription)))}static get watchers(){return{eventId:[{watchEventId:0}]}}static get style(){return":host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif)}.event-card{background:var(--tl-secondary, #f3f4f6);border-radius:var(--tl-radius-lg, 0.75rem);overflow:hidden;box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);cursor:pointer;transition:box-shadow 0.2s ease, transform 0.2s ease}.event-card:hover{box-shadow:0 4px 12px rgba(0, 0, 0, 0.15);transform:translateY(-2px)}.image-container{position:relative;aspect-ratio:16 / 9;overflow:hidden;background:var(--tl-muted, #f9fafb)}.event-image{width:100%;height:100%;object-fit:cover;transition:transform 0.3s ease}.event-card:hover .event-image{transform:scale(1.05)}.image-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--tl-muted-foreground, #6b7280)}.status-container{position:absolute;top:0.5rem;right:0.5rem}.status-badge{display:inline-block;padding:0.25rem 0.5rem;font-size:0.75rem;font-weight:500;border-radius:var(--tl-radius-sm, 0.25rem)}.status-available{background:var(--tl-success, #10b981);color:var(--tl-success-foreground, #ffffff)}.status-limited{background:var(--tl-warning, #f59e0b);color:var(--tl-warning-foreground, #ffffff)}.status-sold-out{background:var(--tl-error, #ef4444);color:var(--tl-error-foreground, #ffffff)}.content{padding:var(--tl-spacing-4, 1rem)}.category{display:inline-block;font-size:0.75rem;font-weight:500;text-transform:uppercase;letter-spacing:0.05em;color:var(--tl-primary, #6366f1)}.title{margin:0.25rem 0 0;font-size:1.125rem;font-weight:600;color:var(--tl-foreground, #111827);line-height:1.3}.event-card:hover .title{color:var(--tl-primary, #6366f1)}.meta{display:flex;align-items:center;gap:0.5rem;margin:0.5rem 0 0;font-size:0.875rem;color:var(--tl-muted-foreground, #6b7280)}.meta:first-of-type{margin-top:0.75rem}.icon{width:1rem;height:1rem;flex-shrink:0}.description{margin:0.75rem 0 0;font-size:0.875rem;color:var(--tl-muted-foreground, #6b7280);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.card-skeleton{cursor:default;pointer-events:none}.card-skeleton .image-container{animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite}.skeleton-line{height:0.875rem;margin-top:0.5rem;background:var(--tl-muted, #f9fafb);border-radius:var(--tl-radius-sm, 0.25rem);animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite}.skeleton-line.short{width:40%}.skeleton-line.long{width:80%}.card-error{padding:var(--tl-spacing-4, 1rem);font-size:0.875rem;color:var(--tl-error, #ef4444);cursor:default}.card-error:hover{transform:none}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.5}}"}},[1,"tl-event-card",{event:[16],eventId:[1,"event-id"],loadedEvent:[32],loading:[32],error:[32]},void 0,{eventId:[{watchEventId:0}]}]);function l(){"undefined"!=typeof customElements&&["tl-event-card"].forEach((e=>{"tl-event-card"===e&&(customElements.get(i(e))||customElements.define(i(e),o))}))}export{o as T,l as d}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlEventList extends Components.TlEventList, HTMLElement {}
4
+ export const TlEventList: {
5
+ prototype: TlEventList;
6
+ new (): TlEventList;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as e,HTMLElement as t,createEvent as s,h as r,transformTag as i}from"@stencil/core/internal/client";import{w as l}from"./sdk-connector.js";import{d as a}from"./tl-event-card2.js";const o=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.tlEventClick=s(this,"tlEventClick",7),this.limit=12,this.columns=3,this.events=[],this.loading=!0,this.error=null,this.handleEventClick=e=>{console.log("[tl-event-list] Event clicked:",e.detail.eventId),this.tlEventClick.emit(e.detail)}}watchFiltersChange(){this.loadEvents()}async componentWillLoad(){await this.loadEvents()}async loadEvents(){try{console.log("[tl-event-list] Loading events via SDK...",{limit:this.limit,category:this.category}),this.loading=!0,this.error=null;const e=(await l()).getEventsManager(),t=await e.list({limit:this.limit,category:this.category});console.log("[tl-event-list] Events loaded:",t.items.length),this.events=t.items}catch(e){console.error("[tl-event-list] Failed to load events:",e),this.error=e instanceof Error?e.message:"Failed to load events"}finally{this.loading=!1}}render(){const e="event-grid cols-"+Math.min(Math.max(this.columns,1),4);return this.loading?r("div",{class:e},Array.from({length:6}).map(((e,t)=>r("div",{class:"skeleton-card",key:t},r("div",{class:"skeleton-image"}),r("div",{class:"skeleton-content"},r("div",{class:"skeleton-line short"}),r("div",{class:"skeleton-line medium"}),r("div",{class:"skeleton-line long"})))))):this.error?r("div",{class:"error-state"},r("p",{class:"error-title"},"Error loading events"),r("p",{class:"error-message"},this.error)):0===this.events.length?r("div",{class:"empty-state"},r("svg",{class:"empty-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},r("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})),r("p",{class:"empty-title"},"No events available"),r("p",{class:"empty-message"},"Check back later for upcoming events.")):r("div",{class:e},this.events.map((e=>r("tl-event-card",{key:e.id,event:e,onTlClick:this.handleEventClick}))))}static get watchers(){return{limit:[{watchFiltersChange:0}],category:[{watchFiltersChange:0}]}}static get style(){return":host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif)}.event-grid{display:grid;gap:var(--tl-spacing-6, 1.5rem)}.cols-1{grid-template-columns:1fr}.cols-2{grid-template-columns:repeat(2, 1fr)}.cols-3{grid-template-columns:repeat(3, 1fr)}.cols-4{grid-template-columns:repeat(4, 1fr)}@media (max-width: 1024px){.cols-4,.cols-3{grid-template-columns:repeat(2, 1fr)}}@media (max-width: 640px){.cols-4,.cols-3,.cols-2{grid-template-columns:1fr}}.skeleton-card{background:var(--tl-secondary, #f3f4f6);border-radius:var(--tl-radius-lg, 0.75rem);overflow:hidden}.skeleton-image{aspect-ratio:16 / 9;background:var(--tl-muted, #f9fafb);animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite}.skeleton-content{padding:var(--tl-spacing-4, 1rem);display:flex;flex-direction:column;gap:0.5rem}.skeleton-line{height:1rem;background:var(--tl-muted, #f9fafb);border-radius:var(--tl-radius-sm, 0.25rem);animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite}.skeleton-line.short{width:4rem;height:0.75rem}.skeleton-line.medium{width:75%}.skeleton-line.long{width:50%}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.5}}.error-state{background:rgba(239, 68, 68, 0.1);border:1px solid var(--tl-error, #ef4444);border-radius:var(--tl-radius-lg, 0.75rem);padding:var(--tl-spacing-4, 1rem)}.error-title{margin:0;font-weight:500;color:var(--tl-error, #ef4444)}.error-message{margin:0.25rem 0 0;font-size:0.875rem;color:var(--tl-error, #ef4444)}.empty-state{text-align:center;padding:var(--tl-spacing-8, 2rem) var(--tl-spacing-4, 1rem)}.empty-icon{width:4rem;height:4rem;margin:0 auto 1rem;color:var(--tl-muted-foreground, #6b7280)}.empty-title{margin:0;font-size:1.25rem;font-weight:600;color:var(--tl-foreground, #111827)}.empty-message{margin:0.5rem 0 0;color:var(--tl-muted-foreground, #6b7280)}"}},[1,"tl-event-list",{limit:[2],category:[1],columns:[2],events:[32],loading:[32],error:[32]},void 0,{limit:[{watchFiltersChange:0}],category:[{watchFiltersChange:0}]}]),n=o,c=function(){"undefined"!=typeof customElements&&["tl-event-list","tl-event-card"].forEach((e=>{switch(e){case"tl-event-list":customElements.get(i(e))||customElements.define(i(e),o);break;case"tl-event-card":customElements.get(i(e))||a()}}))};export{n as TlEventList,c as defineCustomElement}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlLogin extends Components.TlLogin, HTMLElement {}
4
+ export const TlLogin: {
5
+ prototype: TlLogin;
6
+ new (): TlLogin;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{T as o,d as s}from"./tl-login2.js";const t=o,r=s;export{t as TlLogin,r as defineCustomElement}
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as i,HTMLElement as t,createEvent as e,h as s,transformTag as n}from"@stencil/core/internal/client";import{w as l}from"./sdk-connector.js";import{e as o}from"./order-summary.js";const r=i(class extends t{constructor(i){super(),!1!==i&&this.__registerHost(),this.__attachShadow(),this.tlAuthChanged=e(this,"tlAuthChanged",7),this.tlMagicLinkSent=e(this,"tlMagicLinkSent",7),this.tlError=e(this,"tlError",7),this.heading="Sign in",this.allowCodeEntry=!0,this.phase="email",this.email="",this.code="",this.busy=!1,this.error=null,this.notice=null,this.customer=null,this.auth=null,this.unsubscribes=[],this.urlCodeUsed=!1,this.handleEmailInput=i=>{this.email=i.target.value,this.error=null},this.handleCodeInput=i=>{this.code=i.target.value,this.error=null},this.handleEmailSubmit=i=>{i.preventDefault(),this.requestLink()},this.handleCodeSubmit=i=>{i.preventDefault(),this.exchange(this.code.trim())}}async componentWillLoad(){const i=await l().catch((()=>null));if(!i)return void(this.error="Sign-in is not available right now");if(this.auth=i.getAuthManager?.()??null,!this.auth)return void(this.error="Sign-in is not available with this SDK");this.syncFromSDK(),this.unsubscribes.push(i.on("auth:changed",(()=>this.syncFromSDK()))),this.unsubscribes.push(i.on("session:changed",(()=>this.syncFromSDK())));const t=this.codeFromUrl();t&&!this.auth.authenticated&&await this.exchange(t)}disconnectedCallback(){this.unsubscribes.forEach((i=>i())),this.unsubscribes=[]}codeFromUrl(){if("undefined"==typeof window||!window.location?.search||this.urlCodeUsed)return null;const i=new URLSearchParams(window.location.search).get("code");return i&&(this.urlCodeUsed=!0),i}syncFromSDK(){this.auth&&(this.auth.authenticated?(this.customer=this.auth.customer??null,this.phase="signed-in"):"signed-in"===this.phase&&(this.customer=null,this.phase="email"))}async requestLink(i=!1){const t=this.email.trim();if(t){if(this.auth){this.busy=!0,this.error=null,this.notice=null;try{await this.auth.requestMagicLink({email:t}),this.phase="sent",this.notice=i?"Sent again. Check your inbox.":null,this.tlMagicLinkSent.emit({email:t})}catch(i){console.error("[tl-login] Magic-link request failed:",i),this.error=o(i,"Could not send your sign-in link"),this.tlError.emit({message:this.error})}finally{this.busy=!1}}}else this.error="Enter your email address"}async exchange(i){if(!i)return void(this.error="Enter the code from your email");if(!this.auth)return;const t=this.phase;this.busy=!0,this.error=null,this.phase="verifying";try{const t=await this.auth.exchange(i);this.customer=this.auth.customer??t?.customer??null,this.phase="signed-in",this.code="",this.tlAuthChanged.emit({customer:this.customer,authenticated:!0})}catch(i){console.error("[tl-login] Code exchange failed:",i),this.phase="verifying"===t||"email"===t?"email":"code",this.error="That code did not work. Check it and try again, or request a new link.",this.tlError.emit({message:this.error})}finally{this.busy=!1}}async signOut(){if(this.auth){this.busy=!0;try{await this.auth.logout()}catch(i){console.error("[tl-login] Sign out failed:",i)}finally{this.busy=!1,this.customer=null,this.phase="email",this.tlAuthChanged.emit({customer:null,authenticated:!1})}}}renderError(){return this.error?s("p",{class:"error",role:"alert"},this.error):null}render(){return"signed-in"===this.phase?s("div",{class:"login signed-in"},s("p",{class:"signed-in-text"},"Signed in as ",s("strong",null,this.customer?.email??"your account")),s("button",{type:"button",class:"secondary",disabled:this.busy,onClick:()=>this.signOut()},"Sign out")):"verifying"===this.phase?s("div",{class:"login"},s("h2",{class:"title"},"Signing you in…"),s("p",{class:"lead"},"Just a moment.")):"sent"===this.phase?s("div",{class:"login"},s("h2",{class:"title"},"Check your inbox"),s("p",{class:"lead"},"We've sent a sign-in link to ",s("strong",null,this.email),". Open it on this device to continue."),this.notice&&s("p",{class:"notice"},this.notice),this.renderError(),s("div",{class:"actions"},s("button",{type:"button",class:"secondary",disabled:this.busy,onClick:()=>this.requestLink(!0)},this.busy?"Sending…":"Resend link"),this.allowCodeEntry&&s("button",{type:"button",class:"link",onClick:()=>this.phase="code"},"Enter the code instead"),s("button",{type:"button",class:"link",onClick:()=>this.phase="email"},"Use a different email"))):"code"===this.phase?s("form",{class:"login",onSubmit:this.handleCodeSubmit},s("h2",{class:"title"},"Enter your code"),s("p",{class:"lead"},"Type the 6-digit code from the email we sent to ",s("strong",null,this.email),"."),s("label",{class:"label",htmlFor:"tl-login-code"},"Code"),s("input",{id:"tl-login-code",class:"input code-input",type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"123456",value:this.code,disabled:this.busy,onInput:this.handleCodeInput}),this.renderError(),s("button",{type:"submit",class:"primary",disabled:this.busy},this.busy?"Checking…":"Sign in"),s("div",{class:"actions"},s("button",{type:"button",class:"link",onClick:()=>this.requestLink(!0)},"Resend link"),s("button",{type:"button",class:"link",onClick:()=>this.phase="sent"},"Back"))):s("form",{class:"login",onSubmit:this.handleEmailSubmit},s("h2",{class:"title"},this.heading),s("p",{class:"lead"},"Enter your email and we'll send you a secure sign-in link. No password needed."),s("label",{class:"label",htmlFor:"tl-login-email"},"Email address"),s("input",{id:"tl-login-email",class:"input",type:"email",autocomplete:"email",placeholder:"you@example.com",required:!0,value:this.email,disabled:this.busy||!this.auth,onInput:this.handleEmailInput}),this.renderError(),s("button",{type:"submit",class:"primary",disabled:this.busy||!this.auth},this.busy?"Sending link…":"Email me a sign-in link"))}static get style(){return":host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif);color:var(--tl-foreground, #111827)}.login{display:flex;flex-direction:column;gap:var(--tl-spacing-3, 0.75rem);padding:var(--tl-spacing-6, 1.5rem);background:var(--tl-background, #ffffff);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-lg, 0.75rem)}.title{margin:0;font-size:1.25rem;font-weight:600}.lead{margin:0;font-size:0.875rem;color:var(--tl-muted-foreground, #6b7280)}.label{font-size:0.875rem;font-weight:500}.input{padding:var(--tl-spacing-3, 0.75rem);font:inherit;font-size:0.9375rem;color:var(--tl-foreground, #111827);background:var(--tl-background, #ffffff);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-md, 0.5rem)}.input:focus{outline:2px solid var(--tl-primary, #6366f1);outline-offset:1px}.code-input{font-family:var(--tl-font-family-mono, ui-monospace, monospace);font-size:1.25rem;letter-spacing:0.25em;text-align:center}.primary,.secondary{padding:var(--tl-spacing-3, 0.75rem) var(--tl-spacing-4, 1rem);font:inherit;font-size:0.9375rem;font-weight:600;border-radius:var(--tl-radius-md, 0.5rem);cursor:pointer}.primary{color:var(--tl-primary-foreground, #ffffff);background:var(--tl-primary, #6366f1);border:none}.primary:hover:not(:disabled){opacity:0.9}.secondary{color:var(--tl-foreground, #111827);background:var(--tl-secondary, #f3f4f6);border:1px solid var(--tl-border, #e5e7eb)}.primary:disabled,.secondary:disabled,.input:disabled{opacity:0.6;cursor:not-allowed}.link{padding:0;font:inherit;font-size:0.875rem;color:var(--tl-primary, #6366f1);background:none;border:none;cursor:pointer}.link:hover{text-decoration:underline}.actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--tl-spacing-4, 1rem)}.error{margin:0;font-size:0.8125rem;color:var(--tl-error, #ef4444)}.notice{margin:0;font-size:0.8125rem;color:var(--tl-success, #10b981)}.signed-in{flex-direction:row;align-items:center;justify-content:space-between;flex-wrap:wrap}.signed-in-text{margin:0;font-size:0.875rem;overflow-wrap:anywhere}"}},[1,"tl-login",{heading:[1],allowCodeEntry:[4,"allow-code-entry"],phase:[32],email:[32],code:[32],busy:[32],error:[32],notice:[32],customer:[32]}]);function a(){"undefined"!=typeof customElements&&["tl-login"].forEach((i=>{"tl-login"===i&&(customElements.get(n(i))||customElements.define(n(i),r))}))}export{r as T,a as d}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlMyOrders extends Components.TlMyOrders, HTMLElement {}
4
+ export const TlMyOrders: {
5
+ prototype: TlMyOrders;
6
+ new (): TlMyOrders;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{proxyCustomElement as r,HTMLElement as t,createEvent as e,h as s,transformTag as o}from"@stencil/core/internal/client";import{w as i}from"./sdk-connector.js";import{i as a,e as n,t as l,o as d,f as c,a as h,s as f,b as u}from"./order-summary.js";import{d as m}from"./tl-login2.js";import{d as p}from"./tl-order-tickets2.js";import{d as g}from"./tl-ticket2.js";const v=r(class extends t{constructor(r){super(),!1!==r&&this.__registerHost(),this.__attachShadow(),this.tlOrderSelect=e(this,"tlOrderSelect",7),this.tlError=e(this,"tlError",7),this.emptyMessage="When you buy tickets they'll show up here, ready to view and download.",this.columns=2,this.orders=[],this.authenticated=!1,this.loading=!0,this.error=null,this.expandedId=null,this.sdk=null,this.unsubscribes=[]}async componentWillLoad(){if(this.sdk=await i().catch((()=>null)),!this.sdk)return this.loading=!1,void(this.error="Orders are not available right now");const r=this.sdk.getAuthManager?.();this.authenticated=!r||r.authenticated,this.unsubscribes.push(this.sdk.on("auth:changed",(()=>this.syncAuth()))),this.unsubscribes.push(this.sdk.on("session:changed",(()=>this.syncAuth()))),this.authenticated?await this.load():this.loading=!1}disconnectedCallback(){this.unsubscribes.forEach((r=>r())),this.unsubscribes=[]}syncAuth(){const r=this.sdk?.getAuthManager?.();if(!r)return;const t=this.authenticated;this.authenticated=r.authenticated,this.authenticated&&!t?this.load():!this.authenticated&&t&&(this.orders=[],this.expandedId=null)}async load(){if(this.sdk)try{this.loading=!0,this.error=null;const r=this.sdk.getOrdersManager?.();if(!r)throw Error("Orders are not available");const t=await r.mine();this.orders=t??[],this.authenticated=!0}catch(r){a(r)?(this.authenticated=!1,this.orders=[]):(console.error("[tl-my-orders] Failed to load orders:",r),this.error=n(r,"Failed to load your orders"),this.tlError.emit({message:this.error}))}finally{this.loading=!1}}toggle(r){const t=this.expandedId!==r;this.expandedId=t?r:null,t&&this.tlOrderSelect.emit({orderId:r})}renderRow(r){const t=this.expandedId===r.id,e=l(r),o=f(r.status);return s("li",{class:{order:!0,expanded:t},key:r.id},s("button",{type:"button",class:"order-row","aria-expanded":t?"true":"false",onClick:()=>this.toggle(r.id)},s("span",{class:"order-main"},s("span",{class:"order-number"},"Order ",r.orderNumber),s("span",{class:"order-event"},d(r)??"Order"),s("span",{class:"order-meta"},r.createdAt&&s("span",null,c(r.createdAt)),s("span",null,e," ticket",1===e?"":"s"))),s("span",{class:"order-side"},s("span",{class:"order-total"},h(r.total,r.currency)),s("span",{class:"status status-"+o},u(r.status)),s("svg",{class:"chevron",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","aria-hidden":"true"},s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 18l6-6-6-6"})))),t&&s("div",{class:"order-tickets"},s("tl-order-tickets",{orderId:r.id,columns:this.columns})))}render(){return this.loading?s("div",{class:"orders"},[0,1,2].map((r=>s("div",{class:"skeleton",key:r})))):this.authenticated?s("div",{class:"orders"},this.error?s("div",{class:"state error"},s("p",{class:"state-title"},"Could not load your orders"),s("p",{class:"state-text"},this.error)):0===this.orders.length?s("div",{class:"state empty"},s("svg",{class:"empty-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","aria-hidden":"true"},s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z"}),s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M13 5v2M13 17v2M13 11v2"})),s("p",{class:"state-title"},"No orders yet"),s("p",{class:"state-text"},this.emptyMessage)):s("ul",{class:"order-list"},this.orders.map((r=>this.renderRow(r))))):s("div",{class:"orders"},s("div",{class:"signin"},s("p",{class:"signin-title"},"Sign in to see your orders"),s("p",{class:"signin-text"},"Your tickets and order history live in your account.")),s("tl-login",null))}static get style(){return":host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif);color:var(--tl-foreground, #111827)}.orders{display:flex;flex-direction:column;gap:var(--tl-spacing-4, 1rem)}.order-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--tl-spacing-3, 0.75rem)}.order{background:var(--tl-background, #ffffff);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-lg, 0.75rem);overflow:hidden;transition:border-color 0.2s ease, box-shadow 0.2s ease}.order:hover,.order.expanded{border-color:var(--tl-primary, #6366f1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.08)}.order-row{display:flex;align-items:center;justify-content:space-between;gap:var(--tl-spacing-4, 1rem);width:100%;padding:var(--tl-spacing-4, 1rem);font:inherit;color:inherit;text-align:left;background:none;border:none;cursor:pointer}.order-main{display:flex;flex-direction:column;gap:var(--tl-spacing-1, 0.25rem);min-width:0}.order-number{font-size:0.75rem;font-weight:500;text-transform:uppercase;letter-spacing:0.05em;color:var(--tl-muted-foreground, #6b7280)}.order-event{font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.order-meta{display:flex;flex-wrap:wrap;gap:var(--tl-spacing-3, 0.75rem);font-size:0.8125rem;color:var(--tl-muted-foreground, #6b7280)}.order-side{display:flex;align-items:center;gap:var(--tl-spacing-3, 0.75rem);flex-shrink:0}.order-total{font-weight:600}.status{padding:0.125rem 0.5rem;font-size:0.75rem;font-weight:500;border-radius:9999px;background:var(--tl-secondary, #f3f4f6);color:var(--tl-secondary-foreground, #111827)}.status-success{background:var(--tl-success, #10b981);color:var(--tl-success-foreground, #ffffff)}.status-info{background:var(--tl-primary, #6366f1);color:var(--tl-primary-foreground, #ffffff)}.status-warning{background:var(--tl-warning, #f59e0b);color:var(--tl-warning-foreground, #ffffff)}.status-error{background:var(--tl-error, #ef4444);color:var(--tl-error-foreground, #ffffff)}.chevron{width:1.125rem;height:1.125rem;color:var(--tl-muted-foreground, #6b7280);transition:transform 0.2s ease}.expanded .chevron{transform:rotate(90deg)}.order-tickets{padding:0 var(--tl-spacing-4, 1rem) var(--tl-spacing-4, 1rem);border-top:1px solid var(--tl-border, #e5e7eb);padding-top:var(--tl-spacing-4, 1rem)}@media (max-width: 480px){.order-row{flex-direction:column;align-items:stretch}.order-side{justify-content:space-between}}.signin{text-align:center}.signin-title,.state-title{margin:0;font-size:1.125rem;font-weight:600}.signin-text,.state-text{margin:var(--tl-spacing-1, 0.25rem) 0 0;font-size:0.875rem;color:var(--tl-muted-foreground, #6b7280)}.state{padding:var(--tl-spacing-8, 2rem) var(--tl-spacing-4, 1rem);text-align:center;background:var(--tl-background, #ffffff);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-lg, 0.75rem)}.state.error .state-title{color:var(--tl-error, #ef4444)}.empty-icon{width:3rem;height:3rem;margin:0 auto var(--tl-spacing-3, 0.75rem);color:var(--tl-primary, #6366f1)}.skeleton{height:5rem;background:var(--tl-secondary, #f3f4f6);border-radius:var(--tl-radius-lg, 0.75rem);animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.5}}"}},[1,"tl-my-orders",{emptyMessage:[1,"empty-message"],columns:[2],orders:[32],authenticated:[32],loading:[32],error:[32],expandedId:[32]}]),b=v,y=function(){"undefined"!=typeof customElements&&["tl-my-orders","tl-login","tl-order-tickets","tl-ticket"].forEach((r=>{switch(r){case"tl-my-orders":customElements.get(o(r))||customElements.define(o(r),v);break;case"tl-login":customElements.get(o(r))||m();break;case"tl-order-tickets":customElements.get(o(r))||p();break;case"tl-ticket":customElements.get(o(r))||g()}}))};export{b as TlMyOrders,y as defineCustomElement}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TlOccurrenceSelector extends Components.TlOccurrenceSelector, HTMLElement {}
4
+ export const TlOccurrenceSelector: {
5
+ prototype: TlOccurrenceSelector;
6
+ new (): TlOccurrenceSelector;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1 @@
1
+ import{T as o,d as r}from"./tl-occurrence-selector2.js";const c=o,e=r;export{c as TlOccurrenceSelector,e as defineCustomElement}