@ticketlayer/elements 0.3.2 → 0.4.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 (142) hide show
  1. package/README.md +16 -15
  2. package/dist/cjs/{index-DfzcrE9-.js → index-I9CoYv3k.js} +277 -1798
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/money-BtmM2gt-.js +118 -0
  6. package/dist/cjs/{order-summary-ZMkJ5bez.js → order-summary-X3TlZxc2.js} +34 -0
  7. package/dist/cjs/ticketlayer-elements.cjs.js +3 -3
  8. package/dist/cjs/tl-buy-modal.cjs.entry.js +3 -3
  9. package/dist/cjs/tl-buy-tickets-button.cjs.entry.js +10 -7
  10. package/dist/cjs/tl-buy-tickets-wrapper.cjs.entry.js +2 -2
  11. package/dist/cjs/tl-cart-badge.cjs.entry.js +2 -2
  12. package/dist/cjs/tl-cart-drawer.cjs.entry.js +2 -2
  13. package/dist/cjs/tl-cart.cjs.entry.js +10 -4
  14. package/dist/cjs/tl-checkout-wrapper.cjs.entry.js +2 -2
  15. package/dist/cjs/tl-event-card.cjs.entry.js +4 -3
  16. package/dist/cjs/tl-event-list.cjs.entry.js +2 -2
  17. package/dist/cjs/tl-login.cjs.entry.js +4 -3
  18. package/dist/cjs/tl-my-orders.cjs.entry.js +4 -3
  19. package/dist/cjs/tl-occurrence-selector_2.cjs.entry.js +454 -122
  20. package/dist/cjs/tl-order-confirmation.cjs.entry.js +11 -8
  21. package/dist/cjs/tl-order-tickets_2.cjs.entry.js +3 -3
  22. package/dist/cjs/tl-promo-code.cjs.entry.js +4 -3
  23. package/dist/cjs/tl-seat-map.cjs.entry.js +2 -2
  24. package/dist/collection/collection-manifest.json +2 -1
  25. package/dist/collection/components/tl-buy-modal/tl-buy-modal.css +12 -13
  26. package/dist/collection/components/tl-buy-modal/tl-buy-modal.js +1 -1
  27. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.css +4 -4
  28. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.js +11 -8
  29. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.css +2 -2
  30. package/dist/collection/components/tl-cart/tl-cart.css +52 -51
  31. package/dist/collection/components/tl-cart/tl-cart.js +10 -4
  32. package/dist/collection/components/tl-cart-badge/tl-cart-badge.css +11 -11
  33. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.css +6 -6
  34. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.css +2 -2
  35. package/dist/collection/components/tl-event-card/tl-event-card.css +22 -22
  36. package/dist/collection/components/tl-event-card/tl-event-card.js +1 -1
  37. package/dist/collection/components/tl-event-list/tl-event-list.css +17 -17
  38. package/dist/collection/components/tl-login/tl-login.css +26 -26
  39. package/dist/collection/components/tl-login/tl-login.js +1 -1
  40. package/dist/collection/components/tl-my-orders/tl-my-orders.css +40 -40
  41. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.css +54 -65
  42. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.js +2 -2
  43. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.css +38 -38
  44. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.js +8 -6
  45. package/dist/collection/components/tl-order-tickets/tl-order-tickets.css +9 -9
  46. package/dist/collection/components/tl-promo-code/tl-promo-code.css +25 -25
  47. package/dist/collection/components/tl-promo-code/tl-promo-code.js +1 -1
  48. package/dist/collection/components/tl-seat-map/tl-seat-map.css +10 -10
  49. package/dist/collection/components/tl-ticket/tl-ticket.css +13 -13
  50. package/dist/collection/components/tl-ticket/tl-ticket.js +1 -1
  51. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.css +74 -49
  52. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.js +73 -127
  53. package/dist/collection/utils/cart-totals.js +9 -0
  54. package/dist/collection/utils/order-summary.js +36 -0
  55. package/dist/components/money.js +1 -0
  56. package/dist/components/order-summary.js +1 -1
  57. package/dist/components/tl-buy-modal.js +1 -1
  58. package/dist/components/tl-buy-tickets-button.js +1 -1
  59. package/dist/components/tl-buy-tickets-wrapper2.js +1 -1
  60. package/dist/components/tl-cart-badge.js +1 -1
  61. package/dist/components/tl-cart-drawer.js +1 -1
  62. package/dist/components/tl-cart2.js +1 -1
  63. package/dist/components/tl-checkout-wrapper2.js +1 -1
  64. package/dist/components/tl-event-card2.js +1 -1
  65. package/dist/components/tl-event-list.js +1 -1
  66. package/dist/components/tl-login2.js +1 -1
  67. package/dist/components/tl-my-orders.js +1 -1
  68. package/dist/components/tl-occurrence-selector2.js +1 -1
  69. package/dist/components/tl-order-confirmation.js +1 -1
  70. package/dist/components/tl-order-tickets2.js +1 -1
  71. package/dist/components/tl-promo-code.js +1 -1
  72. package/dist/components/tl-seat-map.js +1 -1
  73. package/dist/components/tl-ticket-selector2.js +1 -1
  74. package/dist/components/tl-ticket2.js +1 -1
  75. package/dist/elements.docs.d.ts +26 -0
  76. package/dist/elements.docs.json +35 -17
  77. package/dist/esm/{index-Ba-RZTFI.js → index-OoYV1faY.js} +277 -1798
  78. package/dist/esm/index.js +1 -1
  79. package/dist/esm/loader.js +3 -3
  80. package/dist/esm/money-4ig0-WB6.js +112 -0
  81. package/dist/esm/{order-summary-BGekdjN9.js → order-summary-DiDtvfZM.js} +34 -1
  82. package/dist/esm/ticketlayer-elements.js +4 -4
  83. package/dist/esm/tl-buy-modal.entry.js +3 -3
  84. package/dist/esm/tl-buy-tickets-button.entry.js +10 -7
  85. package/dist/esm/tl-buy-tickets-wrapper.entry.js +2 -2
  86. package/dist/esm/tl-cart-badge.entry.js +2 -2
  87. package/dist/esm/tl-cart-drawer.entry.js +2 -2
  88. package/dist/esm/tl-cart.entry.js +10 -4
  89. package/dist/esm/tl-checkout-wrapper.entry.js +2 -2
  90. package/dist/esm/tl-event-card.entry.js +4 -3
  91. package/dist/esm/tl-event-list.entry.js +2 -2
  92. package/dist/esm/tl-login.entry.js +4 -3
  93. package/dist/esm/tl-my-orders.entry.js +4 -3
  94. package/dist/esm/tl-occurrence-selector_2.entry.js +455 -123
  95. package/dist/esm/tl-order-confirmation.entry.js +11 -8
  96. package/dist/esm/tl-order-tickets_2.entry.js +3 -3
  97. package/dist/esm/tl-promo-code.entry.js +4 -3
  98. package/dist/esm/tl-seat-map.entry.js +2 -2
  99. package/dist/ticketlayer-elements/index.esm.js +1 -1
  100. package/dist/ticketlayer-elements/p-0814420f.entry.js +1 -0
  101. package/dist/ticketlayer-elements/p-0acabc26.entry.js +1 -0
  102. package/dist/ticketlayer-elements/{p-9372ff1f.entry.js → p-109a3feb.entry.js} +1 -1
  103. package/dist/ticketlayer-elements/{p-41d22d7c.entry.js → p-1a4ba71c.entry.js} +1 -1
  104. package/dist/ticketlayer-elements/p-318965c1.entry.js +1 -0
  105. package/dist/ticketlayer-elements/p-347c7fd1.entry.js +1 -0
  106. package/dist/ticketlayer-elements/p-3649c26d.entry.js +1 -0
  107. package/dist/ticketlayer-elements/p-40260cc9.entry.js +1 -0
  108. package/dist/ticketlayer-elements/p-4ig0-WB6.js +1 -0
  109. package/dist/ticketlayer-elements/p-55fd2f9f.entry.js +1 -0
  110. package/dist/ticketlayer-elements/p-62ee659b.entry.js +1 -0
  111. package/dist/ticketlayer-elements/{p-f446310d.entry.js → p-7d4ecc2b.entry.js} +1 -1
  112. package/dist/ticketlayer-elements/p-7f0abf95.entry.js +1 -0
  113. package/dist/ticketlayer-elements/p-BXpVGW51.js +1 -0
  114. package/dist/ticketlayer-elements/p-OoYV1faY.js +3 -0
  115. package/dist/ticketlayer-elements/p-a3c1b26c.entry.js +1 -0
  116. package/dist/ticketlayer-elements/p-ac264adc.entry.js +1 -0
  117. package/dist/ticketlayer-elements/{p-82752e3b.entry.js → p-aeb4c6fb.entry.js} +1 -1
  118. package/dist/ticketlayer-elements/{p-9c9072c8.entry.js → p-ba62541f.entry.js} +1 -1
  119. package/dist/ticketlayer-elements/ticketlayer-elements.css +1 -1
  120. package/dist/ticketlayer-elements/ticketlayer-elements.esm.js +1 -1
  121. package/dist/types/components/tl-cart/tl-cart.d.ts +10 -0
  122. package/dist/types/components/tl-ticket-selector/tl-ticket-selector.d.ts +40 -29
  123. package/dist/types/components.d.ts +165 -36
  124. package/dist/types/stencil-public-runtime.d.ts +97 -57
  125. package/dist/types/utils/cart-totals.d.ts +10 -0
  126. package/dist/types/utils/order-summary.d.ts +34 -0
  127. package/elements.catalogue.json +91 -22
  128. package/loader/index.d.ts +1 -1
  129. package/package.json +31 -32
  130. package/dist/ticketlayer-elements/p-0291df4c.entry.js +0 -1
  131. package/dist/ticketlayer-elements/p-11273f8f.entry.js +0 -1
  132. package/dist/ticketlayer-elements/p-340ab4f5.entry.js +0 -1
  133. package/dist/ticketlayer-elements/p-7ff43848.entry.js +0 -1
  134. package/dist/ticketlayer-elements/p-976770f3.entry.js +0 -1
  135. package/dist/ticketlayer-elements/p-9a903ff6.entry.js +0 -1
  136. package/dist/ticketlayer-elements/p-BGekdjN9.js +0 -1
  137. package/dist/ticketlayer-elements/p-Ba-RZTFI.js +0 -2
  138. package/dist/ticketlayer-elements/p-a5c90b68.entry.js +0 -1
  139. package/dist/ticketlayer-elements/p-b6d479ad.entry.js +0 -1
  140. package/dist/ticketlayer-elements/p-eb640760.entry.js +0 -1
  141. package/dist/ticketlayer-elements/p-f5846f61.entry.js +0 -1
  142. package/dist/ticketlayer-elements/p-fb9444c4.entry.js +0 -1
@@ -1,10 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-DfzcrE9-.js');
3
+ var index = require('./index-I9CoYv3k.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
- var orderSummary = require('./order-summary-ZMkJ5bez.js');
5
+ var orderSummary = require('./order-summary-X3TlZxc2.js');
6
+ require('./money-BtmM2gt-.js');
6
7
 
7
- const tlOrderConfirmationCss = () => `:host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif);color:var(--tl-foreground, #111827)}.confirmation{text-align:center}.check{width:4rem;height:4rem;margin:0 auto var(--tl-spacing-4, 1rem);display:flex;align-items:center;justify-content:center;border-radius:9999px;background:var(--tl-success, #10b981);color:var(--tl-success-foreground, #ffffff)}.check svg{width:2rem;height:2rem}.title{margin:0 0 var(--tl-spacing-2, 0.5rem);font-size:1.875rem;font-weight:700;line-height:1.2}.lead{margin:0 0 var(--tl-spacing-6, 1.5rem);color:var(--tl-muted-foreground, #6b7280)}.error{margin:0 0 var(--tl-spacing-6, 1.5rem);font-size:0.875rem;color:var(--tl-error, #ef4444)}.summary{text-align:left;padding:var(--tl-spacing-6, 1.5rem);margin-bottom:var(--tl-spacing-6, 1.5rem);background:var(--tl-muted, #f9fafb);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-lg, 0.75rem)}.rows{display:grid;gap:var(--tl-spacing-2, 0.5rem);margin:0 0 var(--tl-spacing-4, 1rem);padding:0 0 var(--tl-spacing-4, 1rem);border-bottom:1px solid var(--tl-border, #e5e7eb)}.row{display:flex;justify-content:space-between;gap:var(--tl-spacing-4, 1rem);font-size:0.875rem}.row dt{color:var(--tl-muted-foreground, #6b7280)}.row dd{margin:0;text-align:right;overflow-wrap:anywhere}.reference{font-family:var(--tl-font-family-mono, ui-monospace, monospace);font-weight:600}.lines{list-style:none;margin:0;padding:0;display:grid;gap:var(--tl-spacing-2, 0.5rem)}.line{display:flex;justify-content:space-between;gap:var(--tl-spacing-4, 1rem);font-size:0.875rem}.totals{margin-top:var(--tl-spacing-3, 0.75rem);padding-top:var(--tl-spacing-3, 0.75rem);border-top:1px solid var(--tl-border, #e5e7eb);display:grid;gap:var(--tl-spacing-1, 0.25rem);font-size:0.875rem}.total-row{display:flex;justify-content:space-between;color:var(--tl-muted-foreground, #6b7280)}.total-row.discount{color:var(--tl-success, #10b981)}.total-row.total{margin-top:var(--tl-spacing-1, 0.25rem);font-size:1rem;font-weight:600;color:var(--tl-foreground, #111827)}.tickets{text-align:left}.subtitle{margin:0 0 var(--tl-spacing-4, 1rem);font-size:1.125rem;font-weight:600}.hint{margin:var(--tl-spacing-3, 0.75rem) 0 0;font-size:0.75rem;color:var(--tl-muted-foreground, #6b7280)}.skeleton-line,.skeleton-block{background:var(--tl-secondary, #f3f4f6);border-radius:var(--tl-radius-md, 0.5rem);animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;margin:0 auto var(--tl-spacing-3, 0.75rem)}.skeleton-line{height:1rem}.skeleton-line.short{width:40%;height:1.75rem}.skeleton-line.long{width:70%}.skeleton-block{height:8rem}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.5}}`;
8
+ const tlOrderConfirmationCss = () => `:host{display:block;font-family:var(--tl-font-family);color:var(--tl-foreground)}.confirmation{text-align:center}.check{width:4rem;height:4rem;margin:0 auto var(--tl-spacing-4);display:flex;align-items:center;justify-content:center;border-radius:9999px;background:var(--tl-success);color:var(--tl-success-foreground)}.check svg{width:2rem;height:2rem}.title{margin:0 0 var(--tl-spacing-2);font-size:1.875rem;font-weight:700;line-height:1.2}.lead{margin:0 0 var(--tl-spacing-6);color:var(--tl-muted-foreground)}.error{margin:0 0 var(--tl-spacing-6);font-size:0.875rem;color:var(--tl-error)}.summary{text-align:left;padding:var(--tl-spacing-6);margin-bottom:var(--tl-spacing-6);background:var(--tl-muted);border:1px solid var(--tl-border);border-radius:var(--tl-radius-lg)}.rows{display:grid;gap:var(--tl-spacing-2);margin:0 0 var(--tl-spacing-4);padding:0 0 var(--tl-spacing-4);border-bottom:1px solid var(--tl-border)}.row{display:flex;justify-content:space-between;gap:var(--tl-spacing-4);font-size:0.875rem}.row dt{color:var(--tl-muted-foreground)}.row dd{margin:0;text-align:right;overflow-wrap:anywhere}.reference{font-family:var(--tl-font-family-mono);font-weight:600}.lines{list-style:none;margin:0;padding:0;display:grid;gap:var(--tl-spacing-2)}.line{display:flex;justify-content:space-between;gap:var(--tl-spacing-4);font-size:0.875rem}.totals{margin-top:var(--tl-spacing-3);padding-top:var(--tl-spacing-3);border-top:1px solid var(--tl-border);display:grid;gap:var(--tl-spacing-1);font-size:0.875rem}.total-row{display:flex;justify-content:space-between;color:var(--tl-muted-foreground)}.total-row.discount{color:var(--tl-success)}.total-row.total{margin-top:var(--tl-spacing-1);font-size:1rem;font-weight:600;color:var(--tl-foreground)}.tickets{text-align:left}.subtitle{margin:0 0 var(--tl-spacing-4);font-size:1.125rem;font-weight:600}.hint{margin:var(--tl-spacing-3) 0 0;font-size:0.75rem;color:var(--tl-muted-foreground)}.skeleton-line,.skeleton-block{background:var(--tl-secondary);border-radius:var(--tl-radius-md);animation:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;margin:0 auto var(--tl-spacing-3)}.skeleton-line{height:1rem}.skeleton-line.short{width:40%;height:1.75rem}.skeleton-line.long{width:70%}.skeleton-block{height:8rem}@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.5}}`;
8
9
 
9
10
  const TlOrderConfirmation = class {
10
11
  constructor(hostRef) {
@@ -111,12 +112,14 @@ const TlOrderConfirmation = class {
111
112
  const startsAt = this.occurrence?.startsAt;
112
113
  return (index.h("dl", { class: "rows" }, index.h("div", { class: "row" }, index.h("dt", null, "Order reference"), index.h("dd", { class: "reference" }, order.orderNumber)), email && (index.h("div", { class: "row" }, index.h("dt", null, "Email"), index.h("dd", null, email))), eventName && (index.h("div", { class: "row" }, index.h("dt", null, "Event"), index.h("dd", null, eventName))), startsAt && (index.h("div", { class: "row" }, index.h("dt", null, "Date"), index.h("dd", null, orderSummary.formatDateTime(startsAt))))));
113
114
  }
115
+ // Money comes from orderTotals: the booking fee is its own row named after
116
+ // the channel's fee profile, the subtotal is the ticket lines alone (the
117
+ // order's own `subtotal` folds the fee line into it) and the total is the
118
+ // order's figure, so what is shown is what was charged.
114
119
  renderTotals(order) {
115
- const c = order.currency || 'GBP';
116
- const fees = Number(order.totalFees) || 0;
117
- const tax = Number(order.totalTax) || 0;
118
- const discounts = Number(order.totalDiscounts) || 0;
119
- return (index.h("div", { class: "totals" }, index.h("div", { class: "total-row" }, index.h("span", null, "Subtotal"), index.h("span", null, orderSummary.formatPrice(order.subtotal, c))), fees > 0 && (index.h("div", { class: "total-row" }, index.h("span", null, "Fees"), index.h("span", null, orderSummary.formatPrice(order.totalFees, c)))), tax > 0 && (index.h("div", { class: "total-row" }, index.h("span", null, "Tax"), index.h("span", null, orderSummary.formatPrice(order.totalTax, c)))), discounts > 0 && (index.h("div", { class: "total-row discount" }, index.h("span", null, "Discount"), index.h("span", null, "-", orderSummary.formatPrice(order.totalDiscounts, c)))), index.h("div", { class: "total-row total" }, index.h("span", null, "Total"), index.h("span", null, orderSummary.formatPrice(order.total, c)))));
120
+ const totals = orderSummary.orderTotals(order);
121
+ const c = totals.currency;
122
+ return (index.h("div", { class: "totals" }, index.h("div", { class: "total-row" }, index.h("span", null, "Subtotal"), index.h("span", null, orderSummary.formatPrice(totals.subtotal, c))), totals.showFee && (index.h("div", { class: "total-row fee" }, index.h("span", null, totals.feeLabel), index.h("span", null, orderSummary.formatPrice(totals.fees, c)))), totals.tax > 0 && (index.h("div", { class: "total-row" }, index.h("span", null, "Tax"), index.h("span", null, orderSummary.formatPrice(totals.tax, c)))), totals.discount > 0 && (index.h("div", { class: "total-row discount" }, index.h("span", null, "Discount"), index.h("span", null, "-", orderSummary.formatPrice(totals.discount, c)))), index.h("div", { class: "total-row total" }, index.h("span", null, "Total"), index.h("span", null, orderSummary.formatPrice(totals.total, c)))));
120
123
  }
121
124
  render() {
122
125
  if (this.paymentFailed) {
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-DfzcrE9-.js');
3
+ var index = require('./index-I9CoYv3k.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
5
 
6
- const tlOrderTicketsCss = () => `:host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif)}.grid{display:grid;gap:var(--tl-spacing-4, 1rem);grid-template-columns:1fr}@media (min-width: 480px){.grid.cols-2{grid-template-columns:repeat(2, 1fr)}.grid.cols-3{grid-template-columns:repeat(3, 1fr)}}.state{padding:var(--tl-spacing-6, 1.5rem);text-align:center;color:var(--tl-muted-foreground, #6b7280);font-size:0.875rem}.state.error{color:var(--tl-error, #dc2626)}.state.issuing{display:flex;align-items:center;justify-content:center;gap:var(--tl-spacing-2, 0.5rem)}.spinner{width:0.875rem;height:0.875rem;border:2px solid var(--tl-border, #e5e7eb);border-top-color:var(--tl-primary, #6366f1);border-radius:50%;animation:tl-spin 0.7s linear infinite;flex:none}@keyframes tl-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.spinner{animation:none;border-top-color:var(--tl-border, #e5e7eb)}}`;
6
+ const tlOrderTicketsCss = () => `:host{display:block;font-family:var(--tl-font-family)}.grid{display:grid;gap:var(--tl-spacing-4);grid-template-columns:1fr}@media (min-width: 480px){.grid.cols-2{grid-template-columns:repeat(2, 1fr)}.grid.cols-3{grid-template-columns:repeat(3, 1fr)}}.state{padding:var(--tl-spacing-6);text-align:center;color:var(--tl-muted-foreground);font-size:0.875rem}.state.error{color:var(--tl-error)}.state.issuing{display:flex;align-items:center;justify-content:center;gap:var(--tl-spacing-2)}.spinner{width:0.875rem;height:0.875rem;border:2px solid var(--tl-border);border-top-color:var(--tl-primary);border-radius:50%;animation:tl-spin 0.7s linear infinite;flex:none}@keyframes tl-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.spinner{animation:none;border-top-color:var(--tl-border)}}`;
7
7
 
8
8
  const TlOrderTickets = class {
9
9
  constructor(hostRef) {
@@ -3178,7 +3178,7 @@ function requireBrowser () {
3178
3178
  var browserExports = requireBrowser();
3179
3179
  var QRCode = /*@__PURE__*/getDefaultExportFromCjs(browserExports);
3180
3180
 
3181
- const tlTicketCss = () => `:host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif)}.ticket{border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-lg, 0.75rem);background:var(--tl-card, #ffffff);padding:var(--tl-spacing-5, 1.25rem);text-align:center}.qr-wrap{position:relative;width:160px;height:160px;margin:0 auto}.qr{width:160px;height:160px}.qr svg{width:100%;height:100%;display:block}.qr.inactive{opacity:0.3}.stamp{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);padding:0.25rem 0.5rem;border-radius:var(--tl-radius-sm, 0.25rem);background:rgba(17, 24, 39, 0.85);color:#ffffff;font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em}.name{margin:1rem 0 0;font-weight:600;color:var(--tl-foreground, #111827)}.meta{margin:0.125rem 0 0;font-size:0.875rem;color:var(--tl-muted-foreground, #6b7280)}.barcode{margin:0.25rem 0 0;font-family:ui-monospace, monospace;font-size:0.625rem;color:var(--tl-muted-foreground, #9ca3af);word-break:break-all}.download{margin-top:0.75rem;padding:0.375rem 0.75rem;border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-md, 0.5rem);background:transparent;color:var(--tl-foreground, #111827);font-size:0.875rem;font-weight:500;cursor:pointer}.download:hover{background:var(--tl-muted, #f3f4f6)}.download:disabled{opacity:0.5;cursor:default}`;
3181
+ const tlTicketCss = () => `:host{display:block;font-family:var(--tl-font-family)}.ticket{border:1px solid var(--tl-border);border-radius:var(--tl-radius-lg);background:var(--tl-card);padding:var(--tl-spacing-5);text-align:center}.qr-wrap{position:relative;width:160px;height:160px;margin:0 auto}.qr{width:160px;height:160px}.qr svg{width:100%;height:100%;display:block}.qr.inactive{opacity:0.3}.stamp{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);padding:0.25rem 0.5rem;border-radius:var(--tl-radius-sm);background:rgba(17, 24, 39, 0.85);color:#ffffff;font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em}.name{margin:1rem 0 0;font-weight:600;color:var(--tl-foreground)}.meta{margin:0.125rem 0 0;font-size:0.875rem;color:var(--tl-muted-foreground)}.barcode{margin:0.25rem 0 0;font-family:ui-monospace, monospace;font-size:0.625rem;color:var(--tl-muted-foreground);word-break:break-all}.download{margin-top:0.75rem;padding:0.375rem 0.75rem;border:1px solid var(--tl-border);border-radius:var(--tl-radius-md);background:transparent;color:var(--tl-foreground);font-size:0.875rem;font-weight:500;cursor:pointer}.download:hover{background:var(--tl-muted)}.download:disabled{opacity:0.5;cursor:default}`;
3182
3182
 
3183
3183
  const TlTicket = class {
3184
3184
  constructor(hostRef) {
@@ -1,10 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-DfzcrE9-.js');
3
+ var index = require('./index-I9CoYv3k.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
- var orderSummary = require('./order-summary-ZMkJ5bez.js');
5
+ var orderSummary = require('./order-summary-X3TlZxc2.js');
6
+ require('./money-BtmM2gt-.js');
6
7
 
7
- const tlPromoCodeCss = () => `:host{display:block;font-family:var(--tl-font-family, system-ui, sans-serif);color:var(--tl-foreground, #111827)}.field{display:flex;gap:var(--tl-spacing-2, 0.5rem)}.input{flex:1;min-width:0;padding:var(--tl-spacing-3, 0.75rem);font:inherit;font-size:0.875rem;color:var(--tl-foreground, #111827);background:var(--tl-background, #ffffff);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-md, 0.5rem);text-transform:uppercase}.input::placeholder{text-transform:none;color:var(--tl-muted-foreground, #6b7280)}.input:focus{outline:2px solid var(--tl-primary, #6366f1);outline-offset:1px}.apply{padding:var(--tl-spacing-3, 0.75rem) var(--tl-spacing-4, 1rem);font:inherit;font-size:0.875rem;font-weight:500;color:var(--tl-primary-foreground, #ffffff);background:var(--tl-primary, #6366f1);border:none;border-radius:var(--tl-radius-md, 0.5rem);cursor:pointer;white-space:nowrap}.apply:hover:not(:disabled){opacity:0.9}.apply:disabled,.input:disabled{opacity:0.6;cursor:not-allowed}.error{margin:var(--tl-spacing-2, 0.5rem) 0 0;font-size:0.8125rem;color:var(--tl-error, #ef4444)}.applied{display:flex;align-items:center;justify-content:space-between;gap:var(--tl-spacing-3, 0.75rem);padding:var(--tl-spacing-3, 0.75rem);font-size:0.875rem;background:var(--tl-muted, #f9fafb);border:1px solid var(--tl-border, #e5e7eb);border-radius:var(--tl-radius-md, 0.5rem)}.applied-text{display:flex;align-items:center;gap:var(--tl-spacing-2, 0.5rem)}.icon{width:1rem;height:1rem;flex-shrink:0;color:var(--tl-success, #10b981)}.code{font-family:var(--tl-font-family-mono, ui-monospace, monospace)}.link{padding:0;font:inherit;font-size:0.8125rem;color:var(--tl-primary, #6366f1);background:none;border:none;cursor:pointer;white-space:nowrap}.link:hover{text-decoration:underline}`;
8
+ const tlPromoCodeCss = () => `:host{display:block;font-family:var(--tl-font-family);color:var(--tl-foreground)}.field{display:flex;gap:var(--tl-spacing-2)}.input{flex:1;min-width:0;padding:var(--tl-spacing-3);font:inherit;font-size:0.875rem;color:var(--tl-foreground);background:var(--tl-background);border:1px solid var(--tl-border);border-radius:var(--tl-radius-md);text-transform:uppercase}.input::placeholder{text-transform:none;color:var(--tl-muted-foreground)}.input:focus{outline:2px solid var(--tl-primary);outline-offset:1px}.apply{padding:var(--tl-spacing-3) var(--tl-spacing-4);font:inherit;font-size:0.875rem;font-weight:500;color:var(--tl-primary-foreground);background:var(--tl-primary);border:none;border-radius:var(--tl-radius-md);cursor:pointer;white-space:nowrap}.apply:hover:not(:disabled){opacity:0.9}.apply:disabled,.input:disabled{opacity:0.6;cursor:not-allowed}.error{margin:var(--tl-spacing-2) 0 0;font-size:0.8125rem;color:var(--tl-error)}.applied{display:flex;align-items:center;justify-content:space-between;gap:var(--tl-spacing-3);padding:var(--tl-spacing-3);font-size:0.875rem;background:var(--tl-muted);border:1px solid var(--tl-border);border-radius:var(--tl-radius-md)}.applied-text{display:flex;align-items:center;gap:var(--tl-spacing-2)}.icon{width:1rem;height:1rem;flex-shrink:0;color:var(--tl-success)}.code{font-family:var(--tl-font-family-mono)}.link{padding:0;font:inherit;font-size:0.8125rem;color:var(--tl-primary);background:none;border:none;cursor:pointer;white-space:nowrap}.link:hover{text-decoration:underline}`;
8
9
 
9
10
  const TlPromoCode = class {
10
11
  constructor(hostRef) {
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-DfzcrE9-.js');
3
+ var index = require('./index-I9CoYv3k.js');
4
4
  var sdkConnector = require('./sdk-connector-ClDF3013.js');
5
5
 
6
- const tlSeatMapCss = () => `:host{display:block;font-family:var(--tl-font-family, system-ui, -apple-system, sans-serif)}.seat-map-container{position:relative;overflow:hidden;border-radius:var(--tl-radius-md, 0.5rem);background:var(--tl-color-background, #ffffff)}.seat-map-iframe{width:100%;height:100%;border:none}.seat-map-iframe.hidden{display:none}.loading{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--tl-color-background, #ffffff);color:var(--tl-color-foreground, #0f172a);gap:1rem}.loading p{margin:0;font-size:0.875rem;color:var(--tl-color-muted-foreground, #64748b)}.spinner{width:40px;height:40px;border:3px solid var(--tl-color-border, #e2e8f0);border-top-color:var(--tl-color-primary, #e64b12);border-radius:50%;animation:tl-seat-map-spin 1s linear infinite}@keyframes tl-seat-map-spin{to{transform:rotate(360deg)}}.error{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--tl-color-background, #ffffff);color:var(--tl-color-error, #ef4444);padding:1.5rem;text-align:center}.error-title{margin:0 0 0.5rem;font-size:1.125rem;font-weight:600}.error-message{margin:0;font-size:0.875rem;opacity:0.9}`;
6
+ const tlSeatMapCss = () => `:host{display:block;font-family:var(--tl-font-family)}.seat-map-container{position:relative;overflow:hidden;border-radius:var(--tl-radius-md);background:var(--tl-color-background)}.seat-map-iframe{width:100%;height:100%;border:none}.seat-map-iframe.hidden{display:none}.loading{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--tl-color-background);color:var(--tl-color-foreground);gap:1rem}.loading p{margin:0;font-size:0.875rem;color:var(--tl-color-muted-foreground)}.spinner{width:40px;height:40px;border:3px solid var(--tl-color-border);border-top-color:var(--tl-color-primary);border-radius:50%;animation:tl-seat-map-spin 1s linear infinite}@keyframes tl-seat-map-spin{to{transform:rotate(360deg)}}.error{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--tl-color-background);color:var(--tl-color-error);padding:1.5rem;text-align:center}.error-title{margin:0 0 0.5rem;font-size:1.125rem;font-weight:600}.error-message{margin:0;font-size:0.875rem;opacity:0.9}`;
7
7
 
8
8
  const TlSeatMap = class {
9
9
  constructor(hostRef) {
@@ -19,9 +19,10 @@
19
19
  "components/tl-order-confirmation/tl-order-confirmation.js",
20
20
  "components/tl-seat-map/tl-seat-map.js"
21
21
  ],
22
+ "mixins": [],
22
23
  "compiler": {
23
24
  "name": "@stencil/core",
24
- "version": "4.41.1",
25
+ "version": "4.45.0",
25
26
  "typescriptVersion": "5.8.3"
26
27
  },
27
28
  "collections": [],
@@ -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
  }
@@ -261,7 +260,7 @@
261
260
  width: 100%;
262
261
  padding: 13px;
263
262
  border: 0;
264
- border-radius: var(--tl-radius-md, 0.5rem);
263
+ border-radius: var(--tl-radius-md);
265
264
  background: var(--_primary);
266
265
  color: var(--_primary-fg);
267
266
  font-size: 0.98rem;
@@ -279,7 +278,7 @@
279
278
  margin-top: 8px;
280
279
  padding: 12px;
281
280
  border: 1px solid var(--_border);
282
- border-radius: var(--tl-radius-md, 0.5rem);
281
+ border-radius: var(--tl-radius-md);
283
282
  background: transparent;
284
283
  color: var(--_fg);
285
284
  font-size: 0.95rem;
@@ -99,7 +99,7 @@ export class TlBuyModal {
99
99
  }
100
100
  const first = day(times[0]);
101
101
  const last = day(times[times.length - 1]);
102
- const range = first === last ? first : `${first} ${last}`;
102
+ const range = first === last ? first : `${first} - ${last}`;
103
103
  return `${range} · ${times.length} dates`;
104
104
  }
105
105
  labelFor(occ) {
@@ -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) {
@@ -51,19 +51,19 @@
51
51
  .buy-button.size-sm {
52
52
  padding: 0.5rem 1rem;
53
53
  font-size: 0.875rem;
54
- border-radius: var(--tl-radius-sm, 0.375rem);
54
+ border-radius: var(--tl-radius-sm);
55
55
  }
56
56
 
57
57
  .buy-button.size-md {
58
58
  padding: 0.75rem 1.5rem;
59
59
  font-size: 1rem;
60
- border-radius: var(--tl-radius-md, 0.5rem);
60
+ border-radius: var(--tl-radius-md);
61
61
  }
62
62
 
63
63
  .buy-button.size-lg {
64
64
  padding: 1rem 2rem;
65
65
  font-size: 1.125rem;
66
- border-radius: var(--tl-radius-lg, 0.625rem);
66
+ border-radius: var(--tl-radius-lg);
67
67
  min-height: 51px;
68
68
  }
69
69
 
@@ -22,9 +22,12 @@ import { getSDK, hasSDK } from "../../utils/sdk-connector";
22
22
  const STATE_CONFIGS = {
23
23
  available: {
24
24
  defaultLabel: 'Buy Tickets',
25
- color: 'var(--tl-primary, #e64b12)',
26
- hoverColor: 'var(--tl-primary, #d4440f)',
27
- foreground: 'var(--tl-primary-foreground, #ffffff)',
25
+ color: 'var(--tl-primary)',
26
+ // The hover shade used to be a second colour smuggled into the token's
27
+ // fallback slot, which meant it stopped following the channel's brand the
28
+ // moment a theme was applied. Derive it instead.
29
+ hoverColor: 'color-mix(in srgb, var(--tl-primary) 90%, black)',
30
+ foreground: 'var(--tl-primary-foreground)',
28
31
  },
29
32
  soldOut: {
30
33
  defaultLabel: 'Sold Out',
@@ -112,7 +115,7 @@ export class TlBuyTicketsButton {
112
115
  const config = this.getStateConfig();
113
116
  const buttonLabel = this.label || config.defaultLabel;
114
117
  const isInteractive = this.isInteractive();
115
- return (h(Host, { key: '10c8c36d12223afcfd13c9807c2ef6b0f4c34266', class: { 'full-width': this.fullWidth } }, h("button", { key: 'c7f6a39a837c90ced0176b5d017687afabf99a5a', type: "button", class: {
118
+ return (h(Host, { key: '86ee9a81d82c10398dab4e22b3bbae15abb8f449', class: { 'full-width': this.fullWidth } }, h("button", { key: 'b581e199ced7ffd14669ebe0cc727edc2f8c8914', type: "button", class: {
116
119
  'buy-button': true,
117
120
  [`variant-${this.variant}`]: true,
118
121
  [`size-${this.size}`]: true,
@@ -122,7 +125,7 @@ export class TlBuyTicketsButton {
122
125
  '--button-color': config.color,
123
126
  '--button-hover-color': config.hoverColor,
124
127
  '--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)))))));
128
+ }, disabled: !isInteractive, onClick: this.handleClick, onMouseEnter: () => (this.isHovered = true), onMouseLeave: () => (this.isHovered = false) }, h("span", { key: 'f776bab4a999ed36b25400424d639b4c9261c02a', 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: 'e98ecbe6debc5c2c18ce1d304b60bf1074b003b3', class: "label" }, buttonLabel), this.price !== undefined && (h("span", { key: 'e7e261d09a541b126b02b88d00992f3a6483a9b8', class: "price" }, h("span", { key: '5eab43a47c2dd4c1339fe84b583902b1e38a0b2a', class: "price-prefix" }, this.pricePrefix), h("span", { key: 'f03b514ff2bc3c9a1b2e922d93a92accdedd0fad', class: "price-value" }, this.formatPrice(this.price)))))));
126
129
  }
127
130
  renderTicketIcon() {
128
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("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" })));
@@ -197,7 +200,7 @@ export class TlBuyTicketsButton {
197
200
  "references": {
198
201
  "ButtonState": {
199
202
  "location": "local",
200
- "path": "/home/runner/work/live-elements/live-elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
203
+ "path": "/home/runner/work/live/live/packages/elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
201
204
  "id": "src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx::ButtonState"
202
205
  }
203
206
  }
@@ -242,7 +245,7 @@ export class TlBuyTicketsButton {
242
245
  "references": {
243
246
  "ButtonVariant": {
244
247
  "location": "local",
245
- "path": "/home/runner/work/live-elements/live-elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
248
+ "path": "/home/runner/work/live/live/packages/elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
246
249
  "id": "src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx::ButtonVariant"
247
250
  }
248
251
  }
@@ -268,7 +271,7 @@ export class TlBuyTicketsButton {
268
271
  "references": {
269
272
  "ButtonSize": {
270
273
  "location": "local",
271
- "path": "/home/runner/work/live-elements/live-elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
274
+ "path": "/home/runner/work/live/live/packages/elements/src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx",
272
275
  "id": "src/components/tl-buy-tickets-button/tl-buy-tickets-button.tsx::ButtonSize"
273
276
  }
274
277
  }
@@ -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,25 +1,25 @@
1
1
  :host {
2
2
  display: block;
3
- font-family: var(--tl-font-family, system-ui, sans-serif);
3
+ font-family: var(--tl-font-family);
4
4
  }
5
5
 
6
6
  /* Skeleton loading */
7
7
  .skeleton-container {
8
- padding: var(--tl-spacing-4, 1rem);
8
+ padding: var(--tl-spacing-4);
9
9
  }
10
10
 
11
11
  .skeleton-item {
12
12
  height: 70px;
13
- background: var(--tl-color-muted, #f3f4f6);
14
- border-radius: var(--tl-radius-md, 0.5rem);
15
- margin-bottom: var(--tl-spacing-3, 0.75rem);
13
+ background: var(--tl-color-muted);
14
+ border-radius: var(--tl-radius-md);
15
+ margin-bottom: var(--tl-spacing-3);
16
16
  animation: pulse 1.5s ease-in-out infinite;
17
17
  }
18
18
 
19
19
  .skeleton-totals {
20
20
  height: 100px;
21
- background: var(--tl-color-muted, #f3f4f6);
22
- border-radius: var(--tl-radius-md, 0.5rem);
21
+ background: var(--tl-color-muted);
22
+ border-radius: var(--tl-radius-md);
23
23
  animation: pulse 1.5s ease-in-out infinite;
24
24
  }
25
25
 
@@ -34,50 +34,50 @@
34
34
  flex-direction: column;
35
35
  align-items: center;
36
36
  justify-content: center;
37
- padding: var(--tl-spacing-8, 2rem);
37
+ padding: var(--tl-spacing-8);
38
38
  text-align: center;
39
39
  }
40
40
 
41
41
  .empty-icon {
42
42
  width: 48px;
43
43
  height: 48px;
44
- color: var(--tl-color-muted-foreground, #9ca3af);
45
- margin-bottom: var(--tl-spacing-4, 1rem);
44
+ color: var(--tl-color-muted-foreground);
45
+ margin-bottom: var(--tl-spacing-4);
46
46
  }
47
47
 
48
48
  .empty-title {
49
- margin: 0 0 var(--tl-spacing-2, 0.5rem);
49
+ margin: 0 0 var(--tl-spacing-2);
50
50
  font-size: 16px;
51
51
  font-weight: 600;
52
- color: var(--tl-color-foreground, #111827);
52
+ color: var(--tl-color-foreground);
53
53
  }
54
54
 
55
55
  .empty-message {
56
56
  margin: 0;
57
57
  font-size: 14px;
58
- color: var(--tl-color-muted-foreground, #6b7280);
58
+ color: var(--tl-color-muted-foreground);
59
59
  }
60
60
 
61
61
  /* Cart */
62
62
  .cart {
63
- background: var(--tl-color-background, #ffffff);
63
+ background: var(--tl-color-background);
64
64
  }
65
65
 
66
66
  .cart.compact .cart-items {
67
- margin-bottom: var(--tl-spacing-2, 0.5rem);
67
+ margin-bottom: var(--tl-spacing-2);
68
68
  }
69
69
 
70
70
  /* Cart items */
71
71
  .cart-items {
72
- margin-bottom: var(--tl-spacing-4, 1rem);
72
+ margin-bottom: var(--tl-spacing-4);
73
73
  }
74
74
 
75
75
  .cart-item {
76
76
  display: flex;
77
77
  justify-content: space-between;
78
78
  align-items: flex-start;
79
- padding: var(--tl-spacing-3, 0.75rem) 0;
80
- border-bottom: 1px solid var(--tl-color-border, #e5e7eb);
79
+ padding: var(--tl-spacing-3) 0;
80
+ border-bottom: 1px solid var(--tl-color-border);
81
81
  transition: opacity 0.2s;
82
82
  }
83
83
 
@@ -98,39 +98,39 @@
98
98
  margin: 0;
99
99
  font-weight: 600;
100
100
  font-size: 15px;
101
- color: var(--tl-color-foreground, #111827);
101
+ color: var(--tl-color-foreground);
102
102
  }
103
103
 
104
104
  .item-event {
105
- margin: var(--tl-spacing-1, 0.25rem) 0 0;
105
+ margin: var(--tl-spacing-1) 0 0;
106
106
  font-size: 14px;
107
- color: var(--tl-color-muted-foreground, #6b7280);
107
+ color: var(--tl-color-muted-foreground);
108
108
  }
109
109
 
110
110
  .item-date {
111
- margin: var(--tl-spacing-1, 0.25rem) 0 0;
111
+ margin: var(--tl-spacing-1) 0 0;
112
112
  font-size: 13px;
113
- color: var(--tl-color-muted-foreground, #9ca3af);
113
+ color: var(--tl-color-muted-foreground);
114
114
  }
115
115
 
116
116
  .item-quantity {
117
- margin: var(--tl-spacing-1, 0.25rem) 0 0;
117
+ margin: var(--tl-spacing-1) 0 0;
118
118
  font-size: 13px;
119
- color: var(--tl-color-muted-foreground, #6b7280);
119
+ color: var(--tl-color-muted-foreground);
120
120
  }
121
121
 
122
122
  .item-actions {
123
123
  display: flex;
124
124
  align-items: center;
125
- gap: var(--tl-spacing-3, 0.75rem);
126
- margin-left: var(--tl-spacing-4, 1rem);
125
+ gap: var(--tl-spacing-3);
126
+ margin-left: var(--tl-spacing-4);
127
127
  }
128
128
 
129
129
  .item-price {
130
130
  margin: 0;
131
131
  font-weight: 600;
132
132
  font-size: 15px;
133
- color: var(--tl-color-foreground, #111827);
133
+ color: var(--tl-color-foreground);
134
134
  white-space: nowrap;
135
135
  }
136
136
 
@@ -140,8 +140,8 @@
140
140
  padding: 0;
141
141
  border: none;
142
142
  background: transparent;
143
- border-radius: var(--tl-radius-sm, 0.25rem);
144
- color: var(--tl-color-muted-foreground, #9ca3af);
143
+ border-radius: var(--tl-radius-sm);
144
+ color: var(--tl-color-muted-foreground);
145
145
  cursor: pointer;
146
146
  display: flex;
147
147
  align-items: center;
@@ -150,8 +150,8 @@
150
150
  }
151
151
 
152
152
  .remove-btn:hover:not(:disabled) {
153
- background-color: var(--tl-color-destructive-bg, #fee2e2);
154
- color: var(--tl-color-destructive, #ef4444);
153
+ background-color: var(--tl-color-destructive-bg);
154
+ color: var(--tl-color-destructive);
155
155
  }
156
156
 
157
157
  .remove-btn:disabled {
@@ -167,8 +167,8 @@
167
167
  .spinner {
168
168
  width: 14px;
169
169
  height: 14px;
170
- border: 2px solid var(--tl-color-border, #e5e7eb);
171
- border-top-color: var(--tl-color-primary, #6366f1);
170
+ border: 2px solid var(--tl-color-border);
171
+ border-top-color: var(--tl-color-primary);
172
172
  border-radius: 50%;
173
173
  animation: spin 0.6s linear infinite;
174
174
  }
@@ -179,41 +179,42 @@
179
179
 
180
180
  /* Cart totals */
181
181
  .cart-totals {
182
- padding: var(--tl-spacing-3, 0.75rem) 0;
183
- border-top: 1px solid var(--tl-color-border, #e5e7eb);
182
+ padding: var(--tl-spacing-3) 0;
183
+ border-top: 1px solid var(--tl-color-border);
184
184
  }
185
185
 
186
186
  .total-row {
187
187
  display: flex;
188
188
  justify-content: space-between;
189
189
  align-items: center;
190
- padding: var(--tl-spacing-1, 0.25rem) 0;
190
+ padding: var(--tl-spacing-1) 0;
191
191
  }
192
192
 
193
193
  .total-row.subtotal,
194
- .total-row.fees {
194
+ .total-row.fees,
195
+ .total-row.discount {
195
196
  font-size: 14px;
196
- color: var(--tl-color-muted-foreground, #6b7280);
197
+ color: var(--tl-color-muted-foreground);
197
198
  }
198
199
 
199
200
  .total-row.total {
200
201
  font-size: 16px;
201
202
  font-weight: 700;
202
- color: var(--tl-color-foreground, #111827);
203
- padding-top: var(--tl-spacing-2, 0.5rem);
204
- border-top: 1px solid var(--tl-color-border, #e5e7eb);
205
- margin-top: var(--tl-spacing-2, 0.5rem);
203
+ color: var(--tl-color-foreground);
204
+ padding-top: var(--tl-spacing-2);
205
+ border-top: 1px solid var(--tl-color-border);
206
+ margin-top: var(--tl-spacing-2);
206
207
  }
207
208
 
208
209
  /* Checkout button */
209
210
  .checkout-btn {
210
211
  width: 100%;
211
- margin-top: var(--tl-spacing-4, 1rem);
212
- padding: var(--tl-spacing-3, 0.75rem) var(--tl-spacing-4, 1rem);
213
- border-radius: var(--tl-radius-md, 0.5rem);
212
+ margin-top: var(--tl-spacing-4);
213
+ padding: var(--tl-spacing-3) var(--tl-spacing-4);
214
+ border-radius: var(--tl-radius-md);
214
215
  border: none;
215
- background-color: var(--tl-color-primary, #6366f1);
216
- color: var(--tl-color-primary-foreground, #ffffff);
216
+ background-color: var(--tl-color-primary);
217
+ color: var(--tl-color-primary-foreground);
217
218
  font-weight: 600;
218
219
  font-size: 16px;
219
220
  cursor: pointer;
@@ -229,8 +230,8 @@
229
230
  }
230
231
 
231
232
  .checkout-btn:disabled {
232
- background-color: var(--tl-color-muted, #d1d5db);
233
- color: var(--tl-color-muted-foreground, #6b7280);
233
+ background-color: var(--tl-color-muted);
234
+ color: var(--tl-color-muted-foreground);
234
235
  cursor: not-allowed;
235
236
  }
236
237
 
@@ -241,7 +242,7 @@
241
242
  }
242
243
 
243
244
  .cart.compact .cart-totals {
244
- padding: var(--tl-spacing-2, 0.5rem) 0;
245
+ padding: var(--tl-spacing-2) 0;
245
246
  }
246
247
 
247
248
  .cart.compact .total-row.total {
@@ -1,5 +1,6 @@
1
1
  import { h } from "@stencil/core";
2
2
  import { getSDK, hasSDK, whenSDK } from "../../utils/sdk-connector";
3
+ import { cartTotals } from "../../utils/cart-totals";
3
4
  export class TlCart {
4
5
  constructor() {
5
6
  /**
@@ -129,8 +130,13 @@ export class TlCart {
129
130
  if (!this.cart || this.cart.items.length === 0) {
130
131
  return this.renderEmptyCart();
131
132
  }
132
- const { items, subtotal, fees, total, currency } = this.cart;
133
- return (h("div", { class: `cart ${this.compact ? 'compact' : ''}` }, h("div", { class: "cart-items" }, items.map(item => this.renderCartItem(item))), h("div", { class: "cart-totals" }, !this.compact && (h("div", { class: "total-row subtotal" }, h("span", null, "Subtotal"), h("span", null, this.formatPrice(subtotal, currency)))), fees > 0 && !this.compact && (h("div", { class: "total-row fees" }, h("span", null, "Fees"), h("span", null, this.formatPrice(fees, currency)))), h("div", { class: "total-row total" }, h("span", null, "Total"), h("span", null, this.formatPrice(total, currency)))), this.showCheckoutButton && (h("button", { class: "checkout-btn", onClick: this.handleCheckout, disabled: items.length === 0 }, this.checkoutLabel))));
133
+ const { items } = this.cart;
134
+ // Money comes from the response through cartTotals: the fee row is shown
135
+ // when the surface expressed a fee, and the total is the server's figure,
136
+ // never a sum taken here.
137
+ const totals = cartTotals(this.cart);
138
+ const currency = totals.currency;
139
+ return (h("div", { class: `cart ${this.compact ? 'compact' : ''}` }, h("div", { class: "cart-items" }, items.map(item => this.renderCartItem(item))), h("div", { class: "cart-totals" }, !this.compact && (h("div", { class: "total-row subtotal" }, h("span", null, "Subtotal"), h("span", null, this.formatPrice(totals.subtotal, currency)))), totals.showFee && !this.compact && (h("div", { class: "total-row fees" }, h("span", null, totals.feeLabel), h("span", null, this.formatPrice(totals.fees, currency)))), totals.discount > 0 && !this.compact && (h("div", { class: "total-row discount" }, h("span", null, "Discount"), h("span", null, "-", this.formatPrice(totals.discount, currency)))), h("div", { class: "total-row total" }, h("span", null, "Total"), h("span", null, this.formatPrice(totals.total, currency)))), this.showCheckoutButton && (h("button", { class: "checkout-btn", onClick: this.handleCheckout, disabled: items.length === 0 }, this.checkoutLabel))));
134
140
  }
135
141
  static get is() { return "tl-cart"; }
136
142
  static get encapsulation() { return "shadow"; }
@@ -253,7 +259,7 @@ export class TlCart {
253
259
  "references": {
254
260
  "TlCartData": {
255
261
  "location": "local",
256
- "path": "/home/runner/work/live-elements/live-elements/src/components/tl-cart/tl-cart.tsx",
262
+ "path": "/home/runner/work/live/live/packages/elements/src/components/tl-cart/tl-cart.tsx",
257
263
  "id": "src/components/tl-cart/tl-cart.tsx::TlCartData"
258
264
  }
259
265
  }
@@ -289,7 +295,7 @@ export class TlCart {
289
295
  "references": {
290
296
  "TlCartData": {
291
297
  "location": "local",
292
- "path": "/home/runner/work/live-elements/live-elements/src/components/tl-cart/tl-cart.tsx",
298
+ "path": "/home/runner/work/live/live/packages/elements/src/components/tl-cart/tl-cart.tsx",
293
299
  "id": "src/components/tl-cart/tl-cart.tsx::TlCartData"
294
300
  }
295
301
  }