@allyhub/sdk 0.1.0-alpha.8 → 0.2.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/NOTICE +85 -0
  2. package/client.d.ts +45 -1
  3. package/dist/anim.js +2 -75
  4. package/dist/define.d.ts +10 -4
  5. package/dist/define.js +2 -95
  6. package/dist/dom.d.ts +1 -1
  7. package/dist/dom.js +2 -457
  8. package/dist/fit.js +2 -60
  9. package/dist/free.d.ts +18 -0
  10. package/dist/free.js +2 -0
  11. package/dist/index.d.ts +28 -13
  12. package/dist/index.js +2 -11
  13. package/dist/input.d.ts +306 -0
  14. package/dist/input.js +2 -0
  15. package/dist/media.d.ts +3 -6
  16. package/dist/media.js +2 -27
  17. package/dist/messages.d.ts +3 -2
  18. package/dist/messages.js +2 -2
  19. package/dist/module.d.ts +24 -0
  20. package/dist/module.js +2 -0
  21. package/dist/noise.js +2 -233
  22. package/dist/parts.d.ts +97 -21
  23. package/dist/parts.js +2 -414
  24. package/dist/paths.d.ts +1 -1
  25. package/dist/paths.js +2 -720
  26. package/dist/phone.d.ts +26 -0
  27. package/dist/phone.js +2 -0
  28. package/dist/piece.d.ts +106 -35
  29. package/dist/piece.js +2 -38
  30. package/dist/props.d.ts +1 -1
  31. package/dist/props.js +2 -35
  32. package/dist/scenery.d.ts +2 -0
  33. package/dist/scenery.js +2 -0
  34. package/dist/text.js +2 -38
  35. package/dist/written.d.ts +12 -0
  36. package/dist/written.js +2 -0
  37. package/docs/README.md +18 -0
  38. package/docs/batches.md +148 -0
  39. package/docs/contract.md +51 -0
  40. package/docs/defaults.md +703 -0
  41. package/docs/docs.md +148 -0
  42. package/docs/footage.md +249 -0
  43. package/docs/layers.md +317 -0
  44. package/docs/modeling.md +143 -0
  45. package/docs/project.md +265 -0
  46. package/docs/scenery.md +308 -0
  47. package/docs/sheets.md +119 -0
  48. package/docs/slides.md +111 -0
  49. package/docs/sound.md +170 -0
  50. package/docs/speech.md +289 -0
  51. package/docs/video.md +265 -0
  52. package/node_modules/@allyhub-next/audio/dist/at-cut.d.ts +52 -0
  53. package/node_modules/@allyhub-next/audio/dist/at-cut.js +2 -0
  54. package/node_modules/@allyhub-next/audio/dist/decode.d.ts +33 -0
  55. package/node_modules/@allyhub-next/audio/dist/decode.js +2 -0
  56. package/node_modules/@allyhub-next/audio/dist/envelope.d.ts +37 -0
  57. package/node_modules/@allyhub-next/audio/dist/envelope.js +2 -0
  58. package/node_modules/@allyhub-next/audio/dist/index.d.ts +17 -0
  59. package/node_modules/@allyhub-next/audio/dist/index.js +2 -0
  60. package/node_modules/@allyhub-next/audio/dist/levels.d.ts +97 -0
  61. package/node_modules/@allyhub-next/audio/dist/levels.js +2 -0
  62. package/node_modules/@allyhub-next/audio/dist/master.d.ts +29 -0
  63. package/node_modules/@allyhub-next/audio/dist/master.js +2 -0
  64. package/node_modules/@allyhub-next/audio/dist/music.d.ts +11 -0
  65. package/node_modules/@allyhub-next/audio/dist/music.js +2 -0
  66. package/node_modules/@allyhub-next/audio/dist/node/decode.d.ts +39 -0
  67. package/node_modules/@allyhub-next/audio/dist/node/decode.js +2 -0
  68. package/node_modules/@allyhub-next/audio/dist/node/ebur128.d.ts +25 -0
  69. package/node_modules/@allyhub-next/audio/dist/node/ebur128.js +2 -0
  70. package/node_modules/@allyhub-next/audio/dist/node/ffmpeg.d.ts +31 -0
  71. package/node_modules/@allyhub-next/audio/dist/node/ffmpeg.js +2 -0
  72. package/node_modules/@allyhub-next/audio/dist/node/index.d.ts +8 -0
  73. package/node_modules/@allyhub-next/audio/dist/node/index.js +2 -0
  74. package/node_modules/@allyhub-next/audio/dist/node/loudness.d.ts +18 -0
  75. package/node_modules/@allyhub-next/audio/dist/node/loudness.js +2 -0
  76. package/node_modules/@allyhub-next/audio/dist/node/master.d.ts +42 -0
  77. package/node_modules/@allyhub-next/audio/dist/node/master.js +2 -0
  78. package/node_modules/@allyhub-next/audio/dist/node/measure.d.ts +60 -0
  79. package/node_modules/@allyhub-next/audio/dist/node/measure.js +2 -0
  80. package/node_modules/@allyhub-next/audio/dist/node/mix.d.ts +31 -0
  81. package/node_modules/@allyhub-next/audio/dist/node/mix.js +2 -0
  82. package/node_modules/@allyhub-next/audio/dist/plan.d.ts +143 -0
  83. package/node_modules/@allyhub-next/audio/dist/plan.js +2 -0
  84. package/node_modules/@allyhub-next/audio/dist/recorded.d.ts +26 -0
  85. package/node_modules/@allyhub-next/audio/dist/recorded.js +2 -0
  86. package/node_modules/@allyhub-next/audio/dist/recording/bandwidth.d.ts +47 -0
  87. package/node_modules/@allyhub-next/audio/dist/recording/bandwidth.js +2 -0
  88. package/node_modules/@allyhub-next/audio/dist/recording/chain.d.ts +89 -0
  89. package/node_modules/@allyhub-next/audio/dist/recording/chain.js +2 -0
  90. package/node_modules/@allyhub-next/audio/dist/recording/dynamics.d.ts +64 -0
  91. package/node_modules/@allyhub-next/audio/dist/recording/dynamics.js +2 -0
  92. package/node_modules/@allyhub-next/audio/dist/recording/fft.d.ts +26 -0
  93. package/node_modules/@allyhub-next/audio/dist/recording/fft.js +2 -0
  94. package/node_modules/@allyhub-next/audio/dist/recording/filters.d.ts +42 -0
  95. package/node_modules/@allyhub-next/audio/dist/recording/filters.js +2 -0
  96. package/node_modules/@allyhub-next/audio/dist/recording/fit.d.ts +56 -0
  97. package/node_modules/@allyhub-next/audio/dist/recording/fit.js +2 -0
  98. package/node_modules/@allyhub-next/audio/dist/recording/index.d.ts +10 -0
  99. package/node_modules/@allyhub-next/audio/dist/recording/index.js +2 -0
  100. package/node_modules/@allyhub-next/audio/dist/recording/loudness.d.ts +12 -0
  101. package/node_modules/@allyhub-next/audio/dist/recording/loudness.js +2 -0
  102. package/node_modules/@allyhub-next/audio/dist/recording/measure.d.ts +67 -0
  103. package/node_modules/@allyhub-next/audio/dist/recording/measure.js +2 -0
  104. package/node_modules/@allyhub-next/audio/dist/recording/mic.d.ts +32 -0
  105. package/node_modules/@allyhub-next/audio/dist/recording/mic.js +2 -0
  106. package/node_modules/@allyhub-next/audio/dist/recording/noise.d.ts +27 -0
  107. package/node_modules/@allyhub-next/audio/dist/recording/noise.js +2 -0
  108. package/node_modules/@allyhub-next/audio/dist/recording/presets.d.ts +64 -0
  109. package/node_modules/@allyhub-next/audio/dist/recording/presets.js +2 -0
  110. package/node_modules/@allyhub-next/audio/dist/recording/room.d.ts +78 -0
  111. package/node_modules/@allyhub-next/audio/dist/recording/room.js +2 -0
  112. package/node_modules/@allyhub-next/audio/dist/recording/setup.d.ts +111 -0
  113. package/node_modules/@allyhub-next/audio/dist/recording/setup.js +2 -0
  114. package/node_modules/@allyhub-next/audio/dist/recording/vec.d.ts +3 -0
  115. package/node_modules/@allyhub-next/audio/dist/recording/vec.js +2 -0
  116. package/node_modules/@allyhub-next/audio/dist/render.d.ts +26 -0
  117. package/node_modules/@allyhub-next/audio/dist/render.js +2 -0
  118. package/node_modules/@allyhub-next/audio/dist/sfx.d.ts +10 -0
  119. package/node_modules/@allyhub-next/audio/dist/sfx.js +2 -0
  120. package/node_modules/@allyhub-next/audio/dist/shape.d.ts +118 -0
  121. package/node_modules/@allyhub-next/audio/dist/shape.js +2 -0
  122. package/node_modules/@allyhub-next/audio/dist/voice.d.ts +45 -0
  123. package/node_modules/@allyhub-next/audio/dist/voice.js +2 -0
  124. package/node_modules/@allyhub-next/audio/package.json +17 -0
  125. package/node_modules/@allyhub-next/formats/dist/data/comments.d.ts +94 -0
  126. package/node_modules/@allyhub-next/formats/dist/data/comments.js +2 -0
  127. package/node_modules/@allyhub-next/formats/dist/data/config.d.ts +10 -0
  128. package/node_modules/@allyhub-next/formats/dist/data/config.js +2 -0
  129. package/node_modules/@allyhub-next/formats/dist/data/edits.d.ts +28 -0
  130. package/node_modules/@allyhub-next/formats/dist/data/edits.js +2 -0
  131. package/node_modules/@allyhub-next/formats/dist/data/elements.d.ts +6 -0
  132. package/node_modules/@allyhub-next/formats/dist/data/elements.js +2 -0
  133. package/node_modules/@allyhub-next/formats/dist/data/faces.d.ts +38 -0
  134. package/node_modules/@allyhub-next/formats/dist/data/faces.js +2 -0
  135. package/node_modules/@allyhub-next/formats/dist/data/file.d.ts +11 -0
  136. package/node_modules/@allyhub-next/formats/dist/data/file.js +2 -0
  137. package/node_modules/@allyhub-next/formats/dist/data/gen.d.ts +31 -0
  138. package/node_modules/@allyhub-next/formats/dist/data/gen.js +2 -0
  139. package/node_modules/@allyhub-next/formats/dist/data/messages.d.ts +34 -0
  140. package/node_modules/@allyhub-next/formats/dist/data/messages.js +2 -0
  141. package/node_modules/@allyhub-next/formats/dist/data/reference.d.ts +676 -0
  142. package/node_modules/@allyhub-next/formats/dist/data/reference.js +2 -0
  143. package/node_modules/@allyhub-next/formats/dist/data/script.d.ts +37 -0
  144. package/node_modules/@allyhub-next/formats/dist/data/script.js +2 -0
  145. package/node_modules/@allyhub-next/formats/dist/data/sheet.d.ts +214 -0
  146. package/node_modules/@allyhub-next/formats/dist/data/sheet.js +2 -0
  147. package/node_modules/@allyhub-next/formats/dist/data/words.d.ts +25 -0
  148. package/node_modules/@allyhub-next/formats/dist/data/words.js +2 -0
  149. package/node_modules/@allyhub-next/formats/dist/index.d.ts +16 -0
  150. package/node_modules/@allyhub-next/formats/dist/index.js +2 -0
  151. package/node_modules/@allyhub-next/formats/dist/items.d.ts +94 -0
  152. package/node_modules/@allyhub-next/formats/dist/items.js +2 -0
  153. package/node_modules/@allyhub-next/formats/dist/layout.d.ts +50 -0
  154. package/node_modules/@allyhub-next/formats/dist/layout.js +5 -0
  155. package/node_modules/@allyhub-next/formats/dist/schemas.d.ts +301 -0
  156. package/node_modules/@allyhub-next/formats/dist/schemas.js +2 -0
  157. package/node_modules/@allyhub-next/formats/package.json +14 -0
  158. package/node_modules/@allyhub-next/formats/schemas/comments.schema.json +152 -0
  159. package/node_modules/@allyhub-next/formats/schemas/config.schema.json +43 -0
  160. package/node_modules/@allyhub-next/formats/schemas/edits.schema.json +112 -0
  161. package/node_modules/@allyhub-next/formats/schemas/elements.schema.json +33 -0
  162. package/node_modules/@allyhub-next/formats/schemas/gen.schema.json +97 -0
  163. package/node_modules/@allyhub-next/formats/schemas/interpretation.schema.json +125 -0
  164. package/node_modules/@allyhub-next/formats/schemas/items.json +75 -0
  165. package/node_modules/@allyhub-next/formats/schemas/messages.schema.json +11 -0
  166. package/node_modules/@allyhub-next/formats/schemas/script.schema.json +162 -0
  167. package/node_modules/@allyhub-next/formats/schemas/sheet.schema.json +395 -0
  168. package/node_modules/@allyhub-next/formats/schemas/words.schema.json +63 -0
  169. package/node_modules/@allyhub-next/protocol/dist/app.d.ts +98 -0
  170. package/node_modules/@allyhub-next/protocol/dist/app.js +2 -0
  171. package/node_modules/@allyhub-next/protocol/dist/auth.d.ts +116 -0
  172. package/node_modules/@allyhub-next/protocol/dist/auth.js +2 -0
  173. package/node_modules/@allyhub-next/protocol/dist/cli.d.ts +59 -0
  174. package/node_modules/@allyhub-next/protocol/dist/cli.js +2 -0
  175. package/node_modules/@allyhub-next/protocol/dist/cloud.d.ts +272 -0
  176. package/node_modules/@allyhub-next/protocol/dist/cloud.js +2 -0
  177. package/node_modules/@allyhub-next/protocol/dist/editor.d.ts +405 -0
  178. package/node_modules/@allyhub-next/protocol/dist/editor.js +2 -0
  179. package/node_modules/@allyhub-next/protocol/dist/files.d.ts +101 -0
  180. package/node_modules/@allyhub-next/protocol/dist/files.js +2 -0
  181. package/node_modules/@allyhub-next/protocol/dist/index.d.ts +12 -0
  182. package/node_modules/@allyhub-next/protocol/dist/index.js +2 -0
  183. package/node_modules/@allyhub-next/protocol/dist/jsonrpc.d.ts +83 -0
  184. package/node_modules/@allyhub-next/protocol/dist/jsonrpc.js +2 -0
  185. package/node_modules/@allyhub-next/protocol/dist/registry.d.ts +53 -0
  186. package/node_modules/@allyhub-next/protocol/dist/registry.js +2 -0
  187. package/node_modules/@allyhub-next/protocol/dist/runtimes.d.ts +93 -0
  188. package/node_modules/@allyhub-next/protocol/dist/runtimes.js +2 -0
  189. package/node_modules/@allyhub-next/protocol/dist/teams.d.ts +67 -0
  190. package/node_modules/@allyhub-next/protocol/dist/teams.js +2 -0
  191. package/node_modules/@allyhub-next/protocol/dist/tools.d.ts +345 -0
  192. package/node_modules/@allyhub-next/protocol/dist/tools.js +2 -0
  193. package/node_modules/@allyhub-next/protocol/package.json +13 -0
  194. package/node_modules/@allyhub-next/runtimes/dist/bundled.d.ts +10 -0
  195. package/node_modules/@allyhub-next/runtimes/dist/bundled.js +2 -0
  196. package/node_modules/@allyhub-next/runtimes/dist/download.d.ts +15 -0
  197. package/node_modules/@allyhub-next/runtimes/dist/download.js +2 -0
  198. package/node_modules/@allyhub-next/runtimes/dist/errors.d.ts +16 -0
  199. package/node_modules/@allyhub-next/runtimes/dist/errors.js +2 -0
  200. package/node_modules/@allyhub-next/runtimes/dist/home.d.ts +2 -0
  201. package/node_modules/@allyhub-next/runtimes/dist/home.js +2 -0
  202. package/node_modules/@allyhub-next/runtimes/dist/index.d.ts +9 -0
  203. package/node_modules/@allyhub-next/runtimes/dist/index.js +2 -0
  204. package/node_modules/@allyhub-next/runtimes/dist/lock.d.ts +6 -0
  205. package/node_modules/@allyhub-next/runtimes/dist/lock.js +2 -0
  206. package/node_modules/@allyhub-next/runtimes/dist/manifest.d.ts +3 -0
  207. package/node_modules/@allyhub-next/runtimes/dist/manifest.js +2 -0
  208. package/node_modules/@allyhub-next/runtimes/dist/runtimes.d.ts +63 -0
  209. package/node_modules/@allyhub-next/runtimes/dist/runtimes.js +3 -0
  210. package/node_modules/@allyhub-next/runtimes/dist/unpack.d.ts +7 -0
  211. package/node_modules/@allyhub-next/runtimes/dist/unpack.js +2 -0
  212. package/node_modules/@allyhub-next/runtimes/manifest.json +395 -0
  213. package/node_modules/@allyhub-next/runtimes/package.json +14 -0
  214. package/node_modules/@allyhub-next/runtimes/schemas/runtimes.schema.json +153 -0
  215. package/node_modules/@allyhub-next/scenery/NOTICE +42 -0
  216. package/node_modules/@allyhub-next/scenery/dist/aim.d.ts +55 -0
  217. package/node_modules/@allyhub-next/scenery/dist/aim.js +2 -0
  218. package/node_modules/@allyhub-next/scenery/dist/bake.d.ts +203 -0
  219. package/node_modules/@allyhub-next/scenery/dist/bake.js +2 -0
  220. package/node_modules/@allyhub-next/scenery/dist/camera.d.ts +150 -0
  221. package/node_modules/@allyhub-next/scenery/dist/camera.js +2 -0
  222. package/node_modules/@allyhub-next/scenery/dist/curve.d.ts +40 -0
  223. package/node_modules/@allyhub-next/scenery/dist/curve.js +2 -0
  224. package/node_modules/@allyhub-next/scenery/dist/define.d.ts +164 -0
  225. package/node_modules/@allyhub-next/scenery/dist/define.js +2 -0
  226. package/node_modules/@allyhub-next/scenery/dist/fit.d.ts +64 -0
  227. package/node_modules/@allyhub-next/scenery/dist/fit.js +2 -0
  228. package/node_modules/@allyhub-next/scenery/dist/glass.d.ts +34 -0
  229. package/node_modules/@allyhub-next/scenery/dist/glass.js +2 -0
  230. package/node_modules/@allyhub-next/scenery/dist/handheld.d.ts +184 -0
  231. package/node_modules/@allyhub-next/scenery/dist/handheld.js +2 -0
  232. package/node_modules/@allyhub-next/scenery/dist/hull.d.ts +23 -0
  233. package/node_modules/@allyhub-next/scenery/dist/hull.js +2 -0
  234. package/node_modules/@allyhub-next/scenery/dist/index.d.ts +22 -0
  235. package/node_modules/@allyhub-next/scenery/dist/index.js +2 -0
  236. package/node_modules/@allyhub-next/scenery/dist/lens.d.ts +48 -0
  237. package/node_modules/@allyhub-next/scenery/dist/lens.js +2 -0
  238. package/node_modules/@allyhub-next/scenery/dist/moire.d.ts +136 -0
  239. package/node_modules/@allyhub-next/scenery/dist/moire.js +93 -0
  240. package/node_modules/@allyhub-next/scenery/dist/motion.d.ts +48 -0
  241. package/node_modules/@allyhub-next/scenery/dist/motion.js +2 -0
  242. package/node_modules/@allyhub-next/scenery/dist/move.d.ts +260 -0
  243. package/node_modules/@allyhub-next/scenery/dist/move.js +2 -0
  244. package/node_modules/@allyhub-next/scenery/dist/noise.d.ts +41 -0
  245. package/node_modules/@allyhub-next/scenery/dist/noise.js +2 -0
  246. package/node_modules/@allyhub-next/scenery/dist/phone.d.ts +34 -0
  247. package/node_modules/@allyhub-next/scenery/dist/phone.js +2 -0
  248. package/node_modules/@allyhub-next/scenery/dist/report.d.ts +677 -0
  249. package/node_modules/@allyhub-next/scenery/dist/report.js +2 -0
  250. package/node_modules/@allyhub-next/scenery/dist/screen-focus.d.ts +55 -0
  251. package/node_modules/@allyhub-next/scenery/dist/screen-focus.js +2 -0
  252. package/node_modules/@allyhub-next/scenery/dist/screen.d.ts +71 -0
  253. package/node_modules/@allyhub-next/scenery/dist/screen.js +2 -0
  254. package/node_modules/@allyhub-next/scenery/dist/solve.d.ts +82 -0
  255. package/node_modules/@allyhub-next/scenery/dist/solve.js +2 -0
  256. package/node_modules/@allyhub-next/scenery/dist/timing.d.ts +26 -0
  257. package/node_modules/@allyhub-next/scenery/dist/timing.js +2 -0
  258. package/node_modules/@allyhub-next/scenery/dist/vec.d.ts +19 -0
  259. package/node_modules/@allyhub-next/scenery/dist/vec.js +2 -0
  260. package/node_modules/@allyhub-next/scenery/package.json +13 -0
  261. package/node_modules/@allyhub-next/video-core/dist/anchors.d.ts +164 -0
  262. package/node_modules/@allyhub-next/video-core/dist/anchors.js +2 -0
  263. package/node_modules/@allyhub-next/video-core/dist/audio-types.d.ts +148 -0
  264. package/node_modules/@allyhub-next/video-core/dist/audio-types.js +2 -0
  265. package/node_modules/@allyhub-next/video-core/dist/backdrop.d.ts +87 -0
  266. package/node_modules/@allyhub-next/video-core/dist/backdrop.js +2 -0
  267. package/node_modules/@allyhub-next/video-core/dist/captions.d.ts +122 -0
  268. package/node_modules/@allyhub-next/video-core/dist/captions.js +11 -0
  269. package/node_modules/@allyhub-next/video-core/dist/console.d.ts +91 -0
  270. package/node_modules/@allyhub-next/video-core/dist/console.js +2 -0
  271. package/node_modules/@allyhub-next/video-core/dist/contrast.d.ts +98 -0
  272. package/node_modules/@allyhub-next/video-core/dist/contrast.js +2 -0
  273. package/node_modules/@allyhub-next/video-core/dist/cut-report.d.ts +77 -0
  274. package/node_modules/@allyhub-next/video-core/dist/cut-report.js +2 -0
  275. package/node_modules/@allyhub-next/video-core/dist/edit.d.ts +77 -0
  276. package/node_modules/@allyhub-next/video-core/dist/edit.js +13 -0
  277. package/node_modules/@allyhub-next/video-core/dist/edits.d.ts +163 -0
  278. package/node_modules/@allyhub-next/video-core/dist/edits.js +2 -0
  279. package/node_modules/@allyhub-next/video-core/dist/export.d.ts +96 -0
  280. package/node_modules/@allyhub-next/video-core/dist/export.js +2 -0
  281. package/node_modules/@allyhub-next/video-core/dist/fact.d.ts +965 -0
  282. package/node_modules/@allyhub-next/video-core/dist/fact.js +2 -0
  283. package/node_modules/@allyhub-next/video-core/dist/footage-motion.d.ts +168 -0
  284. package/node_modules/@allyhub-next/video-core/dist/footage-motion.js +2 -0
  285. package/node_modules/@allyhub-next/video-core/dist/formats.d.ts +240 -0
  286. package/node_modules/@allyhub-next/video-core/dist/formats.js +2 -0
  287. package/node_modules/@allyhub-next/video-core/dist/gen.d.ts +37 -0
  288. package/node_modules/@allyhub-next/video-core/dist/gen.js +2 -0
  289. package/node_modules/@allyhub-next/video-core/dist/index.d.ts +40 -0
  290. package/node_modules/@allyhub-next/video-core/dist/index.js +2 -0
  291. package/node_modules/@allyhub-next/video-core/dist/look.d.ts +66 -0
  292. package/node_modules/@allyhub-next/video-core/dist/look.js +2 -0
  293. package/node_modules/@allyhub-next/video-core/dist/marks.d.ts +34 -0
  294. package/node_modules/@allyhub-next/video-core/dist/marks.js +2 -0
  295. package/node_modules/@allyhub-next/video-core/dist/matrix.d.ts +289 -0
  296. package/node_modules/@allyhub-next/video-core/dist/matrix.js +2 -0
  297. package/node_modules/@allyhub-next/video-core/dist/measure.d.ts +465 -0
  298. package/node_modules/@allyhub-next/video-core/dist/measure.js +5 -0
  299. package/node_modules/@allyhub-next/video-core/dist/media.d.ts +226 -0
  300. package/node_modules/@allyhub-next/video-core/dist/media.js +2 -0
  301. package/node_modules/@allyhub-next/video-core/dist/messages.d.ts +88 -0
  302. package/node_modules/@allyhub-next/video-core/dist/messages.js +2 -0
  303. package/node_modules/@allyhub-next/video-core/dist/motion.d.ts +56 -0
  304. package/node_modules/@allyhub-next/video-core/dist/motion.js +2 -0
  305. package/node_modules/@allyhub-next/video-core/dist/music.d.ts +110 -0
  306. package/node_modules/@allyhub-next/video-core/dist/music.js +2 -0
  307. package/node_modules/@allyhub-next/video-core/dist/piece.d.ts +1146 -0
  308. package/node_modules/@allyhub-next/video-core/dist/piece.js +2 -0
  309. package/node_modules/@allyhub-next/video-core/dist/placement.d.ts +37 -0
  310. package/node_modules/@allyhub-next/video-core/dist/placement.js +2 -0
  311. package/node_modules/@allyhub-next/video-core/dist/problem.d.ts +262 -0
  312. package/node_modules/@allyhub-next/video-core/dist/problem.js +2 -0
  313. package/node_modules/@allyhub-next/video-core/dist/render-types.d.ts +49 -0
  314. package/node_modules/@allyhub-next/video-core/dist/render-types.js +2 -0
  315. package/node_modules/@allyhub-next/video-core/dist/schema.d.ts +352 -0
  316. package/node_modules/@allyhub-next/video-core/dist/schema.js +2 -0
  317. package/node_modules/@allyhub-next/video-core/dist/script-edit.d.ts +176 -0
  318. package/node_modules/@allyhub-next/video-core/dist/script-edit.js +2 -0
  319. package/node_modules/@allyhub-next/video-core/dist/script.d.ts +67 -0
  320. package/node_modules/@allyhub-next/video-core/dist/script.js +2 -0
  321. package/node_modules/@allyhub-next/video-core/dist/seams.d.ts +214 -0
  322. package/node_modules/@allyhub-next/video-core/dist/seams.js +2 -0
  323. package/node_modules/@allyhub-next/video-core/dist/slides.d.ts +37 -0
  324. package/node_modules/@allyhub-next/video-core/dist/slides.js +2 -0
  325. package/node_modules/@allyhub-next/video-core/dist/sound-under.d.ts +72 -0
  326. package/node_modules/@allyhub-next/video-core/dist/sound-under.js +2 -0
  327. package/node_modules/@allyhub-next/video-core/dist/speech.d.ts +83 -0
  328. package/node_modules/@allyhub-next/video-core/dist/speech.js +5 -0
  329. package/node_modules/@allyhub-next/video-core/dist/timeline.d.ts +616 -0
  330. package/node_modules/@allyhub-next/video-core/dist/timeline.js +2 -0
  331. package/node_modules/@allyhub-next/video-core/dist/timing.d.ts +88 -0
  332. package/node_modules/@allyhub-next/video-core/dist/timing.js +2 -0
  333. package/node_modules/@allyhub-next/video-core/dist/transcript.d.ts +288 -0
  334. package/node_modules/@allyhub-next/video-core/dist/transcript.js +2 -0
  335. package/node_modules/@allyhub-next/video-core/dist/transition.d.ts +289 -0
  336. package/node_modules/@allyhub-next/video-core/dist/transition.js +2 -0
  337. package/node_modules/@allyhub-next/video-core/dist/voice.d.ts +175 -0
  338. package/node_modules/@allyhub-next/video-core/dist/voice.js +2 -0
  339. package/node_modules/@allyhub-next/video-core/dist/words.d.ts +128 -0
  340. package/node_modules/@allyhub-next/video-core/dist/words.js +2 -0
  341. package/node_modules/@allyhub-next/video-core/package.json +14 -0
  342. package/package.json +52 -41
  343. package/README.md +0 -17
  344. package/dist/anim.d.ts.map +0 -1
  345. package/dist/anim.js.map +0 -1
  346. package/dist/define.d.ts.map +0 -1
  347. package/dist/define.js.map +0 -1
  348. package/dist/dom.d.ts.map +0 -1
  349. package/dist/dom.js.map +0 -1
  350. package/dist/fit.d.ts.map +0 -1
  351. package/dist/fit.js.map +0 -1
  352. package/dist/index.d.ts.map +0 -1
  353. package/dist/index.js.map +0 -1
  354. package/dist/media.d.ts.map +0 -1
  355. package/dist/media.js.map +0 -1
  356. package/dist/messages.d.ts.map +0 -1
  357. package/dist/messages.js.map +0 -1
  358. package/dist/noise.d.ts.map +0 -1
  359. package/dist/noise.js.map +0 -1
  360. package/dist/parts.d.ts.map +0 -1
  361. package/dist/parts.js.map +0 -1
  362. package/dist/paths.d.ts.map +0 -1
  363. package/dist/paths.js.map +0 -1
  364. package/dist/piece.d.ts.map +0 -1
  365. package/dist/piece.js.map +0 -1
  366. package/dist/props.d.ts.map +0 -1
  367. package/dist/props.js.map +0 -1
  368. package/dist/text.d.ts.map +0 -1
  369. package/dist/text.js.map +0 -1
  370. /package/{LICENSE → LICENSE.md} +0 -0
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ import{READ_DEFAULTS as f,boxRows as d,contentBox as l,freeBands as h,unionSpans as u,wordsAtOnce as m}from"./measure.js";export const FACT_KINDS={"text-speaker":"Text over the speaker's face box or person matte","text-off-frame":"Text the frame's edges cut: its glyphs outside the frame, in pixels and as a share","text-contrast":"Text against the pixels behind its glyphs: WCAG contrast ratios, the lowest, a low percentile and the median","text-covered":"Text in the area a platform's interface covers","text-overlap":"Text over text of another layer","text-overlap-own":"Text over text of the same layer","text-outside":"Text reaching outside a box it is drawn inside (a background, border or shadow)","text-time":"How long each text shows whole, against its words, and how large it is on a phone, with its lowercase letters' height","words-on-screen":"Words whole on screen at once in each part: the most, and every change","footage-scale":"Footage enlargement: output pixels per source pixel, largest and smallest","free-bands":"Bands of the frame inside the covered edges that the speaker's face box or person matte leaves free","graphics-under-footage":"Graphic layers drawn under footage (listed before it), and how much of the frame the footage covers","flat-frames":"Runs of nearly flat frames unlike the picture around them","still-picture":"Stretches where the picture holds: how long, and how much changed in them","cut-seam":"How things move either side of each join: direction, speed and the change across; things named alike on both sides",flash:"Frames unlike both the frame before and the frame after: a flash, a blank frame, a layer for one frame","music-length":"Music length against video length","join-loudness":"Speech loudness either side of a join, or why it was not measured","matrix-coverage":"Matrix: combos asked for, possible and chosen, per candidate","generated-media":"Generated media (files with a .gen.json record) shown or played, and when","gen-mismatch":"A .gen.json record whose sha256 is not its file's, or that cannot be read",fallback:"Drawn or timed a fallback way: a face track, matte, take or music tempo missing","scenery-contact":"3D scenery: named objects that touch or cross, with the shared area, the crossing's length, how deep at least, the lift that clears them and the shared volume","scenery-support":"3D scenery: what each named object rests on, the gap below or how far it is sunk, its footprint in contact and its centre of mass against the contact","scenery-bake":"3D scenery: whether a scenery layer's scenery was drawn with its bake laid; when not, the scene's digest looked for, whether it was baked before (out of date) or never, and the command that makes it","mesh-health":"3D scenery: named objects whose surface is open, non-manifold, degenerate or crosses itself","camera-clearance":"3D scenery: a scenery layer's camera near a surface, inside an object, or cutting geometry with its near plane","camera-motion":"3D scenery: a scenery layer's camera motion in its own frame: peaks of truck, pedestal, dolly, pan, tilt, roll, zoom, speed, acceleration and jerk, smoothness, the largest step","scenery-screen":"3D scenery: a screen in a scenery layer: when it is on the frame, its share, how much its content is enlarged or shrunk, its angle to the view, how much is hidden in front of it, how blurred with an aperture, where it is drawn and at what scale, its smallest text on the frame as drawn and the speed of each stretch between cues","scenery-screen-fidelity":"3D scenery: a screen drawn in the scenery against its own element drawn flat: the colour difference, the share of pixels that differ, the regions where they differ and the elements in them the scenery's picture is known to draw otherwise","cut-in-word":"A part playing a stretch of a video item cut inside one of its words"};export function isFactKind(e){return Object.hasOwn(FACT_KINDS,e)}export function fact(e,a,r){return{kind:e,...a,data:r}}export function factsOf(e,a){return e.filter(r=>r.kind===a)}export function countFacts(e){const a={};for(const r of e)a[r.kind]=(a[r.kind]??0)+1;return a}export function filterFacts(e,a){return e.filter(r=>!(a.kinds?.length&&!a.kinds.includes(r.kind)||a.part!==void 0&&r.part!==a.part||(a.from!==void 0||a.to!==void 0)&&(r.t===void 0||a.from!==void 0&&r.t<a.from-1e-6||a.to!==void 0&&r.t>a.to+1e-6)))}export function freeBandsData(e){const a=l(e.width,e.height,e.safe),r=(o,s)=>{const n=u(s.flat());return{files:o,seen:s.filter(c=>c.length>0).length,rows:n,bands:h(a,n)}},i="missing"in e.face?e.face:{...r(e.face.files,e.face.boxes.map(o=>{const s=o?d(o,a.x):void 0;return s?[s]:[]})),...e.face.speaker===void 0?{}:{speaker:e.face.speaker}},t="missing"in e.person?e.person:r(e.person.files,e.person.rows);return{frame:[e.width,e.height],covered:e.safe,content:a,...e.profile?{profile:e.profile}:{},moments:e.moments,face:i,person:t,bands:h(a,[..."rows"in i?i.rows:[],..."rows"in t?t.rows:[]])}}export function layoutFacts(e,a,r){const i=[];for(const t of e.moments){const o={...a,part:t.part,t:t.t};for(const s of t.overlaps){const n=t.texts[s.a],c=t.texts[s.b];!n||!c||i.push(fact("text-overlap",o,{a:n,b:c,area:s.area,share:s.share}))}for(const s of t.ownOverlaps){const n=t.texts[s.a],c=t.texts[s.b];!n||!c||i.push(fact("text-overlap-own",o,{a:n,b:c,area:s.area,share:s.share}))}for(const s of t.outside){const n=t.texts[s.text];n&&i.push(fact("text-outside",o,{text:n,container:s.container,edges:s.edges}))}for(const s of t.faceOverlaps){const n=t.texts[s.text];!n||!t.face||i.push(fact("text-speaker",o,{text:n,face:{box:t.face,area:s.area,ofText:s.ofText,ofFace:s.ofFace}}))}for(const s of t.offFrame){const n=t.texts[s.text];n&&i.push(fact("text-off-frame",o,{text:n,frame:[e.width,e.height],edges:s.edges,outside:s.outside,share:s.share,glyphs:s.glyphs}))}for(const s of t.safeOverlaps){const n=t.texts[s.text];n&&i.push(fact("text-covered",o,{text:n,frame:[e.width,e.height],covered:e.safe,...r?{profile:r}:{},edges:s.edges}))}}for(const t of e.reading?.texts??[])i.push(fact("text-time",{...a,part:t.part,t:t.first},{text:t.text,words:t.words,chars:t.chars,seconds:t.seconds,spans:t.spans,onScreen:t.onScreen,...t.size?{size:t.size}:{},options:e.reading?.options??f}));for(const t of m(e.reading?.texts??[])){const{part:o,...s}=t;i.push(fact("words-on-screen",{...a,part:o,t:t.from},{...s,options:e.reading?.options??f}))}for(const t of e.footage){const{part:o,...s}=t;i.push(fact("footage-scale",{...a,part:o,t:t.max.t},s))}return i}
@@ -0,0 +1,168 @@
1
+ import { type FaceTrack } from "./media.js";
2
+ import { type Ease, type ScalarKey } from "./motion.js";
3
+ import type { Placement } from "./placement.js";
4
+ import type { PixelRect, TimelineFootage } from "./timeline.js";
5
+ /**
6
+ * The source second a footage layer shows at film time t: from `from`
7
+ * at its speed, or, for a cut take, inside the cut showing then.
8
+ */
9
+ export declare function sourceAt(f: Pick<TimelineFootage, "start" | "from" | "speed" | "cuts">, t: number): number;
10
+ /** A source rectangle zoomed by z about a point of it (fractions). */
11
+ export declare function zoomRect(r: PixelRect, z: number, cx: number, cy: number): PixelRect;
12
+ /** The zoom keys of a layer as scalar keys of one channel. */
13
+ export declare function zoomChannel(keys: NonNullable<TimelineFootage["zoom"]>, ch: "z" | "cx" | "cy"): ScalarKey[];
14
+ /**
15
+ * Where a footage layer's picture is at film time t (fractional pixels):
16
+ * its box (keyframed or not), the part of the source it shows (the crop,
17
+ * panned by a reframe and zoomed by punch-ins) and where that is drawn.
18
+ */
19
+ export declare function placementAt(f: TimelineFootage, t: number): Placement;
20
+ /**
21
+ * How much larger a keyframed layer's picture is in box `b` than in its
22
+ * first box `b0`: one factor for both sides, so the picture keeps its
23
+ * shape, as its fit fits it (cover fills the box, contain stays inside).
24
+ */
25
+ export declare function boxFit(f: Pick<TimelineFootage, "fit" | "picture">, b0: PixelRect, b: PixelRect): number;
26
+ /** A rectangle of the source (pixels) where a placement draws it in the frame. */
27
+ export declare function sourceToFrame(p: Placement, r: PixelRect): PixelRect;
28
+ /**
29
+ * A face of a footage layer at film time t, in the frame's pixels and
30
+ * inside its box: face `id`, by default the layer's speaker (else the
31
+ * track's default speaker); undefined when it has no such face then.
32
+ */
33
+ export declare function faceOnFrame(f: TimelineFootage, track: FaceTrack, t: number, id?: number | undefined): PixelRect | undefined;
34
+ /**
35
+ * Every face of a footage layer at film time t that shows inside its box,
36
+ * with its id, in the frame's pixels.
37
+ */
38
+ export declare function facesOnFrame(f: TimelineFootage, track: FaceTrack, t: number): {
39
+ id: number;
40
+ box: PixelRect;
41
+ }[];
42
+ /** The largest rectangle of the box's shape inside the source (pixels). */
43
+ export declare function reframeWindow(source: {
44
+ width: number;
45
+ height: number;
46
+ }, box: {
47
+ w: number;
48
+ h: number;
49
+ }): {
50
+ w: number;
51
+ h: number;
52
+ };
53
+ /**
54
+ * Where a reframe puts the face's centre in the crop, from its top (0) to
55
+ * its bottom (1), when the layer does not choose (`reframe: { face, faceY }`):
56
+ * a little above the middle.
57
+ */
58
+ export declare const REFRAME_FACE_Y = 0.4;
59
+ /** Where a reframe "face" centres without a face then: fractions of the source. */
60
+ export declare const REFRAME_FALLBACK: {
61
+ readonly x: 0.5;
62
+ readonly y: 0.4;
63
+ };
64
+ /**
65
+ * The crop's top-left over a layer's film window, following the face:
66
+ * sampled every 0.1 s within each stretch of the source (a cut jumps),
67
+ * kept inside the source, and thinned to the keys a line through their
68
+ * neighbours does not already give within 1.5 source pixels.
69
+ */
70
+ export declare function reframePath(opts: {
71
+ track: FaceTrack | undefined;
72
+ /** The face it follows; default the track's default speaker. */
73
+ speaker?: number | undefined;
74
+ /** Where the face's centre sits in the crop, 0 (top) to 1; default REFRAME_FACE_Y. */
75
+ faceY?: number | undefined;
76
+ /** Where to centre without a face: fractions of the source. */
77
+ focus?: {
78
+ x: number;
79
+ y: number;
80
+ };
81
+ window: {
82
+ w: number;
83
+ h: number;
84
+ };
85
+ source: {
86
+ width: number;
87
+ height: number;
88
+ };
89
+ layer: Pick<TimelineFootage, "start" | "end" | "from" | "speed" | "cuts">;
90
+ }): {
91
+ t: number;
92
+ x: number;
93
+ y: number;
94
+ }[];
95
+ /** A punch-in resolved to film seconds. */
96
+ export interface PunchSpan {
97
+ start: number;
98
+ end: number;
99
+ scale: number;
100
+ /** The point zoomed about: fractions of the box. */
101
+ cx: number;
102
+ cy: number;
103
+ /** Seconds it takes to come in (centred on the start) and to go out; default PUNCH_IN and PUNCH_OUT. */
104
+ in?: number;
105
+ out?: number;
106
+ /** The easing of its moves; default PUNCH_EASE. */
107
+ ease?: Ease;
108
+ }
109
+ /** Seconds a punch-in takes to come in and to go out. */
110
+ export declare const PUNCH_IN = 0.2;
111
+ export declare const PUNCH_OUT = 0.25;
112
+ /** The default punch-in scale. */
113
+ export declare const PUNCH_SCALE = 1.12;
114
+ /** The default easing of a punch-in's moves. */
115
+ export declare const PUNCH_EASE: Ease;
116
+ /** The point a punch-in zooms about without a face then: fractions of the box. */
117
+ export declare const PUNCH_CENTER: {
118
+ readonly x: 0.5;
119
+ readonly y: 0.42;
120
+ };
121
+ /**
122
+ * Zoom keys from punch-ins: eased in over `in` (PUNCH_IN) centred on the
123
+ * start, held, eased out over `out` (PUNCH_OUT) after the end; punch-ins
124
+ * that meet hold between them instead of going out and in again.
125
+ */
126
+ export declare function punchKeys(spans: readonly PunchSpan[]): {
127
+ t: number;
128
+ z: number;
129
+ cx: number;
130
+ cy: number;
131
+ ease?: Ease;
132
+ }[];
133
+ /** The default pullback: from 1.12× back to the whole picture over 0.6 s, easing out. */
134
+ export declare const PULLBACK_SCALE = 1.12;
135
+ export declare const PULLBACK_DUR = 0.6;
136
+ export declare const PULLBACK_EASE: Ease;
137
+ /**
138
+ * Zoom keys that open a layer on a pullback: zoomed in by `scale` at
139
+ * `start`, eased out to the whole picture over `dur`, then the punch-ins'
140
+ * keys. A punch-in that starts sooner cuts the pullback short (it reaches
141
+ * the whole picture where the punch-in begins); one that starts at or
142
+ * before `start` leaves no room for it.
143
+ */
144
+ export declare function pullbackKeys(start: number, p: {
145
+ scale: number;
146
+ dur: number;
147
+ cx: number;
148
+ cy: number;
149
+ ease?: Ease;
150
+ }, punches?: readonly {
151
+ t: number;
152
+ z: number;
153
+ cx: number;
154
+ cy: number;
155
+ ease?: Ease;
156
+ }[]): {
157
+ t: number;
158
+ z: number;
159
+ cx: number;
160
+ cy: number;
161
+ ease?: Ease;
162
+ }[];
163
+ /** "free@1.15" → { ref: "free", scale: 1.15 }; "free@2" stays the second "free". */
164
+ export declare function parsePunch(ref: string): {
165
+ ref: string;
166
+ scale?: number;
167
+ };
168
+ //# sourceMappingURL=footage-motion.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ import{faceAt as A,facesAt as C}from"./media.js";import{keyAt as l,rectAt as z,simplifyKeys as E}from"./motion.js";export function sourceAt(t,e){const n=t.cuts;if(n&&n.length>0){let c=n[0]??{at:t.start,from:t.from};for(const r of n)r.at<=e+1e-9&&(c=r);return c.from+(e-c.at)}return t.from+(e-t.start)*t.speed}export function zoomRect(t,e,n,c){if(e===1)return t;const r=1-1/e;return[t[0]+n*t[2]*r,t[1]+c*t[3]*r,t[2]/e,t[3]/e]}export function zoomChannel(t,e){return t.map(n=>({t:n.t,v:n[e],...n.ease?{ease:n.ease}:{}}))}export function placementAt(t,e){let n=t.box,c=t.picture;if(t.boxes&&t.boxes.length>0){const o=t.boxes[0]?.box??t.box,i=z(t.boxes.map(h=>({t:h.t,rect:h.box,...h.ease?{ease:h.ease}:{}})),e),a=boxFit(t,o,i),[f,m,u,x]=t.picture,s=i[0]+i[2]/2+(f+u/2-(o[0]+o[2]/2))*a,p=i[1]+i[3]/2+(m+x/2-(o[1]+o[3]/2))*a;c=[s-u*a/2,p-x*a/2,u*a,x*a],n=i}let r=t.crop;if(r&&t.pan&&t.pan.length>0){const o=l(t.pan.map(a=>({t:a.t,v:a.x})),e),i=l(t.pan.map(a=>({t:a.t,v:a.y})),e);r=[o,i,r[2],r[3]]}return r&&t.zoom&&t.zoom.length>0&&(r=zoomRect(r,l(zoomChannel(t.zoom,"z"),e),l(zoomChannel(t.zoom,"cx"),e),l(zoomChannel(t.zoom,"cy"),e))),{box:n,picture:c,...r?{crop:r}:{}}}export function boxFit(t,e,n){const[,,c,r]=t.picture;if(c<=0||r<=0||e[2]<=0||e[3]<=0)return 1;const o=t.fit==="cover"?Math.max:Math.min,i=o(e[2]/c,e[3]/r);return o(n[2]/c,n[3]/r)/i}export function sourceToFrame(t,e){const n=t.crop;if(!n)return e;const c=t.picture[2]/n[2],r=t.picture[3]/n[3];return[t.picture[0]+(e[0]-n[0])*c,t.picture[1]+(e[1]-n[1])*r,e[2]*c,e[3]*r]}function w(t,e){const n=Math.max(t[0],e[0]),c=Math.max(t[1],e[1]),r=Math.min(t[0]+t[2],e[0]+e[2]),o=Math.min(t[1]+t[3],e[1]+e[3]);return r>n&&o>c?[n,c,r-n,o-c]:void 0}export function faceOnFrame(t,e,n,c=t.speaker??e.speaker){if(n<t.start||n>=t.end)return;const r=A(e,sourceAt(t,n),c);if(!r)return;const o=placementAt(t,n);return w(sourceToFrame(o,r),o.box)}export function facesOnFrame(t,e,n){if(n<t.start||n>=t.end)return[];const c=placementAt(t,n);return C(e,sourceAt(t,n)).flatMap(r=>{const o=w(sourceToFrame(c,r.box),c.box);return o?[{id:r.id,box:o}]:[]})}export function reframeWindow(t,e){const n=e.w/e.h,c=Math.min(t.width,t.height*n);return{w:Math.min(t.width,Math.round(c)),h:Math.min(t.height,Math.round(c/n))}}export const REFRAME_FACE_Y=.4,REFRAME_FALLBACK={x:.5,y:.4};export function reframePath(t){const{window:e,source:n,layer:c}=t,r=s=>Math.min(Math.max(s,0),n.width-e.w),o=s=>Math.min(Math.max(s,0),n.height-e.h),i=t.faceY??REFRAME_FACE_Y,a=s=>{const p=t.track?A(t.track,sourceAt(c,s),t.speaker??t.track.speaker):void 0,h=p?p[0]+p[2]/2:(t.focus?.x??.5)*n.width,y=p?p[1]+p[3]/2:(t.focus?.y??.4)*n.height;return[r(h-e.w/2),o(y-e.h*i)]},f=(c.cuts??[]).map(s=>s.at).filter(s=>s>c.start&&s<c.end),m=[c.start,...f,c.end],u=[];for(let s=0;s<m.length-1;s++){const p=m[s]??0,h=m[s+1]??p,y=[];for(let d=p;d<h-1e-6;d+=.1)y.push({t:d,v:a(d)});const M=Math.max(p,h-.001);y.push({t:M,v:a(M)});for(const d of E(y,1.5))u.push({t:Math.round(d.t*1e6)/1e6,x:Math.round((d.v[0]??0)*100)/100,y:Math.round((d.v[1]??0)*100)/100})}const x=u[0];return x&&u.every(s=>s.x===x.x&&s.y===x.y)?[x]:u}export const PUNCH_IN=.2,PUNCH_OUT=.25,PUNCH_SCALE=1.12,PUNCH_EASE="in-out",PUNCH_CENTER={x:.5,y:.42};export function punchKeys(t){const e=[...t].sort((o,i)=>o.start-i.start),n=[],c=o=>Math.round(o*1e6)/1e6;let r=PUNCH_OUT;for(const o of e){const i=o.in??PUNCH_IN,a=o.out??PUNCH_OUT,f=o.ease??PUNCH_EASE,m=o.start-i/2,u=o.start+i/2,x=n.at(-1);x&&x.t>m?(n.pop(),n.push({t:c(Math.max(x.t-r,u)),z:o.scale,cx:o.cx,cy:o.cy,ease:f})):(n.push({t:c(Math.max(0,m)),z:1,cx:o.cx,cy:o.cy}),n.push({t:c(u),z:o.scale,cx:o.cx,cy:o.cy,ease:f}));const s=Math.max(o.end,u);n.push({t:c(s),z:o.scale,cx:o.cx,cy:o.cy}),n.push({t:c(s+a),z:1,cx:o.cx,cy:o.cy,ease:f}),r=a}return n}export const PULLBACK_SCALE=1.12,PULLBACK_DUR=.6,PULLBACK_EASE="out";export function pullbackKeys(t,e,n=[]){const c=a=>Math.round(a*1e6)/1e6,r=n[0],o=Math.min(t+e.dur,r?.t??1/0);if(o<=t+1e-6)return[...n];const i=r&&r.t<=o+1e-9&&r.z===1?n.slice(1):n;return[{t:c(t),z:e.scale,cx:e.cx,cy:e.cy},{t:c(o),z:1,cx:e.cx,cy:e.cy,ease:e.ease??PULLBACK_EASE},...i]}export function parsePunch(t){const e=/^(.*\S)@(\d*\.\d+)$/u.exec(t.trim());return!e?.[1]||e[2]===void 0?{ref:t}:{ref:e[1],scale:Number(e[2])}}
@@ -0,0 +1,240 @@
1
+ export declare const PRESETS: readonly ["16x9", "9x16", "1x1", "4x5"];
2
+ export type Preset = (typeof PRESETS)[number];
3
+ export declare function isPreset(v: unknown): v is Preset;
4
+ export interface SafeZone {
5
+ top: number;
6
+ bottom: number;
7
+ left: number;
8
+ right: number;
9
+ }
10
+ export interface SizeInfo {
11
+ width: number;
12
+ height: number;
13
+ orient: "landscape" | "portrait" | "square";
14
+ /**
15
+ * Edges covered by platform UI (captions, buttons, the right-hand action
16
+ * rail on TikTok and Reels), in pixels. Text there is reported as a text-covered fact.
17
+ * From our earlier prototypes.
18
+ */
19
+ safe: SafeZone;
20
+ /** A platform profile's length, loudness and file (when the format is one). */
21
+ profile?: PlatformProfile;
22
+ }
23
+ /**
24
+ * The defaults of the content box (layout(ctx) in @allyhub/sdk/dom,
25
+ * ctx.content), each one changeable: pixels of the frame.
26
+ */
27
+ export interface ContentOptions {
28
+ /**
29
+ * The least margin on every side; default 120 × k in a landscape frame,
30
+ * 84 × k in a portrait or square one (k: the short side / 1080).
31
+ */
32
+ margin?: number;
33
+ /** Kept between the covered top edge and the box; default 30 × k. */
34
+ topGap?: number;
35
+ /** Kept between the box and the covered bottom edge; default 20 × k. */
36
+ bottomGap?: number;
37
+ }
38
+ /** The content box's edges, in the frame's pixels, and the numbers they come from. */
39
+ export interface ContentEdges {
40
+ /** Type scale: the frame's short side / 1080 (1 in every preset). */
41
+ k: number;
42
+ /** The side margin: the least margin, or the wider covered side (left or right) when wider. */
43
+ pad: number;
44
+ top: number;
45
+ bottom: number;
46
+ left: number;
47
+ right: number;
48
+ }
49
+ /**
50
+ * The content box of a frame: clear of the covered edges (`safe`) with a
51
+ * gap, and at least a margin from every side. The sides are the same
52
+ * width (the wider covered side), so centred text stays centred:
53
+ *
54
+ * pad = max(margin, safe.left, safe.right)
55
+ * top = max(pad, safe.top + topGap)
56
+ * bottom = height − max(pad, safe.bottom + bottomGap)
57
+ * left = pad, right = width − pad
58
+ */
59
+ export declare function contentEdges(dims: Pick<SizeInfo, "width" | "height" | "orient" | "safe">, opts?: ContentOptions): ContentEdges;
60
+ export declare function presetInfo(preset: Preset): SizeInfo;
61
+ /** The platform profiles a video can be rendered as. */
62
+ export declare const PROFILES: readonly ["tiktok", "reels", "shorts", "meta-feed", "amazon", "linkedin"];
63
+ export type Profile = (typeof PROFILES)[number];
64
+ export declare function isProfile(v: unknown): v is Profile;
65
+ /** What a platform asks of a video: its frame, its interface, its length, its sound and its file. */
66
+ export interface PlatformProfile {
67
+ name: Profile;
68
+ /** The platform, for people. */
69
+ label: string;
70
+ width: number;
71
+ height: number;
72
+ /** Edges the platform's interface covers (captions, buttons, the action rail), in pixels. */
73
+ safe: SafeZone;
74
+ /** The longest video the placement takes, in seconds (AK-F001). */
75
+ maxDuration: number;
76
+ /** The loudness its sound is mastered to when the output does not choose (LUFS). */
77
+ loudness: number;
78
+ /** The file it takes. */
79
+ file: {
80
+ container: "mp4";
81
+ video: "h264";
82
+ audio: "aac";
83
+ /** The cover (thumbnail) size. */
84
+ cover: {
85
+ width: number;
86
+ height: number;
87
+ };
88
+ /** The largest file it accepts, bytes. */
89
+ maxBytes: number;
90
+ /**
91
+ * How allyhub render encodes an mp4 for it unless told otherwise: the
92
+ * constant rate factor (`--param crf`) and the most video bitrate, kbit/s
93
+ * (`EncodeOptions.maxBitrate`, 0 for none). AllyHub's choice for an upload, well
94
+ * under the platform's limits: the platform encodes what it receives
95
+ * again, so more bits make a bigger file, not a better video.
96
+ */
97
+ encode: {
98
+ crf: number;
99
+ maxKbps: number;
100
+ };
101
+ };
102
+ /**
103
+ * How the platform serves what it was given, as measured on videos
104
+ * downloaded from it: what `allyhub reference served` encodes a piece
105
+ * through to measure it as a viewer is served it. Absent where AllyHub
106
+ * has not measured it; the command's options set any of it.
107
+ */
108
+ served?: ServedEncode;
109
+ }
110
+ /** A platform's served encode: the picture's and the sound's. */
111
+ export interface ServedEncode {
112
+ video: {
113
+ codec: "h264";
114
+ profile: "high";
115
+ /** The average bitrate, kbit/s. */
116
+ kbps: number;
117
+ width: number;
118
+ height: number;
119
+ fps: number;
120
+ /** x264's preset. */
121
+ preset: string;
122
+ };
123
+ audio: {
124
+ /** HE-AAC v2 (SBR and parametric stereo), HE-AAC (SBR) or AAC-LC. */
125
+ codec: "he-aac-v2" | "he-aac" | "aac";
126
+ kbps: number;
127
+ rate: number;
128
+ channels: number;
129
+ };
130
+ }
131
+ /** A platform profile's frame, interface, length, sound and file. */
132
+ export declare function profileInfo(profile: Profile): PlatformProfile;
133
+ /** The profile of a format, when it is one. */
134
+ export declare function profileOf(format: string): PlatformProfile | undefined;
135
+ /** Frames per second when a video does not choose (`video(…, { fps })`). */
136
+ export declare const FPS = 30;
137
+ /** How long an output may take to load before it is a must-fix (AK-P002), seconds: a piece's `loadLimit` changes it. */
138
+ export declare const LOAD_LIMIT = 10;
139
+ /**
140
+ * The longest one moment may take to draw, seconds (AK-P003): the work its
141
+ * layers wait for (ctx.wait) and the pictures it shows decoding. A piece's
142
+ * `seekLimit` changes it; loading waits for its layers' work at most
143
+ * LOAD_WAITS times as long (a 3D scenery's build is part of it).
144
+ */
145
+ export declare const SEEK_LIMIT = 30;
146
+ /** How many seek limits the work layers wait for while loading may take (AK-P003). */
147
+ export declare const LOAD_WAITS = 4;
148
+ /** The highest frame rate a video can choose. */
149
+ export declare const MAX_FPS = 120;
150
+ /** What video(…, { fps }) takes, in words (for errors and help). */
151
+ export declare const FPS_HELP = "a whole number from 1 to 120, or an NTSC rate: 23.976, 29.97, 47.952, 59.94 or 119.88 (also written 24000/1001, 30000/1001 \u2026)";
152
+ /**
153
+ * A frame rate as video(…, { fps }) gives it, in frames per second:
154
+ * 1–120 whole, or an NTSC rate as a decimal (29.97) or a fraction
155
+ * ("30000/1001"), which gives the exact n × 1000/1001. Undefined when it is
156
+ * neither.
157
+ */
158
+ export declare function parseFps(v: unknown): number | undefined;
159
+ /**
160
+ * A frame rate as ffmpeg and URLs take it: "30", or "30000/1001" for an
161
+ * NTSC rate, with its numerator and denominator.
162
+ */
163
+ export declare function fpsRational(fps: number): {
164
+ num: number;
165
+ den: number;
166
+ text: string;
167
+ };
168
+ /** Quantizes a time to the frame grid: floor(t × fps + 1e-9) / fps. */
169
+ export declare function toFrame(t: number, fps?: number): number;
170
+ /** Rounds a time to the nearest frame boundary. */
171
+ export declare function roundToFrame(t: number, fps?: number): number;
172
+ /** Document formats a paged output can have besides the four presets. */
173
+ export declare const PAGE_FORMATS: readonly ["a4", "letter"];
174
+ export type PageFormat = (typeof PAGE_FORMATS)[number];
175
+ /**
176
+ * A format: one of the four presets, a document format, or `WxH` in
177
+ * pixels (each side 64–8192), e.g. "1200x630". Presets win: "16x9" is
178
+ * the 1920×1080 frame, not 16 by 9 pixels.
179
+ */
180
+ export type Format = Preset | Profile | PageFormat | `${number}x${number}`;
181
+ /** Pixels per inch of the document formats: print quality for PNGs and slides. */
182
+ export declare const PAGE_DPI = 150;
183
+ /**
184
+ * A format with some of its numbers changed, in `formats` (or a paged
185
+ * output's `format`) in place of its name: its covered edges (`safe`, any
186
+ * format), and a platform profile's longest length (`maxDuration`,
187
+ * AK-F001) and mastering loudness (`loudness`, LUFS). Its name stays the
188
+ * format's own (`format`): combos, file names and --format use it, so a
189
+ * format is listed once, changed or not.
190
+ */
191
+ export interface FormatSpec {
192
+ format: Format;
193
+ /** Pixels covered at each edge; the edges not given (or undefined) keep the format's. */
194
+ safe?: {
195
+ [K in keyof SafeZone]?: number | undefined;
196
+ };
197
+ /** A platform profile's longest video, seconds. */
198
+ maxDuration?: number;
199
+ /** A platform profile's loudness when the output does not choose (`master`), LUFS. */
200
+ loudness?: number;
201
+ }
202
+ /** What `formats` lists: a format's name, or a format with numbers changed. */
203
+ export type FormatEntry = Format | FormatSpec;
204
+ /** The name of a formats entry: the format itself. */
205
+ export declare function formatName(entry: string | {
206
+ format: string;
207
+ }): string;
208
+ /** The entry of `entries` named `name` (the format's spec when it has one). */
209
+ export declare function formatEntry(entries: readonly (string | FormatSpec)[], name: string): string | FormatSpec | undefined;
210
+ /**
211
+ * What is wrong with a format spec beyond its format's name (one line), or
212
+ * undefined: the covered edges are whole pixels that leave some of the
213
+ * frame, and a length or loudness belongs to a platform profile.
214
+ */
215
+ export declare function formatSpecProblem(spec: FormatSpec): string | undefined;
216
+ /**
217
+ * A format's pixels, orientation and safe zone, from its name or from a
218
+ * spec (with the spec's numbers); undefined when it is not one. Document
219
+ * and custom formats have no platform UI over them, so no safe zone
220
+ * unless a spec gives one.
221
+ */
222
+ export declare function formatInfo(format: string | FormatSpec): SizeInfo | undefined;
223
+ /**
224
+ * A video format: one of the four presets, or `WxH` in pixels with
225
+ * even sides (64–8192), e.g. "1280x720". H.264 needs even sides. Custom
226
+ * formats have no safe zone.
227
+ */
228
+ export type VideoFormat = Preset | Profile | `${number}x${number}`;
229
+ export declare function isVideoFormat(v: unknown): v is VideoFormat;
230
+ export declare function isFormat(v: unknown): v is Format;
231
+ /** The formats a video can have, in words (for errors and help). */
232
+ export declare const VIDEO_FORMAT_HELP: string;
233
+ /** The formats a paged output can have, in words (for errors and help). */
234
+ export declare const FORMAT_HELP: string;
235
+ /**
236
+ * The paper a format prints on (CSS `@page size`): A4 and Letter at their
237
+ * real size; any other format at its pixels (96 per inch, as Chrome prints).
238
+ */
239
+ export declare function paperOf(format: string): string;
240
+ //# sourceMappingURL=formats.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export const PRESETS=["16x9","9x16","1x1","4x5"];export function isPreset(e){return typeof e=="string"&&PRESETS.includes(e)}const f={"16x9":{width:1920,height:1080,orient:"landscape",safe:{top:60,bottom:90,left:80,right:80}},"9x16":{width:1080,height:1920,orient:"portrait",safe:{top:150,bottom:400,left:40,right:140}},"1x1":{width:1080,height:1080,orient:"square",safe:{top:50,bottom:90,left:40,right:40}},"4x5":{width:1080,height:1350,orient:"portrait",safe:{top:60,bottom:120,left:40,right:40}}};export function contentEdges(e,t={}){const{width:o,height:i,orient:n,safe:r}=e,a=Math.min(o,i)/1080,x=t.margin??(n==="landscape"?120:84)*a,s=Math.max(x,r.left,r.right),g=Math.max(s,r.top+(t.topGap??30*a)),b=i-Math.max(s,r.bottom+(t.bottomGap??20*a));return{k:a,pad:s,top:g,bottom:b,left:s,right:o-s}}export function presetInfo(e){return f[e]}export const PROFILES=["tiktok","reels","shorts","meta-feed","amazon","linkedin"];export function isProfile(e){return typeof e=="string"&&PROFILES.includes(e)}const d={tiktok:{name:"tiktok",label:"TikTok",width:1080,height:1920,safe:{top:240,bottom:660,left:120,right:180},maxDuration:600,loudness:-14,file:{container:"mp4",video:"h264",audio:"aac",cover:{width:1080,height:1920},maxBytes:5e8,encode:{crf:20,maxKbps:6e3}},served:{video:{codec:"h264",profile:"high",kbps:900,width:720,height:1280,fps:30,preset:"slow"},audio:{codec:"he-aac-v2",kbps:32,rate:44100,channels:2}}},reels:{name:"reels",label:"Instagram Reels",width:1080,height:1920,safe:{top:269,bottom:672,left:65,right:65},maxDuration:180,loudness:-14,file:{container:"mp4",video:"h264",audio:"aac",cover:{width:1080,height:1920},maxBytes:4e9,encode:{crf:20,maxKbps:6e3}}},shorts:{name:"shorts",label:"YouTube Shorts",width:1080,height:1920,safe:{top:288,bottom:672,left:48,right:192},maxDuration:180,loudness:-14,file:{container:"mp4",video:"h264",audio:"aac",cover:{width:1080,height:1920},maxBytes:256e9,encode:{crf:20,maxKbps:8e3}}},"meta-feed":{name:"meta-feed",label:"Facebook and Instagram feed",width:1080,height:1350,safe:{top:60,bottom:120,left:40,right:40},maxDuration:14460,loudness:-14,file:{container:"mp4",video:"h264",audio:"aac",cover:{width:1080,height:1350},maxBytes:4e9,encode:{crf:20,maxKbps:6e3}}},amazon:{name:"amazon",label:"Amazon Sponsored Brands video",width:1920,height:1080,safe:{top:60,bottom:90,left:80,right:80},maxDuration:45,loudness:-14,file:{container:"mp4",video:"h264",audio:"aac",cover:{width:1920,height:1080},maxBytes:5e8,encode:{crf:20,maxKbps:8e3}}},linkedin:{name:"linkedin",label:"LinkedIn",width:1080,height:1080,safe:{top:50,bottom:90,left:40,right:40},maxDuration:1800,loudness:-14,file:{container:"mp4",video:"h264",audio:"aac",cover:{width:1080,height:1080},maxBytes:2e8,encode:{crf:20,maxKbps:6e3}}}};export function profileInfo(e){return d[e]}export function profileOf(e){return isProfile(e)?d[e]:void 0}export const FPS=30,LOAD_LIMIT=10,SEEK_LIMIT=30,LOAD_WAITS=4,MAX_FPS=120;const u=[24,30,48,60,120];export const FPS_HELP="a whole number from 1 to 120, or an NTSC rate: 23.976, 29.97, 47.952, 59.94 or 119.88 (also written 24000/1001, 30000/1001 …)";export function parseFps(e){if(typeof e=="number"){if(!Number.isFinite(e))return;if(Number.isInteger(e))return e>=1&&e<=MAX_FPS?e:void 0;for(const i of u){const n=i*1e3/1001;if(Math.abs(e-n)<.005)return n}return}if(typeof e!="string")return;const t=e.trim(),o=/^(\d+)\s*\/\s*(\d+)$/.exec(t);if(o){const i=Number(o[1]),n=Number(o[2]);return n===1?parseFps(i):n===1001&&u.some(r=>r*1e3===i)?i/n:void 0}return t!==""&&Number.isFinite(Number(t))?parseFps(Number(t)):void 0}export function fpsRational(e){for(const o of u)if(Math.abs(e-o*1e3/1001)<1e-9)return{num:o*1e3,den:1001,text:`${String(o*1e3)}/1001`};const t=Math.round(e);return{num:t,den:1,text:String(t)}}export function toFrame(e,t=FPS){return Math.floor(e*t+1e-9)/t}export function roundToFrame(e,t=FPS){return Math.round(e*t)/t}export const PAGE_FORMATS=["a4","letter"],PAGE_DPI=150;const m={a4:{width:1240,height:1754,css:"210mm 297mm"},letter:{width:1275,height:1650,css:"8.5in 11in"}},w=/^([1-9]\d{1,3})x([1-9]\d{1,3})$/,p={top:0,bottom:0,left:0,right:0},h=(e,t)=>e>t?"landscape":e<t?"portrait":"square",c=e=>PAGE_FORMATS.includes(e);export function formatName(e){return typeof e=="string"?e:e.format}export function formatEntry(e,t){return e.find(o=>formatName(o)===t)}function _(e,t){const o={...e.safe,...l(t.safe??{})},i=e.profile;return{...e,safe:o,...i?{profile:{...i,safe:o,...t.maxDuration===void 0?{}:{maxDuration:t.maxDuration},...t.loudness===void 0?{}:{loudness:t.loudness}}}:{}}}function l(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}export function formatSpecProblem(e){const t=formatInfo(e.format);if(!t)return;const o={...t.safe,...l(e.safe??{})};for(const[i,n]of Object.entries(e.safe??{}))if(n!==void 0&&(!Number.isInteger(n)||n<0))return`safe.${i} is ${String(n)}: covered edges are whole pixels from 0`;if(o.left+o.right>=t.width||o.top+o.bottom>=t.height)return`safe leaves nothing of the ${String(t.width)}×${String(t.height)} frame uncovered`;if(!t.profile&&(e.maxDuration!==void 0||e.loudness!==void 0))return`${e.format} is not a platform profile (${PROFILES.join(", ")}): maxDuration and loudness belong to one; a video's own limit is video(…, { maxDuration }) and its loudness video(…, { master })`}export function formatInfo(e){if(typeof e!="string"){const n=formatInfo(e.format);return n&&_(n,e)}if(isPreset(e))return f[e];if(isProfile(e)){const n=d[e];return{width:n.width,height:n.height,orient:h(n.width,n.height),safe:n.safe,profile:n}}if(c(e)){const n=m[e];return{width:n.width,height:n.height,orient:h(n.width,n.height),safe:p}}const t=w.exec(e);if(!t)return;const o=Number(t[1]),i=Number(t[2]);if(!(o<64||i<64||o>8192||i>8192))return{width:o,height:i,orient:h(o,i),safe:p}}export function isVideoFormat(e){if(isPreset(e)||isProfile(e))return!0;if(typeof e!="string"||c(e))return!1;const t=formatInfo(e);return t!==void 0&&t.width%2===0&&t.height%2===0}export function isFormat(e){return typeof e=="string"&&formatInfo(e)!==void 0}export const VIDEO_FORMAT_HELP=`one of ${PRESETS.join(", ")}, a platform profile (${PROFILES.join(", ")}), or WIDTHxHEIGHT in pixels with even sides from 64 to 8192, such as 1280x720`,FORMAT_HELP=`one of ${[...PRESETS,...PAGE_FORMATS].join(", ")}, a platform profile (${PROFILES.join(", ")}), or WIDTHxHEIGHT in pixels (each side 64–8192, such as 1200x630)`;export function paperOf(e){if(c(e))return m[e].css;const t=formatInfo(e)??f["16x9"];return`${String(t.width)}px ${String(t.height)}px`}
@@ -0,0 +1,37 @@
1
+ import { type GenFile } from "@allyhub-next/formats";
2
+ /** Where a file fetched from a library came from: the library, its page, its authors and its licence (SPDX). */
3
+ export type GenSource = NonNullable<GenFile["source"]>;
4
+ /** What a media value says of its record (`MediaInfo.gen`). */
5
+ export interface MediaGen {
6
+ /** The record's path in the project. */
7
+ record: string;
8
+ ai: boolean;
9
+ tool?: string;
10
+ model?: string;
11
+ /** When it was made (ISO 8601). */
12
+ at?: string;
13
+ credits?: number;
14
+ /** The input as recorded (the prompt, the settings). */
15
+ input?: Record<string, unknown>;
16
+ /** What the tool returned about the file, as recorded. */
17
+ output?: Record<string, unknown>;
18
+ /** The file's sha256 as the record has it. */
19
+ sha256?: string;
20
+ /** A file fetched from a library: where from, who made it, its licence. */
21
+ source?: GenSource;
22
+ /**
23
+ * Whether that is this file's sha256: false when the record was moved
24
+ * beside another file or the file was changed since.
25
+ */
26
+ matches?: boolean;
27
+ }
28
+ /**
29
+ * A `.gen.json`'s content as a media value's `gen`, or why it cannot be
30
+ * read. `sha256` is the media file's own.
31
+ */
32
+ export declare function mediaGen(record: string, value: unknown, sha256: string): {
33
+ gen: MediaGen;
34
+ } | {
35
+ error: string;
36
+ };
37
+ //# sourceMappingURL=gen.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ import{GenFileSchema as u}from"@allyhub-next/formats";import{z as d}from"zod";export function mediaGen(r,o,n){const t=u.safeParse(o);if(!t.success)return{error:d.prettifyError(t.error)};const e=t.data;return{gen:{record:r,ai:e.ai,...e.tool===void 0?{}:{tool:e.tool},...e.model===void 0?{}:{model:e.model},at:e.at,...e.credits===void 0?{}:{credits:e.credits},...e.input===void 0?{}:{input:e.input},...e.output===void 0?{}:{output:e.output},...e.source===void 0?{}:{source:e.source},sha256:e.sha256,matches:e.sha256===n}}}
@@ -0,0 +1,40 @@
1
+ export * from "./piece.js";
2
+ export * from "./slides.js";
3
+ export * from "./timeline.js";
4
+ export * from "./look.js";
5
+ export * from "./formats.js";
6
+ export * from "./placement.js";
7
+ export * from "./media.js";
8
+ export * from "./gen.js";
9
+ export * from "./messages.js";
10
+ export * from "./script.js";
11
+ export * from "./anchors.js";
12
+ export * from "./marks.js";
13
+ export * from "./script-edit.js";
14
+ export * from "./edit.js";
15
+ export * from "./timing.js";
16
+ export * from "./music.js";
17
+ export * from "./words.js";
18
+ export * from "./speech.js";
19
+ export * from "./edits.js";
20
+ export * from "./voice.js";
21
+ export * from "./transcript.js";
22
+ export * from "./cut-report.js";
23
+ export * from "./captions.js";
24
+ export * from "./transition.js";
25
+ export * from "./motion.js";
26
+ export * from "./footage-motion.js";
27
+ export * from "./backdrop.js";
28
+ export * from "./measure.js";
29
+ export * from "./seams.js";
30
+ export * from "./contrast.js";
31
+ export * from "./matrix.js";
32
+ export * from "./problem.js";
33
+ export * from "./fact.js";
34
+ export * from "./console.js";
35
+ export * from "./export.js";
36
+ export * from "./schema.js";
37
+ export * from "./audio-types.js";
38
+ export * from "./render-types.js";
39
+ export * from "./sound-under.js";
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export*from"./piece.js";export*from"./slides.js";export*from"./timeline.js";export*from"./look.js";export*from"./formats.js";export*from"./placement.js";export*from"./media.js";export*from"./gen.js";export*from"./messages.js";export*from"./script.js";export*from"./anchors.js";export*from"./marks.js";export*from"./script-edit.js";export*from"./edit.js";export*from"./timing.js";export*from"./music.js";export*from"./words.js";export*from"./speech.js";export*from"./edits.js";export*from"./voice.js";export*from"./transcript.js";export*from"./cut-report.js";export*from"./captions.js";export*from"./transition.js";export*from"./motion.js";export*from"./footage-motion.js";export*from"./backdrop.js";export*from"./measure.js";export*from"./seams.js";export*from"./contrast.js";export*from"./matrix.js";export*from"./problem.js";export*from"./fact.js";export*from"./console.js";export*from"./export.js";export*from"./schema.js";export*from"./audio-types.js";export*from"./render-types.js";export*from"./sound-under.js";
@@ -0,0 +1,66 @@
1
+ import type { PartDefaults } from "./piece.js";
2
+ /** A look: the variables components draw with (@allyhub/sdk's docs/video.md, "The look"). */
3
+ export interface Look {
4
+ name: string;
5
+ color: {
6
+ bg: string;
7
+ fg: string;
8
+ accent: string;
9
+ muted: string;
10
+ surface: string;
11
+ };
12
+ font: {
13
+ display: string;
14
+ body: string;
15
+ mono: string;
16
+ /** Colour emoji drawn on purpose (caption styles' `emoji`). */
17
+ emoji: string;
18
+ };
19
+ motion: {
20
+ /** Seconds per beat. */
21
+ beat: number;
22
+ };
23
+ /**
24
+ * The look's sounds by name, each an audio file (a path relative to the
25
+ * workspace's root), which a part's `sounds` name. The built-in
26
+ * synthesized sounds (BUILTIN_SFX) are there under their own names
27
+ * unless the look gives a file of the same name.
28
+ */
29
+ sfx: Record<string, string>;
30
+ }
31
+ /** The synthesized sounds every look has: a whoosh, a tick and a pop. */
32
+ export declare const BUILTIN_SFX: readonly ["whoosh", "tick", "pop"];
33
+ export type BuiltinSfx = (typeof BUILTIN_SFX)[number];
34
+ export declare function isBuiltinSfx(name: string): name is BuiltinSfx;
35
+ /** The platform's built-in look. */
36
+ export declare const CLEAN_LOOK: Look;
37
+ /** allyhub.config.ts `look`: the brand's colors and fonts for every video and deck. */
38
+ export interface LookConfig {
39
+ color?: Partial<Look["color"]>;
40
+ font?: Partial<Look["font"]>;
41
+ motion?: Partial<Look["motion"]>;
42
+ /** Sounds by name: audio files relative to the workspace's root. */
43
+ sfx?: Record<string, string>;
44
+ }
45
+ /**
46
+ * The looks a project's videos and decks draw with: its `look` laid over
47
+ * the clean one, under the clean one's name (the default every video and
48
+ * deck uses). Undefined when the project sets none.
49
+ */
50
+ export declare function projectLooks(look: LookConfig | undefined): Record<string, Look> | undefined;
51
+ /**
52
+ * What a BuildSource carries of allyhub.config.ts: `{ looks }` when it
53
+ * sets a look, `{ partDefaults }` when it sets `defaults.part`.
54
+ */
55
+ export declare function looksOf(config: {
56
+ look?: LookConfig | undefined;
57
+ defaults?: {
58
+ part?: PartDefaults | undefined;
59
+ } | undefined;
60
+ }): {
61
+ looks?: Record<string, Look>;
62
+ partDefaults?: PartDefaults;
63
+ };
64
+ /** The look as CSS custom properties (--ak-color-bg, --ak-font-display…). */
65
+ export declare function lookCss(look: Look): Record<string, string>;
66
+ //# sourceMappingURL=look.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export const BUILTIN_SFX=["whoosh","tick","pop"];export function isBuiltinSfx(o){return BUILTIN_SFX.includes(o)}export const CLEAN_LOOK={name:"clean",color:{bg:"#ffffff",fg:"#16181d",accent:"#2f5bea",muted:"#5d6470",surface:"#f3f4f6"},font:{display:'"Inter Variable", "Noto Sans SC", "Noto Sans CJK SC", sans-serif',body:'"Inter Variable", "Noto Sans SC", "Noto Sans CJK SC", sans-serif',mono:'ui-monospace, "SF Mono", Menlo, monospace',emoji:'"Noto Color Emoji"'},motion:{beat:.5},sfx:{}};export function projectLooks(o){if(o)return{clean:{...CLEAN_LOOK,color:{...CLEAN_LOOK.color,...o.color},font:{...CLEAN_LOOK.font,...o.font},motion:{...CLEAN_LOOK.motion,...o.motion},sfx:{...CLEAN_LOOK.sfx,...o.sfx}}}}export function looksOf(o){const t=projectLooks(o.look),n=o.defaults?.part;return{...t?{looks:t}:{},...n?{partDefaults:n}:{}}}export function lookCss(o){const t={};for(const[n,e]of Object.entries(o.color))t[`--ak-color-${n}`]=e;for(const[n,e]of Object.entries(o.font))t[`--ak-font-${n}`]=e;return t["--ak-motion-beat"]=`${String(o.motion.beat)}s`,t}
@@ -0,0 +1,34 @@
1
+ /** How a stretch of a text is marked: `at` to `end` of its characters. */
2
+ export interface InlineMark {
3
+ at: number;
4
+ end: number;
5
+ kind: "strong" | "em" | "code" | "strike";
6
+ }
7
+ /** A text read: its characters, and how stretches of them are marked. */
8
+ export interface MarkedText {
9
+ text: string;
10
+ marks: InlineMark[];
11
+ }
12
+ type Kind = InlineMark["kind"];
13
+ /** `text` may have marks: it has one of the characters they are written with. */
14
+ export declare const hasMarks: (text: string) => boolean;
15
+ /**
16
+ * A line read: its characters without the marks' delimiters, and the
17
+ * marks on them. A line without marks comes back as it is.
18
+ */
19
+ export declare function readMarks(text: string): MarkedText;
20
+ /** A line's characters, without its marks' delimiters. */
21
+ export declare const withoutMarks: (text: string) => string;
22
+ /** A stretch of a text with the same marks all through it. */
23
+ export interface MarkRun {
24
+ text: string;
25
+ /** The kinds of mark on it, in the order above; none: plain. */
26
+ kinds: Kind[];
27
+ }
28
+ /**
29
+ * A text as runs, in order: cut wherever a mark starts or ends, each run
30
+ * with the kinds of mark on it. For a text read with readMarks().
31
+ */
32
+ export declare function markRuns(text: string, marks?: readonly InlineMark[]): MarkRun[];
33
+ export {};
34
+ //# sourceMappingURL=marks.d.ts.map