@polyxd/web 0.3.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 (103) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +190 -0
  3. package/README.md +79 -0
  4. package/adapters/PolyxdSurface.svelte +65 -0
  5. package/adapters/PolyxdSurface.vue +61 -0
  6. package/dist/components/action-bar.d.ts +14 -0
  7. package/dist/components/action-bar.js +69 -0
  8. package/dist/components/action-bar.js.map +1 -0
  9. package/dist/components/avatar.d.ts +9 -0
  10. package/dist/components/avatar.js +16 -0
  11. package/dist/components/avatar.js.map +1 -0
  12. package/dist/components/chart.d.ts +5 -0
  13. package/dist/components/chart.js +132 -0
  14. package/dist/components/chart.js.map +1 -0
  15. package/dist/components/content.d.ts +20 -0
  16. package/dist/components/content.js +286 -0
  17. package/dist/components/content.js.map +1 -0
  18. package/dist/components/filter.d.ts +9 -0
  19. package/dist/components/filter.js +43 -0
  20. package/dist/components/filter.js.map +1 -0
  21. package/dist/components/flow.d.ts +12 -0
  22. package/dist/components/flow.js +188 -0
  23. package/dist/components/flow.js.map +1 -0
  24. package/dist/components/index.d.ts +10 -0
  25. package/dist/components/index.js +30 -0
  26. package/dist/components/index.js.map +1 -0
  27. package/dist/components/inputs.d.ts +28 -0
  28. package/dist/components/inputs.js +530 -0
  29. package/dist/components/inputs.js.map +1 -0
  30. package/dist/components/marks.d.ts +32 -0
  31. package/dist/components/marks.js +164 -0
  32. package/dist/components/marks.js.map +1 -0
  33. package/dist/components/navigation.d.ts +11 -0
  34. package/dist/components/navigation.js +99 -0
  35. package/dist/components/navigation.js.map +1 -0
  36. package/dist/components/overlays.d.ts +16 -0
  37. package/dist/components/overlays.js +146 -0
  38. package/dist/components/overlays.js.map +1 -0
  39. package/dist/components/pickers.d.ts +6 -0
  40. package/dist/components/pickers.js +272 -0
  41. package/dist/components/pickers.js.map +1 -0
  42. package/dist/components/shell.d.ts +30 -0
  43. package/dist/components/shell.js +167 -0
  44. package/dist/components/shell.js.map +1 -0
  45. package/dist/components/split.d.ts +8 -0
  46. package/dist/components/split.js +76 -0
  47. package/dist/components/split.js.map +1 -0
  48. package/dist/components/structure.d.ts +12 -0
  49. package/dist/components/structure.js +69 -0
  50. package/dist/components/structure.js.map +1 -0
  51. package/dist/components/table.d.ts +11 -0
  52. package/dist/components/table.js +142 -0
  53. package/dist/components/table.js.map +1 -0
  54. package/dist/components/tree.d.ts +10 -0
  55. package/dist/components/tree.js +177 -0
  56. package/dist/components/tree.js.map +1 -0
  57. package/dist/dom.d.ts +25 -0
  58. package/dist/dom.js +211 -0
  59. package/dist/dom.js.map +1 -0
  60. package/dist/elements.d.ts +87 -0
  61. package/dist/elements.js +244 -0
  62. package/dist/elements.js.map +1 -0
  63. package/dist/index.d.ts +6 -0
  64. package/dist/index.js +7 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/primitives.d.ts +111 -0
  67. package/dist/primitives.js +361 -0
  68. package/dist/primitives.js.map +1 -0
  69. package/dist/renderer.d.ts +145 -0
  70. package/dist/renderer.js +244 -0
  71. package/dist/renderer.js.map +1 -0
  72. package/dist/skeleton.d.ts +14 -0
  73. package/dist/skeleton.js +13 -0
  74. package/dist/skeleton.js.map +1 -0
  75. package/package.json +52 -0
  76. package/preview/polyxd-web.css +2 -0
  77. package/preview/polyxd-web.js +15 -0
  78. package/styles.css +5012 -0
  79. package/themes/antd.css +300 -0
  80. package/themes/bootstrap.css +300 -0
  81. package/themes/brutalist.css +300 -0
  82. package/themes/carbon.css +310 -0
  83. package/themes/chakra.css +300 -0
  84. package/themes/civic.css +300 -0
  85. package/themes/editorial.css +300 -0
  86. package/themes/finance.css +300 -0
  87. package/themes/fluent.css +300 -0
  88. package/themes/glass.css +300 -0
  89. package/themes/govuk.css +150 -0
  90. package/themes/health.css +300 -0
  91. package/themes/mantine.css +300 -0
  92. package/themes/material3.css +300 -0
  93. package/themes/mono.css +300 -0
  94. package/themes/neon.css +300 -0
  95. package/themes/pastel.css +300 -0
  96. package/themes/polaris.css +300 -0
  97. package/themes/primer.css +300 -0
  98. package/themes/radix.css +300 -0
  99. package/themes/shadcn.css +300 -0
  100. package/themes/sketch.css +356 -0
  101. package/themes/spectrum.css +300 -0
  102. package/themes/terminal.css +300 -0
  103. package/themes/wireframe.css +328 -0
package/styles.css ADDED
@@ -0,0 +1,5012 @@
1
+ /*
2
+ * @polyxd/react base styles. Every value comes from a semantic token (--pxd-*), so the loaded
3
+ * design-system theme decides the look. Layout adapts to the surface's own width (container
4
+ * queries), not the viewport, so a surface behaves the same in a phone frame or a sidebar.
5
+ */
6
+
7
+ .pxd-surface {
8
+ container: pxd / inline-size;
9
+ position: relative;
10
+ box-sizing: border-box;
11
+ background: var(--pxd-color-surface-default);
12
+ color: var(--pxd-color-text-default);
13
+ font-family: var(--pxd-type-body-default-family);
14
+ font-size: var(--pxd-type-body-default-size);
15
+ font-weight: var(--pxd-type-body-default-weight);
16
+ line-height: var(--pxd-type-body-default-line-height);
17
+ letter-spacing: var(--pxd-type-body-default-letter-spacing);
18
+ padding: var(--pxd-space-inset-comfortable);
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: var(--pxd-space-stack-loose);
22
+ -webkit-font-smoothing: antialiased;
23
+ }
24
+ .pxd-surface *,
25
+ .pxd-surface *::before,
26
+ .pxd-surface *::after {
27
+ box-sizing: border-box;
28
+ }
29
+ .pxd-surface :where(h1, h2, h3, h4, h5, h6, p, dl, dd, ul, ol, figure, fieldset) {
30
+ margin: 0;
31
+ padding: 0;
32
+ }
33
+ .pxd-surface :where(ul, ol) {
34
+ list-style: none;
35
+ }
36
+ .pxd-surface :where(fieldset) {
37
+ border: 0;
38
+ min-width: 0;
39
+ }
40
+ .pxd-surface :where(button, input, textarea, select) {
41
+ font: inherit;
42
+ color: inherit;
43
+ }
44
+ .pxd-surface :focus-visible {
45
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
46
+ outline-offset: var(--pxd-focus-ring-offset);
47
+ }
48
+ .pxd-sr-only {
49
+ position: absolute;
50
+ width: 1px;
51
+ height: 1px;
52
+ overflow: hidden;
53
+ clip: rect(0 0 0 0);
54
+ white-space: nowrap;
55
+ }
56
+
57
+ /* Typography roles */
58
+ .pxd-surface-title {
59
+ font-family: var(--pxd-type-title-page-family);
60
+ font-size: var(--pxd-type-title-page-size);
61
+ font-weight: var(--pxd-type-title-page-weight);
62
+ line-height: var(--pxd-type-title-page-line-height);
63
+ letter-spacing: var(--pxd-type-title-page-letter-spacing);
64
+ }
65
+ .pxd-section-title,
66
+ .pxd-steps-title {
67
+ font-family: var(--pxd-type-title-section-family);
68
+ font-size: var(--pxd-type-title-section-size);
69
+ font-weight: var(--pxd-type-title-section-weight);
70
+ line-height: var(--pxd-type-title-section-line-height);
71
+ letter-spacing: var(--pxd-type-title-section-letter-spacing);
72
+ }
73
+ .pxd-card-title,
74
+ .pxd-dialog-title,
75
+ .pxd-comparison-title,
76
+ .pxd-detail-title,
77
+ .pxd-chart-title,
78
+ .pxd-status-title {
79
+ font-family: var(--pxd-type-title-item-family);
80
+ font-size: var(--pxd-type-title-item-size);
81
+ font-weight: var(--pxd-type-title-item-weight);
82
+ line-height: var(--pxd-type-title-item-line-height);
83
+ letter-spacing: var(--pxd-type-title-item-letter-spacing);
84
+ }
85
+ .pxd-text-body,
86
+ .pxd-dialog-description p,
87
+ .pxd-status-message,
88
+ .pxd-chart-summary,
89
+ .pxd-comparison-summary {
90
+ max-width: calc(var(--pxd-measure-max) * 1ch);
91
+ }
92
+ .pxd-text-supporting,
93
+ .pxd-section-description,
94
+ .pxd-card-subtitle,
95
+ .pxd-field-help,
96
+ .pxd-metric-caption,
97
+ .pxd-option-description,
98
+ .pxd-steps-progress {
99
+ font-family: var(--pxd-type-body-small-family);
100
+ font-size: var(--pxd-type-body-small-size);
101
+ line-height: var(--pxd-type-body-small-line-height);
102
+ color: var(--pxd-color-text-muted);
103
+ }
104
+ .pxd-text-caption,
105
+ .pxd-collection-label,
106
+ .pxd-metric-label,
107
+ .pxd-table th[scope="col"],
108
+ .pxd-badge,
109
+ .pxd-range-bounds {
110
+ font-family: var(--pxd-type-label-small-family);
111
+ font-size: var(--pxd-type-label-small-size);
112
+ font-weight: var(--pxd-type-label-small-weight);
113
+ line-height: var(--pxd-type-label-small-line-height);
114
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
115
+ color: var(--pxd-color-text-muted);
116
+ }
117
+ .pxd-field-label,
118
+ .pxd-button,
119
+ .pxd-segment,
120
+ .pxd-views-tab,
121
+ .pxd-disclosure-trigger,
122
+ .pxd-toggle-label {
123
+ font-family: var(--pxd-type-label-default-family);
124
+ font-size: var(--pxd-type-label-default-size);
125
+ font-weight: var(--pxd-type-label-default-weight);
126
+ line-height: var(--pxd-type-label-default-line-height);
127
+ letter-spacing: var(--pxd-type-label-default-letter-spacing);
128
+ }
129
+
130
+ /* Structure */
131
+ .pxd-stack {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: var(--polyxd-stack);
135
+ }
136
+ /* Separate questions need more air between them than the parts of one question. */
137
+ .pxd-form-fields,
138
+ .pxd-section > .pxd-stack,
139
+ .pxd-group.pxd-stack {
140
+ gap: var(--polyxd-stack-apart);
141
+ }
142
+ .pxd-stack-tight {
143
+ gap: var(--pxd-space-stack-tight);
144
+ }
145
+ .pxd-section {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: var(--polyxd-stack);
149
+ }
150
+ .pxd-section + .pxd-section,
151
+ .pxd-group > .pxd-section + .pxd-section {
152
+ margin-top: calc(var(--pxd-space-stack-section) - var(--pxd-space-stack-loose));
153
+ }
154
+ .pxd-section-header {
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: var(--pxd-space-stack-tight);
158
+ }
159
+ .pxd-group {
160
+ display: flex;
161
+ flex-direction: column;
162
+ gap: var(--pxd-space-stack-loose);
163
+ }
164
+ .pxd-group-inline {
165
+ flex-direction: row;
166
+ flex-wrap: wrap;
167
+ gap: var(--pxd-space-inline-loose);
168
+ }
169
+ .pxd-group-inline > * {
170
+ flex: 1 1 12rem;
171
+ }
172
+ .pxd-group-grid {
173
+ display: grid;
174
+ grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
175
+ gap: var(--pxd-space-inline-loose);
176
+ }
177
+ .pxd-card {
178
+ position: relative;
179
+ display: flex;
180
+ flex-direction: column;
181
+ background: var(--pxd-color-surface-raised);
182
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
183
+ border-radius: var(--pxd-radius-default);
184
+ box-shadow: var(--pxd-shadow-raised);
185
+ overflow: hidden;
186
+ }
187
+ .pxd-card-body {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: var(--pxd-space-stack-tight);
191
+ padding: var(--pxd-space-inset-default);
192
+ }
193
+ .pxd-card-header {
194
+ display: flex;
195
+ align-items: baseline;
196
+ justify-content: space-between;
197
+ gap: var(--pxd-space-inline-default);
198
+ }
199
+ .pxd-card-link {
200
+ all: unset;
201
+ cursor: pointer;
202
+ }
203
+ .pxd-card-link::after {
204
+ content: "";
205
+ position: absolute;
206
+ inset: 0;
207
+ border-radius: inherit;
208
+ }
209
+ .pxd-card-actionable:hover {
210
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), var(--pxd-color-surface-raised));
211
+ }
212
+ .pxd-card-actionable:has(.pxd-card-link:focus-visible) {
213
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
214
+ outline-offset: var(--pxd-focus-ring-offset);
215
+ }
216
+ .pxd-card-link:focus-visible {
217
+ outline: none;
218
+ }
219
+ /* Controls inside an actionable card stay their own targets, above the card's stretched link. */
220
+ .pxd-card-actionable .pxd-card-children :is(button, input, select, textarea, a, [role="switch"], [role="checkbox"]) {
221
+ position: relative;
222
+ z-index: 1;
223
+ }
224
+ .pxd-card-media .pxd-media {
225
+ width: 100%;
226
+ border-radius: 0;
227
+ }
228
+ .pxd-badge {
229
+ flex: none;
230
+ padding: 2px var(--pxd-space-inline-default);
231
+ border-radius: var(--pxd-radius-full);
232
+ background: var(--pxd-color-surface-subtle);
233
+ color: var(--pxd-color-text-default);
234
+ }
235
+ .pxd-tone-info { background: var(--pxd-color-status-info-background); color: var(--pxd-color-status-info-foreground); }
236
+ .pxd-tone-success { background: var(--pxd-color-status-success-background); color: var(--pxd-color-status-success-foreground); }
237
+ .pxd-tone-warning { background: var(--pxd-color-status-warning-background); color: var(--pxd-color-status-warning-foreground); }
238
+ .pxd-tone-danger { background: var(--pxd-color-status-danger-background); color: var(--pxd-color-status-danger-foreground); }
239
+
240
+ .pxd-disclosure-trigger {
241
+ display: inline-flex;
242
+ align-items: center;
243
+ gap: var(--pxd-space-inline-tight);
244
+ min-height: var(--polyxd-control);
245
+ padding: 0;
246
+ border: 0;
247
+ background: none;
248
+ color: var(--pxd-color-text-link);
249
+ cursor: pointer;
250
+ }
251
+ .pxd-disclosure-content {
252
+ padding: var(--pxd-space-inset-compact) 0 0 var(--pxd-space-inset-default);
253
+ border-left: var(--pxd-border-width-strong) solid var(--pxd-color-border-default);
254
+ }
255
+
256
+ .pxd-views-list {
257
+ display: flex;
258
+ gap: var(--pxd-space-inline-tight);
259
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
260
+ overflow-x: auto;
261
+ }
262
+ .pxd-views-tab {
263
+ min-height: var(--polyxd-control);
264
+ padding: 0 var(--pxd-space-inset-default);
265
+ border: 0;
266
+ border-bottom: var(--pxd-border-width-strong) solid transparent;
267
+ background: none;
268
+ color: var(--pxd-color-text-muted);
269
+ cursor: pointer;
270
+ white-space: nowrap;
271
+ }
272
+ .pxd-views-tab[data-state="active"] {
273
+ color: var(--pxd-color-text-default);
274
+ border-bottom-color: var(--pxd-color-action-primary-background);
275
+ }
276
+ .pxd-views-panel {
277
+ padding-top: var(--pxd-space-stack-default);
278
+ }
279
+
280
+ /* Content */
281
+ .pxd-metric {
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: var(--pxd-space-stack-tight);
285
+ padding: var(--pxd-space-inset-default);
286
+ background: var(--pxd-color-surface-subtle);
287
+ border-radius: var(--pxd-radius-default);
288
+ }
289
+ .pxd-metric-value {
290
+ font-family: var(--pxd-type-numeric-display-family);
291
+ font-size: var(--pxd-type-numeric-display-size);
292
+ font-weight: var(--pxd-type-numeric-display-weight);
293
+ line-height: var(--pxd-type-numeric-display-line-height);
294
+ letter-spacing: var(--pxd-type-numeric-display-letter-spacing);
295
+ font-variant-numeric: tabular-nums;
296
+ }
297
+ /* Change pills use status pairs, which the token contract guarantees at 4.5:1 for text. */
298
+ .pxd-metric-change {
299
+ align-self: flex-start;
300
+ padding: 0 var(--pxd-space-inline-default);
301
+ border-radius: var(--pxd-radius-full);
302
+ font-weight: 600;
303
+ }
304
+ .pxd-metric-change.pxd-data-positive { background: var(--pxd-color-status-success-background); color: var(--pxd-color-status-success-foreground); }
305
+ .pxd-metric-change.pxd-data-negative { background: var(--pxd-color-status-danger-background); color: var(--pxd-color-status-danger-foreground); }
306
+ .pxd-metric-change.pxd-data-neutral { background: var(--pxd-color-surface-default); color: var(--pxd-color-text-muted); }
307
+
308
+ .pxd-detail-list {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: var(--pxd-space-stack-tight);
312
+ }
313
+ .pxd-detail-row {
314
+ display: grid;
315
+ grid-template-columns: minmax(8rem, 1fr) 2fr;
316
+ gap: var(--pxd-space-inline-default);
317
+ padding: var(--pxd-space-stack-default) 0;
318
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
319
+ }
320
+ .pxd-detail-row dt {
321
+ color: var(--pxd-color-text-muted);
322
+ }
323
+ .pxd-detail-row dd {
324
+ font-variant-numeric: tabular-nums;
325
+ }
326
+ @container pxd (width < 30rem) {
327
+ .pxd-detail-row {
328
+ grid-template-columns: 1fr;
329
+ gap: 2px;
330
+ }
331
+ }
332
+
333
+ .pxd-collection {
334
+ display: flex;
335
+ flex-direction: column;
336
+ gap: var(--pxd-space-stack-tight);
337
+ }
338
+ .pxd-collection-list {
339
+ display: flex;
340
+ flex-direction: column;
341
+ gap: var(--pxd-space-stack-default);
342
+ }
343
+ .pxd-collection-item {
344
+ display: flex;
345
+ align-items: flex-start;
346
+ gap: var(--pxd-space-inline-default);
347
+ }
348
+ .pxd-collection-content {
349
+ flex: 1;
350
+ min-width: 0;
351
+ }
352
+ .pxd-collection-select {
353
+ width: 20px;
354
+ height: 20px;
355
+ margin-top: var(--pxd-space-inset-default);
356
+ accent-color: var(--pxd-color-action-primary-background);
357
+ }
358
+
359
+ .pxd-table-wrap {
360
+ overflow-x: auto;
361
+ }
362
+ .pxd-table {
363
+ width: 100%;
364
+ border-collapse: collapse;
365
+ font-variant-numeric: tabular-nums;
366
+ }
367
+ .pxd-table caption {
368
+ text-align: left;
369
+ padding-bottom: var(--pxd-space-stack-default);
370
+ color: var(--pxd-color-text-muted);
371
+ }
372
+ .pxd-table th,
373
+ .pxd-table td {
374
+ text-align: left;
375
+ padding: var(--pxd-space-stack-default) var(--pxd-space-inline-default);
376
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
377
+ }
378
+ .pxd-table th[scope="row"] {
379
+ font-weight: 600;
380
+ }
381
+ .pxd-table thead th {
382
+ background: var(--pxd-color-surface-subtle);
383
+ }
384
+ .pxd-table .pxd-num {
385
+ text-align: right;
386
+ }
387
+ .pxd-table-action {
388
+ text-align: right;
389
+ }
390
+ /* Compact: each row becomes a stacked card of label/value pairs. */
391
+ @container pxd (width < 36rem) {
392
+ .pxd-table-wrap .pxd-table thead {
393
+ position: absolute;
394
+ width: 1px;
395
+ height: 1px;
396
+ overflow: hidden;
397
+ clip: rect(0 0 0 0);
398
+ }
399
+ .pxd-table-wrap .pxd-table tbody tr {
400
+ display: block;
401
+ padding: var(--pxd-space-inset-compact) 0;
402
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
403
+ }
404
+ .pxd-table-wrap .pxd-table tbody :is(td, th) {
405
+ display: flex;
406
+ justify-content: space-between;
407
+ gap: var(--pxd-space-inline-default);
408
+ border: 0;
409
+ padding: 4px 0;
410
+ text-align: right;
411
+ }
412
+ .pxd-table-wrap .pxd-table tbody :is(td, th)[data-label]::before {
413
+ content: attr(data-label);
414
+ color: var(--pxd-color-text-muted);
415
+ font-weight: 400;
416
+ text-align: left;
417
+ }
418
+ .pxd-table-wrap .pxd-table tbody .pxd-table-action {
419
+ justify-content: flex-end;
420
+ }
421
+ }
422
+
423
+ .pxd-chart {
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: var(--pxd-space-stack-tight);
427
+ }
428
+ .pxd-chart figcaption {
429
+ display: flex;
430
+ flex-direction: column;
431
+ gap: 2px;
432
+ }
433
+ .pxd-chart-svg {
434
+ width: 100%;
435
+ height: auto;
436
+ max-height: 16rem;
437
+ }
438
+ .pxd-chart-bar {
439
+ height: 2.5rem;
440
+ }
441
+ .pxd-chart-axis text {
442
+ fill: var(--pxd-color-text-muted);
443
+ font-size: 12px;
444
+ font-family: var(--pxd-type-label-small-family);
445
+ }
446
+ .pxd-chart-grid {
447
+ stroke: var(--pxd-color-border-default);
448
+ }
449
+ .pxd-chart-legend {
450
+ display: flex;
451
+ flex-wrap: wrap;
452
+ gap: var(--pxd-space-inline-loose);
453
+ font-size: var(--pxd-type-body-small-size);
454
+ }
455
+ .pxd-chart-legend li {
456
+ display: inline-flex;
457
+ align-items: center;
458
+ gap: var(--pxd-space-inline-tight);
459
+ }
460
+ .pxd-chart-swatch {
461
+ width: 12px;
462
+ height: 12px;
463
+ border-radius: 2px;
464
+ }
465
+ .pxd-chart-data summary,
466
+ .pxd-chart-data {
467
+ font-size: var(--pxd-type-body-small-size);
468
+ color: var(--pxd-color-text-link);
469
+ cursor: pointer;
470
+ }
471
+ .pxd-chart-data[open] .pxd-table {
472
+ color: var(--pxd-color-text-default);
473
+ margin-top: var(--pxd-space-stack-tight);
474
+ }
475
+
476
+ .pxd-media {
477
+ display: block;
478
+ width: 100%;
479
+ object-fit: cover;
480
+ border-radius: var(--pxd-radius-default);
481
+ background: var(--pxd-color-surface-subtle);
482
+ }
483
+ .pxd-media-square { aspect-ratio: 1; }
484
+ .pxd-media-landscape { aspect-ratio: 16 / 9; }
485
+ .pxd-media-portrait { aspect-ratio: 3 / 4; }
486
+ .pxd-media-placeholder.pxd-media-auto { aspect-ratio: 16 / 9; }
487
+ .pxd-card:has(.pxd-media-square) {
488
+ flex-direction: row;
489
+ }
490
+ .pxd-card:has(.pxd-media-square) .pxd-card-media {
491
+ flex: 0 0 5rem;
492
+ }
493
+
494
+ .pxd-status {
495
+ display: flex;
496
+ gap: var(--pxd-space-inline-default);
497
+ padding: var(--pxd-space-inset-default);
498
+ border-radius: var(--pxd-radius-default);
499
+ background: var(--pxd-color-surface-subtle);
500
+ }
501
+ .pxd-status-icon {
502
+ flex: none;
503
+ display: grid;
504
+ place-items: center;
505
+ width: var(--pxd-size-icon-default);
506
+ height: var(--pxd-size-icon-default);
507
+ border-radius: var(--pxd-radius-full);
508
+ font-weight: 700;
509
+ font-size: 14px;
510
+ color: var(--pxd-color-surface-default);
511
+ background: var(--pxd-color-text-muted);
512
+ }
513
+ .pxd-status-body {
514
+ display: flex;
515
+ flex-direction: column;
516
+ gap: var(--pxd-space-stack-tight);
517
+ }
518
+ .pxd-status-action {
519
+ margin-top: var(--pxd-space-stack-tight);
520
+ }
521
+ .pxd-status-info { background: var(--pxd-color-status-info-background); color: var(--pxd-color-status-info-foreground); }
522
+ .pxd-status-success { background: var(--pxd-color-status-success-background); color: var(--pxd-color-status-success-foreground); }
523
+ .pxd-status-warning { background: var(--pxd-color-status-warning-background); color: var(--pxd-color-status-warning-foreground); }
524
+ .pxd-status-error { background: var(--pxd-color-status-danger-background); color: var(--pxd-color-status-danger-foreground); }
525
+ .pxd-status-info .pxd-status-icon { background: var(--pxd-color-status-info-emphasis); }
526
+ .pxd-status-success .pxd-status-icon { background: var(--pxd-color-status-success-emphasis); }
527
+ .pxd-status-warning .pxd-status-icon { background: var(--pxd-color-status-warning-emphasis); }
528
+ .pxd-status-error .pxd-status-icon { background: var(--pxd-color-status-danger-emphasis); }
529
+ .pxd-status-empty {
530
+ flex-direction: column;
531
+ align-items: center;
532
+ text-align: center;
533
+ padding: var(--pxd-space-inset-comfortable);
534
+ background: none;
535
+ border: var(--pxd-border-width-default) dashed var(--pxd-color-border-default);
536
+ }
537
+ .pxd-status-empty .pxd-status-body {
538
+ align-items: center;
539
+ }
540
+ .pxd-status-empty .pxd-status-icon {
541
+ background: var(--pxd-color-surface-subtle);
542
+ color: var(--pxd-color-text-muted);
543
+ }
544
+ .pxd-spinner {
545
+ flex: none;
546
+ width: var(--pxd-size-icon-default);
547
+ height: var(--pxd-size-icon-default);
548
+ border-radius: var(--pxd-radius-full);
549
+ border: 3px solid var(--pxd-color-border-default);
550
+ border-top-color: var(--pxd-color-action-primary-background);
551
+ animation: pxd-spin 800ms linear infinite;
552
+ }
553
+ @keyframes pxd-spin {
554
+ to { transform: rotate(360deg); }
555
+ }
556
+
557
+ /* Inputs */
558
+ .pxd-form {
559
+ display: flex;
560
+ flex-direction: column;
561
+ gap: var(--pxd-space-stack-loose);
562
+ }
563
+ .pxd-field {
564
+ display: flex;
565
+ flex-direction: column;
566
+ gap: var(--pxd-space-stack-tight);
567
+ }
568
+ /* Not the danger colour: that one is only guaranteed 3:1, which is the floor for a graphic, and
569
+ this is a character someone reads. What marks the field is the mark's presence and the legend
570
+ that explains it, not its redness. */
571
+ .pxd-required {
572
+ margin-inline-start: 0.125em;
573
+ font-weight: 400;
574
+ color: var(--pxd-color-text-default);
575
+ }
576
+ .pxd-required-legend {
577
+ margin: 0;
578
+ color: var(--pxd-color-text-muted);
579
+ font-size: var(--pxd-type-body-small-size);
580
+ }
581
+ .pxd-input {
582
+ width: 100%;
583
+ max-width: 32rem;
584
+ min-height: var(--polyxd-control);
585
+ padding: 0 var(--pxd-space-inset-compact);
586
+ background: var(--pxd-color-surface-default);
587
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
588
+ border-radius: var(--pxd-radius-small);
589
+ transition: border-color var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
590
+ }
591
+ textarea.pxd-input {
592
+ padding: var(--pxd-space-inset-compact);
593
+ resize: vertical;
594
+ }
595
+ .pxd-input:focus-visible {
596
+ outline-offset: 0;
597
+ border-color: var(--pxd-color-border-focus);
598
+ }
599
+ .pxd-input:user-invalid {
600
+ border-color: var(--pxd-color-status-danger-emphasis);
601
+ border-width: var(--pxd-border-width-strong);
602
+ }
603
+ .pxd-input-adorned {
604
+ position: relative;
605
+ max-width: 16rem;
606
+ }
607
+ .pxd-input-prefix {
608
+ position: absolute;
609
+ left: var(--pxd-space-inset-compact);
610
+ top: 50%;
611
+ transform: translateY(-50%);
612
+ color: var(--pxd-color-text-muted);
613
+ }
614
+ .pxd-input-adorned .pxd-input {
615
+ padding-left: calc(var(--pxd-space-inset-compact) + 1.25em);
616
+ }
617
+ .pxd-input-date {
618
+ max-width: 16rem;
619
+ }
620
+ .pxd-date-range {
621
+ display: flex;
622
+ flex-wrap: wrap;
623
+ gap: var(--pxd-space-inline-default);
624
+ }
625
+ .pxd-date-range label {
626
+ display: flex;
627
+ flex-direction: column;
628
+ gap: var(--pxd-space-stack-tight);
629
+ }
630
+
631
+ .pxd-choice-list {
632
+ display: flex;
633
+ flex-direction: column;
634
+ gap: var(--pxd-space-stack-tight);
635
+ }
636
+ .pxd-choice-scroll {
637
+ max-height: 16rem;
638
+ overflow-y: auto;
639
+ padding: var(--pxd-space-inset-compact);
640
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
641
+ border-radius: var(--pxd-radius-small);
642
+ }
643
+ .pxd-choice-search {
644
+ max-width: 20rem;
645
+ }
646
+ .pxd-choice-option {
647
+ display: flex;
648
+ align-items: flex-start;
649
+ gap: var(--pxd-space-inline-default);
650
+ }
651
+ .pxd-option-text {
652
+ flex: 1;
653
+ display: flex;
654
+ flex-direction: column;
655
+ }
656
+ .pxd-option-text .pxd-option-description {
657
+ margin-top: calc(var(--pxd-space-stack-tight) * -1);
658
+ padding-bottom: var(--pxd-space-stack-tight);
659
+ }
660
+ /* The label is part of the target, and fills the row up to the pack's minimum target height. */
661
+ .pxd-choice-option label,
662
+ .pxd-toggle-label {
663
+ flex: 1;
664
+ display: flex;
665
+ flex-direction: column;
666
+ justify-content: center;
667
+ min-height: var(--polyxd-control);
668
+ cursor: pointer;
669
+ }
670
+ .pxd-choice-option .pxd-radio,
671
+ .pxd-choice-option .pxd-checkbox {
672
+ margin-top: calc((var(--pxd-size-target-min) - 24px) / 2);
673
+ }
674
+ /* 24px is the smallest box any control here is drawn at: below that, WCAG 2.5.8 passes only on
675
+ spacing, which depends on the pack's scale rather than on the component. */
676
+ .pxd-radio,
677
+ .pxd-checkbox {
678
+ flex: none;
679
+ display: grid;
680
+ place-items: center;
681
+ width: 24px;
682
+ height: 24px;
683
+ margin-top: 2px;
684
+ padding: 0;
685
+ border: var(--pxd-border-width-strong) solid var(--pxd-color-border-strong);
686
+ background: var(--pxd-color-surface-default);
687
+ cursor: pointer;
688
+ }
689
+ .pxd-radio {
690
+ border-radius: var(--pxd-radius-full);
691
+ }
692
+ .pxd-checkbox {
693
+ border-radius: var(--pxd-radius-small);
694
+ }
695
+ .pxd-radio[data-state="checked"],
696
+ .pxd-checkbox[data-state="checked"] {
697
+ border-color: var(--pxd-color-action-primary-background);
698
+ }
699
+ .pxd-checkbox[data-state="checked"] {
700
+ background: var(--pxd-color-action-primary-background);
701
+ color: var(--pxd-color-action-primary-foreground);
702
+ }
703
+ .pxd-checkbox-indicator {
704
+ font-size: 13px;
705
+ line-height: 1;
706
+ font-weight: 700;
707
+ }
708
+ .pxd-radio-indicator {
709
+ display: block;
710
+ width: 12px;
711
+ height: 12px;
712
+ border-radius: var(--pxd-radius-full);
713
+ background: var(--pxd-color-action-primary-background);
714
+ }
715
+ .pxd-segmented {
716
+ display: inline-flex;
717
+ flex-wrap: nowrap;
718
+ align-self: flex-start;
719
+ max-width: 100%;
720
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
721
+ border-radius: var(--pxd-radius-large);
722
+ overflow: hidden;
723
+ }
724
+ .pxd-segment {
725
+ flex: 1 1 auto;
726
+ min-height: var(--polyxd-control);
727
+ padding: 0 var(--pxd-space-inset-default);
728
+ line-height: 1.2;
729
+ border: 0;
730
+ border-left: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
731
+ background: var(--pxd-color-surface-default);
732
+ cursor: pointer;
733
+ }
734
+ .pxd-segment:first-child {
735
+ border-left: 0;
736
+ }
737
+ .pxd-segment[data-state="checked"] {
738
+ background: var(--pxd-color-selection-background);
739
+ color: var(--pxd-color-selection-foreground);
740
+ }
741
+ .pxd-segment[data-state="checked"]::before {
742
+ content: "✓ ";
743
+ }
744
+
745
+ .pxd-toggle {
746
+ display: flex;
747
+ align-items: flex-start;
748
+ gap: var(--pxd-space-inline-default);
749
+ }
750
+ .pxd-toggle > .pxd-switch,
751
+ .pxd-toggle > .pxd-checkbox {
752
+ margin-top: calc((var(--pxd-size-target-min) - 24px) / 2);
753
+ }
754
+ .pxd-toggle-text {
755
+ flex: 1;
756
+ display: flex;
757
+ flex-direction: column;
758
+ }
759
+ .pxd-toggle-text .pxd-field-help {
760
+ margin-top: calc(var(--pxd-space-stack-tight) * -1);
761
+ }
762
+ .pxd-switch {
763
+ flex: none;
764
+ position: relative;
765
+ width: 44px;
766
+ height: 24px;
767
+ padding: 0;
768
+ border-radius: var(--pxd-radius-full);
769
+ border: var(--pxd-border-width-strong) solid var(--pxd-color-border-strong);
770
+ background: var(--pxd-color-surface-subtle);
771
+ cursor: pointer;
772
+ transition: background var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
773
+ }
774
+ .pxd-switch[data-state="checked"] {
775
+ background: var(--pxd-color-action-primary-background);
776
+ border-color: var(--pxd-color-action-primary-background);
777
+ }
778
+ .pxd-switch-thumb {
779
+ display: block;
780
+ width: 16px;
781
+ height: 16px;
782
+ border-radius: var(--pxd-radius-full);
783
+ background: var(--pxd-color-border-strong);
784
+ transform: translateX(2px);
785
+ transition: transform var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
786
+ }
787
+ .pxd-switch[data-state="checked"] .pxd-switch-thumb {
788
+ background: var(--pxd-color-action-primary-foreground);
789
+ transform: translateX(22px);
790
+ }
791
+
792
+ .pxd-range-header {
793
+ display: flex;
794
+ justify-content: space-between;
795
+ align-items: baseline;
796
+ max-width: 32rem;
797
+ }
798
+ .pxd-range-value {
799
+ font-weight: 600;
800
+ font-variant-numeric: tabular-nums;
801
+ }
802
+ .pxd-slider {
803
+ position: relative;
804
+ display: flex;
805
+ align-items: center;
806
+ height: var(--polyxd-control);
807
+ max-width: 32rem;
808
+ touch-action: none;
809
+ }
810
+ .pxd-slider-track {
811
+ position: relative;
812
+ flex: 1;
813
+ height: 4px;
814
+ border-radius: var(--pxd-radius-full);
815
+ background: var(--pxd-color-border-default);
816
+ }
817
+ .pxd-slider-range {
818
+ position: absolute;
819
+ height: 100%;
820
+ border-radius: inherit;
821
+ background: var(--pxd-color-action-primary-background);
822
+ }
823
+ .pxd-slider-thumb {
824
+ display: block;
825
+ width: 20px;
826
+ height: 20px;
827
+ border-radius: var(--pxd-radius-full);
828
+ background: var(--pxd-color-action-primary-background);
829
+ box-shadow: var(--pxd-shadow-raised);
830
+ cursor: grab;
831
+ }
832
+ .pxd-range-bounds {
833
+ display: flex;
834
+ justify-content: space-between;
835
+ max-width: 32rem;
836
+ }
837
+
838
+ /* Actions */
839
+ .pxd-button {
840
+ display: inline-flex;
841
+ align-items: center;
842
+ justify-content: center;
843
+ gap: var(--pxd-space-inline-tight);
844
+ min-height: var(--polyxd-control);
845
+ min-width: var(--pxd-size-target-min);
846
+ padding: 0 var(--pxd-space-inset-default);
847
+ border-radius: var(--pxd-radius-control);
848
+ border: var(--pxd-border-width-default) solid transparent;
849
+ cursor: pointer;
850
+ transition: background var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
851
+ }
852
+ .pxd-button:disabled {
853
+ opacity: var(--pxd-opacity-state-disabled);
854
+ cursor: not-allowed;
855
+ }
856
+ .pxd-button-primary {
857
+ background: var(--pxd-color-action-primary-background);
858
+ color: var(--pxd-color-action-primary-foreground);
859
+ }
860
+ .pxd-button-secondary {
861
+ background: var(--pxd-color-action-secondary-background);
862
+ color: var(--pxd-color-action-secondary-foreground);
863
+ border-color: var(--pxd-color-action-secondary-border);
864
+ }
865
+ .pxd-button-tertiary {
866
+ background: transparent;
867
+ color: var(--pxd-color-text-link);
868
+ padding: 0 var(--pxd-space-inset-compact);
869
+ }
870
+ .pxd-button-danger {
871
+ background: var(--pxd-color-action-danger-background);
872
+ color: var(--pxd-color-action-danger-foreground);
873
+ border-color: transparent;
874
+ }
875
+ .pxd-button-primary:not(:disabled):hover,
876
+ .pxd-button-danger:not(:disabled):hover {
877
+ filter: brightness(calc(1 - var(--pxd-opacity-state-hover)));
878
+ }
879
+ .pxd-button-secondary:not(:disabled):hover,
880
+ .pxd-button-tertiary:not(:disabled):hover {
881
+ background: color-mix(in srgb, currentColor calc(var(--pxd-opacity-state-hover) * 100%), transparent);
882
+ }
883
+ .pxd-button-secondary:not(:disabled):hover {
884
+ background: color-mix(in srgb, var(--pxd-color-action-secondary-foreground) calc(var(--pxd-opacity-state-hover) * 100%), var(--pxd-color-action-secondary-background));
885
+ }
886
+ /* Wide: primary sits at the end of the row (DOM order is importance order). Compact: stacked, primary first. */
887
+ .pxd-action-bar {
888
+ display: flex;
889
+ flex-direction: row-reverse;
890
+ justify-content: flex-end;
891
+ flex-wrap: wrap-reverse;
892
+ gap: var(--pxd-space-inline-default);
893
+ }
894
+ @container pxd (width < 30rem) {
895
+ .pxd-action-bar {
896
+ flex-direction: column;
897
+ align-items: stretch;
898
+ }
899
+ }
900
+ /* A dialog's footer is the one place design systems disagree about layout rather than about
901
+ values: Carbon's runs the full width of the dialog in equal halves, Material's and Ant's sit
902
+ inline at the trailing edge. A pack sets these three variables in its manifest; the defaults
903
+ here are the inline footer, so a pack that says nothing keeps it. */
904
+ .pxd-dialog > .pxd-action-bar {
905
+ gap: var(--pxd-layout-action-gap, var(--pxd-space-inline-default));
906
+ margin: var(--pxd-layout-action-bleed, 0);
907
+ }
908
+ .pxd-dialog > .pxd-action-bar > .pxd-button {
909
+ flex: var(--pxd-layout-action-item, 0 0 auto);
910
+ }
911
+
912
+ /* Flow */
913
+ .pxd-steps {
914
+ display: flex;
915
+ flex-direction: column;
916
+ gap: var(--pxd-space-stack-default);
917
+ }
918
+ .pxd-steps-list {
919
+ display: flex;
920
+ gap: var(--pxd-space-inline-tight);
921
+ }
922
+ .pxd-steps-list li {
923
+ flex: 1;
924
+ padding-top: var(--pxd-space-stack-tight);
925
+ border-top: 4px solid var(--pxd-color-border-default);
926
+ color: var(--pxd-color-text-muted);
927
+ font-size: var(--pxd-type-label-small-size);
928
+ }
929
+ .pxd-steps-list li.pxd-step-done {
930
+ border-top-color: var(--pxd-color-action-primary-background);
931
+ }
932
+ .pxd-steps-list li[aria-current="step"] {
933
+ border-top-color: var(--pxd-color-action-primary-background);
934
+ color: var(--pxd-color-text-default);
935
+ font-weight: 600;
936
+ }
937
+ .pxd-steps-content {
938
+ display: flex;
939
+ flex-direction: column;
940
+ gap: var(--pxd-space-stack-loose);
941
+ }
942
+
943
+ .pxd-portal {
944
+ display: contents;
945
+ }
946
+ /* The Web renderer's overlays are native <dialog> elements: the browser's own dialog box steps
947
+ aside (zero specificity, so every .pxd-* rule above and below still wins) and the scrim is the
948
+ surface's .pxd-overlay, not the backdrop. */
949
+ :where(.pxd-portal > dialog) {
950
+ border: 0;
951
+ margin: 0;
952
+ padding: 0;
953
+ inset: auto;
954
+ width: auto;
955
+ height: auto;
956
+ max-width: none;
957
+ max-height: none;
958
+ color: inherit;
959
+ background: transparent;
960
+ overflow: visible;
961
+ }
962
+ :where(.pxd-portal > dialog)::backdrop {
963
+ background: transparent;
964
+ }
965
+ .pxd-overlay {
966
+ position: fixed;
967
+ inset: 0;
968
+ background: var(--pxd-color-scrim);
969
+ z-index: 10;
970
+ }
971
+ .pxd-dialog {
972
+ position: fixed;
973
+ left: 50%;
974
+ top: 50%;
975
+ z-index: 11;
976
+ transform: translate(-50%, -50%);
977
+ width: min(32rem, calc(100% - 2 * var(--pxd-space-inset-default)));
978
+ max-height: calc(100% - 2 * var(--pxd-space-inset-default));
979
+ overflow-y: auto;
980
+ display: flex;
981
+ flex-direction: column;
982
+ gap: var(--pxd-space-stack-default);
983
+ padding: var(--pxd-space-inset-comfortable);
984
+ background: var(--pxd-color-surface-overlay);
985
+ color: var(--pxd-color-text-default);
986
+ border-radius: var(--pxd-radius-large);
987
+ box-shadow: var(--pxd-shadow-overlay);
988
+ }
989
+ /* A confirmation that is the whole surface sits inline, centred in the surface. */
990
+ .pxd-dialog-inline {
991
+ position: static;
992
+ transform: none;
993
+ margin: var(--pxd-space-stack-loose) auto;
994
+ max-height: none;
995
+ }
996
+ /* Danger is shown by a graphic accent; title text stays in the text colour (4.5:1 guaranteed). */
997
+ .pxd-dialog-destructive {
998
+ border-top: 4px solid var(--pxd-color-status-danger-emphasis);
999
+ }
1000
+ .pxd-dialog-description {
1001
+ display: flex;
1002
+ flex-direction: column;
1003
+ gap: var(--pxd-space-stack-tight);
1004
+ }
1005
+ .pxd-dialog-consequence {
1006
+ font-weight: 600;
1007
+ }
1008
+ .pxd-dialog .pxd-action-bar {
1009
+ margin-top: var(--pxd-space-stack-tight);
1010
+ }
1011
+
1012
+ .pxd-comparison {
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ gap: var(--pxd-space-stack-default);
1016
+ }
1017
+ .pxd-comparison-items {
1018
+ display: grid;
1019
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
1020
+ gap: var(--pxd-space-inline-loose);
1021
+ }
1022
+ .pxd-comparison-item {
1023
+ display: flex;
1024
+ flex-direction: column;
1025
+ gap: var(--pxd-space-stack-default);
1026
+ padding: var(--pxd-space-inset-default);
1027
+ background: var(--pxd-color-surface-raised);
1028
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1029
+ border-radius: var(--pxd-radius-default);
1030
+ }
1031
+ .pxd-comparison-item.pxd-recommended {
1032
+ border: var(--pxd-border-width-strong) solid var(--pxd-color-action-primary-background);
1033
+ }
1034
+ .pxd-comparison-title {
1035
+ display: flex;
1036
+ flex-wrap: wrap;
1037
+ align-items: center;
1038
+ gap: var(--pxd-space-inline-default);
1039
+ }
1040
+ .pxd-comparison-item .pxd-detail-row {
1041
+ grid-template-columns: 1fr;
1042
+ gap: 2px;
1043
+ padding: var(--pxd-space-stack-tight) 0;
1044
+ }
1045
+ .pxd-comparison-item .pxd-button {
1046
+ margin-top: auto;
1047
+ }
1048
+ .pxd-best {
1049
+ margin-left: var(--pxd-space-inline-tight);
1050
+ padding: 0 var(--pxd-space-inline-tight);
1051
+ border-radius: var(--pxd-radius-small);
1052
+ background: var(--pxd-color-status-success-background);
1053
+ color: var(--pxd-color-status-success-foreground);
1054
+ font-weight: 600;
1055
+ }
1056
+
1057
+ .pxd-unknown {
1058
+ padding: var(--pxd-space-inset-compact);
1059
+ border: 1px dashed var(--pxd-color-status-danger-emphasis);
1060
+ background: var(--pxd-color-status-danger-background);
1061
+ color: var(--pxd-color-status-danger-foreground);
1062
+ }
1063
+
1064
+ @media (prefers-reduced-motion: reduce) {
1065
+ .pxd-surface *,
1066
+ .pxd-surface *::before,
1067
+ .pxd-surface *::after {
1068
+ transition-duration: 0ms !important;
1069
+ animation-duration: 0ms !important;
1070
+ }
1071
+ }
1072
+
1073
+ /* ---- Batch 1: building blocks from the flow designs (design/flows) ---- */
1074
+
1075
+ /* Search: a pill with the icon inside; the label is visually hidden but remains the accessible name. */
1076
+ .pxd-search {
1077
+ display: flex;
1078
+ align-items: center;
1079
+ gap: var(--pxd-space-inline-default);
1080
+ min-height: calc(var(--polyxd-control) + 8px);
1081
+ padding: 0 var(--pxd-space-inset-default);
1082
+ border-radius: var(--pxd-radius-full);
1083
+ background: var(--pxd-color-surface-subtle);
1084
+ color: var(--pxd-color-text-muted);
1085
+ }
1086
+ .pxd-search:focus-within {
1087
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
1088
+ outline-offset: var(--pxd-focus-ring-offset);
1089
+ }
1090
+ .pxd-search-compact {
1091
+ min-height: var(--polyxd-control);
1092
+ }
1093
+ .pxd-search-input {
1094
+ flex: 1;
1095
+ min-width: 0;
1096
+ min-height: var(--polyxd-control);
1097
+ border: 0;
1098
+ background: transparent;
1099
+ color: var(--pxd-color-text-default);
1100
+ font-size: var(--pxd-type-body-default-size);
1101
+ }
1102
+ .pxd-search-input:focus-visible {
1103
+ outline: none;
1104
+ }
1105
+ .pxd-search-input::placeholder {
1106
+ color: var(--pxd-color-text-muted);
1107
+ }
1108
+
1109
+ /* Hero amount: the one number a surface is about. */
1110
+ .pxd-hero-field {
1111
+ display: flex;
1112
+ flex-direction: column;
1113
+ align-items: center;
1114
+ gap: var(--pxd-space-stack-tight);
1115
+ padding: var(--pxd-space-stack-loose) 0 var(--pxd-space-stack-default);
1116
+ text-align: center;
1117
+ }
1118
+ .pxd-hero-label {
1119
+ color: var(--pxd-color-text-muted);
1120
+ font-size: var(--pxd-type-body-small-size);
1121
+ }
1122
+ .pxd-hero-input {
1123
+ display: flex;
1124
+ align-items: baseline;
1125
+ justify-content: center;
1126
+ gap: 4px;
1127
+ max-width: 100%;
1128
+ }
1129
+ .pxd-hero-symbol {
1130
+ font-size: calc(var(--pxd-type-numeric-display-size) * 1.1);
1131
+ color: var(--pxd-color-text-muted);
1132
+ }
1133
+ .pxd-hero-value {
1134
+ min-width: 1ch;
1135
+ max-width: 100%;
1136
+ border: 0;
1137
+ border-bottom: var(--pxd-border-width-strong) solid transparent;
1138
+ background: transparent;
1139
+ color: var(--pxd-color-text-default);
1140
+ font-family: var(--pxd-type-numeric-display-family);
1141
+ font-size: calc(var(--pxd-type-numeric-display-size) * 1.6);
1142
+ line-height: 1.1;
1143
+ font-variant-numeric: tabular-nums;
1144
+ text-align: center;
1145
+ field-sizing: content;
1146
+ }
1147
+ .pxd-hero-value:focus-visible {
1148
+ outline: none;
1149
+ border-bottom-color: var(--pxd-color-border-focus);
1150
+ }
1151
+ .pxd-hero-help {
1152
+ max-width: none;
1153
+ }
1154
+
1155
+ /* Chips: single choice (radio) and multiple (checkbox), for a few short options. */
1156
+ .pxd-chips {
1157
+ display: flex;
1158
+ flex-wrap: wrap;
1159
+ gap: var(--pxd-space-inline-default);
1160
+ }
1161
+ .pxd-chip {
1162
+ display: inline-flex;
1163
+ align-items: center;
1164
+ gap: 6px;
1165
+ min-height: var(--polyxd-control);
1166
+ padding: 0 var(--pxd-space-inset-default);
1167
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
1168
+ border-radius: var(--pxd-radius-control);
1169
+ background: transparent;
1170
+ color: var(--pxd-color-text-default);
1171
+ font-family: var(--pxd-type-label-default-family);
1172
+ font-size: var(--pxd-type-label-default-size);
1173
+ font-weight: var(--pxd-type-label-default-weight);
1174
+ cursor: pointer;
1175
+ }
1176
+ .pxd-chip[data-state="checked"] {
1177
+ border-color: transparent;
1178
+ background: var(--pxd-color-selection-background);
1179
+ color: var(--pxd-color-selection-foreground);
1180
+ }
1181
+ .pxd-chip-check {
1182
+ display: inline-flex;
1183
+ }
1184
+
1185
+ /* Avatars: initials on a tone chosen per name, from contrast-guaranteed pairs. */
1186
+ .pxd-avatar {
1187
+ flex: none;
1188
+ display: inline-flex;
1189
+ align-items: center;
1190
+ justify-content: center;
1191
+ border-radius: var(--pxd-radius-full);
1192
+ object-fit: cover;
1193
+ font-weight: 600;
1194
+ }
1195
+ .pxd-avatar-primary { background: var(--pxd-color-selection-background); color: var(--pxd-color-selection-foreground); }
1196
+ .pxd-avatar-secondary { background: var(--pxd-color-surface-subtle); color: var(--pxd-color-text-default); }
1197
+ .pxd-avatar-tertiary { background: var(--pxd-color-status-info-background); color: var(--pxd-color-status-info-foreground); }
1198
+ .pxd-avatar-success { background: var(--pxd-color-status-success-background); color: var(--pxd-color-status-success-foreground); }
1199
+ .pxd-avatar-warning { background: var(--pxd-color-status-warning-background); color: var(--pxd-color-status-warning-foreground); }
1200
+
1201
+ /* People picker: recent faces, then a list. */
1202
+ .pxd-people-group {
1203
+ display: flex;
1204
+ flex-direction: column;
1205
+ gap: var(--pxd-space-stack-default);
1206
+ }
1207
+ .pxd-people-recent {
1208
+ display: flex;
1209
+ gap: var(--pxd-space-inline-default);
1210
+ overflow-x: auto;
1211
+ padding: 2px;
1212
+ }
1213
+ .pxd-person-tile {
1214
+ display: flex;
1215
+ flex-direction: column;
1216
+ align-items: center;
1217
+ gap: 6px;
1218
+ width: 72px;
1219
+ flex: none;
1220
+ padding: 6px 0;
1221
+ border: 0;
1222
+ border-radius: var(--pxd-radius-default);
1223
+ background: transparent;
1224
+ color: var(--pxd-color-text-default);
1225
+ cursor: pointer;
1226
+ }
1227
+ .pxd-person-tile[data-state="checked"] .pxd-avatar {
1228
+ box-shadow:
1229
+ 0 0 0 var(--pxd-border-width-strong) var(--pxd-color-surface-default),
1230
+ 0 0 0 calc(var(--pxd-border-width-strong) * 2) var(--pxd-color-action-primary-background);
1231
+ }
1232
+ .pxd-person-face {
1233
+ position: relative;
1234
+ display: inline-flex;
1235
+ }
1236
+ .pxd-person-tick {
1237
+ position: absolute;
1238
+ right: -2px;
1239
+ bottom: -2px;
1240
+ display: inline-flex;
1241
+ align-items: center;
1242
+ justify-content: center;
1243
+ width: 22px;
1244
+ height: 22px;
1245
+ border-radius: var(--pxd-radius-full);
1246
+ border: 2px solid var(--pxd-color-surface-default);
1247
+ background: var(--pxd-color-action-primary-background);
1248
+ color: var(--pxd-color-action-primary-foreground);
1249
+ }
1250
+ .pxd-person-name {
1251
+ max-width: 72px;
1252
+ overflow: hidden;
1253
+ text-overflow: ellipsis;
1254
+ white-space: nowrap;
1255
+ font-size: var(--pxd-type-label-small-size);
1256
+ }
1257
+ .pxd-people-list {
1258
+ display: flex;
1259
+ flex-direction: column;
1260
+ }
1261
+ .pxd-person-row {
1262
+ display: flex;
1263
+ align-items: center;
1264
+ gap: var(--pxd-space-inline-loose);
1265
+ min-height: calc(var(--polyxd-control) + 8px);
1266
+ padding: 6px var(--pxd-space-inset-compact);
1267
+ border: 0;
1268
+ border-radius: var(--pxd-radius-default);
1269
+ background: transparent;
1270
+ color: var(--pxd-color-text-default);
1271
+ text-align: left;
1272
+ cursor: pointer;
1273
+ }
1274
+ .pxd-person-row:hover {
1275
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), transparent);
1276
+ }
1277
+ .pxd-person-row[data-state="checked"] {
1278
+ background: var(--pxd-color-selection-background);
1279
+ color: var(--pxd-color-selection-foreground);
1280
+ }
1281
+ .pxd-person-row[data-state="checked"] .pxd-option-description {
1282
+ color: inherit;
1283
+ }
1284
+ .pxd-person-text {
1285
+ flex: 1;
1286
+ display: flex;
1287
+ flex-direction: column;
1288
+ font-size: var(--pxd-type-body-default-size);
1289
+ }
1290
+ .pxd-person-check {
1291
+ display: inline-flex;
1292
+ }
1293
+
1294
+ /* Range: two thumbs and min/max fields. */
1295
+ .pxd-range-fields {
1296
+ display: flex;
1297
+ align-items: flex-end;
1298
+ gap: var(--pxd-space-inline-default);
1299
+ max-width: 32rem;
1300
+ }
1301
+ .pxd-range-fields label {
1302
+ flex: 1;
1303
+ display: flex;
1304
+ flex-direction: column;
1305
+ gap: var(--pxd-space-stack-tight);
1306
+ font-size: var(--pxd-type-label-small-size);
1307
+ color: var(--pxd-color-text-muted);
1308
+ }
1309
+ .pxd-range-fields > span {
1310
+ padding-bottom: calc(var(--pxd-size-target-min) / 2 - 10px);
1311
+ color: var(--pxd-color-text-muted);
1312
+ }
1313
+
1314
+ /* Grid collections: visual items side by side. */
1315
+ .pxd-collection-grid {
1316
+ display: grid;
1317
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1318
+ gap: var(--pxd-space-stack-loose) var(--pxd-space-inline-default);
1319
+ }
1320
+ @container pxd (width >= 36rem) {
1321
+ .pxd-collection-grid {
1322
+ grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
1323
+ gap: var(--pxd-space-stack-loose) var(--pxd-space-inline-loose);
1324
+ }
1325
+ }
1326
+ .pxd-collection-grid .pxd-card {
1327
+ flex-direction: column !important;
1328
+ box-shadow: none;
1329
+ background: transparent;
1330
+ border: 0;
1331
+ }
1332
+ .pxd-collection-grid .pxd-card-media {
1333
+ flex: none !important;
1334
+ }
1335
+ .pxd-collection-grid .pxd-card-media .pxd-media {
1336
+ aspect-ratio: 1;
1337
+ border-radius: var(--pxd-radius-default);
1338
+ }
1339
+ .pxd-collection-grid .pxd-card-body {
1340
+ padding: var(--pxd-space-stack-tight) 2px 0;
1341
+ }
1342
+
1343
+ /* Receipt: people read amounts from the right. */
1344
+ .pxd-receipt dl {
1345
+ display: flex;
1346
+ flex-direction: column;
1347
+ gap: var(--pxd-space-stack-tight);
1348
+ padding: var(--pxd-space-inset-default);
1349
+ border-radius: var(--pxd-radius-default);
1350
+ background: var(--pxd-color-surface-subtle);
1351
+ }
1352
+ .pxd-receipt .pxd-detail-row {
1353
+ display: flex;
1354
+ justify-content: space-between;
1355
+ align-items: baseline;
1356
+ gap: var(--pxd-space-inline-loose);
1357
+ padding: 0;
1358
+ border: 0;
1359
+ }
1360
+ .pxd-receipt .pxd-detail-row dd {
1361
+ text-align: right;
1362
+ font-variant-numeric: tabular-nums;
1363
+ }
1364
+ .pxd-receipt .pxd-free {
1365
+ color: var(--pxd-color-status-success-foreground);
1366
+ background: var(--pxd-color-status-success-background);
1367
+ padding: 0 var(--pxd-space-inline-tight);
1368
+ border-radius: var(--pxd-radius-small);
1369
+ }
1370
+ .pxd-receipt .pxd-total {
1371
+ margin-top: var(--pxd-space-stack-tight);
1372
+ padding-top: var(--pxd-space-stack-default);
1373
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1374
+ font-weight: 600;
1375
+ }
1376
+ .pxd-receipt .pxd-total dt {
1377
+ color: var(--pxd-color-text-default);
1378
+ }
1379
+ @container pxd (width < 30rem) {
1380
+ .pxd-receipt .pxd-detail-row {
1381
+ flex-direction: row;
1382
+ }
1383
+ }
1384
+
1385
+ /* Confirmation: who it's for, the amount, what happens. */
1386
+ .pxd-dialog-subject {
1387
+ display: flex;
1388
+ align-items: center;
1389
+ gap: var(--pxd-space-inline-default);
1390
+ }
1391
+ .pxd-dialog-subject-title {
1392
+ font-weight: 600;
1393
+ }
1394
+ .pxd-dialog-subject-sub {
1395
+ font-size: var(--pxd-type-body-small-size);
1396
+ color: var(--pxd-color-text-muted);
1397
+ }
1398
+ .pxd-dialog-amount {
1399
+ font-family: var(--pxd-type-numeric-display-family);
1400
+ font-size: calc(var(--pxd-type-numeric-display-size) * 1.3);
1401
+ line-height: 1.1;
1402
+ font-variant-numeric: tabular-nums;
1403
+ }
1404
+ .pxd-dialog-consequence {
1405
+ display: flex;
1406
+ gap: var(--pxd-space-inline-default);
1407
+ align-items: flex-start;
1408
+ margin: 0;
1409
+ font-weight: 400;
1410
+ font-size: var(--pxd-type-body-small-size);
1411
+ color: var(--pxd-color-text-muted);
1412
+ }
1413
+ .pxd-dialog-consequence svg {
1414
+ flex: none;
1415
+ margin-top: 2px;
1416
+ }
1417
+ .pxd-consequences {
1418
+ display: grid;
1419
+ gap: var(--pxd-space-stack-default);
1420
+ }
1421
+ @container pxd (width >= 40rem) {
1422
+ .pxd-consequences {
1423
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1424
+ }
1425
+ }
1426
+ .pxd-consequences li {
1427
+ display: flex;
1428
+ gap: var(--pxd-space-inline-default);
1429
+ align-items: flex-start;
1430
+ }
1431
+ .pxd-consequence-icon {
1432
+ flex: none;
1433
+ display: inline-flex;
1434
+ align-items: center;
1435
+ justify-content: center;
1436
+ width: 40px;
1437
+ height: 40px;
1438
+ border-radius: var(--pxd-radius-default);
1439
+ background: var(--pxd-color-surface-subtle);
1440
+ color: var(--pxd-color-text-muted);
1441
+ }
1442
+ .pxd-consequence-title,
1443
+ .pxd-consequence-detail {
1444
+ display: block;
1445
+ }
1446
+ .pxd-consequence-detail {
1447
+ font-size: var(--pxd-type-body-small-size);
1448
+ color: var(--pxd-color-text-muted);
1449
+ }
1450
+
1451
+ /* On phones, a form's actions stay within reach at the bottom, full width. */
1452
+ @container pxd (width < 30rem) {
1453
+ .pxd-form > .pxd-action-bar,
1454
+ .pxd-steps-content > .pxd-action-bar {
1455
+ position: sticky;
1456
+ bottom: 0;
1457
+ z-index: 1;
1458
+ margin: 0 calc(var(--pxd-space-inset-comfortable) * -1) calc(var(--pxd-space-inset-comfortable) * -1);
1459
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-comfortable) var(--pxd-space-inset-comfortable);
1460
+ background: var(--pxd-color-surface-default);
1461
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1462
+ }
1463
+ .pxd-form > .pxd-action-bar .pxd-button,
1464
+ .pxd-steps-content > .pxd-action-bar .pxd-button {
1465
+ width: 100%;
1466
+ }
1467
+ }
1468
+
1469
+ /* ---- Batch 2: layouts and patterns from the flow designs ---- */
1470
+
1471
+ /* Empty states: an icon tile, encouraging copy, up to two actions. */
1472
+ .pxd-status-empty {
1473
+ border: 0;
1474
+ padding: var(--pxd-space-stack-loose) var(--pxd-space-inset-comfortable);
1475
+ }
1476
+ .pxd-status-empty .pxd-status-icon {
1477
+ width: 64px;
1478
+ height: 64px;
1479
+ border-radius: var(--pxd-radius-large);
1480
+ }
1481
+ .pxd-status-empty .pxd-status-action .pxd-action-bar {
1482
+ justify-content: center;
1483
+ }
1484
+
1485
+ /* Undo: a snackbar at the bottom of the surface. */
1486
+ .pxd-snackbar {
1487
+ position: sticky;
1488
+ bottom: var(--pxd-space-inset-default);
1489
+ z-index: 2;
1490
+ display: flex;
1491
+ align-items: center;
1492
+ gap: var(--pxd-space-inline-default);
1493
+ width: fit-content;
1494
+ max-width: 100%;
1495
+ margin: var(--pxd-space-stack-default) auto 0;
1496
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) var(--pxd-space-inset-default);
1497
+ border-radius: var(--pxd-radius-default);
1498
+ background: var(--pxd-color-text-default);
1499
+ color: var(--pxd-color-surface-default);
1500
+ box-shadow: var(--pxd-shadow-overlay);
1501
+ }
1502
+ .pxd-snackbar-text {
1503
+ margin: 0;
1504
+ }
1505
+ .pxd-snackbar .pxd-button {
1506
+ background: transparent;
1507
+ color: var(--pxd-color-surface-default);
1508
+ border-color: transparent;
1509
+ text-decoration: underline;
1510
+ }
1511
+
1512
+ /* Progress on a card. */
1513
+ .pxd-progress {
1514
+ display: flex;
1515
+ align-items: center;
1516
+ gap: var(--pxd-space-inline-default);
1517
+ }
1518
+ .pxd-progress-track {
1519
+ flex: 1;
1520
+ height: 6px;
1521
+ border-radius: var(--pxd-radius-full);
1522
+ background: var(--pxd-color-border-default);
1523
+ overflow: hidden;
1524
+ }
1525
+ .pxd-progress-fill {
1526
+ height: 100%;
1527
+ border-radius: inherit;
1528
+ background: var(--pxd-color-action-primary-background);
1529
+ }
1530
+ .pxd-progress-label {
1531
+ flex: none;
1532
+ font-size: var(--pxd-type-body-small-size);
1533
+ color: var(--pxd-color-text-muted);
1534
+ font-variant-numeric: tabular-nums;
1535
+ }
1536
+
1537
+ /* Form with a summary beside it (wide) or before the action (compact). */
1538
+ @container pxd (width >= 48rem) {
1539
+ .pxd-form-with-aside {
1540
+ display: grid;
1541
+ grid-template-columns: minmax(0, 1fr) minmax(16rem, 22rem);
1542
+ grid-template-areas: "fields aside" "actions aside";
1543
+ align-items: start;
1544
+ column-gap: var(--pxd-space-inline-loose);
1545
+ row-gap: var(--pxd-space-stack-loose);
1546
+ }
1547
+ .pxd-form-with-aside > .pxd-form-fields { grid-area: fields; }
1548
+ .pxd-form-with-aside > .pxd-action-bar { grid-area: actions; }
1549
+ .pxd-form-with-aside > .pxd-form-aside {
1550
+ grid-area: aside;
1551
+ position: sticky;
1552
+ top: var(--pxd-space-inset-default);
1553
+ }
1554
+ }
1555
+ .pxd-form-aside {
1556
+ display: flex;
1557
+ flex-direction: column;
1558
+ gap: var(--pxd-space-stack-default);
1559
+ }
1560
+
1561
+ /* Comparison: one recommendation with its reason, grouped attributes, yes/no marks. */
1562
+ .pxd-recommendation {
1563
+ display: flex;
1564
+ flex-direction: column;
1565
+ align-items: flex-start;
1566
+ gap: var(--pxd-space-stack-tight);
1567
+ margin: 0;
1568
+ }
1569
+ .pxd-recommendation-reason {
1570
+ font-size: var(--pxd-type-body-small-size);
1571
+ color: var(--pxd-color-text-muted);
1572
+ }
1573
+ .pxd-comparison-group-label {
1574
+ margin: 0;
1575
+ padding-top: var(--pxd-space-stack-tight);
1576
+ font-family: var(--pxd-type-label-small-family);
1577
+ font-size: var(--pxd-type-label-small-size);
1578
+ font-weight: 600;
1579
+ color: var(--pxd-color-text-muted);
1580
+ }
1581
+ .pxd-yes,
1582
+ .pxd-no {
1583
+ display: inline-flex;
1584
+ vertical-align: middle;
1585
+ }
1586
+ .pxd-yes {
1587
+ color: var(--pxd-color-text-default);
1588
+ }
1589
+ .pxd-no {
1590
+ color: var(--pxd-color-text-muted);
1591
+ }
1592
+
1593
+ /* Filter panel: sidebar on wide, a sheet on compact. */
1594
+ .pxd-filter-layout {
1595
+ display: grid;
1596
+ grid-template-columns: minmax(14rem, 18rem) minmax(0, 1fr);
1597
+ gap: var(--pxd-space-inline-loose);
1598
+ align-items: start;
1599
+ }
1600
+ .pxd-filter-sidebar {
1601
+ position: sticky;
1602
+ top: var(--pxd-space-inset-default);
1603
+ display: flex;
1604
+ flex-direction: column;
1605
+ gap: var(--pxd-space-stack-default);
1606
+ }
1607
+ .pxd-filter-title {
1608
+ margin: 0;
1609
+ font-family: var(--pxd-type-title-item-family);
1610
+ font-size: var(--pxd-type-title-item-size);
1611
+ font-weight: var(--pxd-type-title-item-weight);
1612
+ }
1613
+ .pxd-filter-results {
1614
+ display: flex;
1615
+ flex-direction: column;
1616
+ gap: var(--pxd-space-stack-default);
1617
+ min-width: 0;
1618
+ }
1619
+ .pxd-filter-status {
1620
+ display: flex;
1621
+ align-items: center;
1622
+ flex-wrap: wrap;
1623
+ gap: var(--pxd-space-inline-default);
1624
+ }
1625
+ .pxd-filter-count {
1626
+ margin: 0;
1627
+ color: var(--pxd-color-text-muted);
1628
+ font-size: var(--pxd-type-body-small-size);
1629
+ }
1630
+ .pxd-filter-trigger {
1631
+ background: transparent;
1632
+ }
1633
+ .pxd-filter-chips {
1634
+ display: flex;
1635
+ flex-wrap: wrap;
1636
+ align-items: center;
1637
+ gap: var(--pxd-space-inline-default);
1638
+ margin: 0;
1639
+ padding: 0;
1640
+ list-style: none;
1641
+ }
1642
+ .pxd-filter-chip {
1643
+ border-color: transparent;
1644
+ background: var(--pxd-color-selection-background);
1645
+ color: var(--pxd-color-selection-foreground);
1646
+ }
1647
+ .pxd-sheet {
1648
+ position: fixed;
1649
+ left: 0;
1650
+ right: 0;
1651
+ bottom: 0;
1652
+ z-index: 11;
1653
+ display: flex;
1654
+ flex-direction: column;
1655
+ max-height: 85%;
1656
+ background: var(--pxd-color-surface-overlay);
1657
+ color: var(--pxd-color-text-default);
1658
+ border-radius: var(--pxd-radius-large) var(--pxd-radius-large) 0 0;
1659
+ box-shadow: var(--pxd-shadow-overlay);
1660
+ }
1661
+ .pxd-sheet-header {
1662
+ display: flex;
1663
+ align-items: center;
1664
+ justify-content: space-between;
1665
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) 0 var(--pxd-space-inset-default);
1666
+ }
1667
+ .pxd-sheet-title {
1668
+ margin: 0;
1669
+ font-family: var(--pxd-type-title-section-family);
1670
+ font-size: var(--pxd-type-title-section-size);
1671
+ font-weight: var(--pxd-type-title-section-weight);
1672
+ }
1673
+ .pxd-sheet-body {
1674
+ flex: 1;
1675
+ overflow-y: auto;
1676
+ padding: var(--pxd-space-inset-default);
1677
+ }
1678
+ .pxd-sheet-footer {
1679
+ display: flex;
1680
+ gap: var(--pxd-space-inline-default);
1681
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-default) var(--pxd-space-inset-default);
1682
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1683
+ }
1684
+ .pxd-sheet-footer .pxd-button {
1685
+ flex: 1;
1686
+ }
1687
+ .pxd-icon-button {
1688
+ display: inline-flex;
1689
+ align-items: center;
1690
+ justify-content: center;
1691
+ width: var(--pxd-size-target-min);
1692
+ height: var(--polyxd-control);
1693
+ border: 0;
1694
+ border-radius: var(--pxd-radius-control);
1695
+ background: transparent;
1696
+ color: var(--pxd-color-text-default);
1697
+ cursor: pointer;
1698
+ }
1699
+
1700
+ /* ---- Batch 4: dense B2B layouts (app shell, page header, data tables) ---- */
1701
+
1702
+ /* Density comes from Design Direction. It sets row height and how tight rows are packed;
1703
+ touch targets keep their minimum, so compact is for pointer surfaces. */
1704
+ .pxd-surface {
1705
+ --polyxd-row-height: 40px;
1706
+ --polyxd-row-pad: var(--pxd-space-inset-compact);
1707
+ /* Space between two things that belong together, and between two separate questions. */
1708
+ --polyxd-stack: var(--pxd-space-stack-default);
1709
+ --polyxd-stack-apart: var(--pxd-space-stack-loose);
1710
+ --polyxd-inset: var(--pxd-space-inset-comfortable);
1711
+ --polyxd-control: var(--pxd-size-target-min);
1712
+ }
1713
+ .pxd-surface[data-pxd-density="compact"] {
1714
+ --polyxd-row-height: 32px;
1715
+ --polyxd-row-pad: var(--pxd-space-inline-default);
1716
+ --polyxd-stack: var(--pxd-space-stack-tight);
1717
+ --polyxd-stack-apart: var(--pxd-space-stack-default);
1718
+ --polyxd-inset: var(--pxd-space-inset-default);
1719
+ /* Controls shrink only where there is a pointer; touch keeps its 44px floor. */
1720
+ --polyxd-control: max(36px, calc(var(--pxd-size-target-min) - 12px));
1721
+ }
1722
+ .pxd-surface[data-pxd-density="spacious"] {
1723
+ --polyxd-row-height: 48px;
1724
+ --polyxd-row-pad: var(--pxd-space-inset-default);
1725
+ --polyxd-stack: var(--pxd-space-stack-loose);
1726
+ --polyxd-stack-apart: var(--pxd-space-stack-section);
1727
+ --polyxd-inset: var(--pxd-space-inset-comfortable);
1728
+ --polyxd-control: calc(var(--pxd-size-target-min) + 4px);
1729
+ }
1730
+ @media (pointer: coarse) {
1731
+ .pxd-surface[data-pxd-density="compact"] {
1732
+ --polyxd-control: max(44px, calc(var(--pxd-size-target-min) - 4px));
1733
+ }
1734
+ }
1735
+
1736
+ /* App shell: navigation beside the page. */
1737
+ .pxd-surface-with-nav {
1738
+ display: grid;
1739
+ grid-template-columns: auto minmax(0, 1fr);
1740
+ align-items: start;
1741
+ gap: var(--pxd-space-inline-loose);
1742
+ }
1743
+ .pxd-surface-main {
1744
+ display: flex;
1745
+ flex-direction: column;
1746
+ gap: var(--pxd-space-stack-loose);
1747
+ min-width: 0;
1748
+ }
1749
+ .pxd-nav {
1750
+ display: flex;
1751
+ flex-direction: column;
1752
+ gap: var(--pxd-space-stack-default);
1753
+ min-width: 12rem;
1754
+ }
1755
+ .pxd-nav ul {
1756
+ list-style: none;
1757
+ margin: 0;
1758
+ padding: 0;
1759
+ }
1760
+ .pxd-nav-group-label {
1761
+ margin: 0 0 var(--pxd-space-stack-tight);
1762
+ padding: 0 var(--pxd-space-inline-default);
1763
+ font-family: var(--pxd-type-label-small-family);
1764
+ font-size: var(--pxd-type-label-small-size);
1765
+ color: var(--pxd-color-text-muted);
1766
+ }
1767
+ .pxd-nav-item {
1768
+ display: flex;
1769
+ align-items: center;
1770
+ gap: var(--pxd-space-inline-default);
1771
+ width: 100%;
1772
+ min-height: var(--polyxd-control);
1773
+ padding: 0 var(--pxd-space-inset-compact);
1774
+ border: 0;
1775
+ border-left: 3px solid transparent;
1776
+ border-radius: 0 var(--pxd-radius-default) var(--pxd-radius-default) 0;
1777
+ background: transparent;
1778
+ color: var(--pxd-color-text-muted);
1779
+ font-family: var(--pxd-type-label-default-family);
1780
+ font-size: var(--pxd-type-label-default-size);
1781
+ text-align: left;
1782
+ cursor: pointer;
1783
+ }
1784
+ .pxd-nav-item:hover {
1785
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), transparent);
1786
+ }
1787
+ .pxd-nav-current {
1788
+ border-left-color: var(--pxd-color-action-primary-background);
1789
+ background: var(--pxd-color-surface-subtle);
1790
+ color: var(--pxd-color-text-default);
1791
+ font-weight: 600;
1792
+ }
1793
+ .pxd-nav-label {
1794
+ flex: 1;
1795
+ }
1796
+ .pxd-nav-badge {
1797
+ flex: none;
1798
+ min-width: 20px;
1799
+ padding: 0 6px;
1800
+ border-radius: var(--pxd-radius-full);
1801
+ background: var(--pxd-color-status-danger-background);
1802
+ color: var(--pxd-color-status-danger-foreground);
1803
+ font-size: var(--pxd-type-label-small-size);
1804
+ text-align: center;
1805
+ font-variant-numeric: tabular-nums;
1806
+ }
1807
+ .pxd-nav-drawer {
1808
+ position: fixed;
1809
+ left: 0;
1810
+ top: 0;
1811
+ bottom: 0;
1812
+ z-index: 11;
1813
+ width: min(20rem, 85%);
1814
+ padding-bottom: var(--pxd-space-inset-default);
1815
+ overflow-y: auto;
1816
+ background: var(--pxd-color-surface-overlay);
1817
+ box-shadow: var(--pxd-shadow-overlay);
1818
+ }
1819
+
1820
+ /* Page header: where you are, what state it's in, what you can do. */
1821
+ .pxd-page-header {
1822
+ display: flex;
1823
+ flex-direction: column;
1824
+ gap: var(--pxd-space-stack-tight);
1825
+ }
1826
+ .pxd-breadcrumbs ol {
1827
+ display: flex;
1828
+ flex-wrap: wrap;
1829
+ gap: var(--pxd-space-inline-default);
1830
+ margin: 0;
1831
+ padding: 0;
1832
+ list-style: none;
1833
+ font-size: var(--pxd-type-body-small-size);
1834
+ color: var(--pxd-color-text-muted);
1835
+ }
1836
+ .pxd-breadcrumbs li + li::before {
1837
+ content: "/";
1838
+ margin-right: var(--pxd-space-inline-default);
1839
+ color: var(--pxd-color-text-muted);
1840
+ }
1841
+ .pxd-page-header-main {
1842
+ display: flex;
1843
+ align-items: center;
1844
+ gap: var(--pxd-space-inline-default);
1845
+ flex-wrap: wrap;
1846
+ }
1847
+ .pxd-page-header-text {
1848
+ flex: 1;
1849
+ min-width: 12rem;
1850
+ }
1851
+ .pxd-page-header-text .pxd-surface-title {
1852
+ display: flex;
1853
+ align-items: center;
1854
+ gap: var(--pxd-space-inline-default);
1855
+ flex-wrap: wrap;
1856
+ margin: 0;
1857
+ }
1858
+ .pxd-surface-subtitle {
1859
+ margin: var(--pxd-space-stack-tight) 0 0;
1860
+ color: var(--pxd-color-text-muted);
1861
+ }
1862
+ .pxd-page-header-actions {
1863
+ flex: none;
1864
+ }
1865
+ .pxd-link {
1866
+ border: 0;
1867
+ padding: 0;
1868
+ background: none;
1869
+ color: var(--pxd-color-text-link);
1870
+ font: inherit;
1871
+ text-align: left;
1872
+ text-decoration: underline;
1873
+ cursor: pointer;
1874
+ }
1875
+
1876
+ /* A surface that opens beside what it came from. */
1877
+ .pxd-surface-panel {
1878
+ height: 100%;
1879
+ border-left: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1880
+ background: var(--pxd-color-surface-default);
1881
+ }
1882
+
1883
+ /* Table: toolbar, saved views, sorting, selection, paging. */
1884
+ .pxd-table-wrap {
1885
+ display: flex;
1886
+ flex-direction: column;
1887
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1888
+ border-radius: var(--pxd-radius-default);
1889
+ overflow: hidden;
1890
+ }
1891
+ .pxd-table-views {
1892
+ display: flex;
1893
+ flex-wrap: wrap;
1894
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1895
+ background: var(--pxd-color-surface-default);
1896
+ }
1897
+ .pxd-table-view {
1898
+ display: inline-flex;
1899
+ align-items: center;
1900
+ gap: var(--pxd-space-inline-default);
1901
+ min-height: var(--polyxd-control);
1902
+ padding: 0 var(--pxd-space-inset-compact);
1903
+ border: 0;
1904
+ border-bottom: 2px solid transparent;
1905
+ background: transparent;
1906
+ color: var(--pxd-color-text-muted);
1907
+ font-family: var(--pxd-type-label-default-family);
1908
+ font-size: var(--pxd-type-label-default-size);
1909
+ cursor: pointer;
1910
+ }
1911
+ .pxd-table-view-current {
1912
+ border-bottom-color: var(--pxd-color-action-primary-background);
1913
+ color: var(--pxd-color-text-default);
1914
+ font-weight: 600;
1915
+ }
1916
+ .pxd-views-tab .pxd-views-count {
1917
+ margin-left: var(--pxd-space-inline-default);
1918
+ }
1919
+ .pxd-views-count {
1920
+ font-size: var(--pxd-type-label-small-size);
1921
+ color: var(--pxd-color-text-muted);
1922
+ font-variant-numeric: tabular-nums;
1923
+ }
1924
+ .pxd-table-toolbar {
1925
+ display: flex;
1926
+ align-items: center;
1927
+ gap: var(--pxd-space-inline-default);
1928
+ padding: var(--pxd-space-inline-default);
1929
+ background: var(--pxd-color-surface-subtle);
1930
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1931
+ }
1932
+ .pxd-table-toolbar > .pxd-field {
1933
+ flex: 1;
1934
+ min-width: 0;
1935
+ max-width: 24rem;
1936
+ }
1937
+ .pxd-table-toolbar-spacer {
1938
+ flex: 1;
1939
+ }
1940
+ .pxd-table-bulk {
1941
+ background: var(--pxd-color-selection-background);
1942
+ color: var(--pxd-color-selection-foreground);
1943
+ }
1944
+ .pxd-bulk-count {
1945
+ margin: 0;
1946
+ flex: 1;
1947
+ font-weight: 600;
1948
+ }
1949
+ .pxd-table-bulk .pxd-button-tertiary {
1950
+ color: inherit;
1951
+ border-color: currentColor;
1952
+ }
1953
+ .pxd-table-scroll {
1954
+ overflow-x: auto;
1955
+ }
1956
+ .pxd-table th,
1957
+ .pxd-table td {
1958
+ height: var(--polyxd-row-height);
1959
+ padding: 0 var(--polyxd-row-pad);
1960
+ }
1961
+ .pxd-table thead th {
1962
+ background: var(--pxd-color-surface-subtle);
1963
+ white-space: nowrap;
1964
+ }
1965
+ .pxd-sort {
1966
+ display: inline-flex;
1967
+ align-items: center;
1968
+ gap: 6px;
1969
+ min-height: var(--polyxd-control);
1970
+ border: 0;
1971
+ padding: 0;
1972
+ background: none;
1973
+ color: inherit;
1974
+ font: inherit;
1975
+ font-weight: 600;
1976
+ cursor: pointer;
1977
+ }
1978
+ .pxd-table-select {
1979
+ width: 3rem;
1980
+ }
1981
+ .pxd-checkbox {
1982
+ display: inline-flex;
1983
+ align-items: center;
1984
+ justify-content: center;
1985
+ width: 24px;
1986
+ height: 24px;
1987
+ border: var(--pxd-border-width-strong) solid var(--pxd-color-border-strong);
1988
+ border-radius: var(--pxd-radius-small);
1989
+ background: var(--pxd-color-surface-default);
1990
+ color: var(--pxd-color-action-primary-foreground);
1991
+ cursor: pointer;
1992
+ }
1993
+ .pxd-checkbox[data-state="checked"],
1994
+ .pxd-checkbox[data-state="indeterminate"] {
1995
+ border-color: var(--pxd-color-action-primary-background);
1996
+ background: var(--pxd-color-action-primary-background);
1997
+ }
1998
+ /* Selected rows are marked at the edge, not tinted: link text is only guaranteed
1999
+ readable on the default surface. */
2000
+ .pxd-row-selected > :first-child {
2001
+ box-shadow: inset calc(var(--pxd-border-width-strong) + 1px) 0 0 0 var(--pxd-color-action-primary-background);
2002
+ }
2003
+ .pxd-entity {
2004
+ display: flex;
2005
+ align-items: center;
2006
+ gap: var(--pxd-space-inline-default);
2007
+ }
2008
+ /* In a dense row, the whole row height is the target (WCAG 2.5.8 asks for 24px). */
2009
+ .pxd-table .pxd-link,
2010
+ .pxd-row-item .pxd-link {
2011
+ display: flex;
2012
+ align-items: center;
2013
+ min-height: max(var(--polyxd-row-height), 24px);
2014
+ }
2015
+ .pxd-row-item .pxd-link {
2016
+ min-height: var(--polyxd-control);
2017
+ }
2018
+ .pxd-entity-text {
2019
+ display: flex;
2020
+ flex-direction: column;
2021
+ }
2022
+ .pxd-entity-name {
2023
+ font-weight: 500;
2024
+ }
2025
+ .pxd-entity-secondary {
2026
+ font-size: var(--pxd-type-body-small-size);
2027
+ color: var(--pxd-color-text-muted);
2028
+ }
2029
+ .pxd-paging {
2030
+ display: flex;
2031
+ align-items: center;
2032
+ gap: var(--pxd-space-inline-loose);
2033
+ padding: 0 var(--pxd-space-inline-default);
2034
+ min-height: var(--polyxd-control);
2035
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2036
+ background: var(--pxd-color-surface-subtle);
2037
+ font-size: var(--pxd-type-body-small-size);
2038
+ flex-wrap: wrap;
2039
+ }
2040
+ .pxd-paging-size {
2041
+ display: inline-flex;
2042
+ align-items: center;
2043
+ gap: var(--pxd-space-inline-default);
2044
+ color: var(--pxd-color-text-muted);
2045
+ }
2046
+ .pxd-paging-size select {
2047
+ min-height: var(--polyxd-control);
2048
+ border: 0;
2049
+ background: transparent;
2050
+ color: var(--pxd-color-text-default);
2051
+ font: inherit;
2052
+ }
2053
+ .pxd-paging-range {
2054
+ margin: 0;
2055
+ flex: 1;
2056
+ font-variant-numeric: tabular-nums;
2057
+ }
2058
+ .pxd-paging-controls {
2059
+ display: flex;
2060
+ align-items: center;
2061
+ gap: var(--pxd-space-inline-default);
2062
+ }
2063
+ .pxd-paging-page {
2064
+ font-variant-numeric: tabular-nums;
2065
+ color: var(--pxd-color-text-muted);
2066
+ }
2067
+ .pxd-icon-button:disabled {
2068
+ opacity: var(--pxd-opacity-state-disabled);
2069
+ cursor: default;
2070
+ }
2071
+
2072
+ /* Row actions menu. */
2073
+ .pxd-menu {
2074
+ z-index: 12;
2075
+ min-width: 12rem;
2076
+ padding: var(--pxd-space-inline-tight);
2077
+ border-radius: var(--pxd-radius-default);
2078
+ background: var(--pxd-color-surface-overlay);
2079
+ box-shadow: var(--pxd-shadow-overlay);
2080
+ }
2081
+ .pxd-menu-item {
2082
+ display: flex;
2083
+ align-items: center;
2084
+ min-height: var(--polyxd-control);
2085
+ padding: 0 var(--pxd-space-inset-compact);
2086
+ border-radius: var(--pxd-radius-small);
2087
+ color: var(--pxd-color-text-default);
2088
+ cursor: pointer;
2089
+ }
2090
+ .pxd-menu-item[data-highlighted] {
2091
+ background: var(--pxd-color-surface-subtle);
2092
+ outline: none;
2093
+ }
2094
+ .pxd-menu-item-danger {
2095
+ color: var(--pxd-color-status-danger-foreground);
2096
+ }
2097
+
2098
+ /* A table on a phone: rows, not columns. */
2099
+ .pxd-row-list {
2100
+ list-style: none;
2101
+ margin: 0;
2102
+ padding: 0;
2103
+ }
2104
+ .pxd-row-item {
2105
+ display: flex;
2106
+ align-items: center;
2107
+ gap: var(--pxd-space-inline-default);
2108
+ padding: var(--pxd-space-inline-default) var(--pxd-space-inset-compact);
2109
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2110
+ }
2111
+ .pxd-row-main {
2112
+ flex: 1;
2113
+ min-width: 0;
2114
+ }
2115
+ .pxd-row-details {
2116
+ margin: 2px 0 0;
2117
+ font-size: var(--pxd-type-body-small-size);
2118
+ color: var(--pxd-color-text-muted);
2119
+ }
2120
+
2121
+ /* Record pages: a grid of short fields, activity as a timeline, notices inside the page. */
2122
+ .pxd-detail-grid dl {
2123
+ display: grid;
2124
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
2125
+ gap: var(--pxd-space-stack-default) var(--pxd-space-inline-loose);
2126
+ }
2127
+ .pxd-detail-grid .pxd-detail-row {
2128
+ display: flex;
2129
+ flex-direction: column;
2130
+ gap: 2px;
2131
+ padding: 0;
2132
+ border: 0;
2133
+ }
2134
+ .pxd-detail-grid dt {
2135
+ font-size: var(--pxd-type-label-small-size);
2136
+ color: var(--pxd-color-text-muted);
2137
+ }
2138
+ .pxd-timeline .pxd-collection-item {
2139
+ position: relative;
2140
+ padding-left: var(--pxd-space-inset-default);
2141
+ border-left: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2142
+ }
2143
+ .pxd-timeline .pxd-collection-item::before {
2144
+ content: "";
2145
+ position: absolute;
2146
+ left: -5px;
2147
+ top: 10px;
2148
+ width: 8px;
2149
+ height: 8px;
2150
+ border-radius: var(--pxd-radius-full);
2151
+ background: var(--pxd-color-border-strong);
2152
+ }
2153
+ .pxd-status-notice {
2154
+ align-items: center;
2155
+ border-radius: 0;
2156
+ border-left: 4px solid var(--pxd-color-status-warning-emphasis);
2157
+ }
2158
+ .pxd-status-notice .pxd-status-body {
2159
+ flex: 1;
2160
+ }
2161
+ .pxd-status-notice .pxd-status-action {
2162
+ margin: 0;
2163
+ }
2164
+ .pxd-status-error.pxd-status-notice {
2165
+ border-left-color: var(--pxd-color-status-danger-emphasis);
2166
+ }
2167
+ .pxd-status-info.pxd-status-notice {
2168
+ border-left-color: var(--pxd-color-status-info-emphasis);
2169
+ }
2170
+
2171
+ /* Settings-style forms: label and help on the left, control on the right. */
2172
+ @container pxd (width >= 48rem) {
2173
+ .pxd-form-horizontal .pxd-field {
2174
+ display: grid;
2175
+ grid-template-columns: minmax(12rem, 18rem) minmax(0, 1fr);
2176
+ gap: var(--pxd-space-inline-loose);
2177
+ align-items: start;
2178
+ padding-bottom: var(--pxd-space-stack-default);
2179
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2180
+ }
2181
+ .pxd-form-horizontal .pxd-field > .pxd-field-label,
2182
+ .pxd-form-horizontal .pxd-field > .pxd-field-help {
2183
+ grid-column: 1;
2184
+ }
2185
+ .pxd-form-horizontal .pxd-field > :not(.pxd-field-label):not(.pxd-field-help) {
2186
+ grid-column: 2;
2187
+ grid-row: 1 / span 2;
2188
+ }
2189
+ }
2190
+
2191
+ /* A strip of numbers: three or four tiles across, stacked on phones. */
2192
+ .pxd-metric-row {
2193
+ display: grid;
2194
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
2195
+ gap: var(--pxd-space-inline-default);
2196
+ }
2197
+ .pxd-metric-row .pxd-metric {
2198
+ padding: var(--pxd-space-inset-default);
2199
+ background: var(--pxd-color-surface-subtle);
2200
+ border-radius: var(--pxd-radius-default);
2201
+ }
2202
+
2203
+ /* ==== Design-system survey: variants added to existing components (2026-09) ==== */
2204
+
2205
+ /* Text: rich, list, quote, colour swatches */
2206
+ .pxd-text-rich code {
2207
+ font-family: var(--pxd-type-numeric-display-family);
2208
+ font-size: 0.9em;
2209
+ padding: 0 var(--pxd-space-inline-tight);
2210
+ border-radius: var(--pxd-radius-small);
2211
+ background: var(--pxd-color-surface-subtle);
2212
+ }
2213
+ .pxd-text-rich a {
2214
+ color: var(--pxd-color-text-link);
2215
+ text-decoration: underline;
2216
+ }
2217
+ .pxd-text-list {
2218
+ display: flex;
2219
+ flex-direction: column;
2220
+ gap: var(--pxd-space-stack-tight);
2221
+ max-width: var(--pxd-measure-max);
2222
+ }
2223
+ .pxd-text-list-items {
2224
+ display: flex;
2225
+ flex-direction: column;
2226
+ gap: var(--pxd-space-stack-tight);
2227
+ padding-left: 1.25em;
2228
+ list-style: disc;
2229
+ }
2230
+ .pxd-text-list-ordered {
2231
+ list-style: decimal;
2232
+ }
2233
+ .pxd-text-quote {
2234
+ display: flex;
2235
+ flex-direction: column;
2236
+ gap: var(--pxd-space-stack-tight);
2237
+ padding-left: var(--pxd-space-inset-default);
2238
+ border-left: var(--pxd-border-width-strong) solid var(--pxd-color-border-strong);
2239
+ max-width: var(--pxd-measure-max);
2240
+ }
2241
+ .pxd-text-quote blockquote {
2242
+ margin: 0;
2243
+ font-style: italic;
2244
+ }
2245
+ .pxd-text-cite {
2246
+ color: var(--pxd-color-text-muted);
2247
+ font-size: var(--pxd-type-body-small-size);
2248
+ }
2249
+ .pxd-text-cite::before {
2250
+ content: "— ";
2251
+ }
2252
+ .pxd-swatch {
2253
+ display: inline-block;
2254
+ width: 1em;
2255
+ height: 1em;
2256
+ margin-right: var(--pxd-space-inline-tight);
2257
+ vertical-align: -0.15em;
2258
+ border-radius: var(--pxd-radius-small);
2259
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2260
+ }
2261
+ .pxd-swatch-unknown {
2262
+ background: repeating-linear-gradient(45deg, var(--pxd-color-border-default) 0 2px, transparent 2px 4px);
2263
+ }
2264
+ .pxd-color-value {
2265
+ display: inline-flex;
2266
+ align-items: center;
2267
+ }
2268
+
2269
+ /* DetailList: the Change link per row */
2270
+ .pxd-detail-actions .pxd-detail-row {
2271
+ display: grid;
2272
+ grid-template-columns: minmax(8rem, 1fr) 2fr auto;
2273
+ align-items: baseline;
2274
+ gap: var(--pxd-space-inline-default);
2275
+ }
2276
+ .pxd-detail-row-action {
2277
+ text-align: end;
2278
+ }
2279
+ /* A link-styled button still needs a full-size target; padding keeps the text on the baseline. */
2280
+ .pxd-detail-change {
2281
+ white-space: nowrap;
2282
+ display: inline-flex;
2283
+ align-items: center;
2284
+ min-height: var(--pxd-size-target-min);
2285
+ margin: calc((var(--pxd-size-target-min) - 1.5em) / -2) 0;
2286
+ }
2287
+ .pxd-detail-actions .pxd-detail-row {
2288
+ align-items: center;
2289
+ }
2290
+
2291
+ /* Collection: carousel */
2292
+ .pxd-carousel {
2293
+ display: flex;
2294
+ flex-direction: column;
2295
+ gap: var(--pxd-space-stack-tight);
2296
+ }
2297
+ .pxd-carousel-track {
2298
+ flex-direction: row;
2299
+ gap: var(--pxd-space-inline-default);
2300
+ overflow-x: auto;
2301
+ scroll-snap-type: x mandatory;
2302
+ scroll-padding: 0;
2303
+ padding-bottom: var(--pxd-space-stack-tight);
2304
+ scrollbar-width: thin;
2305
+ }
2306
+ .pxd-carousel-track > .pxd-collection-item {
2307
+ flex: 0 0 min(80%, 20rem);
2308
+ scroll-snap-align: start;
2309
+ }
2310
+ .pxd-carousel-controls {
2311
+ display: flex;
2312
+ align-items: center;
2313
+ justify-content: center;
2314
+ gap: var(--pxd-space-inline-default);
2315
+ }
2316
+ .pxd-carousel-position {
2317
+ color: var(--pxd-color-text-muted);
2318
+ font-size: var(--pxd-type-body-small-size);
2319
+ font-variant-numeric: tabular-nums;
2320
+ }
2321
+
2322
+ /* Collection: calendar */
2323
+ .pxd-calendar {
2324
+ display: flex;
2325
+ flex-direction: column;
2326
+ gap: var(--pxd-space-stack-tight);
2327
+ }
2328
+ .pxd-calendar-header {
2329
+ display: flex;
2330
+ align-items: center;
2331
+ justify-content: space-between;
2332
+ gap: var(--pxd-space-inline-default);
2333
+ }
2334
+ .pxd-calendar-month {
2335
+ font-family: var(--pxd-type-title-item-family);
2336
+ font-size: var(--pxd-type-title-item-size);
2337
+ font-weight: var(--pxd-type-title-item-weight);
2338
+ }
2339
+ .pxd-calendar-grid {
2340
+ width: 100%;
2341
+ table-layout: fixed;
2342
+ border-collapse: collapse;
2343
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2344
+ }
2345
+ .pxd-calendar-grid th {
2346
+ padding: var(--pxd-space-inset-compact);
2347
+ color: var(--pxd-color-text-muted);
2348
+ font-size: var(--pxd-type-label-small-size);
2349
+ font-weight: var(--pxd-type-label-small-weight);
2350
+ text-align: start;
2351
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2352
+ }
2353
+ .pxd-calendar-grid td {
2354
+ vertical-align: top;
2355
+ min-height: 5rem;
2356
+ height: 5rem;
2357
+ padding: var(--pxd-space-inset-compact);
2358
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2359
+ }
2360
+ .pxd-calendar-empty {
2361
+ background: var(--pxd-color-surface-subtle);
2362
+ }
2363
+ .pxd-calendar-date {
2364
+ display: block;
2365
+ font-size: var(--pxd-type-label-small-size);
2366
+ color: var(--pxd-color-text-muted);
2367
+ font-variant-numeric: tabular-nums;
2368
+ }
2369
+ .pxd-calendar-has-items .pxd-calendar-date {
2370
+ color: var(--pxd-color-text-default);
2371
+ font-weight: 600;
2372
+ }
2373
+ .pxd-calendar-items {
2374
+ display: flex;
2375
+ flex-direction: column;
2376
+ gap: var(--pxd-space-stack-tight);
2377
+ margin-top: var(--pxd-space-stack-tight);
2378
+ font-size: var(--pxd-type-body-small-size);
2379
+ }
2380
+ .pxd-calendar-items .pxd-collection-item {
2381
+ gap: var(--pxd-space-inline-tight);
2382
+ }
2383
+
2384
+ /* Collection: reordering */
2385
+ .pxd-collection-reorder {
2386
+ display: flex;
2387
+ flex-direction: column;
2388
+ align-items: center;
2389
+ gap: 0;
2390
+ flex: none;
2391
+ }
2392
+ .pxd-collection-handle {
2393
+ display: inline-flex;
2394
+ color: var(--pxd-color-text-muted);
2395
+ cursor: grab;
2396
+ padding: var(--pxd-space-inset-compact) 0;
2397
+ }
2398
+ .pxd-collection-move {
2399
+ min-height: 0;
2400
+ height: 1.5rem;
2401
+ width: 1.5rem;
2402
+ }
2403
+ .pxd-collection-reorderable > .pxd-collection-item {
2404
+ padding: var(--pxd-space-inset-compact);
2405
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2406
+ border-radius: var(--pxd-radius-default);
2407
+ background: var(--pxd-color-surface-default);
2408
+ }
2409
+ .pxd-collection-dragging {
2410
+ opacity: var(--pxd-opacity-state-disabled);
2411
+ }
2412
+
2413
+ /* Media: players, gallery, QR */
2414
+ .pxd-media-player {
2415
+ display: flex;
2416
+ flex-direction: column;
2417
+ gap: var(--pxd-space-stack-tight);
2418
+ }
2419
+ video.pxd-media {
2420
+ width: 100%;
2421
+ background: var(--pxd-color-surface-subtle);
2422
+ }
2423
+ .pxd-media-audio-player {
2424
+ width: 100%;
2425
+ }
2426
+ .pxd-media-audio-placeholder {
2427
+ height: var(--pxd-size-target-min);
2428
+ border-radius: var(--pxd-radius-full);
2429
+ background: var(--pxd-color-surface-subtle);
2430
+ }
2431
+ .pxd-media-caption {
2432
+ color: var(--pxd-color-text-muted);
2433
+ font-size: var(--pxd-type-body-small-size);
2434
+ }
2435
+ .pxd-media-transcript summary {
2436
+ color: var(--pxd-color-text-link);
2437
+ cursor: pointer;
2438
+ font-size: var(--pxd-type-body-small-size);
2439
+ }
2440
+ .pxd-media-transcript p {
2441
+ margin-top: var(--pxd-space-stack-tight);
2442
+ max-width: var(--pxd-measure-max);
2443
+ white-space: pre-wrap;
2444
+ }
2445
+ .pxd-gallery {
2446
+ display: grid;
2447
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
2448
+ gap: var(--pxd-space-inline-default);
2449
+ }
2450
+ .pxd-gallery-image {
2451
+ width: 100%;
2452
+ border-radius: var(--pxd-radius-default);
2453
+ }
2454
+ .pxd-gallery .pxd-media-auto {
2455
+ aspect-ratio: 1;
2456
+ object-fit: cover;
2457
+ }
2458
+ .pxd-qr {
2459
+ display: block;
2460
+ width: min(100%, 15rem);
2461
+ height: auto;
2462
+ image-rendering: pixelated;
2463
+ border-radius: var(--pxd-radius-default);
2464
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2465
+ }
2466
+ .pxd-qr-placeholder {
2467
+ display: flex;
2468
+ flex-direction: column;
2469
+ align-items: center;
2470
+ justify-content: center;
2471
+ gap: var(--pxd-space-stack-tight);
2472
+ aspect-ratio: 1;
2473
+ padding: var(--pxd-space-inset-default);
2474
+ background: var(--pxd-color-surface-subtle);
2475
+ color: var(--pxd-color-text-muted);
2476
+ text-align: center;
2477
+ }
2478
+ .pxd-qr-mark {
2479
+ font-family: var(--pxd-type-title-section-family);
2480
+ font-size: var(--pxd-type-title-section-size);
2481
+ font-weight: var(--pxd-type-title-section-weight);
2482
+ letter-spacing: 0.2em;
2483
+ }
2484
+ .pxd-qr-text {
2485
+ font-size: var(--pxd-type-body-small-size);
2486
+ word-break: break-all;
2487
+ }
2488
+
2489
+ /* Table: expandable rows */
2490
+ .pxd-table-expand {
2491
+ width: 2.5rem;
2492
+ }
2493
+ .pxd-table-expander {
2494
+ min-height: 0;
2495
+ height: 2rem;
2496
+ width: 2rem;
2497
+ }
2498
+ .pxd-table-detail > td {
2499
+ padding: var(--pxd-space-inset-default) var(--pxd-space-inset-default) var(--pxd-space-inset-default) 2.5rem;
2500
+ background: var(--pxd-color-surface-subtle);
2501
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2502
+ }
2503
+ .pxd-row-detail {
2504
+ flex-basis: 100%;
2505
+ padding: var(--pxd-space-inset-default);
2506
+ background: var(--pxd-color-surface-subtle);
2507
+ border-radius: var(--pxd-radius-default);
2508
+ }
2509
+ .pxd-row-item {
2510
+ flex-wrap: wrap;
2511
+ }
2512
+
2513
+ /* TextInput: suggestions and mentions */
2514
+ .pxd-combobox {
2515
+ position: relative;
2516
+ }
2517
+ .pxd-combobox-list {
2518
+ position: absolute;
2519
+ z-index: 2;
2520
+ inset-inline: 0;
2521
+ top: calc(100% + var(--pxd-space-stack-tight));
2522
+ max-height: 16rem;
2523
+ overflow-y: auto;
2524
+ padding: var(--pxd-space-inset-compact);
2525
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2526
+ border-radius: var(--pxd-radius-default);
2527
+ background: var(--pxd-color-surface-overlay);
2528
+ box-shadow: var(--pxd-shadow-overlay);
2529
+ }
2530
+ .pxd-combobox-option {
2531
+ display: flex;
2532
+ flex-direction: column;
2533
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-default);
2534
+ border-radius: var(--pxd-radius-small);
2535
+ cursor: pointer;
2536
+ }
2537
+ .pxd-combobox-active,
2538
+ .pxd-combobox-option:hover {
2539
+ background: var(--pxd-color-selection-background);
2540
+ color: var(--pxd-color-selection-foreground);
2541
+ }
2542
+
2543
+ /* TextInput: tags (and several dates) */
2544
+ .pxd-tags {
2545
+ display: flex;
2546
+ flex-wrap: wrap;
2547
+ align-items: center;
2548
+ gap: var(--pxd-space-inline-tight);
2549
+ min-height: var(--pxd-size-target-min);
2550
+ padding: var(--pxd-space-inset-compact);
2551
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
2552
+ border-radius: var(--pxd-radius-control);
2553
+ background: var(--pxd-color-surface-default);
2554
+ }
2555
+ .pxd-tags:focus-within {
2556
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
2557
+ outline-offset: var(--pxd-focus-ring-offset);
2558
+ }
2559
+ .pxd-tags-list {
2560
+ display: flex;
2561
+ flex-wrap: wrap;
2562
+ gap: var(--pxd-space-inline-tight);
2563
+ }
2564
+ .pxd-tag-chip {
2565
+ display: inline-flex;
2566
+ align-items: center;
2567
+ gap: var(--pxd-space-inline-tight);
2568
+ padding: 2px var(--pxd-space-inline-tight) 2px var(--pxd-space-inline-default);
2569
+ border-radius: var(--pxd-radius-full);
2570
+ background: var(--pxd-color-selection-background);
2571
+ color: var(--pxd-color-selection-foreground);
2572
+ font-size: var(--pxd-type-label-default-size);
2573
+ }
2574
+ .pxd-tag-remove {
2575
+ display: inline-flex;
2576
+ padding: 2px;
2577
+ border: 0;
2578
+ border-radius: var(--pxd-radius-full);
2579
+ background: none;
2580
+ color: inherit;
2581
+ cursor: pointer;
2582
+ }
2583
+ .pxd-tags-input {
2584
+ flex: 1;
2585
+ min-width: 8rem;
2586
+ border: 0;
2587
+ padding: var(--pxd-space-inset-compact);
2588
+ background: none;
2589
+ }
2590
+ .pxd-tags-input:focus-visible {
2591
+ outline: none;
2592
+ }
2593
+ .pxd-date-multiple {
2594
+ display: flex;
2595
+ flex-direction: column;
2596
+ gap: var(--pxd-space-stack-tight);
2597
+ }
2598
+ .pxd-date-add {
2599
+ display: block;
2600
+ }
2601
+
2602
+ /* TextInput: rich text */
2603
+ .pxd-richtext {
2604
+ display: flex;
2605
+ flex-direction: column;
2606
+ gap: var(--pxd-space-stack-tight);
2607
+ }
2608
+ .pxd-richtext-toolbar {
2609
+ display: flex;
2610
+ gap: var(--pxd-space-inline-tight);
2611
+ }
2612
+ .pxd-richtext-control {
2613
+ display: inline-flex;
2614
+ align-items: center;
2615
+ justify-content: center;
2616
+ width: 2rem;
2617
+ height: 2rem;
2618
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2619
+ border-radius: var(--pxd-radius-small);
2620
+ background: var(--pxd-color-surface-default);
2621
+ cursor: pointer;
2622
+ }
2623
+ .pxd-richtext-control:hover {
2624
+ background: var(--pxd-color-surface-subtle);
2625
+ }
2626
+ .pxd-richtext-area {
2627
+ min-height: 6rem;
2628
+ white-space: pre-wrap;
2629
+ }
2630
+ .pxd-richtext-area :is(ul, ol) {
2631
+ padding-left: 1.25em;
2632
+ list-style: disc;
2633
+ }
2634
+ .pxd-richtext-area ol {
2635
+ list-style: decimal;
2636
+ }
2637
+
2638
+ /* TextInput: code, masked, year, inline */
2639
+ .pxd-input-code,
2640
+ .pxd-input-masked {
2641
+ font-family: var(--pxd-type-numeric-display-family);
2642
+ font-variant-numeric: tabular-nums;
2643
+ }
2644
+ .pxd-input-code {
2645
+ white-space: pre;
2646
+ overflow-x: auto;
2647
+ }
2648
+ .pxd-input-year {
2649
+ width: 6rem;
2650
+ }
2651
+ .pxd-inline-edit {
2652
+ display: flex;
2653
+ flex-direction: column;
2654
+ gap: var(--pxd-space-stack-tight);
2655
+ }
2656
+ .pxd-inline-value {
2657
+ display: inline-flex;
2658
+ align-items: center;
2659
+ gap: var(--pxd-space-inline-default);
2660
+ min-height: var(--pxd-size-target-min);
2661
+ padding: var(--pxd-space-inset-compact);
2662
+ margin: 0 calc(-1 * var(--pxd-space-inset-compact));
2663
+ border: var(--pxd-border-width-default) solid transparent;
2664
+ border-radius: var(--pxd-radius-control);
2665
+ background: none;
2666
+ text-align: start;
2667
+ cursor: text;
2668
+ }
2669
+ .pxd-inline-value:hover {
2670
+ border-color: var(--pxd-color-border-default);
2671
+ background: var(--pxd-color-surface-subtle);
2672
+ }
2673
+ .pxd-inline-empty {
2674
+ color: var(--pxd-color-text-muted);
2675
+ }
2676
+ .pxd-inline-hint {
2677
+ color: var(--pxd-color-text-link);
2678
+ font-size: var(--pxd-type-label-small-size);
2679
+ }
2680
+
2681
+ /* Action: a described (two-line) button */
2682
+ .pxd-button-described {
2683
+ flex-direction: column;
2684
+ align-items: flex-start;
2685
+ gap: 0;
2686
+ text-align: start;
2687
+ }
2688
+ .pxd-button-description {
2689
+ color: var(--pxd-color-text-muted);
2690
+ font-size: var(--pxd-type-body-small-size);
2691
+ font-weight: var(--pxd-type-body-default-weight);
2692
+ }
2693
+ .pxd-button-primary .pxd-button-description {
2694
+ color: inherit;
2695
+ opacity: var(--pxd-opacity-state-hover);
2696
+ }
2697
+
2698
+ /* Steps: task list and guide */
2699
+ .pxd-tasklist-list {
2700
+ display: flex;
2701
+ flex-direction: column;
2702
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2703
+ }
2704
+ .pxd-task {
2705
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2706
+ }
2707
+ .pxd-task-row {
2708
+ display: flex;
2709
+ align-items: center;
2710
+ justify-content: space-between;
2711
+ gap: var(--pxd-space-inline-default);
2712
+ min-height: var(--pxd-size-target-min);
2713
+ padding: var(--pxd-space-inset-compact) 0;
2714
+ }
2715
+ .pxd-task-title {
2716
+ flex: 1;
2717
+ min-height: var(--pxd-size-target-min);
2718
+ padding: var(--pxd-space-inset-compact) 0;
2719
+ border: 0;
2720
+ background: none;
2721
+ color: var(--pxd-color-text-link);
2722
+ text-align: start;
2723
+ text-decoration: underline;
2724
+ cursor: pointer;
2725
+ }
2726
+ .pxd-task-title:disabled {
2727
+ color: var(--pxd-color-text-muted);
2728
+ text-decoration: none;
2729
+ cursor: default;
2730
+ }
2731
+ .pxd-task-content {
2732
+ padding: 0 0 var(--pxd-space-inset-default);
2733
+ }
2734
+ .pxd-guide-list {
2735
+ display: flex;
2736
+ flex-direction: column;
2737
+ gap: var(--pxd-space-stack-loose);
2738
+ }
2739
+ .pxd-guide-step {
2740
+ display: flex;
2741
+ gap: var(--pxd-space-inline-default);
2742
+ }
2743
+ .pxd-guide-number {
2744
+ flex: none;
2745
+ display: inline-flex;
2746
+ align-items: center;
2747
+ justify-content: center;
2748
+ width: 2rem;
2749
+ height: 2rem;
2750
+ border-radius: var(--pxd-radius-full);
2751
+ background: var(--pxd-color-action-primary-background);
2752
+ color: var(--pxd-color-action-primary-foreground);
2753
+ font-weight: 600;
2754
+ font-variant-numeric: tabular-nums;
2755
+ }
2756
+ .pxd-guide-body {
2757
+ flex: 1;
2758
+ min-width: 0;
2759
+ display: flex;
2760
+ flex-direction: column;
2761
+ gap: var(--pxd-space-stack-tight);
2762
+ }
2763
+ .pxd-guide-title {
2764
+ font-family: var(--pxd-type-title-item-family);
2765
+ font-size: var(--pxd-type-title-item-size);
2766
+ font-weight: var(--pxd-type-title-item-weight);
2767
+ }
2768
+
2769
+ /* Chart: scatter, range, matrix, treemap, flow */
2770
+ .pxd-chart-range-label,
2771
+ .pxd-chart-flow-label {
2772
+ fill: var(--pxd-color-text-default);
2773
+ font-size: 12px;
2774
+ }
2775
+ .pxd-chart-tile-label {
2776
+ fill: var(--pxd-color-action-primary-foreground);
2777
+ font-size: 12px;
2778
+ font-weight: 600;
2779
+ }
2780
+ .pxd-heatmap-scroll {
2781
+ overflow-x: auto;
2782
+ }
2783
+ .pxd-heatmap {
2784
+ border-collapse: separate;
2785
+ border-spacing: 2px;
2786
+ width: 100%;
2787
+ }
2788
+ .pxd-heatmap th {
2789
+ padding: var(--pxd-space-inset-compact);
2790
+ color: var(--pxd-color-text-muted);
2791
+ font-size: var(--pxd-type-label-small-size);
2792
+ font-weight: var(--pxd-type-label-small-weight);
2793
+ text-align: start;
2794
+ }
2795
+ .pxd-heatmap-cell {
2796
+ padding: var(--pxd-space-inset-compact);
2797
+ border-radius: var(--pxd-radius-small);
2798
+ text-align: end;
2799
+ font-variant-numeric: tabular-nums;
2800
+ font-size: var(--pxd-type-body-small-size);
2801
+ }
2802
+ .pxd-heatmap-strong {
2803
+ color: var(--pxd-color-action-primary-foreground);
2804
+ }
2805
+
2806
+ /* Navigation: breadcrumb, nested, toc, local */
2807
+ .pxd-nav-breadcrumb ol {
2808
+ display: flex;
2809
+ flex-wrap: wrap;
2810
+ align-items: center;
2811
+ gap: var(--pxd-space-inline-tight);
2812
+ font-size: var(--pxd-type-body-small-size);
2813
+ }
2814
+ .pxd-nav-breadcrumb li + li::before {
2815
+ content: "/";
2816
+ margin-right: var(--pxd-space-inline-tight);
2817
+ color: var(--pxd-color-text-muted);
2818
+ }
2819
+ .pxd-nav-breadcrumb-current {
2820
+ color: var(--pxd-color-text-default);
2821
+ font-weight: 600;
2822
+ }
2823
+ .pxd-nav-group-toggle {
2824
+ display: flex;
2825
+ align-items: center;
2826
+ gap: var(--pxd-space-inline-tight);
2827
+ width: 100%;
2828
+ min-height: var(--pxd-size-target-min);
2829
+ padding: 0 var(--pxd-space-inset-compact);
2830
+ border: 0;
2831
+ background: none;
2832
+ color: var(--pxd-color-text-muted);
2833
+ cursor: pointer;
2834
+ text-align: start;
2835
+ }
2836
+ .pxd-nav-group-toggle .pxd-nav-group-label {
2837
+ padding: 0;
2838
+ }
2839
+ .pxd-nav-nested ul {
2840
+ padding-left: var(--pxd-space-inset-default);
2841
+ }
2842
+ .pxd-nav-toc {
2843
+ display: flex;
2844
+ flex-direction: column;
2845
+ gap: var(--pxd-space-stack-tight);
2846
+ padding-left: var(--pxd-space-inset-default);
2847
+ border-left: var(--pxd-border-width-strong) solid var(--pxd-color-border-default);
2848
+ }
2849
+ .pxd-nav-toc-label {
2850
+ color: var(--pxd-color-text-muted);
2851
+ font-size: var(--pxd-type-label-small-size);
2852
+ font-weight: var(--pxd-type-label-small-weight);
2853
+ text-transform: uppercase;
2854
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
2855
+ }
2856
+ .pxd-nav-toc ol {
2857
+ display: flex;
2858
+ flex-direction: column;
2859
+ gap: var(--pxd-space-stack-tight);
2860
+ }
2861
+ .pxd-nav-toc-link {
2862
+ color: var(--pxd-color-text-muted);
2863
+ text-decoration: none;
2864
+ font-size: var(--pxd-type-body-small-size);
2865
+ }
2866
+ .pxd-nav-toc-link:hover {
2867
+ color: var(--pxd-color-text-default);
2868
+ }
2869
+ .pxd-nav-toc-link.pxd-nav-current {
2870
+ color: var(--pxd-color-text-default);
2871
+ font-weight: 600;
2872
+ background: none;
2873
+ }
2874
+ .pxd-nav-local ul {
2875
+ display: flex;
2876
+ gap: var(--pxd-space-inline-tight);
2877
+ overflow-x: auto;
2878
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2879
+ }
2880
+ .pxd-nav-local-item {
2881
+ display: inline-flex;
2882
+ align-items: center;
2883
+ gap: var(--pxd-space-inline-tight);
2884
+ min-height: var(--pxd-size-target-min);
2885
+ padding: 0 var(--pxd-space-inset-default);
2886
+ margin-bottom: calc(-1 * var(--pxd-border-width-default));
2887
+ border: 0;
2888
+ border-bottom: var(--pxd-border-width-strong) solid transparent;
2889
+ background: none;
2890
+ color: var(--pxd-color-text-muted);
2891
+ font-family: var(--pxd-type-label-default-family);
2892
+ font-size: var(--pxd-type-label-default-size);
2893
+ font-weight: var(--pxd-type-label-default-weight);
2894
+ white-space: nowrap;
2895
+ cursor: pointer;
2896
+ }
2897
+ .pxd-nav-local-item:hover {
2898
+ color: var(--pxd-color-text-default);
2899
+ }
2900
+ .pxd-nav-local-item.pxd-nav-current {
2901
+ color: var(--pxd-color-text-default);
2902
+ border-bottom-color: var(--pxd-color-action-primary-background);
2903
+ background: none;
2904
+ }
2905
+
2906
+
2907
+ /* ---- marks: added with the v0.2 components ---- */
2908
+ /*
2909
+ * Marks: Tag, Identity, Progress (as .pxd-gauge, since .pxd-progress is the Card's bar),
2910
+ * Rating and Code. Every value comes from a --pxd-* token; the two the token contract does not
2911
+ * yet name (a mono family, a control size) fall back to the closest thing it does.
2912
+ */
2913
+
2914
+ /* Tag: inline with text and in a Card header; never wraps. */
2915
+ .pxd-tag {
2916
+ position: relative;
2917
+ display: inline-flex;
2918
+ align-items: center;
2919
+ gap: var(--pxd-space-inline-tight);
2920
+ max-width: 100%;
2921
+ vertical-align: middle;
2922
+ padding: var(--pxd-space-stack-tight) var(--pxd-space-inline-default);
2923
+ border-radius: var(--pxd-radius-small);
2924
+ background: var(--pxd-color-surface-subtle);
2925
+ color: var(--pxd-color-text-default);
2926
+ font-family: var(--pxd-type-label-small-family);
2927
+ font-size: var(--pxd-type-label-small-size);
2928
+ font-weight: var(--pxd-type-label-small-weight);
2929
+ line-height: var(--pxd-type-label-small-line-height);
2930
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
2931
+ white-space: nowrap;
2932
+ }
2933
+ .pxd-tag-text {
2934
+ overflow: hidden;
2935
+ text-overflow: ellipsis;
2936
+ }
2937
+ .pxd-tag-count {
2938
+ justify-content: center;
2939
+ min-width: var(--pxd-size-icon-default);
2940
+ border-radius: var(--pxd-radius-full);
2941
+ }
2942
+ .pxd-tag-number {
2943
+ font-variant-numeric: tabular-nums;
2944
+ }
2945
+ /* Status: the pack's status pairs, which the token contract guarantees readable. */
2946
+ .pxd-tag-status.pxd-tag-info { background: var(--pxd-color-status-info-background); color: var(--pxd-color-status-info-foreground); }
2947
+ .pxd-tag-status.pxd-tag-success { background: var(--pxd-color-status-success-background); color: var(--pxd-color-status-success-foreground); }
2948
+ .pxd-tag-status.pxd-tag-warning { background: var(--pxd-color-status-warning-background); color: var(--pxd-color-status-warning-foreground); }
2949
+ .pxd-tag-status.pxd-tag-danger { background: var(--pxd-color-status-danger-background); color: var(--pxd-color-status-danger-foreground); }
2950
+ .pxd-tag-removable {
2951
+ padding-right: var(--pxd-space-inline-tight);
2952
+ }
2953
+ /* The remove control is drawn small but its hit area is the minimum target, centred on it. */
2954
+ .pxd-tag-remove {
2955
+ position: relative;
2956
+ flex: none;
2957
+ display: inline-grid;
2958
+ place-items: center;
2959
+ width: var(--pxd-size-icon-small);
2960
+ height: var(--pxd-size-icon-small);
2961
+ padding: 0;
2962
+ border: 0;
2963
+ border-radius: var(--pxd-radius-full);
2964
+ background: transparent;
2965
+ color: inherit;
2966
+ cursor: pointer;
2967
+ }
2968
+ .pxd-tag-remove::before {
2969
+ content: "";
2970
+ position: absolute;
2971
+ top: 50%;
2972
+ left: 50%;
2973
+ width: var(--pxd-size-target-min);
2974
+ height: var(--pxd-size-target-min);
2975
+ transform: translate(-50%, -50%);
2976
+ }
2977
+ .pxd-tag-remove:hover {
2978
+ background: color-mix(in srgb, currentColor calc(var(--pxd-opacity-state-hover) * 100%), transparent);
2979
+ }
2980
+
2981
+ /* Identity: picture, name, detail. A person is round; a team or organisation is square. */
2982
+ .pxd-identity {
2983
+ display: inline-flex;
2984
+ align-items: center;
2985
+ gap: var(--pxd-space-inline-default);
2986
+ max-width: 100%;
2987
+ min-width: 0;
2988
+ text-align: left;
2989
+ }
2990
+ .pxd-identity-small {
2991
+ gap: var(--pxd-space-inline-tight);
2992
+ }
2993
+ .pxd-identity .pxd-avatar {
2994
+ width: var(--polyxd-identity-size);
2995
+ height: var(--polyxd-identity-size);
2996
+ }
2997
+ .pxd-identity-team .pxd-avatar,
2998
+ .pxd-identity-organization .pxd-avatar {
2999
+ border-radius: var(--pxd-radius-small);
3000
+ }
3001
+ .pxd-identity-text {
3002
+ display: flex;
3003
+ flex-direction: column;
3004
+ min-width: 0;
3005
+ }
3006
+ .pxd-identity-name {
3007
+ overflow: hidden;
3008
+ text-overflow: ellipsis;
3009
+ white-space: nowrap;
3010
+ }
3011
+ .pxd-identity-large .pxd-identity-name {
3012
+ font-family: var(--pxd-type-title-item-family);
3013
+ font-size: var(--pxd-type-title-item-size);
3014
+ font-weight: var(--pxd-type-title-item-weight);
3015
+ line-height: var(--pxd-type-title-item-line-height);
3016
+ letter-spacing: var(--pxd-type-title-item-letter-spacing);
3017
+ }
3018
+ .pxd-identity-small .pxd-identity-name,
3019
+ .pxd-identity-detail {
3020
+ font-family: var(--pxd-type-body-small-family);
3021
+ font-size: var(--pxd-type-body-small-size);
3022
+ line-height: var(--pxd-type-body-small-line-height);
3023
+ }
3024
+ .pxd-identity-detail {
3025
+ color: var(--pxd-color-text-muted);
3026
+ overflow: hidden;
3027
+ text-overflow: ellipsis;
3028
+ white-space: nowrap;
3029
+ }
3030
+ /* With an action, the whole thing is one button: unstyled, but a real target. */
3031
+ .pxd-identity-button {
3032
+ min-height: var(--pxd-size-target-min);
3033
+ padding: var(--pxd-space-stack-tight) var(--pxd-space-inline-tight);
3034
+ margin: calc(-1 * var(--pxd-space-stack-tight)) calc(-1 * var(--pxd-space-inline-tight));
3035
+ border: 0;
3036
+ border-radius: var(--pxd-radius-control);
3037
+ background: transparent;
3038
+ color: inherit;
3039
+ cursor: pointer;
3040
+ transition: background var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3041
+ }
3042
+ .pxd-identity-button:hover {
3043
+ background: color-mix(in srgb, currentColor calc(var(--pxd-opacity-state-hover) * 100%), transparent);
3044
+ }
3045
+ /* A group: pictures overlapping by a quarter, then "+N" for the rest. */
3046
+ .pxd-identity-faces {
3047
+ display: inline-flex;
3048
+ flex: none;
3049
+ align-items: center;
3050
+ padding-left: calc(var(--polyxd-identity-size) / 4);
3051
+ }
3052
+ .pxd-identity-face {
3053
+ display: inline-flex;
3054
+ margin-left: calc(-1 * var(--polyxd-identity-size) / 4);
3055
+ border-radius: var(--pxd-radius-full);
3056
+ box-shadow: 0 0 0 var(--pxd-border-width-strong) var(--pxd-color-surface-default);
3057
+ }
3058
+ .pxd-identity-team .pxd-identity-face,
3059
+ .pxd-identity-organization .pxd-identity-face {
3060
+ border-radius: var(--pxd-radius-small);
3061
+ }
3062
+ .pxd-identity-more {
3063
+ align-items: center;
3064
+ justify-content: center;
3065
+ width: var(--polyxd-identity-size);
3066
+ height: var(--polyxd-identity-size);
3067
+ background: var(--pxd-color-surface-subtle);
3068
+ color: var(--pxd-color-text-default);
3069
+ font-family: var(--pxd-type-label-small-family);
3070
+ font-size: var(--pxd-type-label-small-size);
3071
+ font-weight: var(--pxd-type-label-small-weight);
3072
+ font-variant-numeric: tabular-nums;
3073
+ }
3074
+
3075
+ /* Progress: a bar, a ring or a meter. Track on surface.subtle; fill primary, or the tone's emphasis. */
3076
+ .pxd-gauge {
3077
+ --polyxd-gauge-fill: var(--pxd-color-action-primary-background);
3078
+ --polyxd-gauge-thickness: calc(var(--polyxd-control, var(--pxd-size-target-min)) / 5);
3079
+ display: flex;
3080
+ flex-direction: column;
3081
+ gap: var(--pxd-space-stack-tight);
3082
+ min-width: 0;
3083
+ }
3084
+ .pxd-gauge-warning { --polyxd-gauge-fill: var(--pxd-color-status-warning-emphasis); }
3085
+ .pxd-gauge-danger { --polyxd-gauge-fill: var(--pxd-color-status-danger-emphasis); }
3086
+ .pxd-gauge-success { --polyxd-gauge-fill: var(--pxd-color-status-success-emphasis); }
3087
+ .pxd-gauge-info { --polyxd-gauge-fill: var(--pxd-color-status-info-emphasis); }
3088
+ .pxd-gauge-header {
3089
+ display: flex;
3090
+ align-items: baseline;
3091
+ justify-content: space-between;
3092
+ flex-wrap: wrap;
3093
+ gap: var(--pxd-space-inline-default);
3094
+ min-width: 0;
3095
+ }
3096
+ .pxd-gauge-label {
3097
+ font-family: var(--pxd-type-label-default-family);
3098
+ font-size: var(--pxd-type-label-default-size);
3099
+ font-weight: var(--pxd-type-label-default-weight);
3100
+ line-height: var(--pxd-type-label-default-line-height);
3101
+ letter-spacing: var(--pxd-type-label-default-letter-spacing);
3102
+ }
3103
+ .pxd-gauge-readout {
3104
+ display: inline-flex;
3105
+ align-items: baseline;
3106
+ gap: var(--pxd-space-inline-tight);
3107
+ font-family: var(--pxd-type-body-small-family);
3108
+ font-size: var(--pxd-type-body-small-size);
3109
+ line-height: var(--pxd-type-body-small-line-height);
3110
+ color: var(--pxd-color-text-muted);
3111
+ }
3112
+ .pxd-gauge-value {
3113
+ color: var(--pxd-color-text-default);
3114
+ font-variant-numeric: tabular-nums;
3115
+ }
3116
+ .pxd-gauge-hint::before {
3117
+ content: "· " / "";
3118
+ }
3119
+ .pxd-gauge-track {
3120
+ width: 100%;
3121
+ height: var(--polyxd-gauge-thickness);
3122
+ border-radius: var(--pxd-radius-full);
3123
+ background: var(--pxd-color-surface-subtle);
3124
+ overflow: hidden;
3125
+ }
3126
+ .pxd-gauge-fill {
3127
+ height: 100%;
3128
+ border-radius: inherit;
3129
+ background: var(--polyxd-gauge-fill);
3130
+ transition: width var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3131
+ }
3132
+ .pxd-gauge-indeterminate .pxd-gauge-fill {
3133
+ width: 40%;
3134
+ animation: pxd-gauge-slide var(--pxd-motion-duration-long, 1.2s) var(--pxd-motion-easing-standard) infinite;
3135
+ }
3136
+ @keyframes pxd-gauge-slide {
3137
+ from { transform: translateX(-100%); }
3138
+ to { transform: translateX(250%); }
3139
+ }
3140
+ /* Ring: the graphic beside the text, a control's size across. */
3141
+ .pxd-gauge-ring {
3142
+ flex-direction: row;
3143
+ align-items: center;
3144
+ gap: var(--pxd-space-inline-default);
3145
+ }
3146
+ .pxd-gauge-ring .pxd-gauge-header {
3147
+ flex-direction: column;
3148
+ align-items: flex-start;
3149
+ gap: 0;
3150
+ }
3151
+ .pxd-gauge-ring-graphic {
3152
+ flex: none;
3153
+ width: var(--polyxd-control, var(--pxd-size-target-min));
3154
+ height: var(--polyxd-control, var(--pxd-size-target-min));
3155
+ }
3156
+ .pxd-gauge-ring-svg {
3157
+ display: block;
3158
+ width: 100%;
3159
+ height: 100%;
3160
+ transform: rotate(-90deg);
3161
+ }
3162
+ .pxd-gauge-ring-track {
3163
+ stroke: var(--pxd-color-surface-subtle);
3164
+ }
3165
+ .pxd-gauge-ring-fill {
3166
+ stroke: var(--polyxd-gauge-fill);
3167
+ transition: stroke-dasharray var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3168
+ }
3169
+ .pxd-gauge-indeterminate .pxd-gauge-ring-svg {
3170
+ animation: pxd-spin var(--pxd-motion-duration-long, 1.2s) linear infinite;
3171
+ }
3172
+ @media (prefers-reduced-motion: reduce) {
3173
+ .pxd-gauge-indeterminate .pxd-gauge-fill,
3174
+ .pxd-gauge-indeterminate .pxd-gauge-ring-svg {
3175
+ animation-duration: calc(var(--pxd-motion-duration-long, 1.2s) * 3);
3176
+ }
3177
+ }
3178
+
3179
+ /* Rating: filled shapes in warning.emphasis, empty ones in border.default. */
3180
+ .pxd-rating {
3181
+ display: flex;
3182
+ flex-wrap: wrap;
3183
+ align-items: center;
3184
+ gap: var(--pxd-space-inline-default);
3185
+ min-width: 0;
3186
+ }
3187
+ .pxd-rating.pxd-field {
3188
+ flex-direction: column;
3189
+ align-items: stretch;
3190
+ gap: var(--pxd-space-stack-tight);
3191
+ }
3192
+ .pxd-rating-row {
3193
+ display: flex;
3194
+ align-items: center;
3195
+ gap: var(--pxd-space-inline-default);
3196
+ }
3197
+ .pxd-rating-stars {
3198
+ display: inline-flex;
3199
+ align-items: center;
3200
+ /* Stars are graphics (3:1), never text: the score beside them is the text. */
3201
+ --polyxd-star: var(--pxd-color-status-warning-emphasis);
3202
+ color: var(--polyxd-star);
3203
+ }
3204
+ .pxd-rating-star-shape {
3205
+ position: relative;
3206
+ display: inline-block;
3207
+ width: var(--pxd-size-icon-default);
3208
+ height: var(--pxd-size-icon-default);
3209
+ line-height: 0;
3210
+ }
3211
+ .pxd-rating-star-shape svg {
3212
+ display: block;
3213
+ width: var(--pxd-size-icon-default);
3214
+ height: var(--pxd-size-icon-default);
3215
+ }
3216
+ .pxd-rating-star-empty path {
3217
+ fill: var(--pxd-color-border-default);
3218
+ }
3219
+ .pxd-rating-star-fill {
3220
+ position: absolute;
3221
+ inset: 0 auto 0 0;
3222
+ overflow: hidden;
3223
+ }
3224
+ .pxd-rating-star-fill path {
3225
+ fill: currentColor;
3226
+ }
3227
+ /* Each star that can be given is a real control at the minimum target. */
3228
+ .pxd-rating-star {
3229
+ display: inline-grid;
3230
+ place-items: center;
3231
+ min-width: var(--pxd-size-target-min);
3232
+ min-height: var(--pxd-size-target-min);
3233
+ padding: 0;
3234
+ border: 0;
3235
+ border-radius: var(--pxd-radius-control);
3236
+ background: transparent;
3237
+ color: inherit;
3238
+ cursor: pointer;
3239
+ }
3240
+ .pxd-rating-star:hover .pxd-rating-star-empty path {
3241
+ fill: var(--pxd-color-border-strong);
3242
+ }
3243
+ .pxd-rating-readonly .pxd-rating-stars {
3244
+ gap: 0;
3245
+ }
3246
+ .pxd-rating-readout {
3247
+ display: inline-flex;
3248
+ align-items: baseline;
3249
+ gap: var(--pxd-space-inline-tight);
3250
+ font-variant-numeric: tabular-nums;
3251
+ }
3252
+ .pxd-rating-count {
3253
+ color: var(--pxd-color-text-muted);
3254
+ font-family: var(--pxd-type-body-small-family);
3255
+ font-size: var(--pxd-type-body-small-size);
3256
+ line-height: var(--pxd-type-body-small-line-height);
3257
+ }
3258
+
3259
+ /* Code: mono at body.small on surface.subtle; the controls sit top-right. */
3260
+ .pxd-code {
3261
+ display: flex;
3262
+ flex-direction: column;
3263
+ min-width: 0;
3264
+ border-radius: var(--pxd-radius-control);
3265
+ background: var(--pxd-color-surface-subtle);
3266
+ color: var(--pxd-color-text-default);
3267
+ }
3268
+ .pxd-code-header {
3269
+ display: flex;
3270
+ align-items: center;
3271
+ justify-content: space-between;
3272
+ gap: var(--pxd-space-inline-default);
3273
+ min-height: var(--pxd-size-target-min);
3274
+ padding: 0 var(--pxd-space-inline-tight) 0 var(--pxd-space-inset-default);
3275
+ }
3276
+ .pxd-code-label {
3277
+ font-family: var(--pxd-type-label-default-family);
3278
+ font-size: var(--pxd-type-label-default-size);
3279
+ font-weight: var(--pxd-type-label-default-weight);
3280
+ line-height: var(--pxd-type-label-default-line-height);
3281
+ letter-spacing: var(--pxd-type-label-default-letter-spacing);
3282
+ color: var(--pxd-color-text-muted);
3283
+ overflow: hidden;
3284
+ text-overflow: ellipsis;
3285
+ white-space: nowrap;
3286
+ }
3287
+ .pxd-code-controls {
3288
+ display: flex;
3289
+ flex: none;
3290
+ align-items: center;
3291
+ }
3292
+ /* On the subtle surface a tertiary button's tint can fall under 4.5:1 in some packs; the
3293
+ controls read as default text instead. */
3294
+ .pxd-code-controls .pxd-code-control {
3295
+ color: var(--pxd-color-text-default);
3296
+ gap: var(--pxd-space-inline-tight);
3297
+ margin-left: auto;
3298
+ }
3299
+ .pxd-code-control {
3300
+ min-height: var(--pxd-size-target-min);
3301
+ min-width: var(--pxd-size-target-min);
3302
+ font-family: var(--pxd-type-label-default-family);
3303
+ font-size: var(--pxd-type-label-default-size);
3304
+ font-weight: var(--pxd-type-label-default-weight);
3305
+ }
3306
+ .pxd-code-pre {
3307
+ margin: 0;
3308
+ padding: 0 var(--pxd-space-inset-default) var(--pxd-space-inset-default);
3309
+ overflow-x: auto;
3310
+ overflow-y: hidden;
3311
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3312
+ font-size: var(--pxd-type-body-small-size);
3313
+ line-height: var(--pxd-type-body-small-line-height);
3314
+ white-space: pre;
3315
+ tab-size: 2;
3316
+ }
3317
+ .pxd-code-pre code {
3318
+ font: inherit;
3319
+ user-select: text;
3320
+ }
3321
+ .pxd-code-wrap .pxd-code-pre {
3322
+ overflow-x: visible;
3323
+ white-space: pre-wrap;
3324
+ overflow-wrap: anywhere;
3325
+ }
3326
+ .pxd-code-pre[data-masked] code {
3327
+ letter-spacing: 0.1em;
3328
+ user-select: none;
3329
+ }
3330
+
3331
+
3332
+ /* ---- tree: added with the v0.2 components ---- */
3333
+ /* Tree: a hierarchy people expand, browse and pick from (WAI-ARIA tree view).
3334
+ Merged into styles.css. Every value comes from a --pxd-* token; --polyxd-tree-depth is set per row
3335
+ by the renderer (0 at the top level) and drives the indent. */
3336
+
3337
+ .pxd-tree {
3338
+ display: flex;
3339
+ flex-direction: column;
3340
+ gap: var(--pxd-space-stack-tight);
3341
+ }
3342
+ .pxd-tree-caption {
3343
+ font-family: var(--pxd-type-label-small-family);
3344
+ font-size: var(--pxd-type-label-small-size);
3345
+ font-weight: var(--pxd-type-label-small-weight);
3346
+ line-height: var(--pxd-type-label-small-line-height);
3347
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
3348
+ color: var(--pxd-color-text-muted);
3349
+ }
3350
+ /* Past 200 visible rows the list scrolls inside its own viewport and only nearby rows render;
3351
+ the height is twelve rows so the window keeps a stable size while rows come and go. */
3352
+ .pxd-tree-viewport {
3353
+ max-height: calc(var(--pxd-size-target-min) * 12);
3354
+ overflow-y: auto;
3355
+ overscroll-behavior: contain;
3356
+ }
3357
+ .pxd-tree-list {
3358
+ display: flex;
3359
+ flex-direction: column;
3360
+ }
3361
+ .pxd-tree-item {
3362
+ /* Indent by level: each level steps in by one inline space. */
3363
+ padding-inline-start: calc(var(--polyxd-tree-depth, 0) * var(--pxd-space-inline-default));
3364
+ border-radius: var(--pxd-radius-control);
3365
+ cursor: default;
3366
+ user-select: none;
3367
+ }
3368
+ .pxd-tree-item:focus-visible {
3369
+ /* Inset ring so it survives the viewport's overflow clipping. */
3370
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
3371
+ outline-offset: calc(-1 * var(--pxd-focus-ring-width));
3372
+ }
3373
+ .pxd-tree-row {
3374
+ display: flex;
3375
+ align-items: center;
3376
+ gap: var(--pxd-space-inline-tight);
3377
+ min-height: var(--pxd-size-target-min);
3378
+ padding-inline-end: var(--pxd-space-inset-compact);
3379
+ border-radius: var(--pxd-radius-control);
3380
+ transition: background-color var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3381
+ }
3382
+ .pxd-tree-item:hover > .pxd-tree-row {
3383
+ background: var(--pxd-color-surface-subtle);
3384
+ }
3385
+ .pxd-tree-item[aria-selected="true"] > .pxd-tree-row {
3386
+ background: var(--pxd-color-selection-background);
3387
+ color: var(--pxd-color-selection-foreground);
3388
+ }
3389
+ /* The expander is a square target; leaves keep the same width so their labels align. */
3390
+ .pxd-tree-expander {
3391
+ flex: none;
3392
+ display: inline-flex;
3393
+ align-items: center;
3394
+ justify-content: center;
3395
+ width: var(--pxd-size-target-min);
3396
+ height: var(--pxd-size-target-min);
3397
+ padding: 0;
3398
+ border: 0;
3399
+ border-radius: var(--pxd-radius-control);
3400
+ background: none;
3401
+ color: var(--pxd-color-text-muted);
3402
+ cursor: pointer;
3403
+ }
3404
+ .pxd-tree-expander svg {
3405
+ transition: transform var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3406
+ }
3407
+ .pxd-tree-expander-open svg {
3408
+ transform: rotate(90deg);
3409
+ }
3410
+ .pxd-tree-expander-leaf {
3411
+ cursor: default;
3412
+ }
3413
+ .pxd-tree-item[aria-selected="true"] > .pxd-tree-row .pxd-tree-expander {
3414
+ color: inherit;
3415
+ }
3416
+ .pxd-tree-text {
3417
+ flex: 1;
3418
+ min-width: 0;
3419
+ overflow: hidden;
3420
+ text-overflow: ellipsis;
3421
+ white-space: nowrap;
3422
+ }
3423
+ .pxd-tree-detail {
3424
+ flex: none;
3425
+ font-family: var(--pxd-type-body-small-family);
3426
+ font-size: var(--pxd-type-body-small-size);
3427
+ line-height: var(--pxd-type-body-small-line-height);
3428
+ color: var(--pxd-color-text-muted);
3429
+ }
3430
+ .pxd-tree-item[aria-selected="true"] > .pxd-tree-row .pxd-tree-detail {
3431
+ color: inherit;
3432
+ }
3433
+ @media (prefers-reduced-motion: reduce) {
3434
+ .pxd-tree-row,
3435
+ .pxd-tree-expander svg {
3436
+ transition: none;
3437
+ }
3438
+ }
3439
+
3440
+
3441
+ /* ---- pickers: added with the v0.2 components ---- */
3442
+ /*
3443
+ * Pickers: FileInput, ColorInput, CodeInput. Every value comes from a --pxd-* token, as in
3444
+ * styles.css; --polyxd-control is the density-scaled control height styles.css derives from
3445
+ * --pxd-size-target-min. Merged into styles.css.
3446
+ */
3447
+
3448
+ /* Shared: a refusal or error said under a control, in the danger tokens. */
3449
+ .pxd-field-error {
3450
+ margin: 0;
3451
+ color: var(--pxd-color-status-danger-foreground);
3452
+ font-size: var(--pxd-type-body-small-size);
3453
+ line-height: var(--pxd-type-body-small-line-height);
3454
+ }
3455
+ /* The value as text: hex, rgb(), hsl(). No mono token exists yet, so the family falls back to the platform's. */
3456
+ .pxd-input-mono {
3457
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3458
+ font-variant-numeric: tabular-nums;
3459
+ }
3460
+
3461
+ /* FileInput: a dashed zone the native input covers, so a click or a drop anywhere lands on it. */
3462
+ .pxd-dropzone {
3463
+ position: relative;
3464
+ display: flex;
3465
+ flex-direction: column;
3466
+ align-items: center;
3467
+ justify-content: center;
3468
+ gap: var(--pxd-space-stack-tight);
3469
+ min-height: calc(var(--polyxd-control) * 2.5);
3470
+ max-width: 32rem;
3471
+ padding: var(--pxd-space-inset-default);
3472
+ border: var(--pxd-border-width-default) dashed var(--pxd-color-border-strong);
3473
+ border-radius: var(--pxd-radius-control);
3474
+ background: var(--pxd-color-surface-subtle);
3475
+ color: var(--pxd-color-text-default);
3476
+ text-align: center;
3477
+ transition:
3478
+ border-color var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard),
3479
+ background var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3480
+ }
3481
+ .pxd-dropzone:hover {
3482
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), var(--pxd-color-surface-subtle));
3483
+ }
3484
+ .pxd-dropzone[data-dragging] {
3485
+ border-style: solid;
3486
+ border-color: var(--pxd-color-border-focus);
3487
+ background: var(--pxd-color-selection-background);
3488
+ color: var(--pxd-color-selection-foreground);
3489
+ }
3490
+ /* The input is the real control. It is transparent, not hidden, so it stays focusable and clickable. */
3491
+ .pxd-dropzone-input {
3492
+ position: absolute;
3493
+ inset: 0;
3494
+ width: 100%;
3495
+ height: 100%;
3496
+ margin: 0;
3497
+ opacity: 0;
3498
+ cursor: pointer;
3499
+ }
3500
+ .pxd-dropzone:has(> .pxd-dropzone-input:focus-visible) {
3501
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
3502
+ outline-offset: var(--pxd-focus-ring-offset);
3503
+ }
3504
+ .pxd-dropzone:has(> .pxd-dropzone-input:user-invalid) {
3505
+ border-color: var(--pxd-color-status-danger-emphasis);
3506
+ }
3507
+ .pxd-dropzone-icon {
3508
+ display: inline-flex;
3509
+ color: var(--pxd-color-text-muted);
3510
+ pointer-events: none;
3511
+ }
3512
+ .pxd-dropzone[data-dragging] .pxd-dropzone-icon {
3513
+ color: inherit;
3514
+ }
3515
+ .pxd-dropzone-text {
3516
+ display: flex;
3517
+ flex-wrap: wrap;
3518
+ justify-content: center;
3519
+ gap: 0 var(--pxd-space-inline-tight);
3520
+ pointer-events: none;
3521
+ }
3522
+ .pxd-dropzone-action {
3523
+ /* Underlined on the subtle surface, in default text: a link tint can fall under 4.5:1 there. */
3524
+ color: var(--pxd-color-text-default);
3525
+ font-family: var(--pxd-type-label-default-family);
3526
+ font-size: var(--pxd-type-label-default-size);
3527
+ font-weight: var(--pxd-type-label-default-weight);
3528
+ text-decoration: underline;
3529
+ text-underline-offset: 0.15em;
3530
+ }
3531
+ .pxd-dropzone[data-dragging] .pxd-dropzone-action {
3532
+ color: inherit;
3533
+ }
3534
+ .pxd-dropzone-hint {
3535
+ color: var(--pxd-color-text-muted);
3536
+ font-size: var(--pxd-type-body-small-size);
3537
+ }
3538
+ .pxd-dropzone[data-dragging] .pxd-dropzone-hint {
3539
+ color: inherit;
3540
+ }
3541
+ .pxd-file-list {
3542
+ display: flex;
3543
+ flex-direction: column;
3544
+ gap: var(--pxd-space-stack-tight);
3545
+ max-width: 32rem;
3546
+ }
3547
+ .pxd-file-item {
3548
+ display: flex;
3549
+ align-items: center;
3550
+ gap: var(--pxd-space-inline-default);
3551
+ min-height: var(--polyxd-control);
3552
+ padding: var(--pxd-space-inset-compact);
3553
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
3554
+ border-radius: var(--pxd-radius-control);
3555
+ background: var(--pxd-color-surface-default);
3556
+ }
3557
+ .pxd-file-icon {
3558
+ flex: none;
3559
+ display: inline-flex;
3560
+ color: var(--pxd-color-text-muted);
3561
+ }
3562
+ .pxd-file-text {
3563
+ flex: 1 1 auto;
3564
+ min-width: 0;
3565
+ display: flex;
3566
+ flex-wrap: wrap;
3567
+ align-items: baseline;
3568
+ gap: 0 var(--pxd-space-inline-tight);
3569
+ }
3570
+ .pxd-file-name {
3571
+ min-width: 0;
3572
+ overflow: hidden;
3573
+ text-overflow: ellipsis;
3574
+ white-space: nowrap;
3575
+ }
3576
+ .pxd-file-size {
3577
+ color: var(--pxd-color-text-muted);
3578
+ font-size: var(--pxd-type-body-small-size);
3579
+ font-variant-numeric: tabular-nums;
3580
+ }
3581
+ .pxd-file-progress {
3582
+ flex: 1 0 100%;
3583
+ width: 100%;
3584
+ height: 4px;
3585
+ margin-top: var(--pxd-space-stack-tight);
3586
+ border: 0;
3587
+ border-radius: var(--pxd-radius-full);
3588
+ background: var(--pxd-color-surface-subtle);
3589
+ accent-color: var(--pxd-color-action-primary-background);
3590
+ overflow: hidden;
3591
+ }
3592
+ .pxd-file-progress::-webkit-progress-bar {
3593
+ background: var(--pxd-color-surface-subtle);
3594
+ border-radius: var(--pxd-radius-full);
3595
+ }
3596
+ .pxd-file-progress::-webkit-progress-value {
3597
+ background: var(--pxd-color-action-primary-background);
3598
+ border-radius: var(--pxd-radius-full);
3599
+ }
3600
+ .pxd-file-progress::-moz-progress-bar {
3601
+ background: var(--pxd-color-action-primary-background);
3602
+ border-radius: var(--pxd-radius-full);
3603
+ }
3604
+ .pxd-file-remove {
3605
+ flex: none;
3606
+ display: inline-flex;
3607
+ align-items: center;
3608
+ justify-content: center;
3609
+ width: var(--polyxd-control);
3610
+ height: var(--polyxd-control);
3611
+ margin: calc((var(--polyxd-control) - var(--pxd-size-icon-default)) / -2 - 4px) 0;
3612
+ margin-inline-end: calc(var(--pxd-space-inset-compact) * -1);
3613
+ padding: 0;
3614
+ border: 0;
3615
+ border-radius: var(--pxd-radius-control);
3616
+ background: transparent;
3617
+ color: var(--pxd-color-text-muted);
3618
+ cursor: pointer;
3619
+ }
3620
+ .pxd-file-remove:hover {
3621
+ color: var(--pxd-color-text-default);
3622
+ background: color-mix(in srgb, currentColor calc(var(--pxd-opacity-state-hover) * 100%), transparent);
3623
+ }
3624
+
3625
+ /* ColorInput: named swatches as radios; the free picker beside its text value. */
3626
+ .pxd-swatches {
3627
+ display: flex;
3628
+ flex-wrap: wrap;
3629
+ gap: var(--pxd-space-inline-default);
3630
+ }
3631
+ .pxd-swatch {
3632
+ display: flex;
3633
+ flex-direction: column;
3634
+ align-items: center;
3635
+ gap: var(--pxd-space-stack-tight);
3636
+ width: calc(var(--polyxd-control) + var(--pxd-space-inline-default) * 2);
3637
+ padding: 0;
3638
+ border: 0;
3639
+ background: transparent;
3640
+ color: var(--pxd-color-text-default);
3641
+ cursor: pointer;
3642
+ }
3643
+ .pxd-swatch:focus-visible {
3644
+ outline: none;
3645
+ }
3646
+ .pxd-swatch-color {
3647
+ display: block;
3648
+ width: var(--polyxd-control);
3649
+ height: var(--polyxd-control);
3650
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
3651
+ border-radius: var(--pxd-radius-control);
3652
+ background: var(--pxd-color-surface-default);
3653
+ transition: box-shadow var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3654
+ }
3655
+ .pxd-swatch:hover .pxd-swatch-color {
3656
+ border-color: var(--pxd-color-border-strong);
3657
+ }
3658
+ .pxd-swatch:focus-visible .pxd-swatch-color {
3659
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
3660
+ outline-offset: var(--pxd-focus-ring-offset);
3661
+ }
3662
+ .pxd-swatch[data-state="checked"] .pxd-swatch-color {
3663
+ border-color: var(--pxd-color-border-focus);
3664
+ box-shadow:
3665
+ 0 0 0 var(--pxd-focus-ring-offset) var(--pxd-color-surface-default),
3666
+ 0 0 0 calc(var(--pxd-focus-ring-offset) + var(--pxd-focus-ring-width)) var(--pxd-color-border-focus);
3667
+ }
3668
+ .pxd-swatch-other .pxd-swatch-color {
3669
+ border-style: dashed;
3670
+ border-color: var(--pxd-color-border-strong);
3671
+ }
3672
+ .pxd-swatch-name {
3673
+ max-width: 100%;
3674
+ overflow: hidden;
3675
+ text-overflow: ellipsis;
3676
+ white-space: nowrap;
3677
+ font-family: var(--pxd-type-label-small-family);
3678
+ font-size: var(--pxd-type-label-small-size);
3679
+ font-weight: var(--pxd-type-label-small-weight);
3680
+ line-height: var(--pxd-type-label-small-line-height);
3681
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
3682
+ color: var(--pxd-color-text-muted);
3683
+ }
3684
+ .pxd-swatch[data-state="checked"] .pxd-swatch-name {
3685
+ color: var(--pxd-color-text-default);
3686
+ }
3687
+ .pxd-color-picker {
3688
+ display: flex;
3689
+ flex-wrap: wrap;
3690
+ align-items: center;
3691
+ gap: var(--pxd-space-inline-default);
3692
+ max-width: 32rem;
3693
+ }
3694
+ /* The platform's picker, drawn as a swatch the same size as the named ones. */
3695
+ .pxd-color-native {
3696
+ flex: none;
3697
+ width: var(--polyxd-control);
3698
+ height: var(--polyxd-control);
3699
+ padding: 0;
3700
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
3701
+ border-radius: var(--pxd-radius-control);
3702
+ background: var(--pxd-color-surface-default);
3703
+ cursor: pointer;
3704
+ }
3705
+ .pxd-color-native::-webkit-color-swatch-wrapper {
3706
+ padding: 2px;
3707
+ }
3708
+ .pxd-color-native::-webkit-color-swatch,
3709
+ .pxd-color-native::-moz-color-swatch {
3710
+ border: 0;
3711
+ border-radius: calc(var(--pxd-radius-control) - 2px);
3712
+ }
3713
+ .pxd-color-text {
3714
+ flex: 1 1 10rem;
3715
+ max-width: 14rem;
3716
+ }
3717
+ .pxd-color-alpha {
3718
+ flex: 1 1 100%;
3719
+ display: flex;
3720
+ align-items: center;
3721
+ gap: var(--pxd-space-inline-default);
3722
+ max-width: 20rem;
3723
+ font-size: var(--pxd-type-body-small-size);
3724
+ }
3725
+ .pxd-color-alpha input[type="range"] {
3726
+ flex: 1 1 auto;
3727
+ min-width: 6rem;
3728
+ min-height: var(--polyxd-control);
3729
+ margin: 0;
3730
+ accent-color: var(--pxd-color-action-primary-background);
3731
+ }
3732
+ .pxd-color-alpha-label {
3733
+ color: var(--pxd-color-text-muted);
3734
+ }
3735
+ .pxd-color-alpha-value {
3736
+ min-width: 3ch;
3737
+ text-align: end;
3738
+ font-variant-numeric: tabular-nums;
3739
+ }
3740
+
3741
+ /* CodeInput: one square box per character; groups of three or four past six. */
3742
+ .pxd-code-boxes {
3743
+ display: flex;
3744
+ flex-wrap: wrap;
3745
+ gap: var(--pxd-space-inline-loose);
3746
+ }
3747
+ .pxd-code-group {
3748
+ display: flex;
3749
+ gap: var(--pxd-space-inline-tight);
3750
+ }
3751
+ .pxd-code-box {
3752
+ width: calc(var(--polyxd-control) + 4px);
3753
+ height: calc(var(--polyxd-control) + 4px);
3754
+ padding: 0;
3755
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
3756
+ border-radius: var(--pxd-radius-control);
3757
+ background: var(--pxd-color-surface-default);
3758
+ color: var(--pxd-color-text-default);
3759
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3760
+ font-size: var(--pxd-type-title-item-size);
3761
+ font-weight: var(--pxd-type-title-item-weight);
3762
+ line-height: 1;
3763
+ text-align: center;
3764
+ caret-color: var(--pxd-color-border-focus);
3765
+ transition: border-color var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3766
+ }
3767
+ .pxd-code-box[data-filled] {
3768
+ border-color: var(--pxd-color-border-strong);
3769
+ border-width: var(--pxd-border-width-strong);
3770
+ }
3771
+ .pxd-code-box:focus-visible {
3772
+ outline-offset: 0;
3773
+ border-color: var(--pxd-color-border-focus);
3774
+ border-width: var(--pxd-border-width-strong);
3775
+ }
3776
+ .pxd-code-box::selection {
3777
+ background: var(--pxd-color-selection-background);
3778
+ color: var(--pxd-color-selection-foreground);
3779
+ }
3780
+ .pxd-code:has(.pxd-code-box:user-invalid) .pxd-code-box:not([data-filled]) {
3781
+ border-color: var(--pxd-color-status-danger-emphasis);
3782
+ }
3783
+
3784
+
3785
+ /* ---- overlays: added with the v0.2 components ---- */
3786
+ /* ---- Overlays: ActionMenu and Panel ---- */
3787
+
3788
+ /* ActionMenu. The menu itself reuses .pxd-menu / .pxd-menu-item (row actions). */
3789
+ .pxd-action-menu {
3790
+ min-width: 12rem;
3791
+ max-width: 20rem;
3792
+ }
3793
+ .pxd-action-menu .pxd-menu-item {
3794
+ gap: var(--pxd-space-inline-default);
3795
+ padding: 0 var(--pxd-space-inset-default);
3796
+ white-space: nowrap;
3797
+ }
3798
+ .pxd-action-menu .pxd-menu-item[data-disabled] {
3799
+ opacity: var(--pxd-opacity-state-disabled);
3800
+ cursor: not-allowed;
3801
+ }
3802
+ /* Danger is emphasised in colour, after a divider. */
3803
+ .pxd-action-menu .pxd-menu-item-danger {
3804
+ color: var(--pxd-color-status-danger-foreground);
3805
+ }
3806
+ .pxd-action-menu .pxd-menu-item-danger[data-highlighted] {
3807
+ background: var(--pxd-color-status-danger-background);
3808
+ color: var(--pxd-color-status-danger-foreground);
3809
+ }
3810
+ .pxd-menu-separator {
3811
+ height: var(--pxd-border-width-default);
3812
+ margin: var(--pxd-space-inline-tight) calc(var(--pxd-space-inline-tight) * -1);
3813
+ background: var(--pxd-color-border-default);
3814
+ }
3815
+ .pxd-action-menu[data-state="open"] {
3816
+ animation: pxd-menu-in var(--pxd-motion-duration-short) var(--pxd-motion-easing-enter);
3817
+ }
3818
+ @keyframes pxd-menu-in {
3819
+ from {
3820
+ opacity: 0;
3821
+ transform: translateY(-4px);
3822
+ }
3823
+ }
3824
+
3825
+ /* The overflow control is an icon-only button at size.target.min. */
3826
+ .pxd-action-menu-overflow {
3827
+ min-width: var(--pxd-size-target-min);
3828
+ min-height: var(--pxd-size-target-min);
3829
+ border-radius: var(--pxd-radius-control);
3830
+ }
3831
+ .pxd-action-menu-trigger:not(:disabled):hover {
3832
+ background: color-mix(in srgb, currentColor calc(var(--pxd-opacity-state-hover) * 100%), transparent);
3833
+ }
3834
+ .pxd-action-menu-trigger[data-state="open"] {
3835
+ background: var(--pxd-color-surface-subtle);
3836
+ }
3837
+ .pxd-action-menu-chevron {
3838
+ flex: none;
3839
+ transition: transform var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
3840
+ }
3841
+ .pxd-action-menu-trigger[data-state="open"] .pxd-action-menu-chevron {
3842
+ transform: rotate(180deg);
3843
+ }
3844
+ .pxd-context-target {
3845
+ display: inline-flex;
3846
+ }
3847
+
3848
+ /* Split: the primary and the menu part share one outline; the menu part is at least size.target.min wide. */
3849
+ .pxd-split {
3850
+ display: inline-flex;
3851
+ align-items: stretch;
3852
+ }
3853
+ .pxd-split > .pxd-button:not(.pxd-split-menu) {
3854
+ border-start-end-radius: 0;
3855
+ border-end-end-radius: 0;
3856
+ }
3857
+ .pxd-split-menu {
3858
+ min-width: var(--pxd-size-target-min);
3859
+ padding: 0;
3860
+ margin-inline-start: calc(var(--pxd-border-width-default) * -1);
3861
+ border-start-start-radius: 0;
3862
+ border-end-start-radius: 0;
3863
+ border-inline-start: var(--pxd-border-width-default) solid color-mix(in srgb, currentColor calc(var(--pxd-opacity-state-hover) * 200%), transparent);
3864
+ }
3865
+ .pxd-split-menu.pxd-button-secondary {
3866
+ border-inline-start-color: var(--pxd-color-action-secondary-border);
3867
+ }
3868
+
3869
+ /* Panel. Modal kinds sit over a backdrop of the scrim; all panels are on the overlay surface. */
3870
+ .pxd-panel-backdrop[data-state="open"] {
3871
+ animation: pxd-fade-in var(--pxd-motion-duration-medium) var(--pxd-motion-easing-enter);
3872
+ }
3873
+ .pxd-panel-backdrop[data-state="closed"] {
3874
+ animation: pxd-fade-out var(--pxd-motion-duration-short) var(--pxd-motion-easing-exit);
3875
+ }
3876
+ .pxd-panel {
3877
+ position: fixed;
3878
+ z-index: 11;
3879
+ display: flex;
3880
+ flex-direction: column;
3881
+ background: var(--pxd-color-surface-overlay);
3882
+ color: var(--pxd-color-text-default);
3883
+ box-shadow: var(--pxd-shadow-overlay);
3884
+ outline: none;
3885
+ }
3886
+ .pxd-panel-header {
3887
+ display: flex;
3888
+ align-items: flex-start;
3889
+ gap: var(--pxd-space-inline-default);
3890
+ padding: var(--pxd-space-inset-comfortable) var(--pxd-space-inset-default) var(--pxd-space-inset-default) var(--pxd-space-inset-comfortable);
3891
+ }
3892
+ .pxd-panel-title {
3893
+ flex: 1;
3894
+ min-width: 0;
3895
+ margin: 0;
3896
+ align-self: center;
3897
+ font-family: var(--pxd-type-title-section-family);
3898
+ font-size: var(--pxd-type-title-section-size);
3899
+ font-weight: var(--pxd-type-title-section-weight);
3900
+ line-height: var(--pxd-type-title-section-line-height);
3901
+ letter-spacing: var(--pxd-type-title-section-letter-spacing);
3902
+ }
3903
+ .pxd-panel-close {
3904
+ flex: none;
3905
+ margin: calc(var(--pxd-space-inset-compact) * -1) 0;
3906
+ }
3907
+ .pxd-panel-body {
3908
+ flex: 1;
3909
+ min-height: 0;
3910
+ overflow-y: auto;
3911
+ padding: 0 var(--pxd-space-inset-comfortable) var(--pxd-space-inset-comfortable);
3912
+ }
3913
+ .pxd-panel-footer {
3914
+ padding: var(--pxd-space-inset-default) var(--pxd-space-inset-comfortable);
3915
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
3916
+ background: var(--pxd-color-surface-overlay);
3917
+ }
3918
+ .pxd-panel-footer .pxd-action-bar {
3919
+ gap: var(--pxd-layout-action-gap, var(--pxd-space-inline-default));
3920
+ }
3921
+
3922
+ /* dialog: centred, max 560px; full width with space.inset.default on phones. */
3923
+ .pxd-panel-dialog {
3924
+ left: 50%;
3925
+ top: 50%;
3926
+ transform: translate(-50%, -50%);
3927
+ width: min(35rem, calc(100% - 2 * var(--pxd-space-inset-default)));
3928
+ max-height: calc(100% - 2 * var(--pxd-space-inset-default));
3929
+ border-radius: var(--pxd-radius-large);
3930
+ }
3931
+ .pxd-panel-dialog.pxd-panel-size-small {
3932
+ width: min(25rem, calc(100% - 2 * var(--pxd-space-inset-default)));
3933
+ }
3934
+ .pxd-panel-dialog.pxd-panel-size-large {
3935
+ width: min(50rem, calc(100% - 2 * var(--pxd-space-inset-default)));
3936
+ }
3937
+ .pxd-panel-dialog[data-state="open"] {
3938
+ animation: pxd-panel-dialog-in var(--pxd-motion-duration-medium) var(--pxd-motion-easing-enter);
3939
+ }
3940
+ .pxd-panel-dialog[data-state="closed"] {
3941
+ animation: pxd-panel-dialog-out var(--pxd-motion-duration-short) var(--pxd-motion-easing-exit);
3942
+ }
3943
+ @keyframes pxd-panel-dialog-in {
3944
+ from {
3945
+ opacity: 0;
3946
+ transform: translate(-50%, -50%) scale(0.96);
3947
+ }
3948
+ }
3949
+ @keyframes pxd-panel-dialog-out {
3950
+ to {
3951
+ opacity: 0;
3952
+ transform: translate(-50%, -50%) scale(0.96);
3953
+ }
3954
+ }
3955
+
3956
+ /* drawer: 420px from the end edge, full height. */
3957
+ .pxd-panel-drawer {
3958
+ top: 0;
3959
+ bottom: 0;
3960
+ inset-inline-end: 0;
3961
+ width: min(26.25rem, 100%);
3962
+ max-height: 100%;
3963
+ border-start-start-radius: var(--pxd-radius-large);
3964
+ border-end-start-radius: var(--pxd-radius-large);
3965
+ }
3966
+ .pxd-panel-drawer.pxd-panel-size-small {
3967
+ width: min(20rem, 100%);
3968
+ }
3969
+ .pxd-panel-drawer.pxd-panel-size-large {
3970
+ width: min(40rem, 100%);
3971
+ }
3972
+ .pxd-panel-drawer[data-state="open"] {
3973
+ animation: pxd-panel-drawer-in var(--pxd-motion-duration-medium) var(--pxd-motion-easing-enter);
3974
+ }
3975
+ .pxd-panel-drawer[data-state="closed"] {
3976
+ animation: pxd-panel-drawer-out var(--pxd-motion-duration-short) var(--pxd-motion-easing-exit);
3977
+ }
3978
+ @keyframes pxd-panel-drawer-in {
3979
+ from {
3980
+ transform: translateX(100%);
3981
+ }
3982
+ }
3983
+ @keyframes pxd-panel-drawer-out {
3984
+ to {
3985
+ transform: translateX(100%);
3986
+ }
3987
+ }
3988
+ [dir="rtl"] .pxd-panel-drawer[data-state="open"],
3989
+ .pxd-surface:dir(rtl) .pxd-panel-drawer[data-state="open"] {
3990
+ animation-name: pxd-panel-drawer-in-rtl;
3991
+ }
3992
+ [dir="rtl"] .pxd-panel-drawer[data-state="closed"],
3993
+ .pxd-surface:dir(rtl) .pxd-panel-drawer[data-state="closed"] {
3994
+ animation-name: pxd-panel-drawer-out-rtl;
3995
+ }
3996
+ @keyframes pxd-panel-drawer-in-rtl {
3997
+ from {
3998
+ transform: translateX(-100%);
3999
+ }
4000
+ }
4001
+ @keyframes pxd-panel-drawer-out-rtl {
4002
+ to {
4003
+ transform: translateX(-100%);
4004
+ }
4005
+ }
4006
+
4007
+ /* sheet: rises from the bottom with radius.large on the top corners; a grip says it drags. */
4008
+ .pxd-panel-sheet {
4009
+ left: 0;
4010
+ right: 0;
4011
+ bottom: 0;
4012
+ max-height: 85%;
4013
+ border-radius: var(--pxd-radius-large) var(--pxd-radius-large) 0 0;
4014
+ transition: transform var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
4015
+ }
4016
+ .pxd-panel-sheet.pxd-panel-size-small {
4017
+ max-height: 50%;
4018
+ }
4019
+ .pxd-panel-sheet.pxd-panel-size-large {
4020
+ max-height: 95%;
4021
+ }
4022
+ .pxd-panel-sheet .pxd-panel-header {
4023
+ flex-wrap: wrap;
4024
+ padding-top: var(--pxd-space-inset-compact);
4025
+ touch-action: none;
4026
+ cursor: grab;
4027
+ }
4028
+ .pxd-panel-grip {
4029
+ flex: 0 0 100%;
4030
+ width: 2.5rem;
4031
+ max-width: 2.5rem;
4032
+ height: 4px;
4033
+ margin: 0 auto var(--pxd-space-stack-tight);
4034
+ border-radius: var(--pxd-radius-full);
4035
+ background: var(--pxd-color-border-strong);
4036
+ }
4037
+ .pxd-panel-sheet[data-state="open"] {
4038
+ animation: pxd-panel-sheet-in var(--pxd-motion-duration-medium) var(--pxd-motion-easing-enter);
4039
+ }
4040
+ .pxd-panel-sheet[data-state="closed"] {
4041
+ animation: pxd-panel-sheet-out var(--pxd-motion-duration-short) var(--pxd-motion-easing-exit);
4042
+ }
4043
+ @keyframes pxd-panel-sheet-in {
4044
+ from {
4045
+ transform: translateY(100%);
4046
+ }
4047
+ }
4048
+ @keyframes pxd-panel-sheet-out {
4049
+ to {
4050
+ transform: translateY(100%);
4051
+ }
4052
+ }
4053
+
4054
+ /* popover: by its opener, non-modal, with an arrow. */
4055
+ .pxd-panel-anchor {
4056
+ display: inline-block;
4057
+ width: 0;
4058
+ height: 0;
4059
+ }
4060
+ .pxd-panel-popover {
4061
+ position: relative;
4062
+ z-index: 12;
4063
+ width: max-content;
4064
+ min-width: 16rem;
4065
+ max-width: min(24rem, calc(100vw - 2 * var(--pxd-space-inset-default)));
4066
+ max-height: var(--radix-popover-content-available-height);
4067
+ border-radius: var(--pxd-radius-default);
4068
+ }
4069
+ .pxd-panel-popover.pxd-panel-size-small {
4070
+ min-width: 12rem;
4071
+ }
4072
+ .pxd-panel-popover.pxd-panel-size-large {
4073
+ max-width: min(32rem, calc(100vw - 2 * var(--pxd-space-inset-default)));
4074
+ }
4075
+ .pxd-panel-popover .pxd-panel-header {
4076
+ padding: var(--pxd-space-inset-default) var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) var(--pxd-space-inset-default);
4077
+ }
4078
+ .pxd-panel-popover .pxd-panel-title {
4079
+ font-family: var(--pxd-type-title-item-family);
4080
+ font-size: var(--pxd-type-title-item-size);
4081
+ font-weight: var(--pxd-type-title-item-weight);
4082
+ line-height: var(--pxd-type-title-item-line-height);
4083
+ letter-spacing: var(--pxd-type-title-item-letter-spacing);
4084
+ }
4085
+ .pxd-panel-popover .pxd-panel-body {
4086
+ padding: 0 var(--pxd-space-inset-default) var(--pxd-space-inset-default);
4087
+ }
4088
+ .pxd-panel-popover .pxd-panel-footer {
4089
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-default);
4090
+ }
4091
+ .pxd-panel-arrow {
4092
+ fill: var(--pxd-color-surface-overlay);
4093
+ filter: drop-shadow(0 1px 0 var(--pxd-color-border-default));
4094
+ }
4095
+ .pxd-panel-popover[data-state="open"] {
4096
+ animation: pxd-menu-in var(--pxd-motion-duration-short) var(--pxd-motion-easing-enter);
4097
+ }
4098
+ .pxd-panel-popover[data-state="closed"] {
4099
+ animation: pxd-fade-out var(--pxd-motion-duration-short) var(--pxd-motion-easing-exit);
4100
+ }
4101
+
4102
+ @keyframes pxd-fade-in {
4103
+ from {
4104
+ opacity: 0;
4105
+ }
4106
+ }
4107
+ @keyframes pxd-fade-out {
4108
+ to {
4109
+ opacity: 0;
4110
+ }
4111
+ }
4112
+
4113
+ /* Phones: the footer is fixed to the bottom of the panel, full width. */
4114
+ @container pxd (width < 30rem) {
4115
+ .pxd-panel-dialog {
4116
+ max-height: calc(100% - 2 * var(--pxd-space-inset-default));
4117
+ }
4118
+ .pxd-panel-footer {
4119
+ position: sticky;
4120
+ bottom: 0;
4121
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-default) var(--pxd-space-inset-default);
4122
+ }
4123
+ .pxd-panel-footer .pxd-action-bar {
4124
+ flex-direction: column;
4125
+ align-items: stretch;
4126
+ }
4127
+ .pxd-panel-footer .pxd-button {
4128
+ width: 100%;
4129
+ }
4130
+ }
4131
+
4132
+ /* Reduced motion: every panel fades instead of moving. The base sheet zeroes animation durations
4133
+ for the whole surface; this comes later, so its !important wins and the fade is kept short. */
4134
+ @media (prefers-reduced-motion: reduce) {
4135
+ .pxd-panel[data-state="open"],
4136
+ .pxd-action-menu[data-state="open"],
4137
+ .pxd-panel-backdrop[data-state="open"] {
4138
+ animation: pxd-fade-in var(--pxd-motion-duration-short) linear;
4139
+ animation-duration: var(--pxd-motion-duration-short) !important;
4140
+ }
4141
+ .pxd-panel[data-state="closed"],
4142
+ .pxd-panel-backdrop[data-state="closed"] {
4143
+ animation: pxd-fade-out var(--pxd-motion-duration-short) linear;
4144
+ animation-duration: var(--pxd-motion-duration-short) !important;
4145
+ }
4146
+ .pxd-panel-sheet,
4147
+ .pxd-action-menu-chevron {
4148
+ transition: none;
4149
+ }
4150
+ }
4151
+
4152
+ /* Keyboard shortcut hints (Action.shortcut): one kbd per key after the label, hidden where there is
4153
+ no keyboard. The hint is decoration; aria-keyshortcuts on the button carries the meaning. */
4154
+ .pxd-kbd-hint {
4155
+ display: inline-flex;
4156
+ align-items: center;
4157
+ gap: calc(var(--pxd-space-inline-tight) / 2);
4158
+ margin-inline-start: var(--pxd-space-inline-tight);
4159
+ }
4160
+ .pxd-kbd {
4161
+ font-family: var(--pxd-type-label-small-family);
4162
+ font-size: var(--pxd-type-label-small-size);
4163
+ font-weight: var(--pxd-type-label-small-weight);
4164
+ line-height: var(--pxd-type-label-small-line-height);
4165
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
4166
+ font-variant-numeric: tabular-nums;
4167
+ min-width: 1.6em;
4168
+ padding: 0 var(--pxd-space-inline-tight);
4169
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4170
+ border-radius: var(--pxd-radius-small);
4171
+ color: var(--pxd-color-text-muted);
4172
+ text-align: center;
4173
+ white-space: nowrap;
4174
+ }
4175
+ /* On a filled button the muted grey is not guaranteed to contrast with the pack's primary, so the
4176
+ hint borrows the button's own foreground, only slightly faded, and the border fades further. */
4177
+ .pxd-button-primary .pxd-kbd,
4178
+ .pxd-button-danger .pxd-kbd {
4179
+ color: color-mix(in srgb, currentColor 85%, transparent);
4180
+ border-color: color-mix(in srgb, currentColor 55%, transparent);
4181
+ }
4182
+ /* A described button stacks label over description; the hint sits in the top trailing corner. */
4183
+ .pxd-button-described {
4184
+ position: relative;
4185
+ }
4186
+ .pxd-button-described .pxd-kbd-hint {
4187
+ position: absolute;
4188
+ inset-inline-end: var(--pxd-space-inset-default);
4189
+ top: var(--pxd-space-stack-tight);
4190
+ margin-inline-start: 0;
4191
+ }
4192
+ @container pxd (width < 30rem) {
4193
+ /* Stacked action bars are the phone layout, and phones have no keyboard. */
4194
+ .pxd-action-bar .pxd-kbd-hint {
4195
+ display: none;
4196
+ }
4197
+ }
4198
+
4199
+ /* Skeleton (PolyxdSkeleton): the loading state for a surface that has not arrived yet. Blocks are
4200
+ sized from the type and control tokens so the placeholder has the pack's rhythm, and shimmer
4201
+ with a sweep across two neutral mixes of the surface colour. */
4202
+ .pxd-skeleton-body {
4203
+ display: flex;
4204
+ flex-direction: column;
4205
+ gap: var(--polyxd-stack-apart);
4206
+ }
4207
+ .pxd-skeleton-block {
4208
+ --polyxd-skeleton-base: color-mix(in srgb, var(--pxd-color-text-muted) 14%, var(--pxd-color-surface-default));
4209
+ --polyxd-skeleton-sheen: color-mix(in srgb, var(--pxd-color-text-muted) 6%, var(--pxd-color-surface-default));
4210
+ display: block;
4211
+ flex: none;
4212
+ width: 100%;
4213
+ border-radius: var(--pxd-radius-small);
4214
+ background: linear-gradient(90deg, var(--polyxd-skeleton-base) 0 35%, var(--polyxd-skeleton-sheen) 50%, var(--polyxd-skeleton-base) 65% 100%);
4215
+ background-size: 300% 100%;
4216
+ animation: pxd-skeleton-sweep calc(var(--pxd-motion-duration-long) * 4) linear infinite;
4217
+ }
4218
+ @keyframes pxd-skeleton-sweep {
4219
+ from { background-position: 100% 0; }
4220
+ to { background-position: 0 0; }
4221
+ }
4222
+ /* Widths as a share of the row, so the lines look like text of varying length. */
4223
+ .pxd-skeleton-short { width: 30%; }
4224
+ .pxd-skeleton-medium { width: 55%; }
4225
+ .pxd-skeleton-long { width: 85%; }
4226
+ .pxd-skeleton-full { width: 100%; }
4227
+ /* Heights: each text block is one line of the role it stands in for. */
4228
+ .pxd-skeleton-title { height: calc(var(--pxd-type-title-page-size) * var(--pxd-type-title-page-line-height)); }
4229
+ .pxd-skeleton-line { height: calc(var(--pxd-type-body-default-size) * var(--pxd-type-body-default-line-height)); }
4230
+ .pxd-skeleton-small { height: calc(var(--pxd-type-body-small-size) * var(--pxd-type-body-small-line-height)); }
4231
+ .pxd-skeleton-value { height: calc(var(--pxd-type-numeric-display-size) * var(--pxd-type-numeric-display-line-height)); }
4232
+ .pxd-skeleton-field,
4233
+ .pxd-skeleton-button {
4234
+ height: var(--polyxd-control);
4235
+ border-radius: var(--pxd-radius-control);
4236
+ }
4237
+ .pxd-skeleton-button { width: calc(var(--pxd-size-target-min) * 2.5); }
4238
+ .pxd-skeleton-square {
4239
+ width: var(--polyxd-row-height);
4240
+ height: var(--polyxd-row-height);
4241
+ border-radius: var(--pxd-radius-default);
4242
+ }
4243
+ .pxd-skeleton-circle {
4244
+ width: var(--pxd-size-target-min);
4245
+ height: var(--pxd-size-target-min);
4246
+ border-radius: var(--pxd-radius-full);
4247
+ }
4248
+ .pxd-skeleton-badge {
4249
+ width: calc(var(--pxd-space-inset-comfortable) * 3);
4250
+ height: calc(var(--pxd-type-label-small-size) * var(--pxd-type-label-small-line-height));
4251
+ border-radius: var(--pxd-radius-full);
4252
+ }
4253
+ .pxd-skeleton-chart {
4254
+ height: 16rem; /* the chart's own max-height in .pxd-chart-svg */
4255
+ border-radius: var(--pxd-radius-default);
4256
+ }
4257
+ .pxd-skeleton-row {
4258
+ display: flex;
4259
+ align-items: center;
4260
+ gap: var(--pxd-space-inline-default);
4261
+ }
4262
+ .pxd-skeleton-lines {
4263
+ display: flex;
4264
+ flex: 1;
4265
+ min-width: 0;
4266
+ flex-direction: column;
4267
+ gap: var(--pxd-space-stack-tight);
4268
+ }
4269
+ .pxd-skeleton-actions {
4270
+ display: flex;
4271
+ flex-direction: row-reverse;
4272
+ justify-content: flex-end;
4273
+ gap: var(--pxd-space-inline-default);
4274
+ }
4275
+ .pxd-skeleton-dl {
4276
+ display: grid;
4277
+ grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
4278
+ gap: var(--polyxd-stack) var(--pxd-space-inline-loose);
4279
+ }
4280
+ .pxd-skeleton-dl .pxd-skeleton-row {
4281
+ display: contents;
4282
+ }
4283
+ .pxd-skeleton-cards {
4284
+ display: grid;
4285
+ grid-template-columns: repeat(3, minmax(0, 1fr));
4286
+ gap: var(--pxd-space-inline-default);
4287
+ }
4288
+ .pxd-skeleton-card {
4289
+ display: flex;
4290
+ flex-direction: column;
4291
+ gap: var(--polyxd-stack);
4292
+ padding: var(--pxd-space-inset-default);
4293
+ background: var(--pxd-color-surface-raised);
4294
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4295
+ border-radius: var(--pxd-radius-default);
4296
+ }
4297
+ @container pxd (width < 30rem) {
4298
+ .pxd-skeleton-actions {
4299
+ flex-direction: column;
4300
+ align-items: stretch;
4301
+ }
4302
+ .pxd-skeleton-actions .pxd-skeleton-button {
4303
+ width: 100%;
4304
+ }
4305
+ .pxd-skeleton-cards {
4306
+ grid-template-columns: minmax(0, 1fr);
4307
+ }
4308
+ }
4309
+ /* Reduced motion: flat blocks, no sweep. (The base sheet zeroes the duration; this also removes the gradient.) */
4310
+ @media (prefers-reduced-motion: reduce) {
4311
+ .pxd-skeleton-block {
4312
+ background: var(--polyxd-skeleton-base);
4313
+ animation: none;
4314
+ }
4315
+ }
4316
+
4317
+ /* ---- Form error summary ---- */
4318
+ /* Said once at the top of the fields, in the danger tokens as .pxd-field-error is; the links are
4319
+ the surface's link style on the surface itself, where the link colour is guaranteed readable. */
4320
+ .pxd-error-summary {
4321
+ display: flex;
4322
+ flex-direction: column;
4323
+ gap: var(--pxd-space-stack-tight);
4324
+ padding: var(--pxd-space-inset-default);
4325
+ border-left: var(--pxd-border-width-strong) solid var(--pxd-color-status-danger-emphasis);
4326
+ background: var(--pxd-color-surface-default);
4327
+ color: var(--pxd-color-text-default);
4328
+ }
4329
+ .pxd-error-summary:focus-visible {
4330
+ outline-offset: var(--pxd-focus-ring-offset);
4331
+ }
4332
+ .pxd-error-summary-title {
4333
+ margin: 0;
4334
+ color: var(--pxd-color-status-danger-foreground);
4335
+ font-family: var(--pxd-type-title-item-family);
4336
+ font-size: var(--pxd-type-title-item-size);
4337
+ font-weight: var(--pxd-type-title-item-weight);
4338
+ line-height: var(--pxd-type-title-item-line-height);
4339
+ letter-spacing: var(--pxd-type-title-item-letter-spacing);
4340
+ }
4341
+ .pxd-error-summary-list {
4342
+ display: flex;
4343
+ flex-direction: column;
4344
+ gap: var(--pxd-space-stack-tight);
4345
+ margin: 0;
4346
+ padding-left: 1.25em;
4347
+ }
4348
+ /* A control the summary marked is drawn like one the browser marked. */
4349
+ .pxd-input[aria-invalid="true"] {
4350
+ border-color: var(--pxd-color-status-danger-emphasis);
4351
+ border-width: var(--pxd-border-width-strong);
4352
+ }
4353
+
4354
+ /* ---- ActionBar overflow ---- */
4355
+ /* The "More actions" control sits where the least important action would have been. */
4356
+ .pxd-action-bar-more {
4357
+ flex: none;
4358
+ align-self: center;
4359
+ }
4360
+
4361
+ /* ---- Media gallery viewer ---- */
4362
+ /* Each resolved picture is a button; the viewer shows one at a time over the surface's scrim. */
4363
+ .pxd-gallery-item {
4364
+ display: block;
4365
+ width: 100%;
4366
+ padding: 0;
4367
+ border: 0;
4368
+ background: none;
4369
+ border-radius: var(--pxd-radius-default);
4370
+ cursor: pointer;
4371
+ }
4372
+ .pxd-gallery-item .pxd-gallery-image {
4373
+ display: block;
4374
+ }
4375
+ .pxd-viewer {
4376
+ position: fixed;
4377
+ inset: 0;
4378
+ z-index: 11;
4379
+ display: flex;
4380
+ flex-direction: column;
4381
+ align-items: center;
4382
+ justify-content: center;
4383
+ gap: var(--pxd-space-stack-default);
4384
+ padding: var(--pxd-space-inset-default);
4385
+ color: var(--pxd-color-text-default);
4386
+ }
4387
+ .pxd-viewer-figure {
4388
+ display: flex;
4389
+ flex-direction: column;
4390
+ align-items: center;
4391
+ gap: var(--pxd-space-stack-tight);
4392
+ margin: 0;
4393
+ min-height: 0;
4394
+ max-width: 100%;
4395
+ }
4396
+ .pxd-viewer-image {
4397
+ max-width: 100%;
4398
+ max-height: 80vh;
4399
+ object-fit: contain;
4400
+ border-radius: var(--pxd-radius-default);
4401
+ }
4402
+ /* Text and controls sit on the overlay surface, so they are readable whatever is behind the scrim. */
4403
+ .pxd-viewer-bar {
4404
+ display: flex;
4405
+ align-items: center;
4406
+ gap: var(--pxd-space-inline-default);
4407
+ width: min(100%, 48rem);
4408
+ padding: var(--pxd-space-inline-tight) var(--pxd-space-inset-compact);
4409
+ background: var(--pxd-color-surface-overlay);
4410
+ border-radius: var(--pxd-radius-default);
4411
+ box-shadow: var(--pxd-shadow-overlay);
4412
+ }
4413
+ .pxd-viewer-nav {
4414
+ width: auto;
4415
+ }
4416
+ .pxd-viewer-counter {
4417
+ flex: 1;
4418
+ font-size: var(--pxd-type-body-small-size);
4419
+ }
4420
+ .pxd-viewer-caption {
4421
+ padding: var(--pxd-space-inline-tight) var(--pxd-space-inset-compact);
4422
+ background: var(--pxd-color-surface-overlay);
4423
+ border-radius: var(--pxd-radius-default);
4424
+ color: var(--pxd-color-text-default);
4425
+ font-size: var(--pxd-type-body-small-size);
4426
+ text-align: center;
4427
+ }
4428
+ .pxd-viewer-close,
4429
+ .pxd-viewer-step {
4430
+ min-width: var(--pxd-size-target-min);
4431
+ min-height: var(--pxd-size-target-min);
4432
+ }
4433
+ .pxd-viewer-step:disabled {
4434
+ opacity: var(--pxd-opacity-state-disabled);
4435
+ cursor: not-allowed;
4436
+ }
4437
+
4438
+ /* ==== The shell (spec 0.3): Frame, AppBar, Navigation placements, Outlet, Footer, Custom ==== */
4439
+
4440
+ /* ---- Frame ---- */
4441
+ /* A shell is the product around its screens, so the surface's own padding and stack go: the
4442
+ Frame lays out its regions on its own width (data-pxd-layout) and the screens keep theirs.
4443
+ The frame fills the viewport unless the host says otherwise. */
4444
+ .pxd-surface-shell {
4445
+ display: flex;
4446
+ flex-direction: column;
4447
+ min-height: 100dvh;
4448
+ padding: 0;
4449
+ gap: 0;
4450
+ }
4451
+ .pxd-frame {
4452
+ /* How much of the top a sticky AppBar keeps, so a sticky navigation starts below it. */
4453
+ --polyxd-appbar-height: 0px;
4454
+ position: relative;
4455
+ flex: 1 1 auto;
4456
+ display: flex;
4457
+ flex-direction: column;
4458
+ min-width: 0;
4459
+ }
4460
+ .pxd-frame[data-pxd-appbar="standard"],
4461
+ .pxd-frame[data-pxd-appbar="large"] {
4462
+ --polyxd-appbar-height: 64px;
4463
+ }
4464
+ .pxd-frame[data-pxd-appbar="compact"] {
4465
+ --polyxd-appbar-height: 48px;
4466
+ }
4467
+ .pxd-frame:not([data-pxd-layout="compact"])[data-pxd-appbar="large"] {
4468
+ --polyxd-appbar-height: 120px;
4469
+ }
4470
+ /* The first focusable thing: off the top until it has focus, then a button over the header. */
4471
+ .pxd-skip-link {
4472
+ position: absolute;
4473
+ top: var(--pxd-space-inset-compact);
4474
+ inset-inline-start: var(--pxd-space-inset-compact);
4475
+ z-index: 8;
4476
+ display: inline-flex;
4477
+ align-items: center;
4478
+ min-height: var(--pxd-size-target-min);
4479
+ padding: 0 var(--pxd-space-inset-default);
4480
+ border-radius: var(--pxd-radius-control);
4481
+ background: var(--pxd-color-action-primary-background);
4482
+ color: var(--pxd-color-action-primary-foreground);
4483
+ font-family: var(--pxd-type-label-default-family);
4484
+ font-size: var(--pxd-type-label-default-size);
4485
+ font-weight: var(--pxd-type-label-default-weight);
4486
+ text-decoration: none;
4487
+ white-space: nowrap;
4488
+ transform: translateY(calc(-100% - var(--pxd-space-inset-comfortable) * 2));
4489
+ }
4490
+ .pxd-skip-link:focus-visible {
4491
+ transform: none;
4492
+ }
4493
+ .pxd-frame-banner .pxd-status {
4494
+ border-radius: 0;
4495
+ }
4496
+ /* Regions: navigation at the start, main beside it, an aside after; the footer below all.
4497
+ Wide keeps the three in one row; medium stacks the aside under main; compact stacks
4498
+ everything, with the navigation last on screen (a bottom bar) but still before main in
4499
+ reading order. */
4500
+ .pxd-frame-body {
4501
+ flex: 1 1 auto;
4502
+ display: grid;
4503
+ grid-template-columns: auto minmax(0, 1fr);
4504
+ grid-template-rows: minmax(0, 1fr);
4505
+ grid-template-areas: "nav main";
4506
+ align-items: stretch;
4507
+ }
4508
+ .pxd-frame-body:has(> .pxd-frame-aside) {
4509
+ grid-template-columns: auto minmax(0, 1fr) minmax(16rem, 20rem);
4510
+ grid-template-areas: "nav main aside";
4511
+ }
4512
+ .pxd-frame[data-pxd-layout="medium"] .pxd-frame-body:has(> .pxd-frame-aside) {
4513
+ grid-template-columns: auto minmax(0, 1fr);
4514
+ grid-template-rows: minmax(0, 1fr) auto;
4515
+ grid-template-areas: "nav main" "nav aside";
4516
+ }
4517
+ .pxd-frame[data-pxd-layout="compact"] .pxd-frame-body,
4518
+ .pxd-frame[data-pxd-layout="compact"] .pxd-frame-body:has(> .pxd-frame-aside) {
4519
+ grid-template-columns: minmax(0, 1fr);
4520
+ grid-template-rows: minmax(0, 1fr) auto auto;
4521
+ grid-template-areas: "main" "aside" "nav";
4522
+ }
4523
+ .pxd-frame-nav {
4524
+ grid-area: nav;
4525
+ min-width: 0;
4526
+ background: var(--pxd-color-surface-subtle);
4527
+ border-inline-end: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4528
+ }
4529
+ /* A drawer lives in the portal; its slot takes no room (an empty slot is a closed drawer). */
4530
+ .pxd-frame[data-pxd-nav="drawer"] .pxd-frame-nav {
4531
+ border: 0;
4532
+ background: transparent;
4533
+ }
4534
+ .pxd-frame[data-pxd-nav="drawer"] .pxd-frame-nav:empty {
4535
+ display: none;
4536
+ }
4537
+ .pxd-frame-main {
4538
+ grid-area: main;
4539
+ min-width: 0;
4540
+ width: 100%;
4541
+ background: var(--pxd-color-surface-default);
4542
+ }
4543
+ /* 'contained' centres main at measure.max × 1.6 (about 104 characters); 'full' uses everything. */
4544
+ .pxd-frame-width-contained .pxd-frame-main {
4545
+ max-width: calc(var(--pxd-measure-max) * 1.6ch);
4546
+ justify-self: center;
4547
+ }
4548
+ .pxd-frame-aside {
4549
+ grid-area: aside;
4550
+ min-width: 0;
4551
+ padding: var(--pxd-space-inset-comfortable);
4552
+ border-inline-start: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4553
+ background: var(--pxd-color-surface-subtle);
4554
+ }
4555
+ .pxd-frame[data-pxd-layout="medium"] .pxd-frame-aside,
4556
+ .pxd-frame[data-pxd-layout="compact"] .pxd-frame-aside {
4557
+ border-inline-start: 0;
4558
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4559
+ }
4560
+ .pxd-frame[data-pxd-layout="compact"] .pxd-frame-aside {
4561
+ padding: var(--pxd-space-inset-default);
4562
+ }
4563
+
4564
+ /* ---- Navigation placements ---- */
4565
+ /* Side (240px) and rail (80px) stay in view while the screen scrolls, below a sticky AppBar. */
4566
+ .pxd-nav-side,
4567
+ .pxd-nav-rail {
4568
+ position: sticky;
4569
+ top: var(--polyxd-appbar-height);
4570
+ max-height: calc(100dvh - var(--polyxd-appbar-height));
4571
+ overflow-y: auto;
4572
+ }
4573
+ .pxd-nav-side {
4574
+ width: 240px;
4575
+ padding: var(--pxd-space-inset-default) var(--pxd-space-inset-compact);
4576
+ }
4577
+ .pxd-nav-rail {
4578
+ width: 80px;
4579
+ padding: var(--pxd-space-stack-loose) 0;
4580
+ }
4581
+ .pxd-nav-rail ul {
4582
+ display: flex;
4583
+ flex-direction: column;
4584
+ gap: var(--pxd-space-stack-tight);
4585
+ }
4586
+ .pxd-nav-rail-item,
4587
+ .pxd-nav-bar-item {
4588
+ display: flex;
4589
+ flex-direction: column;
4590
+ align-items: center;
4591
+ justify-content: center;
4592
+ gap: var(--pxd-space-stack-tight);
4593
+ width: 100%;
4594
+ min-height: 56px;
4595
+ padding: var(--pxd-space-stack-tight) 0;
4596
+ border: 0;
4597
+ background: transparent;
4598
+ color: var(--pxd-color-text-muted);
4599
+ font-family: var(--pxd-type-label-small-family);
4600
+ font-size: var(--pxd-type-label-small-size);
4601
+ font-weight: var(--pxd-type-label-small-weight);
4602
+ line-height: var(--pxd-type-label-small-line-height);
4603
+ letter-spacing: var(--pxd-type-label-small-letter-spacing);
4604
+ cursor: pointer;
4605
+ }
4606
+ .pxd-nav-rail-icon,
4607
+ .pxd-nav-bar-icon {
4608
+ position: relative;
4609
+ display: inline-flex;
4610
+ align-items: center;
4611
+ justify-content: center;
4612
+ width: 56px;
4613
+ height: 32px;
4614
+ border-radius: var(--pxd-radius-full);
4615
+ transition: background var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
4616
+ }
4617
+ .pxd-nav-rail-item:hover .pxd-nav-rail-icon,
4618
+ .pxd-nav-bar-item:hover .pxd-nav-bar-icon {
4619
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), transparent);
4620
+ }
4621
+ /* The current item: the icon in a selection pill, the label in the default text colour. */
4622
+ .pxd-nav-rail-item.pxd-nav-current,
4623
+ .pxd-nav-bar-item.pxd-nav-current {
4624
+ background: transparent;
4625
+ color: var(--pxd-color-text-default);
4626
+ font-weight: var(--pxd-type-label-small-weight);
4627
+ }
4628
+ .pxd-nav-rail-item.pxd-nav-current .pxd-nav-rail-icon,
4629
+ .pxd-nav-bar-item.pxd-nav-current .pxd-nav-bar-icon {
4630
+ background: var(--pxd-color-selection-background);
4631
+ color: var(--pxd-color-selection-foreground);
4632
+ }
4633
+ .pxd-nav-rail .pxd-nav-label,
4634
+ .pxd-nav-bar .pxd-nav-label {
4635
+ flex: none;
4636
+ max-width: 100%;
4637
+ overflow: hidden;
4638
+ text-overflow: ellipsis;
4639
+ white-space: nowrap;
4640
+ text-align: center;
4641
+ }
4642
+ .pxd-nav-glyph {
4643
+ font-family: var(--pxd-type-label-default-family);
4644
+ font-size: var(--pxd-type-label-default-size);
4645
+ font-weight: var(--pxd-type-label-default-weight);
4646
+ }
4647
+ .pxd-nav-rail-icon .pxd-nav-badge,
4648
+ .pxd-nav-bar-icon .pxd-nav-badge {
4649
+ position: absolute;
4650
+ top: 0;
4651
+ inset-inline-start: calc(50% + 4px);
4652
+ min-width: 16px;
4653
+ height: 16px;
4654
+ padding: 0 var(--pxd-space-inline-tight);
4655
+ line-height: 16px;
4656
+ }
4657
+ /* Bar: 80px along the bottom, above the safe area; the slot sticks to the bottom of the view. */
4658
+ .pxd-frame[data-pxd-nav="bar"] .pxd-frame-nav {
4659
+ position: sticky;
4660
+ bottom: 0;
4661
+ z-index: 5;
4662
+ border-inline-end: 0;
4663
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4664
+ }
4665
+ .pxd-nav-bar {
4666
+ padding-bottom: env(safe-area-inset-bottom);
4667
+ }
4668
+ .pxd-nav-bar ul {
4669
+ display: flex;
4670
+ height: 80px;
4671
+ }
4672
+ .pxd-nav-bar li {
4673
+ flex: 1 1 0;
4674
+ min-width: 0;
4675
+ }
4676
+ .pxd-nav-bar-item {
4677
+ height: 100%;
4678
+ padding-inline: var(--pxd-space-inline-tight);
4679
+ }
4680
+
4681
+ /* ---- AppBar ---- */
4682
+ .pxd-appbar-sentinel {
4683
+ height: 0;
4684
+ }
4685
+ .pxd-appbar {
4686
+ display: flex;
4687
+ flex-direction: column;
4688
+ z-index: 6;
4689
+ background: var(--pxd-color-surface-default);
4690
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4691
+ transition: box-shadow var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
4692
+ }
4693
+ .pxd-appbar-sticky {
4694
+ position: sticky;
4695
+ top: 0;
4696
+ }
4697
+ .pxd-appbar[data-pxd-scrolled] {
4698
+ box-shadow: var(--pxd-shadow-raised);
4699
+ }
4700
+ .pxd-appbar-row {
4701
+ display: flex;
4702
+ align-items: center;
4703
+ gap: var(--pxd-space-inline-default);
4704
+ min-height: 64px;
4705
+ padding: 0 var(--pxd-space-inset-default);
4706
+ }
4707
+ .pxd-appbar-compact .pxd-appbar-row {
4708
+ min-height: 48px;
4709
+ }
4710
+ .pxd-appbar-headline {
4711
+ display: flex;
4712
+ align-items: flex-end;
4713
+ min-height: 56px;
4714
+ padding: 0 var(--pxd-space-inset-comfortable) var(--pxd-space-stack-default);
4715
+ font-family: var(--pxd-type-title-page-family);
4716
+ font-size: var(--pxd-type-title-page-size);
4717
+ font-weight: var(--pxd-type-title-page-weight);
4718
+ line-height: var(--pxd-type-title-page-line-height);
4719
+ letter-spacing: var(--pxd-type-title-page-letter-spacing);
4720
+ }
4721
+ .pxd-appbar-leading,
4722
+ .pxd-appbar-menu {
4723
+ flex: none;
4724
+ }
4725
+ .pxd-appbar-brand {
4726
+ display: flex;
4727
+ align-items: center;
4728
+ gap: var(--pxd-space-inline-default);
4729
+ min-width: 0;
4730
+ }
4731
+ .pxd-appbar-title {
4732
+ font-family: var(--pxd-type-title-section-family);
4733
+ font-size: var(--pxd-type-title-section-size);
4734
+ font-weight: var(--pxd-type-title-section-weight);
4735
+ line-height: var(--pxd-type-title-section-line-height);
4736
+ letter-spacing: var(--pxd-type-title-section-letter-spacing);
4737
+ white-space: nowrap;
4738
+ overflow: hidden;
4739
+ text-overflow: ellipsis;
4740
+ }
4741
+ .pxd-appbar-logo {
4742
+ display: block;
4743
+ height: 32px;
4744
+ width: auto;
4745
+ }
4746
+ .pxd-appbar-mark {
4747
+ display: inline-flex;
4748
+ align-items: center;
4749
+ justify-content: center;
4750
+ flex: none;
4751
+ width: 32px;
4752
+ height: 32px;
4753
+ border-radius: var(--pxd-radius-small);
4754
+ background: var(--pxd-color-action-primary-background);
4755
+ color: var(--pxd-color-action-primary-foreground);
4756
+ font-family: var(--pxd-type-label-small-family);
4757
+ font-size: var(--pxd-type-label-small-size);
4758
+ font-weight: var(--pxd-type-label-small-weight);
4759
+ }
4760
+ /* Search grows in the middle on wide layouts; on compact it opens from an icon on its own row. */
4761
+ .pxd-appbar-search {
4762
+ flex: 1 1 auto;
4763
+ min-width: 0;
4764
+ max-width: 40rem;
4765
+ margin-inline: auto;
4766
+ }
4767
+ .pxd-appbar-search .pxd-field-label,
4768
+ .pxd-appbar-search .pxd-label {
4769
+ position: absolute;
4770
+ width: 1px;
4771
+ height: 1px;
4772
+ overflow: hidden;
4773
+ clip: rect(0 0 0 0);
4774
+ white-space: nowrap;
4775
+ }
4776
+ .pxd-appbar-search-toggle {
4777
+ flex: none;
4778
+ margin-inline-start: auto;
4779
+ }
4780
+ .pxd-appbar-search-row {
4781
+ flex: none;
4782
+ width: 100%;
4783
+ max-width: none;
4784
+ padding: 0 var(--pxd-space-inset-default) var(--pxd-space-inset-compact);
4785
+ }
4786
+ .pxd-appbar-end {
4787
+ display: flex;
4788
+ align-items: center;
4789
+ gap: var(--pxd-space-inline-default);
4790
+ flex: none;
4791
+ margin-inline-start: auto;
4792
+ }
4793
+ .pxd-appbar-search + .pxd-appbar-end,
4794
+ .pxd-appbar-search-toggle + .pxd-appbar-end {
4795
+ margin-inline-start: 0;
4796
+ }
4797
+ /* The bar's actions stay in one row whatever the width; the ActionBar folds the rest away. */
4798
+ .pxd-appbar .pxd-action-bar {
4799
+ flex-direction: row-reverse;
4800
+ flex-wrap: nowrap;
4801
+ align-items: center;
4802
+ }
4803
+ .pxd-appbar-account {
4804
+ display: flex;
4805
+ align-items: center;
4806
+ }
4807
+ .pxd-appbar-account .pxd-identity-name,
4808
+ .pxd-appbar-account .pxd-identity-detail {
4809
+ display: none;
4810
+ }
4811
+ .pxd-appbar-account .pxd-identity-button {
4812
+ margin: 0;
4813
+ min-width: var(--pxd-size-target-min);
4814
+ justify-content: center;
4815
+ }
4816
+
4817
+ /* ---- Outlet ---- */
4818
+ .pxd-outlet {
4819
+ display: flex;
4820
+ flex-direction: column;
4821
+ gap: var(--pxd-space-stack-loose);
4822
+ min-width: 0;
4823
+ padding: var(--pxd-space-inset-comfortable);
4824
+ outline: none;
4825
+ }
4826
+ .pxd-frame[data-pxd-layout="compact"] .pxd-outlet {
4827
+ padding: var(--pxd-space-inset-default);
4828
+ }
4829
+ .pxd-outlet:focus-visible {
4830
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
4831
+ outline-offset: calc(-1 * var(--pxd-focus-ring-width));
4832
+ }
4833
+ /* A screen document inside the outlet is a screen, not a second frame: no padding of its own. */
4834
+ .pxd-outlet > .pxd-surface {
4835
+ padding: 0;
4836
+ }
4837
+ .pxd-outlet-skeleton {
4838
+ padding: 0;
4839
+ }
4840
+
4841
+ /* ---- Footer ---- */
4842
+ .pxd-footer {
4843
+ display: flex;
4844
+ flex-direction: column;
4845
+ gap: var(--pxd-space-stack-loose);
4846
+ padding: var(--pxd-space-inset-comfortable);
4847
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4848
+ background: var(--pxd-color-surface-subtle);
4849
+ }
4850
+ .pxd-footer-groups {
4851
+ display: grid;
4852
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
4853
+ gap: var(--pxd-space-stack-loose) var(--pxd-space-inline-loose);
4854
+ }
4855
+ .pxd-frame[data-pxd-layout="compact"] .pxd-footer {
4856
+ padding: var(--pxd-space-inset-default);
4857
+ }
4858
+ .pxd-frame[data-pxd-layout="compact"] .pxd-footer-groups {
4859
+ grid-template-columns: minmax(0, 1fr);
4860
+ }
4861
+ .pxd-footer-group ul {
4862
+ display: flex;
4863
+ flex-direction: column;
4864
+ }
4865
+ .pxd-footer-heading {
4866
+ margin: 0 0 var(--pxd-space-stack-default);
4867
+ font-family: var(--pxd-type-label-default-family);
4868
+ font-size: var(--pxd-type-label-default-size);
4869
+ font-weight: var(--pxd-type-label-default-weight);
4870
+ line-height: var(--pxd-type-label-default-line-height);
4871
+ letter-spacing: var(--pxd-type-label-default-letter-spacing);
4872
+ }
4873
+ /* Links in the default text colour: the link colour is only guaranteed on surface.default and the
4874
+ footer sits on surface.subtle. Each is a full target tall, so a thumb reaches one at a time. */
4875
+ .pxd-footer-link {
4876
+ display: inline-flex;
4877
+ align-items: center;
4878
+ justify-content: flex-start;
4879
+ min-width: var(--polyxd-control);
4880
+ min-height: var(--polyxd-control);
4881
+ color: var(--pxd-color-text-default);
4882
+ }
4883
+ .pxd-footer-legal {
4884
+ display: flex;
4885
+ flex-wrap: wrap;
4886
+ align-items: center;
4887
+ justify-content: space-between;
4888
+ gap: var(--pxd-space-stack-default) var(--pxd-space-inline-loose);
4889
+ color: var(--pxd-color-text-muted);
4890
+ font-family: var(--pxd-type-body-small-family);
4891
+ font-size: var(--pxd-type-body-small-size);
4892
+ line-height: var(--pxd-type-body-small-line-height);
4893
+ }
4894
+ .pxd-footer-legal-text {
4895
+ margin: 0;
4896
+ }
4897
+ .pxd-footer-aside {
4898
+ display: flex;
4899
+ align-items: center;
4900
+ gap: var(--pxd-space-inline-default);
4901
+ }
4902
+
4903
+ /* ---- Custom ---- */
4904
+ /* A named slot only wraps when it has a label to give; otherwise the host's element stands alone. */
4905
+ .pxd-custom {
4906
+ display: contents;
4907
+ }
4908
+
4909
+ /* ---- Columns ---- */
4910
+ /* Side-by-side on the surface's width, a stack below the collapse point; the children's order
4911
+ is the reading order either way. */
4912
+ .pxd-columns {
4913
+ display: grid;
4914
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
4915
+ gap: var(--pxd-space-stack-loose) var(--pxd-space-inline-loose);
4916
+ align-items: stretch;
4917
+ }
4918
+ .pxd-columns-one-third { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
4919
+ .pxd-columns-halves { grid-template-columns: repeat(2, minmax(0, 1fr)); }
4920
+ .pxd-columns-thirds { grid-template-columns: repeat(3, minmax(0, 1fr)); }
4921
+ .pxd-columns-sidebar-start { grid-template-columns: minmax(16rem, 18rem) minmax(0, 1fr); }
4922
+ .pxd-columns-sidebar-end { grid-template-columns: minmax(0, 1fr) minmax(16rem, 18rem); }
4923
+ .pxd-columns-align-start { align-items: start; }
4924
+ .pxd-columns-align-center { align-items: center; }
4925
+ .pxd-columns > * {
4926
+ min-width: 0;
4927
+ }
4928
+ @container pxd (width < 40rem) {
4929
+ .pxd-columns-collapse-compact {
4930
+ grid-template-columns: minmax(0, 1fr);
4931
+ }
4932
+ }
4933
+ @container pxd (width < 64rem) {
4934
+ .pxd-columns-collapse-medium {
4935
+ grid-template-columns: minmax(0, 1fr);
4936
+ }
4937
+ }
4938
+
4939
+ /* ---- Split ---- */
4940
+ /* Two panes with a border between; the list scrolls on its own. The list's share follows the
4941
+ ratio, or the handle when the split is resizable. Compact shows one pane at a time. */
4942
+ .pxd-split {
4943
+ --polyxd-split-share: 33.333%;
4944
+ display: grid;
4945
+ grid-template-columns: minmax(16rem, 1fr) minmax(0, 2fr);
4946
+ align-items: stretch;
4947
+ min-height: 0;
4948
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4949
+ border-radius: var(--pxd-radius-default);
4950
+ overflow: hidden;
4951
+ }
4952
+ .pxd-split-balanced { grid-template-columns: repeat(2, minmax(0, 1fr)); }
4953
+ .pxd-split-wide { grid-template-columns: minmax(0, 2fr) minmax(16rem, 1fr); }
4954
+ .pxd-split-resizable {
4955
+ grid-template-columns: var(--polyxd-split-share) var(--pxd-size-target-min) minmax(0, 1fr);
4956
+ }
4957
+ .pxd-split-primary {
4958
+ min-width: 0;
4959
+ max-height: 100%;
4960
+ overflow-y: auto;
4961
+ padding: var(--pxd-space-inset-default);
4962
+ border-inline-end: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
4963
+ }
4964
+ .pxd-split-resizable .pxd-split-primary {
4965
+ border-inline-end: 0;
4966
+ }
4967
+ .pxd-split-detail {
4968
+ display: flex;
4969
+ flex-direction: column;
4970
+ gap: var(--pxd-space-stack-loose);
4971
+ min-width: 0;
4972
+ padding: var(--pxd-space-inset-comfortable);
4973
+ outline: none;
4974
+ }
4975
+ .pxd-split-detail:focus-visible {
4976
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
4977
+ outline-offset: calc(-1 * var(--pxd-focus-ring-width));
4978
+ }
4979
+ /* The handle is a full target wide, the line it draws is one border wide. */
4980
+ .pxd-split-handle {
4981
+ display: flex;
4982
+ align-items: stretch;
4983
+ justify-content: center;
4984
+ cursor: col-resize;
4985
+ touch-action: none;
4986
+ }
4987
+ .pxd-split-handle-line {
4988
+ width: var(--pxd-border-width-default);
4989
+ background: var(--pxd-color-border-default);
4990
+ transition: background var(--pxd-motion-duration-short) var(--pxd-motion-easing-standard);
4991
+ }
4992
+ .pxd-split-handle:hover .pxd-split-handle-line {
4993
+ width: var(--pxd-border-width-strong);
4994
+ background: var(--pxd-color-border-strong);
4995
+ }
4996
+ .pxd-split-handle:focus-visible {
4997
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
4998
+ outline-offset: calc(-1 * var(--pxd-focus-ring-width));
4999
+ }
5000
+ .pxd-split-compact {
5001
+ grid-template-columns: minmax(0, 1fr);
5002
+ }
5003
+ .pxd-split-compact .pxd-split-primary {
5004
+ border-inline-end: 0;
5005
+ max-height: none;
5006
+ }
5007
+ .pxd-split-compact .pxd-split-detail {
5008
+ padding: var(--pxd-space-inset-default);
5009
+ }
5010
+ .pxd-split-back {
5011
+ align-self: flex-start;
5012
+ }