@ticketlayer/elements 0.3.3 → 1.0.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 (179) hide show
  1. package/README.md +3 -2
  2. package/dist/cjs/{index-BpfoKd9Q.js → index-DanPUX0s.js} +1 -1
  3. package/dist/cjs/index.cjs.js +2 -1
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/ticket-selector-BYVL13k_.js +3623 -0
  6. package/dist/cjs/ticketlayer-elements.cjs.js +2 -2
  7. package/dist/cjs/tl-buy-modal.cjs.entry.js +4 -4
  8. package/dist/cjs/tl-buy-tickets-button.cjs.entry.js +89 -71
  9. package/dist/cjs/tl-buy-tickets-wrapper.cjs.entry.js +62 -31
  10. package/dist/cjs/tl-cart-badge.cjs.entry.js +75 -62
  11. package/dist/cjs/tl-cart-drawer.cjs.entry.js +52 -24
  12. package/dist/cjs/tl-cart.cjs.entry.js +72 -98
  13. package/dist/cjs/tl-checkout-wrapper.cjs.entry.js +52 -30
  14. package/dist/cjs/tl-event-card.cjs.entry.js +44 -105
  15. package/dist/cjs/tl-event-list.cjs.entry.js +73 -36
  16. package/dist/cjs/tl-login.cjs.entry.js +75 -141
  17. package/dist/cjs/tl-my-orders.cjs.entry.js +53 -92
  18. package/dist/cjs/tl-occurrence-selector_2.cjs.entry.js +205 -641
  19. package/dist/cjs/tl-order-confirmation.cjs.entry.js +72 -105
  20. package/dist/cjs/tl-order-tickets_2.cjs.entry.js +50 -76
  21. package/dist/cjs/tl-promo-code.cjs.entry.js +51 -47
  22. package/dist/cjs/tl-seat-map.cjs.entry.js +4 -4
  23. package/dist/cjs/web-query-Ce73jB4k.js +16 -0
  24. package/dist/collection/components/tl-buy-modal/tl-buy-modal.css +12 -19
  25. package/dist/collection/components/tl-buy-modal/tl-buy-modal.js +2 -2
  26. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.css +41 -4
  27. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.js +105 -76
  28. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.css +2 -2
  29. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.js +73 -30
  30. package/dist/collection/components/tl-cart/tl-cart.css +52 -51
  31. package/dist/collection/components/tl-cart/tl-cart.js +82 -101
  32. package/dist/collection/components/tl-cart-badge/tl-cart-badge.css +11 -11
  33. package/dist/collection/components/tl-cart-badge/tl-cart-badge.js +62 -62
  34. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.css +6 -6
  35. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.js +56 -24
  36. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.css +2 -2
  37. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.js +61 -29
  38. package/dist/collection/components/tl-event-card/event-card-adapter.js +11 -23
  39. package/dist/collection/components/tl-event-card/tl-event-card.css +22 -22
  40. package/dist/collection/components/tl-event-card/tl-event-card.js +51 -84
  41. package/dist/collection/components/tl-event-list/tl-event-list.css +17 -17
  42. package/dist/collection/components/tl-event-list/tl-event-list.js +82 -38
  43. package/dist/collection/components/tl-login/tl-login.css +26 -26
  44. package/dist/collection/components/tl-login/tl-login.js +83 -147
  45. package/dist/collection/components/tl-my-orders/tl-my-orders.css +40 -40
  46. package/dist/collection/components/tl-my-orders/tl-my-orders.js +58 -96
  47. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.css +54 -65
  48. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.js +137 -516
  49. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.css +38 -38
  50. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.js +81 -113
  51. package/dist/collection/components/tl-order-tickets/tl-order-tickets.css +9 -9
  52. package/dist/collection/components/tl-order-tickets/tl-order-tickets.js +57 -92
  53. package/dist/collection/components/tl-promo-code/tl-promo-code.css +25 -25
  54. package/dist/collection/components/tl-promo-code/tl-promo-code.js +55 -50
  55. package/dist/collection/components/tl-seat-map/tl-seat-map.css +10 -10
  56. package/dist/collection/components/tl-seat-map/tl-seat-map.js +2 -2
  57. package/dist/collection/components/tl-ticket/tl-ticket.css +13 -13
  58. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.css +74 -49
  59. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.js +95 -135
  60. package/dist/collection/utils/cart-totals.js +9 -0
  61. package/dist/collection/utils/order-summary.js +15 -99
  62. package/dist/collection/utils/testing/deep-text.js +29 -0
  63. package/dist/collection/utils/testing/fixtures.js +290 -0
  64. package/dist/collection/utils/testing/mock-sdk.js +13 -2
  65. package/dist/collection/utils/web-query.js +12 -0
  66. package/dist/collection/utils/web-storage.js +22 -0
  67. package/dist/components/ticket-selector.js +1 -0
  68. package/dist/components/tl-buy-modal.js +1 -1
  69. package/dist/components/tl-buy-tickets-button.js +1 -1
  70. package/dist/components/tl-buy-tickets-wrapper2.js +1 -1
  71. package/dist/components/tl-cart-badge.js +1 -1
  72. package/dist/components/tl-cart-drawer.js +1 -1
  73. package/dist/components/tl-cart2.js +1 -1
  74. package/dist/components/tl-checkout-wrapper2.js +1 -1
  75. package/dist/components/tl-event-card2.js +1 -1
  76. package/dist/components/tl-event-list.js +1 -1
  77. package/dist/components/tl-login2.js +1 -1
  78. package/dist/components/tl-my-orders.js +1 -1
  79. package/dist/components/tl-occurrence-selector2.js +1 -1
  80. package/dist/components/tl-order-confirmation.js +1 -1
  81. package/dist/components/tl-order-tickets2.js +1 -1
  82. package/dist/components/tl-promo-code.js +1 -1
  83. package/dist/components/tl-seat-map.js +1 -1
  84. package/dist/components/tl-ticket-selector2.js +1 -1
  85. package/dist/components/tl-ticket2.js +1 -1
  86. package/dist/components/web-query.js +1 -0
  87. package/dist/elements.docs.json +36 -36
  88. package/dist/esm/{index-CNX8hZa8.js → index-imfxp765.js} +1 -1
  89. package/dist/esm/index.js +2 -1
  90. package/dist/esm/loader.js +3 -3
  91. package/dist/esm/ticket-selector-BwChnHVC.js +3606 -0
  92. package/dist/esm/ticketlayer-elements.js +3 -3
  93. package/dist/esm/tl-buy-modal.entry.js +4 -4
  94. package/dist/esm/tl-buy-tickets-button.entry.js +90 -72
  95. package/dist/esm/tl-buy-tickets-wrapper.entry.js +63 -32
  96. package/dist/esm/tl-cart-badge.entry.js +76 -63
  97. package/dist/esm/tl-cart-drawer.entry.js +53 -25
  98. package/dist/esm/tl-cart.entry.js +73 -99
  99. package/dist/esm/tl-checkout-wrapper.entry.js +53 -31
  100. package/dist/esm/tl-event-card.entry.js +45 -106
  101. package/dist/esm/tl-event-list.entry.js +74 -37
  102. package/dist/esm/tl-login.entry.js +76 -142
  103. package/dist/esm/tl-my-orders.entry.js +54 -93
  104. package/dist/esm/tl-occurrence-selector_2.entry.js +206 -642
  105. package/dist/esm/tl-order-confirmation.entry.js +73 -106
  106. package/dist/esm/tl-order-tickets_2.entry.js +51 -77
  107. package/dist/esm/tl-promo-code.entry.js +52 -48
  108. package/dist/esm/tl-seat-map.entry.js +4 -4
  109. package/dist/esm/web-query-Bdbb2lk5.js +14 -0
  110. package/dist/ticketlayer-elements/index.esm.js +1 -1
  111. package/dist/ticketlayer-elements/p-45923d2c.entry.js +1 -0
  112. package/dist/ticketlayer-elements/p-492adc77.entry.js +1 -0
  113. package/dist/ticketlayer-elements/p-4cfc9e53.entry.js +1 -0
  114. package/dist/ticketlayer-elements/p-5135630e.entry.js +1 -0
  115. package/dist/ticketlayer-elements/p-5bbce3b5.entry.js +1 -0
  116. package/dist/ticketlayer-elements/p-7d547721.entry.js +1 -0
  117. package/dist/ticketlayer-elements/p-7fe7b6ba.entry.js +1 -0
  118. package/dist/ticketlayer-elements/p-8122f0c1.entry.js +1 -0
  119. package/dist/ticketlayer-elements/p-98d40869.entry.js +1 -0
  120. package/dist/ticketlayer-elements/p-Bdbb2lk5.js +1 -0
  121. package/dist/ticketlayer-elements/p-BwChnHVC.js +1 -0
  122. package/dist/ticketlayer-elements/p-abec290a.entry.js +1 -0
  123. package/dist/ticketlayer-elements/p-ac79a3f6.entry.js +1 -0
  124. package/dist/ticketlayer-elements/p-d01f4429.entry.js +1 -0
  125. package/dist/ticketlayer-elements/p-d7ffaf46.entry.js +1 -0
  126. package/dist/ticketlayer-elements/p-e7170f3c.entry.js +1 -0
  127. package/dist/ticketlayer-elements/p-e787e862.entry.js +1 -0
  128. package/dist/ticketlayer-elements/p-f1ff931f.entry.js +1 -0
  129. package/dist/ticketlayer-elements/p-imfxp765.js +3 -0
  130. package/dist/ticketlayer-elements/ticketlayer-elements.css +1 -1
  131. package/dist/ticketlayer-elements/ticketlayer-elements.esm.js +1 -1
  132. package/dist/types/components/tl-buy-tickets-button/tl-buy-tickets-button.d.ts +40 -8
  133. package/dist/types/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.d.ts +20 -1
  134. package/dist/types/components/tl-cart/tl-cart.d.ts +40 -32
  135. package/dist/types/components/tl-cart-badge/tl-cart-badge.d.ts +22 -7
  136. package/dist/types/components/tl-cart-drawer/tl-cart-drawer.d.ts +28 -5
  137. package/dist/types/components/tl-checkout-wrapper/tl-checkout-wrapper.d.ts +18 -1
  138. package/dist/types/components/tl-event-card/event-card-adapter.d.ts +9 -20
  139. package/dist/types/components/tl-event-card/tl-event-card.d.ts +25 -28
  140. package/dist/types/components/tl-event-list/tl-event-list.d.ts +46 -6
  141. package/dist/types/components/tl-login/tl-login.d.ts +68 -22
  142. package/dist/types/components/tl-my-orders/tl-my-orders.d.ts +30 -12
  143. package/dist/types/components/tl-occurrence-selector/tl-occurrence-selector.d.ts +73 -161
  144. package/dist/types/components/tl-order-confirmation/tl-order-confirmation.d.ts +48 -15
  145. package/dist/types/components/tl-order-tickets/tl-order-tickets.d.ts +29 -31
  146. package/dist/types/components/tl-promo-code/tl-promo-code.d.ts +28 -10
  147. package/dist/types/components/tl-ticket/tl-ticket.d.ts +2 -11
  148. package/dist/types/components/tl-ticket-selector/tl-ticket-selector.d.ts +61 -32
  149. package/dist/types/components.d.ts +302 -62
  150. package/dist/types/utils/cart-totals.d.ts +10 -0
  151. package/dist/types/utils/order-summary.d.ts +16 -65
  152. package/dist/types/utils/testing/deep-text.d.ts +13 -0
  153. package/dist/types/utils/testing/fixtures.d.ts +225 -0
  154. package/dist/types/utils/testing/mock-sdk.d.ts +14 -1
  155. package/dist/types/utils/web-query.d.ts +18 -0
  156. package/dist/types/utils/web-storage.d.ts +16 -0
  157. package/elements.catalogue.json +676 -55
  158. package/package.json +14 -6
  159. package/dist/cjs/order-summary-ZMkJ5bez.js +0 -116
  160. package/dist/components/order-summary.js +0 -1
  161. package/dist/esm/order-summary-BGekdjN9.js +0 -103
  162. package/dist/ticketlayer-elements/p-0b1d16f8.entry.js +0 -1
  163. package/dist/ticketlayer-elements/p-1471f6d8.entry.js +0 -1
  164. package/dist/ticketlayer-elements/p-1c51cbc1.entry.js +0 -1
  165. package/dist/ticketlayer-elements/p-5169f68b.entry.js +0 -1
  166. package/dist/ticketlayer-elements/p-895ba1f3.entry.js +0 -1
  167. package/dist/ticketlayer-elements/p-8d5722e1.entry.js +0 -1
  168. package/dist/ticketlayer-elements/p-917d8e09.entry.js +0 -1
  169. package/dist/ticketlayer-elements/p-9629029a.entry.js +0 -1
  170. package/dist/ticketlayer-elements/p-BGekdjN9.js +0 -1
  171. package/dist/ticketlayer-elements/p-CNX8hZa8.js +0 -3
  172. package/dist/ticketlayer-elements/p-a22714d0.entry.js +0 -1
  173. package/dist/ticketlayer-elements/p-bf73044b.entry.js +0 -1
  174. package/dist/ticketlayer-elements/p-e02079fa.entry.js +0 -1
  175. package/dist/ticketlayer-elements/p-e04ace15.entry.js +0 -1
  176. package/dist/ticketlayer-elements/p-e6fab1d5.entry.js +0 -1
  177. package/dist/ticketlayer-elements/p-f826b753.entry.js +0 -1
  178. package/dist/ticketlayer-elements/p-fa639d88.entry.js +0 -1
  179. package/dist/ticketlayer-elements/p-fbaca948.entry.js +0 -1
@@ -1,15 +1,14 @@
1
1
  :host {
2
- /* Local fallbacks; real values come from the channel theme's --tl-* vars,
3
- which pierce the shadow boundary. */
4
- --_bg: var(--tl-background, #ffffff);
5
- --_fg: var(--tl-foreground, #111827);
6
- --_muted: var(--tl-muted, #f3f4f6);
7
- --_muted-fg: var(--tl-muted-foreground, #6b7280);
8
- --_border: var(--tl-border, #e5e7eb);
9
- --_primary: var(--tl-primary, #6366f1);
10
- --_primary-fg: var(--tl-primary-foreground, #ffffff);
11
- --_radius: var(--tl-radius-lg, var(--tl-radius, 0.75rem));
12
- --_font: var(--tl-font-family, system-ui, -apple-system, sans-serif);
2
+ /* Local shorthands over the theme tokens, which pierce the shadow boundary. */
3
+ --_bg: var(--tl-background);
4
+ --_fg: var(--tl-foreground);
5
+ --_muted: var(--tl-muted);
6
+ --_muted-fg: var(--tl-muted-foreground);
7
+ --_border: var(--tl-border);
8
+ --_primary: var(--tl-primary);
9
+ --_primary-fg: var(--tl-primary-foreground);
10
+ --_radius: var(--tl-radius-lg);
11
+ --_font: var(--tl-font-family);
13
12
 
14
13
  font-family: var(--_font);
15
14
  }
@@ -53,12 +52,6 @@
53
52
 
54
53
  /* Floating chrome beneath the panel: platform links left, brand right. */
55
54
  .powered-by {
56
- /* The dashes are a cut-out, so they have to be the colour BEHIND the ticket.
57
- This chrome floats on the modal's dark backdrop rather than on the page
58
- surface, so --tl-background (a light value in most themes) would draw
59
- white dashes on a white icon and vanish. The drawer's footer sits on the
60
- panel itself and takes the default. */
61
- --tl-pb-perforation: rgba(8, 8, 16, 0.6);
62
55
  width: 100%;
63
56
  max-width: 460px;
64
57
  display: flex;
@@ -267,7 +260,7 @@
267
260
  width: 100%;
268
261
  padding: 13px;
269
262
  border: 0;
270
- border-radius: var(--tl-radius-md, 0.5rem);
263
+ border-radius: var(--tl-radius-md);
271
264
  background: var(--_primary);
272
265
  color: var(--_primary-fg);
273
266
  font-size: 0.98rem;
@@ -285,7 +278,7 @@
285
278
  margin-top: 8px;
286
279
  padding: 12px;
287
280
  border: 1px solid var(--_border);
288
- border-radius: var(--tl-radius-md, 0.5rem);
281
+ border-radius: var(--tl-radius-md);
289
282
  background: transparent;
290
283
  color: var(--_fg);
291
284
  font-size: 0.95rem;
@@ -126,10 +126,10 @@ export class TlBuyModal {
126
126
  }
127
127
  }
128
128
  render() {
129
- return (h(Host, { key: '1245e518c2b5232f4d9dba091cf808cd3867fbef' }, h("div", { key: '4e770fccdd785444f1cc87df4adab5a5dc1bf58a', class: "overlay", onClick: (e) => {
129
+ return (h(Host, { key: 'f28be761216b4a84904c1e325dc34d848625db14' }, h("div", { key: '0f36708a6b52d19ee987b211588e759aaf82ac03', class: "overlay", onClick: (e) => {
130
130
  if (e.target === e.currentTarget)
131
131
  this.close();
132
- } }, h("div", { key: '57b13dac690028aeebd6a601acfba07f00854c40', class: { panel: true, 'panel--wide': this.step === 'occurrence' }, role: "dialog", "aria-modal": "true", "aria-label": this.eventName }, h("header", { key: '881e9cc70a0ca25947f272b9ebcb2e6d4b4268f2', class: "panel-header" }, this.imageUrl && (h("div", { key: '753f7df1b5118dfacbbc6b89b4e5d7ba114f6cdf', class: "event-thumb", style: { backgroundImage: `url(${this.imageUrl})` } })), h("div", { key: '9aaa32d1add90fabd1b0ea0c100f198962f4e6a5', class: "titles" }, h("span", { key: '538032bdf2338206ad763417386852ff97cc472f', class: "kicker" }, this.stepKicker()), h("h2", { key: '71429804179e7fbbea1fa90a2937a065517092f5', class: "event-name" }, this.eventName), this.venueLabel && h("p", { key: 'dd968b397deab890df3a4fbdff33226e82bd9660', class: "event-meta" }, this.venueLabel), this.dateSummary && h("p", { key: 'f40e6049d09b06c9f599e7d14d6fbb43b39b22fd', class: "event-meta" }, this.dateSummary)), h("button", { key: 'dbe0908f8cd8544654b627921f68cc4961802b77', class: "close-btn", "aria-label": "Close", onClick: this.close }, h("svg", { key: '23a750830e6e16d28cbcd5025507d25848aaadf7', viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: 'e81b8763a5c781f72c1ca8a2113482948e3ba8cc', d: "M6 6l12 12M18 6L6 18", "stroke-linecap": "round" })))), h("div", { key: 'da71e610f907cf53e78246d2065aaf526d5ceffd', class: "panel-body" }, this.step === 'loading' && (h("div", { key: '28cbb9a98c7b08fa8dcb9d8d5dfbf3bec93fe38d', class: "state-msg" }, h("span", { key: '915c8de87cbdc7da1ccf0622ce6c0f02fccf2cad', class: "spinner" }), " Loading\u2026")), this.step === 'error' && h("div", { key: '5785578bfef6f1ee81d938d91ffd3ded975f8c12', class: "state-msg error" }, this.error), this.step === 'occurrence' && (h("tl-occurrence-selector", { key: 'eeb853eab141c3c103015e82d221a140f6a3a109', eventId: this.eventId, onTlSelect: this.handleOccurrenceSelect })), this.step === 'tickets' && this.selectedOccurrenceId && (h("div", { key: 'f608f592ba651eb431375433eb4ff9393863ade5', class: "tickets-step" }, this.occurrenceCount > 1 && (h("button", { key: '84adfbdbeaceb2cf4238c6ffd09558b4499ca940', class: "back-link", onClick: this.backToDates }, "\u2190 Change date")), this.occurrenceLabel && h("p", { key: '0317e9194049608711e8c622142c3ad2c0a5dc12', class: "occ-label" }, this.occurrenceLabel), h("tl-ticket-selector", { key: '27b1e05d9d92fb8d519375e2b27d4b5ea0a4890a', eventId: this.eventId, occurrenceId: this.selectedOccurrenceId, onTlAddToCart: this.handleAdded }))), this.step === 'done' && (h("div", { key: '0853088206988c66d489f8804df7899821d49e64', class: "done-step" }, h("div", { key: 'c2955b893c4dffaadcdfd27bee96ef2724a131a6', class: "done-mark" }, "\uD83C\uDF9F\uFE0F"), h("p", { key: '370c30dfcbc0c25b4794d984dd261a3a5779a9dc', class: "done-title" }, "Added to your cart"), h("p", { key: 'c462f3c9292740e2fd2c74b173484f80a5dc1a30', class: "done-sub" }, "Held for you while you check out."), h("button", { key: '484991f79572e3213ad6413a1af87599880c3643', class: "primary-btn", onClick: this.goCheckout }, "Go to checkout"), h("button", { key: '5b4ba5a472b794e8f5af0f131dad1c8c11b869f5', class: "ghost-btn", onClick: this.close }, "Keep browsing"))))), h("div", { key: '9acdd36744d363f41f0bed7938ecea33322362d1', class: "powered-by" }, h("div", { key: 'f45545a8fc625336618352f0c0e9e84a1babce96', class: "pb-links" }, h("a", { key: 'dd929b12419b8353d9a09ad242a9f351dfd699e2', href: "https://ticketlayer.com/privacy", target: "_blank", rel: "noopener noreferrer" }, "Privacy Policy"), h("a", { key: '859be221bdc76602defaebdb89a997778cda6a91', href: "https://ticketlayer.com/report-abuse", target: "_blank", rel: "noopener noreferrer" }, "Report Abuse")), h("a", { key: 'd4e1f44b3b084160d2df8b9d15e075ddc5e05363', class: "pb-brand", href: "https://ticketlayer.com", target: "_blank", rel: "noopener noreferrer" }, h("span", { key: 'fe7fd86576a4e9772daa2c4c449da060f20fa143', class: "pb-pre" }, "Powered by"), h("svg", { key: '19412bd9e5522f0af9f847fe8fda6aa0f0004a3a', width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true" }, h("path", { key: 'c159efd1b8fce42b8c0fd5bac21792b4dc2728ce', d: "M4 7.5A1.5 1.5 0 0 1 5.5 6h13A1.5 1.5 0 0 1 20 7.5v2a2 2 0 0 0 0 5v2a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 4 16.5v-2a2 2 0 0 0 0-5v-2Z", fill: "currentColor" }), h("path", { key: '283956eead27e5919301c30882da6eaa7b093a1a', d: "M13 7v10", stroke: "var(--tl-pb-perforation, var(--tl-background, #fff))", "stroke-width": "1.2", "stroke-dasharray": "1.5 1.8", "stroke-linecap": "round" })), h("span", { key: 'bc045fda144885737b88bf81b4f9000ec8d333be', class: "pb-word" }, "Ticketlayer"))))));
132
+ } }, h("div", { key: '0b2bc062c89e8b821763e163bdedc44047571390', class: { panel: true, 'panel--wide': this.step === 'occurrence' }, role: "dialog", "aria-modal": "true", "aria-label": this.eventName }, h("header", { key: 'c9e3cc54615dace1842ceed226acff23ed0dc0d3', class: "panel-header" }, this.imageUrl && (h("div", { key: '18ffd6168344f65231fa40252361b03ac65ae91a', class: "event-thumb", style: { backgroundImage: `url(${this.imageUrl})` } })), h("div", { key: '4ccbf9a0477948bcb4202310f80cceb1d6e5ad0f', class: "titles" }, h("span", { key: '1a72eb71baaf9eff16aabc5d20c22b02e9b5cc99', class: "kicker" }, this.stepKicker()), h("h2", { key: 'f7dbc184bb016652c1ffe2fe24a551207f226942', class: "event-name" }, this.eventName), this.venueLabel && h("p", { key: 'db7ebd34f688b36b5610aa6adf0d8ab766f00ac2', class: "event-meta" }, this.venueLabel), this.dateSummary && h("p", { key: '00812c8b7b9abf85343f3d6bda433251468da1d9', class: "event-meta" }, this.dateSummary)), h("button", { key: 'e3f7252979794959d6e5070d549010567c0aa349', class: "close-btn", "aria-label": "Close", onClick: this.close }, h("svg", { key: 'd692c47bb8c614b41e19866c5fe4a65b0e083686', viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: 'cbb9a7bd3ce4ed2685a781729110bccd36b425a9', d: "M6 6l12 12M18 6L6 18", "stroke-linecap": "round" })))), h("div", { key: 'c14af096c9e1cfd9bcead143c1b8a106a4b28018', class: "panel-body" }, this.step === 'loading' && (h("div", { key: '108d1073d572f841f1945147a787b8bdea66cfba', class: "state-msg" }, h("span", { key: '27c2b7473c6edb14ade3b7104f728136c0a2b052', class: "spinner" }), " Loading\u2026")), this.step === 'error' && h("div", { key: '0e3f927f626d51dffc30bb7da7093b6a7cd90a2a', class: "state-msg error" }, this.error), this.step === 'occurrence' && (h("tl-occurrence-selector", { key: 'bfab02d294de3eb1bce39d3e39c21f450b474c99', eventId: this.eventId, onTlSelect: this.handleOccurrenceSelect })), this.step === 'tickets' && this.selectedOccurrenceId && (h("div", { key: '109be73c93b0b604b435cbbd540d5dd5c48eacfe', class: "tickets-step" }, this.occurrenceCount > 1 && (h("button", { key: '2769d896476487e1412ac37309cd2e162b4bd275', class: "back-link", onClick: this.backToDates }, "\u2190 Change date")), this.occurrenceLabel && h("p", { key: '0c709ed8ba75b9e13a141ae755353fc694532935', class: "occ-label" }, this.occurrenceLabel), h("tl-ticket-selector", { key: 'cdf66533a591e89dc265532a2578c30327fd06c8', eventId: this.eventId, occurrenceId: this.selectedOccurrenceId, onTlAddToCart: this.handleAdded }))), this.step === 'done' && (h("div", { key: '6c4b294a4b9412e643a230f4064d15a587f79383', class: "done-step" }, h("div", { key: 'ba0e663e731402192675db509c886c2ce6a2418b', class: "done-mark" }, "\uD83C\uDF9F\uFE0F"), h("p", { key: '8d0f07758d3978080177a99e580f59fbcfefb611', class: "done-title" }, "Added to your cart"), h("p", { key: 'bbf4bd073f021a2f516f91528311d494c40faa85', class: "done-sub" }, "Held for you while you check out."), h("button", { key: '71c90ad945ced314321d964795beed8301c989ac', class: "primary-btn", onClick: this.goCheckout }, "Go to checkout"), h("button", { key: 'b37ad6f8adeb1edb7c786b33974b845c31b963f2', class: "ghost-btn", onClick: this.close }, "Keep browsing"))))), h("div", { key: '5a175094620f6837ae91a5a394f16c79df94c859', class: "powered-by" }, h("div", { key: '63c095dc7e954042c5fb36ccd8ca92a33d7b6632', class: "pb-links" }, h("a", { key: '875fa14d6218853b96d4d817a243701b228b20f0', href: "https://ticketlayer.com/privacy", target: "_blank", rel: "noopener noreferrer" }, "Privacy Policy"), h("a", { key: '7de77189ecd8277acade45437819b4fa9ef2002b', href: "https://ticketlayer.com/report-abuse", target: "_blank", rel: "noopener noreferrer" }, "Report Abuse")), h("a", { key: '5f62bbe303398e9ad09703fbd706953502f441a1', class: "pb-brand", href: "https://ticketlayer.com", target: "_blank", rel: "noopener noreferrer" }, h("span", { key: '0101948057126320d180a452870eade9f540b119', class: "pb-pre" }, "Powered by"), h("svg", { key: 'c93e4184b3bd8bbb89b5909ec886b22d22322bb1', width: "14", height: "14", viewBox: "0 0 50 50", fill: "none", "aria-hidden": "true" }, h("g", { key: '5461e514631e1cb670e974b47ecc144e1a62e7a3', transform: "matrix(0.0129 0 0 -0.0129 25.4752 25.4752)" }, h("path", { key: 'af6f137d33f09ef4befb9a4b31834d6d2f04ab3d', fill: "currentColor", transform: "translate(-1781.5, -1759.4003)", d: "M 41 2973 c 1 -285 5 -734 9 -998 c 7 -444 9 -488 30 -580 c 81 -364 235 -634 512 -900 c 135 -130 263 -220 423 -299 c 156 -77 249 -109 409 -143 c 110 -23 142 -25 354 -24 c 230 1 310 8 427 37 c 241 60 453 162 640 309 c 82 64 252 234 317 315 c 210 264 340 604 355 926 l 6 121 l -69 6 c -86 8 -706 9 -755 1 l -36 -6 l -21 -125 c -34 -191 -98 -317 -236 -462 c -111 -115 -249 -198 -396 -238 c -98 -27 -356 -24 -463 5 c -100 27 -183 69 -273 137 c -226 173 -353 409 -354 660 c 0 44 -5 120 -10 169 c -6 49 -8 91 -6 94 c 3 3 65 -22 138 -55 c 140 -64 251 -103 358 -127 c 71 -17 295 -46 347 -46 l 33 0 l 0 434 l 0 434 l -67 7 c -147 14 -269 56 -393 133 c -222 139 -378 393 -397 648 l -6 71 l -75 7 c -41 3 -239 6 -439 6 l -363 0 l 1 -517 z" }))), h("span", { key: 'd4f15a3fb911e2f78eb203fdd5079d3119ee9803', class: "pb-word" }, "ticketlayer"))))));
133
133
  }
134
134
  static get is() { return "tl-buy-modal"; }
135
135
  static get encapsulation() { return "shadow"; }
@@ -4,7 +4,7 @@
4
4
 
5
5
  :host {
6
6
  display: inline-block;
7
- font-family: var(--tl-font-family, system-ui, -apple-system, sans-serif);
7
+ font-family: var(--tl-font-family);
8
8
  }
9
9
 
10
10
  :host(.full-width) {
@@ -16,6 +16,43 @@
16
16
  width: 100%;
17
17
  }
18
18
 
19
+ /* Sale states
20
+ *
21
+ * One state, one @ticketlayer/theme token family, and the hover derived from
22
+ * the same token rather than written down a second time, so a themed palette
23
+ * carries every state with it (TKT-203). These used to be literal hex in the
24
+ * component: red for sold out, blue for the waitlist, amber for coming soon,
25
+ * and a themed channel painted the available state and none of the others.
26
+ *
27
+ * The class comes from the core (`derived.stateClass`), which names the state
28
+ * and nothing more: a core may hold no value and has no shape for saying WHICH
29
+ * family a status paints with, so that decision is made here, exactly as
30
+ * tl-event-card's status badge makes it.
31
+ */
32
+ .state-available {
33
+ --button-color: var(--tl-primary);
34
+ --button-hover-color: color-mix(in srgb, var(--tl-primary) 90%, black);
35
+ --button-foreground: var(--tl-primary-foreground);
36
+ }
37
+
38
+ .state-sold-out {
39
+ --button-color: var(--tl-error);
40
+ --button-hover-color: color-mix(in srgb, var(--tl-error) 90%, black);
41
+ --button-foreground: var(--tl-error-foreground);
42
+ }
43
+
44
+ .state-waitlist {
45
+ --button-color: var(--tl-info);
46
+ --button-hover-color: color-mix(in srgb, var(--tl-info) 90%, black);
47
+ --button-foreground: var(--tl-info-foreground);
48
+ }
49
+
50
+ .state-coming-soon {
51
+ --button-color: var(--tl-warning);
52
+ --button-hover-color: color-mix(in srgb, var(--tl-warning) 90%, black);
53
+ --button-foreground: var(--tl-warning-foreground);
54
+ }
55
+
19
56
  .buy-button {
20
57
  display: inline-flex;
21
58
  align-items: center;
@@ -51,19 +88,19 @@
51
88
  .buy-button.size-sm {
52
89
  padding: 0.5rem 1rem;
53
90
  font-size: 0.875rem;
54
- border-radius: var(--tl-radius-sm, 0.375rem);
91
+ border-radius: var(--tl-radius-sm);
55
92
  }
56
93
 
57
94
  .buy-button.size-md {
58
95
  padding: 0.75rem 1.5rem;
59
96
  font-size: 1rem;
60
- border-radius: var(--tl-radius-md, 0.5rem);
97
+ border-radius: var(--tl-radius-md);
61
98
  }
62
99
 
63
100
  .buy-button.size-lg {
64
101
  padding: 1rem 2rem;
65
102
  font-size: 1.125rem;
66
- border-radius: var(--tl-radius-lg, 0.625rem);
103
+ border-radius: var(--tl-radius-lg);
67
104
  min-height: 51px;
68
105
  }
69
106
 
@@ -5,11 +5,20 @@
5
5
  *
6
6
  * @element tl-buy-tickets-button
7
7
  *
8
- * Supports multiple states:
9
- * - available: Default "Buy Tickets" with primary colour
10
- * - soldOut: "Sold Out" with red colour
11
- * - waitlist: "Join Waitlist" with blue colour
12
- * - comingSoon: "On Sale Soon" with yellow colour
8
+ * The web harness for `buyTicketsButtonCore`. What a press does, which states
9
+ * are not pressable, the label each state defaults to and how the price reads
10
+ * are all in `@ticketlayer/elements-core` (AGENTS.md, TKT-11); what is left
11
+ * here is the Stencil surface, the icons, the hover, and which key counts as a
12
+ * press.
13
+ *
14
+ * Each state is painted from a @ticketlayer/theme token family rather than
15
+ * from a literal, so a channel theme reaches every one of them. The core says
16
+ * which state the button is in and the stylesheet says which family that
17
+ * state paints with, because a core cannot map a status onto one:
18
+ * - available: "Buy Tickets", the primary family
19
+ * - soldOut: "Sold Out", the error family
20
+ * - waitlist: "Join Waitlist", the info family
21
+ * - comingSoon: "On Sale Soon", the warning family
13
22
  *
14
23
  * @example
15
24
  * <tl-buy-tickets-button event-id="evt_xxx"></tl-buy-tickets-button>
@@ -17,34 +26,8 @@
17
26
  * <tl-buy-tickets-button event-id="evt_xxx" price="2500" currency="GBP"></tl-buy-tickets-button>
18
27
  */
19
28
  import { h, Host } from "@stencil/core";
20
- import { getSDK, hasSDK } from "../../utils/sdk-connector";
21
- // State configurations
22
- const STATE_CONFIGS = {
23
- available: {
24
- defaultLabel: 'Buy Tickets',
25
- color: 'var(--tl-primary, #e64b12)',
26
- hoverColor: 'var(--tl-primary, #d4440f)',
27
- foreground: 'var(--tl-primary-foreground, #ffffff)',
28
- },
29
- soldOut: {
30
- defaultLabel: 'Sold Out',
31
- color: '#dc2626',
32
- hoverColor: '#b91c1c',
33
- foreground: '#ffffff',
34
- },
35
- waitlist: {
36
- defaultLabel: 'Join Waitlist',
37
- color: '#2563eb',
38
- hoverColor: '#1d4ed8',
39
- foreground: '#ffffff',
40
- },
41
- comingSoon: {
42
- defaultLabel: 'On Sale Soon',
43
- color: '#d97706',
44
- hoverColor: '#b45309',
45
- foreground: '#ffffff',
46
- },
47
- };
29
+ import { buyTicketsButtonCore, createElement, } from "@ticketlayer/elements-core";
30
+ import { getSDK, whenSDK } from "../../utils/sdk-connector";
48
31
  export class TlBuyTicketsButton {
49
32
  constructor() {
50
33
  /** Button state - determines colour, label, and icon */
@@ -64,65 +47,74 @@ export class TlBuyTicketsButton {
64
47
  // -------------------------------------------------------------------------
65
48
  // State
66
49
  // -------------------------------------------------------------------------
50
+ /**
51
+ * Whether the pointer is over the button. A pointer is not a fact every
52
+ * runtime has, so this stays here for the same reason the key handling
53
+ * does: the core knows nothing of mice.
54
+ */
67
55
  this.isHovered = false;
68
56
  // -------------------------------------------------------------------------
69
- // Methods
57
+ // The core
70
58
  // -------------------------------------------------------------------------
59
+ this.element = createElement(buyTicketsButtonCore, {
60
+ client: () => getSDK(),
61
+ clientReady: () => whenSDK(),
62
+ emit: (event, detail) => this.forward(event, detail),
63
+ });
64
+ /** The core's whole view. Assigning it is what makes Stencil re-render. */
65
+ this.view = this.element.view;
71
66
  this.handleClick = () => {
72
- // Check if button should be interactive
73
- if (this.disabled || this.state === 'soldOut' || this.state === 'comingSoon') {
74
- return;
75
- }
76
- // Emit click event
77
- this.tlClick.emit({ eventId: this.eventId, occurrenceId: this.occurrenceId });
78
- // Open modal via SDK if available
79
- if (hasSDK()) {
80
- try {
81
- const sdk = getSDK();
82
- sdk.event(this.eventId).openModal({
83
- occurrenceId: this.occurrenceId,
84
- });
85
- }
86
- catch (err) {
87
- console.error('[tl-buy-tickets-button] Failed to open modal:', err);
88
- }
89
- }
67
+ this.element.actions.activate();
90
68
  };
91
69
  }
92
- formatPrice(priceInMinorUnits) {
93
- const amount = priceInMinorUnits / 100;
94
- const hasDecimals = amount % 1 !== 0;
95
- return new Intl.NumberFormat('en-GB', {
96
- style: 'currency',
70
+ syncProps() {
71
+ this.element.setProps({
72
+ eventId: this.eventId,
73
+ occurrenceId: this.occurrenceId,
74
+ state: this.state,
75
+ label: this.label,
76
+ variant: this.variant,
77
+ size: this.size,
78
+ fullWidth: this.fullWidth,
79
+ price: this.price,
97
80
  currency: this.currency,
98
- minimumFractionDigits: hasDecimals ? 2 : 0,
99
- maximumFractionDigits: hasDecimals ? 2 : 0,
100
- }).format(amount);
81
+ pricePrefix: this.pricePrefix,
82
+ disabled: this.disabled,
83
+ });
101
84
  }
102
- getStateConfig() {
103
- return STATE_CONFIGS[this.state];
85
+ connectedCallback() {
86
+ this.syncProps();
87
+ this.unsubscribe ?? (this.unsubscribe = this.element.subscribe((view) => {
88
+ this.view = view;
89
+ }));
90
+ this.view = this.element.view;
91
+ // This core has nothing to do on mount, and is mounted anyway: a harness
92
+ // calls mount() unconditionally and pairs it with its teardown (TKT-197).
93
+ this.teardown = this.element.mount();
104
94
  }
105
- isInteractive() {
106
- return !this.disabled && this.state !== 'soldOut' && this.state !== 'comingSoon';
95
+ disconnectedCallback() {
96
+ this.teardown?.();
97
+ this.teardown = undefined;
98
+ this.unsubscribe?.();
99
+ this.unsubscribe = undefined;
100
+ }
101
+ forward(event, detail) {
102
+ if (event === 'tlClick')
103
+ this.tlClick.emit(detail);
107
104
  }
108
105
  // -------------------------------------------------------------------------
109
106
  // Render
110
107
  // -------------------------------------------------------------------------
111
108
  render() {
112
- const config = this.getStateConfig();
113
- const buttonLabel = this.label || config.defaultLabel;
114
- const isInteractive = this.isInteractive();
115
- return (h(Host, { key: '10c8c36d12223afcfd13c9807c2ef6b0f4c34266', class: { 'full-width': this.fullWidth } }, h("button", { key: 'c7f6a39a837c90ced0176b5d017687afabf99a5a', type: "button", class: {
109
+ const { interactive, buttonLabel, stateClass, priceLabel } = this.view.derived;
110
+ return (h(Host, { key: '6d5dddb3fc486c5a877a3718fecbee80a648b274', class: { 'full-width': this.fullWidth } }, h("button", { key: '88f7f0688fb42e97eb2ce352f316b2a085c3bab5', type: "button", class: {
116
111
  'buy-button': true,
112
+ [stateClass]: true,
117
113
  [`variant-${this.variant}`]: true,
118
114
  [`size-${this.size}`]: true,
119
- 'disabled': !isInteractive,
120
- 'hovered': this.isHovered && isInteractive,
121
- }, style: {
122
- '--button-color': config.color,
123
- '--button-hover-color': config.hoverColor,
124
- '--button-foreground': config.foreground,
125
- }, disabled: !isInteractive, onClick: this.handleClick, onMouseEnter: () => (this.isHovered = true), onMouseLeave: () => (this.isHovered = false) }, h("span", { key: 'e2bc1edc9fbd2a9c81da8cc3293170b1c4275125', class: "icon" }, this.state === 'soldOut' && this.renderSoldOutIcon(), this.state === 'waitlist' && this.renderWaitlistIcon(), this.state === 'comingSoon' && this.renderComingSoonIcon(), this.state === 'available' && this.renderTicketIcon()), h("span", { key: '8371c85dcc24c5ac040744edefe80618421025ef', class: "label" }, buttonLabel), this.price !== undefined && (h("span", { key: 'c02cb5b646ade8866deafb9b3e698115abec5708', class: "price" }, h("span", { key: 'cb0ab272460115a5edebd674362c83711735a70d', class: "price-prefix" }, this.pricePrefix), h("span", { key: 'e28ba56d3928076b624513de95682351f3e0d92b', class: "price-value" }, this.formatPrice(this.price)))))));
115
+ 'disabled': !interactive,
116
+ 'hovered': this.isHovered && interactive,
117
+ }, disabled: !interactive, onClick: this.handleClick, onMouseEnter: () => (this.isHovered = true), onMouseLeave: () => (this.isHovered = false) }, h("span", { key: 'e88c2f05c7bc782d08d78fc8ab53b213ab3c833f', class: "icon" }, this.state === 'soldOut' && this.renderSoldOutIcon(), this.state === 'waitlist' && this.renderWaitlistIcon(), this.state === 'comingSoon' && this.renderComingSoonIcon(), this.state === 'available' && this.renderTicketIcon()), h("span", { key: '7290a58779e884886f26e64c405fd319811613a1', class: "label" }, buttonLabel), priceLabel !== null && (h("span", { key: 'bdf3bcdbfa29d4799f7a64bc0072a4c06c09c393', class: "price" }, h("span", { key: '32b075fc6793ef21e9a2cd188058992f95c10680', class: "price-prefix" }, this.pricePrefix), h("span", { key: 'ff3805b660b2af72a94fabc315507ce063ff02d2', class: "price-value" }, priceLabel))))));
126
118
  }
127
119
  renderTicketIcon() {
128
120
  return (h("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("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" }), h("path", { d: "M13 5v2" }), h("path", { d: "M13 17v2" }), h("path", { d: "M13 11v2" })));
@@ -388,7 +380,8 @@ export class TlBuyTicketsButton {
388
380
  }
389
381
  static get states() {
390
382
  return {
391
- "isHovered": {}
383
+ "isHovered": {},
384
+ "view": {}
392
385
  };
393
386
  }
394
387
  static get events() {
@@ -409,4 +402,40 @@ export class TlBuyTicketsButton {
409
402
  }
410
403
  }];
411
404
  }
405
+ static get watchers() {
406
+ return [{
407
+ "propName": "eventId",
408
+ "methodName": "syncProps"
409
+ }, {
410
+ "propName": "occurrenceId",
411
+ "methodName": "syncProps"
412
+ }, {
413
+ "propName": "state",
414
+ "methodName": "syncProps"
415
+ }, {
416
+ "propName": "label",
417
+ "methodName": "syncProps"
418
+ }, {
419
+ "propName": "variant",
420
+ "methodName": "syncProps"
421
+ }, {
422
+ "propName": "size",
423
+ "methodName": "syncProps"
424
+ }, {
425
+ "propName": "fullWidth",
426
+ "methodName": "syncProps"
427
+ }, {
428
+ "propName": "price",
429
+ "methodName": "syncProps"
430
+ }, {
431
+ "propName": "currency",
432
+ "methodName": "syncProps"
433
+ }, {
434
+ "propName": "pricePrefix",
435
+ "methodName": "syncProps"
436
+ }, {
437
+ "propName": "disabled",
438
+ "methodName": "syncProps"
439
+ }];
440
+ }
412
441
  }
@@ -10,9 +10,9 @@ tl-buy-tickets-wrapper,
10
10
 
11
11
  tl-buy-tickets-wrapper:focus,
12
12
  .tl-buy-tickets-wrapper:focus {
13
- outline: 2px solid var(--tl-ring, #3b82f6);
13
+ outline: 2px solid var(--tl-ring);
14
14
  outline-offset: 2px;
15
- border-radius: var(--tl-radius-sm, 0.25rem);
15
+ border-radius: var(--tl-radius-sm);
16
16
  }
17
17
 
18
18
  tl-buy-tickets-wrapper[disabled],
@@ -1,11 +1,18 @@
1
1
  import { h, Host } from "@stencil/core";
2
- import { getSDK, hasSDK } from "../../utils/sdk-connector";
2
+ import { buyTicketsWrapperCore, createElement, } from "@ticketlayer/elements-core";
3
+ import { getSDK, whenSDK } from "../../utils/sdk-connector";
3
4
  /**
4
5
  * @component tl-buy-tickets-wrapper
5
6
  *
6
7
  * Wraps any content and opens the Ticketlayer modal when clicked.
7
8
  * Uses the SDK's modal manager which handles the iframe overlay.
8
9
  *
10
+ * The web harness for `buyTicketsWrapperCore`. What a press does, what it
11
+ * announces and what happens when no client has been published are all in
12
+ * `@ticketlayer/elements-core` (AGENTS.md, TKT-11); what is left here is the
13
+ * Stencil surface, the accessibility attributes and the one genuinely web
14
+ * question the core refuses to answer - which key counts as a press.
15
+ *
9
16
  * @slot - Content to display (typically a button)
10
17
  *
11
18
  * @example
@@ -24,41 +31,61 @@ export class TlBuyTicketsWrapper {
24
31
  * Whether the wrapper is disabled
25
32
  */
26
33
  this.disabled = false;
34
+ this.element = createElement(buyTicketsWrapperCore, {
35
+ client: () => getSDK(),
36
+ clientReady: () => whenSDK(),
37
+ emit: (event, detail) => this.forward(event, detail),
38
+ });
39
+ /** The core's whole view. Assigning it is what makes Stencil re-render. */
40
+ this.view = this.element.view;
27
41
  this.handleClick = () => {
28
- if (this.disabled)
29
- return;
30
- if (!hasSDK()) {
31
- console.error('[tl-buy-tickets-wrapper] SDK not initialized. Call setSDK(ticketlayer) first.');
32
- this.tlError.emit({ message: 'SDK not initialized' });
33
- return;
34
- }
35
- const sdk = getSDK();
36
- // Open the modal via SDK
37
- sdk.event(this.eventId).openModal({
38
- occurrenceId: this.occurrenceId,
39
- onComplete: (order) => {
40
- this.tlComplete.emit(order);
41
- },
42
- onError: (err) => {
43
- this.tlError.emit({ message: err.message });
44
- },
45
- onClose: () => {
46
- this.tlClose.emit();
47
- },
48
- });
42
+ this.element.actions.activate();
49
43
  };
44
+ /** Enter and Space are a press on the web. The core knows nothing of keys. */
50
45
  this.handleKeyDown = (e) => {
51
46
  if (e.key === 'Enter' || e.key === ' ') {
52
47
  e.preventDefault();
53
- this.handleClick();
48
+ this.element.actions.activate();
54
49
  }
55
50
  };
56
51
  }
52
+ syncProps() {
53
+ this.element.setProps({
54
+ eventId: this.eventId,
55
+ occurrenceId: this.occurrenceId,
56
+ disabled: this.disabled,
57
+ });
58
+ }
59
+ connectedCallback() {
60
+ this.syncProps();
61
+ this.unsubscribe ?? (this.unsubscribe = this.element.subscribe((view) => {
62
+ this.view = view;
63
+ }));
64
+ this.view = this.element.view;
65
+ // This core has nothing to do on mount, and is mounted anyway: a harness
66
+ // calls mount() unconditionally and pairs it with its teardown (TKT-197).
67
+ this.teardown = this.element.mount();
68
+ }
69
+ disconnectedCallback() {
70
+ this.teardown?.();
71
+ this.teardown = undefined;
72
+ this.unsubscribe?.();
73
+ this.unsubscribe = undefined;
74
+ }
75
+ forward(event, detail) {
76
+ if (event === 'tlComplete')
77
+ this.tlComplete.emit(detail);
78
+ else if (event === 'tlError')
79
+ this.tlError.emit(detail);
80
+ else if (event === 'tlClose')
81
+ this.tlClose.emit();
82
+ }
57
83
  render() {
58
- return (h(Host, { key: 'd6ef81ac9bc1a1194eda1603cbb2a75b355a212e', class: {
84
+ const { interactive } = this.view.derived;
85
+ return (h(Host, { key: '14e91259c1401322f969d43bb16b6d3f20327c65', class: {
59
86
  'tl-buy-tickets-wrapper': true,
60
- 'tl-buy-tickets-wrapper--disabled': this.disabled,
61
- }, onClick: this.handleClick, onKeyDown: this.handleKeyDown, role: "button", tabindex: this.disabled ? -1 : 0, "aria-disabled": this.disabled ? 'true' : null }, h("slot", { key: 'faef5aaad20deaf5e442d688c69105e45f9ee26f' })));
87
+ 'tl-buy-tickets-wrapper--disabled': !interactive,
88
+ }, onClick: this.handleClick, onKeyDown: this.handleKeyDown, role: "button", tabindex: interactive ? 0 : -1, "aria-disabled": interactive ? null : 'true' }, h("slot", { key: '3fb33786e09f5ecdf20ff0ea8e7336ccfc43b216' })));
62
89
  }
63
90
  static get is() { return "tl-buy-tickets-wrapper"; }
64
91
  static get originalStyleUrls() {
@@ -133,10 +160,15 @@ export class TlBuyTicketsWrapper {
133
160
  }
134
161
  };
135
162
  }
163
+ static get states() {
164
+ return {
165
+ "view": {}
166
+ };
167
+ }
136
168
  static get events() {
137
169
  return [{
138
170
  "method": "tlComplete",
139
- "name": "tl-complete",
171
+ "name": "tlComplete",
140
172
  "bubbles": true,
141
173
  "cancelable": true,
142
174
  "composed": true,
@@ -158,7 +190,7 @@ export class TlBuyTicketsWrapper {
158
190
  }
159
191
  }, {
160
192
  "method": "tlError",
161
- "name": "tl-error",
193
+ "name": "tlError",
162
194
  "bubbles": true,
163
195
  "cancelable": true,
164
196
  "composed": true,
@@ -173,7 +205,7 @@ export class TlBuyTicketsWrapper {
173
205
  }
174
206
  }, {
175
207
  "method": "tlClose",
176
- "name": "tl-close",
208
+ "name": "tlClose",
177
209
  "bubbles": true,
178
210
  "cancelable": true,
179
211
  "composed": true,
@@ -188,5 +220,16 @@ export class TlBuyTicketsWrapper {
188
220
  }
189
221
  }];
190
222
  }
191
- static get elementRef() { return "el"; }
223
+ static get watchers() {
224
+ return [{
225
+ "propName": "eventId",
226
+ "methodName": "syncProps"
227
+ }, {
228
+ "propName": "occurrenceId",
229
+ "methodName": "syncProps"
230
+ }, {
231
+ "propName": "disabled",
232
+ "methodName": "syncProps"
233
+ }];
234
+ }
192
235
  }