@session-services/web-elements 0.1.20 → 0.1.22

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 +24370 -19296
  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 +429 -340
  8. package/dist/collection/components/session-services-ticketing/session-services-ticketing.js +1090 -269
  9. package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.js +270 -0
  10. package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.test.js +368 -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 +24458 -19366
  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 +24378 -19304
  19. package/dist/session-services-elements/{p-a2404c46.entry.js → p-703444ed.entry.js} +1 -1
  20. package/dist/session-services-elements/p-94173d1b.entry.js +1 -0
  21. package/dist/session-services-elements/p-CNOpF6tk.js +2 -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 +196 -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-3bb6ceef.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));
@@ -189,7 +184,13 @@
189
184
  padding: 0;
190
185
  }
191
186
 
192
- /* Remove default focus outline and add focus-visible styles */
187
+ button,
188
+ input,
189
+ select,
190
+ textarea {
191
+ font: inherit;
192
+ }
193
+
193
194
  *:focus {
194
195
  outline: none;
195
196
  }
@@ -209,24 +210,30 @@
209
210
  :host([data-theme="dark"]) {
210
211
  /* Dark theme inputs (overridable externally) */
211
212
  --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);
213
+ --foreground: oklch(0.967 0.001 286.375);
214
+ --card: color-mix(
215
+ in srgb,
216
+ oklch(0.21 0.006 285.885) 80%,
217
+ oklch(0.141 0.005 285.823)
218
+ );
219
+ --card-foreground: oklch(0.967 0.001 286.375);
220
+ --popover: oklch(0.21 0.006 285.885);
221
+ --popover-foreground: oklch(0.967 0.001 286.375);
222
+ --primary: oklch(0.537 0.1554 255);
223
+ --primary-foreground: oklch(0.985 0 0);
224
+ --secondary: oklch(1 0 0 / 6%);
225
+ --secondary-foreground: oklch(0.967 0.001 286.375);
226
+ --muted: oklch(1 0 0 / 6%);
227
+ --muted-foreground: oklch(0.705 0.015 286.067);
228
+ --accent: oklch(1 0 0 / 6%);
229
+ --accent-foreground: oklch(0.967 0.001 286.375);
230
+ --destructive: oklch(0.637 0.237 25.331);
231
+ --destructive-foreground: oklch(0.704 0.191 22.216);
232
+ --border: oklch(1 0 0 / 12%);
233
+ --input: oklch(1 0 0 / 12%);
234
+ --ring: oklch(0.552 0.016 285.938);
235
+ --success: oklch(0.696 0.17 162.48);
236
+ --warning: oklch(0.769 0.188 70.08);
230
237
  --info: oklch(0.623 0.214 259.815);
231
238
  --info-foreground: oklch(0.707 0.165 254.624);
232
239
  }
@@ -237,77 +244,126 @@
237
244
  width: 100%;
238
245
  }
239
246
 
240
- .unsectioned-admissions {
241
- width: 100%;
247
+ .tickets-heading {
248
+ color: var(--internal-foreground);
249
+ font-size: var(--internal-font-size-lg);
250
+ font-weight: var(--internal-font-weight-semibold);
251
+ margin: 0 0 var(--internal-spacing-md);
242
252
  }
243
253
 
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);
254
+ .door-alert,
255
+ .empty-ticketing-state,
256
+ .passcode-form,
257
+ .passcode-form input,
258
+ .ticket-section,
259
+ .more-info-badge,
260
+ .quantity-controls,
261
+ .sold-out-controls,
262
+ .coupon-row,
263
+ .coupon-apply,
264
+ .coupon-remove {
265
+ border: 1px solid var(--internal-input);
266
+ box-shadow: var(--internal-shadow-edge-light);
253
267
  }
254
268
 
255
- .unsectioned-admissions .ticket-section:hover {
256
- box-shadow: var(--shadow-sm);
269
+ .external-ticket-button,
270
+ .checkout-btn {
271
+ display: inline-flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ background: var(--internal-primary);
275
+ color: var(--internal-primary-foreground);
276
+ border: 1px solid oklch(from var(--internal-primary) calc(l - 0.08) c h);
277
+ border-radius: calc(var(--internal-radius) - 2px);
278
+ cursor: pointer;
279
+ box-shadow: var(--internal-shadow-edge-light);
280
+ transition: all var(--internal-transition-fast);
257
281
  }
258
282
 
259
- /* Make unsectioned admission cards have rounded corners */
260
- .unsectioned-admissions .admission-card {
261
- border-radius: var(--radius);
262
- border: none;
283
+ .external-ticket-button:hover,
284
+ .checkout-btn:hover:not(:disabled) {
285
+ background: oklch(from var(--internal-primary) calc(l - 0.08) c h);
286
+ transform: translateY(-1px);
263
287
  }
264
288
 
265
- .unsectioned-admissions .admission-card:first-child {
266
- border-top-left-radius: var(--radius);
267
- border-top-right-radius: var(--radius);
289
+ .door-alert,
290
+ .empty-ticketing-state,
291
+ .passcode-form {
292
+ display: flex;
293
+ flex-direction: column;
294
+ gap: var(--internal-spacing-sm);
295
+ padding: var(--internal-spacing-lg);
296
+ margin-bottom: var(--internal-spacing-md);
297
+ background: var(--internal-card);
298
+ border-radius: var(--internal-radius);
268
299
  }
269
300
 
270
- .unsectioned-admissions .admission-card:last-child {
271
- border-bottom-left-radius: var(--radius);
272
- border-bottom-right-radius: var(--radius);
301
+ .door-alert {
302
+ background: oklch(from var(--internal-success) l c h / 0.1);
303
+ border-color: oklch(from var(--internal-success) l c h / 0.48);
304
+ }
305
+
306
+ .door-alert strong,
307
+ .empty-ticketing-state strong,
308
+ .passcode-form h2 {
309
+ color: var(--internal-foreground);
310
+ font-size: var(--internal-font-size-base);
311
+ font-weight: var(--internal-font-weight-semibold);
312
+ line-height: 1.3;
313
+ }
314
+
315
+ .door-alert span,
316
+ .empty-ticketing-state span,
317
+ .passcode-form p {
318
+ color: var(--internal-muted-foreground);
319
+ font-size: var(--internal-font-size-sm);
320
+ line-height: 1.5;
321
+ }
322
+
323
+ .external-ticket-button {
324
+ width: 100%;
325
+ padding: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs))
326
+ var(--internal-spacing-lg);
327
+ font-size: var(--internal-font-size-base);
328
+ font-weight: var(--internal-font-weight-bold);
329
+ text-decoration: none;
330
+ }
331
+
332
+ .passcode-form input {
333
+ width: 100%;
334
+ min-width: 0;
335
+ padding: calc(var(--internal-spacing-sm) + 0.125rem)
336
+ var(--internal-spacing-sm);
337
+ background: var(--internal-card);
338
+ color: var(--internal-foreground);
339
+ border-radius: calc(var(--internal-radius) - 2px);
340
+ font: inherit;
341
+ }
342
+
343
+ .passcode-form input:disabled {
344
+ opacity: 0.6;
345
+ cursor: not-allowed;
273
346
  }
274
347
 
275
348
  .ticket-section {
276
349
  background: var(--internal-card);
277
- border: 1px solid var(--internal-border);
278
350
  border-radius: var(--internal-radius);
279
351
  margin: 0 0 var(--internal-spacing-lg) 0;
280
352
  overflow: hidden;
281
353
  width: 100%;
282
- box-shadow: var(--internal-shadow-sm);
283
354
  transition: all var(--internal-transition-base);
284
355
  }
285
356
 
286
- .tickets-wrapper > .ticket-section:last-child,
287
- .tickets-wrapper > .unsectioned-admissions:last-child .ticket-section:last-child {
357
+ .tickets-wrapper > .ticket-section:last-child {
288
358
  margin-bottom: 0;
289
359
  }
290
360
 
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
361
  .ticket-section.section-sold-out {
300
- opacity: 1;
301
- background: var(--card);
302
- box-shadow: none;
303
362
  position: relative;
304
- border-color: var(--border);
305
- overflow: hidden;
306
363
  }
307
364
 
308
365
  .ticket-section.section-sold-out .section-header {
309
- background: transparent;
310
- padding-bottom: var(--spacing-md);
366
+ padding-bottom: var(--internal-spacing-md);
311
367
  }
312
368
 
313
369
  .ticket-section.section-sold-out .section-name,
@@ -323,7 +379,7 @@
323
379
  }
324
380
 
325
381
  .ticket-section.section-sold-out .admission-card {
326
- background: var(--card);
382
+ background: var(--internal-card);
327
383
  }
328
384
 
329
385
  .ticket-section.section-sold-out .quantity-controls,
@@ -348,33 +404,26 @@
348
404
  gap: var(--internal-spacing-sm);
349
405
  }
350
406
 
351
- .section-time {
407
+ .section-time,
408
+ .section-venue {
352
409
  color: var(--internal-muted-foreground);
353
410
  font-size: var(--internal-font-size-sm);
354
- margin-bottom: var(--internal-spacing-xs);
355
411
  display: flex;
356
412
  align-items: center;
357
413
  gap: var(--internal-spacing-xs);
358
414
  }
359
415
 
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);
416
+ .section-time,
417
+ .admission-time {
418
+ margin-bottom: var(--internal-spacing-xs);
373
419
  }
374
420
 
375
- .section-venue svg {
376
- width: calc(var(--spacing-sm) + var(--spacing-xs));
377
- height: calc(var(--spacing-sm) + var(--spacing-xs));
421
+ .section-time svg,
422
+ .section-venue svg,
423
+ .admission-time svg,
424
+ .admission-venue svg {
425
+ width: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs));
426
+ height: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs));
378
427
  flex-shrink: 0;
379
428
  opacity: 0.8;
380
429
  }
@@ -398,18 +447,15 @@
398
447
  z-index: 1;
399
448
  }
400
449
 
401
- .admission-card:hover:not(.sold-out) {
402
- background: oklch(from var(--internal-card) calc(l - 0.02) c h);
450
+ .admission-card.sold-out {
451
+ background: var(--internal-card);
403
452
  }
404
453
 
405
- .admission-card.sold-out {
406
- opacity: 1;
407
- background: var(--card);
408
- position: relative;
454
+ .admission-card.unavailable {
455
+ opacity: 0.72;
409
456
  }
410
457
 
411
- .admission-card.sold-out .admission-price,
412
- .admission-card.sold-out .admission-fee {
458
+ .admission-card.sold-out .admission-price {
413
459
  opacity: 0.5;
414
460
  }
415
461
 
@@ -465,7 +511,6 @@
465
511
  padding: calc(var(--internal-spacing-xs) * 1.5) var(--internal-spacing-sm);
466
512
  background: oklch(from var(--internal-info) l c h / 0.08);
467
513
  color: var(--internal-info-foreground);
468
- border: none;
469
514
  border-radius: calc(var(--internal-radius) - 2px);
470
515
  font-size: var(--internal-font-size-xs);
471
516
  font-weight: var(--internal-font-weight-medium);
@@ -488,36 +533,17 @@
488
533
  flex-shrink: 0;
489
534
  }
490
535
 
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
-
536
+ .admission-time,
507
537
  .admission-venue {
508
- color: var(--muted-foreground);
509
- font-size: var(--font-size-sm);
510
- margin-bottom: var(--spacing-sm);
538
+ color: var(--internal-muted-foreground);
539
+ font-size: var(--internal-font-size-sm);
511
540
  display: flex;
512
541
  align-items: center;
513
- gap: var(--spacing-xs);
542
+ gap: var(--internal-spacing-xs);
514
543
  }
515
544
 
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;
545
+ .admission-venue {
546
+ margin-bottom: var(--internal-spacing-sm);
521
547
  }
522
548
 
523
549
  /* Solo admission layout adjustments */
@@ -531,10 +557,10 @@
531
557
  }
532
558
 
533
559
  .solo-admission .admission-price-info {
534
- margin-top: var(--spacing-md);
560
+ margin-top: var(--internal-spacing-md);
535
561
  display: flex;
536
562
  justify-content: space-between;
537
- align-items: flex-start;
563
+ align-items: center;
538
564
  width: 100%;
539
565
  }
540
566
 
@@ -549,10 +575,10 @@
549
575
  justify-content: center;
550
576
  padding: 0;
551
577
  background: transparent;
552
- color: var(--muted-foreground);
578
+ color: var(--internal-destructive);
553
579
  border: none;
554
- font-size: var(--font-size-sm);
555
- font-weight: var(--font-weight-medium);
580
+ font-size: var(--internal-font-size-sm);
581
+ font-weight: var(--internal-font-weight-medium);
556
582
  text-transform: uppercase;
557
583
  letter-spacing: 0.05em;
558
584
  margin-left: auto;
@@ -563,51 +589,71 @@
563
589
  display: flex;
564
590
  align-items: center;
565
591
  justify-content: space-between;
566
- gap: var(--spacing-sm);
567
- margin-bottom: var(--spacing-sm);
592
+ gap: var(--internal-spacing-sm);
593
+ margin-bottom: var(--internal-spacing-sm);
568
594
  width: 100%;
569
595
  }
570
596
 
571
597
  .admission-price-wrapper {
572
598
  display: flex;
573
599
  flex-direction: column;
600
+ row-gap: calc(var(--internal-spacing-xs) * 0.5);
574
601
  }
575
602
 
576
603
  .admission-price {
577
- color: var(--internal-primary);
604
+ color: var(--internal-foreground);
578
605
  font-size: var(--internal-font-size-xl);
579
606
  font-weight: var(--internal-font-weight-bold);
580
607
  letter-spacing: -0.025em;
581
608
  line-height: 1.1;
582
609
  }
583
610
 
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 */
611
+ .admission-price-row {
612
+ display: flex;
613
+ flex-wrap: wrap;
614
+ align-items: baseline;
615
+ gap: var(--internal-spacing-sm);
616
+ }
617
+
618
+ .admission-price-original {
619
+ color: var(--internal-muted-foreground);
620
+ font-size: var(--internal-font-size-base);
621
+ text-decoration: line-through;
622
+ }
623
+
624
+ .admission-booking-fee {
625
+ color: var(--internal-muted-foreground);
626
+ font-size: var(--internal-font-size-xs);
627
+ font-weight: var(--internal-font-weight-medium);
628
+ line-height: 1.2;
629
+ }
630
+
631
+ .admission-savings,
632
+ .admission-availability {
633
+ font-size: var(--internal-font-size-xs);
634
+ font-weight: var(--internal-font-weight-medium);
635
+ line-height: 1.2;
594
636
  }
595
637
 
596
638
  .admission-savings {
597
- color: var(--success);
598
- font-size: var(--font-size-sm);
599
- font-weight: var(--font-weight-medium);
639
+ color: var(--internal-success);
600
640
  }
601
641
 
602
642
  .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);
643
+ color: var(--internal-warning);
644
+ }
645
+
646
+ .admission-sale-label {
647
+ display: block;
648
+ margin-top: var(--internal-spacing-xs);
649
+ color: var(--internal-muted-foreground);
650
+ font-size: var(--internal-font-size-sm);
651
+ font-weight: var(--internal-font-weight-medium);
652
+ line-height: 1.35;
653
+ }
654
+
655
+ .admission-sale-label.success {
656
+ color: var(--internal-success);
611
657
  }
612
658
 
613
659
  /* Quantity Controls - Modern, minimal design */
@@ -616,13 +662,15 @@
616
662
  align-items: center;
617
663
  gap: 0;
618
664
  background: var(--internal-secondary);
619
- border: 1px solid var(--internal-border);
620
665
  border-radius: calc(var(--internal-radius) - 2px);
621
666
  overflow: hidden;
622
- box-shadow: none;
623
667
  transition: all var(--internal-transition-fast);
624
668
  }
625
669
 
670
+ .quantity-controls:has(.quantity-value:focus-visible) {
671
+ box-shadow: 0 0 0 2px var(--internal-ring);
672
+ }
673
+
626
674
  .quantity-btn {
627
675
  width: calc(var(--internal-spacing-lg) * 1.5);
628
676
  height: calc(var(--internal-spacing-lg) * 1.5);
@@ -660,18 +708,22 @@
660
708
  background: var(--internal-secondary);
661
709
  color: var(--internal-muted-foreground);
662
710
  border-color: var(--internal-border);
663
- box-shadow: none;
664
711
  }
665
712
 
666
713
  .quantity-btn.decrease {
667
- border-right: 1px solid var(--internal-border);
714
+ border-right: 1px solid var(--internal-input);
668
715
  }
669
716
 
670
717
  .quantity-btn.increase {
671
- border-left: 1px solid var(--internal-border);
718
+ border-left: 1px solid var(--internal-input);
672
719
  }
673
720
 
674
721
  .quantity-value {
722
+ appearance: textfield;
723
+ width: 2.75rem;
724
+ height: calc(var(--internal-spacing-lg) * 1.5);
725
+ border: none;
726
+ background: transparent;
675
727
  min-width: 2.5rem;
676
728
  text-align: center;
677
729
  font-size: var(--internal-font-size-sm);
@@ -680,148 +732,147 @@
680
732
  padding: 0 var(--internal-spacing-xs);
681
733
  }
682
734
 
735
+ .quantity-value:focus-visible {
736
+ outline: none;
737
+ }
738
+
739
+ .quantity-value::-webkit-inner-spin-button,
740
+ .quantity-value::-webkit-outer-spin-button {
741
+ appearance: none;
742
+ margin: 0;
743
+ }
744
+
745
+ .quantity-value:disabled {
746
+ opacity: 0.6;
747
+ cursor: not-allowed;
748
+ }
749
+
683
750
  /* Sold Out Controls */
684
751
  .sold-out-controls {
685
752
  display: inline-flex;
686
753
  align-items: center;
687
754
  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;
755
+ min-width: calc(var(--internal-spacing-lg) * 1.5 * 2 + 2.5rem);
756
+ height: calc(var(--internal-spacing-lg) * 1.5);
757
+ padding: 0;
758
+ background: transparent;
759
+ border: none;
760
+ box-shadow: none;
699
761
  }
700
762
 
763
+ .sold-out-controls,
701
764
  .sold-out-text {
702
- color: var(--muted-foreground);
703
- font-size: var(--font-size-xs);
704
- font-weight: var(--font-weight-medium);
765
+ color: var(--internal-destructive);
766
+ font-size: var(--internal-font-size-xs);
767
+ font-weight: var(--internal-font-weight-medium);
705
768
  letter-spacing: 0.025em;
706
769
  text-transform: uppercase;
707
770
  }
708
771
 
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);
772
+ .sold-out-controls.success,
773
+ .sold-out-controls.success .sold-out-text {
774
+ color: var(--internal-success);
775
+ }
776
+
777
+ .checkout-actions {
715
778
  margin: var(--internal-spacing-lg) 0 0 0;
716
- box-shadow: var(--internal-shadow-lg);
717
779
  width: 100%;
718
780
  }
719
781
 
720
- .summary-title {
721
- font-size: var(--internal-font-size-lg);
722
- font-weight: var(--internal-font-weight-semibold);
782
+ .coupon-panel {
723
783
  margin-bottom: var(--internal-spacing-md);
724
- color: var(--internal-foreground);
725
- letter-spacing: -0.025em;
726
784
  }
727
785
 
728
- .order-item {
786
+ .coupon-row {
787
+ position: relative;
729
788
  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);
789
+ align-items: center;
790
+ width: 100%;
791
+ min-width: 0;
792
+ overflow: hidden;
793
+ background: var(--internal-background);
794
+ background-clip: padding-box;
795
+ border-radius: var(--internal-radius);
796
+ transition: border-color var(--internal-transition-fast);
734
797
  }
735
798
 
736
- .order-item-with-section {
737
- margin-bottom: var(--internal-spacing-sm);
799
+ .coupon-row:focus-within {
800
+ border-color: var(--internal-ring);
738
801
  }
739
802
 
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);
803
+ .coupon-row:has(input[aria-invalid="true"]) {
804
+ border-color: var(--internal-destructive);
746
805
  }
747
806
 
748
- .item-section-name {
749
- flex: 1;
750
- font-weight: var(--font-weight-medium);
807
+ .coupon-row:has(input:disabled) {
808
+ opacity: 0.64;
751
809
  }
752
810
 
753
- .item-admission-name {
811
+ .coupon-row input {
812
+ width: 100%;
813
+ min-width: 0;
814
+ padding: calc(var(--internal-spacing-sm) - 1px)
815
+ calc(var(--internal-spacing-xl) * 2.75)
816
+ calc(var(--internal-spacing-sm) - 1px)
817
+ calc(var(--internal-spacing-md) - 1px);
818
+ background: var(--internal-card);
819
+ color: var(--internal-foreground);
820
+ border: none;
821
+ border-radius: inherit;
822
+ font: inherit;
754
823
  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);
824
+ line-height: 1.25rem;
825
+ outline: none;
764
826
  }
765
827
 
766
- .item-price {
767
- font-weight: var(--internal-font-weight-bold);
768
- white-space: nowrap;
828
+ .coupon-row input::placeholder {
829
+ color: oklch(from var(--internal-muted-foreground) l c h / 0.64);
769
830
  }
770
831
 
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;
832
+ .coupon-row input:disabled {
833
+ cursor: not-allowed;
779
834
  }
780
835
 
781
- .empty-cart-text {
782
- flex: 1;
836
+ .coupon-apply,
837
+ .coupon-remove {
838
+ position: absolute;
839
+ right: calc((var(--internal-spacing-xs) * 1.5) - 3px);
840
+ top: 50%;
841
+ transform: translateY(-50%);
842
+ padding: calc(var(--internal-spacing-xs) * 1.25) var(--internal-spacing-sm);
843
+ background: var(--internal-secondary);
844
+ color: var(--internal-foreground);
845
+ border-radius: calc(var(--internal-radius) - 2px);
846
+ font-size: var(--internal-font-size-xs);
847
+ font-weight: var(--internal-font-weight-medium);
848
+ cursor: pointer;
849
+ transition: all var(--internal-transition-fast);
783
850
  }
784
851
 
785
- .empty-cart-price {
786
- font-weight: var(--font-weight-medium);
852
+ .coupon-apply:hover:not(:disabled),
853
+ .coupon-remove:hover:not(:disabled) {
854
+ background: oklch(from var(--internal-accent) l c h / 0.8);
787
855
  }
788
856
 
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);
794
- }
795
-
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);
857
+ .coupon-apply:focus-visible,
858
+ .coupon-remove:focus-visible {
859
+ outline: 2px solid var(--internal-ring);
860
+ outline-offset: -1px;
802
861
  }
803
862
 
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);
863
+ .coupon-apply:disabled,
864
+ .coupon-remove:disabled {
865
+ opacity: 0.6;
866
+ cursor: not-allowed;
811
867
  }
812
868
 
813
869
  .checkout-btn {
814
870
  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);
871
+ padding: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs))
872
+ var(--internal-spacing-lg);
820
873
  font-size: var(--internal-font-size-base);
821
874
  font-weight: var(--internal-font-weight-bold);
822
- cursor: pointer;
823
- transition: all var(--internal-transition-fast);
824
- box-shadow: var(--internal-shadow-sm);
875
+ line-height: 1.25;
825
876
  position: relative;
826
877
  overflow: hidden;
827
878
  }
@@ -831,115 +882,153 @@
831
882
  outline-offset: 2px;
832
883
  }
833
884
 
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
885
  .checkout-btn:active:not(:disabled) {
841
886
  transform: translateY(0);
842
- box-shadow: var(--shadow-sm);
843
887
  }
844
888
 
845
889
  .checkout-btn:disabled {
846
- opacity: 0.6;
890
+ opacity: 0.5;
847
891
  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);
892
+ }
893
+
894
+ .checkout-spinner-wrapper {
895
+ display: inline-flex;
896
+ align-items: center;
897
+ justify-content: center;
898
+ height: 1.25em;
899
+ vertical-align: middle;
900
+ }
901
+
902
+ .checkout-spinner {
903
+ width: 1.125em;
904
+ height: 1.125em;
905
+ animation: checkout-spinner 0.8s linear infinite;
906
+ }
907
+
908
+ @keyframes checkout-spinner {
909
+ to {
910
+ transform: rotate(360deg);
911
+ }
912
+ }
913
+
914
+ .sticky-checkout-bar {
915
+ position: fixed;
916
+ right: 0;
917
+ bottom: 0;
918
+ left: 0;
919
+ z-index: 40;
920
+ display: none;
921
+ padding: var(--internal-spacing-md);
922
+ background: var(--internal-card);
923
+ border-top: 1px solid var(--internal-border);
924
+ box-shadow: var(--internal-shadow-lg);
925
+ }
926
+
927
+ .sticky-checkout-btn.selection-prompt {
928
+ animation: selection-prompt-shake 400ms ease-in-out;
929
+ }
930
+
931
+ @keyframes selection-prompt-shake {
932
+ 0%,
933
+ 100% {
934
+ transform: translateX(0);
935
+ }
936
+ 25% {
937
+ transform: translateX(-4px);
938
+ }
939
+ 75% {
940
+ transform: translateX(4px);
941
+ }
852
942
  }
853
943
 
854
944
  /* Loading & Error States */
855
- .loading-state,
856
- .error-state {
945
+ .loading-state {
857
946
  display: flex;
858
947
  justify-content: center;
859
948
  align-items: center;
860
- padding: var(--spacing-xl);
949
+ padding: var(--internal-spacing-xl);
861
950
  text-align: center;
862
951
  min-height: 200px;
863
952
  }
864
953
 
865
- .error-state {
866
- color: var(--primary);
867
- }
868
-
869
954
  .error-banner {
870
955
  background: oklch(
871
- from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
956
+ from var(--internal-destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
872
957
  );
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);
958
+ border: 1px solid oklch(from var(--internal-destructive) l c h / 0.2);
959
+ border-radius: var(--internal-radius);
960
+ padding: var(--internal-spacing-lg);
961
+ margin: var(--internal-spacing-lg);
877
962
  text-align: center;
878
963
  }
879
964
 
880
965
  .error-banner strong {
881
966
  display: block;
882
- color: var(--destructive);
883
- font-size: var(--font-size-lg);
884
- margin-bottom: var(--spacing-sm);
967
+ color: var(--internal-destructive);
968
+ font-size: var(--internal-font-size-lg);
969
+ margin-bottom: var(--internal-spacing-sm);
885
970
  }
886
971
 
887
972
  .error-banner p {
888
- color: var(--muted-foreground);
889
- margin-bottom: var(--spacing-md);
973
+ color: var(--internal-muted-foreground);
974
+ margin-bottom: var(--internal-spacing-md);
890
975
  }
891
976
 
892
977
  .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);
978
+ background: var(--internal-primary);
979
+ color: var(--internal-primary-foreground);
980
+ border: 1px solid oklch(from var(--internal-primary) calc(l - 0.08) c h);
981
+ padding: calc(var(--internal-spacing-sm) + var(--internal-spacing-xs))
982
+ var(--internal-spacing-lg);
983
+ border-radius: calc(var(--internal-radius) - 2px);
984
+ font-size: var(--internal-font-size-sm);
985
+ font-weight: var(--internal-font-weight-medium);
900
986
  cursor: pointer;
901
- transition: all var(--transition-fast);
902
- box-shadow: var(--shadow-sm);
987
+ transition: all var(--internal-transition-fast);
988
+ box-shadow: var(--internal-shadow-edge-light);
903
989
  }
904
990
 
905
991
  .retry-button:focus-visible {
906
- outline: 2px solid var(--ring);
992
+ outline: 2px solid var(--internal-ring);
907
993
  outline-offset: 2px;
908
994
  }
909
995
 
910
996
  .retry-button:hover {
911
- background: oklch(from var(--primary) calc(l - 0.08) c h);
912
- box-shadow: var(--shadow-md);
997
+ background: oklch(from var(--internal-primary) calc(l - 0.08) c h);
913
998
  transform: translateY(-1px);
914
999
  }
915
1000
 
916
1001
  .retry-button:active {
917
1002
  transform: translateY(0);
918
- box-shadow: var(--shadow-sm);
919
1003
  }
920
1004
 
921
1005
  .error-message {
922
1006
  background: oklch(
923
- from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
1007
+ from var(--internal-destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
924
1008
  );
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);
1009
+ border: 1px solid oklch(from var(--internal-destructive) l c h / 0.2);
1010
+ color: var(--internal-destructive);
1011
+ padding: var(--internal-spacing-sm) var(--internal-spacing-md);
1012
+ border-radius: var(--internal-radius);
1013
+ margin-bottom: var(--internal-spacing-md);
1014
+ font-size: var(--internal-font-size-sm);
931
1015
  }
932
1016
 
933
1017
  /* Responsive adjustments for larger screens */
934
1018
  @media (min-width: 768px) {
935
1019
  .ticket-section {
936
- border-radius: var(--radius);
937
- margin: 0 0 var(--spacing-md) 0;
1020
+ border-radius: var(--internal-radius);
1021
+ margin: 0 0 var(--internal-spacing-md) 0;
1022
+ }
1023
+ }
1024
+
1025
+ @media (max-width: 767px) {
1026
+ :host([data-sticky-checkout="true"]) .session-services-ticketing-container {
1027
+ padding-bottom: calc(var(--internal-spacing-xl) * 3);
938
1028
  }
939
1029
 
940
- .order-summary {
941
- border-radius: var(--radius);
942
- margin: var(--spacing-md) 0;
1030
+ .sticky-checkout-bar {
1031
+ display: block;
943
1032
  }
944
1033
  }
945
1034