@ticketlayer/elements 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/cjs/index-DfzcrE9-.js +3598 -0
  4. package/dist/cjs/index.cjs.js +16 -0
  5. package/dist/cjs/loader.cjs.js +12 -0
  6. package/dist/cjs/order-summary-ZMkJ5bez.js +116 -0
  7. package/dist/cjs/sdk-connector-ClDF3013.js +108 -0
  8. package/dist/cjs/ticketlayer-elements.cjs.js +24 -0
  9. package/dist/cjs/tl-buy-modal.cjs.entry.js +127 -0
  10. package/dist/cjs/tl-buy-tickets-button.cjs.entry.js +131 -0
  11. package/dist/cjs/tl-buy-tickets-wrapper.cjs.entry.js +58 -0
  12. package/dist/cjs/tl-cart-badge.cjs.entry.js +109 -0
  13. package/dist/cjs/tl-cart-drawer.cjs.entry.js +67 -0
  14. package/dist/cjs/tl-cart.cjs.entry.js +148 -0
  15. package/dist/cjs/tl-checkout-wrapper.cjs.entry.js +57 -0
  16. package/dist/cjs/tl-event-card.cjs.entry.js +140 -0
  17. package/dist/cjs/tl-event-list.cjs.entry.js +80 -0
  18. package/dist/cjs/tl-login.cjs.entry.js +184 -0
  19. package/dist/cjs/tl-my-orders.cjs.entry.js +123 -0
  20. package/dist/cjs/tl-occurrence-selector_2.cjs.entry.js +754 -0
  21. package/dist/cjs/tl-order-confirmation.cjs.entry.js +146 -0
  22. package/dist/cjs/tl-order-tickets_2.cjs.entry.js +3198 -0
  23. package/dist/cjs/tl-promo-code.cjs.entry.js +75 -0
  24. package/dist/cjs/tl-seat-map.cjs.entry.js +147 -0
  25. package/dist/collection/collection-manifest.json +29 -0
  26. package/dist/collection/components/tl-buy-modal/tl-buy-modal.css +264 -0
  27. package/dist/collection/components/tl-buy-modal/tl-buy-modal.js +249 -0
  28. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.css +120 -0
  29. package/dist/collection/components/tl-buy-tickets-button/tl-buy-tickets-button.js +412 -0
  30. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.css +23 -0
  31. package/dist/collection/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.js +192 -0
  32. package/dist/collection/components/tl-cart/tl-cart.css +251 -0
  33. package/dist/collection/components/tl-cart/tl-cart.js +314 -0
  34. package/dist/collection/components/tl-cart-badge/tl-cart-badge.css +138 -0
  35. package/dist/collection/components/tl-cart-badge/tl-cart-badge.js +217 -0
  36. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.css +98 -0
  37. package/dist/collection/components/tl-cart-drawer/tl-cart-drawer.js +185 -0
  38. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.css +23 -0
  39. package/dist/collection/components/tl-checkout-wrapper/tl-checkout-wrapper.js +148 -0
  40. package/dist/collection/components/tl-event-card/event-card-adapter.js +23 -0
  41. package/dist/collection/components/tl-event-card/tl-event-card.css +175 -0
  42. package/dist/collection/components/tl-event-card/tl-event-card.js +205 -0
  43. package/dist/collection/components/tl-event-list/tl-event-list.css +134 -0
  44. package/dist/collection/components/tl-event-list/tl-event-list.js +171 -0
  45. package/dist/collection/components/tl-login/tl-login.css +133 -0
  46. package/dist/collection/components/tl-login/tl-login.js +309 -0
  47. package/dist/collection/components/tl-my-orders/tl-my-orders.css +204 -0
  48. package/dist/collection/components/tl-my-orders/tl-my-orders.js +221 -0
  49. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.css +658 -0
  50. package/dist/collection/components/tl-occurrence-selector/tl-occurrence-selector.js +707 -0
  51. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.css +176 -0
  52. package/dist/collection/components/tl-order-confirmation/tl-order-confirmation.js +298 -0
  53. package/dist/collection/components/tl-order-tickets/tl-order-tickets.css +30 -0
  54. package/dist/collection/components/tl-order-tickets/tl-order-tickets.js +122 -0
  55. package/dist/collection/components/tl-promo-code/tl-promo-code.css +106 -0
  56. package/dist/collection/components/tl-promo-code/tl-promo-code.js +181 -0
  57. package/dist/collection/components/tl-seat-map/tl-seat-map.css +85 -0
  58. package/dist/collection/components/tl-seat-map/tl-seat-map.js +366 -0
  59. package/dist/collection/components/tl-ticket/tl-ticket.css +90 -0
  60. package/dist/collection/components/tl-ticket/tl-ticket.js +129 -0
  61. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.css +205 -0
  62. package/dist/collection/components/tl-ticket-selector/tl-ticket-selector.js +332 -0
  63. package/dist/collection/index.js +10 -0
  64. package/dist/collection/utils/order-summary.js +101 -0
  65. package/dist/collection/utils/sdk-connector.js +100 -0
  66. package/dist/collection/utils/testing/mock-sdk.js +95 -0
  67. package/dist/components/index.d.ts +35 -0
  68. package/dist/components/index.js +1 -0
  69. package/dist/components/order-summary.js +1 -0
  70. package/dist/components/sdk-connector.js +1 -0
  71. package/dist/components/tl-buy-modal.d.ts +11 -0
  72. package/dist/components/tl-buy-modal.js +1 -0
  73. package/dist/components/tl-buy-tickets-button.d.ts +11 -0
  74. package/dist/components/tl-buy-tickets-button.js +1 -0
  75. package/dist/components/tl-buy-tickets-wrapper.d.ts +11 -0
  76. package/dist/components/tl-buy-tickets-wrapper.js +1 -0
  77. package/dist/components/tl-buy-tickets-wrapper2.js +1 -0
  78. package/dist/components/tl-cart-badge.d.ts +11 -0
  79. package/dist/components/tl-cart-badge.js +1 -0
  80. package/dist/components/tl-cart-drawer.d.ts +11 -0
  81. package/dist/components/tl-cart-drawer.js +1 -0
  82. package/dist/components/tl-cart.d.ts +11 -0
  83. package/dist/components/tl-cart.js +1 -0
  84. package/dist/components/tl-cart2.js +1 -0
  85. package/dist/components/tl-checkout-wrapper.d.ts +11 -0
  86. package/dist/components/tl-checkout-wrapper.js +1 -0
  87. package/dist/components/tl-checkout-wrapper2.js +1 -0
  88. package/dist/components/tl-event-card.d.ts +11 -0
  89. package/dist/components/tl-event-card.js +1 -0
  90. package/dist/components/tl-event-card2.js +1 -0
  91. package/dist/components/tl-event-list.d.ts +11 -0
  92. package/dist/components/tl-event-list.js +1 -0
  93. package/dist/components/tl-login.d.ts +11 -0
  94. package/dist/components/tl-login.js +1 -0
  95. package/dist/components/tl-login2.js +1 -0
  96. package/dist/components/tl-my-orders.d.ts +11 -0
  97. package/dist/components/tl-my-orders.js +1 -0
  98. package/dist/components/tl-occurrence-selector.d.ts +11 -0
  99. package/dist/components/tl-occurrence-selector.js +1 -0
  100. package/dist/components/tl-occurrence-selector2.js +1 -0
  101. package/dist/components/tl-order-confirmation.d.ts +11 -0
  102. package/dist/components/tl-order-confirmation.js +1 -0
  103. package/dist/components/tl-order-tickets.d.ts +11 -0
  104. package/dist/components/tl-order-tickets.js +1 -0
  105. package/dist/components/tl-order-tickets2.js +1 -0
  106. package/dist/components/tl-promo-code.d.ts +11 -0
  107. package/dist/components/tl-promo-code.js +1 -0
  108. package/dist/components/tl-seat-map.d.ts +11 -0
  109. package/dist/components/tl-seat-map.js +1 -0
  110. package/dist/components/tl-ticket-selector.d.ts +11 -0
  111. package/dist/components/tl-ticket-selector.js +1 -0
  112. package/dist/components/tl-ticket-selector2.js +1 -0
  113. package/dist/components/tl-ticket.d.ts +11 -0
  114. package/dist/components/tl-ticket.js +1 -0
  115. package/dist/components/tl-ticket2.js +1 -0
  116. package/dist/elements.docs.d.ts +454 -0
  117. package/dist/elements.docs.json +3008 -0
  118. package/dist/esm/index-Ba-RZTFI.js +3588 -0
  119. package/dist/esm/index.js +4 -0
  120. package/dist/esm/loader.js +10 -0
  121. package/dist/esm/order-summary-BGekdjN9.js +103 -0
  122. package/dist/esm/sdk-connector-CqhvfyKV.js +102 -0
  123. package/dist/esm/ticketlayer-elements.js +20 -0
  124. package/dist/esm/tl-buy-modal.entry.js +125 -0
  125. package/dist/esm/tl-buy-tickets-button.entry.js +129 -0
  126. package/dist/esm/tl-buy-tickets-wrapper.entry.js +56 -0
  127. package/dist/esm/tl-cart-badge.entry.js +107 -0
  128. package/dist/esm/tl-cart-drawer.entry.js +65 -0
  129. package/dist/esm/tl-cart.entry.js +146 -0
  130. package/dist/esm/tl-checkout-wrapper.entry.js +55 -0
  131. package/dist/esm/tl-event-card.entry.js +138 -0
  132. package/dist/esm/tl-event-list.entry.js +78 -0
  133. package/dist/esm/tl-login.entry.js +182 -0
  134. package/dist/esm/tl-my-orders.entry.js +121 -0
  135. package/dist/esm/tl-occurrence-selector_2.entry.js +751 -0
  136. package/dist/esm/tl-order-confirmation.entry.js +144 -0
  137. package/dist/esm/tl-order-tickets_2.entry.js +3195 -0
  138. package/dist/esm/tl-promo-code.entry.js +73 -0
  139. package/dist/esm/tl-seat-map.entry.js +145 -0
  140. package/dist/index.cjs.js +1 -0
  141. package/dist/index.js +1 -0
  142. package/dist/ticketlayer-elements/index.esm.js +1 -0
  143. package/dist/ticketlayer-elements/p-0291df4c.entry.js +1 -0
  144. package/dist/ticketlayer-elements/p-10f01a1f.entry.js +1 -0
  145. package/dist/ticketlayer-elements/p-11273f8f.entry.js +1 -0
  146. package/dist/ticketlayer-elements/p-340ab4f5.entry.js +1 -0
  147. package/dist/ticketlayer-elements/p-41d22d7c.entry.js +1 -0
  148. package/dist/ticketlayer-elements/p-82752e3b.entry.js +1 -0
  149. package/dist/ticketlayer-elements/p-976770f3.entry.js +1 -0
  150. package/dist/ticketlayer-elements/p-9a903ff6.entry.js +1 -0
  151. package/dist/ticketlayer-elements/p-9c9072c8.entry.js +1 -0
  152. package/dist/ticketlayer-elements/p-9d8163d6.entry.js +1 -0
  153. package/dist/ticketlayer-elements/p-BGekdjN9.js +1 -0
  154. package/dist/ticketlayer-elements/p-Ba-RZTFI.js +2 -0
  155. package/dist/ticketlayer-elements/p-CqhvfyKV.js +1 -0
  156. package/dist/ticketlayer-elements/p-a5c90b68.entry.js +1 -0
  157. package/dist/ticketlayer-elements/p-b6d479ad.entry.js +1 -0
  158. package/dist/ticketlayer-elements/p-dd43f015.entry.js +1 -0
  159. package/dist/ticketlayer-elements/p-eb640760.entry.js +1 -0
  160. package/dist/ticketlayer-elements/p-ee3aa227.entry.js +1 -0
  161. package/dist/ticketlayer-elements/p-fb9444c4.entry.js +1 -0
  162. package/dist/ticketlayer-elements/ticketlayer-elements.css +1 -0
  163. package/dist/ticketlayer-elements/ticketlayer-elements.esm.js +1 -0
  164. package/dist/types/components/tl-buy-modal/tl-buy-modal.d.ts +54 -0
  165. package/dist/types/components/tl-buy-tickets-button/tl-buy-tickets-button.d.ts +61 -0
  166. package/dist/types/components/tl-buy-tickets-wrapper/tl-buy-tickets-wrapper.d.ts +52 -0
  167. package/dist/types/components/tl-cart/tl-cart.d.ts +80 -0
  168. package/dist/types/components/tl-cart-badge/tl-cart-badge.d.ts +36 -0
  169. package/dist/types/components/tl-cart-drawer/tl-cart-drawer.d.ts +35 -0
  170. package/dist/types/components/tl-checkout-wrapper/tl-checkout-wrapper.d.ts +39 -0
  171. package/dist/types/components/tl-event-card/event-card-adapter.d.ts +23 -0
  172. package/dist/types/components/tl-event-card/tl-event-card.d.ts +55 -0
  173. package/dist/types/components/tl-event-list/tl-event-list.d.ts +30 -0
  174. package/dist/types/components/tl-login/tl-login.d.ts +59 -0
  175. package/dist/types/components/tl-my-orders/tl-my-orders.d.ts +39 -0
  176. package/dist/types/components/tl-occurrence-selector/tl-occurrence-selector.d.ts +208 -0
  177. package/dist/types/components/tl-order-confirmation/tl-order-confirmation.d.ts +54 -0
  178. package/dist/types/components/tl-order-tickets/tl-order-tickets.d.ts +21 -0
  179. package/dist/types/components/tl-promo-code/tl-promo-code.d.ts +39 -0
  180. package/dist/types/components/tl-seat-map/tl-seat-map.d.ts +68 -0
  181. package/dist/types/components/tl-ticket/tl-ticket.d.ts +28 -0
  182. package/dist/types/components/tl-ticket-selector/tl-ticket-selector.d.ts +78 -0
  183. package/dist/types/components.d.ts +1629 -0
  184. package/dist/types/index.d.ts +14 -0
  185. package/dist/types/stencil-public-runtime.d.ts +1839 -0
  186. package/dist/types/utils/order-summary.d.ts +67 -0
  187. package/dist/types/utils/sdk-connector.d.ts +113 -0
  188. package/dist/types/utils/testing/mock-sdk.d.ts +36 -0
  189. package/elements.catalogue.json +968 -0
  190. package/loader/cdn.js +1 -0
  191. package/loader/index.cjs.js +1 -0
  192. package/loader/index.d.ts +24 -0
  193. package/loader/index.es2017.js +1 -0
  194. package/loader/index.js +2 -0
  195. package/package.json +101 -0
@@ -0,0 +1,658 @@
1
+ /**
2
+ * TlOccurrenceSelector Styles
3
+ *
4
+ * CSS custom properties for theming:
5
+ * --tl-primary: Primary brand colour (default: #e64b12)
6
+ * --tl-primary-foreground: Text on primary (default: #ffffff)
7
+ * --tl-background: Background colour (default: #ffffff)
8
+ * --tl-foreground: Main text colour (default: #0f172a)
9
+ * --tl-muted: Muted background (default: #f1f5f9)
10
+ * --tl-muted-foreground: Muted text (default: #64748b)
11
+ * --tl-border: Border colour (default: #e2e8f0)
12
+ * --tl-radius: Border radius (default: 0.5rem)
13
+ * --tl-font-family: Font family (default: system-ui)
14
+ */
15
+
16
+ :host {
17
+ /* Don't redefine CSS variables - let them inherit from parent document */
18
+ /* Only define local fallback for radius mapping */
19
+ --tl-radius: var(--tl-radius-md, 0.5rem);
20
+
21
+ display: block;
22
+ font-family: var(--tl-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);
23
+ color: var(--tl-foreground, #0f172a);
24
+ }
25
+
26
+ * {
27
+ box-sizing: border-box;
28
+ margin: 0;
29
+ padding: 0;
30
+ }
31
+
32
+ .occurrence-selector {
33
+ width: 100%;
34
+ }
35
+
36
+ /* No Occurrences */
37
+ .no-occurrences {
38
+ text-align: center;
39
+ padding: 3rem 1rem;
40
+ color: var(--tl-muted-foreground, #64748b);
41
+ }
42
+
43
+ /* =========================================================================
44
+ LIST VIEW
45
+ ========================================================================= */
46
+
47
+ .list-view {
48
+ display: flex;
49
+ flex-direction: column;
50
+ gap: 0.75rem;
51
+ }
52
+
53
+ .occurrence-item {
54
+ display: flex;
55
+ justify-content: space-between;
56
+ align-items: flex-start;
57
+ width: 100%;
58
+ padding: 1rem 1.25rem;
59
+ background: var(--tl-background, #ffffff);
60
+ border: 1px solid var(--tl-border, #e2e8f0);
61
+ border-radius: var(--tl-radius);
62
+ text-align: left;
63
+ cursor: pointer;
64
+ transition: all 0.15s ease;
65
+ font-family: inherit;
66
+ }
67
+
68
+ .occurrence-item:hover:not(:disabled) {
69
+ border-color: var(--tl-primary, #e64b12);
70
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 5%, var(--tl-background, #ffffff));
71
+ }
72
+
73
+ .occurrence-item:focus-visible {
74
+ outline: 2px solid var(--tl-primary);
75
+ outline-offset: 2px;
76
+ }
77
+
78
+ .occurrence-item:disabled {
79
+ cursor: not-allowed;
80
+ opacity: 0.6;
81
+ background: var(--tl-muted, #f1f5f9);
82
+ }
83
+
84
+ .occurrence-item.sold-out {
85
+ opacity: 0.6;
86
+ background: var(--tl-muted, #f1f5f9);
87
+ }
88
+
89
+ .occurrence-info {
90
+ flex: 1;
91
+ }
92
+
93
+ .occurrence-date {
94
+ font-weight: 600;
95
+ font-size: 0.9375rem;
96
+ color: var(--tl-foreground, #0f172a);
97
+ margin-bottom: 0.25rem;
98
+ }
99
+
100
+ .occurrence-time {
101
+ font-size: 0.875rem;
102
+ color: var(--tl-muted-foreground);
103
+ }
104
+
105
+ .occurrence-status {
106
+ flex-shrink: 0;
107
+ text-align: right;
108
+ }
109
+
110
+ .status-sold-out {
111
+ font-size: 0.875rem;
112
+ font-weight: 500;
113
+ color: var(--tl-muted-foreground);
114
+ }
115
+
116
+ .status-available {
117
+ font-size: 0.875rem;
118
+ color: var(--tl-muted-foreground);
119
+ }
120
+
121
+ .status-arrow {
122
+ font-size: 1.25rem;
123
+ color: var(--tl-primary, #e64b12);
124
+ }
125
+
126
+ /* =========================================================================
127
+ SLOTS VIEW (Same Day, Multiple Times)
128
+ ========================================================================= */
129
+
130
+ .slots-view {
131
+ display: flex;
132
+ flex-direction: column;
133
+ gap: 1rem;
134
+ }
135
+
136
+ .slots-date-header {
137
+ font-size: 1.125rem;
138
+ font-weight: 600;
139
+ color: var(--tl-foreground, #0f172a);
140
+ padding-bottom: 0.5rem;
141
+ border-bottom: 1px solid var(--tl-border);
142
+ }
143
+
144
+ .time-slots-grid {
145
+ display: grid;
146
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
147
+ gap: 0.5rem;
148
+ }
149
+
150
+ .time-slot {
151
+ display: flex;
152
+ flex-direction: column;
153
+ align-items: center;
154
+ justify-content: center;
155
+ padding: 0.75rem 0.5rem;
156
+ background: var(--tl-background, #ffffff);
157
+ border: 1px solid var(--tl-border, #e2e8f0);
158
+ border-radius: var(--tl-radius);
159
+ cursor: pointer;
160
+ transition: all 0.15s ease;
161
+ font-family: inherit;
162
+ min-height: 3.5rem;
163
+ }
164
+
165
+ .time-slot:hover:not(:disabled) {
166
+ border-color: var(--tl-primary, #e64b12);
167
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 5%, var(--tl-background, #ffffff));
168
+ }
169
+
170
+ .time-slot:focus-visible {
171
+ outline: 2px solid var(--tl-primary);
172
+ outline-offset: 2px;
173
+ }
174
+
175
+ .time-slot:disabled {
176
+ cursor: not-allowed;
177
+ opacity: 0.6;
178
+ background: var(--tl-muted, #f1f5f9);
179
+ }
180
+
181
+ .time-slot.sold-out {
182
+ opacity: 0.6;
183
+ background: var(--tl-muted, #f1f5f9);
184
+ }
185
+
186
+ .slot-time {
187
+ font-size: 0.9375rem;
188
+ font-weight: 600;
189
+ color: var(--tl-foreground, #0f172a);
190
+ }
191
+
192
+ .slot-sold-out {
193
+ font-size: 0.6875rem;
194
+ color: var(--tl-muted-foreground);
195
+ margin-top: 0.125rem;
196
+ }
197
+
198
+ /* =========================================================================
199
+ CALENDAR VIEW
200
+ ========================================================================= */
201
+
202
+ .calendar-view {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 1.5rem;
206
+ }
207
+
208
+ .calendar-view.horizontal {
209
+ flex-direction: row;
210
+ gap: 1.5rem;
211
+ align-items: flex-start;
212
+ }
213
+
214
+ .calendar-view.horizontal .calendar-panel {
215
+ flex-shrink: 0;
216
+ width: 340px;
217
+ }
218
+
219
+ .calendar-view.horizontal .slots-panel {
220
+ flex: 1;
221
+ min-width: 0;
222
+ }
223
+
224
+ .calendar-view.vertical .calendar-panel {
225
+ width: 100%;
226
+ }
227
+
228
+ .calendar-view.vertical .slots-panel {
229
+ width: 100%;
230
+ }
231
+
232
+ .calendar-panel {
233
+ border: 1px solid var(--tl-border, #e2e8f0);
234
+ border-radius: var(--tl-radius);
235
+ padding: 1rem;
236
+ }
237
+
238
+ /* Calendar Header */
239
+ .calendar-header {
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: space-between;
243
+ margin-bottom: 0.75rem;
244
+ }
245
+
246
+ .month-label {
247
+ font-size: 1rem;
248
+ font-weight: 600;
249
+ color: var(--tl-foreground, #0f172a);
250
+ flex: 1;
251
+ }
252
+
253
+ .calendar-nav-buttons {
254
+ display: flex;
255
+ gap: 0.375rem;
256
+ }
257
+
258
+ .nav-button {
259
+ display: flex;
260
+ align-items: center;
261
+ justify-content: center;
262
+ width: 1.75rem;
263
+ height: 1.75rem;
264
+ padding: 0;
265
+ background: var(--tl-background, #ffffff);
266
+ border: 1px solid var(--tl-border, #e2e8f0);
267
+ border-radius: var(--tl-radius);
268
+ cursor: pointer;
269
+ transition: all 0.15s ease;
270
+ color: var(--tl-foreground, #0f172a);
271
+ }
272
+
273
+ .nav-button:hover:not(:disabled) {
274
+ background: var(--tl-muted, #f1f5f9);
275
+ }
276
+
277
+ .nav-button:disabled {
278
+ cursor: not-allowed;
279
+ opacity: 0.4;
280
+ }
281
+
282
+ .nav-button svg {
283
+ width: 0.875rem;
284
+ height: 0.875rem;
285
+ }
286
+
287
+ /* Calendar Grid */
288
+ .calendar-grid {
289
+ display: grid;
290
+ grid-template-columns: repeat(7, 1fr);
291
+ gap: 0.1875rem;
292
+ }
293
+
294
+ .weekday-header {
295
+ text-align: center;
296
+ font-size: 0.6875rem;
297
+ font-weight: 600;
298
+ color: var(--tl-muted-foreground);
299
+ padding: 0.375rem 0;
300
+ text-transform: uppercase;
301
+ letter-spacing: 0.05em;
302
+ }
303
+
304
+ .calendar-day {
305
+ position: relative;
306
+ display: flex;
307
+ flex-direction: column;
308
+ align-items: center;
309
+ justify-content: center;
310
+ aspect-ratio: 1;
311
+ padding: 0.1875rem;
312
+ background: var(--tl-background, #ffffff);
313
+ border: 1px solid transparent;
314
+ border-radius: var(--tl-radius);
315
+ cursor: default;
316
+ transition: all 0.15s ease;
317
+ font-family: inherit;
318
+ font-size: 0.9375rem;
319
+ font-weight: 500;
320
+ color: var(--tl-foreground, #0f172a);
321
+ }
322
+
323
+ .calendar-day.other-month {
324
+ color: var(--tl-muted-foreground);
325
+ opacity: 0.5;
326
+ }
327
+
328
+ .calendar-day.has-occurrences {
329
+ cursor: pointer;
330
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 10%, var(--tl-background, #ffffff));
331
+ border-color: transparent;
332
+ font-weight: 600;
333
+ color: var(--tl-primary, #e64b12);
334
+ }
335
+
336
+ .calendar-day.has-occurrences:hover {
337
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 18%, var(--tl-background, #ffffff));
338
+ border-color: transparent;
339
+ }
340
+
341
+ .calendar-day.has-occurrences.sold-out {
342
+ background: var(--tl-muted, #f1f5f9);
343
+ border-color: transparent;
344
+ }
345
+
346
+ .calendar-day.has-occurrences.sold-out:hover {
347
+ background: color-mix(in srgb, var(--tl-muted, #f1f5f9) 80%, var(--tl-background, #ffffff));
348
+ border-color: transparent;
349
+ }
350
+
351
+ .calendar-day.selected {
352
+ background: var(--tl-primary, #e64b12);
353
+ border-color: var(--tl-primary, #e64b12);
354
+ color: var(--tl-primary-foreground, #ffffff);
355
+ }
356
+
357
+ .calendar-day.selected:hover {
358
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 90%, black);
359
+ }
360
+
361
+ .calendar-day.selected .occurrence-dot {
362
+ background: var(--tl-primary-foreground);
363
+ }
364
+
365
+ .calendar-day.today .day-number {
366
+ font-weight: 700;
367
+ text-decoration: underline;
368
+ text-underline-offset: 2px;
369
+ }
370
+
371
+ .calendar-day.past:not(.has-occurrences) {
372
+ opacity: 0.4;
373
+ }
374
+
375
+ .day-number {
376
+ line-height: 1;
377
+ }
378
+
379
+ .occurrence-dot {
380
+ display: none;
381
+ }
382
+
383
+ /* Slots Panel (Selected Date) */
384
+ .slots-panel {
385
+ min-height: 200px;
386
+ }
387
+
388
+ .selected-date-slots {
389
+ height: 100%;
390
+ }
391
+
392
+ .selected-date-slots.empty {
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ color: var(--tl-muted-foreground);
397
+ background: var(--tl-muted, #f1f5f9);
398
+ border-radius: var(--tl-radius);
399
+ padding: 2rem 1rem;
400
+ text-align: center;
401
+ min-height: 200px;
402
+ font-size: 0.875rem;
403
+ }
404
+
405
+ .selected-date-header {
406
+ font-size: 0.9375rem;
407
+ font-weight: 600;
408
+ color: var(--tl-foreground, #0f172a);
409
+ padding-bottom: 0.625rem;
410
+ margin-bottom: 0.625rem;
411
+ }
412
+
413
+ .time-slots-list {
414
+ display: flex;
415
+ flex-direction: column;
416
+ gap: 0.5rem;
417
+ }
418
+
419
+ .time-slot-item {
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: space-between;
423
+ width: 100%;
424
+ padding: 0.625rem 0.875rem;
425
+ background: var(--tl-background, #ffffff);
426
+ border: 1px solid var(--tl-border, #e2e8f0);
427
+ border-radius: var(--tl-radius);
428
+ text-align: left;
429
+ cursor: pointer;
430
+ transition: all 0.15s ease;
431
+ font-family: inherit;
432
+ }
433
+
434
+ .time-slot-item:hover:not(:disabled) {
435
+ border-color: var(--tl-primary, #e64b12);
436
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 5%, var(--tl-background, #ffffff));
437
+ }
438
+
439
+ .time-slot-item:focus-visible {
440
+ outline: 2px solid var(--tl-primary);
441
+ outline-offset: 2px;
442
+ }
443
+
444
+ .time-slot-item:disabled {
445
+ cursor: not-allowed;
446
+ opacity: 0.6;
447
+ background: var(--tl-muted, #f1f5f9);
448
+ }
449
+
450
+ .time-slot-item.sold-out {
451
+ opacity: 0.6;
452
+ background: var(--tl-muted, #f1f5f9);
453
+ }
454
+
455
+ .time-slot-item .slot-time {
456
+ font-size: 0.9375rem;
457
+ font-weight: 600;
458
+ }
459
+
460
+ .slot-status {
461
+ flex-shrink: 0;
462
+ }
463
+
464
+ .slot-status .status-sold-out {
465
+ font-size: 0.75rem;
466
+ }
467
+
468
+ .slot-status .status-available {
469
+ font-size: 0.75rem;
470
+ }
471
+
472
+ .slot-status .status-arrow {
473
+ font-size: 1rem;
474
+ }
475
+
476
+ /* =========================================================================
477
+ RESPONSIVE ADJUSTMENTS
478
+ ========================================================================= */
479
+
480
+ @media (max-width: 640px) {
481
+ .event-name {
482
+ font-size: 1.25rem;
483
+ }
484
+
485
+ .occurrence-date {
486
+ font-size: 0.875rem;
487
+ }
488
+
489
+ .time-slots-grid {
490
+ grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
491
+ }
492
+
493
+ .time-slot {
494
+ padding: 0.625rem 0.375rem;
495
+ min-height: 3rem;
496
+ }
497
+
498
+ .slot-time {
499
+ font-size: 0.875rem;
500
+ }
501
+
502
+ .calendar-day {
503
+ font-size: 0.75rem;
504
+ }
505
+
506
+ .weekday-header {
507
+ font-size: 0.625rem;
508
+ }
509
+
510
+ .calendar-view.horizontal .calendar-panel {
511
+ width: 100%;
512
+ }
513
+ }
514
+
515
+ @media (max-width: 767px) {
516
+ .calendar-view.horizontal {
517
+ flex-direction: column;
518
+ }
519
+ }
520
+
521
+ /* =========================================================================
522
+ LOADING STATE
523
+ ========================================================================= */
524
+
525
+ .loading-container {
526
+ padding: 1rem 0;
527
+ min-height: 400px;
528
+ }
529
+
530
+ /* Skeleton animation */
531
+ @keyframes skeleton-pulse {
532
+ 0%, 100% {
533
+ opacity: 1;
534
+ }
535
+ 50% {
536
+ opacity: 0.5;
537
+ }
538
+ }
539
+
540
+ .skeleton {
541
+ background: var(--tl-muted, #f1f5f9);
542
+ border-radius: var(--tl-radius);
543
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
544
+ }
545
+
546
+ /* Skeleton for list view */
547
+ .skeleton-list {
548
+ display: flex;
549
+ flex-direction: column;
550
+ gap: 0.75rem;
551
+ }
552
+
553
+ .skeleton-list-item {
554
+ height: 4.5rem;
555
+ border-radius: var(--tl-radius);
556
+ }
557
+
558
+ /* Skeleton for calendar view */
559
+ .skeleton-calendar {
560
+ border: 1px solid var(--tl-border, #e2e8f0);
561
+ border-radius: var(--tl-radius);
562
+ padding: 1rem;
563
+ min-height: 350px;
564
+ }
565
+
566
+ .skeleton-calendar-header {
567
+ height: 1.75rem;
568
+ width: 50%;
569
+ margin-bottom: 0.75rem;
570
+ border-radius: var(--tl-radius);
571
+ }
572
+
573
+ .skeleton-calendar-grid {
574
+ display: grid;
575
+ grid-template-columns: repeat(7, 1fr);
576
+ gap: 0.1875rem;
577
+ margin-top: 0.75rem;
578
+ }
579
+
580
+ .skeleton-calendar-day {
581
+ aspect-ratio: 1;
582
+ border-radius: var(--tl-radius);
583
+ }
584
+
585
+ /* Skeleton for slots view */
586
+ .skeleton-slots {
587
+ display: flex;
588
+ flex-direction: column;
589
+ gap: 1rem;
590
+ }
591
+
592
+ .skeleton-slots-header {
593
+ height: 1.75rem;
594
+ width: 60%;
595
+ border-radius: var(--tl-radius);
596
+ margin-bottom: 0.5rem;
597
+ }
598
+
599
+ .skeleton-slots-grid {
600
+ display: grid;
601
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
602
+ gap: 0.5rem;
603
+ }
604
+
605
+ .skeleton-slot-item {
606
+ height: 3.5rem;
607
+ border-radius: var(--tl-radius);
608
+ }
609
+
610
+ /* =========================================================================
611
+ ERROR STATE
612
+ ========================================================================= */
613
+
614
+ .error-container {
615
+ display: flex;
616
+ flex-direction: column;
617
+ align-items: center;
618
+ justify-content: center;
619
+ padding: 3rem 1rem;
620
+ gap: 1rem;
621
+ text-align: center;
622
+ }
623
+
624
+ .error-icon {
625
+ width: 3rem;
626
+ height: 3rem;
627
+ color: var(--tl-muted-foreground);
628
+ stroke-width: 1.5;
629
+ }
630
+
631
+ .error-message {
632
+ color: var(--tl-foreground, #0f172a);
633
+ font-size: 0.9375rem;
634
+ max-width: 400px;
635
+ }
636
+
637
+ .retry-button {
638
+ margin-top: 0.5rem;
639
+ padding: 0.625rem 1.25rem;
640
+ background: var(--tl-primary, #e64b12);
641
+ color: var(--tl-primary-foreground, #ffffff);
642
+ border: none;
643
+ border-radius: var(--tl-radius);
644
+ font-family: inherit;
645
+ font-size: 0.875rem;
646
+ font-weight: 500;
647
+ cursor: pointer;
648
+ transition: all 0.15s ease;
649
+ }
650
+
651
+ .retry-button:hover {
652
+ background: color-mix(in srgb, var(--tl-primary, #e64b12) 90%, black);
653
+ }
654
+
655
+ .retry-button:focus-visible {
656
+ outline: 2px solid var(--tl-primary);
657
+ outline-offset: 2px;
658
+ }