@hypit/hypit 0.1.4 → 0.1.6

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 (462) hide show
  1. package/README.md +4 -2
  2. package/dist/public/caption.d.ts +206 -183
  3. package/dist/public/composition.d.ts +25 -3
  4. package/dist/public/endpoint-kit.d.ts +24 -2
  5. package/dist/public/generation.d.ts +5 -1
  6. package/dist/public/hyperframes.d.ts +19 -1
  7. package/dist/public/narrative.d.ts +17 -3
  8. package/dist/public/performance.d.ts +1590 -0
  9. package/dist/public/program-space.d.ts +179 -32
  10. package/dist/public/runtime-kit.d.ts +21 -8
  11. package/dist/public/sound.d.ts +822 -0
  12. package/dist/public/speech.d.ts +41 -0
  13. package/dist/public/studio-adapter.d.ts +77 -15
  14. package/dist/public/temporal-markup.d.ts +9 -44
  15. package/dist/public/temporal.d.ts +37 -28
  16. package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
  17. package/examples/README.md +18 -10
  18. package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
  19. package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
  20. package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
  21. package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
  22. package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
  23. package/examples/provider-package/README.md +78 -0
  24. package/examples/provider-package/hypit.runtime.json +12 -0
  25. package/examples/provider-package/packages/provider-images/package.json +11 -0
  26. package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
  27. package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
  28. package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
  29. package/examples/semantic-composition/README.md +8 -1
  30. package/examples/semantic-composition/chat.svml +6 -5
  31. package/examples/semantic-composition/hypit.runtime.json +1 -1
  32. package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
  33. package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
  34. package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
  35. package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
  36. package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
  37. package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
  38. package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
  39. package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
  40. package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
  41. package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
  42. package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
  43. package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
  44. package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
  45. package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
  46. package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
  47. package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
  48. package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
  49. package/package.json +35 -15
  50. package/packages/audio-track/README.md +20 -13
  51. package/packages/audio-track/package.json +1 -1
  52. package/packages/audio-track/src/component.ts +4 -4
  53. package/packages/audio-track/src/fragment.ts +6 -5
  54. package/packages/audio-track/src/index.ts +1 -1
  55. package/packages/audio-track/src/manifest.ts +17 -16
  56. package/packages/audio-track/src/program.ts +21 -25
  57. package/packages/audio-track/src/surface.ts +19 -18
  58. package/packages/audio-track-studio/README.md +23 -0
  59. package/packages/audio-track-studio/src/index.ts +28 -17
  60. package/packages/author-kit/README.md +1 -1
  61. package/packages/background-removal/README.md +4 -7
  62. package/packages/browser-capture/package.json +1 -1
  63. package/packages/build-result/README.md +11 -0
  64. package/packages/build-result/src/decode.ts +2 -0
  65. package/packages/build-result/src/execution-log.ts +17 -0
  66. package/packages/build-result/src/index.ts +1 -0
  67. package/packages/build-result/src/store.ts +14 -1
  68. package/packages/build-result/src/types.ts +3 -0
  69. package/packages/build-result-s3/src/repository.ts +4 -0
  70. package/packages/caption/README.md +61 -73
  71. package/packages/caption/package.json +3 -2
  72. package/packages/caption/src/activation.ts +2 -2
  73. package/packages/caption/src/component.ts +20 -5
  74. package/packages/caption/src/display.ts +3 -18
  75. package/packages/caption/src/fragment.ts +3 -7
  76. package/packages/caption/src/index.ts +6 -5
  77. package/packages/caption/src/manifest.ts +29 -46
  78. package/packages/caption/src/style.ts +24 -135
  79. package/packages/caption/src/surface.ts +12 -92
  80. package/packages/caption/src/temporalize.ts +18 -53
  81. package/packages/caption/src/types.ts +8 -35
  82. package/packages/caption/src/visibility.ts +23 -0
  83. package/packages/caption-fine/README.md +21 -9
  84. package/packages/caption-fine/package.json +4 -2
  85. package/packages/caption-fine/src/component.ts +3 -3
  86. package/packages/caption-fine/src/fragment.ts +7 -19
  87. package/packages/caption-fine/src/index.ts +2 -0
  88. package/packages/caption-fine/src/manifest.ts +26 -17
  89. package/packages/caption-fine/src/recipe.ts +7 -0
  90. package/packages/caption-fine/src/render.ts +14 -13
  91. package/packages/caption-fine/src/schedule.ts +39 -35
  92. package/packages/caption-fine/src/style.ts +10 -9
  93. package/packages/caption-fine/src/surface.ts +62 -35
  94. package/packages/caption-fine/src/types.ts +2 -0
  95. package/packages/caption-fine-studio/README.md +24 -2
  96. package/packages/caption-fine-studio/package.json +3 -1
  97. package/packages/caption-fine-studio/src/activation.ts +3 -3
  98. package/packages/caption-fine-studio/src/index.ts +54 -42
  99. package/packages/cli/README.md +57 -4
  100. package/packages/cli/package.json +1 -0
  101. package/packages/cli/src/arguments.ts +25 -6
  102. package/packages/cli/src/build-planning.ts +3 -2
  103. package/packages/cli/src/command.ts +6 -0
  104. package/packages/cli/src/commands/environment.ts +28 -18
  105. package/packages/cli/src/commands/execution.ts +81 -26
  106. package/packages/cli/src/commands/results.ts +7 -11
  107. package/packages/cli/src/index.ts +2 -2
  108. package/packages/cli/src/machine-view.ts +3 -2
  109. package/packages/cli/src/main.ts +34 -42
  110. package/packages/cli/src/observation.ts +7 -1
  111. package/packages/cli/src/output.ts +65 -23
  112. package/packages/cli/src/view.ts +66 -19
  113. package/packages/comment-sticker/README.md +3 -3
  114. package/packages/comment-sticker/package.json +1 -1
  115. package/packages/comment-sticker/src/component.ts +4 -4
  116. package/packages/comment-sticker/src/fragment.ts +5 -4
  117. package/packages/comment-sticker/src/manifest.ts +7 -6
  118. package/packages/comment-sticker/src/program.ts +9 -9
  119. package/packages/comment-sticker/src/surface.ts +6 -7
  120. package/packages/composition/README.md +21 -0
  121. package/packages/composition/src/audio-presentation.ts +44 -0
  122. package/packages/composition/src/index.ts +3 -0
  123. package/packages/composition/src/schema.ts +8 -3
  124. package/packages/composition/src/track.ts +15 -1
  125. package/packages/credential-store-env/README.md +1 -1
  126. package/packages/deck-track/README.md +3 -3
  127. package/packages/deck-track/package.json +1 -1
  128. package/packages/deck-track/src/component.ts +5 -5
  129. package/packages/deck-track/src/fragment.ts +6 -5
  130. package/packages/deck-track/src/lower.ts +12 -12
  131. package/packages/deck-track/src/manifest.ts +8 -7
  132. package/packages/deck-track/src/program.ts +13 -16
  133. package/packages/deck-track/src/surface.ts +9 -10
  134. package/packages/driver-node/src/driver.ts +41 -3
  135. package/packages/elevenlabs-speech/README.md +27 -0
  136. package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
  137. package/packages/elevenlabs-speech/src/activation.ts +26 -0
  138. package/packages/elevenlabs-speech/src/fragment.ts +11 -0
  139. package/packages/elevenlabs-speech/src/index.ts +111 -0
  140. package/packages/elevenlabs-speech/src/surface.ts +167 -0
  141. package/packages/endpoint-kit/README.md +24 -0
  142. package/packages/endpoint-kit/src/index.ts +7 -1
  143. package/packages/film/README.md +12 -7
  144. package/packages/film/package.json +1 -1
  145. package/packages/film/src/component.ts +4 -4
  146. package/packages/film/src/fragment.ts +6 -5
  147. package/packages/film/src/manifest.ts +11 -10
  148. package/packages/film/src/program.ts +5 -5
  149. package/packages/film/src/recipe.ts +2 -1
  150. package/packages/film/src/surface.ts +10 -7
  151. package/packages/film-studio/package.json +1 -1
  152. package/packages/film-studio/src/index.ts +2 -2
  153. package/packages/fishaudio-speech/README.md +33 -0
  154. package/packages/fishaudio-speech/package.json +21 -0
  155. package/packages/fishaudio-speech/src/activation.ts +32 -0
  156. package/packages/fishaudio-speech/src/fragment.ts +11 -0
  157. package/packages/fishaudio-speech/src/index.ts +156 -0
  158. package/packages/fishaudio-speech/src/surface.ts +192 -0
  159. package/packages/generation/README.md +11 -1
  160. package/packages/generation/src/mapping.ts +28 -30
  161. package/packages/gpt-image/README.md +1 -2
  162. package/packages/grok-imagine/README.md +1 -2
  163. package/packages/hyperframes/README.md +7 -3
  164. package/packages/hyperframes/src/browser-program.ts +11 -2
  165. package/packages/hyperframes/src/document.ts +15 -2
  166. package/packages/interview-emoji-reveal/README.md +4 -4
  167. package/packages/interview-emoji-reveal/package.json +1 -1
  168. package/packages/interview-emoji-reveal/src/component.ts +4 -4
  169. package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
  170. package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
  171. package/packages/interview-emoji-reveal/src/program.ts +14 -14
  172. package/packages/interview-emoji-reveal/src/surface.ts +8 -9
  173. package/packages/media-execution/README.md +7 -3
  174. package/packages/media-execution/src/audio-presentation.ts +23 -0
  175. package/packages/media-execution/src/execute.ts +2 -0
  176. package/packages/media-pipeline/README.md +7 -3
  177. package/packages/media-pipeline/src/audio-plan.ts +4 -1
  178. package/packages/media-pipeline/src/component.ts +16 -2
  179. package/packages/media-pipeline/src/manifest.ts +3 -1
  180. package/packages/media-pipeline/src/types.ts +2 -1
  181. package/packages/media-track/README.md +14 -47
  182. package/packages/media-track/package.json +1 -1
  183. package/packages/media-track/preview/preview.svml +5 -5
  184. package/packages/media-track/src/author.ts +12 -6
  185. package/packages/media-track/src/component.ts +10 -16
  186. package/packages/media-track/src/fragment.ts +8 -7
  187. package/packages/media-track/src/index.ts +3 -1
  188. package/packages/media-track/src/lower.ts +7 -7
  189. package/packages/media-track/src/manifest.ts +16 -38
  190. package/packages/media-track/src/program.ts +62 -67
  191. package/packages/media-track/src/sampling.ts +6 -6
  192. package/packages/media-track/src/sequence.ts +8 -8
  193. package/packages/media-track/src/surface.ts +25 -43
  194. package/packages/media-track-studio/README.md +9 -0
  195. package/packages/media-track-studio/src/index.ts +16 -11
  196. package/packages/mimo-speech/README.md +1 -1
  197. package/packages/minimax-h3/README.md +1 -1
  198. package/packages/nano-banana/README.md +1 -1
  199. package/packages/narrative/README.md +23 -1
  200. package/packages/narrative/src/identity.ts +11 -0
  201. package/packages/narrative/src/index.ts +3 -0
  202. package/packages/narrative/src/schema.ts +28 -27
  203. package/packages/narrative/src/selection.ts +52 -0
  204. package/packages/narrative/src/types.ts +2 -0
  205. package/packages/package-loader-node/README.md +30 -0
  206. package/packages/package-loader-node/package.json +5 -2
  207. package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
  208. package/packages/package-loader-node/src/index.ts +1 -0
  209. package/packages/package-loader-node/src/loader.ts +12 -15
  210. package/packages/package-loader-node/src/location.ts +27 -1
  211. package/packages/package-loader-node/src/module-scope.ts +183 -0
  212. package/packages/package-loader-node/src/types.ts +4 -0
  213. package/packages/performance/README.md +83 -0
  214. package/packages/performance/package.json +30 -0
  215. package/packages/performance/src/activation.ts +11 -0
  216. package/packages/performance/src/component.ts +46 -0
  217. package/packages/performance/src/index.ts +6 -0
  218. package/packages/performance/src/manifest.ts +53 -0
  219. package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
  220. package/packages/performance/src/program.ts +51 -0
  221. package/packages/performance/src/style.ts +35 -0
  222. package/packages/performance/src/surface.ts +99 -0
  223. package/packages/performance-studio/README.md +25 -0
  224. package/packages/performance-studio/package.json +21 -0
  225. package/packages/performance-studio/src/activation.ts +6 -0
  226. package/packages/performance-studio/src/index.ts +84 -0
  227. package/packages/program-space/README.md +9 -18
  228. package/packages/program-space/src/activation.ts +1 -5
  229. package/packages/program-space/src/index.ts +2 -11
  230. package/packages/program-space/src/surface.ts +1 -20
  231. package/packages/project-context-node/README.md +20 -0
  232. package/packages/project-context-node/package.json +10 -0
  233. package/packages/project-context-node/src/index.ts +3 -0
  234. package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
  235. package/packages/provider-hyperframes-local/README.md +43 -15
  236. package/packages/provider-hyperframes-local/src/activation.ts +4 -3
  237. package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
  238. package/packages/provider-hyperframes-local/src/capture.ts +96 -26
  239. package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
  240. package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
  241. package/packages/provider-hyperframes-local/src/options.ts +2 -0
  242. package/packages/provider-hyperframes-local/src/program.ts +6 -3
  243. package/packages/provider-hyperframes-local/src/progress.ts +53 -0
  244. package/packages/provider-hyperframes-local/src/provider.ts +18 -5
  245. package/packages/provider-hyperframes-local/src/render.ts +48 -7
  246. package/packages/provider-hypihub/README.md +48 -17
  247. package/packages/provider-hypihub/package.json +2 -0
  248. package/packages/provider-hypihub/src/mapping.ts +31 -7
  249. package/packages/provider-hypihub/src/oauth.ts +6 -0
  250. package/packages/provider-hypihub/src/provider.ts +25 -13
  251. package/packages/provider-hypihub/src/routes.ts +1 -2
  252. package/packages/provider-hypihub/src/upload.ts +2 -0
  253. package/packages/provider-media-local/README.md +3 -4
  254. package/packages/provider-whisperx-local/src/program.ts +1 -0
  255. package/packages/provider-whisperx-local/src/provider.ts +3 -0
  256. package/packages/ranking/README.md +8 -6
  257. package/packages/ranking/package.json +1 -1
  258. package/packages/ranking/src/component.ts +6 -6
  259. package/packages/ranking/src/fragment.ts +11 -7
  260. package/packages/ranking/src/manifest.ts +21 -14
  261. package/packages/ranking/src/render.ts +22 -26
  262. package/packages/ranking/src/schedule.ts +16 -19
  263. package/packages/ranking/src/surface.ts +12 -13
  264. package/packages/ranking-studio/README.md +18 -0
  265. package/packages/ranking-studio/src/index.ts +61 -9
  266. package/packages/render-hyperframes/README.md +7 -7
  267. package/packages/render-hyperframes/package.json +1 -1
  268. package/packages/render-hyperframes/src/component.ts +11 -1
  269. package/packages/render-hyperframes/src/fragment.ts +7 -4
  270. package/packages/render-hyperframes/src/manifest.ts +4 -4
  271. package/packages/render-hyperframes/src/surface.ts +6 -6
  272. package/packages/runtime/README.md +8 -1
  273. package/packages/runtime/src/execution.ts +15 -4
  274. package/packages/runtime/src/index.ts +2 -1
  275. package/packages/runtime/src/log.ts +51 -0
  276. package/packages/runtime/src/types.ts +5 -8
  277. package/packages/runtime-host-node/README.md +30 -0
  278. package/packages/runtime-host-node/package.json +1 -0
  279. package/packages/runtime-host-node/src/index.ts +24 -9
  280. package/packages/runtime-host-node/src/packages.ts +47 -50
  281. package/packages/runtime-kit/README.md +5 -0
  282. package/packages/runtime-kit/src/index.ts +3 -1
  283. package/packages/runtime-local/README.md +109 -4
  284. package/packages/runtime-local/src/config.ts +202 -56
  285. package/packages/runtime-local/src/control.ts +9 -1
  286. package/packages/runtime-local/src/executor.ts +66 -0
  287. package/packages/runtime-local/src/host.ts +37 -17
  288. package/packages/runtime-local/src/log.ts +48 -0
  289. package/packages/runtime-local/src/programs.ts +2 -1
  290. package/packages/runtime-local/src/result-writer.ts +2 -0
  291. package/packages/runtime-local/src/runtime.ts +8 -6
  292. package/packages/runtime-local/src/supervisor.ts +142 -0
  293. package/packages/runtime-local/src/types.ts +9 -2
  294. package/packages/runtime-local/src/worker-process.ts +7 -24
  295. package/packages/runtime-local/src/worker.ts +55 -83
  296. package/packages/screen-overlay/README.md +3 -3
  297. package/packages/screen-overlay/package.json +1 -1
  298. package/packages/screen-overlay/src/component.ts +3 -3
  299. package/packages/screen-overlay/src/fragment.ts +5 -4
  300. package/packages/screen-overlay/src/manifest.ts +7 -6
  301. package/packages/screen-overlay/src/program.ts +9 -9
  302. package/packages/screen-overlay/src/surface.ts +6 -7
  303. package/packages/script/README.md +30 -5
  304. package/packages/script/src/manifest.ts +4 -3
  305. package/packages/script/src/narrative.ts +1 -0
  306. package/packages/script/src/parser.ts +45 -6
  307. package/packages/script/src/surface.ts +4 -3
  308. package/packages/script/src/types.ts +1 -1
  309. package/packages/script-studio/package.json +9 -3
  310. package/packages/script-studio/src/index.ts +2 -0
  311. package/packages/script-studio/src/projection.ts +105 -0
  312. package/packages/seedance/README.md +30 -1
  313. package/packages/seedance/src/index.ts +18 -7
  314. package/packages/seedance/src/surface.ts +17 -4
  315. package/packages/seedance-kits/README.md +7 -1
  316. package/packages/seedream/README.md +1 -1
  317. package/packages/sound/README.md +81 -0
  318. package/packages/sound/package.json +25 -0
  319. package/packages/sound/src/activation.ts +11 -0
  320. package/packages/sound/src/component.ts +28 -0
  321. package/packages/sound/src/index.ts +5 -0
  322. package/packages/sound/src/manifest.ts +47 -0
  323. package/packages/sound/src/program.ts +84 -0
  324. package/packages/sound/src/style.ts +34 -0
  325. package/packages/sound/src/surface.ts +90 -0
  326. package/packages/sound-studio/README.md +22 -0
  327. package/packages/sound-studio/package.json +20 -0
  328. package/packages/sound-studio/src/activation.ts +6 -0
  329. package/packages/sound-studio/src/index.ts +74 -0
  330. package/packages/speech/README.md +2 -2
  331. package/packages/speech-alignment/src/local.ts +8 -0
  332. package/packages/speech-alignment/src/locate.ts +1 -1
  333. package/packages/store-sqlite/README.md +7 -0
  334. package/packages/store-sqlite/src/store.ts +84 -83
  335. package/packages/studio/INSPECTOR.md +15 -2
  336. package/packages/studio/LOCALIZATION.md +98 -0
  337. package/packages/studio/README.md +101 -14
  338. package/packages/studio/locales/en.json +197 -0
  339. package/packages/studio/locales/zh-CN.json +191 -0
  340. package/packages/studio/package.json +8 -7
  341. package/packages/studio/src/companion-assembly.ts +1 -0
  342. package/packages/studio/src/domain.ts +1 -1
  343. package/packages/studio/src/fallback-companions.ts +3 -3
  344. package/packages/studio/src/feedback-server.ts +51 -0
  345. package/packages/studio/src/feedback-store.ts +66 -0
  346. package/packages/studio/src/feedback.ts +60 -0
  347. package/packages/studio/src/localization-node.ts +46 -0
  348. package/packages/studio/src/localization.ts +85 -0
  349. package/packages/studio/src/parameter-values.ts +43 -1
  350. package/packages/studio/src/parameters.ts +114 -24
  351. package/packages/studio/src/preview/render.ts +5 -1
  352. package/packages/studio/src/preview/runtime-shim.ts +49 -3
  353. package/packages/studio/src/programme.ts +14 -30
  354. package/packages/studio/src/server.ts +10 -6
  355. package/packages/studio/src/shared.ts +4 -2
  356. package/packages/studio/src/snapshot.ts +21 -132
  357. package/packages/studio/src/studio-preflight.ts +3 -3
  358. package/packages/studio/src/studio-registry.ts +50 -6
  359. package/packages/studio/src/style.css +223 -50
  360. package/packages/studio/src/ui/artifact-name.ts +8 -6
  361. package/packages/studio/src/ui/artifact-preview.ts +5 -4
  362. package/packages/studio/src/ui/code.ts +17 -16
  363. package/packages/studio/src/ui/comments.ts +234 -0
  364. package/packages/studio/src/ui/dropdown.ts +68 -0
  365. package/packages/studio/src/ui/i18n.ts +109 -0
  366. package/packages/studio/src/ui/icons.ts +6 -0
  367. package/packages/studio/src/ui/library.ts +76 -65
  368. package/packages/studio/src/ui/main.ts +223 -211
  369. package/packages/studio/src/ui/overlay.ts +12 -8
  370. package/packages/studio/src/ui/scrub-preview.ts +110 -0
  371. package/packages/studio/src/ui/stage.ts +93 -29
  372. package/packages/studio/src/ui/timeline.ts +190 -118
  373. package/packages/studio/start.ts +41 -22
  374. package/packages/studio-adapter/README.md +130 -11
  375. package/packages/studio-adapter/src/index.ts +100 -13
  376. package/packages/temporal/README.md +6 -6
  377. package/packages/temporal/package.json +1 -1
  378. package/packages/temporal/src/component.ts +5 -6
  379. package/packages/temporal/src/index.ts +8 -6
  380. package/packages/temporal/src/location.ts +11 -11
  381. package/packages/temporal/src/projection.ts +19 -19
  382. package/packages/temporal/src/rational.ts +4 -4
  383. package/packages/temporal-markup/EDITING.md +2 -2
  384. package/packages/temporal-markup/README.md +27 -11
  385. package/packages/temporal-markup/package.json +1 -1
  386. package/packages/temporal-markup/src/index.ts +20 -25
  387. package/packages/temporal-markup/src/space.ts +10 -41
  388. package/packages/timeline/README.md +31 -0
  389. package/packages/{semantic-track → timeline}/package.json +1 -1
  390. package/packages/timeline/src/activation.ts +8 -0
  391. package/packages/timeline/src/component.ts +24 -0
  392. package/packages/timeline/src/identity.ts +60 -0
  393. package/packages/timeline/src/index.ts +6 -0
  394. package/packages/{semantic-track → timeline}/src/location.ts +20 -20
  395. package/packages/timeline/src/manifest.ts +39 -0
  396. package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
  397. package/packages/timeline/src/types.ts +24 -0
  398. package/packages/timeline-author/README.md +68 -0
  399. package/packages/{speech-track → timeline-author}/package.json +6 -4
  400. package/packages/timeline-author/src/activation.ts +22 -0
  401. package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
  402. package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
  403. package/packages/timeline-author/src/index.ts +7 -0
  404. package/packages/timeline-author/src/manifest.ts +78 -0
  405. package/packages/timeline-author/src/program.ts +107 -0
  406. package/packages/timeline-author/src/surface.ts +46 -0
  407. package/packages/timeline-author/src/types.ts +6 -0
  408. package/packages/typography-track/README.md +4 -4
  409. package/packages/typography-track/package.json +1 -1
  410. package/packages/typography-track/src/component.ts +4 -4
  411. package/packages/typography-track/src/fragment.ts +4 -3
  412. package/packages/typography-track/src/manifest.ts +11 -9
  413. package/packages/typography-track/src/program.ts +15 -15
  414. package/packages/typography-track/src/surface.ts +17 -18
  415. package/packages/video-cli/README.md +4 -1
  416. package/packages/video-cli/package.json +2 -1
  417. package/packages/video-cli/src/creation.ts +14 -4
  418. package/packages/video-cli/src/index.ts +1 -1
  419. package/packages/video-cli/src/studio-distribution.ts +2 -1
  420. package/packages/volcengine-matting/README.md +3 -3
  421. package/packages/whisperx/README.md +1 -1
  422. package/services/whisperx/README.md +14 -0
  423. package/services/whisperx/pyproject.toml +2 -0
  424. package/services/whisperx/uv.lock +20 -20
  425. package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
  426. package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
  427. package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
  428. package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
  429. package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
  430. package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
  431. package/packages/provider-kie/README.md +0 -134
  432. package/packages/provider-kie/package.json +0 -43
  433. package/packages/provider-kie/src/activation.ts +0 -71
  434. package/packages/provider-kie/src/index.ts +0 -10
  435. package/packages/provider-kie/src/mapping.ts +0 -182
  436. package/packages/provider-kie/src/provider.ts +0 -657
  437. package/packages/provider-kie/src/routes.ts +0 -150
  438. package/packages/provider-xiaomi-mimo/README.md +0 -32
  439. package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
  440. package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
  441. package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
  442. package/packages/runtime/src/environment.ts +0 -6
  443. package/packages/semantic-track/README.md +0 -21
  444. package/packages/semantic-track/src/activation.ts +0 -8
  445. package/packages/semantic-track/src/component.ts +0 -24
  446. package/packages/semantic-track/src/identity.ts +0 -58
  447. package/packages/semantic-track/src/index.ts +0 -6
  448. package/packages/semantic-track/src/manifest.ts +0 -38
  449. package/packages/semantic-track/src/types.ts +0 -26
  450. package/packages/speech-track/README.md +0 -51
  451. package/packages/speech-track/src/activation.ts +0 -19
  452. package/packages/speech-track/src/index.ts +0 -7
  453. package/packages/speech-track/src/manifest.ts +0 -73
  454. package/packages/speech-track/src/program.ts +0 -64
  455. package/packages/speech-track/src/surface.ts +0 -35
  456. package/packages/speech-track/src/types.ts +0 -6
  457. package/packages/speech-track-studio/README.md +0 -3
  458. package/packages/speech-track-studio/package.json +0 -14
  459. package/packages/speech-track-studio/src/activation.ts +0 -7
  460. package/packages/speech-track-studio/src/index.ts +0 -40
  461. /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
  462. /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
@@ -10,6 +10,9 @@
10
10
  --text: #e7e8eb;
11
11
  --text-2: #a4a7ae;
12
12
  --text-3: #6f737c;
13
+ --subtab-surface: #101114;
14
+ --subtab-active-surface: #24262a;
15
+ --subtab-active-text: #c9cbd0;
13
16
  /* Replace this ramp as one unit when Hypit's interaction identity changes. */
14
17
  --brand-200: #f8c1ce;
15
18
  --brand-400: #ed7898;
@@ -28,6 +31,8 @@
28
31
  --tone-orange-muted-rail: #e7834c;
29
32
  --tone-green: #38853e;
30
33
  --tone-green-rail: #75d079;
34
+ --tone-green-muted: #285c30;
35
+ --tone-green-muted-rail: #73a478;
31
36
  --tone-teal: #008889;
32
37
  --tone-teal-rail: #00d4d5;
33
38
  /* Semantic ruler: brightness separates content from its own band; hue marks state. */
@@ -35,6 +40,7 @@
35
40
  --semantic-word: #005551;
36
41
  /* Author intent uses a gold annotation hue; brand pink stays in the chrome. */
37
42
  --semantic-intent: #a28b2b;
43
+ --semantic-moment: var(--brand-500);
38
44
  /* Same perceived active level as a selected/covered semantic cell. */
39
45
  --semantic-current: #009f98;
40
46
  /* Ordered marker depth: one hue, decreasing lightness. */
@@ -44,10 +50,14 @@
44
50
  --intent-depth-3: #846d00;
45
51
  --tone-blue: #1777b8;
46
52
  --tone-blue-rail: #58c0ff;
53
+ --tone-blue-muted: #175079;
54
+ --tone-blue-muted-rail: #5795bf;
47
55
  --tone-violet: #6f63b8;
48
56
  --tone-violet-rail: #b3a6ff;
49
57
  --tone-magenta: #995398;
50
58
  --tone-magenta-rail: #ea93e8;
59
+ --tone-magenta-muted: #683b68;
60
+ --tone-magenta-muted-rail: #b57ab4;
51
61
  --tone-neutral: #6a737c;
52
62
  --tone-neutral-rail: #aeb9c4;
53
63
  --timeline-label-width: 188px;
@@ -132,6 +142,26 @@ button:focus-visible, textarea:focus-visible {
132
142
  white-space: nowrap;
133
143
  }
134
144
  .topbar-right { justify-self: end; display: flex; align-items: center; min-width: 0; }
145
+ .view-tabs { display: flex; flex: 0 0 auto; white-space: nowrap; align-items: center; gap: 2px; margin-left: 16px; padding: 2px; border-radius: 5px; background: var(--subtab-surface); }
146
+ .view-tabs button {
147
+ display: flex; align-items: center; gap: 7px; height: 24px; padding: 0 10px;
148
+ border: 0; border-radius: 4px; color: var(--text-3); background: transparent;
149
+ }
150
+ .view-tabs button[aria-selected="true"] { color: var(--subtab-active-text); background: var(--subtab-active-surface); }
151
+ .view-tabs button:focus-visible { outline: 1px solid #8a8f99; outline-offset: -1px; }
152
+ .view-tabs .icon { width: 14px; height: 14px; }
153
+ .parameter-select.language-select { width: auto; flex: 0 0 auto; margin-left: 10px; }
154
+ .language-select .language-toggle {
155
+ display: grid; place-items: center; grid-template-columns: 1fr;
156
+ width: 28px; height: 28px; padding: 0;
157
+ color: var(--subtab-active-text); background: var(--subtab-surface);
158
+ border-color: var(--line);
159
+ }
160
+ .language-toggle .icon { width: 16px; height: 16px; }
161
+ .language-select .parameter-select-menu { width: max-content; min-width: 150px; max-width: 240px; }
162
+ .language-select .parameter-select-option { font-family: var(--font-ui); text-align: start; }
163
+ .topbar { position: relative; z-index: 40; }
164
+
135
165
  .meta {
136
166
  color: var(--text-3);
137
167
  font: 500 11px/1 var(--font-ui);
@@ -159,6 +189,67 @@ button:focus-visible, textarea:focus-visible {
159
189
  grid-template-columns: var(--source-width) 8px minmax(320px, 1fr) 8px var(--workspace-width);
160
190
  overflow: hidden;
161
191
  }
192
+ .comments-panel, .comments-handle { display: none; }
193
+ .studio-shell[data-view="comments"] { grid-template-rows: minmax(0, 1fr); padding-bottom: 6px; }
194
+ .studio-shell[data-view="comments"] > .handle,
195
+ .studio-shell[data-view="comments"] > .timeline-panel { display: none; }
196
+ .studio-shell[data-view="comments"] .upper-shell { grid-template-columns: minmax(240px, 1fr) 8px var(--comments-width, 360px); }
197
+ .studio-shell[data-view="comments"] .source-panel,
198
+ .studio-shell[data-view="comments"] .source-handle,
199
+ .studio-shell[data-view="comments"] .workspace-panel,
200
+ .studio-shell[data-view="comments"] .workspace-handle { display: none; }
201
+ .studio-shell[data-view="comments"] .comments-handle { display: block; }
202
+ .studio-shell[data-view="comments"] .comments-panel { display: flex; }
203
+ .comments-panel { flex-direction: column; min-width: 0; min-height: 0; background: var(--panel); border: 1px solid #08090a; }
204
+ .comments-heading { justify-content: space-between; flex: none; }
205
+ .comments-heading [data-count] { color: var(--text-3); font-size: 11px; margin-left: 2px; }
206
+ .comments-icon { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 26px; height: 26px; padding: 5px; border: 0; border-radius: 3px; background: transparent; color: var(--text-3); }
207
+ .comments-icon:hover { background: var(--field); color: var(--text); }
208
+ .comments-icon .icon { width: 15px; height: 15px; }
209
+ .comments-icon.is-done { color: var(--ok); }
210
+ .comments-panel button:disabled { opacity: .4; }
211
+ .comments-filters { display: flex; gap: 4px; padding: 10px 12px; border-bottom: 1px solid var(--line); flex: none; }
212
+ .comments-filters button { border: 0; background: transparent; padding: 4px 11px; border-radius: 3px; color: var(--text-3); }
213
+ .comments-filters button[aria-pressed="true"] { color: var(--text); background: #282a30; }
214
+ .comments-list { flex: 1; min-height: 0; overflow: auto; padding: 4px 12px 12px; user-select: text; }
215
+ .comments-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 220px; height: 100%; padding: 24px; text-align: center; color: var(--text-3); }
216
+ .comments-empty > .icon { width: 28px; height: 28px; margin-bottom: 18px; opacity: .7; }
217
+ .comments-empty strong { font-size: 13px; font-weight: 500; color: var(--text-2); }
218
+ .comments-empty p { line-height: 1.7; max-width: 230px; margin: 8px 0; }
219
+ .comment-card { padding: 12px 10px 14px; border-bottom: 1px solid var(--line); border-radius: 2px; }
220
+ .comment-card.selected { background: #1e2025; }
221
+ .comment-card-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
222
+ .comment-location { display: inline-flex; align-items: center; gap: 9px; padding: 0; border: 0; background: transparent; cursor: pointer; }
223
+ .comment-number { margin-right: 5px; color: var(--text-3); font: 500 11px var(--font-mono); }
224
+ .comment-actions { display: flex; align-items: center; gap: 1px; }
225
+ .comment-time { display: inline-flex; align-items: center; gap: 6px; min-height: 23px; padding: 2px 6px; background: var(--brand-soft); border: 0; border-radius: 3px; color: var(--brand-400); font: 500 11px/1.5 var(--font-mono); white-space: nowrap; }
226
+ .comment-time .icon { width: 13px; height: 13px; }
227
+ .comment-text { font-size: 13px; line-height: 1.7; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; margin: 10px 0 0; }
228
+ .comment-card.resolved .comment-text { color: var(--text-3); }
229
+ .comment-composer { flex: none; border-top: 1px solid var(--line); padding: 14px 14px 12px; background: #18191d; }
230
+ .comment-anchor { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; margin-bottom: 10px; min-height: 24px; }
231
+ .comment-composer textarea, .comment-edit textarea { width: 100%; resize: none; background: #202227; color: var(--text); border: 1px solid #33363c; border-radius: 3px; padding: 10px 11px; font: 400 13px/1.7 var(--font-ui); display: block; min-height: 82px; user-select: text; }
232
+ .comment-composer textarea::placeholder { color: var(--text-3); }
233
+ .comments-panel textarea:focus { outline: none; box-shadow: none; }
234
+ .comment-edit textarea:focus { background: #292c32; }
235
+ .comments-panel textarea::selection { background: #dce1eb33; color: var(--text); }
236
+ .comment-input { border: 1px solid #33363c; border-radius: 4px; background: #202227; transition: background 120ms ease; }
237
+ .comment-input:focus-within { background: #292c32; }
238
+ .comment-input textarea { border: 0; background: transparent; }
239
+ .comment-input-actions { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 2px 9px 9px; }
240
+ .comment-tools { display: flex; align-items: center; gap: 4px; }
241
+ .comment-tools .comments-icon { width: 28px; height: 28px; padding: 5px; }
242
+ .comment-tools .icon { width: 18px; height: 18px; }
243
+ .comment-submit { display: grid; place-items: center; flex: none; width: 30px; height: 30px; padding: 0; border: 0; border-radius: 50%; background: #e4e6eb; color: #202227; }
244
+ .comment-submit .icon { display: block; width: 18px; height: 18px; }
245
+ .comment-submit:hover:not(:disabled) { background: #fff; }
246
+ .comment-submit:disabled { opacity: 1; background: #35383f; color: #858b95; }
247
+ .comment-submit:focus-visible { outline: 1px solid #aeb3bc; outline-offset: 3px; }
248
+ .comments-error { color: var(--brand-200); font-size: 12px; line-height: 1.6; padding: 10px 14px; border-bottom: 1px solid var(--line); }
249
+ .comment-edit { margin-top: 10px; }
250
+ .comment-edit-actions { display: flex; justify-content: end; gap: 6px; margin-top: 8px; }
251
+ .comment-edit-actions button { padding: 4px 11px; border: 1px solid var(--line-strong); border-radius: 3px; background: var(--field); color: var(--text-2); }
252
+ .comment-edit-actions button[type="submit"] { color: var(--text); }
162
253
  .source-panel, .preview-panel, .workspace-panel, .timeline-panel {
163
254
  min-width: 0;
164
255
  min-height: 0;
@@ -602,7 +693,7 @@ button:focus-visible, textarea:focus-visible {
602
693
  margin: 10px 12px 4px;
603
694
  padding: 2px;
604
695
  border-radius: 5px;
605
- background: #101114;
696
+ background: var(--subtab-surface);
606
697
  overflow: hidden;
607
698
  }
608
699
  .inspector-subtab {
@@ -626,7 +717,7 @@ button:focus-visible, textarea:focus-visible {
626
717
  line-height: 1;
627
718
  white-space: nowrap;
628
719
  }
629
- .inspector-subtab.active { background: #24262a; color: #c9cbd0; }
720
+ .inspector-subtab.active { background: var(--subtab-active-surface); color: var(--subtab-active-text); }
630
721
  .inspector-empty { padding: 28px 14px; color: var(--text-3); font-size: 11px; text-align: center; }
631
722
  .property-group { min-width: 0; padding: 14px 14px 16px; border-bottom: 1px solid var(--line); }
632
723
  .property-group h3 { margin: 0 0 10px; color: #c4c6cc; font-size: 11px; font-weight: 500; }
@@ -689,6 +780,7 @@ button:focus-visible, textarea:focus-visible {
689
780
  caret-color: var(--interaction-accent);
690
781
  cursor: text !important;
691
782
  }
783
+ .parameter-display { width: 100%; padding: 5px 7px; color: var(--text-2); font-size: 11px; line-height: 1.2; text-align: right; overflow-wrap: anywhere; user-select: text; font-variant-numeric: tabular-nums; }
692
784
  .parameter-value:focus { border-color: #6a6e77; outline: 0; background: #131417; }
693
785
  .control-boolean .parameter-right { justify-content: flex-end; }
694
786
  .control-boolean .parameter-value {
@@ -745,8 +837,8 @@ button:focus-visible, textarea:focus-visible {
745
837
  .parameter-color-value { width: min(100%, 102px); }
746
838
  .control-list,
747
839
  .control-record { grid-template-columns: minmax(0, 1fr); align-items: stretch; gap: 6px; }
748
- .control-list .parameter-right,
749
- .control-record .parameter-right { grid-column: 1 / -1; width: 100%; }
840
+ .control-list > .parameter-right,
841
+ .control-record > .parameter-right { grid-column: 1 / -1; width: 100%; }
750
842
  .parameter-structured { min-width: 0; width: 100%; }
751
843
  .parameter-structured-summary {
752
844
  min-height: 20px;
@@ -786,20 +878,6 @@ button:focus-visible, textarea:focus-visible {
786
878
  .parameter-list-actions button:not(:disabled):focus-visible { outline: 1px solid #62666f; }
787
879
  .parameter-list-actions .icon { width: 11px; height: 11px; }
788
880
  .parameter-record-fields { min-width: 0; display: flex; flex-direction: column; gap: 5px; }
789
- .parameter-record-field {
790
- min-width: 0;
791
- display: grid;
792
- grid-template-columns: 58px minmax(0, 1fr);
793
- align-items: center;
794
- gap: 7px;
795
- }
796
- .parameter-record-field > span:first-child {
797
- overflow: hidden;
798
- color: #6f737c;
799
- font-size: 10px;
800
- text-overflow: ellipsis;
801
- white-space: nowrap;
802
- }
803
881
  .parameter-structured-footer {
804
882
  min-height: 30px;
805
883
  display: flex;
@@ -818,10 +896,10 @@ button:focus-visible, textarea:focus-visible {
818
896
  font: 10px/1 var(--font-ui);
819
897
  }
820
898
  .parameter-structured-footer button:disabled { color: #454850; background: #16171a; }
821
- .parameter-structured-footer button.primary:not(:disabled) { border-color: #555962; background: #292b30; color: #e0e2e6; }
822
899
  .parameter-structured-add { display: inline-flex; align-items: center; gap: 4px; }
823
900
  .parameter-structured-add .icon { width: 11px; height: 11px; }
824
- .parameter-structured-decisions { display: flex; align-items: center; gap: 4px; margin-left: auto; }
901
+ .parameter-structured-notice { margin-top: 6px; color: var(--text-3); font: 10px/1.4 var(--font-ui); }
902
+ .parameter-structured-notice[hidden] { display: none; }
825
903
  .parameter-select { position: relative; width: 100%; min-width: 0; }
826
904
  .parameter-select-trigger {
827
905
  width: 100%;
@@ -1016,10 +1094,13 @@ button:focus-visible, textarea:focus-visible {
1016
1094
  transform: translateY(-50%);
1017
1095
  }
1018
1096
  .track-tone-blue { --track: var(--tone-blue); --rail: var(--tone-blue-rail); }
1097
+ .track-tone-blue-muted { --track: var(--tone-blue-muted); --rail: var(--tone-blue-muted-rail); }
1019
1098
  .track-tone-green { --track: var(--tone-green); --rail: var(--tone-green-rail); }
1099
+ .track-tone-green-muted { --track: var(--tone-green-muted); --rail: var(--tone-green-muted-rail); }
1020
1100
  .track-tone-teal { --track: var(--tone-teal); --rail: var(--tone-teal-rail); }
1021
1101
  .track-tone-violet { --track: var(--tone-violet); --rail: var(--tone-violet-rail); }
1022
1102
  .track-tone-magenta { --track: var(--tone-magenta); --rail: var(--tone-magenta-rail); }
1103
+ .track-tone-magenta-muted { --track: var(--tone-magenta-muted); --rail: var(--tone-magenta-muted-rail); }
1023
1104
  .track-tone-orange { --track: var(--tone-orange); --rail: var(--tone-orange-rail); }
1024
1105
  .track-tone-orange-muted { --track: var(--tone-orange-muted); --rail: var(--tone-orange-muted-rail); }
1025
1106
  .track-tone-neutral { --track: var(--tone-neutral); --rail: var(--tone-neutral-rail); }
@@ -1083,8 +1164,10 @@ button:focus-visible, textarea:focus-visible {
1083
1164
  height: var(--semantic-band-height);
1084
1165
  overflow: hidden;
1085
1166
  background: var(--lane);
1167
+ box-shadow: inset 0 -1px var(--line);
1168
+ isolation: isolate;
1086
1169
  }
1087
- .semantic-band-intent { border-bottom: 0; }
1170
+ .semantic-band:last-child { box-shadow: none; }
1088
1171
  .lane-attached {
1089
1172
  border-left: 0;
1090
1173
  background: var(--lane);
@@ -1104,12 +1187,12 @@ button:focus-visible, textarea:focus-visible {
1104
1187
  border: 0;
1105
1188
  border-radius: 0;
1106
1189
  background: var(--semantic-cell);
1107
- box-shadow: none;
1190
+ box-shadow: inset 0 0 0 1px #ffffff12;
1108
1191
  color: var(--text);
1109
1192
  text-align: left;
1110
1193
  cursor: default;
1111
1194
  }
1112
- .semantic-cell:focus-visible { outline: 0; }
1195
+ .semantic-cell:focus-visible { outline: 0; box-shadow: inset 0 0 0 1px #ffffff60; }
1113
1196
  .semantic-segment {
1114
1197
  --semantic-cell: var(--semantic-segment);
1115
1198
  }
@@ -1120,11 +1203,9 @@ button:focus-visible, textarea:focus-visible {
1120
1203
  --semantic-cell: var(--semantic-intent);
1121
1204
  color: #fff;
1122
1205
  }
1123
- .semantic-cell.selected,
1124
- .semantic-cell.live { z-index: 4; filter: brightness(1.22); }
1125
- .semantic-segment.selected { box-shadow: none; }
1126
- .semantic-segment.live.selected { filter: brightness(1.22); }
1127
- .semantic-moment.selected { z-index: 4; filter: brightness(1.22); }
1206
+ .semantic-cell.live { filter: brightness(1.12); }
1207
+ .semantic-cell.selected { z-index: 4; filter: brightness(1.16); box-shadow: inset 0 0 0 1px #ffffff60; }
1208
+ .semantic-moment.selected { z-index: 5; filter: brightness(1.16); box-shadow: inset 0 0 0 1px #ffffff60; }
1128
1209
  .semantic-segment-label {
1129
1210
  flex: 1 1 auto;
1130
1211
  min-width: 0;
@@ -1170,21 +1251,19 @@ button:focus-visible, textarea:focus-visible {
1170
1251
  .semantic-word .semantic-cell-content { padding: 0 5px; }
1171
1252
  .semantic-moment {
1172
1253
  position: absolute;
1173
- top: 4px;
1174
- width: 14px;
1175
- height: 14px;
1176
- transform: translateX(-7px) rotate(45deg);
1254
+ top: calc((var(--semantic-band-height) - 9px) / 2);
1255
+ z-index: 1;
1256
+ width: 9px;
1257
+ height: 9px;
1258
+ transform: translateX(-50%) scaleX(.6) rotate(45deg);
1177
1259
  border-radius: 0;
1178
1260
  padding: 0;
1179
- border: 0;
1180
- background: var(--semantic-intent);
1261
+ border: 1px solid var(--lane);
1262
+ background: var(--semantic-moment);
1181
1263
  }
1182
1264
  .semantic-moment:focus-visible { outline: 0; }
1183
- .track-label-semantic { position: sticky; top: var(--timeline-ruler-height); z-index: 8; border-bottom: 1px solid var(--line); background: #111216; }
1184
- .track-label-semantic::before {
1185
- border-radius: 0;
1186
- background: #181a1f;
1187
- }
1265
+ .track-label-semantic { position: sticky; top: 0; z-index: 8; border-bottom: 1px solid var(--line); background: #111216; }
1266
+ .track-label-semantic::before { display: none; }
1188
1267
  .track-label-attached {
1189
1268
  /* The branch marker occupies the same 18px prefix as a root icon;
1190
1269
  attached and root labels therefore share one exact text column. */
@@ -1207,7 +1286,6 @@ button:focus-visible, textarea:focus-visible {
1207
1286
  display: block;
1208
1287
  padding: 0;
1209
1288
  border: 0;
1210
- border-bottom: 1px solid color-mix(in srgb, var(--track) 48%, var(--lane));
1211
1289
  border-radius: var(--timeline-item-radius);
1212
1290
  background: var(--item-body);
1213
1291
  box-shadow: none;
@@ -1215,8 +1293,7 @@ button:focus-visible, textarea:focus-visible {
1215
1293
  text-align: left;
1216
1294
  cursor: default;
1217
1295
  }
1218
- /* The edge affordance is intentionally visual-only for now. Actual trim and
1219
- writeback remain disabled until their SVML mapping is implemented. */
1296
+ /* Only Companion-declared editable intervals enable edge gestures. */
1220
1297
  #app .clip::before,
1221
1298
  #app .clip::after {
1222
1299
  content: "";
@@ -1244,10 +1321,19 @@ button:focus-visible, textarea:focus-visible {
1244
1321
  }
1245
1322
  .clip.editing { box-shadow: 0 0 0 1px #fff; }
1246
1323
  .clip:focus-visible { outline: 0; }
1324
+ /* Draw above thumbnails and text without changing interval geometry. */
1325
+ .clip-boundary {
1326
+ position: absolute;
1327
+ z-index: 5;
1328
+ inset: 0;
1329
+ border: 1px solid #ffffff20;
1330
+ border-radius: inherit;
1331
+ pointer-events: none;
1332
+ }
1247
1333
  .clip-selection {
1248
1334
  position: absolute;
1249
1335
  z-index: 6;
1250
- inset: calc(-1 * var(--timeline-selection-stroke));
1336
+ inset: 0;
1251
1337
  display: none;
1252
1338
  border: var(--timeline-selection-stroke) solid var(--timeline-selection-color);
1253
1339
  border-radius: var(--timeline-selection-radius);
@@ -1256,20 +1342,21 @@ button:focus-visible, textarea:focus-visible {
1256
1342
  .clip-selection::before, .clip-selection::after {
1257
1343
  content: "";
1258
1344
  position: absolute;
1259
- top: -1px;
1260
- bottom: -1px;
1345
+ top: 0;
1346
+ bottom: 0;
1261
1347
  width: var(--timeline-selection-edge);
1262
1348
  background: var(--timeline-selection-color);
1263
1349
  }
1264
1350
  .clip-selection::before {
1265
- left: calc(-1 * var(--timeline-selection-stroke));
1351
+ left: 0;
1266
1352
  border-radius: var(--timeline-selection-radius) 0 0 var(--timeline-selection-radius);
1267
1353
  }
1268
1354
  .clip-selection::after {
1269
- right: calc(-1 * var(--timeline-selection-stroke));
1355
+ right: 0;
1270
1356
  border-radius: 0 var(--timeline-selection-radius) var(--timeline-selection-radius) 0;
1271
1357
  }
1272
1358
  .clip.selected > .clip-selection { display: block; }
1359
+ .clip.selected > .clip-boundary { border-color: var(--timeline-selection-color); }
1273
1360
  .clip-head {
1274
1361
  position: absolute;
1275
1362
  z-index: 3;
@@ -1288,6 +1375,7 @@ button:focus-visible, textarea:focus-visible {
1288
1375
  }
1289
1376
  .clip-body {
1290
1377
  position: absolute;
1378
+ z-index: 1;
1291
1379
  top: var(--timeline-item-header-height);
1292
1380
  right: 0;
1293
1381
  bottom: 0;
@@ -1346,10 +1434,13 @@ button:focus-visible, textarea:focus-visible {
1346
1434
  font-variant-numeric: tabular-nums;
1347
1435
  }
1348
1436
  .clip-tone-blue { --track: var(--tone-blue); }
1437
+ .clip-tone-blue-muted { --track: var(--tone-blue-muted); }
1349
1438
  .clip-tone-green { --track: var(--tone-green); }
1439
+ .clip-tone-green-muted { --track: var(--tone-green-muted); }
1350
1440
  .clip-tone-teal { --track: var(--tone-teal); }
1351
1441
  .clip-tone-violet { --track: var(--tone-violet); }
1352
1442
  .clip-tone-magenta { --track: var(--tone-magenta); }
1443
+ .clip-tone-magenta-muted { --track: var(--tone-magenta-muted); }
1353
1444
  .clip-tone-orange { --track: var(--tone-orange); }
1354
1445
  .clip-tone-orange-muted { --track: var(--tone-orange-muted); }
1355
1446
  .clip-tone-neutral { --track: var(--tone-neutral); }
@@ -1481,8 +1572,8 @@ button:focus-visible, textarea:focus-visible {
1481
1572
  .failure:empty { display: none; }
1482
1573
 
1483
1574
  @media (max-width: 920px) {
1484
- .meta, .topbar-right { display: none; }
1485
- .topbar { grid-template-columns: 1fr minmax(120px, 1fr); }
1575
+ .meta, .topbar-right .status { display: none; }
1576
+ .topbar { grid-template-columns: auto minmax(0, 1fr) auto; }
1486
1577
  .upper-shell { grid-template-columns: minmax(320px, var(--source-width)) 8px minmax(300px, 1fr); }
1487
1578
  .workspace-handle, .workspace-panel { display: none; }
1488
1579
  }
@@ -1503,14 +1594,96 @@ button:focus-visible, textarea:focus-visible {
1503
1594
  .stage-audio-wave { width: 85%; padding: 24px 12px; border-radius: 2px; color: #b5c2bb; background: #202824; text-align: center; }
1504
1595
  .stage-audio-wave img { display: block; width: 100%; height: 100px; }
1505
1596
  .stage-media-error { position: absolute; bottom: 12px; padding: 8px; background: #24262b; color: #cacdd4; font-size: 11px; }
1506
- .stage-scrubber { flex: none; width: 100%; height: 10px; padding: 0; margin: -5px 0; z-index: 2; appearance: none; background: transparent; cursor: pointer; }
1597
+ .stage-progress { position: relative; flex: none; height: 0; z-index: 2; }
1598
+ .stage-progress[hidden], .scrub-preview[hidden] { display: none; }
1599
+ .stage-scrubber { position: absolute; inset: -5px 0 auto; width: 100%; height: 10px; padding: 0; margin: 0; appearance: none; background: transparent; cursor: pointer; }
1507
1600
  .stage-scrubber::-webkit-slider-runnable-track { height: 2px; background: #676c75; }
1508
1601
  .stage-scrubber::-webkit-slider-thumb { appearance: none; width: 8px; height: 8px; border-radius: 50%; margin-top: -3px; background: #e1e4e9; }
1509
1602
  .stage-scrubber::-moz-range-track { height: 2px; background: #676c75; }
1510
1603
  .stage-scrubber::-moz-range-thumb { width: 8px; height: 8px; border: 0; background: #e1e4e9; }
1604
+ .stage-review .stage-scaler, .stage-review .stage-viewport { cursor: pointer; }
1605
+ .stage-review .stage-progress { height: 24px; margin: 0 20px; }
1606
+ .stage-review .stage-scrubber { top: 0; height: 24px; }
1607
+ .stage-review .stage-scrubber::-webkit-slider-runnable-track { height: 4px; border-radius: 2px; background: #565b64; }
1608
+ .stage-review .stage-scrubber::-webkit-slider-thumb { width: 12px; height: 12px; margin-top: -4px; }
1609
+ .stage-review .stage-scrubber::-moz-range-track { height: 4px; border-radius: 2px; background: #565b64; }
1610
+ .stage-review .stage-scrubber::-moz-range-thumb { width: 12px; height: 12px; }
1611
+ .scrub-preview { position: absolute; bottom: calc(100% + 8px); padding: 3px; border: 1px solid #4b4f56; border-radius: 4px; background: #1b1d21; box-shadow: 0 4px 16px #0006; pointer-events: none; }
1612
+ .scrub-preview-picture { position: relative; display: grid; place-items: center; overflow: hidden; background: #111215; }
1613
+ .scrub-preview-picture iframe { position: absolute; top: 0; left: 0; border: 0; transform-origin: top left; pointer-events: none; }
1614
+ .scrub-preview-picture span { padding: 8px; color: var(--text-3); font: 10px var(--font-ui); text-align: center; }
1615
+ .scrub-preview-picture span[hidden] { display: none; }
1616
+ .scrub-preview-time { padding: 5px 3px 2px; color: #d5d8df; font: 10px var(--font-mono); text-align: center; }
1511
1617
 
1512
1618
  .preview-unavailable .artifact-type { position: static; width: auto; height: auto; clip-path: none; color: #9298a2; font-size: 10px; }
1513
1619
 
1514
1620
  .artifact-card.selected .artifact-preview { background: var(--artifact-selection); border-radius: 3px; }
1515
1621
  .artifact-card.selected .artifact-name-text { color: #f1f2f5; background: var(--artifact-selection); }
1516
1622
  .library-continuation { grid-column: 1 / -1; height: 28px; display: grid; place-items: center; color: #777e89; font-size: 10px; }
1623
+
1624
+ .timeline-overlap-menu, .selection-menu {
1625
+ position: fixed;
1626
+ z-index: 100;
1627
+ min-width: 160px;
1628
+ max-width: 280px;
1629
+ max-height: 240px;
1630
+ overflow: auto;
1631
+ padding: 4px;
1632
+ border: 1px solid var(--line-strong);
1633
+ border-radius: 5px;
1634
+ background: var(--panel-raised);
1635
+ box-shadow: 0 6px 20px #0006;
1636
+ }
1637
+ .timeline-overlap-menu button, .selection-menu button {
1638
+ display: block;
1639
+ width: 100%;
1640
+ padding: 6px 9px;
1641
+ border: 0;
1642
+ border-radius: 2px;
1643
+ background: transparent;
1644
+ color: var(--text);
1645
+ font-family: inherit;
1646
+ font-size: 12px;
1647
+ line-height: 1.4;
1648
+ text-align: left;
1649
+ overflow-wrap: anywhere;
1650
+ }
1651
+ .timeline-overlap-menu button:hover,
1652
+ .timeline-overlap-menu button:focus-visible,
1653
+ .selection-menu button:hover,
1654
+ .selection-menu button:focus-visible { background: var(--field); outline: none; }
1655
+
1656
+ /* Compact authored rules keep interval geometry without a thumbnail body. */
1657
+ .clip-chrome-compact > .clip-head {
1658
+ height: 100%;
1659
+ border-bottom: 0;
1660
+ border-radius: var(--timeline-item-radius);
1661
+ background: var(--item-head);
1662
+ }
1663
+ .clip-chrome-compact > .clip-body,
1664
+ .clip-chrome-compact .clip-meta { display: none; }
1665
+ .clip-chrome-compact .clip-name { font-size: 11px; font-weight: 500; }
1666
+
1667
+ /* Track-internal bands share one label and meet without child-track gutters. */
1668
+ .timeline-track-banded { padding: var(--timeline-item-inset-y) 0; }
1669
+ .timeline-track-banded > .track-band { border-bottom: 0; }
1670
+ .timeline-track-banded > .track-band > .clip {
1671
+ height: 100%;
1672
+ margin-top: 0;
1673
+ border-radius: 0;
1674
+ }
1675
+ .timeline-track-banded > .track-band:first-child > .clip {
1676
+ border-top-left-radius: var(--timeline-item-radius);
1677
+ border-top-right-radius: var(--timeline-item-radius);
1678
+ }
1679
+ .timeline-track-banded > .track-band:last-child > .clip {
1680
+ border-bottom-left-radius: var(--timeline-item-radius);
1681
+ border-bottom-right-radius: var(--timeline-item-radius);
1682
+ }
1683
+ .track-band .clip-head, .track-band .clip-body { border-radius: inherit; }
1684
+ .track-band-label .clip-head {
1685
+ height: 100%;
1686
+ border-bottom: 0;
1687
+ background: var(--item-head);
1688
+ }
1689
+ .track-band-label .clip-body, .track-band-label .clip-meta { display: none; }
@@ -1,3 +1,5 @@
1
+ import { uiAttr, uiText, userText } from "./i18n.js";
2
+
1
3
  /** Two-line label with an expanding editor; the caller owns persistence. */
2
4
  export function createArtifactName(options: {
3
5
  readonly name: string;
@@ -15,7 +17,7 @@ export function createArtifactName(options: {
15
17
  text.className = "artifact-name-text";
16
18
  text.textContent = name;
17
19
  label.append(text);
18
- label.title = options.editable ? `${name}\nDouble-click or press F2 to rename` : `${name}\nNaming is available when this Build finishes`;
20
+ uiAttr(label, "title", options.editable ? "library.rename-hint" : "library.name-pending", { name });
19
21
  element.append(label);
20
22
  label.addEventListener("click", (event) => { event.stopPropagation(); options.select(); });
21
23
  let editing = false;
@@ -30,7 +32,7 @@ export function createArtifactName(options: {
30
32
  field.className = "artifact-name-editor";
31
33
  field.value = name;
32
34
  field.rows = 1;
33
- field.setAttribute("aria-label", "Display name");
35
+ uiAttr(field, "aria-label", "library.display-name");
34
36
  const error = document.createElement("span");
35
37
  error.className = "artifact-name-error";
36
38
  error.setAttribute("role", "status");
@@ -53,17 +55,17 @@ export function createArtifactName(options: {
53
55
  if (!editing || saving) return;
54
56
  const value = field.value.trim();
55
57
  if (value === name) { close(); return; }
56
- if (value.length === 0) { error.textContent = "Enter a name."; return; }
58
+ if (value.length === 0) { uiText(error, "library.enter-name"); return; }
57
59
  saving = true;
58
60
  field.readOnly = true;
59
- error.textContent = "Saving…";
61
+ uiText(error, "common.saving");
60
62
  try {
61
63
  name = await options.save(value);
62
64
  text.textContent = name;
63
- label.title = `${name}\nDouble-click or press F2 to rename`;
65
+ uiAttr(label, "title", "library.rename-hint", { name });
64
66
  close();
65
67
  } catch (cause) {
66
- error.textContent = cause instanceof Error ? cause.message : String(cause);
68
+ userText(error, cause instanceof Error ? cause.message : String(cause));
67
69
  } finally {
68
70
  saving = false;
69
71
  field.readOnly = false;
@@ -1,3 +1,4 @@
1
+ import { uiAttr, uiText, userText } from "./i18n.js";
1
2
  import type { StudioArtifactView } from "../shared.js";
2
3
  import { audioPreview } from "./material-preview.js";
3
4
 
@@ -35,7 +36,7 @@ export function createArtifactPreview(changed: () => void) {
35
36
  error.setAttribute("role", "status");
36
37
  const failed = () => {
37
38
  if (generation !== current) return;
38
- error.textContent = "This media could not be opened in the browser.";
39
+ uiText(error, "player.media-failed");
39
40
  error.hidden = false;
40
41
  changed();
41
42
  };
@@ -61,14 +62,14 @@ export function createArtifactPreview(changed: () => void) {
61
62
  if (audio) {
62
63
  const wave = document.createElement("div");
63
64
  wave.className = "stage-audio-wave";
64
- wave.textContent = "Audio";
65
+ uiText(wave, "library.audio");
65
66
  element.append(wave);
66
67
  void audioPreview(url).then((waveform) => {
67
68
  if (generation !== current || waveform === undefined) return;
68
69
  const image = document.createElement("img");
69
70
  image.src = waveform;
70
- image.alt = "Audio waveform";
71
- wave.replaceChildren(image);
71
+ uiAttr(image, "alt", "player.audio-waveform");
72
+ userText(wave, ""); wave.replaceChildren(image);
72
73
  });
73
74
  }
74
75
  }
@@ -1,3 +1,4 @@
1
+ import { t, userText, uiAttribute, uiText, uiAttr } from "./i18n.js";
1
2
  import type { Range, StudioSnapshot, StudioSourceView } from "../shared.js";
2
3
  import { icon, setIcon } from "./icons.js";
3
4
  import { intentTones } from "./markers.js";
@@ -77,10 +78,10 @@ export function createCodePane(): CodePane {
77
78
  <strong class="code-location" data-path></strong>
78
79
  <div class="code-actions">
79
80
  <span class="code-save-state" data-save-state></span>
80
- <button type="button" class="icon-button code-wrap" data-wrap aria-label="Wrap lines" aria-pressed="false" title="Wrap lines">
81
+ <button type="button" class="icon-button code-wrap" data-wrap ${uiAttribute("aria-label", "source.wrap-lines")} aria-pressed="false" ${uiAttribute("title", "source.wrap-lines")}>
81
82
  ${icon("wrap")}
82
83
  </button>
83
- <button type="button" class="icon-button code-mode" data-mode aria-label="Edit source" title="Edit source">
84
+ <button type="button" class="icon-button code-mode" data-mode ${uiAttribute("aria-label", "source.edit-source")} ${uiAttribute("title", "source.edit-source")}>
84
85
  <span data-mode-icon>${icon("edit")}</span>
85
86
  </button>
86
87
  </div>`;
@@ -88,7 +89,7 @@ export function createCodePane(): CodePane {
88
89
  element.className = "code";
89
90
  element.innerHTML = `
90
91
  <div class="code-scroll"><svg class="range-canvas" aria-hidden="true"></svg></div>
91
- <textarea class="code-editor" data-editor spellcheck="false" aria-label="SVML source"></textarea>`;
92
+ <textarea class="code-editor" data-editor spellcheck="false" ${uiAttribute("aria-label", "source.svml-source")}></textarea>`;
92
93
  const path = toolbar.querySelector<HTMLElement>("[data-path]")!;
93
94
  const scroll = element.querySelector<HTMLElement>(".code-scroll")!;
94
95
  const canvas = element.querySelector<SVGSVGElement>(".range-canvas")!;
@@ -116,8 +117,8 @@ export function createCodePane(): CodePane {
116
117
  wrapped = value;
117
118
  element.classList.toggle("is-wrapped", wrapped);
118
119
  wrap.setAttribute("aria-pressed", String(wrapped));
119
- wrap.setAttribute("aria-label", wrapped ? "Keep lines unwrapped" : "Wrap lines");
120
- wrap.title = wrapped ? "Keep lines unwrapped" : "Wrap lines";
120
+ uiAttr(wrap, "aria-label", wrapped ? "source.keep-lines-unwrapped" : "source.wrap-lines");
121
+ uiAttr(wrap, "title", wrapped ? "source.keep-lines-unwrapped" : "source.wrap-lines");
121
122
  window.requestAnimationFrame(draw);
122
123
  };
123
124
 
@@ -125,8 +126,8 @@ export function createCodePane(): CodePane {
125
126
  editing = value;
126
127
  element.classList.toggle("is-editing", editing);
127
128
  setIcon(modeIcon, editing ? "eye" : "edit");
128
- mode.setAttribute("aria-label", editing ? "Read source" : "Edit source");
129
- mode.title = editing ? "Read source" : "Edit source";
129
+ uiAttr(mode, "aria-label", editing ? "source.read-source" : "source.edit-source");
130
+ uiAttr(mode, "title", editing ? "source.read-source" : "source.edit-source");
130
131
  if (editing) {
131
132
  editor.value = sourceText;
132
133
  editingRevision = snapshotRevision;
@@ -143,7 +144,7 @@ export function createCodePane(): CodePane {
143
144
  saveInFlight = true;
144
145
  let accepted = false;
145
146
  let acceptedRevision = savingRevision;
146
- saveState.textContent = "Saving";
147
+ uiText(saveState, "common.saving");
147
148
  saveState.className = "code-save-state saving";
148
149
  try {
149
150
  const response = await fetch("/__studio/source", {
@@ -153,7 +154,7 @@ export function createCodePane(): CodePane {
153
154
  });
154
155
  if (!response.ok) {
155
156
  const reason = await response.text();
156
- throw new Error(reason || `Save failed (${response.status})`);
157
+ throw new Error(reason || t("source.save-failed-status", { status: response.status }));
157
158
  }
158
159
  const result = await response.json() as { readonly revision?: unknown };
159
160
  if (typeof result.revision === "number") acceptedRevision = result.revision;
@@ -163,15 +164,15 @@ export function createCodePane(): CodePane {
163
164
  sourceText = savingText;
164
165
  dirty = false;
165
166
  }
166
- saveState.textContent = "Saved";
167
+ uiText(saveState, "common.saved");
167
168
  saveState.className = "code-save-state saved";
168
169
  window.setTimeout(() => {
169
- if (!dirty) saveState.textContent = "";
170
+ if (!dirty) userText(saveState, "");
170
171
  }, 1200);
171
172
  } catch (error) {
172
- saveState.textContent = error instanceof Error && error.message.includes("changed")
173
- ? "Changed outside Studio"
174
- : "Save failed";
173
+ uiText(saveState, error instanceof Error && error.message.includes("changed")
174
+ ? "source.changed-outside-studio"
175
+ : "common.save-failed");
175
176
  saveState.className = "code-save-state error";
176
177
  } finally {
177
178
  saveInFlight = false;
@@ -189,7 +190,7 @@ export function createCodePane(): CodePane {
189
190
  wrap.addEventListener("click", () => setWrapped(!wrapped));
190
191
  editor.addEventListener("input", () => {
191
192
  dirty = true;
192
- saveState.textContent = "Unsaved";
193
+ uiText(saveState, "source.unsaved");
193
194
  saveState.className = "code-save-state dirty";
194
195
  if (saveTimer !== undefined) window.clearTimeout(saveTimer);
195
196
  saveTimer = window.setTimeout(() => void save(), 480);
@@ -308,7 +309,7 @@ export function createCodePane(): CodePane {
308
309
  imports: [],
309
310
  };
310
311
  if (activeSource !== undefined && activeSource.path !== sourceFile.path && dirty) {
311
- saveState.textContent = "Saving before switch";
312
+ uiText(saveState, "source.saving-before-switch");
312
313
  saveState.className = "code-save-state saving";
313
314
  void save();
314
315
  return false;