@webority/theme 0.7.5 → 0.7.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.
@@ -262,6 +262,14 @@
262
262
  width: 0;
263
263
  height: 0;
264
264
  }
265
+ // Between the brand row and the nav — a workspace/tenant switcher, an environment
266
+ // badge. It must not shrink when the nav overflows, and it has no place on the
267
+ // 88px rail, so the collapsed state removes it (the mobile drawer restores it).
268
+ .app-sidebar-start {
269
+ flex: none;
270
+ margin-bottom: 8px;
271
+ overflow: hidden;
272
+ }
265
273
  .app-sidebar-foot {
266
274
  flex: none;
267
275
  padding-top: 12px;
@@ -369,7 +377,8 @@
369
377
  .app-shell.collapsed .app-nav-text,
370
378
  .app-shell.collapsed .app-nav-badge,
371
379
  .app-shell.collapsed .app-nav-group-label,
372
- .app-shell.collapsed .app-sidebar-brand-text {
380
+ .app-shell.collapsed .app-sidebar-brand-text,
381
+ .app-shell.collapsed .app-sidebar-start {
373
382
  display: none;
374
383
  }
375
384
 
@@ -492,7 +501,7 @@
492
501
  // 36px = half the 72px topbar, so the button lines up with the topbar's centre.
493
502
  top: 36px;
494
503
  left: calc(var(--app-sidebar-w) - 12px);
495
- z-index: 30;
504
+ z-index: var(--wui-z-fixed);
496
505
  width: 24px;
497
506
  height: 24px;
498
507
  display: inline-grid;
@@ -597,7 +606,7 @@
597
606
  right: 0;
598
607
  bottom: 0;
599
608
  left: var(--app-sidebar-w);
600
- z-index: 30;
609
+ z-index: var(--wui-z-fixed);
601
610
  background: color-mix(in srgb, var(--color-surface) 90%, transparent);
602
611
  backdrop-filter: blur(50px);
603
612
  -webkit-backdrop-filter: blur(50px);
@@ -638,7 +647,8 @@
638
647
  }
639
648
  .app-shell.app-shell.collapsed .app-nav-text,
640
649
  .app-shell.app-shell.collapsed .app-nav-badge,
641
- .app-shell.app-shell.collapsed .app-nav-group-label {
650
+ .app-shell.app-shell.collapsed .app-nav-group-label,
651
+ .app-shell.app-shell.collapsed .app-sidebar-start {
642
652
  display: revert;
643
653
  }
644
654
  .app-shell.app-shell .app-sidebar-toggle {
@@ -279,6 +279,22 @@ wui-multiselect[collapse-chips] .ms-chips {
279
279
  align-items: center;
280
280
  gap: 8px;
281
281
  }
282
+ .ms-input {
283
+ flex: 1;
284
+ min-width: 60px;
285
+ border: none;
286
+ background: transparent;
287
+ font: inherit;
288
+ color: inherit;
289
+ padding: 0;
290
+ margin: 0;
291
+ }
292
+ .ms-input::placeholder {
293
+ color: var(--color-text-subtle);
294
+ }
295
+ .ms-input:focus {
296
+ outline: none;
297
+ }
282
298
 
283
299
  /* ── Choice card: image / custom-template variant ── */
284
300
  .struct-card-img-card {
@@ -76,17 +76,22 @@
76
76
  transform: scaleY(-1);
77
77
  transition: color 0.15s;
78
78
  }
79
- .infotip-btn:hover,
79
+ .infotip-btn:hover {
80
+ color: var(--color-primary);
81
+ }
80
82
  .infotip-btn:focus-visible {
81
83
  color: var(--color-primary);
82
- outline: none;
84
+ outline: 2px solid var(--color-primary);
85
+ outline-offset: 2px;
83
86
  }
84
87
  .infotip-pop {
85
88
  position: absolute;
86
89
  bottom: calc(100% + 8px);
87
90
  left: 50%;
88
91
  transform: translateX(-50%);
89
- z-index: 220;
92
+ // Same rung as the .is-portal variant below — an anchored infotip inside a
93
+ // modal must clear the same modal it was previously trapped under at 220.
94
+ z-index: var(--wui-z-menu);
90
95
  display: flex;
91
96
  flex-direction: column;
92
97
  gap: 4px;
@@ -141,9 +146,91 @@
141
146
  }
142
147
 
143
148
  // ── Page header ──
149
+ // `.page-header` stacks an optional breadcrumbs row above `.page-header-bar` — the
150
+ // flex row that holds the title block on the left and the page actions on the right.
144
151
  .page-header {
145
152
  margin-bottom: 24px;
146
153
  }
154
+ .page-header-bar {
155
+ display: flex;
156
+ align-items: flex-end;
157
+ justify-content: space-between;
158
+ gap: 16px;
159
+ }
160
+ // Left block: an optional leading icon tile + the title stack, kept together.
161
+ .page-header-lead {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 12px;
165
+ min-width: 0;
166
+ }
167
+ // A breadcrumbs row above the masthead row.
168
+ .page-breadcrumbs {
169
+ margin-bottom: 10px;
170
+ }
171
+ // Leading icon tile — tinted by `tone` (default primary), matching the modal head icon.
172
+ .page-header-icon {
173
+ flex: none;
174
+ display: inline-grid;
175
+ place-items: center;
176
+ width: 40px;
177
+ height: 40px;
178
+ border-radius: var(--radius);
179
+ corner-shape: squircle;
180
+ background: var(--color-primary-soft);
181
+ color: var(--color-primary);
182
+ }
183
+ .page-header.tone-success .page-header-icon {
184
+ background: var(--color-success-soft);
185
+ color: var(--color-success-text);
186
+ }
187
+ .page-header.tone-warning .page-header-icon {
188
+ background: var(--color-warning-soft);
189
+ color: var(--color-warning-text);
190
+ }
191
+ .page-header.tone-danger .page-header-icon {
192
+ background: var(--color-danger-soft);
193
+ color: var(--color-danger-text);
194
+ }
195
+ .page-header.tone-info .page-header-icon {
196
+ background: var(--color-info-soft);
197
+ color: var(--color-info-text);
198
+ }
199
+ .page-header-titles {
200
+ min-width: 0;
201
+ }
202
+ // Eyebrow — a small kicker label above the title (a section / category marker).
203
+ .page-eyebrow {
204
+ font-size: 12px;
205
+ font-weight: 700;
206
+ letter-spacing: 0.06em;
207
+ text-transform: uppercase;
208
+ color: var(--color-primary);
209
+ margin-bottom: 3px;
210
+ }
211
+ .page-header.tone-success .page-eyebrow {
212
+ color: var(--color-success-text);
213
+ }
214
+ .page-header.tone-warning .page-eyebrow {
215
+ color: var(--color-warning-text);
216
+ }
217
+ .page-header.tone-danger .page-eyebrow {
218
+ color: var(--color-danger-text);
219
+ }
220
+ .page-header.tone-info .page-eyebrow {
221
+ color: var(--color-info-text);
222
+ }
223
+ // Title + an optional inline status pill, on one baseline.
224
+ .page-titlebar {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: 10px;
228
+ flex-wrap: wrap;
229
+ }
230
+ .page-status {
231
+ display: inline-flex;
232
+ align-items: center;
233
+ }
147
234
  .page-title {
148
235
  font-size: 24px;
149
236
  font-weight: 600;
@@ -162,17 +249,67 @@
162
249
  align-items: center;
163
250
  }
164
251
 
252
+ // ── Size scale ── (`size`): the title and the block's rhythm scale together.
253
+ .page-header-sm {
254
+ margin-bottom: 16px;
255
+ }
256
+ .page-header-sm .page-title {
257
+ font-size: 20px;
258
+ }
259
+ .page-header-sm .page-header-icon {
260
+ width: 34px;
261
+ height: 34px;
262
+ }
263
+ .page-header-lg {
264
+ margin-bottom: 32px;
265
+ }
266
+ .page-header-lg .page-title {
267
+ font-size: 30px;
268
+ }
269
+ .page-header-lg .page-header-icon {
270
+ width: 48px;
271
+ height: 48px;
272
+ }
273
+
274
+ // ── Centre alignment ── (`align="center"`): for empty-state and wizard mastheads.
275
+ .page-header-center .page-header-bar {
276
+ justify-content: center;
277
+ text-align: center;
278
+ }
279
+ .page-header-center .page-header-lead {
280
+ flex-direction: column;
281
+ align-items: center;
282
+ }
283
+ .page-header-center .page-titlebar {
284
+ justify-content: center;
285
+ }
286
+
287
+ // ── Divider ── (`divider`): a hairline rule under the masthead.
288
+ .page-header-divider {
289
+ border-bottom: 1px solid var(--color-border);
290
+ padding-bottom: 16px;
291
+ }
292
+
293
+ // ── Sticky ── (`sticky`): pins the masthead to the top of its scroll container.
294
+ .page-header-sticky {
295
+ position: sticky;
296
+ top: 0;
297
+ z-index: 20;
298
+ background: var(--color-surface);
299
+ padding-top: 12px;
300
+ }
301
+
165
302
  // Tablet and below: the masthead stops being a single row — the title block and
166
303
  // its actions stack, and the actions stretch to the full width rather than
167
304
  // crowding the title. Bootstrap's lg tier (991.98px), not an invented breakpoint.
168
305
  //
169
- // Selectors are DOUBLED (`.page-header.page-header`) on purpose. A media query
170
- // adds no specificity, so a consumer's own single-class rule — written later in
171
- // the cascade, as a consuming app's stylesheet always is — silently beats the
306
+ // Selectors are DOUBLED (`.page-header-bar.page-header-bar`) on purpose. A media
307
+ // query adds no specificity, so a consumer's own single-class rule — written later
308
+ // in the cascade, as a consuming app's stylesheet always is — silently beats the
172
309
  // responsive rule and the layout never collapses. Doubling puts these at (0,2,0)
173
310
  // so they hold, while still leaving a consumer free to override deliberately.
174
311
  @media (max-width: 991.98px) {
175
- .page-header.page-header {
312
+ .page-header-bar.page-header-bar {
176
313
  flex-direction: column;
177
314
  align-items: stretch;
178
315
  gap: 12px;