@mevdragon/vidfarm-devcli 0.20.5 → 0.20.8

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 (154) 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 +111 -0
  8. package/.agents/skills/vidfarm-director/references/automation-and-local-dev.md +243 -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 +265 -0
  13. package/SKILL.director.md +521 -261
  14. package/dist/src/cli.js +404 -96
  15. package/dist/src/devcli/clips.js +15 -10
  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 +10 -0
  20. package/package.json +30 -10
  21. package/SKILL.platform.md +0 -432
  22. package/demo/README.md +0 -28
  23. package/demo/dist/app.css +0 -1
  24. package/demo/dist/app.js +0 -1850
  25. package/demo/dist/chunks/chunk-DXB73IDG.js +0 -1
  26. package/demo/dist/chunks/chunk-S7OWAJDS.js +0 -36
  27. package/demo/dist/chunks/chunk-VTIBZ6AN.js +0 -1
  28. package/demo/dist/chunks/dist-ADSJKBVE.js +0 -332
  29. package/demo/dist/chunks/domEditingLayers-VZMLL4AP-SGHWPND4.js +0 -1
  30. package/demo/dist/chunks/hyperframes-player-XB65TCD6.js +0 -425
  31. package/demo/dist/chunks/lib-XAQ37YOE.js +0 -1
  32. package/demo/dist/chunks/src-TJ2QYA4U.js +0 -207
  33. package/demo/dist/favicon.ico +0 -0
  34. package/demo/dist/icons/timeline/audio.svg +0 -7
  35. package/demo/dist/icons/timeline/captions.svg +0 -5
  36. package/demo/dist/icons/timeline/composition.svg +0 -12
  37. package/demo/dist/icons/timeline/image.svg +0 -18
  38. package/demo/dist/icons/timeline/music.svg +0 -10
  39. package/demo/dist/icons/timeline/text.svg +0 -3
  40. package/demo/dist/index.html +0 -15
  41. package/dist/src/account-pages-legacy.js +0 -9396
  42. package/dist/src/account-pages.js +0 -61
  43. package/dist/src/app.js +0 -21602
  44. package/dist/src/composition-runtime.js +0 -1053
  45. package/dist/src/config.js +0 -217
  46. package/dist/src/context.js +0 -447
  47. package/dist/src/dev-app-legacy.js +0 -739
  48. package/dist/src/dev-app.js +0 -6
  49. package/dist/src/devcli/migrate-local.js +0 -140
  50. package/dist/src/devcli/sync.js +0 -368
  51. package/dist/src/domain.js +0 -5
  52. package/dist/src/editor-chat-history.js +0 -82
  53. package/dist/src/editor-chat.js +0 -756
  54. package/dist/src/editor-dark-theme.js +0 -1128
  55. package/dist/src/frontend/debug.js +0 -71
  56. package/dist/src/frontend/discover-client.js +0 -130
  57. package/dist/src/frontend/discover-store.js +0 -23
  58. package/dist/src/frontend/file-directory.js +0 -1018
  59. package/dist/src/frontend/flockposter-cache-store.js +0 -124
  60. package/dist/src/frontend/homepage-client.js +0 -446
  61. package/dist/src/frontend/homepage-shared.js +0 -201
  62. package/dist/src/frontend/homepage-store.js +0 -66
  63. package/dist/src/frontend/homepage-view.js +0 -705
  64. package/dist/src/frontend/page-runtime-client.js +0 -132
  65. package/dist/src/frontend/page-runtime-store.js +0 -9
  66. package/dist/src/frontend/sentry.js +0 -42
  67. package/dist/src/frontend/template-editor-chat.js +0 -4181
  68. package/dist/src/help-page.js +0 -346
  69. package/dist/src/homepage.js +0 -1458
  70. package/dist/src/index.js +0 -16
  71. package/dist/src/instrument.js +0 -30
  72. package/dist/src/landing-page.js +0 -384
  73. package/dist/src/page-runtime.js +0 -2
  74. package/dist/src/page-shell.js +0 -1452
  75. package/dist/src/primitive-context.js +0 -416
  76. package/dist/src/primitive-registry.js +0 -3940
  77. package/dist/src/primitive-sdk.js +0 -4
  78. package/dist/src/primitives/hyperframes-media.js +0 -108
  79. package/dist/src/react-page-shell.js +0 -35
  80. package/dist/src/ready-post-schedule-component.js +0 -1540
  81. package/dist/src/registry.js +0 -296
  82. package/dist/src/reskin/agency-page.js +0 -299
  83. package/dist/src/reskin/calendar-page.js +0 -568
  84. package/dist/src/reskin/chat-page.js +0 -942
  85. package/dist/src/reskin/discover-page.js +0 -1788
  86. package/dist/src/reskin/document.js +0 -1587
  87. package/dist/src/reskin/help-page.js +0 -357
  88. package/dist/src/reskin/index-page.js +0 -62
  89. package/dist/src/reskin/inpaint-clipper-page.js +0 -890
  90. package/dist/src/reskin/inpaint-page.js +0 -2554
  91. package/dist/src/reskin/inpaint-video-page.js +0 -1339
  92. package/dist/src/reskin/job-runs-page.js +0 -477
  93. package/dist/src/reskin/library-page.js +0 -1634
  94. package/dist/src/reskin/login-page.js +0 -262
  95. package/dist/src/reskin/portfolio-page.js +0 -687
  96. package/dist/src/reskin/pricing-page.js +0 -390
  97. package/dist/src/reskin/settings-page.js +0 -732
  98. package/dist/src/reskin/theme.js +0 -711
  99. package/dist/src/runtime.js +0 -35
  100. package/dist/src/services/api-call-history.js +0 -249
  101. package/dist/src/services/auth.js +0 -152
  102. package/dist/src/services/billing-pricing.js +0 -39
  103. package/dist/src/services/billing.js +0 -241
  104. package/dist/src/services/cast.js +0 -127
  105. package/dist/src/services/chat-threads.js +0 -92
  106. package/dist/src/services/clip-records.js +0 -250
  107. package/dist/src/services/clip-search.js +0 -77
  108. package/dist/src/services/clip-vectors.js +0 -125
  109. package/dist/src/services/composition-sanitize.js +0 -124
  110. package/dist/src/services/composition-watch.js +0 -79
  111. package/dist/src/services/elevenlabs.js +0 -222
  112. package/dist/src/services/file-directory.js +0 -117
  113. package/dist/src/services/fork-access.js +0 -93
  114. package/dist/src/services/fork-manifest.js +0 -42
  115. package/dist/src/services/ghostcut.js +0 -179
  116. package/dist/src/services/hyperframes.js +0 -3517
  117. package/dist/src/services/job-capacity.js +0 -14
  118. package/dist/src/services/job-logs.js +0 -197
  119. package/dist/src/services/jobs.js +0 -136
  120. package/dist/src/services/local-dynamo.js +0 -0
  121. package/dist/src/services/media-processing.js +0 -766
  122. package/dist/src/services/primitive-media-lambda.js +0 -280
  123. package/dist/src/services/providers.js +0 -2748
  124. package/dist/src/services/rate-limits.js +0 -262
  125. package/dist/src/services/scene-annotations.js +0 -32
  126. package/dist/src/services/serverless-auth.js +0 -382
  127. package/dist/src/services/serverless-jobs.js +0 -1084
  128. package/dist/src/services/serverless-provider-keys.js +0 -409
  129. package/dist/src/services/serverless-records.js +0 -1515
  130. package/dist/src/services/serverless-template-configs.js +0 -75
  131. package/dist/src/services/storage.js +0 -461
  132. package/dist/src/services/swipe-customize.js +0 -437
  133. package/dist/src/services/template-certification.js +0 -413
  134. package/dist/src/services/template-loader.js +0 -99
  135. package/dist/src/services/template-runtime-bundles.js +0 -217
  136. package/dist/src/services/template-sources.js +0 -1017
  137. package/dist/src/services/upstream.js +0 -248
  138. package/dist/src/services/video-normalization.js +0 -2
  139. package/dist/src/services/webhooks.js +0 -62
  140. package/dist/src/template-editor-pages.js +0 -2576
  141. package/dist/src/template-editor-shell.js +0 -2893
  142. package/dist/src/template-sdk.js +0 -4
  143. package/dist/src/worker.js +0 -17
  144. package/public/assets/discover-client-app.js +0 -1
  145. package/public/assets/file-directory-app.js +0 -3
  146. package/public/assets/homepage-app.js +0 -54
  147. package/public/assets/homepage-client-app.js +0 -80
  148. package/public/assets/page-runtime-client-app.js +0 -94
  149. package/public/assets/placeholders/scene-placeholder.png +0 -0
  150. package/src/assets/SELLING_AWARENESS_STAGES.md +0 -579
  151. package/src/assets/SELLING_WITH_HOOKS.md +0 -377
  152. package/src/assets/SELLING_WITH_VSLS.md +0 -606
  153. package/src/assets/favicon.ico +0 -0
  154. package/src/assets/logo-vidfarm.png +0 -0
@@ -1,357 +0,0 @@
1
- // /reskin/help — the vidfarm Help center, MIGRATED to real production content.
2
- //
3
- // This mirrors the live renderer src/help-page.ts → renderHelpPage: it accepts
4
- // the SAME input object that route builds (`Parameters<typeof renderHelpPage>[0]`
5
- // — `{ account, expand }`) so wiring the route is just "call this instead of the
6
- // legacy renderer". The accordion is the REAL support surface: the four live
7
- // sections (video tutorials, report a bug, contact the team, billing/cancel)
8
- // with their REAL destinations — the same YouTube embed, the two Tally forms,
9
- // the support email, and the Stripe billing portal the live page ships. The
10
- // `?expand=id,id` deep-link is honored both server-side (native <details open>)
11
- // and client-side (URL stays in sync on toggle). Design stays farmville (shared
12
- // rk-* primitives + a page-scoped CSS block); only the data + links became real.
13
- //
14
- // A default input keeps the existing zero-arg route call compiling; the route
15
- // can pass real `{ account, expand }` whenever it's wired.
16
- import { reskinDocument, rkEscape } from "./document.js";
17
- const SEARCH_ICON = `<svg class="rk-help-search-ic" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg>`;
18
- // The ONLY deep-linkable accordion ids — mirrors HELP_SECTION_IDS in
19
- // src/help-page.ts. `?expand=` values are filtered against this allowlist.
20
- const HELP_SECTION_IDS = ["video_tutorials", "report_bug", "contact_team", "cancel_subscription"];
21
- /** Parse `?expand=id,id` exactly like the live renderer: split, trim, keep only
22
- * known section ids. */
23
- function parseExpanded(expand) {
24
- const allowed = new Set(HELP_SECTION_IDS);
25
- if (!expand)
26
- return new Set();
27
- return new Set(expand
28
- .split(",")
29
- .map((value) => value.trim())
30
- .filter((value) => allowed.has(value)));
31
- }
32
- // The four REAL support sections, with the SAME destinations the live help page
33
- // ships: the YouTube tutorial embed, the two Tally forms, the support email, and
34
- // the Stripe billing/cancellation portal.
35
- const SECTIONS = [
36
- {
37
- id: "video_tutorials",
38
- cat: "Tutorials",
39
- catPill: "rk-pill-green",
40
- title: "Video tutorials",
41
- body: `<div class="rk-help-video">
42
- <iframe
43
- src="https://www.youtube.com/embed/BG2vuCDzehc"
44
- title="Video tutorials"
45
- allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
46
- allowfullscreen
47
- loading="lazy"
48
- referrerpolicy="strict-origin-when-cross-origin"></iframe>
49
- </div>`
50
- },
51
- {
52
- id: "report_bug",
53
- cat: "Support",
54
- catPill: "rk-pill-red",
55
- title: "Report a bug",
56
- body: `<iframe
57
- class="rk-help-formframe"
58
- src="https://tally.so/embed/NpdkNj?alignLeft=1&amp;hideTitle=1&amp;transparentBackground=1"
59
- title="Report a bug"
60
- loading="lazy"></iframe>`
61
- },
62
- {
63
- id: "contact_team",
64
- cat: "Support",
65
- catPill: "rk-pill-sky",
66
- title: "Ask a question / contact the team",
67
- body: `<iframe
68
- class="rk-help-formframe"
69
- src="https://tally.so/embed/javNVa?alignLeft=1&amp;hideTitle=1&amp;transparentBackground=1"
70
- title="Ask a question / contact the team"
71
- loading="lazy"></iframe>`
72
- },
73
- {
74
- id: "cancel_subscription",
75
- cat: "Billing",
76
- catPill: "rk-pill-gold",
77
- title: "Cancel subscription & refunds",
78
- body: `<div class="rk-help-copy">
79
- <p>You can cancel your subscription at any time with a simple self-serve billing portal.</p>
80
- <p>For refunds, we offer <strong>90-day refunds</strong>. Email <a href="mailto:operator@zoom-gtm.com">operator@zoom-gtm.com</a> and mention the original email address you used in Stripe so we can find your subscription quickly.</p>
81
- <p><a class="rk-help-inline-cta" href="https://billing.stripe.com/p/login/fZecQubkxcwOgDuaEE" target="_blank" rel="noopener noreferrer">Open the cancellation portal <span class="rk-arrow">↗</span></a></p>
82
- </div>`
83
- }
84
- ];
85
- // Browse-by-topic quick nav — every card deep-links straight to a REAL section.
86
- const TOPICS = [
87
- { expand: "video_tutorials", title: "Video tutorials", blurb: "A quick tour from your first fork to your first published post.", action: "Watch" },
88
- { expand: "report_bug", title: "Report a bug", blurb: "Something broken? Send us the details in about 30 seconds.", action: "Report" },
89
- { expand: "contact_team", title: "Ask the team", blurb: "Questions about your workflow? Reach a real human, fast.", action: "Contact" },
90
- { expand: "cancel_subscription", title: "Billing & cancellation", blurb: "Refunds, invoices, or cancel any time — no email required.", action: "Manage" }
91
- ];
92
- // Real quick actions. Two deep-link into the accordion; the billing portal is
93
- // the live external Stripe portal.
94
- const SUPPORT_LINKS = [
95
- { title: "Watch the tutorials", blurb: "A short tour from fork to published post.", cta: "Play video", href: "?expand=video_tutorials#rk-help-faq" },
96
- { title: "Report a bug", blurb: "Something broken? Send us the details in 30 seconds.", cta: "Report it", href: "?expand=report_bug#rk-help-faq" },
97
- { title: "Billing portal", blurb: "Update payment, download invoices, or cancel.", cta: "Manage billing", href: "https://billing.stripe.com/p/login/fZecQubkxcwOgDuaEE", external: true }
98
- ];
99
- // Popular chips — every one deep-links a REAL section.
100
- const POPULAR = [
101
- { label: "Video tutorials", expand: "video_tutorials" },
102
- { label: "Report a bug", expand: "report_bug" },
103
- { label: "Contact the team", expand: "contact_team" },
104
- { label: "Cancel or refund", expand: "cancel_subscription" }
105
- ];
106
- function renderTopicCard(t) {
107
- return `<a class="rk-card rk-card-hover rk-help-topic" href="?expand=${rkEscape(t.expand)}#rk-help-faq">
108
- <h3>${rkEscape(t.title)}</h3>
109
- <p class="rk-muted rk-help-topic-blurb">${rkEscape(t.blurb)}</p>
110
- <span class="rk-help-topic-foot">${rkEscape(t.action)} <span class="rk-arrow">→</span></span>
111
- </a>`;
112
- }
113
- function renderSection(s, open) {
114
- const search = `${s.title} ${s.cat}`.toLowerCase();
115
- return `<details class="rk-help-faq-item" data-expand-id="${rkEscape(s.id)}" data-search="${rkEscape(search)}"${open ? " open" : ""}>
116
- <summary class="rk-help-faq-summary">
117
- <span class="rk-help-faq-q">
118
- <span class="rk-pill ${s.catPill} rk-help-faq-cat">${rkEscape(s.cat)}</span>
119
- <span class="rk-help-faq-qt">${rkEscape(s.title)}</span>
120
- </span>
121
- <span class="rk-help-faq-toggle" aria-hidden="true"></span>
122
- </summary>
123
- <div class="rk-help-faq-body">${s.body}</div>
124
- </details>`;
125
- }
126
- function renderSupportLink(s) {
127
- const attrs = s.external ? ` target="_blank" rel="noopener noreferrer"` : "";
128
- return `<a class="rk-item rk-help-support" href="${rkEscape(s.href)}"${attrs}>
129
- <div class="rk-item-main">
130
- <div class="rk-item-title">${rkEscape(s.title)}</div>
131
- <div class="rk-help-support-sub rk-muted">${rkEscape(s.blurb)}</div>
132
- </div>
133
- <span class="rk-btn rk-btn-ghost rk-btn-sm">${rkEscape(s.cta)} <span class="rk-arrow">${s.external ? "↗" : "→"}</span></span>
134
- </a>`;
135
- }
136
- export function renderReskinHelp(input = { account: { isLoggedIn: false }, expand: null }) {
137
- const expanded = parseExpanded(input.expand);
138
- const hero = `
139
- <div class="rk-hero-band rk-help-band">
140
- <div class="rk-hero-art rk-help-art"></div>
141
- <div class="rk-hero rk-help-hero">
142
- <h1 class="rk-help-title">How can we help?</h1>
143
- <p class="rk-help-lede">Guides and answers for making short-form video with vidfarm — from your first fork to your first published post.</p>
144
- <form class="rk-help-search" role="search" onsubmit="return false">
145
- ${SEARCH_ICON}
146
- <input class="rk-help-search-input" type="search" placeholder="Search help — “render”, “bug”, “cancel”…" aria-label="Search help topics" data-help-search />
147
- <button class="rk-btn rk-btn-gold rk-help-search-btn" type="submit">Search</button>
148
- </form>
149
- <div class="rk-help-popular">
150
- <span class="rk-help-popular-label">Popular:</span>
151
- ${POPULAR.map((p) => `<a class="rk-help-chip" href="?expand=${rkEscape(p.expand)}#rk-help-faq">${rkEscape(p.label)}</a>`).join("")}
152
- </div>
153
- </div>
154
- </div>`;
155
- const topics = `
156
- <section class="rk-help-topics" aria-label="Browse by topic">
157
- <div class="rk-grid rk-help-topic-grid">
158
- ${TOPICS.map(renderTopicCard).join("")}
159
- </div>
160
- </section>`;
161
- const faq = `
162
- <section class="rk-help-faq" id="rk-help-faq" aria-labelledby="rk-help-faq-title">
163
- <div class="rk-page-head rk-help-faq-head">
164
- <span class="rk-eyebrow">Help topics</span>
165
- <h2 class="rk-h1 rk-help-faq-h" id="rk-help-faq-title">Guides & support</h2>
166
- <p class="rk-sub">Watch a tutorial, report a bug, reach the team, or manage billing. Still stuck? We're one message away.</p>
167
- </div>
168
- <div class="rk-help-faq-list" data-help-list>
169
- ${SECTIONS.map((s) => renderSection(s, expanded.has(s.id))).join("")}
170
- </div>
171
- <p class="rk-muted rk-help-empty" data-help-empty hidden>No help topics match your search.</p>
172
- </section>`;
173
- const contact = `
174
- <section class="rk-help-contact" aria-label="Contact support">
175
- <div class="rk-card rk-help-cta-card">
176
- <div class="rk-help-cta-copy">
177
- <span class="rk-eyebrow rk-help-cta-eyebrow">Still need help?</span>
178
- <h2>Talk to a human</h2>
179
- <p class="rk-help-cta-sub">Real people, quick replies. Tell us what you're building and we'll help you ship it.</p>
180
- </div>
181
- <div class="rk-help-cta-actions">
182
- <a class="rk-btn rk-btn-gold rk-btn-lg" href="mailto:operator@zoom-gtm.com">Contact the team <span class="rk-arrow">→</span></a>
183
- <span class="rk-pill rk-pill-green">Typically replies in a few hours</span>
184
- </div>
185
- </div>
186
- <div class="rk-list rk-help-support-list">
187
- ${SUPPORT_LINKS.map(renderSupportLink).join("")}
188
- </div>
189
- </section>`;
190
- const body = `
191
- ${hero}
192
- <main class="rk-container rk-help-main">
193
- ${topics}
194
- ${faq}
195
- ${contact}
196
- </main>`;
197
- const pageCss = `
198
- /* ── hero band ── */
199
- .rk-help-band{padding-bottom:110px}
200
- .rk-help-art{background:
201
- radial-gradient(52% 42% at 82% 14%,rgba(255,241,204,.95),transparent 62%),
202
- radial-gradient(46% 40% at 12% 92%,rgba(255,245,228,.55),transparent 60%),
203
- linear-gradient(180deg,#3f9fe0 0%,#6cc0f5 52%,#a9dbfb 100%)}
204
- .rk-help-hero{max-width:780px;margin:0 auto;display:grid;justify-items:center;gap:18px;padding-bottom:36px}
205
- .rk-help-badge{background:rgba(255,255,255,.9);backdrop-filter:blur(6px)}
206
- .rk-help-title{font-size:clamp(2.4rem,6vw,3.6rem);letter-spacing:-.035em;color:#fff;text-shadow:0 2px 18px rgba(20,54,90,.28)}
207
- .rk-help-lede{font-size:var(--rk-text-lg);color:#f3fbff;max-width:560px;line-height:1.55;text-shadow:0 1px 10px rgba(20,54,90,.25)}
208
- /* search */
209
- .rk-help-search{position:relative;display:flex;align-items:center;width:min(560px,100%);
210
- background:#fff;border-radius:var(--rk-r-full);box-shadow:var(--rk-shadow-lg);padding:7px 7px 7px 18px;margin-top:6px}
211
- .rk-help-search-ic{color:var(--rk-n-400);flex:none}
212
- .rk-help-search-input{flex:1;border:0;outline:none;font-family:var(--rk-font-body);font-size:15px;
213
- color:var(--rk-ink);background:transparent;padding:11px 12px}
214
- .rk-help-search-input::placeholder{color:var(--rk-n-400)}
215
- .rk-help-search-btn{flex:none;padding:11px 20px}
216
- .rk-help-popular{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:2px}
217
- .rk-help-popular-label{font-size:13px;font-weight:600;color:#eaf6ff}
218
- .rk-help-chip{display:inline-flex;align-items:center;padding:6px 13px;border-radius:var(--rk-r-full);
219
- font-size:13px;font-weight:600;color:#fff;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.3);
220
- backdrop-filter:blur(6px);transition:background var(--rk-dur) var(--rk-ease),transform var(--rk-dur) var(--rk-ease)}
221
- .rk-help-chip:hover{background:rgba(255,255,255,.28);transform:translateY(-1px)}
222
-
223
- /* ── main column ── */
224
- .rk-help-main{position:relative;z-index:2;padding-bottom:96px}
225
-
226
- /* ── topic cards (pulled up onto the hero seam) ── */
227
- .rk-help-topics{margin-top:-72px}
228
- .rk-help-topic-grid{grid-template-columns:repeat(4,1fr)}
229
- @media(max-width:1080px){.rk-help-topic-grid{grid-template-columns:repeat(2,1fr)}}
230
- @media(max-width:460px){.rk-help-topic-grid{grid-template-columns:1fr}}
231
- .rk-help-topic{display:grid;gap:10px;align-content:start;padding:24px;text-align:left}
232
- .rk-help-topic h3{font-size:var(--rk-text-lg);font-weight:800;font-family:var(--rk-font-display);color:var(--rk-ink)}
233
- .rk-help-topic-blurb{font-size:13.5px;line-height:1.5}
234
- .rk-help-topic-foot{display:inline-flex;align-items:center;gap:6px;margin-top:6px;
235
- font-size:13px;font-weight:700;color:var(--rk-gold-700)}
236
- .rk-help-topic:hover .rk-help-topic-foot .rk-arrow{transform:translateX(3px)}
237
- .rk-help-topic-foot .rk-arrow{transition:transform var(--rk-dur) var(--rk-ease)}
238
-
239
- /* ── accordion (real support sections) ── */
240
- .rk-help-faq{margin-top:72px}
241
- .rk-help-faq-head{justify-items:center;text-align:center;margin-bottom:28px;gap:10px}
242
- .rk-help-faq-h{font-size:var(--rk-text-3xl)}
243
- .rk-help-faq-list{display:grid;gap:14px;max-width:820px;margin:0 auto}
244
- .rk-help-faq-item{background:var(--rk-surface);border:1px solid var(--rk-border);border-radius:var(--rk-r-2xl);
245
- box-shadow:var(--rk-shadow-card);overflow:hidden;transition:box-shadow var(--rk-dur) var(--rk-ease),border-color var(--rk-dur) var(--rk-ease)}
246
- .rk-help-faq-item[open]{border-color:var(--rk-gold-tint2);box-shadow:var(--rk-shadow-lg)}
247
- .rk-help-faq-item[hidden]{display:none}
248
- .rk-help-faq-summary{display:flex;align-items:center;justify-content:space-between;gap:16px;
249
- padding:20px 22px;cursor:pointer;list-style:none;user-select:none}
250
- .rk-help-faq-summary::-webkit-details-marker{display:none}
251
- .rk-help-faq-q{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-width:0}
252
- .rk-help-faq-cat{flex:none}
253
- .rk-help-faq-qt{font-family:var(--rk-font-display);font-weight:700;font-size:var(--rk-text-lg);color:var(--rk-ink);letter-spacing:-.01em}
254
- .rk-help-faq-toggle{position:relative;flex:none;width:30px;height:30px;border-radius:var(--rk-r-full);
255
- background:var(--rk-n-100);transition:background var(--rk-dur) var(--rk-ease),transform var(--rk-dur) var(--rk-ease)}
256
- .rk-help-faq-toggle::before,.rk-help-faq-toggle::after{content:"";position:absolute;top:50%;left:50%;
257
- width:12px;height:2px;border-radius:2px;background:var(--rk-n-600);transform:translate(-50%,-50%);transition:opacity var(--rk-dur) var(--rk-ease)}
258
- .rk-help-faq-toggle::after{transform:translate(-50%,-50%) rotate(90deg)}
259
- .rk-help-faq-item[open] .rk-help-faq-toggle{background:var(--rk-gold-tint2);transform:rotate(180deg)}
260
- .rk-help-faq-item[open] .rk-help-faq-toggle::after{opacity:0}
261
- .rk-help-faq-item[open] .rk-help-faq-toggle::before{background:var(--rk-gold-700)}
262
- .rk-help-faq-summary:hover .rk-help-faq-toggle{background:var(--rk-n-200)}
263
- .rk-help-faq-body{display:grid;gap:12px;padding:0 22px 22px;color:var(--rk-text);line-height:1.65;font-size:14.5px}
264
- .rk-help-faq-body p{margin:0}
265
- .rk-help-faq-body strong{color:var(--rk-n-800);font-weight:600}
266
- .rk-help-faq-body a{color:var(--rk-gold-700);font-weight:600;text-decoration:underline;text-underline-offset:2px}
267
- .rk-help-inline-cta{display:inline-flex;align-items:center;gap:6px;text-decoration:none!important}
268
- .rk-help-inline-cta .rk-arrow{transition:transform var(--rk-dur) var(--rk-ease)}
269
- .rk-help-inline-cta:hover .rk-arrow{transform:translateX(3px)}
270
- .rk-help-copy{display:grid;gap:12px;max-width:680px}
271
- /* embedded iframes (real tutorial + Tally forms) */
272
- .rk-help-video{position:relative;width:100%;aspect-ratio:16/9;overflow:hidden;border-radius:var(--rk-r-xl);background:#151a23}
273
- .rk-help-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block}
274
- .rk-help-formframe{display:block;width:100%;min-height:680px;border:0;border-radius:var(--rk-r-xl);background:rgba(255,255,255,.72)}
275
- @media(max-width:560px){.rk-help-formframe{min-height:75svh}}
276
- .rk-help-empty{text-align:center;max-width:820px;margin:18px auto 0}
277
-
278
- /* ── contact ── */
279
- .rk-help-contact{margin-top:72px;display:grid;gap:20px}
280
- .rk-help-cta-card{display:flex;align-items:center;justify-content:space-between;gap:28px;flex-wrap:wrap;
281
- background:linear-gradient(135deg,#fffaf0 0%,#fff 60%);border-color:var(--rk-gold-tint2)}
282
- .rk-help-cta-copy{display:grid;gap:8px;max-width:460px}
283
- .rk-help-cta-card h2{font-size:var(--rk-text-3xl)}
284
- .rk-help-cta-eyebrow{color:var(--rk-gold-700)}
285
- .rk-help-cta-sub{color:var(--rk-text-muted);font-size:var(--rk-text-base);line-height:1.55}
286
- .rk-help-cta-actions{display:grid;gap:12px;justify-items:start}
287
- .rk-help-support-list{grid-template-columns:repeat(3,1fr);display:grid;gap:14px}
288
- @media(max-width:860px){.rk-help-support-list{grid-template-columns:1fr}}
289
- .rk-help-support{gap:16px;padding:18px}
290
- .rk-help-support-sub{font-size:13px;margin-top:2px;white-space:normal}
291
- @media(max-width:560px){.rk-help-support{flex-wrap:wrap}}
292
- `;
293
- const script = `
294
- (function(){
295
- var items=Array.prototype.slice.call(document.querySelectorAll('.rk-help-faq-item[data-expand-id]'));
296
- var allowed={}; items.forEach(function(d){if(d.dataset.expandId)allowed[d.dataset.expandId]=1;});
297
-
298
- function readExpandedFromUrl(){
299
- var params=new URLSearchParams(window.location.search);
300
- var set={};
301
- (params.get('expand')||'').split(',').map(function(v){return v.trim();})
302
- .forEach(function(v){if(allowed[v])set[v]=1;});
303
- return set;
304
- }
305
- function writeExpandedToUrl(){
306
- var open=items.filter(function(d){return d.open&&d.dataset.expandId;})
307
- .map(function(d){return d.dataset.expandId;});
308
- var url=new URL(window.location.href);
309
- if(open.length){url.searchParams.set('expand',open.join(','));}
310
- else{url.searchParams.delete('expand');}
311
- if(window.history.replaceState){
312
- window.history.replaceState(null,'',url.pathname+url.search+url.hash);
313
- }
314
- }
315
-
316
- // Union of server-rendered [open] and any ?expand= in the URL, so both the
317
- // static server render and client-side deep links open the right sections.
318
- var initial=readExpandedFromUrl();
319
- items.forEach(function(d){
320
- d.open=d.open||Boolean(d.dataset.expandId&&initial[d.dataset.expandId]);
321
- d.addEventListener('toggle',writeExpandedToUrl);
322
- });
323
-
324
- var firstOpen=items.filter(function(d){return d.open;})[0];
325
- if(firstOpen){
326
- requestAnimationFrame(function(){
327
- firstOpen.scrollIntoView({block:'center',behavior:'smooth'});
328
- });
329
- }
330
-
331
- // Search filters the visible support sections.
332
- var search=document.querySelector('[data-help-search]');
333
- var empty=document.querySelector('[data-help-empty]');
334
- if(search){
335
- search.addEventListener('input',function(){
336
- var q=(search.value||'').trim().toLowerCase();
337
- var shown=0;
338
- items.forEach(function(d){
339
- var hit=!q||(d.dataset.search||'').indexOf(q)!==-1;
340
- d.hidden=!hit;
341
- if(hit)shown++;
342
- });
343
- if(empty)empty.hidden=shown!==0;
344
- });
345
- }
346
- })();`;
347
- return reskinDocument({
348
- title: "vidfarm reskin — Help",
349
- description: "Reskinned vidfarm help center — tutorials, bug reports, contact, and billing.",
350
- activeSlug: "help",
351
- account: { name: input.account.displayName, email: input.account.email },
352
- pageCss,
353
- body,
354
- script
355
- });
356
- }
357
- //# sourceMappingURL=help-page.js.map
@@ -1,62 +0,0 @@
1
- // /reskin index — a gallery of every page in the migration, with status.
2
- import { reskinDocument } from "./document.js";
3
- import { RESKIN_PAGES } from "./theme.js";
4
- export function renderReskinIndex() {
5
- const done = RESKIN_PAGES.filter((p) => p.done).length;
6
- const cards = RESKIN_PAGES.map((p) => {
7
- const status = p.done
8
- ? `<span class="rk-pill rk-pill-green">✓ Ported</span>`
9
- : `<span class="rk-pill">In progress</span>`;
10
- const href = `/${p.slug}`;
11
- return `<a class="rk-card rk-card-hover rk-idx-card" href="${href}">
12
- <div class="rk-spread">
13
- <span class="rk-tile rk-tile-lg rk-tile-gold rk-idx-mark">${p.label.charAt(0)}</span>
14
- ${status}
15
- </div>
16
- <div>
17
- <h3 class="rk-idx-title">${p.label}</h3>
18
- <p class="rk-muted rk-idx-blurb">${p.blurb}</p>
19
- </div>
20
- <div class="rk-idx-foot rk-muted">
21
- <span>reskins <code>${p.live}</code></span>
22
- <span class="rk-idx-go">Open <span class="rk-arrow">→</span></span>
23
- </div>
24
- </a>`;
25
- }).join("");
26
- const body = `
27
- <section class="rk-hero-band">
28
- <div class="rk-hero-art"></div>
29
- <div class="rk-hero">
30
- <span class="rk-badge">Design-system migration</span>
31
- <h1 class="rk-idx-hero-h1">Reskinning vidfarm,<br>one page at a time</h1>
32
- <p class="rk-idx-hero-sub">A safe sandbox at <code>/reskin/*</code> where each old page is
33
- rebuilt in the warm, sunny design system — with fully isolated CSS, so nothing touches the live app.</p>
34
- <div class="rk-idx-progress">${done} of ${RESKIN_PAGES.length} pages ported</div>
35
- </div>
36
- </section>
37
- <main class="rk-container rk-page">
38
- <div class="rk-grid rk-grid-3 rk-idx-grid">${cards}</div>
39
- </main>`;
40
- const pageCss = `
41
- .rk-idx-hero-h1{font-size:clamp(2.4rem,5vw,3.6rem);color:#fff;letter-spacing:-.03em;text-shadow:0 2px 24px rgba(0,0,0,.12);margin-top:18px}
42
- .rk-hero .rk-badge{background:rgba(255,255,255,.9)}
43
- .rk-idx-hero-sub{max-width:620px;margin:18px auto 0;font-size:var(--rk-text-lg);color:rgba(255,255,255,.95)}
44
- .rk-idx-hero-sub code{background:rgba(255,255,255,.22);color:#fff}
45
- .rk-idx-progress{display:inline-block;margin-top:22px;padding:8px 16px;border-radius:var(--rk-r-full);background:rgba(255,255,255,.9);color:var(--rk-ink);font-weight:600;font-size:14px}
46
- .rk-idx-grid{margin-top:-56px;position:relative;z-index:2}
47
- .rk-idx-card{display:grid;gap:16px;text-decoration:none}
48
- .rk-idx-title{margin-bottom:4px}
49
- .rk-idx-blurb{font-size:14px}
50
- .rk-idx-foot{display:flex;align-items:center;justify-content:space-between;font-size:13px;padding-top:14px;border-top:1px solid var(--rk-border)}
51
- .rk-idx-go{font-weight:600;color:var(--rk-ink)}
52
- .rk-idx-mark{font-family:var(--rk-font-display);font-weight:800;font-size:22px;color:var(--rk-ink)}
53
- `;
54
- return reskinDocument({
55
- title: "vidfarm reskin — page gallery",
56
- description: "The /reskin/* design-system migration surface for vidfarm.",
57
- activeSlug: null,
58
- pageCss,
59
- body
60
- });
61
- }
62
- //# sourceMappingURL=index-page.js.map