@mevdragon/vidfarm-devcli 0.16.0 → 0.18.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/.agents/skills/farmville-saas-ux/SKILL.md +156 -0
- package/.agents/skills/farmville-saas-ux/assets/starter.html +294 -0
- package/.agents/skills/farmville-saas-ux/references/components.md +340 -0
- package/.agents/skills/farmville-saas-ux/references/porting-guide.md +121 -0
- package/.agents/skills/farmville-saas-ux/references/tokens.md +271 -0
- package/.agents/skills/vidfarm-media/SKILL.md +4 -3
- package/.agents/skills/vidfarm-media/references/tts.md +20 -1
- package/SKILL.director.md +20 -20
- package/SKILL.platform.md +4 -4
- package/dist/src/account-pages-legacy.js +2 -2
- package/dist/src/app.js +721 -101
- package/dist/src/cli.js +11 -10
- package/dist/src/devcli/clips.js +64 -64
- package/dist/src/editor-chat.js +2 -2
- package/dist/src/frontend/homepage-client.js +162 -2
- package/dist/src/frontend/homepage-store.js +30 -1
- package/dist/src/frontend/homepage-view.js +111 -4
- package/dist/src/homepage.js +184 -1
- package/dist/src/landing-page.js +367 -0
- package/dist/src/primitive-registry.js +278 -2
- package/dist/src/reskin/agency-page.js +299 -0
- package/dist/src/reskin/calendar-page.js +567 -0
- package/dist/src/reskin/chat-page.js +607 -0
- package/dist/src/reskin/discover-page.js +1096 -0
- package/dist/src/reskin/document.js +663 -0
- package/dist/src/reskin/help-page.js +356 -0
- package/dist/src/reskin/index-page.js +62 -0
- package/dist/src/reskin/inpaint-page.js +541 -0
- package/dist/src/reskin/job-runs-page.js +477 -0
- package/dist/src/reskin/library-page.js +688 -0
- package/dist/src/reskin/login-page.js +262 -0
- package/dist/src/reskin/pricing-page.js +388 -0
- package/dist/src/reskin/settings-page.js +687 -0
- package/dist/src/reskin/theme.js +362 -0
- package/dist/src/services/serverless-records.js +54 -0
- package/dist/src/services/swipe-customize.js +434 -0
- package/package.json +1 -1
- package/public/assets/homepage-client-app.js +22 -22
|
@@ -0,0 +1,356 @@
|
|
|
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&hideTitle=1&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&hideTitle=1&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
|
+
pageCss,
|
|
352
|
+
body,
|
|
353
|
+
script
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=help-page.js.map
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|