@webority/theme 0.53.0 → 0.54.0

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.
Files changed (62) hide show
  1. package/dist/purge-safelist.json +339 -3
  2. package/dist/webority-theme.css +1 -1
  3. package/package.json +1 -1
  4. package/scss/_components.scss +43 -4
  5. package/scss/_marketing.scss +5 -0
  6. package/scss/_variables.scss +5 -4
  7. package/scss/_wui-aliases.scss +14 -0
  8. package/scss/_wui-components.scss +29 -0
  9. package/scss/wui/_avatar-picker.scss +1 -1
  10. package/scss/wui/_calendar.scss +5 -5
  11. package/scss/wui/_card.scss +2 -2
  12. package/scss/wui/_carousel.scss +182 -0
  13. package/scss/wui/_chart.scss +2 -2
  14. package/scss/wui/_choice.scss +88 -8
  15. package/scss/wui/_code-block.scss +138 -0
  16. package/scss/wui/_command-palette.scss +99 -1
  17. package/scss/wui/_comment-thread.scss +268 -0
  18. package/scss/wui/_context-menu.scss +2 -2
  19. package/scss/wui/_controls.scss +14 -12
  20. package/scss/wui/_data.scss +407 -14
  21. package/scss/wui/_disclosure.scss +2 -2
  22. package/scss/wui/_display.scss +13 -9
  23. package/scss/wui/_dock.scss +2 -2
  24. package/scss/wui/_drawer.scss +198 -0
  25. package/scss/wui/_file-viewer.scss +6 -6
  26. package/scss/wui/_groups.scss +111 -0
  27. package/scss/wui/_hover-card.scss +55 -0
  28. package/scss/wui/_illustration.scss +76 -0
  29. package/scss/wui/_image-crop.scss +6 -6
  30. package/scss/wui/_inline-edit.scss +131 -0
  31. package/scss/wui/_interaction.scss +286 -0
  32. package/scss/wui/_kanban.scss +6 -6
  33. package/scss/wui/_lightbox.scss +169 -0
  34. package/scss/wui/_media.scss +8 -5
  35. package/scss/wui/_mention-input.scss +88 -0
  36. package/scss/wui/_menubar.scss +110 -0
  37. package/scss/wui/_navigation-menu.scss +172 -0
  38. package/scss/wui/_navigation.scss +109 -6
  39. package/scss/wui/_notification-center.scss +251 -0
  40. package/scss/wui/_onboarding-checklist.scss +199 -0
  41. package/scss/wui/_overlays.scss +7 -11
  42. package/scss/wui/_rating.scss +87 -0
  43. package/scss/wui/_record-pager.scss +27 -0
  44. package/scss/wui/_relative-time.scss +10 -0
  45. package/scss/wui/_resizable.scss +98 -0
  46. package/scss/wui/_rich-text.scss +2 -2
  47. package/scss/wui/_rolling-number.scss +60 -0
  48. package/scss/wui/_sections.scss +315 -0
  49. package/scss/wui/_shell-parts.scss +12 -3
  50. package/scss/wui/_shell.scss +6 -6
  51. package/scss/wui/_shortcuts.scss +143 -0
  52. package/scss/wui/_show-more.scss +30 -0
  53. package/scss/wui/_sortable.scss +2 -2
  54. package/scss/wui/_split-view.scss +321 -0
  55. package/scss/wui/_toolbar.scss +4 -4
  56. package/scss/wui/_tour.scss +2 -2
  57. package/scss/wui/_tree.scss +2 -2
  58. package/scss/wui/_truncate.scss +32 -0
  59. package/scss/wui/_typography.scss +14 -0
  60. package/scss/wui/_utilities.scss +8 -8
  61. package/scss/wui/_whats-new.scss +147 -0
  62. package/scss/wui/_workspace.scss +2 -2
@@ -0,0 +1,321 @@
1
+ // ── Split view ──
2
+ // AppSplitView / <app-split-view>: a list beside a reading pane. Mobile-first: one screen at a
3
+ // time (the list, or the pane once an item is open, `.wui-split-reading`) until the tier in
4
+ // `data-stack-below`, then both side by side on the 12-column split in `data-list-width`. Each
5
+ // column scrolls on its own inside the height cap, so the list keeps its place while the pane
6
+ // scrolls.
7
+ //
8
+ // Part of the wui-components layer, see _wui-components.scss for load order.
9
+
10
+ .wui-split-view {
11
+ position: relative;
12
+ display: grid;
13
+ grid-template-columns: minmax(0, 1fr);
14
+ grid-template-rows: minmax(0, 1fr);
15
+ height: var(--wui-split-height, min(760px, calc(100dvh - 12rem)));
16
+ min-height: 320px;
17
+ border: 1px solid var(--color-border);
18
+ border-radius: var(--wui-radius);
19
+ corner-shape: squircle;
20
+ background: var(--color-surface);
21
+ color: var(--color-text);
22
+ overflow: hidden;
23
+ }
24
+
25
+ @for $n from 3 through 8 {
26
+ .wui-split-view[data-list-width="#{$n}"] {
27
+ --wui-split-list-fr: #{$n}fr;
28
+ --wui-split-pane-fr: #{12 - $n}fr;
29
+ }
30
+ }
31
+
32
+ .wui-split-list,
33
+ .wui-split-pane {
34
+ flex-direction: column;
35
+ min-width: 0;
36
+ min-height: 0;
37
+ }
38
+ .wui-split-list {
39
+ display: flex;
40
+ }
41
+ .wui-split-pane {
42
+ display: none;
43
+ }
44
+ .wui-split-view.wui-split-reading > .wui-split-list {
45
+ display: none;
46
+ }
47
+ .wui-split-view.wui-split-reading > .wui-split-pane {
48
+ display: flex;
49
+ }
50
+
51
+ // Side by side from the stack tier up. The legend only shows here: a phone has no keyboard to
52
+ // press J or K on.
53
+ @each $tier in sm, md, lg, xl, xxl {
54
+ @include media-breakpoint-up($tier) {
55
+ .wui-split-view[data-stack-below="#{$tier}"] {
56
+ grid-template-columns: minmax(0, var(--wui-split-list-fr, 5fr)) minmax(0, var(--wui-split-pane-fr, 7fr));
57
+ }
58
+ .wui-split-view[data-stack-below="#{$tier}"] > .wui-split-list {
59
+ display: flex;
60
+ border-right: 1px solid var(--color-border);
61
+ }
62
+ .wui-split-view[data-stack-below="#{$tier}"] > .wui-split-pane {
63
+ display: flex;
64
+ }
65
+ .wui-split-view[data-stack-below="#{$tier}"] .wui-split-legend {
66
+ display: flex;
67
+ }
68
+ }
69
+ }
70
+
71
+ // The list header, swapped for the bulk bar while items are ticked (as the table toolbar does).
72
+ .wui-split-head {
73
+ display: flex;
74
+ flex: none;
75
+ align-items: center;
76
+ gap: 12px;
77
+ min-height: 52px;
78
+ padding: 8px 16px;
79
+ border-bottom: 1px solid var(--color-border);
80
+ }
81
+ .wui-split-head-main,
82
+ .wui-split-head-bulk {
83
+ display: flex;
84
+ flex: 1 1 auto;
85
+ flex-wrap: wrap;
86
+ align-items: center;
87
+ gap: 8px;
88
+ min-width: 0;
89
+ }
90
+ .wui-split-head-bulk {
91
+ min-height: 36px;
92
+ padding: 2px 8px 2px 12px;
93
+ border-radius: var(--radius);
94
+ background: var(--color-primary-soft);
95
+ }
96
+ .wui-split-head-main[hidden],
97
+ .wui-split-head-bulk[hidden] {
98
+ display: none;
99
+ }
100
+ .wui-split-all {
101
+ flex: none;
102
+ }
103
+ .wui-split-count {
104
+ margin-right: 4px;
105
+ font-size: 13px;
106
+ font-weight: 600;
107
+ }
108
+
109
+ .wui-split-chips {
110
+ display: flex;
111
+ flex: none;
112
+ flex-wrap: wrap;
113
+ align-items: center;
114
+ gap: 6px;
115
+ padding: 8px 16px;
116
+ border-bottom: 1px solid var(--color-border);
117
+ }
118
+
119
+ .wui-split-items {
120
+ flex: 1 1 auto;
121
+ min-height: 0;
122
+ margin: 0;
123
+ padding: 0;
124
+ list-style: none;
125
+ overflow-y: auto;
126
+ overscroll-behavior: contain;
127
+ }
128
+
129
+ .wui-split-item {
130
+ display: flex;
131
+ align-items: flex-start;
132
+ border-bottom: 1px solid var(--color-border-light);
133
+ }
134
+ .wui-split-item:hover {
135
+ background: var(--color-bg-muted);
136
+ }
137
+ .wui-split-item.is-selected {
138
+ background: var(--color-primary-soft);
139
+ }
140
+ // The open item: the same subtle primary background as the open row of a ledger table
141
+ // (`.wui-row-active`). Declared after is-selected so an item both open and ticked reads as open.
142
+ .wui-split-item.is-active,
143
+ .wui-split-item.is-active:hover {
144
+ background: var(--bs-primary-bg-subtle);
145
+ }
146
+
147
+ .wui-split-check {
148
+ flex: none;
149
+ margin: 15px 0 0 16px;
150
+ }
151
+
152
+ .wui-split-link {
153
+ display: flex;
154
+ flex: 1 1 auto;
155
+ align-items: flex-start;
156
+ gap: 12px;
157
+ min-width: 0;
158
+ padding: 12px 16px;
159
+ border: 0;
160
+ background: transparent;
161
+ color: inherit;
162
+ font: inherit;
163
+ text-align: start;
164
+ text-decoration: none;
165
+ cursor: pointer;
166
+ }
167
+ .wui-split-check + .wui-split-link {
168
+ padding-left: 10px;
169
+ }
170
+ .wui-split-link:hover {
171
+ color: inherit;
172
+ }
173
+ .wui-split-link:focus-visible {
174
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
175
+ outline-offset: var(--wui-focus-ring-inset);
176
+ }
177
+
178
+ .wui-split-item-main {
179
+ display: flex;
180
+ flex: 1 1 auto;
181
+ flex-direction: column;
182
+ gap: 2px;
183
+ min-width: 0;
184
+ }
185
+ .wui-split-item-title {
186
+ overflow: hidden;
187
+ color: var(--color-text);
188
+ font-weight: 600;
189
+ text-overflow: ellipsis;
190
+ white-space: nowrap;
191
+ }
192
+ .wui-split-item-meta {
193
+ display: -webkit-box;
194
+ overflow: hidden;
195
+ color: var(--color-text-muted);
196
+ font-size: 13px;
197
+ overflow-wrap: anywhere;
198
+ -webkit-box-orient: vertical;
199
+ -webkit-line-clamp: 2;
200
+ }
201
+ .wui-split-item-end {
202
+ display: flex;
203
+ flex: none;
204
+ flex-direction: column;
205
+ align-items: flex-end;
206
+ gap: 6px;
207
+ color: var(--color-text-subtle);
208
+ font-size: 12px;
209
+ white-space: nowrap;
210
+ }
211
+ // The subtle grey clears AA on the plain surface only; on a tinted item it is the muted grey.
212
+ .wui-split-item:is(:hover, .is-selected, .is-active) .wui-split-item-end {
213
+ color: var(--color-text-muted);
214
+ }
215
+ .wui-split-badge {
216
+ min-width: 20px;
217
+ padding: 1px 7px;
218
+ border-radius: 999px;
219
+ background: var(--color-primary-soft);
220
+ color: var(--color-primary-ink);
221
+ font-size: 11px;
222
+ font-weight: 600;
223
+ line-height: 18px;
224
+ text-align: center;
225
+ }
226
+
227
+ .wui-split-empty {
228
+ display: grid;
229
+ flex: 1 1 auto;
230
+ place-items: center;
231
+ padding: 32px 16px;
232
+ color: var(--color-text-muted);
233
+ text-align: center;
234
+ }
235
+
236
+ .wui-split-skeleton {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 8px;
240
+ padding: 14px 16px;
241
+ border-bottom: 1px solid var(--color-border-light);
242
+ }
243
+ .wui-split-skeleton-title,
244
+ .wui-split-skeleton-meta {
245
+ display: block;
246
+ height: 12px;
247
+ border-radius: 6px;
248
+ }
249
+ .wui-split-skeleton-title {
250
+ width: 60%;
251
+ }
252
+ .wui-split-skeleton-meta {
253
+ width: 85%;
254
+ height: 10px;
255
+ }
256
+
257
+ // The hints and the shortcut legend (AppShortcutLegend) under the list. The legend's sheet opens
258
+ // over the list, anchored to this footer rather than to its own button.
259
+ .wui-split-legend {
260
+ position: relative;
261
+ display: none;
262
+ flex: none;
263
+ flex-wrap: wrap;
264
+ align-items: center;
265
+ gap: 4px 14px;
266
+ padding: 8px 16px;
267
+ border-top: 1px solid var(--color-border);
268
+ color: var(--color-text-muted);
269
+ font-size: 12px;
270
+ }
271
+ .wui-split-legend > .wui-shortcut-legend {
272
+ position: static;
273
+ margin-left: auto;
274
+ }
275
+ .wui-split-legend .wui-shortcut-sheet {
276
+ right: auto;
277
+ left: 8px;
278
+ width: min(320px, calc(100% - 16px));
279
+ }
280
+
281
+ .wui-split-pane-head {
282
+ display: flex;
283
+ flex: none;
284
+ flex-wrap: wrap;
285
+ align-items: center;
286
+ gap: 8px;
287
+ min-height: 52px;
288
+ padding: 8px 20px;
289
+ border-bottom: 1px solid var(--color-border);
290
+ }
291
+ .wui-split-pane-head > .wui-record-pager {
292
+ margin-left: auto;
293
+ }
294
+ .wui-split-pane-body {
295
+ flex: 1 1 auto;
296
+ min-height: 0;
297
+ padding: 20px;
298
+ overflow-y: auto;
299
+ overscroll-behavior: contain;
300
+ }
301
+ .wui-split-pane-body:focus-visible {
302
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
303
+ outline-offset: var(--wui-focus-ring-inset);
304
+ }
305
+ // While a Razor pane fetches the next item, the old one stays in place, dimmed.
306
+ .wui-split-pane.is-loading .wui-split-pane-body {
307
+ opacity: 0.55;
308
+ pointer-events: none;
309
+ }
310
+ .wui-split-pane-error {
311
+ padding: 32px 16px;
312
+ }
313
+
314
+ @media (prefers-reduced-motion: no-preference) {
315
+ .wui-split-item,
316
+ .wui-split-pane-body {
317
+ transition:
318
+ background-color 0.12s ease,
319
+ opacity 0.12s ease;
320
+ }
321
+ }
@@ -48,8 +48,8 @@
48
48
  cursor: default;
49
49
  }
50
50
  .toolbar-item:has(.toolbar-input:focus-visible) {
51
- outline: 2px solid var(--color-primary);
52
- outline-offset: 2px;
51
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
52
+ outline-offset: var(--wui-focus-ring-offset);
53
53
  }
54
54
 
55
55
  // Visually hidden but focusable/announceable — same trick as .segmented-input.
@@ -121,8 +121,8 @@
121
121
  color: var(--color-text);
122
122
  }
123
123
  .toolbar-action:focus-visible {
124
- outline: 2px solid var(--color-primary);
125
- outline-offset: 2px;
124
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
125
+ outline-offset: var(--wui-focus-ring-offset);
126
126
  }
127
127
  .toolbar-action:disabled {
128
128
  opacity: 0.5;
@@ -55,8 +55,8 @@ wui-tour-step {
55
55
  outline: none;
56
56
  }
57
57
  &:focus-visible {
58
- outline: 2px solid var(--color-primary);
59
- outline-offset: 2px;
58
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
59
+ outline-offset: var(--wui-focus-ring-offset);
60
60
  }
61
61
  }
62
62
 
@@ -50,8 +50,8 @@ wui-tree {
50
50
  }
51
51
  // The item holds the focus, but it also holds its subtree, so the ring goes on its own row.
52
52
  .wui-tree-item:focus-visible > .wui-tree-row {
53
- outline: 2px solid var(--color-primary);
54
- outline-offset: -2px;
53
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
54
+ outline-offset: var(--wui-focus-ring-inset);
55
55
  }
56
56
  .wui-tree-row-error .wui-tree-label {
57
57
  color: var(--color-danger);
@@ -0,0 +1,32 @@
1
+ // ── Truncate ──
2
+ // AppTruncate / <app-truncate> (a <wui-truncate> element): text cut with an ellipsis by width or by
3
+ // line count. The element sets data-wui-tip (drawn by the CSS tooltip in _overlays.scss) on itself,
4
+ // not on the clipped span, because the span's overflow:hidden would clip the bubble.
5
+ //
6
+ // Part of the wui-components layer, see _wui-components.scss for load order.
7
+
8
+ .wui-truncate {
9
+ display: block;
10
+ min-width: 0;
11
+ max-width: var(--wui-truncate-width, 100%);
12
+ }
13
+ .wui-truncate-text {
14
+ display: block;
15
+ overflow: hidden;
16
+ text-overflow: ellipsis;
17
+ white-space: nowrap;
18
+ }
19
+ .wui-truncate-multi .wui-truncate-text {
20
+ display: -webkit-box;
21
+ -webkit-box-orient: vertical;
22
+ -webkit-line-clamp: var(--wui-truncate-lines, 2);
23
+ line-clamp: var(--wui-truncate-lines, 2);
24
+ white-space: normal;
25
+ overflow-wrap: anywhere;
26
+ }
27
+ // Focusable only while the text is cut (the element adds tabindex then).
28
+ .wui-truncate[tabindex]:focus-visible {
29
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
30
+ outline-offset: var(--wui-focus-ring-offset);
31
+ border-radius: 4px;
32
+ }
@@ -40,6 +40,20 @@
40
40
  line-height: 1.15;
41
41
  }
42
42
 
43
+ /* ── Chip group: a row of chips that wraps, or (overflow="menu") moves the extras into a More menu ── */
44
+ .wui-chip-group {
45
+ display: flex;
46
+ flex-wrap: wrap;
47
+ align-items: center;
48
+ gap: 6px;
49
+ }
50
+ .wui-chip-group-nowrap {
51
+ flex-wrap: nowrap;
52
+ }
53
+ .wui-chip-group-nowrap > * {
54
+ flex: none;
55
+ }
56
+
43
57
  /* ── Chip (token / tag) ── */
44
58
  .chip {
45
59
  display: inline-flex;
@@ -88,8 +88,8 @@
88
88
  }
89
89
  .infotip-btn:focus-visible {
90
90
  color: var(--color-primary-ink);
91
- outline: 2px solid var(--color-primary);
92
- outline-offset: 2px;
91
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
92
+ outline-offset: var(--wui-focus-ring-offset);
93
93
  }
94
94
  .infotip-pop {
95
95
  position: absolute;
@@ -420,8 +420,8 @@
420
420
  cursor: pointer;
421
421
  }
422
422
  .wui-dropdown-trigger:focus-visible {
423
- outline: 2px solid var(--color-primary);
424
- outline-offset: 2px;
423
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
424
+ outline-offset: var(--wui-focus-ring-offset);
425
425
  border-radius: var(--radius-sm);
426
426
  }
427
427
 
@@ -583,8 +583,8 @@
583
583
  opacity: 1;
584
584
  }
585
585
  .wui-banner-dismiss:focus-visible {
586
- outline: 2px solid currentColor;
587
- outline-offset: 2px;
586
+ outline: var(--wui-focus-ring-width) solid currentColor;
587
+ outline-offset: var(--wui-focus-ring-offset);
588
588
  }
589
589
  .wui-banner-info {
590
590
  background: var(--color-info-soft);
@@ -1059,8 +1059,8 @@
1059
1059
  box-shadow: none;
1060
1060
  }
1061
1061
  .alert .btn-close:focus-visible {
1062
- outline: 2px solid var(--color-primary);
1063
- outline-offset: 2px;
1062
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
1063
+ outline-offset: var(--wui-focus-ring-offset);
1064
1064
  }
1065
1065
 
1066
1066
  // ============================================================================
@@ -0,0 +1,147 @@
1
+ // ── What's new ──
2
+ // AppWhatsNew / <app-whats-new> (a <wui-whats-new> element): a gift icon with an unread dot and a
3
+ // panel of dated release notes under it. The element shows the dot through [data-wui-unread] on the
4
+ // host, the panel through [data-open] (never .show or hidden, which a React re-render could
5
+ // reset), marks each unread entry with [data-wui-unread] and places the panel with position: fixed,
6
+ // so it escapes any clipping ancestor. Without script the panel stays closed.
7
+ //
8
+ // Part of the wui-components layer, see _wui-components.scss for load order.
9
+
10
+ .wui-whats-new {
11
+ display: inline-flex;
12
+ flex: none;
13
+ }
14
+ .wui-whats-new-trigger {
15
+ position: relative;
16
+ --wui-action-size: 36px;
17
+ }
18
+ // The trigger's name when there is no visible text: the label, plus "unread" while the dot shows.
19
+ .wui-whats-new-name,
20
+ .wui-whats-new-unread {
21
+ position: absolute;
22
+ width: 1px;
23
+ height: 1px;
24
+ margin: -1px;
25
+ padding: 0;
26
+ overflow: hidden;
27
+ clip-path: inset(50%);
28
+ white-space: nowrap;
29
+ }
30
+ .wui-whats-new:not([data-wui-unread]) .wui-whats-new-unread {
31
+ display: none;
32
+ }
33
+ // Ringed in the surface colour so it reads as sitting on the icon rather than touching it.
34
+ .wui-whats-new-dot {
35
+ position: absolute;
36
+ top: 6px;
37
+ right: 6px;
38
+ box-sizing: content-box;
39
+ width: 8px;
40
+ height: 8px;
41
+ border: 2px solid var(--color-surface);
42
+ border-radius: 50%;
43
+ background: var(--color-danger-strong);
44
+ }
45
+ .wui-whats-new:not([data-wui-unread]) .wui-whats-new-dot {
46
+ display: none;
47
+ }
48
+
49
+ .wui-whats-new-panel {
50
+ display: none;
51
+ position: fixed;
52
+ z-index: var(--wui-z-popover);
53
+ box-sizing: border-box;
54
+ width: min(380px, calc(100vw - 8px));
55
+ max-height: min(560px, calc(100vh - 8px));
56
+ overflow-y: auto;
57
+ overscroll-behavior: contain;
58
+ border: 1px solid var(--color-border);
59
+ border-radius: var(--wui-radius-lg);
60
+ background: var(--color-surface);
61
+ box-shadow: var(--wui-shadow-overlay);
62
+ color: var(--color-text-body);
63
+ // Focus lands on the panel itself after an open; the links carry the visible focus.
64
+ outline: none;
65
+ transform-origin: top right;
66
+ }
67
+ .wui-whats-new[data-open] .wui-whats-new-panel {
68
+ display: block;
69
+ animation: var(--wui-menu-anim) var(--wui-menu-anim-duration) var(--wui-menu-anim-ease);
70
+ }
71
+ .wui-whats-new-panel.drop-up {
72
+ --wui-menu-drop: 6px;
73
+
74
+ transform-origin: bottom right;
75
+ }
76
+ .wui-whats-new-title {
77
+ margin: 0;
78
+ padding: 14px 16px 10px;
79
+ border-bottom: 1px solid var(--color-border-light);
80
+ font-size: 15px;
81
+ font-weight: 600;
82
+ }
83
+ .wui-whats-new-list {
84
+ margin: 0;
85
+ padding: 0;
86
+ list-style: none;
87
+ }
88
+ .wui-whats-new-entry {
89
+ padding: 14px 16px;
90
+ border-bottom: 1px solid var(--color-border-light);
91
+ }
92
+ .wui-whats-new-entry:last-child {
93
+ border-bottom: 0;
94
+ }
95
+ // A mark on the edge for what was new when the panel opened.
96
+ .wui-whats-new-entry[data-wui-unread] {
97
+ box-shadow: inset 3px 0 0 var(--color-primary);
98
+ }
99
+ .wui-whats-new-date {
100
+ display: block;
101
+ color: var(--color-text-muted);
102
+ font-size: 12px;
103
+ font-variant-numeric: tabular-nums;
104
+ }
105
+ .wui-whats-new-entry-title {
106
+ margin: 2px 0 0;
107
+ font-size: 14px;
108
+ font-weight: 600;
109
+ }
110
+ .wui-whats-new-body {
111
+ margin: 4px 0 0;
112
+ color: var(--color-text-muted);
113
+ font-size: 13px;
114
+ overflow-wrap: anywhere;
115
+ }
116
+ .wui-whats-new-image {
117
+ display: block;
118
+ max-width: 100%;
119
+ height: auto;
120
+ margin-top: 10px;
121
+ border: 1px solid var(--color-border-light);
122
+ border-radius: var(--wui-radius-sm);
123
+ }
124
+ .wui-whats-new-link {
125
+ display: inline-block;
126
+ margin-top: 8px;
127
+ font-size: 13px;
128
+ font-weight: 500;
129
+ }
130
+ .wui-whats-new-link:focus-visible {
131
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
132
+ outline-offset: var(--wui-focus-ring-offset);
133
+ border-radius: 2px;
134
+ }
135
+ .wui-whats-new-empty {
136
+ margin: 0;
137
+ padding: 24px 16px;
138
+ color: var(--color-text-muted);
139
+ font-size: 13px;
140
+ text-align: center;
141
+ }
142
+
143
+ @media (prefers-reduced-motion: reduce) {
144
+ .wui-whats-new[data-open] .wui-whats-new-panel {
145
+ animation: none;
146
+ }
147
+ }
@@ -221,8 +221,8 @@
221
221
  .workspace-switcher .workspace-switcher-option:focus-visible,
222
222
  .workspace-switcher .workspace-switcher-create:focus-visible,
223
223
  .workspace-switcher .workspace-switcher-footer-action:focus-visible {
224
- outline: 2px solid var(--color-primary);
225
- outline-offset: 2px;
224
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
225
+ outline-offset: var(--wui-focus-ring-offset);
226
226
  }
227
227
  // The active workspace keeps its tint through hover, so the tick is never the only cue.
228
228
  .workspace-switcher .workspace-switcher-option.is-active,