@webority/theme 0.29.0 → 0.31.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.
- package/README.md +2 -2
- package/dist/purge-safelist.json +47 -30
- package/dist/webority-theme.css +1 -1
- package/package.json +1 -1
- package/scss/_tokens.scss +1 -0
- package/scss/_variables.scss +1 -0
- package/scss/_wui-components.scss +3 -0
- package/scss/wui/_chart.scss +5 -309
- package/scss/wui/_chat.scss +82 -0
- package/scss/wui/_choice.scss +84 -29
- package/scss/wui/_floating.scss +64 -0
- package/scss/wui/_kanban.scss +42 -10
- package/scss/wui/_media.scss +12 -0
- package/scss/wui/_shell.scss +8 -0
- package/scss/wui/_table-server.scss +4 -3
- package/scss/wui/_tour.scss +97 -0
package/scss/wui/_kanban.scss
CHANGED
|
@@ -7,12 +7,20 @@
|
|
|
7
7
|
// Below md the board is one column per screen: a scroll-snapped strip with a column switcher
|
|
8
8
|
// above it. The board scrolls inside itself, so the page never scrolls sideways.
|
|
9
9
|
//
|
|
10
|
+
// Sizing variables, set on .wui-kanban (or any ancestor) to override:
|
|
11
|
+
// --wui-kanban-column-width basis width of an open column (288px)
|
|
12
|
+
// --wui-kanban-collapsed-width width of a collapsed column strip (56px)
|
|
13
|
+
// --wui-kanban-gap space between columns (16px)
|
|
14
|
+
// --wui-kanban-column-min-height least height of a column, so short columns still read as
|
|
15
|
+
// lanes (560px; not applied in the phone one-column mode)
|
|
16
|
+
//
|
|
10
17
|
// Part of the wui-components layer, see _wui-components.scss for load order.
|
|
11
18
|
|
|
12
19
|
.wui-kanban {
|
|
13
20
|
--wui-kanban-column-width: 288px;
|
|
14
21
|
--wui-kanban-collapsed-width: 56px;
|
|
15
22
|
--wui-kanban-gap: 16px;
|
|
23
|
+
--wui-kanban-column-min-height: 560px;
|
|
16
24
|
display: block;
|
|
17
25
|
position: relative;
|
|
18
26
|
min-width: 0;
|
|
@@ -34,8 +42,9 @@
|
|
|
34
42
|
flex: 1 0 var(--wui-kanban-column-width);
|
|
35
43
|
min-width: 0;
|
|
36
44
|
max-width: 100%;
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
min-height: var(--wui-kanban-column-min-height);
|
|
46
|
+
background: var(--color-bg-muted);
|
|
47
|
+
border: 1px solid var(--color-border);
|
|
39
48
|
border-radius: var(--wui-radius-lg);
|
|
40
49
|
transition:
|
|
41
50
|
background-color 160ms var(--wui-ease-ui),
|
|
@@ -74,12 +83,14 @@
|
|
|
74
83
|
background: var(--color-danger);
|
|
75
84
|
}
|
|
76
85
|
|
|
86
|
+
// The title takes its own width so the count sits right beside it; the collapse button keeps to
|
|
87
|
+
// the far edge through its own auto margin.
|
|
77
88
|
.wui-kanban-title {
|
|
78
|
-
flex:
|
|
89
|
+
flex: 0 1 auto;
|
|
79
90
|
min-width: 0;
|
|
80
91
|
margin: 0;
|
|
81
|
-
font-size: 0.
|
|
82
|
-
font-weight:
|
|
92
|
+
font-size: 0.875rem;
|
|
93
|
+
font-weight: 700;
|
|
83
94
|
line-height: 1.3;
|
|
84
95
|
color: var(--color-text);
|
|
85
96
|
overflow-wrap: anywhere;
|
|
@@ -117,6 +128,7 @@
|
|
|
117
128
|
flex: none;
|
|
118
129
|
width: 32px;
|
|
119
130
|
height: 32px;
|
|
131
|
+
margin-inline-start: auto;
|
|
120
132
|
padding: 0;
|
|
121
133
|
border: 0;
|
|
122
134
|
border-radius: var(--wui-radius);
|
|
@@ -128,8 +140,9 @@
|
|
|
128
140
|
transition: transform 160ms var(--wui-ease-ui);
|
|
129
141
|
}
|
|
130
142
|
}
|
|
143
|
+
// The column itself is the muted fill, so hover lifts to the surface.
|
|
131
144
|
.wui-kanban-collapse:hover {
|
|
132
|
-
background: var(--color-
|
|
145
|
+
background: var(--color-surface);
|
|
133
146
|
color: var(--color-text);
|
|
134
147
|
}
|
|
135
148
|
.wui-kanban-collapse:focus-visible,
|
|
@@ -247,7 +260,11 @@
|
|
|
247
260
|
margin: 0;
|
|
248
261
|
pointer-events: none;
|
|
249
262
|
cursor: grabbing;
|
|
250
|
-
box
|
|
263
|
+
// A 2px primary edge drawn as border plus ring, so the clone keeps the card's exact box.
|
|
264
|
+
border-color: var(--color-primary);
|
|
265
|
+
box-shadow:
|
|
266
|
+
0 0 0 1px var(--color-primary),
|
|
267
|
+
var(--wui-shadow-overlay-lg);
|
|
251
268
|
rotate: 2deg;
|
|
252
269
|
}
|
|
253
270
|
.wui-kanban[data-wui-dragging] {
|
|
@@ -267,17 +284,30 @@
|
|
|
267
284
|
.wui-kanban-column[data-wui-drop="ok"] {
|
|
268
285
|
border: 1px dashed var(--color-primary);
|
|
269
286
|
}
|
|
287
|
+
// The column under the card: a 2px dashed primary edge (an inset outline over a hidden border,
|
|
288
|
+
// so nothing inside shifts) on the soft primary fill, and the note becomes a filled label bar.
|
|
270
289
|
.wui-kanban-column[data-wui-drop="ok"][data-wui-over],
|
|
271
290
|
.wui-kanban-column[data-wui-drop="ok"][data-wui-target] {
|
|
272
291
|
background: var(--color-primary-soft);
|
|
273
|
-
border-
|
|
292
|
+
border-color: transparent;
|
|
293
|
+
outline: 2px dashed var(--color-primary);
|
|
294
|
+
outline-offset: -2px;
|
|
274
295
|
}
|
|
275
296
|
.wui-kanban-column[data-wui-drop="ok"] .wui-kanban-drop-note {
|
|
276
297
|
color: var(--color-text);
|
|
277
298
|
}
|
|
278
|
-
|
|
299
|
+
.wui-kanban-column[data-wui-drop="ok"][data-wui-over] .wui-kanban-drop-note,
|
|
300
|
+
.wui-kanban-column[data-wui-drop="ok"][data-wui-target] .wui-kanban-drop-note {
|
|
301
|
+
border-radius: var(--wui-radius-sm);
|
|
302
|
+
background: var(--color-primary);
|
|
303
|
+
color: var(--color-primary-text);
|
|
304
|
+
font-weight: 600;
|
|
305
|
+
}
|
|
306
|
+
// Refused: hatched and locked, with the reason in the note. The hatch is drawn over the subtle
|
|
307
|
+
// fill, since its stripes are the muted fill an open column already has.
|
|
279
308
|
.wui-kanban-column[data-wui-drop="refused"] {
|
|
280
309
|
border-color: var(--color-border);
|
|
310
|
+
background-color: var(--color-bg-subtle);
|
|
281
311
|
background-image: repeating-linear-gradient(
|
|
282
312
|
135deg,
|
|
283
313
|
var(--color-bg-muted) 0 8px,
|
|
@@ -317,6 +347,7 @@
|
|
|
317
347
|
}
|
|
318
348
|
.wui-kanban-collapse {
|
|
319
349
|
order: -1;
|
|
350
|
+
margin-inline-start: 0;
|
|
320
351
|
}
|
|
321
352
|
.wui-kanban-collapse svg {
|
|
322
353
|
transform: rotate(180deg);
|
|
@@ -389,6 +420,7 @@
|
|
|
389
420
|
.wui-kanban-column,
|
|
390
421
|
.wui-kanban-column[data-collapsed] {
|
|
391
422
|
flex: 0 0 100%;
|
|
423
|
+
min-height: 0;
|
|
392
424
|
scroll-snap-align: start;
|
|
393
425
|
align-self: flex-start;
|
|
394
426
|
|
|
@@ -399,7 +431,7 @@
|
|
|
399
431
|
}
|
|
400
432
|
.wui-kanban-title {
|
|
401
433
|
writing-mode: horizontal-tb;
|
|
402
|
-
flex:
|
|
434
|
+
flex: 0 1 auto;
|
|
403
435
|
white-space: normal;
|
|
404
436
|
}
|
|
405
437
|
.wui-kanban-collapse {
|
package/scss/wui/_media.scss
CHANGED
|
@@ -867,6 +867,18 @@
|
|
|
867
867
|
.file-preview[aria-busy="true"] {
|
|
868
868
|
cursor: progress;
|
|
869
869
|
}
|
|
870
|
+
// A disabled drop zone (AppDropZone `disabled`): dimmed, no pointer affordance, and no hover lift.
|
|
871
|
+
.file-input[aria-disabled="true"] {
|
|
872
|
+
opacity: 0.6;
|
|
873
|
+
cursor: not-allowed;
|
|
874
|
+
}
|
|
875
|
+
.file-input[aria-disabled="true"] > .file-input-zone-label {
|
|
876
|
+
cursor: not-allowed;
|
|
877
|
+
}
|
|
878
|
+
.file-input.file-input-tall[aria-disabled="true"]:hover:not(:focus-within):not(.dragging) {
|
|
879
|
+
background: var(--color-bg-muted);
|
|
880
|
+
border-color: var(--color-border);
|
|
881
|
+
}
|
|
870
882
|
.wui-file-busy {
|
|
871
883
|
position: absolute;
|
|
872
884
|
inset: 0;
|
package/scss/wui/_shell.scss
CHANGED
|
@@ -351,6 +351,12 @@
|
|
|
351
351
|
padding-top: 12px;
|
|
352
352
|
border-top: 1px solid var(--color-border);
|
|
353
353
|
}
|
|
354
|
+
// A node the author places right after a group's links (`groups[].after` /
|
|
355
|
+
// `<app-nav-group-after>`). Like sidebarStart it has no place on the 88px rail.
|
|
356
|
+
.wui-nav-group-after {
|
|
357
|
+
flex: none;
|
|
358
|
+
margin-top: 4px;
|
|
359
|
+
}
|
|
354
360
|
.app-nav-group-label {
|
|
355
361
|
padding: 6px 14px;
|
|
356
362
|
font-size: 12px;
|
|
@@ -439,6 +445,7 @@
|
|
|
439
445
|
}
|
|
440
446
|
.app-shell.collapsed .app-nav-badge,
|
|
441
447
|
.app-shell.collapsed .app-nav-group-label,
|
|
448
|
+
.app-shell.collapsed .wui-nav-group-after,
|
|
442
449
|
.app-shell.collapsed .app-sidebar-brand-text,
|
|
443
450
|
.app-shell.collapsed .app-sidebar-start {
|
|
444
451
|
display: none;
|
|
@@ -756,6 +763,7 @@
|
|
|
756
763
|
.app-shell.app-shell.collapsed .app-nav-text,
|
|
757
764
|
.app-shell.app-shell.collapsed .app-nav-badge,
|
|
758
765
|
.app-shell.app-shell.collapsed .app-nav-group-label,
|
|
766
|
+
.app-shell.app-shell.collapsed .wui-nav-group-after,
|
|
759
767
|
.app-shell.app-shell.collapsed .app-sidebar-start {
|
|
760
768
|
display: revert;
|
|
761
769
|
}
|
|
@@ -8,11 +8,12 @@
|
|
|
8
8
|
// (`.tbl-empty-block`) reuse the client-side table rules in _data.scss unchanged.
|
|
9
9
|
|
|
10
10
|
// While a page is in flight the current rows stay in place, dimmed, so the table does not jump;
|
|
11
|
-
// they are not interactive until the new page lands.
|
|
11
|
+
// they are not interactive until the new page lands. A table with no rows shows placeholder rows
|
|
12
|
+
// instead, at full strength.
|
|
12
13
|
.wui-table-server > .table-wrap[aria-busy="true"] {
|
|
13
14
|
cursor: progress;
|
|
14
15
|
}
|
|
15
|
-
.wui-table-server > .table-wrap[aria-busy="true"] > .table > tbody {
|
|
16
|
+
.wui-table-server > .table-wrap[aria-busy="true"] > .table > tbody:not(:has(> tr[data-wui-skeleton])) {
|
|
16
17
|
opacity: 0.55;
|
|
17
18
|
pointer-events: none;
|
|
18
19
|
transition: opacity 0.15s ease;
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
@media (prefers-reduced-motion: reduce) {
|
|
37
|
-
.wui-table-server > .table-wrap[aria-busy="true"] > .table > tbody {
|
|
38
|
+
.wui-table-server > .table-wrap[aria-busy="true"] > .table > tbody:not(:has(> tr[data-wui-skeleton])) {
|
|
38
39
|
transition: none;
|
|
39
40
|
}
|
|
40
41
|
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// ── Product tour ──
|
|
2
|
+
// AppTour / <app-tour> / <wui-tour>: a dimmed page with one highlighted element and a card
|
|
3
|
+
// holding the step text and Back / Next / Skip. The element appends .wui-tour-layer to <body>
|
|
4
|
+
// and positions .wui-tour-spot (over the target) and .wui-tour-card (against the spot, through
|
|
5
|
+
// anchorOverlay, which sets position, top and left inline). Everything visual is here, every
|
|
6
|
+
// colour a theme token.
|
|
7
|
+
//
|
|
8
|
+
// Part of the wui-components layer, see _wui-components.scss for load order.
|
|
9
|
+
|
|
10
|
+
// The step data of a server-rendered tour is plain markup the element reads and the page never shows.
|
|
11
|
+
wui-tour,
|
|
12
|
+
wui-tour-step {
|
|
13
|
+
display: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.wui-tour-layer {
|
|
17
|
+
position: fixed;
|
|
18
|
+
inset: 0;
|
|
19
|
+
z-index: var(--wui-z-tour);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// The dim is the spot's own shadow, so the hole around the target needs no clip-path.
|
|
23
|
+
.wui-tour-spot {
|
|
24
|
+
position: fixed;
|
|
25
|
+
border-radius: var(--wui-radius-sm);
|
|
26
|
+
box-shadow:
|
|
27
|
+
0 0 0 2px var(--color-primary),
|
|
28
|
+
0 0 0 100vmax var(--color-scrim-strong);
|
|
29
|
+
pointer-events: none;
|
|
30
|
+
}
|
|
31
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
32
|
+
.wui-tour-spot {
|
|
33
|
+
transition:
|
|
34
|
+
top 160ms ease,
|
|
35
|
+
left 160ms ease,
|
|
36
|
+
width 160ms ease,
|
|
37
|
+
height 160ms ease;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.wui-tour-card {
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-direction: column;
|
|
44
|
+
gap: 8px;
|
|
45
|
+
width: min(360px, calc(100vw - 16px));
|
|
46
|
+
padding: 16px;
|
|
47
|
+
overflow-y: auto;
|
|
48
|
+
background: var(--color-surface);
|
|
49
|
+
color: var(--color-text);
|
|
50
|
+
border: 1px solid var(--color-border);
|
|
51
|
+
border-radius: var(--wui-radius-lg);
|
|
52
|
+
corner-shape: squircle;
|
|
53
|
+
box-shadow: var(--wui-shadow-overlay);
|
|
54
|
+
&:focus {
|
|
55
|
+
outline: none;
|
|
56
|
+
}
|
|
57
|
+
&:focus-visible {
|
|
58
|
+
outline: 2px solid var(--color-primary);
|
|
59
|
+
outline-offset: 2px;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.wui-tour-position {
|
|
64
|
+
margin: 0;
|
|
65
|
+
font-size: 12px;
|
|
66
|
+
color: var(--color-text-muted);
|
|
67
|
+
}
|
|
68
|
+
.wui-tour-title {
|
|
69
|
+
margin: 0;
|
|
70
|
+
font-size: 16px;
|
|
71
|
+
font-weight: 600;
|
|
72
|
+
}
|
|
73
|
+
.wui-tour-text {
|
|
74
|
+
margin: 0;
|
|
75
|
+
font-size: 14px;
|
|
76
|
+
color: var(--color-text-muted);
|
|
77
|
+
}
|
|
78
|
+
.wui-tour-actions {
|
|
79
|
+
display: flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
justify-content: space-between;
|
|
82
|
+
gap: 8px;
|
|
83
|
+
margin-top: 4px;
|
|
84
|
+
}
|
|
85
|
+
.wui-tour-nav {
|
|
86
|
+
display: flex;
|
|
87
|
+
gap: 8px;
|
|
88
|
+
}
|
|
89
|
+
// The buttons keep Bootstrap's look; the width stops the label change between Next and Done from
|
|
90
|
+
// moving the row, and Skip reads as the quiet action.
|
|
91
|
+
.wui-tour-skip {
|
|
92
|
+
color: var(--color-text-muted);
|
|
93
|
+
}
|
|
94
|
+
.wui-tour-back,
|
|
95
|
+
.wui-tour-next {
|
|
96
|
+
min-width: 64px;
|
|
97
|
+
}
|