motus-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2420 @@
1
+ "use client";
2
+ import { jsxs as n, jsx as e, Fragment as xe } from "react/jsx-runtime";
3
+ import { ensureReady as Q, defineSound as B } from "@web-kits/audio";
4
+ import { ArrowUpRight as I, RotateCcw as se, Copy as we, Check as F, Download as ye, Compass as ve, Orbit as le, AudioLines as ce, BookOpen as ke, Mail as D, Sparkles as Ne, MousePointer2 as _e, X as de, Clipboard as ue, Home as pe, BriefcaseBusiness as me, UserRound as fe, ArrowRight as he, Code2 as Ce } from "lucide-react";
5
+ import { useState as S, useCallback as Se, useRef as v, useEffect as L, useLayoutEffect as ee, Suspense as R, lazy as $ } from "react";
6
+ import { LottieLight as be } from "lottie-react";
7
+ import { useReducedMotion as ge, motion as z, AnimatePresence as Z } from "motion/react";
8
+ import Pe from "react-use-measure";
9
+ import { gsap as w } from "gsap";
10
+ const Me = B({
11
+ source: { type: "square", frequency: 155 },
12
+ envelope: { attack: 2e-3, decay: 0.055, sustain: 0 },
13
+ gain: 0.08
14
+ }), Te = B({
15
+ source: { type: "triangle", frequency: 310 },
16
+ envelope: { attack: 2e-3, decay: 0.045, sustain: 0 },
17
+ gain: 0.06
18
+ });
19
+ function ze({ onAction: o, disabled: b = !1 }) {
20
+ const [u, g] = S(!1), d = Se(async (s) => {
21
+ await Q(), s();
22
+ }, []), i = () => {
23
+ b || (g(!0), d(Me));
24
+ }, r = () => {
25
+ !u || b || (g(!1), d(Te));
26
+ };
27
+ return /* @__PURE__ */ n("span", { className: "relative inline-flex h-14 w-[190px]", children: [
28
+ /* @__PURE__ */ e(
29
+ "span",
30
+ {
31
+ "aria-hidden": "true",
32
+ className: "absolute inset-0 translate-x-[6px] translate-y-[6px] rounded-[12px] bg-[#c7c7cc]"
33
+ }
34
+ ),
35
+ /* @__PURE__ */ n(
36
+ "button",
37
+ {
38
+ type: "button",
39
+ onPointerDown: i,
40
+ onPointerUp: r,
41
+ onPointerCancel: r,
42
+ onPointerLeave: r,
43
+ onKeyDown: (s) => {
44
+ (s.key === "Enter" || s.key === " ") && !s.repeat && i();
45
+ },
46
+ onKeyUp: (s) => {
47
+ (s.key === "Enter" || s.key === " ") && r();
48
+ },
49
+ onClick: () => void (o == null ? void 0 : o()),
50
+ disabled: b,
51
+ className: `relative flex h-14 w-[190px] touch-none items-center justify-between rounded-[12px] border border-white/80 bg-[#101011] px-5 text-sm font-semibold text-white transition-transform duration-75 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#0a84ff] focus-visible:ring-offset-4 disabled:cursor-not-allowed disabled:opacity-50 ${u ? "translate-x-[6px] translate-y-[6px]" : ""}`,
52
+ style: { color: "#ffffff" },
53
+ children: [
54
+ /* @__PURE__ */ e("span", { children: "Open project" }),
55
+ /* @__PURE__ */ e(I, { size: 16, "aria-hidden": "true" })
56
+ ]
57
+ }
58
+ )
59
+ ] });
60
+ }
61
+ const je = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
62
+ __proto__: null,
63
+ default: ze
64
+ }, Symbol.toStringTag, { value: "Module" })), Oe = { x: [0.2], y: [1] }, Re = { x: [0.8], y: [0] }, E = (o, b, u) => ({ t: o, s: b, e: u, i: Oe, o: Re }), re = (o, b, u, g) => ({
65
+ ddd: 0,
66
+ ind: o,
67
+ ty: 4,
68
+ nm: `Copy sheet ${o}`,
69
+ sr: 1,
70
+ ks: {
71
+ o: { a: 1, k: [E(0, [g], [g]), E(18, [g], [18]), { t: 32, s: [18] }] },
72
+ r: { a: 0, k: 0 },
73
+ p: { a: 1, k: [E(0, [b[0], b[1], 0], [u[0], u[1], 0]), { t: 32, s: [u[0], u[1], 0] }] },
74
+ a: { a: 0, k: [0, 0, 0] },
75
+ s: { a: 0, k: [100, 100, 100] }
76
+ },
77
+ ao: 0,
78
+ shapes: [
79
+ { ty: "rc", d: 1, s: { a: 0, k: [20, 23] }, p: { a: 0, k: [0, 0] }, r: { a: 0, k: 4 }, nm: "Sheet" },
80
+ {
81
+ ty: "st",
82
+ c: { a: 0, k: [1, 1, 1, 1] },
83
+ o: { a: 0, k: 100 },
84
+ w: { a: 0, k: 2.2 },
85
+ lc: 2,
86
+ lj: 2,
87
+ ml: 4,
88
+ nm: "White stroke"
89
+ },
90
+ {
91
+ ty: "tr",
92
+ p: { a: 0, k: [0, 0] },
93
+ a: { a: 0, k: [0, 0] },
94
+ s: { a: 0, k: [100, 100] },
95
+ r: { a: 0, k: 0 },
96
+ o: { a: 0, k: 100 },
97
+ sk: { a: 0, k: 0 },
98
+ sa: { a: 0, k: 0 },
99
+ nm: "Transform"
100
+ }
101
+ ],
102
+ ip: 0,
103
+ op: 54,
104
+ st: 0,
105
+ bm: 0
106
+ }), ae = (o, b, u, g, d) => ({
107
+ ddd: 0,
108
+ ind: o,
109
+ ty: 4,
110
+ nm: `Copied stroke ${o}`,
111
+ sr: 1,
112
+ ks: {
113
+ o: { a: 1, k: [E(d, [0], [100]), { t: 54, s: [100] }] },
114
+ r: { a: 0, k: g },
115
+ p: { a: 0, k: [u[0], u[1], 0] },
116
+ a: { a: 0, k: [0, 0, 0] },
117
+ s: {
118
+ a: 1,
119
+ k: [
120
+ E(d, [0, 100, 100], [112, 100, 100]),
121
+ E(d + 10, [112, 100, 100], [100, 100, 100]),
122
+ { t: 54, s: [100, 100, 100] }
123
+ ]
124
+ }
125
+ },
126
+ ao: 0,
127
+ shapes: [
128
+ { ty: "rc", d: 1, s: { a: 0, k: [b, 5] }, p: { a: 0, k: [0, 0] }, r: { a: 0, k: 2.5 }, nm: "Stroke" },
129
+ { ty: "fl", c: { a: 0, k: [1, 1, 1, 1] }, o: { a: 0, k: 100 }, r: 1, nm: "White fill" },
130
+ {
131
+ ty: "tr",
132
+ p: { a: 0, k: [0, 0] },
133
+ a: { a: 0, k: [0, 0] },
134
+ s: { a: 0, k: [100, 100] },
135
+ r: { a: 0, k: 0 },
136
+ o: { a: 0, k: 100 },
137
+ sk: { a: 0, k: 0 },
138
+ sa: { a: 0, k: 0 },
139
+ nm: "Transform"
140
+ }
141
+ ],
142
+ ip: 0,
143
+ op: 54,
144
+ st: 0,
145
+ bm: 0
146
+ }), $e = {
147
+ v: "5.12.2",
148
+ fr: 60,
149
+ ip: 0,
150
+ op: 54,
151
+ w: 48,
152
+ h: 48,
153
+ nm: "Copy sheets resolve into confirmation",
154
+ ddd: 0,
155
+ assets: [],
156
+ layers: [
157
+ re(1, [18, 18], [24, 24], 52),
158
+ re(2, [30, 30], [24, 24], 100),
159
+ ae(3, 11, [19, 27], 42, 21),
160
+ ae(4, 21, [30, 22], -43, 27)
161
+ ]
162
+ };
163
+ function Ae({
164
+ value: o = "https://example.com/work",
165
+ onCopy: b,
166
+ disabled: u = !1
167
+ }) {
168
+ const g = v(null), d = v(!0), [i, r] = S("idle"), s = ge(), t = async () => {
169
+ if (!(u || i === "copying" || i === "copied")) {
170
+ r("copying");
171
+ try {
172
+ if (b) await b(o);
173
+ else if (navigator.clipboard) await navigator.clipboard.writeText(o);
174
+ else throw new Error("Clipboard is unavailable");
175
+ if (!d.current) return;
176
+ r("copied"), g.current = window.setTimeout(() => r("idle"), 1700);
177
+ } catch {
178
+ if (!d.current) return;
179
+ r("error");
180
+ }
181
+ }
182
+ };
183
+ L(() => (d.current = !0, () => {
184
+ d.current = !1, g.current && window.clearTimeout(g.current);
185
+ }), []);
186
+ const p = i === "copying", f = i === "copied", c = i === "error";
187
+ return /* @__PURE__ */ n(
188
+ z.button,
189
+ {
190
+ type: "button",
191
+ onClick: () => void t(),
192
+ disabled: u || p || f,
193
+ "aria-busy": p,
194
+ initial: !1,
195
+ animate: {
196
+ backgroundColor: f ? "#eaf7ee" : c ? "#fff0ef" : "#f5f5f7",
197
+ color: f ? "#175f35" : c ? "#9c2f28" : "#1d1d1f"
198
+ },
199
+ whileHover: i === "idle" || c ? { scale: 1.012 } : void 0,
200
+ whileTap: i === "idle" || c ? { scale: 0.982 } : void 0,
201
+ transition: s ? { duration: 0 } : { duration: 0.22, ease: [0.16, 1, 0.3, 1] },
202
+ className: `flex h-14 w-[202px] items-center justify-between rounded-[16px] p-1.5 pl-5 text-[13px] font-semibold tracking-[-0.01em] shadow-[0_18px_42px_rgba(15,23,42,0.14),inset_0_1px_0_rgba(255,255,255,0.9)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#0a84ff] focus-visible:ring-offset-4 disabled:opacity-75 ${p ? "cursor-wait" : u ? "cursor-not-allowed" : f ? "cursor-default" : "cursor-pointer"}`,
203
+ children: [
204
+ /* @__PURE__ */ e(Z, { initial: !1, mode: "popLayout", children: /* @__PURE__ */ e(
205
+ z.span,
206
+ {
207
+ initial: { opacity: 0, y: 6, filter: "blur(4px)" },
208
+ animate: { opacity: 1, y: 0, filter: "blur(0px)" },
209
+ exit: { opacity: 0, y: -6, filter: "blur(4px)" },
210
+ transition: { duration: s ? 0 : 0.18, ease: [0.16, 1, 0.3, 1] },
211
+ className: "whitespace-nowrap",
212
+ children: p ? "Copying" : f ? "Copied" : c ? "Try again" : "Copy link"
213
+ },
214
+ i
215
+ ) }),
216
+ /* @__PURE__ */ e(
217
+ z.span,
218
+ {
219
+ "aria-hidden": "true",
220
+ animate: { backgroundColor: f ? "#176b3a" : c ? "#a72f27" : "#111114" },
221
+ className: "flex size-11 shrink-0 items-center justify-center overflow-hidden rounded-[12px] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.18)]",
222
+ children: f ? /* @__PURE__ */ e("span", { className: "size-8", children: /* @__PURE__ */ e(be, { src: $e, autoplay: !s, loop: !1 }) }) : c ? /* @__PURE__ */ e(se, { size: 16 }) : /* @__PURE__ */ e(we, { size: 16, strokeWidth: 1.9 })
223
+ }
224
+ ),
225
+ /* @__PURE__ */ e("span", { className: "sr-only", "aria-live": "polite", children: p ? "Copying link." : f ? "Link copied." : c ? "Copy failed. Try again." : "" })
226
+ ]
227
+ }
228
+ );
229
+ }
230
+ const Ie = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
231
+ __proto__: null,
232
+ default: Ae
233
+ }, Symbol.toStringTag, { value: "Module" })), Le = { x: [0.2], y: [1] }, Ee = { x: [0.8], y: [0] }, O = (o, b, u) => ({ t: o, s: b, e: u, i: Le, o: Ee }), Be = 740, Xe = {
234
+ v: "5.12.2",
235
+ fr: 90,
236
+ ip: 0,
237
+ op: 66,
238
+ w: 52,
239
+ h: 52,
240
+ nm: "Document enters download tray",
241
+ ddd: 0,
242
+ assets: [],
243
+ layers: [
244
+ {
245
+ ddd: 0,
246
+ ind: 1,
247
+ ty: 4,
248
+ nm: "Document",
249
+ sr: 1,
250
+ ks: {
251
+ o: { a: 1, k: [O(0, [100], [100]), O(45, [100], [20]), { t: 66, s: [20] }] },
252
+ r: { a: 1, k: [O(0, [-4], [2]), O(26, [2], [0]), { t: 66, s: [0] }] },
253
+ p: {
254
+ a: 1,
255
+ k: [O(0, [26, 15, 0], [26, 30, 0]), O(38, [26, 30, 0], [26, 34, 0]), { t: 66, s: [26, 34, 0] }]
256
+ },
257
+ a: { a: 0, k: [0, 0, 0] },
258
+ s: { a: 1, k: [O(0, [100, 100, 100], [94, 94, 100]), { t: 66, s: [94, 94, 100] }] }
259
+ },
260
+ ao: 0,
261
+ shapes: [
262
+ { ty: "rc", d: 1, s: { a: 0, k: [20, 25] }, p: { a: 0, k: [0, 0] }, r: { a: 0, k: 3 }, nm: "Page" },
263
+ { ty: "fl", c: { a: 0, k: [1, 1, 1, 1] }, o: { a: 0, k: 100 }, r: 1, nm: "Page fill" },
264
+ {
265
+ ty: "tr",
266
+ p: { a: 0, k: [0, 0] },
267
+ a: { a: 0, k: [0, 0] },
268
+ s: { a: 0, k: [100, 100] },
269
+ r: { a: 0, k: 0 },
270
+ o: { a: 0, k: 100 },
271
+ sk: { a: 0, k: 0 },
272
+ sa: { a: 0, k: 0 },
273
+ nm: "Transform"
274
+ }
275
+ ],
276
+ ip: 0,
277
+ op: 66,
278
+ st: 0,
279
+ bm: 0
280
+ },
281
+ {
282
+ ddd: 0,
283
+ ind: 2,
284
+ ty: 4,
285
+ nm: "Tray",
286
+ sr: 1,
287
+ ks: {
288
+ o: { a: 0, k: 100 },
289
+ r: { a: 0, k: 0 },
290
+ p: { a: 0, k: [26, 36, 0] },
291
+ a: { a: 0, k: [0, 0, 0] },
292
+ s: {
293
+ a: 1,
294
+ k: [
295
+ O(18, [88, 100, 100], [105, 100, 100]),
296
+ O(33, [105, 100, 100], [100, 100, 100]),
297
+ { t: 66, s: [100, 100, 100] }
298
+ ]
299
+ }
300
+ },
301
+ ao: 0,
302
+ shapes: [
303
+ { ty: "rc", d: 1, s: { a: 0, k: [28, 4] }, p: { a: 0, k: [0, 0] }, r: { a: 0, k: 2 }, nm: "Slot" },
304
+ { ty: "fl", c: { a: 0, k: [0.64, 0.98, 0.72, 1] }, o: { a: 0, k: 100 }, r: 1, nm: "Slot fill" },
305
+ {
306
+ ty: "tr",
307
+ p: { a: 0, k: [0, 0] },
308
+ a: { a: 0, k: [0, 0] },
309
+ s: { a: 0, k: [100, 100] },
310
+ r: { a: 0, k: 0 },
311
+ o: { a: 0, k: 100 },
312
+ sk: { a: 0, k: 0 },
313
+ sa: { a: 0, k: 0 },
314
+ nm: "Transform"
315
+ }
316
+ ],
317
+ ip: 0,
318
+ op: 66,
319
+ st: 0,
320
+ bm: 0
321
+ }
322
+ ]
323
+ };
324
+ function De({
325
+ href: o = "/resume.pdf",
326
+ filename: b = "resume.pdf",
327
+ fileLabel: u = "PDF · résumé",
328
+ onDownload: g,
329
+ disabled: d = !1
330
+ }) {
331
+ const [i, r] = S("idle"), s = v(null), t = v(!0), p = ge();
332
+ L(() => (t.current = !0, () => {
333
+ t.current = !1, s.current && window.clearTimeout(s.current);
334
+ }), []);
335
+ const f = async () => {
336
+ if (!(d || i === "preparing" || i === "started")) {
337
+ r("preparing");
338
+ try {
339
+ if (p || await new Promise((h) => window.setTimeout(h, Be)), !t.current) return;
340
+ if (g) await g();
341
+ else {
342
+ const h = document.createElement("a");
343
+ h.href = o, h.download = b, h.rel = "noopener", document.body.appendChild(h), h.click(), h.remove();
344
+ }
345
+ if (!t.current) return;
346
+ r("started"), s.current = window.setTimeout(() => r("idle"), 1800);
347
+ } catch {
348
+ t.current && r("error");
349
+ }
350
+ }
351
+ }, c = i === "preparing", l = i === "started", x = i === "error";
352
+ return /* @__PURE__ */ n(
353
+ z.button,
354
+ {
355
+ type: "button",
356
+ onClick: () => void f(),
357
+ disabled: d || c || l,
358
+ "aria-busy": c,
359
+ initial: !1,
360
+ animate: {
361
+ backgroundColor: l ? "#113523" : x ? "#431f1d" : "#111114",
362
+ color: l ? "#e1f7e8" : x ? "#ffe8e6" : "#ffffff"
363
+ },
364
+ whileHover: !d && !c && !l ? { y: -1, scale: 1.008 } : void 0,
365
+ whileTap: !d && !c && !l ? { y: 1, scale: 0.985 } : void 0,
366
+ transition: p ? { duration: 0 } : { duration: 0.24, ease: [0.16, 1, 0.3, 1] },
367
+ className: `flex h-16 w-[244px] items-center gap-3 rounded-[16px] p-1.5 pr-4 text-left shadow-[0_20px_46px_rgba(15,23,42,0.24),inset_0_1px_0_rgba(255,255,255,0.16)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#0a84ff] focus-visible:ring-offset-4 ${d ? "cursor-not-allowed opacity-60" : c ? "cursor-wait" : l ? "cursor-default" : "cursor-pointer"}`,
368
+ children: [
369
+ /* @__PURE__ */ e(
370
+ z.span,
371
+ {
372
+ "aria-hidden": "true",
373
+ animate: { backgroundColor: l ? "#235c3d" : x ? "#6d2b27" : "#28282c" },
374
+ className: "relative flex h-[52px] w-[52px] shrink-0 items-center justify-center overflow-hidden rounded-[12px] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.12)]",
375
+ children: c ? /* @__PURE__ */ e("span", { className: "size-10", children: /* @__PURE__ */ e(be, { src: Xe, autoplay: !p, loop: !1 }) }) : l ? /* @__PURE__ */ e(F, { size: 18, strokeWidth: 2.2 }) : x ? /* @__PURE__ */ e(se, { size: 17 }) : /* @__PURE__ */ n(z.span, { whileHover: p ? void 0 : { y: -2 }, className: "relative block h-8 w-9", children: [
376
+ /* @__PURE__ */ n("span", { className: "absolute left-[9px] top-0 h-[25px] w-[20px] rounded-[3px] bg-white shadow-[0_3px_8px_rgba(0,0,0,.22)]", children: [
377
+ /* @__PURE__ */ e("i", { className: "absolute left-1.5 right-1.5 top-2 h-px bg-black/25" }),
378
+ /* @__PURE__ */ e("i", { className: "absolute left-1.5 right-2 top-3 h-px bg-black/20" })
379
+ ] }),
380
+ /* @__PURE__ */ e("span", { className: "absolute bottom-[2px] left-1 h-[5px] w-7 rounded-full bg-[#8ee0a9] shadow-[0_0_0_3px_rgba(142,224,169,.08)]" })
381
+ ] })
382
+ }
383
+ ),
384
+ /* @__PURE__ */ n("span", { className: "min-w-0 flex-1", children: [
385
+ /* @__PURE__ */ e(Z, { initial: !1, mode: "popLayout", children: /* @__PURE__ */ e(
386
+ z.strong,
387
+ {
388
+ initial: { opacity: 0, y: 6, filter: "blur(4px)" },
389
+ animate: { opacity: 1, y: 0, filter: "blur(0px)" },
390
+ exit: { opacity: 0, y: -6, filter: "blur(4px)" },
391
+ transition: { duration: p ? 0 : 0.18, ease: [0.16, 1, 0.3, 1] },
392
+ className: "block whitespace-nowrap text-[13px] font-semibold tracking-[-0.01em]",
393
+ children: c ? "Downloading" : l ? "Downloaded" : x ? "Try again" : "Download résumé"
394
+ },
395
+ i
396
+ ) }),
397
+ /* @__PURE__ */ e(
398
+ "span",
399
+ {
400
+ className: `mt-1.5 block text-[10px] font-medium ${l ? "text-[#b9dfc6]" : x ? "text-[#ffd0cc]" : "text-white/60"}`,
401
+ children: u
402
+ }
403
+ )
404
+ ] }),
405
+ /* @__PURE__ */ e(
406
+ ye,
407
+ {
408
+ "aria-hidden": "true",
409
+ size: 15,
410
+ className: `${c || l ? "opacity-0" : "opacity-55"} transition-opacity`
411
+ }
412
+ ),
413
+ /* @__PURE__ */ e("span", { className: "sr-only", "aria-live": "polite", children: c ? "Downloading résumé." : l ? "Résumé downloaded." : x ? "Download failed. Try again." : "" })
414
+ ]
415
+ }
416
+ );
417
+ }
418
+ const qe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
419
+ __proto__: null,
420
+ default: De
421
+ }, Symbol.toStringTag, { value: "Module" })), Ye = B({
422
+ source: { type: "sine", frequency: 440 },
423
+ envelope: { decay: 0.1 },
424
+ gain: 0.15
425
+ }), We = B({
426
+ source: { type: "sine", frequency: 880 },
427
+ envelope: { decay: 0.08 },
428
+ gain: 0.15
429
+ }), Fe = B({
430
+ source: { type: "sine", frequency: 400 },
431
+ envelope: { decay: 0.08 },
432
+ gain: 0.08
433
+ }), Ze = B({
434
+ source: { type: "sine", frequency: 600 },
435
+ envelope: { decay: 0.08 },
436
+ gain: 0.08
437
+ }), G = () => /* @__PURE__ */ e(I, { className: "size-3.5", "aria-hidden": "true" });
438
+ function Ge() {
439
+ return /* @__PURE__ */ n("div", { className: "px-2 pb-2 pt-1 text-zinc-950", children: [
440
+ /* @__PURE__ */ n("div", { className: "flex items-end justify-between border-b border-zinc-200 px-1 pb-3", children: [
441
+ /* @__PURE__ */ e("p", { className: "text-lg font-semibold tracking-[-0.03em]", children: "Projects" }),
442
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium tabular-nums text-zinc-400", children: "4 projects" })
443
+ ] }),
444
+ /* @__PURE__ */ n("button", { className: "group flex w-full items-center gap-3 border-b border-zinc-100 px-1 py-3 text-left", children: [
445
+ /* @__PURE__ */ n("span", { className: "relative grid size-10 shrink-0 place-items-center overflow-hidden rounded-xl bg-[#e9e5ff] text-[#5a45d6]", children: [
446
+ /* @__PURE__ */ e(le, { className: "size-4 transition-transform duration-500 group-hover:rotate-45" }),
447
+ /* @__PURE__ */ e("span", { className: "absolute -bottom-2 -right-2 size-5 rounded-full bg-[#ffb38a]/70 blur-sm" })
448
+ ] }),
449
+ /* @__PURE__ */ n("span", { className: "min-w-0 flex-1", children: [
450
+ /* @__PURE__ */ e("strong", { className: "block text-sm font-semibold", children: "All projects" }),
451
+ /* @__PURE__ */ e("span", { className: "block text-xs text-zinc-500", children: "View case studies" })
452
+ ] }),
453
+ /* @__PURE__ */ e(G, {})
454
+ ] }),
455
+ /* @__PURE__ */ n("button", { className: "group flex w-full items-center gap-3 px-1 py-3 text-left", children: [
456
+ /* @__PURE__ */ e("span", { className: "grid size-10 shrink-0 place-items-center rounded-xl bg-[#dff6ed] text-[#08795c]", children: /* @__PURE__ */ e(Ne, { className: "size-4 transition-transform duration-500 group-hover:scale-125" }) }),
457
+ /* @__PURE__ */ n("span", { className: "min-w-0 flex-1", children: [
458
+ /* @__PURE__ */ e("strong", { className: "block text-sm font-semibold", children: "Experiments" }),
459
+ /* @__PURE__ */ e("span", { className: "block text-xs text-zinc-500", children: "Motion and UI tests" })
460
+ ] }),
461
+ /* @__PURE__ */ e(G, {})
462
+ ] })
463
+ ] });
464
+ }
465
+ function He() {
466
+ return /* @__PURE__ */ n("div", { className: "p-3 text-zinc-950", children: [
467
+ /* @__PURE__ */ n("div", { className: "overflow-hidden rounded-2xl bg-[#141417] p-4 text-white", children: [
468
+ /* @__PURE__ */ n("div", { className: "flex items-center justify-between", children: [
469
+ /* @__PURE__ */ n("span", { className: "flex items-center gap-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-white/55", children: [
470
+ /* @__PURE__ */ n("span", { className: "relative flex size-2", children: [
471
+ /* @__PURE__ */ e("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-[#a8ff78] opacity-60" }),
472
+ /* @__PURE__ */ e("span", { className: "relative inline-flex size-2 rounded-full bg-[#a8ff78]" })
473
+ ] }),
474
+ "In progress"
475
+ ] }),
476
+ /* @__PURE__ */ e("span", { className: "text-[10px] text-white/35", children: "WIP · 72%" })
477
+ ] }),
478
+ /* @__PURE__ */ e("p", { className: "mt-5 text-xl font-semibold tracking-[-0.04em]", children: "Northstar" }),
479
+ /* @__PURE__ */ e("p", { className: "mt-1 text-xs leading-5 text-white/55", children: "Portfolio case study." }),
480
+ /* @__PURE__ */ e("div", { className: "mt-4 flex h-1.5 overflow-hidden rounded-full bg-white/10", children: /* @__PURE__ */ e(
481
+ z.span,
482
+ {
483
+ className: "block rounded-full bg-[#a8ff78]",
484
+ initial: { width: "18%" },
485
+ animate: { width: "72%" },
486
+ transition: { duration: 0.8, ease: [0.16, 1, 0.3, 1] }
487
+ }
488
+ ) })
489
+ ] }),
490
+ /* @__PURE__ */ n("div", { className: "flex items-center justify-between px-1 pt-3 text-xs", children: [
491
+ /* @__PURE__ */ e("span", { className: "text-zinc-500", children: "Next: motion" }),
492
+ /* @__PURE__ */ n("button", { className: "flex items-center gap-1 font-semibold text-zinc-950", children: [
493
+ "View project ",
494
+ /* @__PURE__ */ e(G, {})
495
+ ] })
496
+ ] })
497
+ ] });
498
+ }
499
+ const Ve = [
500
+ { id: "calm", label: "Calm", detail: "Short" },
501
+ { id: "spring", label: "Spring", detail: "Bouncy" },
502
+ { id: "alive", label: "Full", detail: "Expressive" }
503
+ ];
504
+ function Ue() {
505
+ const [o, b] = S("spring"), [u, g] = S(!0);
506
+ return /* @__PURE__ */ n("div", { className: "p-3 text-zinc-950", children: [
507
+ /* @__PURE__ */ n("div", { className: "flex items-center justify-between px-1", children: [
508
+ /* @__PURE__ */ n("div", { children: [
509
+ /* @__PURE__ */ e("p", { className: "text-sm font-semibold", children: "Motion style" }),
510
+ /* @__PURE__ */ e("p", { className: "mt-0.5 text-xs text-zinc-500", children: "Choose how the preview moves." })
511
+ ] }),
512
+ /* @__PURE__ */ e(_e, { className: "size-4 text-zinc-300", "aria-hidden": "true" })
513
+ ] }),
514
+ /* @__PURE__ */ e("div", { className: "relative mt-4 grid grid-cols-3 rounded-2xl bg-zinc-100 p-1", children: Ve.map((d) => {
515
+ const i = o === d.id;
516
+ return /* @__PURE__ */ n(
517
+ "button",
518
+ {
519
+ onClick: () => b(d.id),
520
+ className: "relative z-10 flex h-12 flex-col items-center justify-center rounded-xl",
521
+ children: [
522
+ i && /* @__PURE__ */ e(
523
+ z.span,
524
+ {
525
+ layoutId: "feel-mode",
526
+ className: "absolute inset-0 rounded-xl bg-white shadow-sm",
527
+ transition: { type: "spring", stiffness: 430, damping: 32 }
528
+ }
529
+ ),
530
+ /* @__PURE__ */ e("span", { className: "relative text-xs font-semibold", children: d.label }),
531
+ /* @__PURE__ */ e("span", { className: "relative mt-0.5 text-[9px] text-zinc-400", children: d.detail })
532
+ ]
533
+ },
534
+ d.id
535
+ );
536
+ }) }),
537
+ /* @__PURE__ */ n(
538
+ "button",
539
+ {
540
+ onClick: () => g((d) => !d),
541
+ "aria-pressed": u,
542
+ className: "mt-3 flex w-full items-center justify-between rounded-xl px-1 py-2 text-left",
543
+ children: [
544
+ /* @__PURE__ */ n("span", { className: "flex items-center gap-2 text-xs font-medium", children: [
545
+ /* @__PURE__ */ e(ce, { className: "size-4", "aria-hidden": "true" }),
546
+ "Sound"
547
+ ] }),
548
+ /* @__PURE__ */ e("span", { className: "rounded-full bg-zinc-100 px-2 py-1 text-[10px] font-semibold text-zinc-500", children: u ? "On" : "Off" })
549
+ ]
550
+ }
551
+ )
552
+ ] });
553
+ }
554
+ function Ke() {
555
+ return /* @__PURE__ */ n("div", { className: "p-3 text-zinc-950", children: [
556
+ /* @__PURE__ */ n("button", { className: "group w-full text-left", children: [
557
+ /* @__PURE__ */ n("div", { className: "flex items-start justify-between", children: [
558
+ /* @__PURE__ */ e("span", { className: "text-[10px] font-semibold uppercase tracking-[0.16em] text-[#6d5be8]", children: "Latest note" }),
559
+ /* @__PURE__ */ e("span", { className: "text-[10px] tabular-nums text-zinc-400", children: "6 min" })
560
+ ] }),
561
+ /* @__PURE__ */ e("p", { className: "mt-3 max-w-[15rem] text-xl font-semibold leading-6 tracking-[-0.04em]", children: "Using motion to explain state changes." }),
562
+ /* @__PURE__ */ n("div", { className: "mt-4 flex items-center justify-between border-t border-zinc-200 pt-3", children: [
563
+ /* @__PURE__ */ e("span", { className: "text-xs text-zinc-500", children: "August 18, 2026" }),
564
+ /* @__PURE__ */ e("span", { className: "grid size-7 place-items-center rounded-full bg-zinc-950 text-white transition-transform group-hover:rotate-45", children: /* @__PURE__ */ e(G, {}) })
565
+ ] })
566
+ ] }),
567
+ /* @__PURE__ */ n("div", { className: "mt-2 flex gap-2", children: [
568
+ /* @__PURE__ */ e("button", { className: "flex-1 rounded-xl bg-[#f4f2ff] px-3 py-2 text-left text-xs font-medium text-[#5b49c8]", children: "Process" }),
569
+ /* @__PURE__ */ e("button", { className: "flex-1 rounded-xl bg-[#fff1e9] px-3 py-2 text-left text-xs font-medium text-[#a94f22]", children: "Notes" })
570
+ ] })
571
+ ] });
572
+ }
573
+ function Je() {
574
+ const [o, b] = S(!1), u = "hello@example.com", g = async () => {
575
+ await navigator.clipboard.writeText(u), b(!0), window.setTimeout(() => b(!1), 1600);
576
+ };
577
+ return /* @__PURE__ */ n("div", { className: "p-3 text-zinc-950", children: [
578
+ /* @__PURE__ */ n("div", { className: "relative overflow-hidden rounded-2xl bg-[#e8f8d9] p-4", children: [
579
+ /* @__PURE__ */ e(
580
+ z.span,
581
+ {
582
+ className: "absolute -right-5 -top-7 size-24 rounded-full border border-[#7bbf49]/25",
583
+ animate: { scale: [1, 1.12, 1] },
584
+ transition: { duration: 3.2, repeat: 1 / 0, ease: "easeInOut" }
585
+ }
586
+ ),
587
+ /* @__PURE__ */ n("div", { className: "flex items-center gap-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-[#47752b]", children: [
588
+ /* @__PURE__ */ e("span", { className: "size-2 rounded-full bg-[#61a936]" }),
589
+ "Available for work"
590
+ ] }),
591
+ /* @__PURE__ */ e("p", { className: "mt-5 text-xl font-semibold tracking-[-0.04em]", children: "Let’s work together." }),
592
+ /* @__PURE__ */ e("p", { className: "mt-1 text-xs text-[#47752b]", children: "Tell me about your project." })
593
+ ] }),
594
+ /* @__PURE__ */ n("div", { className: "mt-3 grid grid-cols-2 gap-2", children: [
595
+ /* @__PURE__ */ n(
596
+ "a",
597
+ {
598
+ href: `mailto:${u}`,
599
+ className: "flex items-center justify-center gap-2 rounded-xl bg-zinc-950 px-3 py-2.5 text-xs font-semibold text-white",
600
+ style: { color: "#ffffff" },
601
+ children: [
602
+ /* @__PURE__ */ e(D, { className: "size-3.5", "aria-hidden": "true" }),
603
+ "Email"
604
+ ]
605
+ }
606
+ ),
607
+ /* @__PURE__ */ e(
608
+ "button",
609
+ {
610
+ onClick: g,
611
+ className: "flex items-center justify-center gap-1 rounded-xl bg-zinc-100 px-3 py-2.5 text-xs font-semibold",
612
+ children: o ? "Copied" : "Copy email"
613
+ }
614
+ )
615
+ ] })
616
+ ] });
617
+ }
618
+ const U = [
619
+ { id: "explore", label: "Work", icon: /* @__PURE__ */ e(ve, { className: "size-4" }), content: /* @__PURE__ */ e(Ge, {}) },
620
+ { id: "now", label: "Status", icon: /* @__PURE__ */ e(le, { className: "size-4" }), content: /* @__PURE__ */ e(He, {}) },
621
+ { id: "feel", label: "Motion", icon: /* @__PURE__ */ e(ce, { className: "size-4" }), content: /* @__PURE__ */ e(Ue, {}) },
622
+ { id: "notes", label: "Notes", icon: /* @__PURE__ */ e(ke, { className: "size-4" }), content: /* @__PURE__ */ e(Ke, {}) },
623
+ { id: "connect", label: "Connect", icon: /* @__PURE__ */ e(D, { className: "size-4" }), content: /* @__PURE__ */ e(Je, {}) }
624
+ ], K = 50, ne = 290, Qe = 200, et = {
625
+ enter: (o) => ({ x: o * 32, opacity: 0, filter: "blur(4px)" }),
626
+ center: { x: 0, opacity: 1, filter: "blur(0px)" },
627
+ exit: (o) => ({ x: o * -32, opacity: 0, filter: "blur(4px)" })
628
+ }, tt = { type: "spring", stiffness: 340, damping: 28 }, rt = { duration: 0.3, ease: [0.4, 0, 0.2, 1] }, at = { duration: 0.24, ease: [0.4, 0, 0.2, 1] };
629
+ function nt() {
630
+ const [o, b] = S("explore"), [u, g] = S(0), d = v(0), [i, { height: r }] = Pe({ debounce: 0 }), s = U.find((c) => c.id === o), t = o !== null, p = t ? r + K : K, f = async (c) => {
631
+ const l = U.findIndex((x) => x.id === c);
632
+ if (c === o) {
633
+ b(null), await Q(), We();
634
+ return;
635
+ }
636
+ await Q(), o === null ? Ye() : (Fe(), setTimeout(() => Ze(), 60)), g(l > d.current ? 1 : -1), d.current = l, b(c);
637
+ };
638
+ return /* @__PURE__ */ n(xe, { children: [
639
+ t && /* @__PURE__ */ e(
640
+ "div",
641
+ {
642
+ "aria-hidden": "true",
643
+ style: {
644
+ position: "fixed",
645
+ left: -9999,
646
+ top: 0,
647
+ width: ne,
648
+ pointerEvents: "none",
649
+ visibility: "hidden"
650
+ },
651
+ children: /* @__PURE__ */ e("div", { ref: i, children: s == null ? void 0 : s.content })
652
+ }
653
+ ),
654
+ /* @__PURE__ */ e("div", { className: "flex h-96 items-end justify-center", children: /* @__PURE__ */ n(
655
+ z.div,
656
+ {
657
+ className: "relative mx-auto rounded-3xl border border-zinc-200 bg-white shadow-xl shadow-zinc-200/50",
658
+ style: { overflow: "hidden" },
659
+ animate: { height: p, width: t ? ne : Qe },
660
+ transition: tt,
661
+ children: [
662
+ /* @__PURE__ */ e(
663
+ "div",
664
+ {
665
+ style: {
666
+ position: "absolute",
667
+ inset: 0,
668
+ bottom: K,
669
+ overflow: "hidden"
670
+ },
671
+ children: /* @__PURE__ */ e(Z, { custom: u, initial: !1, children: t && /* @__PURE__ */ e(
672
+ z.div,
673
+ {
674
+ custom: u,
675
+ variants: et,
676
+ initial: "enter",
677
+ animate: "center",
678
+ exit: "exit",
679
+ transition: at,
680
+ className: "absolute inset-x-0 top-0",
681
+ children: s == null ? void 0 : s.content
682
+ },
683
+ o
684
+ ) })
685
+ }
686
+ ),
687
+ /* @__PURE__ */ e("div", { className: "absolute inset-x-0 bottom-0 h-[50px] border-t border-zinc-100 bg-white p-2", children: /* @__PURE__ */ e("div", { className: "flex h-9 w-full items-center justify-center gap-1", children: U.map((c) => {
688
+ const l = o === c.id;
689
+ return /* @__PURE__ */ n(
690
+ z.button,
691
+ {
692
+ onClick: () => f(c.id),
693
+ "aria-label": c.label,
694
+ "aria-pressed": l,
695
+ className: "relative flex h-full items-center justify-center rounded-2xl text-sm font-semibold focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-950 focus-visible:ring-offset-2",
696
+ animate: {
697
+ paddingLeft: l ? "1rem" : "0.5rem",
698
+ paddingRight: l ? "1rem" : "0.5rem",
699
+ gap: l ? "0.5rem" : "0rem",
700
+ backgroundColor: l ? "rgba(0,0,0,0.05)" : "rgba(0,0,0,0)",
701
+ color: l ? "#18181b" : "#a1a1aa"
702
+ },
703
+ transition: rt,
704
+ whileHover: { color: l ? "#18181b" : "#71717a" },
705
+ children: [
706
+ c.icon,
707
+ /* @__PURE__ */ e(Z, { initial: !1, children: l && /* @__PURE__ */ e(
708
+ z.span,
709
+ {
710
+ initial: { opacity: 0, width: 0 },
711
+ animate: { opacity: 1, width: "auto" },
712
+ exit: { opacity: 0, width: 0 },
713
+ transition: {
714
+ opacity: { duration: 0.15, ease: "easeInOut" },
715
+ width: { duration: 0.28, ease: [0.4, 0, 0.2, 1] }
716
+ },
717
+ className: "overflow-hidden whitespace-nowrap font-semibold leading-4 tracking-tight",
718
+ children: c.label
719
+ },
720
+ c.id + "-label"
721
+ ) })
722
+ ]
723
+ },
724
+ c.id
725
+ );
726
+ }) }) })
727
+ ]
728
+ }
729
+ ) })
730
+ ] });
731
+ }
732
+ const ot = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
733
+ __proto__: null,
734
+ ExpandableTab: nt
735
+ }, Symbol.toStringTag, { value: "Module" })), oe = [
736
+ { id: "lift", label: "Lift" },
737
+ { id: "hinge", label: "Hinge" },
738
+ { id: "drift", label: "Drift" },
739
+ { id: "ripple", label: "Ripple" },
740
+ { id: "stretch", label: "Stretch" },
741
+ { id: "cascade", label: "Cascade" },
742
+ { id: "magnet", label: "Magnet" },
743
+ { id: "arc", label: "Arc" },
744
+ { id: "roll", label: "Roll" },
745
+ { id: "echo", label: "Echo" },
746
+ { id: "shutter", label: "Shutter" },
747
+ { id: "orbit", label: "Orbit" },
748
+ { id: "weight", label: "Weight" },
749
+ { id: "sweep", label: "Sweep" },
750
+ { id: "scatter", label: "Scatter" },
751
+ { id: "pulse", label: "Pulse" },
752
+ { id: "drop", label: "Drop" },
753
+ { id: "fan", label: "Fan" },
754
+ { id: "ticker", label: "Ticker" }
755
+ ];
756
+ function ie({
757
+ text: o = "SELECTED WORK",
758
+ alternateText: b = "CREATIVE CODE",
759
+ variant: u = "lift"
760
+ }) {
761
+ const g = v(null), d = oe.find((t) => t.id === u) ?? oe[0];
762
+ ee(() => {
763
+ var y, C, N;
764
+ const t = (y = g.current) == null ? void 0 : y.querySelectorAll("[data-text-letter]");
765
+ if (!(t != null && t.length)) return;
766
+ const p = ((C = g.current) == null ? void 0 : C.querySelectorAll("[data-ticker-to]")) ?? [], f = ((N = g.current) == null ? void 0 : N.querySelectorAll("[data-ticker-dynamic]")) ?? [], c = window.matchMedia("(prefers-reduced-motion: reduce)").matches, l = (t.length - 1) / 2, x = d.id;
767
+ if (w.killTweensOf(t), w.set(t, { clearProps: "transform,opacity,filter,textShadow,clipPath,transformOrigin,fontWeight" }), x === "ticker") {
768
+ const a = Number.parseFloat(getComputedStyle(g.current).fontSize) || 16;
769
+ f.forEach((k) => {
770
+ var M, P;
771
+ const _ = ((M = k.querySelector("[data-ticker-measure-from]")) == null ? void 0 : M.getBoundingClientRect().width) ?? a * 0.62, T = ((P = k.querySelector("[data-ticker-measure-to]")) == null ? void 0 : P.getBoundingClientRect().width) ?? a * 0.62;
772
+ k.dataset.tickerFromWidth = String(_ / a), k.dataset.tickerToWidth = String(T / a);
773
+ }), w.set(f, { width: (k, _) => `${_.dataset.tickerFromWidth}em` }), w.set(p, { clearProps: "transform,opacity" }), w.set(t, {
774
+ rotateX: 0,
775
+ yPercent: 0,
776
+ visibility: "visible",
777
+ transformOrigin: "50% 50%",
778
+ backfaceVisibility: "hidden"
779
+ }), w.set(p, {
780
+ rotateX: 90,
781
+ yPercent: 6,
782
+ visibility: "hidden",
783
+ transformOrigin: "50% 50%",
784
+ backfaceVisibility: "hidden"
785
+ });
786
+ }
787
+ if (c) {
788
+ w.set(t, { opacity: 1 });
789
+ return;
790
+ }
791
+ const h = w.timeline(), m = w.timeline({ repeat: -1, repeatDelay: 2, delay: 1.35 });
792
+ return x === "lift" && (h.fromTo(
793
+ t,
794
+ { yPercent: 125, rotateX: -80, opacity: 0 },
795
+ { yPercent: 0, rotateX: 0, opacity: 1, duration: 0.86, stagger: 0.035, ease: "power4.out" }
796
+ ), m.to(t, {
797
+ y: (a) => Math.sin(a * 0.86) * 11,
798
+ rotateZ: (a) => Math.sin(a * 0.72) * 3,
799
+ duration: 0.48,
800
+ stagger: { each: 0.028, from: "center" },
801
+ ease: "power3.inOut"
802
+ }).to(t, {
803
+ y: 0,
804
+ rotateZ: 0,
805
+ duration: 0.72,
806
+ stagger: { each: 0.024, from: "center" },
807
+ ease: "elastic.out(1,.72)"
808
+ })), x === "hinge" && (h.fromTo(
809
+ t,
810
+ { rotateX: -105, yPercent: 28, opacity: 0, transformOrigin: "50% 100%" },
811
+ { rotateX: 0, yPercent: 0, opacity: 1, duration: 0.72, stagger: 0.045, ease: "back.out(1.8)" }
812
+ ), m.to(t, { rotateX: -90, yPercent: -28, opacity: 0, duration: 0.32, stagger: 0.04, ease: "power3.in" }).set(t, { rotateX: 90, yPercent: 28 }).to(t, { rotateX: 0, yPercent: 0, opacity: 1, duration: 0.48, stagger: 0.04, ease: "power4.out" })), x === "drift" && (h.fromTo(
813
+ t,
814
+ {
815
+ x: (a) => (a % 2 ? 1 : -1) * (32 + a * 3),
816
+ y: (a) => (a % 3 - 1) * 42,
817
+ rotateZ: (a) => (a % 2 ? 1 : -1) * (8 + a),
818
+ opacity: 0
819
+ },
820
+ {
821
+ x: 0,
822
+ y: 0,
823
+ rotateZ: 0,
824
+ opacity: 1,
825
+ duration: 0.95,
826
+ stagger: { each: 0.028, from: "random" },
827
+ ease: "expo.out"
828
+ }
829
+ ), m.to(t, {
830
+ x: (a) => Math.cos(a * 0.9) * 8,
831
+ y: (a) => Math.sin(a * 1.1) * 9,
832
+ rotateZ: (a) => Math.sin(a) * 4,
833
+ duration: 0.5,
834
+ stagger: { each: 0.025, from: "random" },
835
+ ease: "power3.inOut"
836
+ }).to(t, {
837
+ x: 0,
838
+ y: 0,
839
+ rotateZ: 0,
840
+ duration: 0.78,
841
+ stagger: { each: 0.02, from: "random" },
842
+ ease: "elastic.out(1,.68)"
843
+ })), x === "ripple" && (h.fromTo(
844
+ t,
845
+ { y: 24, scale: 0.48, opacity: 0 },
846
+ { y: 0, scale: 1, opacity: 1, duration: 0.7, stagger: { each: 0.045, from: "center" }, ease: "back.out(2.2)" }
847
+ ), m.to(t, {
848
+ y: (a) => Math.sin((a - l) * 0.9) * 14,
849
+ scale: (a) => 1 + Math.max(0, 1 - Math.abs(a - l) / 6) * 0.16,
850
+ duration: 0.42,
851
+ stagger: { each: 0.025, from: "center" },
852
+ ease: "sine.inOut"
853
+ }).to(t, {
854
+ y: 0,
855
+ scale: 1,
856
+ duration: 0.68,
857
+ stagger: { each: 0.025, from: "center" },
858
+ ease: "elastic.out(1,.68)"
859
+ })), x === "stretch" && (h.fromTo(
860
+ t,
861
+ { scaleX: 0.12, scaleY: 1.65, opacity: 0, transformOrigin: "50% 100%" },
862
+ { scaleX: 1, scaleY: 1, opacity: 1, duration: 0.82, stagger: 0.04, ease: "elastic.out(1,.72)" }
863
+ ), m.to(t, {
864
+ scaleX: 0.72,
865
+ scaleY: 1.32,
866
+ y: -6,
867
+ duration: 0.38,
868
+ stagger: { each: 0.025, from: "center" },
869
+ ease: "power3.inOut"
870
+ }).to(t, {
871
+ scaleX: 1,
872
+ scaleY: 1,
873
+ y: 0,
874
+ duration: 0.68,
875
+ stagger: { each: 0.025, from: "center" },
876
+ ease: "elastic.out(1,.65)"
877
+ })), x === "cascade" && (h.fromTo(
878
+ t,
879
+ { y: (a) => 28 + a * 7, skewY: 12, opacity: 0 },
880
+ { y: 0, skewY: 0, opacity: 1, duration: 0.72, stagger: 0.045, ease: "power4.out" }
881
+ ), m.to(t, {
882
+ y: (a) => (a - l) * 3,
883
+ skewY: -7,
884
+ duration: 0.42,
885
+ stagger: 0.03,
886
+ ease: "power3.inOut"
887
+ }).to(t, { y: 0, skewY: 0, duration: 0.58, stagger: 0.03, ease: "back.out(2)" })), x === "magnet" && (h.fromTo(
888
+ t,
889
+ { x: (a) => (l - a) * 24, scaleX: 0.3, opacity: 0 },
890
+ { x: 0, scaleX: 1, opacity: 1, duration: 0.88, stagger: { each: 0.026, from: "center" }, ease: "expo.out" }
891
+ ), m.to(t, {
892
+ x: (a) => (l - a) * 5.5,
893
+ scaleX: 0.72,
894
+ duration: 0.38,
895
+ stagger: { each: 0.018, from: "edges" },
896
+ ease: "power3.in"
897
+ }).to(t, {
898
+ x: 0,
899
+ scaleX: 1,
900
+ duration: 0.76,
901
+ stagger: { each: 0.018, from: "center" },
902
+ ease: "elastic.out(1,.62)"
903
+ })), x === "arc" && (h.fromTo(
904
+ t,
905
+ {
906
+ x: (a) => (a - l) * 13,
907
+ y: (a) => Math.abs(a - l) * -12,
908
+ rotateZ: (a) => (a - l) * 3.5,
909
+ opacity: 0
910
+ },
911
+ {
912
+ x: 0,
913
+ y: 0,
914
+ rotateZ: 0,
915
+ opacity: 1,
916
+ duration: 0.9,
917
+ stagger: { each: 0.03, from: "center" },
918
+ ease: "expo.out"
919
+ }
920
+ ), m.to(t, {
921
+ y: (a) => Math.abs(a - l) * -3.2,
922
+ rotateZ: (a) => (a - l) * 1.1,
923
+ duration: 0.55,
924
+ stagger: { each: 0.02, from: "center" },
925
+ ease: "power3.inOut"
926
+ }).to(t, { y: 0, rotateZ: 0, duration: 0.65, stagger: { each: 0.02, from: "center" }, ease: "power3.out" })), x === "roll" && (h.fromTo(
927
+ t,
928
+ { rotateY: -110, xPercent: -35, opacity: 0, transformOrigin: "0% 50%" },
929
+ { rotateY: 0, xPercent: 0, opacity: 1, duration: 0.72, stagger: 0.05, ease: "back.out(1.7)" }
930
+ ), m.to(t, { rotateY: 88, xPercent: 26, opacity: 0, duration: 0.3, stagger: 0.04, ease: "power3.in" }).set(t, { rotateY: -88, xPercent: -26 }).to(t, { rotateY: 0, xPercent: 0, opacity: 1, duration: 0.46, stagger: 0.04, ease: "power4.out" })), x === "echo" && (h.fromTo(
931
+ t,
932
+ { textShadow: "18px 0 rgba(32,63,255,.45),-18px 0 rgba(255,56,96,.3)", opacity: 0 },
933
+ {
934
+ textShadow: "0px 0 rgba(32,63,255,0),0px 0 rgba(255,56,96,0)",
935
+ opacity: 1,
936
+ duration: 0.85,
937
+ stagger: { each: 0.04, from: "center" },
938
+ ease: "power3.out"
939
+ }
940
+ ), m.to(t, {
941
+ textShadow: "7px 0 rgba(32,63,255,.42),-7px 0 rgba(255,56,96,.28)",
942
+ x: (a) => a % 2 ? 2 : -2,
943
+ duration: 0.3,
944
+ stagger: { each: 0.025, from: "center" },
945
+ ease: "power2.inOut"
946
+ }).to(t, {
947
+ textShadow: "0px 0 rgba(32,63,255,0),0px 0 rgba(255,56,96,0)",
948
+ x: 0,
949
+ duration: 0.52,
950
+ stagger: { each: 0.025, from: "center" },
951
+ ease: "power3.out"
952
+ })), x === "shutter" && (h.fromTo(
953
+ t,
954
+ { clipPath: "inset(0 100% 0 0)", x: -12, opacity: 0 },
955
+ { clipPath: "inset(0 0% 0 0)", x: 0, opacity: 1, duration: 0.58, stagger: 0.052, ease: "power4.out" }
956
+ ), m.to(t, { clipPath: "inset(0 0 0 100%)", x: 10, duration: 0.34, stagger: 0.035, ease: "power3.in" }).set(t, { clipPath: "inset(0 100% 0 0)", x: -10 }).to(t, { clipPath: "inset(0 0% 0 0)", x: 0, duration: 0.48, stagger: 0.035, ease: "power4.out" })), x === "orbit" && (h.fromTo(
957
+ t,
958
+ {
959
+ x: (a) => Math.cos(a * 0.86) * 74,
960
+ y: (a) => Math.sin(a * 0.86) * 54,
961
+ rotateZ: (a) => a * 24 - 90,
962
+ scale: 0.42,
963
+ opacity: 0
964
+ },
965
+ {
966
+ x: 0,
967
+ y: 0,
968
+ rotateZ: 0,
969
+ scale: 1,
970
+ opacity: 1,
971
+ duration: 1.05,
972
+ stagger: { each: 0.025, from: "center" },
973
+ ease: "expo.out"
974
+ }
975
+ ), m.to(t, {
976
+ x: (a) => Math.cos(a * 0.82) * 8,
977
+ y: (a) => Math.sin(a * 0.82) * 8,
978
+ rotateZ: (a) => Math.sin(a) * 5,
979
+ duration: 0.62,
980
+ stagger: { each: 0.018, from: "center" },
981
+ ease: "sine.inOut"
982
+ }).to(t, {
983
+ x: 0,
984
+ y: 0,
985
+ rotateZ: 0,
986
+ duration: 0.72,
987
+ stagger: { each: 0.018, from: "center" },
988
+ ease: "power3.out"
989
+ })), x === "weight" && (h.fromTo(
990
+ t,
991
+ { fontWeight: 280, y: 8, opacity: 0 },
992
+ { fontWeight: 650, y: 0, opacity: 1, duration: 0.76, stagger: 0.05, ease: "power4.out" }
993
+ ), m.to(t, { fontWeight: 820, y: -4, scaleX: 1.035, duration: 0.34, stagger: 0.055, ease: "power3.inOut" }).to(t, { fontWeight: 650, y: 0, scaleX: 1, duration: 0.52, stagger: 0.055, ease: "power3.out" })), x === "sweep" && (h.fromTo(
994
+ t,
995
+ { filter: "blur(13px)", y: 14, opacity: 0 },
996
+ { filter: "blur(0px)", y: 0, opacity: 1, duration: 0.68, stagger: 0.055, ease: "power3.out" }
997
+ ), m.to(t, { filter: "blur(8px)", opacity: 0.28, y: -5, duration: 0.28, stagger: 0.045, ease: "power2.in" }).to(t, { filter: "blur(0px)", opacity: 1, y: 0, duration: 0.46, stagger: 0.045, ease: "power3.out" })), x === "scatter" && (h.fromTo(
998
+ t,
999
+ {
1000
+ x: (a) => {
1001
+ const k = a / Math.max(1, t.length - 1) * Math.PI * 1.35 - Math.PI * 0.68;
1002
+ return Math.cos(k) * (58 + Math.abs(a - l) * 4);
1003
+ },
1004
+ y: (a) => {
1005
+ const k = a / Math.max(1, t.length - 1) * Math.PI * 1.35 - Math.PI * 0.68;
1006
+ return Math.sin(k) * 46;
1007
+ },
1008
+ rotateZ: (a) => (a - l) * 4.5,
1009
+ scale: 0.55,
1010
+ filter: "blur(4px)",
1011
+ opacity: 0
1012
+ },
1013
+ {
1014
+ x: 0,
1015
+ y: 0,
1016
+ rotateZ: 0,
1017
+ scale: 1,
1018
+ filter: "blur(0px)",
1019
+ opacity: 1,
1020
+ duration: 1.05,
1021
+ stagger: { each: 0.025, from: "center" },
1022
+ ease: "expo.out"
1023
+ }
1024
+ ), m.to(t, {
1025
+ x: (a) => (a - l) * 4.2,
1026
+ y: (a) => -Math.cos((a - l) * 0.7) * 11,
1027
+ rotateZ: (a) => (a - l) * 0.8,
1028
+ scale: 0.9,
1029
+ duration: 0.36,
1030
+ stagger: { each: 0.018, from: "center" },
1031
+ ease: "power3.inOut"
1032
+ }).to(t, {
1033
+ x: 0,
1034
+ y: 0,
1035
+ rotateZ: 0,
1036
+ scale: 1,
1037
+ duration: 0.78,
1038
+ stagger: { each: 0.018, from: "edges" },
1039
+ ease: "elastic.out(1,.68)"
1040
+ })), x === "pulse" && (h.fromTo(
1041
+ t,
1042
+ { scale: 0.18, y: 16, opacity: 0 },
1043
+ {
1044
+ scale: 1,
1045
+ y: 0,
1046
+ opacity: 1,
1047
+ duration: 0.72,
1048
+ stagger: { each: 0.045, from: "center" },
1049
+ ease: "elastic.out(1,.6)"
1050
+ }
1051
+ ), m.to(t, { scale: 1.2, y: -7, duration: 0.28, stagger: 0.045, ease: "power3.out" }).to(t, { scale: 1, y: 0, duration: 0.52, stagger: 0.045, ease: "elastic.out(1,.58)" })), x === "drop" && (h.fromTo(
1052
+ t,
1053
+ { y: (a) => -90 - a * 8, rotateZ: (a) => a % 2 ? 14 : -14, opacity: 0 },
1054
+ { y: 0, rotateZ: 0, opacity: 1, duration: 0.86, stagger: 0.045, ease: "bounce.out" }
1055
+ ), m.to(t, {
1056
+ y: -24,
1057
+ rotateZ: (a) => a % 2 ? 4 : -4,
1058
+ duration: 0.34,
1059
+ stagger: { each: 0.032, from: "center" },
1060
+ ease: "power3.out"
1061
+ }).to(t, {
1062
+ y: 0,
1063
+ rotateZ: 0,
1064
+ duration: 0.62,
1065
+ stagger: { each: 0.032, from: "center" },
1066
+ ease: "bounce.out"
1067
+ })), x === "fan" && (h.fromTo(
1068
+ t,
1069
+ {
1070
+ x: (a) => (a - l) * -10,
1071
+ y: 34,
1072
+ rotateZ: (a) => (a - l) * 9,
1073
+ opacity: 0,
1074
+ transformOrigin: "50% 120%"
1075
+ },
1076
+ {
1077
+ x: 0,
1078
+ y: 0,
1079
+ rotateZ: 0,
1080
+ opacity: 1,
1081
+ duration: 0.9,
1082
+ stagger: { each: 0.025, from: "center" },
1083
+ ease: "expo.out"
1084
+ }
1085
+ ), m.to(t, {
1086
+ x: (a) => (a - l) * 2.4,
1087
+ y: (a) => Math.abs(a - l) * 1.7,
1088
+ rotateZ: (a) => (a - l) * 2.1,
1089
+ duration: 0.5,
1090
+ stagger: { each: 0.018, from: "center" },
1091
+ ease: "power3.inOut"
1092
+ }).to(t, {
1093
+ x: 0,
1094
+ y: 0,
1095
+ rotateZ: 0,
1096
+ duration: 0.68,
1097
+ stagger: { each: 0.018, from: "edges" },
1098
+ ease: "back.out(1.5)"
1099
+ })), x === "ticker" && m.addLabel("toAlternate").to(
1100
+ t,
1101
+ {
1102
+ rotateX: -90,
1103
+ yPercent: -6,
1104
+ duration: 0.24,
1105
+ ease: "power3.in"
1106
+ },
1107
+ "toAlternate"
1108
+ ).to(
1109
+ f,
1110
+ {
1111
+ width: (a, k) => `${k.dataset.tickerToWidth}em`,
1112
+ duration: 0.58,
1113
+ ease: "power3.inOut"
1114
+ },
1115
+ "toAlternate"
1116
+ ).set(
1117
+ t,
1118
+ {
1119
+ visibility: "hidden"
1120
+ },
1121
+ "toAlternate+=.24"
1122
+ ).set(
1123
+ p,
1124
+ {
1125
+ visibility: "visible",
1126
+ rotateX: 90,
1127
+ yPercent: 6
1128
+ },
1129
+ "toAlternate+=.24"
1130
+ ).to(
1131
+ p,
1132
+ {
1133
+ rotateX: 0,
1134
+ yPercent: 0,
1135
+ duration: 0.34,
1136
+ ease: "back.out(1.35)"
1137
+ },
1138
+ "toAlternate+=.24"
1139
+ ).addLabel("toCurrent", "+=1.35").to(
1140
+ p,
1141
+ {
1142
+ rotateX: -90,
1143
+ yPercent: -6,
1144
+ duration: 0.24,
1145
+ ease: "power3.in"
1146
+ },
1147
+ "toCurrent"
1148
+ ).to(
1149
+ f,
1150
+ {
1151
+ width: (a, k) => `${k.dataset.tickerFromWidth}em`,
1152
+ duration: 0.58,
1153
+ ease: "power3.inOut"
1154
+ },
1155
+ "toCurrent"
1156
+ ).set(
1157
+ p,
1158
+ {
1159
+ visibility: "hidden"
1160
+ },
1161
+ "toCurrent+=.24"
1162
+ ).set(
1163
+ t,
1164
+ {
1165
+ visibility: "visible",
1166
+ rotateX: 90,
1167
+ yPercent: 6
1168
+ },
1169
+ "toCurrent+=.24"
1170
+ ).to(
1171
+ t,
1172
+ {
1173
+ rotateX: 0,
1174
+ yPercent: 0,
1175
+ duration: 0.34,
1176
+ ease: "back.out(1.35)"
1177
+ },
1178
+ "toCurrent+=.24"
1179
+ ), () => {
1180
+ h.kill(), m.kill(), w.killTweensOf(t), w.killTweensOf(p), w.killTweensOf(f);
1181
+ };
1182
+ }, [o, b, d]);
1183
+ const i = o.toUpperCase(), r = b.toUpperCase(), s = Math.max(i.length, r.length);
1184
+ return /* @__PURE__ */ e("div", { className: "showcase-fullbleed relative flex min-h-[30rem] w-full items-center justify-center bg-transparent px-5 pb-5 pt-24", children: /* @__PURE__ */ e(
1185
+ "span",
1186
+ {
1187
+ ref: g,
1188
+ "data-variant": d.id,
1189
+ "aria-label": d.id === "ticker" ? `${i} changes to ${r}. Ticker animation.` : `${o}. ${d.label} animation.`,
1190
+ className: `inline-flex items-center whitespace-nowrap text-[clamp(2.35rem,9cqw,6.5rem)] font-semibold leading-none text-[#111] [perspective:900px] ${d.id === "ticker" ? "tracking-[-.055em]" : "tracking-[-.065em]"}`,
1191
+ children: d.id === "ticker" ? Array.from({ length: s }, (t, p) => {
1192
+ const f = i[p] ?? " ", c = r[p] ?? " ";
1193
+ return f === " " && c === " " ? /* @__PURE__ */ e(
1194
+ "span",
1195
+ {
1196
+ "data-ticker-cell": !0,
1197
+ "aria-hidden": "true",
1198
+ className: "inline-block h-[1em] w-[.34em]"
1199
+ },
1200
+ `ticker-gap-${p}`
1201
+ ) : f === c ? /* @__PURE__ */ e(
1202
+ "span",
1203
+ {
1204
+ "data-ticker-cell": !0,
1205
+ "aria-hidden": "true",
1206
+ className: "inline-flex h-[1em] items-center",
1207
+ children: f
1208
+ },
1209
+ `ticker-static-${f}-${p}`
1210
+ ) : /* @__PURE__ */ n(
1211
+ "span",
1212
+ {
1213
+ "data-ticker-cell": !0,
1214
+ "data-ticker-dynamic": !0,
1215
+ "aria-hidden": "true",
1216
+ className: "relative inline-block h-[1em] w-[.62em] overflow-visible align-top [perspective:700px] [transform-style:preserve-3d]",
1217
+ children: [
1218
+ /* @__PURE__ */ e("span", { "data-ticker-measure-from": !0, className: "invisible absolute left-0 top-0 whitespace-pre", children: f === " " ? " " : f }),
1219
+ /* @__PURE__ */ e("span", { "data-ticker-measure-to": !0, className: "invisible absolute left-0 top-0 whitespace-pre", children: c === " " ? " " : c }),
1220
+ /* @__PURE__ */ e(
1221
+ "span",
1222
+ {
1223
+ "data-text-letter": !0,
1224
+ className: "absolute inset-0 flex items-center justify-center leading-none will-change-transform",
1225
+ children: f === " " ? " " : f
1226
+ }
1227
+ ),
1228
+ /* @__PURE__ */ e(
1229
+ "span",
1230
+ {
1231
+ "data-ticker-to": !0,
1232
+ className: "absolute inset-0 flex items-center justify-center leading-none will-change-transform",
1233
+ children: c === " " ? " " : c
1234
+ }
1235
+ )
1236
+ ]
1237
+ },
1238
+ `ticker-${f}-${c}-${p}`
1239
+ );
1240
+ }) : [...o].map((t, p) => /* @__PURE__ */ e(
1241
+ "span",
1242
+ {
1243
+ "data-text-letter": !0,
1244
+ "aria-hidden": "true",
1245
+ className: `inline-block will-change-transform ${t === " " ? "w-[.3em]" : ""}`,
1246
+ children: t === " " ? " " : t
1247
+ },
1248
+ `${t}-${p}`
1249
+ ))
1250
+ }
1251
+ ) });
1252
+ }
1253
+ const it = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1254
+ __proto__: null,
1255
+ TextMotion: ie,
1256
+ default: ie
1257
+ }, Symbol.toStringTag, { value: "Module" }));
1258
+ function st() {
1259
+ const o = v(null), b = v(null), u = v({ x: 0.58, y: 0.46, energy: 0 });
1260
+ return L(() => {
1261
+ const d = o.current, i = b.current, r = i == null ? void 0 : i.getContext("2d");
1262
+ if (!d || !i || !r) return;
1263
+ let s = 1, t = 1, p = !0;
1264
+ const f = matchMedia("(prefers-reduced-motion: reduce)").matches, c = () => {
1265
+ const m = d.getBoundingClientRect(), y = Math.min(devicePixelRatio, 1.5);
1266
+ s = Math.max(1, m.width), t = Math.max(1, m.height), i.width = Math.round(s * y), i.height = Math.round(t * y), i.style.width = `${s}px`, i.style.height = `${t}px`, r.setTransform(y, 0, 0, y, 0, 0);
1267
+ };
1268
+ c();
1269
+ const l = new ResizeObserver(c);
1270
+ l.observe(d);
1271
+ const x = new IntersectionObserver(([m]) => {
1272
+ p = m.isIntersecting;
1273
+ });
1274
+ x.observe(d);
1275
+ const h = () => {
1276
+ if (!p) return;
1277
+ const m = f ? 1.8 : w.ticker.time * 0.16, y = r.createLinearGradient(0, 0, s, t);
1278
+ y.addColorStop(0, "#f7f7f9"), y.addColorStop(0.46, "#dfe1e8"), y.addColorStop(1, "#b9becb"), r.fillStyle = y, r.fillRect(0, 0, s, t);
1279
+ const C = u.current.x * s, N = u.current.y * t;
1280
+ for (let _ = 0; _ < 7; _ += 1) {
1281
+ const T = new Path2D(), M = t * (-0.08 + _ * 0.16);
1282
+ for (let j = 0; j <= 80; j += 1) {
1283
+ const A = j / 80, X = A * s, V = Math.exp(-Math.pow((X - C) / (s * 0.2), 2)), q = Math.sin(A * Math.PI * 1.6 + m + _ * 0.72) * t * 0.13 + Math.cos(A * Math.PI * 3.2 - m * 0.7 + _) * t * 0.035, Y = V * (N - t * 0.5) * 0.18 * u.current.energy * (_ % 2 ? -1 : 1), te = M + q + Y;
1284
+ j ? T.lineTo(X, te) : T.moveTo(X, te);
1285
+ }
1286
+ const P = r.createLinearGradient(0, M, s, M + t * 0.2);
1287
+ P.addColorStop(0, "rgba(255,255,255,0)"), P.addColorStop(0.28, _ % 2 ? "rgba(255,255,255,.7)" : "rgba(202,208,224,.34)"), P.addColorStop(0.55, _ % 3 === 0 ? "rgba(190,180,255,.26)" : "rgba(255,255,255,.42)"), P.addColorStop(0.78, "rgba(143,151,170,.22)"), P.addColorStop(1, "rgba(255,255,255,0)"), r.save(), r.strokeStyle = P, r.lineWidth = t * (0.21 - _ * 0.012), r.lineCap = "round", r.filter = `blur(${_ * 1.5}px)`, r.globalCompositeOperation = _ % 2 ? "screen" : "source-over", r.globalAlpha = 0.82, r.stroke(T), r.restore(), r.save(), r.strokeStyle = `rgba(255,255,255,${0.38 - _ * 0.03})`, r.lineWidth = 0.8, r.stroke(T), r.restore();
1288
+ }
1289
+ const a = r.createRadialGradient(C, N, 0, C, N, s * 0.24);
1290
+ a.addColorStop(0, `rgba(255,255,255,${0.12 + u.current.energy * 0.18})`), a.addColorStop(0.45, "rgba(209,217,255,.08)"), a.addColorStop(1, "rgba(255,255,255,0)"), r.fillStyle = a, r.fillRect(0, 0, s, t);
1291
+ const k = r.createRadialGradient(
1292
+ s * 0.5,
1293
+ t * 0.45,
1294
+ s * 0.1,
1295
+ s * 0.5,
1296
+ t * 0.5,
1297
+ s * 0.8
1298
+ );
1299
+ k.addColorStop(0, "rgba(255,255,255,0)"), k.addColorStop(1, "rgba(44,48,61,.18)"), r.fillStyle = k, r.fillRect(0, 0, s, t);
1300
+ };
1301
+ return w.ticker.add(h), h(), () => {
1302
+ w.ticker.remove(h), l.disconnect(), x.disconnect();
1303
+ };
1304
+ }, []), /* @__PURE__ */ e(
1305
+ "div",
1306
+ {
1307
+ ref: o,
1308
+ onPointerMove: (d) => {
1309
+ const i = d.currentTarget.getBoundingClientRect();
1310
+ w.to(u.current, {
1311
+ x: (d.clientX - i.left) / i.width,
1312
+ y: (d.clientY - i.top) / i.height,
1313
+ energy: 1,
1314
+ duration: 0.85,
1315
+ ease: "power3.out",
1316
+ overwrite: !0
1317
+ });
1318
+ },
1319
+ onPointerLeave: () => w.to(u.current, { energy: 0, duration: 1.4 }),
1320
+ className: "showcase-fullbleed relative h-[clamp(34rem,68cqw,46rem)] min-h-[34rem] w-full overflow-hidden bg-[#dfe1e8]",
1321
+ "aria-label": "Interactive optical silk background",
1322
+ children: /* @__PURE__ */ e("canvas", { ref: b, className: "absolute inset-0 h-full w-full", "aria-hidden": "true" })
1323
+ }
1324
+ );
1325
+ }
1326
+ const lt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1327
+ __proto__: null,
1328
+ default: st
1329
+ }, Symbol.toStringTag, { value: "Module" }));
1330
+ function ct() {
1331
+ const o = v(null), b = v(null), u = v({ x: -999, y: -999, force: 0 });
1332
+ return L(() => {
1333
+ const d = o.current, i = b.current;
1334
+ if (!d || !i) return;
1335
+ const r = i.getContext("2d");
1336
+ if (!r) return;
1337
+ let s = 1, t = 1, p = !0;
1338
+ const f = matchMedia("(prefers-reduced-motion: reduce)").matches, c = () => {
1339
+ const m = d.getBoundingClientRect(), y = Math.min(devicePixelRatio, 1.5);
1340
+ s = Math.max(1, m.width), t = Math.max(1, m.height), i.width = Math.round(s * y), i.height = Math.round(t * y), i.style.width = `${s}px`, i.style.height = `${t}px`, r.setTransform(y, 0, 0, y, 0, 0);
1341
+ };
1342
+ c();
1343
+ const l = new ResizeObserver(c);
1344
+ l.observe(d);
1345
+ const x = new IntersectionObserver(([m]) => {
1346
+ p = m.isIntersecting;
1347
+ });
1348
+ x.observe(d);
1349
+ const h = () => {
1350
+ if (!p) return;
1351
+ const m = f ? 2.8 : w.ticker.time, y = r.createLinearGradient(0, 0, s, t);
1352
+ y.addColorStop(0, "#ffe59a"), y.addColorStop(0.48, "#ff9f7c"), y.addColorStop(1, "#65e5ce"), r.fillStyle = y, r.fillRect(0, 0, s, t);
1353
+ const C = Math.max(15, Math.min(23, s / 42)), N = Math.min(s, t) * 0.17;
1354
+ for (let k = -C; k < t + C; k += C)
1355
+ for (let _ = -C; _ < s + C; _ += C) {
1356
+ const T = _ - u.current.x, M = k - u.current.y, P = Math.hypot(T, M) || 1, j = Math.max(0, 1 - P / N) * u.current.force, A = Math.sin(_ * 0.014 + m * 0.72) * Math.cos(k * 0.011 - m * 0.48), X = Math.sin(k * 0.017 + m * 0.32) * 4 + T / P * j * 30, V = A * 8 + M / P * j * 30, q = Math.max(0.7, 1.4 + A * 0.55 + j * 3.2), Y = Math.max(0, j + (A + 1) * 0.08);
1357
+ r.beginPath(), r.arc(_ + X, k + V, q, 0, Math.PI * 2), r.fillStyle = Y > 0.52 ? `rgba(76,29,149,${0.48 + Y * 0.34})` : `rgba(22,25,65,${0.24 + q * 0.1})`, r.fill();
1358
+ }
1359
+ const a = r.createRadialGradient(
1360
+ u.current.x,
1361
+ u.current.y,
1362
+ 0,
1363
+ u.current.x,
1364
+ u.current.y,
1365
+ N * 1.3
1366
+ );
1367
+ a.addColorStop(0, `rgba(76,245,216,${u.current.force * 0.32})`), a.addColorStop(0.45, `rgba(255,81,145,${u.current.force * 0.12})`), a.addColorStop(1, "rgba(76,245,216,0)"), r.fillStyle = a, r.fillRect(0, 0, s, t);
1368
+ };
1369
+ return w.ticker.add(h), h(), () => {
1370
+ w.ticker.remove(h), l.disconnect(), x.disconnect();
1371
+ };
1372
+ }, []), /* @__PURE__ */ n(
1373
+ "div",
1374
+ {
1375
+ ref: o,
1376
+ onPointerMove: (d) => {
1377
+ const i = d.currentTarget.getBoundingClientRect();
1378
+ w.to(u.current, {
1379
+ x: d.clientX - i.left,
1380
+ y: d.clientY - i.top,
1381
+ force: 1,
1382
+ duration: 0.55,
1383
+ ease: "power3.out",
1384
+ overwrite: !0
1385
+ });
1386
+ },
1387
+ onPointerLeave: () => w.to(u.current, { force: 0, duration: 1.1, ease: "power2.out" }),
1388
+ className: "showcase-fullbleed relative h-[clamp(34rem,68cqw,46rem)] min-h-[34rem] w-full overflow-hidden bg-[#ffbf8f]",
1389
+ "aria-label": "Animated magnetic halftone background",
1390
+ children: [
1391
+ /* @__PURE__ */ e("canvas", { ref: b, className: "absolute inset-0 h-full w-full", "aria-hidden": "true" }),
1392
+ /* @__PURE__ */ e(
1393
+ "div",
1394
+ {
1395
+ "aria-hidden": "true",
1396
+ className: "pointer-events-none absolute inset-0 bg-[linear-gradient(110deg,rgba(255,255,255,.32),transparent_38%,rgba(20,20,20,.06))]"
1397
+ }
1398
+ )
1399
+ ]
1400
+ }
1401
+ );
1402
+ }
1403
+ const dt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1404
+ __proto__: null,
1405
+ default: ct
1406
+ }, Symbol.toStringTag, { value: "Module" }));
1407
+ function ut() {
1408
+ const o = v(null), b = v(null), u = v({ x: 0.5, y: 0.5, energy: 0 });
1409
+ return L(() => {
1410
+ const d = o.current, i = b.current, r = i == null ? void 0 : i.getContext("2d");
1411
+ if (!d || !i || !r) return;
1412
+ let s = 1, t = 1, p = !0;
1413
+ const f = matchMedia("(prefers-reduced-motion: reduce)").matches, c = () => {
1414
+ const m = d.getBoundingClientRect(), y = Math.min(devicePixelRatio, 1.5);
1415
+ s = Math.max(1, m.width), t = Math.max(1, m.height), i.width = Math.round(s * y), i.height = Math.round(t * y), i.style.width = `${s}px`, i.style.height = `${t}px`, r.setTransform(y, 0, 0, y, 0, 0);
1416
+ };
1417
+ c();
1418
+ const l = new ResizeObserver(c);
1419
+ l.observe(d);
1420
+ const x = new IntersectionObserver(([m]) => {
1421
+ p = m.isIntersecting;
1422
+ });
1423
+ x.observe(d);
1424
+ const h = () => {
1425
+ if (!p) return;
1426
+ const m = f ? 1.7 : w.ticker.time * 0.18, y = r.createLinearGradient(0, 0, s, t);
1427
+ y.addColorStop(0, "#eef8ff"), y.addColorStop(0.45, "#b5d8ff"), y.addColorStop(1, "#8c75ff"), r.fillStyle = y, r.fillRect(0, 0, s, t), r.save(), r.globalCompositeOperation = "screen", r.filter = "blur(18px)";
1428
+ for (let N = 0; N < 9; N += 1) {
1429
+ const a = N / 8, k = s * (0.1 + a * 0.9) + Math.sin(m + N * 1.8) * s * 0.08 + (u.current.x - 0.5) * s * 0.09 * u.current.energy, _ = t * (0.25 + 0.48 * Math.sin(N * 0.77 + m * 0.8)) + (u.current.y - 0.5) * t * 0.1 * u.current.energy, T = Math.min(s, t) * (0.16 + N % 3 * 0.035), M = r.createRadialGradient(k, _, 0, k, _, T), P = N % 3 === 0 ? ["rgba(255,255,255,.9)", "rgba(126,255,219,.1)"] : N % 3 === 1 ? ["rgba(255,188,236,.7)", "rgba(255,188,236,0)"] : ["rgba(113,232,255,.72)", "rgba(113,232,255,0)"];
1430
+ M.addColorStop(0, P[0]), M.addColorStop(1, P[1]), r.fillStyle = M, r.beginPath(), r.arc(k, _, T, 0, Math.PI * 2), r.fill();
1431
+ }
1432
+ r.restore(), r.save(), r.globalCompositeOperation = "overlay";
1433
+ for (let N = 0; N < 11; N += 1) {
1434
+ r.beginPath();
1435
+ for (let a = 0; a <= 80; a += 1) {
1436
+ const k = a / 80 * s, _ = t * (0.16 + N * 0.073) + Math.sin(a * 0.13 + N * 0.8 + m) * 13 + (u.current.x - 0.5) * 18 * u.current.energy;
1437
+ a ? r.lineTo(k, _) : r.moveTo(k, _);
1438
+ }
1439
+ r.strokeStyle = `rgba(255,255,255,${0.16 + N * 6e-3})`, r.lineWidth = 1, r.stroke();
1440
+ }
1441
+ r.restore();
1442
+ const C = r.createLinearGradient(0, 0, 0, t);
1443
+ C.addColorStop(0, "rgba(20,20,40,.12)"), C.addColorStop(0.5, "rgba(20,20,40,0)"), C.addColorStop(1, "rgba(35,22,83,.35)"), r.fillStyle = C, r.fillRect(0, 0, s, t);
1444
+ };
1445
+ return w.ticker.add(h), h(), () => {
1446
+ w.ticker.remove(h), l.disconnect(), x.disconnect();
1447
+ };
1448
+ }, []), /* @__PURE__ */ n(
1449
+ "div",
1450
+ {
1451
+ ref: o,
1452
+ onPointerMove: (d) => {
1453
+ const i = d.currentTarget.getBoundingClientRect();
1454
+ w.to(u.current, {
1455
+ x: (d.clientX - i.left) / i.width,
1456
+ y: (d.clientY - i.top) / i.height,
1457
+ energy: 1,
1458
+ duration: 0.9,
1459
+ ease: "power3.out",
1460
+ overwrite: !0
1461
+ });
1462
+ },
1463
+ onPointerLeave: () => w.to(u.current, { energy: 0, duration: 1.4 }),
1464
+ className: "showcase-fullbleed relative h-[clamp(34rem,68cqw,46rem)] min-h-[34rem] w-full overflow-hidden bg-[#b5d8ff]",
1465
+ "aria-label": "Animated polar caustic background",
1466
+ children: [
1467
+ /* @__PURE__ */ e("canvas", { ref: b, className: "absolute inset-0 h-full w-full", "aria-hidden": "true" }),
1468
+ /* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center p-8 text-center text-[#15132a]", children: /* @__PURE__ */ n("div", { children: [
1469
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] uppercase tracking-[.2em] text-[#15132a]/45", children: "Portfolio" }),
1470
+ /* @__PURE__ */ e("h3", { className: "mt-5 text-[clamp(4rem,10vw,9rem)] font-semibold leading-[.78] tracking-[-.095em]", children: "Selected work." }),
1471
+ /* @__PURE__ */ e("p", { className: "mx-auto mt-7 max-w-[24rem] text-[12px] leading-5 text-[#15132a]/52", children: "A collection of web projects." })
1472
+ ] }) })
1473
+ ]
1474
+ }
1475
+ );
1476
+ }
1477
+ const pt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1478
+ __proto__: null,
1479
+ default: ut
1480
+ }, Symbol.toStringTag, { value: "Module" }));
1481
+ function Bt() {
1482
+ return /* @__PURE__ */ e("svg", { "aria-hidden": "true", className: "pointer-events-none fixed h-0 w-0 overflow-hidden", children: /* @__PURE__ */ n("defs", { children: [
1483
+ ["motus-glass", "motus-pill", "motus-panel"].map((o) => /* @__PURE__ */ e("filter", { id: o, colorInterpolationFilters: "sRGB", children: /* @__PURE__ */ e("feColorMatrix", { values: "1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0" }) }, o)),
1484
+ /* @__PURE__ */ n("filter", { id: "motus-orb", x: "-35%", y: "-35%", width: "170%", height: "170%", children: [
1485
+ /* @__PURE__ */ e("feTurbulence", { type: "fractalNoise", baseFrequency: ".018", numOctaves: "1", seed: "11", result: "noise" }),
1486
+ /* @__PURE__ */ e("feDisplacementMap", { in: "SourceGraphic", in2: "noise", scale: "7", xChannelSelector: "R", yChannelSelector: "B" })
1487
+ ] }),
1488
+ /* @__PURE__ */ n("filter", { id: "motus-prism", x: "-25%", y: "-25%", width: "150%", height: "150%", children: [
1489
+ /* @__PURE__ */ e("feTurbulence", { type: "fractalNoise", baseFrequency: ".022", numOctaves: "1", seed: "17", result: "grain" }),
1490
+ /* @__PURE__ */ e("feDisplacementMap", { in: "SourceGraphic", in2: "grain", scale: "6", result: "bent" }),
1491
+ /* @__PURE__ */ e("feOffset", { in: "bent", dx: "-1", result: "redShift" }),
1492
+ /* @__PURE__ */ e("feOffset", { in: "bent", dx: "1", result: "blueShift" }),
1493
+ /* @__PURE__ */ e("feBlend", { in: "redShift", in2: "blueShift", mode: "screen" })
1494
+ ] }),
1495
+ /* @__PURE__ */ n("filter", { id: "motus-goo", x: "-45%", y: "-20%", width: "190%", height: "140%", colorInterpolationFilters: "sRGB", children: [
1496
+ /* @__PURE__ */ e("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "7", result: "blur" }),
1497
+ /* @__PURE__ */ e("feColorMatrix", { in: "blur", values: "1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 22 -9", result: "goo" }),
1498
+ /* @__PURE__ */ e("feBlend", { in: "SourceGraphic", in2: "goo", mode: "normal" })
1499
+ ] })
1500
+ ] }) });
1501
+ }
1502
+ function Xt({
1503
+ children: o,
1504
+ className: b = "",
1505
+ draggable: u = !1,
1506
+ borderRadius: g = "16px",
1507
+ blurIntensity: d = "md",
1508
+ glowIntensity: i = "sm",
1509
+ shadowIntensity: r = "md"
1510
+ }) {
1511
+ const s = v(null), t = v({ active: !1, pointerId: -1, startX: 0, startY: 0 }), p = { sm: "backdrop-blur-[12px]", md: "backdrop-blur-[20px]", lg: "backdrop-blur-[30px]" }[d], f = {
1512
+ none: "",
1513
+ sm: "drop-shadow-[0_18px_32px_rgba(0,0,0,.26)]",
1514
+ md: "drop-shadow-[0_24px_48px_rgba(0,0,0,.34)]"
1515
+ }[i], c = {
1516
+ sm: "shadow-[inset_0_1px_0_rgba(255,255,255,.48),inset_0_-1px_0_rgba(255,255,255,.10)]",
1517
+ md: "shadow-[inset_0_1px_0_rgba(255,255,255,.58),inset_0_-1px_0_rgba(255,255,255,.08),inset_1px_0_0_rgba(255,255,255,.18)]",
1518
+ lg: "shadow-[inset_0_1px_0_rgba(255,255,255,.68),inset_0_-2px_1px_rgba(0,0,0,.18),inset_1px_0_0_rgba(255,255,255,.22)]"
1519
+ }[r], l = (m) => {
1520
+ const y = s.current;
1521
+ if (!y) return;
1522
+ const C = y.getBoundingClientRect();
1523
+ if (y.style.setProperty("--glass-x", `${(m.clientX - C.left) / C.width * 100}%`), y.style.setProperty("--glass-y", `${(m.clientY - C.top) / C.height * 100}%`), !t.current.active || m.pointerId !== t.current.pointerId) return;
1524
+ const N = (m.clientX - t.current.startX) * 0.82, a = (m.clientY - t.current.startY) * 0.82;
1525
+ w.set(y, { x: N, y: a, rotate: N * 0.012, force3D: !0 });
1526
+ }, x = (m) => {
1527
+ !u || m.target.closest("button,a,input") || (t.current = { active: !0, pointerId: m.pointerId, startX: m.clientX, startY: m.clientY }, m.currentTarget.setPointerCapture(m.pointerId), w.to(s.current, { scale: 1.015, duration: 0.25, ease: "power3.out" }));
1528
+ }, h = (m) => {
1529
+ !t.current.active || m.pointerId !== t.current.pointerId || (t.current.active = !1, m.currentTarget.hasPointerCapture(m.pointerId) && m.currentTarget.releasePointerCapture(m.pointerId), w.to(s.current, {
1530
+ x: 0,
1531
+ y: 0,
1532
+ rotate: 0,
1533
+ scale: 1,
1534
+ duration: 0.95,
1535
+ ease: "elastic.out(1,.54)",
1536
+ overwrite: !0
1537
+ }));
1538
+ };
1539
+ return /* @__PURE__ */ n(
1540
+ "div",
1541
+ {
1542
+ ref: s,
1543
+ onPointerDown: x,
1544
+ onPointerMove: l,
1545
+ onPointerUp: h,
1546
+ onPointerCancel: h,
1547
+ className: `relative isolate overflow-hidden border border-white/[.34] bg-white/[.055] ${f} ${c} ${u ? "touch-none select-none cursor-grab active:cursor-grabbing" : ""} ${b}`,
1548
+ style: { borderRadius: g, "--glass-x": "22%", "--glass-y": "12%" },
1549
+ children: [
1550
+ /* @__PURE__ */ e(
1551
+ "span",
1552
+ {
1553
+ className: `pointer-events-none absolute inset-0 -z-30 bg-black/[.3] ${p} backdrop-saturate-[185%] backdrop-contrast-[108%]`
1554
+ }
1555
+ ),
1556
+ /* @__PURE__ */ e("span", { className: "pointer-events-none absolute inset-0 -z-20 bg-[linear-gradient(145deg,rgba(255,255,255,.15),rgba(255,255,255,.035)_42%,rgba(255,255,255,.08)_72%,rgba(255,255,255,.12))]" }),
1557
+ /* @__PURE__ */ e(
1558
+ "span",
1559
+ {
1560
+ className: "pointer-events-none absolute inset-0 -z-10 opacity-90 mix-blend-screen",
1561
+ style: {
1562
+ background: "radial-gradient(circle at var(--glass-x) var(--glass-y), rgba(255,255,255,.42), rgba(255,255,255,.11) 18%, transparent 45%)"
1563
+ }
1564
+ }
1565
+ ),
1566
+ /* @__PURE__ */ e("span", { className: "pointer-events-none absolute inset-px -z-10 rounded-[inherit] ring-1 ring-inset ring-white/[.13]" }),
1567
+ o
1568
+ ]
1569
+ }
1570
+ );
1571
+ }
1572
+ function mt() {
1573
+ const [o, b] = S(0), u = v(null), g = v(null), d = [
1574
+ { label: "Home", icon: pe },
1575
+ { label: "Work", icon: me },
1576
+ { label: "About", icon: fe },
1577
+ { label: "Contact", icon: D }
1578
+ ], i = (p, f = !1) => {
1579
+ var h;
1580
+ const c = (h = g.current) == null ? void 0 : h.querySelectorAll("[data-portfolio-item]")[p];
1581
+ if (!c || !g.current || !u.current) return;
1582
+ const l = g.current.getBoundingClientRect(), x = c.getBoundingClientRect();
1583
+ w.to(u.current, {
1584
+ x: x.left - l.left,
1585
+ width: x.width,
1586
+ duration: f ? 0 : 0.7,
1587
+ ease: f ? "none" : "elastic.out(1,.82)",
1588
+ overwrite: !0
1589
+ });
1590
+ };
1591
+ ee(() => {
1592
+ const p = requestAnimationFrame(() => i(0, !0)), f = () => {
1593
+ var l;
1594
+ const c = [...((l = g.current) == null ? void 0 : l.querySelectorAll("[data-portfolio-item]")) ?? []];
1595
+ i(
1596
+ Math.max(
1597
+ 0,
1598
+ c.findIndex((x) => x.getAttribute("aria-current") === "page")
1599
+ ),
1600
+ !0
1601
+ );
1602
+ };
1603
+ return window.addEventListener("resize", f), () => {
1604
+ cancelAnimationFrame(p), window.removeEventListener("resize", f);
1605
+ };
1606
+ }, []);
1607
+ const r = (p) => {
1608
+ var c;
1609
+ if (p === o) return;
1610
+ b(p), requestAnimationFrame(() => i(p));
1611
+ const f = (c = g.current) == null ? void 0 : c.querySelectorAll("[data-nav-content]")[p];
1612
+ f && w.fromTo(
1613
+ f,
1614
+ { y: 6, opacity: 0.35 },
1615
+ { y: 0, opacity: 1, duration: 0.38, ease: "power4.out", overwrite: !0 }
1616
+ );
1617
+ }, s = (p) => {
1618
+ const f = p.currentTarget.querySelector("[data-nav-content]");
1619
+ if (!f) return;
1620
+ const c = p.currentTarget.getBoundingClientRect(), l = ((p.clientX - c.left) / c.width - 0.5) * 4, x = ((p.clientY - c.top) / c.height - 0.5) * 3;
1621
+ w.to(f, { x: l, y: x, duration: 0.28, ease: "power3.out", overwrite: !0 });
1622
+ }, t = (p) => {
1623
+ const f = p.currentTarget.querySelector("[data-nav-content]");
1624
+ f && w.to(f, { x: 0, y: 0, duration: 0.55, ease: "elastic.out(1,.7)", overwrite: !0 });
1625
+ };
1626
+ return /* @__PURE__ */ e("div", { className: "flex min-h-[24rem] w-full items-center justify-center p-4", children: /* @__PURE__ */ n(
1627
+ "nav",
1628
+ {
1629
+ ref: g,
1630
+ "aria-label": "Portfolio sections",
1631
+ className: "relative flex items-center gap-1 rounded-[1.65rem] border border-black/[.08] bg-white/80 p-1.5 text-[#171719] shadow-[inset_0_1px_0_rgba(255,255,255,1),0_18px_45px_rgba(40,45,62,.12)] backdrop-blur-2xl",
1632
+ children: [
1633
+ /* @__PURE__ */ n("span", { "aria-hidden": "true", className: "relative z-10 mx-2 grid h-6 w-6 place-items-center", children: [
1634
+ /* @__PURE__ */ e("i", { className: "absolute h-3.5 w-3.5 -translate-x-1 rotate-45 rounded-[5px] border border-black/70" }),
1635
+ /* @__PURE__ */ e("i", { className: "absolute h-3.5 w-3.5 translate-x-1 rotate-45 rounded-[5px] border border-black/25" })
1636
+ ] }),
1637
+ /* @__PURE__ */ e("span", { "aria-hidden": "true", className: "mx-0.5 h-6 w-px bg-black/[.09]" }),
1638
+ /* @__PURE__ */ e(
1639
+ "span",
1640
+ {
1641
+ ref: u,
1642
+ "aria-hidden": "true",
1643
+ className: "pointer-events-none absolute bottom-1.5 left-0 top-1.5 w-20 overflow-hidden rounded-[1.2rem] bg-[#18181b] shadow-[inset_0_1px_0_rgba(255,255,255,.16),0_10px_24px_rgba(24,24,27,.24)]",
1644
+ children: /* @__PURE__ */ e("i", { className: "absolute inset-0 bg-[radial-gradient(circle_at_28%_0%,rgba(255,255,255,.22),transparent_38%),linear-gradient(115deg,transparent_40%,rgba(132,148,255,.18),transparent_76%)]" })
1645
+ }
1646
+ ),
1647
+ d.map(({ label: p, icon: f }, c) => {
1648
+ const l = o === c;
1649
+ return /* @__PURE__ */ e(
1650
+ "button",
1651
+ {
1652
+ type: "button",
1653
+ "data-portfolio-item": !0,
1654
+ "aria-label": p,
1655
+ "aria-current": l ? "page" : void 0,
1656
+ onClick: () => r(c),
1657
+ onFocus: () => i(c),
1658
+ onPointerMove: s,
1659
+ onPointerLeave: t,
1660
+ className: `relative z-10 flex h-11 min-w-11 items-center justify-center rounded-[1.2rem] px-3 text-[12px] font-semibold transition-colors duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-black/20 sm:min-w-[5.6rem] ${l ? "!text-white" : "text-black/48 hover:text-black"}`,
1661
+ children: /* @__PURE__ */ n("span", { "data-nav-content": !0, className: "flex items-center gap-2", children: [
1662
+ /* @__PURE__ */ e(f, { size: 15, strokeWidth: 1.8 }),
1663
+ /* @__PURE__ */ e("span", { className: "hidden sm:inline", children: p })
1664
+ ] })
1665
+ },
1666
+ p
1667
+ );
1668
+ })
1669
+ ]
1670
+ }
1671
+ ) });
1672
+ }
1673
+ function ft() {
1674
+ const [o, b] = S(!1), u = v(null), g = v(null), d = v(!1), i = v(!1), r = v(null);
1675
+ L(
1676
+ () => () => {
1677
+ var p;
1678
+ (p = r.current) == null || p.kill(), w.killTweensOf([u.current, g.current]);
1679
+ },
1680
+ []
1681
+ );
1682
+ const s = () => {
1683
+ var h;
1684
+ const p = !d.current, f = window.matchMedia("(max-width: 560px)").matches, c = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
1685
+ d.current = p, b(p), (h = r.current) == null || h.kill(), w.killTweensOf([u.current, g.current]), i.current = !0;
1686
+ const l = c ? 0.01 : p ? 0.68 : 0.48, x = w.timeline({
1687
+ onComplete: () => {
1688
+ i.current = !1;
1689
+ },
1690
+ onInterrupt: () => {
1691
+ i.current = !1;
1692
+ }
1693
+ });
1694
+ r.current = x, p || x.to(
1695
+ g.current,
1696
+ {
1697
+ opacity: 0,
1698
+ x: f ? 0 : 14,
1699
+ y: f ? 12 : 0,
1700
+ duration: c ? 0.01 : 0.16,
1701
+ ease: "power2.out",
1702
+ pointerEvents: "none"
1703
+ },
1704
+ 0
1705
+ ), x.to(
1706
+ u.current,
1707
+ {
1708
+ xPercent: f ? 0 : p ? -47 : 0,
1709
+ yPercent: f && p ? -47 : 0,
1710
+ rotateY: !f && p ? -8 : 0,
1711
+ rotateX: f && p ? 5 : 0,
1712
+ scale: p ? 0.94 : 1,
1713
+ duration: l,
1714
+ ease: p ? "expo.out" : "power4.inOut"
1715
+ },
1716
+ p ? 0 : 0.04
1717
+ ), p && x.to(
1718
+ g.current,
1719
+ { opacity: 1, x: 0, y: 0, duration: c ? 0.01 : 0.3, ease: "power3.out", pointerEvents: "auto" },
1720
+ c ? 0 : 0.24
1721
+ );
1722
+ };
1723
+ return /* @__PURE__ */ e("div", { className: "flex min-h-[31rem] w-full items-center justify-center p-4 [perspective:1400px]", children: /* @__PURE__ */ n(
1724
+ "article",
1725
+ {
1726
+ onPointerMove: (p) => {
1727
+ if (d.current || i.current) return;
1728
+ const f = p.currentTarget.getBoundingClientRect(), c = (p.clientX - f.left) / f.width - 0.5, l = (p.clientY - f.top) / f.height - 0.5;
1729
+ w.to(u.current, { rotateY: c * 4, rotateX: l * -3, duration: 0.55, ease: "power3.out", overwrite: !0 });
1730
+ },
1731
+ onPointerLeave: () => !d.current && !i.current && w.to(u.current, { rotateX: 0, rotateY: 0, duration: 0.42, ease: "power3.out", overwrite: "auto" }),
1732
+ className: "relative h-[27rem] w-full max-w-[43rem] overflow-hidden rounded-[2.25rem] border border-black/[.08] bg-[#f5f5f7] text-[#111] shadow-[0_35px_100px_rgba(0,0,0,.14)]",
1733
+ children: [
1734
+ /* @__PURE__ */ n(
1735
+ "div",
1736
+ {
1737
+ ref: g,
1738
+ "aria-hidden": !o,
1739
+ className: "pointer-events-none absolute inset-x-0 bottom-0 flex h-[56%] w-full flex-col justify-between p-5 opacity-0 md:inset-y-0 md:left-auto md:right-0 md:h-auto md:w-[55%] md:p-7",
1740
+ children: [
1741
+ /* @__PURE__ */ n("div", { className: "flex items-center justify-between", children: [
1742
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] uppercase tracking-[.17em] text-black/38", children: "Project" }),
1743
+ /* @__PURE__ */ n("div", { className: "flex items-center gap-2", children: [
1744
+ /* @__PURE__ */ e(
1745
+ "button",
1746
+ {
1747
+ onClick: s,
1748
+ tabIndex: o ? 0 : -1,
1749
+ "aria-label": "Close project details",
1750
+ className: "grid h-10 w-10 place-items-center rounded-full border border-black/10 bg-white text-black md:hidden",
1751
+ children: /* @__PURE__ */ e(de, { size: 15 })
1752
+ }
1753
+ ),
1754
+ /* @__PURE__ */ e(
1755
+ "a",
1756
+ {
1757
+ href: "#northstar-case-study",
1758
+ tabIndex: o ? 0 : -1,
1759
+ "aria-label": "Open Northstar case study",
1760
+ className: "grid h-10 w-10 place-items-center rounded-full bg-black !text-white no-underline md:h-11 md:w-11",
1761
+ children: /* @__PURE__ */ e(I, { size: 16 })
1762
+ }
1763
+ )
1764
+ ] })
1765
+ ] }),
1766
+ /* @__PURE__ */ n("div", { children: [
1767
+ /* @__PURE__ */ n("h3", { className: "text-[2rem] font-semibold leading-[.9] tracking-[-.075em] md:text-[2.7rem]", children: [
1768
+ "Northstar",
1769
+ /* @__PURE__ */ e("br", {}),
1770
+ "Workspace"
1771
+ ] }),
1772
+ /* @__PURE__ */ e("p", { className: "mt-3 max-w-[17rem] text-[11px] leading-4 text-black/48 md:mt-4 md:text-[12px] md:leading-5", children: "A workspace for distributed product teams." })
1773
+ ] }),
1774
+ /* @__PURE__ */ n("div", { className: "grid grid-cols-2 border-t border-black/10 pt-3 text-[9px] md:pt-4 md:text-[10px]", children: [
1775
+ /* @__PURE__ */ n("span", { children: [
1776
+ /* @__PURE__ */ e("i", { className: "block not-italic text-black/35", children: "Year" }),
1777
+ /* @__PURE__ */ e("strong", { className: "mt-1 block", children: "2026" })
1778
+ ] }),
1779
+ /* @__PURE__ */ n("span", { children: [
1780
+ /* @__PURE__ */ e("i", { className: "block not-italic text-black/35", children: "Role" }),
1781
+ /* @__PURE__ */ e("strong", { className: "mt-1 block", children: "Design and build" })
1782
+ ] })
1783
+ ] })
1784
+ ]
1785
+ }
1786
+ ),
1787
+ /* @__PURE__ */ n(
1788
+ "div",
1789
+ {
1790
+ ref: u,
1791
+ className: "absolute inset-3 z-10 overflow-hidden rounded-[1.65rem] bg-[#111] text-white shadow-[0_24px_70px_rgba(0,0,0,.34)] [transform-origin:center_top] [transform-style:preserve-3d] md:[transform-origin:left_center]",
1792
+ children: [
1793
+ /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_68%_32%,rgba(255,255,255,.18),transparent_22%),radial-gradient(circle_at_36%_68%,rgba(125,141,255,.26),transparent_26%),linear-gradient(145deg,#18191c,#050506)]" }),
1794
+ /* @__PURE__ */ e("div", { className: "absolute left-[52%] top-[16%] h-[17rem] w-[11rem] rotate-6 rounded-[3.2rem] border border-white/15 bg-white/[.06] shadow-[inset_0_1px_0_rgba(255,255,255,.24),0_30px_70px_rgba(0,0,0,.32)] backdrop-blur-2xl" }),
1795
+ /* @__PURE__ */ n("header", { className: "relative flex items-center justify-between p-5", children: [
1796
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] uppercase tracking-[.18em] text-white/44", children: "Northstar / 2026" }),
1797
+ /* @__PURE__ */ n(
1798
+ "button",
1799
+ {
1800
+ onClick: s,
1801
+ "aria-expanded": o,
1802
+ className: "flex h-11 items-center gap-2 rounded-full border border-white/12 bg-white/[.08] px-4 text-[10px] font-semibold backdrop-blur-xl hover:bg-white/[.14]",
1803
+ children: [
1804
+ /* @__PURE__ */ e("span", { children: o ? "Close" : "Open project" }),
1805
+ /* @__PURE__ */ e(he, { size: 14 })
1806
+ ]
1807
+ }
1808
+ )
1809
+ ] }),
1810
+ /* @__PURE__ */ n("div", { className: "absolute bottom-6 left-6", children: [
1811
+ /* @__PURE__ */ e("span", { className: "text-[11px] text-white/40", children: "Team workspace" }),
1812
+ /* @__PURE__ */ e("h3", { className: "mt-1 text-[3.6rem] font-semibold tracking-[-.085em]", children: "Northstar" })
1813
+ ] })
1814
+ ]
1815
+ }
1816
+ )
1817
+ ]
1818
+ }
1819
+ ) });
1820
+ }
1821
+ function ht() {
1822
+ const [o, b] = S(0), u = v([]), g = [
1823
+ { label: "Design", copy: "Interface design for web products.", meta: "01", tint: "#f4f4f6" },
1824
+ { label: "Motion", copy: "Animation and interaction design.", meta: "02", tint: "#ededf0" },
1825
+ { label: "Development", copy: "Responsive React development.", meta: "03", tint: "#e5e5e8" },
1826
+ { label: "Prototyping", copy: "Working prototypes for new ideas.", meta: "04", tint: "#dedee2" }
1827
+ ], d = (i) => {
1828
+ b(i), u.current.forEach(
1829
+ (r, s) => w.to(r, {
1830
+ height: s === i ? 132 : 62,
1831
+ scale: s === i ? 1 : 0.985,
1832
+ duration: 0.72,
1833
+ ease: "elastic.out(1,.72)",
1834
+ overwrite: !0
1835
+ })
1836
+ );
1837
+ };
1838
+ return /* @__PURE__ */ e("div", { className: "flex min-h-[31rem] w-full items-center justify-center p-4", children: /* @__PURE__ */ n("section", { className: "w-full max-w-[38rem] rounded-[2.2rem] border border-black/[.08] bg-white/72 p-3 text-[#111] shadow-[0_32px_90px_rgba(0,0,0,.12)] backdrop-blur-2xl", children: [
1839
+ /* @__PURE__ */ n("header", { className: "flex items-end justify-between px-3 pb-5 pt-3", children: [
1840
+ /* @__PURE__ */ n("div", { children: [
1841
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] uppercase tracking-[.18em] text-black/35", children: "Skills" }),
1842
+ /* @__PURE__ */ e("h3", { className: "mt-2 text-2xl font-semibold tracking-[-.055em]", children: "What I do" })
1843
+ ] }),
1844
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] text-black/35", children: "Choose one" })
1845
+ ] }),
1846
+ /* @__PURE__ */ e("div", { role: "group", "aria-label": "Capabilities", className: "space-y-1.5", children: g.map((i, r) => /* @__PURE__ */ n(
1847
+ "button",
1848
+ {
1849
+ ref: (s) => {
1850
+ u.current[r] = s;
1851
+ },
1852
+ "aria-pressed": o === r,
1853
+ onPointerEnter: () => d(r),
1854
+ onFocus: () => d(r),
1855
+ onClick: () => d(r),
1856
+ className: "group relative flex w-full origin-center flex-col justify-between overflow-hidden rounded-[1.25rem] border border-black/[.07] px-5 py-4 text-left shadow-[inset_0_1px_0_rgba(255,255,255,.8)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-black",
1857
+ style: { height: r === 0 ? 132 : 62, background: i.tint },
1858
+ children: [
1859
+ /* @__PURE__ */ n("div", { className: "flex w-full items-center justify-between", children: [
1860
+ /* @__PURE__ */ e("strong", { className: "text-[14px] font-semibold tracking-[-.02em]", children: i.label }),
1861
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] text-black/35", children: i.meta })
1862
+ ] }),
1863
+ /* @__PURE__ */ n(
1864
+ "div",
1865
+ {
1866
+ className: `flex items-end justify-between gap-5 transition-opacity duration-300 ${o === r ? "opacity-100" : "opacity-0"}`,
1867
+ children: [
1868
+ /* @__PURE__ */ e("p", { className: "max-w-[23rem] text-[12px] leading-5 text-black/48", children: i.copy }),
1869
+ /* @__PURE__ */ e("span", { className: "grid h-9 w-9 shrink-0 place-items-center rounded-full bg-black !text-white transition-transform group-hover:rotate-[-8deg]", children: /* @__PURE__ */ e(I, { size: 14 }) })
1870
+ ]
1871
+ }
1872
+ )
1873
+ ]
1874
+ },
1875
+ i.label
1876
+ )) })
1877
+ ] }) });
1878
+ }
1879
+ function bt() {
1880
+ const [o, b] = S(0), u = v(null), g = [
1881
+ {
1882
+ code: "01",
1883
+ title: "Northstar",
1884
+ type: "Team workspace",
1885
+ result: "2026",
1886
+ tone: "linear-gradient(145deg,#dfe7ff,#8c9cff)"
1887
+ },
1888
+ {
1889
+ code: "02",
1890
+ title: "Eidolon",
1891
+ type: "Studio website",
1892
+ result: "2026",
1893
+ tone: "linear-gradient(145deg,#e8e8eb,#aaaaaf)"
1894
+ },
1895
+ {
1896
+ code: "03",
1897
+ title: "Fieldnotes",
1898
+ type: "Writing app",
1899
+ result: "2025",
1900
+ tone: "linear-gradient(145deg,#f1eadc,#d2b88d)"
1901
+ },
1902
+ {
1903
+ code: "04",
1904
+ title: "Relay",
1905
+ type: "Developer tool",
1906
+ result: "2025",
1907
+ tone: "linear-gradient(145deg,#dff5e8,#83c7a1)"
1908
+ }
1909
+ ], d = (r) => {
1910
+ b(r), w.fromTo(
1911
+ u.current,
1912
+ { clipPath: "inset(12% 12% 12% 12% round 2rem)", scale: 0.94, rotateY: -7, opacity: 0.35 },
1913
+ {
1914
+ clipPath: "inset(0% 0% 0% 0% round 1.6rem)",
1915
+ scale: 1,
1916
+ rotateY: 0,
1917
+ opacity: 1,
1918
+ duration: 0.72,
1919
+ ease: "power4.out",
1920
+ overwrite: !0
1921
+ }
1922
+ );
1923
+ }, i = g[o];
1924
+ return /* @__PURE__ */ e("div", { className: "flex min-h-[31rem] w-full items-center justify-center p-4 [perspective:1200px]", children: /* @__PURE__ */ n("section", { className: "grid w-full max-w-[44rem] gap-3 rounded-[2.2rem] border border-black/[.08] bg-[#f5f5f7]/88 p-3 text-[#111] shadow-[0_32px_90px_rgba(0,0,0,.12)] backdrop-blur-2xl md:grid-cols-[.82fr_1.18fr]", children: [
1925
+ /* @__PURE__ */ n("div", { className: "flex min-h-[22rem] flex-col justify-between p-4", children: [
1926
+ /* @__PURE__ */ n("header", { children: [
1927
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] uppercase tracking-[.18em] text-black/35", children: "Work" }),
1928
+ /* @__PURE__ */ e("h3", { className: "mt-2 text-2xl font-semibold tracking-[-.055em]", children: "Projects" })
1929
+ ] }),
1930
+ /* @__PURE__ */ e("nav", { "aria-label": "Projects", className: "my-6", children: g.map((r, s) => /* @__PURE__ */ n(
1931
+ "a",
1932
+ {
1933
+ href: `#${r.title.toLowerCase()}-case-study`,
1934
+ onPointerEnter: () => d(s),
1935
+ onFocus: () => d(s),
1936
+ onClick: () => d(s),
1937
+ "aria-current": o === s ? "page" : void 0,
1938
+ className: `group flex items-center gap-3 border-b border-black/[.08] py-3 text-[14px] no-underline transition-colors ${o === s ? "text-black" : "text-black/30 hover:text-black/70"}`,
1939
+ children: [
1940
+ /* @__PURE__ */ e("span", { className: "w-5 font-mono text-[8px]", children: r.code }),
1941
+ /* @__PURE__ */ e("strong", { className: "font-medium", children: r.title }),
1942
+ /* @__PURE__ */ e(
1943
+ I,
1944
+ {
1945
+ size: 14,
1946
+ className: `ml-auto transition-transform ${o === s ? "translate-x-0 opacity-100" : "-translate-x-2 opacity-0"}`
1947
+ }
1948
+ )
1949
+ ]
1950
+ },
1951
+ r.title
1952
+ )) }),
1953
+ /* @__PURE__ */ e("span", { className: "text-[10px] text-black/35", children: "Hover to preview." })
1954
+ ] }),
1955
+ /* @__PURE__ */ n(
1956
+ "div",
1957
+ {
1958
+ ref: u,
1959
+ onPointerMove: (r) => {
1960
+ const s = r.currentTarget.getBoundingClientRect();
1961
+ w.to(u.current, {
1962
+ rotateY: ((r.clientX - s.left) / s.width - 0.5) * 5,
1963
+ rotateX: ((r.clientY - s.top) / s.height - 0.5) * -4,
1964
+ duration: 0.55,
1965
+ ease: "power3.out"
1966
+ });
1967
+ },
1968
+ onPointerLeave: () => w.to(u.current, { rotateX: 0, rotateY: 0, duration: 0.8, ease: "elastic.out(1,.6)" }),
1969
+ className: "relative min-h-[22rem] overflow-hidden rounded-[1.6rem] border border-black/[.08] p-5 [transform-style:preserve-3d]",
1970
+ style: { background: i.tone },
1971
+ children: [
1972
+ /* @__PURE__ */ e("div", { className: "absolute -right-10 top-[18%] h-64 w-48 rotate-6 rounded-[2.8rem] border border-white/55 bg-white/25 shadow-[0_26px_60px_rgba(40,40,80,.15)] backdrop-blur-xl", children: /* @__PURE__ */ e("div", { className: "m-4 h-24 rounded-[1.5rem] bg-black/[.08]" }) }),
1973
+ /* @__PURE__ */ n("div", { className: "relative flex h-full flex-col justify-between", children: [
1974
+ /* @__PURE__ */ n("span", { className: "font-mono text-[9px] uppercase tracking-[.16em] text-black/38", children: [
1975
+ "Project / ",
1976
+ i.code
1977
+ ] }),
1978
+ /* @__PURE__ */ n("div", { children: [
1979
+ /* @__PURE__ */ e("span", { className: "text-[11px] text-black/42", children: i.type }),
1980
+ /* @__PURE__ */ e("h4", { className: "mt-1 text-[2.8rem] font-semibold tracking-[-.075em]", children: i.title }),
1981
+ /* @__PURE__ */ e("strong", { className: "mt-2 block font-mono text-[9px] uppercase tracking-[.13em] text-black/46", children: i.result })
1982
+ ] })
1983
+ ] })
1984
+ ]
1985
+ }
1986
+ )
1987
+ ] }) });
1988
+ }
1989
+ function gt() {
1990
+ const [o, b] = S(!1), [u, g] = S(!1), d = v(null), i = v(null), r = v(null), s = v(!1), t = v(null);
1991
+ return L(
1992
+ () => () => {
1993
+ var c;
1994
+ (c = t.current) == null || c.kill(), w.killTweensOf([d.current, i.current]);
1995
+ },
1996
+ []
1997
+ ), /* @__PURE__ */ e("div", { className: "flex min-h-[30rem] w-full items-center justify-center p-5", children: /* @__PURE__ */ n(
1998
+ "section",
1999
+ {
2000
+ ref: d,
2001
+ className: "relative h-[78px] w-full max-w-[28rem] overflow-hidden rounded-[2rem] border border-white/70 bg-white/55 text-[#111] shadow-[inset_0_1px_0_rgba(255,255,255,.9),0_28px_80px_rgba(25,25,35,.16)] backdrop-blur-[28px]",
2002
+ children: [
2003
+ /* @__PURE__ */ n("div", { className: "flex h-[78px] items-center gap-3 px-3 pl-5", children: [
2004
+ /* @__PURE__ */ e("span", { className: "relative h-3 w-3 rounded-full bg-[#30c466] shadow-[0_0_0_6px_rgba(48,196,102,.12)]", children: /* @__PURE__ */ e("i", { className: "absolute inset-0 animate-ping rounded-full bg-[#30c466]/40" }) }),
2005
+ /* @__PURE__ */ n("div", { className: "min-w-0 flex-1", children: [
2006
+ /* @__PURE__ */ e("strong", { className: "block text-[13px] font-semibold", children: "Available for work" }),
2007
+ /* @__PURE__ */ e("span", { className: "text-[10px] text-black/42", children: "UTC +8" })
2008
+ ] }),
2009
+ /* @__PURE__ */ e(
2010
+ "button",
2011
+ {
2012
+ onClick: () => {
2013
+ var h;
2014
+ const c = !s.current, l = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
2015
+ s.current = c, b(c), (h = t.current) == null || h.kill(), w.killTweensOf([d.current, i.current]);
2016
+ const x = w.timeline();
2017
+ t.current = x, c ? x.to(d.current, { height: 272, duration: l ? 0.01 : 0.42, ease: "expo.out" }, 0).to(
2018
+ i.current,
2019
+ { opacity: 1, y: 0, duration: l ? 0.01 : 0.24, ease: "power3.out", pointerEvents: "auto" },
2020
+ l ? 0 : 0.2
2021
+ ) : x.to(
2022
+ i.current,
2023
+ { opacity: 0, y: 10, duration: l ? 0.01 : 0.14, ease: "power2.out", pointerEvents: "none" },
2024
+ 0
2025
+ ).to(d.current, { height: 78, duration: l ? 0.01 : 0.34, ease: "power4.inOut" }, l ? 0 : 0.06);
2026
+ },
2027
+ "aria-expanded": o,
2028
+ "aria-label": o ? "Close contact options" : "Open contact options",
2029
+ className: "grid h-14 w-14 place-items-center rounded-full bg-black !text-white shadow-[0_10px_24px_rgba(0,0,0,.2)] transition-transform hover:scale-[1.04]",
2030
+ children: o ? /* @__PURE__ */ e(de, { size: 17 }) : /* @__PURE__ */ e(I, { size: 17 })
2031
+ }
2032
+ )
2033
+ ] }),
2034
+ /* @__PURE__ */ e("div", { ref: i, className: "pointer-events-none px-5 pb-5 opacity-0", children: /* @__PURE__ */ n("div", { className: "border-t border-black/10 pt-5", children: [
2035
+ /* @__PURE__ */ e("span", { className: "font-mono text-[8px] uppercase tracking-[.17em] text-black/35", children: "Contact" }),
2036
+ /* @__PURE__ */ e("h3", { className: "mt-3 text-[2rem] font-semibold leading-[.92] tracking-[-.065em]", children: "Let’s work together." }),
2037
+ /* @__PURE__ */ n("div", { className: "mt-5 grid grid-cols-2 gap-2", children: [
2038
+ /* @__PURE__ */ n(
2039
+ "a",
2040
+ {
2041
+ href: "mailto:hello@example.com",
2042
+ className: "flex h-12 items-center justify-center gap-2 rounded-[.9rem] bg-black text-[11px] font-semibold !text-white no-underline",
2043
+ children: [
2044
+ /* @__PURE__ */ e(D, { size: 14 }),
2045
+ "Email me"
2046
+ ]
2047
+ }
2048
+ ),
2049
+ /* @__PURE__ */ n(
2050
+ "button",
2051
+ {
2052
+ ref: r,
2053
+ onClick: async () => {
2054
+ await navigator.clipboard.writeText("hello@example.com"), g(!0), w.fromTo(r.current, { scale: 0.92 }, { scale: 1, duration: 0.65, ease: "elastic.out(1,.55)" }), window.setTimeout(() => g(!1), 1300);
2055
+ },
2056
+ className: "flex h-12 items-center justify-center gap-2 rounded-[.9rem] border border-black/10 bg-white/65 text-[11px] font-semibold",
2057
+ children: [
2058
+ u ? /* @__PURE__ */ e(F, { size: 14 }) : /* @__PURE__ */ e(ue, { size: 14 }),
2059
+ u ? "Copied" : "Copy email"
2060
+ ]
2061
+ }
2062
+ )
2063
+ ] })
2064
+ ] }) })
2065
+ ]
2066
+ }
2067
+ ) });
2068
+ }
2069
+ function xt() {
2070
+ const [o, b] = S(0), [u, g] = S(!1), d = [
2071
+ { label: "Framework", value: "React 19", detail: "Components, routing, and state." },
2072
+ { label: "Animation", value: "GSAP 3.15", detail: "Transitions and pointer interactions." },
2073
+ { label: "Styles", value: "Tailwind 4", detail: "All component styles." },
2074
+ { label: "Runtime", value: "Browser", detail: "No server or database required." }
2075
+ ], i = async () => {
2076
+ await navigator.clipboard.writeText("react@19 gsap@3.15 tailwindcss@4 lucide-react"), g(!0), setTimeout(() => g(!1), 1200);
2077
+ };
2078
+ return /* @__PURE__ */ e("div", { className: "flex min-h-[32rem] w-full items-center justify-center p-5", children: /* @__PURE__ */ n("section", { className: "grid w-full max-w-[42rem] overflow-hidden rounded-[2rem] border border-white/10 bg-[#111] text-white shadow-[0_32px_90px_rgba(0,0,0,.28)] md:grid-cols-[1.1fr_.9fr]", children: [
2079
+ /* @__PURE__ */ n("div", { className: "p-5 sm:p-6", children: [
2080
+ /* @__PURE__ */ n("header", { className: "mb-4 flex items-center justify-between sm:mb-6", children: [
2081
+ /* @__PURE__ */ n("div", { children: [
2082
+ /* @__PURE__ */ e("span", { className: "font-mono text-[9px] uppercase tracking-[.17em] text-white/36", children: "Project" }),
2083
+ /* @__PURE__ */ e("h3", { className: "mt-2 text-2xl font-semibold tracking-[-.05em]", children: "Tech stack" })
2084
+ ] }),
2085
+ /* @__PURE__ */ e(Ce, { size: 20, className: "text-[#c7ff4d]" })
2086
+ ] }),
2087
+ /* @__PURE__ */ e("div", { className: "divide-y divide-white/10 border-y border-white/10", children: d.map((r, s) => /* @__PURE__ */ n(
2088
+ "button",
2089
+ {
2090
+ onClick: () => b(s),
2091
+ "aria-pressed": o === s,
2092
+ className: `grid w-full grid-cols-[1fr_auto] items-center px-1 py-3 text-left transition-colors sm:py-4 ${o === s ? "text-[#c7ff4d]" : "text-white/48 hover:text-white"}`,
2093
+ children: [
2094
+ /* @__PURE__ */ e("span", { className: "text-[12px]", children: r.label }),
2095
+ /* @__PURE__ */ e("strong", { className: "font-mono text-[10px] font-medium", children: r.value })
2096
+ ]
2097
+ },
2098
+ r.label
2099
+ )) }),
2100
+ /* @__PURE__ */ n(
2101
+ "button",
2102
+ {
2103
+ onClick: i,
2104
+ className: "mt-4 flex w-full items-center justify-center gap-2 rounded-[.9rem] border border-white/12 bg-white/[.06] py-3 text-[11px] font-semibold hover:bg-white/[.1] sm:mt-5",
2105
+ children: [
2106
+ u ? /* @__PURE__ */ e(F, { size: 14 }) : /* @__PURE__ */ e(ue, { size: 14 }),
2107
+ u ? "Copied" : "Copy stack"
2108
+ ]
2109
+ }
2110
+ )
2111
+ ] }),
2112
+ /* @__PURE__ */ n("aside", { className: "relative flex min-h-[17rem] flex-col justify-between overflow-hidden bg-[#c7ff4d] p-5 text-[#111] sm:min-h-[24rem] sm:p-6", children: [
2113
+ /* @__PURE__ */ e("div", { className: "absolute -right-12 -top-12 h-40 w-40 rounded-full border-[28px] border-black/[.07]" }),
2114
+ /* @__PURE__ */ n("span", { className: "relative font-mono text-[9px] uppercase tracking-[.17em] text-black/42", children: [
2115
+ "0",
2116
+ o + 1,
2117
+ " / 04"
2118
+ ] }),
2119
+ /* @__PURE__ */ n("div", { className: "relative", children: [
2120
+ /* @__PURE__ */ e("strong", { className: "block text-[2.7rem] tracking-[-.08em] sm:text-[3.2rem]", children: d[o].value }),
2121
+ /* @__PURE__ */ e("h4", { className: "mt-2 text-[14px] font-semibold", children: d[o].label }),
2122
+ /* @__PURE__ */ e("p", { className: "mt-3 text-[12px] leading-5 text-black/58", children: d[o].detail })
2123
+ ] }),
2124
+ /* @__PURE__ */ n("div", { className: "relative flex items-center justify-between border-t border-black/15 pt-4 font-mono text-[8px] uppercase tracking-[.14em]", children: [
2125
+ /* @__PURE__ */ e("span", { children: "Ready to use" }),
2126
+ /* @__PURE__ */ e(F, { size: 14 })
2127
+ ] })
2128
+ ] })
2129
+ ] }) });
2130
+ }
2131
+ function Dt() {
2132
+ const o = [
2133
+ {
2134
+ id: "index",
2135
+ label: "Index",
2136
+ icon: pe,
2137
+ number: "01",
2138
+ accent: "#ff6b48",
2139
+ title: "Begin with intent.",
2140
+ note: "An editorial entrance to the work, the point of view, and what is happening now.",
2141
+ links: ["Manifesto", "Selected work", "Now"]
2142
+ },
2143
+ {
2144
+ id: "work",
2145
+ label: "Work",
2146
+ icon: me,
2147
+ number: "02",
2148
+ accent: "#776cff",
2149
+ title: "Selected outcomes.",
2150
+ note: "Case studies arranged by consequence rather than chronology or visual noise.",
2151
+ links: ["Northstar", "Field Notes", "Relay"]
2152
+ },
2153
+ {
2154
+ id: "profile",
2155
+ label: "Profile",
2156
+ icon: fe,
2157
+ number: "03",
2158
+ accent: "#00a77f",
2159
+ title: "The person in context.",
2160
+ note: "A compact route through principles, capabilities, and the way the work gets made.",
2161
+ links: ["Story", "Capabilities", "Principles"]
2162
+ },
2163
+ {
2164
+ id: "connect",
2165
+ label: "Connect",
2166
+ icon: D,
2167
+ number: "04",
2168
+ accent: "#d89b15",
2169
+ title: "Make the next move.",
2170
+ note: "Availability, direct contact, and the few details needed to start a useful conversation.",
2171
+ links: ["Availability", "Email", "GitHub"]
2172
+ }
2173
+ ], [b, u] = S("index"), [g, d] = S(1), i = v(0), r = v(null), s = v(null), t = v(null), p = v(null), f = v(null), c = typeof window < "u" && window.matchMedia("(prefers-reduced-motion: reduce)").matches, l = o.find((h) => h.id === b), x = (h) => {
2174
+ const m = o.findIndex((y) => y.id === h);
2175
+ if (b === h) {
2176
+ u(null);
2177
+ return;
2178
+ }
2179
+ d(m >= i.current ? 1 : -1), i.current = m, u(h);
2180
+ };
2181
+ return ee(() => {
2182
+ var y, C;
2183
+ if (!r.current) return;
2184
+ const h = b === null ? 72 : (((y = s.current) == null ? void 0 : y.scrollHeight) ?? 250) + 72;
2185
+ w.to(r.current, {
2186
+ height: h,
2187
+ duration: c ? 0.01 : 0.7,
2188
+ ease: b === null ? "power4.inOut" : "elastic.out(1,.8)",
2189
+ overwrite: !0
2190
+ });
2191
+ const m = b ? (C = t.current) == null ? void 0 : C.querySelector(`button[data-route-lens="${b}"]`) : null;
2192
+ if (m && t.current && p.current && l) {
2193
+ const N = t.current.getBoundingClientRect(), a = m.getBoundingClientRect();
2194
+ w.to(p.current, {
2195
+ x: a.left - N.left,
2196
+ width: a.width,
2197
+ opacity: 1,
2198
+ backgroundColor: l.accent,
2199
+ duration: c ? 0.01 : 0.76,
2200
+ ease: "elastic.out(1,.62)",
2201
+ overwrite: !0
2202
+ });
2203
+ const k = m.querySelector("[data-route-label]");
2204
+ if (k && w.fromTo(
2205
+ k,
2206
+ { width: 0, opacity: 0, x: -5 },
2207
+ {
2208
+ width: "auto",
2209
+ opacity: 1,
2210
+ x: 0,
2211
+ duration: c ? 0.01 : 0.36,
2212
+ delay: c ? 0 : 0.08,
2213
+ ease: "power3.out"
2214
+ }
2215
+ ), f.current && r.current) {
2216
+ const _ = r.current.getBoundingClientRect(), T = f.current.getBoundingClientRect().width, M = a.left + a.width / 2 - _.left - T / 2;
2217
+ w.to(f.current, {
2218
+ x: M,
2219
+ rotate: g * 8,
2220
+ scale: 1,
2221
+ opacity: 0.86,
2222
+ duration: c ? 0.01 : 0.9,
2223
+ ease: "elastic.out(1,.68)",
2224
+ overwrite: !0
2225
+ });
2226
+ }
2227
+ } else
2228
+ w.to([p.current, f.current], { opacity: 0, duration: c ? 0.01 : 0.2 });
2229
+ if (b && s.current) {
2230
+ const N = s.current.querySelector("[data-route-copy]"), a = s.current.querySelectorAll("[data-route-link]");
2231
+ w.fromTo(
2232
+ N,
2233
+ { x: g * 24, opacity: 0, filter: "blur(7px)" },
2234
+ { x: 0, opacity: 1, filter: "blur(0px)", duration: c ? 0.01 : 0.5, ease: "power4.out" }
2235
+ ), w.fromTo(
2236
+ a,
2237
+ { y: 12, opacity: 0 },
2238
+ {
2239
+ y: 0,
2240
+ opacity: 1,
2241
+ duration: c ? 0.01 : 0.42,
2242
+ stagger: c ? 0 : 0.055,
2243
+ delay: c ? 0 : 0.1,
2244
+ ease: "power3.out"
2245
+ }
2246
+ );
2247
+ }
2248
+ }, [b, g, c, l]), /* @__PURE__ */ e("div", { className: "flex min-h-[36rem] w-full items-end justify-center overflow-hidden bg-[radial-gradient(circle_at_20%_15%,rgba(119,108,255,.26),transparent_32%),radial-gradient(circle_at_84%_78%,rgba(255,107,72,.22),transparent_31%),#11131a] p-4 sm:p-8", children: /* @__PURE__ */ n(
2249
+ "section",
2250
+ {
2251
+ ref: r,
2252
+ className: "relative h-[21rem] w-full max-w-[40rem] overflow-hidden rounded-[2rem] border border-white/20 bg-[#f5f4ef]/95 text-[#171717] shadow-[inset_0_1px_0_#fff,0_34px_100px_rgba(0,0,0,.32)] backdrop-blur-2xl",
2253
+ children: [
2254
+ /* @__PURE__ */ n("div", { className: "absolute inset-x-0 top-0 bottom-[72px] overflow-hidden", children: [
2255
+ /* @__PURE__ */ e(
2256
+ "span",
2257
+ {
2258
+ ref: f,
2259
+ "aria-hidden": "true",
2260
+ className: "pointer-events-none absolute -left-0 top-5 h-36 w-36 rounded-full opacity-0 blur-[1px]",
2261
+ style: {
2262
+ background: `radial-gradient(circle at 34% 28%, rgba(255,255,255,.95), ${(l == null ? void 0 : l.accent) ?? "#999"}55 44%, ${(l == null ? void 0 : l.accent) ?? "#999"}18 68%, transparent 70%)`,
2263
+ boxShadow: `inset 0 0 0 1px ${(l == null ? void 0 : l.accent) ?? "#999"}55, 0 22px 45px ${(l == null ? void 0 : l.accent) ?? "#999"}1f`
2264
+ }
2265
+ }
2266
+ ),
2267
+ l && /* @__PURE__ */ n(
2268
+ "div",
2269
+ {
2270
+ ref: s,
2271
+ className: "relative grid min-h-[16rem] gap-6 p-5 sm:grid-cols-[1.1fr_.9fr] sm:p-6",
2272
+ role: "tabpanel",
2273
+ "aria-live": "polite",
2274
+ children: [
2275
+ /* @__PURE__ */ n("div", { "data-route-copy": !0, className: "relative z-10 flex min-w-0 flex-col justify-between", children: [
2276
+ /* @__PURE__ */ n("div", { children: [
2277
+ /* @__PURE__ */ n("span", { className: "font-mono text-[8px] uppercase tracking-[.18em] text-black/34", children: [
2278
+ "Route ",
2279
+ l.number,
2280
+ " · Portfolio"
2281
+ ] }),
2282
+ /* @__PURE__ */ e("h3", { className: "mt-5 max-w-[18rem] text-[2.65rem] font-semibold leading-[.91] tracking-[-.075em]", children: l.title }),
2283
+ /* @__PURE__ */ e("p", { className: "mt-4 max-w-[20rem] text-[10px] leading-[1.55] text-black/46", children: l.note })
2284
+ ] }),
2285
+ /* @__PURE__ */ n(
2286
+ "a",
2287
+ {
2288
+ href: `#${l.id}`,
2289
+ className: "mt-6 inline-flex w-fit items-center gap-2 text-[10px] font-semibold !text-black no-underline",
2290
+ children: [
2291
+ "Enter ",
2292
+ l.label.toLowerCase(),
2293
+ " ",
2294
+ /* @__PURE__ */ e(I, { size: 14 })
2295
+ ]
2296
+ }
2297
+ )
2298
+ ] }),
2299
+ /* @__PURE__ */ n("div", { className: "relative z-10 self-end rounded-[1.45rem] border border-black/[.08] bg-white/60 p-2 shadow-[0_16px_45px_rgba(34,35,46,.08)] backdrop-blur-xl", children: [
2300
+ /* @__PURE__ */ n("div", { className: "flex items-center justify-between px-3 pb-3 pt-2", children: [
2301
+ /* @__PURE__ */ e("span", { className: "font-mono text-[8px] uppercase tracking-[.16em] text-black/32", children: "Inside this route" }),
2302
+ /* @__PURE__ */ e(
2303
+ "span",
2304
+ {
2305
+ className: "h-2 w-2 rounded-full",
2306
+ style: { backgroundColor: l.accent, boxShadow: `0 0 0 5px ${l.accent}1b` }
2307
+ }
2308
+ )
2309
+ ] }),
2310
+ l.links.map((h, m) => /* @__PURE__ */ n(
2311
+ "button",
2312
+ {
2313
+ "data-route-link": !0,
2314
+ className: "group grid w-full grid-cols-[24px_1fr_auto] items-center rounded-xl px-3 py-2.5 text-left transition-colors hover:bg-black/[.045]",
2315
+ children: [
2316
+ /* @__PURE__ */ n("span", { className: "font-mono text-[7px] text-black/26", children: [
2317
+ "0",
2318
+ m + 1
2319
+ ] }),
2320
+ /* @__PURE__ */ e("strong", { className: "text-[10px] font-semibold", children: h }),
2321
+ /* @__PURE__ */ e(
2322
+ he,
2323
+ {
2324
+ size: 12,
2325
+ className: "text-black/25 transition-transform group-hover:translate-x-1 group-hover:text-black"
2326
+ }
2327
+ )
2328
+ ]
2329
+ },
2330
+ h
2331
+ ))
2332
+ ] })
2333
+ ]
2334
+ },
2335
+ l.id
2336
+ )
2337
+ ] }),
2338
+ /* @__PURE__ */ n(
2339
+ "nav",
2340
+ {
2341
+ ref: t,
2342
+ "aria-label": "Route Lens navigation",
2343
+ className: "absolute inset-x-2 bottom-2 flex h-14 rounded-[1.35rem] bg-[#151515] p-1.5 text-white shadow-[0_14px_32px_rgba(0,0,0,.24)]",
2344
+ children: [
2345
+ /* @__PURE__ */ e(
2346
+ "span",
2347
+ {
2348
+ ref: p,
2349
+ "aria-hidden": "true",
2350
+ className: "pointer-events-none absolute bottom-1.5 left-0 top-1.5 rounded-[.95rem]"
2351
+ }
2352
+ ),
2353
+ o.map((h) => {
2354
+ const m = h.icon, y = b === h.id;
2355
+ return /* @__PURE__ */ n(
2356
+ "button",
2357
+ {
2358
+ "data-route-lens": h.id,
2359
+ onClick: () => x(h.id),
2360
+ role: "tab",
2361
+ "aria-label": h.label,
2362
+ "aria-selected": y,
2363
+ style: { flexGrow: y ? 1.75 : 1 },
2364
+ className: `relative z-10 flex min-w-0 basis-0 items-center justify-center gap-2 overflow-hidden rounded-[.95rem] px-2 transition-[flex-grow,color] duration-500 ease-out ${y ? "text-white" : "text-white/42 hover:text-white"}`,
2365
+ children: [
2366
+ /* @__PURE__ */ e(m, { size: 14, className: "shrink-0" }),
2367
+ y && /* @__PURE__ */ e("strong", { "data-route-label": !0, className: "overflow-hidden whitespace-nowrap text-[10px] font-semibold", children: h.label })
2368
+ ]
2369
+ },
2370
+ h.id
2371
+ );
2372
+ })
2373
+ ]
2374
+ }
2375
+ )
2376
+ ]
2377
+ }
2378
+ ) });
2379
+ }
2380
+ const wt = $(
2381
+ () => Promise.resolve().then(() => ot).then((o) => ({ default: o.ExpandableTab }))
2382
+ ), yt = $(() => Promise.resolve().then(() => je)), vt = $(() => Promise.resolve().then(() => qe)), kt = $(() => Promise.resolve().then(() => Ie)), Nt = $(() => Promise.resolve().then(() => it)), _t = $(() => Promise.resolve().then(() => lt)), Ct = $(() => Promise.resolve().then(() => dt)), St = $(() => Promise.resolve().then(() => pt)), H = /* @__PURE__ */ e("div", { className: "showcase-fullbleed h-full min-h-[38rem] w-full bg-[#f3f3f5]", "aria-label": "Loading component" }), W = /* @__PURE__ */ e("div", { className: "h-16 w-[236px] opacity-0", "aria-label": "Loading component" }), Pt = () => new Promise((o) => window.setTimeout(o, 420));
2383
+ function J({ children: o }) {
2384
+ return /* @__PURE__ */ e("div", { className: "flex h-[clamp(22rem,58vw,38rem)] w-full items-center justify-center bg-transparent p-8", children: o });
2385
+ }
2386
+ function Mt() {
2387
+ return /* @__PURE__ */ e(R, { fallback: H, children: /* @__PURE__ */ e(_t, {}) });
2388
+ }
2389
+ function Tt() {
2390
+ return /* @__PURE__ */ e(R, { fallback: H, children: /* @__PURE__ */ e(Ct, {}) });
2391
+ }
2392
+ function zt() {
2393
+ return /* @__PURE__ */ e(R, { fallback: H, children: /* @__PURE__ */ e(St, {}) });
2394
+ }
2395
+ function qt({
2396
+ id: o,
2397
+ textMotionVariant: b = "lift"
2398
+ }) {
2399
+ return o === "text-motion" ? /* @__PURE__ */ e(R, { fallback: H, children: /* @__PURE__ */ e(Nt, { variant: b }) }) : o === "lens-dock" ? /* @__PURE__ */ e(mt, {}) : o === "refraction-card" ? /* @__PURE__ */ e(ft, {}) : o === "mercury-tabs" ? /* @__PURE__ */ e(ht, {}) : o === "viscous-reel" ? /* @__PURE__ */ e(bt, {}) : o === "prism-contact" ? /* @__PURE__ */ e(gt, {}) : o === "glass-code" ? /* @__PURE__ */ e(xt, {}) : o === "expandable-tab" ? /* @__PURE__ */ e(R, { fallback: W, children: /* @__PURE__ */ e(wt, {}) }) : o === "click-key" ? /* @__PURE__ */ e(J, { children: /* @__PURE__ */ e(R, { fallback: W, children: /* @__PURE__ */ e(yt, { onAction: Pt }) }) }) : o === "resume-download" ? /* @__PURE__ */ e(J, { children: /* @__PURE__ */ e(R, { fallback: W, children: /* @__PURE__ */ e(vt, { href: "/resume-demo.txt", filename: "resume-demo.txt", fileLabel: "Demo file · 1 KB" }) }) }) : o === "copy-link" ? /* @__PURE__ */ e(J, { children: /* @__PURE__ */ e(R, { fallback: W, children: /* @__PURE__ */ e(kt, {}) }) }) : o === "liquid-mesh" ? /* @__PURE__ */ e(Mt, {}) : o === "chromatic-lens" ? /* @__PURE__ */ e(Tt, {}) : /* @__PURE__ */ e(zt, {});
2400
+ }
2401
+ export {
2402
+ ze as ClickKey,
2403
+ gt as ContactCard,
2404
+ Ae as CopyLinkButton,
2405
+ nt as ExpandableTab,
2406
+ ct as HalftoneBackground,
2407
+ ut as LightBackground,
2408
+ Xt as LiquidGlassCard,
2409
+ Bt as LiquidGlassDefs,
2410
+ mt as PortfolioNav,
2411
+ qt as PortfolioPiece,
2412
+ ft as ProjectCard,
2413
+ bt as ProjectList,
2414
+ De as ResumeDownloadButton,
2415
+ Dt as RouteLens,
2416
+ st as SilkBackground,
2417
+ ht as SkillsList,
2418
+ xt as TechStack,
2419
+ ie as TextMotion
2420
+ };