@webority/theme 0.9.11 → 0.9.12

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/theme",
3
- "version": "0.9.11",
3
+ "version": "0.9.12",
4
4
  "description": "Webority shared design system — Bootstrap 5.3 SCSS overrides, --wui-* tokens, and shared component CSS. The single source of brand chrome for React portals and Razor sites.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -419,6 +419,31 @@
419
419
  --bs-dropdown-link-active-color: var(--color-primary-hover);
420
420
  --bs-dropdown-link-active-bg: var(--color-primary-soft);
421
421
  box-shadow: var(--wui-shadow-overlay);
422
+ // A long menu (account / workspace lists) must never spill past the screen and clip its
423
+ // last rows: cap the panel to the viewport and scroll INSIDE it. The room subtracted
424
+ // leaves space for a topbar-height trigger + margin — the common anchor for these long
425
+ // lists — so a top-anchored menu fits; Popper flips/shifts the panel for other anchors.
426
+ // The thin thumb matches the shared rail (--wui-scrollbar*), like .wui-scroll.
427
+ max-height: calc(100vh - 5rem);
428
+ overflow-y: auto;
429
+ scrollbar-width: thin;
430
+ scrollbar-color: var(--wui-scrollbar) transparent;
431
+ }
432
+ .dropdown-menu::-webkit-scrollbar {
433
+ width: 8px;
434
+ }
435
+ .dropdown-menu::-webkit-scrollbar-track {
436
+ background: transparent;
437
+ }
438
+ .dropdown-menu::-webkit-scrollbar-thumb {
439
+ background-color: var(--wui-scrollbar);
440
+ border-radius: 9999px;
441
+ border: 2px solid transparent;
442
+ background-clip: padding-box;
443
+ }
444
+ .dropdown-menu::-webkit-scrollbar-thumb:hover {
445
+ background-color: var(--wui-scrollbar-hover);
446
+ background-clip: padding-box;
422
447
  }
423
448
 
424
449
  .dropdown-item {
@@ -13,14 +13,16 @@
13
13
  color: var(--color-text-subtle);
14
14
  }
15
15
  .empty-state-title {
16
- font-size: 16px;
16
+ // Matches .tbl-empty-title (the DataTable empty state) so the two read as one family.
17
+ font-size: 18px;
17
18
  font-weight: 600;
18
19
  line-height: 1.35;
19
20
  color: var(--color-text);
20
21
  }
21
22
  .empty-state-message {
22
23
  margin: 6px 0 0;
23
- font-size: 14px;
24
+ // Matches .tbl-empty-text.
25
+ font-size: 16px;
24
26
  line-height: 1.5;
25
27
  color: var(--color-text-muted);
26
28
  }
@@ -112,17 +114,27 @@
112
114
  .table-ledger tbody tr:hover td.wui-table-empty:has(> .tbl-empty) {
113
115
  background: transparent;
114
116
  }
115
- // Empty state sizes exactly like a POPULATED table — a standard responsive table. It fills
116
- // its container (base `.table { width: 100% }`), so the columns spread to use the width; when
117
- // the container is too narrow the columns compress as far as they can, and once even their
118
- // content can't fit, `.table-wrap` (base `overflow-x: auto`) scrolls horizontally rather than
119
- // clipping — every header label reads in full, never ellipsis-truncated into "REFEREN…".
117
+ // The React AppDataTable renders its empty state as a SIBLING of the table, INSIDE `.table-wrap`
118
+ // (the horizontal scroller), in this `.tbl-empty-block`. Two things fall out of that placement:
119
+ // 1. the horizontal scrollbar sits at the BOTTOM of the wrap — below this message — instead of
120
+ // being wedged between the header band and the message (which is what an outside-the-wrap
121
+ // block produced), and
122
+ // 2. `position: sticky; left: 0` + `width: 100%` pins the message to the wrap's VISIBLE width and
123
+ // holds it there while a wide header scrolls behind it: `width: 100%` on a child of an
124
+ // overflow container resolves to the container's CONTENT (visible) width, not its scroll width,
125
+ // so the message never grows the scroll region and never slides off on a narrow screen.
120
126
  //
121
- // So the empty state carries NO special width rule of its own: the base table layout already
122
- // gives responsive-then-scroll. We deliberately do NOT pin the message to the viewport with
123
- // `container-type` + `100cqw` (it forced the colSpan cell, and the whole table, up to the panel
124
- // width), and we do NOT shrink the table to `width: auto` (that collapsed the columns). Only the
125
- // cell reset above (no padding/border/hover) is empty-specific.
127
+ // This deliberately does NOT use `container-type` + `100cqw` — the query container collapses
128
+ // `.table-wrap` to a sliver when it is a flex/grid item (see the `.table-wrap` note below). Sticky
129
+ // sidesteps that entirely. (The `.wui-table-empty` cell rules above remain for Razor, where the
130
+ // empty state is author-placed inside a `<td colSpan>`.)
131
+ .tbl-empty-block {
132
+ position: sticky;
133
+ left: 0;
134
+ // = the wrap's visible width (content box of the overflow container), never its scroll width.
135
+ width: 100%;
136
+ // `.tbl-empty` / `.tbl-empty-plain` inside own the centring and padding.
137
+ }
126
138
 
127
139
  // ── Table (base) ──
128
140
  // The shared data-table look, on the plain `.table` class Bootstrap already
@@ -700,7 +700,8 @@ a.info-row:hover .info-value {
700
700
  font-size: 12.5px;
701
701
  color: var(--color-text-muted);
702
702
  }
703
- .timeline-at {
703
+ .timeline-at,
704
+ .timeline-time {
704
705
  color: var(--color-text-subtle);
705
706
  font-variant-numeric: tabular-nums;
706
707
  }
@@ -820,12 +821,30 @@ a.info-row:hover .info-value {
820
821
  justify-content: space-between;
821
822
  gap: 12px;
822
823
  }
823
- .timeline--progress .timeline-head .timeline-at {
824
+ // Date OVER time — the stamp stacks vertically so the time reads on its own line beneath the
825
+ // date. `.timeline-when` groups the two wherever a date+time stamp appears (both variants), so
826
+ // the pair moves and aligns as one unit.
827
+ .timeline-when {
828
+ display: inline-flex;
829
+ flex-direction: column;
830
+ gap: 1px;
831
+ }
832
+ // Progress: the stamp is pinned top-right, so the stack is right-aligned under the title row.
833
+ .timeline--progress .timeline-head .timeline-when {
824
834
  flex: none;
835
+ align-items: flex-end;
836
+ text-align: right;
837
+ }
838
+ .timeline--progress .timeline-head .timeline-at,
839
+ .timeline--progress .timeline-head .timeline-time {
825
840
  font-size: 12.5px;
826
841
  color: var(--color-text-subtle);
827
842
  white-space: nowrap;
828
843
  }
844
+ // The time-of-day line is a touch smaller/lighter than the date it sits under.
845
+ .timeline-time {
846
+ font-size: 12px;
847
+ }
829
848
  // An upcoming step greys down — it hasn't happened yet.
830
849
  .timeline--progress .timeline-item.is-upcoming .timeline-title {
831
850
  color: var(--color-text-muted);
@@ -127,6 +127,11 @@
127
127
 
128
128
  // Optional overflow wrapper: the scroll chevrons live HERE, outside the scrolling strip,
129
129
  // so they stay pinned while the tabs scroll under them.
130
+ // A little horizontal padding insets the strip from its container's edges, so the first/last
131
+ // tab — and its full-width active underline — never lands on a rounded container's corner (a
132
+ // tab strip placed flush in a card read as the underline hanging outside it). Horizontal only:
133
+ // both surfaces render this wrapper for horizontal strips and skip it for vertical, so the two
134
+ // stay identical.
130
135
  .app-tabs-wrap {
131
136
  position: relative;
132
137
  display: flex;
@@ -146,10 +151,12 @@
146
151
  // Auto-scrolling the active tab into view (and the chevrons) glides rather than jumps.
147
152
  scroll-behavior: smooth;
148
153
  }
149
- // Doubled to (0,2,0) so the strip keeps scrolling even if a consumer loads Bootstrap
150
- // after the theme, which would otherwise let `.nav`'s flex-wrap:wrap win on order.
154
+ // Doubled to (0,2,0) so the strip keeps scrolling AND keeps its gutters even if a consumer
155
+ // loads Bootstrap after the theme, which would otherwise let `.nav`'s flex-wrap:wrap and
156
+ // padding-left:0 win on source order.
151
157
  .app-tabs.app-tabs {
152
158
  flex-wrap: nowrap;
159
+ padding: 0 12px;
153
160
  }
154
161
  .app-tabs::-webkit-scrollbar {
155
162
  display: none;
@@ -187,8 +187,8 @@
187
187
  flex: none;
188
188
  display: inline-grid;
189
189
  place-items: center;
190
- width: 40px;
191
- height: 40px;
190
+ width: 55px;
191
+ height: 55px;
192
192
  border-radius: var(--radius);
193
193
  corner-shape: squircle;
194
194
  background: var(--color-primary-soft);
@@ -279,8 +279,8 @@
279
279
  font-size: 20px;
280
280
  }
281
281
  .page-header-sm .page-header-icon {
282
- width: 34px;
283
- height: 34px;
282
+ width: 49px;
283
+ height: 49px;
284
284
  }
285
285
  .page-header-lg {
286
286
  margin-bottom: 32px;
@@ -289,8 +289,8 @@
289
289
  font-size: 30px;
290
290
  }
291
291
  .page-header-lg .page-header-icon {
292
- width: 48px;
293
- height: 48px;
292
+ width: 63px;
293
+ height: 63px;
294
294
  }
295
295
 
296
296
  // ── Centre alignment ── (`align="center"`): for empty-state and wizard mastheads.