@webority/theme 0.107.0 → 0.108.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.107.0",
3
+ "version": "0.108.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": {
@@ -51,7 +51,7 @@
51
51
  "country-flag-icons": "^1.6.20",
52
52
  "sass-embedded": "^1.97.0",
53
53
  "vite": "^8.0.12",
54
- "@webority/tokens": "0.107.0"
54
+ "@webority/tokens": "0.108.1"
55
55
  },
56
56
  "scripts": {
57
57
  "tokens": "node ../tokens/dist/webority.js brand --library --out ../tokens/dist --web scss/_tokens.generated.scss",
@@ -1,4 +1,4 @@
1
- // Generated by @webority/tokens 0.107.0 from its token source. Do not edit; run webority brand --library.
1
+ // Generated by @webority/tokens 0.108.1 from its token source. Do not edit; run webority brand --library.
2
2
  $body-color: #252f4a !default;
3
3
  $body-secondary-color: #4b5675 !default;
4
4
  $body-tertiary-color: #626a82 !default;
@@ -1,4 +1,4 @@
1
- // Generated by @webority/tokens 0.107.0 from its token source. Do not edit; run webority brand --library.
1
+ // Generated by @webority/tokens 0.108.1 from its token source. Do not edit; run webority brand --library.
2
2
 
3
3
  :root {
4
4
  --wui-primary: #4F46E5;
@@ -36,7 +36,9 @@
36
36
  @import "wui/navigation";
37
37
  @import "wui/nav-list";
38
38
  @import "wui/card";
39
+ @import "wui/empty-state";
39
40
  @import "wui/data";
41
+ @import "wui/pagination";
40
42
  @import "wui/illustration";
41
43
  @import "wui/table-server";
42
44
  @import "wui/kanban";
@@ -50,9 +52,11 @@
50
52
  @import "wui/typography";
51
53
  @import "wui/disclosure";
52
54
  @import "wui/display";
55
+ @import "wui/compare-table";
53
56
  @import "wui/flow";
54
57
  // After `flow`: the pricing section extends its `.plan-grid` rules.
55
58
  @import "wui/sections";
59
+ @import "wui/section-lead-capture";
56
60
  @import "wui/chart";
57
61
  @import "wui/chart-card";
58
62
  @import "wui/calendar";
@@ -102,7 +106,6 @@
102
106
  // After `overlays`: anchors the shared modal shell to the top when it holds the palette card.
103
107
  @import "wui/command-palette";
104
108
  @import "wui/context-menu";
105
- @import "wui/menubar";
106
109
  @import "wui/navigation-menu";
107
110
  @import "wui/tour";
108
111
  @import "wui/hover-card";
@@ -114,3 +117,5 @@
114
117
  @import "wui/interaction";
115
118
  // Last: restates the settled state of menus other partials style, so it must win.
116
119
  @import "wui/menu-motion";
120
+ // After menu-motion: reuses its zoom keyframes and must win over the overlay partials' modal rules.
121
+ @import "wui/dialog-motion";
@@ -28,7 +28,9 @@
28
28
  @import "wui/navigation";
29
29
  @import "wui/nav-list";
30
30
  @import "wui/card";
31
+ @import "wui/empty-state";
31
32
  @import "wui/data";
33
+ @import "wui/pagination";
32
34
  @import "wui/illustration";
33
35
  @import "wui/table-server";
34
36
  @import "wui/inline-edit";
@@ -41,9 +43,11 @@
41
43
  @import "wui/typography";
42
44
  @import "wui/disclosure";
43
45
  @import "wui/display";
46
+ @import "wui/compare-table";
44
47
  @import "wui/flow";
45
48
  // After `flow`: the pricing section extends its `.plan-grid` rules.
46
49
  @import "wui/sections";
50
+ @import "wui/section-lead-capture";
47
51
  @import "wui/chart";
48
52
  @import "wui/chart-card";
49
53
  @import "wui/markdown";
@@ -82,7 +86,6 @@
82
86
  @import "wui/floating";
83
87
  @import "wui/code-block";
84
88
  @import "wui/context-menu";
85
- @import "wui/menubar";
86
89
  @import "wui/navigation-menu";
87
90
  @import "wui/hover-card";
88
91
  @import "wui/notification-center";
@@ -93,3 +96,5 @@
93
96
  @import "wui/interaction";
94
97
  // Last: restates the settled state of menus other partials style, so it must win.
95
98
  @import "wui/menu-motion";
99
+ // After menu-motion: reuses its zoom keyframes and must win over the overlay partials' modal rules.
100
+ @import "wui/dialog-motion";
@@ -1,12 +1,13 @@
1
- // ── Avatar picker ──
2
- // AppAvatarPicker / <app-avatar-picker>: a profile photo (or its placeholder) beside the actions
3
- // that change it. The crop dialog it opens is <wui-image-crop> (_image-crop.scss). The diameter
4
- // comes from --wui-avatar-size on .wui-avatar-picker, which both wrappers set from `size`.
1
+ // ── Image picker, buttons look ──
2
+ // AppImagePicker with controls="buttons" (and <app-image-picker controls="buttons">): a profile photo
3
+ // (or its placeholder) beside the actions that change it. The crop dialog it opens is <wui-image-crop>
4
+ // (_image-crop.scss). The diameter comes from --wui-avatar-size on .wui-image-picker-buttons, which
5
+ // both wrappers set from `size`.
5
6
  // Every colour is a theme token, so dark mode follows the token flip.
6
7
  //
7
8
  // Part of the wui-components layer, see _wui-components.scss for load order.
8
9
 
9
- .wui-avatar-picker {
10
+ .wui-image-picker-buttons {
10
11
  // The md diameter; both wrappers set their own size inline, which wins.
11
12
  --wui-avatar-size: 96px;
12
13
  display: flex;
@@ -15,7 +16,7 @@
15
16
  gap: 16px;
16
17
  }
17
18
 
18
- .wui-avatar-picker-face {
19
+ .wui-image-picker-buttons-face {
19
20
  position: relative;
20
21
  display: grid;
21
22
  flex: none;
@@ -30,29 +31,29 @@
30
31
  font: inherit;
31
32
  cursor: pointer;
32
33
  }
33
- .wui-avatar-picker-face:disabled {
34
+ .wui-image-picker-buttons-face:disabled {
34
35
  cursor: default;
35
36
  }
36
- .wui-avatar-picker-face[aria-busy="true"] {
37
+ .wui-image-picker-buttons-face[aria-busy="true"] {
37
38
  cursor: progress;
38
39
  }
39
- .wui-avatar-picker-face:focus-visible {
40
+ .wui-image-picker-buttons-face:focus-visible {
40
41
  outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
41
42
  outline-offset: 3px;
42
43
  }
43
44
  // A file held over the photo: the ring says it can be dropped there.
44
- .wui-avatar-picker.is-dragging .wui-avatar-picker-face {
45
+ .wui-image-picker-buttons.is-dragging .wui-image-picker-buttons-face {
45
46
  outline: 2px dashed var(--color-primary);
46
47
  outline-offset: 3px;
47
48
  }
48
49
 
49
- .wui-avatar-picker-img {
50
+ .wui-image-picker-buttons-img {
50
51
  width: 100%;
51
52
  height: 100%;
52
53
  border-radius: 50%;
53
54
  object-fit: cover;
54
55
  }
55
- .wui-avatar-picker-placeholder {
56
+ .wui-image-picker-buttons-placeholder {
56
57
  display: grid;
57
58
  place-items: center;
58
59
  font-size: calc(var(--wui-avatar-size) * 0.36);
@@ -62,7 +63,7 @@
62
63
  }
63
64
 
64
65
  // The camera mark on the ring's edge, so the photo reads as something you can change.
65
- .wui-avatar-picker-badge {
66
+ .wui-image-picker-buttons-badge {
66
67
  position: absolute;
67
68
  right: 0;
68
69
  bottom: 0;
@@ -75,41 +76,41 @@
75
76
  background: var(--color-primary);
76
77
  color: var(--color-on-primary);
77
78
  }
78
- .wui-avatar-picker-face:disabled:not([aria-busy="true"]) .wui-avatar-picker-badge {
79
+ .wui-image-picker-buttons-face:disabled:not([aria-busy="true"]) .wui-image-picker-buttons-badge {
79
80
  display: none;
80
81
  }
81
82
 
82
- .wui-avatar-picker-actions {
83
+ .wui-image-picker-buttons-actions {
83
84
  display: flex;
84
85
  flex-wrap: wrap;
85
86
  align-items: center;
86
87
  gap: 8px;
87
88
  }
88
- .wui-avatar-picker-actions .btn {
89
+ .wui-image-picker-buttons-actions .btn {
89
90
  display: inline-flex;
90
91
  align-items: center;
91
92
  gap: 6px;
92
93
  }
93
- .wui-avatar-picker-actions [hidden] {
94
+ .wui-image-picker-buttons-actions [hidden] {
94
95
  display: none;
95
96
  }
96
97
 
97
98
  // "Take photo" opens the front camera, which only a phone or tablet has: it shows on touch screens.
98
- .wui-avatar-picker-actions .wui-avatar-picker-camera {
99
+ .wui-image-picker-buttons-actions .wui-image-picker-buttons-camera {
99
100
  display: none;
100
101
  }
101
102
  @media (pointer: coarse) {
102
- .wui-avatar-picker-actions .wui-avatar-picker-camera:not([hidden]) {
103
+ .wui-image-picker-buttons-actions .wui-image-picker-buttons-camera:not([hidden]) {
103
104
  display: inline-flex;
104
105
  }
105
- .wui-avatar-picker-actions .btn {
106
+ .wui-image-picker-buttons-actions .btn {
106
107
  min-height: 44px;
107
108
  }
108
109
  }
109
110
 
110
111
  // On a phone the actions sit under the photo, full width, so each is an easy target.
111
112
  @media (max-width: 575.98px) {
112
- .wui-avatar-picker {
113
+ .wui-image-picker-buttons {
113
114
  flex-direction: column;
114
115
  align-items: flex-start;
115
116
  }
@@ -349,7 +349,7 @@
349
349
  .search-select-lg .search-select-multi {
350
350
  height: auto;
351
351
  }
352
- // AppSelectMini is <wui-select compact>: sm sits on the 32px sm rung, lg one rung below the lg
352
+ // AppSelect compact is <wui-select compact>: sm sits on the 32px sm rung, lg one rung below the lg
353
353
  // field, never under 32px. The compound selector outranks both the plain size rule and the compact rule.
354
354
  .search-select-compact.search-select-sm .search-select-control {
355
355
  height: var(--wui-control-sm);
@@ -417,12 +417,11 @@
417
417
  height: 15px;
418
418
  }
419
419
 
420
- // AppSelectMini — the compact single-purpose picker (page size, a range switch). It shares
421
- // every behaviour with AppSelect and differs only in metrics.
420
+ // AppSelect compact (page size, a range switch, a toolbar picker). It shares every behaviour
421
+ // with the full select and differs only in metrics.
422
422
  //
423
- // <wui-select compact> emitted this class and NOTHING styled it, so AppSelectMini rendered
424
- // byte-identical to a full-size select on both surfaces — the catalogue told people to
425
- // reach for it when they wanted something compact, and got a full-height control. It was invisible
423
+ // <wui-select compact> emitted this class and NOTHING styled it, so a compact picker rendered
424
+ // byte-identical to a full-size select on both surfaces. It was invisible
426
425
  // to every gate because the class check only ever scanned the Razor tag helpers, never the
427
426
  // elements package that actually emits it.
428
427
  //
@@ -0,0 +1,201 @@
1
+ // Feature-comparison table.
2
+ //
3
+ // Part of the wui-components layer; imported right after _display.scss. Order within the layer is load-bearing (see _wui-components.scss).
4
+
5
+ // ============================================================================
6
+ // Feature-comparison table. The highlighted column is tinted so the reader's eye
7
+ // lands on it without a legend. The root is a size container so the phone stack
8
+ // follows the table's own width, not the viewport.
9
+ // ============================================================================
10
+ .compare-table {
11
+ position: relative;
12
+ container-type: inline-size;
13
+ overflow: clip;
14
+ border: 1px solid var(--color-border);
15
+ border-radius: var(--wui-radius-lg);
16
+ corner-shape: squircle;
17
+ background: var(--color-surface);
18
+ }
19
+ .compare-table table {
20
+ width: 100%;
21
+ border-collapse: collapse;
22
+ }
23
+ .compare-table th,
24
+ .compare-table td {
25
+ padding: var(--wui-space-lg) var(--wui-space-lg);
26
+ text-align: left;
27
+ border-bottom: 1px solid var(--color-border);
28
+ font-size: var(--wui-fs-sm);
29
+ }
30
+ .compare-table tr:last-child td {
31
+ border-bottom: none;
32
+ }
33
+ .compare-table th {
34
+ background: var(--color-bg-subtle);
35
+ font-size: var(--wui-fs-xs);
36
+ font-weight: var(--wui-fw-semibold);
37
+ color: var(--color-text);
38
+ }
39
+ .compare-table th.is-highlight {
40
+ background: var(--color-primary-soft);
41
+ color: var(--color-primary-text);
42
+ }
43
+ .compare-table td.is-highlight {
44
+ background: color-mix(in srgb, var(--color-primary) 4%, var(--color-surface));
45
+ font-weight: var(--wui-fw-medium);
46
+ }
47
+ .compare-table .wui-compare-center {
48
+ text-align: center;
49
+ }
50
+ .compare-table .wui-compare-nowrap {
51
+ white-space: nowrap;
52
+ }
53
+ .compare-table th[scope="row"] {
54
+ font-weight: var(--wui-fw-semibold);
55
+ font-size: var(--wui-fs-sm);
56
+ color: var(--color-text);
57
+ }
58
+ .compare-table .wui-compare-group {
59
+ background: var(--color-bg-subtle);
60
+ color: var(--color-text);
61
+ font-weight: var(--wui-fw-semibold);
62
+ }
63
+
64
+ // Relaxed density: a 16px body and 32px side padding, for marketing tables that read as prose.
65
+ .compare-table.wui-compare-relaxed th,
66
+ .compare-table.wui-compare-relaxed td {
67
+ padding-inline: var(--wui-space-2xl);
68
+ padding-block: var(--wui-space-lg);
69
+ }
70
+ .compare-table.wui-compare-relaxed td {
71
+ font-size: var(--wui-fs-base);
72
+ }
73
+
74
+ // Sticky header: the header sticks to the viewport because the root clips rather than scrolls.
75
+ .compare-table.wui-compare-sticky-head thead th {
76
+ position: sticky;
77
+ top: var(--wui-compare-table-top, 0);
78
+ z-index: 1;
79
+ }
80
+
81
+ .compare-yes {
82
+ color: var(--color-success-text);
83
+ }
84
+ .compare-no {
85
+ color: var(--color-text-subtle);
86
+ }
87
+
88
+ .wui-compare-state {
89
+ display: inline-flex;
90
+ align-items: baseline;
91
+ gap: var(--wui-space-xs);
92
+ }
93
+ .wui-compare-state .wui-icon {
94
+ align-self: center;
95
+ flex: none;
96
+ }
97
+ .wui-compare-state-yes {
98
+ color: var(--color-success-text);
99
+ }
100
+ .wui-compare-state-no {
101
+ color: var(--color-danger-text);
102
+ }
103
+ .wui-compare-state-warn {
104
+ color: var(--color-warning-text);
105
+ }
106
+ .wui-compare-state-partial {
107
+ color: var(--color-text-subtle);
108
+ }
109
+
110
+ .wui-compare-code {
111
+ font-weight: var(--wui-fw-semibold);
112
+ white-space: nowrap;
113
+ color: var(--color-primary-text);
114
+ }
115
+
116
+ // Phone stack: under 576px of table width each row is a card, its label the title, each cell
117
+ // a "column name: answer" line. The header stays in the DOM, visually hidden, for screen readers.
118
+ @container (max-width: 575px) {
119
+ .compare-table[data-mobile="stack"] thead {
120
+ position: absolute;
121
+ width: 1px;
122
+ height: 1px;
123
+ overflow: hidden;
124
+ clip-path: inset(50%);
125
+ white-space: nowrap;
126
+ }
127
+ .compare-table[data-mobile="stack"] table,
128
+ .compare-table[data-mobile="stack"] tbody,
129
+ .compare-table[data-mobile="stack"] tr {
130
+ display: block;
131
+ width: 100%;
132
+ }
133
+ .compare-table[data-mobile="stack"] tbody > tr {
134
+ margin-block-end: var(--wui-space-md);
135
+ padding: var(--wui-space-md) var(--wui-space-lg);
136
+ border: 1px solid var(--color-border);
137
+ border-radius: var(--wui-radius-lg);
138
+ }
139
+ .compare-table[data-mobile="stack"] tbody > tr.wui-compare-group-row {
140
+ margin-block-end: 0;
141
+ padding: 0;
142
+ border: 0;
143
+ background: none;
144
+ }
145
+ .compare-table[data-mobile="stack"] th,
146
+ .compare-table[data-mobile="stack"] td {
147
+ display: block;
148
+ border: 0;
149
+ }
150
+ .compare-table[data-mobile="stack"] th[scope="row"] {
151
+ padding: 0 0 var(--wui-space-xs);
152
+ font-size: var(--wui-fs-base);
153
+ font-weight: var(--wui-fw-semibold);
154
+ }
155
+ .compare-table[data-mobile="stack"] td {
156
+ display: flex;
157
+ justify-content: space-between;
158
+ align-items: center;
159
+ gap: var(--wui-space-md);
160
+ padding: var(--wui-space-xs) 0;
161
+ text-align: right;
162
+ font-size: var(--wui-fs-sm);
163
+ }
164
+ .compare-table[data-mobile="stack"] td::before {
165
+ content: attr(data-label);
166
+ flex: none;
167
+ font-size: var(--wui-fs-xs);
168
+ font-weight: var(--wui-fw-medium);
169
+ color: var(--color-text-subtle);
170
+ text-align: left;
171
+ }
172
+ .compare-table[data-mobile="stack"] td.is-highlight {
173
+ padding-inline: var(--wui-space-xs);
174
+ }
175
+ }
176
+
177
+ // Phone scroll: the table keeps its columns and scrolls sideways in a focusable region.
178
+ .wui-compare-scroll {
179
+ overflow-x: auto;
180
+ overscroll-behavior-x: contain;
181
+ }
182
+ .wui-compare-scroll:focus-visible {
183
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
184
+ outline-offset: var(--wui-focus-ring-inset);
185
+ }
186
+ .wui-compare-scroll[data-more="end"] {
187
+ mask-image: linear-gradient(to right, black calc(100% - var(--wui-space-2xl)), transparent);
188
+ }
189
+ .compare-table table.wui-compare-scroll-table {
190
+ min-width: 36rem;
191
+ }
192
+ .compare-table table.wui-compare-sticky-first th:first-child,
193
+ .compare-table table.wui-compare-sticky-first td:first-child {
194
+ position: sticky;
195
+ left: 0;
196
+ z-index: 1;
197
+ border-right: 1px solid var(--color-border);
198
+ }
199
+ .compare-table table.wui-compare-sticky-first td:first-child {
200
+ background: var(--color-surface);
201
+ }
@@ -1306,7 +1306,7 @@ wui-date-range {
1306
1306
  display: block;
1307
1307
  width: 100%;
1308
1308
  }
1309
- // AppSelectMini renders <wui-select compact> — a page-size / range picker that is
1309
+ // AppSelect compact renders <wui-select compact> — a page-size / range picker that is
1310
1310
  // deliberately narrow and does NOT belong to a .field. It has to opt out of the width
1311
1311
  // above, or every toolbar picker stretches across its toolbar.
1312
1312
  wui-select[compact] {