@mevdragon/vidfarm-devcli 0.20.6 → 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 +476 -260
  14. package/dist/src/cli.js +362 -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 -21603
  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 -828
  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 -3654
  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,1452 +0,0 @@
1
- import { EDITOR_DARK_THEME_CSS } from "./editor-dark-theme.js";
2
- export function escapeHtml(value) {
3
- return value
4
- .replace(/&/g, "&")
5
- .replace(/</g, "&lt;")
6
- .replace(/>/g, "&gt;")
7
- .replace(/"/g, "&quot;");
8
- }
9
- export function escapeAttribute(value) {
10
- return escapeHtml(value).replace(/'/g, "&#39;");
11
- }
12
- export function escapeJsonForHtml(value) {
13
- return JSON.stringify(value)
14
- .replace(/</g, "\\u003c")
15
- .replace(/>/g, "\\u003e")
16
- .replace(/&/g, "\\u0026");
17
- }
18
- export function withAccountQuery(href, accountId) {
19
- if (!accountId || !href.startsWith("/")) {
20
- return href;
21
- }
22
- const url = new URL(href, "https://vidfarm.local");
23
- if (url.pathname.startsWith("/u/")) {
24
- return `${url.pathname}${url.search}${url.hash}`;
25
- }
26
- if (url.pathname === "/discover" || url.pathname.startsWith("/discover/") || url.pathname === "/help") {
27
- return `${url.pathname}${url.search}${url.hash}`;
28
- }
29
- return `/u/${encodeURIComponent(accountId)}${url.pathname}${url.search}${url.hash}`;
30
- }
31
- export function resolveAccountDisplayName(input) {
32
- const email = input?.email?.trim() || "";
33
- const displayName = input?.displayName?.trim() || "";
34
- if (displayName) {
35
- return displayName;
36
- }
37
- if (!email) {
38
- return "";
39
- }
40
- return email
41
- .split("@")[0]
42
- .replace(/[._-]+/g, " ")
43
- .replace(/\b\w/g, (match) => match.toUpperCase());
44
- }
45
- function renderNavIcon(kind) {
46
- if (kind === "discover") {
47
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M10 3v4"/><path d="M10 13v4"/><path d="M3 10h4"/><path d="M13 10h4"/><path d="m5.8 5.8 2.3 2.3"/><path d="m11.9 11.9 2.3 2.3"/><path d="m14.2 5.8-2.3 2.3"/><path d="m8.1 11.9-2.3 2.3"/></svg>`;
48
- }
49
- if (kind === "library") {
50
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 4.5h3v11h-3z"/><path d="M8.7 4.5h3v11h-3z"/><path d="m13.4 5.1 2.3-.6 2.2 10.7-2.3.6z"/></svg>`;
51
- }
52
- if (kind === "calendar") {
53
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="10" r="7.2"/><path d="M10 6.3v4.1l2.8 1.7"/></svg>`;
54
- }
55
- if (kind === "chat") {
56
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4.2 5.2a2 2 0 0 1 2-2h7.6a2 2 0 0 1 2 2v5.6a2 2 0 0 1-2 2H9.2l-4.1 3.1v-3.1a2 2 0 0 1-.9-1.7Z"/><path d="M7.3 7.1h5.4"/><path d="M7.3 9.6h3.7"/></svg>`;
57
- }
58
- if (kind === "settings") {
59
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M14.8 15.2a5.4 5.4 0 1 0-9.6 0"/><circle cx="10" cy="6.8" r="3.1"/></svg>`;
60
- }
61
- if (kind === "help") {
62
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="10" r="7.2"/><path d="M8.1 8a2.2 2.2 0 1 1 3.7 1.6c-.8.7-1.4 1.1-1.4 2.2"/><path d="M10 14.8h.01"/></svg>`;
63
- }
64
- return `<svg viewBox="0 0 20 20" fill="currentColor"><circle cx="4.2" cy="10" r="1.45"/><circle cx="10" cy="10" r="1.45"/><circle cx="15.8" cy="10" r="1.45"/></svg>`;
65
- }
66
- function renderMenuIcon() {
67
- return `<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M3.5 5.5h13"/><path d="M3.5 10h13"/><path d="M3.5 14.5h13"/></svg>`;
68
- }
69
- export function renderPrimaryNav(input) {
70
- const items = input.loggedIn
71
- ? [
72
- { id: "discover", href: withAccountQuery("/discover", input.accountId), label: "Discover", icon: renderNavIcon("discover") },
73
- { id: "library", href: withAccountQuery("/library", input.accountId), label: "Library", icon: renderNavIcon("library") },
74
- { id: "calendar", href: withAccountQuery("/calendar", input.accountId), label: "Calendar", icon: renderNavIcon("calendar") },
75
- { id: "settings", href: withAccountQuery("/settings", input.accountId), label: "Settings", icon: renderNavIcon("settings") }
76
- ]
77
- : [
78
- { id: "discover", href: "/discover", label: "Discover", icon: renderNavIcon("discover") },
79
- { id: "login", href: "/login", label: "Login", icon: renderNavIcon("settings") }
80
- ];
81
- const menuItems = input.loggedIn
82
- ? [
83
- { id: "chat", href: withAccountQuery("/chat", input.accountId), label: "Chat" },
84
- { id: "job-runs", href: withAccountQuery("/job-runs", input.accountId), label: "Run History" },
85
- { id: "tools", href: withAccountQuery("/tools/image", input.accountId), label: "Tools" },
86
- { id: "help", href: "/help", label: "Help" },
87
- { id: "logout", action: "logout", label: "Log Out" }
88
- ]
89
- : [
90
- { id: "help", href: "/help", label: "Help" },
91
- { id: "login", href: "/login", label: "Login" }
92
- ];
93
- const mobileMenuPrimaryItems = items.filter((item) => !menuItems.some((menuItem) => menuItem.id === item.id));
94
- const logoutDialog = input.loggedIn ? `
95
- <dialog class="logout-dialog" data-logout-dialog>
96
- <div class="logout-dialog-head">
97
- <div class="label logout-dialog-kicker">Log out</div>
98
- <h3>Log out of this browser?</h3>
99
- <p>This clears the stored developer key, workspace access, and local session state for the current browser.</p>
100
- </div>
101
- <div class="toolbar logout-dialog-actions">
102
- <button type="button" class="secondary" data-close-logout-dialog>Cancel</button>
103
- <form method="post" action="/logout" data-logout-form>
104
- <input type="hidden" name="account" value="${escapeAttribute(input.accountId ?? "")}" />
105
- <button type="submit" class="danger">Yes, log out</button>
106
- </form>
107
- </div>
108
- </dialog>
109
- ` : "";
110
- return `
111
- <nav class="primary-nav" aria-label="Primary">
112
- ${items.map((item) => `
113
- <a class="nav-link${item.id === input.current ? " is-active" : ""}" href="${item.href}">
114
- <span class="nav-icon" aria-hidden="true">${item.icon}</span>
115
- <span>${item.label}</span>
116
- </a>
117
- `).join("")}
118
- ${menuItems.map((item) => `
119
- ${"href" in item ? `
120
- <a class="nav-link nav-mobile-extra${item.id === input.current ? " is-active" : ""}" href="${escapeAttribute(item.href ?? "#")}">
121
- <span>${escapeHtml(item.label)}</span>
122
- </a>
123
- ` : `
124
- <button type="button" class="nav-link nav-mobile-extra nav-action-link" data-open-logout-dialog>
125
- <span>${escapeHtml(item.label)}</span>
126
- </button>
127
- `}
128
- `).join("")}
129
- ${menuItems.length ? `
130
- <details class="nav-menu">
131
- <summary class="nav-link nav-menu-trigger" aria-label="Open navigation menu">
132
- <span class="nav-icon nav-menu-desktop-icon" aria-hidden="true">${renderNavIcon("more")}</span>
133
- <span class="nav-icon nav-menu-mobile-icon" aria-hidden="true">${renderMenuIcon()}</span>
134
- <span class="nav-menu-label">Menu</span>
135
- </summary>
136
- <div class="nav-menu-panel" role="menu">
137
- ${mobileMenuPrimaryItems.map((item) => `
138
- <a class="nav-menu-item nav-menu-mobile-only${item.id === input.current ? " is-active" : ""}" role="menuitem" href="${escapeAttribute(item.href ?? "#")}">${escapeHtml(item.label)}</a>
139
- `).join("")}
140
- ${menuItems.map((item) => `
141
- ${"href" in item ? `
142
- <a class="nav-menu-item${item.id === input.current ? " is-active" : ""}" role="menuitem" href="${escapeAttribute(item.href ?? "#")}">${escapeHtml(item.label)}</a>
143
- ` : `
144
- <button type="button" class="nav-menu-item nav-menu-button" role="menuitem" data-open-logout-dialog>${escapeHtml(item.label)}</button>
145
- `}
146
- `).join("")}
147
- </div>
148
- </details>
149
- ` : ""}
150
- </nav>
151
- ${logoutDialog}
152
- `;
153
- }
154
- export function renderBrandLockup(input) {
155
- const email = input?.email?.trim() || "";
156
- const derivedName = resolveAccountDisplayName(input);
157
- const href = withAccountQuery("/discover", input?.accountId);
158
- const accountMeta = email
159
- ? `<div class="brand-account-meta">${escapeHtml(derivedName)} <span>(${escapeHtml(email)})</span></div>`
160
- : "";
161
- return `
162
- <a class="brand-lockup" href="${escapeAttribute(href)}">
163
- <img class="brand-logo-image" src="/assets/logo-vidfarm.png" alt="VidFarm AI" />
164
- <div class="brand-copy">
165
- <div class="brand-title brand-title-static">VidFarm<span class="brand-title-mobile-hidden"> AI</span></div>
166
- ${accountMeta}
167
- </div>
168
- </a>
169
- `;
170
- }
171
- const BRAND_NAME = "VidFarm";
172
- const BRAND_ORIGIN = "https://vidfarm.cc";
173
- const BRAND_OG_IMAGE = `${BRAND_ORIGIN}/assets/logo-vidfarm.png`;
174
- export function renderPageShell(input) {
175
- const isEditorTheme = input.bodyClass?.split(/\s+/).includes("is-editor-theme") ?? false;
176
- // Brand the tab title unless the page already names VidFarm.
177
- const pageTitle = /vidfarm/i.test(input.title) ? input.title : `${input.title} · ${BRAND_NAME}`;
178
- const description = input.description ?? `${BRAND_NAME} — serverless short-form video studio. Fork a proven template, remix it, and render a share-ready MP4 in your browser.`;
179
- const ogImage = input.social?.image ?? BRAND_OG_IMAGE;
180
- const ogType = input.social?.type ?? "website";
181
- const ogUrl = input.social?.url ?? BRAND_ORIGIN;
182
- const metaTags = `
183
- <meta name="description" content="${escapeHtml(description)}" />
184
- <meta name="theme-color" content="#f8f4eb" />
185
- <meta name="robots" content="index, follow" />
186
- <meta name="application-name" content="${BRAND_NAME}" />
187
- <meta property="og:type" content="${escapeHtml(ogType)}" />
188
- <meta property="og:site_name" content="${BRAND_NAME}" />
189
- <meta property="og:title" content="${escapeHtml(pageTitle)}" />
190
- <meta property="og:description" content="${escapeHtml(description)}" />
191
- <meta property="og:url" content="${escapeHtml(ogUrl)}" />
192
- <meta property="og:image" content="${escapeHtml(ogImage)}" />
193
- <meta name="twitter:card" content="summary_large_image" />
194
- <meta name="twitter:title" content="${escapeHtml(pageTitle)}" />
195
- <meta name="twitter:description" content="${escapeHtml(description)}" />
196
- <meta name="twitter:image" content="${escapeHtml(ogImage)}" />`;
197
- return `<!doctype html>
198
- <html lang="en">
199
- <head>
200
- <meta charset="utf-8" />
201
- <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
202
- <title>${escapeHtml(pageTitle)}</title>${metaTags}
203
- <link rel="icon" href="/assets/favicon.ico" sizes="any" />
204
- <link rel="preconnect" href="https://fonts.googleapis.com" />
205
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
206
- <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@500;600;700;800&family=Manrope:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
207
- <style>
208
- :root {
209
- color-scheme: light;
210
- --bg: #f8f4eb;
211
- --paper: rgba(255, 252, 247, 0.88);
212
- --paper-strong: rgba(255, 252, 247, 0.96);
213
- --panel: transparent;
214
- --panel-muted: rgba(250, 245, 234, 0.9);
215
- --ink: #2f3748;
216
- --muted: #74829c;
217
- --line: rgba(209, 219, 233, 0.9);
218
- --line-strong: rgba(191, 164, 109, 0.42);
219
- --accent: #dec081;
220
- --accent-deep: #243041;
221
- --accent-soft: rgba(222, 192, 129, 0.18);
222
- --shadow: 0 24px 80px rgba(15, 23, 42, 0.08);
223
- --shadow-soft: 0 16px 36px rgba(148, 109, 42, 0.08);
224
- --radius-lg: 32px;
225
- --radius-md: 26px;
226
- --radius-sm: 18px;
227
- }
228
-
229
- * {
230
- box-sizing: border-box;
231
- }
232
-
233
- html {
234
- height: 100%;
235
- min-height: 100%;
236
- overflow: hidden;
237
- }
238
-
239
- body {
240
- margin: 0;
241
- height: 100%;
242
- min-height: 100%;
243
- overflow: hidden;
244
- color: var(--ink);
245
- font-family: "Manrope", sans-serif;
246
- background:
247
- radial-gradient(circle at 12% 18%, rgba(222, 192, 129, 0.28), transparent 24%),
248
- radial-gradient(circle at 84% 12%, rgba(123, 92, 29, 0.12), transparent 22%),
249
- linear-gradient(180deg, rgba(255, 255, 255, 0.65), rgba(255, 255, 255, 0)),
250
- linear-gradient(145deg, #f8f4eb 0%, #f1e7d3 52%, #e9dbba 100%);
251
- background-attachment: fixed;
252
- }
253
-
254
- body::before {
255
- content: "";
256
- position: fixed;
257
- inset: 0;
258
- pointer-events: none;
259
- background-image:
260
- linear-gradient(rgba(96, 74, 36, 0.035) 1px, transparent 1px),
261
- linear-gradient(90deg, rgba(96, 74, 36, 0.035) 1px, transparent 1px);
262
- background-size: 30px 30px;
263
- mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.38), transparent 86%);
264
- }
265
-
266
- a {
267
- color: inherit;
268
- }
269
-
270
- button,
271
- input,
272
- select,
273
- textarea {
274
- font: inherit;
275
- }
276
-
277
- .app-shell {
278
- width: min(1980px, calc(100vw - 40px));
279
- margin: 0 auto;
280
- height: 100dvh;
281
- min-height: 0;
282
- padding: 20px 0 28px;
283
- }
284
-
285
- .app-shell.is-wide {
286
- width: min(1980px, calc(100vw - 40px));
287
- }
288
-
289
- .app-shell.is-narrow {
290
- width: min(1980px, calc(100vw - 40px));
291
- }
292
-
293
- .page-stack {
294
- display: grid;
295
- height: 100%;
296
- min-height: 0;
297
- gap: 18px;
298
- }
299
-
300
- .frame {
301
- position: relative;
302
- display: grid;
303
- grid-template-rows: auto minmax(0, 1fr);
304
- min-height: 0;
305
- overflow: hidden;
306
- border-radius: var(--radius-lg);
307
- background: var(--panel);
308
- }
309
-
310
- .frame-body {
311
- display: grid;
312
- min-height: 0;
313
- gap: 20px;
314
- padding: 14px 0 0;
315
- }
316
-
317
- .topbar {
318
- display: flex;
319
- align-items: center;
320
- justify-content: space-between;
321
- gap: 12px;
322
- min-height: 76px;
323
- padding: 10px 16px 10px 20px;
324
- border: 1px solid rgba(255, 255, 255, 0.82);
325
- border-radius: var(--radius-lg);
326
- background: var(--paper);
327
- box-shadow: var(--shadow);
328
- }
329
-
330
- .brand-lockup {
331
- display: flex;
332
- flex: 1 1 min(0, 58%);
333
- align-items: center;
334
- gap: 14px;
335
- min-width: 0;
336
- color: inherit;
337
- text-decoration: none;
338
- }
339
-
340
- .brand-lockup:hover,
341
- .brand-lockup:focus {
342
- text-decoration: none;
343
- }
344
-
345
- .brand-logo-image {
346
- display: block;
347
- width: auto;
348
- height: 44px;
349
- max-width: min(220px, 38vw);
350
- object-fit: contain;
351
- object-position: left center;
352
- flex: 0 0 auto;
353
- border-radius: 12px;
354
- }
355
-
356
- .brand-mark {
357
- display: inline-flex;
358
- align-items: center;
359
- justify-content: center;
360
- width: 38px;
361
- height: 38px;
362
- border-radius: 999px;
363
- background: #111934;
364
- color: #f3e8cd;
365
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
366
- }
367
-
368
- .brand-mark svg {
369
- width: 20px;
370
- height: 20px;
371
- }
372
-
373
- .brand-copy {
374
- display: flex;
375
- align-items: center;
376
- gap: 10px;
377
- min-width: 0;
378
- flex-wrap: wrap;
379
- }
380
-
381
- .brand-account-meta {
382
- min-width: 0;
383
- color: rgba(116, 130, 156, 0.78);
384
- font-size: 0.94rem;
385
- line-height: 1.2;
386
- font-weight: 500;
387
- letter-spacing: -0.01em;
388
- white-space: nowrap;
389
- overflow: hidden;
390
- text-overflow: ellipsis;
391
- }
392
-
393
- .brand-account-meta span {
394
- color: rgba(116, 130, 156, 0.62);
395
- }
396
-
397
- .eyebrow {
398
- font-size: 10px;
399
- font-weight: 700;
400
- letter-spacing: 0.28em;
401
- text-transform: uppercase;
402
- color: var(--muted);
403
- }
404
-
405
- .brand-title {
406
- font-family: "Instrument Serif", serif;
407
- font-size: clamp(1.65rem, 1.85vw, 2rem);
408
- line-height: 0.92;
409
- font-weight: 400;
410
- letter-spacing: -0.05em;
411
- color: #1f2635;
412
- }
413
-
414
- .brand-title-static {
415
- font-family: "Instrument Serif", serif;
416
- font-size: clamp(1.5rem, 1.7vw, 1.85rem);
417
- line-height: 0.92;
418
- font-weight: 400;
419
- letter-spacing: -0.05em;
420
- text-transform: none;
421
- color: #1f2635;
422
- }
423
-
424
- .brand-description {
425
- min-width: 0;
426
- color: #66758d;
427
- font-size: 0.94rem;
428
- }
429
-
430
- .topbar-actions {
431
- display: flex;
432
- flex-wrap: wrap;
433
- flex: 1 1 auto;
434
- gap: 6px;
435
- justify-content: flex-end;
436
- min-width: 0;
437
- }
438
-
439
- .primary-nav {
440
- display: flex;
441
- flex-wrap: nowrap;
442
- gap: 4px;
443
- align-items: center;
444
- justify-content: flex-end;
445
- width: auto;
446
- min-width: 0;
447
- max-width: 100%;
448
- padding: 3px;
449
- border: 1px solid rgba(191, 164, 109, 0.28);
450
- border-radius: 22px;
451
- background: linear-gradient(180deg, rgba(247, 241, 230, 0.94), rgba(244, 236, 223, 0.96));
452
- box-shadow:
453
- inset 0 1px 0 rgba(255, 255, 255, 0.88),
454
- 0 8px 18px rgba(138, 102, 32, 0.08);
455
- }
456
-
457
- .nav-link {
458
- display: inline-flex;
459
- flex: 0 0 auto;
460
- align-items: center;
461
- justify-content: center;
462
- gap: 8px;
463
- min-height: 38px;
464
- padding: 0 14px;
465
- white-space: nowrap;
466
- border: 1px solid transparent;
467
- border-radius: 16px;
468
- color: #6f6451;
469
- text-decoration: none;
470
- font-size: 0.9rem;
471
- font-weight: 600;
472
- transition: background 160ms ease, color 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
473
- }
474
-
475
- .nav-link:hover {
476
- color: var(--ink);
477
- }
478
-
479
- .nav-link.is-active {
480
- border-color: rgba(232, 223, 204, 0.9);
481
- background: rgba(255, 252, 247, 0.96);
482
- color: var(--ink);
483
- box-shadow: 0 8px 20px rgba(101, 73, 18, 0.08);
484
- }
485
-
486
- .nav-menu {
487
- position: relative;
488
- flex: 0 0 auto;
489
- }
490
-
491
- .nav-menu > summary {
492
- list-style: none;
493
- cursor: pointer;
494
- }
495
-
496
- .nav-menu > summary::-webkit-details-marker {
497
- display: none;
498
- }
499
-
500
- .nav-menu-trigger {
501
- min-width: 34px;
502
- padding: 0 8px;
503
- color: rgba(111, 100, 81, 0.68);
504
- }
505
-
506
- .nav-menu-trigger:hover,
507
- .nav-menu[open] > .nav-menu-trigger {
508
- color: rgba(47, 55, 72, 0.82);
509
- }
510
-
511
- .nav-menu-label {
512
- display: none;
513
- }
514
-
515
- .nav-menu-mobile-icon,
516
- .nav-menu-mobile-only {
517
- display: none;
518
- }
519
-
520
- .nav-menu-panel {
521
- position: absolute;
522
- z-index: 40;
523
- top: calc(100% + 8px);
524
- right: 0;
525
- display: grid;
526
- width: max-content;
527
- min-width: 142px;
528
- padding: 6px;
529
- border: 1px solid rgba(191, 164, 109, 0.3);
530
- border-radius: 14px;
531
- background: rgba(255, 252, 247, 0.98);
532
- box-shadow: 0 18px 38px rgba(81, 58, 20, 0.15);
533
- }
534
-
535
- .nav-menu-item {
536
- display: flex;
537
- align-items: center;
538
- justify-content: flex-start;
539
- width: 100%;
540
- min-height: 34px;
541
- padding: 0 10px;
542
- border: 0;
543
- border-radius: 10px;
544
- background: transparent;
545
- color: #5d6a80;
546
- font-size: 0.88rem;
547
- font-weight: 700;
548
- font-family: inherit;
549
- text-align: left;
550
- text-decoration: none;
551
- white-space: nowrap;
552
- cursor: pointer;
553
- }
554
-
555
- .nav-menu-item:hover,
556
- .nav-menu-item.is-active {
557
- background: rgba(244, 236, 223, 0.86);
558
- color: var(--ink);
559
- }
560
-
561
- .nav-menu-item.nav-menu-mobile-only {
562
- display: none;
563
- }
564
-
565
- .nav-action-link {
566
- border: 1px solid transparent;
567
- background: transparent;
568
- font-family: inherit;
569
- }
570
-
571
- .nav-mobile-extra {
572
- display: none;
573
- }
574
-
575
- .nav-icon,
576
- .nav-icon svg {
577
- width: 16px;
578
- height: 16px;
579
- }
580
-
581
- .surface,
582
- .surface-hero,
583
- .surface-muted {
584
- position: relative;
585
- border-radius: var(--radius-md);
586
- background: transparent;
587
- }
588
-
589
- .surface-hero {
590
- background:
591
- radial-gradient(circle at top right, rgba(195, 159, 86, 0.14), transparent 26%),
592
- transparent;
593
- }
594
-
595
- h1,
596
- h2,
597
- h3 {
598
- margin: 0;
599
- color: #1f2635;
600
- }
601
-
602
- h1 {
603
- font-family: "Instrument Serif", serif;
604
- font-size: clamp(3rem, 5vw, 4.6rem);
605
- line-height: 0.88;
606
- font-weight: 400;
607
- letter-spacing: -0.07em;
608
- text-wrap: balance;
609
- }
610
-
611
- h2 {
612
- font-family: "Instrument Serif", serif;
613
- font-size: clamp(1.8rem, 2.8vw, 2.7rem);
614
- line-height: 0.92;
615
- font-weight: 400;
616
- letter-spacing: -0.06em;
617
- }
618
-
619
- h3 {
620
- font-size: 1.12rem;
621
- line-height: 1.2;
622
- font-weight: 600;
623
- letter-spacing: -0.03em;
624
- }
625
-
626
- p {
627
- margin: 0;
628
- color: var(--muted);
629
- line-height: 1.65;
630
- }
631
-
632
- .lede {
633
- max-width: 56ch;
634
- font-size: 0.98rem;
635
- }
636
-
637
- .hero-grid,
638
- .split-grid,
639
- .card-grid,
640
- .stats-grid,
641
- .field-grid,
642
- .toolbar {
643
- display: grid;
644
- gap: 16px;
645
- }
646
-
647
- .hero-grid {
648
- grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);
649
- align-items: stretch;
650
- }
651
-
652
- .split-grid {
653
- grid-template-columns: minmax(300px, 340px) minmax(0, 1fr);
654
- }
655
-
656
- .page-hero {
657
- display: grid;
658
- grid-template-columns: minmax(0, 1.55fr) minmax(260px, 0.85fr);
659
- gap: 18px;
660
- align-items: start;
661
- }
662
-
663
- .page-section {
664
- display: grid;
665
- gap: 14px;
666
- }
667
-
668
- .page-section-head {
669
- display: flex;
670
- align-items: end;
671
- justify-content: space-between;
672
- gap: 16px;
673
- }
674
-
675
- .metric-grid {
676
- display: grid;
677
- gap: 14px;
678
- }
679
-
680
- .metric {
681
- display: grid;
682
- gap: 8px;
683
- }
684
-
685
- .card-grid {
686
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
687
- }
688
-
689
- .stats-grid {
690
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
691
- }
692
-
693
- .field-grid.cols-2 {
694
- grid-template-columns: repeat(2, minmax(0, 1fr));
695
- }
696
-
697
- .field-grid.cols-3 {
698
- grid-template-columns: repeat(3, minmax(0, 1fr));
699
- }
700
-
701
- .logout-dialog {
702
- width: min(28rem, calc(100vw - 1.5rem));
703
- padding: 0;
704
- border: 1px solid rgba(235, 195, 195, 0.96);
705
- border-radius: 30px;
706
- background: rgba(255, 250, 250, 0.98);
707
- box-shadow: 0 28px 72px rgba(113, 30, 30, 0.16);
708
- }
709
-
710
- .logout-dialog::backdrop {
711
- background: rgba(36, 24, 24, 0.24);
712
- backdrop-filter: blur(8px);
713
- }
714
-
715
- .logout-dialog-head {
716
- display: grid;
717
- gap: 12px;
718
- padding: 24px 24px 20px;
719
- border-bottom: 1px solid rgba(235, 195, 195, 0.96);
720
- background: rgba(148, 47, 47, 0.05);
721
- }
722
-
723
- .logout-dialog-kicker {
724
- margin-bottom: 0;
725
- color: #a33f3f;
726
- }
727
-
728
- .logout-dialog-head h3 {
729
- margin: 0;
730
- font-size: 2rem;
731
- line-height: 0.95;
732
- letter-spacing: -0.05em;
733
- color: #571d1d;
734
- }
735
-
736
- .logout-dialog-head p {
737
- margin: 0;
738
- color: rgba(109, 36, 36, 0.8);
739
- }
740
-
741
- .logout-dialog-actions {
742
- justify-content: flex-end;
743
- padding: 20px 24px 24px;
744
- }
745
-
746
- .logout-dialog-actions form {
747
- margin: 0;
748
- }
749
-
750
- .stack {
751
- display: grid;
752
- gap: 16px;
753
- }
754
-
755
- .stack-lg {
756
- display: grid;
757
- gap: 22px;
758
- }
759
-
760
- .kicker {
761
- display: inline-flex;
762
- align-items: center;
763
- gap: 10px;
764
- min-height: 34px;
765
- width: max-content;
766
- max-width: 100%;
767
- align-self: start;
768
- padding: 0 14px;
769
- border: 1px solid rgba(209, 219, 233, 0.96);
770
- border-radius: 999px;
771
- background: rgba(255, 255, 255, 0.9);
772
- color: #6f7d95;
773
- font-size: 11px;
774
- font-weight: 700;
775
- letter-spacing: 0.24em;
776
- text-transform: uppercase;
777
- }
778
-
779
- .kicker.is-muted {
780
- color: var(--muted);
781
- }
782
-
783
- .view-toggle {
784
- display: inline-flex;
785
- flex: 0 0 auto;
786
- gap: 4px;
787
- padding: 3px;
788
- border: 1px solid rgba(191, 164, 109, 0.28);
789
- border-radius: 999px;
790
- background: linear-gradient(180deg, rgba(247, 241, 230, 0.94), rgba(244, 236, 223, 0.96));
791
- box-shadow:
792
- inset 0 1px 0 rgba(255, 255, 255, 0.88),
793
- 0 8px 18px rgba(138, 102, 32, 0.08);
794
- }
795
-
796
- .view-toggle-tab {
797
- display: inline-flex;
798
- align-items: center;
799
- justify-content: center;
800
- min-height: 38px;
801
- padding: 0 18px;
802
- border: 1px solid transparent;
803
- border-radius: 999px;
804
- background: transparent;
805
- color: #6f6451;
806
- text-decoration: none;
807
- font-size: 0.9rem;
808
- font-weight: 700;
809
- font-family: inherit;
810
- white-space: nowrap;
811
- cursor: pointer;
812
- box-shadow: none;
813
- transition: background 160ms ease, color 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
814
- }
815
-
816
- @media (hover: hover) {
817
- .view-toggle-tab:hover {
818
- transform: none;
819
- color: var(--ink);
820
- }
821
- }
822
-
823
- .view-toggle-tab.is-active {
824
- border-color: rgba(232, 223, 204, 0.9);
825
- background: rgba(255, 252, 247, 0.96);
826
- color: var(--ink);
827
- box-shadow: 0 8px 20px rgba(101, 73, 18, 0.08);
828
- }
829
-
830
- .button,
831
- button,
832
- .link-button,
833
- .cta-button {
834
- display: inline-flex;
835
- align-items: center;
836
- justify-content: center;
837
- gap: 10px;
838
- min-height: 46px;
839
- padding: 0 18px;
840
- border: 1px solid rgba(219, 196, 146, 0.8);
841
- border-radius: 999px;
842
- background: #dec081;
843
- color: #243041;
844
- text-decoration: none;
845
- font-size: 0.95rem;
846
- font-weight: 600;
847
- cursor: pointer;
848
- transition:
849
- transform 160ms ease,
850
- border-color 160ms ease,
851
- background 160ms ease,
852
- box-shadow 160ms ease;
853
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
854
- }
855
-
856
- @media (hover: hover) {
857
- .button:hover,
858
- button:hover,
859
- .link-button:hover {
860
- transform: translateY(-1px);
861
- border-color: rgba(191, 164, 109, 0.9);
862
- box-shadow:
863
- inset 0 1px 0 rgba(255, 255, 255, 0.84),
864
- 0 12px 28px rgba(118, 89, 38, 0.15);
865
- }
866
- }
867
-
868
- .button.secondary,
869
- button.secondary,
870
- .link-button.secondary {
871
- background: rgba(255, 255, 255, 0.88);
872
- color: var(--ink);
873
- }
874
-
875
- .button.danger,
876
- button.danger {
877
- border-color: rgba(192, 90, 90, 0.42);
878
- background: #9f3d3d;
879
- color: #fff8f8;
880
- }
881
-
882
- @media (hover: hover) {
883
- .button.danger:hover,
884
- button.danger:hover {
885
- border-color: rgba(160, 58, 58, 0.62);
886
- box-shadow: 0 12px 28px rgba(128, 38, 38, 0.18);
887
- }
888
- }
889
-
890
- .nav-menu-button:hover,
891
- .nav-action-link:hover {
892
- transform: none;
893
- box-shadow: none;
894
- }
895
-
896
- .button.ghost,
897
- button.ghost,
898
- .link-button.ghost {
899
- background: rgba(255, 255, 255, 0.34);
900
- }
901
-
902
- button[disabled] {
903
- cursor: not-allowed;
904
- opacity: 0.5;
905
- transform: none;
906
- box-shadow: none;
907
- }
908
-
909
- .input,
910
- input,
911
- select,
912
- textarea {
913
- width: 100%;
914
- border: 1px solid var(--line);
915
- border-radius: 999px;
916
- background: rgba(255, 255, 255, 0.92);
917
- color: var(--ink);
918
- padding: 14px 16px;
919
- outline: none;
920
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);
921
- }
922
-
923
- textarea {
924
- min-height: 140px;
925
- border-radius: 24px;
926
- resize: vertical;
927
- }
928
-
929
- input:focus,
930
- select:focus,
931
- textarea:focus {
932
- border-color: rgba(191, 164, 109, 0.9);
933
- box-shadow:
934
- inset 0 1px 0 rgba(255, 255, 255, 0.9),
935
- 0 0 0 4px var(--accent-soft);
936
- }
937
-
938
- label,
939
- .label {
940
- display: block;
941
- margin-bottom: 8px;
942
- color: var(--muted);
943
- font-size: 11px;
944
- font-weight: 700;
945
- letter-spacing: 0.3em;
946
- text-transform: uppercase;
947
- }
948
-
949
- .label-group {
950
- display: grid;
951
- gap: 8px;
952
- }
953
-
954
- .notice {
955
- padding: 14px 16px;
956
- border: 1px solid rgba(209, 219, 233, 0.96);
957
- border-radius: 18px;
958
- background: rgba(255, 255, 255, 0.82);
959
- color: var(--ink);
960
- }
961
-
962
- .notice-success {
963
- border-color: rgba(209, 219, 233, 0.96);
964
- background: rgba(255, 255, 255, 0.82);
965
- color: var(--ink);
966
- }
967
-
968
- .notice-error {
969
- border-color: rgba(214, 107, 107, 0.35);
970
- background: rgba(191, 38, 38, 0.1);
971
- color: #7f1d1d;
972
- }
973
-
974
- .helper,
975
- .tiny,
976
- .meta-copy {
977
- color: #7a879e;
978
- font-size: 0.94rem;
979
- }
980
-
981
- .tiny {
982
- font-size: 0.86rem;
983
- }
984
-
985
- .pill {
986
- display: inline-flex;
987
- align-items: center;
988
- gap: 8px;
989
- min-height: 34px;
990
- padding: 0 12px;
991
- border: 1px solid rgba(209, 219, 233, 0.96);
992
- border-radius: 999px;
993
- background: rgba(255, 255, 255, 0.9);
994
- color: #6f7d95;
995
- font-size: 11px;
996
- font-weight: 700;
997
- letter-spacing: 0.24em;
998
- text-transform: uppercase;
999
- }
1000
-
1001
- .status-pill.is-active::before,
1002
- .pill.is-active::before {
1003
- content: "";
1004
- width: 8px;
1005
- height: 8px;
1006
- border-radius: 999px;
1007
- background: var(--accent);
1008
- box-shadow: 0 0 0 4px rgba(222, 192, 129, 0.22);
1009
- }
1010
-
1011
- .status-row,
1012
- .toolbar {
1013
- display: flex;
1014
- flex-wrap: wrap;
1015
- align-items: center;
1016
- }
1017
-
1018
- .toolbar,
1019
- .status-row {
1020
- gap: 10px;
1021
- }
1022
-
1023
- .keyline {
1024
- height: 1px;
1025
- background: linear-gradient(90deg, rgba(112, 86, 34, 0), rgba(209, 219, 233, 0.96), rgba(112, 86, 34, 0));
1026
- }
1027
-
1028
- .empty-state {
1029
- padding: 18px;
1030
- border: 1px dashed rgba(209, 219, 233, 0.96);
1031
- border-radius: 18px;
1032
- background: rgba(255, 255, 255, 0.5);
1033
- color: var(--muted);
1034
- }
1035
-
1036
- .auth-main .page-stack {
1037
- align-content: center;
1038
- justify-items: center;
1039
- padding: 24px 12px;
1040
- }
1041
-
1042
- .auth-card {
1043
- display: grid;
1044
- gap: 14px;
1045
- width: 100%;
1046
- max-width: 560px;
1047
- margin: 0 auto;
1048
- padding: 28px;
1049
- border: 1px solid var(--line);
1050
- border-radius: var(--radius-md);
1051
- background: var(--paper-strong);
1052
- box-shadow: var(--shadow-soft);
1053
- }
1054
-
1055
- .auth-card h1,
1056
- .auth-card h2,
1057
- .auth-card h3,
1058
- .auth-card p {
1059
- overflow-wrap: anywhere;
1060
- }
1061
-
1062
- .loading-inline {
1063
- display: inline-flex;
1064
- align-items: center;
1065
- gap: 10px;
1066
- }
1067
-
1068
- .loading-spinner {
1069
- display: inline-block;
1070
- width: 16px;
1071
- height: 16px;
1072
- border: 2px solid rgba(36, 48, 65, 0.18);
1073
- border-top-color: rgba(36, 48, 65, 0.78);
1074
- border-radius: 999px;
1075
- animation: vidfarm-spin 0.8s linear infinite;
1076
- flex: 0 0 auto;
1077
- }
1078
-
1079
- @keyframes vidfarm-spin {
1080
- to {
1081
- transform: rotate(360deg);
1082
- }
1083
- }
1084
-
1085
- code,
1086
- pre {
1087
- font-family: "SFMono-Regular", Menlo, Consolas, monospace;
1088
- }
1089
-
1090
- pre {
1091
- margin: 0;
1092
- border: 1px solid rgba(73, 57, 26, 0.18);
1093
- border-radius: 18px;
1094
- background: #211a12;
1095
- color: #f8eed6;
1096
- padding: 16px;
1097
- overflow: auto;
1098
- white-space: pre-wrap;
1099
- word-break: break-word;
1100
- }
1101
-
1102
- ${input.style ?? ""}
1103
-
1104
- ${isEditorTheme ? EDITOR_DARK_THEME_CSS : ""}
1105
-
1106
- @media (max-width: 1024px) {
1107
- .hero-grid,
1108
- .split-grid,
1109
- .page-hero {
1110
- grid-template-columns: 1fr;
1111
- }
1112
- }
1113
-
1114
- @media (max-width: 1024px) {
1115
- html,
1116
- body {
1117
- height: auto;
1118
- min-height: 100%;
1119
- overflow: auto;
1120
- overflow-x: hidden;
1121
- }
1122
-
1123
- body {
1124
- background-attachment: scroll;
1125
- }
1126
-
1127
- .app-shell,
1128
- .app-shell.is-wide,
1129
- .app-shell.is-narrow {
1130
- width: min(100vw - 14px, 1980px);
1131
- height: auto;
1132
- min-height: 100svh;
1133
- padding-top: 8px;
1134
- padding-bottom: calc(18px + env(safe-area-inset-bottom));
1135
- }
1136
-
1137
- .page-stack,
1138
- .frame {
1139
- height: auto;
1140
- min-height: 0;
1141
- overflow: visible;
1142
- }
1143
-
1144
- .topbar {
1145
- min-height: auto;
1146
- padding: 8px;
1147
- border-radius: 24px;
1148
- align-items: center;
1149
- flex-wrap: nowrap;
1150
- gap: 8px;
1151
- }
1152
-
1153
- .brand-lockup {
1154
- flex: 1 1 auto;
1155
- width: auto;
1156
- gap: 7px;
1157
- }
1158
-
1159
- .brand-copy {
1160
- display: flex;
1161
- flex: 0 0 auto;
1162
- min-width: 0;
1163
- gap: 0;
1164
- flex-wrap: nowrap;
1165
- }
1166
-
1167
- .brand-title-static {
1168
- font-size: 1.24rem;
1169
- line-height: 1;
1170
- }
1171
-
1172
- .brand-account-meta {
1173
- display: none;
1174
- }
1175
-
1176
- .brand-title-mobile-hidden {
1177
- display: none;
1178
- }
1179
-
1180
- .topbar-actions {
1181
- flex: 0 0 auto;
1182
- width: auto;
1183
- justify-content: flex-end;
1184
- overflow: visible;
1185
- padding-bottom: 0;
1186
- scrollbar-width: none;
1187
- }
1188
-
1189
- .topbar-actions::-webkit-scrollbar {
1190
- display: none;
1191
- }
1192
-
1193
- .brand-logo-image {
1194
- height: 32px;
1195
- max-width: 38px;
1196
- }
1197
-
1198
- .primary-nav {
1199
- min-width: 0;
1200
- width: auto;
1201
- max-width: none;
1202
- flex-wrap: nowrap;
1203
- justify-content: flex-end;
1204
- gap: 0;
1205
- padding: 0;
1206
- border: 0;
1207
- border-radius: 0;
1208
- background: transparent;
1209
- box-shadow: none;
1210
- overflow: visible;
1211
- }
1212
-
1213
- .primary-nav > .nav-link {
1214
- display: none;
1215
- }
1216
-
1217
- .nav-link {
1218
- flex: 0 0 auto;
1219
- min-height: 44px;
1220
- gap: 6px;
1221
- padding: 0 12px;
1222
- border-radius: 14px;
1223
- font-size: 0.86rem;
1224
- }
1225
-
1226
- .nav-mobile-extra {
1227
- display: none;
1228
- }
1229
-
1230
- .nav-menu {
1231
- display: block;
1232
- }
1233
-
1234
- .nav-menu-trigger {
1235
- min-width: 44px;
1236
- width: 44px;
1237
- height: 44px;
1238
- padding: 0;
1239
- border: 1px solid rgba(191, 164, 109, 0.32);
1240
- border-radius: 15px;
1241
- background: rgba(255, 252, 247, 0.96);
1242
- color: var(--ink);
1243
- box-shadow: 0 8px 18px rgba(138, 102, 32, 0.1);
1244
- }
1245
-
1246
- .nav-menu-desktop-icon {
1247
- display: none;
1248
- }
1249
-
1250
- .nav-menu-mobile-icon {
1251
- display: inline-flex;
1252
- }
1253
-
1254
- .nav-menu-panel {
1255
- top: calc(100% + 10px);
1256
- right: 0;
1257
- width: min(82vw, 260px);
1258
- min-width: 190px;
1259
- max-height: calc(100svh - 92px);
1260
- overflow: auto;
1261
- padding: 8px;
1262
- border-radius: 16px;
1263
- box-shadow: 0 20px 46px rgba(81, 58, 20, 0.18);
1264
- }
1265
-
1266
- .nav-menu-item {
1267
- min-height: 42px;
1268
- padding: 0 12px;
1269
- border-radius: 12px;
1270
- font-size: 0.88rem;
1271
- }
1272
-
1273
- .nav-menu-item.nav-menu-mobile-only {
1274
- display: flex;
1275
- }
1276
-
1277
- .nav-link > span:not(.nav-icon) {
1278
- display: none;
1279
- }
1280
-
1281
- .nav-link > .nav-menu-label {
1282
- display: none;
1283
- }
1284
-
1285
- .nav-icon,
1286
- .nav-icon svg {
1287
- width: 18px;
1288
- height: 18px;
1289
- }
1290
-
1291
- @media (max-width: 560px) {
1292
- .primary-nav > .nav-link {
1293
- display: none;
1294
- }
1295
-
1296
- .primary-nav > .nav-link > span:not(.nav-icon) {
1297
- display: none;
1298
- }
1299
- }
1300
-
1301
- @media (max-width: 374px) {
1302
- .topbar {
1303
- gap: 6px;
1304
- }
1305
-
1306
- .brand-logo-image {
1307
- height: 30px;
1308
- max-width: 34px;
1309
- }
1310
-
1311
- .brand-lockup {
1312
- gap: 5px;
1313
- }
1314
-
1315
- .brand-title-static {
1316
- font-size: 1.08rem;
1317
- }
1318
-
1319
- .primary-nav {
1320
- gap: 3px;
1321
- }
1322
-
1323
- .nav-link {
1324
- gap: 3px;
1325
- padding: 0 6px;
1326
- font-size: 0.72rem;
1327
- }
1328
- }
1329
-
1330
- .field-grid.cols-2,
1331
- .field-grid.cols-3 {
1332
- grid-template-columns: 1fr;
1333
- }
1334
-
1335
- h1 {
1336
- font-size: clamp(1.9rem, 8vw, 2.6rem);
1337
- }
1338
- }
1339
- </style>
1340
- <script src="/assets/sentry-config.js"></script>
1341
- </head>
1342
- <body${input.bodyClass ? ` class="${escapeAttribute(input.bodyClass)}"` : ""}>
1343
- <main class="app-shell${input.mainClass ? ` ${escapeHtml(input.mainClass)}` : ""}">
1344
- <div class="page-stack${input.shellClass ? ` ${escapeHtml(input.shellClass)}` : ""}">
1345
- ${input.body}
1346
- </div>
1347
- </main>
1348
- <script>
1349
- (() => {
1350
- const logoutDialog = document.querySelector("[data-logout-dialog]");
1351
- const logoutForm = document.querySelector("[data-logout-form]");
1352
- const openLogoutButtons = document.querySelectorAll("[data-open-logout-dialog]");
1353
- const closeLogoutButtons = document.querySelectorAll("[data-close-logout-dialog]");
1354
-
1355
- function clearLogoutAccountCache() {
1356
- if (!(logoutForm instanceof HTMLFormElement)) {
1357
- return;
1358
- }
1359
- const account = String(new FormData(logoutForm).get("account") || "").trim();
1360
- if (!account) {
1361
- return;
1362
- }
1363
- try {
1364
- const registryIndexKey = "vidfarm:agency:accounts:index";
1365
- const rawIds = window.localStorage.getItem(registryIndexKey);
1366
- const ids = rawIds ? JSON.parse(rawIds) : [];
1367
- if (Array.isArray(ids)) {
1368
- window.localStorage.setItem(registryIndexKey, JSON.stringify(ids.filter((value) => value !== account)));
1369
- }
1370
- window.localStorage.removeItem("vidfarm:agency:account_" + account);
1371
- window.localStorage.removeItem("vidfarm:flockposter-cache:v1_" + account);
1372
- window.localStorage.removeItem("vidfarm:discover-bookmarks:v1_" + account);
1373
- } catch {
1374
- // Ignore storage failures.
1375
- }
1376
- }
1377
-
1378
- if (logoutDialog instanceof HTMLDialogElement && openLogoutButtons.length) {
1379
- openLogoutButtons.forEach((button) => {
1380
- button.addEventListener("click", () => {
1381
- if (!logoutDialog.open) {
1382
- logoutDialog.showModal();
1383
- }
1384
- });
1385
- });
1386
- closeLogoutButtons.forEach((button) => {
1387
- button.addEventListener("click", () => logoutDialog.close());
1388
- });
1389
- logoutDialog.addEventListener("click", (event) => {
1390
- const rect = logoutDialog.getBoundingClientRect();
1391
- const isBackdropClick =
1392
- event.clientX < rect.left ||
1393
- event.clientX > rect.right ||
1394
- event.clientY < rect.top ||
1395
- event.clientY > rect.bottom;
1396
- if (isBackdropClick) {
1397
- logoutDialog.close();
1398
- }
1399
- });
1400
- } else if (openLogoutButtons.length && logoutForm instanceof HTMLFormElement) {
1401
- openLogoutButtons.forEach((button) => {
1402
- button.addEventListener("click", () => {
1403
- if (window.confirm("Log out of this browser and clear local workspace access?")) {
1404
- logoutForm.requestSubmit();
1405
- }
1406
- });
1407
- });
1408
- }
1409
-
1410
- if (logoutForm instanceof HTMLFormElement) {
1411
- logoutForm.addEventListener("submit", clearLogoutAccountCache);
1412
- }
1413
-
1414
- const navMenus = document.querySelectorAll("details.nav-menu");
1415
- if (navMenus.length) {
1416
- const closeNavMenus = () => {
1417
- navMenus.forEach((menu) => {
1418
- if (menu instanceof HTMLDetailsElement && menu.open) {
1419
- menu.open = false;
1420
- }
1421
- });
1422
- };
1423
- document.addEventListener("click", (event) => {
1424
- if (!(event.target instanceof Node)) {
1425
- return;
1426
- }
1427
- navMenus.forEach((menu) => {
1428
- if (menu instanceof HTMLDetailsElement && menu.open && !menu.contains(event.target)) {
1429
- menu.open = false;
1430
- }
1431
- });
1432
- });
1433
- document.addEventListener("keydown", (event) => {
1434
- if (event.key === "Escape") {
1435
- closeNavMenus();
1436
- }
1437
- });
1438
- navMenus.forEach((menu) => {
1439
- menu.querySelectorAll(".nav-menu-item").forEach((item) => {
1440
- item.addEventListener("click", () => closeNavMenus());
1441
- });
1442
- });
1443
- }
1444
- })();
1445
- </script>
1446
- ${input.runtimeBoot ? `<div id="page-runtime-root" hidden></div>
1447
- <script id="page-runtime-boot" type="application/json">${escapeJsonForHtml(input.runtimeBoot)}</script>
1448
- <script type="module" src="/assets/page-runtime-client-app.js"></script>` : ""}
1449
- </body>
1450
- </html>`;
1451
- }
1452
- //# sourceMappingURL=page-shell.js.map