@walrosproject/ui 0.3.0 → 0.3.1

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 CHANGED
@@ -231,3 +231,11 @@ En este modo el paquete:
231
231
 
232
232
  Los tiempos predeterminados siguen siendo 220 ms para cambiar el tema y
233
233
  720 ms para terminar la transición.
234
+
235
+ ## Compatibilidad de `WalrosPortalTransition`
236
+
237
+ Desde la versión `0.3.1`, la silueta del portal se dibuja directamente dentro
238
+ del SVG del componente. La transición ya no depende de que Vite, Bun u otro
239
+ empaquetador resuelva un archivo SVG externo desde `node_modules`, evitando
240
+ portales deformados o sin la morsa al consumir el paquete desde otras apps.
241
+
package/dist/index.js CHANGED
@@ -3,24 +3,6 @@ import { gsap } from 'gsap';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
 
5
5
  // src/components/WalrosPortalTransition.tsx
6
-
7
- // src/assets.ts
8
- var walrosPortalSilhouetteUrl = new URL(
9
- "./assets/walros-portal-silhouette.svg",
10
- import.meta.url
11
- ).href;
12
- var walrosLogoChromeUrl = new URL(
13
- "./assets/walros-logo-chrome.png",
14
- import.meta.url
15
- ).href;
16
- var walrosWordmarkLightUrl = new URL(
17
- "./assets/walros-wordmark-light.png",
18
- import.meta.url
19
- ).href;
20
- var walrosWordmarkDarkUrl = new URL(
21
- "./assets/walros-wordmark-dark.png",
22
- import.meta.url
23
- ).href;
24
6
  var SILHOUETTE_VIEWBOX = 1254;
25
7
  var FOCUS_X = 626;
26
8
  var FOCUS_Y = 333;
@@ -74,6 +56,7 @@ function WalrosPortalTransition({
74
56
  const uid = useId().replace(/[:]/g, "_");
75
57
  const maskId = `walros-portal-mask-${uid}`;
76
58
  const glowFilterId = `walros-portal-glow-${uid}`;
59
+ const silhouetteId = `walros-portal-silhouette-${uid}`;
77
60
  useEffect(() => {
78
61
  if (!visible) return;
79
62
  const element = overlayRef.current;
@@ -275,6 +258,11 @@ function WalrosPortalTransition({
275
258
  },
276
259
  children: [
277
260
  /* @__PURE__ */ jsxs("defs", { children: [
261
+ /* @__PURE__ */ jsxs("g", { id: silhouetteId, fill: "#000000", children: [
262
+ /* @__PURE__ */ jsx("path", { d: "M 244.00 354.00 C 240.50 377.67, 240.17 413.67, 242.00 434.00 C 243.83 454.33, 249.50 464.50, 255.00 476.00 C 260.50 487.50, 268.50 496.00, 275.00 503.00 C 281.50 510.00, 287.17 513.67, 294.00 518.00 C 300.83 522.33, 306.00 525.67, 316.00 529.00 C 326.00 532.33, 336.33 536.67, 354.00 538.00 C 371.67 539.33, 397.83 540.83, 422.00 537.00 C 446.17 533.17, 474.17 525.33, 499.00 515.00 C 523.83 504.67, 550.00 489.33, 571.00 475.00 C 592.00 460.67, 615.00 436.50, 625.00 429.00 C 635.00 421.50, 623.67 424.00, 631.00 430.00 C 638.33 436.00, 656.67 454.83, 669.00 465.00 C 681.33 475.17, 690.00 482.17, 705.00 491.00 C 720.00 499.83, 743.67 511.50, 759.00 518.00 C 774.33 524.50, 784.00 526.83, 797.00 530.00 C 810.00 533.17, 820.00 535.83, 837.00 537.00 C 854.00 538.17, 881.17 539.00, 899.00 537.00 C 916.83 535.00, 932.00 530.00, 944.00 525.00 C 956.00 520.00, 962.00 516.17, 971.00 507.00 C 980.00 497.83, 991.67 482.83, 998.00 470.00 C 1004.33 457.17, 1007.17 446.33, 1009.00 430.00 C 1010.83 413.67, 1010.83 390.50, 1009.00 372.00 C 1007.17 353.50, 1003.83 337.17, 998.00 319.00 C 992.17 300.83, 983.67 280.17, 974.00 263.00 C 964.33 245.83, 952.00 229.67, 940.00 216.00 C 928.00 202.33, 917.17 192.00, 902.00 181.00 C 886.83 170.00, 866.50 158.17, 849.00 150.00 C 831.50 141.83, 816.67 137.00, 797.00 132.00 C 777.33 127.00, 756.67 122.83, 731.00 120.00 C 705.33 117.17, 673.67 115.33, 643.00 115.00 C 612.33 114.67, 575.67 115.67, 547.00 118.00 C 518.33 120.33, 496.17 123.00, 471.00 129.00 C 445.83 135.00, 418.33 143.50, 396.00 154.00 C 373.67 164.50, 353.50 178.50, 337.00 192.00 C 320.50 205.50, 309.33 218.33, 297.00 235.00 C 284.67 251.67, 271.83 272.17, 263.00 292.00 C 254.17 311.83, 247.50 330.33, 244.00 354.00 Z" }),
263
+ /* @__PURE__ */ jsx("path", { d: "M 289.00 536.00 C 283.17 535.50, 284.83 533.00, 284.00 544.00 C 283.17 555.00, 282.67 578.67, 284.00 602.00 C 285.33 625.33, 287.00 651.83, 292.00 684.00 C 297.00 716.17, 306.33 763.50, 314.00 795.00 C 321.67 826.50, 328.67 847.17, 338.00 873.00 C 347.33 898.83, 357.00 923.67, 370.00 950.00 C 383.00 976.33, 399.67 1006.00, 416.00 1031.00 C 432.33 1056.00, 455.33 1084.50, 468.00 1100.00 C 480.67 1115.50, 486.17 1119.33, 492.00 1124.00 C 497.83 1128.67, 500.67 1127.67, 503.00 1128.00 C 505.33 1128.33, 505.50 1127.50, 506.00 1126.00 C 506.50 1124.50, 510.33 1132.00, 506.00 1119.00 C 501.67 1106.00, 488.17 1073.83, 480.00 1048.00 C 471.83 1022.17, 462.67 987.67, 457.00 964.00 C 451.33 940.33, 449.17 927.33, 446.00 906.00 C 442.83 884.67, 439.50 865.00, 438.00 836.00 C 436.50 807.00, 436.50 758.33, 437.00 732.00 C 437.50 705.67, 439.00 696.33, 441.00 678.00 C 443.00 659.67, 444.83 644.00, 449.00 622.00 C 453.17 600.00, 464.50 559.00, 466.00 546.00 C 467.50 533.00, 468.67 542.50, 458.00 544.00 C 447.33 545.50, 418.33 553.17, 402.00 555.00 C 385.67 556.83, 373.83 556.33, 360.00 555.00 C 346.17 553.67, 330.83 550.17, 319.00 547.00 C 307.17 543.83, 294.83 536.50, 289.00 536.00 Z" }),
264
+ /* @__PURE__ */ jsx("path", { d: "M 961.00 537.00 C 948.50 539.17, 907.83 552.00, 889.00 555.00 C 870.17 558.00, 864.17 557.00, 848.00 555.00 C 831.83 553.00, 802.83 545.00, 792.00 543.00 C 781.17 541.00, 784.83 542.50, 783.00 543.00 C 781.17 543.50, 778.67 533.83, 781.00 546.00 C 783.33 558.17, 792.67 592.33, 797.00 616.00 C 801.33 639.67, 804.83 668.83, 807.00 688.00 C 809.17 707.17, 809.67 709.00, 810.00 731.00 C 810.33 753.00, 810.50 792.83, 809.00 820.00 C 807.50 847.17, 804.50 870.50, 801.00 894.00 C 797.50 917.50, 794.00 936.17, 788.00 961.00 C 782.00 985.83, 773.50 1016.67, 765.00 1043.00 C 756.50 1069.33, 741.33 1104.83, 737.00 1119.00 C 732.67 1133.17, 736.67 1127.17, 739.00 1128.00 C 741.33 1128.83, 745.83 1127.83, 751.00 1124.00 C 756.17 1120.17, 757.33 1120.50, 770.00 1105.00 C 782.67 1089.50, 811.33 1053.50, 827.00 1031.00 C 842.67 1008.50, 851.17 995.00, 864.00 970.00 C 876.83 945.00, 892.83 910.00, 904.00 881.00 C 915.17 852.00, 923.00 826.67, 931.00 796.00 C 939.00 765.33, 946.67 728.67, 952.00 697.00 C 957.33 665.33, 961.00 631.83, 963.00 606.00 C 965.00 580.17, 964.33 553.50, 964.00 542.00 C 963.67 530.50, 973.50 534.83, 961.00 537.00 Z" })
265
+ ] }),
278
266
  /* @__PURE__ */ jsx(
279
267
  "filter",
280
268
  {
@@ -316,13 +304,11 @@ function WalrosPortalTransition({
316
304
  ref: maskScaleRef,
317
305
  transform: `scale(${initialScale})`,
318
306
  children: /* @__PURE__ */ jsx(
319
- "image",
307
+ "use",
320
308
  {
321
- href: walrosPortalSilhouetteUrl,
309
+ href: `#${silhouetteId}`,
322
310
  x: -FOCUS_X,
323
- y: -FOCUS_Y,
324
- width: SILHOUETTE_VIEWBOX,
325
- height: SILHOUETTE_VIEWBOX
311
+ y: -FOCUS_Y
326
312
  }
327
313
  )
328
314
  }
@@ -359,13 +345,11 @@ function WalrosPortalTransition({
359
345
  transform: `scale(${initialScale})`,
360
346
  opacity: "0.85",
361
347
  children: /* @__PURE__ */ jsx("g", { filter: `url(#${glowFilterId})`, children: /* @__PURE__ */ jsx(
362
- "image",
348
+ "use",
363
349
  {
364
- href: walrosPortalSilhouetteUrl,
350
+ href: `#${silhouetteId}`,
365
351
  x: -FOCUS_X,
366
352
  y: -FOCUS_Y,
367
- width: SILHOUETTE_VIEWBOX,
368
- height: SILHOUETTE_VIEWBOX,
369
353
  style: {
370
354
  filter: "brightness(0) saturate(100%) invert(58%) sepia(94%) saturate(1352%) hue-rotate(182deg)",
371
355
  opacity: 0.6
@@ -382,6 +366,24 @@ function WalrosPortalTransition({
382
366
  }
383
367
  );
384
368
  }
369
+
370
+ // src/assets.ts
371
+ var walrosPortalSilhouetteUrl = new URL(
372
+ "./assets/walros-portal-silhouette.svg",
373
+ import.meta.url
374
+ ).href;
375
+ var walrosLogoChromeUrl = new URL(
376
+ "./assets/walros-logo-chrome.png",
377
+ import.meta.url
378
+ ).href;
379
+ var walrosWordmarkLightUrl = new URL(
380
+ "./assets/walros-wordmark-light.png",
381
+ import.meta.url
382
+ ).href;
383
+ var walrosWordmarkDarkUrl = new URL(
384
+ "./assets/walros-wordmark-dark.png",
385
+ import.meta.url
386
+ ).href;
385
387
  function WalrosLogo({
386
388
  alt = "WalrOS",
387
389
  draggable = false,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/assets.ts","../src/components/WalrosPortalTransition.tsx","../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":";;;;;;;AAAO,IAAM,4BAA4B,IAAI,GAAA;AAAA,EAC3C,uCAAA;AAAA,EACA,MAAA,CAAA,IAAA,CAAY;AACd,CAAA,CAAE;AAEK,IAAM,sBAAsB,IAAI,GAAA;AAAA,EACrC,iCAAA;AAAA,EACA,MAAA,CAAA,IAAA,CAAY;AACd,CAAA,CAAE;AAEK,IAAM,yBAAyB,IAAI,GAAA;AAAA,EACxC,oCAAA;AAAA,EACA,MAAA,CAAA,IAAA,CAAY;AACd,CAAA,CAAE;AAEK,IAAM,wBAAwB,IAAI,GAAA;AAAA,EACvC,mCAAA;AAAA,EACA,MAAA,CAAA,IAAA,CAAY;AACd,CAAA,CAAE;ACEF,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,aAAA,GAAgB,GAAA;AAEtB,SAAS,WAAW,IAAA,EAA0C;AAC5D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GACJ,IAAA,KAAS,SAAA,GACL,MAAA,CAAO,iBACP,MAAA,CAAO,YAAA;AACb,IAAA,MAAM,OAAA,GAAU,wBAAA;AAChB,IAAA,OAAA,CAAQ,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC5B,IAAA,OAAA,CAAQ,WAAW,OAAO,CAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,mBAAA,CACP,OAAA,EACA,WAAA,EACA,UAAA,EACS;AACT,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI,WAAA,KAAgB,UAAU,OAAO,IAAA;AACrC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAE1C,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,IAAK,IAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA,GAAW,GAAA;AAAA,EACX,UAAA;AAAA,EACA,eAAA,GAAkB,SAAA;AAAA,EAClB,OAAA,GAAU,IAAA;AAAA,EACV,WAAA,GAAc,QAAA;AAAA,EACd,UAAA,GAAa,oBAAA;AAAA,EACb,MAAA,GAAS;AACX,CAAA,EAAgC;AAC9B,EAAA,MAAM,CAAC,SAAS,CAAA,GAAI,QAAA;AAAA,IAAS,MAC3B,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,UAAU;AAAA,GACtD;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAE/C,EAAA,MAAM,UAAA,GAAa,OAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,OAA2B,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,OAA2B,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,OAAsB,IAAI,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,OAAkC,IAAI,CAAA;AAC1D,EAAA,MAAM,mBAAA,GAAsB,OAAO,EAAE,CAAA;AAErC,EAAA,MAAM,GAAA,GAAM,KAAA,EAAM,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,sBAAsB,GAAG,CAAA,CAAA;AACxC,EAAA,MAAM,YAAA,GAAe,sBAAsB,GAAG,CAAA,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,MAAA,OAAA;AAAA,QAAQ,CAAC,QAAA,KACP,QAAA,CAAS,CAAA,KAAM,IAAA,CAAK,SAAS,QAAA,CAAS,CAAA,KAAM,IAAA,CAAK,MAAA,GAC7C,WACA,EAAE,CAAA,EAAG,KAAK,KAAA,EAAO,CAAA,EAAG,KAAK,MAAA;AAAO,OACtC;AAAA,IACF,CAAA;AAEA,IAAA,OAAA,EAAQ;AAER,IAAA,MAAM,WACJ,OAAO,cAAA,KAAmB,cACtB,IAAI,cAAA,CAAe,OAAO,CAAA,GAC1B,IAAA;AAEN,IAAA,QAAA,EAAU,QAAQ,OAAO,CAAA;AACzB,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAEzC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,EAAU,UAAA,EAAW;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,YAAA,CAAa,OAAA,IAAW,UAAA,CAAW,OAAA,EAAS;AAChD,IAAA,IAAI,IAAA,CAAK,CAAA,IAAK,CAAA,IAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AAEhC,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAE/B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,EAAW;AAE5B,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,mBAAA,CAAoB,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AAClD,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAE/B,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAI,aAAa,OAAA,EAAS;AAE1B,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,mBAAA,CAAoB,OAAA;AAEnD,MAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,QAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,QAAA,IAAI;AACF,UAAA,OAAA,EAAS,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,QAClC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,UAAA,IAAa;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAAA,MAC3B;AAAA,KACF,CAAE,OAAA;AAEF,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,EAAE,UAAA,EAAY,QAAQ,CAAA;AACrD,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,MAAA,QAAA,CAAS,GAAG,OAAA,EAAS;AAAA,QACnB,OAAA,EAAS,CAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,sBAAsB,MAAM;AAC3C,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAEjB,MAAA,MAAM,YAAA,GACJ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACjD,MAAA,MAAMA,iBAAgB,IAAA,CAAK,GAAA;AAAA,QACzB,GAAA;AAAA,QACA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,IAAI;AAAA,OAC7B;AACA,MAAA,MAAMC,gBACJD,cAAAA,GAAgB,kBAAA;AAClB,MAAA,MAAM,UAAA,GAAA,CACF,YAAA,GAAe,EAAA,IAAM,aAAA,GAAiB,IAAA;AAE1C,MAAA,IAAA,CAAK,IAAI,SAAA,EAAW;AAAA,QAClB,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAOC;AAAA,OACR,CAAA;AAED,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,IAAI,SAAA,EAAW;AAAA,UAClB,SAAA,EAAW,KAAA;AAAA,UACX,KAAA,EAAOA,aAAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,OAAA,EAAS,GAAG,CAAA;AAEhC,MAAA,MAAM,eAAe,QAAA,GAAW,GAAA;AAChC,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,EAAE,UAAA,EAAY,QAAQ,CAAA;AACrD,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,MAAA,QAAA,CAAS,EAAA;AAAA,QACP,SAAA;AAAA,QACA;AAAA,UACE,OAAOA,aAAAA,GAAe,GAAA;AAAA,UACtB,UAAU,YAAA,GAAe,IAAA;AAAA,UACzB,IAAA,EAAM;AAAA,SACR;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,QAAA,CAAS,EAAA;AAAA,UACP,SAAA;AAAA,UACA;AAAA,YACE,OAAOA,aAAAA,GAAe,GAAA;AAAA,YACtB,OAAA,EAAS,CAAA;AAAA,YACT,UAAU,YAAA,GAAe,IAAA;AAAA,YACzB,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,EAAA;AAAA,QACP,SAAA;AAAA,QACA;AAAA,UACE,KAAA,EAAO,UAAA;AAAA,UACP,UAAU,YAAA,GAAe,IAAA;AAAA,UACzB,IAAA,EAAM;AAAA,SACR;AAAA,QACA,YAAA,GAAe;AAAA,OACjB;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,QAAA,CAAS,EAAA;AAAA,UACP,SAAA;AAAA,UACA;AAAA,YACE,OAAO,UAAA,GAAa,GAAA;AAAA,YACpB,OAAA,EAAS,CAAA;AAAA,YACT,UAAU,YAAA,GAAe,GAAA;AAAA,YACzB,IAAA,EAAM;AAAA,WACR;AAAA,UACA,YAAA,GAAe;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,EAAA;AAAA,QACP,OAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS,CAAA;AAAA,UACT,UAAU,YAAA,GAAe,GAAA;AAAA,UACzB,IAAA,EAAM;AAAA,SACR;AAAA,QACA,YAAA,GAAe;AAAA,OACjB;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,QAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC3B,QAAA,oBAAA,CAAqB,OAAO,OAAO,CAAA;AAAA,MACrC;AAEA,MAAA,WAAA,CAAY,SAAS,IAAA,EAAK;AAE1B,MAAA,IAAI,UAAA,CAAW,OAAA,IAAW,CAAC,YAAA,CAAa,OAAA,EAAS;AAC/C,QAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAClB,mBAAA,CAAoB,OAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS,OAAO,IAAA;AAEnC,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA;AAE3B,EAAA,MAAM,kBAAkB,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,kBAAkB,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA;AAAA,IACzB,GAAA;AAAA,IACA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,IAAI;AAAA,GACxB;AACA,EAAA,MAAM,eACJ,aAAA,GAAgB,kBAAA;AAClB,EAAA,MAAM,eAAe,kBAAA,GAAqB,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAA,CACH,eAAe,OAAA,IAAW,YAAA;AAC7B,EAAA,MAAM,cAAA,GAAA,CACH,eAAe,OAAA,IAAW,YAAA;AAC7B,EAAA,MAAM,gBACJ,eAAA,GAAkB,cAAA;AACpB,EAAA,MAAM,gBACJ,eAAA,GAAkB,cAAA;AAEpB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA;AAAA,QACA,aAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,QAAA;AAAA,QACV,eAAA,EAAiB,QACb,aAAA,GACA;AAAA,OACN;AAAA,MAEC,QAAA,EAAA,KAAA,oBACC,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,MAAA;AAAA,UACN,MAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,UACtB,mBAAA,EAAoB,MAAA;AAAA,UACpB,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,UAAA;AAAA,YACV,KAAA,EAAO,CAAA;AAAA,YACP,OAAA,EAAS;AAAA,WACX;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI,YAAA;AAAA,kBACJ,CAAA,EAAE,MAAA;AAAA,kBACF,CAAA,EAAE,MAAA;AAAA,kBACF,KAAA,EAAM,MAAA;AAAA,kBACN,MAAA,EAAO,MAAA;AAAA,kBAEP,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAe,YAAA,EAAa,IAAA,EAAK;AAAA;AAAA,eACpC;AAAA,8BAEA,IAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI,MAAA;AAAA,kBACJ,SAAA,EAAU,gBAAA;AAAA,kBACV,CAAA,EAAE,GAAA;AAAA,kBACF,CAAA,EAAE,GAAA;AAAA,kBACF,KAAA,EAAO,CAAA;AAAA,kBACP,MAAA,EAAQ,CAAA;AAAA,kBAER,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,CAAA,EAAE,GAAA;AAAA,wBACF,CAAA,EAAE,GAAA;AAAA,wBACF,KAAA,EAAO,CAAA;AAAA,wBACP,MAAA,EAAQ,CAAA;AAAA,wBACR,IAAA,EAAK;AAAA;AAAA,qBACP;AAAA,oCAEA,GAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAW,CAAA,UAAA,EAAa,aAAa,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAA;AAAA,wBAEtD,QAAA,kBAAA,GAAA;AAAA,0BAAC,GAAA;AAAA,0BAAA;AAAA,4BACC,GAAA,EAAK,YAAA;AAAA,4BACL,SAAA,EAAW,SAAS,YAAY,CAAA,CAAA,CAAA;AAAA,4BAEhC,QAAA,kBAAA,GAAA;AAAA,8BAAC,OAAA;AAAA,8BAAA;AAAA,gCACC,IAAA,EAAM,yBAAA;AAAA,gCACN,GAAG,CAAC,OAAA;AAAA,gCACJ,GAAG,CAAC,OAAA;AAAA,gCACJ,KAAA,EAAO,kBAAA;AAAA,gCACP,MAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AACF;AAAA;AACF;AAAA;AAAA;AACF,aAAA,EACF,CAAA;AAAA,4BAEA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,GAAA;AAAA,gBACF,CAAA,EAAE,GAAA;AAAA,gBACF,KAAA,EAAO,CAAA;AAAA,gBACP,MAAA,EAAQ,CAAA;AAAA,gBACR,IAAA,EAAM,eAAA;AAAA,gBACN,IAAA,EAAM,QAAQ,MAAM,CAAA,CAAA;AAAA;AAAA,aACtB;AAAA,4BAEA,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,UAAA,EAAa,aAAa,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAA;AAAA,gBACtD,KAAA,EAAO;AAAA,kBACL,YAAA,EAAc,QAAA;AAAA,kBACd,aAAA,EAAe;AAAA,iBACjB;AAAA,gBAEA,QAAA,kBAAA,GAAA;AAAA,kBAAC,GAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,YAAA;AAAA,oBACL,SAAA,EAAW,SAAS,YAAY,CAAA,CAAA,CAAA;AAAA,oBAChC,OAAA,EAAQ,MAAA;AAAA,oBAER,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,MAAA,EAAQ,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,CAAA,EAC7B,QAAA,kBAAA,GAAA;AAAA,sBAAC,OAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAM,yBAAA;AAAA,wBACN,GAAG,CAAC,OAAA;AAAA,wBACJ,GAAG,CAAC,OAAA;AAAA,wBACJ,KAAA,EAAO,kBAAA;AAAA,wBACP,MAAA,EAAQ,kBAAA;AAAA,wBACR,KAAA,EAAO;AAAA,0BACL,MAAA,EACE,wFAAA;AAAA,0BACF,OAAA,EAAS;AAAA;AACX;AAAA,qBACF,EACF;AAAA;AAAA;AACF;AAAA;AACF;AAAA;AAAA;AACF;AAAA,GAEJ;AAEJ;ACnaO,SAAS,UAAA,CAAW;AAAA,EACzB,GAAA,GAAM,QAAA;AAAA,EACN,SAAA,GAAY,KAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,mBAAA;AAAA,MACL,GAAA;AAAA,MACA,SAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACRO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA,GAAU,OAAA;AAAA,EACV,GAAA,GAAM,QAAA;AAAA,EACN,SAAA,GAAY,KAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,MAAM,GAAA,GACJ,OAAA,KAAY,MAAA,GACR,qBAAA,GACA,sBAAA;AAEN,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACvBA,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqHf,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,WAAO,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,IACrB,yBACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAC,0BAAA,EAA4B,SAAS,EAC9C,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AAAA,QACX,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAG,KAAA,EAAM;AAAA,QAC1B,aAAA,EAAY;AAAA;AAAA,KACd,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AClFA,IAAM,iBAAA,GAAoB,0BAAA;AAC1B,IAAM,iBAAA,GAAoB,gCAAA;AAC1B,IAAM,qBAAA,GAAwB,oCAAA;AAC9B,IAAM,iBAAA,GAAoB,0BAAA;AAE1B,SAAS,kBAAkB,KAAA,EAAoB;AAC7C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,KAAA,KAAU,MAAM,CAAA;AAC9C,EAAA,IAAA,CAAK,MAAM,WAAA,GAAc,KAAA;AAC3B;AAEA,SAAS,gBAAA,CACP,UAAA,EACA,YAAA,EACA,mBAAA,EACa;AACb,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,YAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AACrD,IAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IACE,mBAAA,IACA,MAAA,CAAO,UAAA,GAAa,8BAA8B,EAAE,OAAA,EACpD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,oBACP,OAAA,EACe;AACf,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAiB;AAEtC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,UACJ,OAAO,MAAA,KAAW,YAAY,SAAA,IAAa,MAAA,GACvC,OAAO,OAAA,GACP,MAAA;AAEN,IAAA,IAAI,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,CAAC,GAAG,QAAQ,CAAA;AACrB;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,UAAA,GAAa,cAAA;AAAA,EACb,YAAA,GAAe,OAAA;AAAA,EACf,mBAAA,GAAsB,KAAA;AAAA,EACtB,SAAA,GAAY,GAAA;AAAA,EACZ,aAAA,GAAgB,GAAA;AAAA,EAChB,UAAA,GAAa,iBAAA;AAAA,EACb,IAAA,GAAO,MAAA;AAAA,EACP,eAAe,EAAC;AAAA,EAChB,UAAA;AAAA,EACA;AACF,CAAA,GAA2B,EAAC,EAAyB;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAIE,QAAAA;AAAA,IAAsB,MACnD,gBAAA,CAAiB,UAAA,EAAY,YAAA,EAAc,mBAAmB;AAAA,GAChE;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,QAAA,GAAWC,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,YAAA,GAAeA,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,YAAA,GAAeA,OAAsB,IAAI,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkBA,OAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgBA,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,OAAA,GAAUA,OAAO,IAAI,CAAA;AAC3B,EAAA,MAAM,eAAA,GAAkBA,OAAO,YAAY,CAAA;AAC3C,EAAA,MAAM,aAAA,GAAgBA,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,gBAAA,GAAmBA,OAAO,aAAa,CAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmBA,MAAAA,CAAsB,EAAE,CAAA;AACjD,EAAA,MAAM,eAAA,GAAkBA,OAAiC,IAAI,CAAA;AAE7D,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,SAAA,KAA2B;AAC1B,MAAA,aAAA,CAAc,QAAQ,SAAS,CAAA;AAC/B,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,QAAA,CAAS,OAAA,GAAU,SAAA;AAEnB,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,SAAS,CAAA;AAAA,MACnD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,gBAAA;AAAA,MACnB,UAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,OAAA,GAAU,YAAA;AACnB,IAAA,aAAA,CAAc,YAAY,CAAA;AAC1B,IAAA,aAAA,CAAc,QAAQ,YAAY,CAAA;AAClC,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,mBAAmB,CAAC,CAAA;AAElD,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,IAAI,YAAA,CAAa,YAAY,IAAA,EAAM;AACjC,MAAA,MAAA,CAAO,YAAA,CAAa,aAAa,OAAO,CAAA;AACxC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAEA,IAAA,IAAI,eAAA,CAAgB,YAAY,IAAA,EAAM;AACpC,MAAA,MAAA,CAAO,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAC3C,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,IACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,QAAA,KAAa,WAAA,IACpB,gBAAgB,OAAA,EAChB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,IAAA,MAAM,SAAA,GAA+B;AAAA,MACnC,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,YAAA,EAAc,KAAK,KAAA,CAAM,QAAA;AAAA,MACzB,YAAA,EAAc,KAAK,KAAA,CAAM,QAAA;AAAA,MACzB,sBAAA,EAAwB,KAAK,KAAA,CAAM;AAAA,KACrC;AAEA,IAAA,eAAA,CAAgB,OAAA,GAAU,SAAA;AAE1B,IAAA,MAAM,mBAAmB,MAAM;AAC7B,MAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACvB,MAAA,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA;AACpD,MAAA,SAAA,CAAU,KAAA,GAAQ,MAAA,CAAO,qBAAA,CAAsB,gBAAgB,CAAA;AAAA,IACjE,CAAA;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,iBAAiB,CAAA;AACpC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACtB,IAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,MAAA;AAChC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACtB,IAAA,SAAA,CAAU,KAAA,GAAQ,MAAA,CAAO,qBAAA,CAAsB,gBAAgB,CAAA;AAAA,EACjE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,WAAA,KAAyB;AAC3D,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,aAAa,WAAA,EAAa;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,eAAA,CAAgB,OAAA;AAClC,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,SAAA,CAAU,MAAA,GAAS,KAAA;AACnB,IAAA,MAAA,CAAO,oBAAA,CAAqB,UAAU,KAAK,CAAA;AAE3C,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,WAAW,SAAA,CAAU,YAAA;AAChC,IAAA,IAAA,CAAK,KAAA,CAAM,WAAW,SAAA,CAAU,YAAA;AAChC,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,SAAA,CAAU,sBAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,iBAAiB,CAAA;AAEvC,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA;AAEpD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,sBAAsB,MAAM;AACjC,QAAA,gBAAA,CAAiB,OAAA,IAAU;AAAA,MAC7B,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAA,KAAA,MAAW,MAAA,IAAU,iBAAiB,OAAA,EAAS;AAC7C,MAAA,MAAA,CAAO,SAAA,CAAU,MAAA;AAAA,QACf,iBAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,eAAe,0BAA0B,CAAA;AAAA,IACxD;AAEA,IAAA,gBAAA,CAAiB,UAAU,EAAC;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,kBAAA,EAAmB;AACnB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,kBAAA,EAAoB,cAAc,CAAC,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,SAAA,KAA2B;AAC1B,MAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,IACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,QAAA,KAAa,WAAA,IACpB,aAAa,OAAA,EACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,OAAA,CAAQ,OAAA;AAC5B,IAAA,MAAM,gBAAA,GACJ,aAAA,CAAc,OAAA,IAAW,WAAA,KAAgB,UAAA;AAE3C,IAAA,IAAI,WAAA,KAAgB,cAAc,gBAAA,EAAkB;AAClD,MAAA,YAAA,EAAa;AAAA,IACf;AAEA,IAAA,MAAM,OAAA,GACJ,gBAAgB,MAAA,GACZ,CAAC,SAAS,IAAI,CAAA,GACd,mBAAA,CAAoB,eAAA,CAAgB,OAAO,CAAA;AAEjD,IAAA,MAAM,SAAA,GACJ,WAAA,KAAgB,MAAA,GACZ,iBAAA,GACA,qBAAA;AAEN,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAA,CAAO,KAAA,CAAM,WAAA;AAAA,QACX,0BAAA;AAAA,QACA,WAAA,KAAgB,SACZ,CAAA,EAAG,MAAA,CAAO,UAAU,MAAA,CAAO,WAAA,GAAc,CAAC,CAAA,EAAA,CAAA,GAC1C;AAAA,OACN;AACA,MAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,iBAAA,EAAmB,SAAS,CAAA;AAAA,IACnD;AAEA,IAAA,gBAAA,CAAiB,OAAA,GAAU,OAAA;AAC3B,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAAA,MAC3B;AAAA,KACF,CAAE,OAAA;AAEF,IAAA,MAAM,SAAA,GACJ,QAAA,CAAS,OAAA,KAAY,MAAA,GAAS,OAAA,GAAU,MAAA;AAE1C,IAAA,MAAM,qBAAqB,aAAA,GACvB,EAAA,GACA,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA;AACzB,IAAA,MAAM,oBAAoB,aAAA,GACtB,GAAA,GACA,IAAA,CAAK,GAAA,CAAI,oBAAoB,aAAa,CAAA;AAE9C,IAAA,YAAA,CAAa,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AAC7C,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB,GAAG,kBAAkB,CAAA;AAErB,IAAA,eAAA,CAAgB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AAChD,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,YAAA,EAAa;AAAA,IACf,GAAG,iBAAiB,CAAA;AAAA,EACtB,GAAG,CAAC,YAAA,EAAc,cAAc,YAAA,EAAc,SAAA,EAAW,aAAa,CAAC,CAAA;AAEvE,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,EAAY;AACZ,MAAA,kBAAA,EAAmB;AACnB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,kBAAA,EAAoB,cAAc,CAAC,CAAA;AAEpD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAQ,KAAA,KAAU,MAAA;AAAA,IAClB,OAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.js","sourcesContent":["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 {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { gsap } from \"gsap\";\nimport { walrosPortalSilhouetteUrl } from \"../assets\";\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;\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 = 750,\n onComplete,\n backgroundColor = \"#02050b\",\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 glowScaleRef = 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 const glowFilterId = `walros-portal-glow-${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 const glowScale = glowScaleRef.current;\n\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 if (glowScale) {\n gsap.set(glowScale, {\n svgOrigin: \"0 0\",\n scale: initialScale,\n opacity: 0.85,\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 if (glowScale) {\n timeline.to(\n glowScale,\n {\n scale: initialScale * 1.4,\n opacity: 1,\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 if (glowScale) {\n timeline.to(\n glowScale,\n {\n scale: finalScale * 0.9,\n opacity: 0,\n duration: totalSeconds * 0.4,\n ease: \"power2.in\",\n },\n totalSeconds * 0.45,\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 <filter\n id={glowFilterId}\n x=\"-50%\"\n y=\"-50%\"\n width=\"200%\"\n height=\"200%\"\n >\n <feGaussianBlur stdDeviation=\"28\" />\n </filter>\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={walrosPortalSilhouetteUrl}\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 <g\n transform={`translate(${portalCenterX} ${portalCenterY})`}\n style={{\n mixBlendMode: \"screen\",\n pointerEvents: \"none\",\n }}\n >\n <g\n ref={glowScaleRef}\n transform={`scale(${initialScale})`}\n opacity=\"0.85\"\n >\n <g filter={`url(#${glowFilterId})`}>\n <image\n href={walrosPortalSilhouetteUrl}\n x={-FOCUS_X}\n y={-FOCUS_Y}\n width={SILHOUETTE_VIEWBOX}\n height={SILHOUETTE_VIEWBOX}\n style={{\n filter:\n \"brightness(0) saturate(100%) invert(58%) sepia(94%) saturate(1352%) hue-rotate(182deg)\",\n opacity: 0.6,\n }}\n />\n </g>\n </g>\n </g>\n </svg>\n )}\n </div>\n );\n}\n\nexport default WalrosPortalTransition;\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"],"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;\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 = 750,\n onComplete,\n backgroundColor = \"#02050b\",\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 glowScaleRef = 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 const glowFilterId = `walros-portal-glow-${uid}`;\n const silhouetteId = `walros-portal-silhouette-${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 const glowScale = glowScaleRef.current;\n\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 if (glowScale) {\n gsap.set(glowScale, {\n svgOrigin: \"0 0\",\n scale: initialScale,\n opacity: 0.85,\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 if (glowScale) {\n timeline.to(\n glowScale,\n {\n scale: initialScale * 1.4,\n opacity: 1,\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 if (glowScale) {\n timeline.to(\n glowScale,\n {\n scale: finalScale * 0.9,\n opacity: 0,\n duration: totalSeconds * 0.4,\n ease: \"power2.in\",\n },\n totalSeconds * 0.45,\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 <g id={silhouetteId} fill=\"#000000\">\n <path d=\"M 244.00 354.00 C 240.50 377.67, 240.17 413.67, 242.00 434.00 C 243.83 454.33, 249.50 464.50, 255.00 476.00 C 260.50 487.50, 268.50 496.00, 275.00 503.00 C 281.50 510.00, 287.17 513.67, 294.00 518.00 C 300.83 522.33, 306.00 525.67, 316.00 529.00 C 326.00 532.33, 336.33 536.67, 354.00 538.00 C 371.67 539.33, 397.83 540.83, 422.00 537.00 C 446.17 533.17, 474.17 525.33, 499.00 515.00 C 523.83 504.67, 550.00 489.33, 571.00 475.00 C 592.00 460.67, 615.00 436.50, 625.00 429.00 C 635.00 421.50, 623.67 424.00, 631.00 430.00 C 638.33 436.00, 656.67 454.83, 669.00 465.00 C 681.33 475.17, 690.00 482.17, 705.00 491.00 C 720.00 499.83, 743.67 511.50, 759.00 518.00 C 774.33 524.50, 784.00 526.83, 797.00 530.00 C 810.00 533.17, 820.00 535.83, 837.00 537.00 C 854.00 538.17, 881.17 539.00, 899.00 537.00 C 916.83 535.00, 932.00 530.00, 944.00 525.00 C 956.00 520.00, 962.00 516.17, 971.00 507.00 C 980.00 497.83, 991.67 482.83, 998.00 470.00 C 1004.33 457.17, 1007.17 446.33, 1009.00 430.00 C 1010.83 413.67, 1010.83 390.50, 1009.00 372.00 C 1007.17 353.50, 1003.83 337.17, 998.00 319.00 C 992.17 300.83, 983.67 280.17, 974.00 263.00 C 964.33 245.83, 952.00 229.67, 940.00 216.00 C 928.00 202.33, 917.17 192.00, 902.00 181.00 C 886.83 170.00, 866.50 158.17, 849.00 150.00 C 831.50 141.83, 816.67 137.00, 797.00 132.00 C 777.33 127.00, 756.67 122.83, 731.00 120.00 C 705.33 117.17, 673.67 115.33, 643.00 115.00 C 612.33 114.67, 575.67 115.67, 547.00 118.00 C 518.33 120.33, 496.17 123.00, 471.00 129.00 C 445.83 135.00, 418.33 143.50, 396.00 154.00 C 373.67 164.50, 353.50 178.50, 337.00 192.00 C 320.50 205.50, 309.33 218.33, 297.00 235.00 C 284.67 251.67, 271.83 272.17, 263.00 292.00 C 254.17 311.83, 247.50 330.33, 244.00 354.00 Z\" />\n <path d=\"M 289.00 536.00 C 283.17 535.50, 284.83 533.00, 284.00 544.00 C 283.17 555.00, 282.67 578.67, 284.00 602.00 C 285.33 625.33, 287.00 651.83, 292.00 684.00 C 297.00 716.17, 306.33 763.50, 314.00 795.00 C 321.67 826.50, 328.67 847.17, 338.00 873.00 C 347.33 898.83, 357.00 923.67, 370.00 950.00 C 383.00 976.33, 399.67 1006.00, 416.00 1031.00 C 432.33 1056.00, 455.33 1084.50, 468.00 1100.00 C 480.67 1115.50, 486.17 1119.33, 492.00 1124.00 C 497.83 1128.67, 500.67 1127.67, 503.00 1128.00 C 505.33 1128.33, 505.50 1127.50, 506.00 1126.00 C 506.50 1124.50, 510.33 1132.00, 506.00 1119.00 C 501.67 1106.00, 488.17 1073.83, 480.00 1048.00 C 471.83 1022.17, 462.67 987.67, 457.00 964.00 C 451.33 940.33, 449.17 927.33, 446.00 906.00 C 442.83 884.67, 439.50 865.00, 438.00 836.00 C 436.50 807.00, 436.50 758.33, 437.00 732.00 C 437.50 705.67, 439.00 696.33, 441.00 678.00 C 443.00 659.67, 444.83 644.00, 449.00 622.00 C 453.17 600.00, 464.50 559.00, 466.00 546.00 C 467.50 533.00, 468.67 542.50, 458.00 544.00 C 447.33 545.50, 418.33 553.17, 402.00 555.00 C 385.67 556.83, 373.83 556.33, 360.00 555.00 C 346.17 553.67, 330.83 550.17, 319.00 547.00 C 307.17 543.83, 294.83 536.50, 289.00 536.00 Z\" />\n <path d=\"M 961.00 537.00 C 948.50 539.17, 907.83 552.00, 889.00 555.00 C 870.17 558.00, 864.17 557.00, 848.00 555.00 C 831.83 553.00, 802.83 545.00, 792.00 543.00 C 781.17 541.00, 784.83 542.50, 783.00 543.00 C 781.17 543.50, 778.67 533.83, 781.00 546.00 C 783.33 558.17, 792.67 592.33, 797.00 616.00 C 801.33 639.67, 804.83 668.83, 807.00 688.00 C 809.17 707.17, 809.67 709.00, 810.00 731.00 C 810.33 753.00, 810.50 792.83, 809.00 820.00 C 807.50 847.17, 804.50 870.50, 801.00 894.00 C 797.50 917.50, 794.00 936.17, 788.00 961.00 C 782.00 985.83, 773.50 1016.67, 765.00 1043.00 C 756.50 1069.33, 741.33 1104.83, 737.00 1119.00 C 732.67 1133.17, 736.67 1127.17, 739.00 1128.00 C 741.33 1128.83, 745.83 1127.83, 751.00 1124.00 C 756.17 1120.17, 757.33 1120.50, 770.00 1105.00 C 782.67 1089.50, 811.33 1053.50, 827.00 1031.00 C 842.67 1008.50, 851.17 995.00, 864.00 970.00 C 876.83 945.00, 892.83 910.00, 904.00 881.00 C 915.17 852.00, 923.00 826.67, 931.00 796.00 C 939.00 765.33, 946.67 728.67, 952.00 697.00 C 957.33 665.33, 961.00 631.83, 963.00 606.00 C 965.00 580.17, 964.33 553.50, 964.00 542.00 C 963.67 530.50, 973.50 534.83, 961.00 537.00 Z\" />\n </g>\n\n <filter\n id={glowFilterId}\n x=\"-50%\"\n y=\"-50%\"\n width=\"200%\"\n height=\"200%\"\n >\n <feGaussianBlur stdDeviation=\"28\" />\n </filter>\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 <use\n href={`#${silhouetteId}`}\n x={-FOCUS_X}\n y={-FOCUS_Y}\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 <g\n transform={`translate(${portalCenterX} ${portalCenterY})`}\n style={{\n mixBlendMode: \"screen\",\n pointerEvents: \"none\",\n }}\n >\n <g\n ref={glowScaleRef}\n transform={`scale(${initialScale})`}\n opacity=\"0.85\"\n >\n <g filter={`url(#${glowFilterId})`}>\n <use\n href={`#${silhouetteId}`}\n x={-FOCUS_X}\n y={-FOCUS_Y}\n style={{\n filter:\n \"brightness(0) saturate(100%) invert(58%) sepia(94%) saturate(1352%) hue-rotate(182deg)\",\n opacity: 0.6,\n }}\n />\n </g>\n </g>\n </g>\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@walrosproject/ui",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Componentes, transiciones y recursos visuales oficiales del ecosistema WalrOS.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",