barua-ui 0.2.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.
@@ -0,0 +1,371 @@
1
+ /* ==========================================================================
2
+ Barua UI — Actions
3
+ Button, Icon Button, FAB, Button Group, Split Button, Toggle Button,
4
+ Link, Link Group, Toolbar, Action Menu trigger.
5
+ ========================================================================== */
6
+
7
+ @layer components {
8
+ /* ---- Button ------------------------------------------------------------ */
9
+ .b-btn {
10
+ --b-disabled-pointer: none;
11
+ display: inline-flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ gap: var(--b-space-2);
15
+ height: var(--b-control-h-md);
16
+ padding-inline: var(--b-space-4);
17
+ font-size: var(--b-text-subheadline);
18
+ font-weight: var(--b-weight-semibold);
19
+ line-height: 1;
20
+ white-space: nowrap;
21
+ color: var(--b-text);
22
+ background: var(--b-fill-secondary);
23
+ border: none;
24
+ border-radius: var(--b-radius-md);
25
+ cursor: pointer;
26
+ user-select: none;
27
+ -webkit-tap-highlight-color: transparent;
28
+ transition: background var(--b-duration-fast) var(--b-ease-standard),
29
+ color var(--b-duration-fast) var(--b-ease-standard),
30
+ box-shadow var(--b-duration-fast) var(--b-ease-standard),
31
+ scale var(--b-duration-instant) var(--b-ease-standard);
32
+ }
33
+ .b-btn:hover { background: var(--b-fill); text-decoration: none; }
34
+ .b-btn:active, .b-btn.is-pressed { scale: 0.97; }
35
+ .b-btn svg { width: 1.1em; height: 1.1em; flex: none; }
36
+
37
+ /* Variants */
38
+ .b-btn--primary {
39
+ color: var(--b-color-on-accent);
40
+ background: var(--b-color-accent);
41
+ box-shadow: var(--b-shadow-xs);
42
+ }
43
+ .b-btn--primary:hover { background: var(--b-color-accent-hover); }
44
+ .b-btn--primary.is-active { background: var(--b-color-accent-active); }
45
+
46
+ .b-btn--tinted {
47
+ color: var(--b-color-accent-text);
48
+ background: var(--b-color-accent-soft);
49
+ }
50
+ .b-btn--tinted:hover {
51
+ background: color-mix(in srgb, var(--b-color-accent) 22%, transparent);
52
+ }
53
+
54
+ /* Liquid glass primary — glossy accent pane with a light-catch */
55
+ .b-btn--liquid {
56
+ color: var(--b-color-on-accent);
57
+ background:
58
+ radial-gradient(120% 140% at 30% 12%, rgba(255, 255, 255, 0.38), transparent 42%),
59
+ var(--b-color-accent);
60
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4),
61
+ inset 0 0 0 1px color-mix(in srgb, var(--b-color-accent) 55%, transparent),
62
+ var(--b-shadow-accent);
63
+ }
64
+ .b-btn--liquid:hover {
65
+ background:
66
+ radial-gradient(120% 140% at 30% 12%, rgba(255, 255, 255, 0.45), transparent 44%),
67
+ var(--b-color-accent-hover);
68
+ }
69
+ .b-btn--liquid.is-loading::after {
70
+ border-color: rgba(255, 255, 255, 0.35);
71
+ border-top-color: #fff;
72
+ }
73
+
74
+ .b-btn--outline {
75
+ background: transparent;
76
+ box-shadow: inset 0 0 0 1px var(--b-border-strong);
77
+ }
78
+ .b-btn--outline:hover { background: var(--b-fill-quaternary); }
79
+
80
+ .b-btn--ghost { background: transparent; }
81
+ .b-btn--ghost:hover { background: var(--b-fill-tertiary); }
82
+
83
+ .b-btn--glass {
84
+ position: relative;
85
+ background: var(--b-material-thin-bg);
86
+ -webkit-backdrop-filter: var(--b-glass);
87
+ backdrop-filter: var(--b-glass);
88
+ box-shadow: var(--b-glass-shadow);
89
+ overflow: hidden;
90
+ transition: background var(--b-duration-fast) var(--b-ease-standard),
91
+ box-shadow var(--b-duration-fast) var(--b-ease-standard),
92
+ scale var(--b-duration-instant) var(--b-ease-standard),
93
+ translate var(--b-duration-fast) var(--b-ease-standard);
94
+ }
95
+ .b-btn--glass::before {
96
+ content: "";
97
+ position: absolute;
98
+ inset: 0;
99
+ border-radius: inherit;
100
+ box-shadow: var(--b-glass-edge);
101
+ pointer-events: none;
102
+ }
103
+ .b-btn--glass:hover {
104
+ background: var(--b-material-regular-bg);
105
+ box-shadow: var(--b-glass-lensing), var(--b-glass-ambient);
106
+ }
107
+ .b-btn--glass:active {
108
+ scale: 0.97;
109
+ background: var(--b-material-thick-bg);
110
+ box-shadow: var(--b-glass-lensing);
111
+ }
112
+ /* Shimmer sweep on press */
113
+ .b-btn--glass::after {
114
+ content: "";
115
+ position: absolute;
116
+ inset: 0;
117
+ border-radius: inherit;
118
+ background: var(--b-glass-shimmer);
119
+ background-size: 250% 100%;
120
+ opacity: 0;
121
+ pointer-events: none;
122
+ transition: opacity var(--b-duration-fast);
123
+ }
124
+ .b-btn--glass:active::after {
125
+ opacity: 1;
126
+ animation: b-glass-shimmer var(--b-glass-shimmer-duration) var(--b-ease-out) forwards;
127
+ }
128
+
129
+ /* Clear variant — more transparent, for media-rich backgrounds */
130
+ .b-btn--glass-clear {
131
+ position: relative;
132
+ background: light-dark(rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.06));
133
+ -webkit-backdrop-filter: blur(var(--b-blur-md)) saturate(1.5);
134
+ backdrop-filter: blur(var(--b-blur-md)) saturate(1.5);
135
+ box-shadow: var(--b-glass-shadow);
136
+ overflow: hidden;
137
+ }
138
+ .b-btn--glass-clear::before {
139
+ content: "";
140
+ position: absolute;
141
+ inset: 0;
142
+ border-radius: inherit;
143
+ box-shadow: var(--b-glass-edge);
144
+ pointer-events: none;
145
+ }
146
+ .b-btn--glass-clear:hover {
147
+ background: light-dark(rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.10));
148
+ }
149
+ .b-btn--glass-clear:active {
150
+ scale: 0.97;
151
+ background: light-dark(rgba(255, 255, 255, 0.22), rgba(255, 255, 255, 0.14));
152
+ }
153
+ .b-btn--glass-clear::after {
154
+ content: "";
155
+ position: absolute;
156
+ inset: 0;
157
+ border-radius: inherit;
158
+ background: var(--b-glass-shimmer);
159
+ background-size: 250% 100%;
160
+ opacity: 0;
161
+ pointer-events: none;
162
+ }
163
+ .b-btn--glass-clear:active::after {
164
+ opacity: 1;
165
+ animation: b-glass-shimmer var(--b-glass-shimmer-duration) var(--b-ease-out) forwards;
166
+ }
167
+
168
+ /* Glass prominent — tinted accent glass for primary actions */
169
+ .b-btn--glass-prominent {
170
+ position: relative;
171
+ background: var(--b-glass-tint-strong);
172
+ -webkit-backdrop-filter: var(--b-glass);
173
+ backdrop-filter: var(--b-glass);
174
+ box-shadow: var(--b-glass-shadow);
175
+ overflow: hidden;
176
+ }
177
+ .b-btn--glass-prominent::before {
178
+ content: "";
179
+ position: absolute;
180
+ inset: 0;
181
+ border-radius: inherit;
182
+ box-shadow: var(--b-glass-edge);
183
+ pointer-events: none;
184
+ }
185
+ .b-btn--glass-prominent:hover {
186
+ background: light-dark(rgba(10, 122, 255, 0.18), rgba(10, 132, 255, 0.26));
187
+ }
188
+ .b-btn--glass-prominent:active {
189
+ scale: 0.97;
190
+ background: light-dark(rgba(10, 122, 255, 0.24), rgba(10, 132, 255, 0.32));
191
+ }
192
+ .b-btn--glass-prominent::after {
193
+ content: "";
194
+ position: absolute;
195
+ inset: 0;
196
+ border-radius: inherit;
197
+ background: var(--b-glass-shimmer);
198
+ background-size: 250% 100%;
199
+ opacity: 0;
200
+ pointer-events: none;
201
+ }
202
+ .b-btn--glass-prominent:active::after {
203
+ opacity: 1;
204
+ animation: b-glass-shimmer var(--b-glass-shimmer-duration) var(--b-ease-out) forwards;
205
+ }
206
+
207
+ .b-btn--danger { color: var(--b-color-on-accent); background: var(--b-color-danger); }
208
+ .b-btn--danger:hover { background: color-mix(in srgb, var(--b-color-danger) 85%, black); }
209
+ .b-btn--danger-tinted { color: var(--b-color-danger); background: var(--b-color-danger-soft); }
210
+ .b-btn--danger-tinted:hover { background: color-mix(in srgb, var(--b-color-red) 22%, transparent); }
211
+ .b-btn--success { color: var(--b-color-on-accent); background: var(--b-color-success); }
212
+ .b-btn--success:hover { background: color-mix(in srgb, var(--b-color-success) 85%, black); }
213
+
214
+ /* Sizes */
215
+ .b-btn--xs { height: var(--b-control-h-xs); padding-inline: var(--b-space-2); font-size: var(--b-text-caption); border-radius: var(--b-radius-sm); }
216
+ .b-btn--sm { height: var(--b-control-h-sm); padding-inline: var(--b-space-3); font-size: var(--b-text-footnote); border-radius: var(--b-radius-sm); }
217
+ .b-btn--lg { height: var(--b-control-h-lg); padding-inline: var(--b-space-5); font-size: var(--b-text-callout); border-radius: var(--b-radius-lg); }
218
+ .b-btn--xl { height: var(--b-control-h-xl); padding-inline: var(--b-space-6); font-size: var(--b-text-body); border-radius: var(--b-radius-lg); }
219
+ .b-btn--pill { border-radius: var(--b-radius-full); }
220
+ .b-btn--block { display: flex; width: 100%; }
221
+
222
+ /* Loading */
223
+ .b-btn.is-loading { position: relative; color: transparent !important; pointer-events: none; }
224
+ .b-btn.is-loading::after {
225
+ content: "";
226
+ position: absolute;
227
+ width: 1em; height: 1em;
228
+ border: 2px solid color-mix(in srgb, currentColor 0%, var(--b-text-tertiary));
229
+ border-top-color: var(--b-text);
230
+ border-radius: 50%;
231
+ animation: b-spin 0.7s linear infinite;
232
+ }
233
+ .b-btn--primary.is-loading::after,
234
+ .b-btn--danger.is-loading::after {
235
+ border-color: rgba(255, 255, 255, 0.35);
236
+ border-top-color: #fff;
237
+ }
238
+
239
+ /* ---- Icon Button ------------------------------------------------------- */
240
+ .b-icon-btn {
241
+ aspect-ratio: 1;
242
+ padding-inline: 0;
243
+ width: var(--b-control-h-md);
244
+ }
245
+ .b-icon-btn.b-btn--xs { width: var(--b-control-h-xs); }
246
+ .b-icon-btn.b-btn--sm { width: var(--b-control-h-sm); }
247
+ .b-icon-btn.b-btn--lg { width: var(--b-control-h-lg); }
248
+ .b-icon-btn.b-btn--xl { width: var(--b-control-h-xl); }
249
+ .b-icon-btn svg { width: 1.25em; height: 1.25em; }
250
+
251
+ /* ---- Floating Action Button ------------------------------------------- */
252
+ .b-fab {
253
+ position: fixed;
254
+ inset-block-end: max(var(--b-space-6), env(safe-area-inset-bottom));
255
+ inset-inline-end: var(--b-space-6);
256
+ z-index: var(--b-z-sticky);
257
+ width: 3.5rem; height: 3.5rem;
258
+ border-radius: var(--b-radius-full);
259
+ color: var(--b-color-on-accent);
260
+ background: var(--b-color-accent);
261
+ box-shadow: var(--b-shadow-lg), var(--b-shadow-accent);
262
+ }
263
+ .b-fab:hover { background: var(--b-color-accent-hover); translate: 0 -2px; }
264
+ .b-fab--extended { width: auto; padding-inline: var(--b-space-5); gap: var(--b-space-2); }
265
+
266
+ /* ---- Button Group ------------------------------------------------------ */
267
+ .b-btn-group {
268
+ display: inline-flex;
269
+ isolation: isolate;
270
+ }
271
+ .b-btn-group > .b-btn { border-radius: 0; }
272
+ .b-btn-group > .b-btn:first-child {
273
+ border-start-start-radius: var(--b-radius-md);
274
+ border-end-start-radius: var(--b-radius-md);
275
+ }
276
+ .b-btn-group > .b-btn:last-child {
277
+ border-start-end-radius: var(--b-radius-md);
278
+ border-end-end-radius: var(--b-radius-md);
279
+ }
280
+ .b-btn-group > .b-btn + .b-btn { margin-inline-start: 1px; }
281
+ .b-btn-group--attached > .b-btn + .b-btn {
282
+ margin-inline-start: 0;
283
+ box-shadow: inset 1px 0 0 var(--b-hairline);
284
+ }
285
+
286
+ /* ---- Split Button ------------------------------------------------------ */
287
+ .b-split-btn { display: inline-flex; isolation: isolate; }
288
+ .b-split-btn > .b-btn:first-child {
289
+ border-start-end-radius: 0;
290
+ border-end-end-radius: 0;
291
+ }
292
+ .b-split-btn > .b-btn:last-child {
293
+ border-start-start-radius: 0;
294
+ border-end-start-radius: 0;
295
+ margin-inline-start: 1px;
296
+ padding-inline: var(--b-space-2);
297
+ }
298
+
299
+ /* ---- Toggle Button ----------------------------------------------------- */
300
+ .b-toggle-btn[aria-pressed="true"], .b-btn.is-active {
301
+ color: var(--b-color-accent-text);
302
+ background: var(--b-color-accent-soft);
303
+ }
304
+ .b-toggle-btn[aria-pressed="true"]:hover {
305
+ background: color-mix(in srgb, var(--b-color-accent) 22%, transparent);
306
+ }
307
+
308
+ /* ---- Link & Link Group ------------------------------------------------- */
309
+ .b-link {
310
+ display: inline-flex;
311
+ align-items: center;
312
+ gap: var(--b-space-1);
313
+ color: var(--b-color-accent-text);
314
+ font-weight: var(--b-weight-medium);
315
+ cursor: pointer;
316
+ background: none;
317
+ border: none;
318
+ padding: 0;
319
+ }
320
+ .b-link:hover { text-decoration: underline; text-underline-offset: 0.2em; }
321
+ .b-link--muted { color: var(--b-text-secondary); }
322
+ .b-link--muted:hover { color: var(--b-text); }
323
+ .b-link--danger { color: var(--b-color-danger); }
324
+ .b-link svg { width: 1em; height: 1em; }
325
+ .b-link-group {
326
+ display: flex;
327
+ flex-wrap: wrap;
328
+ align-items: center;
329
+ gap: var(--b-space-2) var(--b-space-4);
330
+ }
331
+ .b-link-group--divided > * + *::before {
332
+ content: "·";
333
+ color: var(--b-text-quaternary);
334
+ margin-inline-end: var(--b-space-4);
335
+ }
336
+
337
+ /* ---- Share (SwiftUI ShareLink) — wire with data-b-share via barua.js ----- */
338
+ .b-share svg { width: 1.05em; height: 1.05em; }
339
+
340
+ /* ---- Toolbar ----------------------------------------------------------- */
341
+ .b-toolbar {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: var(--b-space-1);
345
+ padding: var(--b-space-1);
346
+ background: var(--b-surface);
347
+ border: 1px solid var(--b-separator);
348
+ border-radius: var(--b-radius-lg);
349
+ }
350
+ .b-toolbar--glass {
351
+ background: var(--b-material-regular-bg);
352
+ -webkit-backdrop-filter: var(--b-glass);
353
+ backdrop-filter: var(--b-glass);
354
+ border-color: light-dark(rgba(255, 255, 255, 0.20), rgba(255, 255, 255, 0.05));
355
+ box-shadow: var(--b-glass-shadow);
356
+ position: relative;
357
+ }
358
+ .b-toolbar--glass::before {
359
+ content: "";
360
+ position: absolute;
361
+ inset: 0;
362
+ border-radius: inherit;
363
+ box-shadow: var(--b-glass-edge);
364
+ pointer-events: none;
365
+ }
366
+ .b-toolbar .b-divider--vertical { margin-inline: var(--b-space-1); min-height: 1.25rem; }
367
+ .b-toolbar .b-btn { height: var(--b-control-h-sm); }
368
+ .b-toolbar .b-icon-btn { width: var(--b-control-h-sm); }
369
+
370
+ @keyframes b-spin { to { rotate: 360deg; } }
371
+ }
@@ -0,0 +1,237 @@
1
+ /* ==========================================================================
2
+ Barua UI — Authentication & System pages
3
+ Auth card/layout, OTP Input, Passkey Prompt, Account Switcher,
4
+ Profile Menu trigger, error/system page scaffold, onboarding.
5
+ ========================================================================== */
6
+
7
+ @layer components {
8
+ /* ---- Auth layout ------------------------------------------------------------ */
9
+ @media (min-width: 768px) {
10
+ .b-auth.b-stage { height: 100dvh; min-height: 0; overflow: clip; }
11
+ .b-auth.b-stage > main { height: 100%; min-height: 0; overflow-y: auto; }
12
+ }
13
+ .b-auth {
14
+ display: grid;
15
+ place-items: center;
16
+ min-height: 100dvh;
17
+ padding: var(--b-space-6) var(--b-space-4);
18
+ background:
19
+ radial-gradient(50rem 30rem at 15% -10%,
20
+ color-mix(in srgb, var(--b-color-accent) 22%, transparent), transparent),
21
+ radial-gradient(40rem 26rem at 110% 110%,
22
+ color-mix(in srgb, var(--b-color-indigo) 16%, transparent), transparent),
23
+ var(--b-bg);
24
+ }
25
+ .b-auth-card {
26
+ width: min(24rem, 100%);
27
+ padding: var(--b-space-8) var(--b-space-6);
28
+ background: var(--b-material-thick-bg);
29
+ -webkit-backdrop-filter: var(--b-glass-heavy);
30
+ backdrop-filter: var(--b-glass-heavy);
31
+ border: 1px solid var(--b-hairline);
32
+ border-radius: var(--b-radius-2xl);
33
+ box-shadow: var(--b-glass-edge), var(--b-elevation-4);
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: var(--b-space-4);
37
+ }
38
+ .b-auth-card__logo {
39
+ display: grid;
40
+ place-items: center;
41
+ width: 3rem; height: 3rem;
42
+ margin-inline: auto;
43
+ font-size: 1.4rem;
44
+ color: var(--b-color-on-accent);
45
+ background: linear-gradient(135deg, var(--b-color-accent), var(--b-color-indigo));
46
+ border-radius: var(--b-radius-lg);
47
+ box-shadow: var(--b-shadow-accent);
48
+ }
49
+ .b-auth-card__title {
50
+ font-size: var(--b-text-title2);
51
+ font-weight: var(--b-weight-bold);
52
+ text-align: center;
53
+ letter-spacing: var(--b-tracking-tight);
54
+ }
55
+ .b-auth-card__subtitle {
56
+ font-size: var(--b-text-subheadline);
57
+ color: var(--b-text-secondary);
58
+ text-align: center;
59
+ margin-block-start: calc(var(--b-space-1) * -1);
60
+ }
61
+ .b-auth-card__footer {
62
+ font-size: var(--b-text-footnote);
63
+ color: var(--b-text-secondary);
64
+ text-align: center;
65
+ }
66
+
67
+ /* Social sign-in button */
68
+ .b-btn--provider {
69
+ background: var(--b-surface);
70
+ border: 1px solid var(--b-border);
71
+ justify-content: center;
72
+ gap: var(--b-space-2);
73
+ font-weight: var(--b-weight-medium);
74
+ }
75
+ .b-btn--provider:hover { background: var(--b-fill-quaternary); }
76
+
77
+ /* ---- OTP Input ----------------------------------------------------------------- */
78
+ .b-otp {
79
+ display: flex;
80
+ justify-content: center;
81
+ gap: var(--b-space-2);
82
+ }
83
+ .b-otp input {
84
+ width: 2.75rem;
85
+ height: 3.25rem;
86
+ text-align: center;
87
+ font-size: var(--b-text-title3);
88
+ font-weight: var(--b-weight-semibold);
89
+ font-variant-numeric: tabular-nums;
90
+ color: var(--b-text);
91
+ background: var(--b-surface);
92
+ border: 1.5px solid var(--b-border);
93
+ border-radius: var(--b-radius-md);
94
+ caret-color: var(--b-color-accent);
95
+ transition: border-color var(--b-duration-fast), box-shadow var(--b-duration-fast);
96
+ }
97
+ .b-otp input:focus-visible {
98
+ border-color: var(--b-color-accent);
99
+ box-shadow: var(--b-focus-ring);
100
+ outline: none;
101
+ }
102
+ .b-otp input.is-filled { border-color: var(--b-color-accent); }
103
+ .b-otp.is-invalid input { border-color: var(--b-color-danger); animation: b-shake 0.35s var(--b-ease-standard); }
104
+ @keyframes b-shake {
105
+ 20%, 60% { translate: -4px 0; }
106
+ 40%, 80% { translate: 4px 0; }
107
+ }
108
+
109
+ /* ---- Passkey Prompt --------------------------------------------------------------- */
110
+ .b-passkey {
111
+ display: flex;
112
+ flex-direction: column;
113
+ align-items: center;
114
+ gap: var(--b-space-3);
115
+ padding: var(--b-space-6);
116
+ text-align: center;
117
+ background: var(--b-surface);
118
+ border: 1px solid var(--b-separator);
119
+ border-radius: var(--b-radius-xl);
120
+ }
121
+ .b-passkey__icon {
122
+ display: grid;
123
+ place-items: center;
124
+ width: 3.5rem; height: 3.5rem;
125
+ font-size: 1.6rem;
126
+ color: var(--b-color-accent-text);
127
+ background: var(--b-color-accent-soft);
128
+ border-radius: 50%;
129
+ }
130
+ .b-passkey__title { font-weight: var(--b-weight-semibold); font-size: var(--b-text-headline); }
131
+ .b-passkey__desc { font-size: var(--b-text-footnote); color: var(--b-text-secondary); max-width: 22rem; }
132
+
133
+ /* ---- Account Switcher / Profile Menu ------------------------------------------------ */
134
+ .b-account-switcher {
135
+ display: flex;
136
+ flex-direction: column;
137
+ gap: 2px;
138
+ padding: var(--b-space-1);
139
+ }
140
+ .b-account {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: var(--b-space-3);
144
+ width: 100%;
145
+ padding: var(--b-space-2) var(--b-space-3);
146
+ background: none;
147
+ border: none;
148
+ border-radius: var(--b-radius-md);
149
+ cursor: pointer;
150
+ text-align: start;
151
+ }
152
+ .b-account:hover { background: var(--b-fill-tertiary); }
153
+ .b-account.is-active { background: var(--b-color-accent-soft); }
154
+ .b-account__meta { flex: 1; min-width: 0; }
155
+ .b-account__name { font-size: var(--b-text-footnote); font-weight: var(--b-weight-semibold); }
156
+ .b-account__email { font-size: var(--b-text-caption); color: var(--b-text-secondary); }
157
+ .b-account__check { color: var(--b-color-accent-text); font-weight: var(--b-weight-bold); }
158
+
159
+ .b-profile-trigger {
160
+ display: inline-flex;
161
+ align-items: center;
162
+ gap: var(--b-space-2);
163
+ padding: var(--b-space-1);
164
+ padding-inline-end: var(--b-space-2);
165
+ background: none;
166
+ border: 1px solid transparent;
167
+ border-radius: var(--b-radius-full);
168
+ cursor: pointer;
169
+ transition: background var(--b-duration-fast), border-color var(--b-duration-fast);
170
+ }
171
+ .b-profile-trigger:hover { background: var(--b-fill-tertiary); border-color: var(--b-separator); }
172
+
173
+ /* ---- System / error page scaffold ----------------------------------------------------- */
174
+ .b-syspage {
175
+ display: flex;
176
+ flex-direction: column;
177
+ align-items: center;
178
+ justify-content: center;
179
+ gap: var(--b-space-3);
180
+ min-height: 60vh;
181
+ padding: var(--b-space-8) var(--b-space-4);
182
+ text-align: center;
183
+ }
184
+ .b-syspage__code {
185
+ font-size: clamp(4rem, 14vw, 7rem);
186
+ font-weight: var(--b-weight-bold);
187
+ letter-spacing: var(--b-tracking-tight);
188
+ line-height: 1;
189
+ background: linear-gradient(135deg, var(--b-color-accent), var(--b-color-indigo));
190
+ -webkit-background-clip: text;
191
+ background-clip: text;
192
+ color: transparent;
193
+ }
194
+ .b-syspage__title { font-size: var(--b-text-title2); font-weight: var(--b-weight-bold); }
195
+ .b-syspage__desc {
196
+ max-width: 30rem;
197
+ color: var(--b-text-secondary);
198
+ font-size: var(--b-text-subheadline);
199
+ }
200
+ .b-syspage__actions { display: flex; gap: var(--b-space-2); margin-block-start: var(--b-space-3); }
201
+
202
+ /* Offline / permission chip states reuse .b-result (feedback.css) */
203
+
204
+ /* ---- Onboarding / Welcome -------------------------------------------------------------- */
205
+ .b-onboarding {
206
+ display: flex;
207
+ flex-direction: column;
208
+ align-items: center;
209
+ gap: var(--b-space-6);
210
+ padding: var(--b-space-10) var(--b-space-4);
211
+ text-align: center;
212
+ }
213
+ .b-onboarding__hero {
214
+ font-size: var(--b-text-display);
215
+ font-weight: var(--b-weight-bold);
216
+ letter-spacing: var(--b-tracking-tight);
217
+ line-height: var(--b-leading-tight);
218
+ max-width: 22ch;
219
+ text-wrap: balance;
220
+ }
221
+ .b-onboarding__hero em {
222
+ font-style: normal;
223
+ background: linear-gradient(90deg, var(--b-color-accent), var(--b-color-indigo));
224
+ -webkit-background-clip: text;
225
+ background-clip: text;
226
+ color: transparent;
227
+ }
228
+ .b-onboarding-feature {
229
+ display: flex;
230
+ align-items: flex-start;
231
+ gap: var(--b-space-3);
232
+ text-align: start;
233
+ max-width: 24rem;
234
+ }
235
+ .b-onboarding-feature__title { font-weight: var(--b-weight-semibold); font-size: var(--b-text-subheadline); }
236
+ .b-onboarding-feature__desc { font-size: var(--b-text-footnote); color: var(--b-text-secondary); }
237
+ }