@whykusanagi/corrupted-theme 0.1.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,649 @@
1
+ /* animations.css — Keyframe animations and transition utilities */
2
+
3
+ /* ========== FADE ANIMATIONS ========== */
4
+
5
+ @keyframes fadeIn {
6
+ 0% {
7
+ opacity: 0;
8
+ }
9
+ 100% {
10
+ opacity: 1;
11
+ }
12
+ }
13
+
14
+ @keyframes fadeOut {
15
+ 0% {
16
+ opacity: 1;
17
+ }
18
+ 100% {
19
+ opacity: 0;
20
+ }
21
+ }
22
+
23
+ .fade-in {
24
+ animation: fadeIn 0.5s ease-in-out;
25
+ }
26
+
27
+ .fade-in-slow {
28
+ animation: fadeIn 1s ease-in-out;
29
+ }
30
+
31
+ .fade-in-fast {
32
+ animation: fadeIn 0.3s ease-in-out;
33
+ }
34
+
35
+ /* ========== SLIDE ANIMATIONS ========== */
36
+
37
+ @keyframes slideIn {
38
+ 0% {
39
+ transform: translateY(40px);
40
+ opacity: 0;
41
+ }
42
+ 100% {
43
+ transform: translateY(0);
44
+ opacity: 1;
45
+ }
46
+ }
47
+
48
+ @keyframes slideOut {
49
+ 0% {
50
+ transform: translateY(0);
51
+ opacity: 1;
52
+ }
53
+ 100% {
54
+ transform: translateY(40px);
55
+ opacity: 0;
56
+ }
57
+ }
58
+
59
+ @keyframes slideInLeft {
60
+ 0% {
61
+ transform: translateX(-40px);
62
+ opacity: 0;
63
+ }
64
+ 100% {
65
+ transform: translateX(0);
66
+ opacity: 1;
67
+ }
68
+ }
69
+
70
+ @keyframes slideInRight {
71
+ 0% {
72
+ transform: translateX(40px);
73
+ opacity: 0;
74
+ }
75
+ 100% {
76
+ transform: translateX(0);
77
+ opacity: 1;
78
+ }
79
+ }
80
+
81
+ .slide-in {
82
+ animation: slideIn 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
83
+ }
84
+
85
+ .slide-in-slow {
86
+ animation: slideIn 1.2s cubic-bezier(0.34, 1.56, 0.64, 1);
87
+ }
88
+
89
+ .slide-in-left {
90
+ animation: slideInLeft 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
91
+ }
92
+
93
+ .slide-in-right {
94
+ animation: slideInRight 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
95
+ }
96
+
97
+ /* ========== SCALE ANIMATIONS ========== */
98
+
99
+ @keyframes scaleIn {
100
+ 0% {
101
+ transform: scale(0.95);
102
+ opacity: 0;
103
+ }
104
+ 100% {
105
+ transform: scale(1);
106
+ opacity: 1;
107
+ }
108
+ }
109
+
110
+ @keyframes scaleUp {
111
+ 0% {
112
+ transform: scale(1);
113
+ }
114
+ 100% {
115
+ transform: scale(1.05);
116
+ }
117
+ }
118
+
119
+ .scale-in {
120
+ animation: scaleIn 0.4s ease-out;
121
+ }
122
+
123
+ .scale-up:hover {
124
+ animation: scaleUp 0.3s ease-out forwards;
125
+ }
126
+
127
+ /* ========== GLITCH ANIMATIONS ========== */
128
+ /* Character-level glitch effect for text */
129
+
130
+ @keyframes glitchShift1 {
131
+ 0% {
132
+ transform: translate(0px, 0px);
133
+ }
134
+ 20% {
135
+ transform: translate(-1px, 1px);
136
+ }
137
+ 40% {
138
+ transform: translate(-1px, -1px);
139
+ }
140
+ 60% {
141
+ transform: translate(1px, 1px);
142
+ }
143
+ 80% {
144
+ transform: translate(1px, -1px);
145
+ }
146
+ 100% {
147
+ transform: translate(0px, 0px);
148
+ }
149
+ }
150
+
151
+ @keyframes glitchShift2 {
152
+ 0% {
153
+ transform: translate(0px, 0px);
154
+ }
155
+ 25% {
156
+ transform: translate(1px, -1px);
157
+ }
158
+ 50% {
159
+ transform: translate(-1px, 1px);
160
+ }
161
+ 75% {
162
+ transform: translate(1px, 1px);
163
+ }
164
+ 100% {
165
+ transform: translate(0px, 0px);
166
+ }
167
+ }
168
+
169
+ .glitch-word {
170
+ position: relative;
171
+ display: inline-block;
172
+ color: var(--text);
173
+ transition: all 0.3s ease;
174
+ cursor: pointer;
175
+ }
176
+
177
+ .glitch-word::before,
178
+ .glitch-word::after {
179
+ content: attr(data-text);
180
+ position: absolute;
181
+ left: 0;
182
+ top: 0;
183
+ width: 100%;
184
+ height: 100%;
185
+ opacity: 0;
186
+ pointer-events: none;
187
+ white-space: nowrap;
188
+ }
189
+
190
+ .glitch-word::before {
191
+ color: var(--accent-light);
192
+ clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%);
193
+ z-index: -1;
194
+ }
195
+
196
+ .glitch-word::after {
197
+ color: var(--accent-dark);
198
+ clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%);
199
+ z-index: -2;
200
+ }
201
+
202
+ .glitch-word:hover {
203
+ color: var(--accent);
204
+ text-shadow: 0 0 4px var(--accent);
205
+ }
206
+
207
+ .glitch-word:hover::before {
208
+ opacity: 0.9;
209
+ animation: glitchShift1 0.1s infinite linear, dataCorrupt 0.3s infinite;
210
+ transform: translate(-2px, 0);
211
+ }
212
+
213
+ .glitch-word:hover::after {
214
+ opacity: 0.9;
215
+ animation: glitchShift2 0.15s infinite linear reverse, dataCorrupt 0.4s infinite reverse;
216
+ transform: translate(2px, 0);
217
+ }
218
+
219
+ /* Additional fragmentation effect */
220
+ .glitch-word:hover {
221
+ animation: glitch 0.2s infinite;
222
+ filter: blur(0.3px);
223
+ }
224
+
225
+ @keyframes textFragment {
226
+ 0%, 100% {
227
+ clip-path: inset(0 0 0 0);
228
+ transform: translate(0, 0);
229
+ }
230
+ 10% {
231
+ clip-path: inset(10% 5% 15% 0);
232
+ transform: translate(-1px, 1px);
233
+ }
234
+ 20% {
235
+ clip-path: inset(5% 10% 0 5%);
236
+ transform: translate(1px, -1px);
237
+ }
238
+ 30% {
239
+ clip-path: inset(15% 0 10% 10%);
240
+ transform: translate(-1px, -1px);
241
+ }
242
+ 40% {
243
+ clip-path: inset(0 15% 5% 0);
244
+ transform: translate(1px, 1px);
245
+ }
246
+ 50% {
247
+ clip-path: inset(8% 8% 8% 8%);
248
+ transform: translate(0, 0);
249
+ }
250
+ 60% {
251
+ clip-path: inset(12% 2% 18% 3%);
252
+ transform: translate(-2px, 1px);
253
+ }
254
+ 70% {
255
+ clip-path: inset(3% 12% 2% 18%);
256
+ transform: translate(2px, -1px);
257
+ }
258
+ 80% {
259
+ clip-path: inset(18% 3% 12% 2%);
260
+ transform: translate(-1px, -2px);
261
+ }
262
+ 90% {
263
+ clip-path: inset(2% 18% 3% 12%);
264
+ transform: translate(1px, 2px);
265
+ }
266
+ }
267
+
268
+ .glitch-word:hover::before {
269
+ animation: glitchShift1 0.1s infinite linear, textFragment 0.5s infinite;
270
+ }
271
+
272
+ .glitch-word:hover::after {
273
+ animation: glitchShift2 0.15s infinite linear reverse, textFragment 0.6s infinite reverse;
274
+ }
275
+
276
+ /* ========== CORRUPTED ANIMATION ========== */
277
+ /* Continuous corruption effect for text and elements */
278
+
279
+ @keyframes corrupt {
280
+ 0% {
281
+ filter: hue-rotate(0deg) brightness(1);
282
+ transform: translate(0, 0);
283
+ }
284
+ 10% {
285
+ filter: hue-rotate(90deg) brightness(1.1);
286
+ transform: translate(-1px, 1px);
287
+ }
288
+ 20% {
289
+ filter: hue-rotate(180deg) brightness(0.9);
290
+ transform: translate(1px, -1px);
291
+ }
292
+ 30% {
293
+ filter: hue-rotate(270deg) brightness(1.05);
294
+ transform: translate(-1px, -1px);
295
+ }
296
+ 40% {
297
+ filter: hue-rotate(360deg) brightness(0.95);
298
+ transform: translate(1px, 1px);
299
+ }
300
+ 50% {
301
+ filter: hue-rotate(0deg) brightness(1);
302
+ transform: translate(0, 0);
303
+ }
304
+ 60% {
305
+ filter: hue-rotate(-90deg) brightness(1.1);
306
+ transform: translate(1px, 1px);
307
+ }
308
+ 70% {
309
+ filter: hue-rotate(-180deg) brightness(0.9);
310
+ transform: translate(-1px, -1px);
311
+ }
312
+ 80% {
313
+ filter: hue-rotate(-270deg) brightness(1.05);
314
+ transform: translate(1px, -1px);
315
+ }
316
+ 90% {
317
+ filter: hue-rotate(-360deg) brightness(0.95);
318
+ transform: translate(-1px, 1px);
319
+ }
320
+ 100% {
321
+ filter: hue-rotate(0deg) brightness(1);
322
+ transform: translate(0, 0);
323
+ }
324
+ }
325
+
326
+ @keyframes corruptText {
327
+ 0%, 100% {
328
+ text-shadow:
329
+ 0 0 2px var(--accent),
330
+ 0 0 4px var(--accent),
331
+ 0 0 6px var(--accent),
332
+ 0 0 8px var(--accent-light);
333
+ filter: hue-rotate(0deg);
334
+ }
335
+ 25% {
336
+ text-shadow:
337
+ -1px 0 2px var(--accent-light),
338
+ 1px 0 4px var(--accent),
339
+ -2px 0 6px var(--accent-dark),
340
+ 2px 0 8px var(--accent);
341
+ filter: hue-rotate(90deg);
342
+ }
343
+ 50% {
344
+ text-shadow:
345
+ 0 -1px 2px var(--accent),
346
+ 0 1px 4px var(--accent-light),
347
+ 0 -2px 6px var(--accent-dark),
348
+ 0 2px 8px var(--accent);
349
+ filter: hue-rotate(180deg);
350
+ }
351
+ 75% {
352
+ text-shadow:
353
+ 1px 1px 2px var(--accent-light),
354
+ -1px -1px 4px var(--accent),
355
+ 2px 2px 6px var(--accent-dark),
356
+ -2px -2px 8px var(--accent);
357
+ filter: hue-rotate(270deg);
358
+ }
359
+ }
360
+
361
+ .corrupted {
362
+ animation: corrupt 3s ease-in-out infinite;
363
+ position: relative;
364
+ }
365
+
366
+ .corrupted-text {
367
+ animation: corruptText 2s ease-in-out infinite;
368
+ color: var(--accent);
369
+ font-weight: 600;
370
+ position: relative;
371
+ display: inline-block;
372
+ }
373
+
374
+ .corrupted-text::before,
375
+ .corrupted-text::after {
376
+ content: attr(data-text);
377
+ position: absolute;
378
+ left: 0;
379
+ top: 0;
380
+ width: 100%;
381
+ height: 100%;
382
+ opacity: 0.7;
383
+ pointer-events: none;
384
+ }
385
+
386
+ .corrupted-text::before {
387
+ color: var(--accent-light);
388
+ animation: glitchShift1 0.15s infinite linear;
389
+ z-index: -1;
390
+ clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%);
391
+ }
392
+
393
+ .corrupted-text::after {
394
+ color: var(--accent-dark);
395
+ animation: glitchShift2 0.2s infinite linear reverse;
396
+ z-index: -2;
397
+ clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%);
398
+ }
399
+
400
+ /* Enhanced on hover */
401
+ .corrupted-text:hover {
402
+ animation: corruptText 1s ease-in-out infinite;
403
+ }
404
+
405
+ /* Advanced glitch wrapper with scanlines + Japanese scatter */
406
+ .glitch-kanji {
407
+ position: relative;
408
+ display: inline-block;
409
+ background-image:
410
+ repeating-linear-gradient(
411
+ 0deg,
412
+ transparent,
413
+ transparent 2px,
414
+ rgba(217, 79, 144, 0.15) 2px,
415
+ rgba(217, 79, 144, 0.15) 3px
416
+ );
417
+ background-size: 100% 4px;
418
+ animation: scanlines 0.12s linear infinite;
419
+ padding: 0.1rem 0.25rem;
420
+ }
421
+
422
+ .glitch-kanji::before {
423
+ content: attr(data-jp);
424
+ position: absolute;
425
+ left: 50%;
426
+ top: 50%;
427
+ transform: translate(-50%, -50%);
428
+ font-size: 0.6em;
429
+ color: rgba(217, 79, 144, 0.45);
430
+ letter-spacing: 0.2em;
431
+ pointer-events: none;
432
+ opacity: 0;
433
+ mix-blend-mode: screen;
434
+ animation: japaneseScatter 2.5s ease-in-out infinite;
435
+ text-shadow:
436
+ 0 0 3px var(--accent),
437
+ 0 0 6px rgba(217, 79, 144, 0.8);
438
+ }
439
+
440
+ .glitch-kanji:hover::before {
441
+ animation-duration: 1.2s;
442
+ opacity: 0.9;
443
+ }
444
+
445
+ @keyframes scanlines {
446
+ 0% {
447
+ background-position: 0 0;
448
+ }
449
+ 100% {
450
+ background-position: 0 4px;
451
+ }
452
+ }
453
+
454
+ @keyframes japaneseScatter {
455
+ 0%, 100% {
456
+ opacity: 0;
457
+ transform: translate(-50%, -50%) scale(0.95);
458
+ }
459
+ 25% {
460
+ opacity: 0.4;
461
+ transform: translate(-60%, -60%) scale(1.05);
462
+ }
463
+ 50% {
464
+ opacity: 0.7;
465
+ transform: translate(-40%, -40%) scale(0.9);
466
+ }
467
+ 75% {
468
+ opacity: 0.4;
469
+ transform: translate(-55%, -45%) scale(1.1);
470
+ }
471
+ }
472
+
473
+ .corrupted-strong {
474
+ animation: corruptText 1.5s ease-in-out infinite;
475
+ color: var(--accent);
476
+ text-shadow:
477
+ 0 0 4px var(--accent),
478
+ 0 0 8px var(--accent-light),
479
+ 0 0 12px var(--accent);
480
+ font-weight: 700;
481
+ }
482
+
483
+ /* ========== MULTI-LANGUAGE CORRUPTED TEXT ========== */
484
+ /* Text that cycles through Japanese/English/romaji */
485
+
486
+ .corrupted-multilang {
487
+ display: inline-block;
488
+ color: var(--accent);
489
+ font-weight: 600;
490
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
491
+ letter-spacing: 0.05em;
492
+ position: relative;
493
+ min-height: 1.2em;
494
+ animation: corruptText 2s ease-in-out infinite;
495
+ line-height: 1.4;
496
+ overflow: visible;
497
+ text-overflow: clip;
498
+ white-space: nowrap;
499
+ }
500
+
501
+ /* Handle zalgo combining characters */
502
+ .corrupted-multilang {
503
+ text-rendering: optimizeLegibility;
504
+ -webkit-font-feature-settings: "liga" off;
505
+ font-feature-settings: "liga" off;
506
+ }
507
+
508
+ .corrupted-multilang::before {
509
+ content: '';
510
+ position: absolute;
511
+ inset: -2px;
512
+ background: rgba(217, 79, 144, 0.1);
513
+ border: 1px solid rgba(217, 79, 144, 0.3);
514
+ border-radius: var(--radius-sm);
515
+ z-index: -1;
516
+ animation: pulse 2s ease-in-out infinite;
517
+ }
518
+
519
+ .corrupted-multilang.corrupting {
520
+ animation: corruptText 0.5s ease-in-out infinite;
521
+ }
522
+
523
+ .corrupted-multilang.settled {
524
+ animation: none;
525
+ color: var(--text);
526
+ }
527
+
528
+ /* Variant for larger display text */
529
+ .corrupted-multilang.display {
530
+ font-size: 2rem;
531
+ font-weight: 700;
532
+ text-shadow:
533
+ 0 0 4px var(--accent),
534
+ 0 0 8px var(--accent-light),
535
+ 0 0 12px var(--accent);
536
+ padding: var(--spacing-md) var(--spacing-lg);
537
+ }
538
+
539
+ /* ========== PULSE & BREATHING ANIMATIONS ========== */
540
+
541
+ @keyframes pulse {
542
+ 0%, 100% {
543
+ opacity: 1;
544
+ }
545
+ 50% {
546
+ opacity: 0.7;
547
+ }
548
+ }
549
+
550
+ @keyframes breathe {
551
+ 0%, 100% {
552
+ opacity: 0.8;
553
+ }
554
+ 50% {
555
+ opacity: 1;
556
+ }
557
+ }
558
+
559
+ .pulse {
560
+ animation: pulse 2s ease-in-out infinite;
561
+ }
562
+
563
+ .breathe {
564
+ animation: breathe 3s ease-in-out infinite;
565
+ }
566
+
567
+ /* ========== FLOAT ANIMATION ========== */
568
+
569
+ @keyframes float {
570
+ 0%, 100% {
571
+ transform: translateY(0px);
572
+ }
573
+ 50% {
574
+ transform: translateY(-10px);
575
+ }
576
+ }
577
+
578
+ .float {
579
+ animation: float 3s ease-in-out infinite;
580
+ }
581
+
582
+ /* ========== SHIMMER/LOADING ANIMATION ========== */
583
+
584
+ @keyframes shimmer {
585
+ 0% {
586
+ background-position: -1000px 0;
587
+ }
588
+ 100% {
589
+ background-position: 1000px 0;
590
+ }
591
+ }
592
+
593
+ .shimmer {
594
+ background: linear-gradient(
595
+ 90deg,
596
+ rgba(20, 12, 40, 0.5) 25%,
597
+ rgba(20, 12, 40, 0.8) 50%,
598
+ rgba(20, 12, 40, 0.5) 75%
599
+ );
600
+ background-size: 1000px 100%;
601
+ animation: shimmer 2s infinite;
602
+ }
603
+
604
+ /* ========== TRANSITION UTILITIES ========== */
605
+
606
+ .transition-fast {
607
+ transition: all var(--transition-fast);
608
+ }
609
+
610
+ .transition-normal {
611
+ transition: all var(--transition-normal);
612
+ }
613
+
614
+ .transition-slow {
615
+ transition: all var(--transition-slow);
616
+ }
617
+
618
+ .transition-easing {
619
+ transition: all var(--transition-normal) var(--transition-easing);
620
+ }
621
+
622
+ /* ========== HOVER LIFT EFFECT ========== */
623
+
624
+ .lift:hover {
625
+ transform: translateY(-4px);
626
+ box-shadow: 0 8px 24px rgba(217, 79, 144, 0.4);
627
+ }
628
+
629
+ .lift-sm:hover {
630
+ transform: translateY(-2px);
631
+ box-shadow: 0 4px 12px rgba(217, 79, 144, 0.2);
632
+ }
633
+
634
+ .lift-lg:hover {
635
+ transform: translateY(-8px);
636
+ box-shadow: 0 12px 32px rgba(217, 79, 144, 0.5);
637
+ }
638
+
639
+ /* ========== RESPONSIVENESS ========== */
640
+
641
+ @media (prefers-reduced-motion: reduce) {
642
+ *,
643
+ *::before,
644
+ *::after {
645
+ animation-duration: 0.01ms !important;
646
+ animation-iteration-count: 1 !important;
647
+ transition-duration: 0.01ms !important;
648
+ }
649
+ }