@webority/theme 0.9.7 → 0.9.8

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.7",
3
+ "version": "0.9.8",
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": {
@@ -112,6 +112,40 @@
112
112
  .table-ledger tbody tr:hover td.wui-table-empty:has(> .tbl-empty) {
113
113
  background: transparent;
114
114
  }
115
+ // Keep the empty state on screen. An empty table has no data to scroll to, yet its
116
+ // header row can still be wider than the viewport (many columns, or wide header
117
+ // labels), so `.table-wrap` would scroll horizontally and the centred empty message —
118
+ // spanning that full width in a colSpan cell — would slide off screen on a narrow
119
+ // screen. Keyed off the empty body itself (`.tbl-empty` for a rich AppTableEmptyState,
120
+ // `.tbl-empty-plain` for a plain string — both surfaces render one), lay the empty
121
+ // table out at the visible wrap width and drop the scroll, so the message stays centred
122
+ // and fully in view. This is the "do it without turning the scroll container into a
123
+ // query container" path the pin note on `.table-wrap:has(> .table-ledger)` calls for —
124
+ // it replaces the earlier `container-type` + `100cqw` pin, which collapsed the wrap as a
125
+ // flex/grid item. Scoped to the empty body, so a table WITH rows is untouched and still
126
+ // scrolls its columns.
127
+ // Keyed on the empty CELL (`td.wui-table-empty`, the one element unique to the empty
128
+ // state on both surfaces) with CHILD combinators, NOT a loose descendant `:has(.tbl-empty)`.
129
+ // The child chain matches only a table's OWN empty body — so an expandable row whose
130
+ // nested table happens to be empty can never force the outer, data-bearing table into
131
+ // this layout. A data table (no empty cell of its own) is untouched and still scrolls.
132
+ .table-wrap:has(> table > tbody > tr > td.wui-table-empty) {
133
+ overflow-x: hidden;
134
+ }
135
+ .table:has(> tbody > tr > td.wui-table-empty) {
136
+ width: 100%;
137
+ min-width: 0;
138
+ table-layout: fixed;
139
+ }
140
+ // Under the fixed layout above the columns are narrow, so a long header label would
141
+ // spill out of its cell and back into horizontal overflow — the very thing we just
142
+ // removed. Clip each header to its column (ellipsis) in the empty state; short labels
143
+ // are unaffected, and the data table keeps its natural header sizing.
144
+ .table:has(> tbody > tr > td.wui-table-empty) > thead th {
145
+ overflow: hidden;
146
+ white-space: nowrap;
147
+ text-overflow: ellipsis;
148
+ }
115
149
 
116
150
  // ── Table (base) ──
117
151
  // The shared data-table look, on the plain `.table` class Bootstrap already
@@ -547,6 +547,19 @@
547
547
  animation: wui-toast-in 0.24s ease;
548
548
  }
549
549
 
550
+ // A single-line toast — bare message, no title / action / progress stack — centers its icon,
551
+ // text and close as one row. The flex-start default above exists for the multi-line variants
552
+ // (title+message, an action button, a progress track), where the icon must sit on the first
553
+ // line rather than float to the middle of a tall card.
554
+ .wui-toast:not(:has(.wui-toast-title)):not(:has(.wui-toast-action)):not(:has(.wui-toast-task)) {
555
+ align-items: center;
556
+ }
557
+ // The 1px top nudges align the icon/close with the first text line under flex-start; once the
558
+ // row is centered they would push those items a touch low, so zero them here.
559
+ .wui-toast:not(:has(.wui-toast-title)):not(:has(.wui-toast-action)):not(:has(.wui-toast-task)) :is(.wui-toast-icon, .wui-toast-close) {
560
+ margin-top: 0;
561
+ }
562
+
550
563
  // While a swipe is in progress the toast follows the pointer with no transition.
551
564
  .wui-toast--dragging {
552
565
  transition: none;
@@ -164,6 +164,13 @@
164
164
  align-items: center;
165
165
  justify-content: space-between;
166
166
  gap: 16px;
167
+ // Content-driven wrap: while the title block and actions both fit, space-between keeps the
168
+ // actions pinned right; once a long title needs the full width they can no longer share the
169
+ // row, so the actions drop onto their own line — left-aligned, since space-between places a
170
+ // lone wrapped item at flex-start — instead of being crushed against the title. The gap above
171
+ // doubles as the row-gap to that dropped line. (Below lg they stack unconditionally, further
172
+ // down; this is the any-width, content-driven case.)
173
+ flex-wrap: wrap;
167
174
  }
168
175
  // Left block: an optional leading icon tile + the title stack, kept together.
169
176
  .page-header-lead {