@walrosproject/ui 0.3.3 → 0.3.4
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 +14 -5
- package/dist/assets/walros-theme-glitch.mp3 +0 -0
- package/dist/index.d.ts +12 -7
- package/dist/index.js +173 -82
- package/dist/index.js.map +1 -1
- package/package.json +5 -27
package/README.md
CHANGED
|
@@ -147,9 +147,18 @@ export default function App() {
|
|
|
147
147
|
}
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
El hook aplica por defecto la clase `dark` en `document.documentElement
|
|
151
|
-
guarda el valor en `localStorage` con la clave `walros-theme
|
|
152
|
-
|
|
150
|
+
El hook aplica por defecto la clase `dark` en `document.documentElement` y
|
|
151
|
+
guarda el valor en `localStorage` con la clave `walros-theme`. El cambio visual
|
|
152
|
+
se ejecuta con la transición de 1,5 s de WalrOS; el tema cambia a los 610 ms y
|
|
153
|
+
el sonido oficial se reproduce al activar `toggleTheme()` desde una interacción
|
|
154
|
+
del usuario. El volumen predeterminado es 0,52.
|
|
155
|
+
|
|
156
|
+
El efecto de sonido se puede desactivar o sustituir:
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
useWalrosTheme({ soundUrl: false });
|
|
160
|
+
useWalrosTheme({ soundUrl: "/audio/mi-cambio-de-tema.mp3", soundVolume: 0.4 });
|
|
161
|
+
```
|
|
153
162
|
|
|
154
163
|
|
|
155
164
|
## Modos del glitch de tema
|
|
@@ -229,8 +238,8 @@ En este modo el paquete:
|
|
|
229
238
|
- restaura `overflow` y la posición al terminar;
|
|
230
239
|
- ejecuta `onAfterUnlock` para actualizar GSAP u otra librería.
|
|
231
240
|
|
|
232
|
-
|
|
233
|
-
|
|
241
|
+
La transición dura 1.500 ms por defecto y cambia el tema en el punto de 610 ms,
|
|
242
|
+
sin alterar las opciones de bloqueo de scroll ni las de `ScrollTrigger`.
|
|
234
243
|
|
|
235
244
|
## Compatibilidad de `WalrosPortalTransition`
|
|
236
245
|
|
|
Binary file
|
package/dist/index.d.ts
CHANGED
|
@@ -20,11 +20,6 @@ type WalrosWordmarkProps = Omit<ImgHTMLAttributes<HTMLImageElement>, "src"> & {
|
|
|
20
20
|
};
|
|
21
21
|
declare function WalrosWordmark({ variant, alt, draggable, ...props }: WalrosWordmarkProps): react.JSX.Element;
|
|
22
22
|
|
|
23
|
-
declare const walrosPortalSilhouetteUrl: string;
|
|
24
|
-
declare const walrosLogoChromeUrl: string;
|
|
25
|
-
declare const walrosWordmarkLightUrl: string;
|
|
26
|
-
declare const walrosWordmarkDarkUrl: string;
|
|
27
|
-
|
|
28
23
|
type WalrosThemeGlitchProps = {
|
|
29
24
|
active: boolean;
|
|
30
25
|
zIndex?: number;
|
|
@@ -42,6 +37,10 @@ type UseWalrosThemeOptions = {
|
|
|
42
37
|
useSystemPreference?: boolean;
|
|
43
38
|
swapDelay?: number;
|
|
44
39
|
totalDuration?: number;
|
|
40
|
+
/** Set to false to disable audio, or provide a custom sound URL. */
|
|
41
|
+
soundUrl?: string | false;
|
|
42
|
+
/** Playback volume from 0 to 1. Defaults to the WalrOS site mix. */
|
|
43
|
+
soundVolume?: number;
|
|
45
44
|
applyTheme?: (theme: WalrosTheme) => void;
|
|
46
45
|
/**
|
|
47
46
|
* `body` reproduce el comportamiento original de WalrOS Forum.
|
|
@@ -67,6 +66,12 @@ type UseWalrosThemeResult = {
|
|
|
67
66
|
toggleTheme: () => void;
|
|
68
67
|
setTheme: (theme: WalrosTheme) => void;
|
|
69
68
|
};
|
|
70
|
-
declare function useWalrosTheme({ storageKey, defaultTheme, useSystemPreference, swapDelay, totalDuration, applyTheme, mode, shakeTargets, lockScroll, onAfterUnlock, }?: UseWalrosThemeOptions): UseWalrosThemeResult;
|
|
69
|
+
declare function useWalrosTheme({ storageKey, defaultTheme, useSystemPreference, swapDelay, totalDuration, soundUrl, soundVolume, applyTheme, mode, shakeTargets, lockScroll, onAfterUnlock, }?: UseWalrosThemeOptions): UseWalrosThemeResult;
|
|
70
|
+
|
|
71
|
+
declare const walrosPortalSilhouetteUrl: string;
|
|
72
|
+
declare const walrosLogoChromeUrl: string;
|
|
73
|
+
declare const walrosWordmarkLightUrl: string;
|
|
74
|
+
declare const walrosWordmarkDarkUrl: string;
|
|
75
|
+
declare const walrosThemeGlitchSoundUrl: string;
|
|
71
76
|
|
|
72
|
-
export { type UseWalrosThemeOptions, type UseWalrosThemeResult, WalrosLogo, type WalrosLogoProps, WalrosPortalTransition, type WalrosPortalTransitionProps, type WalrosTheme, WalrosThemeGlitch, type WalrosThemeGlitchProps, type WalrosThemeMode, type WalrosThemeShakeTarget, WalrosWordmark, type WalrosWordmarkProps, useWalrosTheme, walrosLogoChromeUrl, walrosPortalSilhouetteUrl, walrosWordmarkDarkUrl, walrosWordmarkLightUrl };
|
|
77
|
+
export { type UseWalrosThemeOptions, type UseWalrosThemeResult, WalrosLogo, type WalrosLogoProps, WalrosPortalTransition, type WalrosPortalTransitionProps, type WalrosTheme, WalrosThemeGlitch, type WalrosThemeGlitchProps, type WalrosThemeMode, type WalrosThemeShakeTarget, WalrosWordmark, type WalrosWordmarkProps, useWalrosTheme, walrosLogoChromeUrl, walrosPortalSilhouetteUrl, walrosThemeGlitchSoundUrl, walrosWordmarkDarkUrl, walrosWordmarkLightUrl };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { useState, useRef, useId, useEffect, useLayoutEffect, useCallback } from 'react';
|
|
2
|
-
import { gsap } from 'gsap';
|
|
3
|
-
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
|
-
|
|
5
1
|
// src/components/WalrosPortalTransition.tsx
|
|
2
|
+
import {
|
|
3
|
+
useEffect,
|
|
4
|
+
useId,
|
|
5
|
+
useLayoutEffect,
|
|
6
|
+
useRef,
|
|
7
|
+
useState
|
|
8
|
+
} from "react";
|
|
9
|
+
import { gsap } from "gsap";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
11
|
var SILHOUETTE_VIEWBOX = 1254;
|
|
7
12
|
var FOCUS_X = 626;
|
|
8
13
|
var FOCUS_Y = 333;
|
|
@@ -304,12 +309,19 @@ var walrosWordmarkDarkUrl = new URL(
|
|
|
304
309
|
"./assets/walros-wordmark-dark.png",
|
|
305
310
|
import.meta.url
|
|
306
311
|
).href;
|
|
312
|
+
var walrosThemeGlitchSoundUrl = new URL(
|
|
313
|
+
"./assets/walros-theme-glitch.mp3",
|
|
314
|
+
import.meta.url
|
|
315
|
+
).href;
|
|
316
|
+
|
|
317
|
+
// src/components/WalrosLogo.tsx
|
|
318
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
307
319
|
function WalrosLogo({
|
|
308
320
|
alt = "WalrOS",
|
|
309
321
|
draggable = false,
|
|
310
322
|
...props
|
|
311
323
|
}) {
|
|
312
|
-
return /* @__PURE__ */
|
|
324
|
+
return /* @__PURE__ */ jsx2(
|
|
313
325
|
"img",
|
|
314
326
|
{
|
|
315
327
|
src: walrosLogoChromeUrl,
|
|
@@ -319,6 +331,9 @@ function WalrosLogo({
|
|
|
319
331
|
}
|
|
320
332
|
);
|
|
321
333
|
}
|
|
334
|
+
|
|
335
|
+
// src/components/WalrosWordmark.tsx
|
|
336
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
322
337
|
function WalrosWordmark({
|
|
323
338
|
variant = "light",
|
|
324
339
|
alt = "WalrOS",
|
|
@@ -326,7 +341,7 @@ function WalrosWordmark({
|
|
|
326
341
|
...props
|
|
327
342
|
}) {
|
|
328
343
|
const src = variant === "dark" ? walrosWordmarkDarkUrl : walrosWordmarkLightUrl;
|
|
329
|
-
return /* @__PURE__ */
|
|
344
|
+
return /* @__PURE__ */ jsx3(
|
|
330
345
|
"img",
|
|
331
346
|
{
|
|
332
347
|
src,
|
|
@@ -336,12 +351,20 @@ function WalrosWordmark({
|
|
|
336
351
|
}
|
|
337
352
|
);
|
|
338
353
|
}
|
|
354
|
+
|
|
355
|
+
// src/components/WalrosThemeGlitch.tsx
|
|
356
|
+
import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
339
357
|
var GLITCH_STYLES = `
|
|
340
358
|
.walros-theme-glitch-root {
|
|
341
359
|
position: fixed;
|
|
342
360
|
inset: 0;
|
|
361
|
+
z-index: 9998;
|
|
343
362
|
pointer-events: none;
|
|
344
363
|
overflow: hidden;
|
|
364
|
+
visibility: hidden;
|
|
365
|
+
}
|
|
366
|
+
.walros-theme-glitch-root.is-active {
|
|
367
|
+
visibility: visible;
|
|
345
368
|
}
|
|
346
369
|
.walros-theme-glitch-root::before,
|
|
347
370
|
.walros-theme-glitch-root::after {
|
|
@@ -351,47 +374,60 @@ var GLITCH_STYLES = `
|
|
|
351
374
|
mix-blend-mode: screen;
|
|
352
375
|
}
|
|
353
376
|
.walros-theme-glitch-root::before {
|
|
354
|
-
background:
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
transparent 0 2px,
|
|
358
|
-
rgba(59, 130, 246, 0.35) 2px 3px,
|
|
359
|
-
transparent 3px 5px,
|
|
360
|
-
rgba(236, 72, 153, 0.28) 5px 6px
|
|
361
|
-
);
|
|
362
|
-
animation: walros-glitch-scan 700ms steps(14) forwards;
|
|
377
|
+
background: rgba(0, 0, 0, .82);
|
|
378
|
+
mix-blend-mode: normal;
|
|
379
|
+
animation: walros-glitch-flash 1500ms steps(1, end) both;
|
|
363
380
|
}
|
|
364
381
|
.walros-theme-glitch-root::after {
|
|
365
|
-
background:
|
|
366
|
-
|
|
367
|
-
90deg,
|
|
368
|
-
rgba(6, 182, 212, 0.5),
|
|
369
|
-
transparent 40%,
|
|
370
|
-
transparent 60%,
|
|
371
|
-
rgba(236, 72, 153, 0.5)
|
|
372
|
-
);
|
|
373
|
-
animation: walros-glitch-slice 700ms steps(10) forwards;
|
|
382
|
+
background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(255,255,255,.09) 3px 4px);
|
|
383
|
+
animation: walros-glitch-scan 90ms steps(2, end) 16 both;
|
|
374
384
|
}
|
|
385
|
+
.walros-theme-glitch-band {
|
|
386
|
+
position: absolute;
|
|
387
|
+
left: -12%;
|
|
388
|
+
width: 124%;
|
|
389
|
+
opacity: 0;
|
|
390
|
+
}
|
|
391
|
+
.walros-theme-glitch-band:nth-child(1) { top: 12%; height: 4%; background: #eaf6ff; animation: walros-glitch-band-a 1500ms steps(1, end) both; }
|
|
392
|
+
.walros-theme-glitch-band:nth-child(2) { top: 36%; height: 11%; background: #020407; animation: walros-glitch-band-b 1500ms steps(1, end) both; }
|
|
393
|
+
.walros-theme-glitch-band:nth-child(3) { top: 62%; height: 2%; background: #7faddb; animation: walros-glitch-band-c 1500ms steps(1, end) both; }
|
|
394
|
+
.walros-theme-glitch-band:nth-child(4) { top: 79%; height: 8%; background: #f4f6f5; animation: walros-glitch-band-d 1500ms steps(1, end) both; }
|
|
375
395
|
|
|
376
396
|
@keyframes walros-glitch-scan {
|
|
377
|
-
0%
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
45% { transform: translate(-6px, 3px); opacity: 0.85; }
|
|
381
|
-
60% { transform: translate(4px, -8px); opacity: 1; }
|
|
382
|
-
80% { transform: translate(-3px, 4px); opacity: 0.6; }
|
|
383
|
-
100% { transform: translate(0, 0); opacity: 0; }
|
|
397
|
+
0% { transform: translateY(-2px); opacity: .25; }
|
|
398
|
+
50% { transform: translateY(2px); opacity: .08; }
|
|
399
|
+
100% { transform: translateY(0); opacity: .2; }
|
|
384
400
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
401
|
+
@keyframes walros-glitch-flash {
|
|
402
|
+
0%, 17%, 22%, 34%, 39%, 54%, 59%, 73%, 78%, 100% { opacity: 0; }
|
|
403
|
+
18%, 21% { opacity: .18; }
|
|
404
|
+
35%, 38% { opacity: .48; }
|
|
405
|
+
55%, 58% { opacity: .82; }
|
|
406
|
+
74%, 77% { opacity: .22; }
|
|
407
|
+
}
|
|
408
|
+
@keyframes walros-glitch-band-a {
|
|
409
|
+
0%, 8%, 18%, 42%, 51%, 73%, 82%, 100% { opacity: 0; transform: translateX(0); }
|
|
410
|
+
9%, 17% { opacity: .55; transform: translateX(-7%); }
|
|
411
|
+
43%, 50% { opacity: .82; transform: translateX(10%); }
|
|
412
|
+
74%, 81% { opacity: .32; transform: translateX(-4%); }
|
|
413
|
+
}
|
|
414
|
+
@keyframes walros-glitch-band-b {
|
|
415
|
+
0%, 20%, 27%, 46%, 55%, 64%, 71%, 100% { opacity: 0; transform: translateX(0); }
|
|
416
|
+
21%, 26% { opacity: .72; transform: translateX(9%); }
|
|
417
|
+
47%, 54% { opacity: .9; transform: translateX(-6%); }
|
|
418
|
+
65%, 70% { opacity: .5; transform: translateX(4%); }
|
|
419
|
+
}
|
|
420
|
+
@keyframes walros-glitch-band-c {
|
|
421
|
+
0%, 13%, 23%, 39%, 48%, 67%, 76%, 100% { opacity: 0; transform: translateX(0); }
|
|
422
|
+
14%, 22% { opacity: .9; transform: translateX(5%); }
|
|
423
|
+
40%, 47% { opacity: .65; transform: translateX(-11%); }
|
|
424
|
+
68%, 75% { opacity: .75; transform: translateX(8%); }
|
|
425
|
+
}
|
|
426
|
+
@keyframes walros-glitch-band-d {
|
|
427
|
+
0%, 29%, 38%, 57%, 65%, 85%, 93%, 100% { opacity: 0; transform: translateX(0); }
|
|
428
|
+
30%, 37% { opacity: .42; transform: translateX(-8%); }
|
|
429
|
+
58%, 64% { opacity: .7; transform: translateX(7%); }
|
|
430
|
+
86%, 92% { opacity: .25; transform: translateX(-3%); }
|
|
395
431
|
}
|
|
396
432
|
|
|
397
433
|
.walros-theme-glitch-lock {
|
|
@@ -404,16 +440,17 @@ var GLITCH_STYLES = `
|
|
|
404
440
|
|
|
405
441
|
/* Comportamiento original de WalrOS Forum para p\xE1ginas normales. */
|
|
406
442
|
.walros-theme-glitch-page--body {
|
|
407
|
-
animation: walros-glitch-page-body
|
|
443
|
+
animation: walros-glitch-page-body 1500ms steps(1, end) both;
|
|
408
444
|
}
|
|
409
445
|
|
|
410
446
|
@keyframes walros-glitch-page-body {
|
|
411
|
-
0%
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
447
|
+
0%, 6%, 18%, 31%, 49%, 68%, 82%, 100% { transform: translate3d(0,0,0) scale(1); filter: none; }
|
|
448
|
+
7% { transform: translate3d(-18px,4px,0) scale(1.012); filter: contrast(1.5) saturate(.45); }
|
|
449
|
+
19% { transform: translate3d(26px,-7px,0) scale(1.02) skewX(-1.2deg); filter: contrast(1.9) saturate(1.6); }
|
|
450
|
+
32% { transform: translate3d(-9px,11px,0) scale(1.03); filter: invert(.12) contrast(2); }
|
|
451
|
+
50%, 57% { transform: translate3d(34px,-3px,0) scale(1.025); filter: grayscale(1) contrast(2.3); }
|
|
452
|
+
69% { transform: translate3d(-24px,5px,0) scale(1.016); filter: contrast(1.7) saturate(.2); }
|
|
453
|
+
83% { transform: translate3d(8px,-2px,0) scale(1.006); filter: contrast(1.35); }
|
|
417
454
|
}
|
|
418
455
|
|
|
419
456
|
/*
|
|
@@ -423,16 +460,17 @@ var GLITCH_STYLES = `
|
|
|
423
460
|
*/
|
|
424
461
|
.walros-theme-glitch-page--viewport {
|
|
425
462
|
transform-origin: 50% var(--walros-glitch-origin-y, 50%);
|
|
426
|
-
animation: walros-glitch-page-viewport
|
|
463
|
+
animation: walros-glitch-page-viewport 1500ms steps(1, end) both;
|
|
427
464
|
}
|
|
428
465
|
|
|
429
466
|
@keyframes walros-glitch-page-viewport {
|
|
430
|
-
0%
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
467
|
+
0%, 6%, 18%, 31%, 49%, 68%, 82%, 100% { transform: translate3d(0,0,0) scale(1.012); filter: none; }
|
|
468
|
+
7% { transform: translate3d(-18px,4px,0) scale(1.012); filter: contrast(1.5) saturate(.45); }
|
|
469
|
+
19% { transform: translate3d(26px,-7px,0) scale(1.02) skewX(-1.2deg); filter: contrast(1.9) saturate(1.6); }
|
|
470
|
+
32% { transform: translate3d(-9px,11px,0) scale(1.03); filter: invert(.12) contrast(2); }
|
|
471
|
+
50%, 57% { transform: translate3d(34px,-3px,0) scale(1.025); filter: grayscale(1) contrast(2.3); }
|
|
472
|
+
69% { transform: translate3d(-24px,5px,0) scale(1.016); filter: contrast(1.7) saturate(.2); }
|
|
473
|
+
83% { transform: translate3d(8px,-2px,0) scale(1.006); filter: contrast(1.35); }
|
|
436
474
|
}
|
|
437
475
|
|
|
438
476
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -441,6 +479,10 @@ var GLITCH_STYLES = `
|
|
|
441
479
|
animation: walros-glitch-reduced 150ms ease-out forwards;
|
|
442
480
|
}
|
|
443
481
|
|
|
482
|
+
.walros-theme-glitch-band {
|
|
483
|
+
animation: none !important;
|
|
484
|
+
}
|
|
485
|
+
|
|
444
486
|
.walros-theme-glitch-page--body,
|
|
445
487
|
.walros-theme-glitch-page--viewport {
|
|
446
488
|
animation: none;
|
|
@@ -458,18 +500,32 @@ function WalrosThemeGlitch({
|
|
|
458
500
|
className,
|
|
459
501
|
style
|
|
460
502
|
}) {
|
|
461
|
-
return /* @__PURE__ */
|
|
462
|
-
/* @__PURE__ */
|
|
463
|
-
active ? /* @__PURE__ */
|
|
503
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
504
|
+
/* @__PURE__ */ jsx4("style", { children: GLITCH_STYLES }),
|
|
505
|
+
active ? /* @__PURE__ */ jsxs2(
|
|
464
506
|
"div",
|
|
465
507
|
{
|
|
466
|
-
className: ["walros-theme-glitch-root", className].filter(Boolean).join(" "),
|
|
508
|
+
className: ["walros-theme-glitch-root", "is-active", className].filter(Boolean).join(" "),
|
|
467
509
|
style: { zIndex, ...style },
|
|
468
|
-
"aria-hidden": "true"
|
|
510
|
+
"aria-hidden": "true",
|
|
511
|
+
children: [
|
|
512
|
+
/* @__PURE__ */ jsx4("span", { className: "walros-theme-glitch-band" }),
|
|
513
|
+
/* @__PURE__ */ jsx4("span", { className: "walros-theme-glitch-band" }),
|
|
514
|
+
/* @__PURE__ */ jsx4("span", { className: "walros-theme-glitch-band" }),
|
|
515
|
+
/* @__PURE__ */ jsx4("span", { className: "walros-theme-glitch-band" })
|
|
516
|
+
]
|
|
469
517
|
}
|
|
470
518
|
) : null
|
|
471
519
|
] });
|
|
472
520
|
}
|
|
521
|
+
|
|
522
|
+
// src/hooks/useWalrosTheme.ts
|
|
523
|
+
import {
|
|
524
|
+
useCallback,
|
|
525
|
+
useEffect as useEffect2,
|
|
526
|
+
useRef as useRef2,
|
|
527
|
+
useState as useState2
|
|
528
|
+
} from "react";
|
|
473
529
|
var GLITCH_BASE_CLASS = "walros-theme-glitch-page";
|
|
474
530
|
var GLITCH_BODY_CLASS = "walros-theme-glitch-page--body";
|
|
475
531
|
var GLITCH_VIEWPORT_CLASS = "walros-theme-glitch-page--viewport";
|
|
@@ -505,36 +561,59 @@ function useWalrosTheme({
|
|
|
505
561
|
storageKey = "walros-theme",
|
|
506
562
|
defaultTheme = "light",
|
|
507
563
|
useSystemPreference = false,
|
|
508
|
-
swapDelay =
|
|
509
|
-
totalDuration =
|
|
564
|
+
swapDelay = 610,
|
|
565
|
+
totalDuration = 1500,
|
|
566
|
+
soundUrl = walrosThemeGlitchSoundUrl,
|
|
567
|
+
soundVolume = 0.52,
|
|
510
568
|
applyTheme = defaultApplyTheme,
|
|
511
569
|
mode = "body",
|
|
512
570
|
shakeTargets = [],
|
|
513
571
|
lockScroll,
|
|
514
572
|
onAfterUnlock
|
|
515
573
|
} = {}) {
|
|
516
|
-
const [theme, setThemeState] =
|
|
574
|
+
const [theme, setThemeState] = useState2(
|
|
517
575
|
() => readInitialTheme(storageKey, defaultTheme, useSystemPreference)
|
|
518
576
|
);
|
|
519
|
-
const [mounted, setMounted] =
|
|
520
|
-
const [glitching, setGlitching] =
|
|
521
|
-
const themeRef =
|
|
522
|
-
const glitchingRef =
|
|
523
|
-
const swapTimerRef =
|
|
524
|
-
const cleanupTimerRef =
|
|
525
|
-
const applyThemeRef =
|
|
526
|
-
const modeRef =
|
|
527
|
-
const shakeTargetsRef =
|
|
528
|
-
const lockScrollRef =
|
|
529
|
-
const onAfterUnlockRef =
|
|
530
|
-
const activeTargetsRef =
|
|
531
|
-
const viewportLockRef =
|
|
577
|
+
const [mounted, setMounted] = useState2(false);
|
|
578
|
+
const [glitching, setGlitching] = useState2(false);
|
|
579
|
+
const themeRef = useRef2(theme);
|
|
580
|
+
const glitchingRef = useRef2(false);
|
|
581
|
+
const swapTimerRef = useRef2(null);
|
|
582
|
+
const cleanupTimerRef = useRef2(null);
|
|
583
|
+
const applyThemeRef = useRef2(applyTheme);
|
|
584
|
+
const modeRef = useRef2(mode);
|
|
585
|
+
const shakeTargetsRef = useRef2(shakeTargets);
|
|
586
|
+
const lockScrollRef = useRef2(lockScroll);
|
|
587
|
+
const onAfterUnlockRef = useRef2(onAfterUnlock);
|
|
588
|
+
const activeTargetsRef = useRef2([]);
|
|
589
|
+
const viewportLockRef = useRef2(null);
|
|
590
|
+
const soundRef = useRef2(null);
|
|
591
|
+
const soundUrlRef = useRef2(soundUrl);
|
|
592
|
+
const soundVolumeRef = useRef2(soundVolume);
|
|
532
593
|
themeRef.current = theme;
|
|
533
594
|
applyThemeRef.current = applyTheme;
|
|
534
595
|
modeRef.current = mode;
|
|
535
596
|
shakeTargetsRef.current = shakeTargets;
|
|
536
597
|
lockScrollRef.current = lockScroll;
|
|
537
598
|
onAfterUnlockRef.current = onAfterUnlock;
|
|
599
|
+
soundUrlRef.current = soundUrl;
|
|
600
|
+
soundVolumeRef.current = soundVolume;
|
|
601
|
+
const playThemeSound = useCallback(() => {
|
|
602
|
+
if (typeof window === "undefined" || !soundUrlRef.current) return;
|
|
603
|
+
try {
|
|
604
|
+
if (!soundRef.current || soundRef.current.src !== new URL(soundUrlRef.current, document.baseURI).href) {
|
|
605
|
+
soundRef.current?.pause();
|
|
606
|
+
soundRef.current = new Audio(soundUrlRef.current);
|
|
607
|
+
soundRef.current.preload = "auto";
|
|
608
|
+
}
|
|
609
|
+
const audio = soundRef.current;
|
|
610
|
+
audio.volume = Math.max(0, Math.min(1, soundVolumeRef.current));
|
|
611
|
+
audio.currentTime = 0;
|
|
612
|
+
void audio.play().catch(() => {
|
|
613
|
+
});
|
|
614
|
+
} catch {
|
|
615
|
+
}
|
|
616
|
+
}, []);
|
|
538
617
|
const persistTheme = useCallback(
|
|
539
618
|
(nextTheme) => {
|
|
540
619
|
applyThemeRef.current(nextTheme);
|
|
@@ -547,7 +626,7 @@ function useWalrosTheme({
|
|
|
547
626
|
},
|
|
548
627
|
[storageKey]
|
|
549
628
|
);
|
|
550
|
-
|
|
629
|
+
useEffect2(() => {
|
|
551
630
|
const initialTheme = readInitialTheme(
|
|
552
631
|
storageKey,
|
|
553
632
|
defaultTheme,
|
|
@@ -645,6 +724,7 @@ function useWalrosTheme({
|
|
|
645
724
|
if (typeof window === "undefined" || typeof document === "undefined" || glitchingRef.current) {
|
|
646
725
|
return;
|
|
647
726
|
}
|
|
727
|
+
playThemeSound();
|
|
648
728
|
const currentMode = modeRef.current;
|
|
649
729
|
const shouldLockScroll = lockScrollRef.current ?? currentMode === "viewport";
|
|
650
730
|
if (currentMode === "viewport" && shouldLockScroll) {
|
|
@@ -676,12 +756,14 @@ function useWalrosTheme({
|
|
|
676
756
|
cleanupTimerRef.current = null;
|
|
677
757
|
finishGlitch();
|
|
678
758
|
}, effectiveDuration);
|
|
679
|
-
}, [finishGlitch, lockViewport, persistTheme, swapDelay, totalDuration]);
|
|
680
|
-
|
|
759
|
+
}, [finishGlitch, lockViewport, persistTheme, playThemeSound, swapDelay, totalDuration]);
|
|
760
|
+
useEffect2(() => {
|
|
681
761
|
return () => {
|
|
682
762
|
clearTimers();
|
|
683
763
|
removeShakeClasses();
|
|
684
764
|
unlockViewport(false);
|
|
765
|
+
soundRef.current?.pause();
|
|
766
|
+
soundRef.current = null;
|
|
685
767
|
};
|
|
686
768
|
}, [clearTimers, removeShakeClasses, unlockViewport]);
|
|
687
769
|
return {
|
|
@@ -693,7 +775,16 @@ function useWalrosTheme({
|
|
|
693
775
|
setTheme
|
|
694
776
|
};
|
|
695
777
|
}
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
778
|
+
export {
|
|
779
|
+
WalrosLogo,
|
|
780
|
+
WalrosPortalTransition,
|
|
781
|
+
WalrosThemeGlitch,
|
|
782
|
+
WalrosWordmark,
|
|
783
|
+
useWalrosTheme,
|
|
784
|
+
walrosLogoChromeUrl,
|
|
785
|
+
walrosPortalSilhouetteUrl,
|
|
786
|
+
walrosThemeGlitchSoundUrl,
|
|
787
|
+
walrosWordmarkDarkUrl,
|
|
788
|
+
walrosWordmarkLightUrl
|
|
789
|
+
};
|
|
699
790
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/WalrosPortalTransition.tsx","../src/assets.ts","../src/components/WalrosLogo.tsx","../src/components/WalrosWordmark.tsx","../src/components/WalrosThemeGlitch.tsx","../src/hooks/useWalrosTheme.ts"],"names":["initialPixels","initialScale","jsx","jsxs","useState","useRef","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { gsap } from \"gsap\";\n\nexport type WalrosPortalTransitionProps = {\n duration?: number;\n onComplete?: () => void;\n backgroundColor?: string;\n enabled?: boolean;\n storageMode?: \"always\" | \"session\" | \"once\";\n storageKey?: string;\n zIndex?: number;\n};\n\nconst SILHOUETTE_VIEWBOX = 1254;\nconst FOCUS_X = 626;\nconst FOCUS_Y = 333;\nconst PORTAL_RADIUS = 190;\nconst WALROS_PORTAL_SILHOUETTE_URL =\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgdmlld0JveD0iMCAwIDEyNTQgMTI1NCIKICAgICB3aWR0aD0iMTI1NCIgaGVpZ2h0PSIxMjU0IgogICAgIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iU2lsdWV0YSBXYWxyT1MiPgogIDxnIGZpbGw9IiMwMDAwMDAiPgogICAgPHBhdGggZD0iTSAyNDQuMDAgMzU0LjAwIEMgMjQwLjUwIDM3Ny42NywgMjQwLjE3IDQxMy42NywgMjQyLjAwIDQzNC4wMCBDIDI0My44MyA0NTQuMzMsIDI0OS41MCA0NjQuNTAsIDI1NS4wMCA0NzYuMDAgQyAyNjAuNTAgNDg3LjUwLCAyNjguNTAgNDk2LjAwLCAyNzUuMDAgNTAzLjAwIEMgMjgxLjUwIDUxMC4wMCwgMjg3LjE3IDUxMy42NywgMjk0LjAwIDUxOC4wMCBDIDMwMC44MyA1MjIuMzMsIDMwNi4wMCA1MjUuNjcsIDMxNi4wMCA1MjkuMDAgQyAzMjYuMDAgNTMyLjMzLCAzMzYuMzMgNTM2LjY3LCAzNTQuMDAgNTM4LjAwIEMgMzcxLjY3IDUzOS4zMywgMzk3LjgzIDU0MC44MywgNDIyLjAwIDUzNy4wMCBDIDQ0Ni4xNyA1MzMuMTcsIDQ3NC4xNyA1MjUuMzMsIDQ5OS4wMCA1MTUuMDAgQyA1MjMuODMgNTA0LjY3LCA1NTAuMDAgNDg5LjMzLCA1NzEuMDAgNDc1LjAwIEMgNTkyLjAwIDQ2MC42NywgNjE1LjAwIDQzNi41MCwgNjI1LjAwIDQyOS4wMCBDIDYzNS4wMCA0MjEuNTAsIDYyMy42NyA0MjQuMDAsIDYzMS4wMCA0MzAuMDAgQyA2MzguMzMgNDM2LjAwLCA2NTYuNjcgNDU0LjgzLCA2NjkuMDAgNDY1LjAwIEMgNjgxLjMzIDQ3NS4xNywgNjkwLjAwIDQ4Mi4xNywgNzA1LjAwIDQ5MS4wMCBDIDcyMC4wMCA0OTkuODMsIDc0My42NyA1MTEuNTAsIDc1OS4wMCA1MTguMDAgQyA3NzQuMzMgNTI0LjUwLCA3ODQuMDAgNTI2LjgzLCA3OTcuMDAgNTMwLjAwIEMgODEwLjAwIDUzMy4xNywgODIwLjAwIDUzNS44MywgODM3LjAwIDUzNy4wMCBDIDg1NC4wMCA1MzguMTcsIDg4MS4xNyA1MzkuMDAsIDg5OS4wMCA1MzcuMDAgQyA5MTYuODMgNTM1LjAwLCA5MzIuMDAgNTMwLjAwLCA5NDQuMDAgNTI1LjAwIEMgOTU2LjAwIDUyMC4wMCwgOTYyLjAwIDUxNi4xNywgOTcxLjAwIDUwNy4wMCBDIDk4MC4wMCA0OTcuODMsIDk5MS42NyA0ODIuODMsIDk5OC4wMCA0NzAuMDAgQyAxMDA0LjMzIDQ1Ny4xNywgMTAwNy4xNyA0NDYuMzMsIDEwMDkuMDAgNDMwLjAwIEMgMTAxMC44MyA0MTMuNjcsIDEwMTAuODMgMzkwLjUwLCAxMDA5LjAwIDM3Mi4wMCBDIDEwMDcuMTcgMzUzLjUwLCAxMDAzLjgzIDMzNy4xNywgOTk4LjAwIDMxOS4wMCBDIDk5Mi4xNyAzMDAuODMsIDk4My42NyAyODAuMTcsIDk3NC4wMCAyNjMuMDAgQyA5NjQuMzMgMjQ1LjgzLCA5NTIuMDAgMjI5LjY3LCA5NDAuMDAgMjE2LjAwIEMgOTI4LjAwIDIwMi4zMywgOTE3LjE3IDE5Mi4wMCwgOTAyLjAwIDE4MS4wMCBDIDg4Ni44MyAxNzAuMDAsIDg2Ni41MCAxNTguMTcsIDg0OS4wMCAxNTAuMDAgQyA4MzEuNTAgMTQxLjgzLCA4MTYuNjcgMTM3LjAwLCA3OTcuMDAgMTMyLjAwIEMgNzc3LjMzIDEyNy4wMCwgNzU2LjY3IDEyMi44MywgNzMxLjAwIDEyMC4wMCBDIDcwNS4zMyAxMTcuMTcsIDY3My42NyAxMTUuMzMsIDY0My4wMCAxMTUuMDAgQyA2MTIuMzMgMTE0LjY3LCA1NzUuNjcgMTE1LjY3LCA1NDcuMDAgMTE4LjAwIEMgNTE4LjMzIDEyMC4zMywgNDk2LjE3IDEyMy4wMCwgNDcxLjAwIDEyOS4wMCBDIDQ0NS44MyAxMzUuMDAsIDQxOC4zMyAxNDMuNTAsIDM5Ni4wMCAxNTQuMDAgQyAzNzMuNjcgMTY0LjUwLCAzNTMuNTAgMTc4LjUwLCAzMzcuMDAgMTkyLjAwIEMgMzIwLjUwIDIwNS41MCwgMzA5LjMzIDIxOC4zMywgMjk3LjAwIDIzNS4wMCBDIDI4NC42NyAyNTEuNjcsIDI3MS44MyAyNzIuMTcsIDI2My4wMCAyOTIuMDAgQyAyNTQuMTcgMzExLjgzLCAyNDcuNTAgMzMwLjMzLCAyNDQuMDAgMzU0LjAwIFoiLz48cGF0aCBkPSJNIDI4OS4wMCA1MzYuMDAgQyAyODMuMTcgNTM1LjUwLCAyODQuODMgNTMzLjAwLCAyODQuMDAgNTQ0LjAwIEMgMjgzLjE3IDU1NS4wMCwgMjgyLjY3IDU3OC42NywgMjg0LjAwIDYwMi4wMCBDIDI4NS4zMyA2MjUuMzMsIDI4Ny4wMCA2NTEuODMsIDI5Mi4wMCA2ODQuMDAgQyAyOTcuMDAgNzE2LjE3LCAzMDYuMzMgNzYzLjUwLCAzMTQuMDAgNzk1LjAwIEMgMzIxLjY3IDgyNi41MCwgMzI4LjY3IDg0Ny4xNywgMzM4LjAwIDg3My4wMCBDIDM0Ny4zMyA4OTguODMsIDM1Ny4wMCA5MjMuNjcsIDM3MC4wMCA5NTAuMDAgQyAzODMuMDAgOTc2LjMzLCAzOTkuNjcgMTAwNi4wMCwgNDE2LjAwIDEwMzEuMDAgQyA0MzIuMzMgMTA1Ni4wMCwgNDU1LjMzIDEwODQuNTAsIDQ2OC4wMCAxMTAwLjAwIEMgNDgwLjY3IDExMTUuNTAsIDQ4Ni4xNyAxMTE5LjMzLCA0OTIuMDAgMTEyNC4wMCBDIDQ5Ny44MyAxMTI4LjY3LCA1MDAuNjcgMTEyNy42NywgNTAzLjAwIDExMjguMDAgQyA1MDUuMzMgMTEyOC4zMywgNTA1LjUwIDExMjcuNTAsIDUwNi4wMCAxMTI2LjAwIEMgNTA2LjUwIDExMjQuNTAsIDUxMC4zMyAxMTMyLjAwLCA1MDYuMDAgMTExOS4wMCBDIDUwMS42NyAxMTA2LjAwLCA0ODguMTcgMTA3My44MywgNDgwLjAwIDEwNDguMDAgQyA0NzEuODMgMTAyMi4xNywgNDYyLjY3IDk4Ny42NywgNDU3LjAwIDk2NC4wMCBDIDQ1MS4zMyA5NDAuMzMsIDQ0OS4xNyA5MjcuMzMsIDQ0Ni4wMCA5MDYuMDAgQyA0NDIuODMgODg0LjY3LCA0MzkuNTAgODY1LjAwLCA0MzguMDAgODM2LjAwIEMgNDM2LjUwIDgwNy4wMCwgNDM2LjUwIDc1OC4zMywgNDM3LjAwIDczMi4wMCBDIDQzNy41MCA3MDUuNjcsIDQzOS4wMCA2OTYuMzMsIDQ0MS4wMCA2NzguMDAgQyA0NDMuMDAgNjU5LjY3LCA0NDQuODMgNjQ0LjAwLCA0NDkuMDAgNjIyLjAwIEMgNDUzLjE3IDYwMC4wMCwgNDY0LjUwIDU1OS4wMCwgNDY2LjAwIDU0Ni4wMCBDIDQ2Ny41MCA1MzMuMDAsIDQ2OC42NyA1NDIuNTAsIDQ1OC4wMCA1NDQuMDAgQyA0NDcuMzMgNTQ1LjUwLCA0MTguMzMgNTUzLjE3LCA0MDIuMDAgNTU1LjAwIEMgMzg1LjY3IDU1Ni44MywgMzczLjgzIDU1Ni4zMywgMzYwLjAwIDU1NS4wMCBDIDM0Ni4xNyA1NTMuNjcsIDMzMC44MyA1NTAuMTcsIDMxOS4wMCA1NDcuMDAgQyAzMDcuMTcgNTQzLjgzLCAyOTQuODMgNTM2LjUwLCAyODkuMDAgNTM2LjAwIFoiLz48cGF0aCBkPSJNIDk2MS4wMCA1MzcuMDAgQyA5NDguNTAgNTM5LjE3LCA5MDcuODMgNTUyLjAwLCA4ODkuMDAgNTU1LjAwIEMgODcwLjE3IDU1OC4wMCwgODY0LjE3IDU1Ny4wMCwgODQ4LjAwIDU1NS4wMCBDIDgzMS44MyA1NTMuMDAsIDgwMi44MyA1NDUuMDAsIDc5Mi4wMCA1NDMuMDAgQyA3ODEuMTcgNTQxLjAwLCA3ODQuODMgNTQyLjUwLCA3ODMuMDAgNTQzLjAwIEMgNzgxLjE3IDU0My41MCwgNzc4LjY3IDUzMy44MywgNzgxLjAwIDU0Ni4wMCBDIDc4My4zMyA1NTguMTcsIDc5Mi42NyA1OTIuMzMsIDc5Ny4wMCA2MTYuMDAgQyA4MDEuMzMgNjM5LjY3LCA4MDQuODMgNjY4LjgzLCA4MDcuMDAgNjg4LjAwIEMgODA5LjE3IDcwNy4xNywgODA5LjY3IDcwOS4wMCwgODEwLjAwIDczMS4wMCBDIDgxMC4zMyA3NTMuMDAsIDgxMC41MCA3OTIuODMsIDgwOS4wMCA4MjAuMDAgQyA4MDcuNTAgODQ3LjE3LCA4MDQuNTAgODcwLjUwLCA4MDEuMDAgODk0LjAwIEMgNzk3LjUwIDkxNy41MCwgNzk0LjAwIDkzNi4xNywgNzg4LjAwIDk2MS4wMCBDIDc4Mi4wMCA5ODUuODMsIDc3My41MCAxMDE2LjY3LCA3NjUuMDAgMTA0My4wMCBDIDc1Ni41MCAxMDY5LjMzLCA3NDEuMzMgMTEwNC44MywgNzM3LjAwIDExMTkuMDAgQyA3MzIuNjcgMTEzMy4xNywgNzM2LjY3IDExMjcuMTcsIDczOS4wMCAxMTI4LjAwIEMgNzQxLjMzIDExMjguODMsIDc0NS44MyAxMTI3LjgzLCA3NTEuMDAgMTEyNC4wMCBDIDc1Ni4xNyAxMTIwLjE3LCA3NTcuMzMgMTEyMC41MCwgNzcwLjAwIDExMDUuMDAgQyA3ODIuNjcgMTA4OS41MCwgODExLjMzIDEwNTMuNTAsIDgyNy4wMCAxMDMxLjAwIEMgODQyLjY3IDEwMDguNTAsIDg1MS4xNyA5OTUuMDAsIDg2NC4wMCA5NzAuMDAgQyA4NzYuODMgOTQ1LjAwLCA4OTIuODMgOTEwLjAwLCA5MDQuMDAgODgxLjAwIEMgOTE1LjE3IDg1Mi4wMCwgOTIzLjAwIDgyNi42NywgOTMxLjAwIDc5Ni4wMCBDIDkzOS4wMCA3NjUuMzMsIDk0Ni42NyA3MjguNjcsIDk1Mi4wMCA2OTcuMDAgQyA5NTcuMzMgNjY1LjMzLCA5NjEuMDAgNjMxLjgzLCA5NjMuMDAgNjA2LjAwIEMgOTY1LjAwIDU4MC4xNywgOTY0LjMzIDU1My41MCwgOTY0LjAwIDU0Mi4wMCBDIDk2My42NyA1MzAuNTAsIDk3My41MCA1MzQuODMsIDk2MS4wMCA1MzcuMDAgWiIvPgogIDwvZz4KPC9zdmc+Cg==\";\n\nfunction getStorage(mode: \"session\" | \"once\"): Storage | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const storage =\n mode === \"session\"\n ? window.sessionStorage\n : window.localStorage;\n const testKey = \"__walros_portal_test__\";\n storage.setItem(testKey, \"1\");\n storage.removeItem(testKey);\n return storage;\n } catch {\n return null;\n }\n}\n\nfunction shouldRunTransition(\n enabled: boolean,\n storageMode: \"always\" | \"session\" | \"once\",\n storageKey: string,\n): boolean {\n if (!enabled) return false;\n if (storageMode === \"always\") return true;\n if (typeof window === \"undefined\") return false;\n\n const storage = getStorage(storageMode);\n if (!storage) return true;\n\n try {\n return storage.getItem(storageKey) == null;\n } catch {\n return true;\n }\n}\n\nexport function WalrosPortalTransition({\n duration = 900,\n onComplete,\n backgroundColor = \"#000000\",\n enabled = true,\n storageMode = \"always\",\n storageKey = \"walros-portal-seen\",\n zIndex = 9999,\n}: WalrosPortalTransitionProps) {\n const [shouldRun] = useState(() =>\n shouldRunTransition(enabled, storageMode, storageKey),\n );\n const [visible, setVisible] = useState(shouldRun);\n const [size, setSize] = useState({ w: 0, h: 0 });\n\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const maskScaleRef = useRef<SVGGElement | null>(null);\n const completedRef = useRef(false);\n const startedRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n const timelineRef = useRef<gsap.core.Timeline | null>(null);\n const previousOverflowRef = useRef(\"\");\n\n const uid = useId().replace(/[:]/g, \"_\");\n const maskId = `walros-portal-mask-${uid}`;\n\n useEffect(() => {\n if (!visible) return;\n\n const element = overlayRef.current;\n if (!element) return;\n\n const measure = () => {\n const rect = element.getBoundingClientRect();\n setSize((previous) =>\n previous.w === rect.width && previous.h === rect.height\n ? previous\n : { w: rect.width, h: rect.height },\n );\n };\n\n measure();\n\n const observer =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(measure)\n : null;\n\n observer?.observe(element);\n window.addEventListener(\"resize\", measure);\n\n return () => {\n observer?.disconnect();\n window.removeEventListener(\"resize\", measure);\n };\n }, [visible]);\n\n useLayoutEffect(() => {\n if (!enabled) {\n setVisible(false);\n return;\n }\n\n if (!visible) return;\n if (completedRef.current || startedRef.current) return;\n if (size.w <= 0 || size.h <= 0) return;\n\n const overlay = overlayRef.current;\n const maskScale = maskScaleRef.current;\n if (!overlay || !maskScale) return;\n\n startedRef.current = true;\n previousOverflowRef.current = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const finish = () => {\n if (completedRef.current) return;\n\n completedRef.current = true;\n document.body.style.overflow = previousOverflowRef.current;\n\n if (storageMode !== \"always\") {\n const storage = getStorage(storageMode);\n try {\n storage?.setItem(storageKey, \"1\");\n } catch {\n // El modo privado o una cuota llena no deben romper la web.\n }\n }\n\n setVisible(false);\n onComplete?.();\n };\n\n const reducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n\n if (reducedMotion) {\n const timeline = gsap.timeline({ onComplete: finish });\n timelineRef.current = timeline;\n timeline.to(overlay, {\n opacity: 0,\n duration: 0.15,\n ease: \"power1.out\",\n });\n return;\n }\n\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n\n const halfDiagonal =\n Math.sqrt(size.w * size.w + size.h * size.h) / 2;\n const initialPixels = Math.min(\n 180,\n Math.max(120, size.w * 0.12),\n );\n const initialScale =\n initialPixels / SILHOUETTE_VIEWBOX;\n const finalScale =\n ((halfDiagonal + 80) / PORTAL_RADIUS) * 1.15;\n\n gsap.set(maskScale, {\n svgOrigin: \"0 0\",\n scale: initialScale,\n });\n\n\n gsap.set(overlay, { opacity: 1 });\n\n const totalSeconds = duration / 1000;\n const timeline = gsap.timeline({ onComplete: finish });\n timelineRef.current = timeline;\n\n timeline.to(\n maskScale,\n {\n scale: initialScale * 1.4,\n duration: totalSeconds * 0.15,\n ease: \"power2.out\",\n },\n 0,\n );\n\n\n timeline.to(\n maskScale,\n {\n scale: finalScale,\n duration: totalSeconds * 0.85,\n ease: \"power2.in\",\n },\n totalSeconds * 0.15,\n );\n\n\n timeline.to(\n overlay,\n {\n opacity: 0,\n duration: totalSeconds * 0.1,\n ease: \"power2.out\",\n },\n totalSeconds * 0.9,\n );\n });\n }, [\n duration,\n enabled,\n onComplete,\n size,\n storageKey,\n storageMode,\n visible,\n ]);\n\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n timelineRef.current?.kill();\n\n if (startedRef.current && !completedRef.current) {\n document.body.style.overflow =\n previousOverflowRef.current;\n }\n };\n }, []);\n\n if (!shouldRun || !visible) return null;\n\n const { w, h } = size;\n const ready = w > 0 && h > 0;\n\n const viewportCenterX = w / 2;\n const viewportCenterY = h / 2;\n const initialPixels = Math.min(\n 180,\n Math.max(120, w * 0.12),\n );\n const initialScale =\n initialPixels / SILHOUETTE_VIEWBOX;\n const visualCenter = SILHOUETTE_VIEWBOX / 2;\n const initialOffsetX =\n (visualCenter - FOCUS_X) * initialScale;\n const initialOffsetY =\n (visualCenter - FOCUS_Y) * initialScale;\n const portalCenterX =\n viewportCenterX - initialOffsetX;\n const portalCenterY =\n viewportCenterY - initialOffsetY;\n\n return (\n <div\n ref={overlayRef}\n aria-hidden=\"true\"\n style={{\n position: \"fixed\",\n inset: 0,\n width: \"100vw\",\n height: \"100dvh\",\n zIndex,\n pointerEvents: \"none\",\n overflow: \"hidden\",\n backgroundColor: ready\n ? \"transparent\"\n : backgroundColor,\n }}\n >\n {ready && (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${w} ${h}`}\n preserveAspectRatio=\"none\"\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"block\",\n }}\n >\n <defs>\n\n <mask\n id={maskId}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width={w}\n height={h}\n >\n <rect\n x=\"0\"\n y=\"0\"\n width={w}\n height={h}\n fill=\"white\"\n />\n\n <g\n transform={`translate(${portalCenterX} ${portalCenterY})`}\n >\n <g\n ref={maskScaleRef}\n transform={`scale(${initialScale})`}\n >\n <image\n href={WALROS_PORTAL_SILHOUETTE_URL}\n x={-FOCUS_X}\n y={-FOCUS_Y}\n width={SILHOUETTE_VIEWBOX}\n height={SILHOUETTE_VIEWBOX}\n />\n </g>\n </g>\n </mask>\n </defs>\n\n <rect\n x=\"0\"\n y=\"0\"\n width={w}\n height={h}\n fill={backgroundColor}\n mask={`url(#${maskId})`}\n />\n\n </svg>\n )}\n </div>\n );\n}\n\nexport default WalrosPortalTransition;\n","export const walrosPortalSilhouetteUrl = new URL(\n \"./assets/walros-portal-silhouette.svg\",\n import.meta.url,\n).href;\n\nexport const walrosLogoChromeUrl = new URL(\n \"./assets/walros-logo-chrome.png\",\n import.meta.url,\n).href;\n\nexport const walrosWordmarkLightUrl = new URL(\n \"./assets/walros-wordmark-light.png\",\n import.meta.url,\n).href;\n\nexport const walrosWordmarkDarkUrl = new URL(\n \"./assets/walros-wordmark-dark.png\",\n import.meta.url,\n).href;\n","import type { ImgHTMLAttributes } from \"react\";\nimport { walrosLogoChromeUrl } from \"../assets\";\n\nexport type WalrosLogoProps = Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n \"src\"\n>;\n\nexport function WalrosLogo({\n alt = \"WalrOS\",\n draggable = false,\n ...props\n}: WalrosLogoProps) {\n return (\n <img\n src={walrosLogoChromeUrl}\n alt={alt}\n draggable={draggable}\n {...props}\n />\n );\n}\n\nexport default WalrosLogo;\n","import type { ImgHTMLAttributes } from \"react\";\nimport {\n walrosWordmarkDarkUrl,\n walrosWordmarkLightUrl,\n} from \"../assets\";\n\nexport type WalrosWordmarkProps = Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n \"src\"\n> & {\n variant?: \"light\" | \"dark\";\n};\n\nexport function WalrosWordmark({\n variant = \"light\",\n alt = \"WalrOS\",\n draggable = false,\n ...props\n}: WalrosWordmarkProps) {\n const src =\n variant === \"dark\"\n ? walrosWordmarkDarkUrl\n : walrosWordmarkLightUrl;\n\n return (\n <img\n src={src}\n alt={alt}\n draggable={draggable}\n {...props}\n />\n );\n}\n\nexport default WalrosWordmark;\n","import type { CSSProperties } from \"react\";\n\nexport type WalrosThemeGlitchProps = {\n active: boolean;\n zIndex?: number;\n className?: string;\n style?: CSSProperties;\n};\n\nconst GLITCH_STYLES = `\n.walros-theme-glitch-root {\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n}\n.walros-theme-glitch-root::before,\n.walros-theme-glitch-root::after {\n content: \"\";\n position: absolute;\n inset: 0;\n mix-blend-mode: screen;\n}\n.walros-theme-glitch-root::before {\n background:\n repeating-linear-gradient(\n 0deg,\n transparent 0 2px,\n rgba(59, 130, 246, 0.35) 2px 3px,\n transparent 3px 5px,\n rgba(236, 72, 153, 0.28) 5px 6px\n );\n animation: walros-glitch-scan 700ms steps(14) forwards;\n}\n.walros-theme-glitch-root::after {\n background:\n linear-gradient(\n 90deg,\n rgba(6, 182, 212, 0.5),\n transparent 40%,\n transparent 60%,\n rgba(236, 72, 153, 0.5)\n );\n animation: walros-glitch-slice 700ms steps(10) forwards;\n}\n\n@keyframes walros-glitch-scan {\n 0% { transform: translate(0, 0); opacity: 1; }\n 15% { transform: translate(-10px, 6px); opacity: 0.9; }\n 30% { transform: translate(8px, -4px); opacity: 1; }\n 45% { transform: translate(-6px, 3px); opacity: 0.85; }\n 60% { transform: translate(4px, -8px); opacity: 1; }\n 80% { transform: translate(-3px, 4px); opacity: 0.6; }\n 100% { transform: translate(0, 0); opacity: 0; }\n}\n\n@keyframes walros-glitch-slice {\n 0% { clip-path: inset(0 0 0 0); transform: translate(0, 0); opacity: 1; }\n 15% { clip-path: inset(20% 0 55% 0); transform: translate(-12px, 0); }\n 30% { clip-path: inset(60% 0 12% 0); transform: translate(14px, 0); }\n 45% { clip-path: inset(35% 0 40% 0); transform: translate(-10px, 0); }\n 60% { clip-path: inset(10% 0 75% 0); transform: translate(8px, 0); }\n 75% { clip-path: inset(72% 0 5% 0); transform: translate(-6px, 0); }\n 90% { clip-path: inset(25% 0 60% 0); transform: translate(4px, 0); opacity: 0.7; }\n 100% { clip-path: inset(0 0 100% 0); transform: translate(0, 0); opacity: 0; }\n}\n\n.walros-theme-glitch-lock {\n overscroll-behavior: none;\n}\n\n.walros-theme-glitch-page {\n will-change: transform, filter;\n}\n\n/* Comportamiento original de WalrOS Forum para páginas normales. */\n.walros-theme-glitch-page--body {\n animation: walros-glitch-page-body 500ms steps(8) both;\n}\n\n@keyframes walros-glitch-page-body {\n 0% { transform: translate(0, 0); filter: none; }\n 20% { transform: translate(-4px, 2px); filter: hue-rotate(40deg) contrast(1.15); }\n 40% { transform: translate(5px, -3px); filter: hue-rotate(-30deg) saturate(1.4); }\n 60% { transform: translate(-3px, 4px); filter: hue-rotate(90deg) contrast(1.1); }\n 80% { transform: translate(2px, -2px); filter: hue-rotate(-60deg) saturate(1.2); }\n 100% { transform: translate(0, 0); filter: none; }\n}\n\n/*\n * Modo seguro para parallax/sticky/ScrollTrigger.\n * El shake se aplica a una capa estable del viewport, nunca al scroll real.\n * El pequeño overscan evita descubrir bordes al desplazar la escena.\n */\n.walros-theme-glitch-page--viewport {\n transform-origin: 50% var(--walros-glitch-origin-y, 50%);\n animation: walros-glitch-page-viewport 500ms steps(8) both;\n}\n\n@keyframes walros-glitch-page-viewport {\n 0% { transform: translate3d(0, 0, 0) scale(1.012); filter: none; }\n 20% { transform: translate3d(-4px, 2px, 0) scale(1.012); filter: hue-rotate(40deg) contrast(1.15); }\n 40% { transform: translate3d(5px, -3px, 0) scale(1.012); filter: hue-rotate(-30deg) saturate(1.4); }\n 60% { transform: translate3d(-3px, 4px, 0) scale(1.012); filter: hue-rotate(90deg) contrast(1.1); }\n 80% { transform: translate3d(2px, -2px, 0) scale(1.012); filter: hue-rotate(-60deg) saturate(1.2); }\n 100% { transform: translate3d(0, 0, 0) scale(1); filter: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .walros-theme-glitch-root::before,\n .walros-theme-glitch-root::after {\n animation: walros-glitch-reduced 150ms ease-out forwards;\n }\n\n .walros-theme-glitch-page--body,\n .walros-theme-glitch-page--viewport {\n animation: none;\n }\n\n @keyframes walros-glitch-reduced {\n from { opacity: 0.35; }\n to { opacity: 0; }\n }\n}\n`;\n\nexport function WalrosThemeGlitch({\n active,\n zIndex = 9998,\n className,\n style,\n}: WalrosThemeGlitchProps) {\n return (\n <>\n <style>{GLITCH_STYLES}</style>\n {active ? (\n <div\n className={[\"walros-theme-glitch-root\", className]\n .filter(Boolean)\n .join(\" \")}\n style={{ zIndex, ...style }}\n aria-hidden=\"true\"\n />\n ) : null}\n </>\n );\n}\n\nexport default WalrosThemeGlitch;\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { RefObject } from \"react\";\n\nexport type WalrosTheme = \"light\" | \"dark\";\nexport type WalrosThemeMode = \"body\" | \"viewport\";\n\nexport type WalrosThemeShakeTarget =\n | HTMLElement\n | RefObject<HTMLElement | null>\n | null\n | undefined;\n\nexport type UseWalrosThemeOptions = {\n storageKey?: string;\n defaultTheme?: WalrosTheme;\n useSystemPreference?: boolean;\n swapDelay?: number;\n totalDuration?: number;\n applyTheme?: (theme: WalrosTheme) => void;\n\n /**\n * `body` reproduce el comportamiento original de WalrOS Forum.\n * `viewport` bloquea el scroll y sacude solo los elementos indicados,\n * recomendado para parallax, sticky y GSAP ScrollTrigger.\n */\n mode?: WalrosThemeMode;\n\n /** Elementos que recibirán el shake cuando mode=\"viewport\". */\n shakeTargets?: readonly WalrosThemeShakeTarget[];\n\n /**\n * En modo viewport se activa por defecto. Mantiene scrollX/scrollY estables\n * con requestAnimationFrame sin usar position: fixed en el body.\n */\n lockScroll?: boolean;\n\n /** Se ejecuta después de restaurar el scroll; útil para ScrollTrigger.update(). */\n onAfterUnlock?: () => void;\n};\n\nexport type UseWalrosThemeResult = {\n theme: WalrosTheme;\n isDark: boolean;\n mounted: boolean;\n glitching: boolean;\n toggleTheme: () => void;\n setTheme: (theme: WalrosTheme) => void;\n};\n\ntype ViewportLockState = {\n scrollX: number;\n scrollY: number;\n rafId: number;\n active: boolean;\n bodyOverflow: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n};\n\nconst GLITCH_BASE_CLASS = \"walros-theme-glitch-page\";\nconst GLITCH_BODY_CLASS = \"walros-theme-glitch-page--body\";\nconst GLITCH_VIEWPORT_CLASS = \"walros-theme-glitch-page--viewport\";\nconst GLITCH_LOCK_CLASS = \"walros-theme-glitch-lock\";\n\nfunction defaultApplyTheme(theme: WalrosTheme) {\n if (typeof document === \"undefined\") return;\n\n const root = document.documentElement;\n root.classList.toggle(\"dark\", theme === \"dark\");\n root.style.colorScheme = theme;\n}\n\nfunction readInitialTheme(\n storageKey: string,\n defaultTheme: WalrosTheme,\n useSystemPreference: boolean,\n): WalrosTheme {\n if (typeof window === \"undefined\") return defaultTheme;\n\n try {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\") return stored;\n } catch {\n // localStorage puede estar bloqueado en modo privado.\n }\n\n if (\n useSystemPreference &&\n window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n ) {\n return \"dark\";\n }\n\n return defaultTheme;\n}\n\nfunction resolveShakeTargets(\n targets: readonly WalrosThemeShakeTarget[],\n): HTMLElement[] {\n const resolved = new Set<HTMLElement>();\n\n for (const target of targets) {\n if (!target) continue;\n\n const element =\n typeof target === \"object\" && \"current\" in target\n ? target.current\n : target;\n\n if (element) resolved.add(element);\n }\n\n return [...resolved];\n}\n\nexport function useWalrosTheme({\n storageKey = \"walros-theme\",\n defaultTheme = \"light\",\n useSystemPreference = false,\n swapDelay = 220,\n totalDuration = 720,\n applyTheme = defaultApplyTheme,\n mode = \"body\",\n shakeTargets = [],\n lockScroll,\n onAfterUnlock,\n}: UseWalrosThemeOptions = {}): UseWalrosThemeResult {\n const [theme, setThemeState] = useState<WalrosTheme>(() =>\n readInitialTheme(storageKey, defaultTheme, useSystemPreference),\n );\n const [mounted, setMounted] = useState(false);\n const [glitching, setGlitching] = useState(false);\n\n const themeRef = useRef(theme);\n const glitchingRef = useRef(false);\n const swapTimerRef = useRef<number | null>(null);\n const cleanupTimerRef = useRef<number | null>(null);\n const applyThemeRef = useRef(applyTheme);\n const modeRef = useRef(mode);\n const shakeTargetsRef = useRef(shakeTargets);\n const lockScrollRef = useRef(lockScroll);\n const onAfterUnlockRef = useRef(onAfterUnlock);\n const activeTargetsRef = useRef<HTMLElement[]>([]);\n const viewportLockRef = useRef<ViewportLockState | null>(null);\n\n themeRef.current = theme;\n applyThemeRef.current = applyTheme;\n modeRef.current = mode;\n shakeTargetsRef.current = shakeTargets;\n lockScrollRef.current = lockScroll;\n onAfterUnlockRef.current = onAfterUnlock;\n\n const persistTheme = useCallback(\n (nextTheme: WalrosTheme) => {\n applyThemeRef.current(nextTheme);\n setThemeState(nextTheme);\n themeRef.current = nextTheme;\n\n try {\n window.localStorage.setItem(storageKey, nextTheme);\n } catch {\n // El cambio debe funcionar aunque localStorage falle.\n }\n },\n [storageKey],\n );\n\n useEffect(() => {\n const initialTheme = readInitialTheme(\n storageKey,\n defaultTheme,\n useSystemPreference,\n );\n\n themeRef.current = initialTheme;\n setThemeState(initialTheme);\n applyThemeRef.current(initialTheme);\n setMounted(true);\n }, [defaultTheme, storageKey, useSystemPreference]);\n\n const clearTimers = useCallback(() => {\n if (swapTimerRef.current !== null) {\n window.clearTimeout(swapTimerRef.current);\n swapTimerRef.current = null;\n }\n\n if (cleanupTimerRef.current !== null) {\n window.clearTimeout(cleanupTimerRef.current);\n cleanupTimerRef.current = null;\n }\n }, []);\n\n const lockViewport = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n typeof document === \"undefined\" ||\n viewportLockRef.current\n ) {\n return;\n }\n\n const body = document.body;\n const html = document.documentElement;\n const lockState: ViewportLockState = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n rafId: 0,\n active: true,\n bodyOverflow: body.style.overflow,\n htmlOverflow: html.style.overflow,\n htmlOverscrollBehavior: html.style.overscrollBehavior,\n };\n\n viewportLockRef.current = lockState;\n\n const keepScrollStable = () => {\n if (!lockState.active) return;\n window.scrollTo(lockState.scrollX, lockState.scrollY);\n lockState.rafId = window.requestAnimationFrame(keepScrollStable);\n };\n\n html.classList.add(GLITCH_LOCK_CLASS);\n html.style.overflow = \"hidden\";\n html.style.overscrollBehavior = \"none\";\n body.style.overflow = \"hidden\";\n lockState.rafId = window.requestAnimationFrame(keepScrollStable);\n }, []);\n\n const unlockViewport = useCallback((runCallback: boolean) => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n const lockState = viewportLockRef.current;\n if (!lockState) return;\n\n lockState.active = false;\n window.cancelAnimationFrame(lockState.rafId);\n\n const body = document.body;\n const html = document.documentElement;\n body.style.overflow = lockState.bodyOverflow;\n html.style.overflow = lockState.htmlOverflow;\n html.style.overscrollBehavior = lockState.htmlOverscrollBehavior;\n html.classList.remove(GLITCH_LOCK_CLASS);\n\n viewportLockRef.current = null;\n window.scrollTo(lockState.scrollX, lockState.scrollY);\n\n if (runCallback) {\n window.requestAnimationFrame(() => {\n onAfterUnlockRef.current?.();\n });\n }\n }, []);\n\n const removeShakeClasses = useCallback(() => {\n for (const target of activeTargetsRef.current) {\n target.classList.remove(\n GLITCH_BASE_CLASS,\n GLITCH_BODY_CLASS,\n GLITCH_VIEWPORT_CLASS,\n );\n target.style.removeProperty(\"--walros-glitch-origin-y\");\n }\n\n activeTargetsRef.current = [];\n }, []);\n\n const finishGlitch = useCallback(() => {\n removeShakeClasses();\n unlockViewport(true);\n glitchingRef.current = false;\n setGlitching(false);\n }, [removeShakeClasses, unlockViewport]);\n\n const setTheme = useCallback(\n (nextTheme: WalrosTheme) => {\n if (glitchingRef.current) return;\n persistTheme(nextTheme);\n },\n [persistTheme],\n );\n\n const toggleTheme = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n typeof document === \"undefined\" ||\n glitchingRef.current\n ) {\n return;\n }\n\n const currentMode = modeRef.current;\n const shouldLockScroll =\n lockScrollRef.current ?? currentMode === \"viewport\";\n\n if (currentMode === \"viewport\" && shouldLockScroll) {\n lockViewport();\n }\n\n const targets =\n currentMode === \"body\"\n ? [document.body]\n : resolveShakeTargets(shakeTargetsRef.current);\n\n const modeClass =\n currentMode === \"body\"\n ? GLITCH_BODY_CLASS\n : GLITCH_VIEWPORT_CLASS;\n\n for (const target of targets) {\n target.style.setProperty(\n \"--walros-glitch-origin-y\",\n currentMode === \"body\"\n ? `${window.scrollY + window.innerHeight / 2}px`\n : \"50%\",\n );\n target.classList.add(GLITCH_BASE_CLASS, modeClass);\n }\n\n activeTargetsRef.current = targets;\n glitchingRef.current = true;\n setGlitching(true);\n\n const reducedMotion = window.matchMedia?.(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n\n const nextTheme: WalrosTheme =\n themeRef.current === \"dark\" ? \"light\" : \"dark\";\n\n const effectiveSwapDelay = reducedMotion\n ? 75\n : Math.max(0, swapDelay);\n const effectiveDuration = reducedMotion\n ? 150\n : Math.max(effectiveSwapDelay, totalDuration);\n\n swapTimerRef.current = window.setTimeout(() => {\n persistTheme(nextTheme);\n swapTimerRef.current = null;\n }, effectiveSwapDelay);\n\n cleanupTimerRef.current = window.setTimeout(() => {\n cleanupTimerRef.current = null;\n finishGlitch();\n }, effectiveDuration);\n }, [finishGlitch, lockViewport, persistTheme, swapDelay, totalDuration]);\n\n useEffect(() => {\n return () => {\n clearTimers();\n removeShakeClasses();\n unlockViewport(false);\n };\n }, [clearTimers, removeShakeClasses, unlockViewport]);\n\n return {\n theme,\n isDark: theme === \"dark\",\n mounted,\n glitching,\n toggleTheme,\n setTheme,\n };\n}\n\nexport default useWalrosTheme;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/WalrosPortalTransition.tsx","../src/assets.ts","../src/components/WalrosLogo.tsx","../src/components/WalrosWordmark.tsx","../src/components/WalrosThemeGlitch.tsx","../src/hooks/useWalrosTheme.ts"],"sourcesContent":["import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { gsap } from \"gsap\";\n\nexport type WalrosPortalTransitionProps = {\n duration?: number;\n onComplete?: () => void;\n backgroundColor?: string;\n enabled?: boolean;\n storageMode?: \"always\" | \"session\" | \"once\";\n storageKey?: string;\n zIndex?: number;\n};\n\nconst SILHOUETTE_VIEWBOX = 1254;\nconst FOCUS_X = 626;\nconst FOCUS_Y = 333;\nconst PORTAL_RADIUS = 190;\nconst WALROS_PORTAL_SILHOUETTE_URL =\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgdmlld0JveD0iMCAwIDEyNTQgMTI1NCIKICAgICB3aWR0aD0iMTI1NCIgaGVpZ2h0PSIxMjU0IgogICAgIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iU2lsdWV0YSBXYWxyT1MiPgogIDxnIGZpbGw9IiMwMDAwMDAiPgogICAgPHBhdGggZD0iTSAyNDQuMDAgMzU0LjAwIEMgMjQwLjUwIDM3Ny42NywgMjQwLjE3IDQxMy42NywgMjQyLjAwIDQzNC4wMCBDIDI0My44MyA0NTQuMzMsIDI0OS41MCA0NjQuNTAsIDI1NS4wMCA0NzYuMDAgQyAyNjAuNTAgNDg3LjUwLCAyNjguNTAgNDk2LjAwLCAyNzUuMDAgNTAzLjAwIEMgMjgxLjUwIDUxMC4wMCwgMjg3LjE3IDUxMy42NywgMjk0LjAwIDUxOC4wMCBDIDMwMC44MyA1MjIuMzMsIDMwNi4wMCA1MjUuNjcsIDMxNi4wMCA1MjkuMDAgQyAzMjYuMDAgNTMyLjMzLCAzMzYuMzMgNTM2LjY3LCAzNTQuMDAgNTM4LjAwIEMgMzcxLjY3IDUzOS4zMywgMzk3LjgzIDU0MC44MywgNDIyLjAwIDUzNy4wMCBDIDQ0Ni4xNyA1MzMuMTcsIDQ3NC4xNyA1MjUuMzMsIDQ5OS4wMCA1MTUuMDAgQyA1MjMuODMgNTA0LjY3LCA1NTAuMDAgNDg5LjMzLCA1NzEuMDAgNDc1LjAwIEMgNTkyLjAwIDQ2MC42NywgNjE1LjAwIDQzNi41MCwgNjI1LjAwIDQyOS4wMCBDIDYzNS4wMCA0MjEuNTAsIDYyMy42NyA0MjQuMDAsIDYzMS4wMCA0MzAuMDAgQyA2MzguMzMgNDM2LjAwLCA2NTYuNjcgNDU0LjgzLCA2NjkuMDAgNDY1LjAwIEMgNjgxLjMzIDQ3NS4xNywgNjkwLjAwIDQ4Mi4xNywgNzA1LjAwIDQ5MS4wMCBDIDcyMC4wMCA0OTkuODMsIDc0My42NyA1MTEuNTAsIDc1OS4wMCA1MTguMDAgQyA3NzQuMzMgNTI0LjUwLCA3ODQuMDAgNTI2LjgzLCA3OTcuMDAgNTMwLjAwIEMgODEwLjAwIDUzMy4xNywgODIwLjAwIDUzNS44MywgODM3LjAwIDUzNy4wMCBDIDg1NC4wMCA1MzguMTcsIDg4MS4xNyA1MzkuMDAsIDg5OS4wMCA1MzcuMDAgQyA5MTYuODMgNTM1LjAwLCA5MzIuMDAgNTMwLjAwLCA5NDQuMDAgNTI1LjAwIEMgOTU2LjAwIDUyMC4wMCwgOTYyLjAwIDUxNi4xNywgOTcxLjAwIDUwNy4wMCBDIDk4MC4wMCA0OTcuODMsIDk5MS42NyA0ODIuODMsIDk5OC4wMCA0NzAuMDAgQyAxMDA0LjMzIDQ1Ny4xNywgMTAwNy4xNyA0NDYuMzMsIDEwMDkuMDAgNDMwLjAwIEMgMTAxMC44MyA0MTMuNjcsIDEwMTAuODMgMzkwLjUwLCAxMDA5LjAwIDM3Mi4wMCBDIDEwMDcuMTcgMzUzLjUwLCAxMDAzLjgzIDMzNy4xNywgOTk4LjAwIDMxOS4wMCBDIDk5Mi4xNyAzMDAuODMsIDk4My42NyAyODAuMTcsIDk3NC4wMCAyNjMuMDAgQyA5NjQuMzMgMjQ1LjgzLCA5NTIuMDAgMjI5LjY3LCA5NDAuMDAgMjE2LjAwIEMgOTI4LjAwIDIwMi4zMywgOTE3LjE3IDE5Mi4wMCwgOTAyLjAwIDE4MS4wMCBDIDg4Ni44MyAxNzAuMDAsIDg2Ni41MCAxNTguMTcsIDg0OS4wMCAxNTAuMDAgQyA4MzEuNTAgMTQxLjgzLCA4MTYuNjcgMTM3LjAwLCA3OTcuMDAgMTMyLjAwIEMgNzc3LjMzIDEyNy4wMCwgNzU2LjY3IDEyMi44MywgNzMxLjAwIDEyMC4wMCBDIDcwNS4zMyAxMTcuMTcsIDY3My42NyAxMTUuMzMsIDY0My4wMCAxMTUuMDAgQyA2MTIuMzMgMTE0LjY3LCA1NzUuNjcgMTE1LjY3LCA1NDcuMDAgMTE4LjAwIEMgNTE4LjMzIDEyMC4zMywgNDk2LjE3IDEyMy4wMCwgNDcxLjAwIDEyOS4wMCBDIDQ0NS44MyAxMzUuMDAsIDQxOC4zMyAxNDMuNTAsIDM5Ni4wMCAxNTQuMDAgQyAzNzMuNjcgMTY0LjUwLCAzNTMuNTAgMTc4LjUwLCAzMzcuMDAgMTkyLjAwIEMgMzIwLjUwIDIwNS41MCwgMzA5LjMzIDIxOC4zMywgMjk3LjAwIDIzNS4wMCBDIDI4NC42NyAyNTEuNjcsIDI3MS44MyAyNzIuMTcsIDI2My4wMCAyOTIuMDAgQyAyNTQuMTcgMzExLjgzLCAyNDcuNTAgMzMwLjMzLCAyNDQuMDAgMzU0LjAwIFoiLz48cGF0aCBkPSJNIDI4OS4wMCA1MzYuMDAgQyAyODMuMTcgNTM1LjUwLCAyODQuODMgNTMzLjAwLCAyODQuMDAgNTQ0LjAwIEMgMjgzLjE3IDU1NS4wMCwgMjgyLjY3IDU3OC42NywgMjg0LjAwIDYwMi4wMCBDIDI4NS4zMyA2MjUuMzMsIDI4Ny4wMCA2NTEuODMsIDI5Mi4wMCA2ODQuMDAgQyAyOTcuMDAgNzE2LjE3LCAzMDYuMzMgNzYzLjUwLCAzMTQuMDAgNzk1LjAwIEMgMzIxLjY3IDgyNi41MCwgMzI4LjY3IDg0Ny4xNywgMzM4LjAwIDg3My4wMCBDIDM0Ny4zMyA4OTguODMsIDM1Ny4wMCA5MjMuNjcsIDM3MC4wMCA5NTAuMDAgQyAzODMuMDAgOTc2LjMzLCAzOTkuNjcgMTAwNi4wMCwgNDE2LjAwIDEwMzEuMDAgQyA0MzIuMzMgMTA1Ni4wMCwgNDU1LjMzIDEwODQuNTAsIDQ2OC4wMCAxMTAwLjAwIEMgNDgwLjY3IDExMTUuNTAsIDQ4Ni4xNyAxMTE5LjMzLCA0OTIuMDAgMTEyNC4wMCBDIDQ5Ny44MyAxMTI4LjY3LCA1MDAuNjcgMTEyNy42NywgNTAzLjAwIDExMjguMDAgQyA1MDUuMzMgMTEyOC4zMywgNTA1LjUwIDExMjcuNTAsIDUwNi4wMCAxMTI2LjAwIEMgNTA2LjUwIDExMjQuNTAsIDUxMC4zMyAxMTMyLjAwLCA1MDYuMDAgMTExOS4wMCBDIDUwMS42NyAxMTA2LjAwLCA0ODguMTcgMTA3My44MywgNDgwLjAwIDEwNDguMDAgQyA0NzEuODMgMTAyMi4xNywgNDYyLjY3IDk4Ny42NywgNDU3LjAwIDk2NC4wMCBDIDQ1MS4zMyA5NDAuMzMsIDQ0OS4xNyA5MjcuMzMsIDQ0Ni4wMCA5MDYuMDAgQyA0NDIuODMgODg0LjY3LCA0MzkuNTAgODY1LjAwLCA0MzguMDAgODM2LjAwIEMgNDM2LjUwIDgwNy4wMCwgNDM2LjUwIDc1OC4zMywgNDM3LjAwIDczMi4wMCBDIDQzNy41MCA3MDUuNjcsIDQzOS4wMCA2OTYuMzMsIDQ0MS4wMCA2NzguMDAgQyA0NDMuMDAgNjU5LjY3LCA0NDQuODMgNjQ0LjAwLCA0NDkuMDAgNjIyLjAwIEMgNDUzLjE3IDYwMC4wMCwgNDY0LjUwIDU1OS4wMCwgNDY2LjAwIDU0Ni4wMCBDIDQ2Ny41MCA1MzMuMDAsIDQ2OC42NyA1NDIuNTAsIDQ1OC4wMCA1NDQuMDAgQyA0NDcuMzMgNTQ1LjUwLCA0MTguMzMgNTUzLjE3LCA0MDIuMDAgNTU1LjAwIEMgMzg1LjY3IDU1Ni44MywgMzczLjgzIDU1Ni4zMywgMzYwLjAwIDU1NS4wMCBDIDM0Ni4xNyA1NTMuNjcsIDMzMC44MyA1NTAuMTcsIDMxOS4wMCA1NDcuMDAgQyAzMDcuMTcgNTQzLjgzLCAyOTQuODMgNTM2LjUwLCAyODkuMDAgNTM2LjAwIFoiLz48cGF0aCBkPSJNIDk2MS4wMCA1MzcuMDAgQyA5NDguNTAgNTM5LjE3LCA5MDcuODMgNTUyLjAwLCA4ODkuMDAgNTU1LjAwIEMgODcwLjE3IDU1OC4wMCwgODY0LjE3IDU1Ny4wMCwgODQ4LjAwIDU1NS4wMCBDIDgzMS44MyA1NTMuMDAsIDgwMi44MyA1NDUuMDAsIDc5Mi4wMCA1NDMuMDAgQyA3ODEuMTcgNTQxLjAwLCA3ODQuODMgNTQyLjUwLCA3ODMuMDAgNTQzLjAwIEMgNzgxLjE3IDU0My41MCwgNzc4LjY3IDUzMy44MywgNzgxLjAwIDU0Ni4wMCBDIDc4My4zMyA1NTguMTcsIDc5Mi42NyA1OTIuMzMsIDc5Ny4wMCA2MTYuMDAgQyA4MDEuMzMgNjM5LjY3LCA4MDQuODMgNjY4LjgzLCA4MDcuMDAgNjg4LjAwIEMgODA5LjE3IDcwNy4xNywgODA5LjY3IDcwOS4wMCwgODEwLjAwIDczMS4wMCBDIDgxMC4zMyA3NTMuMDAsIDgxMC41MCA3OTIuODMsIDgwOS4wMCA4MjAuMDAgQyA4MDcuNTAgODQ3LjE3LCA4MDQuNTAgODcwLjUwLCA4MDEuMDAgODk0LjAwIEMgNzk3LjUwIDkxNy41MCwgNzk0LjAwIDkzNi4xNywgNzg4LjAwIDk2MS4wMCBDIDc4Mi4wMCA5ODUuODMsIDc3My41MCAxMDE2LjY3LCA3NjUuMDAgMTA0My4wMCBDIDc1Ni41MCAxMDY5LjMzLCA3NDEuMzMgMTEwNC44MywgNzM3LjAwIDExMTkuMDAgQyA3MzIuNjcgMTEzMy4xNywgNzM2LjY3IDExMjcuMTcsIDczOS4wMCAxMTI4LjAwIEMgNzQxLjMzIDExMjguODMsIDc0NS44MyAxMTI3LjgzLCA3NTEuMDAgMTEyNC4wMCBDIDc1Ni4xNyAxMTIwLjE3LCA3NTcuMzMgMTEyMC41MCwgNzcwLjAwIDExMDUuMDAgQyA3ODIuNjcgMTA4OS41MCwgODExLjMzIDEwNTMuNTAsIDgyNy4wMCAxMDMxLjAwIEMgODQyLjY3IDEwMDguNTAsIDg1MS4xNyA5OTUuMDAsIDg2NC4wMCA5NzAuMDAgQyA4NzYuODMgOTQ1LjAwLCA4OTIuODMgOTEwLjAwLCA5MDQuMDAgODgxLjAwIEMgOTE1LjE3IDg1Mi4wMCwgOTIzLjAwIDgyNi42NywgOTMxLjAwIDc5Ni4wMCBDIDkzOS4wMCA3NjUuMzMsIDk0Ni42NyA3MjguNjcsIDk1Mi4wMCA2OTcuMDAgQyA5NTcuMzMgNjY1LjMzLCA5NjEuMDAgNjMxLjgzLCA5NjMuMDAgNjA2LjAwIEMgOTY1LjAwIDU4MC4xNywgOTY0LjMzIDU1My41MCwgOTY0LjAwIDU0Mi4wMCBDIDk2My42NyA1MzAuNTAsIDk3My41MCA1MzQuODMsIDk2MS4wMCA1MzcuMDAgWiIvPgogIDwvZz4KPC9zdmc+Cg==\";\n\nfunction getStorage(mode: \"session\" | \"once\"): Storage | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const storage =\n mode === \"session\"\n ? window.sessionStorage\n : window.localStorage;\n const testKey = \"__walros_portal_test__\";\n storage.setItem(testKey, \"1\");\n storage.removeItem(testKey);\n return storage;\n } catch {\n return null;\n }\n}\n\nfunction shouldRunTransition(\n enabled: boolean,\n storageMode: \"always\" | \"session\" | \"once\",\n storageKey: string,\n): boolean {\n if (!enabled) return false;\n if (storageMode === \"always\") return true;\n if (typeof window === \"undefined\") return false;\n\n const storage = getStorage(storageMode);\n if (!storage) return true;\n\n try {\n return storage.getItem(storageKey) == null;\n } catch {\n return true;\n }\n}\n\nexport function WalrosPortalTransition({\n duration = 900,\n onComplete,\n backgroundColor = \"#000000\",\n enabled = true,\n storageMode = \"always\",\n storageKey = \"walros-portal-seen\",\n zIndex = 9999,\n}: WalrosPortalTransitionProps) {\n const [shouldRun] = useState(() =>\n shouldRunTransition(enabled, storageMode, storageKey),\n );\n const [visible, setVisible] = useState(shouldRun);\n const [size, setSize] = useState({ w: 0, h: 0 });\n\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const maskScaleRef = useRef<SVGGElement | null>(null);\n const completedRef = useRef(false);\n const startedRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n const timelineRef = useRef<gsap.core.Timeline | null>(null);\n const previousOverflowRef = useRef(\"\");\n\n const uid = useId().replace(/[:]/g, \"_\");\n const maskId = `walros-portal-mask-${uid}`;\n\n useEffect(() => {\n if (!visible) return;\n\n const element = overlayRef.current;\n if (!element) return;\n\n const measure = () => {\n const rect = element.getBoundingClientRect();\n setSize((previous) =>\n previous.w === rect.width && previous.h === rect.height\n ? previous\n : { w: rect.width, h: rect.height },\n );\n };\n\n measure();\n\n const observer =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(measure)\n : null;\n\n observer?.observe(element);\n window.addEventListener(\"resize\", measure);\n\n return () => {\n observer?.disconnect();\n window.removeEventListener(\"resize\", measure);\n };\n }, [visible]);\n\n useLayoutEffect(() => {\n if (!enabled) {\n setVisible(false);\n return;\n }\n\n if (!visible) return;\n if (completedRef.current || startedRef.current) return;\n if (size.w <= 0 || size.h <= 0) return;\n\n const overlay = overlayRef.current;\n const maskScale = maskScaleRef.current;\n if (!overlay || !maskScale) return;\n\n startedRef.current = true;\n previousOverflowRef.current = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const finish = () => {\n if (completedRef.current) return;\n\n completedRef.current = true;\n document.body.style.overflow = previousOverflowRef.current;\n\n if (storageMode !== \"always\") {\n const storage = getStorage(storageMode);\n try {\n storage?.setItem(storageKey, \"1\");\n } catch {\n // El modo privado o una cuota llena no deben romper la web.\n }\n }\n\n setVisible(false);\n onComplete?.();\n };\n\n const reducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n\n if (reducedMotion) {\n const timeline = gsap.timeline({ onComplete: finish });\n timelineRef.current = timeline;\n timeline.to(overlay, {\n opacity: 0,\n duration: 0.15,\n ease: \"power1.out\",\n });\n return;\n }\n\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n\n const halfDiagonal =\n Math.sqrt(size.w * size.w + size.h * size.h) / 2;\n const initialPixels = Math.min(\n 180,\n Math.max(120, size.w * 0.12),\n );\n const initialScale =\n initialPixels / SILHOUETTE_VIEWBOX;\n const finalScale =\n ((halfDiagonal + 80) / PORTAL_RADIUS) * 1.15;\n\n gsap.set(maskScale, {\n svgOrigin: \"0 0\",\n scale: initialScale,\n });\n\n\n gsap.set(overlay, { opacity: 1 });\n\n const totalSeconds = duration / 1000;\n const timeline = gsap.timeline({ onComplete: finish });\n timelineRef.current = timeline;\n\n timeline.to(\n maskScale,\n {\n scale: initialScale * 1.4,\n duration: totalSeconds * 0.15,\n ease: \"power2.out\",\n },\n 0,\n );\n\n\n timeline.to(\n maskScale,\n {\n scale: finalScale,\n duration: totalSeconds * 0.85,\n ease: \"power2.in\",\n },\n totalSeconds * 0.15,\n );\n\n\n timeline.to(\n overlay,\n {\n opacity: 0,\n duration: totalSeconds * 0.1,\n ease: \"power2.out\",\n },\n totalSeconds * 0.9,\n );\n });\n }, [\n duration,\n enabled,\n onComplete,\n size,\n storageKey,\n storageMode,\n visible,\n ]);\n\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n timelineRef.current?.kill();\n\n if (startedRef.current && !completedRef.current) {\n document.body.style.overflow =\n previousOverflowRef.current;\n }\n };\n }, []);\n\n if (!shouldRun || !visible) return null;\n\n const { w, h } = size;\n const ready = w > 0 && h > 0;\n\n const viewportCenterX = w / 2;\n const viewportCenterY = h / 2;\n const initialPixels = Math.min(\n 180,\n Math.max(120, w * 0.12),\n );\n const initialScale =\n initialPixels / SILHOUETTE_VIEWBOX;\n const visualCenter = SILHOUETTE_VIEWBOX / 2;\n const initialOffsetX =\n (visualCenter - FOCUS_X) * initialScale;\n const initialOffsetY =\n (visualCenter - FOCUS_Y) * initialScale;\n const portalCenterX =\n viewportCenterX - initialOffsetX;\n const portalCenterY =\n viewportCenterY - initialOffsetY;\n\n return (\n <div\n ref={overlayRef}\n aria-hidden=\"true\"\n style={{\n position: \"fixed\",\n inset: 0,\n width: \"100vw\",\n height: \"100dvh\",\n zIndex,\n pointerEvents: \"none\",\n overflow: \"hidden\",\n backgroundColor: ready\n ? \"transparent\"\n : backgroundColor,\n }}\n >\n {ready && (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${w} ${h}`}\n preserveAspectRatio=\"none\"\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"block\",\n }}\n >\n <defs>\n\n <mask\n id={maskId}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width={w}\n height={h}\n >\n <rect\n x=\"0\"\n y=\"0\"\n width={w}\n height={h}\n fill=\"white\"\n />\n\n <g\n transform={`translate(${portalCenterX} ${portalCenterY})`}\n >\n <g\n ref={maskScaleRef}\n transform={`scale(${initialScale})`}\n >\n <image\n href={WALROS_PORTAL_SILHOUETTE_URL}\n x={-FOCUS_X}\n y={-FOCUS_Y}\n width={SILHOUETTE_VIEWBOX}\n height={SILHOUETTE_VIEWBOX}\n />\n </g>\n </g>\n </mask>\n </defs>\n\n <rect\n x=\"0\"\n y=\"0\"\n width={w}\n height={h}\n fill={backgroundColor}\n mask={`url(#${maskId})`}\n />\n\n </svg>\n )}\n </div>\n );\n}\n\nexport default WalrosPortalTransition;\n","export const walrosPortalSilhouetteUrl = new URL(\n \"./assets/walros-portal-silhouette.svg\",\n import.meta.url,\n).href;\n\nexport const walrosLogoChromeUrl = new URL(\n \"./assets/walros-logo-chrome.png\",\n import.meta.url,\n).href;\n\nexport const walrosWordmarkLightUrl = new URL(\n \"./assets/walros-wordmark-light.png\",\n import.meta.url,\n).href;\n\nexport const walrosWordmarkDarkUrl = new URL(\n \"./assets/walros-wordmark-dark.png\",\n import.meta.url,\n).href;\n\nexport const walrosThemeGlitchSoundUrl = new URL(\n \"./assets/walros-theme-glitch.mp3\",\n import.meta.url,\n).href;\n","import type { ImgHTMLAttributes } from \"react\";\nimport { walrosLogoChromeUrl } from \"../assets\";\n\nexport type WalrosLogoProps = Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n \"src\"\n>;\n\nexport function WalrosLogo({\n alt = \"WalrOS\",\n draggable = false,\n ...props\n}: WalrosLogoProps) {\n return (\n <img\n src={walrosLogoChromeUrl}\n alt={alt}\n draggable={draggable}\n {...props}\n />\n );\n}\n\nexport default WalrosLogo;\n","import type { ImgHTMLAttributes } from \"react\";\nimport {\n walrosWordmarkDarkUrl,\n walrosWordmarkLightUrl,\n} from \"../assets\";\n\nexport type WalrosWordmarkProps = Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n \"src\"\n> & {\n variant?: \"light\" | \"dark\";\n};\n\nexport function WalrosWordmark({\n variant = \"light\",\n alt = \"WalrOS\",\n draggable = false,\n ...props\n}: WalrosWordmarkProps) {\n const src =\n variant === \"dark\"\n ? walrosWordmarkDarkUrl\n : walrosWordmarkLightUrl;\n\n return (\n <img\n src={src}\n alt={alt}\n draggable={draggable}\n {...props}\n />\n );\n}\n\nexport default WalrosWordmark;\n","import type { CSSProperties } from \"react\";\n\nexport type WalrosThemeGlitchProps = {\n active: boolean;\n zIndex?: number;\n className?: string;\n style?: CSSProperties;\n};\n\nconst GLITCH_STYLES = `\n.walros-theme-glitch-root {\n position: fixed;\n inset: 0;\n z-index: 9998;\n pointer-events: none;\n overflow: hidden;\n visibility: hidden;\n}\n.walros-theme-glitch-root.is-active {\n visibility: visible;\n}\n.walros-theme-glitch-root::before,\n.walros-theme-glitch-root::after {\n content: \"\";\n position: absolute;\n inset: 0;\n mix-blend-mode: screen;\n}\n.walros-theme-glitch-root::before {\n background: rgba(0, 0, 0, .82);\n mix-blend-mode: normal;\n animation: walros-glitch-flash 1500ms steps(1, end) both;\n}\n.walros-theme-glitch-root::after {\n background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(255,255,255,.09) 3px 4px);\n animation: walros-glitch-scan 90ms steps(2, end) 16 both;\n}\n.walros-theme-glitch-band {\n position: absolute;\n left: -12%;\n width: 124%;\n opacity: 0;\n}\n.walros-theme-glitch-band:nth-child(1) { top: 12%; height: 4%; background: #eaf6ff; animation: walros-glitch-band-a 1500ms steps(1, end) both; }\n.walros-theme-glitch-band:nth-child(2) { top: 36%; height: 11%; background: #020407; animation: walros-glitch-band-b 1500ms steps(1, end) both; }\n.walros-theme-glitch-band:nth-child(3) { top: 62%; height: 2%; background: #7faddb; animation: walros-glitch-band-c 1500ms steps(1, end) both; }\n.walros-theme-glitch-band:nth-child(4) { top: 79%; height: 8%; background: #f4f6f5; animation: walros-glitch-band-d 1500ms steps(1, end) both; }\n\n@keyframes walros-glitch-scan {\n 0% { transform: translateY(-2px); opacity: .25; }\n 50% { transform: translateY(2px); opacity: .08; }\n 100% { transform: translateY(0); opacity: .2; }\n}\n@keyframes walros-glitch-flash {\n 0%, 17%, 22%, 34%, 39%, 54%, 59%, 73%, 78%, 100% { opacity: 0; }\n 18%, 21% { opacity: .18; }\n 35%, 38% { opacity: .48; }\n 55%, 58% { opacity: .82; }\n 74%, 77% { opacity: .22; }\n}\n@keyframes walros-glitch-band-a {\n 0%, 8%, 18%, 42%, 51%, 73%, 82%, 100% { opacity: 0; transform: translateX(0); }\n 9%, 17% { opacity: .55; transform: translateX(-7%); }\n 43%, 50% { opacity: .82; transform: translateX(10%); }\n 74%, 81% { opacity: .32; transform: translateX(-4%); }\n}\n@keyframes walros-glitch-band-b {\n 0%, 20%, 27%, 46%, 55%, 64%, 71%, 100% { opacity: 0; transform: translateX(0); }\n 21%, 26% { opacity: .72; transform: translateX(9%); }\n 47%, 54% { opacity: .9; transform: translateX(-6%); }\n 65%, 70% { opacity: .5; transform: translateX(4%); }\n}\n@keyframes walros-glitch-band-c {\n 0%, 13%, 23%, 39%, 48%, 67%, 76%, 100% { opacity: 0; transform: translateX(0); }\n 14%, 22% { opacity: .9; transform: translateX(5%); }\n 40%, 47% { opacity: .65; transform: translateX(-11%); }\n 68%, 75% { opacity: .75; transform: translateX(8%); }\n}\n@keyframes walros-glitch-band-d {\n 0%, 29%, 38%, 57%, 65%, 85%, 93%, 100% { opacity: 0; transform: translateX(0); }\n 30%, 37% { opacity: .42; transform: translateX(-8%); }\n 58%, 64% { opacity: .7; transform: translateX(7%); }\n 86%, 92% { opacity: .25; transform: translateX(-3%); }\n}\n\n.walros-theme-glitch-lock {\n overscroll-behavior: none;\n}\n\n.walros-theme-glitch-page {\n will-change: transform, filter;\n}\n\n/* Comportamiento original de WalrOS Forum para páginas normales. */\n.walros-theme-glitch-page--body {\n animation: walros-glitch-page-body 1500ms steps(1, end) both;\n}\n\n@keyframes walros-glitch-page-body {\n 0%, 6%, 18%, 31%, 49%, 68%, 82%, 100% { transform: translate3d(0,0,0) scale(1); filter: none; }\n 7% { transform: translate3d(-18px,4px,0) scale(1.012); filter: contrast(1.5) saturate(.45); }\n 19% { transform: translate3d(26px,-7px,0) scale(1.02) skewX(-1.2deg); filter: contrast(1.9) saturate(1.6); }\n 32% { transform: translate3d(-9px,11px,0) scale(1.03); filter: invert(.12) contrast(2); }\n 50%, 57% { transform: translate3d(34px,-3px,0) scale(1.025); filter: grayscale(1) contrast(2.3); }\n 69% { transform: translate3d(-24px,5px,0) scale(1.016); filter: contrast(1.7) saturate(.2); }\n 83% { transform: translate3d(8px,-2px,0) scale(1.006); filter: contrast(1.35); }\n}\n\n/*\n * Modo seguro para parallax/sticky/ScrollTrigger.\n * El shake se aplica a una capa estable del viewport, nunca al scroll real.\n * El pequeño overscan evita descubrir bordes al desplazar la escena.\n */\n.walros-theme-glitch-page--viewport {\n transform-origin: 50% var(--walros-glitch-origin-y, 50%);\n animation: walros-glitch-page-viewport 1500ms steps(1, end) both;\n}\n\n@keyframes walros-glitch-page-viewport {\n 0%, 6%, 18%, 31%, 49%, 68%, 82%, 100% { transform: translate3d(0,0,0) scale(1.012); filter: none; }\n 7% { transform: translate3d(-18px,4px,0) scale(1.012); filter: contrast(1.5) saturate(.45); }\n 19% { transform: translate3d(26px,-7px,0) scale(1.02) skewX(-1.2deg); filter: contrast(1.9) saturate(1.6); }\n 32% { transform: translate3d(-9px,11px,0) scale(1.03); filter: invert(.12) contrast(2); }\n 50%, 57% { transform: translate3d(34px,-3px,0) scale(1.025); filter: grayscale(1) contrast(2.3); }\n 69% { transform: translate3d(-24px,5px,0) scale(1.016); filter: contrast(1.7) saturate(.2); }\n 83% { transform: translate3d(8px,-2px,0) scale(1.006); filter: contrast(1.35); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .walros-theme-glitch-root::before,\n .walros-theme-glitch-root::after {\n animation: walros-glitch-reduced 150ms ease-out forwards;\n }\n\n .walros-theme-glitch-band {\n animation: none !important;\n }\n\n .walros-theme-glitch-page--body,\n .walros-theme-glitch-page--viewport {\n animation: none;\n }\n\n @keyframes walros-glitch-reduced {\n from { opacity: 0.35; }\n to { opacity: 0; }\n }\n}\n`;\n\nexport function WalrosThemeGlitch({\n active,\n zIndex = 9998,\n className,\n style,\n}: WalrosThemeGlitchProps) {\n return (\n <>\n <style>{GLITCH_STYLES}</style>\n {active ? (\n <div\n className={[\"walros-theme-glitch-root\", \"is-active\", className]\n .filter(Boolean)\n .join(\" \")}\n style={{ zIndex, ...style }}\n aria-hidden=\"true\"\n >\n <span className=\"walros-theme-glitch-band\" />\n <span className=\"walros-theme-glitch-band\" />\n <span className=\"walros-theme-glitch-band\" />\n <span className=\"walros-theme-glitch-band\" />\n </div>\n ) : null}\n </>\n );\n}\n\nexport default WalrosThemeGlitch;\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { RefObject } from \"react\";\nimport { walrosThemeGlitchSoundUrl } from \"../assets\";\n\nexport type WalrosTheme = \"light\" | \"dark\";\nexport type WalrosThemeMode = \"body\" | \"viewport\";\n\nexport type WalrosThemeShakeTarget =\n | HTMLElement\n | RefObject<HTMLElement | null>\n | null\n | undefined;\n\nexport type UseWalrosThemeOptions = {\n storageKey?: string;\n defaultTheme?: WalrosTheme;\n useSystemPreference?: boolean;\n swapDelay?: number;\n totalDuration?: number;\n /** Set to false to disable audio, or provide a custom sound URL. */\n soundUrl?: string | false;\n /** Playback volume from 0 to 1. Defaults to the WalrOS site mix. */\n soundVolume?: number;\n applyTheme?: (theme: WalrosTheme) => void;\n\n /**\n * `body` reproduce el comportamiento original de WalrOS Forum.\n * `viewport` bloquea el scroll y sacude solo los elementos indicados,\n * recomendado para parallax, sticky y GSAP ScrollTrigger.\n */\n mode?: WalrosThemeMode;\n\n /** Elementos que recibirán el shake cuando mode=\"viewport\". */\n shakeTargets?: readonly WalrosThemeShakeTarget[];\n\n /**\n * En modo viewport se activa por defecto. Mantiene scrollX/scrollY estables\n * con requestAnimationFrame sin usar position: fixed en el body.\n */\n lockScroll?: boolean;\n\n /** Se ejecuta después de restaurar el scroll; útil para ScrollTrigger.update(). */\n onAfterUnlock?: () => void;\n};\n\nexport type UseWalrosThemeResult = {\n theme: WalrosTheme;\n isDark: boolean;\n mounted: boolean;\n glitching: boolean;\n toggleTheme: () => void;\n setTheme: (theme: WalrosTheme) => void;\n};\n\ntype ViewportLockState = {\n scrollX: number;\n scrollY: number;\n rafId: number;\n active: boolean;\n bodyOverflow: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n};\n\nconst GLITCH_BASE_CLASS = \"walros-theme-glitch-page\";\nconst GLITCH_BODY_CLASS = \"walros-theme-glitch-page--body\";\nconst GLITCH_VIEWPORT_CLASS = \"walros-theme-glitch-page--viewport\";\nconst GLITCH_LOCK_CLASS = \"walros-theme-glitch-lock\";\n\nfunction defaultApplyTheme(theme: WalrosTheme) {\n if (typeof document === \"undefined\") return;\n\n const root = document.documentElement;\n root.classList.toggle(\"dark\", theme === \"dark\");\n root.style.colorScheme = theme;\n}\n\nfunction readInitialTheme(\n storageKey: string,\n defaultTheme: WalrosTheme,\n useSystemPreference: boolean,\n): WalrosTheme {\n if (typeof window === \"undefined\") return defaultTheme;\n\n try {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\") return stored;\n } catch {\n // localStorage puede estar bloqueado en modo privado.\n }\n\n if (\n useSystemPreference &&\n window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n ) {\n return \"dark\";\n }\n\n return defaultTheme;\n}\n\nfunction resolveShakeTargets(\n targets: readonly WalrosThemeShakeTarget[],\n): HTMLElement[] {\n const resolved = new Set<HTMLElement>();\n\n for (const target of targets) {\n if (!target) continue;\n\n const element =\n typeof target === \"object\" && \"current\" in target\n ? target.current\n : target;\n\n if (element) resolved.add(element);\n }\n\n return [...resolved];\n}\n\nexport function useWalrosTheme({\n storageKey = \"walros-theme\",\n defaultTheme = \"light\",\n useSystemPreference = false,\n swapDelay = 610,\n totalDuration = 1500,\n soundUrl = walrosThemeGlitchSoundUrl,\n soundVolume = 0.52,\n applyTheme = defaultApplyTheme,\n mode = \"body\",\n shakeTargets = [],\n lockScroll,\n onAfterUnlock,\n}: UseWalrosThemeOptions = {}): UseWalrosThemeResult {\n const [theme, setThemeState] = useState<WalrosTheme>(() =>\n readInitialTheme(storageKey, defaultTheme, useSystemPreference),\n );\n const [mounted, setMounted] = useState(false);\n const [glitching, setGlitching] = useState(false);\n\n const themeRef = useRef(theme);\n const glitchingRef = useRef(false);\n const swapTimerRef = useRef<number | null>(null);\n const cleanupTimerRef = useRef<number | null>(null);\n const applyThemeRef = useRef(applyTheme);\n const modeRef = useRef(mode);\n const shakeTargetsRef = useRef(shakeTargets);\n const lockScrollRef = useRef(lockScroll);\n const onAfterUnlockRef = useRef(onAfterUnlock);\n const activeTargetsRef = useRef<HTMLElement[]>([]);\n const viewportLockRef = useRef<ViewportLockState | null>(null);\n const soundRef = useRef<HTMLAudioElement | null>(null);\n const soundUrlRef = useRef(soundUrl);\n const soundVolumeRef = useRef(soundVolume);\n\n themeRef.current = theme;\n applyThemeRef.current = applyTheme;\n modeRef.current = mode;\n shakeTargetsRef.current = shakeTargets;\n lockScrollRef.current = lockScroll;\n onAfterUnlockRef.current = onAfterUnlock;\n soundUrlRef.current = soundUrl;\n soundVolumeRef.current = soundVolume;\n\n const playThemeSound = useCallback(() => {\n if (typeof window === \"undefined\" || !soundUrlRef.current) return;\n\n try {\n if (!soundRef.current || soundRef.current.src !== new URL(soundUrlRef.current, document.baseURI).href) {\n soundRef.current?.pause();\n soundRef.current = new Audio(soundUrlRef.current);\n soundRef.current.preload = \"auto\";\n }\n const audio = soundRef.current;\n audio.volume = Math.max(0, Math.min(1, soundVolumeRef.current));\n audio.currentTime = 0;\n void audio.play().catch(() => {\n // Browsers may block sound; the theme animation still continues.\n });\n } catch {\n // Audio support is optional and must not block the theme change.\n }\n }, []);\n\n const persistTheme = useCallback(\n (nextTheme: WalrosTheme) => {\n applyThemeRef.current(nextTheme);\n setThemeState(nextTheme);\n themeRef.current = nextTheme;\n\n try {\n window.localStorage.setItem(storageKey, nextTheme);\n } catch {\n // El cambio debe funcionar aunque localStorage falle.\n }\n },\n [storageKey],\n );\n\n useEffect(() => {\n const initialTheme = readInitialTheme(\n storageKey,\n defaultTheme,\n useSystemPreference,\n );\n\n themeRef.current = initialTheme;\n setThemeState(initialTheme);\n applyThemeRef.current(initialTheme);\n setMounted(true);\n }, [defaultTheme, storageKey, useSystemPreference]);\n\n const clearTimers = useCallback(() => {\n if (swapTimerRef.current !== null) {\n window.clearTimeout(swapTimerRef.current);\n swapTimerRef.current = null;\n }\n\n if (cleanupTimerRef.current !== null) {\n window.clearTimeout(cleanupTimerRef.current);\n cleanupTimerRef.current = null;\n }\n }, []);\n\n const lockViewport = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n typeof document === \"undefined\" ||\n viewportLockRef.current\n ) {\n return;\n }\n\n const body = document.body;\n const html = document.documentElement;\n const lockState: ViewportLockState = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n rafId: 0,\n active: true,\n bodyOverflow: body.style.overflow,\n htmlOverflow: html.style.overflow,\n htmlOverscrollBehavior: html.style.overscrollBehavior,\n };\n\n viewportLockRef.current = lockState;\n\n const keepScrollStable = () => {\n if (!lockState.active) return;\n window.scrollTo(lockState.scrollX, lockState.scrollY);\n lockState.rafId = window.requestAnimationFrame(keepScrollStable);\n };\n\n html.classList.add(GLITCH_LOCK_CLASS);\n html.style.overflow = \"hidden\";\n html.style.overscrollBehavior = \"none\";\n body.style.overflow = \"hidden\";\n lockState.rafId = window.requestAnimationFrame(keepScrollStable);\n }, []);\n\n const unlockViewport = useCallback((runCallback: boolean) => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n const lockState = viewportLockRef.current;\n if (!lockState) return;\n\n lockState.active = false;\n window.cancelAnimationFrame(lockState.rafId);\n\n const body = document.body;\n const html = document.documentElement;\n body.style.overflow = lockState.bodyOverflow;\n html.style.overflow = lockState.htmlOverflow;\n html.style.overscrollBehavior = lockState.htmlOverscrollBehavior;\n html.classList.remove(GLITCH_LOCK_CLASS);\n\n viewportLockRef.current = null;\n window.scrollTo(lockState.scrollX, lockState.scrollY);\n\n if (runCallback) {\n window.requestAnimationFrame(() => {\n onAfterUnlockRef.current?.();\n });\n }\n }, []);\n\n const removeShakeClasses = useCallback(() => {\n for (const target of activeTargetsRef.current) {\n target.classList.remove(\n GLITCH_BASE_CLASS,\n GLITCH_BODY_CLASS,\n GLITCH_VIEWPORT_CLASS,\n );\n target.style.removeProperty(\"--walros-glitch-origin-y\");\n }\n\n activeTargetsRef.current = [];\n }, []);\n\n const finishGlitch = useCallback(() => {\n removeShakeClasses();\n unlockViewport(true);\n glitchingRef.current = false;\n setGlitching(false);\n }, [removeShakeClasses, unlockViewport]);\n\n const setTheme = useCallback(\n (nextTheme: WalrosTheme) => {\n if (glitchingRef.current) return;\n persistTheme(nextTheme);\n },\n [persistTheme],\n );\n\n const toggleTheme = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n typeof document === \"undefined\" ||\n glitchingRef.current\n ) {\n return;\n }\n\n playThemeSound();\n\n const currentMode = modeRef.current;\n const shouldLockScroll =\n lockScrollRef.current ?? currentMode === \"viewport\";\n\n if (currentMode === \"viewport\" && shouldLockScroll) {\n lockViewport();\n }\n\n const targets =\n currentMode === \"body\"\n ? [document.body]\n : resolveShakeTargets(shakeTargetsRef.current);\n\n const modeClass =\n currentMode === \"body\"\n ? GLITCH_BODY_CLASS\n : GLITCH_VIEWPORT_CLASS;\n\n for (const target of targets) {\n target.style.setProperty(\n \"--walros-glitch-origin-y\",\n currentMode === \"body\"\n ? `${window.scrollY + window.innerHeight / 2}px`\n : \"50%\",\n );\n target.classList.add(GLITCH_BASE_CLASS, modeClass);\n }\n\n activeTargetsRef.current = targets;\n glitchingRef.current = true;\n setGlitching(true);\n\n const reducedMotion = window.matchMedia?.(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n\n const nextTheme: WalrosTheme =\n themeRef.current === \"dark\" ? \"light\" : \"dark\";\n\n const effectiveSwapDelay = reducedMotion\n ? 75\n : Math.max(0, swapDelay);\n const effectiveDuration = reducedMotion\n ? 150\n : Math.max(effectiveSwapDelay, totalDuration);\n\n swapTimerRef.current = window.setTimeout(() => {\n persistTheme(nextTheme);\n swapTimerRef.current = null;\n }, effectiveSwapDelay);\n\n cleanupTimerRef.current = window.setTimeout(() => {\n cleanupTimerRef.current = null;\n finishGlitch();\n }, effectiveDuration);\n }, [finishGlitch, lockViewport, persistTheme, playThemeSound, swapDelay, totalDuration]);\n\n useEffect(() => {\n return () => {\n clearTimers();\n removeShakeClasses();\n unlockViewport(false);\n soundRef.current?.pause();\n soundRef.current = null;\n };\n }, [clearTimers, removeShakeClasses, unlockViewport]);\n\n return {\n theme,\n isDark: theme === \"dark\",\n mounted,\n glitching,\n toggleTheme,\n setTheme,\n };\n}\n\nexport default useWalrosTheme;\n"],"mappings":"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","names":["initialPixels","initialScale","jsx","jsx","jsx","jsxs","useEffect","useRef","useState","useState","useRef","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walrosproject/ui",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Componentes, transiciones y recursos visuales oficiales del ecosistema WalrOS.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,11 +13,7 @@
|
|
|
13
13
|
"default": "./dist/index.js"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
|
-
"files": [
|
|
17
|
-
"dist",
|
|
18
|
-
"README.md",
|
|
19
|
-
"LICENSE"
|
|
20
|
-
],
|
|
16
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
21
17
|
"sideEffects": false,
|
|
22
18
|
"scripts": {
|
|
23
19
|
"build": "tsup && node scripts/copy-assets.mjs",
|
|
@@ -40,27 +36,9 @@
|
|
|
40
36
|
"tsup": "^8.0.0",
|
|
41
37
|
"typescript": "^5.7.0"
|
|
42
38
|
},
|
|
43
|
-
"engines": {
|
|
44
|
-
|
|
45
|
-
},
|
|
46
|
-
"publishConfig": {
|
|
47
|
-
"access": "public"
|
|
48
|
-
},
|
|
49
|
-
"repository": {
|
|
50
|
-
"type": "git",
|
|
51
|
-
"url": "git+https://github.com/walrosproject/walros-ui.git"
|
|
52
|
-
},
|
|
39
|
+
"engines": { "node": ">=18" },
|
|
40
|
+
"publishConfig": { "access": "public" },
|
|
53
41
|
"homepage": "https://walros.org",
|
|
54
|
-
"
|
|
55
|
-
"url": "https://github.com/walrosproject/walros-ui/issues"
|
|
56
|
-
},
|
|
57
|
-
"keywords": [
|
|
58
|
-
"walros",
|
|
59
|
-
"react",
|
|
60
|
-
"ui",
|
|
61
|
-
"components",
|
|
62
|
-
"animation",
|
|
63
|
-
"gsap"
|
|
64
|
-
],
|
|
42
|
+
"keywords": ["walros", "react", "ui", "components", "animation", "gsap"],
|
|
65
43
|
"license": "SEE LICENSE IN LICENSE"
|
|
66
44
|
}
|