@mevdragon/vidfarm-devcli 0.2.14 → 0.3.1

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