@polyxd/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +177 -0
  3. package/README.md +39 -0
  4. package/dist/components/avatar.d.ts +10 -0
  5. package/dist/components/avatar.js +47 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/chart.d.ts +5 -0
  8. package/dist/components/chart.js +98 -0
  9. package/dist/components/chart.js.map +1 -0
  10. package/dist/components/content.d.ts +23 -0
  11. package/dist/components/content.js +108 -0
  12. package/dist/components/content.js.map +1 -0
  13. package/dist/components/filter.d.ts +9 -0
  14. package/dist/components/filter.js +97 -0
  15. package/dist/components/filter.js.map +1 -0
  16. package/dist/components/flow.d.ts +22 -0
  17. package/dist/components/flow.js +143 -0
  18. package/dist/components/flow.js.map +1 -0
  19. package/dist/components/index.d.ts +10 -0
  20. package/dist/components/index.js +19 -0
  21. package/dist/components/index.js.map +1 -0
  22. package/dist/components/inputs.d.ts +38 -0
  23. package/dist/components/inputs.js +230 -0
  24. package/dist/components/inputs.js.map +1 -0
  25. package/dist/components/navigation.d.ts +8 -0
  26. package/dist/components/navigation.js +51 -0
  27. package/dist/components/navigation.js.map +1 -0
  28. package/dist/components/structure.d.ts +25 -0
  29. package/dist/components/structure.js +58 -0
  30. package/dist/components/structure.js.map +1 -0
  31. package/dist/components/table.d.ts +9 -0
  32. package/dist/components/table.js +144 -0
  33. package/dist/components/table.js.map +1 -0
  34. package/dist/context.d.ts +93 -0
  35. package/dist/context.js +42 -0
  36. package/dist/context.js.map +1 -0
  37. package/dist/data.d.ts +26 -0
  38. package/dist/data.js +52 -0
  39. package/dist/data.js.map +1 -0
  40. package/dist/format.d.ts +12 -0
  41. package/dist/format.js +51 -0
  42. package/dist/format.js.map +1 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/surface.d.ts +37 -0
  47. package/dist/surface.js +80 -0
  48. package/dist/surface.js.map +1 -0
  49. package/package.json +53 -0
  50. package/src/styles.css +2182 -0
  51. package/themes/antd.css +300 -0
  52. package/themes/bootstrap.css +300 -0
  53. package/themes/carbon.css +310 -0
  54. package/themes/chakra.css +300 -0
  55. package/themes/fluent.css +300 -0
  56. package/themes/govuk.css +150 -0
  57. package/themes/mantine.css +300 -0
  58. package/themes/material3.css +300 -0
  59. package/themes/polaris.css +300 -0
  60. package/themes/primer.css +300 -0
  61. package/themes/radix.css +300 -0
  62. package/themes/shadcn.css +300 -0
  63. package/themes/spectrum.css +300 -0
package/src/styles.css ADDED
@@ -0,0 +1,2182 @@
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: 50%;
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: 50%;
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: 50%;
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: 50%;
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: 50%;
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
+ .pxd-overlay {
947
+ position: fixed;
948
+ inset: 0;
949
+ background: var(--pxd-color-scrim);
950
+ z-index: 10;
951
+ }
952
+ .pxd-dialog {
953
+ position: fixed;
954
+ left: 50%;
955
+ top: 50%;
956
+ z-index: 11;
957
+ transform: translate(-50%, -50%);
958
+ width: min(32rem, calc(100% - 2 * var(--pxd-space-inset-default)));
959
+ max-height: calc(100% - 2 * var(--pxd-space-inset-default));
960
+ overflow-y: auto;
961
+ display: flex;
962
+ flex-direction: column;
963
+ gap: var(--pxd-space-stack-default);
964
+ padding: var(--pxd-space-inset-comfortable);
965
+ background: var(--pxd-color-surface-overlay);
966
+ color: var(--pxd-color-text-default);
967
+ border-radius: var(--pxd-radius-large);
968
+ box-shadow: var(--pxd-shadow-overlay);
969
+ }
970
+ /* A confirmation that is the whole surface sits inline, centred in the surface. */
971
+ .pxd-dialog-inline {
972
+ position: static;
973
+ transform: none;
974
+ margin: var(--pxd-space-stack-loose) auto;
975
+ max-height: none;
976
+ }
977
+ /* Danger is shown by a graphic accent; title text stays in the text colour (4.5:1 guaranteed). */
978
+ .pxd-dialog-destructive {
979
+ border-top: 4px solid var(--pxd-color-status-danger-emphasis);
980
+ }
981
+ .pxd-dialog-description {
982
+ display: flex;
983
+ flex-direction: column;
984
+ gap: var(--pxd-space-stack-tight);
985
+ }
986
+ .pxd-dialog-consequence {
987
+ font-weight: 600;
988
+ }
989
+ .pxd-dialog .pxd-action-bar {
990
+ margin-top: var(--pxd-space-stack-tight);
991
+ }
992
+
993
+ .pxd-comparison {
994
+ display: flex;
995
+ flex-direction: column;
996
+ gap: var(--pxd-space-stack-default);
997
+ }
998
+ .pxd-comparison-items {
999
+ display: grid;
1000
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
1001
+ gap: var(--pxd-space-inline-loose);
1002
+ }
1003
+ .pxd-comparison-item {
1004
+ display: flex;
1005
+ flex-direction: column;
1006
+ gap: var(--pxd-space-stack-default);
1007
+ padding: var(--pxd-space-inset-default);
1008
+ background: var(--pxd-color-surface-raised);
1009
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1010
+ border-radius: var(--pxd-radius-default);
1011
+ }
1012
+ .pxd-comparison-item.pxd-recommended {
1013
+ border: var(--pxd-border-width-strong) solid var(--pxd-color-action-primary-background);
1014
+ }
1015
+ .pxd-comparison-title {
1016
+ display: flex;
1017
+ flex-wrap: wrap;
1018
+ align-items: center;
1019
+ gap: var(--pxd-space-inline-default);
1020
+ }
1021
+ .pxd-comparison-item .pxd-detail-row {
1022
+ grid-template-columns: 1fr;
1023
+ gap: 2px;
1024
+ padding: var(--pxd-space-stack-tight) 0;
1025
+ }
1026
+ .pxd-comparison-item .pxd-button {
1027
+ margin-top: auto;
1028
+ }
1029
+ .pxd-best {
1030
+ margin-left: var(--pxd-space-inline-tight);
1031
+ padding: 0 var(--pxd-space-inline-tight);
1032
+ border-radius: var(--pxd-radius-small);
1033
+ background: var(--pxd-color-status-success-background);
1034
+ color: var(--pxd-color-status-success-foreground);
1035
+ font-weight: 600;
1036
+ }
1037
+
1038
+ .pxd-unknown {
1039
+ padding: var(--pxd-space-inset-compact);
1040
+ border: 1px dashed var(--pxd-color-status-danger-emphasis);
1041
+ background: var(--pxd-color-status-danger-background);
1042
+ color: var(--pxd-color-status-danger-foreground);
1043
+ }
1044
+
1045
+ @media (prefers-reduced-motion: reduce) {
1046
+ .pxd-surface *,
1047
+ .pxd-surface *::before,
1048
+ .pxd-surface *::after {
1049
+ transition-duration: 0ms !important;
1050
+ animation-duration: 0ms !important;
1051
+ }
1052
+ }
1053
+
1054
+ /* ---- Batch 1: building blocks from the flow designs (design/flows) ---- */
1055
+
1056
+ /* Search: a pill with the icon inside; the label is visually hidden but remains the accessible name. */
1057
+ .pxd-search {
1058
+ display: flex;
1059
+ align-items: center;
1060
+ gap: var(--pxd-space-inline-default);
1061
+ min-height: calc(var(--polyxd-control) + 8px);
1062
+ padding: 0 var(--pxd-space-inset-default);
1063
+ border-radius: var(--pxd-radius-full);
1064
+ background: var(--pxd-color-surface-subtle);
1065
+ color: var(--pxd-color-text-muted);
1066
+ }
1067
+ .pxd-search:focus-within {
1068
+ outline: var(--pxd-focus-ring-width) solid var(--pxd-color-border-focus);
1069
+ outline-offset: var(--pxd-focus-ring-offset);
1070
+ }
1071
+ .pxd-search-compact {
1072
+ min-height: var(--polyxd-control);
1073
+ }
1074
+ .pxd-search-input {
1075
+ flex: 1;
1076
+ min-width: 0;
1077
+ min-height: var(--polyxd-control);
1078
+ border: 0;
1079
+ background: transparent;
1080
+ color: var(--pxd-color-text-default);
1081
+ font-size: var(--pxd-type-body-default-size);
1082
+ }
1083
+ .pxd-search-input:focus-visible {
1084
+ outline: none;
1085
+ }
1086
+ .pxd-search-input::placeholder {
1087
+ color: var(--pxd-color-text-muted);
1088
+ }
1089
+
1090
+ /* Hero amount: the one number a surface is about. */
1091
+ .pxd-hero-field {
1092
+ display: flex;
1093
+ flex-direction: column;
1094
+ align-items: center;
1095
+ gap: var(--pxd-space-stack-tight);
1096
+ padding: var(--pxd-space-stack-loose) 0 var(--pxd-space-stack-default);
1097
+ text-align: center;
1098
+ }
1099
+ .pxd-hero-label {
1100
+ color: var(--pxd-color-text-muted);
1101
+ font-size: var(--pxd-type-body-small-size);
1102
+ }
1103
+ .pxd-hero-input {
1104
+ display: flex;
1105
+ align-items: baseline;
1106
+ justify-content: center;
1107
+ gap: 4px;
1108
+ max-width: 100%;
1109
+ }
1110
+ .pxd-hero-symbol {
1111
+ font-size: calc(var(--pxd-type-numeric-display-size) * 1.1);
1112
+ color: var(--pxd-color-text-muted);
1113
+ }
1114
+ .pxd-hero-value {
1115
+ min-width: 1ch;
1116
+ max-width: 100%;
1117
+ border: 0;
1118
+ border-bottom: var(--pxd-border-width-strong) solid transparent;
1119
+ background: transparent;
1120
+ color: var(--pxd-color-text-default);
1121
+ font-family: var(--pxd-type-numeric-display-family);
1122
+ font-size: calc(var(--pxd-type-numeric-display-size) * 1.6);
1123
+ line-height: 1.1;
1124
+ font-variant-numeric: tabular-nums;
1125
+ text-align: center;
1126
+ field-sizing: content;
1127
+ }
1128
+ .pxd-hero-value:focus-visible {
1129
+ outline: none;
1130
+ border-bottom-color: var(--pxd-color-border-focus);
1131
+ }
1132
+ .pxd-hero-help {
1133
+ max-width: none;
1134
+ }
1135
+
1136
+ /* Chips: single choice (radio) and multiple (checkbox), for a few short options. */
1137
+ .pxd-chips {
1138
+ display: flex;
1139
+ flex-wrap: wrap;
1140
+ gap: var(--pxd-space-inline-default);
1141
+ }
1142
+ .pxd-chip {
1143
+ display: inline-flex;
1144
+ align-items: center;
1145
+ gap: 6px;
1146
+ min-height: var(--polyxd-control);
1147
+ padding: 0 var(--pxd-space-inset-default);
1148
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-strong);
1149
+ border-radius: var(--pxd-radius-control);
1150
+ background: transparent;
1151
+ color: var(--pxd-color-text-default);
1152
+ font-family: var(--pxd-type-label-default-family);
1153
+ font-size: var(--pxd-type-label-default-size);
1154
+ font-weight: var(--pxd-type-label-default-weight);
1155
+ cursor: pointer;
1156
+ }
1157
+ .pxd-chip[data-state="checked"] {
1158
+ border-color: transparent;
1159
+ background: var(--pxd-color-selection-background);
1160
+ color: var(--pxd-color-selection-foreground);
1161
+ }
1162
+ .pxd-chip-check {
1163
+ display: inline-flex;
1164
+ }
1165
+
1166
+ /* Avatars: initials on a tone chosen per name, from contrast-guaranteed pairs. */
1167
+ .pxd-avatar {
1168
+ flex: none;
1169
+ display: inline-flex;
1170
+ align-items: center;
1171
+ justify-content: center;
1172
+ border-radius: 50%;
1173
+ object-fit: cover;
1174
+ font-weight: 600;
1175
+ }
1176
+ .pxd-avatar-primary { background: var(--pxd-color-selection-background); color: var(--pxd-color-selection-foreground); }
1177
+ .pxd-avatar-secondary { background: var(--pxd-color-surface-subtle); color: var(--pxd-color-text-default); }
1178
+ .pxd-avatar-tertiary { background: var(--pxd-color-status-info-background); color: var(--pxd-color-status-info-foreground); }
1179
+ .pxd-avatar-success { background: var(--pxd-color-status-success-background); color: var(--pxd-color-status-success-foreground); }
1180
+ .pxd-avatar-warning { background: var(--pxd-color-status-warning-background); color: var(--pxd-color-status-warning-foreground); }
1181
+
1182
+ /* People picker: recent faces, then a list. */
1183
+ .pxd-people-group {
1184
+ display: flex;
1185
+ flex-direction: column;
1186
+ gap: var(--pxd-space-stack-default);
1187
+ }
1188
+ .pxd-people-recent {
1189
+ display: flex;
1190
+ gap: var(--pxd-space-inline-default);
1191
+ overflow-x: auto;
1192
+ padding: 2px;
1193
+ }
1194
+ .pxd-person-tile {
1195
+ display: flex;
1196
+ flex-direction: column;
1197
+ align-items: center;
1198
+ gap: 6px;
1199
+ width: 72px;
1200
+ flex: none;
1201
+ padding: 6px 0;
1202
+ border: 0;
1203
+ border-radius: var(--pxd-radius-default);
1204
+ background: transparent;
1205
+ color: var(--pxd-color-text-default);
1206
+ cursor: pointer;
1207
+ }
1208
+ .pxd-person-tile[data-state="checked"] .pxd-avatar {
1209
+ box-shadow:
1210
+ 0 0 0 var(--pxd-border-width-strong) var(--pxd-color-surface-default),
1211
+ 0 0 0 calc(var(--pxd-border-width-strong) * 2) var(--pxd-color-action-primary-background);
1212
+ }
1213
+ .pxd-person-face {
1214
+ position: relative;
1215
+ display: inline-flex;
1216
+ }
1217
+ .pxd-person-tick {
1218
+ position: absolute;
1219
+ right: -2px;
1220
+ bottom: -2px;
1221
+ display: inline-flex;
1222
+ align-items: center;
1223
+ justify-content: center;
1224
+ width: 22px;
1225
+ height: 22px;
1226
+ border-radius: 50%;
1227
+ border: 2px solid var(--pxd-color-surface-default);
1228
+ background: var(--pxd-color-action-primary-background);
1229
+ color: var(--pxd-color-action-primary-foreground);
1230
+ }
1231
+ .pxd-person-name {
1232
+ max-width: 72px;
1233
+ overflow: hidden;
1234
+ text-overflow: ellipsis;
1235
+ white-space: nowrap;
1236
+ font-size: var(--pxd-type-label-small-size);
1237
+ }
1238
+ .pxd-people-list {
1239
+ display: flex;
1240
+ flex-direction: column;
1241
+ }
1242
+ .pxd-person-row {
1243
+ display: flex;
1244
+ align-items: center;
1245
+ gap: var(--pxd-space-inline-loose);
1246
+ min-height: calc(var(--polyxd-control) + 8px);
1247
+ padding: 6px var(--pxd-space-inset-compact);
1248
+ border: 0;
1249
+ border-radius: var(--pxd-radius-default);
1250
+ background: transparent;
1251
+ color: var(--pxd-color-text-default);
1252
+ text-align: left;
1253
+ cursor: pointer;
1254
+ }
1255
+ .pxd-person-row:hover {
1256
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), transparent);
1257
+ }
1258
+ .pxd-person-row[data-state="checked"] {
1259
+ background: var(--pxd-color-selection-background);
1260
+ color: var(--pxd-color-selection-foreground);
1261
+ }
1262
+ .pxd-person-row[data-state="checked"] .pxd-option-description {
1263
+ color: inherit;
1264
+ }
1265
+ .pxd-person-text {
1266
+ flex: 1;
1267
+ display: flex;
1268
+ flex-direction: column;
1269
+ font-size: var(--pxd-type-body-default-size);
1270
+ }
1271
+ .pxd-person-check {
1272
+ display: inline-flex;
1273
+ }
1274
+
1275
+ /* Range: two thumbs and min/max fields. */
1276
+ .pxd-range-fields {
1277
+ display: flex;
1278
+ align-items: flex-end;
1279
+ gap: var(--pxd-space-inline-default);
1280
+ max-width: 32rem;
1281
+ }
1282
+ .pxd-range-fields label {
1283
+ flex: 1;
1284
+ display: flex;
1285
+ flex-direction: column;
1286
+ gap: var(--pxd-space-stack-tight);
1287
+ font-size: var(--pxd-type-label-small-size);
1288
+ color: var(--pxd-color-text-muted);
1289
+ }
1290
+ .pxd-range-fields > span {
1291
+ padding-bottom: calc(var(--pxd-size-target-min) / 2 - 10px);
1292
+ color: var(--pxd-color-text-muted);
1293
+ }
1294
+
1295
+ /* Grid collections: visual items side by side. */
1296
+ .pxd-collection-grid {
1297
+ display: grid;
1298
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1299
+ gap: var(--pxd-space-stack-loose) var(--pxd-space-inline-default);
1300
+ }
1301
+ @container pxd (width >= 36rem) {
1302
+ .pxd-collection-grid {
1303
+ grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
1304
+ gap: var(--pxd-space-stack-loose) var(--pxd-space-inline-loose);
1305
+ }
1306
+ }
1307
+ .pxd-collection-grid .pxd-card {
1308
+ flex-direction: column !important;
1309
+ box-shadow: none;
1310
+ background: transparent;
1311
+ border: 0;
1312
+ }
1313
+ .pxd-collection-grid .pxd-card-media {
1314
+ flex: none !important;
1315
+ }
1316
+ .pxd-collection-grid .pxd-card-media .pxd-media {
1317
+ aspect-ratio: 1;
1318
+ border-radius: var(--pxd-radius-default);
1319
+ }
1320
+ .pxd-collection-grid .pxd-card-body {
1321
+ padding: var(--pxd-space-stack-tight) 2px 0;
1322
+ }
1323
+
1324
+ /* Receipt: people read amounts from the right. */
1325
+ .pxd-receipt dl {
1326
+ display: flex;
1327
+ flex-direction: column;
1328
+ gap: var(--pxd-space-stack-tight);
1329
+ padding: var(--pxd-space-inset-default);
1330
+ border-radius: var(--pxd-radius-default);
1331
+ background: var(--pxd-color-surface-subtle);
1332
+ }
1333
+ .pxd-receipt .pxd-detail-row {
1334
+ display: flex;
1335
+ justify-content: space-between;
1336
+ align-items: baseline;
1337
+ gap: var(--pxd-space-inline-loose);
1338
+ padding: 0;
1339
+ border: 0;
1340
+ }
1341
+ .pxd-receipt .pxd-detail-row dd {
1342
+ text-align: right;
1343
+ font-variant-numeric: tabular-nums;
1344
+ }
1345
+ .pxd-receipt .pxd-free {
1346
+ color: var(--pxd-color-status-success-foreground);
1347
+ background: var(--pxd-color-status-success-background);
1348
+ padding: 0 var(--pxd-space-inline-tight);
1349
+ border-radius: var(--pxd-radius-small);
1350
+ }
1351
+ .pxd-receipt .pxd-total {
1352
+ margin-top: var(--pxd-space-stack-tight);
1353
+ padding-top: var(--pxd-space-stack-default);
1354
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1355
+ font-weight: 600;
1356
+ }
1357
+ .pxd-receipt .pxd-total dt {
1358
+ color: var(--pxd-color-text-default);
1359
+ }
1360
+ @container pxd (width < 30rem) {
1361
+ .pxd-receipt .pxd-detail-row {
1362
+ flex-direction: row;
1363
+ }
1364
+ }
1365
+
1366
+ /* Confirmation: who it's for, the amount, what happens. */
1367
+ .pxd-dialog-subject {
1368
+ display: flex;
1369
+ align-items: center;
1370
+ gap: var(--pxd-space-inline-default);
1371
+ }
1372
+ .pxd-dialog-subject-title {
1373
+ font-weight: 600;
1374
+ }
1375
+ .pxd-dialog-subject-sub {
1376
+ font-size: var(--pxd-type-body-small-size);
1377
+ color: var(--pxd-color-text-muted);
1378
+ }
1379
+ .pxd-dialog-amount {
1380
+ font-family: var(--pxd-type-numeric-display-family);
1381
+ font-size: calc(var(--pxd-type-numeric-display-size) * 1.3);
1382
+ line-height: 1.1;
1383
+ font-variant-numeric: tabular-nums;
1384
+ }
1385
+ .pxd-dialog-consequence {
1386
+ display: flex;
1387
+ gap: var(--pxd-space-inline-default);
1388
+ align-items: flex-start;
1389
+ margin: 0;
1390
+ font-weight: 400;
1391
+ font-size: var(--pxd-type-body-small-size);
1392
+ color: var(--pxd-color-text-muted);
1393
+ }
1394
+ .pxd-dialog-consequence svg {
1395
+ flex: none;
1396
+ margin-top: 2px;
1397
+ }
1398
+ .pxd-consequences {
1399
+ display: grid;
1400
+ gap: var(--pxd-space-stack-default);
1401
+ }
1402
+ @container pxd (width >= 40rem) {
1403
+ .pxd-consequences {
1404
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1405
+ }
1406
+ }
1407
+ .pxd-consequences li {
1408
+ display: flex;
1409
+ gap: var(--pxd-space-inline-default);
1410
+ align-items: flex-start;
1411
+ }
1412
+ .pxd-consequence-icon {
1413
+ flex: none;
1414
+ display: inline-flex;
1415
+ align-items: center;
1416
+ justify-content: center;
1417
+ width: 40px;
1418
+ height: 40px;
1419
+ border-radius: var(--pxd-radius-default);
1420
+ background: var(--pxd-color-surface-subtle);
1421
+ color: var(--pxd-color-text-muted);
1422
+ }
1423
+ .pxd-consequence-title,
1424
+ .pxd-consequence-detail {
1425
+ display: block;
1426
+ }
1427
+ .pxd-consequence-detail {
1428
+ font-size: var(--pxd-type-body-small-size);
1429
+ color: var(--pxd-color-text-muted);
1430
+ }
1431
+
1432
+ /* On phones, a form's actions stay within reach at the bottom, full width. */
1433
+ @container pxd (width < 30rem) {
1434
+ .pxd-form > .pxd-action-bar,
1435
+ .pxd-steps-content > .pxd-action-bar {
1436
+ position: sticky;
1437
+ bottom: 0;
1438
+ z-index: 1;
1439
+ margin: 0 calc(var(--pxd-space-inset-comfortable) * -1) calc(var(--pxd-space-inset-comfortable) * -1);
1440
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-comfortable) var(--pxd-space-inset-comfortable);
1441
+ background: var(--pxd-color-surface-default);
1442
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1443
+ }
1444
+ .pxd-form > .pxd-action-bar .pxd-button,
1445
+ .pxd-steps-content > .pxd-action-bar .pxd-button {
1446
+ width: 100%;
1447
+ }
1448
+ }
1449
+
1450
+ /* ---- Batch 2: layouts and patterns from the flow designs ---- */
1451
+
1452
+ /* Empty states: an icon tile, encouraging copy, up to two actions. */
1453
+ .pxd-status-empty {
1454
+ border: 0;
1455
+ padding: var(--pxd-space-stack-loose) var(--pxd-space-inset-comfortable);
1456
+ }
1457
+ .pxd-status-empty .pxd-status-icon {
1458
+ width: 64px;
1459
+ height: 64px;
1460
+ border-radius: var(--pxd-radius-large);
1461
+ }
1462
+ .pxd-status-empty .pxd-status-action .pxd-action-bar {
1463
+ justify-content: center;
1464
+ }
1465
+
1466
+ /* Undo: a snackbar at the bottom of the surface. */
1467
+ .pxd-snackbar {
1468
+ position: sticky;
1469
+ bottom: var(--pxd-space-inset-default);
1470
+ z-index: 2;
1471
+ display: flex;
1472
+ align-items: center;
1473
+ gap: var(--pxd-space-inline-default);
1474
+ width: fit-content;
1475
+ max-width: 100%;
1476
+ margin: var(--pxd-space-stack-default) auto 0;
1477
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) var(--pxd-space-inset-default);
1478
+ border-radius: var(--pxd-radius-default);
1479
+ background: var(--pxd-color-text-default);
1480
+ color: var(--pxd-color-surface-default);
1481
+ box-shadow: var(--pxd-shadow-overlay);
1482
+ }
1483
+ .pxd-snackbar-text {
1484
+ margin: 0;
1485
+ }
1486
+ .pxd-snackbar .pxd-button {
1487
+ background: transparent;
1488
+ color: var(--pxd-color-surface-default);
1489
+ border-color: transparent;
1490
+ text-decoration: underline;
1491
+ }
1492
+
1493
+ /* Progress on a card. */
1494
+ .pxd-progress {
1495
+ display: flex;
1496
+ align-items: center;
1497
+ gap: var(--pxd-space-inline-default);
1498
+ }
1499
+ .pxd-progress-track {
1500
+ flex: 1;
1501
+ height: 6px;
1502
+ border-radius: var(--pxd-radius-full);
1503
+ background: var(--pxd-color-border-default);
1504
+ overflow: hidden;
1505
+ }
1506
+ .pxd-progress-fill {
1507
+ height: 100%;
1508
+ border-radius: inherit;
1509
+ background: var(--pxd-color-action-primary-background);
1510
+ }
1511
+ .pxd-progress-label {
1512
+ flex: none;
1513
+ font-size: var(--pxd-type-body-small-size);
1514
+ color: var(--pxd-color-text-muted);
1515
+ font-variant-numeric: tabular-nums;
1516
+ }
1517
+
1518
+ /* Form with a summary beside it (wide) or before the action (compact). */
1519
+ @container pxd (width >= 48rem) {
1520
+ .pxd-form-with-aside {
1521
+ display: grid;
1522
+ grid-template-columns: minmax(0, 1fr) minmax(16rem, 22rem);
1523
+ grid-template-areas: "fields aside" "actions aside";
1524
+ align-items: start;
1525
+ column-gap: var(--pxd-space-inline-loose);
1526
+ row-gap: var(--pxd-space-stack-loose);
1527
+ }
1528
+ .pxd-form-with-aside > .pxd-form-fields { grid-area: fields; }
1529
+ .pxd-form-with-aside > .pxd-action-bar { grid-area: actions; }
1530
+ .pxd-form-with-aside > .pxd-form-aside {
1531
+ grid-area: aside;
1532
+ position: sticky;
1533
+ top: var(--pxd-space-inset-default);
1534
+ }
1535
+ }
1536
+ .pxd-form-aside {
1537
+ display: flex;
1538
+ flex-direction: column;
1539
+ gap: var(--pxd-space-stack-default);
1540
+ }
1541
+
1542
+ /* Comparison: one recommendation with its reason, grouped attributes, yes/no marks. */
1543
+ .pxd-recommendation {
1544
+ display: flex;
1545
+ flex-direction: column;
1546
+ align-items: flex-start;
1547
+ gap: var(--pxd-space-stack-tight);
1548
+ margin: 0;
1549
+ }
1550
+ .pxd-recommendation-reason {
1551
+ font-size: var(--pxd-type-body-small-size);
1552
+ color: var(--pxd-color-text-muted);
1553
+ }
1554
+ .pxd-comparison-group-label {
1555
+ margin: 0;
1556
+ padding-top: var(--pxd-space-stack-tight);
1557
+ font-family: var(--pxd-type-label-small-family);
1558
+ font-size: var(--pxd-type-label-small-size);
1559
+ font-weight: 600;
1560
+ color: var(--pxd-color-text-muted);
1561
+ }
1562
+ .pxd-yes,
1563
+ .pxd-no {
1564
+ display: inline-flex;
1565
+ vertical-align: middle;
1566
+ }
1567
+ .pxd-yes {
1568
+ color: var(--pxd-color-text-default);
1569
+ }
1570
+ .pxd-no {
1571
+ color: var(--pxd-color-text-muted);
1572
+ }
1573
+
1574
+ /* Filter panel: sidebar on wide, a sheet on compact. */
1575
+ .pxd-filter-layout {
1576
+ display: grid;
1577
+ grid-template-columns: minmax(14rem, 18rem) minmax(0, 1fr);
1578
+ gap: var(--pxd-space-inline-loose);
1579
+ align-items: start;
1580
+ }
1581
+ .pxd-filter-sidebar {
1582
+ position: sticky;
1583
+ top: var(--pxd-space-inset-default);
1584
+ display: flex;
1585
+ flex-direction: column;
1586
+ gap: var(--pxd-space-stack-default);
1587
+ }
1588
+ .pxd-filter-title {
1589
+ margin: 0;
1590
+ font-family: var(--pxd-type-title-item-family);
1591
+ font-size: var(--pxd-type-title-item-size);
1592
+ font-weight: var(--pxd-type-title-item-weight);
1593
+ }
1594
+ .pxd-filter-results {
1595
+ display: flex;
1596
+ flex-direction: column;
1597
+ gap: var(--pxd-space-stack-default);
1598
+ min-width: 0;
1599
+ }
1600
+ .pxd-filter-status {
1601
+ display: flex;
1602
+ align-items: center;
1603
+ flex-wrap: wrap;
1604
+ gap: var(--pxd-space-inline-default);
1605
+ }
1606
+ .pxd-filter-count {
1607
+ margin: 0;
1608
+ color: var(--pxd-color-text-muted);
1609
+ font-size: var(--pxd-type-body-small-size);
1610
+ }
1611
+ .pxd-filter-trigger {
1612
+ background: transparent;
1613
+ }
1614
+ .pxd-filter-chips {
1615
+ display: flex;
1616
+ flex-wrap: wrap;
1617
+ align-items: center;
1618
+ gap: var(--pxd-space-inline-default);
1619
+ margin: 0;
1620
+ padding: 0;
1621
+ list-style: none;
1622
+ }
1623
+ .pxd-filter-chip {
1624
+ border-color: transparent;
1625
+ background: var(--pxd-color-selection-background);
1626
+ color: var(--pxd-color-selection-foreground);
1627
+ }
1628
+ .pxd-sheet {
1629
+ position: fixed;
1630
+ left: 0;
1631
+ right: 0;
1632
+ bottom: 0;
1633
+ z-index: 11;
1634
+ display: flex;
1635
+ flex-direction: column;
1636
+ max-height: 85%;
1637
+ background: var(--pxd-color-surface-overlay);
1638
+ color: var(--pxd-color-text-default);
1639
+ border-radius: var(--pxd-radius-large) var(--pxd-radius-large) 0 0;
1640
+ box-shadow: var(--pxd-shadow-overlay);
1641
+ }
1642
+ .pxd-sheet-header {
1643
+ display: flex;
1644
+ align-items: center;
1645
+ justify-content: space-between;
1646
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-compact) 0 var(--pxd-space-inset-default);
1647
+ }
1648
+ .pxd-sheet-title {
1649
+ margin: 0;
1650
+ font-family: var(--pxd-type-title-section-family);
1651
+ font-size: var(--pxd-type-title-section-size);
1652
+ font-weight: var(--pxd-type-title-section-weight);
1653
+ }
1654
+ .pxd-sheet-body {
1655
+ flex: 1;
1656
+ overflow-y: auto;
1657
+ padding: var(--pxd-space-inset-default);
1658
+ }
1659
+ .pxd-sheet-footer {
1660
+ display: flex;
1661
+ gap: var(--pxd-space-inline-default);
1662
+ padding: var(--pxd-space-inset-compact) var(--pxd-space-inset-default) var(--pxd-space-inset-default);
1663
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1664
+ }
1665
+ .pxd-sheet-footer .pxd-button {
1666
+ flex: 1;
1667
+ }
1668
+ .pxd-icon-button {
1669
+ display: inline-flex;
1670
+ align-items: center;
1671
+ justify-content: center;
1672
+ width: var(--pxd-size-target-min);
1673
+ height: var(--polyxd-control);
1674
+ border: 0;
1675
+ border-radius: var(--pxd-radius-control);
1676
+ background: transparent;
1677
+ color: var(--pxd-color-text-default);
1678
+ cursor: pointer;
1679
+ }
1680
+
1681
+ /* ---- Batch 4: dense B2B layouts (app shell, page header, data tables) ---- */
1682
+
1683
+ /* Density comes from Design Direction. It sets row height and how tight rows are packed;
1684
+ touch targets keep their minimum, so compact is for pointer surfaces. */
1685
+ .pxd-surface {
1686
+ --polyxd-row-height: 40px;
1687
+ --polyxd-row-pad: var(--pxd-space-inset-compact);
1688
+ /* Space between two things that belong together, and between two separate questions. */
1689
+ --polyxd-stack: var(--pxd-space-stack-default);
1690
+ --polyxd-stack-apart: var(--pxd-space-stack-loose);
1691
+ --polyxd-inset: var(--pxd-space-inset-comfortable);
1692
+ --polyxd-control: var(--pxd-size-target-min);
1693
+ }
1694
+ .pxd-surface[data-pxd-density="compact"] {
1695
+ --polyxd-row-height: 32px;
1696
+ --polyxd-row-pad: var(--pxd-space-inline-default);
1697
+ --polyxd-stack: var(--pxd-space-stack-tight);
1698
+ --polyxd-stack-apart: var(--pxd-space-stack-default);
1699
+ --polyxd-inset: var(--pxd-space-inset-default);
1700
+ /* Controls shrink only where there is a pointer; touch keeps its 44px floor. */
1701
+ --polyxd-control: max(36px, calc(var(--pxd-size-target-min) - 12px));
1702
+ }
1703
+ .pxd-surface[data-pxd-density="spacious"] {
1704
+ --polyxd-row-height: 48px;
1705
+ --polyxd-row-pad: var(--pxd-space-inset-default);
1706
+ --polyxd-stack: var(--pxd-space-stack-loose);
1707
+ --polyxd-stack-apart: var(--pxd-space-stack-section);
1708
+ --polyxd-inset: var(--pxd-space-inset-comfortable);
1709
+ --polyxd-control: calc(var(--pxd-size-target-min) + 4px);
1710
+ }
1711
+ @media (pointer: coarse) {
1712
+ .pxd-surface[data-pxd-density="compact"] {
1713
+ --polyxd-control: max(44px, calc(var(--pxd-size-target-min) - 4px));
1714
+ }
1715
+ }
1716
+
1717
+ /* App shell: navigation beside the page. */
1718
+ .pxd-surface-with-nav {
1719
+ display: grid;
1720
+ grid-template-columns: auto minmax(0, 1fr);
1721
+ align-items: start;
1722
+ gap: var(--pxd-space-inline-loose);
1723
+ }
1724
+ .pxd-surface-main {
1725
+ display: flex;
1726
+ flex-direction: column;
1727
+ gap: var(--pxd-space-stack-loose);
1728
+ min-width: 0;
1729
+ }
1730
+ .pxd-nav {
1731
+ display: flex;
1732
+ flex-direction: column;
1733
+ gap: var(--pxd-space-stack-default);
1734
+ min-width: 12rem;
1735
+ }
1736
+ .pxd-nav ul {
1737
+ list-style: none;
1738
+ margin: 0;
1739
+ padding: 0;
1740
+ }
1741
+ .pxd-nav-group-label {
1742
+ margin: 0 0 var(--pxd-space-stack-tight);
1743
+ padding: 0 var(--pxd-space-inline-default);
1744
+ font-family: var(--pxd-type-label-small-family);
1745
+ font-size: var(--pxd-type-label-small-size);
1746
+ color: var(--pxd-color-text-muted);
1747
+ }
1748
+ .pxd-nav-item {
1749
+ display: flex;
1750
+ align-items: center;
1751
+ gap: var(--pxd-space-inline-default);
1752
+ width: 100%;
1753
+ min-height: var(--polyxd-control);
1754
+ padding: 0 var(--pxd-space-inset-compact);
1755
+ border: 0;
1756
+ border-left: 3px solid transparent;
1757
+ border-radius: 0 var(--pxd-radius-default) var(--pxd-radius-default) 0;
1758
+ background: transparent;
1759
+ color: var(--pxd-color-text-muted);
1760
+ font-family: var(--pxd-type-label-default-family);
1761
+ font-size: var(--pxd-type-label-default-size);
1762
+ text-align: left;
1763
+ cursor: pointer;
1764
+ }
1765
+ .pxd-nav-item:hover {
1766
+ background: color-mix(in srgb, var(--pxd-color-text-default) calc(var(--pxd-opacity-state-hover) * 100%), transparent);
1767
+ }
1768
+ .pxd-nav-current {
1769
+ border-left-color: var(--pxd-color-action-primary-background);
1770
+ background: var(--pxd-color-surface-subtle);
1771
+ color: var(--pxd-color-text-default);
1772
+ font-weight: 600;
1773
+ }
1774
+ .pxd-nav-label {
1775
+ flex: 1;
1776
+ }
1777
+ .pxd-nav-badge {
1778
+ flex: none;
1779
+ min-width: 20px;
1780
+ padding: 0 6px;
1781
+ border-radius: var(--pxd-radius-full);
1782
+ background: var(--pxd-color-status-danger-background);
1783
+ color: var(--pxd-color-status-danger-foreground);
1784
+ font-size: var(--pxd-type-label-small-size);
1785
+ text-align: center;
1786
+ font-variant-numeric: tabular-nums;
1787
+ }
1788
+ .pxd-nav-drawer {
1789
+ position: fixed;
1790
+ left: 0;
1791
+ top: 0;
1792
+ bottom: 0;
1793
+ z-index: 11;
1794
+ width: min(20rem, 85%);
1795
+ padding-bottom: var(--pxd-space-inset-default);
1796
+ overflow-y: auto;
1797
+ background: var(--pxd-color-surface-overlay);
1798
+ box-shadow: var(--pxd-shadow-overlay);
1799
+ }
1800
+
1801
+ /* Page header: where you are, what state it's in, what you can do. */
1802
+ .pxd-page-header {
1803
+ display: flex;
1804
+ flex-direction: column;
1805
+ gap: var(--pxd-space-stack-tight);
1806
+ }
1807
+ .pxd-breadcrumbs ol {
1808
+ display: flex;
1809
+ flex-wrap: wrap;
1810
+ gap: var(--pxd-space-inline-default);
1811
+ margin: 0;
1812
+ padding: 0;
1813
+ list-style: none;
1814
+ font-size: var(--pxd-type-body-small-size);
1815
+ color: var(--pxd-color-text-muted);
1816
+ }
1817
+ .pxd-breadcrumbs li + li::before {
1818
+ content: "/";
1819
+ margin-right: var(--pxd-space-inline-default);
1820
+ color: var(--pxd-color-text-muted);
1821
+ }
1822
+ .pxd-page-header-main {
1823
+ display: flex;
1824
+ align-items: center;
1825
+ gap: var(--pxd-space-inline-default);
1826
+ flex-wrap: wrap;
1827
+ }
1828
+ .pxd-page-header-text {
1829
+ flex: 1;
1830
+ min-width: 12rem;
1831
+ }
1832
+ .pxd-page-header-text .pxd-surface-title {
1833
+ display: flex;
1834
+ align-items: center;
1835
+ gap: var(--pxd-space-inline-default);
1836
+ flex-wrap: wrap;
1837
+ margin: 0;
1838
+ }
1839
+ .pxd-surface-subtitle {
1840
+ margin: var(--pxd-space-stack-tight) 0 0;
1841
+ color: var(--pxd-color-text-muted);
1842
+ }
1843
+ .pxd-page-header-actions {
1844
+ flex: none;
1845
+ }
1846
+ .pxd-link {
1847
+ border: 0;
1848
+ padding: 0;
1849
+ background: none;
1850
+ color: var(--pxd-color-text-link);
1851
+ font: inherit;
1852
+ text-align: left;
1853
+ text-decoration: underline;
1854
+ cursor: pointer;
1855
+ }
1856
+
1857
+ /* A surface that opens beside what it came from. */
1858
+ .pxd-surface-panel {
1859
+ height: 100%;
1860
+ border-left: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1861
+ background: var(--pxd-color-surface-default);
1862
+ }
1863
+
1864
+ /* Table: toolbar, saved views, sorting, selection, paging. */
1865
+ .pxd-table-wrap {
1866
+ display: flex;
1867
+ flex-direction: column;
1868
+ border: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1869
+ border-radius: var(--pxd-radius-default);
1870
+ overflow: hidden;
1871
+ }
1872
+ .pxd-table-views {
1873
+ display: flex;
1874
+ flex-wrap: wrap;
1875
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1876
+ background: var(--pxd-color-surface-default);
1877
+ }
1878
+ .pxd-table-view {
1879
+ display: inline-flex;
1880
+ align-items: center;
1881
+ gap: var(--pxd-space-inline-default);
1882
+ min-height: var(--polyxd-control);
1883
+ padding: 0 var(--pxd-space-inset-compact);
1884
+ border: 0;
1885
+ border-bottom: 2px solid transparent;
1886
+ background: transparent;
1887
+ color: var(--pxd-color-text-muted);
1888
+ font-family: var(--pxd-type-label-default-family);
1889
+ font-size: var(--pxd-type-label-default-size);
1890
+ cursor: pointer;
1891
+ }
1892
+ .pxd-table-view-current {
1893
+ border-bottom-color: var(--pxd-color-action-primary-background);
1894
+ color: var(--pxd-color-text-default);
1895
+ font-weight: 600;
1896
+ }
1897
+ .pxd-views-tab .pxd-views-count {
1898
+ margin-left: var(--pxd-space-inline-default);
1899
+ }
1900
+ .pxd-views-count {
1901
+ font-size: var(--pxd-type-label-small-size);
1902
+ color: var(--pxd-color-text-muted);
1903
+ font-variant-numeric: tabular-nums;
1904
+ }
1905
+ .pxd-table-toolbar {
1906
+ display: flex;
1907
+ align-items: center;
1908
+ gap: var(--pxd-space-inline-default);
1909
+ padding: var(--pxd-space-inline-default);
1910
+ background: var(--pxd-color-surface-subtle);
1911
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
1912
+ }
1913
+ .pxd-table-toolbar > .pxd-field {
1914
+ flex: 1;
1915
+ min-width: 0;
1916
+ max-width: 24rem;
1917
+ }
1918
+ .pxd-table-toolbar-spacer {
1919
+ flex: 1;
1920
+ }
1921
+ .pxd-table-bulk {
1922
+ background: var(--pxd-color-selection-background);
1923
+ color: var(--pxd-color-selection-foreground);
1924
+ }
1925
+ .pxd-bulk-count {
1926
+ margin: 0;
1927
+ flex: 1;
1928
+ font-weight: 600;
1929
+ }
1930
+ .pxd-table-bulk .pxd-button-tertiary {
1931
+ color: inherit;
1932
+ border-color: currentColor;
1933
+ }
1934
+ .pxd-table-scroll {
1935
+ overflow-x: auto;
1936
+ }
1937
+ .pxd-table th,
1938
+ .pxd-table td {
1939
+ height: var(--polyxd-row-height);
1940
+ padding: 0 var(--polyxd-row-pad);
1941
+ }
1942
+ .pxd-table thead th {
1943
+ background: var(--pxd-color-surface-subtle);
1944
+ white-space: nowrap;
1945
+ }
1946
+ .pxd-sort {
1947
+ display: inline-flex;
1948
+ align-items: center;
1949
+ gap: 6px;
1950
+ min-height: var(--polyxd-control);
1951
+ border: 0;
1952
+ padding: 0;
1953
+ background: none;
1954
+ color: inherit;
1955
+ font: inherit;
1956
+ font-weight: 600;
1957
+ cursor: pointer;
1958
+ }
1959
+ .pxd-table-select {
1960
+ width: 3rem;
1961
+ }
1962
+ .pxd-checkbox {
1963
+ display: inline-flex;
1964
+ align-items: center;
1965
+ justify-content: center;
1966
+ width: 24px;
1967
+ height: 24px;
1968
+ border: var(--pxd-border-width-strong) solid var(--pxd-color-border-strong);
1969
+ border-radius: var(--pxd-radius-small);
1970
+ background: var(--pxd-color-surface-default);
1971
+ color: var(--pxd-color-action-primary-foreground);
1972
+ cursor: pointer;
1973
+ }
1974
+ .pxd-checkbox[data-state="checked"],
1975
+ .pxd-checkbox[data-state="indeterminate"] {
1976
+ border-color: var(--pxd-color-action-primary-background);
1977
+ background: var(--pxd-color-action-primary-background);
1978
+ }
1979
+ /* Selected rows are marked at the edge, not tinted: link text is only guaranteed
1980
+ readable on the default surface. */
1981
+ .pxd-row-selected > :first-child {
1982
+ box-shadow: inset calc(var(--pxd-border-width-strong) + 1px) 0 0 0 var(--pxd-color-action-primary-background);
1983
+ }
1984
+ .pxd-entity {
1985
+ display: flex;
1986
+ align-items: center;
1987
+ gap: var(--pxd-space-inline-default);
1988
+ }
1989
+ /* In a dense row, the whole row height is the target (WCAG 2.5.8 asks for 24px). */
1990
+ .pxd-table .pxd-link,
1991
+ .pxd-row-item .pxd-link {
1992
+ display: flex;
1993
+ align-items: center;
1994
+ min-height: max(var(--polyxd-row-height), 24px);
1995
+ }
1996
+ .pxd-row-item .pxd-link {
1997
+ min-height: var(--polyxd-control);
1998
+ }
1999
+ .pxd-entity-text {
2000
+ display: flex;
2001
+ flex-direction: column;
2002
+ }
2003
+ .pxd-entity-name {
2004
+ font-weight: 500;
2005
+ }
2006
+ .pxd-entity-secondary {
2007
+ font-size: var(--pxd-type-body-small-size);
2008
+ color: var(--pxd-color-text-muted);
2009
+ }
2010
+ .pxd-paging {
2011
+ display: flex;
2012
+ align-items: center;
2013
+ gap: var(--pxd-space-inline-loose);
2014
+ padding: 0 var(--pxd-space-inline-default);
2015
+ min-height: var(--polyxd-control);
2016
+ border-top: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2017
+ background: var(--pxd-color-surface-subtle);
2018
+ font-size: var(--pxd-type-body-small-size);
2019
+ flex-wrap: wrap;
2020
+ }
2021
+ .pxd-paging-size {
2022
+ display: inline-flex;
2023
+ align-items: center;
2024
+ gap: var(--pxd-space-inline-default);
2025
+ color: var(--pxd-color-text-muted);
2026
+ }
2027
+ .pxd-paging-size select {
2028
+ min-height: var(--polyxd-control);
2029
+ border: 0;
2030
+ background: transparent;
2031
+ color: var(--pxd-color-text-default);
2032
+ font: inherit;
2033
+ }
2034
+ .pxd-paging-range {
2035
+ margin: 0;
2036
+ flex: 1;
2037
+ font-variant-numeric: tabular-nums;
2038
+ }
2039
+ .pxd-paging-controls {
2040
+ display: flex;
2041
+ align-items: center;
2042
+ gap: var(--pxd-space-inline-default);
2043
+ }
2044
+ .pxd-paging-page {
2045
+ font-variant-numeric: tabular-nums;
2046
+ color: var(--pxd-color-text-muted);
2047
+ }
2048
+ .pxd-icon-button:disabled {
2049
+ opacity: var(--pxd-opacity-state-disabled);
2050
+ cursor: default;
2051
+ }
2052
+
2053
+ /* Row actions menu. */
2054
+ .pxd-menu {
2055
+ z-index: 12;
2056
+ min-width: 12rem;
2057
+ padding: var(--pxd-space-inline-tight);
2058
+ border-radius: var(--pxd-radius-default);
2059
+ background: var(--pxd-color-surface-overlay);
2060
+ box-shadow: var(--pxd-shadow-overlay);
2061
+ }
2062
+ .pxd-menu-item {
2063
+ display: flex;
2064
+ align-items: center;
2065
+ min-height: var(--polyxd-control);
2066
+ padding: 0 var(--pxd-space-inset-compact);
2067
+ border-radius: var(--pxd-radius-small);
2068
+ color: var(--pxd-color-text-default);
2069
+ cursor: pointer;
2070
+ }
2071
+ .pxd-menu-item[data-highlighted] {
2072
+ background: var(--pxd-color-surface-subtle);
2073
+ outline: none;
2074
+ }
2075
+ .pxd-menu-item-danger {
2076
+ color: var(--pxd-color-status-danger-foreground);
2077
+ }
2078
+
2079
+ /* A table on a phone: rows, not columns. */
2080
+ .pxd-row-list {
2081
+ list-style: none;
2082
+ margin: 0;
2083
+ padding: 0;
2084
+ }
2085
+ .pxd-row-item {
2086
+ display: flex;
2087
+ align-items: center;
2088
+ gap: var(--pxd-space-inline-default);
2089
+ padding: var(--pxd-space-inline-default) var(--pxd-space-inset-compact);
2090
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2091
+ }
2092
+ .pxd-row-main {
2093
+ flex: 1;
2094
+ min-width: 0;
2095
+ }
2096
+ .pxd-row-details {
2097
+ margin: 2px 0 0;
2098
+ font-size: var(--pxd-type-body-small-size);
2099
+ color: var(--pxd-color-text-muted);
2100
+ }
2101
+
2102
+ /* Record pages: a grid of short fields, activity as a timeline, notices inside the page. */
2103
+ .pxd-detail-grid dl {
2104
+ display: grid;
2105
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
2106
+ gap: var(--pxd-space-stack-default) var(--pxd-space-inline-loose);
2107
+ }
2108
+ .pxd-detail-grid .pxd-detail-row {
2109
+ display: flex;
2110
+ flex-direction: column;
2111
+ gap: 2px;
2112
+ padding: 0;
2113
+ border: 0;
2114
+ }
2115
+ .pxd-detail-grid dt {
2116
+ font-size: var(--pxd-type-label-small-size);
2117
+ color: var(--pxd-color-text-muted);
2118
+ }
2119
+ .pxd-timeline .pxd-collection-item {
2120
+ position: relative;
2121
+ padding-left: var(--pxd-space-inset-default);
2122
+ border-left: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2123
+ }
2124
+ .pxd-timeline .pxd-collection-item::before {
2125
+ content: "";
2126
+ position: absolute;
2127
+ left: -5px;
2128
+ top: 10px;
2129
+ width: 8px;
2130
+ height: 8px;
2131
+ border-radius: 50%;
2132
+ background: var(--pxd-color-border-strong);
2133
+ }
2134
+ .pxd-status-notice {
2135
+ align-items: center;
2136
+ border-radius: 0;
2137
+ border-left: 4px solid var(--pxd-color-status-warning-emphasis);
2138
+ }
2139
+ .pxd-status-notice .pxd-status-body {
2140
+ flex: 1;
2141
+ }
2142
+ .pxd-status-notice .pxd-status-action {
2143
+ margin: 0;
2144
+ }
2145
+ .pxd-status-error.pxd-status-notice {
2146
+ border-left-color: var(--pxd-color-status-danger-emphasis);
2147
+ }
2148
+ .pxd-status-info.pxd-status-notice {
2149
+ border-left-color: var(--pxd-color-status-info-emphasis);
2150
+ }
2151
+
2152
+ /* Settings-style forms: label and help on the left, control on the right. */
2153
+ @container pxd (width >= 48rem) {
2154
+ .pxd-form-horizontal .pxd-field {
2155
+ display: grid;
2156
+ grid-template-columns: minmax(12rem, 18rem) minmax(0, 1fr);
2157
+ gap: var(--pxd-space-inline-loose);
2158
+ align-items: start;
2159
+ padding-bottom: var(--pxd-space-stack-default);
2160
+ border-bottom: var(--pxd-border-width-default) solid var(--pxd-color-border-default);
2161
+ }
2162
+ .pxd-form-horizontal .pxd-field > .pxd-field-label,
2163
+ .pxd-form-horizontal .pxd-field > .pxd-field-help {
2164
+ grid-column: 1;
2165
+ }
2166
+ .pxd-form-horizontal .pxd-field > :not(.pxd-field-label):not(.pxd-field-help) {
2167
+ grid-column: 2;
2168
+ grid-row: 1 / span 2;
2169
+ }
2170
+ }
2171
+
2172
+ /* A strip of numbers: three or four tiles across, stacked on phones. */
2173
+ .pxd-metric-row {
2174
+ display: grid;
2175
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
2176
+ gap: var(--pxd-space-inline-default);
2177
+ }
2178
+ .pxd-metric-row .pxd-metric {
2179
+ padding: var(--pxd-space-inset-default);
2180
+ background: var(--pxd-color-surface-subtle);
2181
+ border-radius: var(--pxd-radius-default);
2182
+ }