reend-components 1.0.0 → 1.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.
- package/README.md +172 -98
- package/dist/bin/cli.cjs +533 -229
- package/dist/lib/index.cjs +4 -1
- package/dist/lib/index.cjs.map +1 -1
- package/dist/lib/index.d.ts +574 -19
- package/dist/lib/index.mjs +4528 -1404
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/style.css +1 -1
- package/dist/tailwind/index.cjs +492 -0
- package/dist/tailwind/index.mjs +462 -0
- package/package.json +27 -8
- package/src/styles/utilities.css +580 -0
- package/src/styles/variables.css +250 -14
- package/src/tailwind-preset.ts +193 -15
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2
|
+
ReEnd-Components CSS Utilities
|
|
3
|
+
Exported to npm via dist/lib/style.css (imported by src/components/ui/index.ts)
|
|
4
|
+
Design tokens live in variables.css — this file contains COMPONENT + ANIMATION utilities.
|
|
5
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
6
|
+
|
|
7
|
+
/* ═══ CLIP-PATH ENDFIELD SIGNATURE ═══ */
|
|
8
|
+
.clip-corner {
|
|
9
|
+
clip-path: polygon(
|
|
10
|
+
0 0,
|
|
11
|
+
calc(100% - 12px) 0,
|
|
12
|
+
100% 12px,
|
|
13
|
+
100% 100%,
|
|
14
|
+
12px 100%,
|
|
15
|
+
0 calc(100% - 12px)
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
.clip-corner-sm {
|
|
19
|
+
clip-path: polygon(
|
|
20
|
+
0 0,
|
|
21
|
+
calc(100% - 8px) 0,
|
|
22
|
+
100% 8px,
|
|
23
|
+
100% 100%,
|
|
24
|
+
8px 100%,
|
|
25
|
+
0 calc(100% - 8px)
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
.clip-corner-lg {
|
|
29
|
+
clip-path: polygon(
|
|
30
|
+
0 0,
|
|
31
|
+
calc(100% - 16px) 0,
|
|
32
|
+
100% 16px,
|
|
33
|
+
100% 100%,
|
|
34
|
+
16px 100%,
|
|
35
|
+
0 calc(100% - 16px)
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* ═══ TYPOGRAPHY CLASSES ═══ */
|
|
40
|
+
.font-display {
|
|
41
|
+
font-family: "Orbitron", monospace;
|
|
42
|
+
}
|
|
43
|
+
.font-ui {
|
|
44
|
+
font-family: "Orbitron", monospace;
|
|
45
|
+
}
|
|
46
|
+
.font-mono {
|
|
47
|
+
font-family: "JetBrains Mono", "Courier New", monospace;
|
|
48
|
+
}
|
|
49
|
+
.font-body {
|
|
50
|
+
font-family: "Source Han Sans", "Noto Sans SC", "Inter", sans-serif;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* ═══ CORNER BRACKETS — ENDFIELD SIGNATURE ═══ */
|
|
54
|
+
.corner-brackets {
|
|
55
|
+
position: relative;
|
|
56
|
+
}
|
|
57
|
+
.corner-brackets::before,
|
|
58
|
+
.corner-brackets::after {
|
|
59
|
+
content: "";
|
|
60
|
+
position: absolute;
|
|
61
|
+
width: 24px;
|
|
62
|
+
height: 24px;
|
|
63
|
+
pointer-events: none;
|
|
64
|
+
}
|
|
65
|
+
.corner-brackets::before {
|
|
66
|
+
top: -1px;
|
|
67
|
+
left: -1px;
|
|
68
|
+
border-top: 2px solid hsl(var(--primary) / 0.4);
|
|
69
|
+
border-left: 2px solid hsl(var(--primary) / 0.4);
|
|
70
|
+
}
|
|
71
|
+
.corner-brackets::after {
|
|
72
|
+
bottom: -1px;
|
|
73
|
+
right: -1px;
|
|
74
|
+
border-bottom: 2px solid hsl(var(--primary) / 0.4);
|
|
75
|
+
border-right: 2px solid hsl(var(--primary) / 0.4);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* ═══ SCANLINE OVERLAY ═══ */
|
|
79
|
+
.scanline-overlay {
|
|
80
|
+
position: relative;
|
|
81
|
+
}
|
|
82
|
+
.scanline-overlay::after {
|
|
83
|
+
content: "";
|
|
84
|
+
position: absolute;
|
|
85
|
+
inset: 0;
|
|
86
|
+
background: repeating-linear-gradient(
|
|
87
|
+
0deg,
|
|
88
|
+
transparent,
|
|
89
|
+
transparent 2px,
|
|
90
|
+
rgba(255, 255, 255, 0.015) 2px,
|
|
91
|
+
rgba(255, 255, 255, 0.015) 4px
|
|
92
|
+
);
|
|
93
|
+
pointer-events: none;
|
|
94
|
+
}
|
|
95
|
+
.light .scanline-overlay::after {
|
|
96
|
+
background: repeating-linear-gradient(
|
|
97
|
+
0deg,
|
|
98
|
+
transparent,
|
|
99
|
+
transparent 2px,
|
|
100
|
+
rgba(0, 0, 0, 0.04) 2px,
|
|
101
|
+
rgba(0, 0, 0, 0.04) 4px
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* ═══ GLOW EFFECTS ═══ */
|
|
106
|
+
.glow-yellow {
|
|
107
|
+
box-shadow: 0 0 20px hsl(var(--primary) / 0.2);
|
|
108
|
+
}
|
|
109
|
+
.glow-yellow-strong {
|
|
110
|
+
box-shadow: 0 0 40px hsl(var(--primary) / 0.3);
|
|
111
|
+
}
|
|
112
|
+
.text-glow-yellow {
|
|
113
|
+
text-shadow: 0 0 20px hsl(var(--primary) / 0.3);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* ═══ GRADIENT LINE ═══ */
|
|
117
|
+
.gradient-line-h {
|
|
118
|
+
height: 1px;
|
|
119
|
+
background: linear-gradient(
|
|
120
|
+
90deg,
|
|
121
|
+
transparent 0%,
|
|
122
|
+
hsl(var(--primary)) 50%,
|
|
123
|
+
transparent 100%
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
.gradient-line-v {
|
|
127
|
+
width: 1px;
|
|
128
|
+
background: linear-gradient(
|
|
129
|
+
180deg,
|
|
130
|
+
transparent 0%,
|
|
131
|
+
hsl(var(--primary)) 50%,
|
|
132
|
+
transparent 100%
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* ═══ DIAMOND MARKER ═══ */
|
|
137
|
+
.diamond-marker::before {
|
|
138
|
+
content: "◆";
|
|
139
|
+
color: hsl(var(--primary));
|
|
140
|
+
margin-right: 8px;
|
|
141
|
+
font-size: 8px;
|
|
142
|
+
vertical-align: middle;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* ═══ GLASSMORPHISM ═══ */
|
|
146
|
+
.panel-glass {
|
|
147
|
+
background: rgba(20, 20, 20, 0.55);
|
|
148
|
+
backdrop-filter: blur(16px);
|
|
149
|
+
-webkit-backdrop-filter: blur(16px);
|
|
150
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
151
|
+
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
|
|
152
|
+
color: hsl(var(--foreground));
|
|
153
|
+
}
|
|
154
|
+
.panel-glass-light {
|
|
155
|
+
background: rgba(20, 20, 20, 0.35);
|
|
156
|
+
backdrop-filter: blur(12px);
|
|
157
|
+
-webkit-backdrop-filter: blur(12px);
|
|
158
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
159
|
+
color: hsl(var(--foreground));
|
|
160
|
+
}
|
|
161
|
+
.panel-glass-dark {
|
|
162
|
+
background: rgba(10, 10, 10, 0.65);
|
|
163
|
+
backdrop-filter: blur(12px);
|
|
164
|
+
-webkit-backdrop-filter: blur(12px);
|
|
165
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
166
|
+
color: #f0f0f0;
|
|
167
|
+
}
|
|
168
|
+
.light .panel-glass {
|
|
169
|
+
background: rgba(255, 255, 255, 0.75);
|
|
170
|
+
border: 1px solid rgba(0, 0, 0, 0.08);
|
|
171
|
+
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
|
|
172
|
+
color: hsl(var(--foreground));
|
|
173
|
+
}
|
|
174
|
+
.light .panel-glass-light {
|
|
175
|
+
background: rgba(255, 255, 255, 0.55);
|
|
176
|
+
border: 1px solid rgba(0, 0, 0, 0.06);
|
|
177
|
+
color: hsl(var(--foreground));
|
|
178
|
+
}
|
|
179
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
180
|
+
.panel-glass,
|
|
181
|
+
.panel-glass-light,
|
|
182
|
+
.panel-glass-dark {
|
|
183
|
+
background: hsl(var(--surface-2));
|
|
184
|
+
backdrop-filter: none;
|
|
185
|
+
-webkit-backdrop-filter: none;
|
|
186
|
+
}
|
|
187
|
+
.light .panel-glass,
|
|
188
|
+
.light .panel-glass-light {
|
|
189
|
+
background: hsl(var(--surface-2));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* ═══ BACKGROUND DECORATIONS ═══ */
|
|
194
|
+
.bg-grid-pattern {
|
|
195
|
+
background-image:
|
|
196
|
+
linear-gradient(var(--bg-grid-color) 1px, transparent 1px),
|
|
197
|
+
linear-gradient(90deg, var(--bg-grid-color) 1px, transparent 1px);
|
|
198
|
+
background-size: var(--bg-grid-size) var(--bg-grid-size);
|
|
199
|
+
}
|
|
200
|
+
.bg-radial-glow {
|
|
201
|
+
background-image: var(--bg-glow-primary);
|
|
202
|
+
background-repeat: no-repeat;
|
|
203
|
+
background-position: center top;
|
|
204
|
+
background-size: 100% 600px;
|
|
205
|
+
}
|
|
206
|
+
.bg-radial-glow-lime {
|
|
207
|
+
background-image: var(--bg-glow-lime);
|
|
208
|
+
background-repeat: no-repeat;
|
|
209
|
+
background-position: center top;
|
|
210
|
+
background-size: 100% 600px;
|
|
211
|
+
}
|
|
212
|
+
.bg-diagonal-lines {
|
|
213
|
+
background-image: var(--bg-diagonal);
|
|
214
|
+
}
|
|
215
|
+
.bg-noise-overlay {
|
|
216
|
+
position: relative;
|
|
217
|
+
}
|
|
218
|
+
.bg-noise-overlay::after {
|
|
219
|
+
content: "";
|
|
220
|
+
position: absolute;
|
|
221
|
+
inset: 0;
|
|
222
|
+
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.025'/%3E%3C/svg%3E");
|
|
223
|
+
opacity: 0.025;
|
|
224
|
+
pointer-events: none;
|
|
225
|
+
z-index: 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* ═══ TYPOGRAPHY UTILITIES ═══ */
|
|
229
|
+
.ef-heading {
|
|
230
|
+
font-family: "Orbitron", monospace;
|
|
231
|
+
line-height: var(--lh-heading, 1);
|
|
232
|
+
text-transform: uppercase;
|
|
233
|
+
letter-spacing: 0.05em;
|
|
234
|
+
}
|
|
235
|
+
.ef-display {
|
|
236
|
+
font-family: "Orbitron", monospace;
|
|
237
|
+
line-height: var(--lh-display, 0.95);
|
|
238
|
+
text-transform: uppercase;
|
|
239
|
+
letter-spacing: 0.08em;
|
|
240
|
+
font-weight: 700;
|
|
241
|
+
}
|
|
242
|
+
.ef-overline {
|
|
243
|
+
font-family: "JetBrains Mono", monospace;
|
|
244
|
+
font-size: var(--type-overline-size, 11px);
|
|
245
|
+
text-transform: uppercase;
|
|
246
|
+
letter-spacing: 0.12em;
|
|
247
|
+
color: hsl(var(--muted-foreground));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* ═══ GLOW SHADOW UTILITIES ═══ */
|
|
251
|
+
.shadow-glow-sm {
|
|
252
|
+
box-shadow: var(--shadow-glow-sm);
|
|
253
|
+
}
|
|
254
|
+
.shadow-glow-md {
|
|
255
|
+
box-shadow: var(--shadow-glow-md);
|
|
256
|
+
}
|
|
257
|
+
.shadow-glow-lg {
|
|
258
|
+
box-shadow: var(--shadow-glow-lg);
|
|
259
|
+
}
|
|
260
|
+
.shadow-accent {
|
|
261
|
+
box-shadow: var(--shadow-accent);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* ═══ SEARCH HIGHLIGHT ═══ */
|
|
265
|
+
mark,
|
|
266
|
+
.search-highlight {
|
|
267
|
+
background: rgba(255, 212, 41, 0.2);
|
|
268
|
+
color: hsl(var(--primary));
|
|
269
|
+
border-radius: 0;
|
|
270
|
+
padding: 0 2px;
|
|
271
|
+
}
|
|
272
|
+
.search-result-category {
|
|
273
|
+
font-family: 'Orbitron', monospace;
|
|
274
|
+
font-size: 10px;
|
|
275
|
+
letter-spacing: 0.1em;
|
|
276
|
+
text-transform: uppercase;
|
|
277
|
+
color: hsl(var(--muted-foreground));
|
|
278
|
+
}
|
|
279
|
+
.search-result-title {
|
|
280
|
+
font-family: 'Bender', sans-serif;
|
|
281
|
+
font-size: 16px;
|
|
282
|
+
font-weight: 600;
|
|
283
|
+
color: hsl(var(--foreground));
|
|
284
|
+
}
|
|
285
|
+
.search-result-excerpt {
|
|
286
|
+
font-size: 14px;
|
|
287
|
+
color: hsl(var(--muted-foreground));
|
|
288
|
+
line-height: 1.5;
|
|
289
|
+
}
|
|
290
|
+
.light mark,
|
|
291
|
+
.light .search-highlight {
|
|
292
|
+
background: rgba(255, 180, 0, 0.15);
|
|
293
|
+
color: hsl(var(--primary));
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* ═══ SPOILER ═══ */
|
|
297
|
+
.spoiler {
|
|
298
|
+
background: hsl(var(--foreground));
|
|
299
|
+
color: transparent;
|
|
300
|
+
cursor: pointer;
|
|
301
|
+
user-select: none;
|
|
302
|
+
transition: all 0.2s ease;
|
|
303
|
+
}
|
|
304
|
+
.spoiler:hover,
|
|
305
|
+
.spoiler:focus,
|
|
306
|
+
.spoiler[data-revealed="true"] {
|
|
307
|
+
background: transparent;
|
|
308
|
+
color: inherit;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* ═══ RIPPLE EFFECT ═══ */
|
|
312
|
+
.ripple {
|
|
313
|
+
position: relative;
|
|
314
|
+
overflow: hidden;
|
|
315
|
+
}
|
|
316
|
+
.ripple::after {
|
|
317
|
+
content: "";
|
|
318
|
+
position: absolute;
|
|
319
|
+
inset: 0;
|
|
320
|
+
background: radial-gradient(circle, rgba(255, 212, 41, 0.15) 0%, transparent 60%);
|
|
321
|
+
opacity: 0;
|
|
322
|
+
transform: scale(0);
|
|
323
|
+
transition: transform 0.4s ease, opacity 0.4s ease;
|
|
324
|
+
}
|
|
325
|
+
.ripple:active::after {
|
|
326
|
+
transform: scale(2.5);
|
|
327
|
+
opacity: 1;
|
|
328
|
+
transition: transform 0s, opacity 0s;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* ═══ INLINE CODE (prose) ═══ */
|
|
332
|
+
:not(pre) > code {
|
|
333
|
+
background: #1a1a1a;
|
|
334
|
+
padding: 2px 6px;
|
|
335
|
+
font-family: "JetBrains Mono", monospace;
|
|
336
|
+
font-size: 0.875em;
|
|
337
|
+
color: hsl(var(--ef-yellow));
|
|
338
|
+
border: 1px solid hsl(var(--border));
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* ═══ PRINT UTILITIES ═══ */
|
|
342
|
+
@media print {
|
|
343
|
+
.print-hidden {
|
|
344
|
+
display: none !important;
|
|
345
|
+
}
|
|
346
|
+
.print-only {
|
|
347
|
+
display: block !important;
|
|
348
|
+
}
|
|
349
|
+
.print-break-before {
|
|
350
|
+
page-break-before: always;
|
|
351
|
+
}
|
|
352
|
+
.print-break-after {
|
|
353
|
+
page-break-after: always;
|
|
354
|
+
}
|
|
355
|
+
.print-no-break {
|
|
356
|
+
page-break-inside: avoid;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/* ═══ POINTER / TOUCH ═══ */
|
|
361
|
+
@media (pointer: coarse) {
|
|
362
|
+
.touch-target {
|
|
363
|
+
min-width: 44px;
|
|
364
|
+
min-height: 44px;
|
|
365
|
+
}
|
|
366
|
+
[role="dialog"][data-sheet="bottom"] {
|
|
367
|
+
padding-bottom: calc(var(--safe-bottom) + 12px);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* ═══ KEYFRAME ANIMATIONS ═══ */
|
|
372
|
+
@keyframes fadeIn {
|
|
373
|
+
from { opacity: 0; }
|
|
374
|
+
to { opacity: 1; }
|
|
375
|
+
}
|
|
376
|
+
@keyframes fadeOut {
|
|
377
|
+
from { opacity: 1; }
|
|
378
|
+
to { opacity: 0; }
|
|
379
|
+
}
|
|
380
|
+
@keyframes fadeInUp {
|
|
381
|
+
from { opacity: 0; transform: translateY(16px); }
|
|
382
|
+
to { opacity: 1; transform: translateY(0); }
|
|
383
|
+
}
|
|
384
|
+
@keyframes fadeInDown {
|
|
385
|
+
from { opacity: 0; transform: translateY(-16px); }
|
|
386
|
+
to { opacity: 1; transform: translateY(0); }
|
|
387
|
+
}
|
|
388
|
+
@keyframes slideInRight {
|
|
389
|
+
from { opacity: 0; transform: translateX(-24px); }
|
|
390
|
+
to { opacity: 1; transform: translateX(0); }
|
|
391
|
+
}
|
|
392
|
+
@keyframes scaleIn {
|
|
393
|
+
from { opacity: 0; transform: scale(0.92); }
|
|
394
|
+
to { opacity: 1; transform: scale(1); }
|
|
395
|
+
}
|
|
396
|
+
@keyframes rotate {
|
|
397
|
+
from { transform: rotate(0deg); }
|
|
398
|
+
to { transform: rotate(360deg); }
|
|
399
|
+
}
|
|
400
|
+
@keyframes loadingDot {
|
|
401
|
+
0%, 80%, 100% { opacity: 0.2; transform: scale(0.8); }
|
|
402
|
+
40% { opacity: 1; transform: scale(1); }
|
|
403
|
+
}
|
|
404
|
+
@keyframes glitch {
|
|
405
|
+
0%, 90%, 100% { transform: translate(0); }
|
|
406
|
+
92% { transform: translate(-2px, 1px); }
|
|
407
|
+
94% { transform: translate(2px, -1px); }
|
|
408
|
+
96% { transform: translate(-1px, -1px); }
|
|
409
|
+
98% { transform: translate(1px, 1px); }
|
|
410
|
+
}
|
|
411
|
+
@keyframes cursorBlink {
|
|
412
|
+
0%, 50% { opacity: 1; }
|
|
413
|
+
51%, 100% { opacity: 0; }
|
|
414
|
+
}
|
|
415
|
+
@keyframes pulseGlow {
|
|
416
|
+
0%, 100% { box-shadow: 0 0 8px hsl(var(--primary) / 0.2); }
|
|
417
|
+
50% { box-shadow: 0 0 20px hsl(var(--primary) / 0.4); }
|
|
418
|
+
}
|
|
419
|
+
@keyframes skeletonShimmer {
|
|
420
|
+
0% { background-position: -200% 0; }
|
|
421
|
+
100% { background-position: 200% 0; }
|
|
422
|
+
}
|
|
423
|
+
@keyframes slideDown {
|
|
424
|
+
from { transform: scaleY(0); opacity: 0; }
|
|
425
|
+
to { transform: scaleY(1); opacity: 1; }
|
|
426
|
+
}
|
|
427
|
+
@keyframes diamondSpin {
|
|
428
|
+
from { transform: rotate(0deg); }
|
|
429
|
+
to { transform: rotate(360deg); }
|
|
430
|
+
}
|
|
431
|
+
@keyframes switchThumbSpin {
|
|
432
|
+
from { transform: rotate(0deg); }
|
|
433
|
+
to { transform: rotate(360deg); }
|
|
434
|
+
}
|
|
435
|
+
@keyframes shrink {
|
|
436
|
+
from { transform: scaleX(1); }
|
|
437
|
+
to { transform: scaleX(0); }
|
|
438
|
+
}
|
|
439
|
+
@keyframes countUp {
|
|
440
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
441
|
+
to { opacity: 1; transform: translateY(0); }
|
|
442
|
+
}
|
|
443
|
+
@keyframes dialog-in {
|
|
444
|
+
from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
|
|
445
|
+
to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
|
|
446
|
+
}
|
|
447
|
+
@keyframes accordion-down {
|
|
448
|
+
from { height: 0; }
|
|
449
|
+
to { height: var(--radix-accordion-content-height); }
|
|
450
|
+
}
|
|
451
|
+
@keyframes accordion-up {
|
|
452
|
+
from { height: var(--radix-accordion-content-height); }
|
|
453
|
+
to { height: 0; }
|
|
454
|
+
}
|
|
455
|
+
@keyframes shake {
|
|
456
|
+
0%, 100% { transform: translateX(0); }
|
|
457
|
+
20%, 60% { transform: translateX(-4px); }
|
|
458
|
+
40%, 80% { transform: translateX(4px); }
|
|
459
|
+
}
|
|
460
|
+
@keyframes slideUp {
|
|
461
|
+
from { transform: translateY(100%); opacity: 0; }
|
|
462
|
+
to { transform: translateY(0); opacity: 1; }
|
|
463
|
+
}
|
|
464
|
+
@keyframes particleDrift {
|
|
465
|
+
0% { transform: translate(0, 0); }
|
|
466
|
+
33% { transform: translate(2px, -3px); }
|
|
467
|
+
66% { transform: translate(-2px, 2px); }
|
|
468
|
+
100% { transform: translate(0, 0); }
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/* ═══ ANIMATION UTILITY CLASSES ═══ */
|
|
472
|
+
.animate-fade-in { animation: fadeIn 0.3s ease forwards; }
|
|
473
|
+
.animate-fade-in-up { animation: fadeInUp 0.4s var(--ease-default, ease) forwards; }
|
|
474
|
+
.animate-fade-in-down { animation: fadeInDown 0.4s var(--ease-default, ease) forwards; }
|
|
475
|
+
.animate-slide-in-right { animation: slideInRight 0.4s var(--ease-default, ease) forwards; }
|
|
476
|
+
.animate-scale-in { animation: scaleIn 0.3s var(--ease-default, ease) forwards; }
|
|
477
|
+
.animate-rotate { animation: rotate 1s linear infinite; }
|
|
478
|
+
.animate-loading-dot { animation: loadingDot 1.4s ease-in-out infinite both; }
|
|
479
|
+
.animate-glitch { animation: glitch 3s infinite; }
|
|
480
|
+
.animate-cursor-blink { animation: cursorBlink 1s step-end infinite; }
|
|
481
|
+
.animate-pulse-glow { animation: pulseGlow 2s ease-in-out infinite; }
|
|
482
|
+
.animate-skeleton {
|
|
483
|
+
background: linear-gradient(
|
|
484
|
+
90deg,
|
|
485
|
+
hsl(var(--surface-1)) 0%,
|
|
486
|
+
hsl(var(--surface-2)) 50%,
|
|
487
|
+
hsl(var(--surface-1)) 100%
|
|
488
|
+
);
|
|
489
|
+
background-size: 200% 100%;
|
|
490
|
+
animation: skeletonShimmer 1.5s infinite;
|
|
491
|
+
}
|
|
492
|
+
.animate-slide-down { animation: slideDown 0.3s ease forwards; transform-origin: top; overflow: hidden; }
|
|
493
|
+
.animate-diamond-spin { animation: diamondSpin 0.8s linear infinite; }
|
|
494
|
+
.animate-switch-spin { animation: switchThumbSpin 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both; }
|
|
495
|
+
.animate-shrink { animation: shrink 5s linear forwards; transform-origin: left; }
|
|
496
|
+
.animate-dialog-in { animation: dialog-in 0.3s ease forwards; }
|
|
497
|
+
.animate-accordion-down { animation: accordion-down 0.25s cubic-bezier(0.16, 1, 0.3, 1); }
|
|
498
|
+
.animate-accordion-up { animation: accordion-up 0.2s cubic-bezier(0.7, 0, 1, 1); }
|
|
499
|
+
.animate-shake { animation: shake 0.4s var(--ease-sharp, cubic-bezier(0.4, 0, 0.2, 1)); }
|
|
500
|
+
.animate-slide-up { animation: slideUp 0.3s var(--ease-sharp, cubic-bezier(0.4, 0, 0.2, 1)) forwards; }
|
|
501
|
+
.animate-particle-drift { animation: particleDrift var(--particle-dur, 3s) ease-in-out infinite; }
|
|
502
|
+
|
|
503
|
+
/* ═══ REDUCED MOTION ═══ */
|
|
504
|
+
@media (prefers-reduced-motion: reduce) {
|
|
505
|
+
*,
|
|
506
|
+
*::before,
|
|
507
|
+
*::after {
|
|
508
|
+
animation-duration: 0.01ms !important;
|
|
509
|
+
transition-duration: 0.01ms !important;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/* ═══ VIEW TRANSITIONS API ═══ */
|
|
514
|
+
::view-transition-old(root) {
|
|
515
|
+
animation: fadeOut 0.2s var(--ease-sharp, ease) forwards;
|
|
516
|
+
}
|
|
517
|
+
::view-transition-new(root) {
|
|
518
|
+
animation: fadeIn 0.3s var(--ease-default, ease) forwards;
|
|
519
|
+
}
|
|
520
|
+
@media (prefers-reduced-motion: reduce) {
|
|
521
|
+
::view-transition-old(root),
|
|
522
|
+
::view-transition-new(root) {
|
|
523
|
+
animation: none;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/* ═══ SCROLL BEHAVIOR (Section 101) ═══ */
|
|
528
|
+
.scrollable-panel {
|
|
529
|
+
overscroll-behavior: contain;
|
|
530
|
+
}
|
|
531
|
+
body.no-pull-refresh {
|
|
532
|
+
overscroll-behavior-y: none;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/* ═══ AUTOSAVE INDICATOR (Section 103) ═══ */
|
|
536
|
+
.autosave-indicator {
|
|
537
|
+
font-family: 'Orbitron', monospace;
|
|
538
|
+
font-size: 11px;
|
|
539
|
+
display: flex;
|
|
540
|
+
align-items: center;
|
|
541
|
+
gap: 6px;
|
|
542
|
+
}
|
|
543
|
+
.autosave-saved { color: #2ED573; }
|
|
544
|
+
.autosave-saving { color: #999; }
|
|
545
|
+
.autosave-unsaved { color: #FFA502; }
|
|
546
|
+
.autosave-error { color: #FF4757; }
|
|
547
|
+
|
|
548
|
+
/* ═══ POINTER TYPE — fine (mouse/trackpad) (Section 107) ═══ */
|
|
549
|
+
@media (hover: hover) and (pointer: fine) {
|
|
550
|
+
.btn { min-height: 36px; }
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/* ═══ HIGH CONTRAST MODE (Section 107) ═══ */
|
|
554
|
+
@media (prefers-contrast: more) {
|
|
555
|
+
:root {
|
|
556
|
+
--border-subtle: rgba(255, 255, 255, 0.2);
|
|
557
|
+
--border-default: rgba(255, 255, 255, 0.4);
|
|
558
|
+
--text-muted: #BBBBBB;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/* ═══ FORCED COLORS / WINDOWS HIGH CONTRAST (Section 107) ═══ */
|
|
563
|
+
@media (forced-colors: active) {
|
|
564
|
+
.btn-primary,
|
|
565
|
+
[class*="btn-"] {
|
|
566
|
+
background: ButtonFace;
|
|
567
|
+
color: ButtonText;
|
|
568
|
+
border: 2px solid ButtonText;
|
|
569
|
+
forced-color-adjust: none;
|
|
570
|
+
}
|
|
571
|
+
.card,
|
|
572
|
+
[class*="border-border"] {
|
|
573
|
+
border: 1px solid CanvasText;
|
|
574
|
+
}
|
|
575
|
+
/* clip-path is invisible in forced-colors — fall back to border radius */
|
|
576
|
+
[class*="clip-corner"] {
|
|
577
|
+
clip-path: none;
|
|
578
|
+
border-radius: 2px;
|
|
579
|
+
}
|
|
580
|
+
}
|