@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.
@@ -388,7 +388,7 @@
388
388
  }
389
389
  .attach-meta {
390
390
  display: flex;
391
- align-items: baseline;
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
- overflow: hidden;
403
- text-overflow: ellipsis;
404
- white-space: nowrap;
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
- padding: 0;
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);
@@ -236,9 +236,11 @@
236
236
  .app-sidebar-brand {
237
237
  display: flex;
238
238
  align-items: center;
239
- gap: 10px;
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 {
@@ -160,7 +160,8 @@
160
160
  }
161
161
  .page-header-bar {
162
162
  display: flex;
163
- align-items: flex-end;
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;
@@ -25,12 +25,12 @@
25
25
  width: 100%;
26
26
  min-height: 48px;
27
27
  padding: 6px 10px;
28
- // The trigger IS a closed picker, so it wears AppSelect's control skin (.input): a muted
29
- // resting fill, a grey border, and the same border/box-shadow transition — nothing bespoke.
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: var(--radius-lg);
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: 36px;
56
- min-height: 36px;
57
- height: 36px;
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: var(--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: 28px;
86
- height: 28px;
87
- border-radius: var(--radius);
88
- corner-shape: squircle;
89
- background: var(--color-primary-soft);
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: 10px;
196
+ gap: 12px;
199
197
  width: 100%;
200
- padding: 7px 10px;
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: 14px;
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: 6px;
265
- border-top: 1px solid var(--color-border-light);
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: 7px 10px;
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-text-muted);
278
- font-size: 13px;
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-bg-subtle);
285
- color: var(--color-text);
302
+ background: var(--color-primary-soft);
303
+ color: var(--color-primary);
286
304
  }
287
305
 
288
306
  @media (prefers-reduced-motion: reduce) {