@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.
@@ -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;iBAmOzD;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"}
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":"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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 // 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';
@@ -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":"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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 { LevaClient } from './ui/components/leva-client'\nexport { Modal } from './ui/components/modal'\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 { 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
+ {"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;AAOjE,QAAA,MAAM,cAAc;;;8EA4CnB,CAAA;AA2BD,eAAO,MAAM,MAAM,GAAI,qEAQpB,WAAW,4CAeb,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"}
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: 'bg-midground text-background-base active:invert',
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: 'bg-midground/15 text-midground active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]',
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: 'shadow-midground active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]',
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: 'shadow-[inset_-1px_-1px_0_0_#ffffff12,inset_1px_1px_0_0_#ffffff29] active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]',
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: { invert: false, outlined: false },
71
+ defaultVariants: {
72
+ destructive: false,
73
+ ghost: false,
74
+ invert: false,
75
+ outlined: false,
76
+ size: 'default'
77
+ },
36
78
  variants: {
37
- invert: {
38
- true: 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff29]'
39
- },
40
- outlined: {
41
- true: 'text-midground bg-transparent'
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,6BAA6B;IAC7B,gDAAgD;IAChD,oEAAoE;IACpE,oGAAoG;CACrG,EACD;IACE,gBAAgB,EAAE;QAChB;YACE,KAAK,EAAE,iDAAiD;YACxD,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EACH,6GAA6G;YAC/G,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EACH,+FAA+F;YACjG,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI;SACf;QACD;YACE,KAAK,EACH,iJAAiJ;YACnJ,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;SACf;KACF;IACD,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnD,QAAQ,EAAE;QACR,MAAM,EAAE;YACN,IAAI,EAAE,oEAAoE;SAC3E;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,+BAA+B;SACtC;KACF;CACF,CACF,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,EAChB,IAAI,EACJ,IAAI,EAIL,EAAE,EAAE,CAAC,CACJ,8BACE,eAAM,SAAS,EAAC,KAAK,GAAG,EAExB,eACE,SAAS,EAAE,EAAE,CACX,mCAAmC,EACnC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CACvC,YAEA,OAAO,IAAI,KAAK,QAAQ;gBACvB,CAAC,CAAC,YAAY,CAAC,IAA+B,EAAE;oBAC5C,SAAS,EAAE,UAAU;iBACtB,CAAC;gBACJ,CAAC,CAAC,IAAI,GACH,IACN,CACJ,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACI,EAAE,EAAE,CAAC,CACjB,MAAC,UAAU,IACT,EAAE,EAAC,QAAQ,EACX,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,EAC9D,IAAI,WACA,KAAK,aAET,oCAEE,SAAS,EAAC,uIAAuI,GACjJ,EACD,MAAM,IAAI,KAAC,QAAQ,IAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,GAAG,EAChD,QAAQ,EACR,MAAM,IAAI,KAAC,QAAQ,IAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC,OAAO,GAAG,IACvC,CACd,CAAA","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 buttonVariants = cva(\n [\n 'group relative grid cursor-pointer grid-cols-[auto_1fr_auto] items-center',\n 'px-[.9em_.75em] py-[1.25em]',\n 'leading-0 font-bold tracking-[0.2em] uppercase',\n 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff80]',\n 'disabled:pointer-events-none disabled:bg-midground/15 disabled:text-midground disabled:shadow-none'\n ],\n {\n compoundVariants: [\n {\n class: 'bg-midground text-background-base active:invert',\n invert: false,\n outlined: false\n },\n {\n class:\n 'bg-midground/15 text-midground active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]',\n invert: true,\n outlined: false\n },\n {\n class:\n 'shadow-midground active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]',\n invert: false,\n outlined: true\n },\n {\n class:\n 'shadow-[inset_-1px_-1px_0_0_#ffffff12,inset_1px_1px_0_0_#ffffff29] active:[filter:invert(1)_brightness(calc(100-99*var(--foreground-alpha,0)))]',\n invert: true,\n outlined: true\n }\n ],\n defaultVariants: { invert: false, outlined: false },\n variants: {\n invert: {\n true: 'shadow-[inset_-1px_-1px_0_0_#00000080,inset_1px_1px_0_0_#ffffff29]'\n },\n outlined: {\n true: 'text-midground bg-transparent'\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 invert,\n outlined,\n prefix,\n suffix,\n ...props\n}: ButtonProps) => (\n <Typography\n as=\"button\"\n className={cn(buttonVariants({ invert, outlined }), className)}\n mono\n {...props}\n >\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 {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
+ {"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"]}
@@ -61,7 +61,8 @@
61
61
  }
62
62
 
63
63
  .gc {
64
- @apply min-w-0 border-r border-inherit p-4;
64
+ min-width: 0;
65
+ @apply border-r border-inherit p-4;
65
66
 
66
67
  &:has(> .gc) {
67
68
  @apply p-0;
@@ -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":"AAoGA,wBAAgB,eAAe,CAAC,EAC9B,MAAa,EACb,SAAS,EACT,iBAAiB,EACjB,GAAG,EACH,KAAK,EACL,IAAI,EACJ,YAAY,EACb,EAAE,oBAAoB,2CA4QtB;AAED,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,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"}
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
- export function ImageDistortion({ active = true, className, fallbackClassName, src, style, tint, tintStrength }) {
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
- c.addEventListener('pointermove', onMove);
198
- c.addEventListener('pointerenter', onEnter);
199
- c.addEventListener('pointerleave', onLeave);
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 (