@session-services/web-elements 0.1.19 → 0.1.21

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 (32) hide show
  1. package/dist/cjs/{index-C6e98Atu.js → index-BYBgrATL.js} +1 -0
  2. package/dist/cjs/loader.cjs.js +2 -2
  3. package/dist/cjs/session-services-elements.cjs.js +2 -2
  4. package/dist/cjs/session-services-formatted-text.cjs.entry.js +181 -165
  5. package/dist/cjs/session-services-ticketing.cjs.entry.js +24398 -19366
  6. package/dist/collection/components/session-services-formatted-text/session-services-formatted-text.js +33 -34
  7. package/dist/collection/components/session-services-ticketing/session-services-ticketing.css +401 -339
  8. package/dist/collection/components/session-services-ticketing/session-services-ticketing.js +1087 -269
  9. package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.js +263 -0
  10. package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.test.js +276 -0
  11. package/dist/collection/components/session-services-ticketing/session-services-ticketing.test.js +264 -0
  12. package/dist/components/session-services-formatted-text.js +180 -164
  13. package/dist/components/session-services-ticketing.js +24442 -19392
  14. package/dist/esm/{index-CeXOR4aK.js → index-CNOpF6tk.js} +1 -1
  15. package/dist/esm/loader.js +3 -3
  16. package/dist/esm/session-services-elements.js +3 -3
  17. package/dist/esm/session-services-formatted-text.entry.js +181 -165
  18. package/dist/esm/session-services-ticketing.entry.js +24406 -19374
  19. package/dist/session-services-elements/{p-a2404c46.entry.js → p-703444ed.entry.js} +1 -1
  20. package/dist/session-services-elements/p-CNOpF6tk.js +2 -0
  21. package/dist/session-services-elements/p-b8703bf3.entry.js +1 -0
  22. package/dist/session-services-elements/session-services-elements.esm.js +1 -1
  23. package/dist/sst-env.d.ts +1 -0
  24. package/dist/types/components/session-services-formatted-text/session-services-formatted-text.d.ts +3 -0
  25. package/dist/types/components/session-services-ticketing/session-services-ticketing.d.ts +117 -3
  26. package/dist/types/components/session-services-ticketing/session-services-ticketing.logic.d.ts +193 -0
  27. package/dist/types/components/session-services-ticketing/session-services-ticketing.logic.test.d.ts +1 -0
  28. package/dist/types/components/session-services-ticketing/session-services-ticketing.test.d.ts +1 -0
  29. package/dist/types/components.d.ts +18 -0
  30. package/package.json +8 -7
  31. package/dist/session-services-elements/p-62a8e2cc.entry.js +0 -1
  32. package/dist/session-services-elements/p-CeXOR4aK.js +0 -2
@@ -41,33 +41,35 @@
41
41
  * @prop --shadow-md: Medium shadow.
42
42
  * @prop --shadow-lg: Large shadow.
43
43
  * @prop --shadow-xl: Extra large shadow.
44
+ * @prop --shadow-edge-light: Subtle lower edge shadow.
45
+ * @prop --shadow-edge-dark: Subtle upper edge shadow.
44
46
  * @prop --transition-fast: Fast transition.
45
47
  * @prop --transition-base: Base transition.
46
48
  * @prop --transition-slow: Slow transition.
47
49
  */
48
50
  --background: transparent;
49
- --foreground: oklch(0.145 0 0);
51
+ --foreground: oklch(0.21 0.006 285.885);
50
52
  --card: oklch(1 0 0);
51
- --card-foreground: oklch(0.145 0 0);
53
+ --card-foreground: oklch(0.21 0.006 285.885);
52
54
  --popover: oklch(1 0 0);
53
- --popover-foreground: oklch(0.145 0 0);
54
- --primary: oklch(0.205 0 0);
55
+ --popover-foreground: oklch(0.21 0.006 285.885);
56
+ --primary: oklch(0.537 0.1554 255);
55
57
  --primary-foreground: oklch(0.985 0 0);
56
- --secondary: oklch(0.97 0 0);
57
- --secondary-foreground: oklch(0.205 0 0);
58
- --muted: oklch(0.97 0 0);
59
- --muted-foreground: oklch(0.556 0 0);
60
- --accent: oklch(0.97 0 0);
61
- --accent-foreground: oklch(0.205 0 0);
62
- --destructive: oklch(0.577 0.245 27.325);
63
- --destructive-foreground: oklch(1 0 0);
64
- --border: oklch(0.922 0 0);
65
- --input: oklch(0.922 0 0);
66
- --ring: oklch(0.708 0 0);
58
+ --secondary: oklch(0 0 0 / 4%);
59
+ --secondary-foreground: oklch(0.21 0.006 285.885);
60
+ --muted: oklch(0 0 0 / 4%);
61
+ --muted-foreground: oklch(0.442 0.017 285.786);
62
+ --accent: oklch(0 0 0 / 4%);
63
+ --accent-foreground: oklch(0.21 0.006 285.885);
64
+ --destructive: oklch(0.637 0.237 25.331);
65
+ --destructive-foreground: oklch(0.505 0.213 27.518);
66
+ --border: oklch(0 0 0 / 12%);
67
+ --input: oklch(0 0 0 / 12%);
68
+ --ring: oklch(0.705 0.015 286.067);
67
69
 
68
70
  /* Additional colors for component */
69
- --success: oklch(0.66 0.154 149.48);
70
- --warning: oklch(0.72 0.153 66.34);
71
+ --success: oklch(0.696 0.17 162.48);
72
+ --warning: oklch(0.769 0.188 70.08);
71
73
  --info: oklch(0.623 0.214 259.815);
72
74
  --info-foreground: oklch(0.488 0.243 264.376);
73
75
  --backdrop: oklch(0 0 0 / 0.32);
@@ -108,6 +110,8 @@
108
110
  0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
109
111
  --shadow-xl:
110
112
  0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
113
+ --shadow-edge-light: 0 1px oklch(0 0 0 / 4%);
114
+ --shadow-edge-dark: 0 -1px oklch(1 0 0 / 8%);
111
115
 
112
116
  /* Transitions */
113
117
  --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
@@ -116,27 +120,24 @@
116
120
 
117
121
  /* Internal tokens with external override fallbacks */
118
122
  --internal-background: var(--background, transparent);
119
- --internal-foreground: var(--foreground, oklch(0.145 0 0));
123
+ --internal-foreground: var(--foreground, oklch(0.21 0.006 285.885));
120
124
  --internal-card: var(--card, oklch(1 0 0));
121
- --internal-card-foreground: var(--card-foreground, oklch(0.145 0 0));
122
125
  --internal-popover: var(--popover, oklch(1 0 0));
123
- --internal-popover-foreground: var(--popover-foreground, oklch(0.145 0 0));
124
- --internal-primary: var(--primary, oklch(0.205 0 0));
126
+ --internal-popover-foreground: var(--popover-foreground, oklch(0.21 0.006 285.885));
127
+ --internal-primary: var(--primary, oklch(0.537 0.1554 255));
125
128
  --internal-primary-foreground: var(--primary-foreground, oklch(0.985 0 0));
126
- --internal-secondary: var(--secondary, oklch(0.97 0 0));
127
- --internal-secondary-foreground: var(--secondary-foreground, oklch(0.205 0 0));
128
- --internal-muted: var(--muted, oklch(0.97 0 0));
129
- --internal-muted-foreground: var(--muted-foreground, oklch(0.556 0 0));
130
- --internal-accent: var(--accent, oklch(0.97 0 0));
131
- --internal-accent-foreground: var(--accent-foreground, oklch(0.205 0 0));
132
- --internal-destructive: var(--destructive, oklch(0.577 0.245 27.325));
133
- --internal-destructive-foreground: var(--destructive-foreground, oklch(1 0 0));
134
- --internal-border: var(--border, oklch(0.922 0 0));
135
- --internal-input: var(--input, oklch(0.922 0 0));
136
- --internal-ring: var(--ring, oklch(0.708 0 0));
137
-
138
- --internal-success: var(--success, oklch(0.66 0.154 149.48));
139
- --internal-warning: var(--warning, oklch(0.72 0.153 66.34));
129
+ --internal-secondary: var(--secondary, oklch(0 0 0 / 4%));
130
+ --internal-muted: var(--muted, oklch(0 0 0 / 4%));
131
+ --internal-muted-foreground: var(--muted-foreground, oklch(0.442 0.017 285.786));
132
+ --internal-accent: var(--accent, oklch(0 0 0 / 4%));
133
+ --internal-accent-foreground: var(--accent-foreground, oklch(0.21 0.006 285.885));
134
+ --internal-destructive: var(--destructive, oklch(0.637 0.237 25.331));
135
+ --internal-border: var(--border, oklch(0 0 0 / 12%));
136
+ --internal-input: var(--input, oklch(0 0 0 / 12%));
137
+ --internal-ring: var(--ring, oklch(0.705 0.015 286.067));
138
+
139
+ --internal-success: var(--success, oklch(0.696 0.17 162.48));
140
+ --internal-warning: var(--warning, oklch(0.769 0.188 70.08));
140
141
  --internal-info: var(--info, oklch(0.623 0.214 259.815));
141
142
  --internal-info-foreground: var(--info-foreground, oklch(0.488 0.243 264.376));
142
143
  --internal-backdrop: var(--backdrop, oklch(0 0 0 / 0.32));
@@ -156,22 +157,16 @@
156
157
  --internal-font-size-base: var(--font-size-base, 1rem);
157
158
  --internal-font-size-lg: var(--font-size-lg, 1.125rem);
158
159
  --internal-font-size-xl: var(--font-size-xl, 1.25rem);
159
- --internal-font-size-2xl: var(--font-size-2xl, 1.5rem);
160
- --internal-font-weight-normal: var(--font-weight-normal, 400);
161
160
  --internal-font-weight-medium: var(--font-weight-medium, 500);
162
161
  --internal-font-weight-semibold: var(--font-weight-semibold, 600);
163
162
  --internal-font-weight-bold: var(--font-weight-bold, 700);
164
163
 
165
- --internal-shadow-sm:
166
- var(--shadow-sm, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));
167
- --internal-shadow-base:
168
- var(--shadow-base, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));
169
- --internal-shadow-md:
170
- var(--shadow-md, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1));
171
164
  --internal-shadow-lg:
172
165
  var(--shadow-lg, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1));
173
166
  --internal-shadow-xl:
174
167
  var(--shadow-xl, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1));
168
+ --internal-shadow-edge-light:
169
+ var(--shadow-edge-light, 0 1px oklch(0 0 0 / 4%));
175
170
 
176
171
  --internal-transition-fast: var(--transition-fast, 150ms cubic-bezier(0.4, 0, 0.2, 1));
177
172
  --internal-transition-base: var(--transition-base, 200ms cubic-bezier(0.4, 0, 0.2, 1));
@@ -209,24 +204,30 @@
209
204
  :host([data-theme="dark"]) {
210
205
  /* Dark theme inputs (overridable externally) */
211
206
  --background: transparent;
212
- --foreground: oklch(0.96 0 0);
213
- --card: oklch(0.17 0 0);
214
- --card-foreground: oklch(0.96 0 0);
215
- --popover: oklch(0.17 0 0);
216
- --popover-foreground: oklch(0.96 0 0);
217
- --primary: oklch(0.78 0 0);
218
- --primary-foreground: oklch(0.14 0 0);
219
- --secondary: oklch(0.22 0 0);
220
- --secondary-foreground: oklch(0.96 0 0);
221
- --muted: oklch(0.22 0 0);
222
- --muted-foreground: oklch(0.78 0 0);
223
- --accent: oklch(0.22 0 0);
224
- --accent-foreground: oklch(0.96 0 0);
225
- --destructive: oklch(0.577 0.245 27.325);
226
- --destructive-foreground: oklch(1 0 0);
227
- --border: oklch(0.29 0 0);
228
- --input: oklch(0.29 0 0);
229
- --ring: oklch(0.60 0 0);
207
+ --foreground: oklch(0.967 0.001 286.375);
208
+ --card: color-mix(
209
+ in srgb,
210
+ oklch(0.21 0.006 285.885) 80%,
211
+ oklch(0.141 0.005 285.823)
212
+ );
213
+ --card-foreground: oklch(0.967 0.001 286.375);
214
+ --popover: oklch(0.21 0.006 285.885);
215
+ --popover-foreground: oklch(0.967 0.001 286.375);
216
+ --primary: oklch(0.537 0.1554 255);
217
+ --primary-foreground: oklch(0.985 0 0);
218
+ --secondary: oklch(1 0 0 / 6%);
219
+ --secondary-foreground: oklch(0.967 0.001 286.375);
220
+ --muted: oklch(1 0 0 / 6%);
221
+ --muted-foreground: oklch(0.705 0.015 286.067);
222
+ --accent: oklch(1 0 0 / 6%);
223
+ --accent-foreground: oklch(0.967 0.001 286.375);
224
+ --destructive: oklch(0.637 0.237 25.331);
225
+ --destructive-foreground: oklch(0.704 0.191 22.216);
226
+ --border: oklch(1 0 0 / 12%);
227
+ --input: oklch(1 0 0 / 12%);
228
+ --ring: oklch(0.552 0.016 285.938);
229
+ --success: oklch(0.696 0.17 162.48);
230
+ --warning: oklch(0.769 0.188 70.08);
230
231
  --info: oklch(0.623 0.214 259.815);
231
232
  --info-foreground: oklch(0.707 0.165 254.624);
232
233
  }
@@ -237,77 +238,126 @@
237
238
  width: 100%;
238
239
  }
239
240
 
240
- .unsectioned-admissions {
241
- width: 100%;
241
+ .tickets-heading {
242
+ color: var(--internal-foreground);
243
+ font-size: var(--internal-font-size-lg);
244
+ font-weight: var(--internal-font-weight-semibold);
245
+ margin: 0 0 var(--internal-spacing-md);
242
246
  }
243
247
 
244
- .unsectioned-admissions .ticket-section {
245
- background: var(--card);
246
- border: 1px solid var(--border);
247
- border-radius: var(--radius);
248
- margin: 0 0 var(--spacing-md) 0;
249
- overflow: hidden;
250
- width: 100%;
251
- box-shadow: var(--shadow-sm);
252
- transition: box-shadow var(--transition-base);
248
+ .door-alert,
249
+ .empty-ticketing-state,
250
+ .passcode-form,
251
+ .passcode-form input,
252
+ .ticket-section,
253
+ .more-info-badge,
254
+ .quantity-controls,
255
+ .sold-out-controls,
256
+ .coupon-row,
257
+ .coupon-apply,
258
+ .coupon-remove {
259
+ border: 1px solid var(--internal-input);
260
+ box-shadow: var(--internal-shadow-edge-light);
253
261
  }
254
262
 
255
- .unsectioned-admissions .ticket-section:hover {
256
- box-shadow: var(--shadow-sm);
263
+ .external-ticket-button,
264
+ .checkout-btn {
265
+ display: inline-flex;
266
+ align-items: center;
267
+ justify-content: center;
268
+ background: var(--internal-primary);
269
+ color: var(--internal-primary-foreground);
270
+ border: 1px solid oklch(from var(--internal-primary) calc(l - 0.08) c h);
271
+ border-radius: calc(var(--internal-radius) - 2px);
272
+ cursor: pointer;
273
+ box-shadow: var(--internal-shadow-edge-light);
274
+ transition: all var(--internal-transition-fast);
257
275
  }
258
276
 
259
- /* Make unsectioned admission cards have rounded corners */
260
- .unsectioned-admissions .admission-card {
261
- border-radius: var(--radius);
262
- border: none;
277
+ .external-ticket-button:hover,
278
+ .checkout-btn:hover:not(:disabled) {
279
+ background: oklch(from var(--internal-primary) calc(l - 0.08) c h);
280
+ transform: translateY(-1px);
281
+ }
282
+
283
+ .door-alert,
284
+ .empty-ticketing-state,
285
+ .passcode-form {
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: var(--internal-spacing-sm);
289
+ padding: var(--internal-spacing-lg);
290
+ margin-bottom: var(--internal-spacing-md);
291
+ background: var(--internal-card);
292
+ border-radius: var(--internal-radius);
293
+ }
294
+
295
+ .door-alert {
296
+ background: oklch(from var(--internal-success) l c h / 0.1);
297
+ border-color: oklch(from var(--internal-success) l c h / 0.48);
298
+ }
299
+
300
+ .door-alert strong,
301
+ .empty-ticketing-state strong,
302
+ .passcode-form h2 {
303
+ color: var(--internal-foreground);
304
+ font-size: var(--internal-font-size-base);
305
+ font-weight: var(--internal-font-weight-semibold);
306
+ line-height: 1.3;
307
+ }
308
+
309
+ .door-alert span,
310
+ .empty-ticketing-state span,
311
+ .passcode-form p {
312
+ color: var(--internal-muted-foreground);
313
+ font-size: var(--internal-font-size-sm);
314
+ line-height: 1.5;
263
315
  }
264
316
 
265
- .unsectioned-admissions .admission-card:first-child {
266
- border-top-left-radius: var(--radius);
267
- border-top-right-radius: var(--radius);
317
+ .external-ticket-button {
318
+ width: 100%;
319
+ padding: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs))
320
+ var(--internal-spacing-lg);
321
+ font-size: var(--internal-font-size-base);
322
+ font-weight: var(--internal-font-weight-bold);
323
+ text-decoration: none;
324
+ }
325
+
326
+ .passcode-form input {
327
+ width: 100%;
328
+ min-width: 0;
329
+ padding: calc(var(--internal-spacing-sm) + 0.125rem)
330
+ var(--internal-spacing-sm);
331
+ background: var(--internal-card);
332
+ color: var(--internal-foreground);
333
+ border-radius: calc(var(--internal-radius) - 2px);
334
+ font: inherit;
268
335
  }
269
336
 
270
- .unsectioned-admissions .admission-card:last-child {
271
- border-bottom-left-radius: var(--radius);
272
- border-bottom-right-radius: var(--radius);
337
+ .passcode-form input:disabled {
338
+ opacity: 0.6;
339
+ cursor: not-allowed;
273
340
  }
274
341
 
275
342
  .ticket-section {
276
343
  background: var(--internal-card);
277
- border: 1px solid var(--internal-border);
278
344
  border-radius: var(--internal-radius);
279
345
  margin: 0 0 var(--internal-spacing-lg) 0;
280
346
  overflow: hidden;
281
347
  width: 100%;
282
- box-shadow: var(--internal-shadow-sm);
283
348
  transition: all var(--internal-transition-base);
284
349
  }
285
350
 
286
- .tickets-wrapper > .ticket-section:last-child,
287
- .tickets-wrapper > .unsectioned-admissions:last-child .ticket-section:last-child {
351
+ .tickets-wrapper > .ticket-section:last-child {
288
352
  margin-bottom: 0;
289
353
  }
290
354
 
291
- .ticket-section:focus-within {
292
- box-shadow: var(--internal-shadow-md);
293
- }
294
-
295
- .ticket-section:hover:not(.section-sold-out) {
296
- box-shadow: var(--internal-shadow-md);
297
- }
298
-
299
355
  .ticket-section.section-sold-out {
300
- opacity: 1;
301
- background: var(--card);
302
- box-shadow: none;
303
356
  position: relative;
304
- border-color: var(--border);
305
- overflow: hidden;
306
357
  }
307
358
 
308
359
  .ticket-section.section-sold-out .section-header {
309
- background: transparent;
310
- padding-bottom: var(--spacing-md);
360
+ padding-bottom: var(--internal-spacing-md);
311
361
  }
312
362
 
313
363
  .ticket-section.section-sold-out .section-name,
@@ -323,7 +373,7 @@
323
373
  }
324
374
 
325
375
  .ticket-section.section-sold-out .admission-card {
326
- background: var(--card);
376
+ background: var(--internal-card);
327
377
  }
328
378
 
329
379
  .ticket-section.section-sold-out .quantity-controls,
@@ -348,33 +398,26 @@
348
398
  gap: var(--internal-spacing-sm);
349
399
  }
350
400
 
351
- .section-time {
401
+ .section-time,
402
+ .section-venue {
352
403
  color: var(--internal-muted-foreground);
353
404
  font-size: var(--internal-font-size-sm);
354
- margin-bottom: var(--internal-spacing-xs);
355
405
  display: flex;
356
406
  align-items: center;
357
407
  gap: var(--internal-spacing-xs);
358
408
  }
359
409
 
360
- .section-time svg {
361
- width: calc(var(--spacing-sm) + var(--spacing-xs));
362
- height: calc(var(--spacing-sm) + var(--spacing-xs));
363
- flex-shrink: 0;
364
- opacity: 0.8;
365
- }
366
-
367
- .section-venue {
368
- color: var(--muted-foreground);
369
- font-size: var(--font-size-sm);
370
- display: flex;
371
- align-items: center;
372
- gap: var(--spacing-xs);
410
+ .section-time,
411
+ .admission-time {
412
+ margin-bottom: var(--internal-spacing-xs);
373
413
  }
374
414
 
375
- .section-venue svg {
376
- width: calc(var(--spacing-sm) + var(--spacing-xs));
377
- height: calc(var(--spacing-sm) + var(--spacing-xs));
415
+ .section-time svg,
416
+ .section-venue svg,
417
+ .admission-time svg,
418
+ .admission-venue svg {
419
+ width: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs));
420
+ height: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs));
378
421
  flex-shrink: 0;
379
422
  opacity: 0.8;
380
423
  }
@@ -398,18 +441,15 @@
398
441
  z-index: 1;
399
442
  }
400
443
 
401
- .admission-card:hover:not(.sold-out) {
402
- background: oklch(from var(--internal-card) calc(l - 0.02) c h);
444
+ .admission-card.sold-out {
445
+ background: var(--internal-card);
403
446
  }
404
447
 
405
- .admission-card.sold-out {
406
- opacity: 1;
407
- background: var(--card);
408
- position: relative;
448
+ .admission-card.unavailable {
449
+ opacity: 0.72;
409
450
  }
410
451
 
411
- .admission-card.sold-out .admission-price,
412
- .admission-card.sold-out .admission-fee {
452
+ .admission-card.sold-out .admission-price {
413
453
  opacity: 0.5;
414
454
  }
415
455
 
@@ -465,7 +505,6 @@
465
505
  padding: calc(var(--internal-spacing-xs) * 1.5) var(--internal-spacing-sm);
466
506
  background: oklch(from var(--internal-info) l c h / 0.08);
467
507
  color: var(--internal-info-foreground);
468
- border: none;
469
508
  border-radius: calc(var(--internal-radius) - 2px);
470
509
  font-size: var(--internal-font-size-xs);
471
510
  font-weight: var(--internal-font-weight-medium);
@@ -488,36 +527,17 @@
488
527
  flex-shrink: 0;
489
528
  }
490
529
 
491
- .admission-time {
492
- color: var(--muted-foreground);
493
- font-size: var(--font-size-sm);
494
- margin-bottom: var(--spacing-xs);
495
- display: flex;
496
- align-items: center;
497
- gap: var(--spacing-xs);
498
- }
499
-
500
- .admission-time svg {
501
- width: calc(var(--spacing-sm) + var(--spacing-xs));
502
- height: calc(var(--spacing-sm) + var(--spacing-xs));
503
- flex-shrink: 0;
504
- opacity: 0.8;
505
- }
506
-
530
+ .admission-time,
507
531
  .admission-venue {
508
- color: var(--muted-foreground);
509
- font-size: var(--font-size-sm);
510
- margin-bottom: var(--spacing-sm);
532
+ color: var(--internal-muted-foreground);
533
+ font-size: var(--internal-font-size-sm);
511
534
  display: flex;
512
535
  align-items: center;
513
- gap: var(--spacing-xs);
536
+ gap: var(--internal-spacing-xs);
514
537
  }
515
538
 
516
- .admission-venue svg {
517
- width: calc(var(--spacing-sm) + var(--spacing-xs));
518
- height: calc(var(--spacing-sm) + var(--spacing-xs));
519
- flex-shrink: 0;
520
- opacity: 0.8;
539
+ .admission-venue {
540
+ margin-bottom: var(--internal-spacing-sm);
521
541
  }
522
542
 
523
543
  /* Solo admission layout adjustments */
@@ -531,10 +551,10 @@
531
551
  }
532
552
 
533
553
  .solo-admission .admission-price-info {
534
- margin-top: var(--spacing-md);
554
+ margin-top: var(--internal-spacing-md);
535
555
  display: flex;
536
556
  justify-content: space-between;
537
- align-items: flex-start;
557
+ align-items: center;
538
558
  width: 100%;
539
559
  }
540
560
 
@@ -549,10 +569,10 @@
549
569
  justify-content: center;
550
570
  padding: 0;
551
571
  background: transparent;
552
- color: var(--muted-foreground);
572
+ color: var(--internal-muted-foreground);
553
573
  border: none;
554
- font-size: var(--font-size-sm);
555
- font-weight: var(--font-weight-medium);
574
+ font-size: var(--internal-font-size-sm);
575
+ font-weight: var(--internal-font-weight-medium);
556
576
  text-transform: uppercase;
557
577
  letter-spacing: 0.05em;
558
578
  margin-left: auto;
@@ -563,8 +583,8 @@
563
583
  display: flex;
564
584
  align-items: center;
565
585
  justify-content: space-between;
566
- gap: var(--spacing-sm);
567
- margin-bottom: var(--spacing-sm);
586
+ gap: var(--internal-spacing-sm);
587
+ margin-bottom: var(--internal-spacing-sm);
568
588
  width: 100%;
569
589
  }
570
590
 
@@ -574,40 +594,53 @@
574
594
  }
575
595
 
576
596
  .admission-price {
577
- color: var(--internal-primary);
597
+ color: var(--internal-foreground);
578
598
  font-size: var(--internal-font-size-xl);
579
599
  font-weight: var(--internal-font-weight-bold);
580
600
  letter-spacing: -0.025em;
581
601
  line-height: 1.1;
582
602
  }
583
603
 
584
- .admission-fee {
585
- color: var(--muted-foreground);
586
- font-size: var(--font-size-xs);
587
- background: transparent;
588
- padding: 0;
589
- border-radius: 0;
590
- font-weight: var(--font-weight-normal);
591
- display: block;
592
- margin-top: 0.125rem; /* slight separation from price */
593
- line-height: 1.12; /* tiny increase for readability */
604
+ .admission-price-row {
605
+ display: flex;
606
+ flex-wrap: wrap;
607
+ align-items: baseline;
608
+ gap: var(--internal-spacing-sm);
609
+ }
610
+
611
+ .admission-price-original {
612
+ color: var(--internal-muted-foreground);
613
+ font-size: var(--internal-font-size-base);
614
+ text-decoration: line-through;
615
+ }
616
+
617
+ .admission-savings,
618
+ .admission-availability {
619
+ font-size: var(--internal-font-size-xs);
620
+ font-weight: var(--internal-font-weight-medium);
621
+ line-height: 1.35;
622
+ margin-top: var(--internal-spacing-xs);
594
623
  }
595
624
 
596
625
  .admission-savings {
597
- color: var(--success);
598
- font-size: var(--font-size-sm);
599
- font-weight: var(--font-weight-medium);
626
+ color: var(--internal-success);
600
627
  }
601
628
 
602
629
  .admission-availability {
603
- color: var(--warning);
604
- font-size: var(--font-size-xs);
605
- font-weight: var(--font-weight-medium);
606
- background: oklch(from var(--warning) l c h / 0.1);
607
- padding: calc(var(--spacing-xs) / 2) calc(var(--spacing-xs) * 2);
608
- border-radius: calc(var(--radius) - 4px);
609
- display: inline-block;
610
- margin-top: var(--spacing-xs);
630
+ color: var(--internal-warning);
631
+ }
632
+
633
+ .admission-sale-label {
634
+ display: block;
635
+ margin-top: var(--internal-spacing-xs);
636
+ color: var(--internal-muted-foreground);
637
+ font-size: var(--internal-font-size-sm);
638
+ font-weight: var(--internal-font-weight-medium);
639
+ line-height: 1.35;
640
+ }
641
+
642
+ .admission-sale-label.success {
643
+ color: var(--internal-success);
611
644
  }
612
645
 
613
646
  /* Quantity Controls - Modern, minimal design */
@@ -616,10 +649,8 @@
616
649
  align-items: center;
617
650
  gap: 0;
618
651
  background: var(--internal-secondary);
619
- border: 1px solid var(--internal-border);
620
652
  border-radius: calc(var(--internal-radius) - 2px);
621
653
  overflow: hidden;
622
- box-shadow: none;
623
654
  transition: all var(--internal-transition-fast);
624
655
  }
625
656
 
@@ -660,18 +691,22 @@
660
691
  background: var(--internal-secondary);
661
692
  color: var(--internal-muted-foreground);
662
693
  border-color: var(--internal-border);
663
- box-shadow: none;
664
694
  }
665
695
 
666
696
  .quantity-btn.decrease {
667
- border-right: 1px solid var(--internal-border);
697
+ border-right: 1px solid var(--internal-input);
668
698
  }
669
699
 
670
700
  .quantity-btn.increase {
671
- border-left: 1px solid var(--internal-border);
701
+ border-left: 1px solid var(--internal-input);
672
702
  }
673
703
 
674
704
  .quantity-value {
705
+ appearance: textfield;
706
+ width: 2.75rem;
707
+ height: calc(var(--internal-spacing-lg) * 1.5);
708
+ border: none;
709
+ background: transparent;
675
710
  min-width: 2.5rem;
676
711
  text-align: center;
677
712
  font-size: var(--internal-font-size-sm);
@@ -680,148 +715,137 @@
680
715
  padding: 0 var(--internal-spacing-xs);
681
716
  }
682
717
 
718
+ .quantity-value::-webkit-inner-spin-button,
719
+ .quantity-value::-webkit-outer-spin-button {
720
+ appearance: none;
721
+ margin: 0;
722
+ }
723
+
724
+ .quantity-value:disabled {
725
+ opacity: 0.6;
726
+ cursor: not-allowed;
727
+ }
728
+
683
729
  /* Sold Out Controls */
684
730
  .sold-out-controls {
685
731
  display: inline-flex;
686
732
  align-items: center;
687
733
  justify-content: center;
688
- min-width: calc(var(--spacing-lg) * 1.5 * 2 + 2.5rem);
689
- height: calc(var(--spacing-lg) * 1.5);
690
- padding: 0 var(--spacing-md);
691
- background: var(--muted);
692
- color: var(--muted-foreground);
693
- border: 1px solid var(--border);
694
- border-radius: calc(var(--radius) - 2px);
695
- font-size: var(--font-size-xs);
696
- font-weight: var(--font-weight-medium);
697
- letter-spacing: 0.025em;
698
- text-transform: uppercase;
734
+ min-width: calc(var(--internal-spacing-lg) * 1.5 * 2 + 2.5rem);
735
+ height: calc(var(--internal-spacing-lg) * 1.5);
736
+ padding: 0 var(--internal-spacing-md);
737
+ background: var(--internal-muted);
738
+ border-radius: calc(var(--internal-radius) - 2px);
699
739
  }
700
740
 
741
+ .sold-out-controls,
701
742
  .sold-out-text {
702
- color: var(--muted-foreground);
703
- font-size: var(--font-size-xs);
704
- font-weight: var(--font-weight-medium);
743
+ color: var(--internal-muted-foreground);
744
+ font-size: var(--internal-font-size-xs);
745
+ font-weight: var(--internal-font-weight-medium);
705
746
  letter-spacing: 0.025em;
706
747
  text-transform: uppercase;
707
748
  }
708
749
 
709
- /* Order Summary */
710
- .order-summary {
711
- background: var(--internal-card);
712
- border: 1px solid var(--internal-border);
713
- border-radius: var(--internal-radius);
714
- padding: var(--internal-spacing-lg);
750
+ .checkout-actions {
715
751
  margin: var(--internal-spacing-lg) 0 0 0;
716
- box-shadow: var(--internal-shadow-lg);
717
752
  width: 100%;
718
753
  }
719
754
 
720
- .summary-title {
721
- font-size: var(--internal-font-size-lg);
722
- font-weight: var(--internal-font-weight-semibold);
755
+ .coupon-panel {
723
756
  margin-bottom: var(--internal-spacing-md);
724
- color: var(--internal-foreground);
725
- letter-spacing: -0.025em;
726
757
  }
727
758
 
728
- .order-item {
759
+ .coupon-row {
760
+ position: relative;
729
761
  display: flex;
730
- justify-content: space-between;
731
- margin-bottom: var(--internal-spacing-sm);
732
- font-size: var(--internal-font-size-base);
733
- color: var(--internal-foreground);
762
+ align-items: center;
763
+ width: 100%;
764
+ min-width: 0;
765
+ overflow: hidden;
766
+ background: var(--internal-background);
767
+ background-clip: padding-box;
768
+ border-radius: var(--internal-radius);
769
+ transition: border-color var(--internal-transition-fast);
734
770
  }
735
771
 
736
- .order-item-with-section {
737
- margin-bottom: var(--internal-spacing-sm);
772
+ .coupon-row:focus-within {
773
+ border-color: var(--internal-ring);
738
774
  }
739
775
 
740
- .item-section-line {
741
- display: flex;
742
- justify-content: space-between;
743
- align-items: baseline;
744
- font-size: var(--internal-font-size-base);
745
- color: var(--internal-foreground);
776
+ .coupon-row:has(input[aria-invalid="true"]) {
777
+ border-color: var(--internal-destructive);
746
778
  }
747
779
 
748
- .item-section-name {
749
- flex: 1;
750
- font-weight: var(--font-weight-medium);
780
+ .coupon-row:has(input:disabled) {
781
+ opacity: 0.64;
751
782
  }
752
783
 
753
- .item-admission-name {
784
+ .coupon-row input {
785
+ width: 100%;
786
+ min-width: 0;
787
+ padding: calc(var(--internal-spacing-sm) - 1px)
788
+ calc(var(--internal-spacing-xl) * 2.75)
789
+ calc(var(--internal-spacing-sm) - 1px)
790
+ calc(var(--internal-spacing-md) - 1px);
791
+ background: var(--internal-card);
792
+ color: var(--internal-foreground);
793
+ border: none;
794
+ border-radius: inherit;
795
+ font: inherit;
754
796
  font-size: var(--internal-font-size-sm);
755
- color: var(--internal-muted-foreground);
756
- margin-top: var(--internal-spacing-xs);
757
- padding-left: var(--internal-spacing-md);
758
- font-weight: var(--internal-font-weight-normal);
759
- }
760
-
761
- .item-description {
762
- flex: 1;
763
- font-weight: var(--internal-font-weight-medium);
797
+ line-height: 1.25rem;
798
+ outline: none;
764
799
  }
765
800
 
766
- .item-price {
767
- font-weight: var(--internal-font-weight-bold);
768
- white-space: nowrap;
801
+ .coupon-row input::placeholder {
802
+ color: oklch(from var(--internal-muted-foreground) l c h / 0.64);
769
803
  }
770
804
 
771
- .empty-cart-message {
772
- display: flex;
773
- justify-content: space-between;
774
- align-items: center;
775
- padding-bottom: var(--internal-spacing-sm);
776
- color: var(--internal-muted-foreground);
777
- font-size: var(--internal-font-size-base);
778
- font-style: normal;
779
- }
780
-
781
- .empty-cart-text {
782
- flex: 1;
805
+ .coupon-row input:disabled {
806
+ cursor: not-allowed;
783
807
  }
784
808
 
785
- .empty-cart-price {
786
- font-weight: var(--font-weight-medium);
809
+ .coupon-apply,
810
+ .coupon-remove {
811
+ position: absolute;
812
+ right: calc((var(--internal-spacing-xs) * 1.5) - 3px);
813
+ top: 50%;
814
+ transform: translateY(-50%);
815
+ padding: calc(var(--internal-spacing-xs) * 1.25) var(--internal-spacing-sm);
816
+ background: var(--internal-secondary);
817
+ color: var(--internal-foreground);
818
+ border-radius: calc(var(--internal-radius) - 2px);
819
+ font-size: var(--internal-font-size-sm);
820
+ font-weight: var(--internal-font-weight-medium);
821
+ cursor: pointer;
822
+ transition: all var(--internal-transition-fast);
787
823
  }
788
824
 
789
- .order-fees {
790
- padding: var(--internal-spacing-sm) 0;
791
- border-top: 1px solid var(--internal-border);
792
- border-bottom: 1px solid var(--internal-border);
793
- margin-bottom: var(--internal-spacing-sm);
825
+ .coupon-apply:hover:not(:disabled),
826
+ .coupon-remove:hover:not(:disabled) {
827
+ background: oklch(from var(--internal-accent) l c h / 0.8);
794
828
  }
795
829
 
796
- .fee-row {
797
- display: flex;
798
- justify-content: space-between;
799
- font-size: var(--internal-font-size-base);
800
- color: var(--internal-foreground);
801
- font-weight: var(--internal-font-weight-medium);
830
+ .coupon-apply:focus-visible,
831
+ .coupon-remove:focus-visible {
832
+ outline: 2px solid var(--internal-ring);
833
+ outline-offset: -1px;
802
834
  }
803
835
 
804
- .order-total {
805
- display: flex;
806
- justify-content: space-between;
807
- font-size: var(--internal-font-size-base);
808
- font-weight: var(--internal-font-weight-bold);
809
- color: var(--internal-foreground);
810
- margin-bottom: var(--internal-spacing-md);
836
+ .coupon-apply:disabled,
837
+ .coupon-remove:disabled {
838
+ opacity: 0.6;
839
+ cursor: not-allowed;
811
840
  }
812
841
 
813
842
  .checkout-btn {
814
843
  width: 100%;
815
- padding: calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);
816
- background: var(--primary);
817
- color: var(--primary-foreground);
818
- border: none;
819
- border-radius: calc(var(--radius) - 2px);
844
+ padding: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs))
845
+ var(--internal-spacing-lg);
820
846
  font-size: var(--internal-font-size-base);
821
847
  font-weight: var(--internal-font-weight-bold);
822
- cursor: pointer;
823
- transition: all var(--internal-transition-fast);
824
- box-shadow: var(--internal-shadow-sm);
848
+ line-height: 1.25;
825
849
  position: relative;
826
850
  overflow: hidden;
827
851
  }
@@ -831,115 +855,153 @@
831
855
  outline-offset: 2px;
832
856
  }
833
857
 
834
- .checkout-btn:hover:not(:disabled) {
835
- background: oklch(from var(--primary) calc(l - 0.08) c h);
836
- box-shadow: var(--shadow-md);
837
- transform: translateY(-1px);
838
- }
839
-
840
858
  .checkout-btn:active:not(:disabled) {
841
859
  transform: translateY(0);
842
- box-shadow: var(--shadow-sm);
843
860
  }
844
861
 
845
862
  .checkout-btn:disabled {
846
- opacity: 0.6;
863
+ opacity: 0.5;
847
864
  cursor: not-allowed;
848
- background: var(--internal-secondary);
849
- color: var(--internal-muted-foreground);
850
- box-shadow: none;
851
- border: 1px solid var(--internal-border);
865
+ }
866
+
867
+ .checkout-spinner-wrapper {
868
+ display: inline-flex;
869
+ align-items: center;
870
+ justify-content: center;
871
+ height: 1.25em;
872
+ vertical-align: middle;
873
+ }
874
+
875
+ .checkout-spinner {
876
+ width: 1.125em;
877
+ height: 1.125em;
878
+ animation: checkout-spinner 0.8s linear infinite;
879
+ }
880
+
881
+ @keyframes checkout-spinner {
882
+ to {
883
+ transform: rotate(360deg);
884
+ }
885
+ }
886
+
887
+ .sticky-checkout-bar {
888
+ position: fixed;
889
+ right: 0;
890
+ bottom: 0;
891
+ left: 0;
892
+ z-index: 40;
893
+ display: none;
894
+ padding: var(--internal-spacing-md);
895
+ background: var(--internal-card);
896
+ border-top: 1px solid var(--internal-border);
897
+ box-shadow: var(--internal-shadow-lg);
898
+ }
899
+
900
+ .sticky-checkout-btn.selection-prompt {
901
+ animation: selection-prompt-shake 400ms ease-in-out;
902
+ }
903
+
904
+ @keyframes selection-prompt-shake {
905
+ 0%,
906
+ 100% {
907
+ transform: translateX(0);
908
+ }
909
+ 25% {
910
+ transform: translateX(-4px);
911
+ }
912
+ 75% {
913
+ transform: translateX(4px);
914
+ }
852
915
  }
853
916
 
854
917
  /* Loading & Error States */
855
- .loading-state,
856
- .error-state {
918
+ .loading-state {
857
919
  display: flex;
858
920
  justify-content: center;
859
921
  align-items: center;
860
- padding: var(--spacing-xl);
922
+ padding: var(--internal-spacing-xl);
861
923
  text-align: center;
862
924
  min-height: 200px;
863
925
  }
864
926
 
865
- .error-state {
866
- color: var(--primary);
867
- }
868
-
869
927
  .error-banner {
870
928
  background: oklch(
871
- from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
929
+ from var(--internal-destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
872
930
  );
873
- border: 1px solid oklch(from var(--destructive) l c h / 0.2);
874
- border-radius: var(--radius);
875
- padding: var(--spacing-lg);
876
- margin: var(--spacing-lg);
931
+ border: 1px solid oklch(from var(--internal-destructive) l c h / 0.2);
932
+ border-radius: var(--internal-radius);
933
+ padding: var(--internal-spacing-lg);
934
+ margin: var(--internal-spacing-lg);
877
935
  text-align: center;
878
936
  }
879
937
 
880
938
  .error-banner strong {
881
939
  display: block;
882
- color: var(--destructive);
883
- font-size: var(--font-size-lg);
884
- margin-bottom: var(--spacing-sm);
940
+ color: var(--internal-destructive);
941
+ font-size: var(--internal-font-size-lg);
942
+ margin-bottom: var(--internal-spacing-sm);
885
943
  }
886
944
 
887
945
  .error-banner p {
888
- color: var(--muted-foreground);
889
- margin-bottom: var(--spacing-md);
946
+ color: var(--internal-muted-foreground);
947
+ margin-bottom: var(--internal-spacing-md);
890
948
  }
891
949
 
892
950
  .retry-button {
893
- background: var(--primary);
894
- color: var(--primary-foreground);
895
- border: none;
896
- padding: calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);
897
- border-radius: calc(var(--radius) - 2px);
898
- font-size: var(--font-size-sm);
899
- font-weight: var(--font-weight-medium);
951
+ background: var(--internal-primary);
952
+ color: var(--internal-primary-foreground);
953
+ border: 1px solid oklch(from var(--internal-primary) calc(l - 0.08) c h);
954
+ padding: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs))
955
+ var(--internal-spacing-lg);
956
+ border-radius: calc(var(--internal-radius) - 2px);
957
+ font-size: var(--internal-font-size-sm);
958
+ font-weight: var(--internal-font-weight-medium);
900
959
  cursor: pointer;
901
- transition: all var(--transition-fast);
902
- box-shadow: var(--shadow-sm);
960
+ transition: all var(--internal-transition-fast);
961
+ box-shadow: var(--internal-shadow-edge-light);
903
962
  }
904
963
 
905
964
  .retry-button:focus-visible {
906
- outline: 2px solid var(--ring);
965
+ outline: 2px solid var(--internal-ring);
907
966
  outline-offset: 2px;
908
967
  }
909
968
 
910
969
  .retry-button:hover {
911
- background: oklch(from var(--primary) calc(l - 0.08) c h);
912
- box-shadow: var(--shadow-md);
970
+ background: oklch(from var(--internal-primary) calc(l - 0.08) c h);
913
971
  transform: translateY(-1px);
914
972
  }
915
973
 
916
974
  .retry-button:active {
917
975
  transform: translateY(0);
918
- box-shadow: var(--shadow-sm);
919
976
  }
920
977
 
921
978
  .error-message {
922
979
  background: oklch(
923
- from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
980
+ from var(--internal-destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
924
981
  );
925
- border: 1px solid oklch(from var(--destructive) l c h / 0.2);
926
- color: var(--destructive);
927
- padding: var(--spacing-sm) var(--spacing-md);
928
- border-radius: var(--radius);
929
- margin-bottom: var(--spacing-md);
930
- font-size: var(--font-size-sm);
982
+ border: 1px solid oklch(from var(--internal-destructive) l c h / 0.2);
983
+ color: var(--internal-destructive);
984
+ padding: var(--internal-spacing-sm) var(--internal-spacing-md);
985
+ border-radius: var(--internal-radius);
986
+ margin-bottom: var(--internal-spacing-md);
987
+ font-size: var(--internal-font-size-sm);
931
988
  }
932
989
 
933
990
  /* Responsive adjustments for larger screens */
934
991
  @media (min-width: 768px) {
935
992
  .ticket-section {
936
- border-radius: var(--radius);
937
- margin: 0 0 var(--spacing-md) 0;
993
+ border-radius: var(--internal-radius);
994
+ margin: 0 0 var(--internal-spacing-md) 0;
995
+ }
996
+ }
997
+
998
+ @media (max-width: 767px) {
999
+ :host([data-sticky-checkout="true"]) .session-services-ticketing-container {
1000
+ padding-bottom: calc(var(--internal-spacing-xl) * 3);
938
1001
  }
939
1002
 
940
- .order-summary {
941
- border-radius: var(--radius);
942
- margin: var(--spacing-md) 0;
1003
+ .sticky-checkout-bar {
1004
+ display: block;
943
1005
  }
944
1006
  }
945
1007