@posthog/twig-components 0.1.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/build-assets.mjs +18 -0
  4. package/dist/AiLab.d.ts +26 -0
  5. package/dist/AiLab.js +140 -0
  6. package/dist/BookingLab.d.ts +19 -0
  7. package/dist/BookingLab.js +100 -0
  8. package/dist/BrowseStaysPreview.d.ts +7 -0
  9. package/dist/BrowseStaysPreview.js +6 -0
  10. package/dist/FilterInspector.d.ts +7 -0
  11. package/dist/FilterInspector.js +27 -0
  12. package/dist/FilterLabExercise.d.ts +14 -0
  13. package/dist/FilterLabExercise.js +78 -0
  14. package/dist/FinishLabButton.d.ts +3 -0
  15. package/dist/FinishLabButton.js +5 -0
  16. package/dist/LabChecklist.d.ts +8 -0
  17. package/dist/LabChecklist.js +6 -0
  18. package/dist/LabChoices.d.ts +10 -0
  19. package/dist/LabChoices.js +7 -0
  20. package/dist/LabCompletionView.d.ts +8 -0
  21. package/dist/LabCompletionView.js +43 -0
  22. package/dist/LabNavigation.d.ts +9 -0
  23. package/dist/LabNavigation.js +7 -0
  24. package/dist/PlaygroundController.d.ts +31 -0
  25. package/dist/PlaygroundController.js +82 -0
  26. package/dist/PlaygroundPanels.d.ts +32 -0
  27. package/dist/PlaygroundPanels.js +33 -0
  28. package/dist/ReplayLab.d.ts +28 -0
  29. package/dist/ReplayLab.js +70 -0
  30. package/dist/ReplayRecorder.d.ts +28 -0
  31. package/dist/ReplayRecorder.js +357 -0
  32. package/dist/SessionPlayer.d.ts +5 -0
  33. package/dist/SessionPlayer.js +124 -0
  34. package/dist/StayCard.d.ts +7 -0
  35. package/dist/StayCard.js +5 -0
  36. package/dist/StayFilters.d.ts +14 -0
  37. package/dist/StayFilters.js +7 -0
  38. package/dist/StayLab.d.ts +16 -0
  39. package/dist/StayLab.js +47 -0
  40. package/dist/ai-lab.d.ts +55 -0
  41. package/dist/ai-lab.js +130 -0
  42. package/dist/assets/Halfre.ttf +0 -0
  43. package/dist/assets/RoundHog-Medium.woff2 +0 -0
  44. package/dist/assets/RoundHog-SemiBold.woff2 +0 -0
  45. package/dist/assets/RoundHog.woff2 +0 -0
  46. package/dist/assets/cabin.jpg +0 -0
  47. package/dist/assets/cliff.png +0 -0
  48. package/dist/assets/logo.svg +4 -0
  49. package/dist/booking-lab.d.ts +53 -0
  50. package/dist/booking-lab.js +134 -0
  51. package/dist/catalog.css +259 -0
  52. package/dist/catalog.d.ts +57 -0
  53. package/dist/catalog.js +111 -0
  54. package/dist/filter-lab.d.ts +62 -0
  55. package/dist/filter-lab.js +133 -0
  56. package/dist/lab.css +774 -0
  57. package/dist/playground.d.ts +167 -0
  58. package/dist/playground.js +91 -0
  59. package/dist/replay-lab.d.ts +19 -0
  60. package/dist/replay-lab.js +26 -0
  61. package/dist/settings.d.ts +2 -0
  62. package/dist/settings.js +1 -0
  63. package/dist/stay-lab.d.ts +32 -0
  64. package/dist/stay-lab.js +53 -0
  65. package/dist/trip-dates.d.ts +11 -0
  66. package/dist/trip-dates.js +49 -0
  67. package/docs/components.md +78 -0
  68. package/docs/integration.md +59 -0
  69. package/docs/workbench.md +37 -0
  70. package/package.json +241 -0
package/dist/lab.css ADDED
@@ -0,0 +1,774 @@
1
+ /* PostHog-styled playground and lab UI. Twig site styling lives in catalog.css. */
2
+ /* Exact accents: brand.posthog.com/colors; neutrals: posthog.com brand assets and Tailwind config. */
3
+ .vac-app {
4
+ --ph-brand-cobalt: #0457ff;
5
+ /* posthog.com/tailwind.config.js: colors.button, OSButton outline. */
6
+ --ph-os-button-border: #b17816;
7
+ --ph-brand-yellow: #ffa81c;
8
+ --ph-brand-tangerine: #ff5c1c;
9
+ --ph-neutral-ink: #151515;
10
+ --ph-neutral-background: #eeefe9;
11
+ --ph-neutral-accent: #e5e7e0;
12
+ --ph-neutral-border: #d0d1c9;
13
+ --ph-neutral-white: #ffffff;
14
+ --ph-neutral-muted: #4d4f46;
15
+ }
16
+
17
+ /* Portable baseline for the Filter Lab inside a host-provided .vac-app shell. */
18
+ .vac-app .vac-developer-theme {
19
+ font-size: 15px;
20
+ line-height: 1.6;
21
+ }
22
+ .vac-app .vac-developer-theme * { box-sizing: border-box; }
23
+ .vac-app .vac-developer-theme :is(button, input) { font: inherit; }
24
+ .vac-app .vac-developer-theme button:not(:disabled) { cursor: pointer; }
25
+ .vac-app .vac-developer-theme .vac-muted { color: var(--vac-muted); font-size: 13px; }
26
+ .vac-app .vac-developer-theme .vac-lab { margin: 16px 0 28px; }
27
+ .vac-app .vac-developer-theme .vac-lab h3 { font-size: 23px; line-height: 1.2; margin: 16px 0; }
28
+ .vac-app .vac-developer-theme .vac-lab h4,
29
+ .vac-app .vac-developer-theme .vac-lab legend { font-size: 14px; font-weight: 600; }
30
+ .vac-app .vac-developer-theme .vac-lab-step { border: 0; border-top: 1px solid var(--vac-line); padding: 16px 0; margin-top: 16px; }
31
+ .vac-app .vac-developer-theme .vac-lab summary { cursor: pointer; font-size: 14px; font-weight: 500; }
32
+ .vac-app .vac-developer-theme .vac-lab-output { padding: 16px; background: var(--vac-paper); border: 1px solid var(--vac-line); border-radius: 8px; }
33
+ .vac-app .vac-developer-theme .vac-lab pre { font: 12px/1.65 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: pre-wrap; overflow-wrap: anywhere; background: var(--vac-ink); color: var(--vac-paper); padding: 12px; border-radius: 4px; margin: 12px 0; }
34
+ .vac-app .vac-developer-theme .vac-lab-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0; }
35
+ .vac-app .vac-developer-theme .vac-browse-link { display: block; width: fit-content; margin: 8px 0; text-decoration: underline; text-underline-offset: 4px; font-size: 14px; }
36
+ .vac-app .vac-developer-theme .vac-inspect-name { display: block; font-size: 12px; overflow-wrap: anywhere; margin: 8px 0 16px; }
37
+ .vac-app .vac-developer-theme .vac-event-comparison { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
38
+ .vac-app .vac-developer-theme .vac-event-comparison dt { font-size: 11px; color: var(--vac-muted); }
39
+ .vac-app .vac-developer-theme .vac-event-comparison dd { margin: 6px 0 0; overflow-wrap: anywhere; font-size: 16px; }
40
+ .vac-app .vac-developer-theme .vac-lab pre mark { background: var(--ph-brand-yellow); color: var(--ph-neutral-ink); }
41
+ @media (max-width: 520px) {
42
+ .vac-app .vac-developer-theme .vac-event-comparison { grid-template-columns: minmax(0, 1fr); }
43
+ }
44
+
45
+ /* Adapted from PostHog base.scss and Lemon UI; fonts from @posthog/brand. */
46
+ @font-face {
47
+ font-family: PlaygroundRoundHog;
48
+ src: url("./assets/RoundHog.woff2") format("woff2");
49
+ font-weight: 400;
50
+ font-display: swap;
51
+ }
52
+ @font-face {
53
+ font-family: PlaygroundRoundHog;
54
+ src: url("./assets/RoundHog-Medium.woff2") format("woff2");
55
+ font-weight: 500;
56
+ font-display: swap;
57
+ }
58
+ @font-face {
59
+ font-family: PlaygroundRoundHog;
60
+ src: url("./assets/RoundHog-SemiBold.woff2") format("woff2");
61
+ font-weight: 600 700;
62
+ font-display: swap;
63
+ }
64
+ .vac-app .vac-developer-theme {
65
+ --vac-paper: var(--ph-neutral-white);
66
+ --vac-fill: var(--ph-neutral-background);
67
+ --vac-ink: var(--ph-neutral-ink);
68
+ --vac-muted: var(--ph-neutral-muted);
69
+ --vac-line: var(--ph-neutral-border);
70
+ --ph-accent: var(--ph-brand-tangerine);
71
+ --vac-highlight: var(--ph-brand-yellow);
72
+ --ph-highlight: var(--ph-brand-yellow);
73
+ --ph-light-1: var(--ph-neutral-white);
74
+ --ph-light-12: var(--ph-neutral-ink);
75
+ font-family: PlaygroundRoundHog, -apple-system, BlinkMacSystemFont, "Segoe UI",
76
+ sans-serif;
77
+ color: var(--vac-ink);
78
+ background: var(--vac-fill);
79
+ border-color: var(--ph-neutral-border);
80
+ border-radius: 6px;
81
+ box-shadow: 0 3px 0 var(--ph-neutral-border);
82
+ }
83
+ .vac-app .vac-developer-theme :is(h1, h2, h3, h4) {
84
+ font-family: inherit;
85
+ color: var(--vac-ink);
86
+ font-weight: 600;
87
+ letter-spacing: normal;
88
+ }
89
+ .vac-app .vac-developer-theme h3 {
90
+ font-size: 18px;
91
+ line-height: 1.35;
92
+ }
93
+ .vac-app .vac-developer-theme p {
94
+ font-size: 13px;
95
+ line-height: 1.6;
96
+ }
97
+ .vac-app .vac-developer-theme .vac-dock-header {
98
+ background: var(--ph-neutral-background);
99
+ border-bottom-color: var(--vac-line);
100
+ padding: 12px 20px;
101
+ }
102
+ .vac-app .vac-developer-theme .vac-dock-header h2 {
103
+ font-size: 16px;
104
+ }
105
+ .vac-app .vac-developer-theme .vac-dock-header button {
106
+ font-size: 12px;
107
+ }
108
+ .vac-app .vac-developer-theme .vac-lab-badge {
109
+ background: var(--ph-neutral-background);
110
+ border-color: var(--vac-line);
111
+ border-radius: 4px;
112
+ font-size: 11px;
113
+ }
114
+ .vac-app .vac-developer-theme .vac-eyebrow {
115
+ font-size: 10px;
116
+ letter-spacing: 0.06em;
117
+ }
118
+ .vac-app .vac-developer-theme :is(code, pre) {
119
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
120
+ }
121
+ .vac-app .vac-developer-theme .vac-lab-directory-list > li {
122
+ border-radius: 6px;
123
+ }
124
+ .vac-app .vac-developer-theme .vac-event-picker {
125
+ gap: 0;
126
+ padding: 0;
127
+ border: 1px solid var(--vac-line);
128
+ border-radius: 6px;
129
+ background: var(--ph-neutral-white);
130
+ }
131
+ .vac-app .vac-developer-theme .vac-event-choice {
132
+ border: 0;
133
+ border-bottom: 1px solid var(--vac-line);
134
+ border-radius: 0;
135
+ padding: 8px;
136
+ }
137
+ .vac-app .vac-developer-theme .vac-event-choice:last-child {
138
+ border-bottom: 0;
139
+ }
140
+ .vac-app .vac-developer-theme .vac-event-choice:hover {
141
+ background: var(--ph-neutral-background);
142
+ }
143
+ .vac-app .vac-developer-theme .vac-event-choice[aria-pressed="true"] {
144
+ background: var(--ph-neutral-accent);
145
+ box-shadow: inset 3px 0 var(--ph-accent);
146
+ }
147
+ .vac-app .vac-developer-theme .vac-event-comparison {
148
+ grid-template-columns: 1fr;
149
+ gap: 0;
150
+ border: 1px solid var(--vac-line);
151
+ border-radius: 6px;
152
+ overflow: hidden;
153
+ }
154
+ .vac-app .vac-developer-theme .vac-event-comparison > div {
155
+ display: grid;
156
+ grid-template-columns: 1fr 1fr;
157
+ align-items: start;
158
+ gap: 12px;
159
+ border: 0;
160
+ border-bottom: 1px solid var(--vac-line);
161
+ border-radius: 0;
162
+ padding: 8px;
163
+ }
164
+ .vac-app .vac-developer-theme .vac-event-comparison > div:last-child {
165
+ border-bottom: 0;
166
+ }
167
+ .vac-app .vac-developer-theme .vac-event-comparison dd {
168
+ font-family: ui-monospace, monospace;
169
+ font-size: 12px;
170
+ margin: 0;
171
+ }
172
+ .vac-app .vac-developer-theme .vac-event-comparison [data-mismatch="true"] {
173
+ background: var(--ph-neutral-accent);
174
+ }
175
+
176
+ .vac-ai-fields {
177
+ border: 0;
178
+ padding: 0;
179
+ margin: 16px 0;
180
+ min-width: 0;
181
+ }
182
+ .vac-ai-fields label {
183
+ display: flex;
184
+ gap: 12px;
185
+ align-items: center;
186
+ padding: 10px 0;
187
+ border-bottom: 1px solid var(--vac-line);
188
+ }
189
+ .vac-ai-fields input {
190
+ width: 18px;
191
+ height: 18px;
192
+ flex: 0 0 auto;
193
+ accent-color: var(--ph-brand-cobalt);
194
+ }
195
+ .vac-ai-fields code {
196
+ display: block;
197
+ font-size: 12px;
198
+ overflow-wrap: anywhere;
199
+ color: var(--vac-muted);
200
+ }
201
+ .vac-ai-checks {
202
+ list-style: none;
203
+ padding: 0;
204
+ }
205
+ .vac-ai-checks li {
206
+ padding: 8px 0;
207
+ border-bottom: 1px solid var(--vac-line);
208
+ }
209
+ .vac-ai-checks p {
210
+ margin: 4px 0;
211
+ }
212
+ .vac-ai-compare {
213
+ background: var(--ph-neutral-white);
214
+ border: 1px solid var(--vac-line);
215
+ border-radius: 6px;
216
+ padding: 12px;
217
+ }
218
+ .vac-ai-compare h4 {
219
+ margin-top: 0;
220
+ }
221
+ .vac-ai-compare dt {
222
+ font-size: 12px;
223
+ font-weight: 600;
224
+ color: var(--vac-muted);
225
+ }
226
+ .vac-ai-compare dd {
227
+ margin: 4px 0 16px;
228
+ overflow-wrap: anywhere;
229
+ }
230
+ .vac-ai-lab pre {
231
+ white-space: pre-wrap;
232
+ overflow-wrap: anywhere;
233
+ font-size: 12px;
234
+ }
235
+
236
+ .vac-app .vac-developer-theme .vac-ai-code-highlight {
237
+ background: var(--ph-highlight);
238
+ color: var(--ph-light-12);
239
+ border-radius: 2px;
240
+ box-decoration-break: clone;
241
+ -webkit-box-decoration-break: clone;
242
+ }
243
+ .vac-ai-mapping {
244
+ margin: 16px 0;
245
+ }
246
+ .vac-ai-mapping > span {
247
+ font-size: 12px;
248
+ }
249
+ .vac-ai-mapping pre {
250
+ margin-top: 8px;
251
+ }
252
+
253
+ .vac-app .vac-developer-theme pre .vac-ai-code-highlight {
254
+ background: var(--ph-highlight);
255
+ color: var(--ph-light-12);
256
+ }
257
+ .vac-app .vac-developer-theme .vac-ai-code-context {
258
+ background: transparent;
259
+ color: inherit;
260
+ }
261
+
262
+ .vac-ghost-cursor {
263
+ position: fixed;
264
+ z-index: 10000;
265
+ pointer-events: none;
266
+ font: 32px/1 sans-serif;
267
+ color: var(--ph-neutral-ink);
268
+ filter: drop-shadow(0 0 2px var(--ph-neutral-white));
269
+ transition: left 0.6s ease, top 0.6s ease;
270
+ }
271
+ .vac-ghost-cursor span {
272
+ display: block;
273
+ font: 12px/1.4 sans-serif;
274
+ background: var(--ph-brand-yellow);
275
+ color: var(--ph-neutral-ink);
276
+ padding: 4px 8px;
277
+ border-radius: 4px;
278
+ white-space: nowrap;
279
+ }
280
+ .vac-replay-recording {
281
+ display: flex;
282
+ justify-content: space-between;
283
+ gap: 12px;
284
+ margin-top: 12px;
285
+ padding-top: 8px;
286
+ border-top: 1px solid var(--vac-line);
287
+ font-size: 12px;
288
+ }
289
+ .vac-replay-mask {
290
+ display: flex;
291
+ align-items: center;
292
+ gap: 10px;
293
+ margin-top: 16px;
294
+ }
295
+ .vac-replay-mask input {
296
+ width: 18px;
297
+ height: 18px;
298
+ accent-color: var(--ph-neutral-ink);
299
+ }
300
+ @media (prefers-reduced-motion: reduce) {
301
+ .vac-ghost-cursor,
302
+ .vac-replay-pointer {
303
+ transition: none;
304
+ }
305
+ }
306
+
307
+ .vac-ghost-cursor {
308
+ font-size: initial;
309
+ filter: none;
310
+ }
311
+ .vac-ghost-cursor svg {
312
+ display: block;
313
+ }
314
+ .vac-ghost-cursor span {
315
+ background: var(--ph-brand-yellow);
316
+ color: var(--ph-neutral-ink);
317
+ }
318
+ .vac-replay-stop {
319
+ position: fixed;
320
+ z-index: 10001;
321
+ left: 50%;
322
+ bottom: 20px;
323
+ transform: translateX(-50%);
324
+ display: flex;
325
+ align-items: center;
326
+ gap: 14px;
327
+ padding: 12px 16px;
328
+ border: 1px solid var(--ph-neutral-ink);
329
+ border-radius: 6px;
330
+ background: var(--ph-neutral-background);
331
+ color: var(--ph-neutral-ink);
332
+ box-shadow: 0 2px 8px var(--ph-neutral-border);
333
+ font: 14px/1.4 sans-serif;
334
+ }
335
+ .vac-replay-stop button {
336
+ background: var(--ph-brand-cobalt);
337
+ color: var(--ph-neutral-white);
338
+ border: 0;
339
+ border-radius: 4px;
340
+ padding: 10px 14px;
341
+ white-space: nowrap;
342
+ cursor: pointer;
343
+ }
344
+ .vac-replay-stop button:focus-visible {
345
+ outline: 3px solid var(--ph-neutral-ink);
346
+ outline-offset: 3px;
347
+ }
348
+ .vac-session-viewport {
349
+ position: relative;
350
+ width: 100%;
351
+ min-height: 120px;
352
+ overflow: hidden;
353
+ background: var(--ph-neutral-background);
354
+ border: 1px solid var(--vac-line);
355
+ }
356
+ .vac-session-player:fullscreen {
357
+ box-sizing: border-box;
358
+ width: 100vw;
359
+ height: 100vh;
360
+ padding: 16px;
361
+ overflow: auto;
362
+ background: var(--ph-neutral-background);
363
+ color: var(--ph-neutral-ink);
364
+ }
365
+ .vac-session-controls {
366
+ padding-top: 8px;
367
+ }
368
+ .vac-session-controls > input {
369
+ display: block;
370
+ width: 100%;
371
+ margin: 12px 0;
372
+ }
373
+ .vac-session-controls > button {
374
+ margin: 8px 12px 8px 0;
375
+ }
376
+ @media (max-width: 600px) {
377
+ .vac-replay-stop {
378
+ width: calc(100% - 24px);
379
+ bottom: 12px;
380
+ font-size: 12px;
381
+ gap: 8px;
382
+ }
383
+ .vac-replay-stop span {
384
+ display: none;
385
+ }
386
+ }
387
+ .vac-session-player input[type="range"] {
388
+ appearance: auto;
389
+ accent-color: var(--ph-brand-cobalt);
390
+ height: 24px;
391
+ cursor: pointer;
392
+ }
393
+
394
+ .vac-app .vac-developer-theme .vac-dock-header {
395
+ padding: 10px 20px;
396
+ }
397
+ .vac-app .vac-developer-theme .vac-dock-header h2 {
398
+ margin: 0;
399
+ }
400
+ .vac-lab-navigation {
401
+ display: flex;
402
+ align-items: center;
403
+ flex-wrap: wrap;
404
+ gap: 4px 16px;
405
+ margin-top: 4px;
406
+ }
407
+ .vac-lab-navigation .vac-lab-reset {
408
+ margin-inline-start: auto;
409
+ }
410
+ .vac-lab-navigation .vac-text-button {
411
+ padding: 4px 0;
412
+ text-align: left;
413
+ }
414
+
415
+ .vac-app .vac-developer-theme :focus-visible {
416
+ outline-color: var(--ph-brand-cobalt);
417
+ }
418
+ .vac-app .vac-developer-theme input {
419
+ accent-color: var(--ph-brand-cobalt);
420
+ }
421
+ .vac-session-player .replayer-mouse::after {
422
+ background: var(--ph-brand-cobalt);
423
+ opacity: 1;
424
+ animation: none;
425
+ }
426
+ .vac-session-player .replayer-mouse.touch-device.touch-active {
427
+ border-color: var(--ph-brand-cobalt);
428
+ }
429
+
430
+ .vac-page-replay-marker {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 10px;
434
+ padding: 12px clamp(20px, 4vw, 64px) 0;
435
+ color: var(--ph-neutral-ink);
436
+ font: 13px/1.4 PlaygroundRoundHog, sans-serif;
437
+ }
438
+
439
+ .vac-lab-card-actions {
440
+ display: flex;
441
+ align-items: center;
442
+ justify-content: space-between;
443
+ flex-wrap: wrap;
444
+ gap: 12px;
445
+ }
446
+
447
+ .vac-lab-card-actions .vac-text-button {
448
+ padding-inline: 0;
449
+ text-align: left;
450
+ }
451
+
452
+ /* Adapted from posthog.com OSButton (secondary, md), using brand yellow for the base. */
453
+ .vac-app .vac-developer-theme .vac-button {
454
+ display: inline-block;
455
+ position: relative;
456
+ min-height: 0;
457
+ padding: 0;
458
+ border: 1.5px solid var(--ph-os-button-border);
459
+ border-radius: 6px;
460
+ background: var(--ph-brand-yellow);
461
+ color: var(--vac-ink);
462
+ font-size: 13px;
463
+ line-height: 1.5;
464
+ font-weight: 700;
465
+ text-align: center;
466
+ text-decoration: none;
467
+ box-shadow: none;
468
+ }
469
+ .vac-os-button-face {
470
+ display: flex;
471
+ align-items: center;
472
+ justify-content: center;
473
+ gap: 4px;
474
+ margin-inline: -1.5px;
475
+ padding: 4px 10px;
476
+ border: 1.5px solid var(--ph-os-button-border);
477
+ border-radius: 6px;
478
+ background: var(--ph-neutral-white);
479
+ color: var(--ph-neutral-ink);
480
+ transform: translateY(-2px);
481
+ user-select: none;
482
+ }
483
+ .vac-app .vac-developer-theme .vac-button:hover:not(:disabled) {
484
+ background: var(--ph-brand-yellow);
485
+ border-color: var(--ph-os-button-border);
486
+ }
487
+ .vac-button:hover:not(:disabled) > .vac-os-button-face {
488
+ transform: translateY(-3px);
489
+ }
490
+ .vac-app .vac-developer-theme .vac-button:active:not(:disabled) {
491
+ transform: none;
492
+ box-shadow: none;
493
+ }
494
+ .vac-button:active:not(:disabled) > .vac-os-button-face {
495
+ transform: translateY(-1.5px);
496
+ transition: transform 100ms;
497
+ }
498
+ .vac-app .vac-developer-theme .vac-button:disabled {
499
+ opacity: 1;
500
+ background: var(--vac-line);
501
+ border-color: var(--vac-line);
502
+ cursor: not-allowed;
503
+ }
504
+ .vac-button:disabled > .vac-os-button-face {
505
+ color: var(--vac-muted);
506
+ background: var(--vac-fill);
507
+ border-color: var(--vac-line);
508
+ }
509
+ @media (prefers-reduced-motion: reduce) {
510
+ .vac-os-button-face {
511
+ transition: none !important;
512
+ }
513
+ }
514
+
515
+ .vac-app .vac-developer-theme .vac-dock-header h2 {
516
+ display: flex;
517
+ align-items: center;
518
+ gap: 8px;
519
+ }
520
+ .vac-dock-header h2 img {
521
+ flex-shrink: 0;
522
+ object-fit: contain;
523
+ }
524
+
525
+ .vac-booking-funnel {
526
+ padding: 0;
527
+ list-style: none;
528
+ }
529
+ .vac-booking-funnel li {
530
+ display: flex;
531
+ justify-content: space-between;
532
+ gap: 12px;
533
+ padding: 10px 0;
534
+ border-bottom: 1px solid var(--vac-line);
535
+ }
536
+ .vac-booking-funnel code {
537
+ overflow-wrap: anywhere;
538
+ min-width: 0;
539
+ font-size: 12px;
540
+ }
541
+
542
+ .vac-app .vac-developer-theme .vac-booking-overview {
543
+ display: grid;
544
+ justify-content: stretch;
545
+ justify-items: start;
546
+ gap: 8px;
547
+ padding: 14px;
548
+ margin: 16px 0;
549
+ text-align: left;
550
+ }
551
+ .vac-app .vac-developer-theme .vac-booking-overview p {
552
+ margin: 0;
553
+ }
554
+
555
+ .vac-app .vac-developer-theme pre.vac-booking-code {
556
+ white-space: pre;
557
+ overflow-wrap: normal;
558
+ overflow-x: auto;
559
+ }
560
+
561
+ .vac-app .vac-developer-theme .vac-selected-lab {
562
+ display: flex;
563
+ flex-wrap: wrap;
564
+ align-items: baseline;
565
+ gap: 4px 10px;
566
+ margin: 8px 0 18px;
567
+ padding: 0;
568
+ border: 0;
569
+ }
570
+ .vac-lab-context {
571
+ font-size: 12px;
572
+ color: var(--vac-muted);
573
+ }
574
+ .vac-app .vac-developer-theme #guide-panel h3 {
575
+ font-size: 22px;
576
+ line-height: 1.25;
577
+ margin: 0 0 16px;
578
+ }
579
+
580
+ .vac-booking-checklist {
581
+ list-style: none;
582
+ padding: 0;
583
+ margin: 16px 0;
584
+ }
585
+ .vac-booking-checklist li {
586
+ display: flex;
587
+ align-items: center;
588
+ gap: 12px;
589
+ padding: 12px;
590
+ border-bottom: 1px solid var(--vac-line);
591
+ color: var(--vac-muted);
592
+ }
593
+ .vac-booking-checklist li[data-state="current"] {
594
+ background: var(--vac-paper);
595
+ color: var(--vac-ink);
596
+ box-shadow: inset 3px 0 var(--ph-brand-cobalt);
597
+ }
598
+ .vac-booking-checklist li[data-state="done"] {
599
+ color: var(--vac-ink);
600
+ }
601
+ .vac-check-status {
602
+ flex: 0 0 20px;
603
+ text-align: center;
604
+ font-weight: 600;
605
+ }
606
+
607
+ .vac-lab-completion {
608
+ display: flex;
609
+ flex-direction: column;
610
+ align-items: stretch;
611
+ gap: 16px;
612
+ }
613
+ .vac-lab-completion h3,
614
+ .vac-lab-completion h4,
615
+ .vac-lab-completion p {
616
+ margin: 0;
617
+ }
618
+ .vac-completion-title {
619
+ display: flex;
620
+ align-items: center;
621
+ gap: 10px;
622
+ }
623
+ .vac-completion-check {
624
+ display: grid;
625
+ place-items: center;
626
+ flex: 0 0 28px;
627
+ width: 28px;
628
+ height: 28px;
629
+ border-radius: 50%;
630
+ background: var(--ph-brand-cobalt);
631
+ color: var(--ph-neutral-white);
632
+ font-size: 18px;
633
+ }
634
+ .vac-lab-completion ul {
635
+ padding-left: 20px;
636
+ margin-bottom: 0;
637
+ }
638
+ .vac-lab-completion li + li {
639
+ margin-top: 10px;
640
+ }
641
+
642
+ .vac-app .vac-developer-theme .vac-lab-completion > * {
643
+ margin: 0;
644
+ }
645
+ .vac-app .vac-developer-theme .vac-lab-completion .vac-guide-example {
646
+ display: block;
647
+ text-align: left;
648
+ padding: 16px;
649
+ }
650
+ .vac-app .vac-developer-theme .vac-lab-completion ul {
651
+ list-style: disc;
652
+ margin-top: 12px;
653
+ }
654
+ .vac-app .vac-developer-theme .vac-lab-completion h4 {
655
+ text-align: left;
656
+ }
657
+
658
+ .vac-filter-comparisons {
659
+ margin: 16px 0;
660
+ border: 1px solid var(--ph-neutral-border);
661
+ border-radius: 6px;
662
+ overflow: hidden;
663
+ }
664
+ .vac-filter-comparison-head,
665
+ .vac-filter-comparison-row {
666
+ display: grid;
667
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 64px;
668
+ gap: 10px;
669
+ align-items: center;
670
+ padding: 10px 12px;
671
+ text-align: left;
672
+ }
673
+ .vac-filter-comparison-head {
674
+ font-size: 11px;
675
+ color: var(--ph-neutral-muted);
676
+ }
677
+ .vac-filter-comparison-list {
678
+ max-height: 240px;
679
+ overflow-y: auto;
680
+ }
681
+ .vac-filter-comparison-row {
682
+ width: 100%;
683
+ border: 0;
684
+ border-top: 1px solid var(--ph-neutral-border);
685
+ background: var(--ph-neutral-white);
686
+ color: var(--ph-neutral-ink);
687
+ cursor: pointer;
688
+ font-size: 12px;
689
+ }
690
+ .vac-filter-comparison-row[aria-pressed="true"] {
691
+ background: var(--ph-neutral-accent);
692
+ box-shadow: inset 3px 0 var(--ph-brand-cobalt);
693
+ }
694
+ .vac-filter-comparison-row:focus-visible {
695
+ outline-offset: -3px;
696
+ }
697
+ .vac-filter-comparison-row small {
698
+ color: var(--ph-neutral-muted);
699
+ }
700
+ .vac-filter-match {
701
+ font-size: 11px;
702
+ }
703
+ .vac-filter-match[data-mismatch="true"] {
704
+ font-weight: 600;
705
+ }
706
+
707
+ .vac-source-picker {
708
+ border: 0;
709
+ padding: 0;
710
+ margin: 16px 0;
711
+ min-width: 0;
712
+ }
713
+ .vac-source-picker legend {
714
+ margin-bottom: 10px;
715
+ }
716
+ .vac-app .vac-developer-theme .vac-source-picker label {
717
+ display: flex;
718
+ align-items: center;
719
+ gap: 10px;
720
+ padding: 12px;
721
+ margin: 0;
722
+ border: 1px solid var(--ph-neutral-border);
723
+ background: var(--ph-neutral-white);
724
+ cursor: pointer;
725
+ }
726
+ .vac-source-picker label + label {
727
+ border-top: 0 !important;
728
+ }
729
+ .vac-app .vac-developer-theme .vac-source-picker label[data-selected="true"] {
730
+ background: var(--ph-neutral-accent);
731
+ box-shadow: inset 3px 0 var(--ph-brand-cobalt);
732
+ }
733
+ .vac-app .vac-developer-theme .vac-source-picker input {
734
+ width: 16px;
735
+ height: 16px;
736
+ flex: 0 0 16px;
737
+ margin: 0;
738
+ }
739
+ .vac-source-picker span {
740
+ min-width: 0;
741
+ overflow-wrap: anywhere;
742
+ }
743
+
744
+ .vac-lab-choice-list {
745
+ max-height: 260px;
746
+ overflow-y: auto;
747
+ }
748
+
749
+ .vac-ghost-progress {
750
+ text-align: center;
751
+ padding: 24px 0;
752
+ }
753
+ .vac-ghost-loader {
754
+ width: 40px;
755
+ height: 40px;
756
+ margin: 32px auto 24px;
757
+ border: 3px solid var(--ph-neutral-border);
758
+ border-top-color: var(--ph-brand-cobalt);
759
+ border-radius: 50%;
760
+ animation: vac-ghost-loading 1s linear infinite;
761
+ }
762
+ .vac-ghost-progress [role="status"] {
763
+ min-height: 3.2em;
764
+ }
765
+ @keyframes vac-ghost-loading {
766
+ to {
767
+ transform: rotate(360deg);
768
+ }
769
+ }
770
+ @media (prefers-reduced-motion: reduce) {
771
+ .vac-ghost-loader {
772
+ animation: none;
773
+ }
774
+ }