@crievo/omni 0.0.0-stage → 0.1.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 (708) hide show
  1. package/.env.example +41 -0
  2. package/README.md +2 -2
  3. package/bin/omni.mjs +18 -0
  4. package/docs/onboarding/clone-voice.png +0 -0
  5. package/docs/onboarding/getting-started.png +0 -0
  6. package/docs/onboarding/new-video.png +0 -0
  7. package/docs/onboarding/providers.png +0 -0
  8. package/docs/onboarding/publish.png +0 -0
  9. package/docs/onboarding/references.png +0 -0
  10. package/docs/onboarding.md +212 -0
  11. package/omnivideo.config.example.json +437 -0
  12. package/package.json +40 -4
  13. package/reference/captions.md +156 -0
  14. package/reference/carousel-contract.md +91 -0
  15. package/reference/cloud.md +96 -0
  16. package/reference/learnings.md +792 -0
  17. package/reference/omnichat.md +305 -0
  18. package/reference/premiere-mcp.md +91 -0
  19. package/reference/publish.md +305 -0
  20. package/reference/scenes-contract.md +109 -0
  21. package/reference/studio.md +666 -0
  22. package/reference/voicestudio.md +81 -0
  23. package/reference/writing-for-voice.md +67 -0
  24. package/requirements.txt +3 -0
  25. package/studio/api/app.ts +87 -0
  26. package/studio/api/lib/errors.ts +33 -0
  27. package/studio/api/lib/files.ts +41 -0
  28. package/studio/api/lib/hono.ts +9 -0
  29. package/studio/api/lib/result.ts +14 -0
  30. package/studio/api/lib/validate.ts +31 -0
  31. package/studio/api/lib/video.ts +10 -0
  32. package/studio/api/middleware/json-charset.ts +11 -0
  33. package/studio/api/middleware/local-only.ts +32 -0
  34. package/studio/api/middleware/no-timeout.ts +10 -0
  35. package/studio/api/routes/admin.ts +18 -0
  36. package/studio/api/routes/agent-cascade.ts +100 -0
  37. package/studio/api/routes/agent-history.ts +23 -0
  38. package/studio/api/routes/agent.ts +162 -0
  39. package/studio/api/routes/analytics.ts +31 -0
  40. package/studio/api/routes/approval.ts +60 -0
  41. package/studio/api/routes/archive.ts +12 -0
  42. package/studio/api/routes/captions.ts +28 -0
  43. package/studio/api/routes/carousel.ts +38 -0
  44. package/studio/api/routes/clone.ts +27 -0
  45. package/studio/api/routes/create.ts +19 -0
  46. package/studio/api/routes/events.ts +11 -0
  47. package/studio/api/routes/export.ts +14 -0
  48. package/studio/api/routes/media.ts +30 -0
  49. package/studio/api/routes/omnichat.ts +113 -0
  50. package/studio/api/routes/onboarding.ts +14 -0
  51. package/studio/api/routes/publish.ts +40 -0
  52. package/studio/api/routes/queue.ts +14 -0
  53. package/studio/api/routes/references.ts +40 -0
  54. package/studio/api/routes/runner.ts +17 -0
  55. package/studio/api/routes/schedule.ts +47 -0
  56. package/studio/api/routes/services.ts +11 -0
  57. package/studio/api/routes/sessions.ts +27 -0
  58. package/studio/api/routes/settings.ts +102 -0
  59. package/studio/api/routes/sound.ts +45 -0
  60. package/studio/api/routes/thumbnail.ts +18 -0
  61. package/studio/api/routes/usage.ts +13 -0
  62. package/studio/api/routes/videos.ts +41 -0
  63. package/studio/api/routes/voices.ts +71 -0
  64. package/studio/api/services/admin.ts +113 -0
  65. package/studio/api/services/agent-cascade.ts +975 -0
  66. package/studio/api/services/agent-claude.ts +47 -0
  67. package/studio/api/services/agent-history.ts +103 -0
  68. package/studio/api/services/agent-persona.ts +77 -0
  69. package/studio/api/services/agent-tools.ts +2237 -0
  70. package/studio/api/services/agent-ui-tools.ts +259 -0
  71. package/studio/api/services/agent-wait.ts +32 -0
  72. package/studio/api/services/agent.ts +553 -0
  73. package/studio/api/services/analytics.ts +92 -0
  74. package/studio/api/services/approval.ts +134 -0
  75. package/studio/api/services/archive.ts +38 -0
  76. package/studio/api/services/captions.ts +268 -0
  77. package/studio/api/services/carousel.ts +206 -0
  78. package/studio/api/services/classify.ts +196 -0
  79. package/studio/api/services/clone-phrases.ts +75 -0
  80. package/studio/api/services/clone.ts +722 -0
  81. package/studio/api/services/create.ts +421 -0
  82. package/studio/api/services/events.ts +215 -0
  83. package/studio/api/services/media.ts +32 -0
  84. package/studio/api/services/omnichat.ts +624 -0
  85. package/studio/api/services/onboarding.ts +77 -0
  86. package/studio/api/services/publish.ts +287 -0
  87. package/studio/api/services/queue.ts +150 -0
  88. package/studio/api/services/references.ts +269 -0
  89. package/studio/api/services/root.ts +60 -0
  90. package/studio/api/services/services.ts +114 -0
  91. package/studio/api/services/sessions.ts +1007 -0
  92. package/studio/api/services/settings.ts +983 -0
  93. package/studio/api/services/sound.ts +311 -0
  94. package/studio/api/services/thumbnail.ts +133 -0
  95. package/studio/api/services/usage.ts +27 -0
  96. package/studio/api/services/videos.ts +418 -0
  97. package/studio/api/services/voice-pause.ts +98 -0
  98. package/studio/api/services/voices.ts +324 -0
  99. package/studio/runner/runner.ts +244 -0
  100. package/studio/shared/omni-actions.ts +68 -0
  101. package/studio/shared/omni-admin.ts +52 -0
  102. package/studio/shared/omni-farewell.ts +48 -0
  103. package/studio/shared/omni-hotword.ts +20 -0
  104. package/studio/shared/omni-screens.ts +228 -0
  105. package/studio/shared/schemas/admin.ts +15 -0
  106. package/studio/shared/schemas/agent-cascade.ts +58 -0
  107. package/studio/shared/schemas/agent-history.ts +73 -0
  108. package/studio/shared/schemas/agent.ts +50 -0
  109. package/studio/shared/schemas/analytics.ts +6 -0
  110. package/studio/shared/schemas/approval.ts +22 -0
  111. package/studio/shared/schemas/captions.ts +19 -0
  112. package/studio/shared/schemas/carousel.ts +26 -0
  113. package/studio/shared/schemas/clone.ts +40 -0
  114. package/studio/shared/schemas/common.ts +16 -0
  115. package/studio/shared/schemas/omnichat.ts +54 -0
  116. package/studio/shared/schemas/onboarding.ts +5 -0
  117. package/studio/shared/schemas/publish.ts +45 -0
  118. package/studio/shared/schemas/references.ts +20 -0
  119. package/studio/shared/schemas/settings.ts +82 -0
  120. package/studio/shared/schemas/sound.ts +22 -0
  121. package/studio/shared/schemas/videos.ts +38 -0
  122. package/studio/shared/schemas/voices.ts +23 -0
  123. package/studio/shared/types/api.ts +1290 -0
  124. package/studio/studio.ts +148 -0
  125. package/studio/tsconfig.json +15 -0
  126. package/studio/web/assets/logos/cartesia.svg +4 -0
  127. package/studio/web/assets/logos/elevenlabs.svg +12 -0
  128. package/studio/web/assets/logos/fish.svg +24 -0
  129. package/studio/web/assets/logos/omni-black.png +0 -0
  130. package/studio/web/assets/logos/omni-white.png +0 -0
  131. package/studio/web/assets/logos/voicestudio.svg +21 -0
  132. package/studio/web/components/AgentMark.tsx +7 -0
  133. package/studio/web/components/AgentWalking.tsx +11 -0
  134. package/studio/web/components/ApiKeyField.tsx +104 -0
  135. package/studio/web/components/AppShell.tsx +64 -0
  136. package/studio/web/components/ApprovalNotice.tsx +65 -0
  137. package/studio/web/components/AvatarGroupIcon.tsx +22 -0
  138. package/studio/web/components/AvatarNameField.tsx +86 -0
  139. package/studio/web/components/AvatarPicker.tsx +84 -0
  140. package/studio/web/components/BrandLogo.tsx +16 -0
  141. package/studio/web/components/CartesiaPlanSetting.tsx +90 -0
  142. package/studio/web/components/ClaudeWalking.tsx +32 -0
  143. package/studio/web/components/CloneVoiceDialog/GuidedScript.tsx +39 -0
  144. package/studio/web/components/CloneVoiceDialog/LanguageBar.tsx +37 -0
  145. package/studio/web/components/CloneVoiceDialog/LevelMeter.tsx +31 -0
  146. package/studio/web/components/CloneVoiceDialog/ProviderChoice.tsx +81 -0
  147. package/studio/web/components/CloneVoiceDialog/QualityPanel.tsx +62 -0
  148. package/studio/web/components/CloneVoiceDialog/RecordStep.tsx +50 -0
  149. package/studio/web/components/CloneVoiceDialog/RecorderBar.tsx +79 -0
  150. package/studio/web/components/CloneVoiceDialog/RedoSummary.tsx +54 -0
  151. package/studio/web/components/CloneVoiceDialog/SaveStep.tsx +91 -0
  152. package/studio/web/components/CloneVoiceDialog/SourceBar.tsx +30 -0
  153. package/studio/web/components/CloneVoiceDialog/index.tsx +141 -0
  154. package/studio/web/components/CloneVoiceDialog/types.ts +28 -0
  155. package/studio/web/components/CloneVoiceDialog/useCloneVoice.ts +528 -0
  156. package/studio/web/components/ConnectionSignals.tsx +51 -0
  157. package/studio/web/components/EditVoiceDialog/EditVoiceFooter.tsx +72 -0
  158. package/studio/web/components/EditVoiceDialog/ProviderCards.tsx +81 -0
  159. package/studio/web/components/EditVoiceDialog/index.tsx +256 -0
  160. package/studio/web/components/ErrorBanner.tsx +115 -0
  161. package/studio/web/components/FinishedTask.tsx +41 -0
  162. package/studio/web/components/FishModelSetting.tsx +69 -0
  163. package/studio/web/components/FishPriceSetting.tsx +44 -0
  164. package/studio/web/components/HumanBanner.tsx +64 -0
  165. package/studio/web/components/Lightbox.tsx +41 -0
  166. package/studio/web/components/LogStream.tsx +42 -0
  167. package/studio/web/components/Markdown.tsx +21 -0
  168. package/studio/web/components/MissingDmsPanel/BatchSend.tsx +137 -0
  169. package/studio/web/components/MissingDmsPanel/CommentCard.tsx +168 -0
  170. package/studio/web/components/MissingDmsPanel/CommentFeed.tsx +45 -0
  171. package/studio/web/components/MissingDmsPanel/DmBubble.tsx +38 -0
  172. package/studio/web/components/MissingDmsPanel/ReplyComposer.tsx +63 -0
  173. package/studio/web/components/MissingDmsPanel/index.tsx +98 -0
  174. package/studio/web/components/NotFound.tsx +48 -0
  175. package/studio/web/components/Omni/OmniAvatarPicker.tsx +92 -0
  176. package/studio/web/components/Omni/OmniCards.tsx +202 -0
  177. package/studio/web/components/Omni/OmniGlow.tsx +183 -0
  178. package/studio/web/components/Omni/OmniHistory.tsx +119 -0
  179. package/studio/web/components/Omni/OmniHotword.tsx +40 -0
  180. package/studio/web/components/Omni/OmniMicSelect.tsx +92 -0
  181. package/studio/web/components/Omni/OmniVoiceSample.tsx +81 -0
  182. package/studio/web/components/Omni/OmniWidget.tsx +743 -0
  183. package/studio/web/components/Omni/PendingActions.tsx +200 -0
  184. package/studio/web/components/Omni/Transcript.tsx +127 -0
  185. package/studio/web/components/OmnichatAccountStatus.tsx +87 -0
  186. package/studio/web/components/OmnichatRulePanel/RuleConfig.tsx +150 -0
  187. package/studio/web/components/OmnichatRulePanel/RuleDryRun.tsx +15 -0
  188. package/studio/web/components/OmnichatRulePanel/RuleEnableConfirm.tsx +42 -0
  189. package/studio/web/components/OmnichatRulePanel/RuleSkeleton.tsx +18 -0
  190. package/studio/web/components/OmnichatRulePanel/RuleStatus.tsx +55 -0
  191. package/studio/web/components/OmnichatRulePanel/index.tsx +115 -0
  192. package/studio/web/components/OmnichatRulePanel/rule-steps.ts +67 -0
  193. package/studio/web/components/OmnichatRulePanel/steps/MessageStep.tsx +91 -0
  194. package/studio/web/components/OmnichatRulePanel/steps/RepliesStep.tsx +201 -0
  195. package/studio/web/components/OmnichatRulePanel/steps/TriggerStep.tsx +76 -0
  196. package/studio/web/components/OmnichatRulePanel/steps/types.ts +11 -0
  197. package/studio/web/components/Palette.tsx +17 -0
  198. package/studio/web/components/PlatformCard.tsx +109 -0
  199. package/studio/web/components/PlatformIcon.tsx +19 -0
  200. package/studio/web/components/ProviderCard.tsx +80 -0
  201. package/studio/web/components/ProviderDetail.tsx +367 -0
  202. package/studio/web/components/ProviderLogo.tsx +20 -0
  203. package/studio/web/components/QueuePanel.tsx +77 -0
  204. package/studio/web/components/ReferenceActions.tsx +89 -0
  205. package/studio/web/components/ReferencePicker.tsx +136 -0
  206. package/studio/web/components/ResultMessage.tsx +7 -0
  207. package/studio/web/components/RuleForm.tsx +138 -0
  208. package/studio/web/components/RuleLog.tsx +151 -0
  209. package/studio/web/components/RunningTask.tsx +23 -0
  210. package/studio/web/components/SampleList.tsx +55 -0
  211. package/studio/web/components/SessionPanel.tsx +352 -0
  212. package/studio/web/components/SettingRow.tsx +14 -0
  213. package/studio/web/components/SettingsCategorySkeleton.tsx +25 -0
  214. package/studio/web/components/SidePanel.tsx +77 -0
  215. package/studio/web/components/Sidebar.tsx +289 -0
  216. package/studio/web/components/StageStepper.tsx +87 -0
  217. package/studio/web/components/StudioOffline.tsx +80 -0
  218. package/studio/web/components/TaskName.tsx +17 -0
  219. package/studio/web/components/TopBanners.tsx +30 -0
  220. package/studio/web/components/VideoOmnichatPanel.tsx +287 -0
  221. package/studio/web/components/VoiceAvatar.tsx +33 -0
  222. package/studio/web/components/VoiceCarousel.tsx +196 -0
  223. package/studio/web/components/VoiceCategory.tsx +9 -0
  224. package/studio/web/components/VoiceModal.tsx +39 -0
  225. package/studio/web/components/VoiceProfileCard.tsx +75 -0
  226. package/studio/web/components/VoiceProfilePicker.tsx +107 -0
  227. package/studio/web/components/VoiceProfilesSettings.tsx +150 -0
  228. package/studio/web/components/VoiceProviderCard.tsx +118 -0
  229. package/studio/web/components/VoiceProvidersCard.tsx +26 -0
  230. package/studio/web/components/WaitList.tsx +21 -0
  231. package/studio/web/components/icons.tsx +247 -0
  232. package/studio/web/components/ui/accordion.tsx +47 -0
  233. package/studio/web/components/ui/badge.tsx +18 -0
  234. package/studio/web/components/ui/calendar.tsx +43 -0
  235. package/studio/web/components/ui/chart.tsx +229 -0
  236. package/studio/web/components/ui/checkbox.tsx +26 -0
  237. package/studio/web/components/ui/cx.ts +2 -0
  238. package/studio/web/components/ui/date-time-picker.tsx +84 -0
  239. package/studio/web/components/ui/panel.tsx +23 -0
  240. package/studio/web/components/ui/picker.tsx +58 -0
  241. package/studio/web/components/ui/popover.tsx +24 -0
  242. package/studio/web/components/ui/select.tsx +89 -0
  243. package/studio/web/components/ui/skeleton.tsx +10 -0
  244. package/studio/web/components/ui/slider.tsx +68 -0
  245. package/studio/web/components/ui/switch.tsx +13 -0
  246. package/studio/web/components/ui/tooltip.tsx +59 -0
  247. package/studio/web/hooks/useAccounts.ts +27 -0
  248. package/studio/web/hooks/useAdmin.ts +12 -0
  249. package/studio/web/hooks/useAnalytics.ts +21 -0
  250. package/studio/web/hooks/useAvatarAudioReactive.ts +87 -0
  251. package/studio/web/hooks/useBrowserConnect.ts +48 -0
  252. package/studio/web/hooks/useClonePlan.ts +14 -0
  253. package/studio/web/hooks/useConnected.ts +7 -0
  254. package/studio/web/hooks/useLiveQuery.ts +29 -0
  255. package/studio/web/hooks/useMenuCollapsed.ts +32 -0
  256. package/studio/web/hooks/useMicDevices.ts +53 -0
  257. package/studio/web/hooks/useMissingDms.ts +211 -0
  258. package/studio/web/hooks/useMissingSetupSteps.ts +26 -0
  259. package/studio/web/hooks/useNow.ts +11 -0
  260. package/studio/web/hooks/useOmniAgent.ts +278 -0
  261. package/studio/web/hooks/useOmniClaude.ts +124 -0
  262. package/studio/web/hooks/useOmniDock.ts +142 -0
  263. package/studio/web/hooks/useOmniGreeting.ts +60 -0
  264. package/studio/web/hooks/useOmniHotword.ts +128 -0
  265. package/studio/web/hooks/useOmnichat.ts +26 -0
  266. package/studio/web/hooks/useOnboarding.ts +27 -0
  267. package/studio/web/hooks/usePost.ts +23 -0
  268. package/studio/web/hooks/useQueue.ts +10 -0
  269. package/studio/web/hooks/useReferences.ts +20 -0
  270. package/studio/web/hooks/useRuleEditor.ts +101 -0
  271. package/studio/web/hooks/useRunner.ts +24 -0
  272. package/studio/web/hooks/useSaveAction.ts +23 -0
  273. package/studio/web/hooks/useSchedule.ts +11 -0
  274. package/studio/web/hooks/useServices.ts +10 -0
  275. package/studio/web/hooks/useSessions.ts +15 -0
  276. package/studio/web/hooks/useSettings.ts +11 -0
  277. package/studio/web/hooks/useSettingsSection.ts +30 -0
  278. package/studio/web/hooks/useSidePanel.ts +23 -0
  279. package/studio/web/hooks/useSound.ts +30 -0
  280. package/studio/web/hooks/useUsage.ts +11 -0
  281. package/studio/web/hooks/useVideoVoice.ts +36 -0
  282. package/studio/web/hooks/useVideos.ts +21 -0
  283. package/studio/web/hooks/useVoiceProfilePreview.ts +52 -0
  284. package/studio/web/hooks/useVoiceProfiles.ts +7 -0
  285. package/studio/web/hooks/useVoiceRunning.ts +10 -0
  286. package/studio/web/hooks/useVoiceStudioClosed.ts +8 -0
  287. package/studio/web/index.html +19 -0
  288. package/studio/web/lib/agent.ts +7 -0
  289. package/studio/web/lib/alerts.ts +210 -0
  290. package/studio/web/lib/analytics-metrics.ts +351 -0
  291. package/studio/web/lib/api.ts +70 -0
  292. package/studio/web/lib/audio.ts +39 -0
  293. package/studio/web/lib/avatars.ts +41 -0
  294. package/studio/web/lib/calendar.ts +218 -0
  295. package/studio/web/lib/caption-position.ts +249 -0
  296. package/studio/web/lib/carousel.ts +24 -0
  297. package/studio/web/lib/chime.ts +42 -0
  298. package/studio/web/lib/clone-voice.ts +55 -0
  299. package/studio/web/lib/export.ts +11 -0
  300. package/studio/web/lib/files.ts +8 -0
  301. package/studio/web/lib/format.ts +93 -0
  302. package/studio/web/lib/media.ts +29 -0
  303. package/studio/web/lib/mic-device.ts +72 -0
  304. package/studio/web/lib/missing-dms.ts +70 -0
  305. package/studio/web/lib/omni-cards.ts +42 -0
  306. package/studio/web/lib/omni-cascade.ts +1067 -0
  307. package/studio/web/lib/omni-greeting-audio.ts +24 -0
  308. package/studio/web/lib/omni-hotword.ts +231 -0
  309. package/studio/web/lib/omni-panel.ts +67 -0
  310. package/studio/web/lib/omni-realtime.ts +811 -0
  311. package/studio/web/lib/omni-ui.ts +402 -0
  312. package/studio/web/lib/omni-wait.ts +174 -0
  313. package/studio/web/lib/omnichat-api.ts +44 -0
  314. package/studio/web/lib/orb.ts +270 -0
  315. package/studio/web/lib/pcm-recorder.ts +115 -0
  316. package/studio/web/lib/platforms.ts +17 -0
  317. package/studio/web/lib/providers.ts +27 -0
  318. package/studio/web/lib/publish-draft.ts +52 -0
  319. package/studio/web/lib/publish-settings.ts +81 -0
  320. package/studio/web/lib/query-client.ts +122 -0
  321. package/studio/web/lib/references.ts +13 -0
  322. package/studio/web/lib/services.ts +40 -0
  323. package/studio/web/lib/sessions.ts +103 -0
  324. package/studio/web/lib/settings-categories.ts +58 -0
  325. package/studio/web/lib/sound-audio.ts +33 -0
  326. package/studio/web/lib/sound-timeline.ts +291 -0
  327. package/studio/web/lib/sse.ts +86 -0
  328. package/studio/web/lib/stage-history.ts +141 -0
  329. package/studio/web/lib/stages.ts +344 -0
  330. package/studio/web/lib/studio-offline.ts +60 -0
  331. package/studio/web/lib/upload.ts +24 -0
  332. package/studio/web/lib/video-tabs.ts +118 -0
  333. package/studio/web/lib/voice-profile-draft.ts +34 -0
  334. package/studio/web/lib/voice-profiles.ts +3 -0
  335. package/studio/web/main.tsx +14 -0
  336. package/studio/web/pages/AdminPage/index.tsx +123 -0
  337. package/studio/web/pages/AgentPage/components/Measurements.tsx +102 -0
  338. package/studio/web/pages/AgentPage/index.tsx +28 -0
  339. package/studio/web/pages/AnalyticsPage/components/About.tsx +52 -0
  340. package/studio/web/pages/AnalyticsPage/components/ChannelCards.tsx +106 -0
  341. package/studio/web/pages/AnalyticsPage/components/ChannelView.tsx +137 -0
  342. package/studio/web/pages/AnalyticsPage/components/CollectionStatus.tsx +46 -0
  343. package/studio/web/pages/AnalyticsPage/components/Comparison.tsx +68 -0
  344. package/studio/web/pages/AnalyticsPage/components/Diagnosis.tsx +50 -0
  345. package/studio/web/pages/AnalyticsPage/components/Highlights.tsx +49 -0
  346. package/studio/web/pages/AnalyticsPage/components/Hint.tsx +11 -0
  347. package/studio/web/pages/AnalyticsPage/components/HookVsBody.tsx +100 -0
  348. package/studio/web/pages/AnalyticsPage/components/HourlyWave.tsx +133 -0
  349. package/studio/web/pages/AnalyticsPage/components/Insights.tsx +70 -0
  350. package/studio/web/pages/AnalyticsPage/components/MetricCard.tsx +46 -0
  351. package/studio/web/pages/AnalyticsPage/components/PlanSection.tsx +40 -0
  352. package/studio/web/pages/AnalyticsPage/components/ProgressionChart.tsx +155 -0
  353. package/studio/web/pages/AnalyticsPage/components/ReelBarsChart.tsx +154 -0
  354. package/studio/web/pages/AnalyticsPage/components/ReelThumb.tsx +19 -0
  355. package/studio/web/pages/AnalyticsPage/components/ReelView.tsx +290 -0
  356. package/studio/web/pages/AnalyticsPage/components/ReelsTable.tsx +269 -0
  357. package/studio/web/pages/AnalyticsPage/components/RequestWithFocus.tsx +38 -0
  358. package/studio/web/pages/AnalyticsPage/components/SegmentedControl.tsx +35 -0
  359. package/studio/web/pages/AnalyticsPage/components/VsMedian.tsx +31 -0
  360. package/studio/web/pages/AnalyticsPage/index.tsx +17 -0
  361. package/studio/web/pages/GettingStartedPage/index.tsx +174 -0
  362. package/studio/web/pages/NewVideoPage/components/DeliverablesPicker.tsx +62 -0
  363. package/studio/web/pages/NewVideoPage/components/FormatPicker.tsx +33 -0
  364. package/studio/web/pages/NewVideoPage/index.tsx +133 -0
  365. package/studio/web/pages/NotFoundPage/index.tsx +9 -0
  366. package/studio/web/pages/OmnichatPage/components/NewFromLink.tsx +59 -0
  367. package/studio/web/pages/OmnichatPage/components/RuleListItem.tsx +64 -0
  368. package/studio/web/pages/OmnichatPage/components/RulePreview.tsx +14 -0
  369. package/studio/web/pages/OmnichatPage/components/RuleView.tsx +88 -0
  370. package/studio/web/pages/OmnichatPage/index.tsx +153 -0
  371. package/studio/web/pages/QueuePage/index.tsx +22 -0
  372. package/studio/web/pages/ReferencePage/components/ReferenceTexts.tsx +131 -0
  373. package/studio/web/pages/ReferencePage/index.tsx +216 -0
  374. package/studio/web/pages/ReferencesPage/components/NewReferenceForm.tsx +150 -0
  375. package/studio/web/pages/ReferencesPage/components/ReferenceCard.tsx +42 -0
  376. package/studio/web/pages/ReferencesPage/components/ReferenceGridSkeleton.tsx +31 -0
  377. package/studio/web/pages/ReferencesPage/index.tsx +67 -0
  378. package/studio/web/pages/SchedulePage/components/CalendarSkeleton.tsx +18 -0
  379. package/studio/web/pages/SchedulePage/components/DayView.tsx +177 -0
  380. package/studio/web/pages/SchedulePage/components/HourPicker.tsx +103 -0
  381. package/studio/web/pages/SchedulePage/components/MonthDayCell.tsx +111 -0
  382. package/studio/web/pages/SchedulePage/components/MonthView.tsx +47 -0
  383. package/studio/web/pages/SchedulePage/components/PlatformIcons.tsx +12 -0
  384. package/studio/web/pages/SchedulePage/components/PostThumb.tsx +15 -0
  385. package/studio/web/pages/SchedulePage/components/WeekColumn.tsx +75 -0
  386. package/studio/web/pages/SchedulePage/components/WeekView.tsx +35 -0
  387. package/studio/web/pages/SchedulePage/index.tsx +285 -0
  388. package/studio/web/pages/SettingsPage/components/AgentAccounts.tsx +263 -0
  389. package/studio/web/pages/SettingsPage/components/AgentCategory.tsx +20 -0
  390. package/studio/web/pages/SettingsPage/components/ModelPicker.tsx +49 -0
  391. package/studio/web/pages/SettingsPage/components/ModelsSettings.tsx +138 -0
  392. package/studio/web/pages/SettingsPage/components/PlatformsCategory.tsx +23 -0
  393. package/studio/web/pages/SettingsPage/components/PublishingCategory/AccountStatus.tsx +29 -0
  394. package/studio/web/pages/SettingsPage/components/PublishingCategory/AutoPublishPanel.tsx +90 -0
  395. package/studio/web/pages/SettingsPage/components/PublishingCategory/BrowserConnect.tsx +62 -0
  396. package/studio/web/pages/SettingsPage/components/PublishingCategory/CheckField.tsx +19 -0
  397. package/studio/web/pages/SettingsPage/components/PublishingCategory/InstagramPanel.tsx +113 -0
  398. package/studio/web/pages/SettingsPage/components/PublishingCategory/OmnichatSettingsPanel.tsx +146 -0
  399. package/studio/web/pages/SettingsPage/components/PublishingCategory/SaveBar.tsx +33 -0
  400. package/studio/web/pages/SettingsPage/components/PublishingCategory/SchedulePanel.tsx +132 -0
  401. package/studio/web/pages/SettingsPage/components/PublishingCategory/SettingsCard.tsx +47 -0
  402. package/studio/web/pages/SettingsPage/components/PublishingCategory/SettingsCardGroup.tsx +19 -0
  403. package/studio/web/pages/SettingsPage/components/PublishingCategory/TextPanel.tsx +55 -0
  404. package/studio/web/pages/SettingsPage/components/PublishingCategory/TiktokPanel.tsx +123 -0
  405. package/studio/web/pages/SettingsPage/components/PublishingCategory/YoutubePanel.tsx +100 -0
  406. package/studio/web/pages/SettingsPage/components/PublishingCategory/badges.tsx +15 -0
  407. package/studio/web/pages/SettingsPage/components/PublishingCategory/index.tsx +40 -0
  408. package/studio/web/pages/SettingsPage/components/PublishingCategory/types.ts +10 -0
  409. package/studio/web/pages/SettingsPage/components/UsageCategory.tsx +389 -0
  410. package/studio/web/pages/SettingsPage/components/VoiceProvidersCategory.tsx +97 -0
  411. package/studio/web/pages/SettingsPage/index.tsx +85 -0
  412. package/studio/web/pages/VideoPage/components/AudioPlayer.tsx +113 -0
  413. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/AxisField.tsx +50 -0
  414. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionList.tsx +56 -0
  415. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionListItem.tsx +92 -0
  416. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionMargins.tsx +57 -0
  417. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionStyleFields.tsx +70 -0
  418. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionTextForm.tsx +87 -0
  419. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/ColorField.tsx +37 -0
  420. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/MarginField.tsx +59 -0
  421. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/NumberField.tsx +57 -0
  422. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/PositionControls.tsx +140 -0
  423. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/captionEditor.ts +215 -0
  424. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/useCaptionPosition.ts +154 -0
  425. package/studio/web/pages/VideoPage/components/CarouselChangeRequest.tsx +72 -0
  426. package/studio/web/pages/VideoPage/components/CarouselCompositionStage.tsx +80 -0
  427. package/studio/web/pages/VideoPage/components/CarouselCreate.tsx +63 -0
  428. package/studio/web/pages/VideoPage/components/CarouselMissing.tsx +19 -0
  429. package/studio/web/pages/VideoPage/components/CarouselPublishStage.tsx +173 -0
  430. package/studio/web/pages/VideoPage/components/CarouselScriptStage.tsx +82 -0
  431. package/studio/web/pages/VideoPage/components/CarouselSlideCard.tsx +49 -0
  432. package/studio/web/pages/VideoPage/components/CarouselViewer.tsx +55 -0
  433. package/studio/web/pages/VideoPage/components/ChangedVoices.tsx +53 -0
  434. package/studio/web/pages/VideoPage/components/CompositionStage.tsx +78 -0
  435. package/studio/web/pages/VideoPage/components/CoverPicker.tsx +32 -0
  436. package/studio/web/pages/VideoPage/components/EditorStage.tsx +53 -0
  437. package/studio/web/pages/VideoPage/components/LineTakes.tsx +160 -0
  438. package/studio/web/pages/VideoPage/components/LineTextEditor.tsx +124 -0
  439. package/studio/web/pages/VideoPage/components/LineVoicePicker.tsx +37 -0
  440. package/studio/web/pages/VideoPage/components/MediaImage.tsx +25 -0
  441. package/studio/web/pages/VideoPage/components/MotionScriptStage.tsx +39 -0
  442. package/studio/web/pages/VideoPage/components/NarrationStage.tsx +70 -0
  443. package/studio/web/pages/VideoPage/components/PublishForm.tsx +387 -0
  444. package/studio/web/pages/VideoPage/components/PublishStage.tsx +76 -0
  445. package/studio/web/pages/VideoPage/components/PublishText.tsx +149 -0
  446. package/studio/web/pages/VideoPage/components/ScenesApprovalPanel.tsx +278 -0
  447. package/studio/web/pages/VideoPage/components/ScheduledInfo.tsx +72 -0
  448. package/studio/web/pages/VideoPage/components/ScriptApprovalPanel.tsx +189 -0
  449. package/studio/web/pages/VideoPage/components/ScriptStage.tsx +17 -0
  450. package/studio/web/pages/VideoPage/components/SequencePlayer.tsx +146 -0
  451. package/studio/web/pages/VideoPage/components/SoundTimeline/AddSound.tsx +117 -0
  452. package/studio/web/pages/VideoPage/components/SoundTimeline/AreaSelection.tsx +74 -0
  453. package/studio/web/pages/VideoPage/components/SoundTimeline/BedPanel.tsx +94 -0
  454. package/studio/web/pages/VideoPage/components/SoundTimeline/BedRow.tsx +45 -0
  455. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionOverlay.tsx +44 -0
  456. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionSaveBar.tsx +32 -0
  457. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionsPanel.tsx +22 -0
  458. package/studio/web/pages/VideoPage/components/SoundTimeline/ClipBlock.tsx +111 -0
  459. package/studio/web/pages/VideoPage/components/SoundTimeline/ClipPanel.tsx +76 -0
  460. package/studio/web/pages/VideoPage/components/SoundTimeline/CutsPanel.tsx +44 -0
  461. package/studio/web/pages/VideoPage/components/SoundTimeline/EditorTabBar.tsx +73 -0
  462. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectChoice.tsx +46 -0
  463. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectItem.tsx +89 -0
  464. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectPanel.tsx +232 -0
  465. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectsRow.tsx +21 -0
  466. package/studio/web/pages/VideoPage/components/SoundTimeline/Lane.tsx +39 -0
  467. package/studio/web/pages/VideoPage/components/SoundTimeline/MarkerRow.tsx +40 -0
  468. package/studio/web/pages/VideoPage/components/SoundTimeline/MuteButton.tsx +36 -0
  469. package/studio/web/pages/VideoPage/components/SoundTimeline/NumberInput.tsx +37 -0
  470. package/studio/web/pages/VideoPage/components/SoundTimeline/PlanWarnings.tsx +19 -0
  471. package/studio/web/pages/VideoPage/components/SoundTimeline/PlayerResizeHandle.tsx +50 -0
  472. package/studio/web/pages/VideoPage/components/SoundTimeline/PreviewControls.tsx +51 -0
  473. package/studio/web/pages/VideoPage/components/SoundTimeline/SceneRow.tsx +54 -0
  474. package/studio/web/pages/VideoPage/components/SoundTimeline/SettingsPanel.tsx +65 -0
  475. package/studio/web/pages/VideoPage/components/SoundTimeline/SoundLibrary.tsx +99 -0
  476. package/studio/web/pages/VideoPage/components/SoundTimeline/SoundPreview.tsx +82 -0
  477. package/studio/web/pages/VideoPage/components/SoundTimeline/SpeedPanel.tsx +128 -0
  478. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineDock.tsx +56 -0
  479. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineFooter.tsx +26 -0
  480. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineSkeleton.tsx +21 -0
  481. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineToolbar.tsx +160 -0
  482. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineTracks.tsx +121 -0
  483. package/studio/web/pages/VideoPage/components/SoundTimeline/TrackSidebar.tsx +30 -0
  484. package/studio/web/pages/VideoPage/components/SoundTimeline/VoiceRow.tsx +53 -0
  485. package/studio/web/pages/VideoPage/components/SoundTimeline/Waveform.tsx +97 -0
  486. package/studio/web/pages/VideoPage/components/SoundTimeline/clipActions.ts +50 -0
  487. package/studio/web/pages/VideoPage/components/SoundTimeline/effectActions.ts +161 -0
  488. package/studio/web/pages/VideoPage/components/SoundTimeline/index.tsx +161 -0
  489. package/studio/web/pages/VideoPage/components/SoundTimeline/timelineGeometry.ts +45 -0
  490. package/studio/web/pages/VideoPage/components/SoundTimeline/types.ts +43 -0
  491. package/studio/web/pages/VideoPage/components/SoundTimeline/useAutosave.ts +107 -0
  492. package/studio/web/pages/VideoPage/components/SoundTimeline/useEditorShortcuts.ts +168 -0
  493. package/studio/web/pages/VideoPage/components/SoundTimeline/useFitHeight.ts +40 -0
  494. package/studio/web/pages/VideoPage/components/SoundTimeline/useFollowPlayhead.ts +21 -0
  495. package/studio/web/pages/VideoPage/components/SoundTimeline/useListenMix.ts +43 -0
  496. package/studio/web/pages/VideoPage/components/SoundTimeline/usePlayback.ts +231 -0
  497. package/studio/web/pages/VideoPage/components/SoundTimeline/usePlayerWidth.ts +27 -0
  498. package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundData.ts +124 -0
  499. package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundTimeline.ts +511 -0
  500. package/studio/web/pages/VideoPage/components/StageDrawer/CompareVersions.tsx +111 -0
  501. package/studio/web/pages/VideoPage/components/StageDrawer/VersionCard.tsx +81 -0
  502. package/studio/web/pages/VideoPage/components/StageDrawer/VersionMedia.tsx +24 -0
  503. package/studio/web/pages/VideoPage/components/StageDrawer/VersionText.tsx +15 -0
  504. package/studio/web/pages/VideoPage/components/StageDrawer/index.tsx +109 -0
  505. package/studio/web/pages/VideoPage/components/StageProcess.tsx +126 -0
  506. package/studio/web/pages/VideoPage/components/StageResult.tsx +69 -0
  507. package/studio/web/pages/VideoPage/components/SwapReference.tsx +92 -0
  508. package/studio/web/pages/VideoPage/components/ThumbnailPanel.tsx +252 -0
  509. package/studio/web/pages/VideoPage/components/TimingPanel.tsx +89 -0
  510. package/studio/web/pages/VideoPage/components/VideoPlayer.tsx +18 -0
  511. package/studio/web/pages/VideoPage/components/VideoSkeleton.tsx +50 -0
  512. package/studio/web/pages/VideoPage/components/VideoVoiceInfo.tsx +33 -0
  513. package/studio/web/pages/VideoPage/components/VideoVoicePicker.tsx +165 -0
  514. package/studio/web/pages/VideoPage/components/VoicePauseBanner.tsx +56 -0
  515. package/studio/web/pages/VideoPage/components/WithLogo.tsx +10 -0
  516. package/studio/web/pages/VideoPage/index.tsx +295 -0
  517. package/studio/web/pages/VideosPage/components/PublishedOn.tsx +85 -0
  518. package/studio/web/pages/VideosPage/components/ServicesPanel.tsx +81 -0
  519. package/studio/web/pages/VideosPage/components/SessionsPanel.tsx +62 -0
  520. package/studio/web/pages/VideosPage/components/VideoListSkeleton.tsx +25 -0
  521. package/studio/web/pages/VideosPage/components/VideoRow.tsx +122 -0
  522. package/studio/web/pages/VideosPage/index.tsx +134 -0
  523. package/studio/web/pages/VoicePage/index.tsx +28 -0
  524. package/studio/web/router.tsx +201 -0
  525. package/studio/web/styles/base/elements.css +55 -0
  526. package/studio/web/styles/base/utilities.css +25 -0
  527. package/studio/web/styles/components/badge.css +33 -0
  528. package/studio/web/styles/components/claude-running.css +27 -0
  529. package/studio/web/styles/components/claude-session.css +212 -0
  530. package/studio/web/styles/components/claude-walking.css +92 -0
  531. package/studio/web/styles/components/clone-voice-save.css +136 -0
  532. package/studio/web/styles/components/clone-voice.css +379 -0
  533. package/studio/web/styles/components/controls.css +70 -0
  534. package/studio/web/styles/components/data-and-image.css +54 -0
  535. package/studio/web/styles/components/forms.css +132 -0
  536. package/studio/web/styles/components/human-banner.css +99 -0
  537. package/studio/web/styles/components/lightbox.css +50 -0
  538. package/studio/web/styles/components/markdown.css +68 -0
  539. package/studio/web/styles/components/modal.css +70 -0
  540. package/studio/web/styles/components/omni-cards.css +105 -0
  541. package/studio/web/styles/components/omni.css +859 -0
  542. package/studio/web/styles/components/omnichat.css +538 -0
  543. package/studio/web/styles/components/panel.css +115 -0
  544. package/studio/web/styles/components/platform-card.css +140 -0
  545. package/studio/web/styles/components/provider-card.css +132 -0
  546. package/studio/web/styles/components/queue.css +185 -0
  547. package/studio/web/styles/components/reference-actions.css +133 -0
  548. package/studio/web/styles/components/reference-picker.css +146 -0
  549. package/studio/web/styles/components/results-drawer.css +224 -0
  550. package/studio/web/styles/components/segmented.css +115 -0
  551. package/studio/web/styles/components/side-panel-tab.css +23 -0
  552. package/studio/web/styles/components/status-signals.css +66 -0
  553. package/studio/web/styles/components/stepper.css +208 -0
  554. package/studio/web/styles/components/table.css +19 -0
  555. package/studio/web/styles/components/tabs.css +24 -0
  556. package/studio/web/styles/components/ui/accordion.css +71 -0
  557. package/studio/web/styles/components/ui/chart.css +162 -0
  558. package/studio/web/styles/components/ui/checkbox.css +37 -0
  559. package/studio/web/styles/components/ui/date-picker.css +153 -0
  560. package/studio/web/styles/components/ui/select.css +110 -0
  561. package/studio/web/styles/components/ui/skeleton.css +25 -0
  562. package/studio/web/styles/components/ui/slider.css +81 -0
  563. package/studio/web/styles/components/ui/switch.css +41 -0
  564. package/studio/web/styles/components/ui/tooltip.css +24 -0
  565. package/studio/web/styles/components/voice-carousel.css +255 -0
  566. package/studio/web/styles/components/voice-editor.css +179 -0
  567. package/studio/web/styles/components/voice-grid.css +56 -0
  568. package/studio/web/styles/components/voice-profiles.css +192 -0
  569. package/studio/web/styles/design-system.md +136 -0
  570. package/studio/web/styles/index.css +116 -0
  571. package/studio/web/styles/layout/page.css +41 -0
  572. package/studio/web/styles/layout/sidebar-groups.css +39 -0
  573. package/studio/web/styles/layout/sidebar.css +111 -0
  574. package/studio/web/styles/pages/agent.css +26 -0
  575. package/studio/web/styles/pages/analytics/dashboard.css +614 -0
  576. package/studio/web/styles/pages/analytics/insights.css +48 -0
  577. package/studio/web/styles/pages/getting-started.css +166 -0
  578. package/studio/web/styles/pages/new-video/form.css +32 -0
  579. package/studio/web/styles/pages/not-found.css +59 -0
  580. package/studio/web/styles/pages/references.css +204 -0
  581. package/studio/web/styles/pages/schedule/calendar.css +541 -0
  582. package/studio/web/styles/pages/schedule/chip-states.css +60 -0
  583. package/studio/web/styles/pages/settings/models.css +72 -0
  584. package/studio/web/styles/pages/settings/shell.css +361 -0
  585. package/studio/web/styles/pages/settings/usage.css +63 -0
  586. package/studio/web/styles/pages/studio-offline.css +105 -0
  587. package/studio/web/styles/pages/video/caption-controls.css +194 -0
  588. package/studio/web/styles/pages/video/captions-grid.css +70 -0
  589. package/studio/web/styles/pages/video/captions.css +79 -0
  590. package/studio/web/styles/pages/video/editor-chat.css +103 -0
  591. package/studio/web/styles/pages/video/export.css +50 -0
  592. package/studio/web/styles/pages/video/frames.css +29 -0
  593. package/studio/web/styles/pages/video/fullscreen-stage.css +400 -0
  594. package/studio/web/styles/pages/video/instagram-carousel.css +309 -0
  595. package/studio/web/styles/pages/video/layout.css +285 -0
  596. package/studio/web/styles/pages/video/narration.css +138 -0
  597. package/studio/web/styles/pages/video/preview-overview.css +11 -0
  598. package/studio/web/styles/pages/video/processing-notice.css +34 -0
  599. package/studio/web/styles/pages/video/publish-when.css +76 -0
  600. package/studio/web/styles/pages/video/publish.css +97 -0
  601. package/studio/web/styles/pages/video/result.css +96 -0
  602. package/studio/web/styles/pages/video/scenes.css +167 -0
  603. package/studio/web/styles/pages/video/sound-timeline.css +672 -0
  604. package/studio/web/styles/pages/video/sound-toolbar.css +149 -0
  605. package/studio/web/styles/pages/video/take-player.css +100 -0
  606. package/studio/web/styles/pages/video/thumbnail.css +157 -0
  607. package/studio/web/styles/pages/video/timeline.css +117 -0
  608. package/studio/web/styles/pages/video/voice-picker.css +14 -0
  609. package/studio/web/styles/pages/video-list/active-row.css +27 -0
  610. package/studio/web/styles/pages/video-list/card-link.css +49 -0
  611. package/studio/web/styles/pages/video-list/list.css +86 -0
  612. package/studio/web/styles/theme/identity/details.css +204 -0
  613. package/studio/web/styles/theme/identity/shell.css +249 -0
  614. package/studio/web/styles/theme/identity/surfaces.css +183 -0
  615. package/studio/web/styles/theme/identity/titles-and-buttons.css +120 -0
  616. package/studio/web/styles/theme/no-borders/blocks.css +208 -0
  617. package/studio/web/styles/theme/no-borders/controls.css +256 -0
  618. package/studio/web/styles/tokens.css +245 -0
  619. package/studio/web/types/api.ts +2 -0
  620. package/studio/web/types/assets.d.ts +9 -0
  621. package/templates/brief.md +27 -0
  622. package/templates/captions.html +204 -0
  623. package/templates/carousel-composition.md +47 -0
  624. package/templates/carousel-script.md +60 -0
  625. package/templates/components/voiceavatar/README.md +87 -0
  626. package/templates/components/voiceavatar/demo.html +50 -0
  627. package/templates/components/voiceavatar/voiceavatar.js +415 -0
  628. package/templates/motion.md +80 -0
  629. package/templates/playbook.md +43 -0
  630. package/templates/reference.md +123 -0
  631. package/templates/scene.html +112 -0
  632. package/templates/scenes.example.json +96 -0
  633. package/templates/script.md +63 -0
  634. package/templates/slide.html +71 -0
  635. package/templates/wireframe.html +91 -0
  636. package/tools/analysis.mjs +300 -0
  637. package/tools/approval.mjs +442 -0
  638. package/tools/assemble.mjs +942 -0
  639. package/tools/build-motion.mjs +437 -0
  640. package/tools/captions.mjs +246 -0
  641. package/tools/carousel.mjs +558 -0
  642. package/tools/compose.mjs +307 -0
  643. package/tools/cuts.mjs +74 -0
  644. package/tools/editor.mjs +419 -0
  645. package/tools/epidemic-capture.js +54 -0
  646. package/tools/fanout.mjs +69 -0
  647. package/tools/history.mjs +70 -0
  648. package/tools/history.py +61 -0
  649. package/tools/job-queue.mjs +180 -0
  650. package/tools/job_queue.py +430 -0
  651. package/tools/lib/agents.mjs +412 -0
  652. package/tools/lib/channel.mjs +399 -0
  653. package/tools/lib/claude-settings.mjs +67 -0
  654. package/tools/lib/cli.mjs +9 -0
  655. package/tools/lib/fanout.mjs +234 -0
  656. package/tools/lib/http.mjs +94 -0
  657. package/tools/lib/index.js +14 -0
  658. package/tools/lib/mcp-server.mjs +69 -0
  659. package/tools/lib/metrics/metrics.mjs +204 -0
  660. package/tools/lib/narration.mjs +15 -0
  661. package/tools/lib/oauth-client.mjs +295 -0
  662. package/tools/lib/omnichat/config.mjs +139 -0
  663. package/tools/lib/omnichat/errors.mjs +42 -0
  664. package/tools/lib/omnichat/extract.mjs +82 -0
  665. package/tools/lib/omnichat/gate.mjs +151 -0
  666. package/tools/lib/omnichat/manual.mjs +166 -0
  667. package/tools/lib/omnichat/match.mjs +78 -0
  668. package/tools/lib/omnichat/pass.mjs +393 -0
  669. package/tools/lib/omnichat/record.mjs +208 -0
  670. package/tools/lib/omnichat/text.mjs +315 -0
  671. package/tools/lib/omnichat/webhook.mjs +166 -0
  672. package/tools/lib/pairing.mjs +99 -0
  673. package/tools/lib/paths.mjs +41 -0
  674. package/tools/lib/platforms/instagram.mjs +469 -0
  675. package/tools/lib/platforms/tiktok.mjs +343 -0
  676. package/tools/lib/platforms/youtube.mjs +228 -0
  677. package/tools/lib/publish/publish.mjs +244 -0
  678. package/tools/lib/schedule/schedule.mjs +191 -0
  679. package/tools/lib/service.mjs +134 -0
  680. package/tools/lib/skill-client.mjs +126 -0
  681. package/tools/lib/skills-release.mjs +196 -0
  682. package/tools/lib/testing.mjs +52 -0
  683. package/tools/lib/up.mjs +187 -0
  684. package/tools/metrics.mjs +415 -0
  685. package/tools/models.mjs +134 -0
  686. package/tools/narrate.mjs +257 -0
  687. package/tools/omni.mjs +298 -0
  688. package/tools/omni_paths.py +12 -0
  689. package/tools/omnichat.mjs +1577 -0
  690. package/tools/omnivideo.py +1122 -0
  691. package/tools/package.mjs +130 -0
  692. package/tools/platforms.mjs +236 -0
  693. package/tools/premiere.mjs +533 -0
  694. package/tools/publish.mjs +1496 -0
  695. package/tools/reference.mjs +1408 -0
  696. package/tools/render.mjs +426 -0
  697. package/tools/runner.mjs +156 -0
  698. package/tools/setup.mjs +466 -0
  699. package/tools/skills-release.mjs +93 -0
  700. package/tools/sound.mjs +1323 -0
  701. package/tools/soundtrack.mjs +217 -0
  702. package/tools/thumbnail.mjs +271 -0
  703. package/tools/timing.mjs +108 -0
  704. package/tools/usage.py +628 -0
  705. package/tools/voice-envelope.mjs +185 -0
  706. package/tools/voice.py +448 -0
  707. package/tools/voice_sample.py +75 -0
  708. package/tools/wireframe.mjs +230 -0
@@ -0,0 +1,123 @@
1
+ # <name> · <o que a peça é, em poucas palavras>
2
+
3
+ Fonte: <source>.
4
+ <summary>.
5
+
6
+ Medido nos quadros: `measurements.json` e `sheets/`. O que é estimativa leva `≈`.
7
+ O passo a passo é a skill `av-reference`: medir, Tipo, movimento (`curve`),
8
+ guia e prova (`compare`).
9
+
10
+ ---
11
+
12
+ ## Essência
13
+
14
+ Uma ou duas frases: o que a peça faz e por que prende. É o texto que aparece
15
+ no `reference.mjs list`, então escreva para quem vai escolher entre
16
+ estilos visuais. Se a essência mora numa camada que o código não reproduz (Tipo),
17
+ diga aqui.
18
+
19
+ ## Tipo
20
+
21
+ **<motion de shape | tipografia cinética | UI / product demo | site | filmado /
22
+ documental | híbrido>** · reproduzível em código: **<inteiro | em parte |
23
+ só a camada gráfica>**. Superfície do `measurements.json`: <n> cores cobrem 90 %,
24
+ <n> % chapado.
25
+
26
+ | camada | na peça | em código |
27
+ |---|---|---|
28
+ | fundo | | sim · ou o substituto, e que função ele guarda |
29
+ | herói | | |
30
+ | texto | | |
31
+ | textura | | |
32
+ | edição | ritmo, corte, passagem | |
33
+
34
+ ## Ritmo
35
+
36
+ Do `measurements.json`: quantos planos e de quanto, quanto do tempo a tela segura,
37
+ onde estão os picos de mudança. Diga o que isso pede ao roteiro de motion:
38
+ quanto dura um beat, quanto a tela segura depois dele, se a peça corta ou flui.
39
+
40
+ ## Layout
41
+
42
+ Grade, margens, zonas vazias (topo e base), onde fica o herói. Medidas em px
43
+ no formato original.
44
+
45
+ ## Cor
46
+
47
+ | token | hex | OKLCH | uso |
48
+ |---|---|---|---|
49
+
50
+ A paleta do `measurements.json` traz a área de cada cor; aqui entra o papel de
51
+ cada uma. Diga onde o acento aparece e onde ele nunca aparece.
52
+
53
+ ## Tipografia
54
+
55
+ | papel | corpo | peso | tracking | cor | caixa |
56
+ |---|---|---|---|---|---|
57
+
58
+ Família provável e como você chegou nela.
59
+
60
+ ## Movimento
61
+
62
+ **Camadas:** o que tem câmera, o que fica fixo.
63
+ **Câmera:** cada movimento com tempo, amplitude e curva.
64
+ **Curvas:** as duas ou três que a peça usa, medidas com `curve` (de onde: `t`
65
+ e caixa), com o nome CSS/GSAP mais perto.
66
+ **Ritmo interno:** escalonamento entre itens, quanto um elemento espera o
67
+ anterior assentar.
68
+
69
+ ## Primitivas
70
+
71
+ Os elementos que se repetem, cada um como uma unidade que a composição monta.
72
+ Cinco a dez descrevem quase qualquer peça de shape.
73
+
74
+ ### <nome da primitiva> · `sheets/<onde ver>.png`
75
+
76
+ - **anatomia:** forma, camadas, tamanho em px, traço, raio, sombra
77
+ - **entra:** de que estado, `curve` medida (`cubic-bezier`, duração), escalonamento
78
+ - **vive:** o que continua se mexendo depois de entrar
79
+ - **se transforma:** em que vira, troca no lugar
80
+ - **sai:** como e com que curva
81
+
82
+ ## Timeline
83
+
84
+ | t (s) | o que acontece |
85
+ |---|---|
86
+
87
+ ## Som
88
+
89
+ Trilha, pulso (do `measurements.json`), efeitos e em que quadro caem, narração.
90
+
91
+ ## Vale levar
92
+
93
+ Princípios que funcionam em outro assunto, um por linha, concretos o bastante
94
+ para virar regra no `motion.md`.
95
+
96
+ ## Não copiar
97
+
98
+ Marca, assets, dados e o que só faz sentido naquela peça.
99
+
100
+ ## Tokens
101
+
102
+ ```css
103
+ :root{
104
+ }
105
+ ```
106
+
107
+ ## Prova
108
+
109
+ `proof/proof.html` recria <t0–t1 s> da peça só com este guia, no tamanho dela.
110
+
111
+ | volta | SSIM | ΔE cor | ΔE paleta | o que mudou |
112
+ |---|---|---|---|---|
113
+
114
+ Bateu: …
115
+ Ainda diverge, e por quê: …
116
+
117
+ ## Arquivos
118
+
119
+ - o vídeo e `measurements.json` (com `curves` e `proofs`)
120
+ - `sheets/contacts.png`: um quadro a cada intervalo fixo, em linhas
121
+ - `sheets/cuts.png`: antes | depois de cada corte
122
+ - `sheets/comparison.png`: estilo visual | prova | diferença, da última volta
123
+ - `proof/proof.html`: o trecho recriado em código, ponto de partida das cenas
@@ -0,0 +1,112 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>scene</title>
6
+ <!-- ============================================================
7
+ omnivideo BASE SCENE. Copy to videos/<slug>/motion/src/<id>.html.
8
+
9
+ Only the timing engine comes ready; the visuals belong to the scene. The
10
+ size follows the viewport render.mjs opens (1080×1920 or 1920×1080).
11
+
12
+ still: node tools/render.mjs scene.html --still f.png --at 2 --w 1080 --h 1920
13
+ browser preview: open with ?t=2.4
14
+
15
+ Two clocks: --t is the scene's (0 at its first frame); the video's is
16
+ --scene-start + --t. What crosses the cut (background, slow camera) moves
17
+ in video time; the rest, in scene time.
18
+ ============================================================ -->
19
+ <style>
20
+ /* ========================= ENGINE (do not edit) ========================= */
21
+ :root{ --t:0s; }
22
+
23
+ /* Non-inherited: without this a parent's --dur leaks into every child and the
24
+ var(--dur, 600ms) fallback never fires. */
25
+ @property --start{ syntax:"*"; inherits:false; }
26
+ @property --dur { syntax:"*"; inherits:false; }
27
+ @property --ease { syntax:"*"; inherits:false; }
28
+ @property --iter { syntax:"*"; inherits:false; }
29
+
30
+ [data-anim]{
31
+ animation-duration:var(--dur, 600ms);
32
+ animation-timing-function:var(--ease, cubic-bezier(0.22,1,0.36,1));
33
+ animation-iteration-count:var(--iter, 1);
34
+ animation-delay:calc(var(--start, 0s) - var(--t));
35
+ animation-fill-mode:both; /* holds before AND after */
36
+ animation-play-state:paused; /* time comes from the delay, not the clock */
37
+ }
38
+
39
+ /* ========================= CANVAS ========================= */
40
+ html,body{ margin:0; width:100vw; height:100vh; overflow:hidden; background:var(--bg); font-family:var(--sans); }
41
+ :root{
42
+ --bg:#F5F5F3;
43
+ --sans:"Schibsted Grotesk","Helvetica Neue",Helvetica,Arial,sans-serif; /* channel default (av-motion) */
44
+ --margin:4.5vw; /* sides and bottom */
45
+ --margin-top:calc(var(--margin) * 1.2); /* top 20 % larger: the top safe area doesn't overlap */
46
+ --caption-zone:19vh; /* 9:16: captions live here; no content */
47
+ }
48
+ .canvas{
49
+ position:absolute; inset:0 0 var(--caption-zone) 0;
50
+ padding:var(--margin-top) var(--margin) var(--margin);
51
+ display:flex; flex-direction:column; justify-content:center; gap:3vh;
52
+ }
53
+
54
+ /* ========================= CONTINUOUS (optional) =========================
55
+ A layer that crosses the cut moves in VIDEO time: with a negative --start
56
+ at --scene-start, it is at the same point on one scene's last frame and on
57
+ the next one's first. Infinite loops only like this, never in scene time.
58
+
59
+ .live-bg{ animation-name:drift; --start:calc(0s - var(--scene-start, 0s));
60
+ --dur:16s; --iter:infinite; --ease:linear; }
61
+
62
+ To apply it the same way in every scene, put it in motion/src/_common.html:
63
+ the build pastes that file in place of the omnivideo:common marker, at the
64
+ start of the body. */
65
+
66
+ /* ========================= SCENE (replace) ========================= */
67
+ @keyframes enter{
68
+ from{ opacity:0; transform:translateY(12px); filter:blur(3px); }
69
+ to { opacity:1; transform:none; filter:none; }
70
+ }
71
+ .title{ font:700 6.5vw/1.1 var(--sans); color:#111; margin:0; }
72
+ .support{ font:400 4vw/1.3 var(--sans); color:#555; margin:0; }
73
+ </style>
74
+ </head>
75
+ <body>
76
+ <!-- omnivideo:common -->
77
+ <main class="canvas">
78
+ <!-- Beat: --start comes from scenes.json via --b-<element>. The value after
79
+ the comma is only for opening the source alone in the browser.
80
+ An element that carries into the next scene gets data-continues="<name>"
81
+ in both; `build-motion.mjs --transitions` measures whether it jumps at the cut. -->
82
+ <h1 class="title" data-anim style="animation-name:enter; --start:var(--b-title, 0.6s);">Título da cena</h1>
83
+ <p class="support" data-anim style="animation-name:enter; --start:calc(var(--b-support, 1.8s) + 0ms);">Apoio que entra no segundo beat</p>
84
+ </main>
85
+
86
+ <script>
87
+ /* ---------------------------------------------------------------------------
88
+ GSAP or Motion (optional): a PAUSED timeline, positioned by the --t that
89
+ render.mjs writes on <html>. Beat times in window.OMNIVIDEO.beats.
90
+
91
+ const beats = window.OMNIVIDEO?.beats ?? {};
92
+ const tl = gsap.timeline({ paused: true });
93
+ tl.from("#chart", { scaleY: 0, duration: 0.9, ease: "power2.out" }, beats["chart"] ?? 1.2);
94
+ const seek = () => tl.seek(parseFloat(document.documentElement.style.getPropertyValue("--t")) || 0);
95
+ new MutationObserver(seek).observe(document.documentElement, { attributes: true, attributeFilter: ["style"] });
96
+ seek();
97
+
98
+ A timeline that crosses the cut: tl.seek((window.OMNIVIDEO?.start ?? 0) + t).
99
+
100
+ No clock: no Date.now(), no unseeded Math.random(), no
101
+ requestAnimationFrame driving visuals, no play().
102
+ --------------------------------------------------------------------------- */
103
+
104
+ /* browser preview: ?t=2.4 freezes the scene at that instant */
105
+ const q = new URLSearchParams(location.search);
106
+ if (q.has("t")) document.documentElement.style.setProperty("--t", q.get("t") + "s");
107
+
108
+ /* signal for the renderer: only after fonts (and GSAP setup, if any) */
109
+ document.fonts.ready.then(() => { window.__ready = true; });
110
+ </script>
111
+ </body>
112
+ </html>
@@ -0,0 +1,96 @@
1
+ {
2
+ "slug": "2026-10-12-exemplo",
3
+ "title": "Decisão de IA em milissegundos",
4
+ "format": {
5
+ "aspect": "9:16",
6
+ "w": 1080,
7
+ "h": 1920,
8
+ "fps": 30
9
+ },
10
+ "references": [
11
+ "apura-paraguai"
12
+ ],
13
+ "scenes": [
14
+ {
15
+ "id": "c01",
16
+ "title": "Gancho",
17
+ "goal": "Mostrar o contraste: minutos contra milissegundos.",
18
+ "visual": "Duas barras de tempo lado a lado. A do LLM cresce devagar; a do Jev mal sai do chão.",
19
+ "hero": "barra do Jev",
20
+ "min_duration": 4.8,
21
+ "html": "motion/c01.html",
22
+ "mp4": "motion/c01.mp4",
23
+ "beats": [
24
+ {
25
+ "element": "titulo",
26
+ "t": 0.6,
27
+ "enters_with": "c01f1"
28
+ },
29
+ {
30
+ "element": "barra-llm",
31
+ "t": 1.8,
32
+ "enters_with": "c01f1:minutos"
33
+ },
34
+ {
35
+ "element": "barra-jev",
36
+ "t": 4.2,
37
+ "enters_with": "c01f2:milissegundos",
38
+ "sound": {
39
+ "name": "barra-whoosh.mp3",
40
+ "offset": 0,
41
+ "db": -3
42
+ }
43
+ }
44
+ ],
45
+ "lines": [
46
+ {
47
+ "id": "c01f1",
48
+ "text": "Uma IA de ponta pode levar minutos pra tomar uma única decisão."
49
+ },
50
+ {
51
+ "id": "c01f2",
52
+ "text": "O Jev decide em milissegundos."
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ "id": "c02",
58
+ "title": "Como funciona",
59
+ "goal": "Entrada qualquer, saída tipada.",
60
+ "visual": "Card de estado à esquerda, conector tracejado com pacote, card de decisão à direita com a probabilidade.",
61
+ "hero": "card de decisão",
62
+ "transition": {
63
+ "continues": [
64
+ "fundo"
65
+ ]
66
+ },
67
+ "min_duration": 5.4,
68
+ "html": "motion/c02.html",
69
+ "mp4": "motion/c02.mp4",
70
+ "beats": [
71
+ {
72
+ "element": "card-estado",
73
+ "t": 0.6,
74
+ "enters_with": "c02f1"
75
+ },
76
+ {
77
+ "element": "conector",
78
+ "t": 2.4,
79
+ "enters_with": "c02f1:sai"
80
+ },
81
+ {
82
+ "element": "card-decisao",
83
+ "t": 3.6,
84
+ "enters_with": "c02f1:tipada",
85
+ "sound": "clique-seco.mp3"
86
+ }
87
+ ],
88
+ "lines": [
89
+ {
90
+ "id": "c02f1",
91
+ "text": "Entra o estado, do jeito que vier, e sai uma decisão tipada, com probabilidade."
92
+ }
93
+ ]
94
+ }
95
+ ]
96
+ }
@@ -0,0 +1,63 @@
1
+ # Roteiro · <título>
2
+
3
+ | formato | duração alvo | velocidade | palavras | estimativa (÷ 2,2 ÷ velocidade) |
4
+ |---|---|---|---|---|
5
+ | 9:16 | 45 s | 1,2× | 0 | 0 s |
6
+
7
+ **Tese:** uma frase.
8
+
9
+ ## Estratégia
10
+
11
+ | | |
12
+ |---|---|
13
+ | pilar | um dos pilares do `channel/playbook.md` |
14
+ | objetivo | alcance · seguidor · salvamento · lead (um só) |
15
+ | métrica que julga | a do objetivo |
16
+ | para quem | quem para de rolar |
17
+ | promessa | o que a pessoa leva, numa frase |
18
+ | pergunta que segura | a dúvida que o gancho abre e o fim responde |
19
+ | CTA | o que o objetivo pede |
20
+
21
+ ## Ganchos
22
+
23
+ | | fala | quadro 0 | texto na tela | tipo |
24
+ |---|---|---|---|---|
25
+ | **A · escolhido** | a primeira frase | o que está na tela no primeiro quadro | 2 a 5 palavras | risco · resultado · contradição · número · pergunta |
26
+ | B | | | | |
27
+ | C | | | | |
28
+
29
+ **Por que o A:** uma frase, com o que o playbook e as métricas mostram.
30
+
31
+ ---
32
+
33
+ ## B1 · Gancho
34
+
35
+ **Ideia:** o gancho A.
36
+
37
+ > Texto falado.
38
+
39
+ ## B2 · Segura
40
+
41
+ **Ideia:** por que ficar: a promessa ou a pergunta que segura.
42
+
43
+ > Texto falado.
44
+
45
+ ## B3 · <ideia>
46
+
47
+ **Ideia:** uma linha; termina abrindo o próximo bloco.
48
+
49
+ > Texto falado.
50
+
51
+ **Fonte:** `source/…` (todo fato com número, nome ou data)
52
+
53
+ ## B4 · Payoff
54
+
55
+ **Ideia:** a resposta da pergunta que segura.
56
+
57
+ > Texto falado.
58
+
59
+ ## B5 · Fechamento
60
+
61
+ **Ideia:** o CTA do objetivo.
62
+
63
+ > Texto falado, terminando no CTA.
@@ -0,0 +1,71 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>slide</title>
6
+ <!-- ============================================================
7
+ omnivideo carousel BASE SLIDE. Copy to
8
+ videos/<slug>/carousel/src/<id>.html (s01, s02…).
9
+
10
+ The slide is a still image: no --t, no animation. The size follows the
11
+ viewport carousel.mjs opens (4:5 → 1080×1350, 1:1 → 1080×1080,
12
+ 3:4 → 1080×1440); the width is always 1080, so px measures hold
13
+ in all three.
14
+
15
+ build: node tools/carousel.mjs build videos/<slug> --slide s01
16
+ browser preview: open the carousel/<id>.html the build generates
17
+
18
+ The build injects at the end of the head:
19
+ :root{ --slide-i:2; --slide-n:8; --slide-w:1080px; --slide-h:1350px; }
20
+ window.OMNICAROUSEL = { slide, index, total, format, slides: [{ id, role }] }
21
+ (--slide-i starts at 0), and pastes carousel/src/_common.html in place of
22
+ the omnivideo:common marker: background, tokens and frame equal on every
23
+ slide. The _common styles go up to the start of the head: they are the
24
+ base, and this slide's style overrides.
25
+
26
+ An element that crosses the seam between two slides (panorama): position
27
+ on the whole carousel, shifted by the slide you are on,
28
+ left: calc(1400px - var(--slide-i) * var(--slide-w));
29
+ The same code in _common.html draws the right part on each slide.
30
+ ============================================================ -->
31
+ <style>
32
+ /* ========================= CANVAS (default; _common.html may swap it) ========================= */
33
+ :root{
34
+ --bg:#F5F5F3;
35
+ --ink:#111;
36
+ --support:#555;
37
+ --sans:"Schibsted Grotesk","Helvetica Neue",Helvetica,Arial,sans-serif; /* channel default */
38
+ --margin:88px; /* sides: the profile grid crops 4:5 to 3:4 (~34 px each side) */
39
+ --margin-v:104px; /* top and bottom */
40
+ }
41
+ html,body{ margin:0; width:100vw; height:100vh; overflow:hidden; background:var(--bg); font-family:var(--sans); color:var(--ink); }
42
+ .canvas{
43
+ position:absolute; inset:0;
44
+ padding:var(--margin-v) var(--margin);
45
+ display:flex; flex-direction:column; justify-content:center; gap:32px;
46
+ box-sizing:border-box;
47
+ }
48
+
49
+ /* ========================= SLIDE (swap) ========================= */
50
+ .title{ font:800 88px/1.02 var(--sans); letter-spacing:-0.035em; margin:0; }
51
+ .support{ font:500 40px/1.3 var(--sans); color:var(--support); margin:0; }
52
+ </style>
53
+ </head>
54
+ <body>
55
+ <!-- omnivideo:common -->
56
+ <main class="canvas">
57
+ <h1 class="title">Título do slide</h1>
58
+ <p class="support">Uma frase de apoio, curta, que se lê em dois segundos.</p>
59
+ </main>
60
+
61
+ <script>
62
+ /* Drawing in JS (generated SVG, cell grid, chart): build it here, with data
63
+ from the slide itself or from window.OMNICAROUSEL, and only then tell the
64
+ renderer. No Math.random() without a seed: the same slide always comes out the same.
65
+
66
+ A decorative element that bleeds past the margin on purpose (a shape bleeding
67
+ off the edge, panorama) gets data-free: the build does not flag it. Text never bleeds. */
68
+ document.fonts.ready.then(() => { window.__ready = true; });
69
+ </script>
70
+ </body>
71
+ </html>
@@ -0,0 +1,91 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>wireframes</title>
6
+ <!-- ============================================================
7
+ Motion script WIREFRAMES. Copy to
8
+ videos/<slug>/motion/wireframes/wireframes.html.
9
+
10
+ The base of the video's wireframes: the tokens (match the Style in
11
+ motion.md) and the classes. Each scene's frame is its own file,
12
+ motion/wireframes/src/<id>.html, with one section of class "frame"
13
+ and the scene's id, written by that scene's fork in parallel
14
+ (.claude/skills/av-motion/wireframe.md has the examples);
15
+ tools/wireframe.mjs pastes them at the omnivideo:frames marker in the body. A quick
16
+ still so the user sees each scene's visual idea before approving: where
17
+ the hero sits, what supports it, how much it takes. Not the scene: no
18
+ animation, no assets, no polish.
19
+
20
+ Everything gray, EXCEPT what has the most contrast or focus in the scene:
21
+ that gets the real color (.focus). One, at most two, per frame.
22
+
23
+ render: node tools/wireframe.mjs videos/<slug> (all + _sheet.png)
24
+ ============================================================ -->
25
+ <style>
26
+ /* ===== tokens: match the Style in motion.md ===== */
27
+ :root{
28
+ --bg:#F5F5F3; /* the style's background (dark → dark) */
29
+ --gray:#D6D6D2; /* blocks */
30
+ --gray-text:#8E8E8A; /* text and lines */
31
+ --focus:#E8452C; /* the style's accent color */
32
+ --sans:"Schibsted Grotesk","Helvetica Neue",Helvetica,Arial,sans-serif;
33
+ --margin:4.5vw; /* sides and bottom */
34
+ --margin-top:calc(var(--margin) * 1.2); /* top 20 % larger (top safe area) */
35
+ --caption-zone:19vh; /* 9:16: captions live here */
36
+ }
37
+ /* dark style: swap the three above, for example
38
+ --bg:#111; --gray:#2E2E2E; --gray-text:#7A7A7A; */
39
+
40
+ /* ===== base (do not edit) ===== */
41
+ html,body{ margin:0; background:var(--bg); font-family:var(--sans); }
42
+ .frame{ position:relative; width:100vw; height:100vh; overflow:hidden; background:var(--bg); }
43
+ .canvas{
44
+ position:absolute; inset:0 0 var(--caption-zone) 0; padding:var(--margin-top) var(--margin) var(--margin); box-sizing:border-box;
45
+ display:flex; flex-direction:column; justify-content:center; gap:3vh;
46
+ }
47
+ @media (min-aspect-ratio:1/1){ :root{ --caption-zone:0px; } }
48
+ /* where the captions will sit, hatched (9:16 only) */
49
+ @media (max-aspect-ratio:1/1){
50
+ .frame::after{
51
+ content:""; position:absolute; left:0; right:0; bottom:0; height:var(--caption-zone);
52
+ background:repeating-linear-gradient(-45deg, transparent 0 14px, color-mix(in srgb, var(--gray-text) 18%, transparent) 14px 16px);
53
+ }
54
+ }
55
+
56
+ /* solid block: image, card, screen, icon, logo */
57
+ .block{ background:var(--gray); border-radius:1.2vw; }
58
+ /* empty frame: window, border-only card */
59
+ .outline{ border:0.4vw solid var(--gray); border-radius:1.2vw; box-sizing:border-box; }
60
+ /* real words (title, number, label): size goes inline */
61
+ .text{ color:var(--gray-text); font-weight:700; line-height:1.1; margin:0; }
62
+ /* supporting text without the words: gray lines */
63
+ .lines{ height:calc(var(--n, 3) * 3.2vh); background:repeating-linear-gradient(var(--gray) 0 1.6vh, transparent 1.6vh 3.2vh); }
64
+ /* label inside a block: "logo typesafe", "print do chatgpt" */
65
+ .label{ display:grid; place-items:center; font:500 2.4vw/1.2 var(--sans); color:var(--gray-text); text-align:center; }
66
+
67
+ /* what has the most contrast or focus leaves the gray */
68
+ .block.focus{ background:var(--focus); }
69
+ .outline.focus{ border-color:var(--focus); }
70
+ .text.focus{ color:var(--focus); }
71
+ .block.focus .label, .block.focus.label{ color:var(--bg); }
72
+
73
+ /* the motion, in one line: "→ entra da direita", "conta 0 → 92%" (optional, one per frame) */
74
+ .note{
75
+ position:absolute; font:500 2.2vw/1.3 ui-monospace,Menlo,monospace; color:var(--gray-text);
76
+ border:2px dashed var(--gray-text); border-radius:0.8vw; padding:0.6vw 1.2vw; background:var(--bg);
77
+ }
78
+
79
+ /* ===== frames: one per scene ===== */
80
+ </style>
81
+ </head>
82
+ <body>
83
+
84
+ <!-- omnivideo:frames -->
85
+
86
+ <script>
87
+ /* signal for the renderer: only after fonts */
88
+ document.fonts.ready.then(() => { window.__ready = true; });
89
+ </script>
90
+ </body>
91
+ </html>