@mevdragon/vidfarm-devcli 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +3 -3
  2. package/demo/README.md +28 -0
  3. package/demo/dist/app.css +1 -0
  4. package/demo/dist/app.js +1184 -0
  5. package/demo/dist/chunks/chunk-DXB73IDG.js +1 -0
  6. package/demo/dist/chunks/chunk-S7OWAJDS.js +36 -0
  7. package/demo/dist/chunks/chunk-VTIBZ6AN.js +1 -0
  8. package/demo/dist/chunks/dist-ADSJKBVE.js +332 -0
  9. package/demo/dist/chunks/domEditingLayers-VZMLL4AP-SGHWPND4.js +1 -0
  10. package/demo/dist/chunks/hyperframes-player-XB65TCD6.js +425 -0
  11. package/demo/dist/chunks/lib-XAQ37YOE.js +1 -0
  12. package/demo/dist/chunks/src-TJ2QYA4U.js +207 -0
  13. package/demo/dist/favicon.ico +0 -0
  14. package/demo/dist/icons/timeline/audio.svg +7 -0
  15. package/demo/dist/icons/timeline/captions.svg +5 -0
  16. package/demo/dist/icons/timeline/composition.svg +12 -0
  17. package/demo/dist/icons/timeline/image.svg +18 -0
  18. package/demo/dist/icons/timeline/music.svg +10 -0
  19. package/demo/dist/icons/timeline/text.svg +3 -0
  20. package/demo/dist/index.html +15 -0
  21. package/dist/src/account-pages-legacy.js +9396 -0
  22. package/dist/src/account-pages.js +61 -0
  23. package/dist/src/app.js +14378 -0
  24. package/dist/src/cli.js +1 -1
  25. package/dist/src/composition-runtime.js +613 -0
  26. package/dist/src/config.js +166 -0
  27. package/dist/src/context.js +447 -0
  28. package/dist/src/dev-app-legacy.js +739 -0
  29. package/dist/src/dev-app.js +6 -0
  30. package/dist/src/domain.js +2 -0
  31. package/dist/src/editor-chat-history.js +82 -0
  32. package/dist/src/editor-chat.js +449 -0
  33. package/dist/src/editor-dark-theme.js +1128 -0
  34. package/dist/src/frontend/debug.js +71 -0
  35. package/dist/src/frontend/flockposter-cache-store.js +124 -0
  36. package/dist/src/frontend/homepage-client.js +182 -0
  37. package/dist/src/frontend/homepage-shared.js +4 -0
  38. package/dist/src/frontend/homepage-store.js +28 -0
  39. package/dist/src/frontend/homepage-view.js +547 -0
  40. package/dist/src/frontend/page-runtime-client.js +132 -0
  41. package/dist/src/frontend/page-runtime-store.js +9 -0
  42. package/dist/src/frontend/sentry.js +42 -0
  43. package/dist/src/frontend/template-editor-chat.js +3960 -0
  44. package/dist/src/help-page.js +346 -0
  45. package/dist/src/homepage.js +1235 -0
  46. package/dist/src/hyperframes/composition.js +180 -0
  47. package/dist/src/index.js +16 -0
  48. package/dist/src/instrument.js +30 -0
  49. package/dist/src/lib/crypto.js +45 -0
  50. package/dist/src/lib/dev-log.js +54 -0
  51. package/dist/src/lib/display-name.js +11 -0
  52. package/dist/src/lib/ids.js +24 -0
  53. package/dist/src/lib/images.js +19 -0
  54. package/dist/src/lib/json.js +15 -0
  55. package/dist/src/lib/package-root.js +47 -0
  56. package/dist/src/lib/template-paths.js +28 -0
  57. package/dist/src/lib/time.js +7 -0
  58. package/dist/src/lib/url-clean.js +85 -0
  59. package/dist/src/page-runtime.js +2 -0
  60. package/dist/src/page-shell.js +1381 -0
  61. package/dist/src/primitive-context.js +357 -0
  62. package/dist/src/primitive-registry.js +2436 -0
  63. package/dist/src/primitive-sdk.js +4 -0
  64. package/dist/src/primitives/hyperframes-media.js +108 -0
  65. package/dist/src/react-page-shell.js +35 -0
  66. package/dist/src/ready-post-schedule-component.js +1540 -0
  67. package/dist/src/registry.js +296 -0
  68. package/dist/src/runtime.js +35 -0
  69. package/dist/src/services/api-call-history.js +249 -0
  70. package/dist/src/services/auth.js +152 -0
  71. package/dist/src/services/billing-pricing.js +39 -0
  72. package/dist/src/services/billing.js +228 -0
  73. package/dist/src/services/cast.js +127 -0
  74. package/dist/src/services/chat-threads.js +92 -0
  75. package/dist/src/services/composition-sanitize.js +124 -0
  76. package/dist/src/services/composition-watch.js +79 -0
  77. package/dist/src/services/fork-access.js +93 -0
  78. package/dist/src/services/fork-manifest.js +42 -0
  79. package/dist/src/services/ghostcut.js +179 -0
  80. package/dist/src/services/hyperframes.js +2307 -0
  81. package/dist/src/services/job-capacity.js +14 -0
  82. package/dist/src/services/job-logs.js +197 -0
  83. package/dist/src/services/jobs.js +136 -0
  84. package/dist/src/services/local-dynamo.js +0 -0
  85. package/dist/src/services/media-processing.js +766 -0
  86. package/dist/src/services/primitive-media-lambda.js +280 -0
  87. package/dist/src/services/providers.js +2926 -0
  88. package/dist/src/services/rate-limits.js +262 -0
  89. package/dist/src/services/serverless-auth.js +382 -0
  90. package/dist/src/services/serverless-jobs.js +1082 -0
  91. package/dist/src/services/serverless-provider-keys.js +409 -0
  92. package/dist/src/services/serverless-records.js +1385 -0
  93. package/dist/src/services/serverless-template-configs.js +75 -0
  94. package/dist/src/services/storage.js +383 -0
  95. package/dist/src/services/template-certification.js +413 -0
  96. package/dist/src/services/template-loader.js +99 -0
  97. package/dist/src/services/template-runtime-bundles.js +217 -0
  98. package/dist/src/services/template-sources.js +1017 -0
  99. package/dist/src/services/video-normalization.js +2 -0
  100. package/dist/src/services/webhooks.js +62 -0
  101. package/dist/src/template-editor-pages.js +2576 -0
  102. package/dist/src/template-editor-shell.js +2840 -0
  103. package/dist/src/template-sdk.js +4 -0
  104. package/dist/src/worker.js +17 -0
  105. package/package.json +6 -4
  106. package/public/assets/homepage-app.js +54 -0
  107. package/public/assets/homepage-client-app.js +80 -0
  108. package/public/assets/page-runtime-client-app.js +94 -0
  109. package/src/assets/SELLING_AWARENESS_STAGES.md +579 -0
  110. package/src/assets/SELLING_WITH_HOOKS.md +377 -0
  111. package/src/assets/SELLING_WITH_VSLS.md +606 -0
  112. package/src/assets/favicon.ico +0 -0
  113. package/src/assets/logo-vidfarm.png +0 -0
@@ -0,0 +1,1235 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { renderToString } from "react-dom/server";
3
+ import { HomepageShell } from "./frontend/homepage-view.js";
4
+ import { escapeJsonForHtml, renderPageShell, resolveAccountDisplayName } from "./page-shell.js";
5
+ import { TEMPLATE_EDITOR_SHELL_STYLES } from "./template-editor-shell.js";
6
+ const HOMEPAGE_CLIENT_ASSET = "/assets/homepage-client-app.js";
7
+ export function renderHomepage(input) {
8
+ const boot = {
9
+ templates: input.templates,
10
+ account: input.account,
11
+ loadEndpoint: input.loadEndpoint,
12
+ skillEndpointPrefix: "/discover/skills/"
13
+ };
14
+ return renderPageShell({
15
+ title: input.account.isLoggedIn
16
+ ? resolveAccountDisplayName({ displayName: input.account.displayName, email: input.account.email }) || "VidFarm AI"
17
+ : "Studio",
18
+ mainClass: "is-wide",
19
+ runtimeBoot: input.editorChat
20
+ ? {
21
+ pageKind: "legacy",
22
+ title: "Discover",
23
+ userId: input.account.userId ?? null,
24
+ editorChat: input.editorChat
25
+ }
26
+ : undefined,
27
+ body: `
28
+ <div id="homepage-root">${renderToString(_jsx(HomepageShell, { account: input.account, templates: input.templates, visibleTemplates: input.templates, searchQuery: "", bookmarksOnly: false, bookmarks: new Set(), loading: input.templates.length === 0, error: null, onSearchQueryChange: undefined, onBookmarksOnlyChange: undefined, onToggleBookmark: undefined, onAddTemplate: undefined, onDeleteTemplate: undefined, skillEndpointPrefix: boot.skillEndpointPrefix }))}</div>
29
+ <script type="application/json" id="homepage-boot">${escapeJsonForHtml(boot)}</script>
30
+ <script type="module" src="${HOMEPAGE_CLIENT_ASSET}"></script>
31
+ `,
32
+ style: `
33
+ ${TEMPLATE_EDITOR_SHELL_STYLES}
34
+
35
+ #homepage-root {
36
+ display: grid;
37
+ height: 100%;
38
+ min-height: 0;
39
+ }
40
+
41
+ .discover-frame {
42
+ height: 100%;
43
+ min-height: 0;
44
+ }
45
+
46
+ .discover-frame.has-chat-rail { padding-left: 432px; }
47
+
48
+ .discover-frame .frame-body {
49
+ grid-template-rows: minmax(0, 1fr);
50
+ height: 100%;
51
+ min-height: 0;
52
+ overflow: hidden;
53
+ }
54
+
55
+ .discover-shell {
56
+ display: grid;
57
+ min-height: 0;
58
+ height: 100%;
59
+ gap: 0;
60
+ overflow: hidden;
61
+ border: 1px solid rgba(255, 255, 255, 0.82);
62
+ border-radius: 32px;
63
+ background: rgba(255, 251, 245, 0.84);
64
+ box-shadow: var(--shadow);
65
+ grid-template-columns: minmax(0, 1fr);
66
+ grid-template-rows: auto minmax(0, 1fr);
67
+ }
68
+
69
+ .discover-filter-bar {
70
+ position: sticky;
71
+ top: 0;
72
+ z-index: 5;
73
+ display: grid;
74
+ grid-template-columns: minmax(220px, 1fr) auto auto auto;
75
+ align-items: center;
76
+ gap: 12px;
77
+ padding: 14px 22px;
78
+ border-bottom: 1px solid rgba(209, 219, 233, 0.7);
79
+ background: rgba(255, 251, 245, 0.96);
80
+ backdrop-filter: blur(8px);
81
+ }
82
+
83
+ .discover-filter-search input {
84
+ min-height: 44px;
85
+ padding-left: 46px;
86
+ border-radius: 999px;
87
+ }
88
+
89
+ .discover-filter-search .search-icon { left: 14px; }
90
+
91
+ .discover-filter-toggle {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ gap: 10px;
95
+ min-height: 44px;
96
+ padding: 0 16px;
97
+ border: 1px solid rgba(209, 219, 233, 0.96);
98
+ border-radius: 999px;
99
+ background: rgba(255, 255, 255, 0.9);
100
+ color: #55637b;
101
+ cursor: pointer;
102
+ font-size: 0.86rem;
103
+ font-weight: 700;
104
+ white-space: nowrap;
105
+ }
106
+
107
+ .discover-filter-toggle[data-active="true"] {
108
+ border-color: rgba(219, 193, 122, 0.9);
109
+ background: rgba(219, 193, 122, 0.16);
110
+ color: #8a6b1b;
111
+ }
112
+
113
+ .discover-add-template-button {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ min-height: 44px;
117
+ padding: 0 18px;
118
+ border: 1px solid rgba(219, 193, 122, 0.9);
119
+ border-radius: 999px;
120
+ background: rgba(219, 193, 122, 0.16);
121
+ color: #8a6b1b;
122
+ cursor: pointer;
123
+ font-size: 0.86rem;
124
+ font-weight: 700;
125
+ text-decoration: none;
126
+ white-space: nowrap;
127
+ }
128
+
129
+ .discover-add-template-button:hover,
130
+ .discover-add-template-button:focus-visible {
131
+ background: rgba(219, 193, 122, 0.28);
132
+ }
133
+
134
+ .discover-mute-toggle {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ gap: 8px;
138
+ min-height: 44px;
139
+ padding: 0 16px;
140
+ border: 1px solid rgba(209, 219, 233, 0.96);
141
+ border-radius: 999px;
142
+ background: rgba(255, 255, 255, 0.9);
143
+ color: #55637b;
144
+ cursor: pointer;
145
+ font-size: 0.86rem;
146
+ font-weight: 700;
147
+ white-space: nowrap;
148
+ }
149
+
150
+ .discover-mute-toggle svg {
151
+ width: 18px;
152
+ height: 18px;
153
+ }
154
+
155
+ .discover-mute-toggle[aria-pressed="true"] {
156
+ border-color: rgba(219, 193, 122, 0.9);
157
+ background: rgba(219, 193, 122, 0.16);
158
+ color: #8a6b1b;
159
+ }
160
+
161
+ .discover-add-template-modal {
162
+ grid-template-rows: auto auto;
163
+ width: min(560px, 100%);
164
+ }
165
+
166
+ .discover-add-template-form {
167
+ display: grid;
168
+ gap: 14px;
169
+ }
170
+
171
+ .discover-add-template-hint {
172
+ margin: 0;
173
+ color: #6a7890;
174
+ font-size: 0.9rem;
175
+ line-height: 1.5;
176
+ }
177
+
178
+ .discover-add-template-field {
179
+ display: grid;
180
+ gap: 6px;
181
+ }
182
+
183
+ .discover-add-template-field input,
184
+ .discover-add-template-field textarea {
185
+ width: 100%;
186
+ padding: 10px 14px;
187
+ border: 1px solid rgba(209, 219, 233, 0.96);
188
+ border-radius: 14px;
189
+ background: rgba(255, 255, 255, 0.94);
190
+ color: #2d3748;
191
+ font-family: inherit;
192
+ font-size: 0.94rem;
193
+ box-sizing: border-box;
194
+ }
195
+
196
+ .discover-add-template-field textarea {
197
+ resize: vertical;
198
+ min-height: 92px;
199
+ }
200
+
201
+ .discover-add-template-optional {
202
+ color: #9aa6ba;
203
+ font-weight: 600;
204
+ text-transform: none;
205
+ letter-spacing: normal;
206
+ }
207
+
208
+ .discover-add-template-error {
209
+ margin: 0;
210
+ color: #a14444;
211
+ font-size: 0.88rem;
212
+ }
213
+
214
+ .discover-add-template-actions {
215
+ display: flex;
216
+ justify-content: flex-end;
217
+ gap: 10px;
218
+ }
219
+
220
+ .discover-add-template-submit {
221
+ min-width: 0;
222
+ height: 48px;
223
+ padding: 0 22px;
224
+ }
225
+
226
+ .discover-card-cta-disabled {
227
+ opacity: 0.62;
228
+ cursor: default;
229
+ pointer-events: none;
230
+ }
231
+
232
+ .discover-card-menu {
233
+ position: relative;
234
+ }
235
+
236
+ .discover-card-menu-trigger {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ width: 58px;
241
+ min-width: 58px;
242
+ height: 58px;
243
+ min-height: 58px;
244
+ padding: 0;
245
+ border: 1px solid rgba(209, 219, 233, 0.96);
246
+ border-radius: 999px;
247
+ background: rgba(255, 255, 255, 0.9);
248
+ color: #55637b;
249
+ cursor: pointer;
250
+ }
251
+
252
+ .discover-card-menu-trigger svg {
253
+ width: 22px;
254
+ height: 22px;
255
+ }
256
+
257
+ .discover-card-menu-trigger:hover,
258
+ .discover-card-menu-trigger[aria-expanded="true"] {
259
+ border-color: rgba(219, 193, 122, 0.9);
260
+ color: #8a6b1b;
261
+ }
262
+
263
+ .discover-card-menu-panel {
264
+ position: absolute;
265
+ right: 0;
266
+ top: calc(100% + 8px);
267
+ z-index: 12;
268
+ display: grid;
269
+ min-width: 190px;
270
+ padding: 6px;
271
+ border: 1px solid rgba(209, 219, 233, 0.96);
272
+ border-radius: 16px;
273
+ background: rgba(255, 252, 247, 0.99);
274
+ box-shadow: 0 18px 42px rgba(37, 45, 61, 0.16);
275
+ }
276
+
277
+ .discover-card-menu-item {
278
+ display: block;
279
+ width: 100%;
280
+ padding: 10px 14px;
281
+ border: 0;
282
+ border-radius: 10px;
283
+ background: transparent;
284
+ color: #3c4a63;
285
+ cursor: pointer;
286
+ font-family: inherit;
287
+ font-size: 0.9rem;
288
+ font-weight: 600;
289
+ text-align: left;
290
+ text-decoration: none;
291
+ box-sizing: border-box;
292
+ }
293
+
294
+ .discover-card-menu-item:hover,
295
+ .discover-card-menu-item:focus-visible {
296
+ background: rgba(219, 193, 122, 0.16);
297
+ color: #8a6b1b;
298
+ }
299
+
300
+ .discover-card-menu-item.is-disabled {
301
+ color: #a7b1c2;
302
+ cursor: default;
303
+ pointer-events: none;
304
+ }
305
+
306
+ .discover-card-menu-item.is-danger {
307
+ color: #a14444;
308
+ }
309
+
310
+ .discover-card-menu-item.is-danger:hover,
311
+ .discover-card-menu-item.is-danger:focus-visible {
312
+ background: rgba(191, 38, 38, 0.08);
313
+ color: #8f2f2f;
314
+ }
315
+
316
+ .private-pill {
317
+ border-color: rgba(134, 92, 255, 0.3);
318
+ background: rgba(134, 92, 255, 0.1);
319
+ color: #5942a8;
320
+ font-weight: 800;
321
+ }
322
+
323
+ .processing-pill {
324
+ border-color: rgba(88, 132, 196, 0.4);
325
+ background: rgba(88, 132, 196, 0.12);
326
+ color: #3c5d8f;
327
+ font-weight: 800;
328
+ }
329
+
330
+ .failed-pill {
331
+ border-color: rgba(214, 107, 107, 0.4);
332
+ background: rgba(191, 38, 38, 0.08);
333
+ color: #a14444;
334
+ font-weight: 800;
335
+ }
336
+
337
+ .discover-filter-group {
338
+ display: grid;
339
+ gap: 8px;
340
+ }
341
+
342
+ .discover-filter-block,
343
+ .discover-filter-group,
344
+ .discover-filter-panel-body {
345
+ display: grid;
346
+ gap: 10px;
347
+ }
348
+
349
+ .discover-filter-panel {
350
+ display: contents;
351
+ }
352
+
353
+ .discover-filter-panel > summary {
354
+ display: none;
355
+ }
356
+
357
+ .discover-filter-panel:not([open]) > .discover-filter-panel-body {
358
+ display: grid;
359
+ }
360
+
361
+ .discover-filter-block p {
362
+ max-width: 30ch;
363
+ }
364
+
365
+ .search-field {
366
+ position: relative;
367
+ }
368
+
369
+ .search-icon {
370
+ position: absolute;
371
+ left: 16px;
372
+ top: 50%;
373
+ width: 20px;
374
+ height: 20px;
375
+ color: #9aa6ba;
376
+ transform: translateY(-50%);
377
+ }
378
+
379
+ .search-icon svg {
380
+ width: 20px;
381
+ height: 20px;
382
+ }
383
+
384
+ .search-field input {
385
+ padding-left: 54px;
386
+ }
387
+
388
+ .bookmarks-row {
389
+ display: flex;
390
+ align-items: center;
391
+ justify-content: space-between;
392
+ min-height: 60px;
393
+ padding: 0 18px;
394
+ border: 1px solid var(--line);
395
+ border-radius: 999px;
396
+ background: rgba(255, 255, 255, 0.9);
397
+ color: #58667e;
398
+ }
399
+
400
+ .switch-label {
401
+ cursor: pointer;
402
+ }
403
+
404
+ .switch-shell {
405
+ position: relative;
406
+ display: inline-flex;
407
+ align-items: center;
408
+ width: 44px;
409
+ height: 24px;
410
+ padding: 3px;
411
+ border-radius: 999px;
412
+ background: rgba(47, 55, 72, 0.08);
413
+ cursor: pointer;
414
+ transition: background 140ms ease;
415
+ }
416
+
417
+ /* Scope the hidden checkbox to the switch shell — page-shell's global
418
+ input { width: 100% } would otherwise size it against the sticky
419
+ filter bar and inflate the page's horizontal scroll range. */
420
+ .switch-input {
421
+ position: absolute;
422
+ inset: 0;
423
+ width: 100%;
424
+ height: 100%;
425
+ margin: 0;
426
+ opacity: 0;
427
+ pointer-events: none;
428
+ }
429
+
430
+ .switch-knob {
431
+ display: block;
432
+ width: 18px;
433
+ height: 18px;
434
+ border-radius: 999px;
435
+ background: rgba(255, 255, 255, 0.98);
436
+ box-shadow: 0 2px 8px rgba(15, 23, 42, 0.16);
437
+ transition: transform 140ms ease;
438
+ }
439
+
440
+ .switch-input:checked + .switch-knob {
441
+ transform: translateX(20px);
442
+ }
443
+
444
+ .switch-shell[data-active="true"] {
445
+ background: #dbc17a;
446
+ }
447
+
448
+ .discover-results {
449
+ display: grid;
450
+ min-width: 0;
451
+ min-height: 0;
452
+ height: 100%;
453
+ overflow: hidden;
454
+ padding: 18px 22px 22px;
455
+ }
456
+
457
+ .discover-count { display: none; }
458
+
459
+ .discover-results-scroll {
460
+ display: grid;
461
+ gap: 20px;
462
+ align-content: stretch;
463
+ height: 100%;
464
+ min-height: 0;
465
+ overflow-y: auto;
466
+ padding-right: 6px;
467
+ }
468
+
469
+ .discover-count {
470
+ position: sticky;
471
+ top: 0;
472
+ z-index: 2;
473
+ padding-bottom: 2px;
474
+ background: linear-gradient(180deg, rgba(255, 251, 245, 0.98), rgba(255, 251, 245, 0.86) 72%, rgba(255, 251, 245, 0));
475
+ }
476
+
477
+ .discover-count {
478
+ justify-self: end;
479
+ color: #8d99ae;
480
+ font-size: 0.9rem;
481
+ }
482
+
483
+ .discover-list {
484
+ list-style: none;
485
+ margin: 0;
486
+ padding: 0;
487
+ display: grid;
488
+ gap: 22px;
489
+ }
490
+
491
+ .discover-card {
492
+ display: grid;
493
+ grid-template-columns: minmax(220px, 340px) minmax(0, 1fr);
494
+ gap: 24px;
495
+ padding: 28px;
496
+ border: 1px solid rgba(255, 255, 255, 0.82);
497
+ border-radius: 30px;
498
+ background: rgba(255, 255, 255, 0.76);
499
+ box-shadow: 0 18px 44px rgba(15, 23, 42, 0.06);
500
+ }
501
+
502
+ .discover-card-media {
503
+ position: relative;
504
+ display: flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ min-height: 280px;
508
+ max-height: 540px;
509
+ overflow: hidden;
510
+ border: 1px solid rgba(209, 219, 233, 0.96);
511
+ border-radius: 30px;
512
+ background: rgba(255, 255, 255, 0.84);
513
+ }
514
+
515
+ .discover-card-media-button {
516
+ width: 100%;
517
+ padding: 0;
518
+ color: inherit;
519
+ cursor: zoom-in;
520
+ transition:
521
+ border-color 140ms ease,
522
+ box-shadow 140ms ease,
523
+ transform 140ms ease;
524
+ }
525
+
526
+ .discover-card-media-button:hover,
527
+ .discover-card-media-button:focus-visible {
528
+ border-color: rgba(219, 193, 122, 0.96);
529
+ box-shadow: 0 18px 38px rgba(138, 107, 27, 0.16);
530
+ transform: translateY(-1px);
531
+ }
532
+
533
+ .discover-card-media-affordance {
534
+ position: absolute;
535
+ right: 14px;
536
+ bottom: 14px;
537
+ display: inline-flex;
538
+ align-items: center;
539
+ justify-content: center;
540
+ min-height: 34px;
541
+ padding: 0 14px;
542
+ border: 1px solid rgba(255, 255, 255, 0.72);
543
+ border-radius: 999px;
544
+ background: rgba(33, 41, 56, 0.72);
545
+ color: #fffaf3;
546
+ font-size: 0.78rem;
547
+ font-weight: 800;
548
+ letter-spacing: 0.08em;
549
+ line-height: 1;
550
+ opacity: 0;
551
+ text-transform: uppercase;
552
+ transform: translateY(4px);
553
+ transition: opacity 140ms ease, transform 140ms ease;
554
+ }
555
+
556
+ .discover-card-media-button:hover .discover-card-media-affordance,
557
+ .discover-card-media-button:focus-visible .discover-card-media-affordance {
558
+ opacity: 1;
559
+ transform: translateY(0);
560
+ }
561
+
562
+ .discover-card-copy {
563
+ display: grid;
564
+ align-content: start;
565
+ gap: 24px;
566
+ min-width: 0;
567
+ }
568
+
569
+ .discover-card-head {
570
+ display: flex;
571
+ align-items: start;
572
+ justify-content: space-between;
573
+ gap: 18px;
574
+ }
575
+
576
+ .discover-card-title-wrap {
577
+ min-width: 0;
578
+ }
579
+
580
+ .discover-card-title-wrap h2 {
581
+ font-size: 1.85rem;
582
+ overflow-wrap: anywhere;
583
+ word-break: break-word;
584
+ }
585
+
586
+ .pill-tag {
587
+ max-width: 100%;
588
+ overflow-wrap: anywhere;
589
+ word-break: break-all;
590
+ }
591
+
592
+ .discover-card-meta {
593
+ margin-top: 14px;
594
+ color: #b0b9c8;
595
+ font-size: 0.95rem;
596
+ }
597
+
598
+ .discover-card-actions {
599
+ display: flex;
600
+ align-items: center;
601
+ gap: 12px;
602
+ }
603
+
604
+ .bookmark-button {
605
+ width: 58px;
606
+ min-width: 58px;
607
+ height: 58px;
608
+ min-height: 58px;
609
+ padding: 0;
610
+ border-color: rgba(209, 219, 233, 0.96);
611
+ background: rgba(255, 255, 255, 0.9);
612
+ color: #55637b;
613
+ transition:
614
+ background 140ms ease,
615
+ border-color 140ms ease,
616
+ color 140ms ease,
617
+ box-shadow 140ms ease;
618
+ }
619
+
620
+ .bookmark-button svg {
621
+ width: 22px;
622
+ height: 22px;
623
+ }
624
+
625
+ .bookmark-button[data-active="true"] {
626
+ border-color: rgba(219, 193, 122, 0.9);
627
+ background: rgba(219, 193, 122, 0.2);
628
+ color: #8a6b1b;
629
+ box-shadow: 0 10px 24px rgba(138, 107, 27, 0.14);
630
+ }
631
+
632
+ .cta-button {
633
+ min-width: 132px;
634
+ height: 58px;
635
+ padding: 0 28px;
636
+ }
637
+
638
+ .discover-card-body p {
639
+ color: #5f6e86;
640
+ font-size: 1.02rem;
641
+ line-height: 1.65;
642
+ }
643
+
644
+ .discover-card-tags {
645
+ display: flex;
646
+ flex-wrap: wrap;
647
+ gap: 10px;
648
+ padding-top: 18px;
649
+ border-top: 1px solid rgba(209, 219, 233, 0.8);
650
+ }
651
+
652
+ .pill-tag {
653
+ display: inline-flex;
654
+ align-items: center;
655
+ min-height: 34px;
656
+ padding: 0 14px;
657
+ border: 1px solid rgba(209, 219, 233, 0.96);
658
+ border-radius: 999px;
659
+ background: rgba(255, 255, 255, 0.92);
660
+ color: #687791;
661
+ font-size: 0.86rem;
662
+ text-decoration: none;
663
+ }
664
+
665
+ .difficulty-pill {
666
+ border-color: rgba(219, 193, 122, 0.42);
667
+ background: rgba(219, 193, 122, 0.16);
668
+ color: #6f5514;
669
+ font-weight: 800;
670
+ }
671
+
672
+ .difficulty-pill[data-difficulty="hard"],
673
+ .difficulty-pill[data-difficulty="expert"] {
674
+ border-color: rgba(134, 92, 255, 0.3);
675
+ background: rgba(134, 92, 255, 0.1);
676
+ color: #5942a8;
677
+ }
678
+
679
+ .copy-inline {
680
+ position: relative;
681
+ gap: 8px;
682
+ cursor: pointer;
683
+ transition:
684
+ border-color 140ms ease,
685
+ background 140ms ease,
686
+ color 140ms ease,
687
+ box-shadow 140ms ease;
688
+ }
689
+
690
+ .copy-inline-label {
691
+ transition: opacity 140ms ease, transform 140ms ease;
692
+ }
693
+
694
+ .copy-inline-feedback {
695
+ color: #8a6b1b;
696
+ font-size: 0.79rem;
697
+ font-weight: 700;
698
+ letter-spacing: 0.02em;
699
+ opacity: 0;
700
+ transform: translateY(1px);
701
+ transition: opacity 140ms ease, transform 140ms ease;
702
+ pointer-events: none;
703
+ }
704
+
705
+ .copy-inline[data-state="done"] {
706
+ border-color: rgba(219, 193, 122, 0.96);
707
+ background: rgba(219, 193, 122, 0.18);
708
+ color: #5f6e86;
709
+ box-shadow: 0 8px 18px rgba(138, 107, 27, 0.08);
710
+ }
711
+
712
+ .copy-inline[data-state="done"] .copy-inline-feedback {
713
+ opacity: 1;
714
+ transform: translateY(0);
715
+ }
716
+
717
+ .copy-inline[data-state="done"] .copy-inline-label {
718
+ opacity: 0.82;
719
+ }
720
+
721
+ .copy-inline[data-state="error"] {
722
+ border-color: rgba(214, 107, 107, 0.35);
723
+ background: rgba(191, 38, 38, 0.08);
724
+ }
725
+
726
+ .copy-inline[data-state="error"] .copy-inline-feedback {
727
+ opacity: 1;
728
+ transform: translateY(0);
729
+ color: #a14444;
730
+ }
731
+
732
+ .preview {
733
+ width: 100%;
734
+ height: 100%;
735
+ object-fit: cover;
736
+ object-position: top center;
737
+ }
738
+
739
+ .preview-empty {
740
+ display: flex;
741
+ align-items: center;
742
+ justify-content: center;
743
+ color: #8d99ae;
744
+ }
745
+
746
+ .discover-media-modal-backdrop {
747
+ position: fixed;
748
+ inset: 0;
749
+ /* Above the mobile chat rail overlay (z-index 110) so dialogs are
750
+ never buried under the FAB layer. */
751
+ z-index: 130;
752
+ display: flex;
753
+ align-items: center;
754
+ justify-content: center;
755
+ padding: 24px;
756
+ background: rgba(28, 34, 45, 0.76);
757
+ backdrop-filter: blur(18px);
758
+ }
759
+
760
+ .discover-media-modal {
761
+ display: grid;
762
+ grid-template-rows: auto minmax(0, 1fr);
763
+ gap: 14px;
764
+ width: min(1180px, 100%);
765
+ max-height: calc(100dvh - 48px);
766
+ padding: 16px;
767
+ border: 1px solid rgba(255, 255, 255, 0.28);
768
+ border-radius: 24px;
769
+ background: rgba(255, 251, 245, 0.96);
770
+ box-shadow: 0 28px 80px rgba(5, 10, 20, 0.34);
771
+ }
772
+
773
+ .discover-media-modal-head {
774
+ display: grid;
775
+ grid-template-columns: minmax(0, 1fr) auto;
776
+ align-items: center;
777
+ gap: 12px;
778
+ }
779
+
780
+ .discover-media-modal-head h2 {
781
+ min-width: 0;
782
+ overflow: hidden;
783
+ color: #283244;
784
+ font-size: 1.05rem;
785
+ line-height: 1.15;
786
+ text-overflow: ellipsis;
787
+ white-space: nowrap;
788
+ }
789
+
790
+ .discover-media-modal-actions {
791
+ display: inline-flex;
792
+ align-items: center;
793
+ gap: 8px;
794
+ }
795
+
796
+ .discover-media-modal-action {
797
+ display: inline-flex;
798
+ align-items: center;
799
+ justify-content: center;
800
+ width: 44px;
801
+ min-width: 44px;
802
+ height: 44px;
803
+ min-height: 44px;
804
+ padding: 0;
805
+ border-color: rgba(209, 219, 233, 0.96);
806
+ border-style: solid;
807
+ border-width: 1px;
808
+ border-radius: 999px;
809
+ background: rgba(255, 255, 255, 0.9);
810
+ color: #53627c;
811
+ cursor: pointer;
812
+ text-decoration: none;
813
+ }
814
+
815
+ .discover-media-modal-action:hover,
816
+ .discover-media-modal-action:focus-visible {
817
+ border-color: rgba(173, 135, 46, 0.5);
818
+ color: #8a6b1b;
819
+ }
820
+
821
+ .discover-media-modal-action[data-state="done"] {
822
+ border-color: rgba(56, 142, 91, 0.42);
823
+ background: rgba(56, 142, 91, 0.12);
824
+ color: #2f7d4f;
825
+ }
826
+
827
+ .discover-media-modal-action[data-state="error"] {
828
+ border-color: rgba(161, 68, 68, 0.42);
829
+ background: rgba(161, 68, 68, 0.1);
830
+ color: #a14444;
831
+ }
832
+
833
+ .discover-media-modal-action svg {
834
+ width: 20px;
835
+ height: 20px;
836
+ }
837
+
838
+ .discover-media-modal-stage {
839
+ display: flex;
840
+ align-items: center;
841
+ justify-content: center;
842
+ min-height: 0;
843
+ overflow: hidden;
844
+ border-radius: 18px;
845
+ background: #111827;
846
+ }
847
+
848
+ .discover-media-modal-stage img,
849
+ .discover-media-modal-stage video {
850
+ display: block;
851
+ width: auto;
852
+ height: auto;
853
+ max-width: 100%;
854
+ max-height: calc(100dvh - 154px);
855
+ object-fit: contain;
856
+ }
857
+
858
+ .empty {
859
+ display: none;
860
+ }
861
+
862
+ .empty[data-visible="true"] {
863
+ display: block;
864
+ }
865
+
866
+ @media (max-width: 1180px) {
867
+ .discover-frame.has-chat-rail { padding-left: 0; }
868
+
869
+ .discover-mute-toggle-label {
870
+ display: none;
871
+ }
872
+
873
+ .discover-mute-toggle {
874
+ padding: 0 12px;
875
+ }
876
+
877
+ .discover-card {
878
+ grid-template-columns: minmax(200px, 300px) minmax(0, 1fr);
879
+ gap: 20px;
880
+ padding: 24px;
881
+ }
882
+
883
+ .discover-card-media {
884
+ min-height: 240px;
885
+ }
886
+
887
+ .discover-results-scroll {
888
+ max-height: none;
889
+ }
890
+ }
891
+
892
+ /* Logged-out copilot rail: on phones the rail is a transparent
893
+ pointer-events:none overlay (template-editor-shell ≤1024px rules), so
894
+ hide the inline placeholder there — the login FAB anchor takes over. */
895
+ a.vf-editor-chat-mobile-fab {
896
+ cursor: pointer;
897
+ text-decoration: none;
898
+ }
899
+
900
+ @media (max-width: 1024px) {
901
+ /* !important: the placeholder sets display:flex inline */
902
+ .editor-chat-panel--logged-out {
903
+ display: none !important;
904
+ }
905
+
906
+ /* Logged-in Discover: the brainstorm chat must NOT hijack the whole
907
+ screen like it does on /chat — restore the editor-style FAB dock
908
+ (closed by default, full-screen thread only while open). These
909
+ override the [data-layout="brainstorm"] rules in the shared shell
910
+ styles, which load before this block. */
911
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"] {
912
+ pointer-events: none;
913
+ }
914
+
915
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"][data-mobile-open="true"] {
916
+ pointer-events: auto;
917
+ }
918
+
919
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"] .vf-editor-chat-mobile-fab {
920
+ display: inline-flex;
921
+ }
922
+
923
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"][data-mobile-open="true"] .vf-editor-chat-mobile-fab {
924
+ opacity: 0;
925
+ transform: scale(0.86);
926
+ pointer-events: none;
927
+ }
928
+
929
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"] .vf-editor-chat-thread {
930
+ position: fixed;
931
+ inset: 0;
932
+ z-index: 1;
933
+ display: none;
934
+ width: 100%;
935
+ height: 100svh;
936
+ border-radius: 0;
937
+ pointer-events: auto;
938
+ }
939
+
940
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"][data-mobile-open="true"] .vf-editor-chat-thread {
941
+ display: grid;
942
+ grid-template-rows: auto minmax(0, 1fr) auto;
943
+ }
944
+
945
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"] .vf-editor-chat-minimize {
946
+ display: inline-flex;
947
+ }
948
+
949
+ /* Already on Discover — the /chat back-to-Discover header link would
950
+ point at the current page. */
951
+ .discover-frame .vf-editor-chat-shell[data-layout="brainstorm"] .vf-editor-chat-back-button--header {
952
+ display: none;
953
+ }
954
+
955
+ /* iOS zooms the page when focusing sub-16px inputs; modals must not
956
+ trigger that. */
957
+ .discover-media-modal input,
958
+ .discover-media-modal textarea,
959
+ .discover-media-modal select {
960
+ font-size: 16px;
961
+ }
962
+
963
+ .discover-media-modal {
964
+ overflow-y: auto;
965
+ }
966
+ }
967
+
968
+ @media (max-width: 1024px) {
969
+ .discover-frame,
970
+ .discover-frame .frame-body,
971
+ .discover-shell,
972
+ .discover-results,
973
+ .discover-results-scroll {
974
+ min-height: auto;
975
+ height: auto;
976
+ overflow: visible;
977
+ }
978
+
979
+ .discover-frame .frame-body {
980
+ overflow: visible;
981
+ padding-top: 10px;
982
+ padding-bottom: 4px;
983
+ }
984
+
985
+ .discover-shell {
986
+ display: grid;
987
+ min-width: 0;
988
+ grid-template-columns: 1fr;
989
+ border-radius: 24px;
990
+ overflow: visible;
991
+ }
992
+
993
+ .discover-sidebar,
994
+ .discover-results {
995
+ padding: 14px;
996
+ }
997
+
998
+ .discover-sidebar {
999
+ gap: 14px;
1000
+ border-right: 0;
1001
+ border-bottom: 1px solid rgba(209, 219, 233, 0.8);
1002
+ border-radius: 24px 24px 0 0;
1003
+ }
1004
+
1005
+ .discover-filter-panel {
1006
+ display: grid;
1007
+ gap: 14px;
1008
+ }
1009
+
1010
+ .discover-filter-panel > summary {
1011
+ display: flex;
1012
+ align-items: center;
1013
+ justify-content: space-between;
1014
+ gap: 12px;
1015
+ min-height: 54px;
1016
+ padding: 0 16px;
1017
+ border: 1px solid rgba(209, 219, 233, 0.96);
1018
+ border-radius: 18px;
1019
+ background: rgba(255, 255, 255, 0.9);
1020
+ color: #53627c;
1021
+ cursor: pointer;
1022
+ list-style: none;
1023
+ font-size: 0.88rem;
1024
+ font-weight: 800;
1025
+ letter-spacing: 0.16em;
1026
+ text-transform: uppercase;
1027
+ }
1028
+
1029
+ .discover-filter-panel > summary::-webkit-details-marker {
1030
+ display: none;
1031
+ }
1032
+
1033
+ .discover-filter-panel > summary::after {
1034
+ content: "";
1035
+ width: 10px;
1036
+ height: 10px;
1037
+ border-right: 2px solid currentColor;
1038
+ border-bottom: 2px solid currentColor;
1039
+ transform: rotate(45deg) translateY(-2px);
1040
+ transition: transform 140ms ease;
1041
+ }
1042
+
1043
+ .discover-filter-panel[open] > summary::after {
1044
+ transform: rotate(225deg) translateY(-1px);
1045
+ }
1046
+
1047
+ .discover-filter-panel:not([open]) > .discover-filter-panel-body {
1048
+ display: none;
1049
+ }
1050
+
1051
+ .discover-filter-panel-body {
1052
+ gap: 14px;
1053
+ }
1054
+
1055
+ .discover-filter-block {
1056
+ display: none;
1057
+ }
1058
+
1059
+ .discover-filter-group {
1060
+ gap: 8px;
1061
+ }
1062
+
1063
+ .bookmarks-row {
1064
+ min-height: 52px;
1065
+ padding: 0 14px;
1066
+ }
1067
+
1068
+ .discover-results-scroll {
1069
+ gap: 14px;
1070
+ padding-right: 0;
1071
+ }
1072
+
1073
+ .discover-card {
1074
+ grid-template-columns: 1fr;
1075
+ gap: 16px;
1076
+ padding: 14px;
1077
+ border-radius: 22px;
1078
+ }
1079
+
1080
+ .discover-card-media {
1081
+ min-height: 0;
1082
+ max-height: none;
1083
+ /* Feed content is predominantly 9:16 vertical video; a landscape
1084
+ crop leaves only a thin horizontal band visible on phones. */
1085
+ aspect-ratio: 4 / 5;
1086
+ border-radius: 20px;
1087
+ }
1088
+
1089
+ .discover-card-media-affordance {
1090
+ opacity: 1;
1091
+ transform: none;
1092
+ }
1093
+
1094
+ .discover-card-copy {
1095
+ gap: 16px;
1096
+ }
1097
+
1098
+ /* Grid/flex items default to min-width:auto, letting the nowrap
1099
+ template-id pill's min-content width push the whole card past the
1100
+ viewport. Break that chain explicitly. */
1101
+ .discover-card,
1102
+ .discover-card-copy,
1103
+ .discover-card-head,
1104
+ .discover-card-title-wrap,
1105
+ .discover-card-body,
1106
+ .discover-card-tags,
1107
+ .discover-card-meta {
1108
+ min-width: 0;
1109
+ max-width: 100%;
1110
+ }
1111
+
1112
+ .discover-card-head {
1113
+ display: grid;
1114
+ grid-template-columns: minmax(0, 1fr);
1115
+ gap: 14px;
1116
+ }
1117
+
1118
+ .discover-card-title-wrap h2 {
1119
+ font-size: 1.55rem;
1120
+ /* >1 so wrapped lines of long user-submitted titles don't collide */
1121
+ line-height: 1.05;
1122
+ }
1123
+
1124
+ .discover-card-meta {
1125
+ margin-top: 8px;
1126
+ font-size: 0.86rem;
1127
+ }
1128
+
1129
+ .discover-card-actions {
1130
+ display: grid;
1131
+ grid-template-columns: 52px minmax(0, 1fr) 52px;
1132
+ gap: 10px;
1133
+ width: 100%;
1134
+ }
1135
+
1136
+ .bookmark-button,
1137
+ .discover-card-menu-trigger {
1138
+ width: 52px;
1139
+ min-width: 52px;
1140
+ height: 52px;
1141
+ min-height: 52px;
1142
+ }
1143
+
1144
+ .cta-button {
1145
+ width: 100%;
1146
+ min-width: 0;
1147
+ height: 52px;
1148
+ padding: 0 18px;
1149
+ }
1150
+
1151
+ .discover-card-body p {
1152
+ font-size: 0.96rem;
1153
+ line-height: 1.58;
1154
+ }
1155
+
1156
+ .discover-card-tags {
1157
+ gap: 8px;
1158
+ padding-top: 14px;
1159
+ }
1160
+
1161
+ .pill-tag {
1162
+ max-width: 100%;
1163
+ min-height: 44px;
1164
+ }
1165
+
1166
+ .copy-inline {
1167
+ min-width: 0;
1168
+ }
1169
+
1170
+ .copy-inline-label {
1171
+ min-width: 0;
1172
+ overflow: hidden;
1173
+ text-overflow: ellipsis;
1174
+ white-space: nowrap;
1175
+ }
1176
+
1177
+ .discover-count {
1178
+ position: static;
1179
+ justify-self: start;
1180
+ padding-bottom: 0;
1181
+ background: transparent;
1182
+ }
1183
+
1184
+ .search-field input {
1185
+ min-height: 52px;
1186
+ font-size: 16px;
1187
+ }
1188
+
1189
+ /* Stack the filter bar: the desktop grid's min track sizes
1190
+ (minmax(220px,1fr) + three autos) exceed phone widths and force the
1191
+ whole discover shell into horizontal overflow. */
1192
+ .discover-filter-bar {
1193
+ display: flex;
1194
+ flex-wrap: wrap;
1195
+ gap: 10px;
1196
+ padding: 12px 14px;
1197
+ }
1198
+
1199
+ .discover-filter-search {
1200
+ flex: 1 1 100%;
1201
+ min-width: 0;
1202
+ }
1203
+
1204
+ .discover-filter-toggle,
1205
+ .discover-add-template-button,
1206
+ .discover-mute-toggle {
1207
+ flex: 1 1 auto;
1208
+ justify-content: center;
1209
+ }
1210
+
1211
+ .discover-media-modal-backdrop {
1212
+ align-items: stretch;
1213
+ padding: 12px;
1214
+ }
1215
+
1216
+ .discover-media-modal {
1217
+ width: 100%;
1218
+ max-height: calc(100dvh - 24px);
1219
+ padding: 12px;
1220
+ border-radius: 20px;
1221
+ }
1222
+
1223
+ .discover-media-modal-stage {
1224
+ border-radius: 14px;
1225
+ }
1226
+
1227
+ .discover-media-modal-stage img,
1228
+ .discover-media-modal-stage video {
1229
+ max-height: calc(100dvh - 126px);
1230
+ }
1231
+ }
1232
+ `
1233
+ });
1234
+ }
1235
+ //# sourceMappingURL=homepage.js.map