@coras-io/embed 0.1.2 → 0.3.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 (236) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +8 -7
  3. package/dist/components/accordion/accordion-item/accordion-item.styles.js +1 -1
  4. package/dist/components/alert/alert.styles.js +14 -14
  5. package/dist/components/attraction-card/base/attraction-card.styles.js +7 -3
  6. package/dist/components/attraction-discovery/attraction-discovery.styles.js +1 -1
  7. package/dist/components/attraction-header/attraction-header.styles.js +1 -1
  8. package/dist/components/attraction-option/attraction-option.styles.js +4 -4
  9. package/dist/components/basket/basket.styles.js +27 -26
  10. package/dist/components/basket-empty/basket-empty.styles.js +1 -0
  11. package/dist/components/basket-item/basket-item.component.js +10 -4
  12. package/dist/components/basket-item/basket-item.styles.js +9 -3
  13. package/dist/components/basket-item-ticket/basket-item-ticket.styles.js +1 -3
  14. package/dist/components/basket-mobile/basket-mobile.styles.js +5 -5
  15. package/dist/components/better-carousel/better-carousel.styles.js +2 -0
  16. package/dist/components/bottom-drawer/bottom-drawer.styles.js +6 -4
  17. package/dist/components/button/button.component.d.ts +0 -1
  18. package/dist/components/button/button.component.js +1 -8
  19. package/dist/components/button/button.constants.d.ts +1 -1
  20. package/dist/components/button/button.constants.js +1 -1
  21. package/dist/components/button/button.styles.js +66 -39
  22. package/dist/components/calendar/base/calendar.styles.js +3 -5
  23. package/dist/components/calendar/multi/multi.styles.js +7 -0
  24. package/dist/components/category-tag/category-tag.styles.js +10 -7
  25. package/dist/components/checkbox/checkbox.styles.js +2 -2
  26. package/dist/components/chip/chip.styles.js +2 -2
  27. package/dist/components/collect-fida/collect-fida.component.js +5 -3
  28. package/dist/components/collect-fida/collect-fida.styles.js +9 -16
  29. package/dist/components/crypto-auth-modal/crypto-auth-modal.component.js +6 -4
  30. package/dist/components/crypto-auth-modal/crypto-auth-modal.styles.js +2 -2
  31. package/dist/components/dialog/dialog.styles.js +10 -17
  32. package/dist/components/drawer/drawer.component.js +6 -0
  33. package/dist/components/drawer/drawer.styles.js +17 -3
  34. package/dist/components/dropdown/dropdown.component.js +7 -0
  35. package/dist/components/dropdown/dropdown.styles.js +3 -6
  36. package/dist/components/expiration-timer/expiration-timer.styles.js +3 -3
  37. package/dist/components/explore-card/explore-card.styles.js +1 -1
  38. package/dist/components/filter-chip/filter-chip.styles.js +11 -9
  39. package/dist/components/filters-drawer/filters-drawer.component.js +1 -1
  40. package/dist/components/filters-drawer/filters-drawer.styles.js +6 -5
  41. package/dist/components/image/image.styles.js +3 -3
  42. package/dist/components/image-chip/image-chip.styles.js +1 -1
  43. package/dist/components/input-field/input-field.styles.js +22 -17
  44. package/dist/components/itinerary/itinerary-item/itinerary-item.styles.js +1 -1
  45. package/dist/components/joined-fields/joined-fields.styles.js +10 -6
  46. package/dist/components/loading-spinner/loading-spinner.styles.js +1 -1
  47. package/dist/components/location-image/location-image.component.d.ts +6 -0
  48. package/dist/components/location-image/location-image.component.js +15 -2
  49. package/dist/components/location-image/location-image.styles.js +1 -1
  50. package/dist/components/locations-results/locations-results.styles.js +4 -6
  51. package/dist/components/marketing-tag/marketing-tag.styles.js +1 -1
  52. package/dist/components/message-card/message-card.styles.js +6 -6
  53. package/dist/components/option-group/option-chip/option-chip.styles.js +4 -3
  54. package/dist/components/order-confirmation/order-confirmation-item/order-confirmation-item.styles.js +9 -0
  55. package/dist/components/order-confirmation/order-confirmation.component.js +4 -3
  56. package/dist/components/order-confirmation/order-confirmation.styles.js +1 -1
  57. package/dist/components/otp/otp.styles.js +6 -6
  58. package/dist/components/overlay/overlay.styles.js +5 -1
  59. package/dist/components/pay-in/pay-in.styles.js +2 -2
  60. package/dist/components/payment-fiat-method/payment-fiat-method.styles.js +20 -4
  61. package/dist/components/payment-option/payment-option.styles.js +10 -12
  62. package/dist/components/performance-time/performance-time.styles.js +2 -2
  63. package/dist/components/phone-country-code/phone-country-code.styles.js +1 -1
  64. package/dist/components/points/points.styles.js +1 -1
  65. package/dist/components/search-button/search-button.styles.js +15 -7
  66. package/dist/components/seated-selector/seated-selector.component.d.ts +4 -1
  67. package/dist/components/seated-selector/seated-selector.component.js +90 -36
  68. package/dist/components/seated-selector/seated-selector.styles.js +89 -14
  69. package/dist/components/seats-io/seats-io.component.d.ts +2 -0
  70. package/dist/components/seats-io/seats-io.component.js +35 -2
  71. package/dist/components/seats-io/seats-io.constants.d.ts +5 -0
  72. package/dist/components/seats-io/seats-io.constants.js +12 -0
  73. package/dist/components/seats-io/seats-io.transform.d.ts +8 -2
  74. package/dist/components/seats-io/seats-io.transform.js +12 -4
  75. package/dist/components/select-list/select-list.styles.js +1 -0
  76. package/dist/components/select-list/select-option/select-option.styles.js +3 -3
  77. package/dist/components/sort-dropdown/sort-dropdown.styles.js +1 -1
  78. package/dist/components/sort-list/sort-list.styles.js +1 -1
  79. package/dist/components/sport-options/sport-option/sport-option.styles.js +2 -2
  80. package/dist/components/star-rating/star-rating.component.d.ts +1 -0
  81. package/dist/components/star-rating/star-rating.component.js +19 -23
  82. package/dist/components/star-rating/star-rating.styles.js +32 -6
  83. package/dist/components/tab/tab.styles.js +1 -1
  84. package/dist/components/tabs/tabs.styles.js +1 -1
  85. package/dist/components/tag/tag.styles.js +7 -7
  86. package/dist/components/text-section/text-section.styles.js +2 -1
  87. package/dist/components/time-tag/time-tag.styles.js +1 -2
  88. package/dist/components/tooltip/tooltip.styles.js +3 -3
  89. package/dist/components/tour-ticket-type-selector/tour-ticket-type/tour-ticket-type.styles.js +2 -2
  90. package/dist/components/tour-ticket-type-selector/tour-ticket-type-selector.component.js +1 -1
  91. package/dist/components/tour-ticket-type-selector/tour-ticket-type-selector.styles.js +1 -9
  92. package/dist/components/transfer-modal/transfer-modal.component.js +3 -3
  93. package/dist/components/transfer-modal/transfer-modal.styles.js +6 -8
  94. package/dist/containers/basket/basket.component.d.ts +1 -1
  95. package/dist/containers/basket/basket.component.js +56 -25
  96. package/dist/containers/footer/footer.styles.js +4 -0
  97. package/dist/containers/navbar/navbar.component.d.ts +5 -1
  98. package/dist/containers/navbar/navbar.component.js +38 -9
  99. package/dist/containers/navbar/navbar.styles.js +38 -12
  100. package/dist/contexts/basket/basket.provider.d.ts +1 -0
  101. package/dist/contexts/basket/basket.provider.js +31 -4
  102. package/dist/contexts/properties.context.d.ts +4 -4
  103. package/dist/core/api/middlewares/booking-session/booking-session.constants.d.ts +1 -0
  104. package/dist/core/api/middlewares/booking-session/booking-session.constants.js +1 -0
  105. package/dist/core/api/middlewares/booking-session/booking-session.js +18 -27
  106. package/dist/core/api/middlewares/booking-session/booking-session.utils.d.ts +4 -4
  107. package/dist/core/api/middlewares/booking-session/booking-session.utils.js +13 -10
  108. package/dist/core/api/queries.js +3 -2
  109. package/dist/core/color-scheme.d.ts +14 -0
  110. package/dist/core/color-scheme.js +48 -0
  111. package/dist/core/currency/constants.d.ts +1 -1
  112. package/dist/core/currency/constants.js +4 -3
  113. package/dist/core/i18n/date.js +20 -9
  114. package/dist/core/i18n/locale-codes.d.ts +2 -2
  115. package/dist/core/i18n/locale-codes.js +4 -0
  116. package/dist/core/images/constants.d.ts +0 -5
  117. package/dist/core/images/constants.js +0 -5
  118. package/dist/core/images/helpers.d.ts +8 -0
  119. package/dist/core/images/helpers.js +14 -6
  120. package/dist/core/images/srcset.js +2 -2
  121. package/dist/core/storybook/demo.d.ts +4 -0
  122. package/dist/core/storybook/demo.js +17 -0
  123. package/dist/core/types/locales.d.ts +7 -0
  124. package/dist/core/utils/datetime.js +10 -4
  125. package/dist/core/utils/locale.d.ts +8 -1
  126. package/dist/core/utils/locale.js +10 -0
  127. package/dist/helpers/helpers.d.ts +1 -1
  128. package/dist/index.d.ts +2 -3
  129. package/dist/index.js +1 -2
  130. package/dist/locales/ar-SA.d.ts +279 -0
  131. package/dist/locales/ar-SA.js +288 -0
  132. package/dist/locales/da-DK.d.ts +100 -82
  133. package/dist/locales/da-DK.js +104 -89
  134. package/dist/locales/de-DE.d.ts +100 -82
  135. package/dist/locales/de-DE.js +104 -89
  136. package/dist/locales/en-IE.d.ts +250 -232
  137. package/dist/locales/en-IE.js +253 -238
  138. package/dist/locales/en-US.d.ts +100 -82
  139. package/dist/locales/en-US.js +105 -90
  140. package/dist/locales/es-ES.d.ts +100 -82
  141. package/dist/locales/es-ES.js +104 -89
  142. package/dist/locales/fr-FR.d.ts +100 -82
  143. package/dist/locales/fr-FR.js +104 -89
  144. package/dist/locales/fr-MA.d.ts +100 -82
  145. package/dist/locales/fr-MA.js +104 -89
  146. package/dist/locales/is-IS.d.ts +100 -82
  147. package/dist/locales/is-IS.js +104 -89
  148. package/dist/locales/it-IT.d.ts +100 -82
  149. package/dist/locales/it-IT.js +104 -89
  150. package/dist/locales/ms-MY.d.ts +100 -82
  151. package/dist/locales/ms-MY.js +104 -89
  152. package/dist/locales/nb-NO.d.ts +100 -82
  153. package/dist/locales/nb-NO.js +104 -89
  154. package/dist/locales/pl-PL.d.ts +100 -82
  155. package/dist/locales/pl-PL.js +104 -89
  156. package/dist/locales/pt-PT.d.ts +100 -82
  157. package/dist/locales/pt-PT.js +104 -89
  158. package/dist/locales/sv-SE.d.ts +100 -82
  159. package/dist/locales/sv-SE.js +104 -89
  160. package/dist/locales/th-TH.d.ts +100 -82
  161. package/dist/locales/th-TH.js +104 -89
  162. package/dist/locales/tr-TR.d.ts +100 -82
  163. package/dist/locales/tr-TR.js +104 -89
  164. package/dist/locales/zh-CN.d.ts +100 -82
  165. package/dist/locales/zh-CN.js +105 -90
  166. package/dist/locales/zh-HK.d.ts +279 -0
  167. package/dist/locales/zh-HK.js +288 -0
  168. package/dist/mixins/coinbase.mixin.js +1 -1
  169. package/dist/mixins/error-modal.styles.js +2 -2
  170. package/dist/mixins/location-search/location-search.js +3 -3
  171. package/dist/mixins/location-search/location-search.styles.js +6 -5
  172. package/dist/sdk/chrome.d.ts +9 -3
  173. package/dist/sdk/chrome.js +21 -9
  174. package/dist/sdk/element-adapter.js +11 -8
  175. package/dist/sdk/mount.d.ts +3 -3
  176. package/dist/sdk/mount.js +150 -42
  177. package/dist/sdk/navigation-intent.js +3 -0
  178. package/dist/sdk/page-registry.d.ts +14 -2
  179. package/dist/sdk/page-registry.js +33 -13
  180. package/dist/sdk/theme.d.ts +1 -15
  181. package/dist/sdk/theme.js +4 -39
  182. package/dist/sdk/types.d.ts +55 -24
  183. package/dist/sdk/url.d.ts +24 -3
  184. package/dist/sdk/url.js +66 -27
  185. package/dist/sdk/validation.d.ts +0 -7
  186. package/dist/sdk/validation.js +105 -47
  187. package/dist/styles/contrast-fixtures.d.ts +0 -5
  188. package/dist/styles/contrast-fixtures.js +79 -9
  189. package/dist/styles/contrast.js +4 -3
  190. package/dist/styles/defaults/component.js +17 -1
  191. package/dist/styles/primitives.d.ts +0 -10
  192. package/dist/styles/primitives.js +2 -12
  193. package/dist/styles/tokens.d.ts +1 -1
  194. package/dist/styles/tokens.generated.d.ts +1 -1
  195. package/dist/styles/tokens.generated.js +1 -1
  196. package/dist/styles/tokens.metadata.d.ts +1 -1
  197. package/dist/styles/tokens.metadata.js +360 -90
  198. package/dist/views/details-page/details-page.component.d.ts +5 -5
  199. package/dist/views/details-page/details-page.component.js +97 -71
  200. package/dist/views/details-page/details-page.styles.js +64 -9
  201. package/dist/views/details-page/partials/theater-description/theater-description.component.js +5 -0
  202. package/dist/views/help-page/help-page.component.d.ts +1 -0
  203. package/dist/views/help-page/help-page.component.js +11 -4
  204. package/dist/views/help-page/help-page.styles.js +21 -8
  205. package/dist/views/landing-page/landing-page.component.d.ts +4 -4
  206. package/dist/views/landing-page/landing-page.component.js +65 -65
  207. package/dist/views/landing-page/landing-page.styles.js +70 -3
  208. package/dist/views/payment-page/partials/activity-details/activity-details.styles.js +10 -33
  209. package/dist/views/payment-page/partials/billing-address/billing-address.styles.js +4 -9
  210. package/dist/views/payment-page/partials/confirmation/confirmation.styles.js +6 -6
  211. package/dist/views/payment-page/partials/hotel-pickup-list/hotel-pickup-list.styles.js +4 -4
  212. package/dist/views/payment-page/partials/payment-type-selector/payment-type-selector.styles.js +1 -0
  213. package/dist/views/payment-page/partials/stripe/stripe.component.d.ts +1 -1
  214. package/dist/views/payment-page/partials/stripe/stripe.component.js +11 -12
  215. package/dist/views/payment-page/partials/stripe/stripe.constants.d.ts +2 -15
  216. package/dist/views/payment-page/partials/stripe/stripe.constants.js +4 -17
  217. package/dist/views/payment-page/partials/stripe/stripe.styles.js +16 -23
  218. package/dist/views/payment-page/partials/stripe/stripe.utils.d.ts +25 -14
  219. package/dist/views/payment-page/partials/stripe/stripe.utils.js +111 -62
  220. package/dist/views/payment-page/partials/terms-checkbox/terms-checkbox.styles.js +1 -1
  221. package/dist/views/payment-page/payment-page.component.d.ts +1 -0
  222. package/dist/views/payment-page/payment-page.component.js +19 -9
  223. package/dist/views/payment-page/payment-page.styles.js +37 -32
  224. package/dist/views/payment-page/payment-page.utils.d.ts +7 -0
  225. package/dist/views/payment-page/payment-page.utils.js +29 -14
  226. package/dist/views/payment-page/payment-page.validators.js +9 -3
  227. package/dist/views/payment-page/services/payment-api.service.d.ts +1 -1
  228. package/dist/views/search-page/search-page.component.d.ts +1 -0
  229. package/dist/views/search-page/search-page.component.js +12 -6
  230. package/dist/views/search-page/search-page.styles.js +24 -2
  231. package/dist/views/suggestion-widget/suggestion-widget.styles.js +1 -1
  232. package/package.json +62 -75
  233. package/dist/custom-elements.json +0 -37378
  234. package/dist/sdk/meta.d.ts +0 -7
  235. package/dist/sdk/meta.js +0 -9
  236. package/dist/styles/tokens.css +0 -359
@@ -36,10 +36,13 @@ export interface SelectionGroup {
36
36
  color: string;
37
37
  seatLabels: string[];
38
38
  unitPrice: number;
39
+ bookingFee: number;
39
40
  count: number;
40
41
  }
41
42
  export interface SelectionSummary {
42
43
  groups: SelectionGroup[];
44
+ subtotal: number;
45
+ fees: number;
43
46
  total: number;
44
47
  }
45
48
  export interface SeatsChartData {
@@ -65,8 +68,11 @@ export declare const findPriceBand: (seatLabel: string, availableSeats: Record<s
65
68
  export declare const buildTickets: (selectedLabels: string[], availableSeats: Record<string, AvailableSeat>, flatPriceBands: FlatPriceBand[]) => TicketRequest[];
66
69
  /**
67
70
  * Groups the selected seats by price-band category for the booking drawer:
68
- * one row per category with its colour, seat labels, unit price (incl. fees)
69
- * and count, plus the order total. All amounts in minor units.
71
+ * one row per category with its colour, seat labels, base unit price, per-seat
72
+ * booking fee and count. The base unit price matches the seat tooltip on the
73
+ * map; the booking fee is surfaced on its own line so the shopper can reconcile
74
+ * the two. subtotal + fees === total, which is the fee-inclusive amount booked.
75
+ * All amounts in minor units.
70
76
  */
71
77
  export declare const buildSelectionSummary: (seats: SelectedSeat[], availableSeats: Record<string, AvailableSeat>, flatPriceBands: FlatPriceBand[], categories: ChartCategory[]) => SelectionSummary;
72
78
  export declare const makeIsSeatSelectable: (availableSeats: Record<string, AvailableSeat>) => (object: SelectableObject) => boolean;
@@ -97,12 +97,17 @@ export const buildTickets = (selectedLabels, availableSeats, flatPriceBands) =>
97
97
  };
98
98
  /**
99
99
  * Groups the selected seats by price-band category for the booking drawer:
100
- * one row per category with its colour, seat labels, unit price (incl. fees)
101
- * and count, plus the order total. All amounts in minor units.
100
+ * one row per category with its colour, seat labels, base unit price, per-seat
101
+ * booking fee and count. The base unit price matches the seat tooltip on the
102
+ * map; the booking fee is surfaced on its own line so the shopper can reconcile
103
+ * the two. subtotal + fees === total, which is the fee-inclusive amount booked.
104
+ * All amounts in minor units.
102
105
  */
103
106
  export const buildSelectionSummary = (seats, availableSeats, flatPriceBands, categories) => {
104
107
  const categoryByKey = new Map(categories.map((category) => [category.key, category]));
105
108
  const groups = new Map();
109
+ let subtotal = 0;
110
+ let fees = 0;
106
111
  let total = 0;
107
112
  seats.forEach((seat) => {
108
113
  const meta = availableSeats[seat.id];
@@ -110,6 +115,8 @@ export const buildSelectionSummary = (seats, availableSeats, flatPriceBands, cat
110
115
  if (!meta || !band) {
111
116
  return;
112
117
  }
118
+ subtotal += band.basePrice;
119
+ fees += band.bookingFee;
113
120
  total += band.fullPrice;
114
121
  const key = String(meta.categoryID);
115
122
  const existing = groups.get(key);
@@ -124,12 +131,13 @@ export const buildSelectionSummary = (seats, availableSeats, flatPriceBands, cat
124
131
  label: category?.label ?? key,
125
132
  color: category?.color ?? "",
126
133
  seatLabels: [seat.seatLabel],
127
- unitPrice: band.fullPrice,
134
+ unitPrice: band.basePrice,
135
+ bookingFee: band.bookingFee,
128
136
  count: 1,
129
137
  });
130
138
  }
131
139
  });
132
- return { groups: [...groups.values()], total };
140
+ return { groups: [...groups.values()], subtotal, fees, total };
133
141
  };
134
142
  const isReserved = (object) => {
135
143
  const status = "status" in object ? object.status : undefined;
@@ -19,6 +19,7 @@ export default css `
19
19
 
20
20
  & > .caption {
21
21
  padding: 0.6rem 1rem 0.9rem 1rem;
22
+ font-family: var(--coras-font-family-heading);
22
23
  font-weight: var(--select-list-caption-font-weight);
23
24
  font-size: var(--select-list-caption-font-size);
24
25
  color: var(--select-list-caption-icon-color);
@@ -7,9 +7,9 @@ export default css `
7
7
  --select-option-font-size: var(--coras-font-size-base);
8
8
  --select-option-line-height: var(--coras-font-size-2xl);
9
9
  --select-option-color: var(--coras-color-text);
10
- --select-option-hovered-background-color: var(--coras-color-surface-hover);
11
- --select-option-selected-background-color: var(--coras-color-surface-hover);
12
- --select-option-check-mark-color: var(--coras-color-primary-500);
10
+ --select-option-hovered-background-color: var(--coras-color-menu-hover);
11
+ --select-option-selected-background-color: var(--coras-color-menu-hover);
12
+ --select-option-check-mark-color: var(--coras-color-primary);
13
13
 
14
14
  --check-mark-size: 12px;
15
15
 
@@ -5,7 +5,7 @@ export default css `
5
5
 
6
6
  :host {
7
7
  --sort-dropdown-button-icon-color: var(--coras-color-text);
8
- --sort-dropdown-button-icon-color-hover: var(--coras-color-primary-700);
8
+ --sort-dropdown-button-icon-color-hover: var(--coras-color-primary);
9
9
  }
10
10
 
11
11
  coras-button {
@@ -5,7 +5,7 @@ export default css `
5
5
 
6
6
  :host {
7
7
  --sort-list-label-font-size: var(--coras-font-size-sm);
8
- --sort-list-label-color: var(--coras-color-text-secondary);
8
+ --sort-list-label-color: var(--coras-color-text-muted);
9
9
  --sort-list-label-font-weight: var(--coras-font-weight-normal);
10
10
  }
11
11
 
@@ -6,7 +6,7 @@ export default css `
6
6
  :host {
7
7
  --sport-option-color: var(--coras-color-text);
8
8
  --sport-option-shadow: var(--coras-shadow-sm);
9
- --sport-option-section-border-color: var(--coras-color-neutral-200);
9
+ --sport-option-section-border-color: var(--coras-color-card-border);
10
10
  --sport-option-section-border-radius: var(--coras-radius-md);
11
11
  --sport-option-font-weight: var(--coras-font-weight-normal);
12
12
  --sport-option-label-font-size: var(--coras-font-size-sm);
@@ -49,7 +49,7 @@ export default css `
49
49
  border-left: none;
50
50
  border-top-right-radius: var(--sport-option-section-border-radius);
51
51
  border-bottom-right-radius: var(--sport-option-section-border-radius);
52
- background-color: var(--coras-color-primary-50);
52
+ background-color: var(--coras-color-primary-tint);
53
53
 
54
54
  coras-button {
55
55
  margin-left: 1rem;
@@ -10,6 +10,7 @@ export declare class CorasStarRating extends LitElement {
10
10
  static styles: CSSResultGroup;
11
11
  rating: number;
12
12
  private get normalizedRating();
13
+ private renderStarShape;
13
14
  private renderStar;
14
15
  render(): TemplateResult<1>;
15
16
  }
@@ -4,11 +4,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { html, LitElement, } from "lit";
7
+ import { html, LitElement, nothing, } from "lit";
8
8
  import { property } from "lit/decorators.js";
9
9
  import { range } from "lit/directives/range.js";
10
10
  import { map } from "lit/directives/map.js";
11
11
  import styles from "./star-rating.styles.js";
12
+ const STAR_PATH = "M9 14.25l-5.584 2.936 1.066-6.218L.465 6.564l6.243-.907L9 0l2.792 5.657 6.243.907-4.517 4.404 1.066 6.218";
12
13
  /**
13
14
  * A component that displays a star rating.
14
15
  *
@@ -25,6 +26,17 @@ export class CorasStarRating extends LitElement {
25
26
  get normalizedRating() {
26
27
  return Math.max(0, Math.min(5, Math.round(this.rating * 2) / 2));
27
28
  }
29
+ renderStarShape() {
30
+ return html `
31
+ <svg
32
+ viewBox="0 0 18 18"
33
+ aria-hidden="true"
34
+ xmlns="http://www.w3.org/2000/svg"
35
+ >
36
+ <path d="${STAR_PATH}" />
37
+ </svg>
38
+ `;
39
+ }
28
40
  renderStar(index) {
29
41
  const starValue = index + 1;
30
42
  const isFull = starValue <= this.normalizedRating;
@@ -35,16 +47,12 @@ export class CorasStarRating extends LitElement {
35
47
  else if (isHalf)
36
48
  className = "star star--half";
37
49
  return html `
38
- <svg
39
- class="${className}"
40
- viewBox="0 0 18 18"
41
- aria-hidden="true"
42
- xmlns="http://www.w3.org/2000/svg"
43
- >
44
- <path
45
- d="M9 14.25l-5.584 2.936 1.066-6.218L.465 6.564l6.243-.907L9 0l2.792 5.657 6.243.907-4.517 4.404 1.066 6.218"
46
- />
47
- </svg>
50
+ <span class="${className}">
51
+ <span class="star-base">${this.renderStarShape()}</span>
52
+ ${isFull || isHalf
53
+ ? html `<span class="star-fill">${this.renderStarShape()}</span>`
54
+ : nothing}
55
+ </span>
48
56
  `;
49
57
  }
50
58
  render() {
@@ -54,18 +62,6 @@ export class CorasStarRating extends LitElement {
54
62
  role="img"
55
63
  aria-label="${this.normalizedRating} out of 5 stars"
56
64
  >
57
- <svg width="0" height="0" style="position: absolute;">
58
- <defs>
59
- <linearGradient id="half-gradient">
60
- <stop offset="50%" stop-color="var(--star-rating-color)" />
61
- <stop
62
- offset="50%"
63
- stop-color="var(--star-rating-background-color)"
64
- />
65
- </linearGradient>
66
- </defs>
67
- </svg>
68
-
69
65
  ${map(range(5), (i) => this.renderStar(i))}
70
66
  <span class="sr-only">${this.normalizedRating} out of 5 stars</span>
71
67
  </div>
@@ -7,7 +7,14 @@ export default css `
7
7
  display: inline-flex;
8
8
  align-items: center;
9
9
  --star-rating-color: var(--coras-color-primary);
10
- --star-rating-background-color: var(--coras-color-neutral-200);
10
+ /* The unearned part of the track is the rating colour faded rather than a
11
+ flat grey, so it reads as the same mark and composites correctly over a
12
+ light or a dark surface. It follows an overridden star colour too. */
13
+ --star-rating-background-color: color-mix(
14
+ in srgb,
15
+ var(--star-rating-color) 25%,
16
+ transparent
17
+ );
11
18
  --star-size: 1.125rem;
12
19
  --star-gap: 0.125rem;
13
20
  }
@@ -19,20 +26,39 @@ export default css `
19
26
  }
20
27
 
21
28
  .star {
29
+ position: relative;
30
+ display: block;
22
31
  width: var(--star-size);
23
32
  height: var(--star-size);
24
33
  }
25
34
 
26
- .star--full {
35
+ .star svg {
36
+ display: block;
37
+ width: var(--star-size);
38
+ height: var(--star-size);
39
+ }
40
+
41
+ .star-base {
42
+ fill: var(--star-rating-background-color);
43
+ }
44
+
45
+ /* A paint-server reference such as url(#gradient) does not resolve from a
46
+ stylesheet inside a shadow root, so the coloured part of a star is a second
47
+ copy clipped by its container rather than a gradient fill. */
48
+ .star-fill {
49
+ position: absolute;
50
+ inset-block: 0;
51
+ inset-inline-start: 0;
52
+ overflow: hidden;
27
53
  fill: var(--star-rating-color);
28
54
  }
29
55
 
30
- .star--half {
31
- fill: url(#half-gradient);
56
+ .star--full .star-fill {
57
+ width: 100%;
32
58
  }
33
59
 
34
- .star--empty {
35
- fill: var(--star-rating-background-color);
60
+ .star--half .star-fill {
61
+ width: 50%;
36
62
  }
37
63
 
38
64
  .sr-only {
@@ -14,7 +14,7 @@ export default css `
14
14
  --tab-font-size: var(--coras-font-size-base);
15
15
  --tab-font-weight: var(--coras-font-weight-medium);
16
16
  --tab-shadow: var(--coras-shadow-sm);
17
- --tab-border-bottom-color: var(--coras-color-secondary-500);
17
+ --tab-border-bottom-color: var(--coras-color-secondary);
18
18
  --tab-chip-selected-background-color: var(--coras-color-primary);
19
19
  --tab-chip-font-size: var(--coras-font-size-base);
20
20
  --tab-chip-line-height: var(--coras-font-size-base);
@@ -6,7 +6,7 @@ export default css `
6
6
  :host {
7
7
  --tabs-border-bottom-color: color-mix(
8
8
  in srgb,
9
- var(--coras-color-error-500),
9
+ var(--coras-color-error),
10
10
  transparent 96%
11
11
  );
12
12
  --tabs-gap: 0;
@@ -14,13 +14,13 @@ export default css `
14
14
  --tag-font-weight: var(--coras-font-weight-semibold);
15
15
 
16
16
  --tag-color-blue: var(--coras-color-text);
17
- --tag-background-color-blue: var(--coras-color-primary-300);
18
- --tag-color-green: var(--coras-color-success-900);
19
- --tag-background-color-green: var(--coras-color-success-50);
20
- --tag-color-red: var(--coras-color-error-900);
21
- --tag-background-color-red: var(--coras-color-error-50);
22
- --tag-color-purple: var(--coras-color-info-500);
23
- --tag-background-color-purple: var(--coras-color-info-50);
17
+ --tag-background-color-blue: var(--coras-color-primary-tint);
18
+ --tag-color-green: var(--coras-color-success);
19
+ --tag-background-color-green: var(--coras-color-success-background);
20
+ --tag-color-red: var(--coras-color-error);
21
+ --tag-background-color-red: var(--coras-color-error-background);
22
+ --tag-color-purple: var(--coras-color-info);
23
+ --tag-background-color-purple: var(--coras-color-info-background);
24
24
  }
25
25
 
26
26
  span {
@@ -9,6 +9,7 @@ export default css `
9
9
 
10
10
  .label {
11
11
  color: var(--coras-color-text);
12
+ font-family: var(--coras-font-family-heading);
12
13
  font-weight: var(--coras-font-weight-semibold);
13
14
  font-size: 22px;
14
15
  line-height: 30px;
@@ -82,7 +83,7 @@ export default css `
82
83
  }
83
84
 
84
85
  ::slotted(a) {
85
- color: var(--coras-color-primary-500);
86
+ color: var(--coras-color-link);
86
87
  text-decoration: underline;
87
88
  font-size: inherit;
88
89
  }
@@ -6,7 +6,6 @@ export default css `
6
6
  :host {
7
7
  display: flex;
8
8
 
9
- /* Tags keep a fixed pill shape, exempt from the brand radius. */
10
9
  --time-tag-border-radius: var(--coras-radius-full);
11
10
  --time-tag-font-size: var(--coras-font-size-xs);
12
11
  --time-tag-font-weight: var(--coras-font-weight-semibold);
@@ -14,7 +13,7 @@ export default css `
14
13
 
15
14
  --time-tag-line-height: 16px;
16
15
  --time-tag-letter-spacing: 0.01em;
17
- --time-tag-background-color: var(--coras-color-info-50);
16
+ --time-tag-background-color: var(--coras-color-info-background);
18
17
  }
19
18
 
20
19
  svg {
@@ -4,9 +4,9 @@ export default css `
4
4
  ${component}
5
5
 
6
6
  :host {
7
- --tooltip-background-color: var(--coras-color-surface);
8
- --tooltip-arrow-icon-color: var(--coras-color-primary-400);
9
- --tooltip-border-color: var(--coras-color-neutral-200);
7
+ --tooltip-background-color: var(--coras-color-card);
8
+ --tooltip-arrow-icon-color: var(--coras-color-primary);
9
+ --tooltip-border-color: var(--coras-color-card-border);
10
10
  --tooltip-border-radius: var(--coras-radius-sm);
11
11
  --tooltip-content-shadow: var(--coras-shadow-md);
12
12
  --tooltip-font-size: var(--coras-font-size-sm);
@@ -17,8 +17,8 @@ export default css `
17
17
  --coras-font-weight-semibold
18
18
  );
19
19
  --tour-ticket-type-counter-value-line-height: var(--coras-font-size-2xl);
20
- --tour-ticket-type-hover-background-color: var(--coras-color-surface-hover);
21
- --tour-ticket-type-disabled-color: var(--coras-color-neutral-500);
20
+ --tour-ticket-type-hover-background-color: var(--coras-color-card-hover);
21
+ --tour-ticket-type-disabled-color: var(--coras-color-text-disabled);
22
22
 
23
23
  display: flex;
24
24
  flex-direction: row;
@@ -31,7 +31,7 @@ export class CorasTourTicketTypeSelector extends LitElement {
31
31
  <coras-button
32
32
  slot="trigger"
33
33
  variant="outlined"
34
- radius="small"
34
+ radius="field"
35
35
  height="md"
36
36
  border-color="light"
37
37
  expanded
@@ -9,9 +9,7 @@ export default css `
9
9
  );
10
10
  --tour-ticket-type-selector-options-border-radius: var(--coras-radius-sm);
11
11
  --tour-ticket-type-selector-options-box-shadow: var(--coras-shadow-md);
12
- --tour-ticket-type-selector-open-arrow-color: var(
13
- --coras-color-primary-500
14
- );
12
+ --tour-ticket-type-selector-open-arrow-color: var(--coras-color-primary);
15
13
 
16
14
  display: inline-flex;
17
15
  max-width: 100%;
@@ -19,12 +17,6 @@ export default css `
19
17
  coras-dropdown {
20
18
  width: 100%;
21
19
  }
22
-
23
- /* The trigger reads as a prominent text field, so it keeps a fixed field
24
- radius (like the payment fields) rather than tracking the brand radius. */
25
- coras-button {
26
- --button-border-radius-small: var(--coras-radius-field);
27
- }
28
20
  }
29
21
 
30
22
  :host #arrow {
@@ -154,6 +154,7 @@ let CorasTransferModal = class CorasTransferModal extends LitElement {
154
154
  return msg("Verify your payment");
155
155
  }
156
156
  renderMfaContent() {
157
+ const phone = html `<strong>${this.maskedPhone}</strong>`;
157
158
  return html `
158
159
  <div class="mfa-state">
159
160
  <div class="payment-summary">
@@ -171,9 +172,8 @@ let CorasTransferModal = class CorasTransferModal extends LitElement {
171
172
 
172
173
  <p class="mfa-instruction">
173
174
  ${this.maskedPhone
174
- ? msg(html `A verification code has been sent to
175
- <strong>${this.maskedPhone}</strong>. Enter the 6-digit code
176
- below to confirm your payment.`)
175
+ ? msg(html `A verification code has been sent to ${phone}. Enter the
176
+ 6-digit code below to confirm your payment.`)
177
177
  : msg("A verification code has been sent to your registered phone number. Enter the 6-digit code below to confirm your payment.")}
178
178
  </p>
179
179
 
@@ -17,7 +17,7 @@ export default css `
17
17
  }
18
18
 
19
19
  .error-message {
20
- background: var(--coras-color-error-surface, #fef2f2);
20
+ background: var(--coras-color-error-background, #fef2f2);
21
21
  color: var(--coras-color-error, #dc2626);
22
22
  padding: 0.75rem 1rem;
23
23
  border-radius: var(--coras-radius-md, 8px);
@@ -33,7 +33,7 @@ export default css `
33
33
  .loading-spinner {
34
34
  width: 40px;
35
35
  height: 40px;
36
- border: 3px solid var(--coras-color-border, #e0e0e0);
36
+ border: 3px solid var(--coras-color-card-border, #e0e0e0);
37
37
  border-top-color: var(--coras-color-primary, #0052ff);
38
38
  border-radius: 50%;
39
39
  animation: spin 1s linear infinite;
@@ -47,17 +47,15 @@ export default css `
47
47
  }
48
48
 
49
49
  .loading-text {
50
- color: var(--coras-color-text-secondary, #666666);
50
+ color: var(--coras-color-text-muted, #666666);
51
51
  font-size: 0.875rem;
52
52
  }
53
53
 
54
- /* MFA Verification State */
55
54
  .mfa-state {
56
55
  text-align: center;
57
56
  padding: 0.5rem 0;
58
57
  }
59
58
 
60
- /* Payment summary block */
61
59
  .payment-summary {
62
60
  margin-bottom: 1rem;
63
61
  }
@@ -79,7 +77,7 @@ export default css `
79
77
  }
80
78
 
81
79
  .mfa-instruction {
82
- color: var(--coras-color-text-secondary, #666666);
80
+ color: var(--coras-color-text-muted, #666666);
83
81
  font-size: 0.875rem;
84
82
  line-height: 1.5;
85
83
  margin-bottom: 1.5rem;
@@ -102,7 +100,7 @@ export default css `
102
100
 
103
101
  .mfa-disclaimer {
104
102
  font-size: 0.75rem;
105
- color: var(--coras-color-text-secondary, #666666);
103
+ color: var(--coras-color-text-muted, #666666);
106
104
  line-height: 1.4;
107
105
  margin-top: 1rem;
108
106
  margin-bottom: 0;
@@ -131,7 +129,7 @@ export default css `
131
129
  }
132
130
 
133
131
  .resend-link:hover {
134
- color: var(--coras-color-primary-hover, #0040cc);
132
+ color: var(--coras-color-main-button-hover, #0040cc);
135
133
  }
136
134
 
137
135
  .resend-link:disabled {
@@ -19,7 +19,7 @@ export declare class CorasBasket extends LitElement {
19
19
  private handleRemoveItem;
20
20
  private renderCheckoutButton;
21
21
  private renderTickets;
22
- private getSeatInfo;
22
+ private getSeatDetails;
23
23
  private renderBasketItems;
24
24
  render(): import("lit").TemplateResult<1>;
25
25
  }
@@ -17,7 +17,7 @@ import "../../contexts/basket/basket.js";
17
17
  import { basketContext } from "../../contexts/basket/basket.context.js";
18
18
  import { property } from "lit/decorators.js";
19
19
  import { currencyContext, localeContext, assetsURLContext, } from "../../contexts/properties.context.js";
20
- import { localized, msg } from "@lit/localize";
20
+ import { localized, msg, str } from "@lit/localize";
21
21
  import { convertToLocaleCurrency } from "../../core/currency/index.js";
22
22
  import { formatDateTimeForDisplay, formatTimeForDisplay, } from "../../core/utils/datetime.js";
23
23
  let CorasBasket = class CorasBasket extends LitElement {
@@ -102,7 +102,12 @@ let CorasBasket = class CorasBasket extends LitElement {
102
102
  ${Array.from(ticketGroups.values()).map((group) => {
103
103
  const ticket = group.ticket;
104
104
  const ticketCount = group.count;
105
- const ticketName = ticket.name || msg("Ticket");
105
+ // Label by price type ("Adult", "Infant", …) - that's what the
106
+ // breakdown shows. `name` is a mostly-empty generic label that falls
107
+ // back to "Ticket".
108
+ const ticketName = ("price_type" in ticket && ticket.price_type) ||
109
+ ticket.name ||
110
+ msg("Ticket");
106
111
  let ticketPrice = "";
107
112
  if (ticket.full_price !== undefined) {
108
113
  ticketPrice = this.getFormattedPrice(ticket.full_price);
@@ -122,22 +127,45 @@ let CorasBasket = class CorasBasket extends LitElement {
122
127
  })}
123
128
  `;
124
129
  }
125
- getSeatInfo(reservation) {
126
- const seatInfo = [];
127
- if (reservation.tickets) {
128
- for (const ticket of reservation.tickets) {
129
- if ("section" in ticket && ticket.section) {
130
- seatInfo.push(`Section: ${ticket.section}`);
131
- }
132
- if ("row_name" in ticket && ticket.row_name) {
133
- seatInfo.push(`Row: ${ticket.row_name}`);
134
- }
135
- if ("seat_name" in ticket && ticket.seat_name) {
136
- seatInfo.push(`Seat: ${ticket.seat_name}`);
137
- }
130
+ // Collapses a reservation's per-ticket seat data into a section line and a
131
+ // seat line ("Row 9, Seats 11, 12", or bare labels like "F5, F6" when the API
132
+ // gives seat names without a separate row/number). General-admission tickets
133
+ // carry no seat fields, so both come back empty and the seat row is dropped.
134
+ getSeatDetails(reservation) {
135
+ const tickets = reservation.tickets;
136
+ if (!tickets || tickets.length === 0) {
137
+ return { section: "", seats: "" };
138
+ }
139
+ const sections = new Set();
140
+ const seatsByRow = new Map();
141
+ const looseSeats = [];
142
+ for (const ticket of tickets) {
143
+ const section = "section" in ticket ? ticket.section : undefined;
144
+ const rowName = "row_name" in ticket ? ticket.row_name : undefined;
145
+ const seatNumber = "seat_number" in ticket ? ticket.seat_number : undefined;
146
+ const seatName = "seat_name" in ticket ? ticket.seat_name : undefined;
147
+ if (section) {
148
+ sections.add(section);
149
+ }
150
+ const row = rowName?.toString().trim();
151
+ const number = seatNumber?.toString().trim();
152
+ if (row && number) {
153
+ const seats = seatsByRow.get(row) ?? [];
154
+ seats.push(number);
155
+ seatsByRow.set(row, seats);
156
+ }
157
+ else if (seatName) {
158
+ looseSeats.push(seatName);
138
159
  }
139
160
  }
140
- return seatInfo;
161
+ const rowSeats = [...seatsByRow.entries()].map(([row, seats]) => {
162
+ const seatList = seats.join(", ");
163
+ return msg(str `Row ${row}, Seats ${seatList}`);
164
+ });
165
+ return {
166
+ section: [...sections].join(", "),
167
+ seats: [...rowSeats, ...looseSeats].join(" · "),
168
+ };
141
169
  }
142
170
  renderBasketItems() {
143
171
  if (!this.basket?.value?.items || this.basket.value.items.length === 0) {
@@ -165,7 +193,15 @@ let CorasBasket = class CorasBasket extends LitElement {
165
193
  const imageUrl = reservation.images
166
194
  ? Object.values(reservation.images)[0] || ""
167
195
  : "";
168
- const seatInfo = this.getSeatInfo(reservation);
196
+ const { section, seats } = this.getSeatDetails(reservation);
197
+ const tickets = reservation.tickets ?? [];
198
+ const distinctPriceTypes = new Set(tickets.map((ticket) => ticket.price_type_id).filter(Boolean));
199
+ // Show the per-ticket "ea" price on the item header only when every
200
+ // ticket is the same type, so the average is the true unit price. Mixed
201
+ // types get their own per-type "ea" lines in the breakdown instead.
202
+ const unitPrice = tickets.length > 0 && distinctPriceTypes.size <= 1
203
+ ? this.getFormattedPrice(reservation.total_price / reservation.number_of_tickets)
204
+ : "";
169
205
  const ticketsHtml = this.renderTickets(reservation.tickets || [], reservation.number_of_tickets, reservation.total_price);
170
206
  return html `
171
207
  <coras-basket-item
@@ -177,17 +213,12 @@ let CorasBasket = class CorasBasket extends LitElement {
177
213
  date="${date}"
178
214
  time="${time}"
179
215
  quantity="${reservation.number_of_tickets}"
180
- price="${this.getFormattedPrice(reservation.total_price / reservation.number_of_tickets)}"
216
+ section="${section}"
217
+ seats="${seats}"
218
+ price="${unitPrice}"
181
219
  total-price="${this.getFormattedPrice(reservation.total_price)}"
182
220
  expires-in="${reservation.expires_in}"
183
221
  >
184
- ${seatInfo.length > 0
185
- ? html `
186
- <div slot="details" class="seat-info">
187
- ${seatInfo.join(" | ")}
188
- </div>
189
- `
190
- : html ``}
191
222
  ${ticketsHtml}
192
223
  <coras-icon
193
224
  slot="remove-button"
@@ -6,8 +6,11 @@ export default css `
6
6
  :host {
7
7
  --footer-background: var(--coras-footer-background-color);
8
8
  --footer-text-color: var(--coras-footer-text-color);
9
+ --footer-border-top: var(--coras-footer-border-top);
10
+ --footer-padding-bottom: var(--coras-footer-padding-bottom);
9
11
 
10
12
  background-color: var(--footer-background);
13
+ border-top: var(--footer-border-top);
11
14
 
12
15
  width: 100%;
13
16
  pointer-events: none;
@@ -19,6 +22,7 @@ export default css `
19
22
  margin: 0 auto;
20
23
  width: 100%;
21
24
  padding: var(--coras-footer-padding);
25
+ padding-bottom: var(--footer-padding-bottom);
22
26
  pointer-events: auto;
23
27
 
24
28
  coras-footer-menu-item {