egaki 0.5.0 → 0.7.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/CHANGELOG.md +188 -0
- package/dist/cli/cache-utils.d.ts +33 -0
- package/dist/cli/cache-utils.d.ts.map +1 -0
- package/dist/cli/cache-utils.js +157 -0
- package/dist/cli/cached-generate.d.ts +105 -0
- package/dist/cli/cached-generate.d.ts.map +1 -0
- package/dist/cli/cached-generate.js +208 -0
- package/dist/cli/cached-generate.test.d.ts +11 -0
- package/dist/cli/cached-generate.test.d.ts.map +1 -0
- package/dist/cli/cached-generate.test.js +431 -0
- package/dist/cli/cartesia-provider.d.ts +16 -0
- package/dist/cli/cartesia-provider.d.ts.map +1 -0
- package/dist/cli/cartesia-provider.js +184 -0
- package/dist/cli/chatgpt-auth.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +1329 -0
- package/dist/cli/clone-generate.d.ts +26 -0
- package/dist/cli/clone-generate.d.ts.map +1 -0
- package/dist/cli/clone-generate.js +148 -0
- package/dist/{credentials.d.ts → cli/credentials.d.ts} +11 -2
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/{credentials.js → cli/credentials.js} +88 -5
- package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
- package/dist/cli/elevenlabs-speech-provider.js +199 -0
- package/dist/cli/generate.d.ts +140 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +604 -0
- package/dist/cli/generate.test.d.ts +2 -0
- package/dist/cli/generate.test.d.ts.map +1 -0
- package/dist/cli/generate.test.js +131 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/{login.js → cli/login.js} +45 -4
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +7 -0
- package/dist/cli/model-catalog.d.ts +141 -0
- package/dist/cli/model-catalog.d.ts.map +1 -0
- package/dist/cli/model-catalog.js +2135 -0
- package/dist/{models.d.ts → cli/models.d.ts} +16 -9
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +313 -0
- package/dist/cli/open-browser.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.d.ts +3 -0
- package/dist/cli/openai-speech-provider.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.js +28 -0
- package/dist/cli/separation-generate.d.ts +34 -0
- package/dist/cli/separation-generate.d.ts.map +1 -0
- package/dist/cli/separation-generate.js +117 -0
- package/dist/cli/speech-catalog.d.ts +35 -0
- package/dist/cli/speech-catalog.d.ts.map +1 -0
- package/dist/cli/speech-catalog.js +195 -0
- package/dist/cli/speech-generate.d.ts +86 -0
- package/dist/cli/speech-generate.d.ts.map +1 -0
- package/dist/cli/speech-generate.js +156 -0
- package/dist/cli/speech-models.d.ts +8 -0
- package/dist/cli/speech-models.d.ts.map +1 -0
- package/dist/cli/speech-models.js +109 -0
- package/dist/cli/speech-provider.test.d.ts +2 -0
- package/dist/cli/speech-provider.test.d.ts.map +1 -0
- package/dist/cli/speech-provider.test.js +197 -0
- package/dist/cli/subscription.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.d.ts +35 -0
- package/dist/cli/transcription-catalog.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.js +192 -0
- package/dist/cli/transcription-generate.d.ts +62 -0
- package/dist/cli/transcription-generate.d.ts.map +1 -0
- package/dist/cli/transcription-generate.js +144 -0
- package/dist/cli/transcription-models.d.ts +9 -0
- package/dist/cli/transcription-models.d.ts.map +1 -0
- package/dist/cli/transcription-models.js +100 -0
- package/dist/cli/transcription-providers.d.ts +22 -0
- package/dist/cli/transcription-providers.d.ts.map +1 -0
- package/dist/cli/transcription-providers.js +290 -0
- package/dist/cli/video-model-catalog.d.ts +2 -0
- package/dist/cli/video-model-catalog.d.ts.map +1 -0
- package/dist/cli/video-model-catalog.js +5 -0
- package/dist/cli/xai-auth.d.ts +29 -0
- package/dist/cli/xai-auth.d.ts.map +1 -0
- package/dist/cli/xai-auth.js +325 -0
- package/dist/vite/angled-screen.d.ts +57 -0
- package/dist/vite/angled-screen.d.ts.map +1 -0
- package/dist/vite/angled-screen.js +115 -0
- package/dist/vite/app.d.ts +51 -0
- package/dist/vite/app.d.ts.map +1 -0
- package/dist/vite/app.js +150 -0
- package/dist/vite/bands-shader.d.ts +47 -0
- package/dist/vite/bands-shader.d.ts.map +1 -0
- package/dist/vite/bands-shader.js +267 -0
- package/dist/vite/code-block.d.ts +107 -0
- package/dist/vite/code-block.d.ts.map +1 -0
- package/dist/vite/code-block.js +641 -0
- package/dist/vite/components.d.ts +36 -0
- package/dist/vite/components.d.ts.map +1 -0
- package/dist/vite/components.js +113 -0
- package/dist/vite/dispersion-rings-shader.d.ts +44 -0
- package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
- package/dist/vite/dispersion-rings-shader.js +282 -0
- package/dist/vite/easing-curves.d.ts +129 -0
- package/dist/vite/easing-curves.d.ts.map +1 -0
- package/dist/vite/easing-curves.js +584 -0
- package/dist/vite/easing-curves.test.d.ts +2 -0
- package/dist/vite/easing-curves.test.d.ts.map +1 -0
- package/dist/vite/easing-curves.test.js +200 -0
- package/dist/vite/generated-media-client.d.ts +35 -0
- package/dist/vite/generated-media-client.d.ts.map +1 -0
- package/dist/vite/generated-media-client.js +76 -0
- package/dist/vite/keyframes.d.ts +129 -0
- package/dist/vite/keyframes.d.ts.map +1 -0
- package/dist/vite/keyframes.js +194 -0
- package/dist/vite/layout-editor.d.ts +45 -0
- package/dist/vite/layout-editor.d.ts.map +1 -0
- package/dist/vite/layout-editor.js +587 -0
- package/dist/vite/layout-transition.d.ts +136 -0
- package/dist/vite/layout-transition.d.ts.map +1 -0
- package/dist/vite/layout-transition.js +581 -0
- package/dist/vite/liquid-gradient-shader.d.ts +62 -0
- package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
- package/dist/vite/liquid-gradient-shader.js +413 -0
- package/dist/vite/mdx-client.d.ts +15 -0
- package/dist/vite/mdx-client.d.ts.map +1 -0
- package/dist/vite/mdx-client.js +265 -0
- package/dist/vite/mdx-parse.d.ts +102 -0
- package/dist/vite/mdx-parse.d.ts.map +1 -0
- package/dist/vite/mdx-parse.js +251 -0
- package/dist/vite/mdx-provided-components.d.ts +18 -0
- package/dist/vite/mdx-provided-components.d.ts.map +1 -0
- package/dist/vite/mdx-provided-components.js +14 -0
- package/dist/vite/mdx-video.d.ts +327 -0
- package/dist/vite/mdx-video.d.ts.map +1 -0
- package/dist/vite/mdx-video.js +596 -0
- package/dist/vite/mdx-video.test.d.ts +9 -0
- package/dist/vite/mdx-video.test.d.ts.map +1 -0
- package/dist/vite/mdx-video.test.js +1945 -0
- package/dist/vite/media-components.d.ts +45 -0
- package/dist/vite/media-components.d.ts.map +1 -0
- package/dist/vite/media-components.js +355 -0
- package/dist/vite/media-duration-store.d.ts +66 -0
- package/dist/vite/media-duration-store.d.ts.map +1 -0
- package/dist/vite/media-duration-store.js +204 -0
- package/dist/vite/player-page.d.ts +35 -0
- package/dist/vite/player-page.d.ts.map +1 -0
- package/dist/vite/player-page.js +720 -0
- package/dist/vite/render-client.d.ts +18 -0
- package/dist/vite/render-client.d.ts.map +1 -0
- package/dist/vite/render-client.js +67 -0
- package/dist/vite/sdk.d.ts +221 -0
- package/dist/vite/sdk.d.ts.map +1 -0
- package/dist/vite/sdk.js +355 -0
- package/dist/vite/server-components.d.ts +55 -0
- package/dist/vite/server-components.d.ts.map +1 -0
- package/dist/vite/server-components.js +156 -0
- package/dist/vite/server-mdx.d.ts +74 -0
- package/dist/vite/server-mdx.d.ts.map +1 -0
- package/dist/vite/server-mdx.js +259 -0
- package/dist/vite/shader-renderer.d.ts +48 -0
- package/dist/vite/shader-renderer.d.ts.map +1 -0
- package/dist/vite/shader-renderer.js +411 -0
- package/dist/vite/store-hooks.d.ts +12 -0
- package/dist/vite/store-hooks.d.ts.map +1 -0
- package/dist/vite/store-hooks.js +93 -0
- package/dist/vite/store.d.ts +75 -0
- package/dist/vite/store.d.ts.map +1 -0
- package/dist/vite/store.js +52 -0
- package/dist/vite/store.test.d.ts +6 -0
- package/dist/vite/store.test.d.ts.map +1 -0
- package/dist/vite/store.test.js +172 -0
- package/dist/vite/tweakpane-hook.d.ts +94 -0
- package/dist/vite/tweakpane-hook.d.ts.map +1 -0
- package/dist/vite/tweakpane-hook.js +450 -0
- package/dist/vite/vite-plugin.d.ts +28 -0
- package/dist/vite/vite-plugin.d.ts.map +1 -0
- package/dist/vite/vite-plugin.js +538 -0
- package/dist/vite/wave-gradient-shader.d.ts +41 -0
- package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
- package/dist/vite/wave-gradient-shader.js +207 -0
- package/package.json +103 -25
- package/skills/egaki/SKILL.md +162 -1
- package/src/cli/cache-utils.ts +169 -0
- package/src/cli/cached-generate.test.ts +531 -0
- package/src/cli/cached-generate.ts +348 -0
- package/src/cli/cartesia-provider.ts +249 -0
- package/src/cli/cli.ts +1818 -0
- package/src/cli/clone-generate.ts +202 -0
- package/src/{credentials.ts → cli/credentials.ts} +90 -7
- package/src/cli/elevenlabs-speech-provider.ts +243 -0
- package/src/cli/generate.test.ts +166 -0
- package/src/cli/generate.ts +912 -0
- package/src/{login.ts → cli/login.ts} +48 -3
- package/src/cli/main.ts +8 -0
- package/src/cli/model-catalog.ts +2336 -0
- package/src/cli/models.ts +408 -0
- package/src/cli/openai-speech-provider.ts +34 -0
- package/src/cli/separation-generate.ts +187 -0
- package/src/cli/speech-catalog.ts +253 -0
- package/src/cli/speech-generate.ts +275 -0
- package/src/cli/speech-models.ts +146 -0
- package/src/cli/speech-provider.test.ts +226 -0
- package/src/cli/transcription-catalog.ts +250 -0
- package/src/cli/transcription-generate.ts +214 -0
- package/src/cli/transcription-models.ts +136 -0
- package/src/cli/transcription-providers.ts +427 -0
- package/src/cli/video-model-catalog.ts +14 -0
- package/src/cli/xai-auth.ts +396 -0
- package/src/vite/angled-screen.tsx +214 -0
- package/src/vite/app.tsx +197 -0
- package/src/vite/bands-shader.tsx +319 -0
- package/src/vite/code-block.tsx +939 -0
- package/src/vite/components.tsx +278 -0
- package/src/vite/dispersion-rings-shader.tsx +331 -0
- package/src/vite/easing-curves.test.ts +232 -0
- package/src/vite/easing-curves.ts +743 -0
- package/src/vite/generated-media-client.tsx +121 -0
- package/src/vite/keyframes.tsx +347 -0
- package/src/vite/layout-editor.tsx +709 -0
- package/src/vite/layout-transition.tsx +706 -0
- package/src/vite/liquid-gradient-shader.tsx +474 -0
- package/src/vite/mdx-client.tsx +420 -0
- package/src/vite/mdx-parse.ts +343 -0
- package/src/vite/mdx-provided-components.ts +19 -0
- package/src/vite/mdx-video.test.tsx +2219 -0
- package/src/vite/mdx-video.tsx +976 -0
- package/src/vite/media-components.tsx +473 -0
- package/src/vite/media-duration-store.ts +225 -0
- package/src/vite/motion-timing.ts +194 -0
- package/src/vite/player-page.tsx +1107 -0
- package/src/vite/render-client.ts +84 -0
- package/src/vite/sdk.ts +598 -0
- package/src/vite/server-components.tsx +241 -0
- package/src/vite/server-mdx.ts +285 -0
- package/src/vite/shader-renderer.tsx +535 -0
- package/src/vite/store-hooks.ts +117 -0
- package/src/vite/store.test.ts +202 -0
- package/src/vite/store.ts +115 -0
- package/src/vite/styles.css +21 -0
- package/src/vite/tweakpane-hook.tsx +593 -0
- package/src/vite/virtual-modules.d.ts +30 -0
- package/src/vite/vite-plugin.ts +584 -0
- package/src/vite/wave-gradient-shader.tsx +253 -0
- package/README.md +0 -266
- package/dist/antigravity-auth.d.ts +0 -15
- package/dist/antigravity-auth.d.ts.map +0 -1
- package/dist/antigravity-auth.js +0 -544
- package/dist/antigravity-image.d.ts +0 -11
- package/dist/antigravity-image.d.ts.map +0 -1
- package/dist/antigravity-image.js +0 -285
- package/dist/chatgpt-auth.d.ts.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -968
- package/dist/credentials.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.d.ts +0 -11
- package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.js +0 -64
- package/dist/login.d.ts.map +0 -1
- package/dist/model-catalog.d.ts +0 -42
- package/dist/model-catalog.d.ts.map +0 -1
- package/dist/model-catalog.js +0 -1001
- package/dist/models.d.ts.map +0 -1
- package/dist/models.js +0 -246
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/subscription.d.ts.map +0 -1
- package/dist/video-model-catalog.d.ts +0 -52
- package/dist/video-model-catalog.d.ts.map +0 -1
- package/dist/video-model-catalog.js +0 -306
- package/src/cli.ts +0 -1378
- package/src/model-catalog.ts +0 -1077
- package/src/models.ts +0 -309
- package/src/video-model-catalog.ts +0 -363
- /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
- /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
- /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
- /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
- /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
- /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
- /package/dist/{subscription.js → cli/subscription.js} +0 -0
- /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
- /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
- /package/src/{subscription.ts → cli/subscription.ts} +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface BlurRevealProps {
|
|
2
|
+
text: string;
|
|
3
|
+
blur?: number;
|
|
4
|
+
fontSize?: number;
|
|
5
|
+
color?: string;
|
|
6
|
+
fontWeight?: number;
|
|
7
|
+
/** Duration of the reveal in frames (defaults to 60% of composition) */
|
|
8
|
+
revealFrames?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function BlurReveal({ text, blur, fontSize, color, fontWeight, revealFrames, }: BlurRevealProps): import("react").JSX.Element;
|
|
11
|
+
export interface MaskedSlideRevealProps {
|
|
12
|
+
text: string;
|
|
13
|
+
staggerDelay?: number;
|
|
14
|
+
fontSize?: number;
|
|
15
|
+
color?: string;
|
|
16
|
+
fontWeight?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function MaskedSlideReveal({ text, staggerDelay, fontSize, color, fontWeight, }: MaskedSlideRevealProps): import("react").JSX.Element;
|
|
19
|
+
export interface StaggeredFadeUpProps {
|
|
20
|
+
text: string;
|
|
21
|
+
staggerDelay?: number;
|
|
22
|
+
distance?: number;
|
|
23
|
+
fontSize?: number;
|
|
24
|
+
color?: string;
|
|
25
|
+
fontWeight?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function StaggeredFadeUp({ text, staggerDelay, distance, fontSize, color, fontWeight, }: StaggeredFadeUpProps): import("react").JSX.Element;
|
|
28
|
+
export interface ShimmerSweepProps {
|
|
29
|
+
text: string;
|
|
30
|
+
baseColor?: string;
|
|
31
|
+
shineColor?: string;
|
|
32
|
+
fontSize?: number;
|
|
33
|
+
fontWeight?: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function ShimmerSweep({ text, baseColor, shineColor, fontSize, fontWeight, }: ShimmerSweepProps): import("react").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/vite/components.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,IAAS,EACT,QAAa,EACb,KAAiB,EACjB,UAAgB,EAChB,YAAY,GACb,EAAE,eAAe,+BA+BjB;AAMD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,YAAgB,EAChB,QAAa,EACb,KAAiB,EACjB,UAAgB,GACjB,EAAE,sBAAsB,+BAiDxB;AAMD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,YAAgB,EAChB,QAAa,EACb,QAAa,EACb,KAAiB,EACjB,UAAgB,GACjB,EAAE,oBAAoB,+BA4CtB;AAMD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAqB,EACrB,UAAsB,EACtB,QAAa,EACb,UAAgB,GACjB,EAAE,iBAAiB,+BA4CnB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Visual text effect components for egaki video.
|
|
5
|
+
*
|
|
6
|
+
* Must be 'use client' because they use Remotion hooks (useCurrentFrame,
|
|
7
|
+
* useVideoConfig, spring, interpolate) which only work inside the Player
|
|
8
|
+
* render context on the client.
|
|
9
|
+
*/
|
|
10
|
+
import { AbsoluteFill, interpolate, spring, useCurrentFrame, useVideoConfig, } from 'remotion';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Shared constants
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const FONT_SANS = '-apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", sans-serif';
|
|
15
|
+
export function BlurReveal({ text, blur = 20, fontSize = 96, color = '#fafafa', fontWeight = 700, revealFrames, }) {
|
|
16
|
+
const frame = useCurrentFrame();
|
|
17
|
+
const { durationInFrames } = useVideoConfig();
|
|
18
|
+
const dur = revealFrames ?? durationInFrames * 0.6;
|
|
19
|
+
const opacity = interpolate(frame, [0, dur], [0, 1], {
|
|
20
|
+
extrapolateRight: 'clamp',
|
|
21
|
+
});
|
|
22
|
+
const blurAmount = interpolate(frame, [0, dur], [blur, 0], {
|
|
23
|
+
extrapolateRight: 'clamp',
|
|
24
|
+
});
|
|
25
|
+
return (_jsx(AbsoluteFill, { style: { display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsx("span", { style: {
|
|
26
|
+
opacity,
|
|
27
|
+
filter: `blur(${blurAmount}px)`,
|
|
28
|
+
fontSize,
|
|
29
|
+
fontWeight,
|
|
30
|
+
color,
|
|
31
|
+
letterSpacing: '-0.04em',
|
|
32
|
+
fontFamily: FONT_SANS,
|
|
33
|
+
}, children: text }) }));
|
|
34
|
+
}
|
|
35
|
+
export function MaskedSlideReveal({ text, staggerDelay = 3, fontSize = 56, color = '#fafafa', fontWeight = 600, }) {
|
|
36
|
+
const frame = useCurrentFrame();
|
|
37
|
+
const { fps } = useVideoConfig();
|
|
38
|
+
const words = text.split(' ');
|
|
39
|
+
return (_jsx(AbsoluteFill, { style: { display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsx("span", { style: {
|
|
40
|
+
fontSize,
|
|
41
|
+
fontWeight,
|
|
42
|
+
color,
|
|
43
|
+
letterSpacing: '-0.03em',
|
|
44
|
+
fontFamily: FONT_SANS,
|
|
45
|
+
}, children: words.map((word, i) => {
|
|
46
|
+
const t = spring({
|
|
47
|
+
frame: frame - i * staggerDelay,
|
|
48
|
+
fps,
|
|
49
|
+
config: { damping: 14 },
|
|
50
|
+
});
|
|
51
|
+
return (_jsx("span", { style: {
|
|
52
|
+
display: 'inline-block',
|
|
53
|
+
overflow: 'hidden',
|
|
54
|
+
verticalAlign: 'bottom',
|
|
55
|
+
lineHeight: 1.1,
|
|
56
|
+
marginRight: '0.25em',
|
|
57
|
+
}, children: _jsx("span", { style: {
|
|
58
|
+
display: 'inline-block',
|
|
59
|
+
transform: `translateY(${(1 - t) * 100}%)`,
|
|
60
|
+
}, children: word }) }, i));
|
|
61
|
+
}) }) }));
|
|
62
|
+
}
|
|
63
|
+
export function StaggeredFadeUp({ text, staggerDelay = 4, distance = 24, fontSize = 48, color = '#a1a1aa', fontWeight = 400, }) {
|
|
64
|
+
const frame = useCurrentFrame();
|
|
65
|
+
const words = text.split(' ');
|
|
66
|
+
return (_jsx(AbsoluteFill, { style: { display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsx("span", { style: {
|
|
67
|
+
fontSize,
|
|
68
|
+
fontWeight,
|
|
69
|
+
color,
|
|
70
|
+
letterSpacing: '-0.02em',
|
|
71
|
+
fontFamily: FONT_SANS,
|
|
72
|
+
}, children: words.map((word, i) => {
|
|
73
|
+
const local = frame - i * staggerDelay;
|
|
74
|
+
const opacity = interpolate(local, [0, 14], [0, 1], {
|
|
75
|
+
extrapolateLeft: 'clamp',
|
|
76
|
+
extrapolateRight: 'clamp',
|
|
77
|
+
});
|
|
78
|
+
const y = interpolate(local, [0, 14], [distance, 0], {
|
|
79
|
+
extrapolateLeft: 'clamp',
|
|
80
|
+
extrapolateRight: 'clamp',
|
|
81
|
+
});
|
|
82
|
+
return (_jsx("span", { style: {
|
|
83
|
+
display: 'inline-block',
|
|
84
|
+
marginRight: '0.25em',
|
|
85
|
+
opacity,
|
|
86
|
+
transform: `translateY(${y}px)`,
|
|
87
|
+
}, children: word }, i));
|
|
88
|
+
}) }) }));
|
|
89
|
+
}
|
|
90
|
+
export function ShimmerSweep({ text, baseColor = '#52525b', shineColor = '#fafafa', fontSize = 72, fontWeight = 700, }) {
|
|
91
|
+
const frame = useCurrentFrame();
|
|
92
|
+
const { durationInFrames } = useVideoConfig();
|
|
93
|
+
const position = interpolate(frame, [0, durationInFrames * 0.75], [200, -100], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
94
|
+
const textStyle = {
|
|
95
|
+
fontSize,
|
|
96
|
+
fontWeight,
|
|
97
|
+
letterSpacing: '-0.04em',
|
|
98
|
+
fontFamily: FONT_SANS,
|
|
99
|
+
margin: 0,
|
|
100
|
+
lineHeight: 1,
|
|
101
|
+
};
|
|
102
|
+
return (_jsx(AbsoluteFill, { style: { display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsxs("div", { style: { position: 'relative', display: 'inline-block' }, children: [_jsx("span", { style: { ...textStyle, color: baseColor }, children: text }), _jsx("span", { style: {
|
|
103
|
+
...textStyle,
|
|
104
|
+
position: 'absolute',
|
|
105
|
+
inset: 0,
|
|
106
|
+
color: 'transparent',
|
|
107
|
+
backgroundClip: 'text',
|
|
108
|
+
WebkitBackgroundClip: 'text',
|
|
109
|
+
backgroundImage: `linear-gradient(110deg, transparent 30%, ${shineColor} 50%, transparent 70%)`,
|
|
110
|
+
backgroundSize: '200% 100%',
|
|
111
|
+
backgroundPosition: `${position}% 50%`,
|
|
112
|
+
}, children: text })] }) }));
|
|
113
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DispersionRingsShader — chromatic dispersion through concentric ring lenses.
|
|
3
|
+
*
|
|
4
|
+
* Port of Framer's DispersionRings shader module for Remotion/egaki.
|
|
5
|
+
* Original source:
|
|
6
|
+
* https://framerusercontent.com/modules/VMKsfJdfTvRVeIoDd5X9/fXq10iSPqH2cgEWzpK4N/DispersionRings.js
|
|
7
|
+
*
|
|
8
|
+
* An animated gradient of user-defined colors is distorted through concentric
|
|
9
|
+
* ring-shaped lenses radiating from the center. Each ring splits light into
|
|
10
|
+
* RGB channels at its edges (chromatic dispersion), producing rainbow fringing
|
|
11
|
+
* similar to light passing through concentric prisms. 8-sample temporal
|
|
12
|
+
* anti-aliasing with per-sample spectral weighting gives the effect a soft,
|
|
13
|
+
* photographic quality.
|
|
14
|
+
*/
|
|
15
|
+
import type { CSSProperties } from 'react';
|
|
16
|
+
export interface DispersionRingsShaderProps {
|
|
17
|
+
/** Color palette for the gradient (max 8). Hex strings like "#91FFCC". */
|
|
18
|
+
colors?: string[];
|
|
19
|
+
/** Seed for gradient flow directions and frequencies. Different seeds = different patterns. */
|
|
20
|
+
seed?: number;
|
|
21
|
+
/** Animation speed multiplier. 0 = frozen, 0.5 = default, 2 = fast. */
|
|
22
|
+
speed?: number;
|
|
23
|
+
/** Wavy spatial jitter per sample. 0 = clean, higher = dreamy/melting distortion. */
|
|
24
|
+
ephemeralAmp?: number;
|
|
25
|
+
/** UV scale before the ring grid. Higher = more zoomed in, fewer visible rings. */
|
|
26
|
+
lensScale?: number;
|
|
27
|
+
/** Spacing between concentric rings. Smaller = tighter rings. */
|
|
28
|
+
ringSpacing?: number;
|
|
29
|
+
/** Radius of each ring lens. Controls magnification area vs flat area. */
|
|
30
|
+
ringRadius?: number;
|
|
31
|
+
/** How strongly the ring lens warps UVs. Higher = more magnification. */
|
|
32
|
+
ringWarpStrength?: number;
|
|
33
|
+
/** How much R and B channels diverge from G at ring edges. 0 = none, 1 = maximum. */
|
|
34
|
+
ringDispersion?: number;
|
|
35
|
+
/** Extra rainbow tint multiplier at ring edges. Pushes edge colors toward prismatic look. */
|
|
36
|
+
edgeDisp?: number;
|
|
37
|
+
style?: CSSProperties;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Property controls matching the original Framer DispersionRings module.
|
|
41
|
+
* Ranges, defaults, and step sizes are preserved from the original.
|
|
42
|
+
*/
|
|
43
|
+
export declare const DispersionRingsShader: React.FC<DispersionRingsShaderProps>;
|
|
44
|
+
//# sourceMappingURL=dispersion-rings-shader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispersion-rings-shader.d.ts","sourceRoot":"","sources":["../../src/vite/dispersion-rings-shader.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAO1C,MAAM,WAAW,0BAA0B;IACzC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AA6MD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EA2E5B,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAA"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { defineShader } from "./shader-renderer.js";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Fragment shader body
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Raw GLSL fragment body from DispersionRings.js.
|
|
8
|
+
* The defineShader engine prepends #version, precision, v_uv, fragColor,
|
|
9
|
+
* uniform declarations, and built-in uniforms automatically.
|
|
10
|
+
*
|
|
11
|
+
* Algorithm overview:
|
|
12
|
+
* 1. Gradient flow: seed-derived sin/cos waves create an organic color field
|
|
13
|
+
* 2. Ring lens: distance from center is divided into repeating ring cells;
|
|
14
|
+
* each ring has a spherical lens that warps UVs (magnification at center,
|
|
15
|
+
* edge factor at rim)
|
|
16
|
+
* 3. Chromatic dispersion: lens applied 3x per sample (R, G, B) with different
|
|
17
|
+
* index-of-refraction offsets, splitting color channels at ring edges
|
|
18
|
+
* 4. 8-sample TAA: per-pixel random offset + spectral tint weights, averaged
|
|
19
|
+
*/
|
|
20
|
+
const FRAGMENT_SOURCE = `
|
|
21
|
+
const int SAMPLES = 8;
|
|
22
|
+
const float EPHEMERAL_DRIP = 1.0;
|
|
23
|
+
|
|
24
|
+
// === PCG hash - https://www.jcgt.org/published/0009/03/02/
|
|
25
|
+
uvec3 hash3(uvec3 v) {
|
|
26
|
+
v = v * 1664525u + 1013904223u;
|
|
27
|
+
v.x += v.y * v.z;
|
|
28
|
+
v.y += v.z * v.x;
|
|
29
|
+
v.z += v.x * v.y;
|
|
30
|
+
v ^= v >> 16u;
|
|
31
|
+
v.x += v.y * v.z;
|
|
32
|
+
v.y += v.z * v.x;
|
|
33
|
+
v.z += v.x * v.y;
|
|
34
|
+
return v;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
uvec3 seed;
|
|
38
|
+
vec3 random3f() {
|
|
39
|
+
seed = hash3(seed);
|
|
40
|
+
return vec3(seed) / float(-1u);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
vec3 seedRandom(float seedVal) {
|
|
44
|
+
uvec3 s = uvec3(
|
|
45
|
+
floatBitsToUint(seedVal),
|
|
46
|
+
floatBitsToUint(seedVal * 1.5 + 7.31),
|
|
47
|
+
floatBitsToUint(seedVal * 2.7 + 13.37)
|
|
48
|
+
);
|
|
49
|
+
s = hash3(s);
|
|
50
|
+
return vec3(s) / float(0xFFFFFFFFu);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// === PALETTE SAMPLING ===
|
|
54
|
+
vec3 getColor(int idx) {
|
|
55
|
+
if (u_colors_length < 1) return vec3(0.0);
|
|
56
|
+
int safeIdx = clamp(idx, 0, u_colors_length - 1);
|
|
57
|
+
return u_colors[safeIdx].rgb;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
vec3 paletteN(float t, int count) {
|
|
61
|
+
if (count < 1) return vec3(0.0);
|
|
62
|
+
if (count < 2) return getColor(0);
|
|
63
|
+
t = clamp(t, 0.0, 1.0) * float(count - 1);
|
|
64
|
+
int idx = min(int(floor(t)), count - 2);
|
|
65
|
+
float localT = fract(t);
|
|
66
|
+
localT = localT * localT * (3.0 - 2.0 * localT);
|
|
67
|
+
return mix(getColor(idx), getColor(idx + 1), localT);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// === Gradient Flow ===
|
|
71
|
+
float getGradientT(vec2 uv, float t, vec2 dir1, vec2 dir2, vec3 freqs, vec2 dir3) {
|
|
72
|
+
vec2 suv = uv * 1.;
|
|
73
|
+
|
|
74
|
+
float flow = dot(suv, dir1) + sin(dot(suv, dir2) * freqs.x + t) * 0.3 + t * 0.2;
|
|
75
|
+
float flow2 = dot(suv, dir2.yx) + cos(dot(suv, dir1.yx) * freqs.y - t * 0.8) * 0.25;
|
|
76
|
+
|
|
77
|
+
float gradT = sin(flow * 1.5) * 0.5 + 0.5;
|
|
78
|
+
gradT += cos(flow2 * 1.2) * 1.3;
|
|
79
|
+
gradT += sin(dot(suv, dir3) * freqs.z + t * 3.5) * 1.2;
|
|
80
|
+
|
|
81
|
+
return smoothstep(0.0, 4.12, gradT);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// === RING LENS ===
|
|
85
|
+
void applyRingLens(vec2 pp, vec2 fragCoord, vec2 r, float iorOffset, out vec2 warpedUV, out float edgeFactor) {
|
|
86
|
+
float radiusSq = u_ringRadius * u_ringRadius;
|
|
87
|
+
|
|
88
|
+
vec2 lensUV = (fragCoord - vec2(r.x * 0.5, 0.0)) / r.y * u_lensScale;
|
|
89
|
+
float dist = length(lensUV);
|
|
90
|
+
|
|
91
|
+
float fw = fwidth(dist / u_ringSpacing) * u_ringSpacing;
|
|
92
|
+
|
|
93
|
+
float ringDist = mod(dist, u_ringSpacing) / u_ringSpacing;
|
|
94
|
+
float ringShifted = ringDist - 0.5;
|
|
95
|
+
float localR = ringShifted * 2.0;
|
|
96
|
+
|
|
97
|
+
float sp = radiusSq - localR * localR;
|
|
98
|
+
|
|
99
|
+
float edgeSdf = abs(localR) - u_ringRadius;
|
|
100
|
+
float edgeAA = smoothstep(fw, -fw, edgeSdf);
|
|
101
|
+
|
|
102
|
+
float lensAmount = smoothstep(0., 0.3, sp);
|
|
103
|
+
edgeFactor = (1.0 - smoothstep(0.0, radiusSq, sp)) * lensAmount * edgeAA;
|
|
104
|
+
|
|
105
|
+
vec2 dir = lensUV / max(dist, 0.001);
|
|
106
|
+
|
|
107
|
+
warpedUV = pp;
|
|
108
|
+
if (sp > 0.0) {
|
|
109
|
+
float lens = sqrt(sp) / max(u_ringRadius, 0.001);
|
|
110
|
+
float baseWarp = mix(1.0, u_ringWarpStrength, lens);
|
|
111
|
+
float warpAmount = baseWarp * (1.0 + iorOffset);
|
|
112
|
+
float ringCenter = (floor(dist / u_ringSpacing) + 0.5) * u_ringSpacing;
|
|
113
|
+
vec2 offset = pp - dir * ringCenter;
|
|
114
|
+
warpedUV = dir * ringCenter + offset * warpAmount;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
void main() {
|
|
119
|
+
vec2 fragCoord = v_uv * u_resolution;
|
|
120
|
+
seed = uvec3(uvec2(fragCoord), uint(fract(u_time) * 1000.0));
|
|
121
|
+
|
|
122
|
+
vec2 r = u_resolution;
|
|
123
|
+
vec2 p = (fragCoord * 2.0 - r) / r.y;
|
|
124
|
+
float t = u_time * u_speed;
|
|
125
|
+
|
|
126
|
+
int colorCount = u_colors_length;
|
|
127
|
+
|
|
128
|
+
// Early out: no colors -> black
|
|
129
|
+
if (colorCount < 1) {
|
|
130
|
+
fragColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Seed-based flow directions (precomputed once)
|
|
135
|
+
vec3 seedOff1 = seedRandom(u_seed);
|
|
136
|
+
vec3 seedOff2 = seedRandom(u_seed + 100.0);
|
|
137
|
+
|
|
138
|
+
float angle1 = seedOff1.x * 6.28;
|
|
139
|
+
float angle2 = seedOff1.y * 6.28;
|
|
140
|
+
vec2 dir1 = vec2(cos(angle1), sin(angle1));
|
|
141
|
+
vec2 dir2 = vec2(cos(angle2), sin(angle2));
|
|
142
|
+
vec2 dir3 = dir1 + dir2;
|
|
143
|
+
vec3 freqs = vec3(
|
|
144
|
+
1.0 + seedOff1.z * 2.0,
|
|
145
|
+
1.0 + seedOff2.x * 1.5,
|
|
146
|
+
1.5 + seedOff2.y * 2.0
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
float dice = random3f().x;
|
|
150
|
+
|
|
151
|
+
vec3 ringIorOffsets = vec3(-1.0, 0.0, 1.0) * u_ringDispersion;
|
|
152
|
+
|
|
153
|
+
vec3 col = vec3(0.0);
|
|
154
|
+
|
|
155
|
+
for (int i = 0; i < SAMPLES; i++) {
|
|
156
|
+
float ephemeral = (float(i) + dice) / float(SAMPLES);
|
|
157
|
+
float sqEph = ephemeral * ephemeral;
|
|
158
|
+
|
|
159
|
+
vec2 pt = p;
|
|
160
|
+
pt.x += u_ephemeralAmp * sqEph * sin(p.y * 2.0 + t);
|
|
161
|
+
pt.y += u_ephemeralAmp * sqEph * cos(p.x * 1.5 - t) * 0.5;
|
|
162
|
+
pt.y -= (1.0 - exp(-EPHEMERAL_DRIP * sqEph)) * abs(pt.y) * sign(pt.y) * 0.3;
|
|
163
|
+
|
|
164
|
+
vec3 tint = smoothstep(1.0, 0.0, abs(3.0 * ephemeral - vec3(1.0, 1.5, 2.0)));
|
|
165
|
+
|
|
166
|
+
vec3 gradTs = vec3(0.0);
|
|
167
|
+
vec3 edgeFactors = vec3(0.0);
|
|
168
|
+
|
|
169
|
+
for (int c = 0; c < 3; c++) {
|
|
170
|
+
vec2 pp = pt * u_lensScale;
|
|
171
|
+
vec2 warpedUV;
|
|
172
|
+
float edgeFactor;
|
|
173
|
+
applyRingLens(pp, fragCoord, r, ringIorOffsets[c], warpedUV, edgeFactor);
|
|
174
|
+
|
|
175
|
+
vec2 gradUV = warpedUV / u_lensScale;
|
|
176
|
+
gradTs[c] = getGradientT(gradUV, t * 0.8, dir1, dir2, freqs, dir3);
|
|
177
|
+
edgeFactors[c] = edgeFactor;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
vec3 convergentColor = paletteN(gradTs.g, colorCount);
|
|
181
|
+
float edgeMix = max(max(edgeFactors.r, edgeFactors.g), edgeFactors.b);
|
|
182
|
+
|
|
183
|
+
vec3 dispersedColor = vec3(
|
|
184
|
+
paletteN(gradTs.r, colorCount).r,
|
|
185
|
+
convergentColor.g,
|
|
186
|
+
paletteN(gradTs.b, colorCount).b
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
vec3 finalColor = mix(convergentColor, dispersedColor, edgeMix * 2.0);
|
|
190
|
+
|
|
191
|
+
vec3 rainbow = (gradTs - gradTs.g) * 3.0;
|
|
192
|
+
finalColor += rainbow * edgeMix * u_edgeDisp;
|
|
193
|
+
|
|
194
|
+
col += tint * finalColor * (3.0 / float(SAMPLES));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
fragColor = vec4(col, 1.0);
|
|
198
|
+
}
|
|
199
|
+
`;
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Component
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
/**
|
|
204
|
+
* Property controls matching the original Framer DispersionRings module.
|
|
205
|
+
* Ranges, defaults, and step sizes are preserved from the original.
|
|
206
|
+
*/
|
|
207
|
+
export const DispersionRingsShader = defineShader({
|
|
208
|
+
title: 'DispersionRingsShader',
|
|
209
|
+
fragment: FRAGMENT_SOURCE,
|
|
210
|
+
propertyControls: {
|
|
211
|
+
colors: {
|
|
212
|
+
type: 'array',
|
|
213
|
+
control: { type: 'color' },
|
|
214
|
+
maxCount: 8,
|
|
215
|
+
maxVisible: 4,
|
|
216
|
+
defaultValue: ['#91FFCC', '#FFB938', '#FF4242'],
|
|
217
|
+
},
|
|
218
|
+
seed: {
|
|
219
|
+
type: 'number',
|
|
220
|
+
defaultValue: 47,
|
|
221
|
+
min: 0,
|
|
222
|
+
max: 1000,
|
|
223
|
+
step: 1,
|
|
224
|
+
},
|
|
225
|
+
speed: {
|
|
226
|
+
type: 'number',
|
|
227
|
+
defaultValue: 0.5,
|
|
228
|
+
min: 0,
|
|
229
|
+
max: 2,
|
|
230
|
+
step: 0.01,
|
|
231
|
+
},
|
|
232
|
+
ephemeralAmp: {
|
|
233
|
+
type: 'number',
|
|
234
|
+
defaultValue: 0.12,
|
|
235
|
+
min: 0,
|
|
236
|
+
max: 0.5,
|
|
237
|
+
step: 0.01,
|
|
238
|
+
},
|
|
239
|
+
lensScale: {
|
|
240
|
+
type: 'number',
|
|
241
|
+
defaultValue: 10,
|
|
242
|
+
min: 0.1,
|
|
243
|
+
max: 10,
|
|
244
|
+
step: 0.1,
|
|
245
|
+
},
|
|
246
|
+
ringSpacing: {
|
|
247
|
+
type: 'number',
|
|
248
|
+
defaultValue: 1.5,
|
|
249
|
+
min: 0.1,
|
|
250
|
+
max: 5,
|
|
251
|
+
step: 0.1,
|
|
252
|
+
},
|
|
253
|
+
ringRadius: {
|
|
254
|
+
type: 'number',
|
|
255
|
+
defaultValue: 1,
|
|
256
|
+
min: 0.1,
|
|
257
|
+
max: 2,
|
|
258
|
+
step: 0.01,
|
|
259
|
+
},
|
|
260
|
+
ringWarpStrength: {
|
|
261
|
+
type: 'number',
|
|
262
|
+
defaultValue: 4,
|
|
263
|
+
min: 0,
|
|
264
|
+
max: 5,
|
|
265
|
+
step: 0.1,
|
|
266
|
+
},
|
|
267
|
+
ringDispersion: {
|
|
268
|
+
type: 'number',
|
|
269
|
+
defaultValue: 0.4,
|
|
270
|
+
min: 0,
|
|
271
|
+
max: 1,
|
|
272
|
+
step: 0.01,
|
|
273
|
+
},
|
|
274
|
+
edgeDisp: {
|
|
275
|
+
type: 'number',
|
|
276
|
+
defaultValue: 1.3,
|
|
277
|
+
min: 0,
|
|
278
|
+
max: 5,
|
|
279
|
+
step: 0.1,
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
});
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Easing curve engine for spring/bounce/overshoot presets.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Jitter's easing engine (jitter.video webpack bundle,
|
|
5
|
+
* module 78102). The presets were previously stored as hardcoded sample
|
|
6
|
+
* arrays extracted from Jitter; they are now generated from the same
|
|
7
|
+
* three primitives Jitter uses:
|
|
8
|
+
*
|
|
9
|
+
* 1. Polybezier paths: control points with handles, linearly interpolated
|
|
10
|
+
* between intensity configs (d3-interpolate semantics), each segment
|
|
11
|
+
* evaluated with an analytic (Cardano) cubic-bezier y(x) solver.
|
|
12
|
+
* 2. Spring physics (elasticSnap): semi-implicit Euler, step 0.005,
|
|
13
|
+
* settle epsilon 1e-10, timeline truncated at 34% of settle time.
|
|
14
|
+
* 3. Bounce physics: explicit Euler, step 1, gravity 9.8e-6, velocity
|
|
15
|
+
* flipped and scaled by bounceFactor when crossing position 100,
|
|
16
|
+
* capped at 16 bounces.
|
|
17
|
+
*
|
|
18
|
+
* Each `*Samples` export contains 51 evenly-spaced points (t=0 to t=1)
|
|
19
|
+
* per intensity level (0, 25, 50, 75, 100), rounded to 4 decimals exactly
|
|
20
|
+
* like Jitter does. The generated values are verified against the original
|
|
21
|
+
* extracted arrays in easing-curves.test.ts. Values can exceed the 0-1
|
|
22
|
+
* range for overshoot and bounce effects.
|
|
23
|
+
*
|
|
24
|
+
* Porting lessons (do not "simplify" these or the outputs change):
|
|
25
|
+
* - Lerp must be `a * (1 - t) + b * t` (d3-interpolate form), not
|
|
26
|
+
* `a + (b - a) * t`, to stay bit-identical with Jitter's output.
|
|
27
|
+
* - The intensity pair search keeps the LOWER key on distance ties
|
|
28
|
+
* (strict `<` in the reduce), so intensity 25 lerps configs 0..50.
|
|
29
|
+
* - Spring acceleration must keep Jitter's exact expression order:
|
|
30
|
+
* `(-tension * (pos - 100) + -friction * v) / mass`.
|
|
31
|
+
* - Rounding is `Math.round((x + Number.EPSILON) * 1e4) / 1e4`.
|
|
32
|
+
*/
|
|
33
|
+
/** Symbol key for attaching bezier control points to easing functions. */
|
|
34
|
+
export declare const BEZIER_POINTS: unique symbol;
|
|
35
|
+
/**
|
|
36
|
+
* cubic-bezier(x1, y1, x2, y2) as a y(x) function. x1/x2 must be in [0, 1];
|
|
37
|
+
* y values may exceed [0, 1] for overshoot.
|
|
38
|
+
*
|
|
39
|
+
* The returned function has a `[BEZIER_POINTS]` property with the original
|
|
40
|
+
* `[x1, y1, x2, y2]` tuple so the tweakpane bezier blade can show and edit
|
|
41
|
+
* the exact curve.
|
|
42
|
+
*/
|
|
43
|
+
export declare function cubicBezier(x1: number, y1: number, x2: number, y2: number): (x: number) => number;
|
|
44
|
+
/** Handle: x is a fraction toward the neighbor anchor, y is in value units. */
|
|
45
|
+
export interface HandleXY {
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
}
|
|
49
|
+
/** A bare number is shorthand for `{ x: number, y: 0 }`. */
|
|
50
|
+
export type Handle = number | HandleXY;
|
|
51
|
+
export interface ControlPoint {
|
|
52
|
+
x: number;
|
|
53
|
+
y: number;
|
|
54
|
+
/** Handle toward the previous point (incoming). */
|
|
55
|
+
lower?: Handle;
|
|
56
|
+
/** Handle toward the next point (outgoing). */
|
|
57
|
+
upper?: Handle;
|
|
58
|
+
}
|
|
59
|
+
/** Build a y(x) easing function from polybezier control points. */
|
|
60
|
+
export declare function polybezier(points: ControlPoint[]): (x: number) => number;
|
|
61
|
+
/** An easing preset parameterized by intensity (0-100, continuous). */
|
|
62
|
+
export type EasingPreset = (intensity: number) => (t: number) => number;
|
|
63
|
+
/** Polybezier preset parameterized by intensity. */
|
|
64
|
+
export declare function pathPreset(configs: Record<number, ControlPoint[]>): EasingPreset;
|
|
65
|
+
export interface SpringPhysicsConfig {
|
|
66
|
+
mass: number;
|
|
67
|
+
tension: number;
|
|
68
|
+
friction: number;
|
|
69
|
+
v0: number;
|
|
70
|
+
}
|
|
71
|
+
/** Spring preset parameterized by intensity. */
|
|
72
|
+
export declare function springPreset(configs: Record<number, SpringPhysicsConfig>): EasingPreset;
|
|
73
|
+
export interface BouncePhysicsConfig {
|
|
74
|
+
mass: number;
|
|
75
|
+
/** Fraction of velocity kept (and flipped) at each bounce. */
|
|
76
|
+
bounceFactor: number;
|
|
77
|
+
friction: number;
|
|
78
|
+
v0: number;
|
|
79
|
+
}
|
|
80
|
+
/** Bounce preset parameterized by intensity. */
|
|
81
|
+
export declare function bouncePreset(configs: Record<number, BouncePhysicsConfig>): EasingPreset;
|
|
82
|
+
export type Intensity = 0 | 25 | 50 | 75 | 100;
|
|
83
|
+
/** Sample a preset at 51 evenly spaced points for all 5 intensity levels. */
|
|
84
|
+
export declare function samplePreset(preset: EasingPreset): Record<Intensity, number[]>;
|
|
85
|
+
/** natural:throw:v1 — anticipate backward, fly past, settle */
|
|
86
|
+
export declare const naturalThrow: EasingPreset;
|
|
87
|
+
/** slowdown:overshoot:v1 — decelerate with a single overshoot */
|
|
88
|
+
export declare const decelerateOvershoot: EasingPreset;
|
|
89
|
+
/** slowdown:elasticOvershoot:v1 — decelerate with elastic overshoot */
|
|
90
|
+
export declare const decelerateElastic: EasingPreset;
|
|
91
|
+
/** accelerate:impulse:v1 — dip backward then accelerate away */
|
|
92
|
+
export declare const accelerateImpulse: EasingPreset;
|
|
93
|
+
/** accelerate:elastic:v1 — elastic windup then accelerate away */
|
|
94
|
+
export declare const accelerateElastic: EasingPreset;
|
|
95
|
+
/** elastic:standard:v1 — spring snap with ringing oscillation */
|
|
96
|
+
export declare const elasticSnap: EasingPreset;
|
|
97
|
+
/** bounce:standard:v1 — like a ball dropping */
|
|
98
|
+
export declare const bounce: EasingPreset;
|
|
99
|
+
/** bounce:anticipate:v1 — pull back first, then bounce into place */
|
|
100
|
+
export declare const bounceAnticipate: EasingPreset;
|
|
101
|
+
/** bounce:throw:v1 — thrown with initial velocity, bounces on landing */
|
|
102
|
+
export declare const bounceThrow: EasingPreset;
|
|
103
|
+
/** impulse:standard:v1 — slow dip then gradual release */
|
|
104
|
+
export declare const impulseSlow: EasingPreset;
|
|
105
|
+
/** impulseAndOvershoot:standard:v1 — dip backward, overshoot, settle */
|
|
106
|
+
export declare const impulseOvershoot: EasingPreset;
|
|
107
|
+
/** overshoot:standard:v1 — overshoot then settle back */
|
|
108
|
+
export declare const overshoot: EasingPreset;
|
|
109
|
+
/** overshoot:elastic:v1 — overshoot with elastic ringing */
|
|
110
|
+
export declare const overshootElastic: EasingPreset;
|
|
111
|
+
/** overshoot:bouncy:v1 — overshoot with a bouncy settle */
|
|
112
|
+
export declare const overshootBouncy: EasingPreset;
|
|
113
|
+
export declare const naturalThrowSamples: Record<Intensity, number[]>;
|
|
114
|
+
export declare const decelerateOvershootSamples: Record<Intensity, number[]>;
|
|
115
|
+
export declare const decelerateElasticSamples: Record<Intensity, number[]>;
|
|
116
|
+
export declare const accelerateImpulseSamples: Record<Intensity, number[]>;
|
|
117
|
+
export declare const accelerateElasticSamples: Record<Intensity, number[]>;
|
|
118
|
+
export declare const elasticSnapSamples: Record<Intensity, number[]>;
|
|
119
|
+
export declare const bounceSamples: Record<Intensity, number[]>;
|
|
120
|
+
export declare const bounceAnticipateSamples: Record<Intensity, number[]>;
|
|
121
|
+
export declare const bounceThrowSamples: Record<Intensity, number[]>;
|
|
122
|
+
export declare const impulseSlowSamples: Record<Intensity, number[]>;
|
|
123
|
+
export declare const impulseOvershootSamples: Record<Intensity, number[]>;
|
|
124
|
+
export declare const overshootSamples: Record<Intensity, number[]>;
|
|
125
|
+
export declare const overshootElasticSamples: Record<Intensity, number[]>;
|
|
126
|
+
export declare const overshootBouncySamples: Record<Intensity, number[]>;
|
|
127
|
+
/** Linearly interpolate a sampled curve at time t (0-1). */
|
|
128
|
+
export declare function lerpSamples(samples: readonly number[], t: number): number;
|
|
129
|
+
//# sourceMappingURL=easing-curves.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing-curves.d.ts","sourceRoot":"","sources":["../../src/vite/easing-curves.ts"],"names":[],"mappings":"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"}
|