@wix/agent-skills 1.8.0 → 1.10.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 (66) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +2 -1
  3. package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +14 -0
  4. package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +11 -6
  5. package/skills/wix-app/references/editor-react-component/REACT-PATTERNS.md +3 -17
  6. package/skills/wix-app/references/editor-react-component/SSR.md +119 -0
  7. package/skills/wix-design-system/SKILL.md +1 -1
  8. package/skills/wix-headless/references/BUILD-astro.md +5 -7
  9. package/skills/wix-headless/references/DESIGN_SYSTEM.md +6 -16
  10. package/skills/wix-headless/references/SETUP.md +1 -1
  11. package/skills/wix-headless/references/astro/bookings/COMPONENTS.md +41 -333
  12. package/skills/wix-headless/references/astro/bookings/SERVICES_PAGES.md +77 -428
  13. package/skills/wix-headless/references/astro/cms/FAQ_KNOWLEDGE_BASE.md +2 -2
  14. package/skills/wix-headless/references/astro/designer/INSTRUCTIONS.md +7 -10
  15. package/skills/wix-headless/references/astro/ecom/CART_WIRING.md +2 -2
  16. package/skills/wix-headless/references/astro/ecom/COMPONENTS_CSS.md +3 -3
  17. package/skills/wix-headless/references/astro/gift-cards/COMPONENTS.md +2 -2
  18. package/skills/wix-headless/references/astro/stores/BACK_IN_STOCK.md +7 -7
  19. package/skills/wix-headless/references/astro/stores/COMPONENTS_CSS.md +4 -4
  20. package/skills/wix-headless/references/astro/stores/PRODUCT_PAGES.md +2 -2
  21. package/skills/wix-headless/references/astro/templates/Footer.astro +4 -4
  22. package/skills/wix-headless/references/astro/templates/Navigation.astro +4 -4
  23. package/skills/wix-headless/references/astro/templates/bookings/AvailabilityCalendar.tsx +298 -142
  24. package/skills/wix-headless/references/astro/templates/bookings/BookingForm.tsx +104 -162
  25. package/skills/wix-headless/references/astro/templates/bookings/ServiceBookingFlow.tsx +35 -14
  26. package/skills/wix-headless/references/astro/templates/bookings/ServiceCard.astro +11 -2
  27. package/skills/wix-headless/references/astro/templates/bookings/booking-confirmation.astro +23 -85
  28. package/skills/wix-headless/references/astro/templates/bookings/bookingDriver.ts +245 -0
  29. package/skills/wix-headless/references/astro/templates/bookings/components-bookings.css +209 -198
  30. package/skills/wix-headless/references/astro/templates/bookings/services/[slug].astro +114 -19
  31. package/skills/wix-headless/references/astro/templates/bookings/services/index.astro +131 -15
  32. package/skills/wix-headless/references/astro/templates/ecom/CartView.tsx +3 -3
  33. package/skills/wix-headless/references/astro/templates/ecom/cart.astro +3 -3
  34. package/skills/wix-headless/references/astro/templates/ecom/components-ecom.css +17 -17
  35. package/skills/wix-headless/references/astro/templates/ecom/thank-you.astro +3 -3
  36. package/skills/wix-headless/references/astro/templates/gift-cards/_home-teaser-snippet.astro +4 -4
  37. package/skills/wix-headless/references/astro/templates/gift-cards/components-gift-cards.css +19 -18
  38. package/skills/wix-headless/references/astro/templates/gift-cards/gift-cards.astro +3 -3
  39. package/skills/wix-headless/references/astro/templates/global.css +17 -15
  40. package/skills/wix-headless/references/astro/templates/index.astro +4 -4
  41. package/skills/wix-headless/references/astro/templates/stores/components-stores.css +31 -31
  42. package/skills/wix-headless/references/astro/templates/stores/products/[slug].astro +4 -4
  43. package/skills/wix-headless/references/bookings/FLOW.md +246 -0
  44. package/skills/wix-headless/references/bookings/INSTRUCTIONS.md +65 -76
  45. package/skills/wix-headless/references/bookings/SERVICES_DATA.md +60 -0
  46. package/skills/wix-headless/references/custom/bookings/WIRING.md +169 -60
  47. package/skills/wix-headless/references/shared/DESIGN_MD.md +2 -3
  48. package/skills/wix-headless/references/shared/IMPLEMENTER.md +4 -4
  49. package/skills/wix-headless/references/shared/STYLING.md +15 -18
  50. package/skills/wix-headless/references/stores/INSTRUCTIONS.md +2 -2
  51. package/skills/wix-headless/references/verticals/bookings.md +9 -9
  52. package/skills/wix-headless/scripts/compose.mjs +4 -19
  53. package/skills/wix-headless/scripts/emit-design-tokens.mjs +0 -3
  54. package/skills/wix-manage/SKILL.md +12 -0
  55. package/skills/wix-manage/references/app-installation/install-wix-apps.md +3 -27
  56. package/skills/wix-manage/references/bookings/create-appointment-service.md +254 -0
  57. package/skills/wix-manage/references/bookings/create-booking-service-from-prompt.md +37 -0
  58. package/skills/wix-manage/references/bookings/create-class-service.md +233 -0
  59. package/skills/wix-manage/references/bookings/create-course-service.md +237 -0
  60. package/skills/wix-manage/references/cms/cms-data-items-crud.md +2 -1
  61. package/skills/wix-manage/references/cms/cms-schema-management.md +1 -1
  62. package/skills/wix-manage/references/stores/create-product-from-image.md +154 -2
  63. package/skills/wix-headless/references/astro/templates/bookings/ManageBooking.tsx +0 -84
  64. package/skills/wix-headless/references/astro/templates/bookings/api/confirm-booking.ts +0 -34
  65. package/skills/wix-headless/references/astro/templates/bookings/api/waitlist.ts +0 -74
  66. package/skills/wix-headless/references/astro/templates/bookings/manage-booking.astro +0 -76
@@ -1,43 +1,28 @@
1
1
  /* src/styles/components-bookings.css
2
2
  *
3
- * Bookings-pack component CSS. Pre-copied by the orchestrator at Step 4.5
4
- * before Phase 3 Components dispatches. Do NOT write or modify this file
5
- * from a Phase 3 or Phase 4 subagent — it is already on disk.
3
+ * Bookings-pack component CSS. Pre-copied by the orchestrator before the build
4
+ * wave (it is brand-agnostic var(--token) CSS). The designer's global.css does
5
+ * NOT publish these classes — they live here. See references/shared/STYLING.md
6
+ * § "Component-specific CSS is owned by the component, not the designer".
6
7
  *
7
- * This file is the SINGLE source of truth for bookings-component classes.
8
- * The designer's global.css does NOT publish .service-card, .service-grid,
9
- * .availability-calendar, .time-slot, or .booking-form — those all live
10
- * here. See references/shared/STYLING.md § "Component-specific CSS is
11
- * owned by the component, not the designer".
8
+ * Class groups:
9
+ * - .service-card / .service-grid / .service-card-* → ServiceCard.astro, services/index.astro
10
+ * - .booking-filter-bar / .booking-filter-chip* → services/index.astro (location + category filters)
11
+ * - .availability-* / .time-slot* → AvailabilityCalendar.tsx (week calendar, slots, staff picker)
12
+ * - .booking-* → BookingForm.tsx (schema-driven form)
12
13
  *
13
- * Class groups in this file:
14
- * - .service-card / .service-grid / .service-card-* → ServiceCard.astro,
15
- * services/index.astro, index.astro home teaser
16
- * - .availability-calendar / .time-slot / .time-slot-* / .availability-*
17
- * → AvailabilityCalendar.tsx date picker + slot grid
18
- * - .booking-form / .booking-field / .booking-* → BookingForm.tsx
19
- * details form + submit button
14
+ * Primary actions (a selected slot, the confirm button) use var(--color-accent)
15
+ * so the flow matches the site's primary-action styling.
20
16
  *
21
- * Rules use direct CSS (`var(--token)`) only — no `@apply`. Tailwind v4
22
- * `@apply` in a non-entrypoint file only resolves utilities whose theme keys
23
- * the designer's `@theme` block declares. Direct `var(--color-ink)` /
24
- * `var(--spacing-sm)` calls work against any designer-published token set as
25
- * long as the core scales exist (they always do). Use fallback chains
26
- * (`var(--color-paper-warm, var(--color-paper, var(--color-cream)))`) for
27
- * sometimes-published tokens.
17
+ * Direct var(--token) only (no @apply). Fallback chains for sometimes-published
18
+ * tokens, e.g. var(--color-paper-warm, var(--color-paper, var(--color-cream))).
28
19
  */
29
20
 
30
- /* =========================================================================
31
- Service grid + card — owned here, NOT in global.css.
32
- .service-card uses overflow: hidden + border-radius, so inner padding
33
- is the responsibility of THIS file (whoever sets the radius owns the
34
- inset). The image is clipped by the card's overflow; content needs
35
- padding-inline so text doesn't sit flush against the rounded edge.
36
- ========================================================================= */
21
+ /* ── Service grid + card ────────────────────────────────────────────────────── */
37
22
  .service-grid {
38
23
  display: grid;
39
24
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
40
- gap: var(--spacing-xl);
25
+ gap: 2rem;
41
26
  transition: opacity 200ms ease;
42
27
  }
43
28
  body[data-navigating="true"] .service-grid {
@@ -75,18 +60,14 @@ body[data-navigating="true"] .service-grid {
75
60
  object-fit: cover;
76
61
  transition: transform 600ms ease;
77
62
  }
78
- .service-card-image--placeholder {
79
- /* fallback when no image is provided */
80
- }
81
63
 
82
64
  .service-card-meta {
83
65
  display: flex;
84
66
  flex-direction: column;
85
- gap: var(--spacing-xs);
86
- padding: var(--spacing-md) var(--spacing-md) var(--spacing-lg);
67
+ gap: 0.5rem;
68
+ padding: 1rem 1rem 1.5rem;
87
69
  flex: 1;
88
70
  }
89
-
90
71
  .service-card-name {
91
72
  margin: 0;
92
73
  font-family: var(--font-display);
@@ -94,7 +75,6 @@ body[data-navigating="true"] .service-grid {
94
75
  line-height: 1.25;
95
76
  color: var(--color-ink);
96
77
  }
97
-
98
78
  .service-card-tagline {
99
79
  margin: 0;
100
80
  font-family: var(--font-body);
@@ -102,43 +82,105 @@ body[data-navigating="true"] .service-grid {
102
82
  color: var(--color-ink-soft, var(--color-mute));
103
83
  line-height: 1.45;
104
84
  }
105
-
106
85
  .service-card-price {
107
86
  display: flex;
108
87
  align-items: center;
109
- gap: var(--spacing-sm);
88
+ gap: 0.75rem;
110
89
  margin-top: auto;
111
- padding-top: var(--spacing-sm);
90
+ padding-top: 0.75rem;
112
91
  font-family: var(--font-body);
113
92
  font-size: 0.875rem;
114
93
  color: var(--color-mute);
115
94
  }
116
95
  .service-card-price span + span::before {
117
96
  content: "·";
118
- padding-right: var(--spacing-sm);
97
+ padding-right: 0.75rem;
119
98
  color: var(--color-rule);
120
99
  }
121
100
 
122
- /* =========================================================================
123
- Availability calendar — date navigator + slot grid.
124
- Owned here, NOT in global.css.
125
- ========================================================================= */
101
+ /* ── Catalog filters (location + category) ──────────────────────────────────── */
102
+ .booking-filter-bar {
103
+ display: flex;
104
+ flex-wrap: wrap;
105
+ gap: 0.75rem;
106
+ margin-bottom: 2rem;
107
+ }
108
+ .booking-filter-chip {
109
+ padding: 0.5rem 1rem;
110
+ border: 1px solid var(--color-rule);
111
+ border-radius: var(--radius-pill, 999px);
112
+ background: var(--color-paper, var(--color-cream));
113
+ color: var(--color-ink);
114
+ font-family: var(--font-body);
115
+ font-size: 0.875rem;
116
+ text-decoration: none;
117
+ cursor: pointer;
118
+ transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease;
119
+ }
120
+ .booking-filter-chip:hover {
121
+ border-color: var(--color-ink);
122
+ }
123
+ .booking-filter-chip--active {
124
+ background: var(--color-accent);
125
+ border-color: var(--color-accent);
126
+ color: var(--color-paper);
127
+ }
128
+
129
+ /* ── Availability — week calendar ───────────────────────────────────────────── */
126
130
  .availability-calendar {
127
131
  display: flex;
128
132
  flex-direction: column;
129
- gap: var(--spacing-lg);
133
+ gap: 1.5rem;
134
+ }
135
+
136
+ /* Filter row — holds the optional location + staff pickers side by side. */
137
+ .availability-filters {
138
+ display: flex;
139
+ flex-wrap: wrap;
140
+ gap: 1rem;
141
+ }
142
+ .availability-filters > * {
143
+ flex: 1 1 12rem;
144
+ }
145
+
146
+ /* Location / staff picker (shown only when there's >1 option). */
147
+ .availability-staff {
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: 0.5rem;
151
+ }
152
+ .availability-staff-label {
153
+ font-family: var(--font-display);
154
+ font-size: 0.75rem;
155
+ text-transform: uppercase;
156
+ letter-spacing: 0.05em;
157
+ color: var(--color-ink-soft, var(--color-mute));
158
+ }
159
+ .availability-staff-select {
160
+ width: 100%;
161
+ padding: 0.75rem 1rem;
162
+ font-family: var(--font-body);
163
+ font-size: 0.9375rem;
164
+ border: 1px solid var(--color-rule);
165
+ border-radius: var(--radius-sm);
166
+ background: var(--color-paper, var(--color-cream));
167
+ color: var(--color-ink);
168
+ box-sizing: border-box;
169
+ }
170
+ .availability-staff-select:focus {
171
+ outline: none;
172
+ border-color: var(--color-accent);
130
173
  }
131
174
 
132
- .availability-date-nav {
175
+ .availability-week-nav {
133
176
  display: flex;
134
177
  align-items: center;
135
178
  justify-content: space-between;
136
- gap: var(--spacing-md);
137
- padding: var(--spacing-sm) 0;
179
+ gap: 1rem;
180
+ padding: 0.75rem 0;
138
181
  border-bottom: 1px solid var(--color-rule);
139
182
  }
140
-
141
- .availability-date-label {
183
+ .availability-week-label {
142
184
  font-family: var(--font-display);
143
185
  font-size: 1rem;
144
186
  color: var(--color-ink);
@@ -147,7 +189,7 @@ body[data-navigating="true"] .service-grid {
147
189
  }
148
190
 
149
191
  .availability-nav-btn {
150
- padding: var(--spacing-sm) var(--spacing-md);
192
+ padding: 0.75rem 1rem;
151
193
  background: transparent;
152
194
  border: 1px solid var(--color-rule);
153
195
  border-radius: var(--radius-sm);
@@ -166,31 +208,79 @@ body[data-navigating="true"] .service-grid {
166
208
  cursor: not-allowed;
167
209
  }
168
210
 
169
- .availability-slots {
211
+ /* The 7-day strip. */
212
+ .availability-day-strip {
170
213
  display: grid;
171
- grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
172
- gap: var(--spacing-sm);
214
+ grid-template-columns: repeat(7, 1fr);
215
+ gap: 0.75rem;
216
+ }
217
+ .availability-day {
218
+ display: flex;
219
+ flex-direction: column;
220
+ align-items: center;
221
+ gap: 2px;
222
+ padding: 0.75rem 0;
223
+ border: 1px solid var(--color-rule);
224
+ border-radius: var(--radius-sm);
225
+ background: var(--color-paper, var(--color-cream));
226
+ color: var(--color-ink);
227
+ font-family: var(--font-body);
228
+ cursor: pointer;
229
+ transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease;
230
+ }
231
+ .availability-day-name {
232
+ font-size: 0.7rem;
233
+ text-transform: uppercase;
234
+ letter-spacing: 0.04em;
235
+ color: var(--color-mute);
236
+ }
237
+ .availability-day-num {
238
+ font-size: 1rem;
239
+ font-weight: 600;
240
+ }
241
+ .availability-day--has-slots:hover {
242
+ border-color: var(--color-accent);
243
+ }
244
+ .availability-day--empty {
245
+ opacity: 0.4;
246
+ cursor: not-allowed;
247
+ }
248
+ .availability-day--selected {
249
+ background: var(--color-accent);
250
+ border-color: var(--color-accent);
251
+ color: var(--color-paper);
252
+ }
253
+ .availability-day--selected .availability-day-name {
254
+ color: var(--color-paper);
173
255
  }
174
256
 
257
+ .availability-slots {
258
+ display: grid;
259
+ grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
260
+ gap: 0.75rem;
261
+ }
175
262
  .availability-loading,
176
263
  .availability-empty,
177
264
  .availability-error {
178
265
  font-family: var(--font-body);
179
266
  font-size: 0.9375rem;
180
267
  color: var(--color-ink-soft, var(--color-mute));
181
- padding: var(--spacing-lg) 0;
268
+ padding: 1.5rem 0;
182
269
  text-align: center;
183
270
  }
271
+ .availability-empty {
272
+ display: flex;
273
+ flex-direction: column;
274
+ align-items: center;
275
+ gap: 1rem;
276
+ }
184
277
  .availability-error {
185
278
  color: var(--color-error, var(--color-accent));
186
279
  }
187
280
 
188
- /* =========================================================================
189
- Time slot buttons — individual slot items in the grid.
190
- Three states: available (default), selected, unavailable.
191
- ========================================================================= */
281
+ /* ── Time-slot buttons ──────────────────────────────────────────────────────── */
192
282
  .time-slot {
193
- padding: var(--spacing-sm) var(--spacing-md);
283
+ padding: 0.75rem 1rem;
194
284
  border: 1px solid var(--color-rule);
195
285
  border-radius: var(--radius-sm);
196
286
  background: var(--color-paper, var(--color-cream));
@@ -201,73 +291,73 @@ body[data-navigating="true"] .service-grid {
201
291
  cursor: pointer;
202
292
  transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease;
203
293
  }
294
+ .time-slot-time {
295
+ font-weight: 500;
296
+ }
204
297
  .time-slot--available {
205
298
  border-color: var(--color-ink);
206
299
  }
207
300
  .time-slot--available:hover {
208
- background: var(--color-ink);
301
+ background: var(--color-accent);
302
+ border-color: var(--color-accent);
209
303
  color: var(--color-paper);
210
304
  }
211
305
  .time-slot--selected {
212
- background: var(--color-ink);
306
+ background: var(--color-accent);
307
+ border-color: var(--color-accent);
213
308
  color: var(--color-paper);
214
- border-color: var(--color-ink);
215
309
  font-weight: 600;
216
310
  }
217
- .time-slot--unavailable {
218
- opacity: 0.3;
219
- cursor: not-allowed;
220
- border-color: var(--color-rule);
221
- }
222
311
 
223
- /* =========================================================================
224
- Booking form — rendered after a slot is selected.
225
- Owned here, NOT in global.css.
226
- ========================================================================= */
312
+ /* ── Booking form (schema-driven) ───────────────────────────────────────────── */
227
313
  .booking-form {
228
314
  display: flex;
229
315
  flex-direction: column;
230
- gap: var(--spacing-lg);
231
- padding: var(--spacing-xl);
316
+ gap: 1.5rem;
317
+ padding: 2rem;
232
318
  border: 1px solid var(--color-rule);
233
319
  border-radius: var(--radius-md);
234
320
  background: var(--color-paper-warm, var(--color-paper, var(--color-cream)));
235
321
  }
236
322
 
237
- .booking-form-header {
323
+ .booking-form-summary {
238
324
  display: flex;
239
325
  flex-direction: column;
240
- gap: var(--spacing-xs);
326
+ gap: 0.5rem;
327
+ padding-bottom: 1rem;
328
+ border-bottom: 1px solid var(--color-rule);
241
329
  }
242
- .booking-form-title {
330
+ .booking-form-summary strong {
243
331
  font-family: var(--font-display);
244
- font-size: 1.25rem;
332
+ font-size: 1.125rem;
245
333
  color: var(--color-ink);
246
- margin: 0;
247
334
  }
248
- .booking-form-subtitle {
335
+ .booking-form-summary span {
249
336
  font-family: var(--font-body);
250
- font-size: 0.875rem;
337
+ font-size: 0.9375rem;
251
338
  color: var(--color-ink-soft, var(--color-mute));
252
- margin: 0;
339
+ }
340
+ .booking-form-change {
341
+ align-self: flex-start;
342
+ margin-top: 0.5rem;
343
+ background: none;
344
+ border: none;
345
+ padding: 0;
346
+ font-family: var(--font-body);
347
+ font-size: 0.8125rem;
348
+ color: var(--color-mute);
349
+ text-decoration: underline;
350
+ cursor: pointer;
351
+ }
352
+ .booking-form-change:hover {
353
+ color: var(--color-ink);
253
354
  }
254
355
 
255
356
  .booking-field {
256
357
  display: flex;
257
358
  flex-direction: column;
258
- gap: var(--spacing-xs);
359
+ gap: 0.5rem;
259
360
  }
260
- .booking-field-row {
261
- display: grid;
262
- grid-template-columns: 1fr 1fr;
263
- gap: var(--spacing-md);
264
- }
265
- @media (max-width: 480px) {
266
- .booking-field-row {
267
- grid-template-columns: 1fr;
268
- }
269
- }
270
-
271
361
  .booking-label {
272
362
  font-family: var(--font-display);
273
363
  font-size: 0.75rem;
@@ -275,15 +365,13 @@ body[data-navigating="true"] .service-grid {
275
365
  letter-spacing: 0.05em;
276
366
  color: var(--color-ink-soft, var(--color-mute));
277
367
  }
278
- .booking-label--required::after {
279
- content: " *";
368
+ .booking-required {
280
369
  color: var(--color-accent);
281
370
  }
282
371
 
283
- .booking-input,
284
- .booking-textarea {
372
+ .booking-input {
285
373
  width: 100%;
286
- padding: var(--spacing-sm) var(--spacing-md);
374
+ padding: 0.75rem 1rem;
287
375
  font-family: var(--font-body);
288
376
  font-size: 0.9375rem;
289
377
  border: 1px solid var(--color-rule);
@@ -293,121 +381,44 @@ body[data-navigating="true"] .service-grid {
293
381
  transition: border-color 150ms ease;
294
382
  box-sizing: border-box;
295
383
  }
296
- .booking-input:focus,
297
- .booking-textarea:focus {
384
+ .booking-input:focus {
298
385
  outline: none;
299
- border-color: var(--color-ink);
386
+ border-color: var(--color-accent);
300
387
  }
301
- .booking-textarea {
388
+ textarea.booking-input {
302
389
  resize: vertical;
303
390
  min-height: 6rem;
304
391
  }
305
392
 
306
- .booking-submit {
393
+ .booking-error {
394
+ font-family: var(--font-body);
395
+ font-size: 0.875rem;
396
+ color: var(--color-error, var(--color-accent));
397
+ padding: 0.75rem 1rem;
398
+ border: 1px solid var(--color-error, var(--color-accent));
399
+ border-radius: var(--radius-sm);
400
+ }
401
+
402
+ .booking-cta {
307
403
  display: inline-flex;
308
404
  align-items: center;
309
405
  justify-content: center;
310
- padding: var(--spacing-md) var(--spacing-xl);
406
+ width: 100%;
407
+ padding: 1rem 2rem;
311
408
  font-family: var(--font-display);
312
409
  font-size: 0.9375rem;
313
410
  font-weight: 500;
314
- background: var(--color-ink);
411
+ background: var(--color-accent);
315
412
  color: var(--color-paper);
316
- border: 1px solid var(--color-ink);
413
+ border: 1px solid var(--color-accent);
317
414
  border-radius: var(--radius-sm);
318
415
  cursor: pointer;
319
- width: 100%;
320
- margin-top: var(--spacing-sm);
321
- transition: background-color 150ms ease, box-shadow 150ms ease;
416
+ transition: opacity 150ms ease;
322
417
  }
323
- .booking-submit:hover:not(:disabled) {
324
- background: var(--color-ink-soft, var(--color-ink));
418
+ .booking-cta:hover:not(:disabled) {
419
+ opacity: 0.9;
325
420
  }
326
- .booking-submit:disabled {
421
+ .booking-cta:disabled {
327
422
  opacity: 0.5;
328
423
  cursor: not-allowed;
329
424
  }
330
-
331
- .booking-cancel {
332
- display: block;
333
- text-align: center;
334
- font-family: var(--font-body);
335
- font-size: 0.875rem;
336
- color: var(--color-mute);
337
- cursor: pointer;
338
- background: none;
339
- border: none;
340
- text-decoration: underline;
341
- padding: 0;
342
- margin-top: var(--spacing-xs);
343
- }
344
- .booking-cancel:hover {
345
- color: var(--color-ink);
346
- }
347
-
348
- .booking-error {
349
- font-family: var(--font-body);
350
- font-size: 0.875rem;
351
- color: var(--color-error, var(--color-accent));
352
- padding: var(--spacing-sm) var(--spacing-md);
353
- border: 1px solid var(--color-error, var(--color-accent));
354
- border-radius: var(--radius-sm);
355
- background: rgba(255, 0, 0, 0.04);
356
- }
357
-
358
- /* ── Slot capacity (CLASS) + full→waitlist ─────────────────────────────────── */
359
- .time-slot {
360
- display: flex;
361
- flex-direction: column;
362
- align-items: center;
363
- gap: 2px;
364
- line-height: 1.2;
365
- }
366
- .time-slot-time {
367
- font-weight: 500;
368
- }
369
- .time-slot-capacity {
370
- font-size: 0.7rem;
371
- letter-spacing: 0.04em;
372
- text-transform: uppercase;
373
- color: var(--color-mute, var(--color-secondary));
374
- }
375
- .time-slot--full {
376
- opacity: 0.85;
377
- border-style: dashed;
378
- }
379
- .time-slot--full .time-slot-capacity {
380
- color: var(--color-accent);
381
- }
382
- .booking-form-note {
383
- font-family: var(--font-body);
384
- font-size: 0.875rem;
385
- color: var(--color-mute, var(--color-secondary));
386
- margin-top: var(--spacing-xs);
387
- }
388
-
389
- /* ── Manage booking page ─────────────────────────────────────────────────────── */
390
- .manage-booking {
391
- display: flex;
392
- flex-direction: column;
393
- gap: var(--spacing-lg);
394
- align-items: flex-start;
395
- }
396
- .manage-booking-summary,
397
- .manage-booking-status {
398
- font-family: var(--font-body);
399
- font-size: 1.05rem;
400
- color: var(--color-ink, var(--color-primary));
401
- }
402
- .manage-booking-note {
403
- font-family: var(--font-body);
404
- font-size: 0.875rem;
405
- color: var(--color-mute, var(--color-secondary));
406
- }
407
- .manage-booking-link {
408
- color: var(--color-ink, var(--color-primary));
409
- text-decoration: underline;
410
- }
411
- .manage-booking-link:hover {
412
- color: var(--color-accent);
413
- }