@ticketlayer/elements 0.4.0 → 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 (161) hide show
  1. package/dist/cjs/{index-I9CoYv3k.js → index-DanPUX0s.js} +1 -1
  2. package/dist/cjs/index.cjs.js +2 -1
  3. package/dist/cjs/loader.cjs.js +2 -2
  4. package/dist/cjs/ticket-selector-BYVL13k_.js +3623 -0
  5. package/dist/cjs/ticketlayer-elements.cjs.js +2 -2
  6. package/dist/cjs/tl-buy-modal.cjs.entry.js +3 -3
  7. package/dist/cjs/tl-buy-tickets-button.cjs.entry.js +89 -74
  8. package/dist/cjs/tl-buy-tickets-wrapper.cjs.entry.js +61 -30
  9. package/dist/cjs/tl-cart-badge.cjs.entry.js +74 -61
  10. package/dist/cjs/tl-cart-drawer.cjs.entry.js +51 -23
  11. package/dist/cjs/tl-cart.cjs.entry.js +71 -103
  12. package/dist/cjs/tl-checkout-wrapper.cjs.entry.js +51 -29
  13. package/dist/cjs/tl-event-card.cjs.entry.js +43 -105
  14. package/dist/cjs/tl-event-list.cjs.entry.js +72 -35
  15. package/dist/cjs/tl-login.cjs.entry.js +74 -141
  16. package/dist/cjs/tl-my-orders.cjs.entry.js +52 -92
  17. package/dist/cjs/tl-occurrence-selector_2.cjs.entry.js +153 -921
  18. package/dist/cjs/tl-order-confirmation.cjs.entry.js +71 -107
  19. package/dist/cjs/tl-order-tickets_2.cjs.entry.js +48 -74
  20. package/dist/cjs/tl-promo-code.cjs.entry.js +50 -47
  21. package/dist/cjs/tl-seat-map.cjs.entry.js +3 -3
  22. package/dist/cjs/web-query-Ce73jB4k.js +16 -0
  23. package/dist/collection/components/tl-buy-modal/tl-buy-modal.js +2 -2
  24. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.css +37 -0
  25. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.js +105 -79
  26. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.js +73 -30
  27. package/dist/collection/components/tl-cart/tl-cart.js +82 -107
  28. package/dist/collection/components/tl-cart-badge/tl-cart-badge.js +62 -62
  29. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.js +56 -24
  30. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.js +61 -29
  31. package/dist/collection/components/tl-event-card/event-card-adapter.js +11 -23
  32. package/dist/collection/components/tl-event-card/tl-event-card.js +51 -84
  33. package/dist/collection/components/tl-event-list/tl-event-list.js +82 -38
  34. package/dist/collection/components/tl-login/tl-login.js +83 -147
  35. package/dist/collection/components/tl-my-orders/tl-my-orders.js +58 -96
  36. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.js +137 -516
  37. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.js +81 -115
  38. package/dist/collection/components/tl-order-tickets/tl-order-tickets.js +57 -92
  39. package/dist/collection/components/tl-promo-code/tl-promo-code.js +55 -50
  40. package/dist/collection/components/tl-seat-map/tl-seat-map.js +2 -2
  41. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.js +34 -20
  42. package/dist/collection/utils/order-summary.js +15 -135
  43. package/dist/collection/utils/testing/deep-text.js +29 -0
  44. package/dist/collection/utils/testing/fixtures.js +290 -0
  45. package/dist/collection/utils/testing/mock-sdk.js +13 -2
  46. package/dist/collection/utils/web-query.js +12 -0
  47. package/dist/collection/utils/web-storage.js +22 -0
  48. package/dist/components/ticket-selector.js +1 -0
  49. package/dist/components/tl-buy-modal.js +1 -1
  50. package/dist/components/tl-buy-tickets-button.js +1 -1
  51. package/dist/components/tl-buy-tickets-wrapper2.js +1 -1
  52. package/dist/components/tl-cart-badge.js +1 -1
  53. package/dist/components/tl-cart-drawer.js +1 -1
  54. package/dist/components/tl-cart2.js +1 -1
  55. package/dist/components/tl-checkout-wrapper2.js +1 -1
  56. package/dist/components/tl-event-card2.js +1 -1
  57. package/dist/components/tl-event-list.js +1 -1
  58. package/dist/components/tl-login2.js +1 -1
  59. package/dist/components/tl-my-orders.js +1 -1
  60. package/dist/components/tl-occurrence-selector2.js +1 -1
  61. package/dist/components/tl-order-confirmation.js +1 -1
  62. package/dist/components/tl-order-tickets2.js +1 -1
  63. package/dist/components/tl-promo-code.js +1 -1
  64. package/dist/components/tl-seat-map.js +1 -1
  65. package/dist/components/tl-ticket-selector2.js +1 -1
  66. package/dist/components/web-query.js +1 -0
  67. package/dist/elements.docs.json +34 -34
  68. package/dist/esm/{index-OoYV1faY.js → index-imfxp765.js} +1 -1
  69. package/dist/esm/index.js +2 -1
  70. package/dist/esm/loader.js +3 -3
  71. package/dist/esm/ticket-selector-BwChnHVC.js +3606 -0
  72. package/dist/esm/ticketlayer-elements.js +3 -3
  73. package/dist/esm/tl-buy-modal.entry.js +3 -3
  74. package/dist/esm/tl-buy-tickets-button.entry.js +90 -75
  75. package/dist/esm/tl-buy-tickets-wrapper.entry.js +62 -31
  76. package/dist/esm/tl-cart-badge.entry.js +75 -62
  77. package/dist/esm/tl-cart-drawer.entry.js +52 -24
  78. package/dist/esm/tl-cart.entry.js +72 -104
  79. package/dist/esm/tl-checkout-wrapper.entry.js +52 -30
  80. package/dist/esm/tl-event-card.entry.js +44 -106
  81. package/dist/esm/tl-event-list.entry.js +73 -36
  82. package/dist/esm/tl-login.entry.js +75 -142
  83. package/dist/esm/tl-my-orders.entry.js +53 -93
  84. package/dist/esm/tl-occurrence-selector_2.entry.js +152 -920
  85. package/dist/esm/tl-order-confirmation.entry.js +72 -108
  86. package/dist/esm/tl-order-tickets_2.entry.js +49 -75
  87. package/dist/esm/tl-promo-code.entry.js +51 -48
  88. package/dist/esm/tl-seat-map.entry.js +3 -3
  89. package/dist/esm/web-query-Bdbb2lk5.js +14 -0
  90. package/dist/ticketlayer-elements/index.esm.js +1 -1
  91. package/dist/ticketlayer-elements/p-45923d2c.entry.js +1 -0
  92. package/dist/ticketlayer-elements/p-492adc77.entry.js +1 -0
  93. package/dist/ticketlayer-elements/p-4cfc9e53.entry.js +1 -0
  94. package/dist/ticketlayer-elements/{p-ac264adc.entry.js → p-5135630e.entry.js} +1 -1
  95. package/dist/ticketlayer-elements/p-5bbce3b5.entry.js +1 -0
  96. package/dist/ticketlayer-elements/p-7d547721.entry.js +1 -0
  97. package/dist/ticketlayer-elements/p-7fe7b6ba.entry.js +1 -0
  98. package/dist/ticketlayer-elements/p-8122f0c1.entry.js +1 -0
  99. package/dist/ticketlayer-elements/p-98d40869.entry.js +1 -0
  100. package/dist/ticketlayer-elements/p-Bdbb2lk5.js +1 -0
  101. package/dist/ticketlayer-elements/p-BwChnHVC.js +1 -0
  102. package/dist/ticketlayer-elements/p-abec290a.entry.js +1 -0
  103. package/dist/ticketlayer-elements/p-ac79a3f6.entry.js +1 -0
  104. package/dist/ticketlayer-elements/p-d01f4429.entry.js +1 -0
  105. package/dist/ticketlayer-elements/p-d7ffaf46.entry.js +1 -0
  106. package/dist/ticketlayer-elements/p-e7170f3c.entry.js +1 -0
  107. package/dist/ticketlayer-elements/p-e787e862.entry.js +1 -0
  108. package/dist/ticketlayer-elements/p-f1ff931f.entry.js +1 -0
  109. package/dist/ticketlayer-elements/p-imfxp765.js +3 -0
  110. package/dist/ticketlayer-elements/ticketlayer-elements.css +1 -1
  111. package/dist/ticketlayer-elements/ticketlayer-elements.esm.js +1 -1
  112. package/dist/types/components/tl-buy-tickets-button/tl-buy-tickets-button.d.ts +40 -8
  113. package/dist/types/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.d.ts +20 -1
  114. package/dist/types/components/tl-cart/tl-cart.d.ts +40 -42
  115. package/dist/types/components/tl-cart-badge/tl-cart-badge.d.ts +22 -7
  116. package/dist/types/components/tl-cart-drawer/tl-cart-drawer.d.ts +28 -5
  117. package/dist/types/components/tl-checkout-wrapper/tl-checkout-wrapper.d.ts +18 -1
  118. package/dist/types/components/tl-event-card/event-card-adapter.d.ts +9 -20
  119. package/dist/types/components/tl-event-card/tl-event-card.d.ts +25 -28
  120. package/dist/types/components/tl-event-list/tl-event-list.d.ts +46 -6
  121. package/dist/types/components/tl-login/tl-login.d.ts +68 -22
  122. package/dist/types/components/tl-my-orders/tl-my-orders.d.ts +30 -12
  123. package/dist/types/components/tl-occurrence-selector/tl-occurrence-selector.d.ts +73 -161
  124. package/dist/types/components/tl-order-confirmation/tl-order-confirmation.d.ts +48 -15
  125. package/dist/types/components/tl-order-tickets/tl-order-tickets.d.ts +29 -31
  126. package/dist/types/components/tl-promo-code/tl-promo-code.d.ts +28 -10
  127. package/dist/types/components/tl-ticket/tl-ticket.d.ts +2 -11
  128. package/dist/types/components/tl-ticket-selector/tl-ticket-selector.d.ts +22 -4
  129. package/dist/types/components.d.ts +270 -62
  130. package/dist/types/utils/order-summary.d.ts +14 -97
  131. package/dist/types/utils/testing/deep-text.d.ts +13 -0
  132. package/dist/types/utils/testing/fixtures.d.ts +225 -0
  133. package/dist/types/utils/testing/mock-sdk.d.ts +14 -1
  134. package/dist/types/utils/web-query.d.ts +18 -0
  135. package/dist/types/utils/web-storage.d.ts +16 -0
  136. package/elements.catalogue.json +602 -50
  137. package/package.json +8 -6
  138. package/dist/cjs/money-BtmM2gt-.js +0 -118
  139. package/dist/cjs/order-summary-X3TlZxc2.js +0 -150
  140. package/dist/components/money.js +0 -1
  141. package/dist/components/order-summary.js +0 -1
  142. package/dist/esm/money-4ig0-WB6.js +0 -112
  143. package/dist/esm/order-summary-DiDtvfZM.js +0 -136
  144. package/dist/ticketlayer-elements/p-0814420f.entry.js +0 -1
  145. package/dist/ticketlayer-elements/p-0acabc26.entry.js +0 -1
  146. package/dist/ticketlayer-elements/p-109a3feb.entry.js +0 -1
  147. package/dist/ticketlayer-elements/p-1a4ba71c.entry.js +0 -1
  148. package/dist/ticketlayer-elements/p-318965c1.entry.js +0 -1
  149. package/dist/ticketlayer-elements/p-347c7fd1.entry.js +0 -1
  150. package/dist/ticketlayer-elements/p-3649c26d.entry.js +0 -1
  151. package/dist/ticketlayer-elements/p-40260cc9.entry.js +0 -1
  152. package/dist/ticketlayer-elements/p-4ig0-WB6.js +0 -1
  153. package/dist/ticketlayer-elements/p-55fd2f9f.entry.js +0 -1
  154. package/dist/ticketlayer-elements/p-62ee659b.entry.js +0 -1
  155. package/dist/ticketlayer-elements/p-7d4ecc2b.entry.js +0 -1
  156. package/dist/ticketlayer-elements/p-7f0abf95.entry.js +0 -1
  157. package/dist/ticketlayer-elements/p-BXpVGW51.js +0 -1
  158. package/dist/ticketlayer-elements/p-OoYV1faY.js +0 -3
  159. package/dist/ticketlayer-elements/p-a3c1b26c.entry.js +0 -1
  160. package/dist/ticketlayer-elements/p-aeb4c6fb.entry.js +0 -1
  161. package/dist/ticketlayer-elements/p-ba62541f.entry.js +0 -1
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-I9CoYv3k.js');
3
+ var index = require('./index-DanPUX0s.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
+ var ticketSelector = require('./ticket-selector-BYVL13k_.js');
5
6
 
6
7
  const tlCartDrawerCss = () => `:host{--_bg:var(--tl-background);--_fg:var(--tl-foreground);--_muted-fg:var(--tl-muted-foreground);--_muted:var(--tl-muted);--_border:var(--tl-border);--_font:var(--tl-font-family);font-family:var(--_font)}.overlay{position:fixed;inset:0;z-index:2147483640;background:rgba(8, 8, 16, 0.6);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);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}.drawer-footer{flex:none;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 20px;border-top:1px solid var(--_border);font-size:11.5px;font-weight:500;color:var(--_muted-fg)}.drawer-footer a{color:inherit;text-decoration:none;opacity:0.9;transition:opacity 0.15s ease}.drawer-footer a:hover{opacity:1}.drawer-footer .pb-links{display:flex;gap:14px}.drawer-footer .pb-brand{display:inline-flex;align-items:center;gap:5px}.drawer-footer .pb-brand svg{display:block}.drawer-footer .pb-pre{opacity:0.7}.drawer-footer .pb-word{font-weight:700}`;
7
8
 
@@ -16,47 +17,74 @@ const TlCartDrawer = class {
16
17
  this.heading = 'Your cart';
17
18
  /** Controlled open state (also driven by the `ui:cart-requested` intent). */
18
19
  this.open = false;
19
- this.visible = false;
20
+ this.element = ticketSelector.createElement(ticketSelector.cartDrawerCore, {
21
+ client: () => sdkConnector.getSDK(),
22
+ clientReady: () => sdkConnector.whenSDK(),
23
+ emit: (event, detail) => this.forward(event, detail),
24
+ });
25
+ /** The core's whole view. Assigning it is what makes Stencil re-render. */
26
+ this.view = this.element.view;
27
+ /** The one thing only a browser has. What Escape means is the core's answer. */
20
28
  this.onKey = (e) => {
21
- if (e.key === 'Escape' && this.visible)
22
- this.setOpen(false);
29
+ if (e.key === 'Escape')
30
+ this.element.actions.setOpen(false);
23
31
  };
24
- this.close = () => this.setOpen(false);
32
+ this.close = () => this.element.actions.setOpen(false);
33
+ }
34
+ syncProps() {
35
+ this.element.setProps({ side: this.side, heading: this.heading, open: this.open });
36
+ }
37
+ /**
38
+ * The host moved `open`. The core follows it without announcing it, which is
39
+ * what the component's watcher did: an event here would be the host hearing
40
+ * its own write back.
41
+ */
42
+ onOpenProp(v) {
43
+ this.element.setProps({ open: v });
44
+ this.element.actions.openChanged(v);
25
45
  }
26
46
  connectedCallback() {
27
- this.visible = this.open;
28
- // Open on the cart intent; close on the shared modal-close intent.
29
- this.offCart = sdkConnector.onSDKEvent('ui:cart-requested', () => this.setOpen(true));
30
- this.offClose = sdkConnector.onSDKEvent('ui:modal-close-requested', () => this.setOpen(false));
47
+ this.syncProps();
48
+ this.unsubscribe ?? (this.unsubscribe = this.element.subscribe((view) => {
49
+ this.view = view;
50
+ // Reflect the core's state back onto the prop a host reads. Writing it
51
+ // re-enters onOpenProp, which is a no-op once the core already agrees.
52
+ if (this.open !== view.state.visible)
53
+ this.open = view.state.visible;
54
+ }));
55
+ this.view = this.element.view;
56
+ this.teardown = this.element.mount();
31
57
  if (typeof document !== 'undefined')
32
58
  document.addEventListener('keydown', this.onKey);
33
59
  }
34
60
  disconnectedCallback() {
35
- this.offCart?.();
36
- this.offClose?.();
61
+ this.teardown?.();
62
+ this.teardown = undefined;
63
+ this.unsubscribe?.();
64
+ this.unsubscribe = undefined;
37
65
  if (typeof document !== 'undefined')
38
66
  document.removeEventListener('keydown', this.onKey);
39
67
  }
40
- onOpenProp(v) {
41
- this.visible = v;
42
- }
43
- setOpen(v) {
44
- if (this.visible === v)
45
- return;
46
- this.open = v;
47
- this.visible = v;
48
- if (v)
68
+ forward(event, _detail) {
69
+ if (event === 'tlOpen')
49
70
  this.tlOpen.emit();
50
- else
71
+ else if (event === 'tlClose')
51
72
  this.tlClose.emit();
52
73
  }
53
74
  render() {
54
- return (index.h(index.Host, { key: '022314d9fb612e930da52ece34f2ab8ae8ce44da' }, index.h("div", { key: '985b4001145d72ba91ef7d466adba8ab939e9cc4', class: { overlay: true, 'is-open': this.visible }, onClick: (e) => {
75
+ const { strings, derived } = this.view;
76
+ return (index.h(index.Host, { key: 'ab41f3557cd8dd2b182bbfc3ed631bca7839d4a9' }, index.h("div", { key: '70bbe63d1f9a2d449cb9ff970631c0c69a2eb757', class: { overlay: true, 'is-open': derived.visible }, onClick: (e) => {
55
77
  if (e.target === e.currentTarget)
56
78
  this.close();
57
- } }, index.h("aside", { key: '3ac3588ae8feacd4f8bb96bdae8ef71e80ecb4b3', class: { panel: true, [`panel--${this.side}`]: true, 'is-open': this.visible }, role: "dialog", "aria-modal": "true", "aria-label": this.heading, "aria-hidden": this.visible ? 'false' : 'true' }, index.h("header", { key: 'e0126d634e952ebf56b73e54545f6c3981210827', class: "drawer-header" }, index.h("h2", { key: 'a72b23114aa836076ec59cd4a5d1438d228179d9', class: "drawer-title" }, this.heading), index.h("button", { key: '92fb5b159490440352a6c23d65aa6e8c956ae3d8', class: "close-btn", onClick: this.close, "aria-label": "Close cart" }, index.h("svg", { key: '138f4dc7669e62fb667091da0ba26dfbe94327c6', viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, index.h("path", { key: '21fedd9dc89937a92f9c1124d4fa834b55908f1e', d: "M6 6l12 12M18 6L6 18", "stroke-linecap": "round" })))), index.h("div", { key: 'ebee87cb6a3c98dbf813d0a903a9cb4da2c696f3', class: "drawer-body" }, index.h("tl-cart", { key: '323db3a160837b68ffaa767e647ec67b06fa53b0' })), index.h("footer", { key: 'd35543373eb13ad1acc46ae50aefcb5a04f305a1', class: "drawer-footer" }, index.h("div", { key: '52229c74d39471bf186c965b6a53b38f79ce8d61', class: "pb-links" }, index.h("a", { key: 'd0430bf93d920c57fc42043faed7e8fd895855aa', href: "https://ticketlayer.com/privacy", target: "_blank", rel: "noopener noreferrer" }, "Privacy Policy"), index.h("a", { key: '2a75dc8dcdc9ec3010fe83f97d903cdc32767e49', href: "https://ticketlayer.com/report-abuse", target: "_blank", rel: "noopener noreferrer" }, "Report Abuse")), index.h("a", { key: '40642c5c4c003a454dd7ab2b66ebe5948a03df7d', class: "pb-brand", href: "https://ticketlayer.com", target: "_blank", rel: "noopener noreferrer" }, index.h("span", { key: 'a5d9b5c023381d25b6aaddf61e56dbdb21580975', class: "pb-pre" }, "Powered by"), index.h("svg", { key: '35bc23af9a35272d7ada24fd66d5f12f1d951ae8', width: "13", height: "13", viewBox: "0 0 50 50", fill: "none", "aria-hidden": "true" }, index.h("g", { key: 'fcca5f9bbc13d2781ea65bb907c9c07516972e28', transform: "matrix(0.0129 0 0 -0.0129 25.4752 25.4752)" }, index.h("path", { key: '7bf2071ba8d6d14c9ac9fc7c7a5a36a8008136e8', 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" }))), index.h("span", { key: 'c97081daa81688106395f6ef6c497b11df53a6a9', class: "pb-word" }, "ticketlayer")))))));
79
+ } }, index.h("aside", { key: 'eefe601ef6d2d8fc6bcfe62f1777d139875f875d', class: { panel: true, [derived.sideClass]: true, 'is-open': derived.visible }, role: "dialog", "aria-modal": "true", "aria-label": this.heading, "aria-hidden": derived.ariaHidden }, index.h("header", { key: '753d616182c3a903111dcaaf9b37f03186e17b48', class: "drawer-header" }, index.h("h2", { key: '3e839ddbc2a2da1f4c8eb0c1e38c421de13426cd', class: "drawer-title" }, this.heading), index.h("button", { key: '0d80fff5f425d6150fb391fd930161167b5f7d27', class: "close-btn", onClick: this.close, "aria-label": strings.close }, index.h("svg", { key: '7ffcbfb86f921d13deb5070140f21e4c7ca668f1', viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, index.h("path", { key: '53d690ef2ac8d1d73038c53fa3aa0146bde0fb51', d: "M6 6l12 12M18 6L6 18", "stroke-linecap": "round" })))), index.h("div", { key: 'a782b1527cde89656e5f776311f848c446d92d48', class: "drawer-body" }, index.h("tl-cart", { key: '3cd2c09f728cf14f0ea5b6ff4493b3e51e0dda62' })), index.h("footer", { key: '2df57237bbd548ae4af09098676d7e1315e11d71', class: "drawer-footer" }, index.h("div", { key: 'f02f5970181a2d83b70ac44188f00523a188771d', class: "pb-links" }, index.h("a", { key: 'd799da3a8c1c33b10a268500b02fda5523cd8bcf', href: strings.privacyHref, target: "_blank", rel: "noopener noreferrer" }, strings.privacy), index.h("a", { key: 'e928acb4c78cef8762d7ae8d258fa705554fd121', href: strings.reportAbuseHref, target: "_blank", rel: "noopener noreferrer" }, strings.reportAbuse)), index.h("a", { key: '39278516b8da6dd14fe8bf0d0379c32ccfeb1d29', class: "pb-brand", href: strings.brandHref, target: "_blank", rel: "noopener noreferrer" }, index.h("span", { key: '96b2cb7ac0a73cd0c60fb7977999a00b4989177e', class: "pb-pre" }, strings.poweredBy), index.h("svg", { key: 'b3950f83eab4a41e63a7919e6872a9ecdafab38b', width: "13", height: "13", viewBox: "0 0 50 50", fill: "none", "aria-hidden": "true" }, index.h("g", { key: '4c0c7ec66952f8a1956b3061f6bf2eb45c438989', transform: "matrix(0.0129 0 0 -0.0129 25.4752 25.4752)" }, index.h("path", { key: 'b1c9a143f0b2ad24da843323a4c1c550e9717d1b', 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" }))), index.h("span", { key: '053ca451a9674161799458e731862a93c954be23', class: "pb-word" }, strings.brand)))))));
58
80
  }
59
81
  static get watchers() { return {
82
+ "side": [{
83
+ "syncProps": 0
84
+ }],
85
+ "heading": [{
86
+ "syncProps": 0
87
+ }],
60
88
  "open": [{
61
89
  "onOpenProp": 0
62
90
  }]
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-I9CoYv3k.js');
3
+ var index = require('./index-DanPUX0s.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
- var money = require('./money-BtmM2gt-.js');
5
+ var ticketSelector = require('./ticket-selector-BYVL13k_.js');
6
6
 
7
7
  const tlCartCss = () => `:host{display:block;font-family:var(--tl-font-family)}.skeleton-container{padding:var(--tl-spacing-4)}.skeleton-item{height:70px;background:var(--tl-color-muted);border-radius:var(--tl-radius-md);margin-bottom:var(--tl-spacing-3);animation:pulse 1.5s ease-in-out infinite}.skeleton-totals{height:100px;background:var(--tl-color-muted);border-radius:var(--tl-radius-md);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);text-align:center}.empty-icon{width:48px;height:48px;color:var(--tl-color-muted-foreground);margin-bottom:var(--tl-spacing-4)}.empty-title{margin:0 0 var(--tl-spacing-2);font-size:16px;font-weight:600;color:var(--tl-color-foreground)}.empty-message{margin:0;font-size:14px;color:var(--tl-color-muted-foreground)}.cart{background:var(--tl-color-background)}.cart.compact .cart-items{margin-bottom:var(--tl-spacing-2)}.cart-items{margin-bottom:var(--tl-spacing-4)}.cart-item{display:flex;justify-content:space-between;align-items:flex-start;padding:var(--tl-spacing-3) 0;border-bottom:1px solid var(--tl-color-border);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)}.item-event{margin:var(--tl-spacing-1) 0 0;font-size:14px;color:var(--tl-color-muted-foreground)}.item-date{margin:var(--tl-spacing-1) 0 0;font-size:13px;color:var(--tl-color-muted-foreground)}.item-quantity{margin:var(--tl-spacing-1) 0 0;font-size:13px;color:var(--tl-color-muted-foreground)}.item-actions{display:flex;align-items:center;gap:var(--tl-spacing-3);margin-left:var(--tl-spacing-4)}.item-price{margin:0;font-weight:600;font-size:15px;color:var(--tl-color-foreground);white-space:nowrap}.remove-btn{width:28px;height:28px;padding:0;border:none;background:transparent;border-radius:var(--tl-radius-sm);color:var(--tl-color-muted-foreground);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);color:var(--tl-color-destructive)}.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);border-top-color:var(--tl-color-primary);border-radius:50%;animation:spin 0.6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.cart-totals{padding:var(--tl-spacing-3) 0;border-top:1px solid var(--tl-color-border)}.total-row{display:flex;justify-content:space-between;align-items:center;padding:var(--tl-spacing-1) 0}.total-row.subtotal,.total-row.fees,.total-row.discount{font-size:14px;color:var(--tl-color-muted-foreground)}.total-row.total{font-size:16px;font-weight:700;color:var(--tl-color-foreground);padding-top:var(--tl-spacing-2);border-top:1px solid var(--tl-color-border);margin-top:var(--tl-spacing-2)}.checkout-btn{width:100%;margin-top:var(--tl-spacing-4);padding:var(--tl-spacing-3) var(--tl-spacing-4);border-radius:var(--tl-radius-md);border:none;background-color:var(--tl-color-primary);color:var(--tl-color-primary-foreground);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);color:var(--tl-color-muted-foreground);cursor:not-allowed}.cart.compact .item-info{flex-direction:row;align-items:center}.cart.compact .cart-totals{padding:var(--tl-spacing-2) 0}.cart.compact .total-row.total{margin-top:0;border-top:none;padding-top:0}`;
8
8
 
@@ -29,125 +29,93 @@ const TlCart = class {
29
29
  * Compact mode - hides some details
30
30
  */
31
31
  this.compact = false;
32
- this.cart = null;
33
- this.loading = true;
34
- this.error = null;
35
- this.removingItemId = null;
36
- this.handleCheckout = () => {
37
- if (this.cart && this.cart.items.length > 0) {
38
- this.tlCheckout.emit({ cart: this.cart });
39
- }
40
- };
41
- }
42
- componentWillLoad() {
43
- this.loadCart();
44
- }
45
- componentDidLoad() {
46
- this.subscribeToCartUpdates();
47
- }
48
- disconnectedCallback() {
49
- if (this.unsubscribe) {
50
- this.unsubscribe();
51
- }
52
- }
53
- async loadCart() {
54
- try {
55
- console.log('[tl-cart] Loading cart...');
56
- this.loading = true;
57
- this.error = null;
58
- const sdk = await sdkConnector.whenSDK();
59
- const cartManager = sdk.getCartManager?.();
60
- if (cartManager) {
61
- const cartData = await cartManager.get();
62
- console.log('[tl-cart] Cart loaded:', cartData);
63
- this.cart = cartData;
64
- }
65
- }
66
- catch (err) {
67
- console.error('[tl-cart] Failed to load cart:', err);
68
- this.error = err instanceof Error ? err.message : 'Failed to load cart';
69
- this.tlError.emit({ message: this.error });
70
- }
71
- finally {
72
- this.loading = false;
73
- }
32
+ this.element = ticketSelector.createElement(ticketSelector.cartCore, {
33
+ client: () => sdkConnector.getSDK(),
34
+ // What "the client is up" means on the web. The core waits on it in its
35
+ // own mount, subscribes there and loads there; the harness decides none
36
+ // of it (TKT-197).
37
+ clientReady: () => sdkConnector.whenSDK(),
38
+ emit: (event, detail) => this.forward(event, detail),
39
+ });
40
+ /** The core's whole view. Assigning it is what makes Stencil re-render. */
41
+ this.view = this.element.view;
74
42
  }
75
- async subscribeToCartUpdates() {
76
- const sdk = await sdkConnector.whenSDK().catch(() => null);
77
- if (!sdk)
78
- return;
79
- const cartManager = sdk.getCartManager?.();
80
- if (!cartManager)
81
- return;
82
- this.unsubscribe = cartManager.on?.('cart:updated', (cartData) => {
83
- console.log('[tl-cart] Cart updated:', cartData);
84
- this.cart = cartData;
85
- this.tlCartUpdated.emit({ cart: cartData });
43
+ syncProps() {
44
+ this.element.setProps({
45
+ showCheckoutButton: this.showCheckoutButton,
46
+ checkoutLabel: this.checkoutLabel,
47
+ showRemoveButtons: this.showRemoveButtons,
48
+ compact: this.compact,
86
49
  });
87
50
  }
88
- async handleRemoveItem(itemId) {
89
- if (!sdkConnector.hasSDK())
90
- return;
91
- this.removingItemId = itemId;
92
- try {
93
- const sdk = sdkConnector.getSDK();
94
- const cartManager = sdk.getCartManager?.();
95
- if (cartManager) {
96
- await cartManager.removeItem(itemId);
97
- console.log('[tl-cart] Item removed:', itemId);
98
- this.tlItemRemoved.emit({ itemId });
99
- }
100
- }
101
- catch (err) {
102
- console.error('[tl-cart] Failed to remove item:', err);
103
- this.error = err instanceof Error ? err.message : 'Failed to remove item';
104
- this.tlError.emit({ message: this.error });
105
- }
106
- finally {
107
- this.removingItemId = null;
108
- }
51
+ /**
52
+ * On screen: render what the core says and put the core to work. For this
53
+ * element that means waiting for the client, subscribing to `cart:updated`
54
+ * and reading the cart - all of it the core's business.
55
+ */
56
+ connectedCallback() {
57
+ this.syncProps();
58
+ this.unsubscribe ?? (this.unsubscribe = this.element.subscribe((view) => {
59
+ this.view = view;
60
+ }));
61
+ this.view = this.element.view;
62
+ this.teardown = this.element.mount();
109
63
  }
110
- formatPrice(priceInPence, currency = 'GBP') {
111
- return new Intl.NumberFormat('en-GB', {
112
- style: 'currency',
113
- currency,
114
- }).format(priceInPence / 100);
64
+ /**
65
+ * Off screen: run the mount's teardown, which is what drops the cart
66
+ * subscription. Not `destroy()`: Stencil calls this for a DOM move as well
67
+ * as a removal, and a destroyed core never mounts again.
68
+ */
69
+ disconnectedCallback() {
70
+ this.teardown?.();
71
+ this.teardown = undefined;
72
+ this.unsubscribe?.();
73
+ this.unsubscribe = undefined;
115
74
  }
116
- formatDate(dateString) {
117
- const date = new Date(dateString);
118
- return date.toLocaleDateString('en-GB', {
119
- weekday: 'short',
120
- day: 'numeric',
121
- month: 'short',
122
- hour: '2-digit',
123
- minute: '2-digit',
124
- });
75
+ forward(event, detail) {
76
+ if (event === 'tlCheckout')
77
+ this.tlCheckout.emit(detail);
78
+ else if (event === 'tlItemRemoved')
79
+ this.tlItemRemoved.emit(detail);
80
+ else if (event === 'tlCartUpdated')
81
+ this.tlCartUpdated.emit(detail);
82
+ else if (event === 'tlError')
83
+ this.tlError.emit(detail);
125
84
  }
126
85
  renderSkeleton() {
127
86
  return (index.h("div", { class: "skeleton-container" }, index.h("div", { class: "skeleton-item" }), index.h("div", { class: "skeleton-item" }), index.h("div", { class: "skeleton-totals" })));
128
87
  }
129
88
  renderEmptyCart() {
130
- return (index.h("div", { class: "empty-cart" }, index.h("svg", { class: "empty-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, index.h("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" })), index.h("p", { class: "empty-title" }, "Your cart is empty"), index.h("p", { class: "empty-message" }, "Add tickets to get started")));
89
+ const strings = this.view.strings;
90
+ return (index.h("div", { class: "empty-cart" }, index.h("svg", { class: "empty-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, index.h("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" })), index.h("p", { class: "empty-title" }, strings.emptyTitle), index.h("p", { class: "empty-message" }, strings.emptyMessage)));
131
91
  }
132
- renderCartItem(item) {
133
- const isRemoving = this.removingItemId === item.id;
134
- return (index.h("div", { class: `cart-item ${isRemoving ? 'removing' : ''}`, key: item.id }, index.h("div", { class: "item-info" }, index.h("p", { class: "item-name" }, item.ticketTypeName), !this.compact && (index.h("p", { class: "item-event" }, item.eventName)), !this.compact && item.occurrenceDate && (index.h("p", { class: "item-date" }, this.formatDate(item.occurrenceDate))), index.h("p", { class: "item-quantity" }, "Qty: ", item.quantity)), index.h("div", { class: "item-actions" }, index.h("p", { class: "item-price" }, this.formatPrice(item.totalPrice, item.currency)), this.showRemoveButtons && (index.h("button", { class: "remove-btn", onClick: () => this.handleRemoveItem(item.id), disabled: isRemoving, "aria-label": "Remove item" }, isRemoving ? (index.h("span", { class: "spinner" })) : (index.h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, index.h("path", { "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", d: "M6 18L18 6M6 6l12 12" }))))))));
92
+ renderCartItem(row) {
93
+ return (index.h("div", { class: `cart-item ${row.removing ? 'removing' : ''}`, key: row.id }, index.h("div", { class: "item-info" }, index.h("p", { class: "item-name" }, row.name), row.showEvent && index.h("p", { class: "item-event" }, row.eventName), row.showDate && index.h("p", { class: "item-date" }, row.dateLabel), index.h("p", { class: "item-quantity" }, row.quantityLabel)), index.h("div", { class: "item-actions" }, index.h("p", { class: "item-price" }, row.priceLabel), this.showRemoveButtons && (index.h("button", { class: "remove-btn", onClick: () => this.element.actions.removeItem(row.id), disabled: row.removing, "aria-label": this.view.strings.removeItem }, row.removing ? (index.h("span", { class: "spinner" })) : (index.h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor" }, index.h("path", { "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", d: "M6 18L18 6M6 6l12 12" }))))))));
135
94
  }
136
95
  render() {
137
- if (this.loading) {
96
+ const { status, strings, derived } = this.view;
97
+ if (status === 'loading') {
138
98
  return this.renderSkeleton();
139
99
  }
140
- if (!this.cart || this.cart.items.length === 0) {
100
+ if (status === 'empty') {
141
101
  return this.renderEmptyCart();
142
102
  }
143
- const { items } = this.cart;
144
- // Money comes from the response through cartTotals: the fee row is shown
145
- // when the surface expressed a fee, and the total is the server's figure,
146
- // never a sum taken here.
147
- const totals = money.cartTotals(this.cart);
148
- const currency = totals.currency;
149
- return (index.h("div", { class: `cart ${this.compact ? 'compact' : ''}` }, index.h("div", { class: "cart-items" }, items.map(item => this.renderCartItem(item))), index.h("div", { class: "cart-totals" }, !this.compact && (index.h("div", { class: "total-row subtotal" }, index.h("span", null, "Subtotal"), index.h("span", null, this.formatPrice(totals.subtotal, currency)))), totals.showFee && !this.compact && (index.h("div", { class: "total-row fees" }, index.h("span", null, totals.feeLabel), index.h("span", null, this.formatPrice(totals.fees, currency)))), totals.discount > 0 && !this.compact && (index.h("div", { class: "total-row discount" }, index.h("span", null, "Discount"), index.h("span", null, "-", this.formatPrice(totals.discount, currency)))), index.h("div", { class: "total-row total" }, index.h("span", null, "Total"), index.h("span", null, this.formatPrice(totals.total, currency)))), this.showCheckoutButton && (index.h("button", { class: "checkout-btn", onClick: this.handleCheckout, disabled: items.length === 0 }, this.checkoutLabel))));
103
+ return (index.h("div", { class: `cart ${this.compact ? 'compact' : ''}` }, index.h("div", { class: "cart-items" }, derived.rows.map((row) => this.renderCartItem(row))), index.h("div", { class: "cart-totals" }, derived.showSubtotalRow && (index.h("div", { class: "total-row subtotal" }, index.h("span", null, strings.subtotalRow), index.h("span", null, derived.subtotalLabel))), derived.showFeeRow && (index.h("div", { class: "total-row fees" }, index.h("span", null, derived.totals.feeLabel), index.h("span", null, derived.feeAmountLabel))), derived.showDiscountRow && (index.h("div", { class: "total-row discount" }, index.h("span", null, strings.discountRow), index.h("span", null, "-", derived.discountLabel))), index.h("div", { class: "total-row total" }, index.h("span", null, strings.totalRow), index.h("span", null, derived.totalLabel))), this.showCheckoutButton && (index.h("button", { class: "checkout-btn", onClick: () => this.element.actions.checkout(), disabled: derived.checkoutDisabled }, this.checkoutLabel))));
150
104
  }
105
+ static get watchers() { return {
106
+ "showCheckoutButton": [{
107
+ "syncProps": 0
108
+ }],
109
+ "checkoutLabel": [{
110
+ "syncProps": 0
111
+ }],
112
+ "showRemoveButtons": [{
113
+ "syncProps": 0
114
+ }],
115
+ "compact": [{
116
+ "syncProps": 0
117
+ }]
118
+ }; }
151
119
  };
152
120
  TlCart.style = tlCartCss();
153
121
 
@@ -1,56 +1,78 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-I9CoYv3k.js');
3
+ var index = require('./index-DanPUX0s.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
+ var ticketSelector = require('./ticket-selector-BYVL13k_.js');
5
6
 
6
7
  const tlCheckoutWrapperCss = () => `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);outline-offset:2px;border-radius:var(--tl-radius-sm)}tl-checkout-wrapper[disabled],tl-checkout-wrapper.tl-checkout-wrapper--disabled,.tl-checkout-wrapper--disabled{cursor:not-allowed;opacity:0.5}`;
7
8
 
8
9
  const TlCheckoutWrapper = class {
9
10
  constructor(hostRef) {
10
11
  index.registerInstance(this, hostRef);
11
- this.tlComplete = index.createEvent(this, "tl-complete");
12
- this.tlError = index.createEvent(this, "tl-error");
13
- this.tlClose = index.createEvent(this, "tl-close");
12
+ this.tlComplete = index.createEvent(this, "tlComplete");
13
+ this.tlError = index.createEvent(this, "tlError");
14
+ this.tlClose = index.createEvent(this, "tlClose");
14
15
  /**
15
16
  * Whether the wrapper is disabled
16
17
  */
17
18
  this.disabled = false;
19
+ this.element = ticketSelector.createElement(ticketSelector.checkoutWrapperCore, {
20
+ client: () => sdkConnector.getSDK(),
21
+ clientReady: () => sdkConnector.whenSDK(),
22
+ emit: (event, detail) => this.forward(event, detail),
23
+ });
24
+ /** The core's whole view. Assigning it is what makes Stencil re-render. */
25
+ this.view = this.element.view;
18
26
  this.handleClick = () => {
19
- if (this.disabled)
20
- return;
21
- if (!sdkConnector.hasSDK()) {
22
- console.error('[tl-checkout-wrapper] SDK not initialized. Call setSDK(ticketlayer) first.');
23
- this.tlError.emit({ message: 'SDK not initialized' });
24
- return;
25
- }
26
- const sdk = sdkConnector.getSDK();
27
- // Open the checkout modal via SDK
28
- sdk.checkout.openModal({
29
- onComplete: (order) => {
30
- this.tlComplete.emit(order);
31
- },
32
- onError: (err) => {
33
- this.tlError.emit({ message: err.message });
34
- },
35
- onClose: () => {
36
- this.tlClose.emit();
37
- },
38
- });
27
+ this.element.actions.activate();
39
28
  };
29
+ /** Enter and Space are a press on the web. The core knows nothing of keys. */
40
30
  this.handleKeyDown = (e) => {
41
31
  if (e.key === 'Enter' || e.key === ' ') {
42
32
  e.preventDefault();
43
- this.handleClick();
33
+ this.element.actions.activate();
44
34
  }
45
35
  };
46
36
  }
37
+ syncProps() {
38
+ this.element.setProps({ disabled: this.disabled });
39
+ }
40
+ connectedCallback() {
41
+ this.syncProps();
42
+ this.unsubscribe ?? (this.unsubscribe = this.element.subscribe((view) => {
43
+ this.view = view;
44
+ }));
45
+ this.view = this.element.view;
46
+ // Nothing to do on mount, and mounted anyway: a harness calls mount()
47
+ // unconditionally and pairs it with its teardown (TKT-197).
48
+ this.teardown = this.element.mount();
49
+ }
50
+ disconnectedCallback() {
51
+ this.teardown?.();
52
+ this.teardown = undefined;
53
+ this.unsubscribe?.();
54
+ this.unsubscribe = undefined;
55
+ }
56
+ forward(event, detail) {
57
+ if (event === 'tlComplete')
58
+ this.tlComplete.emit(detail);
59
+ else if (event === 'tlError')
60
+ this.tlError.emit(detail);
61
+ else if (event === 'tlClose')
62
+ this.tlClose.emit();
63
+ }
47
64
  render() {
48
- return (index.h(index.Host, { key: 'ebaae5dd6710ffc5353ece4327012df0332fdbb7', class: {
65
+ const { interactive } = this.view.derived;
66
+ return (index.h(index.Host, { key: 'b261046c2627825258a5905662a79f436d713683', class: {
49
67
  'tl-checkout-wrapper': true,
50
- 'tl-checkout-wrapper--disabled': this.disabled,
51
- }, onClick: this.handleClick, onKeyDown: this.handleKeyDown, role: "button", tabindex: this.disabled ? -1 : 0, "aria-disabled": this.disabled ? 'true' : null }, index.h("slot", { key: '0118d9921df5af1ae2376fd4135bac487aac7ebd' })));
68
+ 'tl-checkout-wrapper--disabled': !interactive,
69
+ }, onClick: this.handleClick, onKeyDown: this.handleKeyDown, role: "button", tabindex: interactive ? 0 : -1, "aria-disabled": interactive ? null : 'true' }, index.h("slot", { key: '5be08d5007a755e3d88a06ae89c08e082e4ba052' })));
52
70
  }
53
- get el() { return index.getElement(this); }
71
+ static get watchers() { return {
72
+ "disabled": [{
73
+ "syncProps": 0
74
+ }]
75
+ }; }
54
76
  };
55
77
  TlCheckoutWrapper.style = tlCheckoutWrapperCss();
56
78