@webority/theme 0.8.5 → 0.8.7
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/dist/webority-theme.css +1 -1
- package/package.json +1 -1
- package/scss/_components.scss +34 -2
- package/scss/_tokens.scss +17 -8
- package/scss/_wui-aliases.scss +4 -0
- package/scss/wui/_choice.scss +44 -13
- package/scss/wui/_controls.scss +97 -24
- package/scss/wui/_display.scss +68 -11
- package/scss/wui/_media.scss +66 -4
- package/scss/wui/_navigation.scss +9 -1
- package/scss/wui/_shell.scss +17 -2
- package/scss/wui/_utilities.scss +21 -1
- package/scss/wui/_workspace.scss +46 -28
package/scss/wui/_media.scss
CHANGED
|
@@ -388,7 +388,7 @@
|
|
|
388
388
|
}
|
|
389
389
|
.attach-meta {
|
|
390
390
|
display: flex;
|
|
391
|
-
align-items:
|
|
391
|
+
align-items: flex-start;
|
|
392
392
|
justify-content: space-between;
|
|
393
393
|
gap: 12px;
|
|
394
394
|
padding: 10px 14px;
|
|
@@ -399,9 +399,17 @@
|
|
|
399
399
|
font-size: 13px;
|
|
400
400
|
font-weight: 500;
|
|
401
401
|
color: var(--color-text);
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
402
|
+
// Keep any file name inside the (fixed-width) attachment: min-width:0 lets it
|
|
403
|
+
// shrink below its content, and overflow-wrap:anywhere breaks a long, space-less
|
|
404
|
+
// name across lines instead of pushing past the container edge.
|
|
405
|
+
min-width: 0;
|
|
406
|
+
overflow-wrap: anywhere;
|
|
407
|
+
word-break: break-word;
|
|
408
|
+
}
|
|
409
|
+
// In the image-preview meta the name sits in a ROW beside the size, so it must also
|
|
410
|
+
// flex-grow/shrink to take the leftover width (in the compact column it must not).
|
|
411
|
+
.attach-meta .attach-name {
|
|
412
|
+
flex: 1 1 auto;
|
|
405
413
|
}
|
|
406
414
|
.attach-size {
|
|
407
415
|
font-size: 12px;
|
|
@@ -954,6 +962,60 @@
|
|
|
954
962
|
position: relative;
|
|
955
963
|
display: inline-block;
|
|
956
964
|
}
|
|
965
|
+
|
|
966
|
+
// ── Inline (profile-row) layout ── ring on the left, a title/subtitle/hint column beside it —
|
|
967
|
+
// the account-settings avatar row (name + role + allowed-files hint on one line). The field
|
|
968
|
+
// spans its container rather than shrinking to the ring the way the stacked layout does.
|
|
969
|
+
.set-uploader-field--inline {
|
|
970
|
+
width: 100%;
|
|
971
|
+
max-width: none;
|
|
972
|
+
}
|
|
973
|
+
.set-uploader-row {
|
|
974
|
+
display: flex;
|
|
975
|
+
align-items: center;
|
|
976
|
+
gap: 20px;
|
|
977
|
+
}
|
|
978
|
+
.set-uploader-meta {
|
|
979
|
+
display: flex;
|
|
980
|
+
flex-direction: column;
|
|
981
|
+
gap: 2px;
|
|
982
|
+
min-width: 0;
|
|
983
|
+
}
|
|
984
|
+
.set-uploader-title {
|
|
985
|
+
font-size: 15px;
|
|
986
|
+
font-weight: 700;
|
|
987
|
+
line-height: 1.35;
|
|
988
|
+
color: var(--color-text);
|
|
989
|
+
}
|
|
990
|
+
.set-uploader-subtitle {
|
|
991
|
+
font-size: 14px;
|
|
992
|
+
line-height: 1.4;
|
|
993
|
+
color: var(--color-text-muted);
|
|
994
|
+
}
|
|
995
|
+
// In the row layout the hint sits under the subtitle in the meta column — no top gap to the
|
|
996
|
+
// ring and no 240px cap (it reads as a full line beside the avatar, like the reference).
|
|
997
|
+
.set-uploader-meta .set-uploader-hint {
|
|
998
|
+
margin-top: 6px;
|
|
999
|
+
max-width: none;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
// ── Profile (vertical identity) layout ── the same title/subtitle/hint block as inline, but
|
|
1003
|
+
// stacked and centred beneath the ring — an account card / directory tile. The field shrinks to
|
|
1004
|
+
// its content and centres the ring + text column.
|
|
1005
|
+
.set-uploader-field--profile {
|
|
1006
|
+
align-items: center;
|
|
1007
|
+
text-align: center;
|
|
1008
|
+
width: max-content;
|
|
1009
|
+
max-width: 100%;
|
|
1010
|
+
}
|
|
1011
|
+
.set-uploader-field--profile .set-uploader-meta {
|
|
1012
|
+
align-items: center;
|
|
1013
|
+
margin-top: 12px;
|
|
1014
|
+
}
|
|
1015
|
+
// Centred under the ring, the hint reads best with a sensible cap rather than running full width.
|
|
1016
|
+
.set-uploader-field--profile .set-uploader-meta .set-uploader-hint {
|
|
1017
|
+
max-width: 240px;
|
|
1018
|
+
}
|
|
957
1019
|
// Ring highlights while a file is dragged over it.
|
|
958
1020
|
.set-uploader.is-dragging .set-uploader-ring {
|
|
959
1021
|
border-color: var(--color-primary);
|
|
@@ -21,12 +21,20 @@
|
|
|
21
21
|
flex-direction: column;
|
|
22
22
|
}
|
|
23
23
|
.app-sidebar-menu .offcanvas-body {
|
|
24
|
-
|
|
24
|
+
// Inset the content to the same 20px gutter as the header/footer so plain body
|
|
25
|
+
// content doesn't stick to the panel edge. Full-bleed content (edge-to-edge nav
|
|
26
|
+
// rows) can zero it back out via `bodyClassName="p-0"`.
|
|
27
|
+
padding: 18px 20px;
|
|
25
28
|
display: flex;
|
|
26
29
|
flex-direction: column;
|
|
27
30
|
flex: 1;
|
|
28
31
|
min-height: 0;
|
|
29
32
|
}
|
|
33
|
+
// Let a caller's bodyClassName padding utility actually win over the default above
|
|
34
|
+
// (the descendant selector would otherwise out-specify a single utility class).
|
|
35
|
+
.app-sidebar-menu .offcanvas-body.p-0 {
|
|
36
|
+
padding: 0;
|
|
37
|
+
}
|
|
30
38
|
.app-sidebar-menu .asm-footer {
|
|
31
39
|
padding: 16px 20px;
|
|
32
40
|
border-top: 1px solid var(--color-border);
|
package/scss/wui/_shell.scss
CHANGED
|
@@ -236,9 +236,11 @@
|
|
|
236
236
|
.app-sidebar-brand {
|
|
237
237
|
display: flex;
|
|
238
238
|
align-items: center;
|
|
239
|
-
gap
|
|
239
|
+
// Match .app-nav-item's gap so a logo mark → wordmark spaces exactly like a nav icon → label.
|
|
240
|
+
gap: 12px;
|
|
240
241
|
min-height: 32px;
|
|
241
242
|
margin-bottom: 8px;
|
|
243
|
+
padding: 0 0px;
|
|
242
244
|
// The brand row must not shrink when the nav list below it overflows.
|
|
243
245
|
flex: none;
|
|
244
246
|
overflow: hidden;
|
|
@@ -392,6 +394,12 @@
|
|
|
392
394
|
.app-shell.collapsed .app-sidebar-start {
|
|
393
395
|
display: none;
|
|
394
396
|
}
|
|
397
|
+
// Collapsed rail: centre the lone logo mark and drop the inset, matching the icon-only nav rows.
|
|
398
|
+
.app-shell.collapsed .app-sidebar-brand {
|
|
399
|
+
justify-content: center;
|
|
400
|
+
gap: 0;
|
|
401
|
+
padding: 0;
|
|
402
|
+
}
|
|
395
403
|
// The label leaves the VISUAL flow but must stay in the accessibility tree — an
|
|
396
404
|
// icon-only rail link with display:none text has no accessible name (axe
|
|
397
405
|
// link-name, serious). Clip-rect keeps the name; no phantom gap since it takes
|
|
@@ -561,10 +569,17 @@
|
|
|
561
569
|
left: calc(var(--app-sidebar-rail-w) - 12px);
|
|
562
570
|
}
|
|
563
571
|
.app-sidebar-toggle > * {
|
|
572
|
+
// `block` kills the inline-block baseline gap (.wui-icon is inline-block), which otherwise
|
|
573
|
+
// pushes the glyph a hair down in the round button — so the grid can centre it exactly.
|
|
574
|
+
display: block;
|
|
575
|
+
// Optical centring nudge for the chevron in the round button.
|
|
576
|
+
// (translateX is in the icon's own frame, so after the collapsed 180° rotation the same value
|
|
577
|
+
// mirrors on screen — keeping the flipped chevron optically centred too.)
|
|
578
|
+
transform: translateX(-2px);
|
|
564
579
|
transition: transform 0.2s ease;
|
|
565
580
|
}
|
|
566
581
|
.app-shell.collapsed .app-sidebar-toggle > * {
|
|
567
|
-
transform: rotate(180deg);
|
|
582
|
+
transform: rotate(180deg) translateX(2px);
|
|
568
583
|
}
|
|
569
584
|
|
|
570
585
|
.app-main {
|
package/scss/wui/_utilities.scss
CHANGED
|
@@ -160,7 +160,8 @@
|
|
|
160
160
|
}
|
|
161
161
|
.page-header-bar {
|
|
162
162
|
display: flex;
|
|
163
|
-
|
|
163
|
+
// Left (title stack) and right (actions) are vertically centred against each other.
|
|
164
|
+
align-items: center;
|
|
164
165
|
justify-content: space-between;
|
|
165
166
|
gap: 16px;
|
|
166
167
|
}
|
|
@@ -343,6 +344,15 @@
|
|
|
343
344
|
padding: 8px;
|
|
344
345
|
border-radius: 999px;
|
|
345
346
|
corner-shape: round;
|
|
347
|
+
// The base .btn flex/centring rule excludes .btn-icon, so without this an icon
|
|
348
|
+
// button falls back to inline-block and its line-box inflates the HEIGHT past its
|
|
349
|
+
// width (e.g. 34×41). A 999px radius on that non-square box renders an oval, not a
|
|
350
|
+
// circle. Centre the glyph in a square box so the pill radius reads as a true circle.
|
|
351
|
+
display: inline-flex;
|
|
352
|
+
align-items: center;
|
|
353
|
+
justify-content: center;
|
|
354
|
+
line-height: 1;
|
|
355
|
+
aspect-ratio: 1;
|
|
346
356
|
}
|
|
347
357
|
|
|
348
358
|
// Circular icon buttons in the top bar (minimal dashboard chrome).
|
|
@@ -675,9 +685,19 @@
|
|
|
675
685
|
}
|
|
676
686
|
|
|
677
687
|
.info-callout-content {
|
|
688
|
+
// Grows to fill the row so a trailing action (and the dismiss ×) sit at the right edge.
|
|
689
|
+
flex: 1 1 auto;
|
|
678
690
|
min-width: 0;
|
|
679
691
|
font-size: 12px;
|
|
680
692
|
}
|
|
693
|
+
// Trailing action slot — a button (or any node) pinned to the right, vertically centred.
|
|
694
|
+
.info-callout-action {
|
|
695
|
+
flex: none;
|
|
696
|
+
align-self: center;
|
|
697
|
+
display: inline-flex;
|
|
698
|
+
align-items: center;
|
|
699
|
+
gap: 8px;
|
|
700
|
+
}
|
|
681
701
|
.info-callout-heading {
|
|
682
702
|
font-size: 14px;
|
|
683
703
|
font-weight: 600;
|
package/scss/wui/_workspace.scss
CHANGED
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
width: 100%;
|
|
26
26
|
min-height: 48px;
|
|
27
27
|
padding: 6px 10px;
|
|
28
|
-
//
|
|
29
|
-
//
|
|
28
|
+
// Border / fill / hover / focus match AppInput exactly: a muted resting fill, a grey
|
|
29
|
+
// border, hover to a strong border, and focus/open onto a clean surface with the soft
|
|
30
|
+
// brand border (border is the cue — no ring, no shadow). The pill shape stays.
|
|
30
31
|
background: var(--color-bg-muted);
|
|
31
32
|
border: 1px solid var(--color-border);
|
|
32
|
-
border-radius:
|
|
33
|
-
corner-shape: squircle;
|
|
33
|
+
border-radius: 999px;
|
|
34
34
|
color: var(--color-text);
|
|
35
35
|
text-align: left;
|
|
36
36
|
cursor: pointer;
|
|
@@ -38,12 +38,9 @@
|
|
|
38
38
|
border-color 0.12s,
|
|
39
39
|
box-shadow 0.12s;
|
|
40
40
|
}
|
|
41
|
-
// Hover while closed darkens the border, exactly like a resting AppSelect on hover.
|
|
42
41
|
.workspace-switcher-trigger:hover:not(:focus):not([aria-expanded="true"]) {
|
|
43
42
|
border-color: var(--color-border-strong);
|
|
44
43
|
}
|
|
45
|
-
// Focus / open lifts onto a white surface with the soft brand border — the same active cue
|
|
46
|
-
// AppSelect gives a focused or open control (border is the cue; no ring, no shadow).
|
|
47
44
|
.workspace-switcher-trigger:focus-visible,
|
|
48
45
|
.workspace-switcher-trigger[aria-expanded="true"] {
|
|
49
46
|
outline: none;
|
|
@@ -52,13 +49,13 @@
|
|
|
52
49
|
box-shadow: none;
|
|
53
50
|
}
|
|
54
51
|
.workspace-switcher-trigger.is-compact {
|
|
55
|
-
width:
|
|
56
|
-
min-height:
|
|
57
|
-
height:
|
|
52
|
+
width: 40px;
|
|
53
|
+
min-height: 40px;
|
|
54
|
+
height: 40px;
|
|
58
55
|
padding: 0;
|
|
59
56
|
justify-content: center;
|
|
60
57
|
gap: 0;
|
|
61
|
-
border-radius:
|
|
58
|
+
border-radius: 50%;
|
|
62
59
|
}
|
|
63
60
|
.workspace-switcher-trigger-name {
|
|
64
61
|
flex: 1 1 auto;
|
|
@@ -82,11 +79,12 @@
|
|
|
82
79
|
display: inline-flex;
|
|
83
80
|
align-items: center;
|
|
84
81
|
justify-content: center;
|
|
85
|
-
width:
|
|
86
|
-
height:
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
background: var(--color-
|
|
82
|
+
width: 30px;
|
|
83
|
+
height: 30px;
|
|
84
|
+
// A round logo chip on a clean white ring — the same avatar look in the trigger and the menu.
|
|
85
|
+
border-radius: 50%;
|
|
86
|
+
background: var(--color-surface);
|
|
87
|
+
border: 1px solid var(--color-border-light);
|
|
90
88
|
color: var(--color-primary);
|
|
91
89
|
font-size: 11px;
|
|
92
90
|
font-weight: 700;
|
|
@@ -195,19 +193,24 @@
|
|
|
195
193
|
.workspace-switcher .workspace-switcher-create {
|
|
196
194
|
display: flex;
|
|
197
195
|
align-items: center;
|
|
198
|
-
gap:
|
|
196
|
+
gap: 12px;
|
|
199
197
|
width: 100%;
|
|
200
|
-
padding:
|
|
198
|
+
padding: 9px 12px;
|
|
201
199
|
border: none;
|
|
202
|
-
border-radius: var(--radius);
|
|
200
|
+
border-radius: var(--radius-lg);
|
|
203
201
|
corner-shape: squircle;
|
|
204
202
|
background: transparent;
|
|
205
203
|
color: var(--color-text);
|
|
206
|
-
font-size:
|
|
204
|
+
font-size: 15px;
|
|
207
205
|
text-align: left;
|
|
208
206
|
text-decoration: none;
|
|
209
207
|
cursor: pointer;
|
|
210
208
|
}
|
|
209
|
+
// Menu avatars read larger than the trigger's — a comfortable identity row per the design.
|
|
210
|
+
.workspace-switcher .workspace-switcher-option .workspace-switcher-mark {
|
|
211
|
+
width: 42px;
|
|
212
|
+
height: 42px;
|
|
213
|
+
}
|
|
211
214
|
.workspace-switcher .workspace-switcher-option:hover,
|
|
212
215
|
.workspace-switcher .workspace-switcher-create:hover {
|
|
213
216
|
background: var(--color-bg-subtle);
|
|
@@ -252,37 +255,52 @@
|
|
|
252
255
|
color: var(--color-text-muted);
|
|
253
256
|
}
|
|
254
257
|
.workspace-switcher .workspace-switcher-create {
|
|
258
|
+
justify-content: center;
|
|
255
259
|
color: var(--color-primary);
|
|
256
260
|
font-weight: 600;
|
|
257
261
|
}
|
|
262
|
+
// The create / add rows lead with a round soft-tint "+" chip and centre their accent label,
|
|
263
|
+
// matching the design's "Add Business" action.
|
|
264
|
+
.workspace-switcher .workspace-switcher-create .wui-icon,
|
|
265
|
+
.workspace-switcher .workspace-switcher-footer-action .wui-icon {
|
|
266
|
+
box-sizing: border-box;
|
|
267
|
+
width: 28px;
|
|
268
|
+
height: 28px;
|
|
269
|
+
padding: 6px;
|
|
270
|
+
border-radius: 50%;
|
|
271
|
+
background: var(--color-primary-soft);
|
|
272
|
+
color: var(--color-primary);
|
|
273
|
+
}
|
|
258
274
|
|
|
259
275
|
// ── Footer ──
|
|
260
276
|
// A single workspace still gets a menu: current row + this footer. The divider is what makes
|
|
261
277
|
// that read as a complete panel rather than a truncated list.
|
|
262
278
|
.workspace-switcher-footer {
|
|
263
279
|
margin-top: 6px;
|
|
264
|
-
padding-top:
|
|
265
|
-
border-top: 1px
|
|
280
|
+
padding-top: 8px;
|
|
281
|
+
border-top: 1px dashed var(--color-border);
|
|
266
282
|
}
|
|
267
283
|
.workspace-switcher .workspace-switcher-footer-action {
|
|
268
284
|
display: flex;
|
|
269
285
|
align-items: center;
|
|
286
|
+
justify-content: center;
|
|
270
287
|
gap: 10px;
|
|
271
288
|
width: 100%;
|
|
272
|
-
padding:
|
|
289
|
+
padding: 8px 12px;
|
|
273
290
|
border: none;
|
|
274
|
-
border-radius: var(--radius);
|
|
291
|
+
border-radius: var(--radius-lg);
|
|
275
292
|
corner-shape: squircle;
|
|
276
293
|
background: transparent;
|
|
277
|
-
color: var(--color-
|
|
278
|
-
font-size:
|
|
294
|
+
color: var(--color-primary);
|
|
295
|
+
font-size: 15px;
|
|
296
|
+
font-weight: 600;
|
|
279
297
|
text-align: left;
|
|
280
298
|
text-decoration: none;
|
|
281
299
|
cursor: pointer;
|
|
282
300
|
}
|
|
283
301
|
.workspace-switcher .workspace-switcher-footer-action:hover {
|
|
284
|
-
background: var(--color-
|
|
285
|
-
color: var(--color-
|
|
302
|
+
background: var(--color-primary-soft);
|
|
303
|
+
color: var(--color-primary);
|
|
286
304
|
}
|
|
287
305
|
|
|
288
306
|
@media (prefers-reduced-motion: reduce) {
|