@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/dist/webority-theme.css +1 -1
- package/package.json +1 -1
- package/scss/_components.scss +25 -0
- package/scss/wui/_data.scss +24 -12
- package/scss/wui/_display.scss +21 -2
- package/scss/wui/_navigation.scss +9 -2
- package/scss/wui/_utilities.scss +6 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webority/theme",
|
|
3
|
-
"version": "0.9.
|
|
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": {
|
package/scss/_components.scss
CHANGED
|
@@ -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 {
|
package/scss/wui/_data.scss
CHANGED
|
@@ -13,14 +13,16 @@
|
|
|
13
13
|
color: var(--color-text-subtle);
|
|
14
14
|
}
|
|
15
15
|
.empty-state-title {
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
116
|
-
//
|
|
117
|
-
// the
|
|
118
|
-
//
|
|
119
|
-
//
|
|
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
|
-
//
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
|
|
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
|
package/scss/wui/_display.scss
CHANGED
|
@@ -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
|
-
|
|
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
|
|
150
|
-
// after the theme, which would otherwise let `.nav`'s flex-wrap:wrap
|
|
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;
|
package/scss/wui/_utilities.scss
CHANGED
|
@@ -187,8 +187,8 @@
|
|
|
187
187
|
flex: none;
|
|
188
188
|
display: inline-grid;
|
|
189
189
|
place-items: center;
|
|
190
|
-
width:
|
|
191
|
-
height:
|
|
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:
|
|
283
|
-
height:
|
|
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:
|
|
293
|
-
height:
|
|
292
|
+
width: 63px;
|
|
293
|
+
height: 63px;
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
// ── Centre alignment ── (`align="center"`): for empty-state and wizard mastheads.
|