@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,245 @@
1
+ /* ElevenLabs design system tokens, extracted from the app (elevenlabs.io/app) and the
2
+ landing (elevenlabs.io) on 2026-10-13. Two layers:
3
+
4
+ 1. --el-* the raw value, as ElevenLabs publishes it (their names and numbers);
5
+ 2. the rest the names the studio's partials use (--bg, --text, …),
6
+ pointing at layer 1.
7
+
8
+ Changing the studio's look means changing the layer 2 map. The font is our only
9
+ decision: Schibsted Grotesk instead of Inter (app) and Waldenburg
10
+ (landing). Docs in design-system.md. */
11
+
12
+ :root {
13
+ color-scheme: light;
14
+
15
+ /* --- layer 1: raw --------------------------------------------------------------- */
16
+
17
+ /* app neutrals: pure HSL gray scale (no hue) and the alpha scale over white */
18
+ --el-gray-50: #fafafa;
19
+ --el-gray-75: #ededed;
20
+ --el-gray-100: #e3e3e3;
21
+ --el-gray-150: #d9d9d9;
22
+ --el-gray-200: #cfcfcf;
23
+ --el-gray-250: #c2c2c2;
24
+ --el-gray-300: #b8b8b8;
25
+ --el-gray-350: #adadad;
26
+ --el-gray-400: #a3a3a3;
27
+ --el-gray-450: #969696;
28
+ --el-gray-500: #8c8c8c;
29
+ --el-gray-550: #808080;
30
+ --el-gray-600: #757575;
31
+ --el-gray-650: #696969;
32
+ --el-gray-700: #5c5c5c;
33
+ --el-gray-750: #525252;
34
+ --el-gray-800: #454545;
35
+ --el-gray-850: #3b3b3b;
36
+ --el-gray-900: #2e2e2e;
37
+ --el-gray-925: #212121;
38
+ --el-gray-950: #171717;
39
+
40
+ --el-alpha-50: #00000005;
41
+ --el-alpha-75: #00000008;
42
+ --el-alpha-100: #0000000b;
43
+ --el-alpha-150: #00000013;
44
+ --el-alpha-200: #0000001a;
45
+ --el-alpha-250: #00000022;
46
+ --el-alpha-300: #00000029;
47
+ --el-alpha-350: #00000041;
48
+ --el-alpha-400: #00000059;
49
+ --el-alpha-450: #00000070;
50
+ --el-alpha-500: #00000087;
51
+ --el-alpha-550: #00000095;
52
+ --el-alpha-600: #000000a4;
53
+ --el-alpha-700: #000000b6;
54
+ --el-alpha-800: #000000cd;
55
+ --el-alpha-900: #000000db;
56
+
57
+ /* app semantics (light theme) */
58
+ --el-background: #ffffff; /* hsl(0 0% 100%) */
59
+ --el-background-alt: #fcfcfc; /* hsl(0 0% 99%) */
60
+ --el-foreground: #0f0f10; /* hsl(240 3% 6%) — also the primary button background */
61
+ --el-primary: #2e2e2e; /* hsl(0 0% 18%) */
62
+ --el-secondary: var(--el-alpha-500); /* secondary text: black 53% */
63
+ --el-subtle: var(--el-alpha-450); /* tertiary text: black 44% */
64
+ --el-muted: var(--el-alpha-100); /* soft background: black 4.3% */
65
+ --el-accent: #e3e3e3; /* hsl(0 0% 89%) */
66
+ --el-border: var(--el-alpha-150); /* default line: black 7.5% */
67
+ --el-border-control: var(--el-alpha-200); /* button and chip outline: black 10% */
68
+ --el-input: #e5e7eb; /* hsl(220 13% 91%) */
69
+ --el-ring: #030712; /* hsl(224 71% 4%) */
70
+ --el-destructive: #ef4444; /* hsl(0 84% 60%) */
71
+ --el-card: #ffffff;
72
+ --el-popover: #ffffff;
73
+
74
+ --el-sidebar-bg: #fafafa; /* hsl(0 0% 98%) */
75
+ --el-sidebar-fg: #3f3f46; /* hsl(240 5% 26%) */
76
+ --el-sidebar-accent: #f4f4f5; /* hsl(240 5% 96%) */
77
+ --el-sidebar-border: #e5e7eb; /* hsl(220 13% 91%) */
78
+ --el-nav-active-bg: rgb(0 0 0 / 0.043);
79
+ --el-nav-active-text: #171717;
80
+
81
+ /* data color (charts): used here as state */
82
+ --el-chart-success: #00cc44; /* hsl(140 100% 40%) */
83
+ --el-chart-primary: #0548ff; /* hsl(224 100% 51%) */
84
+ --el-marker-input: rgb(231 110 0); /* flows: input marker */
85
+ --el-marker-output: rgb(130 158 0); /* flows: output marker */
86
+ --el-audio-tag: hsl(293 53% 52%); /* audio tag, v3 model */
87
+ --el-audio-tag-v4: hsl(6.7 95.3% 66.9%);
88
+
89
+ /* toast: always dark, in both themes */
90
+ --el-toast-surface: hsl(0 0% 13% / 0.85);
91
+ --el-toast-title: hsl(0 0% 98%);
92
+ --el-toast-description: #ffffffb6;
93
+ --el-toast-divider: #ffffff22;
94
+
95
+ /* landing (elevenlabs.io): warm, lighter, pill buttons */
96
+ --el-land-bg: #fdfcfc;
97
+ --el-land-surface: #f5f3f1;
98
+ --el-land-surface-2: #ebe8e4;
99
+ --el-land-text: #000000;
100
+ --el-land-text-2: #44403b;
101
+ --el-land-border: #e5e5e5;
102
+ --el-land-orange: #ff4704;
103
+ --el-land-blue: #0447ff;
104
+
105
+ /* radii (app scale) */
106
+ --el-radius-sm: 2px;
107
+ --el-radius: 4px;
108
+ --el-radius-md: 6px;
109
+ --el-radius-lg: 8px;
110
+ --el-radius-xl: 12px;
111
+ --el-radius-2xl: 16px;
112
+ --el-radius-3xl: 24px;
113
+ --el-radius-full: 9999px;
114
+ --el-radius-nav: 10px; /* sidebar item, tab, small button */
115
+ --el-radius-control: 12px; /* large button, chip, field, filter */
116
+
117
+ /* typography: size/line height, weight. The app's Inter and the landing's Waldenburg
118
+ become the studio font (--sans). */
119
+ --el-text-hero: 28px; /* "what do you want to create" title, weight 400, ls −0.21px */
120
+ --el-text-title: 24px; /* card title, weight 400 */
121
+ --el-text-section: 16px; /* section header, weight 550 */
122
+ --el-text-ui: 14px; /* button, menu item, tab, weight 500, line 20px */
123
+ --el-text-small: 13px; /* small button, weight 500 */
124
+ --el-text-caption: 12px; /* table header, label, weight 400, line 16px */
125
+
126
+ /* app measures */
127
+ --el-sidebar-w: 255px; /* the item takes 231px: 12px of space on each side */
128
+ --el-nav-item-h: 32px;
129
+ --el-column: 706px; /* the central column of simple pages */
130
+ --el-button-h: 36px; /* 40px on the page action buttons */
131
+ --el-table-row-h: 36px;
132
+ --el-switch: 36px 20px;
133
+
134
+ /* --- layer 2: the studio names ------------------------------------------------ */
135
+ --bg: var(--el-background);
136
+ --surface: var(--el-card);
137
+ --surface-2: #f4f4f4; /* black 4.3% over white, solid */
138
+ --surface-3: #ececec; /* black 7.5% over white, solid */
139
+ --border: var(--el-border);
140
+ --border-strong: var(--el-border-control);
141
+ /* background of borderless pieces: alpha, so muted inside muted darkens one step */
142
+ --muted: var(--el-muted); /* black 4.3 % */
143
+ --muted-hover: var(--el-border); /* black 7.5 % */
144
+ /* background of pieces (cards, rows) over the content, which is muted: same as the sidebar */
145
+ --block-bg: var(--bg);
146
+ --text: var(--el-foreground);
147
+ --text-2: var(--el-secondary);
148
+ --text-3: var(--el-subtle);
149
+
150
+ /* states: the green and the blue come from ElevenLabs' chart colors (same hue);
151
+ amber does not exist in the app beyond the toast, so it is the toast-warning hue */
152
+ --ok: #00a336;
153
+ --emerald: #059669;
154
+ --warning: #c2610c;
155
+ --error: var(--el-destructive);
156
+ /* working (Claude, the queue, a running stage) is black, not blue */
157
+ --running: var(--el-foreground);
158
+ --ok-bg: rgb(0 204 68 / 0.1);
159
+ --warning-bg: rgb(245 158 11 / 0.12);
160
+ --error-bg: rgb(239 68 68 / 0.1);
161
+ --running-bg: rgb(0 0 0 / 0.06);
162
+ /* Claude's window, while it works: orange */
163
+ --claude: #e8751a;
164
+ --claude-bg: rgb(232 117 26 / 0.13);
165
+ /* chart series (chart.tsx, like shadcn's --chart-N): the first is the theme primary
166
+ (black in light, near white in dark); the others follow the dataviz skill's reference
167
+ palette: orange, aqua, yellow, magenta (the last three below 3:1 on white: always go
168
+ with a label or table) */
169
+ --chart-1: var(--el-primary);
170
+ --chart-2: #eb6834;
171
+ --chart-3: #1baf7a;
172
+ --chart-4: #eda100;
173
+ --chart-5: #e87ba4;
174
+ --log-bg: var(--el-background-alt);
175
+
176
+ --action: var(--el-foreground);
177
+ --action-text: #ffffff;
178
+ --action-hover: var(--el-primary);
179
+ --title-muted: var(--el-alpha-450);
180
+
181
+ --radius: var(--el-radius-xl); /* panels and cards: 12 */
182
+ --radius-sm: var(--el-radius-lg); /* inner pieces: 8 */
183
+ /* the content panel height: the window minus the 8 px margin on both sides */
184
+ --content-height: calc(100vh - 16px - var(--banner, 0px));
185
+ --top-offset: 0px; /* no top bar: the sticky and min-height rules using --top-offset start from zero */
186
+ --menu-width: var(--el-sidebar-w);
187
+ --column: 1320px;
188
+
189
+ --sans: "Schibsted Grotesk", "Helvetica Neue", Arial, sans-serif;
190
+ --serif: var(--sans);
191
+ --mono: "Geist Mono", "JetBrains Mono", ui-monospace, Menlo, monospace;
192
+ }
193
+
194
+ /* Dark theme: the values of the app's `.dark`. ElevenLabs mirrors the alpha scale
195
+ in white (lighten-N = darken-N), so secondary, tertiary and border keep the
196
+ same steps. */
197
+ @media (prefers-color-scheme: dark) {
198
+ :root {
199
+ color-scheme: dark;
200
+ --el-background: #0f0f10; /* hsl(240 3% 6%) */
201
+ --el-background-alt: #0b0b0c;
202
+ --el-foreground: #ffffff;
203
+ --el-primary: #f9fafb; /* hsl(210 20% 98%) */
204
+ --el-secondary: #ffffffa4; /* lighten-600 */
205
+ --el-subtle: #ffffff87; /* lighten-500 */
206
+ --el-muted: #ffffff0b; /* lighten-100 */
207
+ --el-accent: #1f2937; /* hsl(215 28% 17%) */
208
+ --el-border: #ffffff13; /* gray-alpha-150 */
209
+ --el-border-control: #ffffff1a;
210
+ --el-input: #1f2937;
211
+ --el-ring: #d1d5db;
212
+ --el-destructive: #ff6b6b;
213
+ --el-card: #0f0f10;
214
+ --el-popover: #111827; /* --tw-gray-900 (Tailwind scale) */
215
+ --el-sidebar-bg: #18181b; /* hsl(240 6% 10%) */
216
+ --el-sidebar-fg: #f4f4f5;
217
+ --el-sidebar-accent: #27272a; /* hsl(240 4% 16%) */
218
+ --el-sidebar-border: #27272a;
219
+ --el-nav-active-bg: #ffffff1a;
220
+ --el-nav-active-text: #ffffff;
221
+
222
+ --surface-2: #18181b;
223
+ --surface-3: #27272a;
224
+ --ok: #3ddc6b;
225
+ --emerald: #34d399;
226
+ --warning: #fda05e;
227
+ --running: #f4f4f5;
228
+ --ok-bg: rgb(0 204 68 / 0.16);
229
+ --warning-bg: rgb(252 122 55 / 0.15);
230
+ --error-bg: rgb(255 107 107 / 0.14);
231
+ --running-bg: rgb(255 255 255 / 0.12);
232
+ --claude: #f59a4d;
233
+ --claude-bg: rgb(245 154 77 / 0.18);
234
+ /* the dark steps of the same palette, validated on #0f0f10 */
235
+ --chart-1: var(--el-primary);
236
+ --chart-2: #d95926;
237
+ --chart-3: #199e70;
238
+ --chart-4: #c98500;
239
+ --chart-5: #d55181;
240
+ --log-bg: #0b0b0c;
241
+ --action: #ffffff;
242
+ --action-text: #0f0f10;
243
+ --action-hover: #e5e5e5;
244
+ }
245
+ }
@@ -0,0 +1,2 @@
1
+ /* Response types of the studio API, kept in shared/types (the server produces them too). */
2
+ export type * from "../../shared/types/api";
@@ -0,0 +1,9 @@
1
+ /* image files imported through Bun's bundler: the value is the file URL */
2
+ declare module "*.svg" {
3
+ const url: string;
4
+ export default url;
5
+ }
6
+ declare module "*.png" {
7
+ const url: string;
8
+ export default url;
9
+ }
@@ -0,0 +1,27 @@
1
+ # Brief · <slug>
2
+
3
+ ## Pedido
4
+
5
+ > Cole aqui o pedido do usuário, palavra por palavra.
6
+
7
+ ## Material
8
+
9
+ - `source/…` — o que é, de onde veio
10
+ - fontes externas consultadas: `source/sources.md`
11
+
12
+ ## Parâmetros
13
+
14
+ | | valor | de onde veio |
15
+ |---|---|---|
16
+ | entregas | vídeo · carrossel · os dois | padrão (vídeo) / pedido |
17
+ | formato | 9:16 · 1080×1920 · 30 fps | padrão / pedido |
18
+ | duração alvo | 35–60 s | padrão / pedido |
19
+ | voz | perfil "Pedro" | config |
20
+ | público | dev e criador que usa IA no trabalho | padrão / pedido |
21
+ | tese | uma frase: o que quem assiste leva | |
22
+ | CTA | seguir o canal | padrão / pedido |
23
+
24
+ ## Restrições
25
+
26
+ O que não pode aparecer, o que não pode ser dito, dados que precisam de
27
+ confirmação.
@@ -0,0 +1,204 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>captions</title>
6
+ <!-- ============================================================
7
+ omnivideo CAPTION LAYER. Filled in by tools/captions.mjs: it replaces
8
+ the data marker (captions, position, safe areas) and pastes the video's
9
+ motion/src/_captions.css, if any, at the end of the <style>.
10
+
11
+ Transparent background: render.mjs grabs one frame per caption (--frames
12
+ --alpha) and assemble.mjs overlays each one at its time. The frame at t
13
+ depends only on t: the caption with start <= t < end shows.
14
+
15
+ Position (tools/captions.mjs): an anchor of the 3×3 grid pinned to the
16
+ platform's safe area (with the video's `safe` adjustments on top), plus
17
+ x/y in frame px; video → scene → caption. The caption goes wherever x/y
18
+ says, even outside the safe area (only the frame itself limits it); when
19
+ it crosses, it gets data-outside and the preview says by how much and on
20
+ which side.
21
+
22
+ Color, outline and shadow (color, background, outline*, shadow_*): the
23
+ same three levels as position. Only what was adjusted becomes an inline
24
+ style; the rest keeps the style's CSS (and the video's _captions.css).
25
+
26
+ Style (reference/captions.md): Schibsted Grotesk Bold, one line, dark
27
+ text on a translucent white pill ("pill") or white with a shadow
28
+ ("shadow").
29
+
30
+ ?t=2.4 freezes at that instant
31
+ ?preview=1 shows the safe area and accepts postMessage({ position }) from the studio
32
+ ============================================================ -->
33
+ <style>
34
+ :root{
35
+ --t:0s;
36
+ --sans:"Schibsted Grotesk","Helvetica Neue",Helvetica,Arial,sans-serif;
37
+ --body-size:4.4vw; /* 47 px at 1080 wide: 28 characters fit every safe area */
38
+ --ink:#111;
39
+ --pill:rgba(255,255,255,0.9);
40
+ --pill-shadow:0 0.4vw 2.4vw rgba(0,0,0,0.18);
41
+ }
42
+ :root[data-format="16:9"]{ --body-size:2.4vw; }
43
+
44
+ html,body{ margin:0; width:100vw; height:100vh; overflow:hidden; background:transparent; }
45
+
46
+ .caption{
47
+ position:absolute; left:0; top:0;
48
+ display:none;
49
+ box-sizing:border-box;
50
+ font:700 var(--body-size)/1.18 var(--sans);
51
+ letter-spacing:-0.01em;
52
+ text-align:center;
53
+ white-space:nowrap;
54
+ }
55
+ .caption.active{ display:block; }
56
+ .preview .caption.hidden{ opacity:0.3; }
57
+ .caption.wrap{ white-space:normal; text-wrap:balance; }
58
+
59
+ [data-style="pill"] .caption{
60
+ color:var(--ink); background:var(--pill); box-shadow:var(--pill-shadow);
61
+ padding:0.32em 0.7em 0.36em; border-radius:0.62em;
62
+ }
63
+ [data-style="shadow"] .caption{
64
+ color:#fff;
65
+ text-shadow:0 0.04em 0.12em rgba(0,0,0,0.55), 0 0 0.6em rgba(0,0,0,0.35);
66
+ }
67
+
68
+ /* studio preview only: what falls outside the safe area */
69
+ .safe{ position:absolute; display:none; pointer-events:none; box-shadow:0 0 0 100vmax rgba(220,40,40,0.16); outline:0.25vw dashed rgba(220,40,40,0.8); }
70
+ .preview .safe{ display:block; }
71
+ .preview .caption[data-outside]{ outline:0.3vw solid #e5601e; outline-offset:0.4vw; }
72
+ /*omnivideo:video-style*/
73
+ </style>
74
+ </head>
75
+ <body>
76
+ <div class="safe" id="safe"></div>
77
+
78
+ <script>
79
+ const DATA = /*omnivideo:data*/{ "w": 1080, "h": 1920,
80
+ "safes": { "all": { "top": 0.15, "bottom": 0.35, "left": 0.111, "right": 0.178 } },
81
+ "position": { "platform": "all", "anchor": "bottom-center", "x": 0, "y": 0 },
82
+ "keys": ["anchor", "x", "y", "color", "background", "background_opacity", "outline", "outline_color", "shadow_color", "shadow_opacity", "shadow_blur", "shadow_x", "shadow_y"],
83
+ "defaults": { "pill": { "color": "#111111", "background": "#ffffff", "background_opacity": 0.9, "outline": 0, "outline_color": "#000000", "shadow_color": "#000000", "shadow_opacity": 0.18, "shadow_blur": 26, "shadow_x": 0, "shadow_y": 4 } },
84
+ "captions": [{ "id": "f01.1", "scene": "c01", "s": 0, "e": 9, "text": "Uma legenda de exemplo" }] };
85
+
86
+ const q = new URLSearchParams(location.search);
87
+ const preview = q.has("preview");
88
+ if (preview) document.body.classList.add("preview");
89
+
90
+ const nodes = DATA.captions.map(c => {
91
+ const el = document.createElement("div");
92
+ /* "legenda" = legacy class, so a per-video _captions.css written before the rename still matches */
93
+ el.className = "caption legenda";
94
+ el.textContent = c.text;
95
+ el.dataset.id = c.id;
96
+ document.body.appendChild(el);
97
+ return el;
98
+ });
99
+
100
+ /* frame px → page px (the renderer opens the page at frame size; the preview, smaller) */
101
+ const scale = () => window.innerWidth / DATA.w;
102
+
103
+ /* the platform's safe area, with the sides the video adjusted (`position.safe`) on top */
104
+ function safeFraction() {
105
+ const p = DATA.position;
106
+ const base = DATA.safes[p.platform] ?? Object.values(DATA.safes)[0] ?? { top: 0, bottom: 0, left: 0, right: 0 };
107
+ const adj = Object.fromEntries(["top", "bottom", "left", "right"].filter(k => Number.isFinite(p.safe?.[k])).map(k => [k, p.safe[k]]));
108
+ return { ...base, ...adj };
109
+ }
110
+
111
+ function safeRect() {
112
+ const s = safeFraction();
113
+ const W = window.innerWidth, H = window.innerHeight;
114
+ return { l: s.left * W, r: W - s.right * W, t: s.top * H, b: H - s.bottom * H };
115
+ }
116
+
117
+ /* video → scene → caption */
118
+ function config(c) {
119
+ const p = DATA.position;
120
+ const pick = o => Object.fromEntries(DATA.keys.filter(k => o?.[k] != null).map(k => [k, o[k]]));
121
+ return { anchor: "bottom-center", x: 0, y: 0, ...pick(p), ...pick(p.scenes?.[c.scene]), ...pick(p.individual?.[c.id]) };
122
+ }
123
+
124
+ const rgba = (hex, a) => { const n = parseInt(String(hex).slice(1), 16) || 0; return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})`; };
125
+
126
+ /* color, outline and shadow: only what the video adjusted becomes an inline style */
127
+ function applyStyle(el, c) {
128
+ const style = document.documentElement.dataset.style || "pill";
129
+ const d = DATA.defaults?.[style] ?? {};
130
+ const k = scale();
131
+ const has = (...ks) => ks.some(x => c[x] != null);
132
+ const v = x => c[x] ?? d[x];
133
+ const s = el.style;
134
+ s.color = c.color ?? "";
135
+ s.background = style === "pill" && has("background", "background_opacity") ? rgba(v("background"), v("background_opacity")) : "";
136
+ /* the stroke grows to both sides of the edge; painted before the fill, only the outer half shows */
137
+ const stroke = has("outline", "outline_color") && v("outline") > 0;
138
+ s.webkitTextStroke = stroke ? `${v("outline") * 2 * k}px ${v("outline_color")}` : "";
139
+ s.paintOrder = stroke ? "stroke fill" : "";
140
+ const shadow = has("shadow_color", "shadow_opacity", "shadow_blur", "shadow_x", "shadow_y")
141
+ ? `${v("shadow_x") * k}px ${v("shadow_y") * k}px ${v("shadow_blur") * k}px ${rgba(v("shadow_color"), v("shadow_opacity"))}` : "";
142
+ s.boxShadow = style === "pill" ? shadow : "";
143
+ s.textShadow = style === "shadow" ? shadow : "";
144
+ }
145
+
146
+ function place(el, c) {
147
+ const cfg = config(c);
148
+ applyStyle(el, cfg);
149
+ const [row, col] = String(cfg.anchor).split("-");
150
+ const s = safeRect();
151
+ el.classList.remove("wrap");
152
+ el.style.maxWidth = "";
153
+ if (el.offsetWidth > s.r - s.l) { el.classList.add("wrap"); el.style.maxWidth = `${s.r - s.l}px`; }
154
+ const w = el.offsetWidth, h = el.offsetHeight, k = scale();
155
+ let x = col === "left" ? s.l : col === "right" ? s.r - w : (s.l + s.r) / 2 - w / 2;
156
+ let y = row === "top" ? s.t : row === "middle" ? (s.t + s.b) / 2 - h / 2 : s.b - h;
157
+ x += (+cfg.x || 0) * k;
158
+ y += (+cfg.y || 0) * k;
159
+ /* only the frame limits: the caption goes where x/y sent it, inside or outside the safe area */
160
+ const W = window.innerWidth, H = window.innerHeight;
161
+ const cx = Math.min(Math.max(x, 0), Math.max(W - w, 0)), cy = Math.min(Math.max(y, 0), Math.max(H - h, 0));
162
+ const over = { top: s.t - cy, bottom: cy + h - s.b, left: s.l - cx, right: cx + w - s.r };
163
+ const sides = Object.entries(over).filter(([, v]) => v > 0.5).map(([side, v]) => ({ side, px: Math.round(v / k) }));
164
+ const outside = sides.length > 0;
165
+ el.toggleAttribute("data-outside", outside);
166
+ el.style.transform = `translate(${cx}px, ${cy}px)`;
167
+ return { id: c.id, outside, sides, x: Math.round(cx / k), y: Math.round(cy / k), w: Math.round(w / k), h: Math.round(h / k) };
168
+ }
169
+
170
+ const readT = () => parseFloat(document.documentElement.style.getPropertyValue("--t")) || 0;
171
+ function show() {
172
+ const t = readT();
173
+ const i = DATA.captions.findIndex(c => t >= c.s && t < c.e);
174
+ /* turned off (`individual.<id>.hidden`): the render skips it; the preview shows it faded, so it can still be seen and turned on */
175
+ const off = c => !!DATA.position.individual?.[c.id]?.hidden;
176
+ nodes.forEach((el, k) => {
177
+ el.classList.toggle("active", k === i && (preview || !off(DATA.captions[k])));
178
+ el.classList.toggle("hidden", preview && off(DATA.captions[k]));
179
+ });
180
+ const s = safeRect();
181
+ Object.assign(document.getElementById("safe").style, { left: `${s.l}px`, top: `${s.t}px`, width: `${s.r - s.l}px`, height: `${s.b - s.t}px` });
182
+ const box = i >= 0 ? place(nodes[i], DATA.captions[i]) : null;
183
+ if (preview && window.parent !== window) window.parent.postMessage({ type: "caption", box }, "*");
184
+ }
185
+ new MutationObserver(show).observe(document.documentElement, { attributes: true, attributeFilter: ["style"] });
186
+
187
+ /* preview: the studio sends the position being edited and the instant, without reloading */
188
+ if (preview) {
189
+ window.addEventListener("message", e => {
190
+ if (e.source !== window.parent || !e.data) return;
191
+ if (e.data.position) DATA.position = e.data.position;
192
+ if (e.data.style) document.documentElement.dataset.style = e.data.style;
193
+ /* the same --t doesn't fire the observer: place again anyway */
194
+ if (e.data.t != null) document.documentElement.style.setProperty("--t", e.data.t + "s");
195
+ show();
196
+ });
197
+ window.addEventListener("resize", show);
198
+ }
199
+
200
+ if (q.has("t")) document.documentElement.style.setProperty("--t", q.get("t") + "s");
201
+ document.fonts.ready.then(() => { show(); window.__ready = true; });
202
+ </script>
203
+ </body>
204
+ </html>
@@ -0,0 +1,47 @@
1
+ # Composição do carrossel · <título>
2
+
3
+ Formato: 4:5, 1080×1350 (todos os slides).
4
+ Slide "salvável": `sNN`, <o slide que a pessoa volta para ver: a lista, a tabela, o passo a passo>.
5
+
6
+ ## Estilo visual
7
+
8
+ Um estilo visual da biblioteca, `referencias/<pasta>` (veja `node tools/reference.mjs list`),
9
+ ou o estilo do vídeo da pasta (`motion.md`) quando o carrossel nasce dele. O que vem
10
+ dele é princípio, não asset.
11
+
12
+ | | |
13
+ |---|---|
14
+ | por que este | o que ele tem que este carrossel precisa |
15
+ | vale levar | os itens do guia que entram aqui, cada um como regra |
16
+ | traduzido | o que é movimento no estilo visual e vira parado aqui (ex.: "monta em degraus" → as células apagadas visíveis em volta das acesas) |
17
+ | não copiar | marca, dados, layout literal |
18
+
19
+ ## Estilo do carrossel
20
+
21
+ Vale para todos os slides e mora em `carousel/src/_common.html` (tokens,
22
+ fundo, moldura).
23
+
24
+ | | escolha |
25
+ |---|---|
26
+ | fundo | cor ou textura; se for panorama, o que atravessa a emenda e onde |
27
+ | paleta | 2 a 3 cores, com papel de cada uma |
28
+ | tipografia | Schibsted Grotesk; corpos em px para 1080 de largura: título, corpo, rótulo (corpo ≥ 34 px, nada abaixo de 26 px) |
29
+ | moldura | o que se repete em todo slide: contador `03/08`, marca do canal, deixa de arrasto (→) |
30
+ | margens | laterais ≥ 88 px, topo e base ≥ 104 px; texto nunca a menos de 64 px da borda |
31
+ | objetos | um desenho para cada coisa que aparece mais de uma vez |
32
+
33
+ ## Slides
34
+
35
+ | slide | papel | herói | o que está na tela |
36
+ |---|---|---|---|
37
+ | s01 | capa | | |
38
+ | s02 | conteúdo | | |
39
+ | sNN | cta | | |
40
+
41
+ ---
42
+
43
+ ## s01 · <título>
44
+
45
+ **Herói:** o único elemento em destaque total.
46
+ **Apoio:** o que cede o palco.
47
+ **Composição:** onde fica cada coisa.
@@ -0,0 +1,60 @@
1
+ # Roteiro do carrossel · <título>
2
+
3
+ | formato | slides | palavras (sem a capa) | origem |
4
+ |---|---|---|---|
5
+ | 4:5 · 1080×1350 | 8 | 0 | roteiro · material · vídeo `scenes.json` |
6
+
7
+ **Tese:** uma frase.
8
+
9
+ ## Estratégia
10
+
11
+ | | |
12
+ |---|---|
13
+ | pilar | um dos pilares do `channel/playbook.md` |
14
+ | objetivo | salvamento · compartilhamento · seguidor · lead (um só) |
15
+ | métrica que julga | salvos · compartilhamentos · seguidores · comentários e DMs do omnichat |
16
+ | para quem | quem para de rolar o feed, numa linha |
17
+ | promessa | o que a pessoa leva se arrastar até o fim |
18
+ | pergunta que segura | o que a capa abre e só o penúltimo slide responde |
19
+ | CTA | o que o objetivo pede, no último slide e na legenda |
20
+
21
+ ## Capas
22
+
23
+ | | título (3 a 8 palavras) | visual da capa | tipo |
24
+ |---|---|---|---|
25
+ | **A · escolhida** | | o herói da capa, legível na miniatura do feed | risco · resultado · contradição · número · lista · pergunta concreta |
26
+ | B | | | |
27
+ | C | | | |
28
+
29
+ **Por que a A:** uma frase, com o que o playbook e as métricas mostram.
30
+
31
+ ---
32
+
33
+ ## s01 · Capa
34
+
35
+ **Ideia:** a capa A.
36
+ **Na tela:** título · subtítulo (opcional, até 8 palavras) · deixa de arrasto.
37
+
38
+ ## s02 · <ideia>
39
+
40
+ **Ideia:** uma linha; termina puxando o próximo slide.
41
+ **Na tela:**
42
+
43
+ > Título do slide (até 8 palavras).
44
+ >
45
+ > Corpo: até 30 palavras, uma ideia.
46
+
47
+ **Fonte:** `source/…` (todo fato com número, nome ou data)
48
+
49
+ ## sNN · CTA
50
+
51
+ **Ideia:** o CTA do objetivo.
52
+ **Na tela:** o pedido, numa frase, e o que a pessoa ganha fazendo.
53
+
54
+ ---
55
+
56
+ ## Legenda do post
57
+
58
+ O texto que sobe com o carrossel (vai para `caption` no `carousel.json`): a
59
+ primeira linha repete a promessa da capa com outras palavras, duas ou três
60
+ linhas de contexto, o CTA. Hashtags fixas vêm de `publish.text` da config.