@a2f0/agent-tool 0.1.31 → 0.1.33

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.
@@ -0,0 +1,535 @@
1
+ /*
2
+ * Styles for <screenshot-gallery> and <screenshot-carousel>
3
+ * (@a2f0/agent-tool/screenshots/gallery.css). Restyle through the --shots-*
4
+ * custom properties first, set on the elements or any ancestor. Defaults,
5
+ * which follow prefers-color-scheme, live in the internal --_shots-*
6
+ * properties.
7
+ *
8
+ * Specificity: rules on the host elements are zero (:where), so any site
9
+ * selector overrides them. Every rule on a part the elements render has
10
+ * exactly one class of specificity (0,1,0), with its context in :where(), so
11
+ * element resets such as `button { background: none }` never reach the
12
+ * parts, while any site rule with a class and an element or a second class
13
+ * (`screenshot-gallery .shots-frame`) still overrides them.
14
+ */
15
+
16
+ :where(screenshot-gallery, screenshot-carousel) {
17
+ --_shots-font: var(--shots-font, system-ui, -apple-system, "Segoe UI", sans-serif);
18
+ --_shots-ink: var(--shots-ink, #1d1d1f);
19
+ --_shots-ink-muted: var(--shots-ink-muted, #6e6e73);
20
+ --_shots-surface: var(--shots-surface, #ffffff);
21
+ --_shots-surface-raised: var(--shots-surface-raised, #f5f5f7);
22
+ --_shots-border: var(--shots-border, #d2d2d7);
23
+ --_shots-accent: var(--shots-accent, #1d1d1f);
24
+ --_shots-accent-ink: var(--shots-accent-ink, #ffffff);
25
+ --_shots-focus: var(--shots-focus, #0071e3);
26
+ --_shots-radius: var(--shots-radius, 12px);
27
+ --_shots-button-size: var(--shots-button-size, 2.25rem);
28
+ --_shots-bezel: var(--shots-bezel, #1c1c1e);
29
+ --_shots-bezel-edge: var(--shots-bezel-edge, #3a3a3c);
30
+ --_shots-shadow: var(--shots-shadow, 0 12px 32px rgb(0 0 0 / 0.18));
31
+ --_shots-stage-height: var(--shots-stage-height, min(60vh, 44rem));
32
+ --_shots-stage-padding: var(--shots-stage-padding, 1rem);
33
+ --_shots-thumb-height: var(--shots-thumb-height, 5.5rem);
34
+ --_shots-thumb-max-width: var(--shots-thumb-max-width, 9rem);
35
+ --_shots-backdrop: var(--shots-backdrop, rgb(0 0 0 / 0.82));
36
+ --_shots-expanded-z: var(--shots-expanded-z, 1000);
37
+ --_shots-carousel-slide-width: var(--shots-carousel-slide-width, clamp(11rem, 58vw, 15rem));
38
+ --_shots-carousel-gap: var(--shots-carousel-gap, 1.5rem);
39
+ --_shots-carousel-padding: var(--shots-carousel-padding, 1rem);
40
+ display: block;
41
+ color: var(--_shots-ink);
42
+ font-family: var(--_shots-font);
43
+ }
44
+
45
+ :where(screenshot-gallery[hidden], screenshot-carousel[hidden]) {
46
+ display: none;
47
+ }
48
+
49
+ @media (prefers-color-scheme: dark) {
50
+ :where(screenshot-gallery, screenshot-carousel) {
51
+ --_shots-ink: var(--shots-ink, #f5f5f7);
52
+ --_shots-ink-muted: var(--shots-ink-muted, #a1a1a6);
53
+ --_shots-surface: var(--shots-surface, #161617);
54
+ --_shots-surface-raised: var(--shots-surface-raised, #232325);
55
+ --_shots-border: var(--shots-border, #3a3a3c);
56
+ --_shots-accent: var(--shots-accent, #f5f5f7);
57
+ --_shots-accent-ink: var(--shots-accent-ink, #161617);
58
+ --_shots-focus: var(--shots-focus, #2997ff);
59
+ --_shots-bezel: var(--shots-bezel, #0b0b0c);
60
+ --_shots-bezel-edge: var(--shots-bezel-edge, #48484a);
61
+ --_shots-shadow: var(--shots-shadow, 0 12px 32px rgb(0 0 0 / 0.5));
62
+ }
63
+ }
64
+
65
+ .shots-host :where(button) {
66
+ font: inherit;
67
+ color: inherit;
68
+ }
69
+
70
+ :where(.shots-host) :where(button, a, [tabindex]):focus-visible {
71
+ outline: 2px solid var(--_shots-focus);
72
+ outline-offset: 2px;
73
+ }
74
+
75
+ .shots-icon {
76
+ display: inline-flex;
77
+ width: 1.25rem;
78
+ height: 1.25rem;
79
+ }
80
+
81
+ .shots-icon :where(svg) {
82
+ width: 100%;
83
+ height: 100%;
84
+ }
85
+
86
+ /* --- States --- */
87
+
88
+ .shots-status {
89
+ display: grid;
90
+ place-items: center;
91
+ padding: 2rem 1rem;
92
+ border: 1px solid var(--_shots-border);
93
+ border-radius: var(--_shots-radius);
94
+ background: var(--_shots-surface);
95
+ color: var(--_shots-ink-muted);
96
+ text-align: center;
97
+ }
98
+
99
+ /* Loading reserves the gallery's height so the page does not jump when it arrives. */
100
+ :where(screenshot-gallery) .shots-status:where([data-state="loading"]) {
101
+ min-height: calc(var(--_shots-stage-height) + var(--_shots-thumb-height) + 7rem);
102
+ }
103
+
104
+ /* --- Gallery --- */
105
+
106
+ .shots-gallery {
107
+ display: flex;
108
+ flex-direction: column;
109
+ border: 1px solid var(--_shots-border);
110
+ border-radius: var(--_shots-radius);
111
+ background: var(--_shots-surface);
112
+ overflow: hidden;
113
+ }
114
+
115
+ .shots-gallery:where([data-expanded]) {
116
+ position: fixed;
117
+ inset: 0;
118
+ z-index: var(--_shots-expanded-z);
119
+ border: 0;
120
+ border-radius: 0;
121
+ }
122
+
123
+ .shots-toolbar {
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ align-items: center;
127
+ gap: 0.5rem 0.75rem;
128
+ padding: 0.75rem 1rem;
129
+ border-bottom: 1px solid var(--_shots-border);
130
+ }
131
+
132
+ .shots-title {
133
+ flex: 1 1 10rem;
134
+ margin: 0;
135
+ font-weight: 600;
136
+ overflow: hidden;
137
+ text-overflow: ellipsis;
138
+ white-space: nowrap;
139
+ }
140
+
141
+ .shots-toggle {
142
+ display: inline-flex;
143
+ padding: 2px;
144
+ border: 1px solid var(--_shots-border);
145
+ border-radius: 999px;
146
+ }
147
+
148
+ .shots-toggle-button {
149
+ display: inline-flex;
150
+ align-items: center;
151
+ gap: 0.375rem;
152
+ padding: 0.375rem 0.75rem;
153
+ border: 0;
154
+ border-radius: 999px;
155
+ background: none;
156
+ cursor: pointer;
157
+ }
158
+
159
+ .shots-toggle-button:where([aria-pressed="true"]) {
160
+ background: var(--_shots-accent);
161
+ color: var(--_shots-accent-ink);
162
+ }
163
+
164
+ .shots-actions {
165
+ display: inline-flex;
166
+ gap: 0.25rem;
167
+ }
168
+
169
+ .shots-icon-button {
170
+ display: inline-grid;
171
+ place-items: center;
172
+ width: var(--_shots-button-size);
173
+ height: var(--_shots-button-size);
174
+ padding: 0;
175
+ border: 1px solid var(--_shots-border);
176
+ border-radius: 999px;
177
+ background: var(--_shots-surface);
178
+ cursor: pointer;
179
+ }
180
+
181
+ .shots-icon-button:where(:disabled) {
182
+ opacity: 0.4;
183
+ cursor: default;
184
+ }
185
+
186
+ .shots-body {
187
+ display: flex;
188
+ flex: 1 1 auto;
189
+ flex-direction: column;
190
+ min-height: 0;
191
+ }
192
+
193
+ /* The main panel: one screen per page of a horizontal scroll-snap track. */
194
+ .shots-track {
195
+ position: relative;
196
+ display: flex;
197
+ height: var(--_shots-stage-height);
198
+ overflow-x: auto;
199
+ overflow-y: hidden;
200
+ overscroll-behavior-x: contain;
201
+ scroll-snap-type: x mandatory;
202
+ scrollbar-width: none;
203
+ background: var(--_shots-surface-raised);
204
+ }
205
+
206
+ :where(.shots-gallery[data-expanded]) .shots-track {
207
+ flex: 1 1 auto;
208
+ height: auto;
209
+ }
210
+
211
+ .shots-track::-webkit-scrollbar {
212
+ display: none;
213
+ }
214
+
215
+ .shots-slide {
216
+ display: flex;
217
+ flex: 0 0 100%;
218
+ align-items: center;
219
+ justify-content: center;
220
+ box-sizing: border-box;
221
+ height: 100%;
222
+ padding: var(--_shots-stage-padding);
223
+ scroll-snap-align: start;
224
+ scroll-snap-stop: always;
225
+ }
226
+
227
+ .shots-frame {
228
+ display: block;
229
+ box-sizing: content-box;
230
+ max-width: 100%;
231
+ padding: 0;
232
+ border: 1px solid var(--_shots-border);
233
+ border-radius: calc(var(--_shots-radius) / 2);
234
+ background: var(--_shots-surface);
235
+ overflow: hidden;
236
+ cursor: zoom-in;
237
+ }
238
+
239
+ .shots-image {
240
+ display: block;
241
+ max-width: 100%;
242
+ height: auto;
243
+ }
244
+
245
+ /* Phone and tablet captures sit in a device bezel sized from the capture (fitFrame). */
246
+ :where(.shots-gallery[data-frame="phone"], .shots-gallery[data-frame="tablet"]) .shots-frame:where(:not(.shots-missing)) {
247
+ padding: var(--shots-frame-pad, 0.6rem);
248
+ border: 0;
249
+ border-radius: calc(var(--shots-frame-radius, 1.5rem) + var(--shots-frame-pad, 0.6rem));
250
+ background: var(--_shots-bezel);
251
+ box-shadow: inset 0 0 0 1px var(--_shots-bezel-edge), var(--_shots-shadow);
252
+ }
253
+
254
+ :where(.shots-gallery[data-frame="phone"], .shots-gallery[data-frame="tablet"]) :where(.shots-frame:not(.shots-missing)) .shots-image {
255
+ border-radius: var(--shots-frame-radius, 1.5rem);
256
+ }
257
+
258
+ .shots-missing {
259
+ display: grid;
260
+ place-items: center;
261
+ max-width: 24rem;
262
+ padding: 1.5rem;
263
+ color: var(--_shots-ink-muted);
264
+ text-align: center;
265
+ cursor: default;
266
+ }
267
+
268
+ .shots-navrow {
269
+ display: flex;
270
+ align-items: center;
271
+ justify-content: center;
272
+ gap: 1rem;
273
+ padding: 0.5rem;
274
+ }
275
+
276
+ .shots-counter {
277
+ min-width: 4.5rem;
278
+ margin: 0;
279
+ color: var(--_shots-ink-muted);
280
+ font-variant-numeric: tabular-nums;
281
+ text-align: center;
282
+ }
283
+
284
+ .shots-filmstrip {
285
+ position: relative;
286
+ display: flex;
287
+ gap: 0.5rem;
288
+ padding: 0.25rem 1rem 1rem;
289
+ overflow-x: auto;
290
+ overscroll-behavior-x: contain;
291
+ scroll-snap-type: x proximity;
292
+ }
293
+
294
+ .shots-thumb {
295
+ display: flex;
296
+ flex: 0 0 auto;
297
+ flex-direction: column;
298
+ gap: 0.25rem;
299
+ max-width: var(--_shots-thumb-max-width);
300
+ padding: 0.25rem;
301
+ border: 1px solid transparent;
302
+ border-radius: calc(var(--_shots-radius) / 2);
303
+ background: none;
304
+ cursor: pointer;
305
+ scroll-snap-align: start;
306
+ }
307
+
308
+ .shots-thumb:where([aria-current="true"]) {
309
+ border-color: var(--_shots-accent);
310
+ }
311
+
312
+ /* The image keeps its capture's aspect ratio at a fixed height, cropped from the top only when wider than the cap. */
313
+ .shots-thumb-image {
314
+ display: block;
315
+ height: var(--_shots-thumb-height);
316
+ min-width: 4.5rem;
317
+ max-width: calc(var(--_shots-thumb-max-width) - 0.5rem);
318
+ aspect-ratio: 3 / 4;
319
+ border-radius: 4px;
320
+ background: var(--_shots-surface-raised);
321
+ overflow: hidden;
322
+ }
323
+
324
+ .shots-thumb-image :where(img) {
325
+ display: block;
326
+ width: 100%;
327
+ height: 100%;
328
+ object-fit: cover;
329
+ object-position: top;
330
+ }
331
+
332
+ .shots-thumb-label {
333
+ max-width: calc(var(--_shots-thumb-max-width) - 0.5rem);
334
+ overflow: hidden;
335
+ color: var(--_shots-ink-muted);
336
+ font-size: 0.75rem;
337
+ text-align: left;
338
+ text-overflow: ellipsis;
339
+ white-space: nowrap;
340
+ }
341
+
342
+ :where(.shots-thumb[aria-current="true"]) .shots-thumb-label {
343
+ color: var(--_shots-ink);
344
+ }
345
+
346
+ .shots-lightbox {
347
+ max-width: 100vw;
348
+ max-height: 100vh;
349
+ padding: 0;
350
+ border: 0;
351
+ background: none;
352
+ overflow: visible;
353
+ }
354
+
355
+ .shots-lightbox::backdrop {
356
+ background: var(--_shots-backdrop);
357
+ }
358
+
359
+ .shots-lightbox-backdrop {
360
+ position: fixed;
361
+ inset: 0;
362
+ border: 0;
363
+ background: none;
364
+ cursor: zoom-out;
365
+ }
366
+
367
+ .shots-lightbox-frame {
368
+ position: relative;
369
+ }
370
+
371
+ .shots-lightbox-image {
372
+ display: block;
373
+ width: auto;
374
+ height: auto;
375
+ max-width: 94vw;
376
+ max-height: 92vh;
377
+ border-radius: var(--shots-lightbox-radius, 8px);
378
+ }
379
+
380
+ :where(.shots-lightbox[data-frame="phone"], .shots-lightbox[data-frame="tablet"]) .shots-lightbox-frame {
381
+ padding: var(--shots-frame-pad, 0.75rem);
382
+ border-radius: calc(var(--shots-frame-radius, 2rem) + var(--shots-frame-pad, 0.75rem));
383
+ background: var(--_shots-bezel);
384
+ box-shadow: inset 0 0 0 1px var(--_shots-bezel-edge);
385
+ }
386
+
387
+ :where(.shots-lightbox[data-frame="phone"], .shots-lightbox[data-frame="tablet"]) .shots-lightbox-image {
388
+ border-radius: var(--shots-frame-radius, 2rem);
389
+ }
390
+
391
+ .shots-lightbox-close {
392
+ position: fixed;
393
+ top: 1rem;
394
+ right: 1rem;
395
+ display: grid;
396
+ place-items: center;
397
+ width: var(--_shots-button-size);
398
+ height: var(--_shots-button-size);
399
+ padding: 0;
400
+ border: 0;
401
+ border-radius: 999px;
402
+ background: rgb(255 255 255 / 0.9);
403
+ color: #1d1d1f;
404
+ cursor: pointer;
405
+ }
406
+
407
+ :where(.shots-lightbox) .shots-missing {
408
+ position: relative;
409
+ background: var(--_shots-surface);
410
+ border-radius: var(--_shots-radius);
411
+ }
412
+
413
+ /* --- Carousel --- */
414
+
415
+ .shots-carousel {
416
+ position: relative;
417
+ }
418
+
419
+ .shots-carousel-track {
420
+ position: relative;
421
+ overflow-x: auto;
422
+ overscroll-behavior-x: contain;
423
+ padding: 0.5rem var(--_shots-carousel-padding) 2.5rem;
424
+ scroll-padding-inline: var(--_shots-carousel-padding);
425
+ scroll-snap-type: x mandatory;
426
+ scrollbar-width: none;
427
+ }
428
+
429
+ .shots-carousel-track::-webkit-scrollbar {
430
+ display: none;
431
+ }
432
+
433
+ .shots-carousel-list {
434
+ display: flex;
435
+ gap: var(--_shots-carousel-gap);
436
+ margin: 0;
437
+ padding: 0;
438
+ list-style: none;
439
+ }
440
+
441
+ .shots-carousel-slide {
442
+ flex: 0 0 var(--_shots-carousel-slide-width);
443
+ scroll-snap-align: start;
444
+ }
445
+
446
+ .shots-carousel-slide :where(figure) {
447
+ margin: 0;
448
+ }
449
+
450
+ .shots-carousel-slide :where(figcaption) {
451
+ margin-top: 0.75rem;
452
+ color: var(--_shots-ink-muted);
453
+ font-size: 0.875rem;
454
+ text-align: center;
455
+ }
456
+
457
+ .shots-device {
458
+ display: block;
459
+ color: inherit;
460
+ container-type: inline-size;
461
+ }
462
+
463
+ .shots-device :where(picture) {
464
+ display: block;
465
+ }
466
+
467
+ .shots-device :where(img) {
468
+ display: block;
469
+ width: 100%;
470
+ height: auto;
471
+ border-radius: calc(var(--_shots-radius) / 2);
472
+ }
473
+
474
+ /* The bezel scales with the device's width, so it keeps its proportions at every size (FRAME_METRICS). */
475
+ :where(.shots-carousel[data-frame="phone"], .shots-carousel[data-frame="tablet"]) .shots-device :where(picture) {
476
+ --shots-frame-pad: 3.5cqi;
477
+ --shots-frame-radius: calc((100cqi - 2 * var(--shots-frame-pad)) * 0.1214);
478
+ padding: var(--shots-frame-pad);
479
+ border-radius: calc(var(--shots-frame-radius) + var(--shots-frame-pad));
480
+ background: var(--_shots-bezel);
481
+ box-shadow: inset 0 0 0 1px var(--_shots-bezel-edge), var(--_shots-shadow);
482
+ }
483
+
484
+ :where(.shots-carousel[data-frame="tablet"]) .shots-device :where(picture) {
485
+ --shots-frame-pad: 3cqi;
486
+ --shots-frame-radius: calc((100cqi - 2 * var(--shots-frame-pad)) * 0.025);
487
+ }
488
+
489
+ :where(.shots-carousel[data-frame="phone"], .shots-carousel[data-frame="tablet"]) .shots-device :where(img) {
490
+ border-radius: var(--shots-frame-radius);
491
+ }
492
+
493
+ .shots-device:where(a:focus-visible) {
494
+ outline: none;
495
+ }
496
+
497
+ .shots-device:where(a:focus-visible) :where(picture) {
498
+ outline: 2px solid var(--_shots-focus);
499
+ outline-offset: 3px;
500
+ }
501
+
502
+ .shots-carousel-controls {
503
+ display: flex;
504
+ justify-content: flex-end;
505
+ gap: 0.5rem;
506
+ padding: 0 var(--_shots-carousel-padding);
507
+ }
508
+
509
+ .shots-carousel-step {
510
+ display: inline-grid;
511
+ place-items: center;
512
+ width: var(--_shots-button-size);
513
+ height: var(--_shots-button-size);
514
+ padding: 0;
515
+ border: 1px solid var(--_shots-border);
516
+ border-radius: 999px;
517
+ background: var(--_shots-surface);
518
+ cursor: pointer;
519
+ }
520
+
521
+ @media (prefers-reduced-motion: no-preference) {
522
+ :is(.shots-track, .shots-carousel-track, .shots-filmstrip) {
523
+ scroll-behavior: smooth;
524
+ }
525
+
526
+ .shots-device:where(a) :where(picture) {
527
+ transition: transform 200ms ease;
528
+ }
529
+
530
+ @media (hover: hover) {
531
+ .shots-device:where(a:hover) :where(picture) {
532
+ transform: translateY(-4px);
533
+ }
534
+ }
535
+ }