refract-ui 0.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -3
- package/dist/RefractProvider-Bzz4G22S.cjs +25 -0
- package/dist/RefractProvider-Bzz4G22S.cjs.map +1 -0
- package/dist/RefractProvider-D__A8gQl.js +238 -0
- package/dist/RefractProvider-D__A8gQl.js.map +1 -0
- package/dist/assets/iphone-11.glb +0 -0
- package/dist/assets/macbook-pro.glb +0 -0
- package/dist/carousel.cjs +48 -1
- package/dist/carousel.cjs.map +1 -1
- package/dist/carousel.js +300 -0
- package/dist/carousel.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +10 -0
- package/dist/components/Breadcrumbs/index.d.ts +2 -0
- package/dist/components/Button/Button.d.ts +22 -0
- package/dist/components/Button/index.d.ts +2 -0
- package/dist/components/Carousel/Carousel.d.ts +21 -0
- package/dist/components/Carousel/index.d.ts +1 -0
- package/dist/components/Divider/Divider.d.ts +12 -0
- package/dist/components/Divider/index.d.ts +2 -0
- package/dist/components/Heading/Heading.d.ts +9 -0
- package/dist/components/Heading/index.d.ts +2 -0
- package/dist/components/Icon/Icon.d.ts +30 -0
- package/dist/components/Icon/index.d.ts +2 -0
- package/dist/components/Image/Image.d.ts +27 -0
- package/dist/components/Image/index.d.ts +1 -0
- package/dist/components/Input/Input.d.ts +21 -0
- package/dist/components/Input/TextArea.d.ts +11 -0
- package/dist/components/Input/index.d.ts +2 -0
- package/dist/components/Link/Link.d.ts +10 -0
- package/dist/components/Link/index.d.ts +1 -0
- package/dist/components/LinkProvider/LinkProvider.d.ts +11 -0
- package/dist/components/LinkProvider/index.d.ts +1 -0
- package/dist/components/List/List.d.ts +11 -0
- package/dist/components/List/index.d.ts +1 -0
- package/dist/components/Loader/Loader.d.ts +6 -0
- package/dist/components/Loader/index.d.ts +2 -0
- package/dist/components/Model/Model.d.ts +40 -0
- package/dist/components/Model/deviceModels.d.ts +29 -0
- package/dist/components/Model/index.d.ts +2 -0
- package/dist/components/RefractProvider/RefractProvider.d.ts +20 -0
- package/dist/components/RefractProvider/index.d.ts +1 -0
- package/dist/components/ScrambleReveal/ScrambleReveal.d.ts +9 -0
- package/dist/components/ScrambleReveal/index.d.ts +1 -0
- package/dist/components/Section/Section.d.ts +8 -0
- package/dist/components/Section/index.d.ts +1 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts +15 -0
- package/dist/components/SegmentedControl/index.d.ts +1 -0
- package/dist/components/Table/Table.d.ts +11 -0
- package/dist/components/Table/index.d.ts +1 -0
- package/dist/components/ThemeProvider/ThemeProvider.d.ts +21 -0
- package/dist/components/ThemeProvider/index.d.ts +5 -0
- package/dist/components/ThemeProvider/theme.d.ts +138 -0
- package/dist/components/ThemeProvider/useTheme.d.ts +2 -0
- package/dist/components/Transition/Transition.d.ts +19 -0
- package/dist/components/Transition/index.d.ts +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +10 -0
- package/dist/components/VisuallyHidden/index.d.ts +2 -0
- package/dist/components/Wordmark/Wordmark.d.ts +5 -0
- package/dist/components/Wordmark/index.d.ts +2 -0
- package/dist/entries/carousel.d.ts +1 -1
- package/dist/entries/model.d.ts +1 -1
- package/dist/hooks/useFormInput.d.ts +11 -0
- package/dist/hooks/useFps.d.ts +8 -0
- package/dist/hooks/useHasMounted.d.ts +1 -0
- package/dist/hooks/useInViewport.d.ts +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +20 -0
- package/dist/index.js +914 -45
- package/dist/index.js.map +1 -1
- package/dist/model.cjs +4 -1
- package/dist/model.cjs.map +1 -1
- package/dist/model.js +267 -0
- package/dist/model.js.map +1 -1
- package/dist/style-CWBkJEps.cjs +2 -0
- package/dist/style-CWBkJEps.cjs.map +1 -0
- package/dist/style-uMN7vipQ.js +96 -0
- package/dist/style-uMN7vipQ.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/three-CWsiEOQZ.js +48 -0
- package/dist/three-CWsiEOQZ.js.map +1 -0
- package/dist/three-aeLbW1yA.cjs +2 -0
- package/dist/three-aeLbW1yA.cjs.map +1 -0
- package/dist/tokens.css +1 -0
- package/dist/utils/delay.d.ts +1 -0
- package/dist/utils/image.d.ts +31 -0
- package/dist/utils/three.d.ts +29 -0
- package/package.json +5 -5
package/dist/model.js
CHANGED
|
@@ -1,2 +1,269 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { jsxs as Te, jsx as re } from "react/jsx-runtime";
|
|
3
|
+
import { useReducedMotion as he, useSpring as te, animate as q } from "framer-motion";
|
|
4
|
+
import { useRef as e, useEffect as z, useCallback as J, useState as ge, createRef as Re, startTransition as ze } from "react";
|
|
5
|
+
import { u as Pe, c as Ce, n as Ae, a as De, r as ke } from "./style-uMN7vipQ.js";
|
|
6
|
+
import { WebGLRenderer as Fe, SRGBColorSpace as we, PerspectiveCamera as _e, Scene as Be, Group as ne, AmbientLight as Ee, DirectionalLight as ae, WebGLRenderTarget as oe, PlaneGeometry as Ge, MeshBasicMaterial as ce, Mesh as Z, OrthographicCamera as He, MeshDepthMaterial as Ie, ShaderMaterial as se, Color as ie, Vector3 as U, MathUtils as Oe } from "three";
|
|
7
|
+
import { HorizontalBlurShader as Ue, VerticalBlurShader as We } from "three-stdlib";
|
|
8
|
+
import { r as Ne, c as Xe, a as Ye, t as ue, g as $e } from "./three-CWsiEOQZ.js";
|
|
9
|
+
import { u as je } from "./RefractProvider-D__A8gQl.js";
|
|
10
|
+
const le = 9;
|
|
11
|
+
function Ve(g = !0) {
|
|
12
|
+
const w = e(0), y = e(0), s = e(0), d = e([]), x = e(!1);
|
|
13
|
+
return z(() => {
|
|
14
|
+
typeof window > "u" || (y.current = performance.now(), s.current = 0, d.current = []);
|
|
15
|
+
}, [g]), { measureFps: J(() => {
|
|
16
|
+
const L = performance.now();
|
|
17
|
+
s.current = s.current + 1, L >= y.current + 100 && (w.current = s.current * 100 / (L - y.current) * 10, d.current.push(w.current), y.current = L, s.current = 0), !(d.current.length <= le) && (d.current = d.current.slice(-le), d.current.every((T) => T < 60) && (x.current = !0), d.current.every((T) => T > 70) && (x.current = !1));
|
|
18
|
+
}, []), fps: w, isLowFps: x };
|
|
19
|
+
}
|
|
20
|
+
const qe = "_model_1mfwq_1", Ze = "_canvas_1mfwq_10", pe = {
|
|
21
|
+
model: qe,
|
|
22
|
+
canvas: Ze
|
|
23
|
+
}, W = {
|
|
24
|
+
SpringUp: "spring-up",
|
|
25
|
+
LaptopOpen: "laptop-open"
|
|
26
|
+
}, de = {
|
|
27
|
+
phone: "iphone-11.glb",
|
|
28
|
+
laptop: "macbook-pro.glb"
|
|
29
|
+
};
|
|
30
|
+
function Je(g = "/models/") {
|
|
31
|
+
return {
|
|
32
|
+
phone: {
|
|
33
|
+
url: `${g}${de.phone}`,
|
|
34
|
+
width: 374,
|
|
35
|
+
height: 512,
|
|
36
|
+
position: { x: 0, y: 0, z: 0 },
|
|
37
|
+
animation: W.SpringUp
|
|
38
|
+
},
|
|
39
|
+
laptop: {
|
|
40
|
+
url: `${g}${de.laptop}`,
|
|
41
|
+
width: 1280,
|
|
42
|
+
height: 800,
|
|
43
|
+
position: { x: 0, y: 0, z: 0 },
|
|
44
|
+
animation: W.LaptopOpen
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const sr = Je(), me = {
|
|
49
|
+
Frame: "Frame",
|
|
50
|
+
Screen: "Screen"
|
|
51
|
+
}, fe = {
|
|
52
|
+
stiffness: 40,
|
|
53
|
+
damping: 20,
|
|
54
|
+
mass: 1.4,
|
|
55
|
+
restSpeed: 1e-3
|
|
56
|
+
}, ir = ({
|
|
57
|
+
models: g,
|
|
58
|
+
show: w = !0,
|
|
59
|
+
showDelay: y = 0,
|
|
60
|
+
cameraPosition: s = { x: 0, y: 0, z: 8 },
|
|
61
|
+
style: d,
|
|
62
|
+
className: x,
|
|
63
|
+
alt: H,
|
|
64
|
+
decoderPath: L,
|
|
65
|
+
...T
|
|
66
|
+
}) => {
|
|
67
|
+
const { dracoDecoderPath: P } = je(), N = L ?? P, [C, v] = ge(!1), u = e(null), A = e(null), r = e(), o = e(), i = e(), t = e(), m = e(), S = e(), l = e(), p = e(), c = e(), n = e(), b = e(), M = e(), D = e(), h = e(), I = e(), X = Pe(u, !1, { threshold: 0.2 }), K = he(), k = te(0, fe), F = te(0, fe), { measureFps: Q, isLowFps: ee } = Ve(X);
|
|
68
|
+
z(() => {
|
|
69
|
+
const { clientWidth: a, clientHeight: f } = u.current;
|
|
70
|
+
t.current = new Fe({
|
|
71
|
+
canvas: A.current,
|
|
72
|
+
alpha: !0,
|
|
73
|
+
antialias: !1,
|
|
74
|
+
powerPreference: "high-performance",
|
|
75
|
+
failIfMajorPerformanceCaveat: !0
|
|
76
|
+
}), t.current.setPixelRatio(2), t.current.setSize(a, f), t.current.outputColorSpace = we, r.current = new _e(36, a / f, 0.1, 100), r.current.position.set(s.x, s.y, s.z), i.current = new Be(), o.current = new ne(), i.current.add(o.current);
|
|
77
|
+
const R = new Ee(16777215, 1.2), B = new ae(16777215, 1.1), E = new ae(16777215, 0.8);
|
|
78
|
+
E.position.set(-6, 2, 2), B.position.set(0.5, 0, 0.866), D.current = [R, B, E], D.current.forEach((G) => i.current.add(G)), m.current = new ne(), i.current.add(m.current), m.current.position.set(0, 0, -0.8), m.current.rotateX(Math.PI / 2);
|
|
79
|
+
const O = 512, $ = 8, j = 8, ye = 1.5, ve = 0.8, Se = 3;
|
|
80
|
+
S.current = new oe(O, O), S.current.texture.generateMipmaps = !1, l.current = new oe(O, O), l.current.texture.generateMipmaps = !1;
|
|
81
|
+
const V = new Ge($, j).rotateX(
|
|
82
|
+
Math.PI / 2
|
|
83
|
+
), Me = new ce({
|
|
84
|
+
map: S.current.texture,
|
|
85
|
+
opacity: ve,
|
|
86
|
+
transparent: !0
|
|
87
|
+
});
|
|
88
|
+
M.current = new Z(V, Me), M.current.scale.y = -1, m.current.add(M.current), h.current = new Z(V), h.current.visible = !1, m.current.add(h.current);
|
|
89
|
+
const xe = new ce({
|
|
90
|
+
color: 16777215,
|
|
91
|
+
opacity: 0,
|
|
92
|
+
transparent: !0
|
|
93
|
+
});
|
|
94
|
+
I.current = new Z(V, xe), I.current.rotateX(Math.PI), I.current.position.y -= 1e-5, m.current.add(I.current), p.current = new He(
|
|
95
|
+
-$ / 2,
|
|
96
|
+
$ / 2,
|
|
97
|
+
j / 2,
|
|
98
|
+
-j / 2,
|
|
99
|
+
0,
|
|
100
|
+
ye
|
|
101
|
+
), p.current.rotation.x = Math.PI / 2, m.current.add(p.current), c.current = new Ie(), c.current.userData.darkness = { value: Se }, c.current.onBeforeCompile = (G) => {
|
|
102
|
+
G.uniforms.darkness = c.current.userData.darkness, G.fragmentShader = `
|
|
103
|
+
uniform float darkness;
|
|
104
|
+
${G.fragmentShader.replace(
|
|
105
|
+
"gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );",
|
|
106
|
+
"gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );"
|
|
107
|
+
)}
|
|
108
|
+
`;
|
|
109
|
+
}, c.current.depthTest = !1, c.current.depthWrite = !1, n.current = new se(Ue), n.current.depthTest = !1, b.current = new se(We), b.current.depthTest = !1;
|
|
110
|
+
const Le = k.onChange(_), be = F.onChange(_);
|
|
111
|
+
return () => {
|
|
112
|
+
S.current.dispose(), l.current.dispose(), Ne(D.current), Xe(i.current), Ye(t.current), Le(), be();
|
|
113
|
+
};
|
|
114
|
+
}, []);
|
|
115
|
+
const Y = J((a) => {
|
|
116
|
+
h.current.visible = !0, h.current.material = n.current, h.current.material.uniforms.tDiffuse.value = S.current.texture, n.current.uniforms.h.value = a * (1 / 256), t.current.setRenderTarget(l.current), t.current.render(h.current, p.current), h.current.material = b.current, h.current.material.uniforms.tDiffuse.value = l.current.texture, b.current.uniforms.v.value = a * (1 / 256), t.current.setRenderTarget(S.current), t.current.render(h.current, p.current), h.current.visible = !1;
|
|
117
|
+
}, []), _ = J(() => {
|
|
118
|
+
const f = i.current.background;
|
|
119
|
+
i.current.background = null, i.current.overrideMaterial = c.current, t.current.setRenderTarget(S.current), t.current.render(i.current, p.current), i.current.overrideMaterial = null, Y(5), Y(5 * 0.4), t.current.setRenderTarget(null), i.current.background = f, o.current.rotation.x = k.get(), o.current.rotation.y = F.get(), t.current.render(i.current, r.current), Q(), ee.current ? t.current.setPixelRatio(1) : t.current.setPixelRatio(2);
|
|
120
|
+
}, [Y, ee, Q, k, F]);
|
|
121
|
+
return z(() => {
|
|
122
|
+
const a = (f) => {
|
|
123
|
+
const { innerWidth: R, innerHeight: B } = window, E = {
|
|
124
|
+
x: (f.clientX - R / 2) / R,
|
|
125
|
+
y: (f.clientY - B / 2) / B
|
|
126
|
+
};
|
|
127
|
+
F.set(E.x / 2), k.set(E.y / 2);
|
|
128
|
+
};
|
|
129
|
+
return X && !K && window.addEventListener("mousemove", a), () => {
|
|
130
|
+
window.removeEventListener("mousemove", a);
|
|
131
|
+
};
|
|
132
|
+
}, [X, K, k, F]), z(() => {
|
|
133
|
+
const a = () => {
|
|
134
|
+
if (!u.current) return;
|
|
135
|
+
const { clientWidth: f, clientHeight: R } = u.current;
|
|
136
|
+
t.current.setSize(f, R), r.current.aspect = f / R, r.current.updateProjectionMatrix(), _();
|
|
137
|
+
};
|
|
138
|
+
return window.addEventListener("resize", a), a(), () => {
|
|
139
|
+
window.removeEventListener("resize", a);
|
|
140
|
+
};
|
|
141
|
+
}, [_]), /* @__PURE__ */ Te(
|
|
142
|
+
"div",
|
|
143
|
+
{
|
|
144
|
+
className: De(pe.model, x),
|
|
145
|
+
"data-loaded": C,
|
|
146
|
+
style: Ce({ delay: Ae(y) }, d),
|
|
147
|
+
ref: u,
|
|
148
|
+
role: "img",
|
|
149
|
+
"aria-label": H,
|
|
150
|
+
...T,
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ re("canvas", { className: pe.canvas, ref: A }),
|
|
153
|
+
g.map((a, f) => /* @__PURE__ */ re(
|
|
154
|
+
Ke,
|
|
155
|
+
{
|
|
156
|
+
renderer: t,
|
|
157
|
+
modelGroup: o,
|
|
158
|
+
show: w,
|
|
159
|
+
showDelay: y,
|
|
160
|
+
renderFrame: _,
|
|
161
|
+
index: f,
|
|
162
|
+
setLoaded: v,
|
|
163
|
+
model: a,
|
|
164
|
+
decoderPath: N
|
|
165
|
+
},
|
|
166
|
+
JSON.stringify(a.position)
|
|
167
|
+
))
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
}, Ke = ({
|
|
172
|
+
renderer: g,
|
|
173
|
+
model: w,
|
|
174
|
+
modelGroup: y,
|
|
175
|
+
renderFrame: s,
|
|
176
|
+
index: d,
|
|
177
|
+
showDelay: x,
|
|
178
|
+
setLoaded: H,
|
|
179
|
+
show: L,
|
|
180
|
+
decoderPath: T
|
|
181
|
+
}) => {
|
|
182
|
+
const [P, N] = ge(), C = he(), v = Re();
|
|
183
|
+
return z(() => {
|
|
184
|
+
const u = async (r, o) => {
|
|
185
|
+
r.colorSpace = we, r.flipY = !1, r.anisotropy = g.current.capabilities.getMaxAnisotropy(), r.generateMipmaps = !1, await g.current.initTexture(r), o.material.color = new ie(16777215), o.material.transparent = !0, o.material.map = r;
|
|
186
|
+
};
|
|
187
|
+
N({ start: async () => {
|
|
188
|
+
const { texture: r, position: o, url: i } = w;
|
|
189
|
+
let t = async () => {
|
|
190
|
+
}, m = () => {
|
|
191
|
+
};
|
|
192
|
+
const [S, l] = await Promise.all([
|
|
193
|
+
ue.loadAsync(
|
|
194
|
+
typeof r.placeholder == "string" ? r.placeholder : r.placeholder.src
|
|
195
|
+
),
|
|
196
|
+
$e(T).loadAsync(i)
|
|
197
|
+
]);
|
|
198
|
+
y.current.add(l.scene), l.scene.traverse(async (c) => {
|
|
199
|
+
const n = c;
|
|
200
|
+
n.material && (n.material.color = new ie(2039845)), n.name === me.Screen && (v.current = n.clone(), v.current.material = n.material.clone(), n.parent.add(v.current), v.current.material.opacity = 1, v.current.position.z += 1e-3, u(S, v.current), t = async () => {
|
|
201
|
+
const b = await ke({
|
|
202
|
+
srcSet: r.srcSet,
|
|
203
|
+
sizes: r.sizes
|
|
204
|
+
}), M = await ue.loadAsync(b);
|
|
205
|
+
await u(M, n), q(1, 0, {
|
|
206
|
+
onUpdate: (D) => {
|
|
207
|
+
v.current.material.opacity = D, s();
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
const p = new U(o.x, o.y, o.z);
|
|
213
|
+
return C && l.scene.position.set(...p.toArray()), w.animation === W.SpringUp && (m = () => {
|
|
214
|
+
const c = new U(
|
|
215
|
+
p.x,
|
|
216
|
+
p.y - 1,
|
|
217
|
+
p.z
|
|
218
|
+
);
|
|
219
|
+
l.scene.position.set(...c.toArray()), q(c.y, p.y, {
|
|
220
|
+
type: "spring",
|
|
221
|
+
delay: (300 * d + x) / 1e3,
|
|
222
|
+
stiffness: 60,
|
|
223
|
+
damping: 20,
|
|
224
|
+
mass: 1,
|
|
225
|
+
restSpeed: 1e-4,
|
|
226
|
+
restDelta: 1e-4,
|
|
227
|
+
onUpdate: (n) => {
|
|
228
|
+
l.scene.position.y = n, s();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}), w.animation === W.LaptopOpen && (m = () => {
|
|
232
|
+
const c = l.scene.children.find(
|
|
233
|
+
(M) => M.name === me.Frame
|
|
234
|
+
), n = new U(Oe.degToRad(90), 0, 0), b = new U(0, 0, 0);
|
|
235
|
+
return l.scene.position.set(...p.toArray()), c.rotation.set(...n.toArray()), q(n.x, b.x, {
|
|
236
|
+
type: "spring",
|
|
237
|
+
delay: (300 * d + x + 300) / 1e3,
|
|
238
|
+
stiffness: 80,
|
|
239
|
+
damping: 20,
|
|
240
|
+
restSpeed: 1e-4,
|
|
241
|
+
restDelta: 1e-4,
|
|
242
|
+
onUpdate: (M) => {
|
|
243
|
+
c.rotation.x = M, s();
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}), { loadFullResTexture: t, playAnimation: m };
|
|
247
|
+
} });
|
|
248
|
+
}, []), z(() => {
|
|
249
|
+
if (!P || !L) return;
|
|
250
|
+
let u;
|
|
251
|
+
const A = async () => {
|
|
252
|
+
const { loadFullResTexture: r, playAnimation: o } = await P.start();
|
|
253
|
+
H(!0), C || (u = o()), await r(), C && s();
|
|
254
|
+
};
|
|
255
|
+
return ze(() => {
|
|
256
|
+
A();
|
|
257
|
+
}), () => {
|
|
258
|
+
u == null || u.stop();
|
|
259
|
+
};
|
|
260
|
+
}, [P, L]), null;
|
|
261
|
+
};
|
|
262
|
+
export {
|
|
263
|
+
de as MODEL_FILES,
|
|
264
|
+
ir as Model,
|
|
265
|
+
W as ModelAnimationType,
|
|
266
|
+
Je as createDeviceModels,
|
|
267
|
+
sr as deviceModels
|
|
268
|
+
};
|
|
2
269
|
//# sourceMappingURL=model.js.map
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"model.js","sources":["../src/hooks/useFps.ts","../src/components/Model/deviceModels.ts","../src/components/Model/Model.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, type MutableRefObject } from 'react';\n\nconst HISTORY_LENGTH = 9;\n\ninterface UseFpsReturn {\n measureFps: () => void;\n fps: MutableRefObject<number>;\n isLowFps: MutableRefObject<boolean>;\n}\n\nexport function useFps(running = true): UseFpsReturn {\n const fps = useRef(0);\n const prevTime = useRef(0);\n const frames = useRef(0);\n const frameHistory = useRef<number[]>([]);\n const isLowFps = useRef(false);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n prevTime.current = performance.now();\n frames.current = 0;\n frameHistory.current = [];\n }, [running]);\n\n const measureFps = useCallback(() => {\n const currentTime = performance.now();\n frames.current = frames.current + 1;\n\n // Measure fps every 100ms\n if (currentTime >= prevTime.current + 100) {\n fps.current = ((frames.current * 100) / (currentTime - prevTime.current)) * 10;\n frameHistory.current.push(fps.current);\n prevTime.current = currentTime;\n frames.current = 0;\n }\n\n if (frameHistory.current.length <= HISTORY_LENGTH) return;\n frameHistory.current = frameHistory.current.slice(-HISTORY_LENGTH);\n\n // Below 60 is considered low fps\n if (frameHistory.current.every(item => item < 60)) {\n isLowFps.current = true;\n }\n\n if (frameHistory.current.every(item => item > 70)) {\n isLowFps.current = false;\n }\n }, []);\n\n return { measureFps, fps, isLowFps };\n}\n","export const ModelAnimationType = {\n SpringUp: 'spring-up',\n LaptopOpen: 'laptop-open',\n} as const;\n\nexport type ModelAnimationTypeValue = typeof ModelAnimationType[keyof typeof ModelAnimationType];\n\nexport interface DeviceModelConfig {\n url: string;\n width: number;\n height: number;\n position: { x: number; y: number; z: number };\n animation: ModelAnimationTypeValue;\n}\n\n/** The device model filenames this module knows how to serve, relative to `basePath`. */\nexport const MODEL_FILES = {\n phone: 'iphone-11.glb',\n laptop: 'macbook-pro.glb',\n} as const;\n\n/**\n * Builds the device model config, resolving each model's `.glb` against\n * `basePath` rather than bundling it — so the host app controls where the\n * files are served from (defaults to `/models/`, matching `public/models/`).\n */\nexport function createDeviceModels(basePath = '/models/'): Record<string, DeviceModelConfig> {\n return {\n phone: {\n url: `${basePath}${MODEL_FILES.phone}`,\n width: 374,\n height: 512,\n position: { x: 0, y: 0, z: 0 },\n animation: ModelAnimationType.SpringUp,\n },\n laptop: {\n url: `${basePath}${MODEL_FILES.laptop}`,\n width: 1280,\n height: 800,\n position: { x: 0, y: 0, z: 0 },\n animation: ModelAnimationType.LaptopOpen,\n },\n };\n}\n\n/** Convenience export for the default `/models/` layout. */\nexport const deviceModels: Record<string, DeviceModelConfig> = createDeviceModels();\n","import { useRefractConfig } from '../RefractProvider';\nimport { animate, useReducedMotion, useSpring } from 'framer-motion';\nimport { useFps } from '../../hooks/useFps';\nimport { useInViewport } from '../../hooks/useInViewport';\nimport {\n createRef,\n startTransition,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport type { CSSProperties, HTMLAttributes, RefObject } from 'react';\nimport {\n AmbientLight,\n Color,\n DirectionalLight,\n Group,\n MathUtils,\n Mesh,\n MeshBasicMaterial,\n MeshDepthMaterial,\n OrthographicCamera,\n PerspectiveCamera,\n PlaneGeometry,\n Scene,\n ShaderMaterial,\n SRGBColorSpace,\n Vector3,\n WebGLRenderTarget,\n WebGLRenderer,\n} from 'three';\nimport type { Light, Texture } from 'three';\nimport { HorizontalBlurShader, VerticalBlurShader } from 'three-stdlib';\nimport { resolveSrcFromSrcSet } from '../../utils/image';\nimport { classes, cssProps, numToMs } from '../../utils/style';\nimport {\n cleanRenderer,\n cleanScene,\n getModelLoader,\n removeLights,\n textureLoader,\n} from '../../utils/three';\nimport styles from './Model.module.css';\nimport { ModelAnimationType } from './deviceModels';\nimport type { ModelAnimationTypeValue } from './deviceModels';\n\nconst MeshType = {\n Frame: 'Frame',\n Logo: 'Logo',\n Screen: 'Screen',\n} as const;\n\nconst rotationSpringConfig = {\n stiffness: 40,\n damping: 20,\n mass: 1.4,\n restSpeed: 0.001,\n};\n\ninterface ImageLike {\n src: string;\n width?: number;\n height?: number;\n}\n\ninterface ModelTexture {\n placeholder: string | ImageLike;\n srcSet?: (string | ImageLike)[];\n src?: ImageLike;\n sizes?: string;\n}\n\ninterface ModelConfig {\n texture: ModelTexture;\n position: { x: number; y: number; z: number };\n url: string;\n animation: ModelAnimationTypeValue;\n}\n\ninterface ModelProps extends HTMLAttributes<HTMLDivElement> {\n models: ModelConfig[];\n show?: boolean;\n showDelay?: number;\n cameraPosition?: { x: number; y: number; z: number };\n style?: CSSProperties;\n className?: string;\n alt?: string;\n /** Path to the draco decoder assets, e.g. served at /draco/. */\n decoderPath?: string;\n}\n\nexport const Model = ({\n models,\n show = true,\n showDelay = 0,\n cameraPosition = { x: 0, y: 0, z: 8 },\n style,\n className,\n alt,\n decoderPath,\n ...rest\n}: ModelProps) => {\n const { dracoDecoderPath } = useRefractConfig();\n const resolvedDecoderPath = decoderPath ?? dracoDecoderPath;\n const [loaded, setLoaded] = useState(false);\n const container = useRef<HTMLDivElement>(null);\n const canvas = useRef<HTMLCanvasElement>(null);\n const camera = useRef<PerspectiveCamera>();\n const modelGroup = useRef<Group>();\n const scene = useRef<Scene>();\n const renderer = useRef<WebGLRenderer>();\n const shadowGroup = useRef<Group>();\n const renderTarget = useRef<WebGLRenderTarget>();\n const renderTargetBlur = useRef<WebGLRenderTarget>();\n const shadowCamera = useRef<OrthographicCamera>();\n const depthMaterial = useRef<MeshDepthMaterial>();\n const horizontalBlurMaterial = useRef<ShaderMaterial>();\n const verticalBlurMaterial = useRef<ShaderMaterial>();\n const plane = useRef<Mesh>();\n const lights = useRef<Light[]>();\n const blurPlane = useRef<Mesh>();\n const fillPlane = useRef<Mesh>();\n const isInViewport = useInViewport(container, false, { threshold: 0.2 });\n const reduceMotion = useReducedMotion();\n const rotationX = useSpring(0, rotationSpringConfig);\n const rotationY = useSpring(0, rotationSpringConfig);\n const { measureFps, isLowFps } = useFps(isInViewport);\n\n useEffect(() => {\n const { clientWidth, clientHeight } = container.current!;\n\n renderer.current = new WebGLRenderer({\n canvas: canvas.current!,\n alpha: true,\n antialias: false,\n powerPreference: 'high-performance',\n failIfMajorPerformanceCaveat: true,\n });\n\n renderer.current.setPixelRatio(2);\n renderer.current.setSize(clientWidth, clientHeight);\n renderer.current.outputColorSpace = SRGBColorSpace;\n\n camera.current = new PerspectiveCamera(36, clientWidth / clientHeight, 0.1, 100);\n camera.current.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);\n scene.current = new Scene();\n\n modelGroup.current = new Group();\n scene.current.add(modelGroup.current);\n\n const ambientLight = new AmbientLight(0xffffff, 1.2);\n const keyLight = new DirectionalLight(0xffffff, 1.1);\n const fillLight = new DirectionalLight(0xffffff, 0.8);\n\n fillLight.position.set(-6, 2, 2);\n keyLight.position.set(0.5, 0, 0.866);\n lights.current = [ambientLight, keyLight, fillLight];\n lights.current.forEach(light => scene.current!.add(light));\n\n shadowGroup.current = new Group();\n scene.current.add(shadowGroup.current);\n shadowGroup.current.position.set(0, 0, -0.8);\n shadowGroup.current.rotateX(Math.PI / 2);\n\n const renderTargetSize = 512;\n const planeWidth = 8;\n const planeHeight = 8;\n const cameraHeight = 1.5;\n const shadowOpacity = 0.8;\n const shadowDarkness = 3;\n\n renderTarget.current = new WebGLRenderTarget(renderTargetSize, renderTargetSize);\n renderTarget.current.texture.generateMipmaps = false;\n\n renderTargetBlur.current = new WebGLRenderTarget(renderTargetSize, renderTargetSize);\n renderTargetBlur.current.texture.generateMipmaps = false;\n\n const planeGeometry = new PlaneGeometry(planeWidth, planeHeight).rotateX(\n Math.PI / 2\n );\n\n const planeMaterial = new MeshBasicMaterial({\n map: renderTarget.current.texture,\n opacity: shadowOpacity,\n transparent: true,\n });\n\n plane.current = new Mesh(planeGeometry, planeMaterial);\n plane.current.scale.y = -1;\n shadowGroup.current.add(plane.current);\n\n blurPlane.current = new Mesh(planeGeometry);\n blurPlane.current.visible = false;\n shadowGroup.current.add(blurPlane.current);\n\n const fillMaterial = new MeshBasicMaterial({\n color: 0xffffff,\n opacity: 0,\n transparent: true,\n });\n\n fillPlane.current = new Mesh(planeGeometry, fillMaterial);\n fillPlane.current.rotateX(Math.PI);\n fillPlane.current.position.y -= 0.00001;\n shadowGroup.current.add(fillPlane.current);\n\n shadowCamera.current = new OrthographicCamera(\n -planeWidth / 2,\n planeWidth / 2,\n planeHeight / 2,\n -planeHeight / 2,\n 0,\n cameraHeight\n );\n shadowCamera.current.rotation.x = Math.PI / 2;\n shadowGroup.current.add(shadowCamera.current);\n\n depthMaterial.current = new MeshDepthMaterial();\n depthMaterial.current.userData.darkness = { value: shadowDarkness };\n depthMaterial.current.onBeforeCompile = shader => {\n shader.uniforms.darkness = depthMaterial.current!.userData.darkness;\n shader.fragmentShader = `\n uniform float darkness;\n ${shader.fragmentShader.replace(\n 'gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );',\n 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );'\n )}\n `;\n };\n depthMaterial.current.depthTest = false;\n depthMaterial.current.depthWrite = false;\n\n horizontalBlurMaterial.current = new ShaderMaterial(HorizontalBlurShader);\n horizontalBlurMaterial.current.depthTest = false;\n\n verticalBlurMaterial.current = new ShaderMaterial(VerticalBlurShader);\n verticalBlurMaterial.current.depthTest = false;\n\n // eslint-disable-next-line react-hooks/immutability\n const unsubscribeX = rotationX.onChange(renderFrame);\n const unsubscribeY = rotationY.onChange(renderFrame);\n\n return () => {\n renderTarget.current!.dispose();\n renderTargetBlur.current!.dispose();\n removeLights(lights.current!);\n cleanScene(scene.current!);\n cleanRenderer(renderer.current!);\n unsubscribeX();\n unsubscribeY();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const blurShadow = useCallback((amount: number) => {\n blurPlane.current!.visible = true;\n\n blurPlane.current!.material = horizontalBlurMaterial.current!;\n (blurPlane.current!.material as ShaderMaterial).uniforms.tDiffuse.value = renderTarget.current!.texture;\n horizontalBlurMaterial.current!.uniforms.h.value = amount * (1 / 256);\n\n renderer.current!.setRenderTarget(renderTargetBlur.current!);\n renderer.current!.render(blurPlane.current!, shadowCamera.current!);\n\n blurPlane.current!.material = verticalBlurMaterial.current!;\n (blurPlane.current!.material as ShaderMaterial).uniforms.tDiffuse.value = renderTargetBlur.current!.texture;\n verticalBlurMaterial.current!.uniforms.v.value = amount * (1 / 256);\n\n renderer.current!.setRenderTarget(renderTarget.current!);\n renderer.current!.render(blurPlane.current!, shadowCamera.current!);\n\n blurPlane.current!.visible = false;\n }, []);\n\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n const renderFrame = useCallback(() => {\n const blurAmount = 5;\n\n const initialBackground = scene.current!.background;\n scene.current!.background = null;\n\n scene.current!.overrideMaterial = depthMaterial.current!;\n\n renderer.current!.setRenderTarget(renderTarget.current!);\n renderer.current!.render(scene.current!, shadowCamera.current!);\n\n scene.current!.overrideMaterial = null;\n\n blurShadow(blurAmount);\n\n blurShadow(blurAmount * 0.4);\n\n renderer.current!.setRenderTarget(null);\n scene.current!.background = initialBackground;\n\n modelGroup.current!.rotation.x = rotationX.get();\n modelGroup.current!.rotation.y = rotationY.get();\n\n renderer.current!.render(scene.current!, camera.current!);\n measureFps();\n\n if (isLowFps.current) {\n renderer.current!.setPixelRatio(1);\n } else {\n renderer.current!.setPixelRatio(2);\n }\n }, [blurShadow, isLowFps, measureFps, rotationX, rotationY]);\n\n useEffect(() => {\n const onMouseMove = (event: globalThis.MouseEvent) => {\n const { innerWidth, innerHeight } = window;\n\n const position = {\n x: (event.clientX - innerWidth / 2) / innerWidth,\n y: (event.clientY - innerHeight / 2) / innerHeight,\n };\n\n rotationY.set(position.x / 2);\n rotationX.set(position.y / 2);\n };\n\n if (isInViewport && !reduceMotion) {\n window.addEventListener('mousemove', onMouseMove);\n }\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n };\n }, [isInViewport, reduceMotion, rotationX, rotationY]);\n\n useEffect(() => {\n const handleResize = () => {\n if (!container.current) return;\n\n const { clientWidth, clientHeight } = container.current;\n\n renderer.current!.setSize(clientWidth, clientHeight);\n camera.current!.aspect = clientWidth / clientHeight;\n camera.current!.updateProjectionMatrix();\n\n renderFrame();\n };\n\n window.addEventListener('resize', handleResize);\n handleResize();\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [renderFrame]);\n\n return (\n <div\n className={classes(styles.model, className)}\n data-loaded={loaded}\n style={cssProps({ delay: numToMs(showDelay) }, style)}\n ref={container}\n role=\"img\"\n aria-label={alt}\n {...rest}\n >\n <canvas className={styles.canvas} ref={canvas} />\n {models.map((model, index) => (\n <Device\n key={JSON.stringify(model.position)}\n renderer={renderer}\n modelGroup={modelGroup}\n show={show}\n showDelay={showDelay}\n renderFrame={renderFrame}\n index={index}\n setLoaded={setLoaded}\n model={model}\n decoderPath={resolvedDecoderPath}\n />\n ))}\n </div>\n );\n};\n\ninterface DeviceProps {\n renderer: RefObject<WebGLRenderer | undefined>;\n model: ModelConfig;\n modelGroup: RefObject<Group | undefined>;\n renderFrame: () => void;\n index: number;\n showDelay: number;\n setLoaded: (loaded: boolean) => void;\n show: boolean;\n decoderPath?: string;\n}\n\ninterface LoadResult {\n loadFullResTexture: () => Promise<void>;\n playAnimation: () => { stop: () => void } | void;\n}\n\nconst Device = ({\n renderer,\n model,\n modelGroup,\n renderFrame,\n index,\n showDelay,\n setLoaded,\n show,\n decoderPath,\n}: DeviceProps) => {\n const [loadDevice, setLoadDevice] = useState<{ start: () => Promise<LoadResult> }>();\n const reduceMotion = useReducedMotion();\n const placeholderScreen = createRef<Mesh>();\n\n useEffect(() => {\n const applyScreenTexture = async (texture: Texture, node: Mesh) => {\n texture.colorSpace = SRGBColorSpace;\n texture.flipY = false;\n texture.anisotropy = renderer.current!.capabilities.getMaxAnisotropy();\n texture.generateMipmaps = false;\n\n await renderer.current!.initTexture(texture);\n\n (node.material as MeshBasicMaterial).color = new Color(0xffffff);\n (node.material as MeshBasicMaterial).transparent = true;\n (node.material as MeshBasicMaterial).map = texture;\n };\n\n const load = async (): Promise<LoadResult> => {\n const { texture, position, url } = model;\n let loadFullResTexture: () => Promise<void> = async () => {};\n let playAnimation: () => { stop: () => void } | void = () => {};\n\n const [placeholder, gltf] = await Promise.all([\n textureLoader.loadAsync(\n typeof texture.placeholder === 'string' ? texture.placeholder : texture.placeholder.src\n ),\n getModelLoader(decoderPath).loadAsync(url),\n ]);\n\n modelGroup.current!.add(gltf.scene);\n\n gltf.scene.traverse(async (node: unknown) => {\n const meshNode = node as Mesh;\n if (meshNode.material) {\n (meshNode.material as MeshBasicMaterial).color = new Color(0x1f2025);\n }\n\n if (meshNode.name === MeshType.Screen) {\n (placeholderScreen as { current: Mesh | null }).current = meshNode.clone();\n (placeholderScreen.current!.material as MeshBasicMaterial) = (meshNode.material as MeshBasicMaterial).clone();\n meshNode.parent!.add(placeholderScreen.current!);\n (placeholderScreen.current!.material as MeshBasicMaterial).opacity = 1;\n placeholderScreen.current!.position.z += 0.001;\n\n applyScreenTexture(placeholder, placeholderScreen.current!);\n\n loadFullResTexture = async () => {\n const image = await resolveSrcFromSrcSet({\n srcSet: texture.srcSet as unknown as string | { src: string; width: number }[],\n sizes: texture.sizes,\n });\n const fullSize = await textureLoader.loadAsync(image);\n await applyScreenTexture(fullSize, meshNode);\n\n animate(1, 0, {\n onUpdate: (value: number) => {\n (placeholderScreen.current!.material as MeshBasicMaterial).opacity = value;\n renderFrame();\n },\n });\n };\n }\n });\n\n const targetPosition = new Vector3(position.x, position.y, position.z);\n\n if (reduceMotion) {\n gltf.scene.position.set(...targetPosition.toArray());\n }\n\n if (model.animation === ModelAnimationType.SpringUp) {\n playAnimation = () => {\n const startPosition = new Vector3(\n targetPosition.x,\n targetPosition.y - 1,\n targetPosition.z\n );\n\n gltf.scene.position.set(...startPosition.toArray());\n\n animate(startPosition.y, targetPosition.y, {\n type: 'spring',\n delay: (300 * index + showDelay) / 1000,\n stiffness: 60,\n damping: 20,\n mass: 1,\n restSpeed: 0.0001,\n restDelta: 0.0001,\n onUpdate: (value: number) => {\n gltf.scene.position.y = value;\n renderFrame();\n },\n });\n };\n }\n\n if (model.animation === ModelAnimationType.LaptopOpen) {\n playAnimation = () => {\n const frameNode = gltf.scene.children.find(\n (child: { name: string }) => child.name === MeshType.Frame\n )!;\n const startRotation = new Vector3(MathUtils.degToRad(90), 0, 0);\n const endRotation = new Vector3(0, 0, 0);\n\n gltf.scene.position.set(...targetPosition.toArray());\n frameNode.rotation.set(...startRotation.toArray());\n\n return animate(startRotation.x, endRotation.x, {\n type: 'spring',\n delay: (300 * index + showDelay + 300) / 1000,\n stiffness: 80,\n damping: 20,\n restSpeed: 0.0001,\n restDelta: 0.0001,\n onUpdate: (value: number) => {\n frameNode.rotation.x = value;\n renderFrame();\n },\n });\n };\n }\n\n return { loadFullResTexture, playAnimation };\n };\n\n setLoadDevice({ start: load });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!loadDevice || !show) return;\n let animation: { stop: () => void } | void;\n\n const onLoad = async () => {\n const { loadFullResTexture, playAnimation } = await loadDevice.start();\n\n setLoaded(true);\n\n if (!reduceMotion) {\n animation = playAnimation();\n }\n\n await loadFullResTexture();\n\n if (reduceMotion) {\n renderFrame();\n }\n };\n\n startTransition(() => {\n onLoad();\n });\n\n return () => {\n animation?.stop();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadDevice, show]);\n\n return null;\n};\n"],"names":["HISTORY_LENGTH","useFps","running","fps","useRef","prevTime","frames","frameHistory","isLowFps","useEffect","useCallback","currentTime","item","ModelAnimationType","MODEL_FILES","createDeviceModels","basePath","deviceModels","MeshType","rotationSpringConfig","Model","models","show","showDelay","cameraPosition","style","className","alt","decoderPath","rest","dracoDecoderPath","useRefractConfig","resolvedDecoderPath","loaded","setLoaded","useState","container","canvas","camera","modelGroup","scene","renderer","shadowGroup","renderTarget","renderTargetBlur","shadowCamera","depthMaterial","horizontalBlurMaterial","verticalBlurMaterial","plane","lights","blurPlane","fillPlane","isInViewport","useInViewport","reduceMotion","useReducedMotion","rotationX","useSpring","rotationY","measureFps","clientWidth","clientHeight","WebGLRenderer","SRGBColorSpace","PerspectiveCamera","Scene","Group","ambientLight","AmbientLight","keyLight","DirectionalLight","fillLight","light","renderTargetSize","planeWidth","planeHeight","cameraHeight","shadowOpacity","shadowDarkness","WebGLRenderTarget","planeGeometry","PlaneGeometry","planeMaterial","MeshBasicMaterial","Mesh","fillMaterial","OrthographicCamera","MeshDepthMaterial","shader","ShaderMaterial","HorizontalBlurShader","VerticalBlurShader","unsubscribeX","renderFrame","unsubscribeY","removeLights","cleanScene","cleanRenderer","blurShadow","amount","initialBackground","onMouseMove","event","innerWidth","innerHeight","position","handleResize","jsxs","classes","styles","cssProps","numToMs","jsx","model","index","Device","loadDevice","setLoadDevice","placeholderScreen","createRef","applyScreenTexture","texture","node","Color","url","loadFullResTexture","playAnimation","placeholder","gltf","textureLoader","getModelLoader","meshNode","image","resolveSrcFromSrcSet","fullSize","animate","value","targetPosition","Vector3","startPosition","frameNode","child","startRotation","MathUtils","endRotation","animation","onLoad","startTransition"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";"use strict";const f=require("react");function w(e,r,c={},o=!0){const[s,t]=f.useState(!1),[n,i]=f.useState(!1);return f.useEffect(()=>{if(!(e!=null&&e.current))return;const a=new IntersectionObserver(([u])=>{const{isIntersecting:m,target:l}=u;t(m),m&&r&&(a.unobserve(l),i(!0))},c);return!n&&o&&a.observe(e.current),()=>a.disconnect()},[e,r,c,n,o]),s}async function g({src:e,srcSet:r,sizes:c}){return new Promise((o,s)=>{const t=p(r);try{if(!e&&!r)throw new Error("No image src or srcSet provided");let n=new Image;e&&(n.src=e),t&&(n.srcset=t),c&&(n.sizes=c);const i=()=>{n.removeEventListener("load",i);const a=n.currentSrc;n=null,o(a)};n.addEventListener("load",i)}catch(n){s(`Error loading ${t}: ${n}`)}})}function p(e=[]){return typeof e=="string"?e:e.map(r=>`${r.src} ${r.width}w`).join(", ")}async function T(e=1,r=1){return new Promise(c=>{const o=document.createElement("canvas"),s=o.getContext("2d");if(!s)throw new Error("Could not get 2d canvas context");o.width=e,o.height=r,s.fillStyle="rgba(0, 0, 0, 0)",s.fillRect(0,0,e,r),o.toBlob(async t=>{if(!t)throw new Error("Video thumbnail failed to load");const n=URL.createObjectURL(t);o.remove(),c(n)})})}async function v({srcSet:e,sizes:r}){const c=p(e),o=await Promise.all(c.split(", ").map(async i=>{const[a,u]=i.split(" "),m=Number(u.replace("w","")),l=await T(m);return{src:a,image:l,width:u}})),s=o.map(({image:i,width:a})=>`${i} ${a}`).join(", "),t=await g({srcSet:s,sizes:r});return o.find(i=>i.image===t).src}const y={desktop:2080,laptop:1680,tablet:1040,mobile:696,mobileS:400},b=e=>Number(e.replace("px","")),d=e=>`${e}px`,x=e=>`${e/16}rem`,$=e=>Number(e.replace("ms","")),S=e=>`${e}ms`,I=e=>(e==null?void 0:e.split(" ").map(r=>Number(r)/255))||[];function N(e,r={}){const c={},o=Object.keys(e);for(const s of o){let t=e[s];typeof t=="number"&&s==="delay"&&(t=S(t)),typeof t=="number"&&s!=="opacity"&&(t=d(t)),c[`--${s}`]=t}return{...c,...r}}function h(...e){return e.filter(Boolean).join(" ")}exports.classes=h;exports.cssProps=N;exports.media=y;exports.msToNum=$;exports.numToMs=S;exports.numToPx=d;exports.pxToNum=b;exports.pxToRem=x;exports.resolveSrcFromSrcSet=v;exports.rgbToThreeColor=I;exports.srcSetToString=p;exports.useInViewport=w;
|
|
2
|
+
//# sourceMappingURL=style-CWBkJEps.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-CWBkJEps.cjs","sources":["../src/hooks/useInViewport.ts","../src/utils/image.ts","../src/utils/style.ts"],"sourcesContent":["import { useEffect, useState, type RefObject } from 'react';\n\nexport function useInViewport(\n elementRef: RefObject<HTMLElement | null>,\n unobserveOnIntersect?: boolean,\n options: IntersectionObserverInit = {},\n shouldObserve = true\n): boolean {\n const [intersect, setIntersect] = useState(false);\n const [isUnobserved, setIsUnobserved] = useState(false);\n\n useEffect(() => {\n if (!elementRef?.current) return;\n\n const observer = new IntersectionObserver(([entry]) => {\n const { isIntersecting, target } = entry;\n\n setIntersect(isIntersecting);\n\n if (isIntersecting && unobserveOnIntersect) {\n observer.unobserve(target);\n setIsUnobserved(true);\n }\n }, options);\n\n if (!isUnobserved && shouldObserve) {\n observer.observe(elementRef.current);\n }\n\n return () => observer.disconnect();\n }, [elementRef, unobserveOnIntersect, options, isUnobserved, shouldObserve]);\n\n return intersect;\n}\n","interface SrcSetItem {\n src: string;\n width: number;\n}\n\ntype SrcSet = string | SrcSetItem[];\n\n/**\n * Use the browser's image loading to load an image and\n * grab the `src` it chooses from a `srcSet`\n */\nexport async function loadImageFromSrcSet({\n src,\n srcSet,\n sizes,\n}: {\n src?: string;\n srcSet?: SrcSet;\n sizes?: string;\n}): Promise<string> {\n return new Promise((resolve, reject) => {\n const srcSetString = srcSetToString(srcSet);\n\n try {\n if (!src && !srcSet) {\n throw new Error('No image src or srcSet provided');\n }\n\n let tempImage: HTMLImageElement | null = new Image();\n\n if (src) {\n tempImage.src = src;\n }\n\n if (srcSetString) {\n tempImage.srcset = srcSetString;\n }\n\n if (sizes) {\n tempImage.sizes = sizes;\n }\n\n const onLoad = (): void => {\n tempImage!.removeEventListener('load', onLoad);\n const source = tempImage!.currentSrc;\n tempImage = null;\n resolve(source);\n };\n\n tempImage.addEventListener('load', onLoad);\n } catch (error) {\n reject(`Error loading ${srcSetString}: ${error}`);\n }\n });\n}\n\n/**\n * Convert a `srcSet` array to a plain old `srcSet` string\n */\nexport function srcSetToString(srcSet: SrcSet = []): string {\n if (typeof srcSet === 'string') {\n return srcSet;\n }\n\n return srcSet.map(item => `${item.src} ${item.width}w`).join(', ');\n}\n\n/**\n * Generates a transparent png of a given width and height\n */\nexport async function generateImage(width: number = 1, height: number = 1): Promise<string> {\n return new Promise(resolve => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Could not get 2d canvas context');\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n ctx.fillRect(0, 0, width, height);\n\n canvas.toBlob(async blob => {\n if (!blob) throw new Error('Video thumbnail failed to load');\n const image = URL.createObjectURL(blob);\n canvas.remove();\n resolve(image);\n });\n });\n}\n\n/**\n * Use native html image `srcSet` resolution for non-html images\n */\nexport async function resolveSrcFromSrcSet({\n srcSet,\n sizes,\n}: {\n srcSet?: SrcSet;\n sizes?: string;\n [key: string]: unknown;\n}): Promise<string> {\n const stringSrcSet = srcSetToString(srcSet);\n\n const sources = await Promise.all(\n stringSrcSet.split(', ').map(async srcString => {\n const [src, width] = srcString.split(' ');\n const size = Number(width.replace('w', ''));\n const image = await generateImage(size);\n return { src, image, width };\n })\n );\n\n const fakeSrcSet = sources.map(({ image, width }) => `${image} ${width}`).join(', ');\n const fakeSrc = await loadImageFromSrcSet({ srcSet: fakeSrcSet, sizes });\n\n const output = sources.find(src => src.image === fakeSrc);\n return output!.src;\n}\n","import { CSSProperties } from 'react';\n\n/**\n * Media query breakpoints\n */\nexport const media = {\n desktop: 2080,\n laptop: 1680,\n tablet: 1040,\n mobile: 696,\n mobileS: 400,\n} as const;\n\n/**\n * Convert a px string to a number\n */\nexport const pxToNum = (px: string): number => Number(px.replace('px', ''));\n\n/**\n * Convert a number to a px string\n */\nexport const numToPx = (num: number): string => `${num}px`;\n\n/**\n * Convert pixel values to rem for a11y\n */\nexport const pxToRem = (px: number): string => `${px / 16}rem`;\n\n/**\n * Convert ms token values to a raw numbers for ReactTransitionGroup\n * Transition delay props\n */\nexport const msToNum = (msString: string): number => Number(msString.replace('ms', ''));\n\n/**\n * Convert a number to an ms string\n */\nexport const numToMs = (num: number): string => `${num}ms`;\n\n/**\n * Convert an rgb theme property (e.g. rgbBlack: '0 0 0')\n * to values that can be spread into a ThreeJS Color class\n */\nexport const rgbToThreeColor = (rgb: string | undefined): number[] =>\n rgb?.split(' ').map(value => Number(value) / 255) || [];\n\n/**\n * Convert a JS object into `--` prefixed css custom properties.\n * Optionally pass a second param for normal styles\n */\nexport function cssProps(\n props: Record<string, string | number>,\n style: CSSProperties = {}\n): Record<string, string | number> & CSSProperties {\n const result: Record<string, string | number> = {};\n\n const keys = Object.keys(props);\n\n for (const key of keys) {\n let value: string | number = props[key];\n\n if (typeof value === 'number' && key === 'delay') {\n value = numToMs(value);\n }\n\n if (typeof value === 'number' && key !== 'opacity') {\n value = numToPx(value);\n }\n\n result[`--${key}`] = value;\n }\n\n return { ...result, ...style };\n}\n\n/**\n * Concatenate classNames together\n */\nexport function classes(...args: (string | false | undefined | null)[]): string {\n return args.filter(Boolean).join(' ');\n}\n"],"names":["useInViewport","elementRef","unobserveOnIntersect","options","shouldObserve","intersect","setIntersect","useState","isUnobserved","setIsUnobserved","useEffect","observer","entry","isIntersecting","target","loadImageFromSrcSet","src","srcSet","sizes","resolve","reject","srcSetString","srcSetToString","tempImage","onLoad","source","error","item","generateImage","width","height","canvas","ctx","blob","image","resolveSrcFromSrcSet","stringSrcSet","sources","srcString","size","fakeSrcSet","fakeSrc","media","pxToNum","px","numToPx","num","pxToRem","msToNum","msString","numToMs","rgbToThreeColor","rgb","value","cssProps","props","style","result","keys","key","classes","args"],"mappings":"mDAEO,SAASA,EACdC,EACAC,EACAC,EAAoC,CAAA,EACpCC,EAAgB,GACP,CACT,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,EAAK,EAC1C,CAACC,EAAcC,CAAe,EAAIF,EAAAA,SAAS,EAAK,EAEtDG,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,EAACT,GAAA,MAAAA,EAAY,SAAS,OAE1B,MAAMU,EAAW,IAAI,qBAAqB,CAAC,CAACC,CAAK,IAAM,CACrD,KAAM,CAAE,eAAAC,EAAgB,OAAAC,CAAA,EAAWF,EAEnCN,EAAaO,CAAc,EAEvBA,GAAkBX,IACpBS,EAAS,UAAUG,CAAM,EACzBL,EAAgB,EAAI,EAExB,EAAGN,CAAO,EAEV,MAAI,CAACK,GAAgBJ,GACnBO,EAAS,QAAQV,EAAW,OAAO,EAG9B,IAAMU,EAAS,WAAA,CACxB,EAAG,CAACV,EAAYC,EAAsBC,EAASK,EAAcJ,CAAa,CAAC,EAEpEC,CACT,CCtBA,eAAsBU,EAAoB,CACxC,IAAAC,EACA,OAAAC,EACA,MAAAC,CACF,EAIoB,CAClB,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,MAAMC,EAAeC,EAAeL,CAAM,EAE1C,GAAI,CACF,GAAI,CAACD,GAAO,CAACC,EACX,MAAM,IAAI,MAAM,iCAAiC,EAGnD,IAAIM,EAAqC,IAAI,MAEzCP,IACFO,EAAU,IAAMP,GAGdK,IACFE,EAAU,OAASF,GAGjBH,IACFK,EAAU,MAAQL,GAGpB,MAAMM,EAAS,IAAY,CACzBD,EAAW,oBAAoB,OAAQC,CAAM,EAC7C,MAAMC,EAASF,EAAW,WAC1BA,EAAY,KACZJ,EAAQM,CAAM,CAChB,EAEAF,EAAU,iBAAiB,OAAQC,CAAM,CAC3C,OAASE,EAAO,CACdN,EAAO,iBAAiBC,CAAY,KAAKK,CAAK,EAAE,CAClD,CACF,CAAC,CACH,CAKO,SAASJ,EAAeL,EAAiB,GAAY,CAC1D,OAAI,OAAOA,GAAW,SACbA,EAGFA,EAAO,IAAIU,GAAQ,GAAGA,EAAK,GAAG,IAAIA,EAAK,KAAK,GAAG,EAAE,KAAK,IAAI,CACnE,CAKA,eAAsBC,EAAcC,EAAgB,EAAGC,EAAiB,EAAoB,CAC1F,OAAO,IAAI,QAAQX,GAAW,CAC5B,MAAMY,EAAS,SAAS,cAAc,QAAQ,EACxCC,EAAMD,EAAO,WAAW,IAAI,EAElC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iCAAiC,EAGnDD,EAAO,MAAQF,EACfE,EAAO,OAASD,EAEhBE,EAAI,UAAY,mBAChBA,EAAI,SAAS,EAAG,EAAGH,EAAOC,CAAM,EAEhCC,EAAO,OAAO,MAAME,GAAQ,CAC1B,GAAI,CAACA,EAAM,MAAM,IAAI,MAAM,gCAAgC,EAC3D,MAAMC,EAAQ,IAAI,gBAAgBD,CAAI,EACtCF,EAAO,OAAA,EACPZ,EAAQe,CAAK,CACf,CAAC,CACH,CAAC,CACH,CAKA,eAAsBC,EAAqB,CACzC,OAAAlB,EACA,MAAAC,CACF,EAIoB,CAClB,MAAMkB,EAAed,EAAeL,CAAM,EAEpCoB,EAAU,MAAM,QAAQ,IAC5BD,EAAa,MAAM,IAAI,EAAE,IAAI,MAAME,GAAa,CAC9C,KAAM,CAACtB,EAAKa,CAAK,EAAIS,EAAU,MAAM,GAAG,EAClCC,EAAO,OAAOV,EAAM,QAAQ,IAAK,EAAE,CAAC,EACpCK,EAAQ,MAAMN,EAAcW,CAAI,EACtC,MAAO,CAAE,IAAAvB,EAAK,MAAAkB,EAAO,MAAAL,CAAA,CACvB,CAAC,CAAA,EAGGW,EAAaH,EAAQ,IAAI,CAAC,CAAE,MAAAH,EAAO,MAAAL,CAAA,IAAY,GAAGK,CAAK,IAAIL,CAAK,EAAE,EAAE,KAAK,IAAI,EAC7EY,EAAU,MAAM1B,EAAoB,CAAE,OAAQyB,EAAY,MAAAtB,EAAO,EAGvE,OADemB,EAAQ,KAAKrB,GAAOA,EAAI,QAAUyB,CAAO,EACzC,GACjB,CCpHO,MAAMC,EAAQ,CACnB,QAAS,KACT,OAAQ,KACR,OAAQ,KACR,OAAQ,IACR,QAAS,GACX,EAKaC,EAAWC,GAAuB,OAAOA,EAAG,QAAQ,KAAM,EAAE,CAAC,EAK7DC,EAAWC,GAAwB,GAAGA,CAAG,KAKzCC,EAAWH,GAAuB,GAAGA,EAAK,EAAE,MAM5CI,EAAWC,GAA6B,OAAOA,EAAS,QAAQ,KAAM,EAAE,CAAC,EAKzEC,EAAWJ,GAAwB,GAAGA,CAAG,KAMzCK,EAAmBC,IAC9BA,GAAA,YAAAA,EAAK,MAAM,KAAK,IAAIC,GAAS,OAAOA,CAAK,EAAI,OAAQ,CAAA,EAMhD,SAASC,EACdC,EACAC,EAAuB,GAC0B,CACjD,MAAMC,EAA0C,CAAA,EAE1CC,EAAO,OAAO,KAAKH,CAAK,EAE9B,UAAWI,KAAOD,EAAM,CACtB,IAAIL,EAAyBE,EAAMI,CAAG,EAElC,OAAON,GAAU,UAAYM,IAAQ,UACvCN,EAAQH,EAAQG,CAAK,GAGnB,OAAOA,GAAU,UAAYM,IAAQ,YACvCN,EAAQR,EAAQQ,CAAK,GAGvBI,EAAO,KAAKE,CAAG,EAAE,EAAIN,CACvB,CAEA,MAAO,CAAE,GAAGI,EAAQ,GAAGD,CAAA,CACzB,CAKO,SAASI,KAAWC,EAAqD,CAC9E,OAAOA,EAAK,OAAO,OAAO,EAAE,KAAK,GAAG,CACtC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState as f, useEffect as d } from "react";
|
|
3
|
+
function v(t, r, c = {}, o = !0) {
|
|
4
|
+
const [s, e] = f(!1), [n, a] = f(!1);
|
|
5
|
+
return d(() => {
|
|
6
|
+
if (!(t != null && t.current)) return;
|
|
7
|
+
const i = new IntersectionObserver(([u]) => {
|
|
8
|
+
const { isIntersecting: m, target: l } = u;
|
|
9
|
+
e(m), m && r && (i.unobserve(l), a(!0));
|
|
10
|
+
}, c);
|
|
11
|
+
return !n && o && i.observe(t.current), () => i.disconnect();
|
|
12
|
+
}, [t, r, c, n, o]), s;
|
|
13
|
+
}
|
|
14
|
+
async function w({
|
|
15
|
+
src: t,
|
|
16
|
+
srcSet: r,
|
|
17
|
+
sizes: c
|
|
18
|
+
}) {
|
|
19
|
+
return new Promise((o, s) => {
|
|
20
|
+
const e = p(r);
|
|
21
|
+
try {
|
|
22
|
+
if (!t && !r)
|
|
23
|
+
throw new Error("No image src or srcSet provided");
|
|
24
|
+
let n = new Image();
|
|
25
|
+
t && (n.src = t), e && (n.srcset = e), c && (n.sizes = c);
|
|
26
|
+
const a = () => {
|
|
27
|
+
n.removeEventListener("load", a);
|
|
28
|
+
const i = n.currentSrc;
|
|
29
|
+
n = null, o(i);
|
|
30
|
+
};
|
|
31
|
+
n.addEventListener("load", a);
|
|
32
|
+
} catch (n) {
|
|
33
|
+
s(`Error loading ${e}: ${n}`);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function p(t = []) {
|
|
38
|
+
return typeof t == "string" ? t : t.map((r) => `${r.src} ${r.width}w`).join(", ");
|
|
39
|
+
}
|
|
40
|
+
async function S(t = 1, r = 1) {
|
|
41
|
+
return new Promise((c) => {
|
|
42
|
+
const o = document.createElement("canvas"), s = o.getContext("2d");
|
|
43
|
+
if (!s)
|
|
44
|
+
throw new Error("Could not get 2d canvas context");
|
|
45
|
+
o.width = t, o.height = r, s.fillStyle = "rgba(0, 0, 0, 0)", s.fillRect(0, 0, t, r), o.toBlob(async (e) => {
|
|
46
|
+
if (!e) throw new Error("Video thumbnail failed to load");
|
|
47
|
+
const n = URL.createObjectURL(e);
|
|
48
|
+
o.remove(), c(n);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async function $({
|
|
53
|
+
srcSet: t,
|
|
54
|
+
sizes: r
|
|
55
|
+
}) {
|
|
56
|
+
const c = p(t), o = await Promise.all(
|
|
57
|
+
c.split(", ").map(async (a) => {
|
|
58
|
+
const [i, u] = a.split(" "), m = Number(u.replace("w", "")), l = await S(m);
|
|
59
|
+
return { src: i, image: l, width: u };
|
|
60
|
+
})
|
|
61
|
+
), s = o.map(({ image: a, width: i }) => `${a} ${i}`).join(", "), e = await w({ srcSet: s, sizes: r });
|
|
62
|
+
return o.find((a) => a.image === e).src;
|
|
63
|
+
}
|
|
64
|
+
const x = {
|
|
65
|
+
desktop: 2080,
|
|
66
|
+
laptop: 1680,
|
|
67
|
+
tablet: 1040,
|
|
68
|
+
mobile: 696,
|
|
69
|
+
mobileS: 400
|
|
70
|
+
}, E = (t) => Number(t.replace("px", "")), g = (t) => `${t}px`, I = (t) => `${t / 16}rem`, T = (t) => Number(t.replace("ms", "")), y = (t) => `${t}ms`, h = (t) => (t == null ? void 0 : t.split(" ").map((r) => Number(r) / 255)) || [];
|
|
71
|
+
function N(t, r = {}) {
|
|
72
|
+
const c = {}, o = Object.keys(t);
|
|
73
|
+
for (const s of o) {
|
|
74
|
+
let e = t[s];
|
|
75
|
+
typeof e == "number" && s === "delay" && (e = y(e)), typeof e == "number" && s !== "opacity" && (e = g(e)), c[`--${s}`] = e;
|
|
76
|
+
}
|
|
77
|
+
return { ...c, ...r };
|
|
78
|
+
}
|
|
79
|
+
function k(...t) {
|
|
80
|
+
return t.filter(Boolean).join(" ");
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
k as a,
|
|
84
|
+
x as b,
|
|
85
|
+
N as c,
|
|
86
|
+
g as d,
|
|
87
|
+
I as e,
|
|
88
|
+
h as f,
|
|
89
|
+
T as m,
|
|
90
|
+
y as n,
|
|
91
|
+
E as p,
|
|
92
|
+
$ as r,
|
|
93
|
+
p as s,
|
|
94
|
+
v as u
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=style-uMN7vipQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-uMN7vipQ.js","sources":["../src/hooks/useInViewport.ts","../src/utils/image.ts","../src/utils/style.ts"],"sourcesContent":["import { useEffect, useState, type RefObject } from 'react';\n\nexport function useInViewport(\n elementRef: RefObject<HTMLElement | null>,\n unobserveOnIntersect?: boolean,\n options: IntersectionObserverInit = {},\n shouldObserve = true\n): boolean {\n const [intersect, setIntersect] = useState(false);\n const [isUnobserved, setIsUnobserved] = useState(false);\n\n useEffect(() => {\n if (!elementRef?.current) return;\n\n const observer = new IntersectionObserver(([entry]) => {\n const { isIntersecting, target } = entry;\n\n setIntersect(isIntersecting);\n\n if (isIntersecting && unobserveOnIntersect) {\n observer.unobserve(target);\n setIsUnobserved(true);\n }\n }, options);\n\n if (!isUnobserved && shouldObserve) {\n observer.observe(elementRef.current);\n }\n\n return () => observer.disconnect();\n }, [elementRef, unobserveOnIntersect, options, isUnobserved, shouldObserve]);\n\n return intersect;\n}\n","interface SrcSetItem {\n src: string;\n width: number;\n}\n\ntype SrcSet = string | SrcSetItem[];\n\n/**\n * Use the browser's image loading to load an image and\n * grab the `src` it chooses from a `srcSet`\n */\nexport async function loadImageFromSrcSet({\n src,\n srcSet,\n sizes,\n}: {\n src?: string;\n srcSet?: SrcSet;\n sizes?: string;\n}): Promise<string> {\n return new Promise((resolve, reject) => {\n const srcSetString = srcSetToString(srcSet);\n\n try {\n if (!src && !srcSet) {\n throw new Error('No image src or srcSet provided');\n }\n\n let tempImage: HTMLImageElement | null = new Image();\n\n if (src) {\n tempImage.src = src;\n }\n\n if (srcSetString) {\n tempImage.srcset = srcSetString;\n }\n\n if (sizes) {\n tempImage.sizes = sizes;\n }\n\n const onLoad = (): void => {\n tempImage!.removeEventListener('load', onLoad);\n const source = tempImage!.currentSrc;\n tempImage = null;\n resolve(source);\n };\n\n tempImage.addEventListener('load', onLoad);\n } catch (error) {\n reject(`Error loading ${srcSetString}: ${error}`);\n }\n });\n}\n\n/**\n * Convert a `srcSet` array to a plain old `srcSet` string\n */\nexport function srcSetToString(srcSet: SrcSet = []): string {\n if (typeof srcSet === 'string') {\n return srcSet;\n }\n\n return srcSet.map(item => `${item.src} ${item.width}w`).join(', ');\n}\n\n/**\n * Generates a transparent png of a given width and height\n */\nexport async function generateImage(width: number = 1, height: number = 1): Promise<string> {\n return new Promise(resolve => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Could not get 2d canvas context');\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n ctx.fillRect(0, 0, width, height);\n\n canvas.toBlob(async blob => {\n if (!blob) throw new Error('Video thumbnail failed to load');\n const image = URL.createObjectURL(blob);\n canvas.remove();\n resolve(image);\n });\n });\n}\n\n/**\n * Use native html image `srcSet` resolution for non-html images\n */\nexport async function resolveSrcFromSrcSet({\n srcSet,\n sizes,\n}: {\n srcSet?: SrcSet;\n sizes?: string;\n [key: string]: unknown;\n}): Promise<string> {\n const stringSrcSet = srcSetToString(srcSet);\n\n const sources = await Promise.all(\n stringSrcSet.split(', ').map(async srcString => {\n const [src, width] = srcString.split(' ');\n const size = Number(width.replace('w', ''));\n const image = await generateImage(size);\n return { src, image, width };\n })\n );\n\n const fakeSrcSet = sources.map(({ image, width }) => `${image} ${width}`).join(', ');\n const fakeSrc = await loadImageFromSrcSet({ srcSet: fakeSrcSet, sizes });\n\n const output = sources.find(src => src.image === fakeSrc);\n return output!.src;\n}\n","import { CSSProperties } from 'react';\n\n/**\n * Media query breakpoints\n */\nexport const media = {\n desktop: 2080,\n laptop: 1680,\n tablet: 1040,\n mobile: 696,\n mobileS: 400,\n} as const;\n\n/**\n * Convert a px string to a number\n */\nexport const pxToNum = (px: string): number => Number(px.replace('px', ''));\n\n/**\n * Convert a number to a px string\n */\nexport const numToPx = (num: number): string => `${num}px`;\n\n/**\n * Convert pixel values to rem for a11y\n */\nexport const pxToRem = (px: number): string => `${px / 16}rem`;\n\n/**\n * Convert ms token values to a raw numbers for ReactTransitionGroup\n * Transition delay props\n */\nexport const msToNum = (msString: string): number => Number(msString.replace('ms', ''));\n\n/**\n * Convert a number to an ms string\n */\nexport const numToMs = (num: number): string => `${num}ms`;\n\n/**\n * Convert an rgb theme property (e.g. rgbBlack: '0 0 0')\n * to values that can be spread into a ThreeJS Color class\n */\nexport const rgbToThreeColor = (rgb: string | undefined): number[] =>\n rgb?.split(' ').map(value => Number(value) / 255) || [];\n\n/**\n * Convert a JS object into `--` prefixed css custom properties.\n * Optionally pass a second param for normal styles\n */\nexport function cssProps(\n props: Record<string, string | number>,\n style: CSSProperties = {}\n): Record<string, string | number> & CSSProperties {\n const result: Record<string, string | number> = {};\n\n const keys = Object.keys(props);\n\n for (const key of keys) {\n let value: string | number = props[key];\n\n if (typeof value === 'number' && key === 'delay') {\n value = numToMs(value);\n }\n\n if (typeof value === 'number' && key !== 'opacity') {\n value = numToPx(value);\n }\n\n result[`--${key}`] = value;\n }\n\n return { ...result, ...style };\n}\n\n/**\n * Concatenate classNames together\n */\nexport function classes(...args: (string | false | undefined | null)[]): string {\n return args.filter(Boolean).join(' ');\n}\n"],"names":["useInViewport","elementRef","unobserveOnIntersect","options","shouldObserve","intersect","setIntersect","useState","isUnobserved","setIsUnobserved","useEffect","observer","entry","isIntersecting","target","loadImageFromSrcSet","src","srcSet","sizes","resolve","reject","srcSetString","srcSetToString","tempImage","onLoad","source","error","item","generateImage","width","height","canvas","ctx","blob","image","resolveSrcFromSrcSet","stringSrcSet","sources","srcString","size","fakeSrcSet","fakeSrc","media","pxToNum","px","numToPx","num","pxToRem","msToNum","msString","numToMs","rgbToThreeColor","rgb","value","cssProps","props","style","result","keys","key","classes","args"],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes reveal{0%{transform:scale3d(0,1,1);transform-origin:left}50%{transform:scaleZ(1);transform-origin:left}51%{transform:scaleZ(1);transform-origin:right}to{transform:scale3d(0,1,1);transform-origin:right}}._text_18l38_1{line-height:var(--lineHeightBody);color:var(--colorTextBody)}._text_18l38_1[data-size=s]{font-size:var(--fontSizeBodyS)}._text_18l38_1[data-size=m]{font-size:var(--fontSizeBodyM)}._text_18l38_1[data-size=l]{font-size:var(--fontSizeBodyL)}._text_18l38_1[data-size=xl]{font-size:var(--fontSizeBodyXL)}._text_18l38_1[data-align=auto]{text-align:inherit}._text_18l38_1[data-align=start]{text-align:start}._text_18l38_1[data-align=center]{text-align:center}._text_18l38_1[data-weight=auto]{font-weight:inherit}._text_18l38_1[data-weight=regular]{font-weight:var(--fontWeightRegular)}._text_18l38_1[data-weight=medium]{font-weight:var(--fontWeightMedium)}._text_18l38_1[data-weight=bold]{font-weight:var(--fontWeightBold)}._text_18l38_1[data-secondary=true]{color:var(--colorTextLight)}
|
|
1
|
+
._carousel_miavd_1{position:relative}._content_miavd_5{position:relative;display:grid;align-items:center}._imageWrapper_miavd_11{position:relative;display:grid;grid-template-columns:100%;cursor:grab;touch-action:none}._imageWrapper_miavd_11[data-dragging=true]{cursor:grabbing}._canvasWrapper_miavd_23{position:relative;grid-column:1;grid-row:1;-webkit-user-select:none;-moz-user-select:none;user-select:none;aspect-ratio:var(--aspectRatio);isolation:isolate}._canvas_miavd_23{position:relative}._placeholder_miavd_36{grid-column:1;grid-row:1;width:100%;transition:opacity 1s ease;opacity:1;pointer-events:none;position:relative;z-index:var(--zIndex1)}._placeholder_miavd_36[data-loaded=true]{opacity:0}._button_miavd_51{border:0;margin:0;background:none;width:70px;aspect-ratio:1 / 1;grid-area:1 / 1;position:absolute;z-index:var(--zIndex3);cursor:pointer;display:grid;place-items:center}._button_miavd_51:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;transition-property:background,box-shadow;transition-duration:var(--durationM);transition-timing-function:var(--bezierFastoutSlowin);clip-path:polygon(0 0,100% 0,100% calc(100% - 12px),calc(100% - 12px) 100%,0 100%)}._button_miavd_51:hover:before{background:rgb(var(--rgbWhite) / .1)}._button_miavd_51 svg{position:relative;left:var(--offset);fill:rgb(var(--rgbWhite))}@media(max-width:696px){._button_miavd_51{display:none}}._button_miavd_51[data-prev=true]{--offset: -2px;left:var(--spaceM)}._button_miavd_51[data-next=true]{--offset: 2px;right:var(--spaceM)}._nav_miavd_107{display:flex;align-items:center;justify-content:center;margin-top:var(--spaceS)}._navButton_miavd_114{--navButtonSize: 10px;--buttonColor: rgb(var(--rgbText) / .2);background:none;border:0;margin:0;padding:var(--spaceM);cursor:pointer}._navButton_miavd_114[aria-pressed=true]{--buttonColor: var(--colorTextBody)}._navButton_miavd_114:after{content:"";display:block;border-radius:50%;width:var(--navButtonSize);height:var(--navButtonSize);background:var(--buttonColor);transition-property:background,box-shadow;transition-duration:var(--durationL);transition-timing-function:var(--bezierFastoutSlowin)}._model_1mfwq_1{position:relative;opacity:0}._model_1mfwq_1[data-loaded=true]{animation:fadeIn 1s ease forwards var(--delay)}._canvas_1mfwq_10{position:absolute;top:0;right:0;bottom:0;left:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes reveal{0%{transform:scale3d(0,1,1);transform-origin:left}50%{transform:scaleZ(1);transform-origin:left}51%{transform:scaleZ(1);transform-origin:right}to{transform:scale3d(0,1,1);transform-origin:right}}._text_18l38_1{line-height:var(--lineHeightBody);color:var(--colorTextBody)}._text_18l38_1[data-size=s]{font-size:var(--fontSizeBodyS)}._text_18l38_1[data-size=m]{font-size:var(--fontSizeBodyM)}._text_18l38_1[data-size=l]{font-size:var(--fontSizeBodyL)}._text_18l38_1[data-size=xl]{font-size:var(--fontSizeBodyXL)}._text_18l38_1[data-align=auto]{text-align:inherit}._text_18l38_1[data-align=start]{text-align:start}._text_18l38_1[data-align=center]{text-align:center}._text_18l38_1[data-weight=auto]{font-weight:inherit}._text_18l38_1[data-weight=regular]{font-weight:var(--fontWeightRegular)}._text_18l38_1[data-weight=medium]{font-weight:var(--fontWeightMedium)}._text_18l38_1[data-weight=bold]{font-weight:var(--fontWeightBold)}._text_18l38_1[data-secondary=true]{color:var(--colorTextLight)}._heading_17xux_1{line-height:var(--lineHeightTitle);color:var(--colorTextTitle)}._heading_17xux_1[data-level="0"]{letter-spacing:-.05em;font-size:var(--fontSizeH0)}._heading_17xux_1[data-level="1"]{letter-spacing:-.05em;font-size:var(--fontSizeH1)}._heading_17xux_1[data-level="2"]{font-size:var(--fontSizeH2);letter-spacing:-.04em}._heading_17xux_1[data-level="3"]{font-size:var(--fontSizeH3);letter-spacing:-.02em}._heading_17xux_1[data-level="4"]{font-size:var(--fontSizeH4);letter-spacing:-.01em}._heading_17xux_1[data-level="5"]{font-size:var(--fontSizeH5)}._heading_17xux_1[data-align=auto]{text-align:inherit}._heading_17xux_1[data-align=start]{text-align:start}._heading_17xux_1[data-align=center]{text-align:center}._heading_17xux_1[data-weight=regular]{font-weight:var(--fontWeightRegular)}._heading_17xux_1[data-weight=medium]{font-weight:var(--fontWeightMedium)}._heading_17xux_1[data-weight=bold]{font-weight:var(--fontWeightBold)}._section_e4ou0_1{padding-right:var(--space5XL);padding-left:calc(var(--space4XL) * 2)}._section_e4ou0_1:focus{outline:none}@media(min-width:2080px){._section_e4ou0_1{padding-left:var(--space5XL)}}@media(max-width:1040px){._section_e4ou0_1{padding-left:calc(var(--space4XL) + var(--space3XL))}}@media(max-width:696px){._section_e4ou0_1{padding-right:var(--spaceL);padding-left:var(--spaceL)}}@media(max-width:696px),(max-height:696px){._section_e4ou0_1{padding-left:var(--spaceOuter);padding-right:var(--spaceOuter)}}@media(max-width:820px)and (max-height:420px){._section_e4ou0_1{padding-left:var(--space4XL);padding-right:var(--space4XL)}}._list_70779_1{padding-left:1.7em;line-height:var(--lineHeightBody)}ol._list_70779_1{list-style-type:decimal-leading-zero}ul._list_70779_1{list-style-type:none}._item_70779_14{--bulletSize: min(1.2em, 24px);--markerGap: var(--spaceS);margin-bottom:.6em}ol ._item_70779_14::marker{color:rgb(var(--rgbPrimary));font-feature-settings:"ordn";font-variant-numeric:ordinal;font-size:min(1.2em,16px);font-weight:var(--fontWeightMedium);font-family:var(--monoFontStack)}ul ._item_70779_14:before{content:"";position:relative;display:inline-block;vertical-align:middle;left:calc(var(--markerGap) * -1);margin-left:calc(var(--bulletSize) * -1);width:var(--bulletSize);height:var(--bulletSize);background-color:rgb(var(--rgbPrimary));-webkit-mask-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.586 12L7.793 6.207l1.414-1.414 6.5 6.5.707.707-.707.707-6.5 6.5-1.414-1.414L13.586 12z"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.586 12L7.793 6.207l1.414-1.414 6.5 6.5.707.707-.707.707-6.5 6.5-1.414-1.414L13.586 12z"/></svg>')}._divider_vqctv_1{--dividerOpacity: 1;position:relative;width:var(--lineWidth);height:var(--lineHeight)}._divider_vqctv_1[data-light=true]{--dividerOpacity: .2}._line_vqctv_14{width:100%;height:100%;background-color:rgb(var(--rgbPrimary));opacity:var(--dividerOpacity);transition-property:opacity;transition-duration:var(--durationL);transition-timing-function:var(--bezierFastoutSlowin);transition-delay:var(--collapseDelay);transform-origin:left center;transform:scaleX(1)}@media(prefers-reduced-motion:no-preference){._line_vqctv_14{transition-property:transform,opacity}}._line_vqctv_14[data-collapsed=true]{opacity:0;transform:scaleX(0)}._notch_vqctv_36{background-color:rgb(var(--rgbPrimary));position:absolute;transition-property:opacity;transition-duration:var(--durationL);transition-timing-function:var(--bezierFastoutSlowin);transition-delay:var(--collapseDelay);opacity:var(--dividerOpacity);clip-path:polygon(0 -1px,100% -1px,calc(100% - 10px) 100%,10px 100%);width:var(--notchWidth);height:var(--notchHeight);top:var(--lineHeight)}@media(prefers-reduced-motion:no-preference){._notch_vqctv_36{transition-property:clip-path,opacity}}._notch_vqctv_36[data-collapsed=true]{opacity:0;clip-path:polygon(0 -1px,0 -1px,10px 100%,10px 100%)}._table_1fa0f_1{border-collapse:collapse;width:100%}._row_1fa0f_6{--rowBorder: 1px solid rgb(var(--rgbText) / .2);border-top:var(--rowBorder)}._row_1fa0f_6:last-child{border-bottom:var(--rowBorder)}._head_1fa0f_15 ._row_1fa0f_6{border-top:0}._headCell_1fa0f_20{font-weight:var(--fontWeightMedium);text-align:left}._cell_1fa0f_25,._headCell_1fa0f_20{padding-right:var(--spaceXL);padding-top:var(--spaceM);padding-bottom:var(--spaceM)}._cell_1fa0f_25:last-child,._headCell_1fa0f_20:last-child{padding-right:0}._hidden_1xw0v_1{position:absolute}._hidden_1xw0v_1[data-hidden=true],._hidden_1xw0v_1[data-show-on-focus=true]:not(:focus){border:0;clip-path:inset(50%);height:1px;width:1px;margin:-1px;padding:0;overflow:hidden;position:absolute;white-space:nowrap;overflow-wrap:normal}._loader_19l09_1{display:flex;justify-content:center;width:var(--size);height:var(--size)}._text_19l09_8{color:inherit}._content_19l09_12{display:grid;grid-template-columns:repeat(3,var(--spanSize));grid-gap:var(--gapSize);gap:var(--gapSize);align-items:center;justify-content:center;transform:skew(22deg)}@keyframes _loaderSpan_19l09_1{0%{transform:scaleY(0);opacity:.5;transform-origin:top}40%{transform:scaleY(1);opacity:1;transform-origin:top}60%{transform:scaleY(1);opacity:1;transform-origin:bottom}to{transform:scaleY(0);opacity:.5;transform-origin:bottom}}._span_19l09_47{height:60%;background:currentColor;animation:_loaderSpan_19l09_1 1s var(--bezierFastoutSlowin) infinite;transform:scaleY(0);transform-origin:top left}._span_19l09_47:nth-child(2){animation-delay:.1s}._span_19l09_47:nth-child(3){animation-delay:.2s}._icon_13804_1{fill:currentColor}._container_19hr9_1{--inset: 4px}._options_19hr9_5{position:relative;display:flex;padding:var(--inset)}._options_19hr9_5:before{content:"";background-color:rgb(var(--rgbText) / .05);position:absolute;top:0;right:0;bottom:0;left:0;clip-path:polygon(0 0,100% 0,100% calc(100% - 10px),calc(100% - 10px) 100%,0 100%)}._button_19hr9_25{position:relative;display:flex;align-items:center;justify-content:center;background-color:transparent;color:var(--colorTextLight);transition-property:color,background;transition-duration:var(--durationM);transition-timing-function:ease;border:0;padding:0 24px;height:56px;font-size:inherit;font-family:inherit;font-weight:var(--fontWeightMedium);cursor:pointer}._button_19hr9_25[aria-checked=true]{color:var(--colorTextBody)}._button_19hr9_25:before{--inset: 12px;content:"";position:absolute;top:var(--inset);bottom:var(--inset);left:0;width:1px;background-color:rgb(var(--rgbText) / .1);transition:opacity var(--durationM) var(--bezierFastoutSlowin);opacity:0}._button_19hr9_25:not([aria-checked=true])+._button_19hr9_25:not([aria-checked=true]):before{opacity:1}._indicator_19hr9_66{position:absolute;top:var(--inset);bottom:var(--inset);left:0;filter:drop-shadow(0 6px 12px rgb(var(--rgbBlack) / .2));transform:translate3d(var(--left),0,0);width:var(--width)}@media(prefers-reduced-motion:no-preference){._indicator_19hr9_66{transition-property:width,transform;transition-duration:var(--durationM);transition-timing-function:var(--bezierFastoutSlowin)}}._indicator_19hr9_66:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgb(var(--rgbBackgroundLight));filter:brightness(2.2);clip-path:polygon(0 0,100% 0,100% 100%,100% 100%,0 100%)}@media(prefers-reduced-motion:no-preference){._indicator_19hr9_66:before{transition:clip-path var(--durationM) var(--bezierFastoutSlowin)}}._indicator_19hr9_66[data-last=true]:before{clip-path:polygon(0 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%)}._container_1a9g9_1{--inputFontSize: 1rem ;--inputFocusColor: rgb(var(--rgbPrimary));--inputUnderlineColor: rgb(var(--rgbText) / .2);position:relative;display:flex;flex-direction:column}._container_1a9g9_1[data-error=true]{--inputUnderlineColor: rgb(var(--rgbError))}._content_1a9g9_15{position:relative;display:flex}._input_1a9g9_20{display:block;color:var(--colorTextBody);box-shadow:inset 0 -2px 0 0 var(--inputUnderlineColor);transition:background-color 5000s linear 0s;width:100%;font-size:var(--inputFontSize);line-height:var(--lineHeightBody);padding:var(--spaceL) 0 var(--spaceM);overflow-x:hidden;outline:none}._input_1a9g9_20::-moz-placeholder{color:rgb(var(--rgbText) / .4)}._input_1a9g9_20::placeholder{color:rgb(var(--rgbText) / .4)}._input_1a9g9_20:-internal-autofill-selected{-webkit-text-fill-color:var(--colorTextBody);box-shadow:0 0 0 1000px rgb(var(--rgbText) / .1) inset}._input_1a9g9_20:-webkit-autofill{-webkit-text-fill-color:var(--colorTextBody);box-shadow:0 0 0 1000px rgb(var(--rgbText) / .1) inset}._input_1a9g9_20::-webkit-contacts-auto-fill-button:hover{background-color:rgb(var(--rgbPrimary))}@media(prefers-reduced-motion:reduce){#_root_1a9g9_1 ._input_1a9g9_20{transition:background-color 5000s linear 0s}}._underline_1a9g9_60{background:var(--inputFocusColor);transform:scale3d(0,1,1);width:100%;height:2px;position:absolute;bottom:0;transform-origin:left}@media(prefers-reduced-motion:no-preference){._underline_1a9g9_60{transition:transform var(--durationM) var(--bezierFastoutSlowin)}}._underline_1a9g9_60[data-focused=true]{transform:scaleZ(1)}._label_1a9g9_32{color:rgb(var(--rgbText) / .8);position:absolute;top:var(--spaceL);left:0;display:block;cursor:text;transform-origin:top left;transition:color var(--durationM) ease}@media(prefers-reduced-motion:no-preference){._label_1a9g9_32{transition:transform var(--durationM) var(--bezierFastoutSlowin),color var(--durationM) ease}}._label_1a9g9_32[data-filled=true],._label_1a9g9_32[data-focused=true],._label_1a9g9_32[data-placeholder=true]{color:rgb(var(--rgbText) / .54);transform:scale(.8) translateY(calc(var(--spaceL) * -1))}._container_1a9g9_1[data-multiline=true] ._content_1a9g9_15{flex-direction:column}._container_1a9g9_1[data-multiline=true] ._label_1a9g9_32{position:static;transform:none;transform-origin:left top;margin-bottom:var(--spaceXS);color:rgb(var(--rgbText) / .54);font-size:calc(var(--inputFontSize) * .8);cursor:default}._container_1a9g9_1[data-multiline=true] ._input_1a9g9_20{padding-top:0}._container_1a9g9_1[data-multiline=true] ._input_1a9g9_20:-moz-placeholder{white-space:nowrap;text-overflow:ellipsis}._container_1a9g9_1[data-multiline=true] ._input_1a9g9_20:placeholder-shown{white-space:nowrap;text-overflow:ellipsis}._error_1a9g9_135{transition-property:opacity;transition-duration:var(--durationM);transition-timing-function:var(--bezierFastoutSlowin);height:var(--height);opacity:0}@media(prefers-reduced-motion:no-preference){._error_1a9g9_135{transition-property:height,opacity}}._error_1a9g9_135[data-visible=true]{opacity:1}._errorMessage_1a9g9_151{display:grid;grid-template-columns:auto 1fr;align-items:center;grid-gap:var(--spaceXS);gap:var(--spaceXS);padding-top:var(--spaceS);color:rgb(var(--rgbError))}._textarea_vm3vl_1{resize:var(--resize);overflow-y:auto}._link_o3rjr_1{--lineStrokeWidth: 2px;--linkColor: var(--rgbPrimary);--lineOpacity: .3;--filledLineGradient: linear-gradient(rgb(var(--linkColor)), rgb(var(--linkColor)));--unfilledLineGradient: linear-gradient( rgb(var(--linkColor) / var(--lineOpacity)), rgb(var(--linkColor) / var(--lineOpacity)) );cursor:pointer;display:inline;color:rgb(var(--linkColor));background:var(--filledLineGradient) no-repeat 100% 100% / 0 var(--lineStrokeWidth),var(--unfilledLineGradient) no-repeat 0 100% / 100% var(--lineStrokeWidth);padding-bottom:var(--lineStrokeWidth)}._link_o3rjr_1:hover,._link_o3rjr_1:focus{background:var(--filledLineGradient) no-repeat 0 100% / 100% var(--lineStrokeWidth),var(--unfilledLineGradient) no-repeat 0 100% / 100% var(--lineStrokeWidth)}@media(prefers-reduced-motion:no-preference){._link_o3rjr_1{transition-duration:var(--durationM);transition-timing-function:var(--bezierFastoutSlowin);transition-property:background-size}}._link_o3rjr_1[data-secondary=true]{--linkColor: var(--rgbText)}._button_1yrod_1{--buttonSize: 3.5rem ;--buttonFontSize: 1.125rem ;--buttonFocusWidth: 4px;--buttonPadding: 0 var(--spaceL);--buttonTextColor: rgb(var(--rgbBackground));--buttonTextOpacity: 1;--buttonLoaderDelay: 0s;height:var(--buttonSize);padding:var(--buttonPadding);cursor:pointer;transition-property:opacity,color,background;transition-duration:var(--durationS);transition-timing-function:var(--bezierFastoutSlowin);display:inline-flex;align-items:center;color:var(--buttonTextColor);position:relative;isolation:isolate}._button_1yrod_1:active{transition-duration:calc(var(--durationXS) / 2)}._button_1yrod_1:after{content:"";transition-property:opacity,color,background;transition-duration:var(--durationM);transition-timing-function:var(--bezierFastoutSlowin);background:rgb(var(--rgbPrimary));position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;clip-path:polygon(0 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%)}@media(prefers-reduced-motion:no-preference){._button_1yrod_1{transition-property:transform,opacity,color,background}._button_1yrod_1:hover{transform:scale(1.05)}._button_1yrod_1:active{transform:scale(1)}}._button_1yrod_1[data-secondary=true]{--buttonSpace: 10px;--buttonTextColor: rgb(var(--rgbPrimary));background:none;padding-left:var(--buttonSpace);padding-right:var(--buttonSpace);position:relative;left:calc(var(--buttonSpace) * -1);height:2rem}._button_1yrod_1[data-secondary=true]:after{content:"";height:2rem;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgb(var(--rgbPrimary) / .2);transform:scale3d(0,1,1);transform-origin:right;clip-path:none}._button_1yrod_1[data-secondary=true]:hover{transform:none;background:transparent}._button_1yrod_1[data-secondary=true]:hover:after{transform:scaleZ(1);transform-origin:left}._button_1yrod_1[data-secondary=true][data-icon=chevronRight]{padding-left:calc(var(--buttonSpace) / 2)}@media(prefers-reduced-motion:no-preference){._button_1yrod_1[data-secondary=true]:after{transition:transform var(--durationM) var(--bezierFastoutSlowin)}}._button_1yrod_1[data-loading=true]{--buttonTextOpacity: 0}._button_1yrod_1[data-icon-only=true]{--buttonPadding: 0;--buttonTextColor: var(--colorTextBody);width:var(--buttonSize);align-items:center;justify-content:center;padding:0}._button_1yrod_1[data-icon-only=true]:hover{color:var(--colorTextTitle)}._button_1yrod_1[data-icon-only=true]:after{background:rgb(var(--rgbText) / 0)}._button_1yrod_1[disabled]{pointer-events:none;opacity:.4}._text_1yrod_128{font-size:var(--buttonFontSize);font-weight:var(--fontWeightMedium);opacity:var(--buttonTextOpacity);position:relative;line-height:1;flex:1 1 auto;display:flex;align-items:center;justify-content:center;transition:opacity var(--durationM) var(--bezierFastoutSlowin)}._loader_1yrod_141{position:absolute;left:50%;transform:translate(-50%);color:rgb(var(--rgbBackground));opacity:0;transition:opacity var(--durationM) ease var(--buttonLoaderDelay)}._loader_1yrod_141[data-visible=true]{opacity:1}._icon_1yrod_154{transition-property:opacity,fill;transition-duration:var(--durationS);transition-timing-function:var(--bezierFastoutSlowin)}@media(prefers-reduced-motion:no-preference){._icon_1yrod_154{transition-property:transform,opacity,fill}}._icon_1yrod_154[data-start=true]{margin-right:var(--spaceS)}._icon_1yrod_154[data-end=true]{margin-left:var(--spaceS)}@media(prefers-reduced-motion:no-preference){._button_1yrod_1:hover ._icon_1yrod_154[data-shift=true]{transform:translate3d(var(--spaceXS),0,0)}}._button_1yrod_1[data-loading=true] ._icon_1yrod_154{opacity:0}._breadcrumbs_1k287_3{position:relative;z-index:1;width:100%;margin-bottom:var(--spaceL)}@media(max-width:696px){._breadcrumbs_1k287_3{margin-bottom:var(--spaceM)}}._list_1k287_16{display:flex;align-items:center;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:var(--spaceXS)}._item_1k287_26{display:flex;align-items:center;gap:var(--spaceXS);font-size:var(--fontSizeBodyS)}._link_1k287_33{color:rgb(var(--rgbText) / .6);text-decoration:none;transition:color var(--durationS) var(--bezierFastoutSlowin);white-space:nowrap}._link_1k287_33:hover{color:rgb(var(--rgbPrimary))}._separator_1k287_44{color:rgb(var(--rgbText) / .4);width:.875rem;height:.875rem;flex-shrink:0}._current_1k287_51{color:rgb(var(--rgbText));white-space:nowrap}._text_11knq_1:after{content:"_";visibility:hidden}._glyph_11knq_8{opacity:.8;font-weight:var(--fontWeightRegular);font-family:var(--devanagariFontStack);line-height:0}._value_11knq_15{opacity:1}._image_y6je9_1{position:relative;transform:translateZ(0);display:grid;grid-template-columns:100%;isolation:isolate}._image_y6je9_1[data-raised=true]{box-shadow:0 50px 100px -20px rgb(var(--rgbBlack) / .25),0 30px 60px -30px rgb(var(--rgbBlack) / .3)}._image_y6je9_1[data-reveal=true]{--revealDuration: 1.8s;transition:box-shadow var(--durationL) ease calc(var(--revealDuration) / 2)}._image_y6je9_1[data-reveal=true]:not([data-visible=true]){box-shadow:none}._image_y6je9_1[data-reveal=true]:before{content:"";background-color:rgb(var(--rgbAccent));position:absolute;top:0;right:0;bottom:0;left:0;transform:scale3d(0,1,1);transform-origin:left;will-change:transform;z-index:var(--zIndex2)}@media(prefers-reduced-motion:no-preference){._image_y6je9_1[data-reveal=true][data-visible=true]:before{animation:reveal var(--revealDuration) var(--bezierFastoutSlowin) var(--delay)}}._container_y6je9_42{position:relative;transform:none;display:grid;grid-template-columns:100%}._elementWrapper_y6je9_49{opacity:0;transition:none;transform:none;position:relative;display:grid;grid-template-columns:100%}._elementWrapper_y6je9_49[data-reveal=true]{opacity:0;transition:opacity var(--durationM) ease var(--delay)}@media(prefers-reduced-motion:reduce){._elementWrapper_y6je9_49[data-reveal=true]{transition-delay:calc(var(--delay) - 1s)}}._elementWrapper_y6je9_49[data-visible=true]{opacity:1}._placeholder_y6je9_71{width:100%;height:auto;transition:opacity var(--durationM) ease var(--delay);pointer-events:none;position:relative;z-index:var(--zIndex1);opacity:1;grid-column:1;grid-row:1}._placeholder_y6je9_71[data-loaded=true]{opacity:0}._element_y6je9_49{width:100%;height:auto;opacity:0;grid-column:1;grid-row:1;image-rendering:-webkit-optimize-contrast}._element_y6je9_49[data-loaded=true]{opacity:1}._button_y6je9_101{opacity:0;position:absolute;top:var(--spaceM);left:var(--spaceM);height:32px;color:rgb(var(--rgbWhite));padding:0 8px 0 2px}._button_y6je9_101:after{background-color:rgb(var(--rgbBlack) / .8)}._elementWrapper_y6je9_49:hover ._button_y6je9_101,._button_y6je9_101:focus{opacity:1}._wordmark_w8y5a_1{fill:var(--colorTextTitle);transition:fill var(--durationL) ease}._highlight_w8y5a_6{fill:rgb(var(--rgbAccent));opacity:0;transform:scale3d(1,0,1);transform-origin:top;transition:opacity .1s ease var(--durationM)}@media(prefers-reduced-motion:no-preference){._highlight_w8y5a_6{transition:transform var(--durationM) var(--bezierFastoutSlowin),opacity .1s ease var(--durationM)}}:is(a:focus,a:hover,._wordmark_w8y5a_1:hover) ._highlight_w8y5a_6{opacity:1;transform:scaleZ(1);transform-origin:bottom;transition:opacity .1s ease}@media(prefers-reduced-motion:no-preference){:is(a:focus,a:hover,._wordmark_w8y5a_1:hover) ._highlight_w8y5a_6{transition:transform var(--durationM) var(--bezierFastoutSlowin),opacity .1s ease}}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Mesh as d, TextureLoader as f, Cache as m } from "three";
|
|
3
|
+
import { DRACOLoader as L, GLTFLoader as p } from "three-stdlib";
|
|
4
|
+
m.enabled = !0;
|
|
5
|
+
const i = /* @__PURE__ */ new Map();
|
|
6
|
+
function y(r = "/draco/") {
|
|
7
|
+
let e = i.get(r);
|
|
8
|
+
if (!e) {
|
|
9
|
+
const o = new L();
|
|
10
|
+
o.setDecoderPath(r), e = new p(), e.setDRACOLoader(o), i.set(r, e);
|
|
11
|
+
}
|
|
12
|
+
return e;
|
|
13
|
+
}
|
|
14
|
+
const v = new f(), w = (r) => {
|
|
15
|
+
r == null || r.traverse((e) => {
|
|
16
|
+
if (e instanceof d)
|
|
17
|
+
if (e.geometry.dispose(), Array.isArray(e.material))
|
|
18
|
+
for (const o of e.material)
|
|
19
|
+
c(o);
|
|
20
|
+
else
|
|
21
|
+
c(e.material);
|
|
22
|
+
});
|
|
23
|
+
}, c = (r) => {
|
|
24
|
+
var o, t, s;
|
|
25
|
+
r.dispose();
|
|
26
|
+
const e = r;
|
|
27
|
+
for (const l of Object.keys(e)) {
|
|
28
|
+
const a = e[l];
|
|
29
|
+
if (a && typeof a == "object" && "minFilter" in a) {
|
|
30
|
+
const n = a;
|
|
31
|
+
n.dispose(), (s = (t = (o = n.source) == null ? void 0 : o.data) == null ? void 0 : t.close) == null || s.call(t);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}, x = (r) => {
|
|
35
|
+
r.dispose();
|
|
36
|
+
}, A = (r) => {
|
|
37
|
+
var e;
|
|
38
|
+
for (const o of r)
|
|
39
|
+
(e = o.parent) == null || e.remove(o);
|
|
40
|
+
};
|
|
41
|
+
export {
|
|
42
|
+
x as a,
|
|
43
|
+
w as c,
|
|
44
|
+
y as g,
|
|
45
|
+
A as r,
|
|
46
|
+
v as t
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=three-CWsiEOQZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-CWsiEOQZ.js","sources":["../src/utils/three.ts"],"sourcesContent":["import {\n Cache,\n TextureLoader,\n Mesh,\n Material,\n Object3D,\n Light,\n WebGLRenderer,\n Scene,\n} from 'three';\nimport { DRACOLoader, GLTFLoader } from 'three-stdlib';\n\n// Enable caching for all loaders\nCache.enabled = true;\n\nconst gltfLoaders = new Map<string, GLTFLoader>();\n\n/**\n * GLTF model loader configured with the draco decoder. Constructed lazily on\n * first use rather than at module scope, so importing this module has no\n * side effect. Cached per decoder path.\n */\nexport function getModelLoader(decoderPath = '/draco/'): GLTFLoader {\n let gltfLoader = gltfLoaders.get(decoderPath);\n\n if (!gltfLoader) {\n const dracoLoader = new DRACOLoader();\n dracoLoader.setDecoderPath(decoderPath);\n gltfLoader = new GLTFLoader();\n gltfLoader.setDRACOLoader(dracoLoader);\n gltfLoaders.set(decoderPath, gltfLoader);\n }\n\n return gltfLoader;\n}\n\nexport const textureLoader: TextureLoader = new TextureLoader();\n\n/**\n * Clean up a scene's materials and geometry\n */\nexport const cleanScene = (scene: Scene): void => {\n scene?.traverse(object => {\n if (!(object instanceof Mesh)) return;\n\n object.geometry.dispose();\n\n if (Array.isArray(object.material)) {\n for (const material of object.material) {\n cleanMaterial(material);\n }\n } else {\n cleanMaterial(object.material);\n }\n });\n};\n\n/**\n * Clean up and dispose of a material\n */\nexport const cleanMaterial = (material: Material): void => {\n material.dispose();\n\n const record = material as unknown as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n const value = record[key];\n if (\n value &&\n typeof value === 'object' &&\n 'minFilter' in (value as Record<string, unknown>)\n ) {\n const texture = value as { dispose: () => void; source?: { data?: { close?: () => void } } };\n texture.dispose();\n\n // Close GLTF bitmap textures\n texture.source?.data?.close?.();\n }\n }\n};\n\n/**\n * Clean up and dispose of a renderer\n */\nexport const cleanRenderer = (renderer: WebGLRenderer): void => {\n renderer.dispose();\n};\n\n/**\n * Clean up lights by removing them from their parent\n */\nexport const removeLights = (lights: Light[]): void => {\n for (const light of lights) {\n light.parent?.remove(light);\n }\n};\n\n/**\n * Get child by name\n */\nexport const getChild = (name: string, object: Object3D): Object3D | undefined => {\n let node: Object3D | undefined;\n\n object.traverse(child => {\n if (child.name === name) {\n node = child;\n }\n });\n\n return node;\n};\n"],"names":["Cache","gltfLoaders","getModelLoader","decoderPath","gltfLoader","dracoLoader","DRACOLoader","GLTFLoader","textureLoader","TextureLoader","cleanScene","scene","object","Mesh","material","cleanMaterial","record","key","value","texture","_c","_b","_a","cleanRenderer","renderer","removeLights","lights","light"],"mappings":";;;AAaAA,EAAM,UAAU;AAEhB,MAAMC,wBAAkB,IAAA;AAOjB,SAASC,EAAeC,IAAc,WAAuB;AAClE,MAAIC,IAAaH,EAAY,IAAIE,CAAW;AAE5C,MAAI,CAACC,GAAY;AACf,UAAMC,IAAc,IAAIC,EAAA;AACxB,IAAAD,EAAY,eAAeF,CAAW,GACtCC,IAAa,IAAIG,EAAA,GACjBH,EAAW,eAAeC,CAAW,GACrCJ,EAAY,IAAIE,GAAaC,CAAU;AAAA,EACzC;AAEA,SAAOA;AACT;AAEO,MAAMI,IAA+B,IAAIC,EAAA,GAKnCC,IAAa,CAACC,MAAuB;AAChD,EAAAA,KAAA,QAAAA,EAAO,SAAS,CAAAC,MAAU;AACxB,QAAMA,aAAkBC;AAIxB,UAFAD,EAAO,SAAS,QAAA,GAEZ,MAAM,QAAQA,EAAO,QAAQ;AAC/B,mBAAWE,KAAYF,EAAO;AAC5B,UAAAG,EAAcD,CAAQ;AAAA;AAGxB,QAAAC,EAAcH,EAAO,QAAQ;AAAA,EAEjC;AACF,GAKaG,IAAgB,CAACD,MAA6B;;AACzD,EAAAA,EAAS,QAAA;AAET,QAAME,IAASF;AAEf,aAAWG,KAAO,OAAO,KAAKD,CAAM,GAAG;AACrC,UAAME,IAAQF,EAAOC,CAAG;AACxB,QACEC,KACA,OAAOA,KAAU,YACjB,eAAgBA,GAChB;AACA,YAAMC,IAAUD;AAChB,MAAAC,EAAQ,QAAA,IAGRC,KAAAC,KAAAC,IAAAH,EAAQ,WAAR,gBAAAG,EAAgB,SAAhB,gBAAAD,EAAsB,UAAtB,QAAAD,EAAA,KAAAC;AAAA,IACF;AAAA,EACF;AACF,GAKaE,IAAgB,CAACC,MAAkC;AAC9D,EAAAA,EAAS,QAAA;AACX,GAKaC,IAAe,CAACC,MAA0B;;AACrD,aAAWC,KAASD;AAClB,KAAAJ,IAAAK,EAAM,WAAN,QAAAL,EAAc,OAAOK;AAEzB;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";"use strict";const s=require("three"),c=require("three-stdlib");s.Cache.enabled=!0;const d=new Map;function u(r="/draco/"){let e=d.get(r);if(!e){const t=new c.DRACOLoader;t.setDecoderPath(r),e=new c.GLTFLoader,e.setDRACOLoader(t),d.set(r,e)}return e}const L=new s.TextureLoader,g=r=>{r==null||r.traverse(e=>{if(e instanceof s.Mesh)if(e.geometry.dispose(),Array.isArray(e.material))for(const t of e.material)l(t);else l(e.material)})},l=r=>{var t,o,n;r.dispose();const e=r;for(const f of Object.keys(e)){const a=e[f];if(a&&typeof a=="object"&&"minFilter"in a){const i=a;i.dispose(),(n=(o=(t=i.source)==null?void 0:t.data)==null?void 0:o.close)==null||n.call(o)}}},m=r=>{r.dispose()},p=r=>{var e;for(const t of r)(e=t.parent)==null||e.remove(t)};exports.cleanRenderer=m;exports.cleanScene=g;exports.getModelLoader=u;exports.removeLights=p;exports.textureLoader=L;
|
|
2
|
+
//# sourceMappingURL=three-aeLbW1yA.cjs.map
|