executable-stories-formatters 0.15.0 → 0.15.1

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 (36) hide show
  1. package/dist/cli.js +41 -9
  2. package/dist/cli.js.map +1 -1
  3. package/package.json +3 -2
  4. package/schemas/README.md +1 -1
  5. package/templates/astro-starlight/astro.config.mjs +57 -0
  6. package/templates/astro-starlight/gitignore +14 -0
  7. package/templates/astro-starlight/package.json +20 -0
  8. package/templates/astro-starlight/public/stories/assets/.gitkeep +0 -0
  9. package/templates/astro-starlight/public/stories/notes-index.json +4 -0
  10. package/templates/astro-starlight/public/stories/story-report.json +17 -0
  11. package/templates/astro-starlight/src/components/ApiOperations.astro +366 -0
  12. package/templates/astro-starlight/src/components/Checklist.astro +15 -0
  13. package/templates/astro-starlight/src/components/HealthDashboard.astro +171 -0
  14. package/templates/astro-starlight/src/components/PageTitle.astro +53 -0
  15. package/templates/astro-starlight/src/components/VerifiedBy.astro +281 -0
  16. package/templates/astro-starlight/src/components/VerifiedStep.astro +91 -0
  17. package/templates/astro-starlight/src/content/docs/examples/example-adr.mdx +45 -0
  18. package/templates/astro-starlight/src/content/docs/guides/behavior-portal.mdx +41 -0
  19. package/templates/astro-starlight/src/content/docs/guides/writing-docs.mdx +49 -0
  20. package/templates/astro-starlight/src/content/docs/index.mdx +49 -0
  21. package/templates/astro-starlight/src/content/docs/stories/.gitkeep +0 -0
  22. package/templates/astro-starlight/src/content.config.ts +18 -0
  23. package/templates/astro-starlight/src/lib/config.ts +50 -0
  24. package/templates/astro-starlight/src/lib/render-doc-entry.ts +154 -0
  25. package/templates/astro-starlight/src/lib/report-health.ts +61 -0
  26. package/templates/astro-starlight/src/lib/verification.ts +247 -0
  27. package/templates/astro-starlight/src/pages/explorer/explorer.css +729 -0
  28. package/templates/astro-starlight/src/pages/explorer/index.astro +404 -0
  29. package/templates/astro-starlight/src/styles/global.css +293 -0
  30. package/templates/astro-starlight/src/styles/themes/corporate.css +83 -0
  31. package/templates/astro-starlight/src/styles/themes/dashboard.css +76 -0
  32. package/templates/astro-starlight/src/styles/themes/default.css +86 -0
  33. package/templates/astro-starlight/src/styles/themes/minimal.css +87 -0
  34. package/templates/astro-starlight/src/styles/themes/playful.css +77 -0
  35. package/templates/astro-starlight/src/styles/themes/terminal.css +77 -0
  36. package/templates/astro-starlight/tsconfig.json +13 -0
@@ -0,0 +1,729 @@
1
+ .es-tool {
2
+ --es-content-max: 1100px;
3
+ --es-topbar-h: 48px;
4
+ background: var(--es-bg);
5
+ color: var(--es-text);
6
+ font-family: var(--sl-font, ui-sans-serif, system-ui, sans-serif);
7
+ }
8
+
9
+ .es-tool * {
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ .es-tool button,
14
+ .es-tool input,
15
+ .es-tool select {
16
+ font: inherit;
17
+ }
18
+
19
+ /* ---- Top bar (keeps the Explorer tied to the docs) ----------------- */
20
+ .topbar {
21
+ position: sticky;
22
+ top: 0;
23
+ z-index: 10;
24
+ height: var(--es-topbar-h);
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 8px;
28
+ padding: 0 16px;
29
+ border-bottom: 1px solid var(--es-line);
30
+ background: var(--es-surface);
31
+ font-size: 13px;
32
+ }
33
+ .topbar__home {
34
+ display: inline-flex;
35
+ align-items: center;
36
+ gap: 7px;
37
+ color: var(--es-text);
38
+ text-decoration: none;
39
+ font-weight: 650;
40
+ padding: 5px 9px;
41
+ border-radius: var(--es-radius-sm);
42
+ transition: background-color 120ms ease;
43
+ }
44
+ .topbar__home:hover {
45
+ background: var(--es-surface-2);
46
+ }
47
+ .topbar__home::before {
48
+ content: "←";
49
+ color: var(--es-text-muted);
50
+ }
51
+ .topbar__sep {
52
+ color: var(--es-line-strong);
53
+ }
54
+ .topbar__here {
55
+ color: var(--es-text-muted);
56
+ font-family: var(--es-mono);
57
+ font-size: 12px;
58
+ }
59
+
60
+ .shell {
61
+ display: grid;
62
+ grid-template-columns: minmax(300px, 360px) minmax(0, 1fr);
63
+ min-height: calc(100vh - var(--es-topbar-h));
64
+ }
65
+
66
+ /* ---- Sidebar ------------------------------------------------------- */
67
+ .sidebar {
68
+ border-right: 1px solid var(--es-line);
69
+ background: var(--es-surface);
70
+ padding: 18px 16px;
71
+ position: sticky;
72
+ top: var(--es-topbar-h);
73
+ height: calc(100vh - var(--es-topbar-h));
74
+ overflow: auto;
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: 14px;
78
+ }
79
+
80
+ .brand {
81
+ display: flex;
82
+ align-items: baseline;
83
+ justify-content: space-between;
84
+ gap: 12px;
85
+ }
86
+
87
+ .brand h1 {
88
+ font-size: 14px;
89
+ font-weight: 700;
90
+ letter-spacing: 0.02em;
91
+ text-transform: uppercase;
92
+ margin: 0;
93
+ color: var(--es-text);
94
+ }
95
+
96
+ .meta {
97
+ color: var(--es-text-muted);
98
+ font-size: 11px;
99
+ font-family: var(--es-mono);
100
+ white-space: nowrap;
101
+ }
102
+
103
+ .controls {
104
+ display: grid;
105
+ gap: 8px;
106
+ }
107
+
108
+ .search,
109
+ .select {
110
+ width: 100%;
111
+ border: 1px solid var(--es-line);
112
+ border-radius: var(--es-radius-sm);
113
+ background: var(--es-bg);
114
+ color: var(--es-text);
115
+ padding: 9px 11px;
116
+ }
117
+ .search:focus,
118
+ .select:focus {
119
+ outline: 2px solid var(--es-accent);
120
+ outline-offset: 1px;
121
+ }
122
+
123
+ .summary {
124
+ display: grid;
125
+ grid-template-columns: repeat(2, minmax(0, 1fr));
126
+ gap: 6px;
127
+ }
128
+
129
+ .metric {
130
+ border: 1px solid var(--es-line);
131
+ border-radius: var(--es-radius-sm);
132
+ padding: 7px 9px;
133
+ background: var(--es-bg);
134
+ display: flex;
135
+ align-items: baseline;
136
+ gap: 6px;
137
+ }
138
+ .metric strong {
139
+ font-size: 16px;
140
+ line-height: 1;
141
+ font-variant-numeric: tabular-nums;
142
+ }
143
+ .metric span {
144
+ color: var(--es-text-muted);
145
+ font-size: 10px;
146
+ text-transform: uppercase;
147
+ letter-spacing: 0.06em;
148
+ }
149
+ .metric--passed strong {
150
+ color: var(--es-passed);
151
+ }
152
+ .metric--failed strong {
153
+ color: var(--es-failed);
154
+ }
155
+ .metric--skipped strong {
156
+ color: var(--es-skipped);
157
+ }
158
+ .metric--pending strong {
159
+ color: var(--es-pending);
160
+ }
161
+
162
+ .scenario-list {
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: 4px;
166
+ margin-top: 2px;
167
+ }
168
+
169
+ .scenario-button {
170
+ width: 100%;
171
+ border: 1px solid transparent;
172
+ border-radius: var(--es-radius-sm);
173
+ background: none;
174
+ color: var(--es-text);
175
+ cursor: pointer;
176
+ display: grid;
177
+ grid-template-columns: auto minmax(0, 1fr) auto;
178
+ column-gap: 9px;
179
+ row-gap: 2px;
180
+ padding: 8px 9px;
181
+ text-align: left;
182
+ transition: background-color 120ms ease, border-color 120ms ease;
183
+ }
184
+ .scenario-button:hover {
185
+ background: var(--es-surface-2);
186
+ }
187
+ .scenario-button[aria-current="true"] {
188
+ border-color: var(--es-accent);
189
+ background: var(--es-accent-soft);
190
+ }
191
+
192
+ .row-dot {
193
+ width: 8px;
194
+ height: 8px;
195
+ border-radius: 50%;
196
+ margin-top: 5px;
197
+ background: var(--dot, var(--es-text-muted));
198
+ }
199
+ .dot-passed {
200
+ --dot: var(--es-passed);
201
+ }
202
+ .dot-failed {
203
+ --dot: var(--es-failed);
204
+ }
205
+ .dot-skipped {
206
+ --dot: var(--es-skipped);
207
+ }
208
+ .dot-pending {
209
+ --dot: var(--es-pending);
210
+ }
211
+
212
+ .scenario-title {
213
+ font-size: 13px;
214
+ font-weight: 550;
215
+ line-height: 1.35;
216
+ }
217
+
218
+ .scenario-context-flag {
219
+ justify-self: end;
220
+ align-self: start;
221
+ background: var(--es-accent-soft);
222
+ color: var(--es-accent);
223
+ border: 1px solid color-mix(in oklab, var(--es-accent) 24%, var(--es-line));
224
+ border-radius: var(--es-radius-pill);
225
+ font-size: 10px;
226
+ font-weight: 700;
227
+ letter-spacing: 0.05em;
228
+ padding: 2px 7px;
229
+ text-transform: uppercase;
230
+ }
231
+
232
+ .scenario-source {
233
+ grid-column: 2 / span 2;
234
+ color: var(--es-text-muted);
235
+ font-family: var(--es-mono);
236
+ font-size: 11px;
237
+ overflow: hidden;
238
+ text-overflow: ellipsis;
239
+ white-space: nowrap;
240
+ }
241
+
242
+ /* ---- Content ------------------------------------------------------- */
243
+ .content {
244
+ padding: 28px 32px;
245
+ min-width: 0;
246
+ }
247
+
248
+ .scenario-card {
249
+ max-width: var(--es-content-max);
250
+ margin: 0 auto;
251
+ }
252
+
253
+ .status {
254
+ align-items: center;
255
+ border-radius: var(--es-radius-pill);
256
+ display: inline-flex;
257
+ font-size: 11px;
258
+ font-weight: 700;
259
+ gap: 6px;
260
+ letter-spacing: 0.06em;
261
+ padding: 4px 10px;
262
+ text-transform: uppercase;
263
+ border: 1px solid currentcolor;
264
+ }
265
+ .status::before {
266
+ content: "";
267
+ width: 7px;
268
+ height: 7px;
269
+ border-radius: 50%;
270
+ background: currentcolor;
271
+ }
272
+ .status-passed {
273
+ color: var(--es-passed);
274
+ background: var(--es-passed-soft);
275
+ }
276
+ .status-failed {
277
+ color: var(--es-failed);
278
+ background: var(--es-failed-soft);
279
+ }
280
+ .status-skipped {
281
+ color: var(--es-skipped);
282
+ background: var(--es-skipped-soft);
283
+ }
284
+ .status-pending {
285
+ color: var(--es-pending);
286
+ background: var(--es-pending-soft);
287
+ }
288
+
289
+ .scenario-heading {
290
+ position: sticky;
291
+ top: var(--es-topbar-h);
292
+ z-index: 2;
293
+ background: linear-gradient(var(--es-bg) 78%, transparent);
294
+ padding: 6px 0 16px;
295
+ display: grid;
296
+ gap: 11px;
297
+ margin-bottom: 8px;
298
+ }
299
+ .scenario-heading h2 {
300
+ font-size: clamp(24px, 3vw, 36px);
301
+ line-height: 1.08;
302
+ letter-spacing: -0.02em;
303
+ margin: 0;
304
+ color: var(--es-text);
305
+ }
306
+
307
+ .feature-line {
308
+ color: var(--es-text-muted);
309
+ font-size: 13px;
310
+ display: flex;
311
+ flex-wrap: wrap;
312
+ align-items: center;
313
+ gap: 8px;
314
+ }
315
+ .feature-line .sep {
316
+ opacity: 0.5;
317
+ }
318
+ .source-link {
319
+ color: var(--es-accent);
320
+ text-decoration: none;
321
+ font-family: var(--es-mono);
322
+ font-size: 12px;
323
+ border-bottom: 1px solid color-mix(in oklab, var(--es-accent) 40%, transparent);
324
+ }
325
+ .source-link:hover {
326
+ border-bottom-color: var(--es-accent);
327
+ }
328
+ .source-text {
329
+ font-family: var(--es-mono);
330
+ font-size: 12px;
331
+ color: var(--es-text-muted);
332
+ }
333
+
334
+ .context-row {
335
+ display: flex;
336
+ align-items: center;
337
+ }
338
+
339
+ .context-link {
340
+ display: inline-flex;
341
+ align-items: center;
342
+ gap: 6px;
343
+ color: var(--es-accent);
344
+ font-size: 12px;
345
+ font-weight: 600;
346
+ text-decoration: none;
347
+ }
348
+
349
+ .context-link:hover {
350
+ text-decoration: underline;
351
+ }
352
+
353
+ .tag-row {
354
+ display: flex;
355
+ flex-wrap: wrap;
356
+ gap: 6px;
357
+ }
358
+ .pill {
359
+ background: var(--es-surface);
360
+ border: 1px solid var(--es-line);
361
+ border-radius: var(--es-radius-pill);
362
+ color: var(--es-text-muted);
363
+ font-size: 12px;
364
+ padding: 3px 9px;
365
+ font-family: var(--es-mono);
366
+ }
367
+
368
+ .covers-row {
369
+ color: var(--es-text-muted);
370
+ font-size: 13px;
371
+ }
372
+ .covers-path {
373
+ background: var(--es-surface);
374
+ border: 1px solid var(--es-line);
375
+ border-radius: 4px;
376
+ font-family: var(--es-mono);
377
+ font-size: 12px;
378
+ padding: 2px 6px;
379
+ }
380
+
381
+ .section {
382
+ border-top: 1px solid var(--es-line);
383
+ padding-top: 20px;
384
+ margin-top: 22px;
385
+ }
386
+ .section > h3 {
387
+ font-size: 12px;
388
+ letter-spacing: 0.08em;
389
+ margin: 0 0 14px;
390
+ text-transform: uppercase;
391
+ color: var(--es-text-muted);
392
+ }
393
+
394
+ /* ---- Steps --------------------------------------------------------- */
395
+ .steps {
396
+ display: grid;
397
+ gap: 6px;
398
+ margin: 0;
399
+ padding: 0;
400
+ counter-reset: step;
401
+ }
402
+ .step {
403
+ align-items: center;
404
+ background: var(--es-surface);
405
+ border: 1px solid var(--es-line);
406
+ border-left: 3px solid var(--step-accent, var(--es-line-strong));
407
+ border-radius: var(--es-radius-sm);
408
+ display: grid;
409
+ gap: 12px;
410
+ grid-template-columns: 64px minmax(0, 1fr) auto;
411
+ list-style: none;
412
+ padding: 9px 12px;
413
+ }
414
+ .step--passed {
415
+ --step-accent: var(--es-passed);
416
+ }
417
+ .step--failed {
418
+ --step-accent: var(--es-failed);
419
+ }
420
+ .step--skipped {
421
+ --step-accent: var(--es-skipped);
422
+ }
423
+ .step--pending {
424
+ --step-accent: var(--es-pending);
425
+ }
426
+ .keyword {
427
+ color: var(--es-accent);
428
+ font-weight: 700;
429
+ font-size: 13px;
430
+ }
431
+ .step-text {
432
+ font-size: 14px;
433
+ line-height: 1.45;
434
+ }
435
+ .step-status {
436
+ font-family: var(--es-mono);
437
+ font-size: 11px;
438
+ text-transform: lowercase;
439
+ color: var(--step-accent, var(--es-text-muted));
440
+ }
441
+
442
+ /* ---- Docs ---------------------------------------------------------- */
443
+ .doc-grid {
444
+ display: grid;
445
+ gap: 12px;
446
+ }
447
+ .doc-entry {
448
+ border: 1px solid var(--es-line);
449
+ border-radius: var(--es-radius);
450
+ background: var(--es-surface);
451
+ overflow: hidden;
452
+ }
453
+ .doc-entry__label {
454
+ font-size: 11px;
455
+ font-weight: 600;
456
+ text-transform: uppercase;
457
+ letter-spacing: 0.06em;
458
+ color: var(--es-text-muted);
459
+ padding: 9px 12px;
460
+ border-bottom: 1px solid var(--es-line);
461
+ background: var(--es-surface-2);
462
+ }
463
+ .doc-entry__body {
464
+ padding: 12px;
465
+ }
466
+
467
+ .doc-note {
468
+ padding: 12px 14px;
469
+ border-left: 3px solid var(--es-accent);
470
+ color: var(--es-text-soft);
471
+ font-size: 14px;
472
+ line-height: 1.5;
473
+ }
474
+
475
+ .doc-kv {
476
+ display: flex;
477
+ gap: 8px;
478
+ padding: 10px 12px;
479
+ font-size: 13px;
480
+ }
481
+ .doc-kv__label {
482
+ color: var(--es-text-muted);
483
+ font-weight: 600;
484
+ }
485
+ .doc-kv__value {
486
+ font-family: var(--es-mono);
487
+ white-space: pre-wrap;
488
+ word-break: break-word;
489
+ }
490
+
491
+ .doc-link-a {
492
+ display: inline-flex;
493
+ align-items: center;
494
+ gap: 6px;
495
+ padding: 11px 14px;
496
+ color: var(--es-accent);
497
+ text-decoration: none;
498
+ font-weight: 550;
499
+ }
500
+ .doc-link-a:hover {
501
+ text-decoration: underline;
502
+ }
503
+ .doc-link-a::after {
504
+ content: "↗";
505
+ font-size: 0.85em;
506
+ opacity: 0.7;
507
+ }
508
+
509
+ .doc-entry pre {
510
+ margin: 0;
511
+ overflow: auto;
512
+ font-family: var(--es-mono);
513
+ font-size: 12.5px;
514
+ line-height: 1.6;
515
+ }
516
+ .doc-entry pre code {
517
+ font-family: inherit;
518
+ }
519
+ /* highlight.js — token-based theme so code colours adapt to light/dark
520
+ from the same --es-* palette (no CDN stylesheet needed, works offline). */
521
+ .hljs-comment,
522
+ .hljs-quote {
523
+ color: var(--es-text-muted);
524
+ font-style: italic;
525
+ }
526
+ .hljs-keyword,
527
+ .hljs-selector-tag,
528
+ .hljs-literal,
529
+ .hljs-section,
530
+ .hljs-doctag,
531
+ .hljs-name {
532
+ color: var(--es-method-patch);
533
+ }
534
+ .hljs-string,
535
+ .hljs-attr,
536
+ .hljs-template-tag,
537
+ .hljs-addition {
538
+ color: var(--es-passed);
539
+ }
540
+ .hljs-number,
541
+ .hljs-symbol,
542
+ .hljs-bullet,
543
+ .hljs-meta {
544
+ color: var(--es-method-put);
545
+ }
546
+ .hljs-title,
547
+ .hljs-built_in,
548
+ .hljs-class .hljs-title,
549
+ .hljs-function .hljs-title,
550
+ .hljs-attribute {
551
+ color: var(--es-method-post);
552
+ }
553
+ .hljs-type,
554
+ .hljs-tag,
555
+ .hljs-deletion,
556
+ .hljs-variable {
557
+ color: var(--es-failed);
558
+ }
559
+ .doc-entry__body table {
560
+ border-collapse: collapse;
561
+ width: 100%;
562
+ font-size: 13px;
563
+ }
564
+ .doc-entry__body th,
565
+ .doc-entry__body td {
566
+ border: 1px solid var(--es-line);
567
+ padding: 6px 10px;
568
+ text-align: left;
569
+ }
570
+ .doc-entry__body th {
571
+ background: var(--es-surface-2);
572
+ font-weight: 600;
573
+ text-transform: uppercase;
574
+ font-size: 11px;
575
+ letter-spacing: 0.04em;
576
+ color: var(--es-text-muted);
577
+ }
578
+
579
+ .doc-section-content {
580
+ font-size: 14px;
581
+ line-height: 1.6;
582
+ }
583
+ .doc-section-content > :first-child {
584
+ margin-top: 0;
585
+ }
586
+ .doc-section-content > :last-child {
587
+ margin-bottom: 0;
588
+ }
589
+
590
+ .doc-media {
591
+ display: grid;
592
+ gap: 8px;
593
+ }
594
+ .doc-media img,
595
+ .doc-media video {
596
+ display: block;
597
+ width: 100%;
598
+ max-height: 70vh;
599
+ border-radius: var(--es-radius-sm);
600
+ background: #000;
601
+ }
602
+ .doc-media img {
603
+ background: var(--es-surface-2);
604
+ object-fit: contain;
605
+ }
606
+ .doc-media__caption {
607
+ font-size: 12px;
608
+ color: var(--es-text-muted);
609
+ }
610
+ .doc-media--broken {
611
+ padding: 16px;
612
+ border: 1px dashed var(--es-line-strong);
613
+ border-radius: var(--es-radius-sm);
614
+ text-align: center;
615
+ color: var(--es-text-muted);
616
+ font-size: 13px;
617
+ }
618
+ .doc-media--broken code {
619
+ display: block;
620
+ margin-top: 6px;
621
+ font-family: var(--es-mono);
622
+ font-size: 11px;
623
+ word-break: break-all;
624
+ }
625
+
626
+ .mermaid {
627
+ margin: 0;
628
+ text-align: center;
629
+ }
630
+
631
+ .doc-visual-grid {
632
+ display: grid;
633
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
634
+ gap: 10px;
635
+ }
636
+ .doc-visual-item {
637
+ display: grid;
638
+ gap: 6px;
639
+ }
640
+ .doc-visual-item .doc-visual-label {
641
+ font-size: 11px;
642
+ color: var(--es-text-muted);
643
+ text-transform: uppercase;
644
+ letter-spacing: 0.04em;
645
+ }
646
+ .doc-visual-item img {
647
+ width: 100%;
648
+ border-radius: var(--es-radius-sm);
649
+ border: 1px solid var(--es-line);
650
+ }
651
+
652
+ .doc-children {
653
+ margin-top: 10px;
654
+ padding-left: 12px;
655
+ border-left: 2px solid var(--es-line);
656
+ display: grid;
657
+ gap: 10px;
658
+ }
659
+
660
+ .empty {
661
+ color: var(--es-text-muted);
662
+ display: grid;
663
+ min-height: 60vh;
664
+ place-items: center;
665
+ text-align: center;
666
+ font-size: 14px;
667
+ }
668
+ .error {
669
+ color: var(--es-failed);
670
+ white-space: pre-wrap;
671
+ font-family: var(--es-mono);
672
+ font-size: 13px;
673
+ background: var(--es-failed-soft);
674
+ border: 1px solid color-mix(in oklab, var(--es-failed) 30%, var(--es-line));
675
+ border-radius: var(--es-radius-sm);
676
+ padding: 12px 14px;
677
+ margin: 0;
678
+ }
679
+
680
+ @media (max-width: 880px) {
681
+ .shell {
682
+ display: block;
683
+ }
684
+ .sidebar {
685
+ /* Cap the list so the detail pane is reachable without scrolling past
686
+ every scenario; the list scrolls within this panel. */
687
+ max-height: 45vh;
688
+ height: auto;
689
+ position: sticky;
690
+ top: var(--es-topbar-h);
691
+ z-index: 5;
692
+ box-shadow: 0 6px 12px -8px rgb(0 0 0 / 0.3);
693
+ }
694
+ .content {
695
+ padding: 18px;
696
+ }
697
+ .step {
698
+ grid-template-columns: 1fr;
699
+ gap: 4px;
700
+ }
701
+ }
702
+
703
+ /* ---- Accessibility -------------------------------------------------------- */
704
+
705
+ /* Visible keyboard focus on every interactive element. */
706
+ .scenario-button:focus-visible,
707
+ .topbar__home:focus-visible,
708
+ .source-link:focus-visible,
709
+ .doc-link-a:focus-visible,
710
+ .search:focus-visible,
711
+ .select:focus-visible,
712
+ .doc-media video:focus-visible {
713
+ outline: 2px solid var(--es-accent);
714
+ outline-offset: 2px;
715
+ border-radius: var(--es-radius-sm);
716
+ }
717
+
718
+ /* Respect users who prefer reduced motion: no transitions, transforms, or
719
+ smooth scrolling. */
720
+ @media (prefers-reduced-motion: reduce) {
721
+ *,
722
+ *::before,
723
+ *::after {
724
+ animation-duration: 0.01ms !important;
725
+ animation-iteration-count: 1 !important;
726
+ transition-duration: 0.01ms !important;
727
+ scroll-behavior: auto !important;
728
+ }
729
+ }