@walrosproject/ui 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,397 +1,229 @@
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
6
- var SILHOUETTE_VIEWBOX = 1254;
2
+ import { useState as useState4 } from "react";
3
+ import { createPortal as createPortal2 } from "react-dom";
4
+
5
+ // src/assets.ts
6
+ var walrosPortalSilhouetteUrl = new URL(
7
+ "./assets/walros-portal-silhouette.svg",
8
+ import.meta.url
9
+ ).href;
10
+ var walrosLogoChromeUrl = new URL(
11
+ "./assets/walros-logo-chrome.png",
12
+ import.meta.url
13
+ ).href;
14
+ var walrosWordmarkLightUrl = new URL(
15
+ "./assets/walros-wordmark-light.png",
16
+ import.meta.url
17
+ ).href;
18
+ var walrosWordmarkDarkUrl = new URL(
19
+ "./assets/walros-wordmark-dark.png",
20
+ import.meta.url
21
+ ).href;
22
+ var walrosThemeGlitchSoundUrl = new URL(
23
+ "./assets/walros-theme-glitch.mp3",
24
+ import.meta.url
25
+ ).href;
26
+
27
+ // src/components/WalrosThemeTransition.tsx
28
+ import { useEffect as useEffect2, useLayoutEffect as useLayoutEffect3, useRef as useRef2, useState as useState3 } from "react";
29
+ import { createPortal } from "react-dom";
30
+
31
+ // src/components/Walros3DPortalTransition.tsx
32
+ import { useEffect, useId, useLayoutEffect, useRef, useState } from "react";
33
+ import gsap from "gsap";
34
+
35
+ // src/portalSilhouette.ts
36
+ var walrosPortalPaths = [
37
+ "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",
38
+ "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",
39
+ "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"
40
+ ];
41
+
42
+ // src/components/Walros3DPortalTransition.tsx
43
+ import { jsx, jsxs } from "react/jsx-runtime";
7
44
  var FOCUS_X = 626;
8
45
  var FOCUS_Y = 333;
46
+ var VISIBLE_LEFT = 244;
47
+ var VISIBLE_RIGHT = 1010;
48
+ var VISIBLE_TOP = 115;
49
+ var VISIBLE_BOTTOM = 1128;
9
50
  var PORTAL_RADIUS = 190;
10
- var WALROS_PORTAL_SILHOUETTE_URL = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgdmlld0JveD0iMCAwIDEyNTQgMTI1NCIKICAgICB3aWR0aD0iMTI1NCIgaGVpZ2h0PSIxMjU0IgogICAgIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iU2lsdWV0YSBXYWxyT1MiPgogIDxnIGZpbGw9IiMwMDAwMDAiPgogICAgPHBhdGggZD0iTSAyNDQuMDAgMzU0LjAwIEMgMjQwLjUwIDM3Ny42NywgMjQwLjE3IDQxMy42NywgMjQyLjAwIDQzNC4wMCBDIDI0My44MyA0NTQuMzMsIDI0OS41MCA0NjQuNTAsIDI1NS4wMCA0NzYuMDAgQyAyNjAuNTAgNDg3LjUwLCAyNjguNTAgNDk2LjAwLCAyNzUuMDAgNTAzLjAwIEMgMjgxLjUwIDUxMC4wMCwgMjg3LjE3IDUxMy42NywgMjk0LjAwIDUxOC4wMCBDIDMwMC44MyA1MjIuMzMsIDMwNi4wMCA1MjUuNjcsIDMxNi4wMCA1MjkuMDAgQyAzMjYuMDAgNTMyLjMzLCAzMzYuMzMgNTM2LjY3LCAzNTQuMDAgNTM4LjAwIEMgMzcxLjY3IDUzOS4zMywgMzk3LjgzIDU0MC44MywgNDIyLjAwIDUzNy4wMCBDIDQ0Ni4xNyA1MzMuMTcsIDQ3NC4xNyA1MjUuMzMsIDQ5OS4wMCA1MTUuMDAgQyA1MjMuODMgNTA0LjY3LCA1NTAuMDAgNDg5LjMzLCA1NzEuMDAgNDc1LjAwIEMgNTkyLjAwIDQ2MC42NywgNjE1LjAwIDQzNi41MCwgNjI1LjAwIDQyOS4wMCBDIDYzNS4wMCA0MjEuNTAsIDYyMy42NyA0MjQuMDAsIDYzMS4wMCA0MzAuMDAgQyA2MzguMzMgNDM2LjAwLCA2NTYuNjcgNDU0LjgzLCA2NjkuMDAgNDY1LjAwIEMgNjgxLjMzIDQ3NS4xNywgNjkwLjAwIDQ4Mi4xNywgNzA1LjAwIDQ5MS4wMCBDIDcyMC4wMCA0OTkuODMsIDc0My42NyA1MTEuNTAsIDc1OS4wMCA1MTguMDAgQyA3NzQuMzMgNTI0LjUwLCA3ODQuMDAgNTI2LjgzLCA3OTcuMDAgNTMwLjAwIEMgODEwLjAwIDUzMy4xNywgODIwLjAwIDUzNS44MywgODM3LjAwIDUzNy4wMCBDIDg1NC4wMCA1MzguMTcsIDg4MS4xNyA1MzkuMDAsIDg5OS4wMCA1MzcuMDAgQyA5MTYuODMgNTM1LjAwLCA5MzIuMDAgNTMwLjAwLCA5NDQuMDAgNTI1LjAwIEMgOTU2LjAwIDUyMC4wMCwgOTYyLjAwIDUxNi4xNywgOTcxLjAwIDUwNy4wMCBDIDk4MC4wMCA0OTcuODMsIDk5MS42NyA0ODIuODMsIDk5OC4wMCA0NzAuMDAgQyAxMDA0LjMzIDQ1Ny4xNywgMTAwNy4xNyA0NDYuMzMsIDEwMDkuMDAgNDMwLjAwIEMgMTAxMC44MyA0MTMuNjcsIDEwMTAuODMgMzkwLjUwLCAxMDA5LjAwIDM3Mi4wMCBDIDEwMDcuMTcgMzUzLjUwLCAxMDAzLjgzIDMzNy4xNywgOTk4LjAwIDMxOS4wMCBDIDk5Mi4xNyAzMDAuODMsIDk4My42NyAyODAuMTcsIDk3NC4wMCAyNjMuMDAgQyA5NjQuMzMgMjQ1LjgzLCA5NTIuMDAgMjI5LjY3LCA5NDAuMDAgMjE2LjAwIEMgOTI4LjAwIDIwMi4zMywgOTE3LjE3IDE5Mi4wMCwgOTAyLjAwIDE4MS4wMCBDIDg4Ni44MyAxNzAuMDAsIDg2Ni41MCAxNTguMTcsIDg0OS4wMCAxNTAuMDAgQyA4MzEuNTAgMTQxLjgzLCA4MTYuNjcgMTM3LjAwLCA3OTcuMDAgMTMyLjAwIEMgNzc3LjMzIDEyNy4wMCwgNzU2LjY3IDEyMi44MywgNzMxLjAwIDEyMC4wMCBDIDcwNS4zMyAxMTcuMTcsIDY3My42NyAxMTUuMzMsIDY0My4wMCAxMTUuMDAgQyA2MTIuMzMgMTE0LjY3LCA1NzUuNjcgMTE1LjY3LCA1NDcuMDAgMTE4LjAwIEMgNTE4LjMzIDEyMC4zMywgNDk2LjE3IDEyMy4wMCwgNDcxLjAwIDEyOS4wMCBDIDQ0NS44MyAxMzUuMDAsIDQxOC4zMyAxNDMuNTAsIDM5Ni4wMCAxNTQuMDAgQyAzNzMuNjcgMTY0LjUwLCAzNTMuNTAgMTc4LjUwLCAzMzcuMDAgMTkyLjAwIEMgMzIwLjUwIDIwNS41MCwgMzA5LjMzIDIxOC4zMywgMjk3LjAwIDIzNS4wMCBDIDI4NC42NyAyNTEuNjcsIDI3MS44MyAyNzIuMTcsIDI2My4wMCAyOTIuMDAgQyAyNTQuMTcgMzExLjgzLCAyNDcuNTAgMzMwLjMzLCAyNDQuMDAgMzU0LjAwIFoiLz48cGF0aCBkPSJNIDI4OS4wMCA1MzYuMDAgQyAyODMuMTcgNTM1LjUwLCAyODQuODMgNTMzLjAwLCAyODQuMDAgNTQ0LjAwIEMgMjgzLjE3IDU1NS4wMCwgMjgyLjY3IDU3OC42NywgMjg0LjAwIDYwMi4wMCBDIDI4NS4zMyA2MjUuMzMsIDI4Ny4wMCA2NTEuODMsIDI5Mi4wMCA2ODQuMDAgQyAyOTcuMDAgNzE2LjE3LCAzMDYuMzMgNzYzLjUwLCAzMTQuMDAgNzk1LjAwIEMgMzIxLjY3IDgyNi41MCwgMzI4LjY3IDg0Ny4xNywgMzM4LjAwIDg3My4wMCBDIDM0Ny4zMyA4OTguODMsIDM1Ny4wMCA5MjMuNjcsIDM3MC4wMCA5NTAuMDAgQyAzODMuMDAgOTc2LjMzLCAzOTkuNjcgMTAwNi4wMCwgNDE2LjAwIDEwMzEuMDAgQyA0MzIuMzMgMTA1Ni4wMCwgNDU1LjMzIDEwODQuNTAsIDQ2OC4wMCAxMTAwLjAwIEMgNDgwLjY3IDExMTUuNTAsIDQ4Ni4xNyAxMTE5LjMzLCA0OTIuMDAgMTEyNC4wMCBDIDQ5Ny44MyAxMTI4LjY3LCA1MDAuNjcgMTEyNy42NywgNTAzLjAwIDExMjguMDAgQyA1MDUuMzMgMTEyOC4zMywgNTA1LjUwIDExMjcuNTAsIDUwNi4wMCAxMTI2LjAwIEMgNTA2LjUwIDExMjQuNTAsIDUxMC4zMyAxMTMyLjAwLCA1MDYuMDAgMTExOS4wMCBDIDUwMS42NyAxMTA2LjAwLCA0ODguMTcgMTA3My44MywgNDgwLjAwIDEwNDguMDAgQyA0NzEuODMgMTAyMi4xNywgNDYyLjY3IDk4Ny42NywgNDU3LjAwIDk2NC4wMCBDIDQ1MS4zMyA5NDAuMzMsIDQ0OS4xNyA5MjcuMzMsIDQ0Ni4wMCA5MDYuMDAgQyA0NDIuODMgODg0LjY3LCA0MzkuNTAgODY1LjAwLCA0MzguMDAgODM2LjAwIEMgNDM2LjUwIDgwNy4wMCwgNDM2LjUwIDc1OC4zMywgNDM3LjAwIDczMi4wMCBDIDQzNy41MCA3MDUuNjcsIDQzOS4wMCA2OTYuMzMsIDQ0MS4wMCA2NzguMDAgQyA0NDMuMDAgNjU5LjY3LCA0NDQuODMgNjQ0LjAwLCA0NDkuMDAgNjIyLjAwIEMgNDUzLjE3IDYwMC4wMCwgNDY0LjUwIDU1OS4wMCwgNDY2LjAwIDU0Ni4wMCBDIDQ2Ny41MCA1MzMuMDAsIDQ2OC42NyA1NDIuNTAsIDQ1OC4wMCA1NDQuMDAgQyA0NDcuMzMgNTQ1LjUwLCA0MTguMzMgNTUzLjE3LCA0MDIuMDAgNTU1LjAwIEMgMzg1LjY3IDU1Ni44MywgMzczLjgzIDU1Ni4zMywgMzYwLjAwIDU1NS4wMCBDIDM0Ni4xNyA1NTMuNjcsIDMzMC44MyA1NTAuMTcsIDMxOS4wMCA1NDcuMDAgQyAzMDcuMTcgNTQzLjgzLCAyOTQuODMgNTM2LjUwLCAyODkuMDAgNTM2LjAwIFoiLz48cGF0aCBkPSJNIDk2MS4wMCA1MzcuMDAgQyA5NDguNTAgNTM5LjE3LCA5MDcuODMgNTUyLjAwLCA4ODkuMDAgNTU1LjAwIEMgODcwLjE3IDU1OC4wMCwgODY0LjE3IDU1Ny4wMCwgODQ4LjAwIDU1NS4wMCBDIDgzMS44MyA1NTMuMDAsIDgwMi44MyA1NDUuMDAsIDc5Mi4wMCA1NDMuMDAgQyA3ODEuMTcgNTQxLjAwLCA3ODQuODMgNTQyLjUwLCA3ODMuMDAgNTQzLjAwIEMgNzgxLjE3IDU0My41MCwgNzc4LjY3IDUzMy44MywgNzgxLjAwIDU0Ni4wMCBDIDc4My4zMyA1NTguMTcsIDc5Mi42NyA1OTIuMzMsIDc5Ny4wMCA2MTYuMDAgQyA4MDEuMzMgNjM5LjY3LCA4MDQuODMgNjY4LjgzLCA4MDcuMDAgNjg4LjAwIEMgODA5LjE3IDcwNy4xNywgODA5LjY3IDcwOS4wMCwgODEwLjAwIDczMS4wMCBDIDgxMC4zMyA3NTMuMDAsIDgxMC41MCA3OTIuODMsIDgwOS4wMCA4MjAuMDAgQyA4MDcuNTAgODQ3LjE3LCA4MDQuNTAgODcwLjUwLCA4MDEuMDAgODk0LjAwIEMgNzk3LjUwIDkxNy41MCwgNzk0LjAwIDkzNi4xNywgNzg4LjAwIDk2MS4wMCBDIDc4Mi4wMCA5ODUuODMsIDc3My41MCAxMDE2LjY3LCA3NjUuMDAgMTA0My4wMCBDIDc1Ni41MCAxMDY5LjMzLCA3NDEuMzMgMTEwNC44MywgNzM3LjAwIDExMTkuMDAgQyA3MzIuNjcgMTEzMy4xNywgNzM2LjY3IDExMjcuMTcsIDczOS4wMCAxMTI4LjAwIEMgNzQxLjMzIDExMjguODMsIDc0NS44MyAxMTI3LjgzLCA3NTEuMDAgMTEyNC4wMCBDIDc1Ni4xNyAxMTIwLjE3LCA3NTcuMzMgMTEyMC41MCwgNzcwLjAwIDExMDUuMDAgQyA3ODIuNjcgMTA4OS41MCwgODExLjMzIDEwNTMuNTAsIDgyNy4wMCAxMDMxLjAwIEMgODQyLjY3IDEwMDguNTAsIDg1MS4xNyA5OTUuMDAsIDg2NC4wMCA5NzAuMDAgQyA4NzYuODMgOTQ1LjAwLCA4OTIuODMgOTEwLjAwLCA5MDQuMDAgODgxLjAwIEMgOTE1LjE3IDg1Mi4wMCwgOTIzLjAwIDgyNi42NywgOTMxLjAwIDc5Ni4wMCBDIDkzOS4wMCA3NjUuMzMsIDk0Ni42NyA3MjguNjcsIDk1Mi4wMCA2OTcuMDAgQyA5NTcuMzMgNjY1LjMzLCA5NjEuMDAgNjMxLjgzLCA5NjMuMDAgNjA2LjAwIEMgOTY1LjAwIDU4MC4xNywgOTY0LjMzIDU1My41MCwgOTY0LjAwIDU0Mi4wMCBDIDk2My42NyA1MzAuNTAsIDk3My41MCA1MzQuODMsIDk2MS4wMCA1MzcuMDAgWiIvPgogIDwvZz4KPC9zdmc+Cg==";
11
- function getStorage(mode) {
12
- if (typeof window === "undefined") return null;
13
- try {
14
- const storage = mode === "session" ? window.sessionStorage : window.localStorage;
15
- const testKey = "__walros_portal_test__";
16
- storage.setItem(testKey, "1");
17
- storage.removeItem(testKey);
18
- return storage;
19
- } catch {
20
- return null;
21
- }
22
- }
23
- function shouldRunTransition(enabled, storageMode, storageKey) {
24
- if (!enabled) return false;
25
- if (storageMode === "always") return true;
26
- if (typeof window === "undefined") return false;
27
- const storage = getStorage(storageMode);
28
- if (!storage) return true;
29
- try {
30
- return storage.getItem(storageKey) == null;
31
- } catch {
32
- return true;
33
- }
34
- }
35
- function WalrosPortalTransition({
36
- duration = 900,
51
+ function Walros3DPortalTransition({
52
+ origin,
37
53
  onComplete,
38
- backgroundColor = "#000000",
39
- enabled = true,
40
- storageMode = "always",
41
- storageKey = "walros-portal-seen",
42
- zIndex = 9999
54
+ duration = 900,
55
+ backgroundColor = "#000",
56
+ zIndex = 10001,
57
+ lockScroll = true
43
58
  }) {
44
- const [shouldRun] = useState(
45
- () => shouldRunTransition(enabled, storageMode, storageKey)
46
- );
47
- const [visible, setVisible] = useState(shouldRun);
48
- const [size, setSize] = useState({ w: 0, h: 0 });
49
- const overlayRef = useRef(null);
50
- const maskScaleRef = useRef(null);
51
- const completedRef = useRef(false);
52
- const startedRef = useRef(false);
53
- const rafRef = useRef(null);
54
- const timelineRef = useRef(null);
55
- const previousOverflowRef = useRef("");
56
- const uid = useId().replace(/[:]/g, "_");
57
- const maskId = `walros-portal-mask-${uid}`;
59
+ const [visible, setVisible] = useState(true);
60
+ const [viewport, setViewport] = useState(() => ({
61
+ width: typeof window === "undefined" ? 0 : window.innerWidth,
62
+ height: typeof window === "undefined" ? 0 : window.innerHeight
63
+ }));
64
+ const overlay = useRef(null);
65
+ const portal = useRef(null);
66
+ const completeRef = useRef(onComplete);
67
+ completeRef.current = onComplete;
68
+ const maskId = `walros-3d-portal-${useId().replace(/:/g, "_")}`;
58
69
  useEffect(() => {
59
- if (!visible) return;
60
- const element = overlayRef.current;
61
- if (!element) return;
62
- const measure = () => {
63
- const rect = element.getBoundingClientRect();
64
- setSize(
65
- (previous) => previous.w === rect.width && previous.h === rect.height ? previous : { w: rect.width, h: rect.height }
66
- );
67
- };
68
- measure();
69
- const observer = typeof ResizeObserver !== "undefined" ? new ResizeObserver(measure) : null;
70
- observer?.observe(element);
71
- window.addEventListener("resize", measure);
72
- return () => {
73
- observer?.disconnect();
74
- window.removeEventListener("resize", measure);
75
- };
76
- }, [visible]);
70
+ const updateViewport = () => setViewport({ width: window.innerWidth, height: window.innerHeight });
71
+ window.addEventListener("resize", updateViewport);
72
+ return () => window.removeEventListener("resize", updateViewport);
73
+ }, []);
77
74
  useLayoutEffect(() => {
78
- if (!enabled) {
79
- setVisible(false);
80
- return;
81
- }
82
- if (!visible) return;
83
- if (completedRef.current || startedRef.current) return;
84
- if (size.w <= 0 || size.h <= 0) return;
85
- const overlay = overlayRef.current;
86
- const maskScale = maskScaleRef.current;
87
- if (!overlay || !maskScale) return;
88
- startedRef.current = true;
89
- previousOverflowRef.current = document.body.style.overflow;
90
- document.body.style.overflow = "hidden";
75
+ if (!visible || viewport.width <= 0 || viewport.height <= 0 || !overlay.current || !portal.current) return;
76
+ const previousOverflow = document.body.style.overflow;
77
+ if (lockScroll) document.body.style.overflow = "hidden";
78
+ const visibleWidth = VISIBLE_RIGHT - VISIBLE_LEFT;
79
+ const visibleHeight = VISIBLE_BOTTOM - VISIBLE_TOP;
80
+ const visualCenterX = (VISIBLE_LEFT + VISIBLE_RIGHT) / 2;
81
+ const visualCenterY = (VISIBLE_TOP + VISIBLE_BOTTOM) / 2;
82
+ const initialScale = Math.min(origin.width / visibleWidth, origin.height / visibleHeight) * 0.985;
83
+ const initialX = origin.centerX - (visualCenterX - FOCUS_X) * initialScale;
84
+ const initialY = origin.centerY - (visualCenterY - FOCUS_Y) * initialScale;
85
+ const targetX = viewport.width / 2 - (visualCenterX - FOCUS_X) * initialScale;
86
+ const targetY = viewport.height / 2 - (visualCenterY - FOCUS_Y) * initialScale;
87
+ const diagonal = Math.hypot(viewport.width, viewport.height) / 2;
88
+ const finalScale = (diagonal + 80) / PORTAL_RADIUS * 1.15;
89
+ const total = duration / 1e3;
90
+ gsap.set(portal.current, {
91
+ x: initialX,
92
+ y: initialY,
93
+ scale: initialScale,
94
+ svgOrigin: "0 0"
95
+ });
96
+ gsap.set(overlay.current, { opacity: 1 });
91
97
  const finish = () => {
92
- if (completedRef.current) return;
93
- completedRef.current = true;
94
- document.body.style.overflow = previousOverflowRef.current;
95
- if (storageMode !== "always") {
96
- const storage = getStorage(storageMode);
97
- try {
98
- storage?.setItem(storageKey, "1");
99
- } catch {
100
- }
101
- }
98
+ if (lockScroll) document.body.style.overflow = previousOverflow;
102
99
  setVisible(false);
103
- onComplete?.();
100
+ completeRef.current?.();
104
101
  };
105
- const reducedMotion = window.matchMedia(
106
- "(prefers-reduced-motion: reduce)"
107
- ).matches;
102
+ const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
103
+ const timeline = gsap.timeline({ onComplete: finish });
108
104
  if (reducedMotion) {
109
- const timeline = gsap.timeline({ onComplete: finish });
110
- timelineRef.current = timeline;
111
- timeline.to(overlay, {
105
+ timeline.to(overlay.current, { opacity: 0, duration: 0.15, ease: "power1.out" });
106
+ } else {
107
+ timeline.to(portal.current, {
108
+ x: targetX,
109
+ y: targetY,
110
+ scale: finalScale,
111
+ duration: total,
112
+ ease: "power2.in"
113
+ }).to(overlay.current, {
112
114
  opacity: 0,
113
- duration: 0.15,
114
- ease: "power1.out"
115
- });
116
- return;
115
+ duration: total * 0.1,
116
+ ease: "power2.out"
117
+ }, total * 0.9);
117
118
  }
118
- rafRef.current = requestAnimationFrame(() => {
119
- rafRef.current = null;
120
- const halfDiagonal = Math.sqrt(size.w * size.w + size.h * size.h) / 2;
121
- const initialPixels2 = Math.min(
122
- 180,
123
- Math.max(120, size.w * 0.12)
124
- );
125
- const initialScale2 = initialPixels2 / SILHOUETTE_VIEWBOX;
126
- const finalScale = (halfDiagonal + 80) / PORTAL_RADIUS * 1.15;
127
- gsap.set(maskScale, {
128
- svgOrigin: "0 0",
129
- scale: initialScale2
130
- });
131
- gsap.set(overlay, { opacity: 1 });
132
- const totalSeconds = duration / 1e3;
133
- const timeline = gsap.timeline({ onComplete: finish });
134
- timelineRef.current = timeline;
135
- timeline.to(
136
- maskScale,
137
- {
138
- scale: initialScale2 * 1.4,
139
- duration: totalSeconds * 0.15,
140
- ease: "power2.out"
141
- },
142
- 0
143
- );
144
- timeline.to(
145
- maskScale,
146
- {
147
- scale: finalScale,
148
- duration: totalSeconds * 0.85,
149
- ease: "power2.in"
150
- },
151
- totalSeconds * 0.15
152
- );
153
- timeline.to(
154
- overlay,
155
- {
156
- opacity: 0,
157
- duration: totalSeconds * 0.1,
158
- ease: "power2.out"
159
- },
160
- totalSeconds * 0.9
161
- );
162
- });
163
- }, [
164
- duration,
165
- enabled,
166
- onComplete,
167
- size,
168
- storageKey,
169
- storageMode,
170
- visible
171
- ]);
172
- useEffect(() => {
173
119
  return () => {
174
- if (rafRef.current !== null) {
175
- cancelAnimationFrame(rafRef.current);
176
- }
177
- timelineRef.current?.kill();
178
- if (startedRef.current && !completedRef.current) {
179
- document.body.style.overflow = previousOverflowRef.current;
180
- }
120
+ timeline.kill();
121
+ if (lockScroll) document.body.style.overflow = previousOverflow;
181
122
  };
182
- }, []);
183
- if (!shouldRun || !visible) return null;
184
- const { w, h } = size;
185
- const ready = w > 0 && h > 0;
186
- const viewportCenterX = w / 2;
187
- const viewportCenterY = h / 2;
188
- const initialPixels = Math.min(
189
- 180,
190
- Math.max(120, w * 0.12)
191
- );
192
- const initialScale = initialPixels / SILHOUETTE_VIEWBOX;
193
- const visualCenter = SILHOUETTE_VIEWBOX / 2;
194
- const initialOffsetX = (visualCenter - FOCUS_X) * initialScale;
195
- const initialOffsetY = (visualCenter - FOCUS_Y) * initialScale;
196
- const portalCenterX = viewportCenterX - initialOffsetX;
197
- const portalCenterY = viewportCenterY - initialOffsetY;
123
+ }, [duration, lockScroll, origin, viewport, visible]);
124
+ if (!visible) return null;
198
125
  return /* @__PURE__ */ jsx(
199
126
  "div",
200
127
  {
201
- ref: overlayRef,
202
- "aria-hidden": "true",
128
+ ref: overlay,
129
+ className: "walros-3d-portal",
203
130
  style: {
204
131
  position: "fixed",
205
132
  inset: 0,
206
133
  width: "100vw",
207
134
  height: "100dvh",
208
- zIndex,
209
- pointerEvents: "none",
210
135
  overflow: "hidden",
211
- backgroundColor: ready ? "transparent" : backgroundColor
136
+ pointerEvents: "none",
137
+ zIndex,
138
+ backgroundColor: viewport.width > 0 && viewport.height > 0 ? "transparent" : backgroundColor
212
139
  },
213
- children: ready && /* @__PURE__ */ jsxs(
214
- "svg",
215
- {
216
- width: "100%",
217
- height: "100%",
218
- viewBox: `0 0 ${w} ${h}`,
219
- preserveAspectRatio: "none",
220
- style: {
221
- position: "absolute",
222
- inset: 0,
223
- display: "block"
224
- },
225
- children: [
226
- /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
227
- "mask",
228
- {
229
- id: maskId,
230
- maskUnits: "userSpaceOnUse",
231
- x: "0",
232
- y: "0",
233
- width: w,
234
- height: h,
235
- children: [
236
- /* @__PURE__ */ jsx(
237
- "rect",
238
- {
239
- x: "0",
240
- y: "0",
241
- width: w,
242
- height: h,
243
- fill: "white"
244
- }
245
- ),
246
- /* @__PURE__ */ jsx(
247
- "g",
248
- {
249
- transform: `translate(${portalCenterX} ${portalCenterY})`,
250
- children: /* @__PURE__ */ jsx(
251
- "g",
252
- {
253
- ref: maskScaleRef,
254
- transform: `scale(${initialScale})`,
255
- children: /* @__PURE__ */ jsx(
256
- "image",
257
- {
258
- href: WALROS_PORTAL_SILHOUETTE_URL,
259
- x: -FOCUS_X,
260
- y: -FOCUS_Y,
261
- width: SILHOUETTE_VIEWBOX,
262
- height: SILHOUETTE_VIEWBOX
263
- }
264
- )
265
- }
266
- )
267
- }
268
- )
269
- ]
270
- }
271
- ) }),
272
- /* @__PURE__ */ jsx(
273
- "rect",
274
- {
275
- x: "0",
276
- y: "0",
277
- width: w,
278
- height: h,
279
- fill: backgroundColor,
280
- mask: `url(#${maskId})`
281
- }
282
- )
283
- ]
284
- }
285
- )
140
+ "aria-hidden": "true",
141
+ children: /* @__PURE__ */ jsxs("svg", { width: "100%", height: "100%", viewBox: `0 0 ${viewport.width} ${viewport.height}`, preserveAspectRatio: "none", style: { display: "block" }, children: [
142
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("mask", { id: maskId, maskUnits: "userSpaceOnUse", x: "0", y: "0", width: viewport.width, height: viewport.height, children: [
143
+ /* @__PURE__ */ jsx("rect", { width: viewport.width, height: viewport.height, fill: "white" }),
144
+ /* @__PURE__ */ jsx("g", { ref: portal, children: /* @__PURE__ */ jsx("g", { transform: `translate(${-FOCUS_X} ${-FOCUS_Y})`, fill: "black", children: walrosPortalPaths.map((path, index) => /* @__PURE__ */ jsx("path", { d: path }, index)) }) })
145
+ ] }) }),
146
+ /* @__PURE__ */ jsx("rect", { width: viewport.width, height: viewport.height, fill: backgroundColor, mask: `url(#${maskId})` })
147
+ ] })
286
148
  }
287
149
  );
288
150
  }
289
151
 
290
- // src/assets.ts
291
- var walrosPortalSilhouetteUrl = new URL(
292
- "./assets/walros-portal-silhouette.svg",
293
- import.meta.url
294
- ).href;
295
- var walrosLogoChromeUrl = new URL(
296
- "./assets/walros-logo-chrome.png",
297
- import.meta.url
298
- ).href;
299
- var walrosWordmarkLightUrl = new URL(
300
- "./assets/walros-wordmark-light.png",
301
- import.meta.url
302
- ).href;
303
- var walrosWordmarkDarkUrl = new URL(
304
- "./assets/walros-wordmark-dark.png",
305
- import.meta.url
306
- ).href;
307
- function WalrosLogo({
308
- alt = "WalrOS",
309
- draggable = false,
310
- ...props
311
- }) {
312
- return /* @__PURE__ */ jsx(
313
- "img",
314
- {
315
- src: walrosLogoChromeUrl,
316
- alt,
317
- draggable,
318
- ...props
319
- }
320
- );
321
- }
322
- function WalrosWordmark({
323
- variant = "light",
324
- alt = "WalrOS",
325
- draggable = false,
326
- ...props
327
- }) {
328
- const src = variant === "dark" ? walrosWordmarkDarkUrl : walrosWordmarkLightUrl;
329
- return /* @__PURE__ */ jsx(
330
- "img",
331
- {
332
- src,
333
- alt,
334
- draggable,
335
- ...props
336
- }
337
- );
338
- }
152
+ // src/components/WalrosThemeGlitch.tsx
153
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
339
154
  var GLITCH_STYLES = `
340
155
  .walros-theme-glitch-root {
341
156
  position: fixed;
342
157
  inset: 0;
158
+ z-index: 9998;
343
159
  pointer-events: none;
344
160
  overflow: hidden;
161
+ visibility: hidden;
162
+ }
163
+ .walros-theme-glitch-root.is-active {
164
+ visibility: visible;
345
165
  }
346
166
  .walros-theme-glitch-root::before,
347
167
  .walros-theme-glitch-root::after {
348
168
  content: "";
349
169
  position: absolute;
350
170
  inset: 0;
351
- mix-blend-mode: screen;
352
171
  }
353
172
  .walros-theme-glitch-root::before {
354
- background:
355
- repeating-linear-gradient(
356
- 0deg,
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;
173
+ background: rgba(0, 0, 0, .82);
174
+ mix-blend-mode: normal;
175
+ animation: walros-glitch-flash 1500ms steps(1, end) both;
363
176
  }
364
177
  .walros-theme-glitch-root::after {
365
- background:
366
- linear-gradient(
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;
178
+ background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(255,255,255,.09) 3px 4px);
179
+ animation: walros-glitch-scan 90ms steps(2, end) 16 both;
180
+ }
181
+ .walros-theme-glitch-band {
182
+ position: absolute;
183
+ left: -12%;
184
+ width: 124%;
185
+ opacity: 0;
374
186
  }
187
+ .walros-theme-glitch-band:nth-child(1) { top: 12%; height: 4%; background: #eaf6ff; animation: walros-glitch-band-a 1500ms steps(1, end) both; }
188
+ .walros-theme-glitch-band:nth-child(2) { top: 36%; height: 11%; background: #020407; animation: walros-glitch-band-b 1500ms steps(1, end) both; }
189
+ .walros-theme-glitch-band:nth-child(3) { top: 62%; height: 2%; background: #7faddb; animation: walros-glitch-band-c 1500ms steps(1, end) both; }
190
+ .walros-theme-glitch-band:nth-child(4) { top: 79%; height: 8%; background: #f4f6f5; animation: walros-glitch-band-d 1500ms steps(1, end) both; }
375
191
 
376
192
  @keyframes walros-glitch-scan {
377
- 0% { transform: translate(0, 0); opacity: 1; }
378
- 15% { transform: translate(-10px, 6px); opacity: 0.9; }
379
- 30% { transform: translate(8px, -4px); opacity: 1; }
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; }
193
+ 0% { transform: translateY(-2px); opacity: .25; }
194
+ 50% { transform: translateY(2px); opacity: .08; }
195
+ 100% { transform: translateY(0); opacity: .2; }
384
196
  }
385
-
386
- @keyframes walros-glitch-slice {
387
- 0% { clip-path: inset(0 0 0 0); transform: translate(0, 0); opacity: 1; }
388
- 15% { clip-path: inset(20% 0 55% 0); transform: translate(-12px, 0); }
389
- 30% { clip-path: inset(60% 0 12% 0); transform: translate(14px, 0); }
390
- 45% { clip-path: inset(35% 0 40% 0); transform: translate(-10px, 0); }
391
- 60% { clip-path: inset(10% 0 75% 0); transform: translate(8px, 0); }
392
- 75% { clip-path: inset(72% 0 5% 0); transform: translate(-6px, 0); }
393
- 90% { clip-path: inset(25% 0 60% 0); transform: translate(4px, 0); opacity: 0.7; }
394
- 100% { clip-path: inset(0 0 100% 0); transform: translate(0, 0); opacity: 0; }
197
+ @keyframes walros-glitch-flash {
198
+ 0%, 17%, 22%, 34%, 39%, 54%, 59%, 73%, 78%, 100% { opacity: 0; }
199
+ 18%, 21% { opacity: .18; }
200
+ 35%, 38% { opacity: .48; }
201
+ 55%, 58% { opacity: .82; }
202
+ 74%, 77% { opacity: .22; }
203
+ }
204
+ @keyframes walros-glitch-band-a {
205
+ 0%, 8%, 18%, 42%, 51%, 73%, 82%, 100% { opacity: 0; transform: translateX(0); }
206
+ 9%, 17% { opacity: .55; transform: translateX(-7%); }
207
+ 43%, 50% { opacity: .82; transform: translateX(10%); }
208
+ 74%, 81% { opacity: .32; transform: translateX(-4%); }
209
+ }
210
+ @keyframes walros-glitch-band-b {
211
+ 0%, 20%, 27%, 46%, 55%, 64%, 71%, 100% { opacity: 0; transform: translateX(0); }
212
+ 21%, 26% { opacity: .72; transform: translateX(9%); }
213
+ 47%, 54% { opacity: .9; transform: translateX(-6%); }
214
+ 65%, 70% { opacity: .5; transform: translateX(4%); }
215
+ }
216
+ @keyframes walros-glitch-band-c {
217
+ 0%, 13%, 23%, 39%, 48%, 67%, 76%, 100% { opacity: 0; transform: translateX(0); }
218
+ 14%, 22% { opacity: .9; transform: translateX(5%); }
219
+ 40%, 47% { opacity: .65; transform: translateX(-11%); }
220
+ 68%, 75% { opacity: .75; transform: translateX(8%); }
221
+ }
222
+ @keyframes walros-glitch-band-d {
223
+ 0%, 29%, 38%, 57%, 65%, 85%, 93%, 100% { opacity: 0; transform: translateX(0); }
224
+ 30%, 37% { opacity: .42; transform: translateX(-8%); }
225
+ 58%, 64% { opacity: .7; transform: translateX(7%); }
226
+ 86%, 92% { opacity: .25; transform: translateX(-3%); }
395
227
  }
396
228
 
397
229
  .walros-theme-glitch-lock {
@@ -404,16 +236,17 @@ var GLITCH_STYLES = `
404
236
 
405
237
  /* Comportamiento original de WalrOS Forum para p\xE1ginas normales. */
406
238
  .walros-theme-glitch-page--body {
407
- animation: walros-glitch-page-body 500ms steps(8) both;
239
+ animation: walros-glitch-page-body 1500ms steps(1, end) both;
408
240
  }
409
241
 
410
242
  @keyframes walros-glitch-page-body {
411
- 0% { transform: translate(0, 0); filter: none; }
412
- 20% { transform: translate(-4px, 2px); filter: hue-rotate(40deg) contrast(1.15); }
413
- 40% { transform: translate(5px, -3px); filter: hue-rotate(-30deg) saturate(1.4); }
414
- 60% { transform: translate(-3px, 4px); filter: hue-rotate(90deg) contrast(1.1); }
415
- 80% { transform: translate(2px, -2px); filter: hue-rotate(-60deg) saturate(1.2); }
416
- 100% { transform: translate(0, 0); filter: none; }
243
+ 0%, 6%, 18%, 31%, 49%, 68%, 82%, 100% { transform: translate3d(0,0,0) scale(1); filter: none; }
244
+ 7% { transform: translate3d(-18px,4px,0) scale(1.012); filter: contrast(1.5) saturate(.45); }
245
+ 19% { transform: translate3d(26px,-7px,0) scale(1.02) skewX(-1.2deg); filter: contrast(1.9) saturate(1.6); }
246
+ 32% { transform: translate3d(-9px,11px,0) scale(1.03); filter: invert(.12) contrast(2); }
247
+ 50%, 57% { transform: translate3d(34px,-3px,0) scale(1.025); filter: grayscale(1) contrast(2.3); }
248
+ 69% { transform: translate3d(-24px,5px,0) scale(1.016); filter: contrast(1.7) saturate(.2); }
249
+ 83% { transform: translate3d(8px,-2px,0) scale(1.006); filter: contrast(1.35); }
417
250
  }
418
251
 
419
252
  /*
@@ -423,16 +256,17 @@ var GLITCH_STYLES = `
423
256
  */
424
257
  .walros-theme-glitch-page--viewport {
425
258
  transform-origin: 50% var(--walros-glitch-origin-y, 50%);
426
- animation: walros-glitch-page-viewport 500ms steps(8) both;
259
+ animation: walros-glitch-page-viewport 1500ms steps(1, end) both;
427
260
  }
428
261
 
429
262
  @keyframes walros-glitch-page-viewport {
430
- 0% { transform: translate3d(0, 0, 0) scale(1.012); filter: none; }
431
- 20% { transform: translate3d(-4px, 2px, 0) scale(1.012); filter: hue-rotate(40deg) contrast(1.15); }
432
- 40% { transform: translate3d(5px, -3px, 0) scale(1.012); filter: hue-rotate(-30deg) saturate(1.4); }
433
- 60% { transform: translate3d(-3px, 4px, 0) scale(1.012); filter: hue-rotate(90deg) contrast(1.1); }
434
- 80% { transform: translate3d(2px, -2px, 0) scale(1.012); filter: hue-rotate(-60deg) saturate(1.2); }
435
- 100% { transform: translate3d(0, 0, 0) scale(1); filter: none; }
263
+ 0%, 6%, 18%, 31%, 49%, 68%, 82%, 100% { transform: translate3d(0,0,0) scale(1.012); filter: none; }
264
+ 7% { transform: translate3d(-18px,4px,0) scale(1.012); filter: contrast(1.5) saturate(.45); }
265
+ 19% { transform: translate3d(26px,-7px,0) scale(1.02) skewX(-1.2deg); filter: contrast(1.9) saturate(1.6); }
266
+ 32% { transform: translate3d(-9px,11px,0) scale(1.03); filter: invert(.12) contrast(2); }
267
+ 50%, 57% { transform: translate3d(34px,-3px,0) scale(1.025); filter: grayscale(1) contrast(2.3); }
268
+ 69% { transform: translate3d(-24px,5px,0) scale(1.016); filter: contrast(1.7) saturate(.2); }
269
+ 83% { transform: translate3d(8px,-2px,0) scale(1.006); filter: contrast(1.35); }
436
270
  }
437
271
 
438
272
  @media (prefers-reduced-motion: reduce) {
@@ -441,6 +275,10 @@ var GLITCH_STYLES = `
441
275
  animation: walros-glitch-reduced 150ms ease-out forwards;
442
276
  }
443
277
 
278
+ .walros-theme-glitch-band {
279
+ animation: none !important;
280
+ }
281
+
444
282
  .walros-theme-glitch-page--body,
445
283
  .walros-theme-glitch-page--viewport {
446
284
  animation: none;
@@ -458,18 +296,384 @@ function WalrosThemeGlitch({
458
296
  className,
459
297
  style
460
298
  }) {
461
- return /* @__PURE__ */ jsxs(Fragment, { children: [
462
- /* @__PURE__ */ jsx("style", { children: GLITCH_STYLES }),
463
- active ? /* @__PURE__ */ jsx(
299
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
300
+ /* @__PURE__ */ jsx2("style", { children: GLITCH_STYLES }),
301
+ active ? /* @__PURE__ */ jsxs2(
464
302
  "div",
465
303
  {
466
- className: ["walros-theme-glitch-root", className].filter(Boolean).join(" "),
304
+ className: ["walros-theme-glitch-root", "is-active", className].filter(Boolean).join(" "),
467
305
  style: { zIndex, ...style },
468
- "aria-hidden": "true"
306
+ "aria-hidden": "true",
307
+ children: [
308
+ /* @__PURE__ */ jsx2("span", { className: "walros-theme-glitch-band" }),
309
+ /* @__PURE__ */ jsx2("span", { className: "walros-theme-glitch-band" }),
310
+ /* @__PURE__ */ jsx2("span", { className: "walros-theme-glitch-band" }),
311
+ /* @__PURE__ */ jsx2("span", { className: "walros-theme-glitch-band" })
312
+ ]
469
313
  }
470
314
  ) : null
471
315
  ] });
472
316
  }
317
+
318
+ // src/components/useOverlayHost.ts
319
+ import { useLayoutEffect as useLayoutEffect2, useState as useState2 } from "react";
320
+ function useOverlayHost(zIndex) {
321
+ const [host] = useState2(
322
+ () => typeof document === "undefined" ? null : document.createElement("div")
323
+ );
324
+ useLayoutEffect2(() => {
325
+ if (!host) return;
326
+ host.dataset.walrosOverlayRoot = "";
327
+ host.style.position = "fixed";
328
+ host.style.inset = "0";
329
+ host.style.pointerEvents = "none";
330
+ document.documentElement.appendChild(host);
331
+ return () => host.remove();
332
+ }, [host]);
333
+ useLayoutEffect2(() => {
334
+ if (host) host.style.zIndex = String(zIndex);
335
+ }, [host, zIndex]);
336
+ return host;
337
+ }
338
+
339
+ // src/components/WalrosThemeTransition.tsx
340
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
341
+ var IMAGE_SIZE = "clamp(90px, 11vw, 150px)";
342
+ var IMAGE_WIDTH = 1254;
343
+ var VISIBLE_LEFT2 = 244;
344
+ var VISIBLE_RIGHT2 = 1010;
345
+ var VISIBLE_TOP2 = 115;
346
+ var VISIBLE_BOTTOM2 = 1128;
347
+ function WalrosPortalScene({
348
+ logoUrl,
349
+ portalDuration,
350
+ zIndex,
351
+ backgroundColor = "#000",
352
+ onComplete,
353
+ lockScroll = false
354
+ }) {
355
+ const logoRef = useRef2(null);
356
+ const [origin, setOrigin] = useState3(null);
357
+ const [portalComplete, setPortalComplete] = useState3(false);
358
+ const measureLogo = () => {
359
+ const image = logoRef.current;
360
+ if (!image) return;
361
+ const rect = image.getBoundingClientRect();
362
+ const scale = rect.width / IMAGE_WIDTH;
363
+ setOrigin({
364
+ centerX: rect.left + (VISIBLE_LEFT2 + VISIBLE_RIGHT2) / 2 * scale,
365
+ centerY: rect.top + (VISIBLE_TOP2 + VISIBLE_BOTTOM2) / 2 * scale,
366
+ width: (VISIBLE_RIGHT2 - VISIBLE_LEFT2) * scale,
367
+ height: (VISIBLE_BOTTOM2 - VISIBLE_TOP2) * scale
368
+ });
369
+ };
370
+ useLayoutEffect3(() => {
371
+ const image = logoRef.current;
372
+ if (image?.complete) measureLogo();
373
+ }, []);
374
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
375
+ !portalComplete && /* @__PURE__ */ jsx3(
376
+ "img",
377
+ {
378
+ ref: logoRef,
379
+ src: logoUrl,
380
+ onLoad: measureLogo,
381
+ onError: measureLogo,
382
+ alt: "",
383
+ "aria-hidden": "true",
384
+ style: {
385
+ position: "fixed",
386
+ left: "50%",
387
+ top: "45%",
388
+ width: IMAGE_SIZE,
389
+ height: IMAGE_SIZE,
390
+ transform: "translate(-50%, -50%)",
391
+ objectFit: "contain",
392
+ zIndex,
393
+ pointerEvents: "none"
394
+ }
395
+ }
396
+ ),
397
+ !portalComplete && !origin && /* @__PURE__ */ jsx3("div", { style: { position: "fixed", inset: 0, zIndex: zIndex + 1, background: backgroundColor, pointerEvents: "none" }, "aria-hidden": "true" }),
398
+ !portalComplete && origin && /* @__PURE__ */ jsx3(
399
+ Walros3DPortalTransition,
400
+ {
401
+ origin,
402
+ duration: portalDuration,
403
+ zIndex: zIndex + 1,
404
+ backgroundColor,
405
+ lockScroll,
406
+ onComplete: () => {
407
+ setPortalComplete(true);
408
+ onComplete?.();
409
+ }
410
+ }
411
+ )
412
+ ] });
413
+ }
414
+ function WalrosThemeTransition({
415
+ active,
416
+ portalDuration = 900,
417
+ logoUrl = walrosLogoChromeUrl,
418
+ zIndex = 1e4
419
+ }) {
420
+ const host = useOverlayHost(zIndex);
421
+ useEffect2(() => {
422
+ if (typeof window === "undefined") return;
423
+ const logo = new Image();
424
+ logo.src = logoUrl;
425
+ }, [logoUrl]);
426
+ if (!host) return null;
427
+ return createPortal(
428
+ /* @__PURE__ */ jsxs3(Fragment2, { children: [
429
+ active && /* @__PURE__ */ jsx3(WalrosPortalScene, { logoUrl, portalDuration, zIndex }),
430
+ /* @__PURE__ */ jsx3(WalrosThemeGlitch, { active, zIndex: zIndex + 2 })
431
+ ] }),
432
+ host
433
+ );
434
+ }
435
+
436
+ // src/components/WalrosPortalTransition.tsx
437
+ import { jsx as jsx4 } from "react/jsx-runtime";
438
+ function getStorage(mode) {
439
+ if (typeof window === "undefined") return null;
440
+ try {
441
+ return mode === "session" ? window.sessionStorage : window.localStorage;
442
+ } catch {
443
+ return null;
444
+ }
445
+ }
446
+ function shouldRun(enabled, mode, key) {
447
+ if (!enabled) return false;
448
+ if (mode === "always") return true;
449
+ try {
450
+ return getStorage(mode)?.getItem(key) == null;
451
+ } catch {
452
+ return true;
453
+ }
454
+ }
455
+ function WalrosPortalTransition({
456
+ duration = 900,
457
+ onComplete,
458
+ backgroundColor = "#000",
459
+ enabled = true,
460
+ storageMode = "always",
461
+ storageKey = "walros-portal-seen",
462
+ zIndex = 1e4
463
+ }) {
464
+ const [run] = useState4(() => shouldRun(enabled, storageMode, storageKey));
465
+ const [complete, setComplete] = useState4(false);
466
+ const host = useOverlayHost(zIndex);
467
+ if (!host || !enabled || !run || complete) return null;
468
+ return createPortal2(
469
+ /* @__PURE__ */ jsx4(
470
+ WalrosPortalScene,
471
+ {
472
+ logoUrl: walrosLogoChromeUrl,
473
+ portalDuration: duration,
474
+ backgroundColor,
475
+ zIndex,
476
+ lockScroll: true,
477
+ onComplete: () => {
478
+ if (storageMode !== "always") {
479
+ try {
480
+ getStorage(storageMode)?.setItem(storageKey, "1");
481
+ } catch {
482
+ }
483
+ }
484
+ setComplete(true);
485
+ onComplete?.();
486
+ }
487
+ }
488
+ ),
489
+ host
490
+ );
491
+ }
492
+
493
+ // src/components/DirectionalCursor.tsx
494
+ import { useEffect as useEffect3, useRef as useRef3 } from "react";
495
+ import { Fragment as Fragment3, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
496
+ var DESKTOP_CURSOR_QUERY = "(min-width: 1024px) and (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference)";
497
+ var CURSOR_STYLES = `
498
+ .directional-cursor { position: fixed; top: 0; left: 0; z-index: 9999; width: 20px; height: 22px; opacity: 0; pointer-events: none; contain: layout style; will-change: transform; transition: opacity 100ms linear; }
499
+ .directional-cursor.is-visible { opacity: 1; }
500
+ .directional-cursor-shape { width: 20px; height: 22px; transform-origin: center center; will-change: transform; }
501
+ .directional-cursor svg { display: block; width: 20px; height: 22px; }
502
+ @media (min-width: 1024px) and (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
503
+ html.has-directional-cursor, html.has-directional-cursor body, html.has-directional-cursor body * { cursor: none !important; }
504
+ html.has-directional-cursor :is(a, button, [role="button"], [onclick], .clickable, [data-clickable], input[type="button"], input[type="submit"], input[type="reset"], label[for]),
505
+ html.has-directional-cursor :is(a, button, [role="button"], [onclick], .clickable, [data-clickable], input[type="button"], input[type="submit"], input[type="reset"], label[for]) * { cursor: pointer !important; }
506
+ html.has-directional-cursor :is(input, textarea, select, [contenteditable="true"]) { cursor: text !important; }
507
+ }
508
+ `;
509
+ function DirectionalCursor() {
510
+ const positionLayer = useRef3(null);
511
+ const directionLayer = useRef3(null);
512
+ useEffect3(() => {
513
+ const position = positionLayer.current;
514
+ const direction = directionLayer.current;
515
+ if (!position || !direction) return;
516
+ const media = window.matchMedia(DESKTOP_CURSOR_QUERY);
517
+ let active = false;
518
+ let frame = 0;
519
+ let moveFrame = 0;
520
+ let scaleTimer = 0;
521
+ let latestEvent = null;
522
+ let currentX = window.innerWidth / 2;
523
+ let currentY = -60;
524
+ let targetX = currentX;
525
+ let targetY = currentY;
526
+ let currentAngle = 0;
527
+ let targetAngle = 0;
528
+ let hasAngle = false;
529
+ let currentScale = 1;
530
+ let targetScale = 1;
531
+ let lastX = currentX;
532
+ let lastY = 0;
533
+ const render = () => {
534
+ currentX += (targetX - currentX) * 0.4;
535
+ currentY += (targetY - currentY) * 0.4;
536
+ const angleDelta = (targetAngle - currentAngle + 540) % 360 - 180;
537
+ currentAngle += angleDelta * 0.24;
538
+ currentScale += (targetScale - currentScale) * 0.24;
539
+ position.style.transform = `translate3d(${currentX}px, ${currentY}px, 0)`;
540
+ direction.style.transform = `translate(-50%, -50%) rotate(${currentAngle}deg) scale(${currentScale})`;
541
+ const unsettled = Math.abs(targetX - currentX) > 0.08 || Math.abs(targetY - currentY) > 0.08 || Math.abs(angleDelta) > 0.08 || Math.abs(targetScale - currentScale) > 2e-3;
542
+ frame = unsettled ? window.requestAnimationFrame(render) : 0;
543
+ };
544
+ const requestRender = () => {
545
+ if (!frame) frame = window.requestAnimationFrame(render);
546
+ };
547
+ const processMove = () => {
548
+ moveFrame = 0;
549
+ const event = latestEvent;
550
+ if (!event) return;
551
+ const deltaX = event.clientX - lastX;
552
+ const deltaY = event.clientY - lastY;
553
+ const distance = Math.hypot(deltaX, deltaY);
554
+ targetX = event.clientX;
555
+ targetY = event.clientY;
556
+ position.classList.add("is-visible");
557
+ if (distance > 1.25) {
558
+ const rawAngle = Math.atan2(deltaY, deltaX) * (180 / Math.PI) + 90;
559
+ const normalizedAngle = (rawAngle % 360 + 360) % 360;
560
+ if (!hasAngle) {
561
+ targetAngle = normalizedAngle;
562
+ currentAngle = normalizedAngle;
563
+ hasAngle = true;
564
+ } else {
565
+ targetAngle = normalizedAngle;
566
+ }
567
+ targetScale = 0.92;
568
+ window.clearTimeout(scaleTimer);
569
+ scaleTimer = window.setTimeout(() => {
570
+ targetScale = 1;
571
+ requestRender();
572
+ }, 130);
573
+ }
574
+ lastX = event.clientX;
575
+ lastY = event.clientY;
576
+ requestRender();
577
+ };
578
+ const handleMouseMove = (event) => {
579
+ latestEvent = event;
580
+ if (!moveFrame) moveFrame = window.requestAnimationFrame(processMove);
581
+ };
582
+ const activate = () => {
583
+ if (active) return;
584
+ active = true;
585
+ document.documentElement.classList.add("has-directional-cursor");
586
+ window.addEventListener("mousemove", handleMouseMove, { passive: true });
587
+ };
588
+ const deactivate = () => {
589
+ if (!active) return;
590
+ active = false;
591
+ document.documentElement.classList.remove("has-directional-cursor");
592
+ position.classList.remove("is-visible");
593
+ window.removeEventListener("mousemove", handleMouseMove);
594
+ window.cancelAnimationFrame(frame);
595
+ window.cancelAnimationFrame(moveFrame);
596
+ window.clearTimeout(scaleTimer);
597
+ frame = 0;
598
+ moveFrame = 0;
599
+ };
600
+ const sync = () => {
601
+ if (media.matches) activate();
602
+ else deactivate();
603
+ };
604
+ media.addEventListener("change", sync);
605
+ sync();
606
+ return () => {
607
+ media.removeEventListener("change", sync);
608
+ deactivate();
609
+ };
610
+ }, []);
611
+ return /* @__PURE__ */ jsxs4(Fragment3, { children: [
612
+ /* @__PURE__ */ jsx5("style", { children: CURSOR_STYLES }),
613
+ /* @__PURE__ */ jsx5("div", { ref: positionLayer, className: "directional-cursor", "aria-hidden": "true", children: /* @__PURE__ */ jsx5("div", { ref: directionLayer, className: "directional-cursor-shape", children: /* @__PURE__ */ jsxs4("svg", { width: "50", height: "54", viewBox: "0 0 50 54", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
614
+ /* @__PURE__ */ jsxs4("g", { filter: "url(#walros-cursor-shadow)", children: [
615
+ /* @__PURE__ */ jsx5("path", { d: "M42.6817 41.1495L27.5103 6.79925C26.7269 5.02557 24.2082 5.02558 23.3927 6.79925L7.59814 41.1495C6.75833 42.9759 8.52712 44.8902 10.4125 44.1954L24.3757 39.0496C24.8829 38.8627 25.4385 38.8627 25.9422 39.0496L39.8121 44.1954C41.6849 44.8902 43.4884 42.9759 42.6817 41.1495Z", fill: "black" }),
616
+ /* @__PURE__ */ jsx5("path", { d: "M43.7146 40.6933L28.5431 6.34306C27.3556 3.65428 23.5772 3.69516 22.3668 6.32755L6.57226 40.6778C5.3134 43.4156 7.97238 46.298 10.803 45.2549L24.7662 40.109C25.0221 40.0147 25.2999 40.0156 25.5494 40.1082L39.4193 45.254C42.2261 46.2953 44.9254 43.4347 43.7146 40.6933Z", stroke: "white", strokeWidth: "2.25825" })
617
+ ] }),
618
+ /* @__PURE__ */ jsx5("defs", { children: /* @__PURE__ */ jsxs4("filter", { id: "walros-cursor-shadow", x: "0.602397", y: "0.952444", width: "49.0584", height: "52.428", filterUnits: "userSpaceOnUse", colorInterpolationFilters: "sRGB", children: [
619
+ /* @__PURE__ */ jsx5("feFlood", { floodOpacity: "0", result: "BackgroundImageFix" }),
620
+ /* @__PURE__ */ jsx5("feColorMatrix", { in: "SourceAlpha", type: "matrix", values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0", result: "hardAlpha" }),
621
+ /* @__PURE__ */ jsx5("feOffset", { dy: "2.25825" }),
622
+ /* @__PURE__ */ jsx5("feGaussianBlur", { stdDeviation: "2.25825" }),
623
+ /* @__PURE__ */ jsx5("feComposite", { in2: "hardAlpha", operator: "out" }),
624
+ /* @__PURE__ */ jsx5("feColorMatrix", { type: "matrix", values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0" }),
625
+ /* @__PURE__ */ jsx5("feBlend", { mode: "normal", in2: "BackgroundImageFix", result: "effect1_dropShadow" }),
626
+ /* @__PURE__ */ jsx5("feBlend", { mode: "normal", in: "SourceGraphic", in2: "effect1_dropShadow", result: "shape" })
627
+ ] }) })
628
+ ] }) }) })
629
+ ] });
630
+ }
631
+
632
+ // src/components/WalrosLogo.tsx
633
+ import { jsx as jsx6 } from "react/jsx-runtime";
634
+ function WalrosLogo({
635
+ alt = "WalrOS",
636
+ draggable = false,
637
+ ...props
638
+ }) {
639
+ return /* @__PURE__ */ jsx6(
640
+ "img",
641
+ {
642
+ src: walrosLogoChromeUrl,
643
+ alt,
644
+ draggable,
645
+ ...props
646
+ }
647
+ );
648
+ }
649
+
650
+ // src/components/WalrosWordmark.tsx
651
+ import { jsx as jsx7 } from "react/jsx-runtime";
652
+ function WalrosWordmark({
653
+ variant = "light",
654
+ alt = "WalrOS",
655
+ draggable = false,
656
+ ...props
657
+ }) {
658
+ const src = variant === "dark" ? walrosWordmarkDarkUrl : walrosWordmarkLightUrl;
659
+ return /* @__PURE__ */ jsx7(
660
+ "img",
661
+ {
662
+ src,
663
+ alt,
664
+ draggable,
665
+ ...props
666
+ }
667
+ );
668
+ }
669
+
670
+ // src/hooks/useWalrosTheme.ts
671
+ import {
672
+ useCallback,
673
+ useEffect as useEffect4,
674
+ useRef as useRef4,
675
+ useState as useState5
676
+ } from "react";
473
677
  var GLITCH_BASE_CLASS = "walros-theme-glitch-page";
474
678
  var GLITCH_BODY_CLASS = "walros-theme-glitch-page--body";
475
679
  var GLITCH_VIEWPORT_CLASS = "walros-theme-glitch-page--viewport";
@@ -505,36 +709,59 @@ function useWalrosTheme({
505
709
  storageKey = "walros-theme",
506
710
  defaultTheme = "light",
507
711
  useSystemPreference = false,
508
- swapDelay = 220,
509
- totalDuration = 720,
712
+ swapDelay = 610,
713
+ totalDuration = 1500,
714
+ soundUrl = walrosThemeGlitchSoundUrl,
715
+ soundVolume = 0.52,
510
716
  applyTheme = defaultApplyTheme,
511
717
  mode = "body",
512
718
  shakeTargets = [],
513
719
  lockScroll,
514
720
  onAfterUnlock
515
721
  } = {}) {
516
- const [theme, setThemeState] = useState(
722
+ const [theme, setThemeState] = useState5(
517
723
  () => readInitialTheme(storageKey, defaultTheme, useSystemPreference)
518
724
  );
519
- const [mounted, setMounted] = useState(false);
520
- const [glitching, setGlitching] = useState(false);
521
- const themeRef = useRef(theme);
522
- const glitchingRef = useRef(false);
523
- const swapTimerRef = useRef(null);
524
- const cleanupTimerRef = useRef(null);
525
- const applyThemeRef = useRef(applyTheme);
526
- const modeRef = useRef(mode);
527
- const shakeTargetsRef = useRef(shakeTargets);
528
- const lockScrollRef = useRef(lockScroll);
529
- const onAfterUnlockRef = useRef(onAfterUnlock);
530
- const activeTargetsRef = useRef([]);
531
- const viewportLockRef = useRef(null);
725
+ const [mounted, setMounted] = useState5(false);
726
+ const [glitching, setGlitching] = useState5(false);
727
+ const themeRef = useRef4(theme);
728
+ const glitchingRef = useRef4(false);
729
+ const swapTimerRef = useRef4(null);
730
+ const cleanupTimerRef = useRef4(null);
731
+ const applyThemeRef = useRef4(applyTheme);
732
+ const modeRef = useRef4(mode);
733
+ const shakeTargetsRef = useRef4(shakeTargets);
734
+ const lockScrollRef = useRef4(lockScroll);
735
+ const onAfterUnlockRef = useRef4(onAfterUnlock);
736
+ const activeTargetsRef = useRef4([]);
737
+ const viewportLockRef = useRef4(null);
738
+ const soundRef = useRef4(null);
739
+ const soundUrlRef = useRef4(soundUrl);
740
+ const soundVolumeRef = useRef4(soundVolume);
532
741
  themeRef.current = theme;
533
742
  applyThemeRef.current = applyTheme;
534
743
  modeRef.current = mode;
535
744
  shakeTargetsRef.current = shakeTargets;
536
745
  lockScrollRef.current = lockScroll;
537
746
  onAfterUnlockRef.current = onAfterUnlock;
747
+ soundUrlRef.current = soundUrl;
748
+ soundVolumeRef.current = soundVolume;
749
+ const playThemeSound = useCallback(() => {
750
+ if (typeof window === "undefined" || !soundUrlRef.current) return;
751
+ try {
752
+ if (!soundRef.current || soundRef.current.src !== new URL(soundUrlRef.current, document.baseURI).href) {
753
+ soundRef.current?.pause();
754
+ soundRef.current = new Audio(soundUrlRef.current);
755
+ soundRef.current.preload = "auto";
756
+ }
757
+ const audio = soundRef.current;
758
+ audio.volume = Math.max(0, Math.min(1, soundVolumeRef.current));
759
+ audio.currentTime = 0;
760
+ void audio.play().catch(() => {
761
+ });
762
+ } catch {
763
+ }
764
+ }, []);
538
765
  const persistTheme = useCallback(
539
766
  (nextTheme) => {
540
767
  applyThemeRef.current(nextTheme);
@@ -547,7 +774,7 @@ function useWalrosTheme({
547
774
  },
548
775
  [storageKey]
549
776
  );
550
- useEffect(() => {
777
+ useEffect4(() => {
551
778
  const initialTheme = readInitialTheme(
552
779
  storageKey,
553
780
  defaultTheme,
@@ -629,6 +856,10 @@ function useWalrosTheme({
629
856
  activeTargetsRef.current = [];
630
857
  }, []);
631
858
  const finishGlitch = useCallback(() => {
859
+ if (soundRef.current) {
860
+ soundRef.current.pause();
861
+ soundRef.current.currentTime = 0;
862
+ }
632
863
  removeShakeClasses();
633
864
  unlockViewport(true);
634
865
  glitchingRef.current = false;
@@ -645,6 +876,7 @@ function useWalrosTheme({
645
876
  if (typeof window === "undefined" || typeof document === "undefined" || glitchingRef.current) {
646
877
  return;
647
878
  }
879
+ playThemeSound();
648
880
  const currentMode = modeRef.current;
649
881
  const shouldLockScroll = lockScrollRef.current ?? currentMode === "viewport";
650
882
  if (currentMode === "viewport" && shouldLockScroll) {
@@ -676,12 +908,15 @@ function useWalrosTheme({
676
908
  cleanupTimerRef.current = null;
677
909
  finishGlitch();
678
910
  }, effectiveDuration);
679
- }, [finishGlitch, lockViewport, persistTheme, swapDelay, totalDuration]);
680
- useEffect(() => {
911
+ }, [finishGlitch, lockViewport, persistTheme, playThemeSound, swapDelay, totalDuration]);
912
+ useEffect4(() => {
681
913
  return () => {
682
914
  clearTimers();
683
915
  removeShakeClasses();
684
916
  unlockViewport(false);
917
+ soundRef.current?.pause();
918
+ if (soundRef.current) soundRef.current.currentTime = 0;
919
+ soundRef.current = null;
685
920
  };
686
921
  }, [clearTimers, removeShakeClasses, unlockViewport]);
687
922
  return {
@@ -693,7 +928,19 @@ function useWalrosTheme({
693
928
  setTheme
694
929
  };
695
930
  }
696
-
697
- export { WalrosLogo, WalrosPortalTransition, WalrosThemeGlitch, WalrosWordmark, useWalrosTheme, walrosLogoChromeUrl, walrosPortalSilhouetteUrl, walrosWordmarkDarkUrl, walrosWordmarkLightUrl };
698
- //# sourceMappingURL=index.js.map
931
+ export {
932
+ DirectionalCursor,
933
+ Walros3DPortalTransition,
934
+ WalrosLogo,
935
+ WalrosPortalTransition,
936
+ WalrosThemeGlitch,
937
+ WalrosThemeTransition,
938
+ WalrosWordmark,
939
+ useWalrosTheme,
940
+ walrosLogoChromeUrl,
941
+ walrosPortalSilhouetteUrl,
942
+ walrosThemeGlitchSoundUrl,
943
+ walrosWordmarkDarkUrl,
944
+ walrosWordmarkLightUrl
945
+ };
699
946
  //# sourceMappingURL=index.js.map