@astherix/ui 0.40.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.
- package/README.md +933 -0
- package/dist/chunk-IZEGCTZW.js +588 -0
- package/dist/chunk-IZEGCTZW.js.map +1 -0
- package/dist/cli.js +345 -0
- package/dist/controlStyles-Bco2sOHE.d.ts +4 -0
- package/dist/editor.d.ts +43 -0
- package/dist/editor.js +373 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +2470 -0
- package/dist/index.js +10582 -0
- package/dist/index.js.map +1 -0
- package/dist/theme.d.ts +78 -0
- package/dist/theme.js +287 -0
- package/dist/theme.js.map +1 -0
- package/package.json +69 -0
- package/theme.css +909 -0
- package/ui.theme.schema.json +462 -0
package/theme.css
ADDED
|
@@ -0,0 +1,909 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @astherix/ui theme
|
|
3
|
+
* Import after Tailwind in your app's main stylesheet:
|
|
4
|
+
*
|
|
5
|
+
* @import "tailwindcss";
|
|
6
|
+
* @import "@astherix/ui/theme.css";
|
|
7
|
+
* @source "../node_modules/@astherix/ui/dist";
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* Dark mode follows a `.dark` class on <html> (works with next-themes and Laravel starter kits). */
|
|
11
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
12
|
+
|
|
13
|
+
@theme {
|
|
14
|
+
/* Type — Schibsted Grotesk: a sturdy grotesk with open counters, readable at UI sizes. */
|
|
15
|
+
--font-sans: "Schibsted Grotesk", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
16
|
+
/* Headings use the body font by default; set --font-heading to give them their own. */
|
|
17
|
+
--font-heading: var(--font-sans);
|
|
18
|
+
--font-mono: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
|
|
19
|
+
|
|
20
|
+
/* Blue — the brand color, anchored on Bootstrap's #0d6efd at 500 */
|
|
21
|
+
--color-blue-50: #eef5ff;
|
|
22
|
+
--color-blue-100: #d9e8ff;
|
|
23
|
+
--color-blue-200: #b6d3ff;
|
|
24
|
+
--color-blue-300: #86b6fe;
|
|
25
|
+
--color-blue-400: #4d94fd;
|
|
26
|
+
--color-blue-500: #0d6efd;
|
|
27
|
+
--color-blue-600: #0a5ad6;
|
|
28
|
+
--color-blue-700: #0848ad;
|
|
29
|
+
--color-blue-800: #0a3c8a;
|
|
30
|
+
--color-blue-900: #0c326f;
|
|
31
|
+
--color-blue-950: #081f47;
|
|
32
|
+
|
|
33
|
+
/* Ash — neutrals with a faint cool cast so they sit well next to blue */
|
|
34
|
+
--color-ash-50: #f6f7f9;
|
|
35
|
+
--color-ash-100: #eceef2;
|
|
36
|
+
--color-ash-200: #d9dde4;
|
|
37
|
+
--color-ash-300: #bcc3cd;
|
|
38
|
+
--color-ash-400: #959ea9;
|
|
39
|
+
--color-ash-500: #717a86;
|
|
40
|
+
--color-ash-600: #58606b;
|
|
41
|
+
--color-ash-700: #454c56;
|
|
42
|
+
--color-ash-800: #2f343b;
|
|
43
|
+
--color-ash-900: #1d2126;
|
|
44
|
+
--color-ash-950: #121418;
|
|
45
|
+
|
|
46
|
+
/* Shape — corner radius for buttons and other controls */
|
|
47
|
+
--radius-control-sm: 0.1875rem; /* slightly rounded */
|
|
48
|
+
--radius-control: 0.375rem; /* medium, the default */
|
|
49
|
+
--radius-control-lg: 0.75rem; /* more rounded */
|
|
50
|
+
--radius-modal: 0.875rem; /* modal panels */
|
|
51
|
+
--radius-card: 0.75rem; /* cards */
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Semantic tokens — components only use these, so re-theming means overriding these variables. */
|
|
55
|
+
:root {
|
|
56
|
+
--ui-bg: var(--color-ash-50);
|
|
57
|
+
--ui-surface: #ffffff;
|
|
58
|
+
--ui-fg: var(--color-ash-900);
|
|
59
|
+
--ui-fg-muted: var(--color-ash-600);
|
|
60
|
+
--ui-border: var(--color-ash-200);
|
|
61
|
+
--ui-border-strong: var(--color-ash-300);
|
|
62
|
+
--ui-ring: var(--color-blue-500);
|
|
63
|
+
|
|
64
|
+
--ui-primary: var(--color-blue-500);
|
|
65
|
+
--ui-primary-hover: var(--color-blue-600);
|
|
66
|
+
--ui-primary-edge: var(--color-blue-800);
|
|
67
|
+
--ui-primary-fg: #ffffff;
|
|
68
|
+
|
|
69
|
+
--ui-secondary: #ffffff;
|
|
70
|
+
--ui-secondary-hover: var(--color-ash-100);
|
|
71
|
+
|
|
72
|
+
--ui-danger: #b42318;
|
|
73
|
+
--ui-danger-hover: #912018;
|
|
74
|
+
--ui-danger-edge: #5c140f;
|
|
75
|
+
--ui-danger-fg: #ffffff;
|
|
76
|
+
|
|
77
|
+
--ui-success: #15803d;
|
|
78
|
+
--ui-success-fg: #ffffff;
|
|
79
|
+
--ui-warning: #b45309;
|
|
80
|
+
--ui-warning-fg: #ffffff;
|
|
81
|
+
--ui-info: #0369a1;
|
|
82
|
+
--ui-info-fg: #ffffff;
|
|
83
|
+
|
|
84
|
+
/* Extra brand accents for controls that can take a color (e.g. Switch color="secondary"). */
|
|
85
|
+
--ui-tone-secondary: #15803d;
|
|
86
|
+
--ui-tone-secondary-fg: #ffffff;
|
|
87
|
+
--ui-tone-tertiary: #ea580c;
|
|
88
|
+
--ui-tone-tertiary-fg: #2a0f03;
|
|
89
|
+
|
|
90
|
+
/* Drop shadows for buttons (the `shadow` prop). Two layers: a tight contact
|
|
91
|
+
shadow plus a softer, wider one; heavier levels spread further. */
|
|
92
|
+
--ui-shadow-color: 29 33 38;
|
|
93
|
+
--ui-shadow-sm: 0 1px 2px rgb(var(--ui-shadow-color) / 0.14);
|
|
94
|
+
--ui-shadow-md: 0 1px 2px rgb(var(--ui-shadow-color) / 0.12), 0 3px 8px -1px rgb(var(--ui-shadow-color) / 0.14);
|
|
95
|
+
--ui-shadow-lg: 0 2px 4px rgb(var(--ui-shadow-color) / 0.1), 0 8px 18px -4px rgb(var(--ui-shadow-color) / 0.22);
|
|
96
|
+
--ui-shadow-xl: 0 3px 6px rgb(var(--ui-shadow-color) / 0.1), 0 16px 32px -8px rgb(var(--ui-shadow-color) / 0.32);
|
|
97
|
+
|
|
98
|
+
/* Modal */
|
|
99
|
+
--ui-backdrop: rgb(18 20 24 / 0.5);
|
|
100
|
+
--ui-backdrop-dark: rgb(8 10 13 / 0.82);
|
|
101
|
+
--ui-backdrop-blur: rgb(18 20 24 / 0.22);
|
|
102
|
+
--ui-backdrop-blur-radius: 8px;
|
|
103
|
+
--ui-backdrop-solid: var(--color-ash-50);
|
|
104
|
+
--ui-shadow-modal: 0 2px 6px rgb(var(--ui-shadow-color) / 0.08), 0 24px 56px -12px rgb(var(--ui-shadow-color) / 0.35);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.dark {
|
|
108
|
+
--ui-bg: var(--color-ash-950);
|
|
109
|
+
--ui-surface: var(--color-ash-900);
|
|
110
|
+
--ui-fg: var(--color-ash-50);
|
|
111
|
+
--ui-fg-muted: var(--color-ash-400);
|
|
112
|
+
--ui-border: var(--color-ash-800);
|
|
113
|
+
--ui-border-strong: var(--color-ash-700);
|
|
114
|
+
--ui-ring: var(--color-blue-300);
|
|
115
|
+
|
|
116
|
+
--ui-primary: var(--color-blue-400);
|
|
117
|
+
--ui-primary-hover: var(--color-blue-300);
|
|
118
|
+
--ui-primary-edge: var(--color-blue-600);
|
|
119
|
+
--ui-primary-fg: var(--color-blue-950);
|
|
120
|
+
|
|
121
|
+
--ui-secondary: var(--color-ash-900);
|
|
122
|
+
--ui-secondary-hover: var(--color-ash-800);
|
|
123
|
+
|
|
124
|
+
--ui-danger: #f47a6e;
|
|
125
|
+
--ui-danger-hover: #f89a90;
|
|
126
|
+
--ui-danger-edge: #c0392b;
|
|
127
|
+
--ui-danger-fg: #2a0906;
|
|
128
|
+
|
|
129
|
+
--ui-success: #4ade80;
|
|
130
|
+
--ui-success-fg: #052e16;
|
|
131
|
+
--ui-warning: #fbbf24;
|
|
132
|
+
--ui-warning-fg: #2b1700;
|
|
133
|
+
--ui-info: #38bdf8;
|
|
134
|
+
--ui-info-fg: #04203a;
|
|
135
|
+
|
|
136
|
+
--ui-tone-secondary: #4ade80;
|
|
137
|
+
--ui-tone-secondary-fg: #052e16;
|
|
138
|
+
--ui-tone-tertiary: #fb923c;
|
|
139
|
+
--ui-tone-tertiary-fg: #3b1204;
|
|
140
|
+
|
|
141
|
+
/* Dark backgrounds need deeper, darker shadows to read at all. */
|
|
142
|
+
--ui-shadow-color: 0 0 0;
|
|
143
|
+
--ui-shadow-sm: 0 1px 2px rgb(var(--ui-shadow-color) / 0.4);
|
|
144
|
+
--ui-shadow-md: 0 1px 2px rgb(var(--ui-shadow-color) / 0.4), 0 3px 8px -1px rgb(var(--ui-shadow-color) / 0.45);
|
|
145
|
+
--ui-shadow-lg: 0 2px 4px rgb(var(--ui-shadow-color) / 0.4), 0 8px 18px -4px rgb(var(--ui-shadow-color) / 0.6);
|
|
146
|
+
--ui-shadow-xl: 0 3px 6px rgb(var(--ui-shadow-color) / 0.4), 0 16px 32px -8px rgb(var(--ui-shadow-color) / 0.75);
|
|
147
|
+
|
|
148
|
+
--ui-backdrop: rgb(0 0 0 / 0.62);
|
|
149
|
+
--ui-backdrop-dark: rgb(0 0 0 / 0.86);
|
|
150
|
+
--ui-backdrop-blur: rgb(0 0 0 / 0.38);
|
|
151
|
+
--ui-backdrop-solid: var(--color-ash-950);
|
|
152
|
+
--ui-shadow-modal: 0 2px 6px rgb(0 0 0 / 0.4), 0 24px 56px -12px rgb(0 0 0 / 0.7);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@theme inline {
|
|
156
|
+
--color-bg: var(--ui-bg);
|
|
157
|
+
--color-surface: var(--ui-surface);
|
|
158
|
+
--color-fg: var(--ui-fg);
|
|
159
|
+
--color-fg-muted: var(--ui-fg-muted);
|
|
160
|
+
--color-border: var(--ui-border);
|
|
161
|
+
--color-border-strong: var(--ui-border-strong);
|
|
162
|
+
--color-ring: var(--ui-ring);
|
|
163
|
+
--color-primary: var(--ui-primary);
|
|
164
|
+
--color-primary-hover: var(--ui-primary-hover);
|
|
165
|
+
--color-primary-edge: var(--ui-primary-edge);
|
|
166
|
+
--color-primary-fg: var(--ui-primary-fg);
|
|
167
|
+
--color-secondary: var(--ui-secondary);
|
|
168
|
+
--color-secondary-hover: var(--ui-secondary-hover);
|
|
169
|
+
--color-danger: var(--ui-danger);
|
|
170
|
+
--color-danger-hover: var(--ui-danger-hover);
|
|
171
|
+
--color-danger-edge: var(--ui-danger-edge);
|
|
172
|
+
--color-danger-fg: var(--ui-danger-fg);
|
|
173
|
+
--color-success: var(--ui-success);
|
|
174
|
+
--color-success-fg: var(--ui-success-fg);
|
|
175
|
+
--color-warning: var(--ui-warning);
|
|
176
|
+
--color-warning-fg: var(--ui-warning-fg);
|
|
177
|
+
--color-info: var(--ui-info);
|
|
178
|
+
--color-info-fg: var(--ui-info-fg);
|
|
179
|
+
--color-tone-secondary: var(--ui-tone-secondary);
|
|
180
|
+
--color-tone-secondary-fg: var(--ui-tone-secondary-fg);
|
|
181
|
+
--color-tone-tertiary: var(--ui-tone-tertiary);
|
|
182
|
+
--color-tone-tertiary-fg: var(--ui-tone-tertiary-fg);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
@layer base {
|
|
186
|
+
html {
|
|
187
|
+
font-family: var(--font-sans);
|
|
188
|
+
font-feature-settings: "ss01" 0;
|
|
189
|
+
-webkit-font-smoothing: antialiased;
|
|
190
|
+
-moz-osx-font-smoothing: grayscale;
|
|
191
|
+
}
|
|
192
|
+
body {
|
|
193
|
+
background-color: var(--color-bg);
|
|
194
|
+
color: var(--color-fg);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* Experimental: running-light loading indicator for Button (loadingIndicator="orbit").
|
|
200
|
+
* A conic gradient rotates around the button and is masked down to a thin ring.
|
|
201
|
+
* Tweak per button or app with --ui-orbit-color, --ui-orbit-width, --ui-orbit-speed.
|
|
202
|
+
*/
|
|
203
|
+
@property --ui-orbit-angle {
|
|
204
|
+
syntax: "<angle>";
|
|
205
|
+
inherits: false;
|
|
206
|
+
initial-value: 0deg;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
@keyframes ui-orbit {
|
|
210
|
+
to {
|
|
211
|
+
--ui-orbit-angle: 360deg;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
@keyframes ui-orbit-pulse {
|
|
216
|
+
50% {
|
|
217
|
+
opacity: 0.35;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@layer components {
|
|
222
|
+
.ui-btn-orbit-glow {
|
|
223
|
+
position: absolute;
|
|
224
|
+
inset: 0;
|
|
225
|
+
border-radius: inherit;
|
|
226
|
+
pointer-events: none;
|
|
227
|
+
filter: drop-shadow(0 0 3px var(--ui-orbit-color));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.ui-btn-orbit {
|
|
231
|
+
position: absolute;
|
|
232
|
+
inset: 0;
|
|
233
|
+
border-radius: inherit;
|
|
234
|
+
padding: var(--ui-orbit-width, 2px);
|
|
235
|
+
background: conic-gradient(
|
|
236
|
+
from var(--ui-orbit-angle),
|
|
237
|
+
transparent 0turn 0.55turn,
|
|
238
|
+
color-mix(in srgb, var(--ui-orbit-color) 35%, transparent) 0.8turn,
|
|
239
|
+
var(--ui-orbit-color) 0.97turn,
|
|
240
|
+
transparent 1turn
|
|
241
|
+
);
|
|
242
|
+
/* keep only the ring between the padding edge and the content box */
|
|
243
|
+
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
|
|
244
|
+
-webkit-mask-composite: xor;
|
|
245
|
+
mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
|
|
246
|
+
animation: ui-orbit var(--ui-orbit-speed, 1.1s) linear infinite;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* With reduced motion, the whole ring gently pulses instead of running. */
|
|
250
|
+
@media (prefers-reduced-motion: reduce) {
|
|
251
|
+
.ui-btn-orbit {
|
|
252
|
+
background: var(--ui-orbit-color);
|
|
253
|
+
animation: ui-orbit-pulse 1.6s ease-in-out infinite;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* Modal animations */
|
|
259
|
+
@keyframes ui-fade-in {
|
|
260
|
+
from {
|
|
261
|
+
opacity: 0;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
@keyframes ui-fade-out {
|
|
265
|
+
to {
|
|
266
|
+
opacity: 0;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
@keyframes ui-modal-in {
|
|
270
|
+
from {
|
|
271
|
+
opacity: 0;
|
|
272
|
+
transform: translateY(10px) scale(0.98);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
@keyframes ui-modal-out {
|
|
276
|
+
to {
|
|
277
|
+
opacity: 0;
|
|
278
|
+
transform: translateY(6px) scale(0.985);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/*
|
|
283
|
+
* Experimental: progress loading indicator for Button (loadingIndicator="progress").
|
|
284
|
+
* Without a `progress` value it creeps toward ~92% and completes when the work ends.
|
|
285
|
+
* Tweak with --ui-progress-fill, --ui-progress-bar, --ui-progress-height, --ui-progress-duration.
|
|
286
|
+
*/
|
|
287
|
+
@keyframes ui-progress-creep {
|
|
288
|
+
from {
|
|
289
|
+
width: 0%;
|
|
290
|
+
}
|
|
291
|
+
15% {
|
|
292
|
+
width: 34%;
|
|
293
|
+
}
|
|
294
|
+
45% {
|
|
295
|
+
width: 66%;
|
|
296
|
+
}
|
|
297
|
+
to {
|
|
298
|
+
width: 92%;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/*
|
|
303
|
+
* Rich text styles. Used by Editor, and for showing saved HTML:
|
|
304
|
+
* <div className="ui-prose" dangerouslySetInnerHTML={{ __html: sanitizedHtml }} />
|
|
305
|
+
*/
|
|
306
|
+
@layer components {
|
|
307
|
+
.ui-prose {
|
|
308
|
+
color: var(--color-fg);
|
|
309
|
+
font-size: 0.9375rem;
|
|
310
|
+
line-height: 1.65;
|
|
311
|
+
overflow-wrap: anywhere;
|
|
312
|
+
}
|
|
313
|
+
.ui-prose > * + * {
|
|
314
|
+
margin-top: 0.75em;
|
|
315
|
+
}
|
|
316
|
+
.ui-prose h2 {
|
|
317
|
+
font-size: 1.25em;
|
|
318
|
+
font-weight: 600;
|
|
319
|
+
line-height: 1.3;
|
|
320
|
+
letter-spacing: -0.01em;
|
|
321
|
+
margin-top: 1.4em;
|
|
322
|
+
}
|
|
323
|
+
.ui-prose h1 {
|
|
324
|
+
font-family: var(--font-heading);
|
|
325
|
+
font-size: 1.75em;
|
|
326
|
+
font-weight: 600;
|
|
327
|
+
line-height: 1.15;
|
|
328
|
+
letter-spacing: -0.02em;
|
|
329
|
+
text-wrap: balance;
|
|
330
|
+
}
|
|
331
|
+
.ui-prose h2,
|
|
332
|
+
.ui-prose h3,
|
|
333
|
+
.ui-prose h4 {
|
|
334
|
+
font-family: var(--font-heading);
|
|
335
|
+
text-wrap: balance;
|
|
336
|
+
}
|
|
337
|
+
.ui-prose h4 {
|
|
338
|
+
font-size: 1em;
|
|
339
|
+
font-weight: 600;
|
|
340
|
+
margin-top: 1.2em;
|
|
341
|
+
}
|
|
342
|
+
.ui-prose img,
|
|
343
|
+
.ui-prose video {
|
|
344
|
+
max-width: 100%;
|
|
345
|
+
height: auto;
|
|
346
|
+
border-radius: var(--radius-control-lg);
|
|
347
|
+
}
|
|
348
|
+
.ui-prose figcaption {
|
|
349
|
+
margin-top: 0.5em;
|
|
350
|
+
font-size: 0.85em;
|
|
351
|
+
color: var(--color-fg-muted);
|
|
352
|
+
}
|
|
353
|
+
.ui-prose pre {
|
|
354
|
+
overflow-x: auto;
|
|
355
|
+
padding: 0.85em 1em;
|
|
356
|
+
border-radius: var(--radius-control);
|
|
357
|
+
background: var(--color-secondary-hover);
|
|
358
|
+
font-size: 0.85em;
|
|
359
|
+
line-height: 1.6;
|
|
360
|
+
}
|
|
361
|
+
.ui-prose pre code {
|
|
362
|
+
background: none;
|
|
363
|
+
padding: 0;
|
|
364
|
+
font-size: inherit;
|
|
365
|
+
}
|
|
366
|
+
.ui-prose table {
|
|
367
|
+
width: 100%;
|
|
368
|
+
border-collapse: collapse;
|
|
369
|
+
font-size: 0.9em;
|
|
370
|
+
font-variant-numeric: tabular-nums;
|
|
371
|
+
}
|
|
372
|
+
.ui-prose th {
|
|
373
|
+
text-align: left;
|
|
374
|
+
font-weight: 600;
|
|
375
|
+
border-bottom: 1px solid var(--color-border-strong);
|
|
376
|
+
padding: 0.5em 0.75em 0.5em 0;
|
|
377
|
+
}
|
|
378
|
+
.ui-prose td {
|
|
379
|
+
border-bottom: 1px solid var(--color-border);
|
|
380
|
+
padding: 0.5em 0.75em 0.5em 0;
|
|
381
|
+
}
|
|
382
|
+
.ui-prose mark {
|
|
383
|
+
background: color-mix(in srgb, var(--color-warning) 28%, transparent);
|
|
384
|
+
color: inherit;
|
|
385
|
+
border-radius: 2px;
|
|
386
|
+
padding: 0 0.1em;
|
|
387
|
+
}
|
|
388
|
+
.ui-prose h3 {
|
|
389
|
+
font-size: 1.075em;
|
|
390
|
+
font-weight: 600;
|
|
391
|
+
line-height: 1.35;
|
|
392
|
+
margin-top: 1.2em;
|
|
393
|
+
}
|
|
394
|
+
.ui-prose > :first-child {
|
|
395
|
+
margin-top: 0;
|
|
396
|
+
}
|
|
397
|
+
.ui-prose h2 + *,
|
|
398
|
+
.ui-prose h3 + * {
|
|
399
|
+
margin-top: 0.4em;
|
|
400
|
+
}
|
|
401
|
+
.ui-prose a {
|
|
402
|
+
color: var(--color-primary);
|
|
403
|
+
text-decoration: underline;
|
|
404
|
+
text-decoration-thickness: 1px;
|
|
405
|
+
text-underline-offset: 2px;
|
|
406
|
+
}
|
|
407
|
+
.ui-prose strong {
|
|
408
|
+
font-weight: 600;
|
|
409
|
+
}
|
|
410
|
+
.ui-prose ul,
|
|
411
|
+
.ui-prose ol {
|
|
412
|
+
padding-left: 1.4em;
|
|
413
|
+
}
|
|
414
|
+
.ui-prose ul {
|
|
415
|
+
list-style: disc;
|
|
416
|
+
}
|
|
417
|
+
.ui-prose ol {
|
|
418
|
+
list-style: decimal;
|
|
419
|
+
}
|
|
420
|
+
.ui-prose li + li,
|
|
421
|
+
.ui-prose li > ul,
|
|
422
|
+
.ui-prose li > ol {
|
|
423
|
+
margin-top: 0.25em;
|
|
424
|
+
}
|
|
425
|
+
.ui-prose li::marker {
|
|
426
|
+
color: var(--color-fg-muted);
|
|
427
|
+
}
|
|
428
|
+
.ui-prose li > p {
|
|
429
|
+
margin: 0;
|
|
430
|
+
}
|
|
431
|
+
.ui-prose blockquote {
|
|
432
|
+
border-left: 3px solid var(--color-border-strong);
|
|
433
|
+
padding-left: 0.9em;
|
|
434
|
+
color: var(--color-fg-muted);
|
|
435
|
+
}
|
|
436
|
+
.ui-prose code {
|
|
437
|
+
font-family: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
|
|
438
|
+
font-size: 0.875em;
|
|
439
|
+
background: var(--color-secondary-hover);
|
|
440
|
+
border-radius: 0.25rem;
|
|
441
|
+
padding: 0.1em 0.3em;
|
|
442
|
+
}
|
|
443
|
+
.ui-prose hr {
|
|
444
|
+
border: 0;
|
|
445
|
+
border-top: 1px solid var(--color-border);
|
|
446
|
+
margin-block: 1.25em;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/* Editor-only: placeholder on the empty first line */
|
|
450
|
+
.ui-editor-content p.is-editor-empty:first-child::before {
|
|
451
|
+
content: attr(data-placeholder);
|
|
452
|
+
color: color-mix(in srgb, var(--color-fg-muted) 75%, transparent);
|
|
453
|
+
float: left;
|
|
454
|
+
height: 0;
|
|
455
|
+
pointer-events: none;
|
|
456
|
+
}
|
|
457
|
+
.ui-editor-content {
|
|
458
|
+
min-height: inherit;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
/* Activity indicators */
|
|
464
|
+
@keyframes ui-dot {
|
|
465
|
+
0%, 80%, 100% {
|
|
466
|
+
transform: scale(0.55);
|
|
467
|
+
opacity: 0.35;
|
|
468
|
+
}
|
|
469
|
+
40% {
|
|
470
|
+
transform: scale(1);
|
|
471
|
+
opacity: 1;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
@keyframes ui-eq {
|
|
475
|
+
0%, 100% {
|
|
476
|
+
transform: scaleY(0.3);
|
|
477
|
+
}
|
|
478
|
+
50% {
|
|
479
|
+
transform: scaleY(1);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
@keyframes ui-beacon {
|
|
483
|
+
from {
|
|
484
|
+
transform: scale(0.4);
|
|
485
|
+
opacity: 0.7;
|
|
486
|
+
}
|
|
487
|
+
to {
|
|
488
|
+
transform: scale(1);
|
|
489
|
+
opacity: 0;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
@keyframes ui-indeterminate {
|
|
493
|
+
from {
|
|
494
|
+
transform: translateX(-100%);
|
|
495
|
+
}
|
|
496
|
+
to {
|
|
497
|
+
transform: translateX(250%);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
@keyframes ui-shimmer {
|
|
501
|
+
from {
|
|
502
|
+
background-position: 150% 0;
|
|
503
|
+
}
|
|
504
|
+
to {
|
|
505
|
+
background-position: -50% 0;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
@keyframes ui-breathe {
|
|
509
|
+
50% {
|
|
510
|
+
opacity: 0.45;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
@layer components {
|
|
515
|
+
.ui-skeleton {
|
|
516
|
+
background-color: var(--color-secondary-hover);
|
|
517
|
+
background-image: linear-gradient(
|
|
518
|
+
90deg,
|
|
519
|
+
transparent 0%,
|
|
520
|
+
color-mix(in srgb, var(--color-surface) 70%, transparent) 50%,
|
|
521
|
+
transparent 100%
|
|
522
|
+
);
|
|
523
|
+
background-size: 50% 100%;
|
|
524
|
+
background-repeat: no-repeat;
|
|
525
|
+
animation: ui-shimmer 1.5s ease-in-out infinite;
|
|
526
|
+
}
|
|
527
|
+
.ui-skeleton-pulse {
|
|
528
|
+
background-color: var(--color-secondary-hover);
|
|
529
|
+
animation: ui-breathe 1.8s ease-in-out infinite;
|
|
530
|
+
}
|
|
531
|
+
.ui-skeleton-still {
|
|
532
|
+
background-color: var(--color-secondary-hover);
|
|
533
|
+
}
|
|
534
|
+
@media (prefers-reduced-motion: reduce) {
|
|
535
|
+
.ui-skeleton-pulse {
|
|
536
|
+
animation: ui-breathe 2.6s ease-in-out infinite;
|
|
537
|
+
}
|
|
538
|
+
.ui-skeleton {
|
|
539
|
+
background-image: none;
|
|
540
|
+
animation: ui-breathe 2s ease-in-out infinite;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
/* The orbit indicator: a ring with a fading tail, spinning */
|
|
544
|
+
.ui-orbit-ring {
|
|
545
|
+
border-radius: 9999px;
|
|
546
|
+
background: conic-gradient(from 0deg, transparent 0turn 0.35turn, color-mix(in srgb, var(--ai) 30%, transparent) 0.7turn, var(--ai) 0.98turn, transparent 1turn);
|
|
547
|
+
-webkit-mask: radial-gradient(farthest-side, transparent calc(100% - var(--ai-thickness, 3px)), #000 calc(100% - var(--ai-thickness, 3px) + 0.5px));
|
|
548
|
+
mask: radial-gradient(farthest-side, transparent calc(100% - var(--ai-thickness, 3px)), #000 calc(100% - var(--ai-thickness, 3px) + 0.5px));
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
@keyframes ui-stripes {
|
|
552
|
+
from {
|
|
553
|
+
background-position: 14px 0;
|
|
554
|
+
}
|
|
555
|
+
to {
|
|
556
|
+
background-position: 0 0;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* Avatar initials: a soft color picked from the name (the hue is set per avatar). */
|
|
561
|
+
@layer components {
|
|
562
|
+
.ui-avatar-initials {
|
|
563
|
+
background: hsl(var(--av-h, 215) 58% 91%);
|
|
564
|
+
color: hsl(var(--av-h, 215) 42% 30%);
|
|
565
|
+
}
|
|
566
|
+
.dark .ui-avatar-initials {
|
|
567
|
+
background: hsl(var(--av-h, 215) 28% 24%);
|
|
568
|
+
color: hsl(var(--av-h, 215) 62% 84%);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/* Dropdown menus */
|
|
573
|
+
@keyframes ui-menu-down {
|
|
574
|
+
from {
|
|
575
|
+
opacity: 0;
|
|
576
|
+
transform: translateY(-4px) scale(0.98);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
@keyframes ui-menu-up {
|
|
580
|
+
from {
|
|
581
|
+
opacity: 0;
|
|
582
|
+
transform: translateY(4px) scale(0.98);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/* DataTable refresh indicators */
|
|
587
|
+
@keyframes ui-border-run {
|
|
588
|
+
from {
|
|
589
|
+
stroke-dashoffset: var(--o, 0);
|
|
590
|
+
}
|
|
591
|
+
to {
|
|
592
|
+
stroke-dashoffset: calc(var(--o, 0) - 100);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
@keyframes ui-sweep {
|
|
596
|
+
from {
|
|
597
|
+
transform: translateX(-100%);
|
|
598
|
+
}
|
|
599
|
+
to {
|
|
600
|
+
transform: translateX(100%);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
@keyframes ui-refresh-done {
|
|
604
|
+
from {
|
|
605
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 35%, transparent);
|
|
606
|
+
}
|
|
607
|
+
to {
|
|
608
|
+
box-shadow: 0 0 0 3px transparent;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/* Timeline: the thread draws itself as it scrolls into view (where supported). */
|
|
613
|
+
@keyframes ui-thread {
|
|
614
|
+
from {
|
|
615
|
+
transform: scaleY(0);
|
|
616
|
+
}
|
|
617
|
+
to {
|
|
618
|
+
transform: scaleY(1);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
@layer components {
|
|
622
|
+
@supports (animation-timeline: view()) {
|
|
623
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
624
|
+
.ui-thread-draw {
|
|
625
|
+
transform-origin: top;
|
|
626
|
+
animation: ui-thread linear both;
|
|
627
|
+
animation-timeline: view();
|
|
628
|
+
animation-range: entry 20% cover 45%;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/* Checkbox check mark draws in */
|
|
635
|
+
@keyframes ui-check-draw {
|
|
636
|
+
from {
|
|
637
|
+
stroke-dashoffset: 1;
|
|
638
|
+
}
|
|
639
|
+
to {
|
|
640
|
+
stroke-dashoffset: 0;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/* Toasts */
|
|
644
|
+
@keyframes ui-toast-in-bottom {
|
|
645
|
+
from {
|
|
646
|
+
opacity: 0;
|
|
647
|
+
transform: translateY(16px) scale(0.97);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
@keyframes ui-toast-in-top {
|
|
651
|
+
from {
|
|
652
|
+
opacity: 0;
|
|
653
|
+
transform: translateY(-16px) scale(0.97);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
@keyframes ui-toast-timer {
|
|
657
|
+
from {
|
|
658
|
+
transform: scaleX(1);
|
|
659
|
+
}
|
|
660
|
+
to {
|
|
661
|
+
transform: scaleX(0);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/* Slider: the thumb turns into a frosted glass lens while pressed. */
|
|
666
|
+
@layer components {
|
|
667
|
+
.ui-glass {
|
|
668
|
+
background: color-mix(in srgb, #ffffff 34%, transparent);
|
|
669
|
+
-webkit-backdrop-filter: blur(3px) saturate(1.9) brightness(1.08);
|
|
670
|
+
backdrop-filter: blur(3px) saturate(1.9) brightness(1.08);
|
|
671
|
+
box-shadow:
|
|
672
|
+
inset 0 1px 1px rgb(255 255 255 / 0.85),
|
|
673
|
+
inset 0 -3px 6px rgb(255 255 255 / 0.18),
|
|
674
|
+
inset 0 0 0 1px rgb(255 255 255 / 0.55),
|
|
675
|
+
0 6px 16px -4px rgb(0 0 0 / 0.28),
|
|
676
|
+
0 0 0 0.5px color-mix(in srgb, var(--sl, var(--color-primary)) 30%, transparent);
|
|
677
|
+
}
|
|
678
|
+
.dark .ui-glass {
|
|
679
|
+
background: color-mix(in srgb, #ffffff 12%, transparent);
|
|
680
|
+
box-shadow:
|
|
681
|
+
inset 0 1px 1px rgb(255 255 255 / 0.45),
|
|
682
|
+
inset 0 -3px 6px rgb(255 255 255 / 0.08),
|
|
683
|
+
inset 0 0 0 1px rgb(255 255 255 / 0.28),
|
|
684
|
+
0 6px 16px -4px rgb(0 0 0 / 0.6),
|
|
685
|
+
0 0 0 1px color-mix(in srgb, var(--sl, var(--color-primary)) 45%, transparent);
|
|
686
|
+
}
|
|
687
|
+
/* A soft specular highlight across the top of the glass. */
|
|
688
|
+
.ui-glass::after {
|
|
689
|
+
content: "";
|
|
690
|
+
position: absolute;
|
|
691
|
+
inset: 8% 16% 55% 16%;
|
|
692
|
+
border-radius: 9999px;
|
|
693
|
+
background: linear-gradient(to bottom, rgb(255 255 255 / 0.75), rgb(255 255 255 / 0));
|
|
694
|
+
pointer-events: none;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/* Chart palette (Dashboard widgets). Override per theme. */
|
|
699
|
+
:root {
|
|
700
|
+
--ui-chart-1: #0d6efd;
|
|
701
|
+
--ui-chart-2: #0d9488;
|
|
702
|
+
--ui-chart-3: #ea580c;
|
|
703
|
+
--ui-chart-4: #7c3aed;
|
|
704
|
+
--ui-chart-5: #db2777;
|
|
705
|
+
--ui-chart-6: #ca8a04;
|
|
706
|
+
--ui-chart-grid: rgb(29 33 38 / 0.08);
|
|
707
|
+
}
|
|
708
|
+
.dark {
|
|
709
|
+
--ui-chart-1: #4d94fd;
|
|
710
|
+
--ui-chart-2: #2dd4bf;
|
|
711
|
+
--ui-chart-3: #fb923c;
|
|
712
|
+
--ui-chart-4: #a78bfa;
|
|
713
|
+
--ui-chart-5: #f472b6;
|
|
714
|
+
--ui-chart-6: #facc15;
|
|
715
|
+
--ui-chart-grid: rgb(246 247 249 / 0.08);
|
|
716
|
+
}
|
|
717
|
+
@keyframes ui-chart-draw {
|
|
718
|
+
from {
|
|
719
|
+
stroke-dashoffset: 1;
|
|
720
|
+
}
|
|
721
|
+
to {
|
|
722
|
+
stroke-dashoffset: 0;
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
@keyframes ui-chart-grow {
|
|
726
|
+
from {
|
|
727
|
+
transform: scaleY(0);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
@keyframes ui-chart-fade {
|
|
731
|
+
from {
|
|
732
|
+
opacity: 0;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/* Dashboard: widgets rise in one after another on first load (DashboardGrid animate). */
|
|
737
|
+
@keyframes ui-rise {
|
|
738
|
+
from {
|
|
739
|
+
opacity: 0;
|
|
740
|
+
transform: translateY(14px) scale(0.985);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
@layer components {
|
|
744
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
745
|
+
.ui-dash-enter > * {
|
|
746
|
+
animation: ui-rise 560ms cubic-bezier(0.2, 0.9, 0.3, 1) both;
|
|
747
|
+
}
|
|
748
|
+
.ui-dash-enter > :nth-child(2) { animation-delay: 60ms; }
|
|
749
|
+
.ui-dash-enter > :nth-child(3) { animation-delay: 120ms; }
|
|
750
|
+
.ui-dash-enter > :nth-child(4) { animation-delay: 180ms; }
|
|
751
|
+
.ui-dash-enter > :nth-child(5) { animation-delay: 240ms; }
|
|
752
|
+
.ui-dash-enter > :nth-child(6) { animation-delay: 300ms; }
|
|
753
|
+
.ui-dash-enter > :nth-child(7) { animation-delay: 360ms; }
|
|
754
|
+
.ui-dash-enter > :nth-child(8) { animation-delay: 420ms; }
|
|
755
|
+
.ui-dash-enter > :nth-child(n + 9) { animation-delay: 480ms; }
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
/* A KPI value glows briefly when it changes (live updates). */
|
|
759
|
+
@keyframes ui-kpi-flash {
|
|
760
|
+
0% {
|
|
761
|
+
background-color: color-mix(in srgb, var(--kpi-flash, var(--color-primary)) 18%, transparent);
|
|
762
|
+
}
|
|
763
|
+
100% {
|
|
764
|
+
background-color: transparent;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
/* IconButton: press ripple, toggle pop and burst */
|
|
769
|
+
@keyframes ui-icon-ripple {
|
|
770
|
+
from {
|
|
771
|
+
transform: scale(0.4);
|
|
772
|
+
opacity: 0.35;
|
|
773
|
+
}
|
|
774
|
+
to {
|
|
775
|
+
transform: scale(1.6);
|
|
776
|
+
opacity: 0;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
@keyframes ui-icon-pop {
|
|
780
|
+
0% {
|
|
781
|
+
transform: scale(0.6);
|
|
782
|
+
}
|
|
783
|
+
45% {
|
|
784
|
+
transform: scale(1.28);
|
|
785
|
+
}
|
|
786
|
+
75% {
|
|
787
|
+
transform: scale(0.94);
|
|
788
|
+
}
|
|
789
|
+
100% {
|
|
790
|
+
transform: scale(1);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
@keyframes ui-icon-burst {
|
|
794
|
+
0% {
|
|
795
|
+
transform: rotate(var(--a)) translateY(0) scale(1);
|
|
796
|
+
opacity: 1;
|
|
797
|
+
}
|
|
798
|
+
100% {
|
|
799
|
+
transform: rotate(var(--a)) translateY(calc(var(--d) * -1)) scale(0.3);
|
|
800
|
+
opacity: 0;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/* ---------------------------------------------------------------------------
|
|
805
|
+
* Layout primitives (Stack, Grid, GridItem)
|
|
806
|
+
*
|
|
807
|
+
* The components set CSS custom properties; the rules below read them, including
|
|
808
|
+
* inside media queries. Doing it this way means a responsive prop needs no class
|
|
809
|
+
* names generated at runtime, so it survives a packaged build.
|
|
810
|
+
* ------------------------------------------------------------------------- */
|
|
811
|
+
[data-ui-stack] {
|
|
812
|
+
display: flex;
|
|
813
|
+
flex-direction: var(--ui-dir, column);
|
|
814
|
+
gap: calc(var(--spacing) * var(--ui-gap, 4));
|
|
815
|
+
align-items: var(--ui-align, stretch);
|
|
816
|
+
justify-content: var(--ui-justify, flex-start);
|
|
817
|
+
flex-wrap: var(--ui-wrap, nowrap);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
[data-ui-grid] {
|
|
821
|
+
display: grid;
|
|
822
|
+
grid-template-columns: var(--ui-cols, repeat(1, minmax(0, 1fr)));
|
|
823
|
+
gap: calc(var(--spacing) * var(--ui-gap, 4));
|
|
824
|
+
align-items: var(--ui-align, stretch);
|
|
825
|
+
justify-items: var(--ui-justify-items, stretch);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
[data-ui-span] {
|
|
829
|
+
grid-column: span min(var(--ui-span, 1), var(--ui-cols-count, 12)) / span min(var(--ui-span, 1), var(--ui-cols-count, 12));
|
|
830
|
+
grid-row: span var(--ui-row-span, 1) / span var(--ui-row-span, 1);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
@media (min-width: 40rem) {
|
|
834
|
+
[data-ui-stack] {
|
|
835
|
+
flex-direction: var(--ui-dir-sm, var(--ui-dir, column));
|
|
836
|
+
gap: calc(var(--spacing) * var(--ui-gap-sm, var(--ui-gap, 4)));
|
|
837
|
+
align-items: var(--ui-align-sm, var(--ui-align, stretch));
|
|
838
|
+
justify-content: var(--ui-justify-sm, var(--ui-justify, flex-start));
|
|
839
|
+
}
|
|
840
|
+
[data-ui-grid] {
|
|
841
|
+
grid-template-columns: var(--ui-cols-sm, var(--ui-cols, repeat(1, minmax(0, 1fr))));
|
|
842
|
+
gap: calc(var(--spacing) * var(--ui-gap-sm, var(--ui-gap, 4)));
|
|
843
|
+
}
|
|
844
|
+
[data-ui-span] {
|
|
845
|
+
grid-column: span min(var(--ui-span-sm, var(--ui-span, 1)), var(--ui-cols-count, 12)) / span min(var(--ui-span-sm, var(--ui-span, 1)), var(--ui-cols-count, 12));
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
@media (min-width: 48rem) {
|
|
850
|
+
[data-ui-stack] {
|
|
851
|
+
flex-direction: var(--ui-dir-md, var(--ui-dir-sm, var(--ui-dir, column)));
|
|
852
|
+
gap: calc(var(--spacing) * var(--ui-gap-md, var(--ui-gap-sm, var(--ui-gap, 4))));
|
|
853
|
+
align-items: var(--ui-align-md, var(--ui-align-sm, var(--ui-align, stretch)));
|
|
854
|
+
justify-content: var(--ui-justify-md, var(--ui-justify-sm, var(--ui-justify, flex-start)));
|
|
855
|
+
}
|
|
856
|
+
[data-ui-grid] {
|
|
857
|
+
grid-template-columns: var(--ui-cols-md, var(--ui-cols-sm, var(--ui-cols, repeat(1, minmax(0, 1fr)))));
|
|
858
|
+
gap: calc(var(--spacing) * var(--ui-gap-md, var(--ui-gap-sm, var(--ui-gap, 4))));
|
|
859
|
+
}
|
|
860
|
+
[data-ui-span] {
|
|
861
|
+
grid-column: span min(var(--ui-span-md, var(--ui-span-sm, var(--ui-span, 1))), var(--ui-cols-count, 12)) / span min(var(--ui-span-md, var(--ui-span-sm, var(--ui-span, 1))), var(--ui-cols-count, 12));
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
@media (min-width: 64rem) {
|
|
866
|
+
[data-ui-stack] {
|
|
867
|
+
flex-direction: var(--ui-dir-lg, var(--ui-dir-md, var(--ui-dir-sm, var(--ui-dir, column))));
|
|
868
|
+
gap: calc(var(--spacing) * var(--ui-gap-lg, var(--ui-gap-md, var(--ui-gap-sm, var(--ui-gap, 4)))));
|
|
869
|
+
align-items: var(--ui-align-lg, var(--ui-align-md, var(--ui-align-sm, var(--ui-align, stretch))));
|
|
870
|
+
justify-content: var(--ui-justify-lg, var(--ui-justify-md, var(--ui-justify-sm, var(--ui-justify, flex-start))));
|
|
871
|
+
}
|
|
872
|
+
[data-ui-grid] {
|
|
873
|
+
grid-template-columns: var(--ui-cols-lg, var(--ui-cols-md, var(--ui-cols-sm, var(--ui-cols, repeat(1, minmax(0, 1fr))))));
|
|
874
|
+
gap: calc(var(--spacing) * var(--ui-gap-lg, var(--ui-gap-md, var(--ui-gap-sm, var(--ui-gap, 4)))));
|
|
875
|
+
}
|
|
876
|
+
[data-ui-span] {
|
|
877
|
+
grid-column: span min(var(--ui-span-lg, var(--ui-span-md, var(--ui-span-sm, var(--ui-span, 1)))), var(--ui-cols-count, 12)) / span min(var(--ui-span-lg, var(--ui-span-md, var(--ui-span-sm, var(--ui-span, 1)))), var(--ui-cols-count, 12));
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
/* Hero: drifting aurora clouds, an endless logo strip, and a gentle float. */
|
|
882
|
+
@keyframes ui-aurora {
|
|
883
|
+
0% {
|
|
884
|
+
transform: translate3d(0, 0, 0) scale(1);
|
|
885
|
+
}
|
|
886
|
+
33% {
|
|
887
|
+
transform: translate3d(6%, -4%, 0) scale(1.12);
|
|
888
|
+
}
|
|
889
|
+
66% {
|
|
890
|
+
transform: translate3d(-5%, 5%, 0) scale(0.95);
|
|
891
|
+
}
|
|
892
|
+
100% {
|
|
893
|
+
transform: translate3d(0, 0, 0) scale(1);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
@keyframes ui-marquee {
|
|
897
|
+
to {
|
|
898
|
+
transform: translateX(-50%);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
@keyframes ui-float {
|
|
902
|
+
0%,
|
|
903
|
+
100% {
|
|
904
|
+
transform: translateY(0);
|
|
905
|
+
}
|
|
906
|
+
50% {
|
|
907
|
+
transform: translateY(-10px);
|
|
908
|
+
}
|
|
909
|
+
}
|