@webority/theme 0.78.0 → 0.78.1

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.78.0",
3
+ "version": "0.78.1",
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": {
@@ -140,6 +140,7 @@
140
140
  .card-title,
141
141
  .wui-modal-title,
142
142
  .empty-state-title,
143
+ .tbl-empty-title,
143
144
  .result-title {
144
145
  font-family: var(--wui-font-display);
145
146
  font-weight: 600;
@@ -156,10 +156,15 @@ wui-calendar .fc .fc-day-other .fc-daygrid-day-number {
156
156
  height: 44px;
157
157
  }
158
158
  .wui-calendar-view-btn {
159
- min-height: 38px;
159
+ min-height: 44px;
160
160
  padding: 0 10px;
161
161
  }
162
162
  }
163
+ @media (pointer: coarse) {
164
+ .wui-calendar-view-btn {
165
+ min-height: 44px;
166
+ }
167
+ }
163
168
 
164
169
  .wui-calendar-status {
165
170
  display: flex;
@@ -35,6 +35,20 @@
35
35
  .struct-card.checked .struct-card-title {
36
36
  color: var(--color-primary-ink);
37
37
  }
38
+
39
+ // A card that cannot change: its input is disabled directly or by a disabled fieldset.
40
+ .struct-card:has(.struct-card-input:disabled) {
41
+ cursor: default;
42
+ }
43
+ .struct-card:has(.struct-card-input:disabled):hover {
44
+ border-color: var(--color-border);
45
+ }
46
+ .struct-card.checked:has(.struct-card-input:disabled):hover {
47
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
48
+ }
49
+ .struct-card:has(.struct-card-input:disabled):active {
50
+ background-image: none !important;
51
+ }
38
52
  .struct-card-input {
39
53
  position: absolute;
40
54
  opacity: 0;
@@ -1,6 +1,7 @@
1
1
  // ── Cookie consent banner ──
2
2
  // AppConsentBanner / <app-consent-banner> / <wui-consent-banner>: a card pinned to a bottom
3
- // corner (a full-width bar along the bottom edge on phones) asking for cookie consent, with
3
+ // corner, or a slim full-width bar along the bottom edge (position "bar", and every phone) asking
4
+ // for cookie consent, with
4
5
  // per-category switches behind "Cookie settings". The element authors the markup and owns the
5
6
  // states (`open` on the host, `hidden` on the panel, the settings block and the save button);
6
7
  // everything visual lives here.
@@ -26,6 +27,18 @@ wui-consent-banner[position="bottom-right"] {
26
27
  right: 20px;
27
28
  left: auto;
28
29
  }
30
+ wui-consent-banner[position="bar"] {
31
+ left: 0;
32
+ right: 0;
33
+ bottom: 0;
34
+ width: auto;
35
+ max-width: none;
36
+ }
37
+ wui-consent-banner[position="bar"] .wui-consent-banner-panel {
38
+ padding: 12px 24px calc(12px + env(safe-area-inset-bottom, 0px));
39
+ border-width: 1px 0 0;
40
+ border-radius: 0;
41
+ }
29
42
  wui-consent-banner:not([open]) {
30
43
  pointer-events: none;
31
44
  }
@@ -154,3 +167,38 @@ wui-consent-banner[tour-open] {
154
167
  gap: 6px;
155
168
  }
156
169
  }
170
+
171
+ @media (min-width: 576px) {
172
+ wui-consent-banner[position="bar"] .wui-consent-banner-panel {
173
+ display: flex;
174
+ flex-wrap: wrap;
175
+ align-items: center;
176
+ gap: 8px 24px;
177
+ }
178
+ // Hidden on the bar, but it stays the dialog's accessible name.
179
+ wui-consent-banner[position="bar"] .wui-consent-banner-heading {
180
+ position: absolute;
181
+ width: 1px;
182
+ height: 1px;
183
+ margin: -1px;
184
+ padding: 0;
185
+ overflow: hidden;
186
+ clip: rect(0, 0, 0, 0);
187
+ white-space: nowrap;
188
+ border: 0;
189
+ }
190
+ wui-consent-banner[position="bar"] .wui-consent-banner-description {
191
+ margin: 0;
192
+ flex: 1 1 320px;
193
+ }
194
+ wui-consent-banner[position="bar"] .wui-consent-banner-actions {
195
+ flex: none;
196
+ }
197
+ wui-consent-banner[position="bar"] .wui-consent-banner-settings {
198
+ flex-basis: 100%;
199
+ margin: 0;
200
+ }
201
+ wui-consent-banner[position="bar"] .wui-consent-banner-panel[hidden] {
202
+ display: none;
203
+ }
204
+ }
@@ -13,7 +13,8 @@
13
13
  color: var(--color-text-subtle);
14
14
  }
15
15
  .empty-state-title {
16
- // Matches .tbl-empty-title (the DataTable empty state) so the two read as one family.
16
+ // Matches .tbl-empty-title; brand-signal sets both title faces together. A table's header hides
17
+ // in any .table-wrap whose empty block is visible.
17
18
  font-size: 18px;
18
19
  font-weight: 600;
19
20
  line-height: 1.35;
@@ -136,7 +137,7 @@
136
137
  // `.tbl-empty` / `.tbl-empty-plain` inside own the centring and padding.
137
138
  }
138
139
  // An empty list shows its empty state with no column headers above it.
139
- .table-wrap:has(> .tbl-empty-block:not([hidden])) > .table-ledger > thead {
140
+ .table-wrap:has(> .tbl-empty-block:not([hidden])) > table > thead {
140
141
  display: none;
141
142
  }
142
143
 
@@ -11,6 +11,11 @@
11
11
  white-space: nowrap;
12
12
  }
13
13
 
14
+ // The floating bar form never shrinks below its Filters button and chips.
15
+ .wui-filter-form:has(wui-filter-popover) {
16
+ min-width: min-content;
17
+ }
18
+
14
19
  .wui-filter-popover-panel {
15
20
  box-sizing: border-box;
16
21
  width: 600px;
@@ -244,3 +244,29 @@ html:has(.form-actions-sticky) {
244
244
  min-height: 44px;
245
245
  }
246
246
  }
247
+
248
+ // Touch pointers at any width: the same 44px floor for controls the phone block does not reach.
249
+ @media (pointer: coarse) {
250
+ .app-tab {
251
+ min-height: 44px;
252
+ }
253
+ .app-tabs-scroll-btn {
254
+ min-width: 44px;
255
+ min-height: 44px;
256
+ }
257
+ // The hit area grows, the ink does not: both controls sit inside a 44px field.
258
+ .country-toggle,
259
+ .search-select-clear {
260
+ position: relative;
261
+ }
262
+ .country-toggle::before,
263
+ .search-select-clear::before {
264
+ content: "";
265
+ position: absolute;
266
+ top: 50%;
267
+ left: 50%;
268
+ transform: translate(-50%, -50%);
269
+ width: 44px;
270
+ height: 44px;
271
+ }
272
+ }
@@ -314,6 +314,10 @@
314
314
  border-color: var(--color-primary);
315
315
  background: var(--color-primary-soft);
316
316
  }
317
+ .attach-drop.dragging {
318
+ border-color: var(--color-primary);
319
+ background: var(--color-primary-soft);
320
+ }
317
321
  // The hidden input is a sibling of the label (not a descendant), so :focus-within on
318
322
  // .attach-drop never fires — reach the label through the general sibling combinator instead.
319
323
  .attach-drop:has(+ input:focus-visible) {
@@ -336,6 +340,9 @@
336
340
  .attach-drop:hover .attach-drop-icon {
337
341
  background: var(--color-surface);
338
342
  }
343
+ .attach-drop.dragging .attach-drop-icon {
344
+ background: var(--color-surface);
345
+ }
339
346
  .attach-drop-copy {
340
347
  display: flex;
341
348
  flex-direction: column;
@@ -1147,9 +1154,9 @@
1147
1154
  justify-content: center;
1148
1155
  // Scales with the ring (~23% of the diameter reads well) so it stays proportional at every
1149
1156
  // size instead of dwarfing a small (sm) ring and vanishing on a large (lg) one. Clamped so it
1150
- // never shrinks below a comfortable tap target or grows past the badge look; md lands on 28px.
1151
- width: clamp(20px, calc(var(--wui-logo-size) * 0.23), 34px);
1152
- height: clamp(20px, calc(var(--wui-logo-size) * 0.23), 34px);
1157
+ // never shrinks below the 24px WCAG 2.2 target or grows past the badge look; md lands on 28px.
1158
+ width: clamp(24px, calc(var(--wui-logo-size) * 0.23), 34px);
1159
+ height: clamp(24px, calc(var(--wui-logo-size) * 0.23), 34px);
1153
1160
  padding: 0;
1154
1161
  border: 2px solid var(--color-surface);
1155
1162
  border-radius: 50%;