@ux-builder/ui 0.0.0-stage → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,900 @@
1
+ /* @ux-builder/ui/patterns: layout primitives and screen patterns, as prefixed
2
+ CSS on @ux-builder/tokens (ADR-020).
3
+
4
+ Load it once, after ui.css:
5
+ import "@ux-builder/ui/ui.css";
6
+ import "@ux-builder/ui/patterns.css";
7
+
8
+ Every pattern adapts to the width it is given, not the window (ADR-021):
9
+ its root is an inline-size container and its parts switch layout with
10
+ @container queries at the five size classes. The numbers in those query
11
+ conditions (600, 840, 1200, 1600px) are the only literal lengths here: CSS
12
+ cannot read a custom property in a query condition, so they repeat
13
+ --piq-size-breakpoint-* (tokens/layout.json, the same in every theme).
14
+ Everything else reads a token. Without container-query support the
15
+ compact layout applies, which works at any width.
16
+
17
+ Internal custom properties start --_ and are not tokens. */
18
+
19
+ /* ----------------------------------------------------------------- stack */
20
+
21
+ .piq-stack { display: flex; flex-direction: column; min-inline-size: 0; }
22
+ .piq-stack[data-align="start"] { align-items: flex-start; }
23
+ .piq-stack[data-align="center"] { align-items: center; }
24
+ .piq-stack[data-align="end"] { align-items: flex-end; }
25
+
26
+ /* --------------------------------------------------------------- cluster */
27
+
28
+ .piq-cluster { display: flex; flex-wrap: wrap; align-items: center; min-inline-size: 0; }
29
+ .piq-cluster[data-wrap="false"] { flex-wrap: nowrap; }
30
+ .piq-cluster[data-justify="center"] { justify-content: center; }
31
+ .piq-cluster[data-justify="end"] { justify-content: flex-end; }
32
+ .piq-cluster[data-justify="between"] { justify-content: space-between; }
33
+ .piq-cluster[data-align="start"] { align-items: flex-start; }
34
+ .piq-cluster[data-align="end"] { align-items: flex-end; }
35
+ .piq-cluster[data-align="baseline"] { align-items: baseline; }
36
+ .piq-cluster[data-align="stretch"] { align-items: stretch; }
37
+
38
+ /* Gaps: one of the theme's space steps. */
39
+ .piq-stack[data-gap="0"], .piq-cluster[data-gap="0"], .piq-grid[data-gap="0"] > .piq-grid__items { gap: 0; }
40
+ .piq-stack[data-gap="1"], .piq-cluster[data-gap="1"], .piq-grid[data-gap="1"] > .piq-grid__items { gap: var(--piq-space-1); }
41
+ .piq-stack[data-gap="2"], .piq-cluster[data-gap="2"], .piq-grid[data-gap="2"] > .piq-grid__items { gap: var(--piq-space-2); }
42
+ .piq-stack[data-gap="3"], .piq-cluster[data-gap="3"], .piq-grid[data-gap="3"] > .piq-grid__items { gap: var(--piq-space-3); }
43
+ .piq-stack[data-gap="4"], .piq-cluster[data-gap="4"], .piq-grid[data-gap="4"] > .piq-grid__items { gap: var(--piq-space-4); }
44
+ .piq-stack[data-gap="5"], .piq-cluster[data-gap="5"], .piq-grid[data-gap="5"] > .piq-grid__items { gap: var(--piq-space-5); }
45
+ .piq-stack[data-gap="6"], .piq-cluster[data-gap="6"], .piq-grid[data-gap="6"] > .piq-grid__items { gap: var(--piq-space-6); }
46
+ .piq-stack[data-gap="7"], .piq-cluster[data-gap="7"], .piq-grid[data-gap="7"] > .piq-grid__items { gap: var(--piq-space-7); }
47
+ .piq-stack[data-gap="8"], .piq-cluster[data-gap="8"], .piq-grid[data-gap="8"] > .piq-grid__items { gap: var(--piq-space-8); }
48
+
49
+ /* ------------------------------------------------------------------ grid */
50
+
51
+ .piq-grid { container-type: inline-size; inline-size: 100%; }
52
+ .piq-grid__items {
53
+ display: grid;
54
+ grid-template-columns: repeat(var(--_cols, 1), minmax(0, 1fr));
55
+ margin: 0;
56
+ padding: 0;
57
+ list-style: none;
58
+ }
59
+ .piq-grid[data-cols-compact="1"] > .piq-grid__items { --_cols: 1; }
60
+ .piq-grid[data-cols-compact="2"] > .piq-grid__items { --_cols: 2; }
61
+ .piq-grid[data-cols-compact="3"] > .piq-grid__items { --_cols: 3; }
62
+ .piq-grid[data-cols-compact="4"] > .piq-grid__items { --_cols: 4; }
63
+ .piq-grid[data-cols-compact="5"] > .piq-grid__items { --_cols: 5; }
64
+ .piq-grid[data-cols-compact="6"] > .piq-grid__items { --_cols: 6; }
65
+ @container (min-width: 600px) {
66
+ .piq-grid[data-cols-medium="1"] > .piq-grid__items { --_cols: 1; }
67
+ .piq-grid[data-cols-medium="2"] > .piq-grid__items { --_cols: 2; }
68
+ .piq-grid[data-cols-medium="3"] > .piq-grid__items { --_cols: 3; }
69
+ .piq-grid[data-cols-medium="4"] > .piq-grid__items { --_cols: 4; }
70
+ .piq-grid[data-cols-medium="5"] > .piq-grid__items { --_cols: 5; }
71
+ .piq-grid[data-cols-medium="6"] > .piq-grid__items { --_cols: 6; }
72
+ }
73
+ @container (min-width: 840px) {
74
+ .piq-grid[data-cols-expanded="1"] > .piq-grid__items { --_cols: 1; }
75
+ .piq-grid[data-cols-expanded="2"] > .piq-grid__items { --_cols: 2; }
76
+ .piq-grid[data-cols-expanded="3"] > .piq-grid__items { --_cols: 3; }
77
+ .piq-grid[data-cols-expanded="4"] > .piq-grid__items { --_cols: 4; }
78
+ .piq-grid[data-cols-expanded="5"] > .piq-grid__items { --_cols: 5; }
79
+ .piq-grid[data-cols-expanded="6"] > .piq-grid__items { --_cols: 6; }
80
+ }
81
+ @container (min-width: 1200px) {
82
+ .piq-grid[data-cols-large="1"] > .piq-grid__items { --_cols: 1; }
83
+ .piq-grid[data-cols-large="2"] > .piq-grid__items { --_cols: 2; }
84
+ .piq-grid[data-cols-large="3"] > .piq-grid__items { --_cols: 3; }
85
+ .piq-grid[data-cols-large="4"] > .piq-grid__items { --_cols: 4; }
86
+ .piq-grid[data-cols-large="5"] > .piq-grid__items { --_cols: 5; }
87
+ .piq-grid[data-cols-large="6"] > .piq-grid__items { --_cols: 6; }
88
+ }
89
+ @container (min-width: 1600px) {
90
+ .piq-grid[data-cols-extra-large="1"] > .piq-grid__items { --_cols: 1; }
91
+ .piq-grid[data-cols-extra-large="2"] > .piq-grid__items { --_cols: 2; }
92
+ .piq-grid[data-cols-extra-large="3"] > .piq-grid__items { --_cols: 3; }
93
+ .piq-grid[data-cols-extra-large="4"] > .piq-grid__items { --_cols: 4; }
94
+ .piq-grid[data-cols-extra-large="5"] > .piq-grid__items { --_cols: 5; }
95
+ .piq-grid[data-cols-extra-large="6"] > .piq-grid__items { --_cols: 6; }
96
+ }
97
+
98
+ /* ------------------------------------------------------------------ page */
99
+
100
+ /* The gutter follows the page's own width; the body is centred and capped at
101
+ the content width the page asks for. */
102
+ .piq-page { container-type: inline-size; inline-size: 100%; }
103
+ .piq-page__body {
104
+ box-sizing: border-box;
105
+ margin-inline: auto;
106
+ padding-inline: var(--piq-space-gutter-compact, var(--piq-space-4));
107
+ max-inline-size: var(--piq-size-content-page, none);
108
+ }
109
+ .piq-page[data-width="form"] > .piq-page__body { max-inline-size: var(--piq-size-content-form, var(--piq-size-measure)); }
110
+ .piq-page[data-width="reading"] > .piq-page__body { max-inline-size: var(--piq-size-measure); }
111
+ @container (min-width: 600px) {
112
+ .piq-page__body { padding-inline: var(--piq-space-gutter-medium, var(--piq-space-gutter-compact, var(--piq-space-4))); }
113
+ }
114
+ @container (min-width: 840px) {
115
+ .piq-page__body { padding-inline: var(--piq-space-gutter-expanded, var(--piq-space-gutter-compact, var(--piq-space-4))); }
116
+ }
117
+ @container (min-width: 1200px) {
118
+ .piq-page__body { padding-inline: var(--piq-space-gutter-large, var(--piq-space-gutter-compact, var(--piq-space-4))); }
119
+ }
120
+ @container (min-width: 1600px) {
121
+ .piq-page__body { padding-inline: var(--piq-space-gutter-extra-large, var(--piq-space-gutter-compact, var(--piq-space-4))); }
122
+ }
123
+
124
+ /* ------------------------------------------------------------ split view */
125
+
126
+ /* One pane below the expanded class (the one data-show names), two side by
127
+ side from it up. The hidden pane is display: none, so it is out of the
128
+ accessibility tree too. */
129
+ .piq-split { container-type: inline-size; inline-size: 100%; }
130
+ .piq-split__panes { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-5); }
131
+ .piq-split__pane { min-inline-size: 0; }
132
+ .piq-split[data-show="primary"] > .piq-split__panes > [data-pane="secondary"],
133
+ .piq-split[data-show="secondary"] > .piq-split__panes > [data-pane="primary"] { display: none; }
134
+ @container (min-width: 840px) {
135
+ .piq-split > .piq-split__panes { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
136
+ .piq-split[data-ratio="1:1"] > .piq-split__panes { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
137
+ .piq-split[data-ratio="2:1"] > .piq-split__panes { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); }
138
+ .piq-split[data-show] > .piq-split__panes > .piq-split__pane[data-pane] { display: block; }
139
+ }
140
+
141
+ /* --------------------------------------------------------- primary nav */
142
+
143
+ /* Links, not a menu. The current destination takes the design system's
144
+ navigation variant: a fill and, for a side menu, an edge indicator. */
145
+ .piq-primary-nav__list { display: grid; gap: var(--piq-space-1); margin: 0; padding: 0; list-style: none; }
146
+ .piq-primary-nav__sublist { padding-inline-start: var(--piq-space-4); }
147
+ .piq-primary-nav__sublist[hidden] { display: none; }
148
+ .piq-primary-nav__link {
149
+ appearance: none;
150
+ box-sizing: border-box;
151
+ display: flex;
152
+ align-items: center;
153
+ gap: var(--piq-space-3);
154
+ inline-size: 100%;
155
+ min-block-size: var(--piq-size-target-minimum);
156
+ padding: var(--piq-space-2) var(--piq-space-3);
157
+ border: 0;
158
+ border-radius: var(--piq-radius-control);
159
+ border-inline-start: var(--piq-nav-item-selected-border);
160
+ border-inline-start-color: transparent;
161
+ background: none;
162
+ /* Full text colour: the muted one is under 4.5:1 on some themes' recessed ground. */
163
+ color: var(--piq-color-text);
164
+ font: inherit;
165
+ text-align: start;
166
+ text-decoration: none;
167
+ cursor: pointer;
168
+ }
169
+ .piq-primary-nav__link:hover { background: var(--piq-color-surface-sunken); color: var(--piq-color-text); }
170
+ .piq-primary-nav__link[aria-current="page"] {
171
+ border-inline-start: var(--piq-nav-item-selected-border);
172
+ background: var(--piq-nav-item-selected-bg);
173
+ color: var(--piq-color-text-strong);
174
+ font-weight: var(--piq-font-weight-strong);
175
+ }
176
+ .piq-primary-nav__link:focus-visible { outline: var(--piq-focus-ring); outline-offset: calc(var(--piq-focus-offset) * -1); }
177
+ .piq-primary-nav__label { min-inline-size: 0; overflow-wrap: anywhere; }
178
+ .piq-primary-nav__chevron { margin-inline-start: auto; }
179
+
180
+ /* ------------------------------------------------------ workspace switcher */
181
+
182
+ .piq-workspace__popup { display: grid; gap: var(--piq-space-2); padding: var(--piq-space-2); }
183
+ .piq-workspace__list { max-block-size: calc(var(--piq-size-target-touch) * 7); margin: 0; padding: 0; overflow-y: auto; list-style: none; }
184
+ .piq-workspace__list .piq-menu__item { cursor: pointer; }
185
+ .piq-workspace__empty { margin: 0; padding: var(--piq-space-2); color: var(--piq-color-text-muted); }
186
+
187
+ /* ------------------------------------------------------------- app shell */
188
+
189
+ /* The only pattern that reads the window, not its container: where the
190
+ navigation goes depends on the screen. The content scrolls between the
191
+ bars, which are rows of the grid, so a bar never covers the focused
192
+ element (WCAG 2.4.11). */
193
+ .piq-shell {
194
+ position: relative;
195
+ display: grid;
196
+ block-size: 100dvh;
197
+ grid-template-columns: minmax(0, 1fr);
198
+ grid-template-rows: auto minmax(0, 1fr) auto;
199
+ grid-template-areas: "top" "main" "bar";
200
+ background: var(--piq-color-ground);
201
+ color: var(--piq-color-text);
202
+ }
203
+ .piq-shell__skip {
204
+ position: absolute;
205
+ inset-block-start: var(--piq-space-2);
206
+ inset-inline-start: var(--piq-space-2);
207
+ z-index: 3;
208
+ display: inline-flex;
209
+ align-items: center;
210
+ min-block-size: var(--piq-size-target-touch);
211
+ padding: var(--piq-space-2) var(--piq-space-3);
212
+ background: var(--piq-color-surface);
213
+ color: var(--piq-color-text-strong);
214
+ transform: translateY(-200%);
215
+ }
216
+ .piq-shell__skip:focus { transform: none; outline: var(--piq-focus-ring); }
217
+ .piq-shell__top {
218
+ grid-area: top;
219
+ display: flex;
220
+ align-items: center;
221
+ gap: var(--piq-space-3);
222
+ min-block-size: calc(var(--piq-size-target-touch) + var(--piq-space-2) * 2);
223
+ padding-inline: var(--piq-space-gutter-compact);
224
+ border-block-end: var(--piq-border-default);
225
+ background: var(--piq-color-surface);
226
+ }
227
+ .piq-shell__actions { display: flex; align-items: center; gap: var(--piq-space-2); margin-inline-start: auto; }
228
+ .piq-shell__side {
229
+ grid-area: side;
230
+ display: none;
231
+ overflow-y: auto;
232
+ padding: var(--piq-space-3) var(--piq-space-2);
233
+ border-inline-end: var(--piq-border-default);
234
+ background: var(--piq-color-ground-recessed);
235
+ }
236
+ .piq-shell__main { grid-area: main; min-inline-size: 0; overflow: auto; }
237
+ .piq-shell__main:focus { outline: none; }
238
+ .piq-shell__breadcrumbs { padding: var(--piq-space-3) var(--piq-space-gutter-compact) 0; }
239
+ .piq-shell__bar { grid-area: bar; padding-block-end: env(safe-area-inset-bottom); border-block-start: var(--piq-border-default); background: var(--piq-color-surface); }
240
+ .piq-shell__bar-list { display: flex; min-block-size: var(--piq-nav-bar-height); margin: 0; padding: 0; list-style: none; }
241
+ .piq-shell__bar-list > li { display: flex; flex: 1 1 0; min-inline-size: 0; }
242
+ .piq-shell__bar-item {
243
+ appearance: none;
244
+ box-sizing: border-box;
245
+ display: flex;
246
+ flex: 1;
247
+ flex-direction: column;
248
+ align-items: center;
249
+ justify-content: center;
250
+ gap: var(--piq-space-1);
251
+ min-inline-size: 0;
252
+ min-block-size: var(--piq-size-target-touch);
253
+ padding: var(--piq-space-1);
254
+ border: 0;
255
+ background: none;
256
+ color: var(--piq-color-text-muted);
257
+ font: inherit;
258
+ font-size: var(--piq-font-size-small);
259
+ text-decoration: none;
260
+ cursor: pointer;
261
+ }
262
+ .piq-shell__bar-item[aria-current="page"],
263
+ .piq-shell__bar-item[data-current] { background: var(--piq-nav-item-selected-bg); color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); }
264
+ .piq-shell__bar-item:focus-visible { outline: var(--piq-focus-ring); outline-offset: calc(var(--piq-focus-offset) * -1); }
265
+ .piq-shell__bar-label { max-inline-size: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
266
+ @media (min-width: 600px) {
267
+ .piq-shell:not([data-adapt="container"]) { grid-template-columns: max-content minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); grid-template-areas: "side top" "side main"; }
268
+ .piq-shell:not([data-adapt="container"]) .piq-shell__bar { display: none; }
269
+ .piq-shell:not([data-adapt="container"]) .piq-shell__side { display: block; }
270
+ .piq-shell:not([data-adapt="container"]) .piq-shell__top { padding-inline: var(--piq-space-gutter-medium); }
271
+ .piq-shell:not([data-adapt="container"]) .piq-shell__breadcrumbs { padding-inline: var(--piq-space-gutter-medium); }
272
+ /* A rail at medium, whatever the design system: icon above a short label. */
273
+ .piq-shell:not([data-adapt="container"]) .piq-shell__side .piq-primary-nav__link { flex-direction: column; gap: var(--piq-space-1); padding-inline: var(--piq-space-2); font-size: var(--piq-font-size-small); text-align: center; }
274
+ }
275
+ @media (min-width: 840px) {
276
+ .piq-shell:not([data-adapt="container"]) .piq-shell__side { inline-size: var(--piq-nav-width); }
277
+ .piq-shell:not([data-adapt="container"]) .piq-shell__top,
278
+ .piq-shell:not([data-adapt="container"]) .piq-shell__breadcrumbs { padding-inline: var(--piq-space-gutter-expanded); }
279
+ /* The design system's own navigation from expanded up: side menu or rail. */
280
+ .piq-shell:not([data-adapt="container"]) .piq-shell__side .piq-primary-nav__link { flex-direction: var(--piq-nav-item-direction); gap: var(--piq-nav-item-gap); padding-inline: var(--piq-space-3); font-size: var(--piq-nav-item-label-font-size); text-align: start; }
281
+ }
282
+
283
+ /* adapt="container": the same layout by the width of the shell's frame, not
284
+ the window, for a shell inside a preview or an embed. */
285
+ .piq-shell-frame { container-type: inline-size; block-size: 100%; }
286
+ .piq-shell[data-adapt="container"] { block-size: 100%; }
287
+ @container (min-width: 600px) {
288
+ .piq-shell-frame > .piq-shell { grid-template-columns: max-content minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); grid-template-areas: "side top" "side main"; }
289
+ .piq-shell-frame > .piq-shell .piq-shell__bar { display: none; }
290
+ .piq-shell-frame > .piq-shell .piq-shell__side { display: block; }
291
+ .piq-shell-frame > .piq-shell .piq-shell__top { padding-inline: var(--piq-space-gutter-medium); }
292
+ .piq-shell-frame > .piq-shell .piq-shell__breadcrumbs { padding-inline: var(--piq-space-gutter-medium); }
293
+ /* A rail at medium, whatever the design system: icon above a short label. */
294
+ .piq-shell-frame > .piq-shell .piq-shell__side .piq-primary-nav__link { flex-direction: column; gap: var(--piq-space-1); padding-inline: var(--piq-space-2); font-size: var(--piq-font-size-small); text-align: center; }
295
+ }
296
+ @container (min-width: 840px) {
297
+ .piq-shell-frame > .piq-shell .piq-shell__side { inline-size: var(--piq-nav-width); }
298
+ .piq-shell-frame > .piq-shell .piq-shell__top,
299
+ .piq-shell-frame > .piq-shell .piq-shell__breadcrumbs { padding-inline: var(--piq-space-gutter-expanded); }
300
+ /* The design system's own navigation from expanded up: side menu or rail. */
301
+ .piq-shell-frame > .piq-shell .piq-shell__side .piq-primary-nav__link { flex-direction: var(--piq-nav-item-direction); gap: var(--piq-nav-item-gap); padding-inline: var(--piq-space-3); font-size: var(--piq-nav-item-label-font-size); text-align: start; }
302
+ }
303
+
304
+ /* ----------------------------------------------------------- error screen */
305
+
306
+ .piq-error-screen {
307
+ display: grid;
308
+ justify-items: start;
309
+ gap: var(--piq-space-4);
310
+ max-inline-size: var(--piq-size-measure);
311
+ margin-inline: auto;
312
+ padding: var(--piq-space-7) var(--piq-space-gutter-compact);
313
+ }
314
+ .piq-error-screen__mark { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-display); }
315
+ .piq-error-screen__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-title) / var(--piq-line-height-tight) var(--piq-font-heading); }
316
+ .piq-error-screen__text > p { margin: 0; }
317
+ .piq-error-screen__actions { display: flex; flex-wrap: wrap; gap: var(--piq-space-3); }
318
+
319
+ /* ------------------------------------------------------------ page header */
320
+
321
+ .piq-page-header { display: grid; gap: var(--piq-page-header-gap); padding-block: var(--piq-page-header-padding-y); }
322
+ .piq-page-header__row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--piq-page-header-gap); }
323
+ .piq-page-header__heading { display: flex; flex-wrap: wrap; align-items: center; gap: var(--piq-space-3); min-inline-size: 0; }
324
+ .piq-page-header__title {
325
+ margin: 0;
326
+ color: var(--piq-color-text-strong);
327
+ font: var(--piq-font-weight-strong) var(--piq-page-header-title-font-size) / var(--piq-line-height-tight) var(--piq-font-heading);
328
+ overflow-wrap: anywhere;
329
+ }
330
+ .piq-page-header__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--piq-space-2); }
331
+ .piq-page-header__description { margin: 0; max-inline-size: var(--piq-size-measure); color: var(--piq-color-text-muted); }
332
+
333
+ /* ------------------------------------------------------------- filter bar */
334
+
335
+ /* Chips and Clear all show from the medium size class; below it the bar is
336
+ the search and the Filters button, which carries the count. */
337
+ .piq-filter-bar { container-type: inline-size; display: grid; gap: var(--piq-space-3); }
338
+ .piq-filter-bar__row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--piq-space-2); }
339
+ .piq-filter-bar__search { position: relative; display: flex; flex: 1 1 0; align-items: center; min-inline-size: 0; }
340
+ .piq-filter-bar__search .piq-field__input { inline-size: 100%; padding-inline-start: calc(var(--piq-space-3) + var(--piq-space-5)); }
341
+ .piq-filter-bar__search-icon { position: absolute; inset-inline-start: var(--piq-space-3); color: var(--piq-color-text-muted); pointer-events: none; }
342
+ .piq-filter-bar__chips { display: none; flex-wrap: wrap; align-items: center; gap: var(--piq-space-2); margin: 0; padding: 0; list-style: none; }
343
+ @container (min-width: 600px) {
344
+ .piq-filter-bar__chips { display: flex; }
345
+ }
346
+
347
+ /* ----------------------------------------------------------- filter panel */
348
+
349
+ .piq-filter-panel {
350
+ display: grid;
351
+ align-content: start;
352
+ gap: var(--piq-space-3);
353
+ padding: var(--piq-space-4);
354
+ border: var(--piq-border-default);
355
+ border-radius: var(--piq-radius-card);
356
+ background: var(--piq-color-surface);
357
+ }
358
+ .piq-filter-panel__head { display: flex; align-items: center; justify-content: space-between; gap: var(--piq-space-2); }
359
+ .piq-filter-panel__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
360
+ .piq-filter-section { border-block-start: var(--piq-border-default); }
361
+ .piq-filter-section__title {
362
+ display: flex;
363
+ align-items: center;
364
+ gap: var(--piq-space-2);
365
+ min-block-size: var(--piq-size-target-minimum);
366
+ padding-block: var(--piq-space-2);
367
+ color: var(--piq-color-text-strong);
368
+ font-weight: var(--piq-font-weight-strong);
369
+ cursor: pointer;
370
+ }
371
+ .piq-filter-section__title:focus-visible { outline: var(--piq-focus-ring); outline-offset: var(--piq-focus-offset); }
372
+ .piq-filter-section__count { margin-inline-start: auto; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); font-variant-numeric: tabular-nums; }
373
+ .piq-filter-section__body { display: grid; gap: var(--piq-space-2); padding-block-end: var(--piq-space-3); }
374
+ @media (pointer: coarse) {
375
+ .piq-filter-section__title { min-block-size: var(--piq-size-target-touch); }
376
+ }
377
+
378
+ /* ------------------------------------------------------------ state panel */
379
+
380
+ .piq-state-panel {
381
+ display: grid;
382
+ justify-items: center;
383
+ gap: var(--piq-space-3);
384
+ padding: var(--piq-space-7) var(--piq-space-4);
385
+ color: var(--piq-color-text);
386
+ text-align: center;
387
+ }
388
+ .piq-state-panel[data-kind="partial"] { justify-items: start; padding: var(--piq-space-3) var(--piq-space-4); border: var(--piq-border-default); border-radius: var(--piq-radius-card); text-align: start; }
389
+ .piq-state-panel__mark { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-title); }
390
+ .piq-state-panel__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
391
+ .piq-state-panel__text > p,
392
+ .piq-state-panel__filters { margin: 0; max-inline-size: var(--piq-size-measure); color: var(--piq-color-text-muted); }
393
+ .piq-state-panel__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--piq-space-2); }
394
+ .piq-state-panel__actions:empty { display: none; }
395
+
396
+ /* --------------------------------------------------------- bulk action bar */
397
+
398
+ /* It follows the list in reading order and sticks to the bottom of the
399
+ scrolling area, so the actions stay in reach however long the list; the
400
+ list's controls keep a matching scroll margin, so focus scrolls clear of
401
+ it (WCAG 2.4.11). */
402
+ .piq-bulk-bar {
403
+ position: sticky;
404
+ inset-block-end: 0;
405
+ z-index: 1;
406
+ display: flex;
407
+ flex-wrap: wrap;
408
+ align-items: center;
409
+ gap: var(--piq-space-2) var(--piq-space-3);
410
+ min-block-size: calc(var(--piq-size-target-touch) + var(--piq-space-2) * 2);
411
+ padding: var(--piq-space-2) var(--piq-space-3);
412
+ border: var(--piq-border-default);
413
+ border-radius: var(--piq-radius-card);
414
+ background: var(--piq-color-surface);
415
+ box-shadow: var(--piq-shadow-overlay);
416
+ }
417
+ .piq-bulk-bar__count { color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); font-variant-numeric: tabular-nums; }
418
+ .piq-bulk-bar__actions { display: flex; flex-wrap: wrap; gap: var(--piq-space-2); }
419
+
420
+ /* ---------------------------------------------------------- collection list */
421
+
422
+ /* Stacked items below the medium size class; a table from it, showing only
423
+ the priority columns until expanded. The filter panel sits beside the list
424
+ from expanded up. */
425
+ .piq-collection { container-type: inline-size; display: grid; gap: var(--piq-space-4); }
426
+ .piq-collection__body { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-4); align-items: start; }
427
+ .piq-collection__results { display: grid; gap: var(--piq-space-4); min-inline-size: 0; }
428
+ .piq-collection__items { display: grid; margin: 0; padding: 0; list-style: none; }
429
+ .piq-collection__item {
430
+ display: grid;
431
+ grid-template-columns: auto minmax(0, 1fr) auto;
432
+ align-items: start;
433
+ gap: var(--piq-space-3);
434
+ padding: var(--piq-space-3) 0;
435
+ border-block-end: var(--piq-table-row-border, var(--piq-border-default));
436
+ }
437
+ .piq-collection__item:not(:has(> input)) { grid-template-columns: minmax(0, 1fr) auto; }
438
+ .piq-collection__item[data-selected] { background: var(--piq-nav-item-selected-bg); }
439
+ .piq-collection__fields { display: grid; gap: var(--piq-space-1); min-inline-size: 0; }
440
+ .piq-collection__primary { margin: 0; color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); overflow-wrap: anywhere; }
441
+ .piq-collection__field { margin: 0; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); overflow-wrap: anywhere; }
442
+ .piq-collection__table-wrap { display: none; overflow-x: auto; }
443
+ .piq-collection__table tr[data-selected] { background: var(--piq-nav-item-selected-bg); }
444
+ .piq-collection__table [data-priority="false"] { display: none; }
445
+ .piq-collection__select,
446
+ .piq-collection__actions { inline-size: 1%; white-space: nowrap; }
447
+ /* A row's checkbox sits in a label at least the minimum target size (WCAG 2.5.8). */
448
+ .piq-collection__hit { display: inline-grid; place-items: center; min-inline-size: var(--piq-size-target-minimum); min-block-size: var(--piq-size-target-minimum); cursor: pointer; }
449
+ @media (pointer: coarse) {
450
+ .piq-collection__hit { min-inline-size: var(--piq-size-target-touch); min-block-size: var(--piq-size-target-touch); }
451
+ }
452
+ /* While the bar shows, the scrolling area keeps its height clear at the
453
+ bottom when it scrolls focus into view: the shell's content area, or the
454
+ page itself for a list outside the shell. */
455
+ .piq-shell__main:has(.piq-bulk-bar),
456
+ :root:has(.piq-bulk-bar):not(:has(.piq-shell__main .piq-bulk-bar)) {
457
+ /* Room for the bar wrapped onto two rows; BulkActionBar measures the real height when it runs. */
458
+ scroll-padding-block-end: calc((var(--piq-size-target-touch) + var(--piq-space-2) * 2) * 2 + var(--piq-space-2) * 2);
459
+ }
460
+ @container (min-width: 600px) {
461
+ .piq-collection__items { display: none; }
462
+ .piq-collection__table-wrap { display: block; }
463
+ }
464
+ @container (min-width: 840px) {
465
+ .piq-collection__table [data-priority="false"] { display: table-cell; }
466
+ .piq-collection__body[data-panel="open"] { grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); }
467
+ }
468
+
469
+ /* -------------------------------------------------------- description list */
470
+
471
+ /* One column below the medium size class, two from it. The wrapper is the
472
+ container, so the list inside can change its own columns. */
473
+ .piq-description-list { container-type: inline-size; }
474
+ .piq-description-list__grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-3) var(--piq-space-5); margin: 0; }
475
+ .piq-description-list__item { display: grid; align-content: start; gap: var(--piq-space-1); min-inline-size: 0; }
476
+ .piq-description-list__label { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); letter-spacing: var(--piq-letter-spacing-label); }
477
+ .piq-description-list__value { margin: 0; color: var(--piq-color-text); overflow-wrap: anywhere; }
478
+ @container (min-width: 600px) {
479
+ .piq-description-list__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
480
+ .piq-description-list__item[data-wide] { grid-column: 1 / -1; }
481
+ }
482
+
483
+ /* ---------------------------------------------------------------- timeline */
484
+
485
+ .piq-timeline__list { display: grid; gap: var(--piq-space-4); margin: 0; padding: 0; list-style: none; }
486
+ .piq-timeline__event { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--piq-space-3); }
487
+ .piq-timeline__mark { margin-block-start: var(--piq-space-1); color: var(--piq-color-text-muted); }
488
+ .piq-timeline__content { display: grid; gap: var(--piq-space-1); min-inline-size: 0; }
489
+ .piq-timeline__line { display: flex; flex-wrap: wrap; gap: var(--piq-space-1) var(--piq-space-2); margin: 0; }
490
+ .piq-timeline__kind { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); font-weight: var(--piq-font-weight-strong); letter-spacing: var(--piq-letter-spacing-label); text-transform: uppercase; }
491
+ .piq-timeline__actor { color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); }
492
+ .piq-timeline__time { color: var(--piq-color-text-subtle); font-size: var(--piq-font-size-small); }
493
+ .piq-timeline__body { padding: var(--piq-space-2) var(--piq-space-3); border-inline-start: var(--piq-border-default); color: var(--piq-color-text); }
494
+
495
+ /* ----------------------------------------------------------- record detail */
496
+
497
+ /* The activity sits beside the fields and tabs from the expanded size class. */
498
+ .piq-record { container-type: inline-size; display: grid; align-content: start; gap: var(--piq-space-4); }
499
+ .piq-record__body { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-5); }
500
+ .piq-record__main { display: grid; align-content: start; gap: var(--piq-space-5); min-inline-size: 0; }
501
+ .piq-record__aside { min-inline-size: 0; }
502
+ @container (min-width: 840px) {
503
+ .piq-record__body[data-activity] { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); }
504
+ }
505
+
506
+ /* --------------------------------------------------------- list with detail */
507
+
508
+ .piq-list-detail { container-type: inline-size; }
509
+ .piq-list-detail__list { display: grid; margin: 0; padding: 0; list-style: none; }
510
+ .piq-list-detail__option {
511
+ display: block;
512
+ min-block-size: var(--piq-size-target-minimum);
513
+ padding: var(--piq-space-3);
514
+ border-block-end: var(--piq-table-row-border, var(--piq-border-default));
515
+ border-inline-start: var(--piq-nav-item-selected-border);
516
+ border-inline-start-color: transparent;
517
+ color: var(--piq-color-text);
518
+ cursor: pointer;
519
+ }
520
+ .piq-list-detail__option:hover { background: var(--piq-color-surface-sunken); }
521
+ .piq-list-detail__option[aria-selected="true"] { border-inline-start: var(--piq-nav-item-selected-border); background: var(--piq-nav-item-selected-bg); color: var(--piq-color-text-strong); }
522
+ .piq-list-detail__option:focus-visible { outline: var(--piq-focus-ring); outline-offset: calc(var(--piq-focus-offset) * -1); }
523
+ .piq-list-detail__detail { display: grid; align-content: start; gap: var(--piq-space-3); min-inline-size: 0; }
524
+ .piq-list-detail__detail:focus { outline: none; }
525
+ .piq-list-detail__back { justify-self: start; }
526
+ @container (min-width: 840px) {
527
+ .piq-list-detail__back { display: none; }
528
+ }
529
+ @media (pointer: coarse) {
530
+ .piq-list-detail__option { min-block-size: var(--piq-size-target-touch); }
531
+ }
532
+
533
+ /* ------------------------------------------------------------------- forms */
534
+
535
+ /* One column of fields, labels above, no wider than the form width. The
536
+ actions stick to the bottom of the scrolling area; FormPage keeps their
537
+ height clear when focus scrolls (WCAG 2.4.11). */
538
+ .piq-form-page { display: grid; gap: var(--piq-space-5); max-inline-size: var(--piq-size-content-form); }
539
+ .piq-form-page__fields,
540
+ .piq-quick-edit__fields,
541
+ .piq-form-section__fields { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-4); }
542
+ .piq-form-page__actions {
543
+ position: sticky;
544
+ inset-block-end: 0;
545
+ z-index: 1;
546
+ display: flex;
547
+ flex-wrap: wrap;
548
+ gap: var(--piq-space-2);
549
+ padding: var(--piq-space-3) 0;
550
+ padding-block-end: max(var(--piq-space-3), env(safe-area-inset-bottom));
551
+ border-block-start: var(--piq-border-default);
552
+ background: var(--piq-color-ground);
553
+ }
554
+ .piq-form-section { display: grid; gap: var(--piq-space-3); margin: 0; padding: 0; border: 0; min-inline-size: 0; }
555
+ .piq-form-section__title { padding: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
556
+ .piq-form-section__description { margin: 0; color: var(--piq-color-text-muted); }
557
+ .piq-quick-edit { display: grid; gap: var(--piq-space-4); }
558
+ .piq-quick-edit__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--piq-space-2); }
559
+
560
+ /* The error summary: a strong edge in the error colour and a heading, so it
561
+ is found without relying on colour. */
562
+ .piq-error-summary {
563
+ display: grid;
564
+ gap: var(--piq-space-2);
565
+ padding: var(--piq-space-4);
566
+ border: var(--piq-border-default);
567
+ border-inline-start: var(--piq-space-1) solid var(--piq-state-closed);
568
+ border-radius: var(--piq-radius-card);
569
+ background: var(--piq-color-surface);
570
+ }
571
+ .piq-error-summary:focus-visible,
572
+ .piq-error-summary:focus { outline: var(--piq-focus-ring); outline-offset: var(--piq-focus-offset); }
573
+ .piq-error-summary__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
574
+ .piq-error-summary__list { display: grid; gap: var(--piq-space-1); margin: 0; padding-inline-start: var(--piq-space-5); }
575
+ .piq-error-summary__list a { color: var(--piq-color-text); text-decoration: underline; }
576
+
577
+ /* --------------------------------------------------------------- stat tile */
578
+
579
+ .piq-stat-tile { display: grid; align-content: start; gap: var(--piq-space-1); padding: var(--piq-space-4); border: var(--piq-card-border, var(--piq-border-default)); border-radius: var(--piq-radius-card); background: var(--piq-color-surface); min-inline-size: 0; }
580
+ .piq-stat-tile__label { margin: 0; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); letter-spacing: var(--piq-letter-spacing-label); }
581
+ .piq-stat-tile__value { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-title) / var(--piq-line-height-tight) var(--piq-font-heading); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
582
+ .piq-stat-tile__change { display: flex; align-items: center; gap: var(--piq-space-1); margin: 0; color: var(--piq-color-text); font-size: var(--piq-font-size-small); }
583
+ .piq-stat-tile__change[data-direction="up"] .piq-stat-tile__arrow { transform: rotate(-90deg); }
584
+ .piq-stat-tile__change[data-direction="down"] .piq-stat-tile__arrow { transform: rotate(90deg); }
585
+
586
+ /* -------------------------------------------------------------- chart frame */
587
+
588
+ /* States sit in the chart's own space, so the dashboard does not move. */
589
+ .piq-chart-frame { display: grid; align-content: start; gap: var(--piq-space-3); margin: 0; padding: var(--piq-space-4); border: var(--piq-card-border, var(--piq-border-default)); border-radius: var(--piq-radius-card); background: var(--piq-color-surface); min-inline-size: 0; }
590
+ .piq-chart-frame__head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--piq-space-2); }
591
+ .piq-chart-frame__title { color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
592
+ .piq-chart-frame__description { margin: 0; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
593
+ .piq-chart-frame__chart { position: relative; min-inline-size: 0; }
594
+ .piq-chart-frame__state { display: grid; place-items: center; aspect-ratio: 16 / 9; }
595
+ .piq-chart-frame__legend { display: flex; flex-wrap: wrap; gap: var(--piq-space-2) var(--piq-space-4); margin: 0; padding: 0; list-style: none; color: var(--piq-color-text); font-size: var(--piq-font-size-small); }
596
+ .piq-chart-frame__legend-item { display: inline-flex; align-items: center; gap: var(--piq-space-1); }
597
+ .piq-chart-frame__data { display: grid; justify-items: start; gap: var(--piq-space-2); }
598
+ .piq-chart-frame__data > [hidden] { display: none; }
599
+
600
+ /* --------------------------------------------------------------- dashboard */
601
+
602
+ /* Tiles: two across at compact and medium, four from expanded. Charts: one
603
+ at compact, two from medium. */
604
+ .piq-dashboard { container-type: inline-size; display: grid; gap: var(--piq-space-5); }
605
+ .piq-dashboard__toolbar { display: flex; flex-wrap: wrap; align-items: end; gap: var(--piq-space-3) var(--piq-space-4); }
606
+ .piq-dashboard__refreshed { margin: 0 0 0 auto; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
607
+ .piq-dashboard__tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--piq-space-3); }
608
+ .piq-dashboard__charts { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-4); }
609
+ @container (min-width: 600px) {
610
+ .piq-dashboard__charts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
611
+ }
612
+ @container (min-width: 840px) {
613
+ .piq-dashboard__tiles { grid-template-columns: repeat(4, minmax(0, 1fr)); }
614
+ }
615
+
616
+ /* ----------------------------------------------------------- report viewer */
617
+
618
+ .piq-report { container-type: inline-size; display: grid; gap: var(--piq-space-4); }
619
+ .piq-report__actions { display: flex; flex-wrap: wrap; gap: var(--piq-space-2); }
620
+ .piq-report__body { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-4); align-items: start; }
621
+ .piq-report__params { padding: var(--piq-space-4); border: var(--piq-border-default); border-radius: var(--piq-radius-card); background: var(--piq-color-surface); }
622
+ .piq-report__params[hidden] { display: none; }
623
+ .piq-report__form { display: grid; gap: var(--piq-space-4); justify-items: stretch; }
624
+ .piq-report__form > .piq-btn { justify-self: start; }
625
+ .piq-report__results { display: grid; gap: var(--piq-space-4); min-inline-size: 0; }
626
+ .piq-report__applied { display: flex; flex-wrap: wrap; gap: var(--piq-space-2); margin: 0; }
627
+ .piq-report__applied dt { font-weight: var(--piq-font-weight-strong); }
628
+ .piq-report__applied dd { margin: 0; }
629
+ @container (min-width: 840px) {
630
+ .piq-report[data-mode="side"] .piq-report__body { grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); }
631
+ }
632
+
633
+ /* ------------------------------------------------------------------- print */
634
+
635
+ /* A printed page carries the content only: no navigation, actions or
636
+ panels; tables repeat their header row on every page. !important because
637
+ print must win over whichever screen layout the page's width selects. */
638
+ @media print {
639
+ .piq-shell { display: block !important; block-size: auto !important; }
640
+ .piq-shell__main { overflow: visible !important; }
641
+ .piq-shell__top,
642
+ .piq-shell__side,
643
+ .piq-shell__bar,
644
+ .piq-shell__skip,
645
+ .piq-page-header__actions,
646
+ .piq-report__params,
647
+ .piq-filter-bar,
648
+ .piq-bulk-bar,
649
+ .piq-pagination,
650
+ .piq-chart-frame__data > .piq-btn,
651
+ .piq-form-page__actions { display: none !important; }
652
+ .piq-report[data-mode="side"] .piq-report__body { grid-template-columns: minmax(0, 1fr); }
653
+ thead { display: table-header-group; }
654
+ tr { break-inside: avoid; }
655
+ }
656
+
657
+ /* ---------------------------------------------------------------- settings */
658
+
659
+ .piq-settings { container-type: inline-size; display: grid; gap: var(--piq-space-4); }
660
+ .piq-settings__nav .piq-primary-nav__link[aria-current="true"] {
661
+ border-inline-start: var(--piq-nav-item-selected-border);
662
+ background: var(--piq-nav-item-selected-bg);
663
+ color: var(--piq-color-text-strong);
664
+ font-weight: var(--piq-font-weight-strong);
665
+ }
666
+ .piq-settings__nav .piq-primary-nav__link[aria-disabled="true"] { color: var(--piq-color-text-subtle); cursor: default; }
667
+ .piq-settings__why { margin: 0; padding-inline: var(--piq-space-3); color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
668
+ .piq-settings__chevron { margin-inline-start: auto; }
669
+ .piq-settings__sections { display: grid; align-content: start; gap: var(--piq-space-3); min-inline-size: 0; }
670
+ .piq-settings__section { display: grid; gap: var(--piq-space-4); }
671
+ .piq-settings__section[hidden] { display: none; }
672
+ .piq-settings__heading { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
673
+ .piq-settings__heading:focus { outline: none; }
674
+ .piq-settings__heading:focus-visible { outline: var(--piq-focus-ring); outline-offset: var(--piq-focus-offset); }
675
+ .piq-settings__back { justify-self: start; }
676
+ @container (min-width: 840px) {
677
+ .piq-settings__back,
678
+ .piq-settings__chevron { display: none; }
679
+ }
680
+
681
+ /* ------------------------------------------------------------------ wizard */
682
+
683
+ /* The step list from the medium size class; a progress bar below it. */
684
+ .piq-wizard { container-type: inline-size; display: grid; gap: var(--piq-space-4); max-inline-size: var(--piq-size-content-form); }
685
+ .piq-wizard__task { margin: 0; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); letter-spacing: var(--piq-letter-spacing-label); }
686
+ .piq-wizard__steps { display: none; flex-wrap: wrap; gap: var(--piq-space-2) var(--piq-space-4); margin: 0; padding: 0; list-style: none; counter-reset: piq-step; }
687
+ .piq-wizard__step { display: inline-flex; align-items: center; gap: var(--piq-space-2); color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); counter-increment: piq-step; }
688
+ .piq-wizard__step::before { content: counter(piq-step); display: inline-grid; place-items: center; min-inline-size: var(--piq-size-target-minimum); min-block-size: var(--piq-size-target-minimum); border: var(--piq-border-default); border-radius: var(--piq-pill-radius, var(--piq-radius-control)); }
689
+ .piq-wizard__step[data-done]::before { content: "✓"; }
690
+ .piq-wizard__step[aria-current="step"] { color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); }
691
+ .piq-wizard__step[aria-current="step"]::before { border-color: var(--piq-color-structure); background: var(--piq-color-structure); color: var(--piq-color-ground); }
692
+ .piq-wizard__heading { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
693
+ .piq-wizard__heading:focus { outline: none; }
694
+ .piq-wizard__panel { display: grid; gap: var(--piq-space-4); }
695
+ .piq-wizard__panel[hidden] { display: none; }
696
+ .piq-wizard__actions { display: flex; flex-wrap: wrap; gap: var(--piq-space-2); }
697
+ @container (min-width: 600px) {
698
+ .piq-wizard__steps { display: flex; }
699
+ .piq-wizard__progress { display: none; }
700
+ }
701
+
702
+ /* --------------------------------------------------- task list and review */
703
+
704
+ .piq-task-list { display: grid; gap: var(--piq-space-3); }
705
+ .piq-task-list__title,
706
+ .piq-review__title,
707
+ .piq-confirmation__title,
708
+ .piq-import__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
709
+ .piq-task-list__count { margin: 0; color: var(--piq-color-text-muted); }
710
+ .piq-task-list__items { display: grid; margin: 0; padding: 0; list-style: none; }
711
+ .piq-task-list__item { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--piq-space-2); min-block-size: var(--piq-size-target-touch); border-block-end: var(--piq-border-default); }
712
+ /* Links that stand alone in a list are targets, so they get the minimum size (WCAG 2.5.8). */
713
+ .piq-task-list__item a,
714
+ .piq-home__items a,
715
+ .piq-notifications__link { display: inline-flex; align-items: center; min-block-size: var(--piq-size-target-minimum); color: var(--piq-color-text); }
716
+ @media (pointer: coarse) {
717
+ .piq-task-list__item a,
718
+ .piq-home__items a,
719
+ .piq-notifications__link { min-block-size: var(--piq-size-target-touch); }
720
+ }
721
+ .piq-task-list__status { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); font-weight: var(--piq-font-weight-strong); }
722
+ .piq-task-list__status[data-status="completed"] { color: var(--piq-color-text-strong); }
723
+ .piq-review { display: grid; gap: var(--piq-space-5); max-inline-size: var(--piq-size-content-form); }
724
+ .piq-review__section { display: grid; gap: var(--piq-space-2); }
725
+ .piq-review__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--piq-space-2); border-block-end: var(--piq-border-default); }
726
+ .piq-review__section-title { margin: 0; color: var(--piq-color-text-strong); font-size: var(--piq-font-size-body); }
727
+ .piq-review__change { display: inline-flex; align-items: center; min-block-size: var(--piq-size-target-minimum); color: var(--piq-color-text); }
728
+ .piq-review__consequence { margin: 0; color: var(--piq-color-text); }
729
+ .piq-confirmation { display: grid; gap: var(--piq-space-2); padding: var(--piq-space-5); border-radius: var(--piq-radius-card); background: var(--piq-color-structure); color: var(--piq-color-ground); }
730
+ .piq-confirmation .piq-confirmation__title { color: var(--piq-color-ground); }
731
+ .piq-confirmation:focus { outline: var(--piq-focus-ring); outline-offset: var(--piq-focus-offset); }
732
+ .piq-confirmation__reference,
733
+ .piq-confirmation__text { margin: 0; }
734
+
735
+ /* ----------------------------------------------------------- editable grid */
736
+
737
+ .piq-grid-edit { container-type: inline-size; display: grid; justify-items: start; gap: var(--piq-space-3); }
738
+ .piq-grid-edit > .piq-table-wrap { inline-size: 100%; }
739
+ .piq-grid-edit__cell { position: relative; cursor: cell; }
740
+ .piq-grid-edit__cell:focus { outline: var(--piq-focus-ring); outline-offset: calc(var(--piq-focus-offset) * -1); }
741
+ .piq-grid-edit__cell[aria-invalid="true"] { box-shadow: inset 0 calc(var(--piq-space-1) * -0.5) 0 var(--piq-state-closed); }
742
+ .piq-grid-edit__cell .piq-field__error { display: block; font-size: var(--piq-font-size-small); }
743
+ .piq-grid-edit__input { inline-size: 100%; min-inline-size: 0; }
744
+ .piq-grid-edit__row-actions { inline-size: 1%; white-space: nowrap; }
745
+ .piq-grid-edit__totals td { border-block-start: var(--piq-border-default); font-weight: var(--piq-font-weight-strong); }
746
+
747
+ /* -------------------------------------------------------------- work queue */
748
+
749
+ .piq-queue { display: grid; gap: var(--piq-space-4); }
750
+ .piq-queue__bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--piq-space-3); }
751
+ .piq-queue__position { margin: 0; color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); font-variant-numeric: tabular-nums; }
752
+ .piq-queue__nav,
753
+ .piq-queue__actions { display: flex; flex-wrap: wrap; gap: var(--piq-space-2); }
754
+ .piq-queue__item { display: grid; gap: var(--piq-space-3); padding: var(--piq-space-4); border: var(--piq-border-default); border-radius: var(--piq-radius-card); background: var(--piq-color-surface); }
755
+ .piq-queue__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-heading) / var(--piq-line-height-tight) var(--piq-font-heading); }
756
+
757
+ /* --------------------------------------------------------- import / export */
758
+
759
+ .piq-import { container-type: inline-size; display: grid; gap: var(--piq-space-4); }
760
+ .piq-import__steps { display: flex; }
761
+ .piq-import__drop { display: grid; justify-items: center; gap: var(--piq-space-2); padding: var(--piq-space-6); border: var(--piq-border-default); border-style: dashed; border-radius: var(--piq-radius-card); text-align: center; }
762
+ .piq-import__drop.is-over { background: var(--piq-color-surface-sunken); }
763
+ .piq-import__hint,
764
+ .piq-import__file { margin: 0; color: var(--piq-color-text-muted); }
765
+ .piq-import__mapping,
766
+ .piq-import__errors { display: grid; gap: var(--piq-space-3); }
767
+ .piq-import__errors ul { margin: 0; padding-inline-start: var(--piq-space-5); }
768
+ .piq-export__fields { display: grid; gap: var(--piq-space-2); margin: 0; padding: 0; border: 0; }
769
+ .piq-export__status:empty { display: none; }
770
+ .piq-export__ready { margin: 0; }
771
+
772
+ /* ------------------------------------------------------------------- board */
773
+
774
+ .piq-board { container-type: inline-size; }
775
+ .piq-board__columns { display: grid; grid-auto-columns: minmax(0, 1fr); grid-auto-flow: column; gap: var(--piq-space-3); overflow-x: auto; }
776
+ .piq-board__column { display: grid; align-content: start; gap: var(--piq-space-2); min-inline-size: 0; padding: var(--piq-space-3); border-radius: var(--piq-radius-card); background: var(--piq-color-surface-sunken); }
777
+ .piq-board__heading { margin: 0; color: var(--piq-color-text-strong); font-size: var(--piq-font-size-body); font-weight: var(--piq-font-weight-strong); }
778
+ .piq-board__cards { display: grid; gap: var(--piq-space-2); margin: 0; padding: 0; list-style: none; }
779
+ .piq-board__card { display: grid; gap: var(--piq-space-1); padding: var(--piq-space-3); border: var(--piq-border-default); border-radius: var(--piq-radius-control); background: var(--piq-color-surface); cursor: grab; }
780
+ .piq-board__card-title { margin: 0; color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); }
781
+
782
+ /* ---------------------------------------------------------------- calendar */
783
+
784
+ .piq-calendar { container-type: inline-size; display: grid; gap: var(--piq-space-3); }
785
+ .piq-calendar__views { display: flex; gap: var(--piq-space-1); }
786
+ .piq-calendar__view { min-block-size: var(--piq-size-target-minimum); padding-inline: var(--piq-space-3); border: var(--piq-border-default); border-radius: var(--piq-radius-control); background: var(--piq-color-surface); color: var(--piq-color-text); font: inherit; cursor: pointer; }
787
+ .piq-calendar__view[aria-checked="true"] { background: var(--piq-color-structure); color: var(--piq-color-ground); }
788
+ .piq-calendar__month { inline-size: 100%; border-collapse: collapse; table-layout: fixed; }
789
+ .piq-calendar__month th { padding: var(--piq-space-1); color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); }
790
+ .piq-calendar__day { block-size: calc(var(--piq-size-target-touch) * 2); padding: var(--piq-space-1); border: var(--piq-border-default); vertical-align: top; }
791
+ .piq-calendar__day[data-outside] { color: var(--piq-color-text-subtle); }
792
+ .piq-calendar__day:focus { outline: var(--piq-focus-ring); outline-offset: calc(var(--piq-focus-offset) * -1); }
793
+ .piq-calendar__number { font-size: var(--piq-font-size-small); }
794
+ .piq-calendar__events { display: grid; gap: var(--piq-space-1); margin: 0; padding: 0; list-style: none; font-size: var(--piq-font-size-small); }
795
+ .piq-calendar__event time { font-weight: var(--piq-font-weight-strong); font-variant-numeric: tabular-nums; }
796
+ .piq-calendar__date { margin: 0; color: var(--piq-color-text-strong); font-size: var(--piq-font-size-body); }
797
+ .piq-calendar__week { display: grid; gap: var(--piq-space-3); margin: 0; padding: 0; list-style: none; }
798
+ .piq-calendar__agenda-day { display: grid; gap: var(--piq-space-1); padding-block: var(--piq-space-2); border-block-end: var(--piq-border-default); }
799
+
800
+ /* ------------------------------------------------------------- attachments */
801
+
802
+ .piq-attachments { display: grid; gap: var(--piq-space-3); }
803
+ .piq-attachments[data-over] { outline: var(--piq-focus-ring); }
804
+ .piq-attachments__bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--piq-space-3); }
805
+ .piq-attachments__hint { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
806
+
807
+ /* ------------------------------------------- drill-down, comparison, print */
808
+
809
+ .piq-drill { display: grid; gap: var(--piq-space-3); }
810
+ .piq-drill__trail { display: flex; }
811
+ .piq-comparison { display: grid; gap: var(--piq-space-2); padding: var(--piq-space-4); border: var(--piq-border-default); border-radius: var(--piq-radius-card); background: var(--piq-color-surface); }
812
+ .piq-comparison__label { margin: 0; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); }
813
+ .piq-comparison__values { display: flex; flex-wrap: wrap; gap: var(--piq-space-2) var(--piq-space-5); margin: 0; }
814
+ .piq-comparison__values dt { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
815
+ .piq-comparison__values dd { margin: 0; color: var(--piq-color-text-strong); font-variant-numeric: tabular-nums; }
816
+ .piq-comparison__current { font: var(--piq-font-weight-strong) var(--piq-font-size-title) / var(--piq-line-height-tight) var(--piq-font-heading); }
817
+ .piq-comparison__words { display: flex; align-items: center; gap: var(--piq-space-1); margin: 0; }
818
+ .piq-comparison__words[data-direction="up"] .piq-comparison__arrow { transform: rotate(-90deg); }
819
+ .piq-comparison__words[data-direction="down"] .piq-comparison__arrow { transform: rotate(90deg); }
820
+ .piq-print { display: grid; gap: var(--piq-space-5); }
821
+ .piq-print__header { display: grid; gap: var(--piq-space-2); padding-block-end: var(--piq-space-3); border-block-end: var(--piq-border-default); }
822
+ .piq-print__title { margin: 0; color: var(--piq-color-text-strong); font: var(--piq-font-weight-strong) var(--piq-font-size-title) / var(--piq-line-height-tight) var(--piq-font-heading); }
823
+ .piq-print__date { margin: 0; color: var(--piq-color-text-muted); }
824
+ .piq-print__section { display: grid; gap: var(--piq-space-3); }
825
+ .piq-print__section-title { margin: 0; color: var(--piq-color-text-strong); font-size: var(--piq-font-size-heading); }
826
+ @media print {
827
+ .piq-print__section + .piq-print__section { break-before: page; }
828
+ }
829
+
830
+ /* -------------------------------------------------- pivot, builder, subs */
831
+
832
+ .piq-pivot__group { cursor: pointer; }
833
+ .piq-pivot__group th,
834
+ .piq-pivot__group td { font-weight: var(--piq-font-weight-strong); }
835
+ .piq-pivot__group:focus,
836
+ .piq-pivot__row:focus { outline: var(--piq-focus-ring); outline-offset: calc(var(--piq-focus-offset) * -1); }
837
+ .piq-pivot__toggle { margin-inline-end: var(--piq-space-1); }
838
+ .piq-pivot__subtotal { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); font-weight: var(--piq-font-weight-regular); }
839
+ .piq-pivot__child { padding-inline-start: var(--piq-space-6); font-weight: var(--piq-font-weight-regular); }
840
+ .piq-pivot__total th,
841
+ .piq-pivot__total td { border-block-start: var(--piq-border-default); font-weight: var(--piq-font-weight-strong); }
842
+ .piq-report-builder { display: grid; gap: var(--piq-space-4); }
843
+ .piq-report-builder__choices { display: flex; flex-wrap: wrap; gap: var(--piq-space-5); }
844
+ .piq-subscriptions { display: grid; gap: var(--piq-space-3); }
845
+ .piq-subscriptions__head { display: flex; align-items: center; justify-content: space-between; gap: var(--piq-space-2); }
846
+ .piq-subscriptions__list { display: grid; margin: 0; padding: 0; list-style: none; }
847
+ .piq-subscriptions__item { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--piq-space-2); padding-block: var(--piq-space-3); border-block-end: var(--piq-border-default); }
848
+ .piq-subscriptions__name,
849
+ .piq-subscriptions__detail { margin: 0; }
850
+ .piq-subscriptions__detail { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
851
+ .piq-subscriptions__actions { display: flex; gap: var(--piq-space-1); }
852
+
853
+ /* ------------------------------------------------------- members and admin */
854
+
855
+ .piq-members,
856
+ .piq-audit-log,
857
+ .piq-integrations,
858
+ .piq-api-keys { display: grid; gap: var(--piq-space-3); }
859
+ .piq-members__role { display: flex; flex-wrap: wrap; align-items: end; gap: var(--piq-space-2); }
860
+ .piq-members__current { font-weight: var(--piq-font-weight-strong); }
861
+ .piq-matrix__caption { padding-block-end: var(--piq-space-2); color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); text-align: start; }
862
+ .piq-matrix td { white-space: nowrap; }
863
+ .piq-matrix td[data-on] { color: var(--piq-color-text-strong); font-weight: var(--piq-font-weight-strong); }
864
+ .piq-matrix td .piq-icon { margin-inline-end: var(--piq-space-1); }
865
+ .piq-audit-log__filters { display: flex; flex-wrap: wrap; align-items: end; gap: var(--piq-space-3); }
866
+
867
+ /* ----------------------------------------- notifications, integrations, keys */
868
+
869
+ .piq-notifications__list,
870
+ .piq-integrations__list { display: grid; margin: 0; padding: 0; list-style: none; }
871
+ .piq-notifications__item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--piq-space-2); padding-block: var(--piq-space-2); border-block-end: var(--piq-border-default); }
872
+ .piq-notifications__state { color: var(--piq-color-text-strong); font-size: var(--piq-font-size-label); font-weight: var(--piq-font-weight-strong); }
873
+ .piq-notifications__item[data-read] .piq-notifications__state { color: var(--piq-color-text-muted); font-weight: var(--piq-font-weight-regular); }
874
+ .piq-integrations__item { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: var(--piq-space-3); padding-block: var(--piq-space-3); border-block-end: var(--piq-border-default); }
875
+ .piq-integrations__status { color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
876
+ .piq-integrations__status[data-connected] { color: var(--piq-color-text-strong); }
877
+ .piq-api-keys__created { display: grid; gap: var(--piq-space-2); padding: var(--piq-space-4); border: var(--piq-border-default); border-radius: var(--piq-radius-card); background: var(--piq-color-surface-sunken); }
878
+ .piq-api-keys__created p { margin: 0; }
879
+ .piq-api-keys__secret { padding: var(--piq-space-2); border-radius: var(--piq-radius-control); background: var(--piq-color-surface); font-family: var(--piq-font-mono); overflow-wrap: anywhere; }
880
+ .piq-api-keys__masked { color: var(--piq-color-text-muted); font-family: var(--piq-font-mono); }
881
+
882
+ /* ------------------------------------- home, command palette, context menu */
883
+
884
+ .piq-home { container-type: inline-size; display: grid; gap: var(--piq-space-5); }
885
+ .piq-home__lists { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--piq-space-5); }
886
+ .piq-home__heading { margin: 0 0 var(--piq-space-2); color: var(--piq-color-text-strong); font-size: var(--piq-font-size-heading); }
887
+ .piq-home__items { display: grid; margin: 0; padding: 0; list-style: none; }
888
+ .piq-home__items li { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--piq-space-2); padding-block: var(--piq-space-2); border-block-end: var(--piq-border-default); }
889
+ .piq-home__meta,
890
+ .piq-home__empty { margin: 0; color: var(--piq-color-text-muted); font-size: var(--piq-font-size-small); }
891
+ @container (min-width: 840px) {
892
+ .piq-home__lists { grid-template-columns: repeat(2, minmax(0, 1fr)); }
893
+ }
894
+ .piq-palette__kbd { padding-inline: var(--piq-space-1); border: var(--piq-border-default); border-radius: var(--piq-radius-control); color: var(--piq-color-text-muted); font: var(--piq-font-size-label) var(--piq-font-mono); }
895
+ .piq-palette__results { display: grid; gap: var(--piq-space-2); max-block-size: calc(var(--piq-size-target-touch) * 8); overflow-y: auto; }
896
+ .piq-palette__group { display: grid; }
897
+ .piq-palette__group-label { margin: 0; padding: var(--piq-space-1) var(--piq-space-3); color: var(--piq-color-text-muted); font-size: var(--piq-font-size-label); letter-spacing: var(--piq-letter-spacing-label); }
898
+ .piq-palette__results .piq-menu__item { cursor: pointer; }
899
+ .piq-context-menu { position: fixed; z-index: 30; min-inline-size: calc(var(--piq-size-measure) / 3); }
900
+ .piq-context-menu .piq-menu__item { inline-size: 100%; border: 0; background: none; font: inherit; text-align: start; cursor: pointer; }