@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/README.md +43 -225
- package/dist/assets/walros-logo-3d.glb +0 -0
- package/dist/assets/walros-theme-glitch.mp3 +0 -0
- package/dist/index.d.ts +48 -8
- package/dist/index.js +632 -385
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +4 -0
- package/dist/model.js +6 -0
- package/dist/model.js.map +1 -0
- package/package.json +10 -27
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
|
-
|
|
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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
zIndex = 9999
|
|
54
|
+
duration = 900,
|
|
55
|
+
backgroundColor = "#000",
|
|
56
|
+
zIndex = 10001,
|
|
57
|
+
lockScroll = true
|
|
43
58
|
}) {
|
|
44
|
-
const [
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
const
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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 (!
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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 (
|
|
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
|
-
|
|
100
|
+
completeRef.current?.();
|
|
104
101
|
};
|
|
105
|
-
const reducedMotion = window.matchMedia(
|
|
106
|
-
|
|
107
|
-
).matches;
|
|
102
|
+
const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
103
|
+
const timeline = gsap.timeline({ onComplete: finish });
|
|
108
104
|
if (reducedMotion) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
timeline.to(
|
|
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.
|
|
114
|
-
ease: "
|
|
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
|
-
|
|
175
|
-
|
|
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 (!
|
|
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:
|
|
202
|
-
|
|
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
|
-
|
|
136
|
+
pointerEvents: "none",
|
|
137
|
+
zIndex,
|
|
138
|
+
backgroundColor: viewport.width > 0 && viewport.height > 0 ? "transparent" : backgroundColor
|
|
212
139
|
},
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
{
|
|
216
|
-
width: "
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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/
|
|
291
|
-
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
transparent 0 2px,
|
|
358
|
-
rgba(59, 130, 246, 0.35) 2px 3px,
|
|
359
|
-
transparent 3px 5px,
|
|
360
|
-
rgba(236, 72, 153, 0.28) 5px 6px
|
|
361
|
-
);
|
|
362
|
-
animation: walros-glitch-scan 700ms steps(14) forwards;
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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%
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
45% { transform: translate(-6px, 3px); opacity: 0.85; }
|
|
381
|
-
60% { transform: translate(4px, -8px); opacity: 1; }
|
|
382
|
-
80% { transform: translate(-3px, 4px); opacity: 0.6; }
|
|
383
|
-
100% { transform: translate(0, 0); opacity: 0; }
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
|
239
|
+
animation: walros-glitch-page-body 1500ms steps(1, end) both;
|
|
408
240
|
}
|
|
409
241
|
|
|
410
242
|
@keyframes walros-glitch-page-body {
|
|
411
|
-
0%
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
|
259
|
+
animation: walros-glitch-page-viewport 1500ms steps(1, end) both;
|
|
427
260
|
}
|
|
428
261
|
|
|
429
262
|
@keyframes walros-glitch-page-viewport {
|
|
430
|
-
0%
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
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__ */
|
|
462
|
-
/* @__PURE__ */
|
|
463
|
-
active ? /* @__PURE__ */
|
|
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 =
|
|
509
|
-
totalDuration =
|
|
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] =
|
|
722
|
+
const [theme, setThemeState] = useState5(
|
|
517
723
|
() => readInitialTheme(storageKey, defaultTheme, useSystemPreference)
|
|
518
724
|
);
|
|
519
|
-
const [mounted, setMounted] =
|
|
520
|
-
const [glitching, setGlitching] =
|
|
521
|
-
const themeRef =
|
|
522
|
-
const glitchingRef =
|
|
523
|
-
const swapTimerRef =
|
|
524
|
-
const cleanupTimerRef =
|
|
525
|
-
const applyThemeRef =
|
|
526
|
-
const modeRef =
|
|
527
|
-
const shakeTargetsRef =
|
|
528
|
-
const lockScrollRef =
|
|
529
|
-
const onAfterUnlockRef =
|
|
530
|
-
const activeTargetsRef =
|
|
531
|
-
const viewportLockRef =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
698
|
-
|
|
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
|