@webority/theme 0.107.0 → 0.108.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.
- package/README.md +2 -2
- package/dist/purge-safelist.json +60 -59
- package/dist/webority-theme.css +1 -1
- package/package.json +2 -2
- package/scss/_bootstrap.generated.scss +1 -1
- package/scss/_tokens.generated.scss +1 -1
- package/scss/_wui-components.scss +6 -1
- package/scss/_wui-core.scss +6 -1
- package/scss/wui/_avatar-picker.scss +22 -21
- package/scss/wui/_choice.scss +5 -6
- package/scss/wui/_compare-table.scss +201 -0
- package/scss/wui/_controls.scss +1 -1
- package/scss/wui/_data.scss +2 -302
- package/scss/wui/_dialog-motion.scss +34 -0
- package/scss/wui/_disclosure.scss +27 -27
- package/scss/wui/_display.scss +70 -118
- package/scss/wui/_drawer.scss +97 -64
- package/scss/wui/_empty-state.scss +124 -0
- package/scss/wui/_illustration.scss +3 -3
- package/scss/wui/_image-crop.scss +1 -1
- package/scss/wui/_interaction.scss +2 -4
- package/scss/wui/_media.scss +50 -50
- package/scss/wui/_navigation.scss +0 -45
- package/scss/wui/_notification-center.scss +4 -0
- package/scss/wui/_overlays.scss +4 -5
- package/scss/wui/_pagination.scss +168 -0
- package/scss/wui/_section-lead-capture.scss +31 -0
- package/scss/wui/_shortcuts.scss +10 -1
- package/scss/wui/_table-server.scss +1 -1
- package/scss/wui/_whats-new.scss +17 -0
- package/scss/wui/_menubar.scss +0 -110
package/scss/wui/_display.scss
CHANGED
|
@@ -266,76 +266,6 @@ a.kpi:focus-visible {
|
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
-
// ============================================================================
|
|
270
|
-
// Icon-tile info list — label/value rows, each with a leading round icon.
|
|
271
|
-
// The row is an <a> when it links (mail/tel), a <div> otherwise.
|
|
272
|
-
// ============================================================================
|
|
273
|
-
.info-list {
|
|
274
|
-
display: flex;
|
|
275
|
-
flex-direction: column;
|
|
276
|
-
}
|
|
277
|
-
.info-row {
|
|
278
|
-
display: flex;
|
|
279
|
-
align-items: center;
|
|
280
|
-
gap: 16px;
|
|
281
|
-
padding: 16px 0;
|
|
282
|
-
border-bottom: 1px solid var(--color-border);
|
|
283
|
-
color: var(--color-text);
|
|
284
|
-
text-decoration: none;
|
|
285
|
-
}
|
|
286
|
-
// First and last rows shed their outer padding so the list sits flush in a card body.
|
|
287
|
-
.info-row:first-child {
|
|
288
|
-
padding-top: 0;
|
|
289
|
-
}
|
|
290
|
-
.info-row:last-child {
|
|
291
|
-
padding-bottom: 0;
|
|
292
|
-
border-bottom: none;
|
|
293
|
-
}
|
|
294
|
-
.info-icon {
|
|
295
|
-
flex: none;
|
|
296
|
-
width: 36px;
|
|
297
|
-
height: 36px;
|
|
298
|
-
display: inline-grid;
|
|
299
|
-
place-items: center;
|
|
300
|
-
border-radius: 999px;
|
|
301
|
-
background: var(--color-primary-soft);
|
|
302
|
-
color: var(--color-primary-text);
|
|
303
|
-
}
|
|
304
|
-
.info-meta {
|
|
305
|
-
display: flex;
|
|
306
|
-
flex-direction: column;
|
|
307
|
-
gap: 2px;
|
|
308
|
-
min-width: 0;
|
|
309
|
-
}
|
|
310
|
-
.info-key {
|
|
311
|
-
font-size: 12px;
|
|
312
|
-
font-weight: 600;
|
|
313
|
-
text-transform: uppercase;
|
|
314
|
-
letter-spacing: 0.04em;
|
|
315
|
-
color: var(--color-text-subtle);
|
|
316
|
-
}
|
|
317
|
-
.info-value {
|
|
318
|
-
font-size: 14px;
|
|
319
|
-
font-weight: 500;
|
|
320
|
-
color: var(--color-text);
|
|
321
|
-
overflow: hidden;
|
|
322
|
-
text-overflow: ellipsis;
|
|
323
|
-
white-space: nowrap;
|
|
324
|
-
}
|
|
325
|
-
// A blank fact reads as a muted "no value", not a broken row.
|
|
326
|
-
.info-value.is-empty {
|
|
327
|
-
font-weight: 400;
|
|
328
|
-
color: var(--color-text-subtle);
|
|
329
|
-
}
|
|
330
|
-
a.info-row,
|
|
331
|
-
a.info-row:hover {
|
|
332
|
-
text-decoration: none;
|
|
333
|
-
}
|
|
334
|
-
a.info-row:hover .info-value {
|
|
335
|
-
color: var(--color-primary-text);
|
|
336
|
-
text-decoration: underline;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
269
|
// ============================================================================
|
|
340
270
|
// Labeled key-value grid — record details, definitions, attributes.
|
|
341
271
|
// ============================================================================
|
|
@@ -414,6 +344,9 @@ a.info-row:hover .info-value {
|
|
|
414
344
|
.descs-col-3 .descs-list {
|
|
415
345
|
--descs-cols: 3;
|
|
416
346
|
}
|
|
347
|
+
.wui-descs-col-4 {
|
|
348
|
+
--descs-cols: 4;
|
|
349
|
+
}
|
|
417
350
|
.descs-col-1.descs-bordered .descs-item:first-child {
|
|
418
351
|
border-top: none;
|
|
419
352
|
}
|
|
@@ -423,15 +356,20 @@ a.info-row:hover .info-value {
|
|
|
423
356
|
.descs-col-3.descs-bordered .descs-item:nth-child(-n + 3) {
|
|
424
357
|
border-top: none;
|
|
425
358
|
}
|
|
359
|
+
.wui-descs-col-4.descs-bordered .descs-item:nth-child(-n + 4) {
|
|
360
|
+
border-top: none;
|
|
361
|
+
}
|
|
426
362
|
// Media-breakpoint collapse to single column under md.
|
|
427
363
|
@include media-breakpoint-down(sm) {
|
|
428
364
|
.descs-col-2 .descs-list,
|
|
429
|
-
.descs-col-3 .descs-list
|
|
365
|
+
.descs-col-3 .descs-list,
|
|
366
|
+
.wui-descs-col-4 .descs-list {
|
|
430
367
|
--descs-cols: 1;
|
|
431
368
|
}
|
|
432
369
|
// One column here, so only the first item sits on the first row.
|
|
433
370
|
.descs-col-2.descs-bordered .descs-item:nth-child(n + 2),
|
|
434
|
-
.descs-col-3.descs-bordered .descs-item:nth-child(n + 2)
|
|
371
|
+
.descs-col-3.descs-bordered .descs-item:nth-child(n + 2),
|
|
372
|
+
.wui-descs-col-4.descs-bordered .descs-item:nth-child(n + 2) {
|
|
435
373
|
border-top: 1px solid var(--color-border);
|
|
436
374
|
}
|
|
437
375
|
}
|
|
@@ -469,6 +407,66 @@ a.info-row:hover .info-value {
|
|
|
469
407
|
.descs-item.wui-descs-emphasis .descs-value {
|
|
470
408
|
font-weight: 700;
|
|
471
409
|
}
|
|
410
|
+
// Icon tile on any layout: a 16px glyph in a 36px round tile.
|
|
411
|
+
.wui-descs-icon {
|
|
412
|
+
flex: none;
|
|
413
|
+
width: 36px;
|
|
414
|
+
height: 36px;
|
|
415
|
+
display: inline-grid;
|
|
416
|
+
place-items: center;
|
|
417
|
+
border-radius: 999px;
|
|
418
|
+
background: var(--color-primary-soft);
|
|
419
|
+
color: var(--color-primary-text);
|
|
420
|
+
}
|
|
421
|
+
.wui-descs-link {
|
|
422
|
+
color: inherit;
|
|
423
|
+
text-decoration: none;
|
|
424
|
+
}
|
|
425
|
+
.wui-descs-link:hover {
|
|
426
|
+
color: var(--color-primary-text);
|
|
427
|
+
text-decoration: underline;
|
|
428
|
+
}
|
|
429
|
+
// List layout (React `layout="list"`): one column, a rule between rows, flush first and last row,
|
|
430
|
+
// and the value on one line with an ellipsis. The icon tile spans both rows beside the label and value.
|
|
431
|
+
.wui-descs-list .descs-list {
|
|
432
|
+
--descs-cols: 1;
|
|
433
|
+
}
|
|
434
|
+
.wui-descs-list .descs-item {
|
|
435
|
+
display: grid;
|
|
436
|
+
grid-template-columns: 36px minmax(0, 1fr);
|
|
437
|
+
column-gap: 16px;
|
|
438
|
+
row-gap: 2px;
|
|
439
|
+
align-items: center;
|
|
440
|
+
padding: 16px 0;
|
|
441
|
+
border-top: none;
|
|
442
|
+
border-bottom: 1px solid var(--color-border);
|
|
443
|
+
}
|
|
444
|
+
.wui-descs-list .descs-item:first-child {
|
|
445
|
+
padding-top: 0;
|
|
446
|
+
}
|
|
447
|
+
.wui-descs-list .descs-item:last-child {
|
|
448
|
+
padding-bottom: 0;
|
|
449
|
+
border-bottom: none;
|
|
450
|
+
}
|
|
451
|
+
.wui-descs-list .wui-descs-icon {
|
|
452
|
+
grid-column: 1;
|
|
453
|
+
grid-row: 1 / span 2;
|
|
454
|
+
}
|
|
455
|
+
.wui-descs-list .descs-label {
|
|
456
|
+
grid-column: 2;
|
|
457
|
+
grid-row: 1;
|
|
458
|
+
padding: 0;
|
|
459
|
+
}
|
|
460
|
+
.wui-descs-list .descs-value {
|
|
461
|
+
grid-column: 2;
|
|
462
|
+
grid-row: 2;
|
|
463
|
+
min-width: 0;
|
|
464
|
+
padding: 0;
|
|
465
|
+
overflow: hidden;
|
|
466
|
+
text-overflow: ellipsis;
|
|
467
|
+
white-space: nowrap;
|
|
468
|
+
word-break: normal;
|
|
469
|
+
}
|
|
472
470
|
|
|
473
471
|
// ============================================================================
|
|
474
472
|
// Segmented control: 2 to 4 mutually exclusive options shown side by side.
|
|
@@ -1252,52 +1250,6 @@ a.info-row:hover .info-value {
|
|
|
1252
1250
|
}
|
|
1253
1251
|
}
|
|
1254
1252
|
|
|
1255
|
-
// ============================================================================
|
|
1256
|
-
// Feature-comparison table — us vs them. The highlighted column is tinted so
|
|
1257
|
-
// the reader's eye lands on it without a legend.
|
|
1258
|
-
// ============================================================================
|
|
1259
|
-
.compare-table {
|
|
1260
|
-
overflow: hidden;
|
|
1261
|
-
border: 1px solid var(--color-border);
|
|
1262
|
-
border-radius: var(--wui-radius-lg);
|
|
1263
|
-
corner-shape: squircle;
|
|
1264
|
-
background: var(--color-surface);
|
|
1265
|
-
}
|
|
1266
|
-
.compare-table table {
|
|
1267
|
-
width: 100%;
|
|
1268
|
-
border-collapse: collapse;
|
|
1269
|
-
}
|
|
1270
|
-
.compare-table th,
|
|
1271
|
-
.compare-table td {
|
|
1272
|
-
padding: 14px 18px;
|
|
1273
|
-
text-align: left;
|
|
1274
|
-
border-bottom: 1px solid var(--color-border);
|
|
1275
|
-
font-size: 14px;
|
|
1276
|
-
}
|
|
1277
|
-
.compare-table tr:last-child td {
|
|
1278
|
-
border-bottom: none;
|
|
1279
|
-
}
|
|
1280
|
-
.compare-table th {
|
|
1281
|
-
background: var(--color-bg-subtle);
|
|
1282
|
-
font-size: 13px;
|
|
1283
|
-
font-weight: 600;
|
|
1284
|
-
color: var(--color-text);
|
|
1285
|
-
}
|
|
1286
|
-
.compare-table th.is-highlight {
|
|
1287
|
-
background: var(--color-primary-soft);
|
|
1288
|
-
color: var(--color-primary-text);
|
|
1289
|
-
}
|
|
1290
|
-
.compare-table td.is-highlight {
|
|
1291
|
-
background: color-mix(in srgb, var(--color-primary) 4%, var(--color-surface));
|
|
1292
|
-
font-weight: 500;
|
|
1293
|
-
}
|
|
1294
|
-
.compare-yes {
|
|
1295
|
-
color: var(--color-success-text);
|
|
1296
|
-
}
|
|
1297
|
-
.compare-no {
|
|
1298
|
-
color: var(--color-text-subtle);
|
|
1299
|
-
}
|
|
1300
|
-
|
|
1301
1253
|
// ============================================================================
|
|
1302
1254
|
// Resource card — an icon-tile link to a doc, guide or template.
|
|
1303
1255
|
// ============================================================================
|
package/scss/wui/_drawer.scss
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ── Drawer ──
|
|
2
2
|
// AppDrawer / <app-drawer> (a <wui-drawer> element): a side drawer from md up, a bottom sheet
|
|
3
|
-
// below it
|
|
3
|
+
// below it, or a side drawer at every width when it is `no-sheet`. The sheet is as tall as its highest snap point (`--wui-drawer-max`, percent of the
|
|
4
4
|
// viewport height) and sits `max - snap` down, so a snap point is one number the element writes
|
|
5
5
|
// (`--wui-drawer-snap`) and a drag adds its pixels (`--wui-drawer-drag`). Only transform moves.
|
|
6
6
|
//
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
.wui-drawer {
|
|
10
10
|
--wui-drawer-width: 480px;
|
|
11
|
+
--wui-drawer-max-width: 92vw;
|
|
11
12
|
--wui-drawer-duration: 280ms;
|
|
12
13
|
position: fixed;
|
|
13
14
|
inset: 0;
|
|
@@ -68,11 +69,25 @@
|
|
|
68
69
|
min-width: 0;
|
|
69
70
|
}
|
|
70
71
|
.wui-drawer-title {
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
gap: var(--wui-space-sm);
|
|
71
75
|
font-size: 18px;
|
|
72
76
|
font-weight: 600;
|
|
73
77
|
color: var(--color-text);
|
|
74
78
|
overflow-wrap: anywhere;
|
|
75
79
|
}
|
|
80
|
+
.wui-drawer-title-ic {
|
|
81
|
+
flex: none;
|
|
82
|
+
display: grid;
|
|
83
|
+
place-items: center;
|
|
84
|
+
width: 30px;
|
|
85
|
+
height: 30px;
|
|
86
|
+
border-radius: var(--wui-radius-md);
|
|
87
|
+
corner-shape: squircle;
|
|
88
|
+
background: var(--color-primary-soft);
|
|
89
|
+
color: var(--color-primary-text);
|
|
90
|
+
}
|
|
76
91
|
.wui-drawer-subtitle {
|
|
77
92
|
margin-top: 1px;
|
|
78
93
|
font-size: 12px;
|
|
@@ -112,85 +127,103 @@
|
|
|
112
127
|
display: none !important;
|
|
113
128
|
}
|
|
114
129
|
|
|
115
|
-
// Side drawer: from md up.
|
|
116
|
-
@
|
|
130
|
+
// Side drawer: from md up, and at every width for a `no-sheet` drawer (a menu never becomes a sheet).
|
|
131
|
+
@mixin wui-drawer-side {
|
|
117
132
|
.wui-drawer-panel {
|
|
118
133
|
top: 0;
|
|
119
134
|
bottom: 0;
|
|
120
135
|
right: 0;
|
|
121
136
|
width: min(var(--wui-drawer-width), 100%);
|
|
137
|
+
max-width: var(--wui-drawer-max-width);
|
|
122
138
|
transform: translateX(100%);
|
|
123
139
|
}
|
|
124
|
-
|
|
140
|
+
&[side="start"] .wui-drawer-panel {
|
|
125
141
|
right: auto;
|
|
126
142
|
left: 0;
|
|
127
143
|
transform: translateX(-100%);
|
|
128
144
|
}
|
|
129
|
-
|
|
130
|
-
|
|
145
|
+
&[open] .wui-drawer-panel,
|
|
146
|
+
&[open][side="start"] .wui-drawer-panel {
|
|
131
147
|
transform: none;
|
|
132
148
|
}
|
|
133
149
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
@include
|
|
137
|
-
.wui-drawer-panel {
|
|
138
|
-
left: 0;
|
|
139
|
-
right: 0;
|
|
140
|
-
bottom: 0;
|
|
141
|
-
height: calc(var(--wui-drawer-max, 90) * 1dvh);
|
|
142
|
-
max-height: 100dvh;
|
|
143
|
-
border-radius: var(--wui-radius-xl) var(--wui-radius-xl) 0 0;
|
|
144
|
-
corner-shape: squircle;
|
|
145
|
-
transform: translateY(100%);
|
|
146
|
-
}
|
|
147
|
-
.wui-drawer[open] .wui-drawer-panel {
|
|
148
|
-
transform: translateY(calc((var(--wui-drawer-max, 90) - var(--wui-drawer-snap, 50)) * 1vh + var(--wui-drawer-drag, 0px)));
|
|
149
|
-
transform: translateY(calc((var(--wui-drawer-max, 90) - var(--wui-drawer-snap, 50)) * 1dvh + var(--wui-drawer-drag, 0px)));
|
|
150
|
-
}
|
|
151
|
-
// The part of the sheet below the screen edge still scrolls into view.
|
|
152
|
-
.wui-drawer-body {
|
|
153
|
-
padding-bottom: calc(24px + (var(--wui-drawer-max, 90) - var(--wui-drawer-snap, 50)) * 1dvh + env(safe-area-inset-bottom, 0px));
|
|
154
|
-
}
|
|
155
|
-
.wui-drawer-footer {
|
|
156
|
-
padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
|
|
157
|
-
}
|
|
158
|
-
.wui-drawer-grip {
|
|
159
|
-
display: flex;
|
|
160
|
-
flex: none;
|
|
161
|
-
justify-content: center;
|
|
162
|
-
touch-action: none;
|
|
163
|
-
cursor: grab;
|
|
164
|
-
}
|
|
165
|
-
.wui-drawer-header {
|
|
166
|
-
touch-action: none;
|
|
167
|
-
}
|
|
168
|
-
.wui-drawer.is-dragging .wui-drawer-grip,
|
|
169
|
-
.wui-drawer.is-dragging .wui-drawer-header {
|
|
170
|
-
cursor: grabbing;
|
|
171
|
-
}
|
|
172
|
-
.wui-drawer-handle {
|
|
173
|
-
display: flex;
|
|
174
|
-
align-items: center;
|
|
175
|
-
justify-content: center;
|
|
176
|
-
width: 64px;
|
|
177
|
-
height: 28px;
|
|
178
|
-
border-radius: var(--wui-radius-md);
|
|
179
|
-
cursor: inherit;
|
|
180
|
-
}
|
|
181
|
-
.wui-drawer-handle::before {
|
|
182
|
-
content: "";
|
|
183
|
-
width: 40px;
|
|
184
|
-
height: 4px;
|
|
185
|
-
border-radius: 999px;
|
|
186
|
-
background: var(--color-border-strong);
|
|
150
|
+
@include media-breakpoint-up(md) {
|
|
151
|
+
.wui-drawer:not([no-sheet]) {
|
|
152
|
+
@include wui-drawer-side;
|
|
187
153
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
154
|
+
}
|
|
155
|
+
.wui-drawer[no-sheet] {
|
|
156
|
+
@include wui-drawer-side;
|
|
157
|
+
}
|
|
158
|
+
// A menu panel fills a phone, as the side panel always did below sm.
|
|
159
|
+
@include media-breakpoint-down(sm) {
|
|
160
|
+
.wui-drawer[no-sheet] .wui-drawer-panel {
|
|
161
|
+
width: 100%;
|
|
162
|
+
max-width: 100%;
|
|
191
163
|
}
|
|
192
|
-
|
|
193
|
-
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Bottom sheet: below md, unless the drawer is `no-sheet`.
|
|
167
|
+
@include media-breakpoint-down(md) {
|
|
168
|
+
.wui-drawer:not([no-sheet]) {
|
|
169
|
+
.wui-drawer-panel {
|
|
170
|
+
left: 0;
|
|
171
|
+
right: 0;
|
|
172
|
+
bottom: 0;
|
|
173
|
+
height: calc(var(--wui-drawer-max, 90) * 1dvh);
|
|
174
|
+
max-height: 100dvh;
|
|
175
|
+
border-radius: var(--wui-radius-xl) var(--wui-radius-xl) 0 0;
|
|
176
|
+
corner-shape: squircle;
|
|
177
|
+
transform: translateY(100%);
|
|
178
|
+
}
|
|
179
|
+
&[open] .wui-drawer-panel {
|
|
180
|
+
transform: translateY(calc((var(--wui-drawer-max, 90) - var(--wui-drawer-snap, 50)) * 1vh + var(--wui-drawer-drag, 0px)));
|
|
181
|
+
transform: translateY(calc((var(--wui-drawer-max, 90) - var(--wui-drawer-snap, 50)) * 1dvh + var(--wui-drawer-drag, 0px)));
|
|
182
|
+
}
|
|
183
|
+
// The part of the sheet below the screen edge still scrolls into view.
|
|
184
|
+
.wui-drawer-body {
|
|
185
|
+
padding-bottom: calc(24px + (var(--wui-drawer-max, 90) - var(--wui-drawer-snap, 50)) * 1dvh + env(safe-area-inset-bottom, 0px));
|
|
186
|
+
}
|
|
187
|
+
.wui-drawer-footer {
|
|
188
|
+
padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
|
|
189
|
+
}
|
|
190
|
+
.wui-drawer-grip {
|
|
191
|
+
display: flex;
|
|
192
|
+
flex: none;
|
|
193
|
+
justify-content: center;
|
|
194
|
+
touch-action: none;
|
|
195
|
+
cursor: grab;
|
|
196
|
+
}
|
|
197
|
+
.wui-drawer-header {
|
|
198
|
+
touch-action: none;
|
|
199
|
+
}
|
|
200
|
+
&.is-dragging .wui-drawer-grip,
|
|
201
|
+
&.is-dragging .wui-drawer-header {
|
|
202
|
+
cursor: grabbing;
|
|
203
|
+
}
|
|
204
|
+
.wui-drawer-handle {
|
|
205
|
+
display: flex;
|
|
206
|
+
align-items: center;
|
|
207
|
+
justify-content: center;
|
|
208
|
+
width: 64px;
|
|
209
|
+
height: 28px;
|
|
210
|
+
border-radius: var(--wui-radius-md);
|
|
211
|
+
cursor: inherit;
|
|
212
|
+
}
|
|
213
|
+
.wui-drawer-handle::before {
|
|
214
|
+
content: "";
|
|
215
|
+
width: 40px;
|
|
216
|
+
height: 4px;
|
|
217
|
+
border-radius: 999px;
|
|
218
|
+
background: var(--color-border-strong);
|
|
219
|
+
}
|
|
220
|
+
.wui-drawer-handle:focus-visible {
|
|
221
|
+
outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
|
|
222
|
+
outline-offset: var(--wui-focus-ring-offset);
|
|
223
|
+
}
|
|
224
|
+
.wui-drawer-header {
|
|
225
|
+
padding-top: 4px;
|
|
226
|
+
}
|
|
194
227
|
}
|
|
195
228
|
}
|
|
196
229
|
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// Empty state: the card look, the table-body look and the sibling placement under a data table.
|
|
2
|
+
//
|
|
3
|
+
// Part of the wui-components layer; imported right before _data.scss, where these rules sat. Order within the layer is load-bearing (see _wui-components.scss).
|
|
4
|
+
|
|
5
|
+
// ── Empty state ──
|
|
6
|
+
.empty-state {
|
|
7
|
+
text-align: center;
|
|
8
|
+
padding: var(--wui-space-3xl) var(--wui-space-xl);
|
|
9
|
+
color: var(--color-text-subtle);
|
|
10
|
+
}
|
|
11
|
+
.empty-state-title {
|
|
12
|
+
// The table look shares this title. A table's header hides in any .table-wrap whose empty block is visible.
|
|
13
|
+
font-size: var(--wui-fs-base);
|
|
14
|
+
font-weight: var(--wui-fw-semibold);
|
|
15
|
+
line-height: var(--wui-lh-heading);
|
|
16
|
+
color: var(--color-text);
|
|
17
|
+
}
|
|
18
|
+
.empty-state-message {
|
|
19
|
+
margin: var(--wui-space-sm) 0 0;
|
|
20
|
+
font-size: var(--wui-fs-base);
|
|
21
|
+
line-height: var(--wui-lh-body);
|
|
22
|
+
color: var(--color-text-muted);
|
|
23
|
+
}
|
|
24
|
+
.empty-state-action {
|
|
25
|
+
margin-top: var(--wui-space-lg);
|
|
26
|
+
}
|
|
27
|
+
// Tighter scale for a widget/tile, as opposed to a full card or page.
|
|
28
|
+
.empty-state-sm {
|
|
29
|
+
padding: var(--wui-space-2xl) var(--wui-space-lg);
|
|
30
|
+
}
|
|
31
|
+
.empty-state-sm .empty-state-title {
|
|
32
|
+
font-size: var(--wui-fs-sm);
|
|
33
|
+
}
|
|
34
|
+
.empty-state-sm .empty-state-message {
|
|
35
|
+
font-size: var(--wui-fs-xs);
|
|
36
|
+
}
|
|
37
|
+
.empty-state-icon {
|
|
38
|
+
width: 48px;
|
|
39
|
+
height: 48px;
|
|
40
|
+
border-radius: var(--wui-radius-lg);
|
|
41
|
+
background: var(--color-primary-soft);
|
|
42
|
+
color: var(--color-primary-text);
|
|
43
|
+
display: inline-flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
justify-content: center;
|
|
46
|
+
margin-bottom: var(--wui-space-lg);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The table-body look of the empty state (AppEmptyState variant="table", the empty
|
|
50
|
+
// body a DataTable renders in place of its rows): a 50px primary-tinted disc above
|
|
51
|
+
// the title, with a looser padding than the card look.
|
|
52
|
+
.wui-empty-state-table {
|
|
53
|
+
display: flex;
|
|
54
|
+
flex-direction: column;
|
|
55
|
+
align-items: center;
|
|
56
|
+
padding: var(--wui-space-3xl) var(--wui-space-xl);
|
|
57
|
+
color: inherit;
|
|
58
|
+
}
|
|
59
|
+
.wui-empty-state-table .empty-state-icon {
|
|
60
|
+
display: inline-grid;
|
|
61
|
+
place-items: center;
|
|
62
|
+
flex: none;
|
|
63
|
+
width: 50px;
|
|
64
|
+
height: 50px;
|
|
65
|
+
border-radius: 50%;
|
|
66
|
+
background: color-mix(in srgb, var(--color-primary) 10%, transparent);
|
|
67
|
+
margin-bottom: var(--wui-space-lg);
|
|
68
|
+
}
|
|
69
|
+
.wui-empty-state-table .empty-state-message {
|
|
70
|
+
margin-top: var(--wui-space-sm);
|
|
71
|
+
font-weight: var(--wui-fw-normal);
|
|
72
|
+
}
|
|
73
|
+
.wui-empty-state-table .empty-state-action {
|
|
74
|
+
margin-top: var(--wui-space-xl);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.wui-table-empty {
|
|
78
|
+
padding: var(--wui-space-2xl) var(--wui-space-xl);
|
|
79
|
+
text-align: center;
|
|
80
|
+
color: var(--color-text-muted);
|
|
81
|
+
}
|
|
82
|
+
// The empty state owns its own padding and is not a row you can act on — no
|
|
83
|
+
// cell padding, no border, and no hover fill from .table / .table-ledger.
|
|
84
|
+
.table td.wui-table-empty:has(> .wui-empty-state-table),
|
|
85
|
+
.table td.wui-table-empty:has(> .tbl-empty-plain) {
|
|
86
|
+
padding: 0;
|
|
87
|
+
border-bottom: 0;
|
|
88
|
+
}
|
|
89
|
+
// A plain-string empty (no table-look wrapper) — carries the padding the cell
|
|
90
|
+
// needs.
|
|
91
|
+
.tbl-empty-plain {
|
|
92
|
+
padding: var(--wui-space-2xl) var(--wui-space-xl);
|
|
93
|
+
text-align: center;
|
|
94
|
+
color: var(--color-text-muted);
|
|
95
|
+
}
|
|
96
|
+
.table tbody tr:hover td.wui-table-empty:has(> .wui-empty-state-table),
|
|
97
|
+
.table-ledger tbody tr:hover td.wui-table-empty:has(> .wui-empty-state-table) {
|
|
98
|
+
background: transparent;
|
|
99
|
+
}
|
|
100
|
+
// The React AppDataTable renders its empty state as a SIBLING of the table, INSIDE `.table-wrap`
|
|
101
|
+
// (the horizontal scroller), in this `.tbl-empty-block`. Two things fall out of that placement:
|
|
102
|
+
// 1. the horizontal scrollbar sits at the BOTTOM of the wrap — below this message — instead of
|
|
103
|
+
// being wedged between the header band and the message (which is what an outside-the-wrap
|
|
104
|
+
// block produced), and
|
|
105
|
+
// 2. `position: sticky; left: 0` + `width: 100%` pins the message to the wrap's VISIBLE width and
|
|
106
|
+
// holds it there while a wide header scrolls behind it: `width: 100%` on a child of an
|
|
107
|
+
// overflow container resolves to the container's CONTENT (visible) width, not its scroll width,
|
|
108
|
+
// so the message never grows the scroll region and never slides off on a narrow screen.
|
|
109
|
+
//
|
|
110
|
+
// This deliberately does NOT use `container-type` + `100cqw` — the query container collapses
|
|
111
|
+
// `.table-wrap` to a sliver when it is a flex/grid item (see the `.table-wrap` note below). Sticky
|
|
112
|
+
// sidesteps that entirely. (The `.wui-table-empty` cell rules above remain for Razor, where the
|
|
113
|
+
// empty state is author-placed inside a `<td colSpan>`.)
|
|
114
|
+
.tbl-empty-block {
|
|
115
|
+
position: sticky;
|
|
116
|
+
left: 0;
|
|
117
|
+
// = the wrap's visible width (content box of the overflow container), never its scroll width.
|
|
118
|
+
width: 100%;
|
|
119
|
+
// `.wui-empty-state-table` / `.tbl-empty-plain` inside own the centring and padding.
|
|
120
|
+
}
|
|
121
|
+
// An empty list shows its empty state with no column headers above it.
|
|
122
|
+
.table-wrap:has(> .tbl-empty-block:not([hidden])) > table > thead {
|
|
123
|
+
display: none;
|
|
124
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ── Illustrations ──
|
|
2
|
-
// The empty-state illustration set (AppEmptyState
|
|
2
|
+
// The empty-state illustration set (AppEmptyState `illustration`, <app-empty-state
|
|
3
3
|
// illustration>): decorative SVG drawn only with these classes, so every colour is a theme token and
|
|
4
4
|
// dark mode follows. Sources: packages/theme/illustrations/*.svg.
|
|
5
5
|
//
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
width: 112px;
|
|
72
72
|
margin-bottom: 12px;
|
|
73
73
|
}
|
|
74
|
-
.
|
|
74
|
+
.wui-empty-state-table .wui-empty-illustration {
|
|
75
75
|
width: 140px;
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
width: 88px;
|
|
93
93
|
margin-bottom: 12px;
|
|
94
94
|
}
|
|
95
|
-
.
|
|
95
|
+
.wui-empty-state-table .wui-empty-illustration-custom {
|
|
96
96
|
width: 120px;
|
|
97
97
|
margin-bottom: 16px;
|
|
98
98
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ── Image crop ──
|
|
2
|
-
// <wui-image-crop>: the crop surface
|
|
2
|
+
// <wui-image-crop>: the crop surface AppImagePicker (and its Razor tag) shows in a dialog before
|
|
3
3
|
// upload. The image is fitted into the stage; the frame is positioned by the element (inline
|
|
4
4
|
// left/top/width/height) and dims everything outside it with a very large box-shadow, which the
|
|
5
5
|
// stage clips. Every colour is a theme token, so dark mode follows the token flip.
|
|
@@ -169,13 +169,12 @@ html:has(.form-actions-sticky) {
|
|
|
169
169
|
.attach-remove,
|
|
170
170
|
.attach-item-remove,
|
|
171
171
|
.file-preview-remove,
|
|
172
|
-
.
|
|
172
|
+
.wui-image-picker-remove,
|
|
173
173
|
.chip-remove,
|
|
174
174
|
.repeater-remove,
|
|
175
175
|
.wui-usermenu-trigger,
|
|
176
176
|
.wui-carousel-arrow,
|
|
177
177
|
.wui-carousel-pause,
|
|
178
|
-
.wui-menubar-trigger,
|
|
179
178
|
.wui-nav-menu-trigger,
|
|
180
179
|
.wui-expand-toggle,
|
|
181
180
|
.wui-group-toggle,
|
|
@@ -197,7 +196,7 @@ html:has(.form-actions-sticky) {
|
|
|
197
196
|
.segmented-option,
|
|
198
197
|
.choice-chip,
|
|
199
198
|
.chip-clickable,
|
|
200
|
-
.
|
|
199
|
+
.wui-accordion-trigger,
|
|
201
200
|
.wui-chart-legend-item,
|
|
202
201
|
.wui-column-menu-item,
|
|
203
202
|
.wui-nav-menu-link,
|
|
@@ -210,7 +209,6 @@ html:has(.form-actions-sticky) {
|
|
|
210
209
|
.card-clickable,
|
|
211
210
|
.res-card,
|
|
212
211
|
a.kpi,
|
|
213
|
-
a.info-row,
|
|
214
212
|
.struct-card,
|
|
215
213
|
.avatar-clickable,
|
|
216
214
|
.attach-drop,
|