@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,412 @@
1
+ /**
2
+ * TlBuyTicketsButton Stencil Component
3
+ *
4
+ * A pre-styled "Buy Tickets" button that opens the purchase modal.
5
+ *
6
+ * @element tl-buy-tickets-button
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
13
+ *
14
+ * @example
15
+ * <tl-buy-tickets-button event-id="evt_xxx"></tl-buy-tickets-button>
16
+ * <tl-buy-tickets-button event-id="evt_xxx" state="soldOut"></tl-buy-tickets-button>
17
+ * <tl-buy-tickets-button event-id="evt_xxx" price="2500" currency="GBP"></tl-buy-tickets-button>
18
+ */
19
+ 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
+ };
48
+ export class TlBuyTicketsButton {
49
+ constructor() {
50
+ /** Button state - determines colour, label, and icon */
51
+ this.state = 'available';
52
+ /** Button variant */
53
+ this.variant = 'primary';
54
+ /** Button size */
55
+ this.size = 'md';
56
+ /** Full width button */
57
+ this.fullWidth = false;
58
+ /** Currency code for price formatting */
59
+ this.currency = 'GBP';
60
+ /** Show price prefix text */
61
+ this.pricePrefix = 'From';
62
+ /** Disabled state */
63
+ this.disabled = false;
64
+ // -------------------------------------------------------------------------
65
+ // State
66
+ // -------------------------------------------------------------------------
67
+ this.isHovered = false;
68
+ // -------------------------------------------------------------------------
69
+ // Methods
70
+ // -------------------------------------------------------------------------
71
+ 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
+ }
90
+ };
91
+ }
92
+ formatPrice(priceInMinorUnits) {
93
+ const amount = priceInMinorUnits / 100;
94
+ const hasDecimals = amount % 1 !== 0;
95
+ return new Intl.NumberFormat('en-GB', {
96
+ style: 'currency',
97
+ currency: this.currency,
98
+ minimumFractionDigits: hasDecimals ? 2 : 0,
99
+ maximumFractionDigits: hasDecimals ? 2 : 0,
100
+ }).format(amount);
101
+ }
102
+ getStateConfig() {
103
+ return STATE_CONFIGS[this.state];
104
+ }
105
+ isInteractive() {
106
+ return !this.disabled && this.state !== 'soldOut' && this.state !== 'comingSoon';
107
+ }
108
+ // -------------------------------------------------------------------------
109
+ // Render
110
+ // -------------------------------------------------------------------------
111
+ 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: {
116
+ 'buy-button': true,
117
+ [`variant-${this.variant}`]: true,
118
+ [`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)))))));
126
+ }
127
+ renderTicketIcon() {
128
+ 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" })));
129
+ }
130
+ renderSoldOutIcon() {
131
+ 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("circle", { cx: "12", cy: "12", r: "10" }), h("path", { d: "m15 9-6 6" }), h("path", { d: "m9 9 6 6" })));
132
+ }
133
+ renderWaitlistIcon() {
134
+ 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("circle", { cx: "12", cy: "12", r: "10" }), h("polyline", { points: "12 6 12 12 16 14" })));
135
+ }
136
+ renderComingSoonIcon() {
137
+ 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: "M12 2v4" }), h("path", { d: "m16.2 7.8 2.9-2.9" }), h("path", { d: "M18 12h4" }), h("path", { d: "m16.2 16.2 2.9 2.9" }), h("path", { d: "M12 18v4" }), h("path", { d: "m4.9 19.1 2.9-2.9" }), h("path", { d: "M2 12h4" }), h("path", { d: "m4.9 4.9 2.9 2.9" })));
138
+ }
139
+ static get is() { return "tl-buy-tickets-button"; }
140
+ static get encapsulation() { return "shadow"; }
141
+ static get originalStyleUrls() {
142
+ return {
143
+ "$": ["tl-buy-tickets-button.css"]
144
+ };
145
+ }
146
+ static get styleUrls() {
147
+ return {
148
+ "$": ["tl-buy-tickets-button.css"]
149
+ };
150
+ }
151
+ static get properties() {
152
+ return {
153
+ "eventId": {
154
+ "type": "string",
155
+ "mutable": false,
156
+ "complexType": {
157
+ "original": "string",
158
+ "resolved": "string",
159
+ "references": {}
160
+ },
161
+ "required": true,
162
+ "optional": false,
163
+ "docs": {
164
+ "tags": [],
165
+ "text": "Event ID to purchase tickets for"
166
+ },
167
+ "getter": false,
168
+ "setter": false,
169
+ "reflect": false,
170
+ "attribute": "event-id"
171
+ },
172
+ "occurrenceId": {
173
+ "type": "string",
174
+ "mutable": false,
175
+ "complexType": {
176
+ "original": "string",
177
+ "resolved": "string | undefined",
178
+ "references": {}
179
+ },
180
+ "required": false,
181
+ "optional": true,
182
+ "docs": {
183
+ "tags": [],
184
+ "text": "Optional pre-selected occurrence ID"
185
+ },
186
+ "getter": false,
187
+ "setter": false,
188
+ "reflect": false,
189
+ "attribute": "occurrence-id"
190
+ },
191
+ "state": {
192
+ "type": "string",
193
+ "mutable": false,
194
+ "complexType": {
195
+ "original": "ButtonState",
196
+ "resolved": "\"available\" | \"comingSoon\" | \"soldOut\" | \"waitlist\"",
197
+ "references": {
198
+ "ButtonState": {
199
+ "location": "local",
200
+ "path": "/home/runner/work/live-elements/live-elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
201
+ "id": "src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx::ButtonState"
202
+ }
203
+ }
204
+ },
205
+ "required": false,
206
+ "optional": false,
207
+ "docs": {
208
+ "tags": [],
209
+ "text": "Button state - determines colour, label, and icon"
210
+ },
211
+ "getter": false,
212
+ "setter": false,
213
+ "reflect": false,
214
+ "attribute": "state",
215
+ "defaultValue": "'available'"
216
+ },
217
+ "label": {
218
+ "type": "string",
219
+ "mutable": false,
220
+ "complexType": {
221
+ "original": "string",
222
+ "resolved": "string | undefined",
223
+ "references": {}
224
+ },
225
+ "required": false,
226
+ "optional": true,
227
+ "docs": {
228
+ "tags": [],
229
+ "text": "Button label override (default depends on state)"
230
+ },
231
+ "getter": false,
232
+ "setter": false,
233
+ "reflect": false,
234
+ "attribute": "label"
235
+ },
236
+ "variant": {
237
+ "type": "string",
238
+ "mutable": false,
239
+ "complexType": {
240
+ "original": "ButtonVariant",
241
+ "resolved": "\"outline\" | \"primary\" | \"secondary\"",
242
+ "references": {
243
+ "ButtonVariant": {
244
+ "location": "local",
245
+ "path": "/home/runner/work/live-elements/live-elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
246
+ "id": "src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx::ButtonVariant"
247
+ }
248
+ }
249
+ },
250
+ "required": false,
251
+ "optional": false,
252
+ "docs": {
253
+ "tags": [],
254
+ "text": "Button variant"
255
+ },
256
+ "getter": false,
257
+ "setter": false,
258
+ "reflect": false,
259
+ "attribute": "variant",
260
+ "defaultValue": "'primary'"
261
+ },
262
+ "size": {
263
+ "type": "string",
264
+ "mutable": false,
265
+ "complexType": {
266
+ "original": "ButtonSize",
267
+ "resolved": "\"lg\" | \"md\" | \"sm\"",
268
+ "references": {
269
+ "ButtonSize": {
270
+ "location": "local",
271
+ "path": "/home/runner/work/live-elements/live-elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
272
+ "id": "src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx::ButtonSize"
273
+ }
274
+ }
275
+ },
276
+ "required": false,
277
+ "optional": false,
278
+ "docs": {
279
+ "tags": [],
280
+ "text": "Button size"
281
+ },
282
+ "getter": false,
283
+ "setter": false,
284
+ "reflect": false,
285
+ "attribute": "size",
286
+ "defaultValue": "'md'"
287
+ },
288
+ "fullWidth": {
289
+ "type": "boolean",
290
+ "mutable": false,
291
+ "complexType": {
292
+ "original": "boolean",
293
+ "resolved": "boolean",
294
+ "references": {}
295
+ },
296
+ "required": false,
297
+ "optional": false,
298
+ "docs": {
299
+ "tags": [],
300
+ "text": "Full width button"
301
+ },
302
+ "getter": false,
303
+ "setter": false,
304
+ "reflect": false,
305
+ "attribute": "full-width",
306
+ "defaultValue": "false"
307
+ },
308
+ "price": {
309
+ "type": "number",
310
+ "mutable": false,
311
+ "complexType": {
312
+ "original": "number",
313
+ "resolved": "number | undefined",
314
+ "references": {}
315
+ },
316
+ "required": false,
317
+ "optional": true,
318
+ "docs": {
319
+ "tags": [],
320
+ "text": "Price to display (in minor units e.g. pence)"
321
+ },
322
+ "getter": false,
323
+ "setter": false,
324
+ "reflect": false,
325
+ "attribute": "price"
326
+ },
327
+ "currency": {
328
+ "type": "string",
329
+ "mutable": false,
330
+ "complexType": {
331
+ "original": "string",
332
+ "resolved": "string",
333
+ "references": {}
334
+ },
335
+ "required": false,
336
+ "optional": false,
337
+ "docs": {
338
+ "tags": [],
339
+ "text": "Currency code for price formatting"
340
+ },
341
+ "getter": false,
342
+ "setter": false,
343
+ "reflect": false,
344
+ "attribute": "currency",
345
+ "defaultValue": "'GBP'"
346
+ },
347
+ "pricePrefix": {
348
+ "type": "string",
349
+ "mutable": false,
350
+ "complexType": {
351
+ "original": "string",
352
+ "resolved": "string",
353
+ "references": {}
354
+ },
355
+ "required": false,
356
+ "optional": false,
357
+ "docs": {
358
+ "tags": [],
359
+ "text": "Show price prefix text"
360
+ },
361
+ "getter": false,
362
+ "setter": false,
363
+ "reflect": false,
364
+ "attribute": "price-prefix",
365
+ "defaultValue": "'From'"
366
+ },
367
+ "disabled": {
368
+ "type": "boolean",
369
+ "mutable": false,
370
+ "complexType": {
371
+ "original": "boolean",
372
+ "resolved": "boolean",
373
+ "references": {}
374
+ },
375
+ "required": false,
376
+ "optional": false,
377
+ "docs": {
378
+ "tags": [],
379
+ "text": "Disabled state"
380
+ },
381
+ "getter": false,
382
+ "setter": false,
383
+ "reflect": false,
384
+ "attribute": "disabled",
385
+ "defaultValue": "false"
386
+ }
387
+ };
388
+ }
389
+ static get states() {
390
+ return {
391
+ "isHovered": {}
392
+ };
393
+ }
394
+ static get events() {
395
+ return [{
396
+ "method": "tlClick",
397
+ "name": "tlClick",
398
+ "bubbles": true,
399
+ "cancelable": true,
400
+ "composed": true,
401
+ "docs": {
402
+ "tags": [],
403
+ "text": "Emitted when button is clicked (before modal opens)"
404
+ },
405
+ "complexType": {
406
+ "original": "{ eventId: string; occurrenceId?: string }",
407
+ "resolved": "{ eventId: string; occurrenceId?: string | undefined; }",
408
+ "references": {}
409
+ }
410
+ }];
411
+ }
412
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * tl-buy-tickets-wrapper styles
3
+ */
4
+
5
+ tl-buy-tickets-wrapper,
6
+ .tl-buy-tickets-wrapper {
7
+ display: inline-block;
8
+ cursor: pointer;
9
+ }
10
+
11
+ tl-buy-tickets-wrapper:focus,
12
+ .tl-buy-tickets-wrapper:focus {
13
+ outline: 2px solid var(--tl-ring, #3b82f6);
14
+ outline-offset: 2px;
15
+ border-radius: var(--tl-radius-sm, 0.25rem);
16
+ }
17
+
18
+ tl-buy-tickets-wrapper[disabled],
19
+ tl-buy-tickets-wrapper.tl-buy-tickets-wrapper--disabled,
20
+ .tl-buy-tickets-wrapper--disabled {
21
+ cursor: not-allowed;
22
+ opacity: 0.5;
23
+ }
@@ -0,0 +1,192 @@
1
+ import { h, Host } from "@stencil/core";
2
+ import { getSDK, hasSDK } from "../../utils/sdk-connector";
3
+ /**
4
+ * @component tl-buy-tickets-wrapper
5
+ *
6
+ * Wraps any content and opens the Ticketlayer modal when clicked.
7
+ * Uses the SDK's modal manager which handles the iframe overlay.
8
+ *
9
+ * @slot - Content to display (typically a button)
10
+ *
11
+ * @example
12
+ * <tl-buy-tickets-wrapper event-id="evt_001">
13
+ * <button>Buy Tickets</button>
14
+ * </tl-buy-tickets-wrapper>
15
+ *
16
+ * @example
17
+ * <tl-buy-tickets-wrapper event-id="evt_001" occurrence-id="occ_001">
18
+ * <button>Get Tickets for Saturday</button>
19
+ * </tl-buy-tickets-wrapper>
20
+ */
21
+ export class TlBuyTicketsWrapper {
22
+ constructor() {
23
+ /**
24
+ * Whether the wrapper is disabled
25
+ */
26
+ this.disabled = false;
27
+ 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
+ });
49
+ };
50
+ this.handleKeyDown = (e) => {
51
+ if (e.key === 'Enter' || e.key === ' ') {
52
+ e.preventDefault();
53
+ this.handleClick();
54
+ }
55
+ };
56
+ }
57
+ render() {
58
+ return (h(Host, { key: 'd6ef81ac9bc1a1194eda1603cbb2a75b355a212e', class: {
59
+ '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' })));
62
+ }
63
+ static get is() { return "tl-buy-tickets-wrapper"; }
64
+ static get originalStyleUrls() {
65
+ return {
66
+ "$": ["tl-buy-tickets-wrapper.css"]
67
+ };
68
+ }
69
+ static get styleUrls() {
70
+ return {
71
+ "$": ["tl-buy-tickets-wrapper.css"]
72
+ };
73
+ }
74
+ static get properties() {
75
+ return {
76
+ "eventId": {
77
+ "type": "string",
78
+ "mutable": false,
79
+ "complexType": {
80
+ "original": "string",
81
+ "resolved": "string",
82
+ "references": {}
83
+ },
84
+ "required": true,
85
+ "optional": false,
86
+ "docs": {
87
+ "tags": [],
88
+ "text": "The event ID to purchase tickets for"
89
+ },
90
+ "getter": false,
91
+ "setter": false,
92
+ "reflect": false,
93
+ "attribute": "event-id"
94
+ },
95
+ "occurrenceId": {
96
+ "type": "string",
97
+ "mutable": false,
98
+ "complexType": {
99
+ "original": "string",
100
+ "resolved": "string | undefined",
101
+ "references": {}
102
+ },
103
+ "required": false,
104
+ "optional": true,
105
+ "docs": {
106
+ "tags": [],
107
+ "text": "Optional specific occurrence ID (skips occurrence selector)"
108
+ },
109
+ "getter": false,
110
+ "setter": false,
111
+ "reflect": false,
112
+ "attribute": "occurrence-id"
113
+ },
114
+ "disabled": {
115
+ "type": "boolean",
116
+ "mutable": false,
117
+ "complexType": {
118
+ "original": "boolean",
119
+ "resolved": "boolean",
120
+ "references": {}
121
+ },
122
+ "required": false,
123
+ "optional": false,
124
+ "docs": {
125
+ "tags": [],
126
+ "text": "Whether the wrapper is disabled"
127
+ },
128
+ "getter": false,
129
+ "setter": false,
130
+ "reflect": false,
131
+ "attribute": "disabled",
132
+ "defaultValue": "false"
133
+ }
134
+ };
135
+ }
136
+ static get events() {
137
+ return [{
138
+ "method": "tlComplete",
139
+ "name": "tl-complete",
140
+ "bubbles": true,
141
+ "cancelable": true,
142
+ "composed": true,
143
+ "docs": {
144
+ "tags": [],
145
+ "text": "Emitted when purchase completes successfully"
146
+ },
147
+ "complexType": {
148
+ "original": "OrderResult",
149
+ "resolved": "OrderResult",
150
+ "references": {
151
+ "OrderResult": {
152
+ "location": "import",
153
+ "path": "../../utils/sdk-connector",
154
+ "id": "src/utils/sdk-connector.ts::OrderResult",
155
+ "referenceLocation": "OrderResult"
156
+ }
157
+ }
158
+ }
159
+ }, {
160
+ "method": "tlError",
161
+ "name": "tl-error",
162
+ "bubbles": true,
163
+ "cancelable": true,
164
+ "composed": true,
165
+ "docs": {
166
+ "tags": [],
167
+ "text": "Emitted when an error occurs"
168
+ },
169
+ "complexType": {
170
+ "original": "{ message: string }",
171
+ "resolved": "{ message: string; }",
172
+ "references": {}
173
+ }
174
+ }, {
175
+ "method": "tlClose",
176
+ "name": "tl-close",
177
+ "bubbles": true,
178
+ "cancelable": true,
179
+ "composed": true,
180
+ "docs": {
181
+ "tags": [],
182
+ "text": "Emitted when the modal closes"
183
+ },
184
+ "complexType": {
185
+ "original": "void",
186
+ "resolved": "void",
187
+ "references": {}
188
+ }
189
+ }];
190
+ }
191
+ static get elementRef() { return "el"; }
192
+ }