pattern-dump 0.1.0-alpha.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 (47) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +92 -0
  3. package/dist/dev-ui/main.css +1825 -0
  4. package/dist/dev-ui/main.js +3054 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +7 -0
  7. package/dist/pd.js +4759 -0
  8. package/dist/types/config/index.d.ts +145 -0
  9. package/dist/types/contracts/dev-protocol.d.ts +624 -0
  10. package/dist/types/contracts/index.d.ts +294 -0
  11. package/package.json +76 -0
  12. package/templates/base/README.md +77 -0
  13. package/templates/base/_gitignore +3 -0
  14. package/templates/base/pattern-dump.config.ts +36 -0
  15. package/templates/base/src/scripts/globals.d.ts +6 -0
  16. package/templates/base/src/styles/base/_tokens.scss +8 -0
  17. package/templates/base/src/styles/base/document.scss +18 -0
  18. package/templates/base/themes/dark.theme.scss +8 -0
  19. package/templates/base/themes/light.theme.scss +8 -0
  20. package/templates/base/tsconfig.json +19 -0
  21. package/templates/examples/src/patterns/atoms/button/button.hbs +1 -0
  22. package/templates/examples/src/patterns/atoms/button/button.json +1 -0
  23. package/templates/examples/src/patterns/atoms/button/button.md +21 -0
  24. package/templates/examples/src/patterns/atoms/button/button.schema.json +11 -0
  25. package/templates/examples/src/patterns/atoms/button/button~icon.hbs +5 -0
  26. package/templates/examples/src/patterns/atoms/button/button~secondary.json +1 -0
  27. package/templates/examples/src/patterns/atoms/index.md +6 -0
  28. package/templates/examples/src/patterns/index.md +3 -0
  29. package/templates/examples/src/patterns/molecules/index.md +6 -0
  30. package/templates/examples/src/patterns/molecules/search-field/input/input.hbs +4 -0
  31. package/templates/examples/src/patterns/molecules/search-field/input/input.json +1 -0
  32. package/templates/examples/src/patterns/molecules/search-field/input/input.md +8 -0
  33. package/templates/examples/src/patterns/molecules/search-field/input/input.schema.json +10 -0
  34. package/templates/examples/src/patterns/molecules/search-field/search-field.hbs +5 -0
  35. package/templates/examples/src/patterns/molecules/search-field/search-field.json +1 -0
  36. package/templates/examples/src/patterns/molecules/search-field/search-field.md +21 -0
  37. package/templates/examples/src/patterns/molecules/search-field/search-field.schema.json +11 -0
  38. package/templates/examples/src/patterns/pages/example/example.hbs +11 -0
  39. package/templates/examples/src/patterns/pages/example/example.json +8 -0
  40. package/templates/examples/src/patterns/pages/example/example.md +11 -0
  41. package/templates/examples/src/patterns/pages/example/example.schema.json +14 -0
  42. package/templates/examples/src/patterns/pages/index.md +6 -0
  43. package/templates/examples/src/scripts/search-field.ts +16 -0
  44. package/templates/examples/src/styles/atoms/button.scss +36 -0
  45. package/templates/examples/src/styles/molecules/search-field/input.scss +21 -0
  46. package/templates/examples/src/styles/molecules/search-field.scss +13 -0
  47. package/templates/examples/src/styles/pages/example.scss +28 -0
@@ -0,0 +1,1825 @@
1
+ @charset "UTF-8";
2
+ :root {
3
+ color-scheme: light;
4
+ /* ── Cool family — structure + text ── */
5
+ --pd-surface: light-dark(#F4F7FA, #F4F7FA); /* dark: stub */
6
+ --pd-border-rest: light-dark(#D4DAE0, #D4DAE0); /* dark: stub */
7
+ --pd-border-hover: light-dark(#B7C0C8, #B7C0C8); /* dark: stub */
8
+ --pd-border-active: light-dark(#9AA5AE, #9AA5AE); /* dark: stub */
9
+ --pd-ink: light-dark(#3B4B59, #3B4B59); /* dark: stub */
10
+ --pd-ink-muted: light-dark(color-mix(in srgb, #3B4B59 80%, transparent), color-mix(in srgb, #3B4B59 80%, transparent)); /* dark: stub */
11
+ --pd-ink-overlay: light-dark(color-mix(in srgb, #3B4B59 80%, transparent), color-mix(in srgb, #3B4B59 80%, transparent)); /* dark: stub */
12
+ /* Link tone — the ink slate pushed bluer (raised chroma + a lightness step) so a link reads as
13
+ interactive: a recognizable sibling of --pd-ink, not a foreign accent, and NOT the severity
14
+ red/orange. In-gamut; #2A6CBA, 4.94:1 on --pd-surface (#F4F7FA) — above the 4.5:1 link ideal.
15
+ Eye-picked from 3 candidates (bluer/brighter of the set). dark: stub */
16
+ --pd-link: light-dark(oklch(53% 0.14 255deg), oklch(53% 0.14 255deg));
17
+ /* ── Warm family — signal + warm structure ── */
18
+ --pd-brand: #CD0B0B; /* theming swap point — brand themes set this, nothing else */
19
+ --pd-accent: light-dark(var(--pd-brand), var(--pd-brand)); /* dark: stub */
20
+ --pd-accent-ink: light-dark(white, white); /* dark: stub */
21
+ --pd-warning: light-dark(oklch(72% 0.16 65deg), oklch(72% 0.16 65deg)); /* #E78C08 — warning signal; approved by eye through PD's CVD sim, in-gamut, CVD-separable from --pd-accent by luminance. dark: stub */
22
+ --pd-warm-sand: light-dark(#E0CCC5, #E0CCC5); /* dark: stub */
23
+ --pd-region-radius: 0;
24
+ --pd-divider: light-dark(var(--pd-warm-sand), var(--pd-warm-sand)); /* dark: stub */
25
+ --pd-rail-icon-size: 2rem; /* icon-button hit target — applies to .rail-toggle and .rail-vp-btn */
26
+ --pd-rail-min: 18rem; /* track floor: 7 icons + readout/label row clears overflow:hidden */
27
+ --pd-mark: var(--pd-border-active); /* corner crop-mark color — firmer hairline for readability */
28
+ --pd-mark-size: 12px; /* arm length */
29
+ --pd-mark-gap: 4px; /* gap between arm and frame corner */
30
+ --pd-mark-thickness: 2px; /* arm weight — 2px reads as intentional crop mark at viewing distance */
31
+ --pd-mark-bleed: 4px; /* extra clearance above TL/TR arms so overflow:hidden doesn't clip the V arm tips */
32
+ --pd-drag-thickness: 4px; /* drag-handle hover bar weight — stacks with region seam-firm to read as one bold edge */
33
+ }
34
+
35
+ *,
36
+ *::before,
37
+ *::after {
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ body {
42
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
43
+ -webkit-font-smoothing: antialiased;
44
+ font-optical-sizing: auto;
45
+ margin: 0;
46
+ height: 100vh;
47
+ overflow: hidden;
48
+ background: var(--pd-surface);
49
+ color: var(--pd-ink);
50
+ }
51
+
52
+ code,
53
+ pre {
54
+ font-family: ui-monospace, Menlo, Consolas, monospace;
55
+ }
56
+
57
+ .app {
58
+ display: grid;
59
+ grid-template-rows: 1fr;
60
+ height: 100vh;
61
+ overflow: hidden;
62
+ }
63
+
64
+ summary {
65
+ list-style: none;
66
+ }
67
+ summary::marker, summary::-webkit-details-marker {
68
+ display: none;
69
+ }
70
+
71
+ [hidden] {
72
+ /* stylelint-disable-next-line declaration-no-important -- intentional: guarantees [hidden] wins regardless of component CSS specificity */
73
+ display: none !important;
74
+ }
75
+
76
+ .main {
77
+ --pd-sidebar-w: 20rem;
78
+ --pd-panel-w: 20rem;
79
+ --pd-dock-h: 11.25rem;
80
+ --pd-panel-track: 0;
81
+ /* stylelint-disable-next-line unit-disallowed-list */
82
+ --pd-dock-track: round(clamp(5rem, var(--pd-dock-h), calc(100vh - var(--pd-stage-min-h))), calc(1px / var(--dpr)));
83
+ --pd-stage-min: 20rem;
84
+ --pd-stage-min-h: 20vh;
85
+ display: grid;
86
+ grid-template-areas: "sidebar stage panel" "sidebar dock panel";
87
+ grid-template-columns: clamp(var(--pd-rail-min), var(--pd-sidebar-w), 100vw - var(--pd-stage-min)) minmax(var(--pd-stage-min), 1fr) var(--pd-panel-track);
88
+ grid-template-rows: 1fr var(--pd-dock-track);
89
+ overflow: hidden;
90
+ min-height: 0;
91
+ transition: grid-template-columns 150ms ease, grid-template-rows 150ms ease;
92
+ }
93
+
94
+ .main[data-dock-hidden] {
95
+ --pd-dock-track: 0;
96
+ }
97
+
98
+ .main[data-panel-open] {
99
+ --pd-panel-track: clamp(20rem, var(--pd-panel-w), calc(100vw - var(--pd-stage-min)));
100
+ }
101
+
102
+ .main[data-panel-open]:has(.panel[hidden]) {
103
+ --pd-panel-track: 0;
104
+ }
105
+
106
+ .main[data-no-transition],
107
+ .main[data-no-transition] #preview-frame {
108
+ transition: none;
109
+ }
110
+
111
+ @media (prefers-reduced-motion: reduce) {
112
+ .main {
113
+ transition: none;
114
+ }
115
+ }
116
+ @keyframes pd-fade-out {
117
+ from {
118
+ opacity: 1;
119
+ }
120
+ to {
121
+ opacity: 0;
122
+ }
123
+ }
124
+ @keyframes pd-fade-in {
125
+ from {
126
+ opacity: 0;
127
+ }
128
+ to {
129
+ opacity: 1;
130
+ }
131
+ }
132
+ ::view-transition-old(root) {
133
+ animation: pd-fade-out 120ms ease-in both;
134
+ }
135
+
136
+ ::view-transition-new(root) {
137
+ animation: pd-fade-in 120ms ease-out both;
138
+ }
139
+
140
+ @media (max-width: 900px) {
141
+ .main {
142
+ grid-template-areas: "sidebar stage" "sidebar dock";
143
+ grid-template-columns: clamp(var(--pd-rail-min), var(--pd-sidebar-w), 100vw - var(--pd-stage-min)) minmax(var(--pd-stage-min), 1fr);
144
+ }
145
+ .main .panel {
146
+ display: none;
147
+ }
148
+ .main[data-panel-open] .panel {
149
+ display: flex;
150
+ position: absolute;
151
+ inset-block: 0;
152
+ inset-inline-end: 0;
153
+ z-index: 10;
154
+ background: var(--pd-surface);
155
+ height: 100%;
156
+ }
157
+ }
158
+ .rail-brand {
159
+ padding: 0.4rem 0.5rem 0.25rem;
160
+ border-bottom: thin solid var(--pd-divider);
161
+ }
162
+
163
+ .rail-brand-title {
164
+ font-size: 1rem;
165
+ font-weight: bold;
166
+ }
167
+
168
+ .rail-brand-link {
169
+ color: inherit;
170
+ text-decoration: none;
171
+ }
172
+ .rail-brand-link:hover, .rail-brand-link:focus-visible {
173
+ text-decoration: underline;
174
+ }
175
+
176
+ .rail-brand-logo {
177
+ max-height: 2rem;
178
+ display: block;
179
+ }
180
+
181
+ .theme-picker {
182
+ border-bottom: thin solid var(--pd-divider);
183
+ }
184
+
185
+ .theme-picker-summary {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 0.4rem;
189
+ padding: 0.2rem 0.5rem;
190
+ cursor: pointer;
191
+ font-size: 0.85rem;
192
+ }
193
+
194
+ .theme-picker-swatch {
195
+ flex-shrink: 0;
196
+ }
197
+
198
+ .theme-picker-current-name {
199
+ font-style: italic;
200
+ color: var(--pd-ink-muted);
201
+ overflow: hidden;
202
+ text-overflow: ellipsis;
203
+ white-space: nowrap;
204
+ }
205
+
206
+ .theme-picker-readout {
207
+ margin: 0;
208
+ padding: 0.1rem 0.5rem 0.25rem;
209
+ font-size: 0.8rem;
210
+ font-style: italic;
211
+ color: var(--pd-ink-muted);
212
+ min-height: 1.2em;
213
+ }
214
+
215
+ .theme-picker-list {
216
+ display: flex;
217
+ flex-wrap: wrap;
218
+ gap: 0.25rem;
219
+ list-style: none;
220
+ margin: 0;
221
+ padding: 0.25rem 0.5rem;
222
+ }
223
+
224
+ .theme-radio {
225
+ position: absolute;
226
+ width: 0.0625rem;
227
+ height: 0.0625rem;
228
+ margin: -0.0625rem;
229
+ padding: 0;
230
+ border: 0;
231
+ overflow: hidden;
232
+ clip-path: inset(50%);
233
+ white-space: nowrap;
234
+ }
235
+
236
+ .theme-swatch-chip {
237
+ display: block;
238
+ border: 2px solid transparent;
239
+ border-radius: 3px;
240
+ cursor: pointer;
241
+ overflow: hidden;
242
+ }
243
+ .theme-swatch-chip:hover, .theme-swatch-chip:focus-visible {
244
+ outline: 2px solid currentcolor;
245
+ outline-offset: 1px;
246
+ }
247
+
248
+ .theme-radio:checked + .theme-swatch-chip {
249
+ border-color: currentcolor;
250
+ }
251
+
252
+ .theme-swatch-strip {
253
+ display: flex;
254
+ height: 1.4rem;
255
+ width: 2.8rem;
256
+ }
257
+
258
+ .theme-swatch-band {
259
+ flex: 1;
260
+ }
261
+
262
+ .theme-swatch-undefined {
263
+ /* stylelint-disable unit-disallowed-list -- hairline stripe pattern; must not scale with font-size */
264
+ background: repeating-linear-gradient(45deg, transparent, transparent 3px, currentcolor 3px, currentcolor 4px);
265
+ /* stylelint-enable unit-disallowed-list */
266
+ opacity: 0.25;
267
+ }
268
+
269
+ .a11y-picker {
270
+ border-bottom: thin solid var(--pd-divider);
271
+ container-type: inline-size;
272
+ }
273
+
274
+ .a11y-picker-summary {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 0.4rem;
278
+ padding: 0.2rem 0.5rem;
279
+ cursor: pointer;
280
+ font-size: 0.85rem;
281
+ }
282
+
283
+ .a11y-icon {
284
+ flex-shrink: 0;
285
+ line-height: 0;
286
+ }
287
+
288
+ .a11y-label {
289
+ overflow: hidden;
290
+ white-space: nowrap;
291
+ text-overflow: ellipsis;
292
+ flex: 1 1 0;
293
+ }
294
+
295
+ .a11y-label-short {
296
+ display: none;
297
+ }
298
+
299
+ @container (max-width: 150px) {
300
+ .a11y-label-full {
301
+ display: none;
302
+ }
303
+ .a11y-label-short {
304
+ display: inline;
305
+ }
306
+ }
307
+ @container (max-width: 80px) {
308
+ .a11y-label-short {
309
+ display: none;
310
+ }
311
+ }
312
+ .a11y-signal {
313
+ margin-left: auto;
314
+ font-size: 0.75em;
315
+ font-variant-numeric: tabular-nums;
316
+ color: var(--pd-ink-muted);
317
+ white-space: nowrap;
318
+ overflow: hidden;
319
+ text-overflow: ellipsis;
320
+ flex-shrink: 0;
321
+ }
322
+
323
+ .a11y-cvd-panel {
324
+ padding: 0.25rem 0.5rem 0.5rem;
325
+ }
326
+
327
+ .cvd-type-group {
328
+ display: flex;
329
+ flex-wrap: wrap;
330
+ gap: 0.2rem;
331
+ margin-bottom: 0.4rem;
332
+ }
333
+
334
+ .cvd-type-btn {
335
+ font-size: 0.8rem;
336
+ padding: 0.15rem 0.4rem;
337
+ background: none;
338
+ border: thin solid var(--pd-border-rest);
339
+ border-radius: 3px;
340
+ cursor: pointer;
341
+ color: inherit;
342
+ opacity: 0.6;
343
+ }
344
+ .cvd-type-btn[aria-checked=true] {
345
+ opacity: 1;
346
+ font-weight: 600;
347
+ }
348
+ .cvd-type-btn:not([data-cvd-type=none])[aria-checked=true] {
349
+ background: var(--pd-accent);
350
+ color: var(--pd-accent-ink);
351
+ }
352
+ .cvd-type-btn:hover, .cvd-type-btn:focus-visible {
353
+ outline: 2px solid currentcolor;
354
+ outline-offset: 1px;
355
+ }
356
+
357
+ .cvd-severity-label {
358
+ display: flex;
359
+ align-items: center;
360
+ gap: 0.4rem;
361
+ font-size: 0.8rem;
362
+ }
363
+
364
+ .cvd-severity-slider {
365
+ flex: 1;
366
+ appearance: none;
367
+ -webkit-appearance: none; /* stylelint-disable-line property-no-vendor-prefix -- Safari still needs it to drop UA range chrome */
368
+ height: 1rem;
369
+ background: transparent;
370
+ cursor: pointer;
371
+ }
372
+ .cvd-severity-slider::-webkit-slider-runnable-track {
373
+ height: 0.375rem;
374
+ border-radius: 0.1875rem;
375
+ background: linear-gradient(to right, var(--pd-accent) 0 var(--fill, 0%), var(--pd-border-rest) var(--fill, 0%) 100%);
376
+ }
377
+ .cvd-severity-slider::-moz-range-track {
378
+ height: 0.375rem;
379
+ border-radius: 0.1875rem;
380
+ background: var(--pd-border-rest);
381
+ }
382
+ .cvd-severity-slider::-moz-range-progress {
383
+ height: 0.375rem;
384
+ border-radius: 0.1875rem;
385
+ background: var(--pd-accent);
386
+ }
387
+ .cvd-severity-slider::-webkit-slider-thumb {
388
+ -webkit-appearance: none; /* stylelint-disable-line property-no-vendor-prefix -- required to style the webkit thumb */
389
+ width: 0.875rem;
390
+ height: 0.875rem;
391
+ margin-top: -0.25rem;
392
+ border: none;
393
+ border-radius: 50%;
394
+ background: var(--pd-ink);
395
+ }
396
+ .cvd-severity-slider::-moz-range-thumb {
397
+ width: 0.875rem;
398
+ height: 0.875rem;
399
+ border: none;
400
+ border-radius: 50%;
401
+ background: var(--pd-ink);
402
+ }
403
+ .cvd-severity-slider:focus-visible {
404
+ outline: 2px solid currentcolor;
405
+ outline-offset: 2px;
406
+ }
407
+ .cvd-severity-slider:disabled {
408
+ cursor: not-allowed;
409
+ }
410
+ .cvd-severity-slider:disabled::-webkit-slider-runnable-track {
411
+ background: var(--pd-border-rest);
412
+ }
413
+ .cvd-severity-slider:disabled::-webkit-slider-thumb {
414
+ background: var(--pd-ink-muted);
415
+ }
416
+ .cvd-severity-slider:disabled::-moz-range-track {
417
+ background: var(--pd-border-rest);
418
+ }
419
+ .cvd-severity-slider:disabled::-moz-range-progress {
420
+ background: var(--pd-border-rest);
421
+ }
422
+ .cvd-severity-slider:disabled::-moz-range-thumb {
423
+ background: var(--pd-ink-muted);
424
+ }
425
+
426
+ .rail-toggle-cluster {
427
+ display: flex;
428
+ flex-direction: row;
429
+ gap: 0.5rem;
430
+ padding: 0.25rem 0.5rem;
431
+ border-bottom: thin solid var(--pd-divider);
432
+ }
433
+
434
+ .rail-toggle {
435
+ display: inline-flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ padding: 0.2rem;
439
+ background: none;
440
+ border: none;
441
+ cursor: pointer;
442
+ color: inherit;
443
+ font-size: 1.25rem;
444
+ line-height: 0;
445
+ border-radius: 3px;
446
+ min-inline-size: var(--pd-rail-icon-size);
447
+ min-block-size: var(--pd-rail-icon-size);
448
+ }
449
+ .rail-toggle svg {
450
+ display: block;
451
+ width: 1.25rem;
452
+ height: 1.25rem;
453
+ flex-shrink: 0;
454
+ }
455
+ .rail-toggle:hover, .rail-toggle:focus-visible {
456
+ outline: 2px solid currentcolor;
457
+ outline-offset: 1px;
458
+ }
459
+ .rail-toggle[aria-expanded=true] {
460
+ opacity: 1;
461
+ }
462
+ .rail-toggle[aria-expanded=false] {
463
+ opacity: 0.55;
464
+ }
465
+
466
+ .rail-toggle-label {
467
+ margin-inline-start: auto;
468
+ align-self: center;
469
+ font-size: 0.75rem;
470
+ line-height: 1;
471
+ white-space: nowrap;
472
+ color: inherit;
473
+ opacity: 0;
474
+ transition: opacity 0.1s ease;
475
+ pointer-events: none;
476
+ }
477
+ .rail-toggle-label:not(:empty) {
478
+ opacity: 0.8;
479
+ }
480
+
481
+ @media (prefers-reduced-motion: reduce) {
482
+ .rail-toggle-label,
483
+ .vp-mode-label {
484
+ transition: none;
485
+ }
486
+ }
487
+ .rail-vp-cluster {
488
+ display: grid;
489
+ grid-template-columns: repeat(7, 2rem);
490
+ justify-content: start;
491
+ grid-template-areas: ". . . . . . ." "readout readout readout label label label label";
492
+ gap: 0.375rem;
493
+ align-items: center;
494
+ padding: 0.25rem 0.5rem;
495
+ border-bottom: thin solid var(--pd-divider);
496
+ }
497
+
498
+ .rail-vp-cluster [role=radiogroup] {
499
+ display: contents;
500
+ }
501
+
502
+ .rail-vp-btn {
503
+ grid-row: 1;
504
+ display: inline-flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ padding: 0.2rem;
508
+ background: none;
509
+ border: none;
510
+ cursor: pointer;
511
+ color: inherit;
512
+ font-size: 1.25rem;
513
+ line-height: 0;
514
+ border-radius: 3px;
515
+ min-inline-size: var(--pd-rail-icon-size);
516
+ min-block-size: var(--pd-rail-icon-size);
517
+ }
518
+ .rail-vp-btn svg {
519
+ display: block;
520
+ width: 1.25rem;
521
+ height: 1.25rem;
522
+ flex-shrink: 0;
523
+ }
524
+ .rail-vp-btn:hover, .rail-vp-btn:focus-visible {
525
+ outline: 2px solid currentcolor;
526
+ outline-offset: 1px;
527
+ }
528
+ .rail-vp-btn[aria-checked=false], .rail-vp-btn[aria-pressed=false] {
529
+ opacity: 0.55;
530
+ }
531
+ .rail-vp-btn[aria-checked=true], .rail-vp-btn[aria-pressed=true] {
532
+ opacity: 1;
533
+ }
534
+
535
+ .rail-vp-cluster:not([data-disco-active]) .rail-vp-btn[aria-checked=true] {
536
+ color: var(--pd-accent);
537
+ }
538
+
539
+ .rail-vp-cluster .vp-disco-btn[aria-pressed=true] {
540
+ color: var(--pd-accent);
541
+ }
542
+
543
+ .vp-readout {
544
+ grid-area: readout;
545
+ justify-self: start;
546
+ font-size: 0.8em;
547
+ font-variant-numeric: tabular-nums;
548
+ color: var(--pd-ink-muted);
549
+ white-space: nowrap;
550
+ }
551
+
552
+ .vp-mode-label {
553
+ grid-area: label;
554
+ justify-self: end;
555
+ text-align: right;
556
+ font-size: 0.75rem;
557
+ line-height: 1;
558
+ white-space: nowrap;
559
+ color: inherit;
560
+ opacity: 0.8;
561
+ pointer-events: none;
562
+ }
563
+
564
+ .rail-status {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 0.4rem;
568
+ padding: 0.25rem 0.5rem;
569
+ font-size: 0.8rem;
570
+ margin-top: auto;
571
+ border-top: thin solid var(--pd-divider);
572
+ flex-shrink: 0;
573
+ }
574
+
575
+ .rail-status[data-state=connected]::before {
576
+ content: "";
577
+ display: inline-block;
578
+ width: 0.5rem;
579
+ height: 0.5rem;
580
+ border-radius: 50%;
581
+ background: var(--pd-accent);
582
+ flex-shrink: 0;
583
+ }
584
+ .rail-status[data-state=connected] .rail-status-icon {
585
+ display: none;
586
+ }
587
+
588
+ .rail-status[data-state=disconnected] {
589
+ color: var(--pd-warning);
590
+ }
591
+ .rail-status[data-state=disconnected]::before {
592
+ display: none;
593
+ }
594
+
595
+ .rail-status[data-state=static] {
596
+ color: var(--pd-ink-muted);
597
+ }
598
+ .rail-status[data-state=static] .rail-status-icon {
599
+ display: none;
600
+ }
601
+
602
+ .sidebar {
603
+ position: relative;
604
+ grid-area: sidebar;
605
+ display: flex;
606
+ flex-direction: column;
607
+ min-height: 0;
608
+ overflow: hidden;
609
+ border-right: 1px solid var(--pd-border-rest);
610
+ border-radius: var(--pd-region-radius);
611
+ --tree-header-h: 1.25rem; /* depth-0 row = 20px: summary 12px + margin-block 4px×2 — whole px */
612
+ }
613
+
614
+ .sidebar:hover,
615
+ .sidebar:focus-within {
616
+ border-right-color: var(--pd-border-active);
617
+ }
618
+
619
+ .sidebar:has([data-resize=sidebar-w]:hover) {
620
+ border-right-color: var(--pd-border-active);
621
+ }
622
+
623
+ .sidebar:has([data-resize=sidebar-w]:active) {
624
+ border-right-color: var(--pd-border-active);
625
+ }
626
+
627
+ .sidebar-search {
628
+ padding: 0.25rem;
629
+ }
630
+ .sidebar-search input {
631
+ width: 100%;
632
+ }
633
+
634
+ .sidebar-controls {
635
+ padding: 0.125rem 0.25rem;
636
+ font-size: 0.8em;
637
+ }
638
+
639
+ .sidebar-tree {
640
+ flex: 1;
641
+ min-height: 0;
642
+ overflow-y: auto;
643
+ overflow-x: hidden;
644
+ margin: 0;
645
+ padding: 0;
646
+ list-style: none;
647
+ }
648
+ .sidebar-tree ul {
649
+ padding-left: 0;
650
+ margin: 0;
651
+ }
652
+
653
+ .tree-node {
654
+ list-style: none;
655
+ }
656
+
657
+ .tree-node > ul {
658
+ display: none;
659
+ margin-inline-start: 0.9375rem;
660
+ list-style: none;
661
+ border-inline-start: 0.0625rem solid transparent;
662
+ }
663
+
664
+ .tree-node:has(> .tree-folder-row > :where(.tree-details[open])) > ul {
665
+ display: revert;
666
+ }
667
+
668
+ ul:has(> .tree-node > .tree-link[aria-current=page]) {
669
+ border-inline-start-color: var(--pd-border-rest);
670
+ }
671
+
672
+ .tree-folder-row {
673
+ display: flex;
674
+ align-items: center;
675
+ position: sticky;
676
+ background: var(--pd-surface);
677
+ }
678
+
679
+ .tree-folder-row[data-depth="0"] {
680
+ top: 0;
681
+ z-index: 3;
682
+ container-type: scroll-state;
683
+ }
684
+
685
+ .tree-folder-row[data-depth="1"] {
686
+ top: var(--tree-header-h);
687
+ z-index: 2;
688
+ }
689
+
690
+ .tree-folder-row[data-depth="2"] {
691
+ top: calc(var(--tree-header-h) * 2);
692
+ z-index: 1;
693
+ }
694
+
695
+ .tree-details {
696
+ flex: 1;
697
+ min-width: 0;
698
+ }
699
+
700
+ summary.tree-folder {
701
+ display: flex;
702
+ align-items: center;
703
+ gap: 0.3em;
704
+ padding: 0.2rem 0.5rem;
705
+ font-weight: bold;
706
+ color: var(--pd-ink-muted);
707
+ cursor: pointer;
708
+ }
709
+
710
+ .disclosure-caret {
711
+ display: inline-flex;
712
+ align-items: center;
713
+ flex-shrink: 0;
714
+ width: 0.875rem;
715
+ height: 0.875rem;
716
+ line-height: 0;
717
+ transition: transform 150ms ease;
718
+ }
719
+
720
+ details[open] .disclosure-caret {
721
+ transform: rotate(90deg);
722
+ }
723
+
724
+ .tree-show-all {
725
+ font-size: 0.8em;
726
+ font-weight: normal;
727
+ text-decoration: none;
728
+ color: var(--pd-ink-muted);
729
+ padding: 0.2rem 0.5rem;
730
+ white-space: nowrap;
731
+ }
732
+ .tree-show-all:hover, .tree-show-all:focus-visible {
733
+ color: var(--pd-ink);
734
+ text-decoration: underline;
735
+ }
736
+ .tree-show-all[aria-current=page] {
737
+ color: var(--pd-accent);
738
+ font-weight: bold;
739
+ }
740
+
741
+ .tree-link {
742
+ display: block;
743
+ position: relative;
744
+ padding: 0.125rem 0.5rem 0.125rem 0.625rem;
745
+ font-size: 0.8125rem;
746
+ line-height: 1.846;
747
+ min-block-size: 1.5rem;
748
+ text-decoration: none;
749
+ color: var(--pd-ink);
750
+ }
751
+ .tree-link::before {
752
+ content: "";
753
+ position: absolute;
754
+ left: -0.125rem;
755
+ top: 0.375rem;
756
+ bottom: 0.375rem;
757
+ width: 0.1875rem;
758
+ border-radius: 0.125rem;
759
+ background: transparent;
760
+ }
761
+ .tree-link:hover::before, .tree-link:focus-visible::before {
762
+ background: var(--pd-ink);
763
+ }
764
+ .tree-link:focus-visible {
765
+ outline: 0.125rem solid var(--pd-accent);
766
+ outline-offset: -0.0625rem;
767
+ }
768
+ .tree-link[aria-current=page] {
769
+ color: var(--pd-ink);
770
+ }
771
+ .tree-link[aria-current=page]::before {
772
+ background: var(--pd-accent);
773
+ }
774
+
775
+ .tree-node[data-private] {
776
+ display: none;
777
+ }
778
+
779
+ .sidebar-tree.show-internals .tree-node[data-private] {
780
+ display: list-item;
781
+ }
782
+
783
+ .hide-packages .tree-node[data-package] {
784
+ display: none;
785
+ }
786
+
787
+ .private-badge {
788
+ font-size: 0.75em;
789
+ color: var(--pd-ink-muted);
790
+ }
791
+
792
+ .tree-folder-row[data-depth="0"] > .tree-details > summary.tree-folder {
793
+ font-size: 0.6875rem;
794
+ font-weight: 500;
795
+ letter-spacing: 0.08em;
796
+ text-transform: uppercase;
797
+ color: var(--pd-ink);
798
+ line-height: 1.2;
799
+ min-block-size: 0.625rem;
800
+ padding-block: 0;
801
+ margin-block: 0.25rem;
802
+ }
803
+
804
+ .tree-folder-row[data-depth="0"] > .tree-details > summary.tree-folder:focus-visible {
805
+ color: var(--pd-accent);
806
+ outline: 0.0625rem solid var(--pd-accent);
807
+ outline-offset: -0.0625rem;
808
+ }
809
+
810
+ .tree-folder-row[data-depth="1"] > .tree-details > summary.tree-folder {
811
+ font-size: 0.8125rem;
812
+ font-weight: 400;
813
+ line-height: 1.9;
814
+ color: var(--pd-ink-muted);
815
+ }
816
+
817
+ .sidebar-tree > .tree-node {
818
+ margin-block-start: 0.75rem;
819
+ }
820
+
821
+ .tree-node:has(> .tree-folder-row > .tree-details:not([open])):has([aria-current=page]) > .tree-folder-row > .tree-details > summary.tree-folder {
822
+ color: var(--pd-accent);
823
+ }
824
+
825
+ @container scroll-state(stuck: top) {
826
+ .tree-node:has([aria-current=page]) > .tree-folder-row > .tree-details > summary.tree-folder {
827
+ color: var(--pd-accent);
828
+ }
829
+ }
830
+ .stage {
831
+ grid-area: stage;
832
+ display: flex;
833
+ flex-direction: column;
834
+ min-width: 0;
835
+ min-height: 0;
836
+ overflow: hidden;
837
+ }
838
+
839
+ .variant-bar {
840
+ padding: 0.25rem 0.5rem;
841
+ flex-shrink: 0;
842
+ border-bottom: thin solid var(--pd-divider);
843
+ font-size: 0.8em;
844
+ color: var(--pd-ink-muted);
845
+ }
846
+
847
+ .variant-select {
848
+ font: inherit;
849
+ color: inherit;
850
+ font-weight: normal;
851
+ appearance: none;
852
+ border: thin solid var(--pd-border-rest);
853
+ border-radius: var(--pd-region-radius);
854
+ padding: 0.1rem 1.5rem 0.1rem 0.4rem;
855
+ }
856
+
857
+ .variant-bar label {
858
+ position: relative;
859
+ font-weight: bold;
860
+ }
861
+
862
+ .variant-bar label::after {
863
+ content: "";
864
+ position: absolute;
865
+ top: 50%;
866
+ right: 0.5rem;
867
+ width: 0.875rem;
868
+ height: 0.875rem;
869
+ transform: translateY(-50%);
870
+ pointer-events: none;
871
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cg transform='rotate(90 8 8)'%3E%3Cpath d='M6 3.5 L10.5 8 L6 12.5' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3C/svg%3E");
872
+ mask-repeat: no-repeat;
873
+ mask-position: center;
874
+ mask-size: contain;
875
+ background-color: var(--pd-ink-muted);
876
+ }
877
+
878
+ .stage-view {
879
+ flex: 1;
880
+ overflow: hidden;
881
+ display: flex;
882
+ flex-direction: column;
883
+ min-height: 0;
884
+ position: relative;
885
+ padding-block-start: calc(var(--pd-mark-gap) + var(--pd-mark-size) + var(--pd-mark-bleed));
886
+ }
887
+
888
+ .stage-view:has(.vp-fit),
889
+ .stage-view[data-layout=full]:has(.vp-content) {
890
+ padding-block-start: 0;
891
+ }
892
+
893
+ figure.preview {
894
+ margin: 0;
895
+ }
896
+
897
+ .single-preview {
898
+ flex: 1;
899
+ min-height: 0;
900
+ display: grid;
901
+ grid-template-columns: 1fr;
902
+ grid-template-rows: 1fr auto;
903
+ overflow: auto;
904
+ position: relative;
905
+ container-type: size;
906
+ }
907
+
908
+ .single-preview iframe {
909
+ display: block;
910
+ border: none;
911
+ min-height: 0;
912
+ width: var(--vp-w, 100%);
913
+ height: var(--vp-h, auto);
914
+ margin-inline: auto;
915
+ transition: width 2s ease;
916
+ }
917
+
918
+ #preview-frame {
919
+ background: Canvas;
920
+ }
921
+
922
+ .single-preview iframe.vp-fit {
923
+ max-width: 100%;
924
+ }
925
+
926
+ .single-preview iframe.vp-content {
927
+ max-width: 100%;
928
+ max-height: 100cqb;
929
+ }
930
+
931
+ #preview-frame.frame-focused {
932
+ outline: 1px solid var(--pd-border-active);
933
+ outline-offset: -1px;
934
+ }
935
+
936
+ @media (prefers-reduced-motion: reduce) {
937
+ .single-preview iframe {
938
+ transition: none;
939
+ }
940
+ }
941
+ .stage-view[data-layout=full] .single-preview {
942
+ overflow: auto;
943
+ display: flex;
944
+ flex-direction: column;
945
+ }
946
+
947
+ .stage-view[data-layout=full] .single-preview iframe {
948
+ flex: 1;
949
+ min-height: 0;
950
+ }
951
+
952
+ .preview-caption {
953
+ font-size: 0.8em;
954
+ padding: 0.125rem 0.5rem;
955
+ color: var(--pd-ink-muted);
956
+ }
957
+
958
+ .preview-id {
959
+ color: var(--pd-ink-muted);
960
+ }
961
+
962
+ .overview {
963
+ padding: 0.5rem;
964
+ overflow-y: auto;
965
+ overflow-x: hidden; /* vertical-scrollbar never spawns h-scroll; no sideways content */
966
+ scrollbar-gutter: stable; /* reserve gutter always so bar appearance doesn't steal width */
967
+ flex: 1;
968
+ }
969
+
970
+ .overview-doc {
971
+ margin-bottom: 1rem;
972
+ }
973
+
974
+ .gallery {
975
+ display: flex;
976
+ flex-direction: column;
977
+ gap: 1.5rem;
978
+ }
979
+
980
+ .hide-packages .gallery-item[data-package] {
981
+ display: none;
982
+ }
983
+
984
+ .gallery-item {
985
+ border-top: thin solid currentcolor;
986
+ padding-top: 0.5rem;
987
+ }
988
+ .gallery-item iframe {
989
+ width: 100%;
990
+ height: var(--vp-h, auto); /* pd-height sets --vp-h; auto = UA 150px until first fire */
991
+ border: none;
992
+ display: block;
993
+ min-height: 2rem;
994
+ }
995
+
996
+ .gallery-label {
997
+ font-size: 1rem;
998
+ font-weight: 600;
999
+ margin: 0 0 0.375rem;
1000
+ }
1001
+
1002
+ .gallery-label-link {
1003
+ color: inherit;
1004
+ text-decoration: none;
1005
+ }
1006
+ .gallery-label-link:hover, .gallery-label-link:focus-visible {
1007
+ text-decoration: underline;
1008
+ }
1009
+
1010
+ .variants-gallery {
1011
+ padding: 0.5rem;
1012
+ overflow-y: auto;
1013
+ flex: 1;
1014
+ }
1015
+
1016
+ .pd-mark-overlay {
1017
+ position: absolute;
1018
+ pointer-events: none;
1019
+ overflow: visible;
1020
+ z-index: 1;
1021
+ }
1022
+
1023
+ .pd-mark {
1024
+ position: absolute;
1025
+ width: 0;
1026
+ height: 0;
1027
+ }
1028
+ .pd-mark::before, .pd-mark::after {
1029
+ content: "";
1030
+ position: absolute;
1031
+ background: var(--pd-mark);
1032
+ }
1033
+ .pd-mark::before {
1034
+ width: var(--pd-mark-size);
1035
+ height: var(--pd-mark-thickness);
1036
+ }
1037
+ .pd-mark::after {
1038
+ width: var(--pd-mark-thickness);
1039
+ height: var(--pd-mark-size);
1040
+ }
1041
+
1042
+ .pd-mark-tl {
1043
+ top: 0;
1044
+ left: 0;
1045
+ }
1046
+ .pd-mark-tl::before {
1047
+ right: var(--pd-mark-gap);
1048
+ top: 0;
1049
+ }
1050
+ .pd-mark-tl::after {
1051
+ left: 0;
1052
+ bottom: var(--pd-mark-gap);
1053
+ }
1054
+
1055
+ .pd-mark-tr {
1056
+ top: 0;
1057
+ right: 0;
1058
+ }
1059
+ .pd-mark-tr::before {
1060
+ left: var(--pd-mark-gap);
1061
+ top: 0;
1062
+ }
1063
+ .pd-mark-tr::after {
1064
+ right: 0;
1065
+ bottom: var(--pd-mark-gap);
1066
+ }
1067
+
1068
+ .pd-mark-bl {
1069
+ bottom: 0;
1070
+ left: 0;
1071
+ }
1072
+ .pd-mark-bl::before {
1073
+ right: var(--pd-mark-gap);
1074
+ bottom: 0;
1075
+ }
1076
+ .pd-mark-bl::after {
1077
+ left: 0;
1078
+ top: var(--pd-mark-gap);
1079
+ }
1080
+
1081
+ .pd-mark-br {
1082
+ bottom: 0;
1083
+ right: 0;
1084
+ }
1085
+ .pd-mark-br::before {
1086
+ left: var(--pd-mark-gap);
1087
+ bottom: 0;
1088
+ }
1089
+ .pd-mark-br::after {
1090
+ right: 0;
1091
+ top: var(--pd-mark-gap);
1092
+ }
1093
+
1094
+ dialog.fullpage {
1095
+ position: fixed;
1096
+ inset: 0;
1097
+ max-width: none;
1098
+ max-height: none;
1099
+ margin: 0;
1100
+ padding: 0;
1101
+ border: 0;
1102
+ background: var(--pd-surface);
1103
+ width: 100%;
1104
+ height: 100%;
1105
+ }
1106
+
1107
+ dialog.fullpage::backdrop {
1108
+ background: transparent;
1109
+ }
1110
+
1111
+ dialog.fullpage iframe {
1112
+ display: block;
1113
+ width: 100%;
1114
+ height: 100%;
1115
+ border: 0;
1116
+ }
1117
+
1118
+ .fullpage-close {
1119
+ position: fixed;
1120
+ top: 0.75rem;
1121
+ right: 0.75rem;
1122
+ background: var(--pd-ink-overlay);
1123
+ color: white;
1124
+ border: 0;
1125
+ border-radius: 0.25rem;
1126
+ padding: 0.25rem 0.5rem;
1127
+ cursor: pointer;
1128
+ opacity: 0;
1129
+ transition: opacity 0.2s;
1130
+ }
1131
+
1132
+ dialog.fullpage.fp-chrome-visible .fullpage-close {
1133
+ opacity: 1;
1134
+ }
1135
+
1136
+ .dock {
1137
+ position: relative;
1138
+ grid-area: dock;
1139
+ display: flex;
1140
+ flex-direction: column;
1141
+ min-width: 0;
1142
+ min-height: 0;
1143
+ margin-top: 0.25rem;
1144
+ overflow: hidden;
1145
+ border-top: 1px solid var(--pd-border-rest);
1146
+ border-inline: 1px solid var(--pd-border-rest);
1147
+ border-radius: var(--pd-region-radius);
1148
+ }
1149
+
1150
+ .dock:hover,
1151
+ .dock:focus-within {
1152
+ border-color: var(--pd-border-active);
1153
+ }
1154
+
1155
+ .dock:has([data-resize=dock-h]:hover) {
1156
+ border-color: var(--pd-border-active);
1157
+ }
1158
+
1159
+ .dock:has([data-resize=dock-h]:active) {
1160
+ border-color: var(--pd-border-active);
1161
+ }
1162
+
1163
+ .dock-header {
1164
+ display: flex;
1165
+ align-items: center;
1166
+ flex-shrink: 0;
1167
+ border-bottom: thin solid var(--pd-border-rest);
1168
+ }
1169
+
1170
+ .dock-tabs {
1171
+ display: contents;
1172
+ }
1173
+ .dock-tabs [role=tab] {
1174
+ cursor: pointer;
1175
+ padding-inline: 0.5rem;
1176
+ padding-block: 0.5rem 0.35rem;
1177
+ font-size: 0.85em;
1178
+ white-space: nowrap;
1179
+ border: 0;
1180
+ background: none;
1181
+ }
1182
+ .dock-tabs [role=tab][aria-selected=true] {
1183
+ font-weight: bold;
1184
+ }
1185
+ .dock-tabs [role=tab] .tab-marker {
1186
+ display: none;
1187
+ align-items: baseline;
1188
+ gap: 0.25em;
1189
+ margin-left: 0.35em;
1190
+ font-size: 0.85em;
1191
+ font-variant-numeric: tabular-nums;
1192
+ line-height: 1;
1193
+ }
1194
+ .dock-tabs [role=tab][data-severity=error] .tab-marker {
1195
+ display: inline-flex;
1196
+ color: var(--pd-accent);
1197
+ }
1198
+ .dock-tabs [role=tab][data-severity=warning] .tab-marker {
1199
+ display: inline-flex;
1200
+ color: var(--pd-warning);
1201
+ }
1202
+
1203
+ .pd-sev-glyph {
1204
+ width: 0.7em;
1205
+ height: 0.7em;
1206
+ flex-shrink: 0;
1207
+ align-self: center;
1208
+ }
1209
+
1210
+ .pd-sev-glyph[data-severity=error] {
1211
+ background: var(--pd-accent);
1212
+ border-radius: 50%;
1213
+ }
1214
+
1215
+ .pd-sev-glyph[data-severity=warning] {
1216
+ background: var(--pd-warning);
1217
+ clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
1218
+ }
1219
+
1220
+ .tab-content {
1221
+ position: relative;
1222
+ display: inline-flex;
1223
+ align-items: baseline;
1224
+ }
1225
+
1226
+ [role=tab][aria-selected=true] .tab-content::after {
1227
+ content: "";
1228
+ position: absolute;
1229
+ left: 0;
1230
+ right: 0;
1231
+ bottom: -8.1px; /* stylelint-disable-line unit-disallowed-list -- DOM-tuned for 0.35rem padding-block-end: centers the 3px pill on the 1px baseline (computed center ≈ 8.094px; label-bottom→baseline gap ~6.6px + half-pill 1.5). Uniform across all three strips. Device-pixel-symmetric (ink ≈2px above / ≈2px below the baseline at DPR 2). Residual: edges antialias softly because .dock starts off the device grid (0.766 device-px, inherited from the preview above) — full hard-edge crispness needs the preview on a whole pixel, a separate layout concern, not forced here. */
1232
+ height: 0.1875rem;
1233
+ border-radius: 0.1875rem;
1234
+ background: var(--pd-ink);
1235
+ }
1236
+
1237
+ .dock-copy-btn {
1238
+ margin-left: auto;
1239
+ cursor: pointer;
1240
+ font-size: 0.85em;
1241
+ padding: 0.2rem 0.5rem;
1242
+ white-space: nowrap;
1243
+ border: thin solid var(--pd-border-rest);
1244
+ background: none;
1245
+ }
1246
+
1247
+ .dock-facets {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ flex-shrink: 0;
1251
+ border-bottom: thin solid var(--pd-border-rest);
1252
+ }
1253
+
1254
+ .source-facets {
1255
+ display: flex;
1256
+ align-items: center;
1257
+ }
1258
+
1259
+ .dock-facet {
1260
+ cursor: pointer;
1261
+ padding-inline: 0.5rem;
1262
+ padding-block: 0.5rem 0.35rem;
1263
+ font-size: 0.8em;
1264
+ opacity: 0.7;
1265
+ white-space: nowrap;
1266
+ border: 0;
1267
+ background: none;
1268
+ }
1269
+ .dock-facet[aria-selected=true] {
1270
+ opacity: 1;
1271
+ font-weight: bold;
1272
+ }
1273
+
1274
+ .dock-panel {
1275
+ flex: 1;
1276
+ display: flex;
1277
+ flex-direction: column;
1278
+ box-sizing: border-box;
1279
+ padding-top: 0.75rem;
1280
+ overflow: hidden;
1281
+ min-height: 0;
1282
+ }
1283
+
1284
+ .source-body {
1285
+ flex: 1;
1286
+ overflow: auto;
1287
+ font-family: monospace;
1288
+ font-size: 0.85em;
1289
+ }
1290
+ .source-body pre {
1291
+ margin: 0;
1292
+ padding: 0.5rem;
1293
+ white-space: pre;
1294
+ }
1295
+
1296
+ .shiki-container {
1297
+ position: relative;
1298
+ }
1299
+
1300
+ .copy-btn {
1301
+ position: absolute;
1302
+ top: 0.25rem;
1303
+ right: 0.25rem;
1304
+ opacity: 0.6;
1305
+ cursor: pointer;
1306
+ font-size: 0.75em;
1307
+ padding: 0.125rem 0.375rem;
1308
+ }
1309
+ .shiki-container:hover .copy-btn {
1310
+ opacity: 1;
1311
+ }
1312
+
1313
+ .console {
1314
+ flex: 1;
1315
+ overflow-y: auto;
1316
+ overflow-x: hidden;
1317
+ padding: 0.25rem;
1318
+ font-family: monospace;
1319
+ font-size: 0.85em;
1320
+ }
1321
+ .console p {
1322
+ margin: 0 0 0.125rem;
1323
+ }
1324
+ .console p[data-level=error] {
1325
+ color: var(--pd-accent);
1326
+ }
1327
+
1328
+ .pd-run-rendered {
1329
+ padding: 0.4rem 0.8rem;
1330
+ font-size: 0.85em;
1331
+ color: #fff;
1332
+ background: var(--pd-ink);
1333
+ border: 0;
1334
+ border-radius: var(--pd-region-radius);
1335
+ cursor: pointer;
1336
+ }
1337
+ .pd-run-rendered:hover {
1338
+ background: color-mix(in oklch, var(--pd-ink), white 12%);
1339
+ }
1340
+ .pd-run-rendered:active {
1341
+ background: color-mix(in oklch, var(--pd-ink), white 20%);
1342
+ }
1343
+
1344
+ .dock-panel.dock-panel-diagnostics {
1345
+ padding: 1rem;
1346
+ }
1347
+
1348
+ .dock[data-mode=overview] [role=tab][data-tab=source],
1349
+ .dock[data-mode=overview] [role=tab][data-tab=html],
1350
+ .dock[data-mode=overview] .dock-copy-btn {
1351
+ display: none;
1352
+ }
1353
+
1354
+ .diagnostics {
1355
+ font-size: 0.85em;
1356
+ }
1357
+ .diagnostics summary {
1358
+ display: flex;
1359
+ align-items: baseline;
1360
+ gap: 0.4em;
1361
+ padding: 0.35rem 0.5rem;
1362
+ cursor: pointer;
1363
+ color: var(--pd-ink);
1364
+ }
1365
+ .diagnostics > details > summary {
1366
+ border-bottom: thin solid var(--pd-border-rest);
1367
+ }
1368
+ .diagnostics .pd-diag-head-seg {
1369
+ display: inline-flex;
1370
+ align-items: baseline;
1371
+ gap: 0.3em;
1372
+ font-variant-numeric: tabular-nums;
1373
+ }
1374
+ .diagnostics .pd-diag-head-seg[data-severity=error] {
1375
+ color: var(--pd-accent);
1376
+ }
1377
+ .diagnostics .pd-diag-head-seg[data-severity=warning] {
1378
+ color: var(--pd-warning);
1379
+ }
1380
+ .diagnostics .pd-diag-head-review {
1381
+ color: var(--pd-ink-muted);
1382
+ }
1383
+ .diagnostics details > ul {
1384
+ margin-block: 0;
1385
+ padding: 0.25rem 0 0.25rem 0.75rem;
1386
+ margin-inline-start: 0.9375rem;
1387
+ list-style: none;
1388
+ border-inline-start: 0.0625rem solid var(--pd-border-rest);
1389
+ }
1390
+ .diagnostics li {
1391
+ max-width: 85ch;
1392
+ line-height: 1.5;
1393
+ padding: 0.15rem 0.5rem 0.15rem 0;
1394
+ color: var(--pd-ink);
1395
+ overflow-wrap: break-word;
1396
+ }
1397
+ .diagnostics .diag-sev {
1398
+ font-weight: 600;
1399
+ }
1400
+ .diagnostics .diag-sep {
1401
+ color: var(--pd-ink-muted);
1402
+ font-weight: 400;
1403
+ }
1404
+ .diagnostics li .pd-sev-glyph {
1405
+ display: inline-block;
1406
+ margin-inline-end: 0.4em;
1407
+ vertical-align: middle;
1408
+ }
1409
+ .diagnostics details:not([data-mixed]) li .pd-sev-glyph {
1410
+ display: none;
1411
+ }
1412
+ .diagnostics li a.diag-docs {
1413
+ display: inline-flex;
1414
+ align-items: center;
1415
+ gap: 0.25em;
1416
+ margin-inline-start: 0.4em;
1417
+ color: var(--pd-link);
1418
+ text-decoration: none;
1419
+ white-space: nowrap;
1420
+ }
1421
+ .diagnostics li a.diag-docs svg {
1422
+ width: 0.875em;
1423
+ height: 0.875em;
1424
+ flex-shrink: 0;
1425
+ }
1426
+ .diagnostics li a.diag-docs span {
1427
+ text-decoration: underline;
1428
+ }
1429
+ .diagnostics li a.diag-docs:hover, .diagnostics li a.diag-docs:focus-visible {
1430
+ color: color-mix(in oklch, var(--pd-link), black 20%);
1431
+ }
1432
+
1433
+ .panel {
1434
+ position: relative;
1435
+ grid-area: panel;
1436
+ display: flex;
1437
+ flex-direction: column;
1438
+ min-height: 0;
1439
+ overflow: hidden;
1440
+ border-left: 1px solid var(--pd-border-rest);
1441
+ border-radius: var(--pd-region-radius);
1442
+ }
1443
+
1444
+ .panel:hover,
1445
+ .panel:focus-within {
1446
+ border-left-color: var(--pd-border-active);
1447
+ }
1448
+
1449
+ .panel:has([data-resize=panel-w]:hover) {
1450
+ border-left-color: var(--pd-border-active);
1451
+ }
1452
+
1453
+ .panel:has([data-resize=panel-w]:active) {
1454
+ border-left-color: var(--pd-border-active);
1455
+ }
1456
+
1457
+ .panel-tabs {
1458
+ display: flex;
1459
+ flex-shrink: 0;
1460
+ border-bottom: thin solid var(--pd-border-rest);
1461
+ }
1462
+ .panel-tabs button {
1463
+ flex: 0 1 auto;
1464
+ cursor: pointer;
1465
+ padding-inline: 0.5rem;
1466
+ padding-block: 0.5rem 0.35rem;
1467
+ font-size: 0.85em;
1468
+ border: 0;
1469
+ background: none;
1470
+ }
1471
+ .panel-tabs button[aria-selected=true] {
1472
+ font-weight: bold;
1473
+ }
1474
+
1475
+ .panel-content {
1476
+ flex: 1;
1477
+ overflow: auto;
1478
+ margin-top: 0.5rem;
1479
+ padding: 0.25rem 0.5rem;
1480
+ }
1481
+ .panel-content pre {
1482
+ margin: 0;
1483
+ white-space: pre-wrap;
1484
+ word-break: break-all;
1485
+ font-size: 0.85em;
1486
+ }
1487
+
1488
+ .rel-panel {
1489
+ display: flex;
1490
+ flex-direction: column;
1491
+ }
1492
+
1493
+ .rel-panel > .rel-group-heading,
1494
+ .rel-panel > .rel-style-umbrella,
1495
+ .rel-panel > .rel-chips {
1496
+ margin-top: 0.75rem;
1497
+ padding-top: 0.75rem;
1498
+ border-top: thin solid var(--pd-border-rest);
1499
+ }
1500
+
1501
+ .rel-panel > :first-child {
1502
+ margin-top: 0;
1503
+ padding-top: 0;
1504
+ border-top: 0;
1505
+ }
1506
+
1507
+ .rel-group-heading {
1508
+ margin: 0 0 0.3rem;
1509
+ font-size: 1rem;
1510
+ font-weight: 600;
1511
+ color: var(--pd-ink);
1512
+ }
1513
+
1514
+ .rel-style-umbrella h4.rel-group-heading {
1515
+ margin-top: 0.5rem;
1516
+ font-size: 0.875rem;
1517
+ font-weight: 500;
1518
+ color: var(--pd-ink-muted);
1519
+ }
1520
+
1521
+ .rel-category-heading {
1522
+ display: block;
1523
+ font-size: 0.8125rem;
1524
+ font-weight: 400;
1525
+ color: var(--pd-ink-muted);
1526
+ }
1527
+
1528
+ .rel-list {
1529
+ margin: 0;
1530
+ padding: 0;
1531
+ list-style: none;
1532
+ }
1533
+
1534
+ .rel-category + .rel-category {
1535
+ margin-top: 0.3rem;
1536
+ }
1537
+
1538
+ .rel-category-list {
1539
+ margin-inline-start: 0.9375rem;
1540
+ list-style: none;
1541
+ border-inline-start: 0.0625rem solid var(--pd-border-rest);
1542
+ padding-inline-start: 0.6rem;
1543
+ }
1544
+
1545
+ .rel-item {
1546
+ padding-block: 0.1rem;
1547
+ line-height: 1.4;
1548
+ }
1549
+
1550
+ .rel-link {
1551
+ font-size: 0.875rem;
1552
+ color: var(--pd-link);
1553
+ text-decoration: underline;
1554
+ text-underline-offset: 0.15em;
1555
+ }
1556
+ .rel-link:visited {
1557
+ color: var(--pd-link);
1558
+ }
1559
+ .rel-link:hover, .rel-link:focus-visible {
1560
+ color: color-mix(in oklch, var(--pd-link), black 20%);
1561
+ text-decoration-thickness: 0.1em;
1562
+ }
1563
+
1564
+ .rel-list > .rel-item {
1565
+ font-family: ui-monospace, Menlo, Consolas, monospace;
1566
+ font-size: 0.8125rem;
1567
+ color: var(--pd-ink-muted);
1568
+ }
1569
+
1570
+ .rel-empty {
1571
+ margin: 0.1rem 0 0;
1572
+ font-size: 0.875rem;
1573
+ color: var(--pd-ink-muted);
1574
+ font-style: italic;
1575
+ }
1576
+
1577
+ .rel-chips {
1578
+ display: flex;
1579
+ flex-wrap: wrap;
1580
+ gap: 0.35rem;
1581
+ }
1582
+
1583
+ .rel-chip {
1584
+ display: inline-flex;
1585
+ align-items: center;
1586
+ padding: 0.1rem 0.4rem;
1587
+ font-size: 0.8em;
1588
+ color: var(--pd-ink-muted);
1589
+ border: thin solid var(--pd-border-rest);
1590
+ border-radius: var(--pd-region-radius);
1591
+ }
1592
+
1593
+ .rel-private-badge {
1594
+ margin-inline-start: 0.4em;
1595
+ padding: 0 0.3em;
1596
+ font-size: 0.8em;
1597
+ color: var(--pd-ink-muted);
1598
+ border: thin solid var(--pd-border-rest);
1599
+ border-radius: var(--pd-region-radius);
1600
+ }
1601
+
1602
+ .audit-panel {
1603
+ display: flex;
1604
+ flex-direction: column;
1605
+ gap: 0.75rem;
1606
+ }
1607
+
1608
+ .audit-loading,
1609
+ .audit-error,
1610
+ .audit-empty {
1611
+ margin: 0;
1612
+ color: var(--pd-ink-muted);
1613
+ }
1614
+
1615
+ .audit-head {
1616
+ display: flex;
1617
+ flex-direction: column;
1618
+ gap: 0.2rem;
1619
+ }
1620
+
1621
+ .audit-headline {
1622
+ margin: 0;
1623
+ font-size: 0.95rem;
1624
+ font-weight: 600;
1625
+ color: var(--pd-ink);
1626
+ }
1627
+
1628
+ .audit-sha {
1629
+ margin: 0;
1630
+ font-family: ui-monospace, Menlo, Consolas, monospace;
1631
+ font-size: 0.75rem;
1632
+ color: var(--pd-ink-muted);
1633
+ }
1634
+
1635
+ .audit-totals {
1636
+ display: grid;
1637
+ grid-template-columns: max-content 1fr;
1638
+ gap: 0.15rem 0.6rem;
1639
+ margin: 0;
1640
+ }
1641
+
1642
+ .audit-stat-label {
1643
+ font-size: 0.8rem;
1644
+ color: var(--pd-ink-muted);
1645
+ }
1646
+
1647
+ .audit-stat-value {
1648
+ margin: 0;
1649
+ font-size: 0.8rem;
1650
+ color: var(--pd-ink);
1651
+ }
1652
+
1653
+ .audit-h {
1654
+ margin: 0.5rem 0 0.25rem;
1655
+ padding-top: 0.5rem;
1656
+ border-top: thin solid var(--pd-border-rest);
1657
+ font-size: 0.9rem;
1658
+ font-weight: 600;
1659
+ color: var(--pd-ink);
1660
+ }
1661
+
1662
+ .audit-rules,
1663
+ .audit-components,
1664
+ .audit-findings {
1665
+ margin: 0;
1666
+ padding: 0;
1667
+ list-style: none;
1668
+ }
1669
+
1670
+ .audit-rule {
1671
+ display: flex;
1672
+ flex-wrap: wrap;
1673
+ align-items: baseline;
1674
+ gap: 0.4rem;
1675
+ padding: 0.15rem 0;
1676
+ }
1677
+
1678
+ .audit-rule-id,
1679
+ .audit-finding-rule,
1680
+ .audit-finding-path {
1681
+ font-family: ui-monospace, Menlo, Consolas, monospace;
1682
+ font-size: 0.78rem;
1683
+ color: var(--pd-ink);
1684
+ }
1685
+
1686
+ .audit-rule-count {
1687
+ font-size: 0.78rem;
1688
+ color: var(--pd-ink-muted);
1689
+ }
1690
+
1691
+ .audit-component {
1692
+ padding: 0.3rem 0;
1693
+ border-top: thin solid var(--pd-border-rest);
1694
+ }
1695
+
1696
+ .audit-component:first-child {
1697
+ border-top: 0;
1698
+ }
1699
+
1700
+ .audit-component-head {
1701
+ display: flex;
1702
+ align-items: baseline;
1703
+ gap: 0.4rem;
1704
+ }
1705
+
1706
+ .audit-link {
1707
+ font-family: ui-monospace, Menlo, Consolas, monospace;
1708
+ font-size: 0.8rem;
1709
+ color: var(--pd-link);
1710
+ text-decoration: none;
1711
+ }
1712
+ .audit-link:hover, .audit-link:focus-visible {
1713
+ text-decoration: underline;
1714
+ }
1715
+
1716
+ .audit-render {
1717
+ font-size: 0.72rem;
1718
+ color: var(--pd-ink-muted);
1719
+ text-transform: uppercase;
1720
+ letter-spacing: 0.03em;
1721
+ }
1722
+ .audit-render[data-render=error] {
1723
+ color: var(--pd-accent);
1724
+ }
1725
+
1726
+ .audit-findings {
1727
+ margin-top: 0.2rem;
1728
+ padding-left: 0.6rem;
1729
+ }
1730
+
1731
+ .audit-finding {
1732
+ display: flex;
1733
+ flex-wrap: wrap;
1734
+ align-items: baseline;
1735
+ gap: 0.35rem;
1736
+ padding: 0.1rem 0;
1737
+ }
1738
+
1739
+ .audit-finding-msg {
1740
+ font-size: 0.8rem;
1741
+ color: var(--pd-ink);
1742
+ }
1743
+
1744
+ .audit-finding-path {
1745
+ color: var(--pd-ink-muted);
1746
+ }
1747
+
1748
+ .audit-tag {
1749
+ flex: none;
1750
+ padding: 0 0.3rem;
1751
+ border: thin solid var(--pd-border-rest);
1752
+ border-radius: 0.2rem;
1753
+ font-size: 0.68rem;
1754
+ font-weight: 600;
1755
+ letter-spacing: 0.02em;
1756
+ color: var(--pd-ink-muted);
1757
+ }
1758
+ .audit-tag[data-tag=PD-GAP] {
1759
+ border-color: var(--pd-accent);
1760
+ color: var(--pd-accent);
1761
+ }
1762
+
1763
+ .audit-scope {
1764
+ margin-top: 0.5rem;
1765
+ padding-top: 0.5rem;
1766
+ border-top: thin solid var(--pd-border-rest);
1767
+ }
1768
+
1769
+ .audit-scope-summary {
1770
+ font-size: 0.8rem;
1771
+ font-weight: 600;
1772
+ color: var(--pd-ink-muted);
1773
+ cursor: pointer;
1774
+ }
1775
+
1776
+ .audit-scope-body {
1777
+ margin: 0.4rem 0 0;
1778
+ overflow-x: auto;
1779
+ font-family: ui-monospace, Menlo, Consolas, monospace;
1780
+ font-size: 0.72rem;
1781
+ line-height: 1.5;
1782
+ white-space: pre-wrap;
1783
+ color: var(--pd-ink-muted);
1784
+ }
1785
+
1786
+ [data-resize] {
1787
+ position: absolute;
1788
+ z-index: 5;
1789
+ }
1790
+
1791
+ [data-resize=sidebar-w] {
1792
+ inset-block: 0;
1793
+ inset-inline-end: 0;
1794
+ width: 0.5rem;
1795
+ cursor: col-resize;
1796
+ }
1797
+
1798
+ [data-resize=panel-w] {
1799
+ inset-block: 0;
1800
+ inset-inline-start: 0;
1801
+ width: 0.5rem;
1802
+ cursor: col-resize;
1803
+ }
1804
+
1805
+ [data-resize=dock-h] {
1806
+ inset-inline: 0;
1807
+ inset-block-start: 0;
1808
+ height: 0.5rem;
1809
+ cursor: row-resize;
1810
+ }
1811
+
1812
+ [data-resize=sidebar-w]:hover,
1813
+ [data-resize=sidebar-w]:active {
1814
+ background: linear-gradient(to left, var(--pd-border-active) var(--pd-drag-thickness), transparent var(--pd-drag-thickness));
1815
+ }
1816
+
1817
+ [data-resize=panel-w]:hover,
1818
+ [data-resize=panel-w]:active {
1819
+ background: linear-gradient(to right, var(--pd-border-active) var(--pd-drag-thickness), transparent var(--pd-drag-thickness));
1820
+ }
1821
+
1822
+ [data-resize=dock-h]:hover,
1823
+ [data-resize=dock-h]:active {
1824
+ background: linear-gradient(to bottom, var(--pd-border-active) var(--pd-drag-thickness), transparent var(--pd-drag-thickness));
1825
+ }