@nous-research/ui 0.4.0 → 0.6.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/hooks/use-smooth-controls.d.ts.map +1 -1
- package/dist/hooks/use-smooth-controls.js +16 -0
- package/dist/hooks/use-smooth-controls.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/ui/components/button.d.ts +4 -1
- package/dist/ui/components/button.d.ts.map +1 -1
- package/dist/ui/components/button.js +58 -13
- package/dist/ui/components/button.js.map +1 -1
- package/dist/ui/components/grid/grid.css +2 -1
- package/dist/ui/components/image-distortion.d.ts +8 -1
- package/dist/ui/components/image-distortion.d.ts.map +1 -1
- package/dist/ui/components/image-distortion.js +62 -4
- package/dist/ui/components/image-distortion.js.map +1 -1
- package/dist/ui/components/overlays/index.d.ts +17 -3
- package/dist/ui/components/overlays/index.d.ts.map +1 -1
- package/dist/ui/components/overlays/index.js +48 -28
- package/dist/ui/components/overlays/index.js.map +1 -1
- package/dist/ui/components/poster.d.ts +63 -0
- package/dist/ui/components/poster.d.ts.map +1 -0
- package/dist/ui/components/poster.js +102 -0
- package/dist/ui/components/poster.js.map +1 -0
- package/dist/ui/components/tier-card.d.ts +54 -0
- package/dist/ui/components/tier-card.d.ts.map +1 -0
- package/dist/ui/components/tier-card.js +26 -0
- package/dist/ui/components/tier-card.js.map +1 -0
- package/dist/ui/globals.css +7 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-smooth-controls.d.ts","sourceRoot":"","sources":["../../src/hooks/use-smooth-controls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,WAAW,EAAE,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAQ,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAqBpD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,CAAC,EACd,OAAO,CAAC,EAAE,wBAAwB,EAClC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,MAEpC,CAAC;WAAoC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"use-smooth-controls.d.ts","sourceRoot":"","sources":["../../src/hooks/use-smooth-controls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,WAAW,EAAE,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAQ,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAqBpD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,CAAC,EACd,OAAO,CAAC,EAAE,wBAAwB,EAClC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,MAEpC,CAAC;WAAoC,MAAM,CAAC;iBAoPzD;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,GAAG,EACpC,OAAO,MAAM,EACb,KAAK,MAAM,KACV,SAAS,GAAG,YAAY,CAAC,CAAC,CACqC,CAAA;AAElE,eAAO,MAAM,eAAe,GAAI,CAAC,GAAG,GAAG,EACrC,OAAO,MAAM,EACb,KAAK,MAAM,EACX,OAAO,CAAC,EACR,UAAU;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,SAwBnD,CAAA;AAED,KAAK,wBAAwB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA"}
|
|
@@ -15,11 +15,18 @@ const randNum = (v) => typeof v === 'object' && ('min' in v || 'max' in v)
|
|
|
15
15
|
export function useSmoothControls(label, initialArgs, options, dependencies) {
|
|
16
16
|
const entries = useMemo(() => Object.entries(initialArgs ?? {}), [initialArgs]);
|
|
17
17
|
const values = useMemo(() => entries.filter(([, v]) => !/button|folder/i.test(v?.type)), [entries]);
|
|
18
|
+
// Tracks whether this component instance has mounted yet. When a remount
|
|
19
|
+
// happens (e.g. Storybook changing a `key` prop to force a lens reset), we
|
|
20
|
+
// want the module-scoped atoms to be reseeded from the new `initialArgs` so
|
|
21
|
+
// the first paint reflects the newly-selected preset — not leftover values
|
|
22
|
+
// from the previous mount.
|
|
23
|
+
const mountedRef = useRef(false);
|
|
18
24
|
const atoms = useMemo(() => {
|
|
19
25
|
const map = atomRegistry.get(label) ?? new Map();
|
|
20
26
|
if (!atomRegistry.has(label)) {
|
|
21
27
|
atomRegistry.set(label, map);
|
|
22
28
|
}
|
|
29
|
+
const freshMount = !mountedRef.current;
|
|
23
30
|
entries.forEach(([k, v]) => {
|
|
24
31
|
if (v?.schema) {
|
|
25
32
|
Object.keys(v.schema).forEach(sk => {
|
|
@@ -27,14 +34,23 @@ export function useSmoothControls(label, initialArgs, options, dependencies) {
|
|
|
27
34
|
if (!map.has(key)) {
|
|
28
35
|
map.set(key, atom(val(v.schema[sk])));
|
|
29
36
|
}
|
|
37
|
+
else if (freshMount) {
|
|
38
|
+
map.get(key).set(val(v.schema[sk]));
|
|
39
|
+
}
|
|
30
40
|
});
|
|
31
41
|
}
|
|
32
42
|
else if (!map.has(k)) {
|
|
33
43
|
map.set(k, atom(val(v)));
|
|
34
44
|
}
|
|
45
|
+
else if (freshMount) {
|
|
46
|
+
map.get(k).set(val(v));
|
|
47
|
+
}
|
|
35
48
|
});
|
|
36
49
|
return map;
|
|
37
50
|
}, [label, entries]);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
mountedRef.current = true;
|
|
53
|
+
}, []);
|
|
38
54
|
const hydrate = useCallback(() => Object.fromEntries(entries.flatMap(([k, v]) => v?.schema
|
|
39
55
|
? Object.entries(v.schema).map(([k0, v0]) => [
|
|
40
56
|
k0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-smooth-controls.js","sourceRoot":"","sources":["../../src/hooks/use-smooth-controls.ts"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport gsap from 'gsap'\nimport { buttonGroup, useControls } from 'leva'\nimport { atom, type WritableAtom } from 'nanostores'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nconst atomRegistry = new Map<string, Map<string, WritableAtom<any>>>()\n\nconst val = (v: any) =>\n v && typeof v === 'object' && 'value' in v ? v.value : v\n\nconst isHex = (v: any) =>\n /color/i.test(v?.type) || /^#[0-9a-f]{3,8}$/i.test(val(v))\n\nconst randHex = () =>\n `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`\n\nconst randNum = (v: any) =>\n typeof v === 'object' && ('min' in v || 'max' in v)\n ? gsap.utils.random(v.min ?? 0, v.max ?? 1, v.step ?? 0.01)\n : gsap.utils.random(0, 1)\n\nexport function useSmoothControls<T extends Record<string, any>>(\n label: string,\n initialArgs: T,\n options?: UseSmoothControlsOptions,\n dependencies?: Parameters<typeof useControls>[3]\n) {\n type R = { [K in keyof T]: T[K] extends { value: infer V } ? V : never }\n\n const entries = useMemo(\n () => Object.entries(initialArgs ?? {}),\n [initialArgs]\n )\n\n const values = useMemo(\n () => entries.filter(([, v]) => !/button|folder/i.test(v?.type)),\n [entries]\n )\n\n const atoms = useMemo(() => {\n const map = atomRegistry.get(label) ?? new Map<string, WritableAtom<any>>()\n\n if (!atomRegistry.has(label)) {\n atomRegistry.set(label, map)\n }\n\n entries.forEach(([k, v]) => {\n if (v?.schema) {\n Object.keys(v.schema).forEach(sk => {\n const key = `${k}.${sk}`\n\n if (!map.has(key)) {\n map.set(key, atom(val(v.schema[sk])))\n }\n })\n } else if (!map.has(k)) {\n map.set(k, atom(val(v)))\n }\n })\n\n return map\n }, [label, entries])\n\n const hydrate = useCallback(\n () =>\n Object.fromEntries(\n entries.flatMap(([k, v]) =>\n v?.schema\n ? Object.entries(v.schema).map(([k0, v0]: [string, any]) => [\n k0,\n atoms.get(`${k}.${k0}`)?.get() ?? val(v0)\n ])\n : [[k, atoms.get(k)?.get() ?? val(v)]]\n )\n ) as R,\n [entries, atoms]\n )\n\n const [args, update] = useState<R>(hydrate)\n const setRef = useRef<((values: Partial<R>) => void) | null>(null)\n const atomVals = useRef<Record<string, any>>({})\n const fromAtom = useRef(false)\n const fromControl = useRef<Set<string>>(new Set())\n\n useEffect(() => {\n if (Object.keys(args).length !== Object.keys(initialArgs).length) {\n update(hydrate)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialArgs, args])\n\n useEffect(() => {\n if (!setRef.current) {\n return\n }\n\n const unsubs: Array<() => void> = []\n let ready = false\n const initTimeout = setTimeout(() => (ready = true), 100)\n\n const subscribe = (fullKey: string, updateFn: (v: any) => void) => {\n const a = atoms.get(fullKey)\n\n if (!a) {\n return\n }\n\n unsubs.push(\n a.subscribe(v => {\n const prev = atomVals.current[fullKey]\n atomVals.current[fullKey] = v\n\n if (\n setRef.current &&\n ready &&\n prev !== v &&\n !fromControl.current.has(fullKey)\n ) {\n fromAtom.current = true\n\n try {\n updateFn(v)\n } catch {\n //\n }\n\n setTimeout(() => (fromAtom.current = false), 0)\n }\n })\n )\n\n atomVals.current[fullKey] = a.get()\n }\n\n entries.forEach(([k, v]) => {\n if (v?.schema) {\n Object.keys(v.schema).forEach(sk => {\n subscribe(`${k}.${sk}`, v => {\n try {\n setRef.current!({\n [k]: { ...((args[k] as any) ?? {}), [sk]: v }\n } as Partial<R>)\n } catch {\n //\n }\n\n update(st => ({\n ...st,\n [k]: { ...((st[k] as any) ?? {}), [sk]: v }\n }))\n })\n })\n } else {\n subscribe(k, v => {\n try {\n setRef.current!({ [k]: v } as Partial<R>)\n } catch {\n //\n }\n\n update(st => ({ ...st, [k]: v }))\n })\n }\n })\n\n return () => {\n clearTimeout(initTimeout)\n unsubs.forEach(fn => fn())\n }\n }, [label, entries, atoms, args])\n\n const onChange =\n (k: string, orig?: (e: any, k0?: string) => void) =>\n (e: any, k0?: string) => {\n if (fromAtom.current) {\n return orig?.(e, k0)\n }\n\n const key = k0?.split('.')?.pop() ?? k\n const fullKey = k0 ?? k\n const a = atoms.get(fullKey)\n\n fromControl.current.add(fullKey)\n\n const sync = (v: any) => {\n update(st => ({ ...st, [key]: v }))\n a?.set(v)\n orig?.(v, k0)\n }\n\n if (typeof e === 'number' && args[key] !== e) {\n gsap.to(args, {\n duration: options?.duration ?? 0.35,\n ease: 'circ.out',\n [key]: e,\n onComplete: () => void fromControl.current.delete(fullKey),\n onUpdate: () => {\n fromControl.current.add(fullKey)\n sync(args[key])\n setTimeout(() => fromControl.current.delete(fullKey), 0)\n }\n })\n } else {\n sync(e)\n setTimeout(() => fromControl.current.delete(fullKey), 0)\n }\n }\n\n const [, set] = useControls(\n label,\n () => ({\n ...Object.fromEntries(\n entries.map(([k, v]) =>\n v?.schema\n ? [\n k,\n {\n ...v,\n schema: Object.fromEntries(\n Object.entries(v.schema).map(([sk, sv]: [string, any]) => [\n sk,\n { ...sv!, onChange: onChange(k, sv?.onChange) }\n ])\n )\n }\n ]\n : [k, { ...v, onChange: onChange(k, v?.onChange) }]\n )\n ),\n\n ' ': buttonGroup({\n flatten: () =>\n void set(Object.fromEntries(values.map(([k]) => [k, 0]))),\n randomize: () => {\n set(\n Object.fromEntries(\n values.map(([k, v]) => [k, isHex(v) ? randHex() : randNum(v)])\n )\n )\n options?.onRandomize?.()\n },\n reset: () => {\n set(Object.fromEntries(values.map(([k, v]) => [k, val(v)])))\n options?.onReset?.()\n }\n })\n }),\n { collapsed: true, ...options },\n dependencies ?? []\n )\n\n setRef.current = set\n\n return args\n}\n\nexport const getControlAtom = <T = any>(\n label: string,\n key: string\n): undefined | WritableAtom<T> =>\n atomRegistry.get(label)?.get(key) as undefined | WritableAtom<T>\n\nexport const setControlValue = <T = any>(\n label: string,\n key: string,\n value: T,\n options?: { animate?: boolean; duration?: number }\n) => {\n const a = getControlAtom<T>(label, key)\n\n if (!a) {\n return\n }\n\n if (\n options?.animate &&\n typeof value === 'number' &&\n typeof a.get() === 'number'\n ) {\n const t = { v: a.get() }\n\n gsap.to(t, {\n duration: options.duration ?? 0.35,\n ease: 'circ.out',\n onUpdate: () => a.set(t.v),\n v: value\n })\n } else {\n a.set(value)\n }\n}\n\ntype UseSmoothControlsOptions = Parameters<typeof useControls>[2] & {\n duration?: number\n onRandomize?: () => void\n onReset?: () => void\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-smooth-controls.js","sourceRoot":"","sources":["../../src/hooks/use-smooth-controls.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAqB,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEzE,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0C,CAAA;AAEtE,MAAM,GAAG,GAAG,CAAC,CAAM,EAAE,EAAE,CACrB,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAE1D,MAAM,KAAK,GAAG,CAAC,CAAM,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5D,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;KACrC,QAAQ,CAAC,EAAE,CAAC;KACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AAEvB,MAAM,OAAO,GAAG,CAAC,CAAM,EAAE,EAAE,CACzB,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;IAC3D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAE7B,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,WAAc,EACd,OAAkC,EAClC,YAAgD;IAIhD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,EACvC,CAAC,WAAW,CAAC,CACd,CAAA;IAED,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAChE,CAAC,OAAO,CAAC,CACV,CAAA;IAED,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,2BAA2B;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAA6B,CAAA;QAE3E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC9B,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,OAAO,CAAA;QAEtC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;oBACjC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;oBAExB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBAClB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;oBACvC,CAAC;yBAAM,IAAI,UAAU,EAAE,CAAC;wBACtB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;oBACtC,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;iBAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1B,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACtB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACzB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;IAEpB,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;IAC3B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,OAAO,GAAG,WAAW,CACzB,GAAG,EAAE,CACH,MAAM,CAAC,WAAW,CAChB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACzB,CAAC,EAAE,MAAM;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAgB,EAAE,EAAE,CAAC;YACxD,EAAE;YACF,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;SAC1C,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CACzC,CACG,EACR,CAAC,OAAO,EAAE,KAAK,CAAC,CACjB,CAAA;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAI,OAAO,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAsB,EAAE,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,WAAW,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,CAAC,CAAA;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;YACjE,MAAM,CAAC,OAAO,CAAC,CAAA;QACjB,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAsB,EAAE,CAAA;QACpC,IAAI,KAAK,GAAG,KAAK,CAAA;QACjB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QAEzD,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,QAA0B,EAAE,EAAE;YAChE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAE5B,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAM;YACR,CAAC;YAED,MAAM,CAAC,IAAI,CACT,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;gBACd,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBACtC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBAE7B,IACE,MAAM,CAAC,OAAO;oBACd,KAAK;oBACL,IAAI,KAAK,CAAC;oBACV,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EACjC,CAAC;oBACD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAA;oBAEvB,IAAI,CAAC;wBACH,QAAQ,CAAC,CAAC,CAAC,CAAA;oBACb,CAAC;oBAAC,MAAM,CAAC;wBACP,EAAE;oBACJ,CAAC;oBAED,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;gBACjD,CAAC;YACH,CAAC,CAAC,CACH,CAAA;YAED,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QACrC,CAAC,CAAA;QAED,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;oBACjC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;wBAC1B,IAAI,CAAC;4BACH,MAAM,CAAC,OAAQ,CAAC;gCACd,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAE,IAAI,CAAC,CAAC,CAAS,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;6BAChC,CAAC,CAAA;wBAClB,CAAC;wBAAC,MAAM,CAAC;4BACP,EAAE;wBACJ,CAAC;wBAED,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;4BACZ,GAAG,EAAE;4BACL,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAE,EAAE,CAAC,CAAC,CAAS,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;yBAC5C,CAAC,CAAC,CAAA;oBACL,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;oBACf,IAAI,CAAC;wBACH,MAAM,CAAC,OAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAgB,CAAC,CAAA;oBAC3C,CAAC;oBAAC,MAAM,CAAC;wBACP,EAAE;oBACJ,CAAC;oBAED,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBACnC,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,WAAW,CAAC,CAAA;YACzB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC5B,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAEjC,MAAM,QAAQ,GACZ,CAAC,CAAS,EAAE,IAAoC,EAAE,EAAE,CACpD,CAAC,CAAM,EAAE,EAAW,EAAE,EAAE;QACtB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtB,CAAC;QAED,MAAM,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAE5B,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAEhC,MAAM,IAAI,GAAG,CAAC,CAAM,EAAE,EAAE;YACtB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACnC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;YACT,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACf,CAAC,CAAA;QAED,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;gBACZ,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;gBACnC,IAAI,EAAE,UAAU;gBAChB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACR,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC1D,QAAQ,EAAE,GAAG,EAAE;oBACb,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;oBACf,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1D,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,CAAA;YACP,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC,CAAA;IAEH,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,CACzB,KAAK,EACL,GAAG,EAAE,CAAC,CAAC;QACL,GAAG,MAAM,CAAC,WAAW,CACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC,EAAE,MAAM;YACP,CAAC,CAAC;gBACE,CAAC;gBACD;oBACE,GAAG,CAAC;oBACJ,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAgB,EAAE,EAAE,CAAC;wBACxD,EAAE;wBACF,EAAE,GAAG,EAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE;qBAChD,CAAC,CACH;iBACF;aACF;YACH,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CACtD,CACF;QAED,GAAG,EAAE,WAAW,CAAC;YACf,OAAO,EAAE,GAAG,EAAE,CACZ,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,SAAS,EAAE,GAAG,EAAE;gBACd,GAAG,CACD,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/D,CACF,CAAA;gBACD,OAAO,EAAE,WAAW,EAAE,EAAE,CAAA;YAC1B,CAAC;YACD,KAAK,EAAE,GAAG,EAAE;gBACV,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC5D,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;YACtB,CAAC;SACF,CAAC;KACH,CAAC,EACF,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAC/B,YAAY,IAAI,EAAE,CACnB,CAAA;IAED,MAAM,CAAC,OAAO,GAAG,GAAG,CAAA;IAEpB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAa,EACb,GAAW,EACkB,EAAE,CAC/B,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAgC,CAAA;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAa,EACb,GAAW,EACX,KAAQ,EACR,OAAkD,EAClD,EAAE;IACF,MAAM,CAAC,GAAG,cAAc,CAAI,KAAK,EAAE,GAAG,CAAC,CAAA;IAEvC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAM;IACR,CAAC;IAED,IACE,OAAO,EAAE,OAAO;QAChB,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,QAAQ,EAC3B,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAA;QAExB,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;YAClC,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC,EAAE,KAAK;SACT,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACd,CAAC;AACH,CAAC,CAAA","sourcesContent":["'use client'\n\nimport gsap from 'gsap'\nimport { buttonGroup, useControls } from 'leva'\nimport { atom, type WritableAtom } from 'nanostores'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nconst atomRegistry = new Map<string, Map<string, WritableAtom<any>>>()\n\nconst val = (v: any) =>\n v && typeof v === 'object' && 'value' in v ? v.value : v\n\nconst isHex = (v: any) =>\n /color/i.test(v?.type) || /^#[0-9a-f]{3,8}$/i.test(val(v))\n\nconst randHex = () =>\n `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`\n\nconst randNum = (v: any) =>\n typeof v === 'object' && ('min' in v || 'max' in v)\n ? gsap.utils.random(v.min ?? 0, v.max ?? 1, v.step ?? 0.01)\n : gsap.utils.random(0, 1)\n\nexport function useSmoothControls<T extends Record<string, any>>(\n label: string,\n initialArgs: T,\n options?: UseSmoothControlsOptions,\n dependencies?: Parameters<typeof useControls>[3]\n) {\n type R = { [K in keyof T]: T[K] extends { value: infer V } ? V : never }\n\n const entries = useMemo(\n () => Object.entries(initialArgs ?? {}),\n [initialArgs]\n )\n\n const values = useMemo(\n () => entries.filter(([, v]) => !/button|folder/i.test(v?.type)),\n [entries]\n )\n\n // Tracks whether this component instance has mounted yet. When a remount\n // happens (e.g. Storybook changing a `key` prop to force a lens reset), we\n // want the module-scoped atoms to be reseeded from the new `initialArgs` so\n // the first paint reflects the newly-selected preset — not leftover values\n // from the previous mount.\n const mountedRef = useRef(false)\n\n const atoms = useMemo(() => {\n const map = atomRegistry.get(label) ?? new Map<string, WritableAtom<any>>()\n\n if (!atomRegistry.has(label)) {\n atomRegistry.set(label, map)\n }\n\n const freshMount = !mountedRef.current\n\n entries.forEach(([k, v]) => {\n if (v?.schema) {\n Object.keys(v.schema).forEach(sk => {\n const key = `${k}.${sk}`\n\n if (!map.has(key)) {\n map.set(key, atom(val(v.schema[sk])))\n } else if (freshMount) {\n map.get(key)!.set(val(v.schema[sk]))\n }\n })\n } else if (!map.has(k)) {\n map.set(k, atom(val(v)))\n } else if (freshMount) {\n map.get(k)!.set(val(v))\n }\n })\n\n return map\n }, [label, entries])\n\n useEffect(() => {\n mountedRef.current = true\n }, [])\n\n const hydrate = useCallback(\n () =>\n Object.fromEntries(\n entries.flatMap(([k, v]) =>\n v?.schema\n ? Object.entries(v.schema).map(([k0, v0]: [string, any]) => [\n k0,\n atoms.get(`${k}.${k0}`)?.get() ?? val(v0)\n ])\n : [[k, atoms.get(k)?.get() ?? val(v)]]\n )\n ) as R,\n [entries, atoms]\n )\n\n const [args, update] = useState<R>(hydrate)\n const setRef = useRef<((values: Partial<R>) => void) | null>(null)\n const atomVals = useRef<Record<string, any>>({})\n const fromAtom = useRef(false)\n const fromControl = useRef<Set<string>>(new Set())\n\n useEffect(() => {\n if (Object.keys(args).length !== Object.keys(initialArgs).length) {\n update(hydrate)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialArgs, args])\n\n useEffect(() => {\n if (!setRef.current) {\n return\n }\n\n const unsubs: Array<() => void> = []\n let ready = false\n const initTimeout = setTimeout(() => (ready = true), 100)\n\n const subscribe = (fullKey: string, updateFn: (v: any) => void) => {\n const a = atoms.get(fullKey)\n\n if (!a) {\n return\n }\n\n unsubs.push(\n a.subscribe(v => {\n const prev = atomVals.current[fullKey]\n atomVals.current[fullKey] = v\n\n if (\n setRef.current &&\n ready &&\n prev !== v &&\n !fromControl.current.has(fullKey)\n ) {\n fromAtom.current = true\n\n try {\n updateFn(v)\n } catch {\n //\n }\n\n setTimeout(() => (fromAtom.current = false), 0)\n }\n })\n )\n\n atomVals.current[fullKey] = a.get()\n }\n\n entries.forEach(([k, v]) => {\n if (v?.schema) {\n Object.keys(v.schema).forEach(sk => {\n subscribe(`${k}.${sk}`, v => {\n try {\n setRef.current!({\n [k]: { ...((args[k] as any) ?? {}), [sk]: v }\n } as Partial<R>)\n } catch {\n //\n }\n\n update(st => ({\n ...st,\n [k]: { ...((st[k] as any) ?? {}), [sk]: v }\n }))\n })\n })\n } else {\n subscribe(k, v => {\n try {\n setRef.current!({ [k]: v } as Partial<R>)\n } catch {\n //\n }\n\n update(st => ({ ...st, [k]: v }))\n })\n }\n })\n\n return () => {\n clearTimeout(initTimeout)\n unsubs.forEach(fn => fn())\n }\n }, [label, entries, atoms, args])\n\n const onChange =\n (k: string, orig?: (e: any, k0?: string) => void) =>\n (e: any, k0?: string) => {\n if (fromAtom.current) {\n return orig?.(e, k0)\n }\n\n const key = k0?.split('.')?.pop() ?? k\n const fullKey = k0 ?? k\n const a = atoms.get(fullKey)\n\n fromControl.current.add(fullKey)\n\n const sync = (v: any) => {\n update(st => ({ ...st, [key]: v }))\n a?.set(v)\n orig?.(v, k0)\n }\n\n if (typeof e === 'number' && args[key] !== e) {\n gsap.to(args, {\n duration: options?.duration ?? 0.35,\n ease: 'circ.out',\n [key]: e,\n onComplete: () => void fromControl.current.delete(fullKey),\n onUpdate: () => {\n fromControl.current.add(fullKey)\n sync(args[key])\n setTimeout(() => fromControl.current.delete(fullKey), 0)\n }\n })\n } else {\n sync(e)\n setTimeout(() => fromControl.current.delete(fullKey), 0)\n }\n }\n\n const [, set] = useControls(\n label,\n () => ({\n ...Object.fromEntries(\n entries.map(([k, v]) =>\n v?.schema\n ? [\n k,\n {\n ...v,\n schema: Object.fromEntries(\n Object.entries(v.schema).map(([sk, sv]: [string, any]) => [\n sk,\n { ...sv!, onChange: onChange(k, sv?.onChange) }\n ])\n )\n }\n ]\n : [k, { ...v, onChange: onChange(k, v?.onChange) }]\n )\n ),\n\n ' ': buttonGroup({\n flatten: () =>\n void set(Object.fromEntries(values.map(([k]) => [k, 0]))),\n randomize: () => {\n set(\n Object.fromEntries(\n values.map(([k, v]) => [k, isHex(v) ? randHex() : randNum(v)])\n )\n )\n options?.onRandomize?.()\n },\n reset: () => {\n set(Object.fromEntries(values.map(([k, v]) => [k, val(v)])))\n options?.onReset?.()\n }\n })\n }),\n { collapsed: true, ...options },\n dependencies ?? []\n )\n\n setRef.current = set\n\n return args\n}\n\nexport const getControlAtom = <T = any>(\n label: string,\n key: string\n): undefined | WritableAtom<T> =>\n atomRegistry.get(label)?.get(key) as undefined | WritableAtom<T>\n\nexport const setControlValue = <T = any>(\n label: string,\n key: string,\n value: T,\n options?: { animate?: boolean; duration?: number }\n) => {\n const a = getControlAtom<T>(label, key)\n\n if (!a) {\n return\n }\n\n if (\n options?.animate &&\n typeof value === 'number' &&\n typeof a.get() === 'number'\n ) {\n const t = { v: a.get() }\n\n gsap.to(t, {\n duration: options.duration ?? 0.35,\n ease: 'circ.out',\n onUpdate: () => a.set(t.v),\n v: value\n })\n } else {\n a.set(value)\n }\n}\n\ntype UseSmoothControlsOptions = Parameters<typeof useControls>[2] & {\n duration?: number\n onRandomize?: () => void\n onReset?: () => void\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,8 +15,11 @@ export { Cell, Grid } from './ui/components/grid';
|
|
|
15
15
|
export { HoverBg } from './ui/components/hover-bg';
|
|
16
16
|
export * as Icons from './ui/components/icons';
|
|
17
17
|
export { ImageDistortion } from './ui/components/image-distortion';
|
|
18
|
+
export type { AutoPlayPattern } from './ui/components/image-distortion';
|
|
18
19
|
export { LevaClient } from './ui/components/leva-client';
|
|
19
20
|
export { Modal } from './ui/components/modal';
|
|
21
|
+
export { Poster } from './ui/components/poster';
|
|
22
|
+
export type { PosterAspect, PosterProps, PosterVariant } from './ui/components/poster';
|
|
20
23
|
export { applyLens, LENSES, LENS_0, LENS_5I, toggleLens, $lightMode } from './ui/components/overlays';
|
|
21
24
|
export { Overlays } from './ui/components/overlays';
|
|
22
25
|
export type { LensPreset } from './ui/components/overlays';
|
|
@@ -28,6 +31,8 @@ export { Stats } from './ui/components/stats';
|
|
|
28
31
|
export { TerminalDemo } from './ui/components/terminal-demo';
|
|
29
32
|
export type { TerminalDemoStep } from './ui/components/terminal-demo';
|
|
30
33
|
export { ThemeToggle } from './ui/components/theme-toggle';
|
|
34
|
+
export { TierCard } from './ui/components/tier-card';
|
|
35
|
+
export type { TierCardPrice, TierCardProps } from './ui/components/tier-card';
|
|
31
36
|
export { TV } from './ui/components/tv';
|
|
32
37
|
export { Watchlist } from './ui/components/watchlist';
|
|
33
38
|
export { Typography } from './ui/components/typography';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * as Icons from './ui/components/icons';
|
|
|
16
16
|
export { ImageDistortion } from './ui/components/image-distortion';
|
|
17
17
|
export { LevaClient } from './ui/components/leva-client';
|
|
18
18
|
export { Modal } from './ui/components/modal';
|
|
19
|
+
export { Poster } from './ui/components/poster';
|
|
19
20
|
export { applyLens, LENSES, LENS_0, LENS_5I, toggleLens, $lightMode } from './ui/components/overlays';
|
|
20
21
|
export { Overlays } from './ui/components/overlays';
|
|
21
22
|
export { Progress } from './ui/components/progress';
|
|
@@ -25,6 +26,7 @@ export { SelectionSwitcher } from './ui/components/selection-switcher';
|
|
|
25
26
|
export { Stats } from './ui/components/stats';
|
|
26
27
|
export { TerminalDemo } from './ui/components/terminal-demo';
|
|
27
28
|
export { ThemeToggle } from './ui/components/theme-toggle';
|
|
29
|
+
export { TierCard } from './ui/components/tier-card';
|
|
28
30
|
export { TV } from './ui/components/tv';
|
|
29
31
|
export { Watchlist } from './ui/components/watchlist';
|
|
30
32
|
export { Typography } from './ui/components/typography';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAEnF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { AnimatedCount, useAnimatedCount } from './ui/components/animated-count'\nexport { AsciiSkeleton, Scramble as AsciiScramble } from './ui/components/ascii'\nexport { Badge } from './ui/components/badge'\nexport { NouseGirlBadge } from './ui/components/badges/nous-girl'\nexport { BlendMode, useBlendMode, withBlendMode } from './ui/components/blend-mode'\nexport type { BlendModeProps } from './ui/components/blend-mode'\nexport { Blink } from './ui/components/blink'\nexport { Button } from './ui/components/button'\nexport { CommandBlock, CopyButton } from './ui/components/command-block'\nexport { Cursor } from './ui/components/cursor'\nexport { DropdownMenu } from './ui/components/dropdown-menu'\nexport { FitText } from './ui/components/fit-text'\nexport { BarChart, LineChart } from './ui/components/graphs'\nexport { Cell, Grid } from './ui/components/grid'\nexport { HoverBg } from './ui/components/hover-bg'\nexport * as Icons from './ui/components/icons'\nexport { ImageDistortion } from './ui/components/image-distortion'\nexport type { AutoPlayPattern } from './ui/components/image-distortion'\nexport { LevaClient } from './ui/components/leva-client'\nexport { Modal } from './ui/components/modal'\nexport { Poster } from './ui/components/poster'\nexport type {\n PosterAspect,\n PosterProps,\n PosterVariant\n} from './ui/components/poster'\nexport {\n applyLens,\n LENSES,\n LENS_0,\n LENS_5I,\n toggleLens,\n $lightMode\n} from './ui/components/overlays'\nexport { Overlays } from './ui/components/overlays'\nexport type { LensPreset } from './ui/components/overlays'\nexport { Progress } from './ui/components/progress'\nexport { SceneCanvas } from './ui/components/scene-canvas'\nexport { Scramble } from './ui/components/scramble'\nexport { SelectionSwitcher } from './ui/components/selection-switcher'\nexport { Stats } from './ui/components/stats'\nexport { TerminalDemo } from './ui/components/terminal-demo'\nexport type { TerminalDemoStep } from './ui/components/terminal-demo'\nexport { ThemeToggle } from './ui/components/theme-toggle'\nexport { TierCard } from './ui/components/tier-card'\nexport type { TierCardPrice, TierCardProps } from './ui/components/tier-card'\nexport { TV } from './ui/components/tv'\nexport { Watchlist } from './ui/components/watchlist'\n\nexport { Typography } from './ui/components/typography'\nexport type { TypographyProps } from './ui/components/typography'\nexport { H1 } from './ui/components/typography/h1'\nexport { H2 } from './ui/components/typography/h2'\nexport { Legend } from './ui/components/typography/legend'\nexport { Small } from './ui/components/typography/small'\n\nexport { BasicPage } from './ui/basic-page'\nexport { Header } from './ui/header'\nexport { Footer } from './ui/footer'\nexport { LayoutWrapper } from './ui/layout-wrapper'\n\nexport {\n FONT_SANS,\n FONT_MONO,\n FONT_RULES_COMPRESSED,\n FONT_RULES_EXPANDED,\n FONT_MONDWEST\n} from './fonts'\n\nexport { cn, clamp, smoothstep, hexToVec3, truncate, stripWpStyles } from './utils'\nexport { polyRef } from './utils'\nexport type { PolyComponent, PolyProps, PolyRef } from './utils'\nexport { hexToRgb, rgbToHex, colorDodge, colorMix } from './utils/color'\n\nexport { useCappedFrame } from './hooks/use-capped-frame'\nexport { useCssVarDims } from './hooks/use-css-var-dims'\nexport { $gpuTier, useGpuTier } from './hooks/use-gpu-tier'\nexport {\n useSmoothControls,\n getControlAtom,\n setControlValue\n} from './hooks/use-smooth-controls'\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { type VariantProps } from 'class-variance-authority';
|
|
2
2
|
declare const buttonVariants: (props?: ({
|
|
3
|
+
destructive?: boolean | null | undefined;
|
|
4
|
+
ghost?: boolean | null | undefined;
|
|
3
5
|
invert?: boolean | null | undefined;
|
|
4
6
|
outlined?: boolean | null | undefined;
|
|
7
|
+
size?: "default" | "icon" | "sm" | null | undefined;
|
|
5
8
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
-
export declare const Button: ({ children, className, invert, outlined, prefix, suffix, ...props }: ButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const Button: ({ children, className, destructive, ghost, invert, outlined, prefix, size, suffix, ...props }: ButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
10
|
interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'prefix' | 'suffix'>, VariantProps<typeof buttonVariants> {
|
|
8
11
|
prefix?: React.ReactNode;
|
|
9
12
|
suffix?: React.ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAgBjE,QAAA,MAAM,cAAc;;;;;;8EAoFnB,CAAA;AA2BD,eAAO,MAAM,MAAM,GAAI,+FAWpB,WAAW,4CAoBb,CAAA;AAED,UAAU,WACR,SAAQ,IAAI,CACR,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,QAAQ,GAAG,QAAQ,CACpB,EACD,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB"}
|
|
@@ -3,42 +3,87 @@ import { cva } from 'class-variance-authority';
|
|
|
3
3
|
import { cloneElement } from 'react';
|
|
4
4
|
import { cn } from '../../utils';
|
|
5
5
|
import { Typography } from './typography';
|
|
6
|
+
const SHADOW_DEFAULT = 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff80]';
|
|
7
|
+
const SHADOW_INVERT = 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff29]';
|
|
8
|
+
const SHADOW_INVERT_OUTLINED = 'shadow-[inset_-1px_-1px_0_0_#ffffff12,inset_1px_1px_0_0_#ffffff29]';
|
|
9
|
+
const ACTIVE_FILTER = 'active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]';
|
|
6
10
|
const buttonVariants = cva([
|
|
7
11
|
'group relative grid cursor-pointer grid-cols-[auto_1fr_auto] items-center',
|
|
8
|
-
'px-[.9em_.75em] py-[1.25em]',
|
|
9
12
|
'leading-0 font-bold tracking-[0.2em] uppercase',
|
|
10
|
-
'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff80]',
|
|
11
13
|
'disabled:pointer-events-none disabled:bg-midground/15 disabled:text-midground disabled:shadow-none'
|
|
12
14
|
], {
|
|
13
15
|
compoundVariants: [
|
|
16
|
+
// ── invert × outlined matrix (default surface, no ghost/destructive) ──
|
|
14
17
|
{
|
|
15
|
-
class:
|
|
18
|
+
class: `bg-midground text-background-base active:invert ${SHADOW_DEFAULT}`,
|
|
19
|
+
destructive: false,
|
|
20
|
+
ghost: false,
|
|
16
21
|
invert: false,
|
|
17
22
|
outlined: false
|
|
18
23
|
},
|
|
19
24
|
{
|
|
20
|
-
class:
|
|
25
|
+
class: `bg-midground/15 text-midground ${SHADOW_INVERT} ${ACTIVE_FILTER}`,
|
|
26
|
+
destructive: false,
|
|
27
|
+
ghost: false,
|
|
21
28
|
invert: true,
|
|
22
29
|
outlined: false
|
|
23
30
|
},
|
|
24
31
|
{
|
|
25
|
-
class:
|
|
32
|
+
class: `shadow-midground ${SHADOW_DEFAULT} ${ACTIVE_FILTER}`,
|
|
33
|
+
destructive: false,
|
|
34
|
+
ghost: false,
|
|
26
35
|
invert: false,
|
|
27
36
|
outlined: true
|
|
28
37
|
},
|
|
29
38
|
{
|
|
30
|
-
class:
|
|
39
|
+
class: `${SHADOW_INVERT_OUTLINED} ${ACTIVE_FILTER}`,
|
|
40
|
+
destructive: false,
|
|
41
|
+
ghost: false,
|
|
31
42
|
invert: true,
|
|
32
43
|
outlined: true
|
|
44
|
+
},
|
|
45
|
+
// ── ghost: no chrome, hover bg only ──
|
|
46
|
+
{
|
|
47
|
+
class: 'bg-transparent text-current hover:bg-midground/10 shadow-none',
|
|
48
|
+
destructive: false,
|
|
49
|
+
ghost: true
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
class: 'bg-transparent text-destructive hover:bg-destructive/10 shadow-none',
|
|
53
|
+
destructive: true,
|
|
54
|
+
ghost: true
|
|
55
|
+
},
|
|
56
|
+
// ── solid destructive ──
|
|
57
|
+
{
|
|
58
|
+
class: `bg-destructive text-destructive-foreground hover:bg-destructive/90 ${SHADOW_INVERT}`,
|
|
59
|
+
destructive: true,
|
|
60
|
+
ghost: false,
|
|
61
|
+
outlined: false
|
|
62
|
+
},
|
|
63
|
+
// ── outlined destructive ──
|
|
64
|
+
{
|
|
65
|
+
class: 'border border-destructive/40 bg-transparent text-destructive hover:bg-destructive/10 shadow-none',
|
|
66
|
+
destructive: true,
|
|
67
|
+
ghost: false,
|
|
68
|
+
outlined: true
|
|
33
69
|
}
|
|
34
70
|
],
|
|
35
|
-
defaultVariants: {
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
destructive: false,
|
|
73
|
+
ghost: false,
|
|
74
|
+
invert: false,
|
|
75
|
+
outlined: false,
|
|
76
|
+
size: 'default'
|
|
77
|
+
},
|
|
36
78
|
variants: {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
},
|
|
40
|
-
outlined: {
|
|
41
|
-
|
|
79
|
+
destructive: { true: '' },
|
|
80
|
+
ghost: { true: '' },
|
|
81
|
+
invert: { true: '' },
|
|
82
|
+
outlined: { true: 'text-midground bg-transparent' },
|
|
83
|
+
size: {
|
|
84
|
+
default: 'px-[.9em_.75em] py-[1.25em]',
|
|
85
|
+
icon: 'p-2 aspect-square grid-cols-1 place-items-center [&>svg]:size-3.5',
|
|
86
|
+
sm: 'px-3 py-1.5 text-[0.7rem] tracking-[0.15em] [&>svg]:size-3'
|
|
42
87
|
}
|
|
43
88
|
}
|
|
44
89
|
});
|
|
@@ -47,5 +92,5 @@ const IconSlot = ({ icon, side }) => (_jsxs(_Fragment, { children: [_jsx("span",
|
|
|
47
92
|
className: 'size-3.5'
|
|
48
93
|
})
|
|
49
94
|
: icon })] }));
|
|
50
|
-
export const Button = ({ children, className, invert, outlined, prefix, suffix, ...props }) => (_jsxs(Typography, { as: "button", className: cn(buttonVariants({ invert, outlined }), className), mono: true, ...props, children: [_jsx("span", { "aria-hidden": true, className: "arc-border opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100" }), prefix && _jsx(IconSlot, { icon: prefix, side: "left" }), children, suffix && _jsx(IconSlot, { icon: suffix, side: "right" })] }));
|
|
95
|
+
export const Button = ({ children, className, destructive, ghost, invert, outlined, prefix, size, suffix, ...props }) => (_jsxs(Typography, { as: "button", className: cn(buttonVariants({ destructive, ghost, invert, outlined, size }), className), mono: true, ...props, children: [!ghost && (_jsx("span", { "aria-hidden": true, className: "arc-border opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100" })), prefix && _jsx(IconSlot, { icon: prefix, side: "left" }), children, suffix && _jsx(IconSlot, { icon: suffix, side: "right" })] }));
|
|
51
96
|
//# sourceMappingURL=button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAEpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,cAAc,GAAG,GAAG,CACxB;IACE,2EAA2E;IAC3E,
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/ui/components/button.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority'\nimport { cloneElement } from 'react'\n\nimport { cn } from '../../utils'\n\nimport { Typography } from './typography'\n\nconst SHADOW_DEFAULT =\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff80]'\nconst SHADOW_INVERT =\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff29]'\nconst SHADOW_INVERT_OUTLINED =\n 'shadow-[inset_-1px_-1px_0_0_#ffffff12,inset_1px_1px_0_0_#ffffff29]'\nconst ACTIVE_FILTER =\n 'active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]'\n\nconst buttonVariants = cva(\n [\n 'group relative grid cursor-pointer grid-cols-[auto_1fr_auto] items-center',\n 'leading-0 font-bold tracking-[0.2em] uppercase',\n 'disabled:pointer-events-none disabled:bg-midground/15 disabled:text-midground disabled:shadow-none'\n ],\n {\n compoundVariants: [\n // ── invert × outlined matrix (default surface, no ghost/destructive) ──\n {\n class: `bg-midground text-background-base active:invert ${SHADOW_DEFAULT}`,\n destructive: false,\n ghost: false,\n invert: false,\n outlined: false\n },\n {\n class: `bg-midground/15 text-midground ${SHADOW_INVERT} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: true,\n outlined: false\n },\n {\n class: `shadow-midground ${SHADOW_DEFAULT} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: false,\n outlined: true\n },\n {\n class: `${SHADOW_INVERT_OUTLINED} ${ACTIVE_FILTER}`,\n destructive: false,\n ghost: false,\n invert: true,\n outlined: true\n },\n // ── ghost: no chrome, hover bg only ──\n {\n class: 'bg-transparent text-current hover:bg-midground/10 shadow-none',\n destructive: false,\n ghost: true\n },\n {\n class:\n 'bg-transparent text-destructive hover:bg-destructive/10 shadow-none',\n destructive: true,\n ghost: true\n },\n // ── solid destructive ──\n {\n class: `bg-destructive text-destructive-foreground hover:bg-destructive/90 ${SHADOW_INVERT}`,\n destructive: true,\n ghost: false,\n outlined: false\n },\n // ── outlined destructive ──\n {\n class:\n 'border border-destructive/40 bg-transparent text-destructive hover:bg-destructive/10 shadow-none',\n destructive: true,\n ghost: false,\n outlined: true\n }\n ],\n defaultVariants: {\n destructive: false,\n ghost: false,\n invert: false,\n outlined: false,\n size: 'default'\n },\n variants: {\n destructive: { true: '' },\n ghost: { true: '' },\n invert: { true: '' },\n outlined: { true: 'text-midground bg-transparent' },\n size: {\n default: 'px-[.9em_.75em] py-[1.25em]',\n icon: 'p-2 aspect-square grid-cols-1 place-items-center [&>svg]:size-3.5',\n sm: 'px-3 py-1.5 text-[0.7rem] tracking-[0.15em] [&>svg]:size-3'\n }\n }\n }\n)\n\nconst IconSlot = ({\n icon,\n side\n}: {\n icon: React.ReactNode\n side: 'left' | 'right'\n}) => (\n <>\n <span className=\"w-5\" />\n\n <span\n className={cn(\n 'absolute top-1/2 -translate-y-1/2',\n side === 'left' ? 'left-3' : 'right-3'\n )}\n >\n {typeof icon === 'object'\n ? cloneElement(icon as React.ReactElement<any>, {\n className: 'size-3.5'\n })\n : icon}\n </span>\n </>\n)\n\nexport const Button = ({\n children,\n className,\n destructive,\n ghost,\n invert,\n outlined,\n prefix,\n size,\n suffix,\n ...props\n}: ButtonProps) => (\n <Typography\n as=\"button\"\n className={cn(\n buttonVariants({ destructive, ghost, invert, outlined, size }),\n className\n )}\n mono\n {...props}\n >\n {!ghost && (\n <span\n aria-hidden\n className=\"arc-border opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100\"\n />\n )}\n {prefix && <IconSlot icon={prefix} side=\"left\" />}\n {children}\n {suffix && <IconSlot icon={suffix} side=\"right\" />}\n </Typography>\n)\n\ninterface ButtonProps\n extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'prefix' | 'suffix'\n >,\n VariantProps<typeof buttonVariants> {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
export declare function ImageDistortion({ active, className, fallbackClassName, src, style, tint, tintStrength }: ImageDistortionProps): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
export declare function ImageDistortion({ active, autoPlay, className, fallbackClassName, src, style, tint, tintStrength }: ImageDistortionProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export type AutoPlayPattern = 'aggressive' | 'gentle' | 'slash';
|
|
2
3
|
interface ImageDistortionProps {
|
|
3
4
|
active?: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Drive the distortion with a choreographed motion pattern instead of
|
|
7
|
+
* waiting for a real pointer. Useful for posters, social clips, and any
|
|
8
|
+
* context where the image needs to feel alive on its own.
|
|
9
|
+
*/
|
|
10
|
+
autoPlay?: AutoPlayPattern;
|
|
4
11
|
className?: string;
|
|
5
12
|
fallbackClassName?: string;
|
|
6
13
|
src: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-distortion.d.ts","sourceRoot":"","sources":["../../../src/ui/components/image-distortion.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"image-distortion.d.ts","sourceRoot":"","sources":["../../../src/ui/components/image-distortion.tsx"],"names":[],"mappings":"AAmJA,wBAAgB,eAAe,CAAC,EAC9B,MAAa,EACb,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,GAAG,EACH,KAAK,EACL,IAAI,EACJ,YAAY,EACb,EAAE,oBAAoB,2CAkStB;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE/D,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CACpD"}
|
|
@@ -93,7 +93,45 @@ void main(){
|
|
|
93
93
|
|
|
94
94
|
gl_FragColor=vec4(col,1.0);
|
|
95
95
|
}`;
|
|
96
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Choreographed motion patterns used when `autoPlay` is set. Each pattern
|
|
98
|
+
* returns a synthetic pointer position in [0,1] and a hover intensity in
|
|
99
|
+
* [0,1] for the current time (seconds). They drive the shader without
|
|
100
|
+
* requiring a real pointer, which is what lets us record the distortion
|
|
101
|
+
* as a GIF / screenshot / poster.
|
|
102
|
+
*/
|
|
103
|
+
const AUTOPLAY_PATTERNS = {
|
|
104
|
+
aggressive: t => {
|
|
105
|
+
const cycle = 1.4;
|
|
106
|
+
const phase = (t % cycle) / cycle;
|
|
107
|
+
const stab = Math.exp(-((phase - 0.15) ** 2) * 260);
|
|
108
|
+
const angle = Math.floor(t / cycle) * 1.37;
|
|
109
|
+
const mx = 0.5 + Math.cos(angle) * 0.42 * (stab + 0.15);
|
|
110
|
+
const my = 0.5 + Math.sin(angle) * 0.38 * (stab + 0.15);
|
|
111
|
+
return { hover: 0.55 + stab * 0.45, mx, my };
|
|
112
|
+
},
|
|
113
|
+
gentle: t => ({
|
|
114
|
+
hover: 0.45 + Math.sin(t * 0.9) * 0.1,
|
|
115
|
+
mx: 0.5 + Math.sin(t * 0.5) * 0.28,
|
|
116
|
+
my: 0.5 + Math.cos(t * 0.37) * 0.22
|
|
117
|
+
}),
|
|
118
|
+
slash: t => {
|
|
119
|
+
// Long breath -> sword slash -> recoil twitch, repeating.
|
|
120
|
+
const cycle = 3.6;
|
|
121
|
+
const phase = (t % cycle) / cycle;
|
|
122
|
+
const slash = Math.exp(-((phase - 0.28) ** 2) * 180);
|
|
123
|
+
const micro = Math.exp(-((phase - 0.7) ** 2) * 340);
|
|
124
|
+
const driftX = 0.5 + Math.sin(t * 0.7) * 0.16;
|
|
125
|
+
const driftY = 0.55 + Math.cos(t * 0.5) * 0.14;
|
|
126
|
+
// Slash trajectory: bottom-left up into the giant's chest (top-right).
|
|
127
|
+
const slashX = -0.15 + phase * 1.55;
|
|
128
|
+
const slashY = 0.95 - phase * 1.35;
|
|
129
|
+
const mx = driftX * (1 - slash) + slashX * slash;
|
|
130
|
+
const my = driftY * (1 - slash) + slashY * slash;
|
|
131
|
+
return { hover: 0.5 + slash * 0.5 + micro * 0.35, mx, my };
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
export function ImageDistortion({ active = true, autoPlay, className, fallbackClassName, src, style, tint, tintStrength }) {
|
|
97
135
|
const canvasRef = useRef(null);
|
|
98
136
|
const tier = useGpuTier();
|
|
99
137
|
const [loaded, setLoaded] = useState(false);
|
|
@@ -101,6 +139,8 @@ export function ImageDistortion({ active = true, className, fallbackClassName, s
|
|
|
101
139
|
activeRef.current = active;
|
|
102
140
|
const tintStrengthRef = useRef(tintStrength);
|
|
103
141
|
tintStrengthRef.current = tintStrength;
|
|
142
|
+
const autoPlayRef = useRef(autoPlay);
|
|
143
|
+
autoPlayRef.current = autoPlay;
|
|
104
144
|
const state = useRef({
|
|
105
145
|
bandTargets: new Float32Array(NUM_BANDS),
|
|
106
146
|
bands: new Float32Array(NUM_BANDS),
|
|
@@ -194,9 +234,14 @@ export function ImageDistortion({ active = true, className, fallbackClassName, s
|
|
|
194
234
|
const onLeave = () => {
|
|
195
235
|
state.current.hoverTarget = 0;
|
|
196
236
|
};
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
237
|
+
// When autoPlay drives the distortion we want the poster to look
|
|
238
|
+
// alive regardless of whether a pointer is near the canvas, so we
|
|
239
|
+
// skip the real pointer listeners entirely.
|
|
240
|
+
if (!autoPlayRef.current) {
|
|
241
|
+
c.addEventListener('pointermove', onMove);
|
|
242
|
+
c.addEventListener('pointerenter', onEnter);
|
|
243
|
+
c.addEventListener('pointerleave', onLeave);
|
|
244
|
+
}
|
|
200
245
|
const bandEaseRates = new Float32Array(NUM_BANDS);
|
|
201
246
|
for (let i = 0; i < NUM_BANDS; i++) {
|
|
202
247
|
bandEaseRates[i] = 0.02 + Math.random() * 0.06;
|
|
@@ -212,6 +257,15 @@ export function ImageDistortion({ active = true, className, fallbackClassName, s
|
|
|
212
257
|
const loop = () => {
|
|
213
258
|
raf = requestAnimationFrame(loop);
|
|
214
259
|
const s = state.current;
|
|
260
|
+
const pattern = autoPlayRef.current
|
|
261
|
+
? AUTOPLAY_PATTERNS[autoPlayRef.current]
|
|
262
|
+
: null;
|
|
263
|
+
if (pattern) {
|
|
264
|
+
const driven = pattern((performance.now() - t0) / 1e3);
|
|
265
|
+
s.mx = driven.mx;
|
|
266
|
+
s.my = driven.my;
|
|
267
|
+
s.hoverTarget = driven.hover;
|
|
268
|
+
}
|
|
215
269
|
const dvx = s.mx - s.prevMx;
|
|
216
270
|
const dvy = s.my - s.prevMy;
|
|
217
271
|
s.vx += (dvx * 8 - s.vx) * 0.1;
|
|
@@ -263,6 +317,10 @@ export function ImageDistortion({ active = true, className, fallbackClassName, s
|
|
|
263
317
|
gl.deleteProgram(prog);
|
|
264
318
|
setLoaded(false);
|
|
265
319
|
};
|
|
320
|
+
// autoPlay is intentionally omitted so toggling it at runtime doesn't
|
|
321
|
+
// tear down the shader pipeline. The ref-driven loop reads the live
|
|
322
|
+
// value each frame, so listener attach/detach is handled once on mount.
|
|
323
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
266
324
|
}, [src, tier, tint]);
|
|
267
325
|
if (tier === 0) {
|
|
268
326
|
return (
|