@mevdragon/vidfarm-devcli 0.20.6 โ†’ 0.20.9

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.
Files changed (157) hide show
  1. package/.agents/skills/editor-capabilities/SKILL.md +15 -1
  2. package/.agents/skills/vidfarm-director/SKILL.md +106 -0
  3. package/.agents/skills/vidfarm-director/recipes/find-and-fork-template.md +16 -0
  4. package/.agents/skills/vidfarm-director/recipes/local-edit-render-approve.md +13 -0
  5. package/.agents/skills/vidfarm-director/recipes/onboard-a-new-director.md +13 -0
  6. package/.agents/skills/vidfarm-director/recipes/retheme-template.md +17 -0
  7. package/.agents/skills/vidfarm-director/references/assets-and-sourcing.md +117 -0
  8. package/.agents/skills/vidfarm-director/references/automation-and-local-dev.md +245 -0
  9. package/.agents/skills/vidfarm-director/references/core-workflows.md +273 -0
  10. package/.agents/skills/vidfarm-director/references/editor-workflows.md +365 -0
  11. package/.agents/skills/vidfarm-director/references/onboarding.md +28 -0
  12. package/.agents/skills/vidfarm-director/references/primitives.md +308 -0
  13. package/SKILL.director.md +517 -250
  14. package/dist/src/cli.js +563 -99
  15. package/dist/src/devcli/clips.js +29 -12
  16. package/dist/src/devcli/doctor.js +2 -2
  17. package/dist/src/devcli/local-backend.js +46 -2
  18. package/dist/src/services/clip-curation/cost.js +5 -1
  19. package/dist/src/services/clip-curation/gemini.js +14 -2
  20. package/dist/src/services/clip-curation/hunt.js +56 -0
  21. package/dist/src/services/clip-curation/index.js +1 -1
  22. package/dist/src/services/clip-curation/scan.js +5 -3
  23. package/package.json +30 -10
  24. package/SKILL.platform.md +0 -432
  25. package/demo/README.md +0 -28
  26. package/demo/dist/app.css +0 -1
  27. package/demo/dist/app.js +0 -1850
  28. package/demo/dist/chunks/chunk-DXB73IDG.js +0 -1
  29. package/demo/dist/chunks/chunk-S7OWAJDS.js +0 -36
  30. package/demo/dist/chunks/chunk-VTIBZ6AN.js +0 -1
  31. package/demo/dist/chunks/dist-ADSJKBVE.js +0 -332
  32. package/demo/dist/chunks/domEditingLayers-VZMLL4AP-SGHWPND4.js +0 -1
  33. package/demo/dist/chunks/hyperframes-player-XB65TCD6.js +0 -425
  34. package/demo/dist/chunks/lib-XAQ37YOE.js +0 -1
  35. package/demo/dist/chunks/src-TJ2QYA4U.js +0 -207
  36. package/demo/dist/favicon.ico +0 -0
  37. package/demo/dist/icons/timeline/audio.svg +0 -7
  38. package/demo/dist/icons/timeline/captions.svg +0 -5
  39. package/demo/dist/icons/timeline/composition.svg +0 -12
  40. package/demo/dist/icons/timeline/image.svg +0 -18
  41. package/demo/dist/icons/timeline/music.svg +0 -10
  42. package/demo/dist/icons/timeline/text.svg +0 -3
  43. package/demo/dist/index.html +0 -15
  44. package/dist/src/account-pages-legacy.js +0 -9396
  45. package/dist/src/account-pages.js +0 -61
  46. package/dist/src/app.js +0 -21603
  47. package/dist/src/composition-runtime.js +0 -1053
  48. package/dist/src/config.js +0 -217
  49. package/dist/src/context.js +0 -447
  50. package/dist/src/dev-app-legacy.js +0 -739
  51. package/dist/src/dev-app.js +0 -6
  52. package/dist/src/devcli/migrate-local.js +0 -140
  53. package/dist/src/devcli/sync.js +0 -368
  54. package/dist/src/domain.js +0 -5
  55. package/dist/src/editor-chat-history.js +0 -82
  56. package/dist/src/editor-chat.js +0 -828
  57. package/dist/src/editor-dark-theme.js +0 -1128
  58. package/dist/src/frontend/debug.js +0 -71
  59. package/dist/src/frontend/discover-client.js +0 -130
  60. package/dist/src/frontend/discover-store.js +0 -23
  61. package/dist/src/frontend/file-directory.js +0 -1018
  62. package/dist/src/frontend/flockposter-cache-store.js +0 -124
  63. package/dist/src/frontend/homepage-client.js +0 -446
  64. package/dist/src/frontend/homepage-shared.js +0 -201
  65. package/dist/src/frontend/homepage-store.js +0 -66
  66. package/dist/src/frontend/homepage-view.js +0 -705
  67. package/dist/src/frontend/page-runtime-client.js +0 -132
  68. package/dist/src/frontend/page-runtime-store.js +0 -9
  69. package/dist/src/frontend/sentry.js +0 -42
  70. package/dist/src/frontend/template-editor-chat.js +0 -4181
  71. package/dist/src/help-page.js +0 -346
  72. package/dist/src/homepage.js +0 -1458
  73. package/dist/src/index.js +0 -16
  74. package/dist/src/instrument.js +0 -30
  75. package/dist/src/landing-page.js +0 -384
  76. package/dist/src/page-runtime.js +0 -2
  77. package/dist/src/page-shell.js +0 -1452
  78. package/dist/src/primitive-context.js +0 -416
  79. package/dist/src/primitive-registry.js +0 -3940
  80. package/dist/src/primitive-sdk.js +0 -4
  81. package/dist/src/primitives/hyperframes-media.js +0 -108
  82. package/dist/src/react-page-shell.js +0 -35
  83. package/dist/src/ready-post-schedule-component.js +0 -1540
  84. package/dist/src/registry.js +0 -296
  85. package/dist/src/reskin/agency-page.js +0 -299
  86. package/dist/src/reskin/calendar-page.js +0 -568
  87. package/dist/src/reskin/chat-page.js +0 -942
  88. package/dist/src/reskin/discover-page.js +0 -1788
  89. package/dist/src/reskin/document.js +0 -1587
  90. package/dist/src/reskin/help-page.js +0 -357
  91. package/dist/src/reskin/index-page.js +0 -62
  92. package/dist/src/reskin/inpaint-clipper-page.js +0 -890
  93. package/dist/src/reskin/inpaint-page.js +0 -2554
  94. package/dist/src/reskin/inpaint-video-page.js +0 -1339
  95. package/dist/src/reskin/job-runs-page.js +0 -477
  96. package/dist/src/reskin/library-page.js +0 -1634
  97. package/dist/src/reskin/login-page.js +0 -262
  98. package/dist/src/reskin/portfolio-page.js +0 -687
  99. package/dist/src/reskin/pricing-page.js +0 -390
  100. package/dist/src/reskin/settings-page.js +0 -732
  101. package/dist/src/reskin/theme.js +0 -711
  102. package/dist/src/runtime.js +0 -35
  103. package/dist/src/services/api-call-history.js +0 -249
  104. package/dist/src/services/auth.js +0 -152
  105. package/dist/src/services/billing-pricing.js +0 -39
  106. package/dist/src/services/billing.js +0 -241
  107. package/dist/src/services/cast.js +0 -127
  108. package/dist/src/services/chat-threads.js +0 -92
  109. package/dist/src/services/clip-records.js +0 -250
  110. package/dist/src/services/clip-search.js +0 -77
  111. package/dist/src/services/clip-vectors.js +0 -125
  112. package/dist/src/services/composition-sanitize.js +0 -124
  113. package/dist/src/services/composition-watch.js +0 -79
  114. package/dist/src/services/elevenlabs.js +0 -222
  115. package/dist/src/services/file-directory.js +0 -117
  116. package/dist/src/services/fork-access.js +0 -93
  117. package/dist/src/services/fork-manifest.js +0 -42
  118. package/dist/src/services/ghostcut.js +0 -179
  119. package/dist/src/services/hyperframes.js +0 -3654
  120. package/dist/src/services/job-capacity.js +0 -14
  121. package/dist/src/services/job-logs.js +0 -197
  122. package/dist/src/services/jobs.js +0 -136
  123. package/dist/src/services/local-dynamo.js +0 -0
  124. package/dist/src/services/media-processing.js +0 -766
  125. package/dist/src/services/primitive-media-lambda.js +0 -280
  126. package/dist/src/services/providers.js +0 -2748
  127. package/dist/src/services/rate-limits.js +0 -262
  128. package/dist/src/services/scene-annotations.js +0 -32
  129. package/dist/src/services/serverless-auth.js +0 -382
  130. package/dist/src/services/serverless-jobs.js +0 -1084
  131. package/dist/src/services/serverless-provider-keys.js +0 -409
  132. package/dist/src/services/serverless-records.js +0 -1515
  133. package/dist/src/services/serverless-template-configs.js +0 -75
  134. package/dist/src/services/storage.js +0 -461
  135. package/dist/src/services/swipe-customize.js +0 -437
  136. package/dist/src/services/template-certification.js +0 -413
  137. package/dist/src/services/template-loader.js +0 -99
  138. package/dist/src/services/template-runtime-bundles.js +0 -217
  139. package/dist/src/services/template-sources.js +0 -1017
  140. package/dist/src/services/upstream.js +0 -248
  141. package/dist/src/services/video-normalization.js +0 -2
  142. package/dist/src/services/webhooks.js +0 -62
  143. package/dist/src/template-editor-pages.js +0 -2576
  144. package/dist/src/template-editor-shell.js +0 -2893
  145. package/dist/src/template-sdk.js +0 -4
  146. package/dist/src/worker.js +0 -17
  147. package/public/assets/discover-client-app.js +0 -1
  148. package/public/assets/file-directory-app.js +0 -3
  149. package/public/assets/homepage-app.js +0 -54
  150. package/public/assets/homepage-client-app.js +0 -80
  151. package/public/assets/page-runtime-client-app.js +0 -94
  152. package/public/assets/placeholders/scene-placeholder.png +0 -0
  153. package/src/assets/SELLING_AWARENESS_STAGES.md +0 -579
  154. package/src/assets/SELLING_WITH_HOOKS.md +0 -377
  155. package/src/assets/SELLING_WITH_VSLS.md +0 -606
  156. package/src/assets/favicon.ico +0 -0
  157. package/src/assets/logo-vidfarm.png +0 -0
package/dist/src/index.js DELETED
@@ -1,16 +0,0 @@
1
- import { startRuntime } from "./runtime.js";
2
- void (async () => {
3
- const runtime = await startRuntime();
4
- for (const signal of ["SIGINT", "SIGTERM"]) {
5
- process.on(signal, () => {
6
- void (async () => {
7
- await runtime.shutdown();
8
- process.exit(0);
9
- })();
10
- });
11
- }
12
- })().catch((error) => {
13
- console.error(error instanceof Error ? error.stack ?? error.message : String(error));
14
- process.exit(1);
15
- });
16
- //# sourceMappingURL=index.js.map
@@ -1,30 +0,0 @@
1
- import dotenv from "dotenv";
2
- import * as Sentry from "@sentry/hono/node";
3
- dotenv.config();
4
- function readBoolean(name, defaultValue) {
5
- const raw = process.env[name]?.trim().toLowerCase();
6
- if (!raw)
7
- return defaultValue;
8
- return raw === "1" || raw === "true" || raw === "yes";
9
- }
10
- function readSampleRate(name, defaultValue) {
11
- const raw = process.env[name]?.trim();
12
- if (!raw)
13
- return defaultValue;
14
- const parsed = Number(raw);
15
- return Number.isFinite(parsed) && parsed >= 0 && parsed <= 1 ? parsed : defaultValue;
16
- }
17
- const dsn = process.env.SENTRY_DSN?.trim();
18
- if (dsn) {
19
- const environment = process.env.SENTRY_ENVIRONMENT?.trim() || process.env.NODE_ENV || "development";
20
- const defaultTracesSampleRate = environment === "production" ? 0.1 : 1.0;
21
- Sentry.init({
22
- dsn,
23
- environment,
24
- release: process.env.SENTRY_RELEASE?.trim() || undefined,
25
- tracesSampleRate: readSampleRate("SENTRY_TRACES_SAMPLE_RATE", defaultTracesSampleRate),
26
- enableLogs: readBoolean("SENTRY_ENABLE_LOGS", true),
27
- sendDefaultPii: readBoolean("SENTRY_SEND_DEFAULT_PII", false)
28
- });
29
- }
30
- //# sourceMappingURL=instrument.js.map
@@ -1,384 +0,0 @@
1
- // Standalone marketing landing page for vidfarm.cc (the root "/").
2
- //
3
- // This is a deliberately SELF-CONTAINED test page: its own <style> block, its
4
- // own copy-pasted design tokens, no shared page shell or React runtime. It
5
- // exists to trial the "farmville-saas-ux" design system (warm, sunny, storybook
6
- // SaaS distilled from Fillout.com) against the real Vidfarm product without
7
- // touching /discover, /editor, or any of the app surfaces.
8
- //
9
- // If we like it, it graduates into the real homepage shell. Until then keep it
10
- // isolated โ€” do not import app state or components here.
11
- // Real Vidfarm routes the CTAs point at:
12
- // /discover โ†’ the template feed (the "studio" entry point)
13
- // /library โ†’ the signed-in director's own projects
14
- // /chat โ†’ the brainstorm / AI chat
15
- // /clips โ†’ the clip library
16
- // /login โ†’ sign in
17
- const HREF = {
18
- studio: "/discover",
19
- library: "/library",
20
- chat: "/chat",
21
- clips: "/clips",
22
- login: "/login"
23
- };
24
- export function renderLandingPage(input) {
25
- const primaryCta = input.isLoggedIn
26
- ? { label: "Open the studio", href: HREF.studio }
27
- : { label: "Get started", href: HREF.studio };
28
- const quietNav = input.isLoggedIn
29
- ? `<a class="link-quiet" href="${HREF.library}">Library</a>`
30
- : `<a class="link-quiet" href="${HREF.login}">Log in</a>`;
31
- return `<!doctype html>
32
- <html lang="en">
33
- <head>
34
- <meta charset="utf-8">
35
- <meta name="viewport" content="width=device-width, initial-scale=1">
36
- <title>VidFarm โ€” short-form video that makes itself</title>
37
- <meta name="description" content="Fork a proven short-form template, remix it on the timeline, and render a share-ready MP4 โ€” all in your browser. VidFarm is the serverless video studio that scales to zero.">
38
- <meta name="theme-color" content="#171717">
39
- <meta name="robots" content="index, follow">
40
- <meta name="application-name" content="VidFarm">
41
- <link rel="canonical" href="https://vidfarm.cc/">
42
- <meta property="og:type" content="website">
43
- <meta property="og:site_name" content="VidFarm">
44
- <meta property="og:title" content="VidFarm โ€” short-form video that makes itself">
45
- <meta property="og:description" content="Fork a proven short-form template, remix it on the timeline, and render a share-ready MP4 โ€” all in your browser. VidFarm is the serverless video studio that scales to zero.">
46
- <meta property="og:url" content="https://vidfarm.cc/">
47
- <meta property="og:image" content="https://vidfarm.cc/assets/logo-vidfarm.png">
48
- <meta name="twitter:card" content="summary_large_image">
49
- <meta name="twitter:title" content="VidFarm โ€” short-form video that makes itself">
50
- <meta name="twitter:description" content="Fork a proven short-form template, remix it on the timeline, and render a share-ready MP4 โ€” all in your browser. VidFarm is the serverless video studio that scales to zero.">
51
- <meta name="twitter:image" content="https://vidfarm.cc/assets/logo-vidfarm.png">
52
- <link rel="icon" href="/assets/favicon.ico" sizes="any">
53
- <link rel="apple-touch-icon" href="/assets/logo-vidfarm.png">
54
- <link rel="preconnect" href="https://fonts.googleapis.com">
55
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
56
- <link href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@400;500;600;700;800&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
57
- <style>
58
- :root{
59
- --font-display:"Hanken Grotesk","blMelody",ui-sans-serif,system-ui,sans-serif;
60
- --font-body:"Inter",ui-sans-serif,system-ui,-apple-system,sans-serif;
61
- /* honey gold โ€” the one joy accent */
62
- --gold-500:#ffc738;--gold-600:#f6c744;--gold-700:#fcb900;--gold-tint:#fff5e4;--gold-tint2:#ffe9cc;
63
- /* ink + neutral scale */
64
- --ink:#171717;--n-800:#262626;--n-700:#404040;--n-600:#525252;--n-500:#737373;--n-400:#a3a3a3;
65
- --n-300:#d4d4d4;--n-200:#ededed;--n-100:#f5f5f5;--n-50:#fbfbfb;--white:#fff;
66
- /* support pastels */
67
- --sky:#3f9fe0;--sky-tint:#e2effd;--violet:#9f5bde;--violet-tint:#e4ddfd;--green:#22c55e;--green-tint:#dcfce7;--coral:#f97316;--coral-tint:#ffe9cc;
68
- /* semantic */
69
- --bg:var(--n-50);--bg-section:var(--n-100);--surface:var(--white);--border:var(--n-200);--border-strong:var(--n-300);
70
- --text:var(--n-700);--text-muted:var(--n-500);--text-faint:var(--n-400);
71
- /* radius */
72
- --r-md:6px;--r-lg:8px;--r-xl:12px;--r-2xl:16px;--r-3xl:24px;--r-full:9999px;
73
- /* shadow */
74
- --shadow-xs:0 1px 2px 0 #0000000d;--shadow-sm:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;
75
- --shadow-md:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;
76
- --shadow-xl:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;
77
- --shadow-card:0 1px 2px #0000000d,0 8px 24px -12px #00000014;--shadow-nav:0 4px 24px -8px #00000026,0 1px 2px #0000000d;
78
- --ring-gold:0 0 0 3px var(--gold-600),0 0 14px rgba(246,199,68,.4);
79
- /* type */
80
- --text-sm:.875rem;--text-lg:1.125rem;--text-xl:1.25rem;--text-2xl:1.5rem;--text-4xl:2.25rem;--text-5xl:3rem;
81
- --display:clamp(3rem,7vw,6rem);
82
- /* space + motion */
83
- --section-y:clamp(4rem,9vw,7rem);--container:75rem;--gutter:clamp(1rem,4vw,2rem);
84
- --nav-h:103px; /* measured nav-wrap height โ€” constant across breakpoints */
85
- --glass-blur:16px;--ease:cubic-bezier(.22,1,.36,1);--dur:220ms;
86
- }
87
- *{box-sizing:border-box;margin:0;padding:0}
88
- html{font-size:16px;scroll-behavior:smooth}
89
- body{font-family:var(--font-body);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;line-height:1.5}
90
- a{text-decoration:none;color:inherit}
91
- h1,h2,h3,h4{font-family:var(--font-display);font-weight:800;letter-spacing:-.025em;line-height:1.1;color:var(--ink)}
92
- .container{width:min(var(--container),100%);margin:0 auto;padding:0 var(--gutter)}
93
-
94
- /* nav โ€” floating frosted-glass pill */
95
- .nav-wrap{position:sticky;top:0;z-index:50;padding:16px var(--gutter);display:flex;justify-content:center}
96
- .glass{background:rgba(255,255,255,.72);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur));border:1px solid var(--border);box-shadow:var(--shadow-nav)}
97
- .nav{width:min(var(--container),100%);display:flex;align-items:center;gap:24px;padding:10px 12px 10px 22px;border-radius:var(--r-full)}
98
- .brand{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-display);font-weight:800;font-size:22px;color:var(--ink);letter-spacing:-.02em}
99
- .brand-mark{display:inline-block;vertical-align:middle;width:48px;height:48px;border-radius:12px;background:center/contain no-repeat url("/assets/logo-vidfarm.png");font-size:0;color:transparent;text-indent:-9999px;overflow:hidden}
100
- .nav-links{display:flex;gap:2px;margin:0 auto;list-style:none}
101
- .nav-links a{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;border-radius:var(--r-lg);font-size:15px;font-weight:500;color:var(--n-700);transition:background var(--dur) var(--ease)}
102
- .nav-links a:hover{background:#0000000a}
103
- .nav-cta{display:flex;align-items:center;gap:8px}
104
- .link-quiet{padding:8px 12px;font-size:15px;font-weight:500;color:var(--n-700);border-radius:var(--r-lg);transition:background var(--dur) var(--ease)}
105
- .link-quiet:hover{background:#0000000a}
106
- @media(max-width:820px){.nav-links{display:none}}
107
-
108
- /* buttons */
109
- .btn{display:inline-flex;align-items:center;gap:8px;padding:12px 20px;border-radius:var(--r-full);font-family:var(--font-body);font-size:15px;font-weight:600;border:1px solid transparent;cursor:pointer;white-space:nowrap;transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),background var(--dur) var(--ease)}
110
- .btn .arrow{transition:transform var(--dur) var(--ease)}
111
- .btn:hover .arrow{transform:translateX(3px)}
112
- .btn-ink{background:var(--ink);color:#fff;box-shadow:var(--shadow-sm)}
113
- .btn-ink:hover{background:#000;box-shadow:var(--shadow-md);transform:translateY(-1px)}
114
- .btn-gold{background:var(--gold-500);color:var(--ink);font-weight:700;box-shadow:var(--shadow-sm)}
115
- .btn-gold:hover{background:var(--gold-700);box-shadow:0 6px 18px -6px rgba(252,185,0,.6);transform:translateY(-1px)}
116
- .btn-ghost{background:#fff;color:var(--ink);border-color:var(--border);box-shadow:var(--shadow-xs)}
117
- .btn-ghost:hover{border-color:var(--border-strong);box-shadow:var(--shadow-sm)}
118
- .btn-lg{padding:15px 26px;font-size:16px}
119
-
120
- /* badges */
121
- .badge{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:var(--r-full);background:#fff;border:1px solid var(--border);box-shadow:var(--shadow-xs);font-size:14px;font-weight:500;color:var(--n-700)}
122
-
123
- /* hero band โ€” the sunny sky sits behind BOTH the nav and the hero so the
124
- frosted pill nav floats over the illustration (not on a white strip).
125
- Pulled up by one nav-height so it slides under the (body-level, still
126
- whole-page-sticky) nav; the hero's top padding adds that height back. */
127
- .hero-band{position:relative;overflow:hidden;margin-top:calc(-1 * var(--nav-h))}
128
- /* hero โ€” Tier-2 pure-CSS sunny sky (no image asset needed) */
129
- .hero{position:relative;z-index:1;text-align:center;padding:calc(var(--nav-h) + 40px) var(--gutter) 108px}
130
- .hero-art{position:absolute;inset:0;z-index:0;background:
131
- radial-gradient(58% 46% at 78% 20%,rgba(255,241,204,.9),transparent 60%),
132
- linear-gradient(180deg,#3f9fe0 0%,#6cc0f5 55%,#a9dbfb 100%)}
133
- .hero-art::after{content:"";position:absolute;right:9%;bottom:16%;width:340px;height:130px;
134
- background:radial-gradient(ellipse 60% 60% at 30% 60%,#fff,transparent 70%),radial-gradient(ellipse 50% 70% at 66% 50%,#fff,transparent 70%);filter:blur(2px);opacity:.95}
135
- .hero-art::before{content:"";position:absolute;left:6%;top:30%;width:220px;height:90px;
136
- background:radial-gradient(ellipse 60% 60% at 40% 60%,#fff,transparent 72%);filter:blur(3px);opacity:.8}
137
- .hero-inner{position:relative;z-index:1;max-width:860px;margin:0 auto;display:grid;gap:22px;justify-items:center}
138
- .hero h1{font-size:var(--display);line-height:1;letter-spacing:-.03em;color:#fff;text-shadow:0 2px 24px rgba(0,0,0,.12)}
139
- .hero h1 .soft{color:rgba(255,255,255,.55)}
140
- .hero-sub{font-size:var(--text-xl);line-height:1.5;color:rgba(255,255,255,.94);max-width:600px}
141
- .hero .badge{background:rgba(255,255,255,.9)}
142
- .hero-cta{display:flex;gap:12px;flex-wrap:wrap;justify-content:center;margin-top:4px}
143
- .hero-note{font-size:var(--text-sm);color:rgba(255,255,255,.85);margin-top:2px}
144
-
145
- /* floating pipeline mockup โ€” fork โ†’ edit โ†’ render โ†’ publish nodes */
146
- .hero-shot{position:relative;z-index:2;width:min(64rem,100%);margin:-64px auto 0;background:#fff;border:1px solid var(--border);border-radius:var(--r-3xl);box-shadow:var(--shadow-xl);padding:22px}
147
- .shot-head{display:flex;align-items:center;gap:8px;padding:2px 4px 16px;border-bottom:1px solid var(--border);margin-bottom:18px}
148
- .dot{width:11px;height:11px;border-radius:50%}.dot-r{background:#ff5f57}.dot-y{background:#febc2e}.dot-g{background:#28c840}
149
- .shot-title{margin-left:8px;font-size:13px;color:var(--text-muted);font-weight:500}
150
- .pipeline{display:flex;align-items:center;gap:14px;flex-wrap:wrap;justify-content:center}
151
- .node{display:inline-flex;align-items:center;gap:12px;background:#fff;border:1px solid var(--border);border-radius:var(--r-2xl);padding:12px 16px;box-shadow:var(--shadow-sm)}
152
- .node-title{font-weight:600;font-size:15px;color:var(--ink)}.node-sub{font-size:13px;color:var(--text-muted)}
153
- .flow{color:var(--n-400);font-size:20px;flex:none}
154
- @media(max-width:640px){.flow{transform:rotate(90deg)}}
155
-
156
- /* icon tiles */
157
- .tile{width:40px;height:40px;border-radius:var(--r-xl);display:grid;place-items:center;font-size:18px;flex:none}
158
- .tile-violet{background:var(--violet-tint);color:var(--violet)}.tile-green{background:var(--green-tint);color:var(--green)}
159
- .tile-gold{background:var(--gold-tint2);color:var(--gold-700)}.tile-sky{background:var(--sky-tint);color:var(--sky)}.tile-coral{background:var(--coral-tint);color:var(--coral)}
160
-
161
- /* sections */
162
- .section{padding:var(--section-y) 0}
163
- .section-tint{background:var(--bg-section)}
164
- .center-intro{text-align:center;display:grid;gap:16px;justify-items:center;margin-bottom:48px}
165
- .section-title{font-size:var(--text-5xl);letter-spacing:-.025em}
166
- .section-sub{font-size:var(--text-xl);color:var(--text-muted);max-width:560px}
167
-
168
- /* feature cards */
169
- .grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:24px}
170
- @media(max-width:820px){.grid-2{grid-template-columns:1fr}}
171
- .card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-3xl);padding:32px;box-shadow:var(--shadow-card);transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
172
- .card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}
173
- .card .tile{margin-bottom:18px}
174
- .card h3{font-size:var(--text-2xl);font-weight:700;letter-spacing:-.02em;margin-bottom:8px}
175
- .card p{color:var(--text-muted);font-size:var(--text-lg)}
176
- .card-media{margin-top:24px;background:var(--n-50);border:1px solid var(--border);border-radius:var(--r-2xl);padding:20px;display:flex;gap:12px;flex-wrap:wrap}
177
-
178
- /* stat / trust row */
179
- .trust-wrap{display:grid;grid-template-columns:1.1fr .9fr;gap:48px;align-items:center}
180
- @media(max-width:820px){.trust-wrap{grid-template-columns:1fr}}
181
- .stat-row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
182
- .stat-card{display:grid;gap:10px}
183
- .stat-head{display:flex;align-items:center;gap:8px;font-weight:600;color:var(--ink);font-size:15px}
184
- .stat-num{font-family:var(--font-display);font-size:var(--text-5xl);font-weight:700;letter-spacing:-.02em;color:var(--ink)}
185
- .stat-sub{font-size:var(--text-sm);color:var(--text-muted)}
186
- .stars{color:var(--gold-500);font-size:18px;letter-spacing:2px}
187
-
188
- /* how-it-works steps */
189
- .steps{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:8px}
190
- @media(max-width:820px){.steps{grid-template-columns:repeat(2,1fr)}}
191
- @media(max-width:480px){.steps{grid-template-columns:1fr}}
192
- .step{background:#fff;border:1px solid var(--border);border-radius:var(--r-2xl);padding:24px;box-shadow:var(--shadow-card)}
193
- .step-n{width:32px;height:32px;border-radius:var(--r-full);background:var(--gold-tint2);color:var(--gold-700);font-family:var(--font-display);font-weight:800;display:grid;place-items:center;margin-bottom:14px;font-size:15px}
194
- .step h4{font-size:var(--text-lg);font-weight:700;margin-bottom:6px;font-family:var(--font-display);color:var(--ink)}
195
- .step p{color:var(--text-muted);font-size:15px}
196
-
197
- /* final CTA */
198
- .cta-final{text-align:center;display:grid;gap:16px;justify-items:center}
199
-
200
- /* footer โ€” warm-dark charcoal */
201
- .footer{background:var(--ink);color:var(--n-400);padding:80px var(--gutter) 40px}
202
- .footer-inner{width:min(var(--container),100%);margin:0 auto}
203
- .footer-top{display:grid;grid-template-columns:1.4fr 3fr;gap:40px;margin-bottom:40px}
204
- @media(max-width:820px){.footer-top{grid-template-columns:1fr}}
205
- .footer-brand{font-family:var(--font-display);font-weight:800;font-size:28px;color:var(--gold-500);display:inline-flex;align-items:center;gap:12px}
206
- .footer-brand .brand-mark{width:60px;height:60px;border-radius:14px}
207
- .footer-tagline{color:var(--n-500);margin-top:10px;max-width:280px}
208
- .footer-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}
209
- @media(max-width:560px){.footer-cols{grid-template-columns:repeat(2,1fr)}}
210
- .footer-col h4{color:var(--n-400);font-size:14px;font-weight:600;margin-bottom:14px;font-family:var(--font-body)}
211
- .footer-col a{display:block;color:var(--n-300);font-size:15px;padding:6px 0;transition:color var(--dur) var(--ease)}
212
- .footer-col a:hover{color:#fff}
213
- .trust-row{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px;padding-top:32px;border-top:1px solid #ffffff1a}
214
- .trust-pill{display:inline-flex;align-items:center;gap:8px;padding:8px 16px;border-radius:var(--r-full);background:#ffffff0d;color:var(--n-400);font-size:14px}
215
-
216
- :where(a,button,input,textarea):focus-visible{outline:none;box-shadow:var(--ring-gold)}
217
- </style>
218
- </head>
219
- <body>
220
-
221
- <!-- NAV (body-level so it stays sticky across the whole page) -->
222
- <header class="nav-wrap">
223
- <nav class="nav glass">
224
- <a class="brand" href="/"><span class="brand-mark">๐ŸŽฌ</span>VidFarm</a>
225
- <ul class="nav-links">
226
- <li><a href="${HREF.studio}">Templates</a></li>
227
- <li><a href="${HREF.clips}">Clips</a></li>
228
- <li><a href="${HREF.chat}">Brainstorm</a></li>
229
- <li><a href="#how">How it works</a></li>
230
- </ul>
231
- <div class="nav-cta">
232
- ${quietNav}
233
- <a class="btn btn-ink" href="${primaryCta.href}">${primaryCta.label} <span class="arrow">โ†’</span></a>
234
- </div>
235
- </nav>
236
- </header>
237
-
238
- <!-- HERO BAND: pulled up under the nav so the sky sits behind it too -->
239
- <div class="hero-band">
240
- <div class="hero-art"></div>
241
-
242
- <!-- HERO -->
243
- <section class="hero">
244
- <div class="hero-inner">
245
- <span class="badge">๐ŸŽฌ The serverless video studio</span>
246
- <h1><span class="soft">Short-form video</span><br>that makes itself</h1>
247
- <p class="hero-sub">Fork a template that already works, remix it on the timeline, and render a share-ready MP4 โ€” all in your browser.</p>
248
- <div class="hero-cta">
249
- <a class="btn btn-ink btn-lg" href="${primaryCta.href}">${primaryCta.label} <span class="arrow">โ†’</span></a>
250
- <a class="btn btn-ghost btn-lg" href="${HREF.clips}">Browse clips</a>
251
- </div>
252
- <p class="hero-note">No render farm to babysit. Scales to zero when you're done.</p>
253
- </div>
254
- </section>
255
- </div><!-- /hero-band -->
256
- <div class="hero-shot">
257
- <div class="shot-head">
258
- <span class="dot dot-r"></span><span class="dot dot-y"></span><span class="dot dot-g"></span>
259
- <span class="shot-title">VidFarm ยท trackpad editor</span>
260
- </div>
261
- <div class="pipeline">
262
- <div class="node"><span class="tile tile-sky">๐Ÿ“ผ</span><div><div class="node-title">Fork template</div><div class="node-sub">Proven hook</div></div></div>
263
- <span class="flow">โ†’</span>
264
- <div class="node"><span class="tile tile-violet">โœฆ</span><div><div class="node-title">Remix on timeline</div><div class="node-sub">Swap ยท retime ยท recaption</div></div></div>
265
- <span class="flow">โ†’</span>
266
- <div class="node"><span class="tile tile-gold">โ–ถ</span><div><div class="node-title">Render MP4</div><div class="node-sub">HyperFrames</div></div></div>
267
- <span class="flow">โ†’</span>
268
- <div class="node"><span class="tile tile-green">โœ“</span><div><div class="node-title">Publish</div><div class="node-sub">Ready to post</div></div></div>
269
- </div>
270
- </div>
271
-
272
- <!-- TRUST -->
273
- <section class="section">
274
- <div class="container">
275
- <div class="trust-wrap">
276
- <div>
277
- <h2 style="font-size:var(--text-4xl)">Everything runs serverless, so it scales to zero</h2>
278
- <p style="margin-top:16px;color:var(--text-muted);font-size:var(--text-lg)"><strong style="color:var(--ink)">No long-lived worker, no idle bill.</strong> Renders fan out across AWS Lambda in seconds โ€” or run free, in-process, on your own box with <code style="font-family:var(--font-mono,monospace);background:var(--n-100);padding:2px 6px;border-radius:6px">vidfarm serve</code>.</p>
279
- </div>
280
- <div class="stat-row">
281
- <div class="card stat-card"><div class="stat-head"><span class="tile tile-gold">โšก</span> Render time</div><div class="stat-num">~30s</div><div class="stat-sub">A finished cut, cloud-rendered</div></div>
282
- <div class="card stat-card"><div class="stat-head"><span class="tile tile-green">$</span> Idle cost</div><div class="stat-num">$0</div><div class="stat-sub">Scales to zero at rest</div></div>
283
- </div>
284
- </div>
285
- </div>
286
- </section>
287
-
288
- <!-- FEATURES -->
289
- <section class="section section-tint">
290
- <div class="container center-intro">
291
- <span class="badge">๐Ÿ”ฅ What you get</span>
292
- <h2 class="section-title">A whole studio, one browser tab</h2>
293
- <p class="section-sub">Everything to go from a blank idea to a posted video โ€” no timeline degree required.</p>
294
- </div>
295
- <div class="container grid-2">
296
- <div class="card">
297
- <span class="tile tile-sky">๐Ÿ“ผ</span>
298
- <h3>Fork a proven template</h3>
299
- <p>Start from short-form templates that already perform. One click forks it straight into your library, yours to remix.</p>
300
- <div class="card-media">
301
- <span class="tile tile-gold">Aa</span><span class="tile tile-sky">๐ŸŽž</span><span class="tile tile-violet">โœฆ</span><span class="tile tile-coral">๐Ÿ”Š</span>
302
- </div>
303
- </div>
304
- <div class="card">
305
- <span class="tile tile-violet">โœฆ</span>
306
- <h3>Remix on the Trackpad</h3>
307
- <p>Drag clips, retime layers, swap media, and recaption on a real timeline โ€” with an AI copilot riding shotgun when you want it.</p>
308
- <div class="card-media" style="flex-direction:column;align-items:flex-start;gap:10px">
309
- <div class="node"><span class="tile tile-violet">โœฆ</span><div><div class="node-title">AI edit</div><div class="node-sub">"Make the hook punchier"</div></div></div>
310
- <div class="node"><span class="tile tile-green">โœŽ</span><div><div class="node-title">Recaption</div><div class="node-sub">Word-by-word timing</div></div></div>
311
- </div>
312
- </div>
313
- <div class="card">
314
- <span class="tile tile-coral">โœ‚๏ธ</span>
315
- <h3>Mine clips from anything</h3>
316
- <p>Turn a podcast, VOD, or YouTube URL into tagged, searchable short clips โ€” then drop the best moments right into your edit.</p>
317
- <div class="card-media">
318
- <span class="tile tile-coral">๐ŸŽ™</span><span class="tile tile-sky">๐Ÿ”</span><span class="tile tile-green">๐Ÿท</span>
319
- </div>
320
- </div>
321
- <div class="card">
322
- <span class="tile tile-gold">โ–ถ</span>
323
- <h3>Render &amp; publish</h3>
324
- <p>Approve a cut and the native HyperFrames renderer produces the MP4 โ€” cloud or local โ€” landing ready-to-post in your library.</p>
325
- <div class="card-media" style="flex-direction:column;align-items:flex-start;gap:10px">
326
- <div class="node"><span class="tile tile-gold">โ–ถ</span><div><div class="node-title">Render MP4</div><div class="node-sub">Lambda fan-out ยท or free locally</div></div></div>
327
- <div class="node"><span class="tile tile-green">โœ“</span><div><div class="node-title">Ready to post</div><div class="node-sub">Straight to /library</div></div></div>
328
- </div>
329
- </div>
330
- </div>
331
- </section>
332
-
333
- <!-- HOW IT WORKS -->
334
- <section class="section" id="how">
335
- <div class="container center-intro">
336
- <span class="badge">๐Ÿงญ How it works</span>
337
- <h2 class="section-title">From idea to posted in four steps</h2>
338
- </div>
339
- <div class="container">
340
- <div class="steps">
341
- <div class="step"><div class="step-n">1</div><h4>Pick a template</h4><p>Browse the feed and fork a short-form format that fits your idea.</p></div>
342
- <div class="step"><div class="step-n">2</div><h4>Make it yours</h4><p>Swap footage, retime beats, and rewrite captions on the timeline.</p></div>
343
- <div class="step"><div class="step-n">3</div><h4>Render</h4><p>Hit render โ€” HyperFrames fans out on Lambda, or runs free on your box.</p></div>
344
- <div class="step"><div class="step-n">4</div><h4>Publish</h4><p>Approve the cut and it lands in your library, ready to post.</p></div>
345
- </div>
346
- </div>
347
- </section>
348
-
349
- <!-- FINAL CTA -->
350
- <section class="section section-tint">
351
- <div class="container cta-final">
352
- <span class="badge">๐ŸŒค๏ธ It all starts with a fork</span>
353
- <h2 class="section-title">Make your first video today</h2>
354
- <p class="section-sub">Free to start. Nothing to install. Scales to zero when you're done.</p>
355
- <a class="btn btn-gold btn-lg" href="${primaryCta.href}" style="margin-top:8px">${primaryCta.label} <span class="arrow">โ†’</span></a>
356
- </div>
357
- </section>
358
-
359
- <!-- FOOTER -->
360
- <footer class="footer">
361
- <div class="footer-inner">
362
- <div class="footer-top">
363
- <div>
364
- <div class="footer-brand"><span class="brand-mark">๐ŸŽฌ</span>VidFarm</div>
365
- <div class="footer-tagline">The serverless studio for short-form video.</div>
366
- </div>
367
- <div class="footer-cols">
368
- <div class="footer-col"><h4>Studio</h4><a href="${HREF.studio}">Templates</a><a href="${HREF.clips}">Clips</a><a href="${HREF.chat}">Brainstorm</a><a href="${HREF.library}">Library</a></div>
369
- <div class="footer-col"><h4>Product</h4><a href="${HREF.studio}">Trackpad editor</a><a href="${HREF.studio}">HyperFrames render</a><a href="${HREF.clips}">Clip hunting</a><a href="${HREF.studio}">Publish &amp; schedule</a></div>
370
- <div class="footer-col"><h4>Account</h4><a href="${HREF.login}">Log in</a><a href="${HREF.studio}">Get started</a><a href="${HREF.library}">Your projects</a></div>
371
- </div>
372
- </div>
373
- <div class="trust-row">
374
- <span class="trust-pill">โ˜๏ธ Serverless on AWS</span>
375
- <span class="trust-pill">๐Ÿ’ค Scales to zero at idle</span>
376
- <span class="trust-pill">๐Ÿ–ฅ๏ธ Render free with vidfarm serve</span>
377
- </div>
378
- </div>
379
- </footer>
380
-
381
- </body>
382
- </html>`;
383
- }
384
- //# sourceMappingURL=landing-page.js.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=page-runtime.js.map