allyhub 0.6.0 → 0.7.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 (621) hide show
  1. package/dist/audio-text.js +1 -1
  2. package/dist/commands/add.js +2 -2
  3. package/dist/commands/cloud-tools.js +5 -5
  4. package/dist/commands/dev.js +1 -1
  5. package/dist/commands/frames/piece.js +1 -1
  6. package/dist/commands/frames/sheet.js +1 -1
  7. package/dist/commands/frames.js +8 -8
  8. package/dist/commands/index.js +1 -1
  9. package/dist/commands/inspect/common.js +1 -1
  10. package/dist/commands/inspect/layout.js +1 -1
  11. package/dist/commands/render.js +1 -1
  12. package/dist/commands/sheet.js +5 -5
  13. package/dist/commands/site.js +3 -2
  14. package/dist/commands/skills.js +3 -3
  15. package/dist/commands/slides.js +2 -2
  16. package/dist/node_modules/@allyhub-next/audio/dist/node/index.js +1 -1
  17. package/dist/node_modules/@allyhub-next/audio/dist/node/master.js +1 -1
  18. package/dist/node_modules/@allyhub-next/audio/package.json +1 -1
  19. package/dist/node_modules/@allyhub-next/browser/dist/html.js +1 -1
  20. package/dist/node_modules/@allyhub-next/browser/package.json +1 -1
  21. package/dist/node_modules/@allyhub-next/build/dist/content.d.ts +4 -0
  22. package/dist/node_modules/@allyhub-next/build/dist/content.js +1 -1
  23. package/dist/node_modules/@allyhub-next/build/dist/index.d.ts +2 -2
  24. package/dist/node_modules/@allyhub-next/build/dist/index.js +1 -1
  25. package/dist/node_modules/@allyhub-next/build/dist/meta-worker.d.ts +2 -2
  26. package/dist/node_modules/@allyhub-next/build/dist/meta-worker.js +3 -3
  27. package/dist/node_modules/@allyhub-next/build/dist/move-refs.d.ts +1 -1
  28. package/dist/node_modules/@allyhub-next/build/dist/move-refs.js +1 -1
  29. package/dist/node_modules/@allyhub-next/build/dist/plugin.d.ts +12 -3
  30. package/dist/node_modules/@allyhub-next/build/dist/plugin.js +7 -6
  31. package/dist/node_modules/@allyhub-next/build/dist/prepare.d.ts +9 -5
  32. package/dist/node_modules/@allyhub-next/build/dist/prepare.js +2 -2
  33. package/dist/node_modules/@allyhub-next/build/dist/vite.d.ts +10 -0
  34. package/dist/node_modules/@allyhub-next/build/dist/vite.js +2 -2
  35. package/dist/node_modules/@allyhub-next/build/package.json +1 -1
  36. package/dist/node_modules/@allyhub-next/chart/dist/chart-xml.js +2 -2
  37. package/dist/node_modules/@allyhub-next/chart/dist/chart.d.ts +14 -5
  38. package/dist/node_modules/@allyhub-next/chart/dist/chart.js +1 -1
  39. package/dist/node_modules/@allyhub-next/chart/package.json +1 -1
  40. package/dist/node_modules/@allyhub-next/check/dist/check.js +3 -3
  41. package/dist/node_modules/@allyhub-next/check/package.json +1 -1
  42. package/dist/node_modules/@allyhub-next/cloud/dist/blobs.js +2 -0
  43. package/dist/node_modules/@allyhub-next/cloud/dist/call.js +4 -2
  44. package/dist/node_modules/@allyhub-next/cloud/dist/client.js +1 -1
  45. package/dist/node_modules/@allyhub-next/cloud/dist/errors.js +1 -1
  46. package/dist/node_modules/@allyhub-next/cloud/dist/hashes.js +2 -0
  47. package/dist/node_modules/@allyhub-next/cloud/dist/index.js +1 -1
  48. package/dist/node_modules/@allyhub-next/cloud/dist/sites.js +2 -0
  49. package/dist/node_modules/@allyhub-next/cloud/dist/voice.js +1 -1
  50. package/dist/node_modules/@allyhub-next/cloud/package.json +1 -1
  51. package/dist/node_modules/@allyhub-next/components/package.json +1 -1
  52. package/dist/node_modules/@allyhub-next/components/r/caption-subtitle.json +1 -1
  53. package/dist/node_modules/@allyhub-next/components/src/caption-subtitle.ts +54 -16
  54. package/dist/node_modules/@allyhub-next/dev-server/dist/background.js +1 -1
  55. package/dist/node_modules/@allyhub-next/dev-server/dist/fonts.js +2 -0
  56. package/dist/node_modules/@allyhub-next/dev-server/dist/index.js +1 -1
  57. package/dist/node_modules/@allyhub-next/dev-server/dist/live.js +1 -1
  58. package/dist/node_modules/@allyhub-next/dev-server/dist/project.js +1 -1
  59. package/dist/node_modules/@allyhub-next/dev-server/dist/reach.js +2 -0
  60. package/dist/node_modules/@allyhub-next/dev-server/dist/record.js +2 -0
  61. package/dist/node_modules/@allyhub-next/dev-server/dist/server.js +2 -2
  62. package/dist/node_modules/@allyhub-next/dev-server/dist/tools.js +1 -1
  63. package/dist/node_modules/@allyhub-next/dev-server/dist/tree.js +2 -0
  64. package/dist/node_modules/@allyhub-next/dev-server/package.json +1 -1
  65. package/dist/node_modules/@allyhub-next/doc/package.json +1 -1
  66. package/dist/node_modules/@allyhub-next/export/dist/deck-pptx.js +1 -1
  67. package/dist/node_modules/@allyhub-next/export/dist/export.js +5 -5
  68. package/dist/node_modules/@allyhub-next/export/dist/index.js +1 -1
  69. package/dist/node_modules/@allyhub-next/export/package.json +1 -1
  70. package/dist/node_modules/@allyhub-next/formats/dist/data/deck-code.d.ts +205 -0
  71. package/dist/node_modules/@allyhub-next/formats/dist/data/deck-code.js +2 -0
  72. package/dist/node_modules/@allyhub-next/formats/dist/data/script.d.ts +4 -1
  73. package/dist/node_modules/@allyhub-next/formats/dist/data/script.js +1 -1
  74. package/dist/node_modules/@allyhub-next/formats/dist/data/sheet.d.ts +69 -18
  75. package/dist/node_modules/@allyhub-next/formats/dist/data/sheet.js +1 -1
  76. package/dist/node_modules/@allyhub-next/formats/dist/data/slides.d.ts +847 -116
  77. package/dist/node_modules/@allyhub-next/formats/dist/data/slides.js +1 -1
  78. package/dist/node_modules/@allyhub-next/formats/dist/data/website.d.ts +20 -0
  79. package/dist/node_modules/@allyhub-next/formats/dist/data/website.js +2 -0
  80. package/dist/node_modules/@allyhub-next/formats/dist/index.d.ts +3 -0
  81. package/dist/node_modules/@allyhub-next/formats/dist/index.js +1 -1
  82. package/dist/node_modules/@allyhub-next/formats/dist/items.d.ts +1 -1
  83. package/dist/node_modules/@allyhub-next/formats/dist/items.js +1 -1
  84. package/dist/node_modules/@allyhub-next/formats/dist/media-type.d.ts +3 -0
  85. package/dist/node_modules/@allyhub-next/formats/dist/media-type.js +2 -0
  86. package/dist/node_modules/@allyhub-next/formats/dist/schemas.d.ts +501 -38
  87. package/dist/node_modules/@allyhub-next/formats/dist/schemas.js +1 -1
  88. package/dist/node_modules/@allyhub-next/formats/dist/strict.d.ts +2 -0
  89. package/dist/node_modules/@allyhub-next/formats/dist/strict.js +1 -1
  90. package/dist/node_modules/@allyhub-next/formats/package.json +2 -1
  91. package/dist/node_modules/@allyhub-next/measure/package.json +1 -1
  92. package/dist/node_modules/@allyhub-next/media/dist/index.d.ts +1 -1
  93. package/dist/node_modules/@allyhub-next/media/dist/index.js +1 -1
  94. package/dist/node_modules/@allyhub-next/media/dist/sheet.d.ts +2 -0
  95. package/dist/node_modules/@allyhub-next/media/dist/sheet.js +7 -7
  96. package/dist/node_modules/@allyhub-next/media/package.json +1 -1
  97. package/dist/node_modules/@allyhub-next/model/package.json +1 -1
  98. package/dist/node_modules/@allyhub-next/ooxml/dist/brightness.d.ts +31 -0
  99. package/dist/node_modules/@allyhub-next/ooxml/dist/brightness.js +2 -0
  100. package/dist/node_modules/@allyhub-next/ooxml/dist/color.d.ts +33 -0
  101. package/dist/node_modules/@allyhub-next/ooxml/dist/color.js +2 -0
  102. package/dist/node_modules/@allyhub-next/ooxml/dist/enums.d.ts +13 -0
  103. package/dist/node_modules/@allyhub-next/ooxml/dist/enums.js +2 -0
  104. package/dist/node_modules/@allyhub-next/ooxml/dist/ext.d.ts +79 -0
  105. package/dist/node_modules/@allyhub-next/ooxml/dist/ext.js +2 -0
  106. package/dist/node_modules/@allyhub-next/ooxml/dist/generated/enums.d.ts +132 -0
  107. package/dist/node_modules/@allyhub-next/ooxml/dist/generated/enums.js +2 -0
  108. package/dist/node_modules/@allyhub-next/ooxml/dist/generated/presets.d.ts +28 -0
  109. package/dist/node_modules/@allyhub-next/ooxml/dist/generated/presets.js +2 -0
  110. package/dist/node_modules/@allyhub-next/ooxml/dist/generated/spec.d.ts +4708 -0
  111. package/dist/node_modules/@allyhub-next/ooxml/dist/generated/spec.js +2 -0
  112. package/dist/node_modules/@allyhub-next/ooxml/dist/geometry/index.d.ts +57 -0
  113. package/dist/node_modules/@allyhub-next/ooxml/dist/geometry/index.js +2 -0
  114. package/dist/node_modules/@allyhub-next/ooxml/dist/index.d.ts +10 -0
  115. package/dist/node_modules/@allyhub-next/ooxml/dist/index.js +2 -0
  116. package/dist/node_modules/@allyhub-next/ooxml/dist/mce.d.ts +12 -0
  117. package/dist/node_modules/@allyhub-next/ooxml/dist/mce.js +2 -0
  118. package/dist/node_modules/@allyhub-next/ooxml/dist/node.d.ts +111 -0
  119. package/dist/node_modules/@allyhub-next/ooxml/dist/node.js +2 -0
  120. package/dist/node_modules/@allyhub-next/ooxml/dist/ns.d.ts +45 -0
  121. package/dist/node_modules/@allyhub-next/ooxml/dist/ns.js +2 -0
  122. package/dist/node_modules/@allyhub-next/ooxml/dist/opc.d.ts +48 -0
  123. package/dist/node_modules/@allyhub-next/ooxml/dist/opc.js +2 -0
  124. package/dist/node_modules/@allyhub-next/ooxml/dist/report.d.ts +45 -0
  125. package/dist/node_modules/@allyhub-next/ooxml/dist/report.js +2 -0
  126. package/dist/node_modules/@allyhub-next/ooxml/dist/xml.d.ts +28 -0
  127. package/dist/node_modules/@allyhub-next/ooxml/dist/xml.js +2 -0
  128. package/dist/node_modules/@allyhub-next/ooxml/package.json +26 -0
  129. package/dist/node_modules/@allyhub-next/project/dist/deck-keys.js +2 -0
  130. package/dist/node_modules/@allyhub-next/project/dist/deck-measure.js +2 -0
  131. package/dist/node_modules/@allyhub-next/project/dist/deck-pool.js +2 -0
  132. package/dist/node_modules/@allyhub-next/project/dist/index.js +1 -1
  133. package/dist/node_modules/@allyhub-next/project/dist/session.js +1 -1
  134. package/dist/node_modules/@allyhub-next/project/dist/stills.js +2 -0
  135. package/dist/node_modules/@allyhub-next/project/package.json +1 -1
  136. package/dist/node_modules/@allyhub-next/protocol/dist/account.d.ts +338 -0
  137. package/dist/node_modules/@allyhub-next/protocol/dist/account.js +2 -0
  138. package/dist/node_modules/@allyhub-next/protocol/dist/auth.d.ts +12 -13
  139. package/dist/node_modules/@allyhub-next/protocol/dist/auth.js +1 -1
  140. package/dist/node_modules/@allyhub-next/protocol/dist/blobs.d.ts +35 -0
  141. package/dist/node_modules/@allyhub-next/protocol/dist/blobs.js +2 -0
  142. package/dist/node_modules/@allyhub-next/protocol/dist/cloud.d.ts +101 -32
  143. package/dist/node_modules/@allyhub-next/protocol/dist/cloud.js +1 -1
  144. package/dist/node_modules/@allyhub-next/protocol/dist/editor.d.ts +79 -5
  145. package/dist/node_modules/@allyhub-next/protocol/dist/editor.js +1 -1
  146. package/dist/node_modules/@allyhub-next/protocol/dist/files.d.ts +2 -2
  147. package/dist/node_modules/@allyhub-next/protocol/dist/index.d.ts +6 -0
  148. package/dist/node_modules/@allyhub-next/protocol/dist/index.js +1 -1
  149. package/dist/node_modules/@allyhub-next/protocol/dist/notes.d.ts +21 -0
  150. package/dist/node_modules/@allyhub-next/protocol/dist/notes.js +1 -1
  151. package/dist/node_modules/@allyhub-next/protocol/dist/open.d.ts +13 -0
  152. package/dist/node_modules/@allyhub-next/protocol/dist/open.js +2 -0
  153. package/dist/node_modules/@allyhub-next/protocol/dist/registry.d.ts +73 -59
  154. package/dist/node_modules/@allyhub-next/protocol/dist/registry.js +1 -1
  155. package/dist/node_modules/@allyhub-next/protocol/dist/routes.d.ts +1 -1
  156. package/dist/node_modules/@allyhub-next/protocol/dist/routes.js +1 -1
  157. package/dist/node_modules/@allyhub-next/protocol/dist/shares.d.ts +115 -0
  158. package/dist/node_modules/@allyhub-next/protocol/dist/shares.js +2 -0
  159. package/dist/node_modules/@allyhub-next/protocol/dist/sites.d.ts +293 -0
  160. package/dist/node_modules/@allyhub-next/protocol/dist/sites.js +2 -0
  161. package/dist/node_modules/@allyhub-next/protocol/dist/snapshots.d.ts +377 -0
  162. package/dist/node_modules/@allyhub-next/protocol/dist/snapshots.js +2 -0
  163. package/dist/node_modules/@allyhub-next/protocol/dist/teams.d.ts +27 -9
  164. package/dist/node_modules/@allyhub-next/protocol/dist/teams.js +1 -1
  165. package/dist/node_modules/@allyhub-next/protocol/dist/tools.d.ts +53 -14
  166. package/dist/node_modules/@allyhub-next/protocol/dist/tools.js +1 -1
  167. package/dist/node_modules/@allyhub-next/protocol/package.json +2 -1
  168. package/dist/node_modules/@allyhub-next/registry/package.json +1 -1
  169. package/dist/node_modules/@allyhub-next/render/dist/doc/fonts.js +3 -2
  170. package/dist/node_modules/@allyhub-next/render/dist/doc/index.js +1 -1
  171. package/dist/node_modules/@allyhub-next/render/dist/doc/pdf.js +34 -0
  172. package/dist/node_modules/@allyhub-next/render/dist/doc/print.js +4 -4
  173. package/dist/node_modules/@allyhub-next/render/dist/exports.js +2 -2
  174. package/dist/node_modules/@allyhub-next/render/dist/pdf.js +2 -0
  175. package/dist/node_modules/@allyhub-next/render/package.json +1 -1
  176. package/dist/node_modules/@allyhub-next/runtime/dist/fonts.js +1 -1
  177. package/dist/node_modules/@allyhub-next/runtime/dist/music.js +1 -1
  178. package/dist/node_modules/@allyhub-next/runtime/package.json +1 -1
  179. package/dist/node_modules/@allyhub-next/runtimes/package.json +1 -1
  180. package/dist/node_modules/@allyhub-next/runtimes/schemas/runtimes.schema.json +25 -5
  181. package/dist/node_modules/@allyhub-next/scaffold/dist/index.js +4 -4
  182. package/dist/node_modules/@allyhub-next/scaffold/package.json +1 -1
  183. package/dist/node_modules/@allyhub-next/scenery/package.json +1 -1
  184. package/dist/node_modules/@allyhub-next/scenery-host/dist/bundle.d.ts +10 -0
  185. package/dist/node_modules/@allyhub-next/scenery-host/dist/bundle.js +3 -3
  186. package/dist/node_modules/@allyhub-next/scenery-host/package.json +1 -1
  187. package/dist/node_modules/@allyhub-next/sheet/dist/calc/analyse.d.ts +9 -3
  188. package/dist/node_modules/@allyhub-next/sheet/dist/calc/analyse.js +1 -1
  189. package/dist/node_modules/@allyhub-next/sheet/dist/calc/coerce.d.ts +5 -1
  190. package/dist/node_modules/@allyhub-next/sheet/dist/calc/coerce.js +1 -1
  191. package/dist/node_modules/@allyhub-next/sheet/dist/calc/engine.d.ts +60 -13
  192. package/dist/node_modules/@allyhub-next/sheet/dist/calc/engine.js +1 -1
  193. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/aggregate.js +1 -1
  194. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/convert.d.ts +4 -0
  195. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/convert.js +2 -0
  196. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/criteria.js +1 -1
  197. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/database.js +1 -1
  198. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/date.js +1 -1
  199. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/define.d.ts +27 -1
  200. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/define.js +1 -1
  201. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/delimiters.d.ts +16 -0
  202. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/delimiters.js +2 -0
  203. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/dynamic.d.ts +18 -1
  204. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/dynamic.js +1 -1
  205. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/finance.js +1 -1
  206. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/index.d.ts +2 -0
  207. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/index.js +1 -1
  208. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/info.js +1 -1
  209. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/kernels.js +1 -1
  210. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/logical.js +1 -1
  211. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/lookup.js +1 -1
  212. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/maths.js +1 -1
  213. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/modern.d.ts +2 -0
  214. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/modern.js +2 -0
  215. package/dist/node_modules/@allyhub-next/sheet/dist/calc/functions/text.js +1 -1
  216. package/dist/node_modules/@allyhub-next/sheet/dist/calc/graph.d.ts +38 -0
  217. package/dist/node_modules/@allyhub-next/sheet/dist/calc/graph.js +2 -0
  218. package/dist/node_modules/@allyhub-next/sheet/dist/calc/indexes.d.ts +19 -0
  219. package/dist/node_modules/@allyhub-next/sheet/dist/calc/indexes.js +2 -0
  220. package/dist/node_modules/@allyhub-next/sheet/dist/calc/remote.d.ts +49 -0
  221. package/dist/node_modules/@allyhub-next/sheet/dist/calc/remote.js +2 -0
  222. package/dist/node_modules/@allyhub-next/sheet/dist/calc/server.d.ts +82 -0
  223. package/dist/node_modules/@allyhub-next/sheet/dist/calc/server.js +2 -0
  224. package/dist/node_modules/@allyhub-next/sheet/dist/calc/types.d.ts +6 -1
  225. package/dist/node_modules/@allyhub-next/sheet/dist/calc/types.js +1 -1
  226. package/dist/node_modules/@allyhub-next/sheet/dist/chart.js +1 -1
  227. package/dist/node_modules/@allyhub-next/sheet/dist/check.js +1 -1
  228. package/dist/node_modules/@allyhub-next/sheet/dist/diff.d.ts +15 -0
  229. package/dist/node_modules/@allyhub-next/sheet/dist/diff.js +1 -1
  230. package/dist/node_modules/@allyhub-next/sheet/dist/export.d.ts +29 -8
  231. package/dist/node_modules/@allyhub-next/sheet/dist/export.js +3 -4
  232. package/dist/node_modules/@allyhub-next/sheet/dist/file.js +2 -2
  233. package/dist/node_modules/@allyhub-next/sheet/dist/format.d.ts +8 -2
  234. package/dist/node_modules/@allyhub-next/sheet/dist/format.js +1 -1
  235. package/dist/node_modules/@allyhub-next/sheet/dist/html.d.ts +52 -4
  236. package/dist/node_modules/@allyhub-next/sheet/dist/html.js +43 -11
  237. package/dist/node_modules/@allyhub-next/sheet/dist/index.d.ts +7 -3
  238. package/dist/node_modules/@allyhub-next/sheet/dist/index.js +1 -1
  239. package/dist/node_modules/@allyhub-next/sheet/dist/inspect.js +1 -1
  240. package/dist/node_modules/@allyhub-next/sheet/dist/paginate.d.ts +98 -0
  241. package/dist/node_modules/@allyhub-next/sheet/dist/paginate.js +2 -0
  242. package/dist/node_modules/@allyhub-next/sheet/dist/structure.js +1 -1
  243. package/dist/node_modules/@allyhub-next/sheet/dist/table-style.d.ts +32 -0
  244. package/dist/node_modules/@allyhub-next/sheet/dist/table-style.js +2 -0
  245. package/dist/node_modules/@allyhub-next/sheet/dist/table-styles.d.ts +3 -0
  246. package/dist/node_modules/@allyhub-next/sheet/dist/table-styles.js +2 -0
  247. package/dist/node_modules/@allyhub-next/sheet/dist/values.js +1 -1
  248. package/dist/node_modules/@allyhub-next/sheet/dist/workbook.d.ts +10 -1
  249. package/dist/node_modules/@allyhub-next/sheet/dist/workbook.js +1 -1
  250. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/charts.d.ts +10 -1
  251. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/charts.js +1 -1
  252. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/formula.d.ts +14 -4
  253. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/formula.js +2 -2
  254. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/functions.d.ts +11 -1
  255. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/functions.js +36 -16
  256. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/import.d.ts +3 -1
  257. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/import.js +1 -1
  258. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/read.d.ts +42 -1
  259. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/read.js +2 -1
  260. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/sax.d.ts +23 -0
  261. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/sax.js +2 -0
  262. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/styles.d.ts +2 -0
  263. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/styles.js +1 -1
  264. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/write.d.ts +6 -0
  265. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/write.js +1 -1
  266. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/zip.d.ts +40 -0
  267. package/dist/node_modules/@allyhub-next/sheet/dist/xlsx/zip.js +2 -0
  268. package/dist/node_modules/@allyhub-next/sheet/package.json +1 -1
  269. package/dist/node_modules/@allyhub-next/slides-core/dist/animation.js +1 -1
  270. package/dist/node_modules/@allyhub-next/slides-core/dist/api.d.ts +59 -39
  271. package/dist/node_modules/@allyhub-next/slides-core/dist/api.js +2 -2
  272. package/dist/node_modules/@allyhub-next/slides-core/dist/capabilities.js +1 -1
  273. package/dist/node_modules/@allyhub-next/slides-core/dist/chart-api.d.ts +27 -13
  274. package/dist/node_modules/@allyhub-next/slides-core/dist/chart-api.js +1 -1
  275. package/dist/node_modules/@allyhub-next/slides-core/dist/check.js +1 -1
  276. package/dist/node_modules/@allyhub-next/slides-core/dist/code.d.ts +33 -0
  277. package/dist/node_modules/@allyhub-next/slides-core/dist/code.js +2 -0
  278. package/dist/node_modules/@allyhub-next/slides-core/dist/components.d.ts +31 -0
  279. package/dist/node_modules/@allyhub-next/slides-core/dist/components.js +2 -0
  280. package/dist/node_modules/@allyhub-next/slides-core/dist/enums.d.ts +179 -16
  281. package/dist/node_modules/@allyhub-next/slides-core/dist/enums.js +1 -1
  282. package/dist/node_modules/@allyhub-next/slides-core/dist/file.d.ts +43 -21
  283. package/dist/node_modules/@allyhub-next/slides-core/dist/file.js +3 -3
  284. package/dist/node_modules/@allyhub-next/slides-core/dist/identity.d.ts +17 -0
  285. package/dist/node_modules/@allyhub-next/slides-core/dist/identity.js +2 -0
  286. package/dist/node_modules/@allyhub-next/slides-core/dist/index.d.ts +5 -1
  287. package/dist/node_modules/@allyhub-next/slides-core/dist/index.js +1 -1
  288. package/dist/node_modules/@allyhub-next/slides-core/dist/lang.d.ts +6 -0
  289. package/dist/node_modules/@allyhub-next/slides-core/dist/lang.js +2 -0
  290. package/dist/node_modules/@allyhub-next/slides-core/dist/measure.js +1 -1
  291. package/dist/node_modules/@allyhub-next/slides-core/dist/merge.d.ts +58 -0
  292. package/dist/node_modules/@allyhub-next/slides-core/dist/merge.js +2 -0
  293. package/dist/node_modules/@allyhub-next/slides-core/dist/model.d.ts +2 -4
  294. package/dist/node_modules/@allyhub-next/slides-core/dist/office.d.ts +17 -1
  295. package/dist/node_modules/@allyhub-next/slides-core/dist/office.js +1 -1
  296. package/dist/node_modules/@allyhub-next/slides-core/dist/resolve.d.ts +21 -5
  297. package/dist/node_modules/@allyhub-next/slides-core/dist/resolve.js +1 -1
  298. package/dist/node_modules/@allyhub-next/slides-core/dist/script.d.ts +18 -16
  299. package/dist/node_modules/@allyhub-next/slides-core/dist/script.js +2 -2
  300. package/dist/node_modules/@allyhub-next/slides-core/dist/stage.d.ts +51 -53
  301. package/dist/node_modules/@allyhub-next/slides-core/dist/strict.js +1 -1
  302. package/dist/node_modules/@allyhub-next/slides-core/dist/units.d.ts +27 -0
  303. package/dist/node_modules/@allyhub-next/slides-core/dist/units.js +1 -1
  304. package/dist/node_modules/@allyhub-next/slides-core/dist/values.d.ts +7 -0
  305. package/dist/node_modules/@allyhub-next/slides-core/dist/values.js +2 -0
  306. package/dist/node_modules/@allyhub-next/slides-core/package.json +1 -1
  307. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import/code.js +4 -0
  308. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import/index.js +3 -0
  309. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import/names.js +2 -0
  310. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import/script.js +2 -0
  311. package/dist/node_modules/@allyhub-next/slides-pptx/dist/index.js +1 -1
  312. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/chart.js +2 -0
  313. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/common.js +2 -0
  314. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/index.js +4 -0
  315. package/dist/{site.js → node_modules/@allyhub-next/slides-pptx/dist/read/model.js} +1 -1
  316. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/shapes.js +2 -0
  317. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/table.js +2 -0
  318. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/text.js +2 -0
  319. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read/timing.js +2 -0
  320. package/dist/node_modules/@allyhub-next/slides-pptx/dist/shapes.js +1 -1
  321. package/dist/node_modules/@allyhub-next/slides-pptx/dist/text.js +1 -1
  322. package/dist/node_modules/@allyhub-next/slides-pptx/dist/theme.js +1 -1
  323. package/dist/node_modules/@allyhub-next/slides-pptx/dist/timing.js +1 -1
  324. package/dist/node_modules/@allyhub-next/slides-pptx/dist/write.js +2 -2
  325. package/dist/node_modules/@allyhub-next/slides-pptx/dist/xml.js +2 -2
  326. package/dist/node_modules/@allyhub-next/slides-pptx/package.json +1 -1
  327. package/dist/node_modules/@allyhub-next/slides-runtime/dist/component.js +2 -0
  328. package/dist/node_modules/@allyhub-next/slides-runtime/dist/draw.js +2 -2
  329. package/dist/node_modules/@allyhub-next/slides-runtime/dist/index.js +1 -1
  330. package/dist/node_modules/@allyhub-next/slides-runtime/dist/load.js +5 -5
  331. package/dist/node_modules/@allyhub-next/slides-runtime/package.json +5 -1
  332. package/dist/node_modules/@allyhub-next/stage/dist/index.js +1 -1
  333. package/dist/node_modules/@allyhub-next/stage/dist/page.js +22 -12
  334. package/dist/node_modules/@allyhub-next/stage/dist/scenery-page.js +5 -5
  335. package/dist/node_modules/@allyhub-next/stage/dist/server.js +1 -1
  336. package/dist/node_modules/@allyhub-next/stage/package.json +1 -1
  337. package/dist/node_modules/@allyhub-next/stage-page/dist/host.js +1 -20
  338. package/dist/node_modules/@allyhub-next/stage-page/dist/runtime/probe.html +8 -0
  339. package/dist/{astro.js → node_modules/@allyhub-next/stage-page/dist/runtime/probe.js} +1 -1
  340. package/dist/node_modules/@allyhub-next/stage-page/dist/runtime/runtime.js +79 -0
  341. package/dist/node_modules/@allyhub-next/stage-page/dist/runtime/stage.html +21 -0
  342. package/dist/node_modules/@allyhub-next/stage-page/dist/runtime/stage.js +3 -0
  343. package/dist/node_modules/@allyhub-next/stage-page/dist/runtime/viewer.html +9 -0
  344. package/dist/node_modules/@allyhub-next/stage-page/dist/runtime/viewer.js +3 -0
  345. package/dist/node_modules/@allyhub-next/stage-page/package.json +2 -3
  346. package/dist/node_modules/@allyhub-next/video-core/dist/captions.js +6 -6
  347. package/dist/node_modules/@allyhub-next/video-core/dist/fact.d.ts +47 -8
  348. package/dist/node_modules/@allyhub-next/video-core/dist/fact.js +1 -1
  349. package/dist/node_modules/@allyhub-next/video-core/dist/index.d.ts +1 -0
  350. package/dist/node_modules/@allyhub-next/video-core/dist/index.js +1 -1
  351. package/dist/node_modules/@allyhub-next/video-core/dist/marks.d.ts +14 -0
  352. package/dist/node_modules/@allyhub-next/video-core/dist/marks.js +1 -1
  353. package/dist/node_modules/@allyhub-next/video-core/dist/music.d.ts +2 -1
  354. package/dist/node_modules/@allyhub-next/video-core/dist/piece.d.ts +11 -2
  355. package/dist/node_modules/@allyhub-next/video-core/dist/problem.d.ts +4 -0
  356. package/dist/node_modules/@allyhub-next/video-core/dist/problem.js +1 -1
  357. package/dist/node_modules/@allyhub-next/video-core/dist/schema.d.ts +2 -2
  358. package/dist/node_modules/@allyhub-next/video-core/dist/schema.js +1 -1
  359. package/dist/node_modules/@allyhub-next/video-core/dist/script.d.ts +2 -1
  360. package/dist/node_modules/@allyhub-next/video-core/dist/script.js +1 -1
  361. package/dist/node_modules/@allyhub-next/video-core/dist/source.d.ts +7 -0
  362. package/dist/node_modules/@allyhub-next/video-core/dist/source.js +2 -0
  363. package/dist/node_modules/@allyhub-next/video-core/dist/timeline.d.ts +10 -33
  364. package/dist/node_modules/@allyhub-next/video-core/package.json +1 -1
  365. package/dist/node_modules/@allyhub-next/website/LICENSE +241 -0
  366. package/dist/node_modules/@allyhub-next/website/dist/index.js +2 -0
  367. package/dist/node_modules/@allyhub-next/website/dist/publish.js +3 -0
  368. package/dist/node_modules/@allyhub-next/website/dist/rules.js +2 -0
  369. package/dist/node_modules/@allyhub-next/website/dist/website.js +4 -0
  370. package/dist/node_modules/@allyhub-next/website/package.json +13 -0
  371. package/dist/text/facts-text.js +4 -4
  372. package/dist/works.js +1 -1
  373. package/editor-web/assets/calc-worker-Bz9r26p1.js +158 -0
  374. package/editor-web/assets/dist-0emakyZE.js +36 -0
  375. package/editor-web/assets/dist-B3UoDUa5.js +37 -0
  376. package/editor-web/assets/dist-B6KzR3pN.js +10 -0
  377. package/editor-web/assets/dist-Bc5iA5k1.js +1 -0
  378. package/editor-web/assets/dist-CTQIm8Im.js +10 -0
  379. package/editor-web/assets/dist-CiHNHwyq.js +2 -0
  380. package/editor-web/assets/dist-DNZ8PQ-E.js +224 -0
  381. package/editor-web/assets/index-CFt3ovRY.js +69 -0
  382. package/editor-web/assets/index-ujKjdu_s.css +2 -0
  383. package/editor-web/assets/minus-BhoPZC5P.js +1 -0
  384. package/editor-web/assets/react-C_-rEEBU.js +101 -0
  385. package/editor-web/assets/tabs-Den4gHrU.js +105 -0
  386. package/editor-web/assets/text-align-start-CsW4nqqL.js +1 -0
  387. package/editor-web/index.html +5 -5
  388. package/package.json +8 -14
  389. package/dist/astro.d.ts +0 -2
  390. package/dist/node_modules/@allyhub-next/audio/dist/at-cut.d.ts +0 -52
  391. package/dist/node_modules/@allyhub-next/audio/dist/decode.d.ts +0 -33
  392. package/dist/node_modules/@allyhub-next/audio/dist/envelope.d.ts +0 -37
  393. package/dist/node_modules/@allyhub-next/audio/dist/index.d.ts +0 -17
  394. package/dist/node_modules/@allyhub-next/audio/dist/levels.d.ts +0 -97
  395. package/dist/node_modules/@allyhub-next/audio/dist/master.d.ts +0 -29
  396. package/dist/node_modules/@allyhub-next/audio/dist/music.d.ts +0 -11
  397. package/dist/node_modules/@allyhub-next/audio/dist/node/decode.d.ts +0 -39
  398. package/dist/node_modules/@allyhub-next/audio/dist/node/ebur128.d.ts +0 -25
  399. package/dist/node_modules/@allyhub-next/audio/dist/node/ffmpeg.d.ts +0 -31
  400. package/dist/node_modules/@allyhub-next/audio/dist/node/index.d.ts +0 -8
  401. package/dist/node_modules/@allyhub-next/audio/dist/node/loudness.d.ts +0 -18
  402. package/dist/node_modules/@allyhub-next/audio/dist/node/master.d.ts +0 -42
  403. package/dist/node_modules/@allyhub-next/audio/dist/node/measure.d.ts +0 -60
  404. package/dist/node_modules/@allyhub-next/audio/dist/node/mix.d.ts +0 -31
  405. package/dist/node_modules/@allyhub-next/audio/dist/plan.d.ts +0 -143
  406. package/dist/node_modules/@allyhub-next/audio/dist/recorded.d.ts +0 -26
  407. package/dist/node_modules/@allyhub-next/audio/dist/recording/bandwidth.d.ts +0 -47
  408. package/dist/node_modules/@allyhub-next/audio/dist/recording/chain.d.ts +0 -89
  409. package/dist/node_modules/@allyhub-next/audio/dist/recording/dynamics.d.ts +0 -64
  410. package/dist/node_modules/@allyhub-next/audio/dist/recording/fft.d.ts +0 -26
  411. package/dist/node_modules/@allyhub-next/audio/dist/recording/filters.d.ts +0 -42
  412. package/dist/node_modules/@allyhub-next/audio/dist/recording/fit.d.ts +0 -56
  413. package/dist/node_modules/@allyhub-next/audio/dist/recording/index.d.ts +0 -10
  414. package/dist/node_modules/@allyhub-next/audio/dist/recording/loudness.d.ts +0 -12
  415. package/dist/node_modules/@allyhub-next/audio/dist/recording/measure.d.ts +0 -67
  416. package/dist/node_modules/@allyhub-next/audio/dist/recording/mic.d.ts +0 -32
  417. package/dist/node_modules/@allyhub-next/audio/dist/recording/noise.d.ts +0 -27
  418. package/dist/node_modules/@allyhub-next/audio/dist/recording/presets.d.ts +0 -64
  419. package/dist/node_modules/@allyhub-next/audio/dist/recording/room.d.ts +0 -78
  420. package/dist/node_modules/@allyhub-next/audio/dist/recording/setup.d.ts +0 -111
  421. package/dist/node_modules/@allyhub-next/audio/dist/recording/vec.d.ts +0 -3
  422. package/dist/node_modules/@allyhub-next/audio/dist/render.d.ts +0 -26
  423. package/dist/node_modules/@allyhub-next/audio/dist/sfx.d.ts +0 -10
  424. package/dist/node_modules/@allyhub-next/audio/dist/shape.d.ts +0 -118
  425. package/dist/node_modules/@allyhub-next/audio/dist/voice.d.ts +0 -45
  426. package/dist/node_modules/@allyhub-next/browser/dist/browser.d.ts +0 -24
  427. package/dist/node_modules/@allyhub-next/browser/dist/capture.d.ts +0 -61
  428. package/dist/node_modules/@allyhub-next/browser/dist/cdp.d.ts +0 -51
  429. package/dist/node_modules/@allyhub-next/browser/dist/flags.d.ts +0 -13
  430. package/dist/node_modules/@allyhub-next/browser/dist/frames.d.ts +0 -35
  431. package/dist/node_modules/@allyhub-next/browser/dist/html.d.ts +0 -19
  432. package/dist/node_modules/@allyhub-next/browser/dist/index.d.ts +0 -10
  433. package/dist/node_modules/@allyhub-next/browser/dist/launch.d.ts +0 -35
  434. package/dist/node_modules/@allyhub-next/browser/dist/page.d.ts +0 -67
  435. package/dist/node_modules/@allyhub-next/browser/dist/server.d.ts +0 -26
  436. package/dist/node_modules/@allyhub-next/check/dist/cache.d.ts +0 -46
  437. package/dist/node_modules/@allyhub-next/check/dist/check.d.ts +0 -142
  438. package/dist/node_modules/@allyhub-next/check/dist/generated.d.ts +0 -22
  439. package/dist/node_modules/@allyhub-next/check/dist/index.d.ts +0 -7
  440. package/dist/node_modules/@allyhub-next/check/dist/plans.d.ts +0 -111
  441. package/dist/node_modules/@allyhub-next/check/dist/result.d.ts +0 -12
  442. package/dist/node_modules/@allyhub-next/check/dist/scenery.d.ts +0 -23
  443. package/dist/node_modules/@allyhub-next/dev-server/dist/background.d.ts +0 -50
  444. package/dist/node_modules/@allyhub-next/dev-server/dist/card.d.ts +0 -17
  445. package/dist/node_modules/@allyhub-next/dev-server/dist/exports.d.ts +0 -18
  446. package/dist/node_modules/@allyhub-next/dev-server/dist/index.d.ts +0 -11
  447. package/dist/node_modules/@allyhub-next/dev-server/dist/live.d.ts +0 -77
  448. package/dist/node_modules/@allyhub-next/dev-server/dist/mime.d.ts +0 -2
  449. package/dist/node_modules/@allyhub-next/dev-server/dist/mime.js +0 -2
  450. package/dist/node_modules/@allyhub-next/dev-server/dist/paths.d.ts +0 -27
  451. package/dist/node_modules/@allyhub-next/dev-server/dist/project.d.ts +0 -153
  452. package/dist/node_modules/@allyhub-next/dev-server/dist/reveal.d.ts +0 -6
  453. package/dist/node_modules/@allyhub-next/dev-server/dist/server.d.ts +0 -47
  454. package/dist/node_modules/@allyhub-next/dev-server/dist/sound.d.ts +0 -21
  455. package/dist/node_modules/@allyhub-next/dev-server/dist/stage.d.ts +0 -82
  456. package/dist/node_modules/@allyhub-next/dev-server/dist/stage.js +0 -121
  457. package/dist/node_modules/@allyhub-next/dev-server/dist/tools.d.ts +0 -24
  458. package/dist/node_modules/@allyhub-next/dev-server/dist/validate.d.ts +0 -6
  459. package/dist/node_modules/@allyhub-next/dev-server/dist/watcher.d.ts +0 -47
  460. package/dist/node_modules/@allyhub-next/dev-server/dist/writer.d.ts +0 -51
  461. package/dist/node_modules/@allyhub-next/export/dist/batch.d.ts +0 -70
  462. package/dist/node_modules/@allyhub-next/export/dist/deck-fonts.d.ts +0 -24
  463. package/dist/node_modules/@allyhub-next/export/dist/deck-pptx.d.ts +0 -12
  464. package/dist/node_modules/@allyhub-next/export/dist/export.d.ts +0 -123
  465. package/dist/node_modules/@allyhub-next/export/dist/index.d.ts +0 -5
  466. package/dist/node_modules/@allyhub-next/export/dist/names.d.ts +0 -36
  467. package/dist/node_modules/@allyhub-next/measure/dist/compare.d.ts +0 -195
  468. package/dist/node_modules/@allyhub-next/measure/dist/contrast.d.ts +0 -14
  469. package/dist/node_modules/@allyhub-next/measure/dist/cut-sheet.d.ts +0 -90
  470. package/dist/node_modules/@allyhub-next/measure/dist/cuts.d.ts +0 -108
  471. package/dist/node_modules/@allyhub-next/measure/dist/facts.d.ts +0 -60
  472. package/dist/node_modules/@allyhub-next/measure/dist/fidelity.d.ts +0 -40
  473. package/dist/node_modules/@allyhub-next/measure/dist/flat.d.ts +0 -42
  474. package/dist/node_modules/@allyhub-next/measure/dist/index.d.ts +0 -24
  475. package/dist/node_modules/@allyhub-next/measure/dist/loop.d.ts +0 -22
  476. package/dist/node_modules/@allyhub-next/measure/dist/overlay.d.ts +0 -57
  477. package/dist/node_modules/@allyhub-next/measure/dist/recording-report.d.ts +0 -66
  478. package/dist/node_modules/@allyhub-next/measure/dist/reference/compare.d.ts +0 -118
  479. package/dist/node_modules/@allyhub-next/measure/dist/reference/folder.d.ts +0 -75
  480. package/dist/node_modules/@allyhub-next/measure/dist/reference/interpret.d.ts +0 -39
  481. package/dist/node_modules/@allyhub-next/measure/dist/reference/piece.d.ts +0 -53
  482. package/dist/node_modules/@allyhub-next/measure/dist/reference/sections.d.ts +0 -53
  483. package/dist/node_modules/@allyhub-next/measure/dist/reference/sets.d.ts +0 -84
  484. package/dist/node_modules/@allyhub-next/measure/dist/reference/text.d.ts +0 -27
  485. package/dist/node_modules/@allyhub-next/measure/dist/reference/video.d.ts +0 -55
  486. package/dist/node_modules/@allyhub-next/measure/dist/seams.d.ts +0 -46
  487. package/dist/node_modules/@allyhub-next/measure/dist/sound-measures.d.ts +0 -74
  488. package/dist/node_modules/@allyhub-next/measure/dist/sound-report.d.ts +0 -156
  489. package/dist/node_modules/@allyhub-next/measure/dist/still.d.ts +0 -58
  490. package/dist/node_modules/@allyhub-next/measure/dist/version-voice.d.ts +0 -12
  491. package/dist/node_modules/@allyhub-next/project/dist/console.d.ts +0 -34
  492. package/dist/node_modules/@allyhub-next/project/dist/digest.d.ts +0 -9
  493. package/dist/node_modules/@allyhub-next/project/dist/index.d.ts +0 -11
  494. package/dist/node_modules/@allyhub-next/project/dist/ledger.d.ts +0 -17
  495. package/dist/node_modules/@allyhub-next/project/dist/media-index.d.ts +0 -27
  496. package/dist/node_modules/@allyhub-next/project/dist/page.d.ts +0 -119
  497. package/dist/node_modules/@allyhub-next/project/dist/says.d.ts +0 -15
  498. package/dist/node_modules/@allyhub-next/project/dist/scenery.d.ts +0 -35
  499. package/dist/node_modules/@allyhub-next/project/dist/session.d.ts +0 -37
  500. package/dist/node_modules/@allyhub-next/project/dist/stretch.d.ts +0 -38
  501. package/dist/node_modules/@allyhub-next/project/dist/version.d.ts +0 -114
  502. package/dist/node_modules/@allyhub-next/render/dist/cap.d.ts +0 -41
  503. package/dist/node_modules/@allyhub-next/render/dist/capture.d.ts +0 -78
  504. package/dist/node_modules/@allyhub-next/render/dist/clip.d.ts +0 -27
  505. package/dist/node_modules/@allyhub-next/render/dist/composite.d.ts +0 -106
  506. package/dist/node_modules/@allyhub-next/render/dist/delivery.d.ts +0 -18
  507. package/dist/node_modules/@allyhub-next/render/dist/doc/fonts.d.ts +0 -3
  508. package/dist/node_modules/@allyhub-next/render/dist/doc/index.d.ts +0 -3
  509. package/dist/node_modules/@allyhub-next/render/dist/doc/print.d.ts +0 -51
  510. package/dist/node_modules/@allyhub-next/render/dist/encode.d.ts +0 -111
  511. package/dist/node_modules/@allyhub-next/render/dist/errors.d.ts +0 -15
  512. package/dist/node_modules/@allyhub-next/render/dist/exports.d.ts +0 -67
  513. package/dist/node_modules/@allyhub-next/render/dist/ffmpeg.d.ts +0 -75
  514. package/dist/node_modules/@allyhub-next/render/dist/footage.d.ts +0 -169
  515. package/dist/node_modules/@allyhub-next/render/dist/image.d.ts +0 -16
  516. package/dist/node_modules/@allyhub-next/render/dist/index.d.ts +0 -26
  517. package/dist/node_modules/@allyhub-next/render/dist/junction.d.ts +0 -70
  518. package/dist/node_modules/@allyhub-next/render/dist/look.d.ts +0 -21
  519. package/dist/node_modules/@allyhub-next/render/dist/page.d.ts +0 -178
  520. package/dist/node_modules/@allyhub-next/render/dist/parts.d.ts +0 -140
  521. package/dist/node_modules/@allyhub-next/render/dist/png.d.ts +0 -37
  522. package/dist/node_modules/@allyhub-next/render/dist/pool.d.ts +0 -54
  523. package/dist/node_modules/@allyhub-next/render/dist/post-probe.d.ts +0 -27
  524. package/dist/node_modules/@allyhub-next/render/dist/post.d.ts +0 -27
  525. package/dist/node_modules/@allyhub-next/render/dist/render.d.ts +0 -151
  526. package/dist/node_modules/@allyhub-next/render/dist/segments.d.ts +0 -40
  527. package/dist/node_modules/@allyhub-next/render/dist/sound.d.ts +0 -24
  528. package/dist/node_modules/@allyhub-next/render/dist/stills.d.ts +0 -41
  529. package/dist/node_modules/@allyhub-next/render/dist/tools.d.ts +0 -25
  530. package/dist/node_modules/@allyhub-next/render/dist/webp.d.ts +0 -17
  531. package/dist/node_modules/@allyhub-next/runtime/dist/bridge.d.ts +0 -211
  532. package/dist/node_modules/@allyhub-next/runtime/dist/captions.d.ts +0 -24
  533. package/dist/node_modules/@allyhub-next/runtime/dist/clock.d.ts +0 -32
  534. package/dist/node_modules/@allyhub-next/runtime/dist/compose.d.ts +0 -149
  535. package/dist/node_modules/@allyhub-next/runtime/dist/console.d.ts +0 -21
  536. package/dist/node_modules/@allyhub-next/runtime/dist/contrast.d.ts +0 -13
  537. package/dist/node_modules/@allyhub-next/runtime/dist/embed.d.ts +0 -50
  538. package/dist/node_modules/@allyhub-next/runtime/dist/env.d.ts +0 -101
  539. package/dist/node_modules/@allyhub-next/runtime/dist/errors.d.ts +0 -21
  540. package/dist/node_modules/@allyhub-next/runtime/dist/facade.d.ts +0 -42
  541. package/dist/node_modules/@allyhub-next/runtime/dist/fonts.d.ts +0 -110
  542. package/dist/node_modules/@allyhub-next/runtime/dist/footage.d.ts +0 -52
  543. package/dist/node_modules/@allyhub-next/runtime/dist/frame.d.ts +0 -61
  544. package/dist/node_modules/@allyhub-next/runtime/dist/guards.d.ts +0 -32
  545. package/dist/node_modules/@allyhub-next/runtime/dist/index.d.ts +0 -14
  546. package/dist/node_modules/@allyhub-next/runtime/dist/inspect.d.ts +0 -112
  547. package/dist/node_modules/@allyhub-next/runtime/dist/locate.d.ts +0 -11
  548. package/dist/node_modules/@allyhub-next/runtime/dist/measure.d.ts +0 -41
  549. package/dist/node_modules/@allyhub-next/runtime/dist/mix-plan.d.ts +0 -42
  550. package/dist/node_modules/@allyhub-next/runtime/dist/music.d.ts +0 -29
  551. package/dist/node_modules/@allyhub-next/runtime/dist/output.d.ts +0 -5
  552. package/dist/node_modules/@allyhub-next/runtime/dist/pictures.d.ts +0 -39
  553. package/dist/node_modules/@allyhub-next/runtime/dist/piece.d.ts +0 -34
  554. package/dist/node_modules/@allyhub-next/runtime/dist/player/clips.d.ts +0 -41
  555. package/dist/node_modules/@allyhub-next/runtime/dist/player/cutout.d.ts +0 -57
  556. package/dist/node_modules/@allyhub-next/runtime/dist/player/player.d.ts +0 -78
  557. package/dist/node_modules/@allyhub-next/runtime/dist/reads.d.ts +0 -132
  558. package/dist/node_modules/@allyhub-next/runtime/dist/sound.d.ts +0 -22
  559. package/dist/node_modules/@allyhub-next/runtime/dist/speech.d.ts +0 -107
  560. package/dist/node_modules/@allyhub-next/runtime/dist/stage-kit.d.ts +0 -12
  561. package/dist/node_modules/@allyhub-next/runtime/dist/stage.d.ts +0 -34
  562. package/dist/node_modules/@allyhub-next/runtime/dist/styles.d.ts +0 -35
  563. package/dist/node_modules/@allyhub-next/runtime/dist/takes.d.ts +0 -72
  564. package/dist/node_modules/@allyhub-next/runtime/dist/titles.d.ts +0 -10
  565. package/dist/node_modules/@allyhub-next/runtime/dist/transitions.d.ts +0 -26
  566. package/dist/node_modules/@allyhub-next/site/dist/assets.d.ts +0 -59
  567. package/dist/node_modules/@allyhub-next/site/dist/assets.js +0 -2
  568. package/dist/node_modules/@allyhub-next/site/dist/astro.d.ts +0 -22
  569. package/dist/node_modules/@allyhub-next/site/dist/astro.js +0 -3
  570. package/dist/node_modules/@allyhub-next/site/dist/lockfile.d.ts +0 -40
  571. package/dist/node_modules/@allyhub-next/site/dist/lockfile.js +0 -3
  572. package/dist/node_modules/@allyhub-next/site/dist/media.d.ts +0 -24
  573. package/dist/node_modules/@allyhub-next/site/dist/media.js +0 -4
  574. package/dist/node_modules/@allyhub-next/site/package.json +0 -25
  575. package/dist/node_modules/@allyhub-next/slides-core/dist/preset.d.ts +0 -5
  576. package/dist/node_modules/@allyhub-next/slides-core/dist/preset.js +0 -2
  577. package/dist/node_modules/@allyhub-next/slides-pptx/dist/charts.d.ts +0 -6
  578. package/dist/node_modules/@allyhub-next/slides-pptx/dist/fonts.d.ts +0 -45
  579. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import.d.ts +0 -18
  580. package/dist/node_modules/@allyhub-next/slides-pptx/dist/import.js +0 -3
  581. package/dist/node_modules/@allyhub-next/slides-pptx/dist/index.d.ts +0 -5
  582. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read.d.ts +0 -56
  583. package/dist/node_modules/@allyhub-next/slides-pptx/dist/read.js +0 -4
  584. package/dist/node_modules/@allyhub-next/slides-pptx/dist/shapes.d.ts +0 -72
  585. package/dist/node_modules/@allyhub-next/slides-pptx/dist/text.d.ts +0 -32
  586. package/dist/node_modules/@allyhub-next/slides-pptx/dist/theme.d.ts +0 -4
  587. package/dist/node_modules/@allyhub-next/slides-pptx/dist/timing.d.ts +0 -32
  588. package/dist/node_modules/@allyhub-next/slides-pptx/dist/write.d.ts +0 -32
  589. package/dist/node_modules/@allyhub-next/slides-pptx/dist/xml.d.ts +0 -32
  590. package/dist/node_modules/@allyhub-next/slides-runtime/dist/draw.d.ts +0 -43
  591. package/dist/node_modules/@allyhub-next/slides-runtime/dist/edit.d.ts +0 -4
  592. package/dist/node_modules/@allyhub-next/slides-runtime/dist/edit.js +0 -2
  593. package/dist/node_modules/@allyhub-next/slides-runtime/dist/index.d.ts +0 -4
  594. package/dist/node_modules/@allyhub-next/slides-runtime/dist/ink.d.ts +0 -10
  595. package/dist/node_modules/@allyhub-next/slides-runtime/dist/load.d.ts +0 -6
  596. package/dist/node_modules/@allyhub-next/stage/dist/bakes.d.ts +0 -42
  597. package/dist/node_modules/@allyhub-next/stage/dist/graphics.d.ts +0 -7
  598. package/dist/node_modules/@allyhub-next/stage/dist/identity.d.ts +0 -2
  599. package/dist/node_modules/@allyhub-next/stage/dist/index.d.ts +0 -9
  600. package/dist/node_modules/@allyhub-next/stage/dist/page.d.ts +0 -87
  601. package/dist/node_modules/@allyhub-next/stage/dist/scenery-page.d.ts +0 -69
  602. package/dist/node_modules/@allyhub-next/stage/dist/scenery-solve.d.ts +0 -49
  603. package/dist/node_modules/@allyhub-next/stage/dist/scenery.d.ts +0 -8
  604. package/dist/node_modules/@allyhub-next/stage/dist/server.d.ts +0 -21
  605. package/dist/node_modules/@allyhub-next/stage-page/dist/host.d.ts +0 -22
  606. package/dist/node_modules/@allyhub-next/stage-page/dist/page.js +0 -79
  607. package/dist/site.d.ts +0 -2
  608. package/editor-web/assets/dist-BW2s9FMO.js +0 -4
  609. package/editor-web/assets/dist-C-6JmebI.js +0 -233
  610. package/editor-web/assets/dist-CCYMLMKN.js +0 -6
  611. package/editor-web/assets/dist-CHzurjMx.js +0 -33
  612. package/editor-web/assets/dist-DF7H1dxw.js +0 -1
  613. package/editor-web/assets/dist-Da5AUSKX.js +0 -2
  614. package/editor-web/assets/index-B7S9RZhL.css +0 -2
  615. package/editor-web/assets/index-CovQYWvD.js +0 -69
  616. package/editor-web/assets/minus-BrvjaJyO.js +0 -1
  617. package/editor-web/assets/react-DV5fPdiH.js +0 -101
  618. package/editor-web/assets/textarea-B0vCGdZI.js +0 -105
  619. package/editor-web/assets/trash-2-B0dvc1cZ.js +0 -1
  620. package/editor-web/assets/undo-2-A1EPubPO.js +0 -1
  621. /package/dist/node_modules/@allyhub-next/{site → ooxml}/LICENSE +0 -0
@@ -0,0 +1,21 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <link rel="stylesheet" href="fonts/inter/index.css">
6
+ <link rel="stylesheet" href="fonts/noto-sans-sc/400.css">
7
+ <link rel="stylesheet" href="fonts/noto-sans-sc/700.css">
8
+ <link rel="stylesheet" href="fonts/noto-color-emoji/emoji.css">
9
+ <link rel="stylesheet" href="fonts/arimo/arial.css">
10
+ <link rel="stylesheet" href="fonts/carlito/calibri.css">
11
+ <link rel="stylesheet" href="fonts/noto-sans-sc/microsoft-yahei.css">
12
+ <style>
13
+ html, body { margin: 0; padding: 0; background: #000; }
14
+ body { -webkit-font-smoothing: antialiased; }
15
+ #ak-stage *, #ak-stage *::before, #ak-stage *::after { box-sizing: border-box; }
16
+ </style>
17
+ <script type="module" src="runtime.js"></script>
18
+ <script type="module" src="stage.js"></script>
19
+ </head>
20
+ <body><div id="ak-stage"></div></body>
21
+ </html>
@@ -0,0 +1,3 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ var allyhub=()=>window.allyhub,post=e=>{parent.postMessage({allyhub:!0,...e},"*")},firstLine=e=>String(e instanceof Error?e.message:e).split(`
3
+ `)[0]??"",fail=e=>{post({type:"error",message:firstLine(e)})},asked=e=>e.source===parent&&typeof e.data=="object"&&e.data!==null&&e.data.allyhub===!0,q=new URLSearchParams(location.search),value=e=>{const t=q.get(e);return t===null||t===""?void 0:t},number=e=>{const t=value(e),n=t===void 0?void 0:Number(t);return n!==void 0&&Number.isFinite(n)?n:void 0};function comboOf(e){return e===void 0||e==="default"?{}:Object.fromEntries(e.split(",").map(t=>{const n=t.indexOf("=");return[t.slice(0,n),t.slice(n+1)]}))}async function sourceOf(e){const t=encodeURIComponent(encodeURIComponent(e)),n=await fetch(new URL(`../build/sources/${t}.json`,location.href));if(!n.ok)throw new Error(`The piece ${e} is not built here.`);return await n.json()}async function player(e,t,n){const d=await e,s=await allyhub().load(d,t),i=allyhub().output;if(!i)throw new Error("Nothing loaded.");const c=s.timeline;let o=number("t");const l=value("part"),p=l===void 0?void 0:c.parts.find(a=>a.key===l);if(p){const a=p.end-p.start,r=number("offset")??0,m=number("dur"),u=m===void 0||Math.abs(a-m)<1e-6;o=p.start+(u?r:r/Math.max(m,1e-6)*a),o=Math.min(o,p.end-1/c.fps)}const h={...n,size:d.format},v=Object.keys(h).sort().map(a=>`${a}=${h[a]??""}`).join(",");post({type:"loaded",kind:s.kind,timeline:c,text:s.text,reads:s.reads,problems:s.problems,mix:i.mixPlan()});const f={},b=[];addEventListener("message",a=>{if(!asked(a))return;const r=a.data;if(r.type==="objects"){i.objects(Number(r.t)).then(u=>{post({type:"objects",...u})},fail);return}if(r.type==="deck-update"){i.update?.(r.deck,r.media).then(u=>{post({type:"deck-updated",...u})},fail);return}if(r.type==="locate"){post({type:"located",id:r.id,layers:allyhub().locate(r.mark)});return}if(typeof r.type!="string")return;const m={...r,type:r.type};f.control?f.control.command(m):b.push(m)});const y=await allyhub().play({media:d.media,seed:`${d.piece}:${s.kind}:${v}`,...o===void 0?{}:{start:o},...value("chrome")==="0"?{chrome:!1}:{},post:a=>{post(a)}});f.control=y,value("play")==="1"&&y.command({type:"play"});for(const a of b.splice(0))y.command(a)}async function main(e){const t=comboOf(value("combo")),n=value("mode"),d=sourceOf(e),s={combo:t,purpose:n==="component"?"render":"play"};if(n==="code"){const i=d.then(o=>allyhub().deckCode(o,s)),c=()=>{i.then(o=>{post({type:"deck-code",code:o.code,theme:o.theme})},fail)};addEventListener("message",o=>{asked(o)&&o.data.type==="deck-code"&&c()}),c();return}if(n==="component"){let i=d.then(()=>{},fail);addEventListener("message",c=>{if(!asked(c)||c.data.type!=="component")return;const o=c.data;i=i.then(()=>d).then(l=>allyhub().component(l,s,{name:String(o.name),props:o.props??{},width:Number(o.width),height:Number(o.height),t:Number(o.t)})).then(()=>{post({type:"component-ready"})},fail)});return}await player(d,s,t)}var piece=value("piece");piece!==void 0&&main(piece).catch(e=>{const t=firstLine(e);document.body.style.cssText="margin:0;padding:16px;background:#141210;color:#fc9cbd;font:14px/1.5 system-ui,sans-serif",document.body.textContent=t,post({type:"error",message:t})});
@@ -0,0 +1,9 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <style>html,body{margin:0;height:100%;background:#1a1816}#ak-stage{position:fixed;inset:0}</style>
6
+ <script type="module" src="viewer.js"></script>
7
+ </head>
8
+ <body><div id="ak-stage"></div></body>
9
+ </html>
@@ -0,0 +1,3 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ var alone=parent===window,post=e=>{alone||parent.postMessage({allyhub:!0,...e},"*")},tree=new URL("../",location.href),inTree=e=>new URL(e.split("/").map(encodeURIComponent).join("/"),tree).href,isCamera=e=>{const n=a=>Array.isArray(a)&&a.length===3&&a.every(r=>typeof r=="number");return typeof e=="object"&&e!==null&&n(e.position)&&n(e.target)};function cameraOf(e){try{const n=JSON.parse(e??"null");return isCamera(n)?n:void 0}catch{return}}async function main(){const e=new URLSearchParams(location.search),n=e.get("file")??"",a=await fetch(new URL(`scenery/sources/${encodeURIComponent(encodeURIComponent(n))}.json`,tree));if(!a.ok)throw new Error(`The scenery ${n} is not built here.`);const r=await a.json(),l=new Set(r.bakes),c=await import(inTree(r.module)),i=document.getElementById("ak-stage");if(!i)throw new Error("The viewer page has no #ak-stage element.");const s={},m=[];addEventListener("message",t=>{const o=t.data;t.source!==parent||o?.allyhub!==!0||o.command===void 0||(s.viewer?s.viewer.command(o.command):m.push(o.command))});const d=await c.startViewer(c.scenery,{assetUrl:t=>inTree(`media/${t.replace(/^\/+/u,"")}`),module:n,decoders:inTree(r.decoders),seed:n,manifoldWasm:inTree(r.manifoldWasm),bakeUrl:(t,o)=>l.has(`${t}.${o}`)?inTree(`bakes/${t}.${o}.bin`):void 0},i,{marks:alone},t=>{post({type:"scenery",event:t})},cameraOf(e.get("camera")));s.viewer=d;for(const t of m.splice(0))d.command(t)}main().catch(e=>{const n=String(e instanceof Error?e.message:e).split(`
3
+ `)[0];document.body.style.cssText="margin:0;padding:16px;background:#141210;color:#fc9cbd;font:14px/1.5 system-ui,sans-serif",document.body.textContent=n??"",post({type:"error",message:n})});
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "@allyhub-next/stage-page",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/host.d.ts",
8
8
  "default": "./dist/host.js"
9
- },
10
- "./page.js": "./dist/page.js"
9
+ }
11
10
  },
12
11
  "private": true,
13
12
  "license": "SEE LICENSE IN LICENSE.md"
@@ -1,11 +1,11 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{changesOf as V}from"./anchors.js";import{normText as p,joinWords as z,ScriptAlignment as v,WordStream as F}from"./words.js";import{speechWords as D}from"./speech.js";export const CAPTION_CUE_DEFAULTS={maxChars:42,maxCharsCjk:16,minSeconds:.8,maxSeconds:6,gapFrames:2};export function speechLines(f,o,c){return f.parts.flatMap(r=>{const s=r.speech,h=s?c[s.file]?.words:void 0;if(!s||!h?.length)return[];const a=D(h,s);if(a.length===0)return[];const n=o.find(t=>t.key===r.key),e=n?.spoken??z(a);return[{part:r.key,shown:e,spoken:n?.speak??e,words:a}]})}export function shownToSpoken(f,o){const c=(s,h)=>p(s.slice(0,h)).length,r=[[0,0]];for(const s of V(f,o))r.push([c(f,s.at),c(o,s.into)]),r.push([c(f,s.at+s.removed),c(o,s.into+s.inserted)]);return r.push([p(f).length,p(o).length]),s=>{for(let h=1;h<r.length;h++){const[a,n]=r[h-1]??[0,0],[e,t]=r[h]??[0,0];if(s>e&&h<r.length-1)continue;if(e<=a)return s<=a?n:t;const u=Math.max(0,Math.min(1,(s-a)/(e-a)));return n+(t-n)*u}return 0}}const b=/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u,G=/[。!?!?…]|\.(?=\s|$)/u,J=/[,、;:,;:—]/u,H=/[,、;:。,;:.\s]+$/u;export function keptSpans(f,o){const c=[],r=U(f).map(s=>({...s,n:p(s.w)}));for(const s of o){const h=p(s);if(!h)continue;if(b.test(s)){const n=[];Array.from(f).reduce((t,u)=>(p(u)&&n.push(t),t+u.length),0);const e=p(f);for(let t=e.indexOf(h);t>=0;t=e.indexOf(h,t+1)){const u=n[t],x=n[t+h.length-1];u!==void 0&&x!==void 0&&c.push([u,x+1])}continue}const a=s.split(/\s+/u).map(p).filter(Boolean);for(let n=0;n+a.length<=r.length;n++)if(a.every((e,t)=>r[n+t]?.n===e)){const e=r[n],t=r[n+a.length-1];e&&t&&c.push([e.from,t.to])}}return c}const _=(f,o)=>f.some(([c,r])=>o>c&&o<r);export function splitLine(f,o=b.test(f)?CAPTION_CUE_DEFAULTS.maxCharsCjk:CAPTION_CUE_DEFAULTS.maxChars,c=[]){const r=[],s=(a,n)=>{const e=f.slice(a,n),t=e.length-e.trimStart().length,u=e.trim();u&&r.push({text:u,from:a+t,to:a+t+u.length})},h=(a,n,e)=>{const t=f.slice(a,n);if(Array.from(t.trim()).length<=o){s(a,n);return}const x=e===0?G:e===1?J:void 0;if(x){let i=-1;for(let S=1;S<t.length-1;S++)x.test(t[S]??"")&&!_(c,a+S+1)&&(i<0||Math.abs(S-t.length/2)<Math.abs(i-t.length/2))&&(i=S);if(i<0){h(a,n,e+1);return}h(a,a+i+1,e),h(a+i+1,n,e);return}const w=Math.floor(t.length/2),C=i=>i>0&&i<t.length&&!_(c,a+i);let g=-1;if(!b.test(t)){for(let i=w;i>0&&g<0;i--)t[i]===" "&&C(i)&&(g=i);for(let i=w;i<t.length&&g<0;i++)t[i]===" "&&C(i)&&(g=i)}for(let i=0;i<=t.length&&g<0;i++)C(w-i)?g=w-i:C(w+i)&&(g=w+i);if(g<0){s(a,n);return}h(a,a+g,e),h(a+g,n,e)};return h(0,f.length,0),r}export function captionCues(f,o={}){const{lines:c,fps:r}=f,s={...CAPTION_CUE_DEFAULTS,...o},h=[];for(const t of c){if(t.words.length===0)continue;const u=t.words,x=new v(new F(u),[t.spoken]),w=(M,l)=>{const d=u[x.wordAtChar(0,M)];return d?l?d.end:d.start:0};if((x.lines[0]?.length??0)===0)continue;const i=p(t.shown)===p(t.spoken)?M=>M:shownToSpoken(t.shown,t.spoken),S=b.test(t.shown)?s.maxCharsCjk:s.maxChars;for(const M of splitLine(t.shown,S)){const l=Math.round(i(p(t.shown.slice(0,M.from)).length)),d=Math.round(i(p(t.shown.slice(0,M.to)).length)),k=w(l,!1),L=w(Math.max(l,d-1),!0),W=b.test(M.text)?M.text.replace(H,""):M.text.replace(/[,;:]+$/u,"");W&&h.push({start:k,end:Math.max(L,k),text:W,part:t.part})}}const a=1/r,n=t=>Math.round(t*r)/r,e=h.map(t=>({...t,start:n(t.start),end:n(t.end)}));for(let t=0;t<e.length;t++){const u=e[t];if(!u)continue;const x=e[t+1],w=x?x.start-s.gapFrames*a:1/0;u.end=Math.min(Math.max(u.end,u.start+s.minSeconds),u.start+s.maxSeconds,w),u.end<=u.start&&(u.end=u.start+a)}return e}export function subtitleCues(f,o){return o===void 0?captionCues(f):wordCues(f.lines,{...o,fps:f.fps}).map(c=>({start:c.start,end:c.end,text:c.text,part:c.part}))}function U(f){const o=[],c=/\S+/gu;for(let r=c.exec(f);r;r=c.exec(f))o.push({w:r[0],from:r.index,to:r.index+r[0].length});return o}export function wordCues(f,o){const{fps:c}=o,r=[];for(const n of f){if(n.words.length===0)continue;const e=n.words,t=new v(new F(e),[n.spoken]);if((t.lines[0]?.length??0)===0)continue;const x=(l,d)=>{const k=e[t.wordAtChar(0,l)];return k?d?k.end:k.start:0},C=p(n.shown)===p(n.spoken)?l=>l:shownToSpoken(n.shown,n.spoken),g=(l,d)=>{const k=Math.round(C(p(n.shown.slice(0,l)).length)),L=Math.round(C(p(n.shown.slice(0,d)).length));return[x(k,!1),x(Math.max(k,L-1),!0)]},i=b.test(n.shown),S=o.maxChars??(i?16:32),M=keptSpans(n.shown,o.keep??[]);for(const l of splitLine(n.shown,S,M)){const d=(i?[{w:l.text,from:l.from,to:l.to}]:U(n.shown.slice(l.from,l.to)).map(m=>({w:m.w,from:m.from+l.from,to:m.to+l.from}))).filter(m=>p(m.w)!=="");if(d.length===0)continue;const k=o.maxWords&&o.maxWords>0?o.maxWords:d.length,L=Math.ceil(d.length/k),W=Math.ceil(d.length/L),O=[];d.forEach((m,A)=>{const j=d[A-1],E=O.at(-1);E&&j&&_(M,Math.ceil((j.to+m.from)/2))?E.push(m):O.push([m])});const I=[];let $=[];for(const m of O)$.length>0&&$.length+m.length>W&&(I.push($),$=[]),$.push(...m);$.length>0&&I.push($);for(const m of I){const A=m.map(T=>{const[N,K]=g(T.from,T.to);return{text:T.w,start:N,end:Math.max(K,N)}}),j=A[0],E=A.at(-1);if(!j||!E)continue;const B=m.map(T=>T.w).join(i?"":" ").replace(i?H:/[,;:]+$/u,"");r.push({start:j.start,end:E.end,text:B,part:n.part,words:A})}}}const s=n=>Math.round(n*c)/c,h=1/c,a=r.map(n=>({...n,start:s(n.start),end:s(n.end)}));for(let n=0;n<a.length;n++){const e=a[n];if(!e)continue;const t=a[n+1],u=t?.part===e.part;t&&u&&t.start-e.end<(o.close??.4)&&(e.end=t.start),e.end=Math.max(e.end,e.start+Math.min(.5,6*h)),t&&e.end>t.start&&(e.end=t.start),e.end<=e.start&&(e.end=e.start+h)}return a}export function cuesIn(f,o,c){const r=s=>Math.round(s*1e6)/1e6;return f.filter(s=>s.end>o&&s.start<c).map(s=>({start:r(Math.max(s.start,o)-o),end:r(Math.min(s.end,c)-o),text:s.text,words:s.words.map(h=>({text:h.text,start:r(h.start-o),end:r(h.end-o)}))}))}const y=(f,o)=>{const c=Math.round(f*1e3),r=Math.floor(c/36e5),s=Math.floor(c/6e4)%60,h=Math.floor(c/1e3)%60,a=(n,e=2)=>String(n).padStart(e,"0");return`${a(r)}:${a(s)}:${a(h)}${o}${a(c%1e3,3)}`};export function toSrt(f){return f.map((o,c)=>`${String(c+1)}
3
- ${y(o.start,",")} --> ${y(o.end,",")}
4
- ${o.text}
2
+ import{changesOf as K}from"./anchors.js";import{normText as p,joinWords as V,ScriptAlignment as v,WordStream as F}from"./words.js";import{speechWords as D}from"./speech.js";export const CAPTION_CUE_DEFAULTS={maxChars:42,maxCharsCjk:16,minSeconds:.8,maxSeconds:6,gapFrames:2};export function speechLines(c,s,i){return c.parts.flatMap(r=>{const o=r.speech,h=o?i[o.file]?.words:void 0;if(!o||!h?.length)return[];const a=D(h,o);if(a.length===0)return[];const n=s.find(t=>t.key===r.key),e=n?.spoken??V(a);return[{part:r.key,shown:e,spoken:n?.speak??e,words:a}]})}export function shownToSpoken(c,s){const i=(o,h)=>p(o.slice(0,h)).length,r=[[0,0]];for(const o of K(c,s))r.push([i(c,o.at),i(s,o.into)]),r.push([i(c,o.at+o.removed),i(s,o.into+o.inserted)]);return r.push([p(c).length,p(s).length]),o=>{for(let h=1;h<r.length;h++){const[a,n]=r[h-1]??[0,0],[e,t]=r[h]??[0,0];if(o>e&&h<r.length-1)continue;if(e<=a)return o<=a?n:t;const u=Math.max(0,Math.min(1,(o-a)/(e-a)));return n+(t-n)*u}return 0}}const b=/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u,G=/[。!?!?…]|\.(?=\s|$)/u,J=/[,、;:,;:—]/u,H=/[,、;:。,;:.\s]+$/u,P=(c,s)=>/[.,:;]/u.test(c[s]??"")&&/[0-9A-Za-z]/u.test(c[s+1]??"");export function keptSpans(c,s){const i=[],r=U(c).map(o=>({...o,n:p(o.w)}));for(const o of s){const h=p(o);if(!h)continue;if(b.test(o)){const n=[];Array.from(c).reduce((t,u)=>(p(u)&&n.push(t),t+u.length),0);const e=p(c);for(let t=e.indexOf(h);t>=0;t=e.indexOf(h,t+1)){const u=n[t],g=n[t+h.length-1];u!==void 0&&g!==void 0&&i.push([u,g+1])}continue}const a=o.split(/\s+/u).map(p).filter(Boolean);for(let n=0;n+a.length<=r.length;n++)if(a.every((e,t)=>r[n+t]?.n===e)){const e=r[n],t=r[n+a.length-1];e&&t&&i.push([e.from,t.to])}}return i}const _=(c,s)=>c.some(([i,r])=>s>i&&s<r);export function splitLine(c,s=b.test(c)?CAPTION_CUE_DEFAULTS.maxCharsCjk:CAPTION_CUE_DEFAULTS.maxChars,i=[]){const r=[],o=(a,n)=>{const e=c.slice(a,n),t=e.length-e.trimStart().length,u=e.trim();u&&r.push({text:u,from:a+t,to:a+t+u.length})},h=(a,n,e)=>{const t=c.slice(a,n);if(Array.from(t.trim()).length<=s){o(a,n);return}const g=e===0?G:e===1?J:void 0;if(g){let f=-1;for(let k=1;k<t.length-1;k++)g.test(t[k]??"")&&!P(t,k)&&!_(i,a+k+1)&&(f<0||Math.abs(k-t.length/2)<Math.abs(f-t.length/2))&&(f=k);if(f<0){h(a,n,e+1);return}h(a,a+f+1,e),h(a+f+1,n,e);return}const w=Math.floor(t.length/2),C=f=>f>0&&f<t.length&&!_(i,a+f);let x=-1;if(!b.test(t)){for(let f=w;f>0&&x<0;f--)t[f]===" "&&C(f)&&(x=f);for(let f=w;f<t.length&&x<0;f++)t[f]===" "&&C(f)&&(x=f)}for(let f=0;f<=t.length&&x<0;f++)C(w-f)?x=w-f:C(w+f)&&(x=w+f);if(x<0){o(a,n);return}h(a,a+x,e),h(a+x,n,e)};return h(0,c.length,0),r}export function captionCues(c,s={}){const{lines:i,fps:r}=c,o={...CAPTION_CUE_DEFAULTS,...s},h=[];for(const t of i){if(t.words.length===0)continue;const u=t.words,g=new v(new F(u),[t.spoken]),w=(M,l)=>{const d=u[g.wordAtChar(0,M)];return d?l?d.end:d.start:0};if((g.lines[0]?.length??0)===0)continue;const f=p(t.shown)===p(t.spoken)?M=>M:shownToSpoken(t.shown,t.spoken),k=b.test(t.shown)?o.maxCharsCjk:o.maxChars;for(const M of splitLine(t.shown,k)){const l=Math.round(f(p(t.shown.slice(0,M.from)).length)),d=Math.round(f(p(t.shown.slice(0,M.to)).length)),S=w(l,!1),A=w(Math.max(l,d-1),!0),T=b.test(M.text)?M.text.replace(H,""):M.text.replace(/[,;:]+$/u,"");T&&h.push({start:S,end:Math.max(A,S),text:T,part:t.part})}}const a=1/r,n=t=>Math.round(t*r)/r,e=h.map(t=>({...t,start:n(t.start),end:n(t.end)}));for(let t=0;t<e.length;t++){const u=e[t];if(!u)continue;const g=e[t+1],w=g?g.start-o.gapFrames*a:1/0;u.end=Math.min(Math.max(u.end,u.start+o.minSeconds),u.start+o.maxSeconds,w),u.end<=u.start&&(u.end=u.start+a)}return e}export function subtitleCues(c,s){return s===void 0?captionCues(c):wordCues(c.lines,{...s,fps:c.fps}).map(i=>({start:i.start,end:i.end,text:i.text,part:i.part}))}function U(c){const s=[],i=/\S+/gu;for(let r=i.exec(c);r;r=i.exec(c))s.push({w:r[0],from:r.index,to:r.index+r[0].length});return s}export function wordCues(c,s){const{fps:i}=s,r=[];for(const n of c){if(n.words.length===0)continue;const e=n.words,t=new v(new F(e),[n.spoken]);if((t.lines[0]?.length??0)===0)continue;const g=(l,d)=>{const S=e[t.wordAtChar(0,l)];return S?d?S.end:S.start:0},C=p(n.shown)===p(n.spoken)?l=>l:shownToSpoken(n.shown,n.spoken),x=(l,d)=>{const S=Math.round(C(p(n.shown.slice(0,l)).length)),A=Math.round(C(p(n.shown.slice(0,d)).length));return[g(S,!1),g(Math.max(S,A-1),!0)]},f=b.test(n.shown),k=s.maxChars??(f?16:32),M=keptSpans(n.shown,s.keep??[]);for(const l of splitLine(n.shown,k,M)){const d=(f?[{w:l.text,from:l.from,to:l.to}]:U(n.shown.slice(l.from,l.to)).map(m=>({w:m.w,from:m.from+l.from,to:m.to+l.from}))).filter(m=>p(m.w)!=="");if(d.length===0)continue;const S=s.maxWords&&s.maxWords>0?s.maxWords:d.length,A=Math.ceil(d.length/S),T=Math.ceil(d.length/A),O=[];d.forEach((m,L)=>{const W=d[L-1],j=O.at(-1);j&&W&&_(M,Math.ceil((W.to+m.from)/2))?j.push(m):O.push([m])});const I=[];let $=[];for(const m of O)$.length>0&&$.length+m.length>T&&(I.push($),$=[]),$.push(...m);$.length>0&&I.push($);for(const m of I){const L=m.map(E=>{const[N,B]=x(E.from,E.to);return{text:E.w,start:N,end:Math.max(B,N)}}),W=L[0],j=L.at(-1);if(!W||!j)continue;const z=m.map(E=>E.w).join(f?"":" ").replace(f?H:/[,;:]+$/u,"");r.push({start:W.start,end:j.end,text:z,part:n.part,words:L})}}}const o=n=>Math.round(n*i)/i,h=1/i,a=r.map(n=>({...n,start:o(n.start),end:o(n.end)}));for(let n=0;n<a.length;n++){const e=a[n];if(!e)continue;const t=a[n+1],u=t?.part===e.part;t&&u&&t.start-e.end<(s.close??.4)&&(e.end=t.start),e.end=Math.max(e.end,e.start+Math.min(.5,6*h)),t&&e.end>t.start&&(e.end=t.start),e.end<=e.start&&(e.end=e.start+h)}return a}export function cuesIn(c,s,i){const r=o=>Math.round(o*1e6)/1e6;return c.filter(o=>o.end>s&&o.start<i).map(o=>({start:r(Math.max(o.start,s)-s),end:r(Math.min(o.end,i)-s),text:o.text,words:o.words.map(h=>({text:h.text,start:r(h.start-s),end:r(h.end-s)}))}))}const y=(c,s)=>{const i=Math.round(c*1e3),r=Math.floor(i/36e5),o=Math.floor(i/6e4)%60,h=Math.floor(i/1e3)%60,a=(n,e=2)=>String(n).padStart(e,"0");return`${a(r)}:${a(o)}:${a(h)}${s}${a(i%1e3,3)}`};export function toSrt(c){return c.map((s,i)=>`${String(i+1)}
3
+ ${y(s.start,",")} --> ${y(s.end,",")}
4
+ ${s.text}
5
5
  `).join(`
6
- `)}export function toVtt(f){return`WEBVTT
6
+ `)}export function toVtt(c){return`WEBVTT
7
7
 
8
- ${f.map(o=>`${y(o.start,".")} --> ${y(o.end,".")}
9
- ${o.text}
8
+ ${c.map(s=>`${y(s.start,".")} --> ${y(s.end,".")}
9
+ ${s.text}
10
10
  `).join(`
11
11
  `)}`}
@@ -899,7 +899,16 @@ export interface EdgePast {
899
899
  side: "top" | "bottom" | "left" | "right";
900
900
  px: number;
901
901
  }
902
- /** Facts of a deck: what is measured of each slide as drawn (`deckFacts`, @allyhub-next/slides-core). */
902
+ /** An edge of a box and how far past a line it is, in points (a deck's). */
903
+ export interface DeckEdge {
904
+ side: "top" | "bottom" | "left" | "right";
905
+ pt: number;
906
+ }
907
+ /**
908
+ * Facts of a deck: what is measured of each slide as drawn (`deckFacts`,
909
+ * @allyhub-next/slides-core). Every length is in points, the unit
910
+ * slides.yaml is written in; a box is [x, y, w, h] from the slide's top left.
911
+ */
903
912
  export interface DeckFactData {
904
913
  /** A shape's text past its box, by its lines' glyphs. */
905
914
  "text-overflow": {
@@ -907,18 +916,27 @@ export interface DeckFactData {
907
916
  text: string;
908
917
  box: Box;
909
918
  glyphs: Box;
910
- edges: EdgePast[];
919
+ edges: DeckEdge[];
911
920
  /** Its lines, and those past the box. */
912
921
  lines: number;
913
922
  past: number;
914
923
  /** The share autofit shrank it to, when it did and it still does not fit. */
915
924
  scale?: number;
916
925
  };
926
+ /** A shape's text the slide's edge cuts: its glyphs past the slide. */
927
+ "text-off-slide": {
928
+ shape: string;
929
+ text: string;
930
+ glyphs: Box;
931
+ edges: DeckEdge[];
932
+ /** The share of its glyphs' box outside the slide (0–1). */
933
+ share: number;
934
+ };
917
935
  /** A shape partly or wholly past the slide's edge. */
918
936
  "shape-off-slide": {
919
937
  shape: string;
920
938
  box: Box;
921
- edges: EdgePast[];
939
+ edges: DeckEdge[];
922
940
  /** Its area past the edge, as a share of its own (0–1). */
923
941
  share: number;
924
942
  };
@@ -930,18 +948,38 @@ export interface DeckFactData {
930
948
  "shape-overlap": {
931
949
  a: string;
932
950
  b: string;
933
- /** Pixels both cover, and that as a share of the smaller (0–1). */
951
+ /** Square points both cover, and that as a share of the smaller (0–1). */
934
952
  area: number;
935
953
  share: number;
936
954
  };
937
- /** Edges or centres of two shapes, or of a shape and the slide, nearly in line and not. */
955
+ /**
956
+ * Edges or centres of two shapes, or of a shape and the slide, nearly in
957
+ * line and not: where each line is, what it was measured by (a filled
958
+ * shape's or a picture's frame; an unfilled text's glyphs), and the
959
+ * frame's x or y that puts the one to move on the other's line.
960
+ */
938
961
  "near-alignment": {
939
962
  a: string;
940
963
  /** Another shape, or "slide" for the slide's centre. */
941
964
  b: string;
942
965
  line: "left" | "right" | "top" | "bottom" | "centre-x" | "centre-y";
943
- /** How far apart, in points. */
966
+ /** How far apart. */
944
967
  gap: number;
968
+ /** Each one's line. */
969
+ at: {
970
+ a: number;
971
+ b: number;
972
+ };
973
+ by: {
974
+ a: "frame" | "glyphs";
975
+ b: "frame" | "glyphs";
976
+ };
977
+ /** The slide's own shape to move (a, unless a is a master's or a layout's), and its frame's `x` or `y` that aligns it. */
978
+ align: {
979
+ shape: string;
980
+ x?: number;
981
+ y?: number;
982
+ };
945
983
  options: {
946
984
  within: number;
947
985
  aligned: number;
@@ -951,7 +989,7 @@ export interface DeckFactData {
951
989
  "placement-drift": {
952
990
  layout: string;
953
991
  shape: string;
954
- /** Each place, in points, with the slides it is at. */
992
+ /** Each place, with the slides it is at. */
955
993
  places: {
956
994
  frame: Box;
957
995
  slides: string[];
@@ -1007,10 +1045,11 @@ export interface DeckFactData {
1007
1045
  /** A picture drawn larger than its pixels, or stretched. */
1008
1046
  "picture-resolution": {
1009
1047
  shape: string;
1048
+ /** Its file's pixels, and those of them it shows (its crop taken away). */
1010
1049
  source: [number, number];
1011
1050
  shown: [number, number];
1012
1051
  box: Box;
1013
- /** Slide pixels per source pixel, the larger of the two directions (over 1: enlarged). */
1052
+ /** Pixels of the slide as rendered per source pixel, the larger of the two directions (over 1: enlarged). */
1014
1053
  scale: number;
1015
1054
  /** Source pixels per inch of the slide, the smaller of the two directions. */
1016
1055
  ppi: number;
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{READ_DEFAULTS as c,boxRows as f,contentBox as l,freeBands as d,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","speech-on-screen":"Words a part says that show as text in it, and those that do not","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","text-overflow":"A deck: a shape's text past its box, by its lines' glyphs: how far, and the lines past it","shape-off-slide":"A deck: a shape partly or wholly past the slide's edge, and the share of it outside","shape-overlap":"A deck: two shapes of a slide over each other (not a master's or a layout's own under another), and by how much","near-alignment":"A deck: edges and centres of two shapes, or of a shape and the slide, nearly in line and not, in points","placement-drift":"A deck: a shape of one name at different places on slides of one layout","type-in-use":"A deck: the text sizes and weights it uses, on how many slides each, and the smallest","read-size":"A deck: each text's size on the slide, on a phone, and with --room on a room's screen and at its farthest seat","words-on-slide":"A deck: words, lines and texts on each slide","sheet-error":"A sheet: cells whose value is an error, and whether the error starts there or is read from another","sheet-number":"A sheet: numbers written into a formula, each with what takes it, and how many cells hold the formula","sheet-unlike":"A sheet: a cell between neighbours that read alike, unlike them, and how long a run they make","sheet-exception":"A sheet: cells of a calculated column set apart from its formula","sheet-unused":"A sheet: defined names and typed numbers nothing reads (no formula, chart, rule, check or name)","sheet-invalid":"A sheet: cells that break their data validation","sheet-typed":"A sheet: numbers sheet.ts typed that neither its data nor its code holds, what it computed where a formula should","sheet-ordinary":"A sheet: a sheet sheet.ts makes and sheet.yaml holds too, sheet.yaml's standing","picture-resolution":"A deck: a picture drawn larger than its pixels, its pixels per inch, and how much it is stretched","shape-hidden":"A deck: a shape another covers whole at every build, or an animation that never shows its shape","chart-data":"A chart's numbers: how many, how far they run, and the file they came from","table-grown":"A deck: a table's rows its words made taller than they are set","deck-fonts":"A deck: the fonts its PowerPoint file names, and whether each is one every PowerPoint, Keynote and Google Slides has","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,o){return{kind:e,...a,data:o}}export function factsOf(e,a){return e.filter(o=>o.kind===a)}export function countFacts(e){const a={};for(const o of e)a[o.kind]=(a[o.kind]??0)+1;return a}export function filterFacts(e,a){return e.filter(o=>!(a.kinds?.length&&!a.kinds.includes(o.kind)||a.part!==void 0&&o.part!==a.part||(a.from!==void 0||a.to!==void 0)&&(o.t===void 0||a.from!==void 0&&o.t<a.from-1e-6||a.to!==void 0&&o.t>a.to+1e-6)))}export function freeBandsData(e){const a=l(e.width,e.height,e.safe),o=(r,s)=>{const n=u(s.flat());return{files:r,seen:s.filter(h=>h.length>0).length,rows:n,bands:d(a,n)}},i="missing"in e.face?e.face:{...o(e.face.files,e.face.boxes.map(r=>{const s=r?f(r,a.x):void 0;return s?[s]:[]})),...e.face.speaker===void 0?{}:{speaker:e.face.speaker}},t="missing"in e.person?e.person:o(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:d(a,[..."rows"in i?i.rows:[],..."rows"in t?t.rows:[]])}}export function layoutFacts(e,a,o){const i=[];for(const t of e.moments){const r={...a,part:t.part,t:t.t};for(const s of t.overlaps){const n=t.texts[s.a],h=t.texts[s.b];!n||!h||i.push(fact("text-overlap",r,{a:n,b:h,area:s.area,share:s.share}))}for(const s of t.ownOverlaps){const n=t.texts[s.a],h=t.texts[s.b];!n||!h||i.push(fact("text-overlap-own",r,{a:n,b:h,area:s.area,share:s.share}))}for(const s of t.outside){const n=t.texts[s.text];n&&i.push(fact("text-outside",r,{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",r,{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",r,{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",r,{text:n,frame:[e.width,e.height],covered:e.safe,...o?{profile:o}:{},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??c}));for(const t of m(e.reading?.texts??[])){const{part:r,...s}=t;i.push(fact("words-on-screen",{...a,part:r,t:t.from},{...s,options:e.reading?.options??c}))}for(const t of e.footage){const{part:r,...s}=t;i.push(fact("footage-scale",{...a,part:r,t:t.max.t},s))}return i}
2
+ import{READ_DEFAULTS as d,boxRows as f,contentBox as l,freeBands as c,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","speech-on-screen":"Words a part says that show as text in it, and those that do not","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","text-overflow":"A deck: a shape's text past its box, by its lines' glyphs: how far, and the lines past it","text-off-slide":"A deck: a shape's text the slide's edge cuts: how far its glyphs reach past it, and the share outside","shape-off-slide":"A deck: a shape partly or wholly past the slide's edge, and the share of it outside","shape-overlap":"A deck: two shapes of a slide over each other (not a master's or a layout's own under another), and by how much","near-alignment":"A deck: edges and centres of two shapes, or of a shape and the slide, nearly in line and not: each line, and the x or y that aligns them","placement-drift":"A deck: a shape of one name at different places on slides of one layout","type-in-use":"A deck: the text sizes and weights it uses, on how many slides each, and the smallest","read-size":"A deck: each text's size on the slide, on a phone, and with --room on a room's screen and at its farthest seat","words-on-slide":"A deck: words, lines and texts on each slide","sheet-error":"A sheet: cells whose value is an error, and whether the error starts there or is read from another","sheet-number":"A sheet: numbers written into a formula, each with what takes it, and how many cells hold the formula","sheet-unlike":"A sheet: a cell between neighbours that read alike, unlike them, and how long a run they make","sheet-exception":"A sheet: cells of a calculated column set apart from its formula","sheet-unused":"A sheet: defined names and typed numbers nothing reads (no formula, chart, rule, check or name)","sheet-invalid":"A sheet: cells that break their data validation","sheet-typed":"A sheet: numbers sheet.ts typed that neither its data nor its code holds, what it computed where a formula should","sheet-ordinary":"A sheet: a sheet sheet.ts makes and sheet.yaml holds too, sheet.yaml's standing","picture-resolution":"A deck: a picture drawn larger than its pixels, its pixels per inch, and how much it is stretched","shape-hidden":"A deck: a shape another covers whole at every build, or an animation that never shows its shape","chart-data":"A chart's numbers: how many, how far they run, and the file they came from","table-grown":"A deck: a table's rows its words made taller than they are set","deck-fonts":"A deck: the fonts its PowerPoint file names, and whether each is one every PowerPoint, Keynote and Google Slides has","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,o){return{kind:e,...a,data:o}}export function factsOf(e,a){return e.filter(o=>o.kind===a)}export function countFacts(e){const a={};for(const o of e)a[o.kind]=(a[o.kind]??0)+1;return a}export function filterFacts(e,a){return e.filter(o=>!(a.kinds?.length&&!a.kinds.includes(o.kind)||a.part!==void 0&&o.part!==a.part||(a.from!==void 0||a.to!==void 0)&&(o.t===void 0||a.from!==void 0&&o.t<a.from-1e-6||a.to!==void 0&&o.t>a.to+1e-6)))}export function freeBandsData(e){const a=l(e.width,e.height,e.safe),o=(r,s)=>{const n=u(s.flat());return{files:r,seen:s.filter(h=>h.length>0).length,rows:n,bands:c(a,n)}},i="missing"in e.face?e.face:{...o(e.face.files,e.face.boxes.map(r=>{const s=r?f(r,a.x):void 0;return s?[s]:[]})),...e.face.speaker===void 0?{}:{speaker:e.face.speaker}},t="missing"in e.person?e.person:o(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:c(a,[..."rows"in i?i.rows:[],..."rows"in t?t.rows:[]])}}export function layoutFacts(e,a,o){const i=[];for(const t of e.moments){const r={...a,part:t.part,t:t.t};for(const s of t.overlaps){const n=t.texts[s.a],h=t.texts[s.b];!n||!h||i.push(fact("text-overlap",r,{a:n,b:h,area:s.area,share:s.share}))}for(const s of t.ownOverlaps){const n=t.texts[s.a],h=t.texts[s.b];!n||!h||i.push(fact("text-overlap-own",r,{a:n,b:h,area:s.area,share:s.share}))}for(const s of t.outside){const n=t.texts[s.text];n&&i.push(fact("text-outside",r,{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",r,{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",r,{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",r,{text:n,frame:[e.width,e.height],covered:e.safe,...o?{profile:o}:{},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??d}));for(const t of m(e.reading?.texts??[])){const{part:r,...s}=t;i.push(fact("words-on-screen",{...a,part:r,t:t.from},{...s,options:e.reading?.options??d}))}for(const t of e.footage){const{part:r,...s}=t;i.push(fact("footage-scale",{...a,part:r,t:t.max.t},s))}return i}
@@ -1,5 +1,6 @@
1
1
  export * from "./piece.js";
2
2
  export * from "./timeline.js";
3
+ export * from "./source.js";
3
4
  export * from "./look.js";
4
5
  export * from "./formats.js";
5
6
  export * from "./placement.js";
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- export*from"./piece.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";
2
+ export*from"./piece.js";export*from"./timeline.js";export*from"./source.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";
@@ -17,6 +17,20 @@ export declare const hasMarks: (text: string) => boolean;
17
17
  * marks on them. A line without marks comes back as it is.
18
18
  */
19
19
  export declare function readMarks(text: string): MarkedText;
20
+ /** A stretch of text and the marks on it, for writeMarks(). */
21
+ export interface MarkedRun {
22
+ text: string;
23
+ strong?: boolean;
24
+ em?: boolean;
25
+ strike?: boolean;
26
+ code?: boolean;
27
+ }
28
+ /**
29
+ * Runs written with marks, readMarks()'s inverse: runs alike are joined, a
30
+ * run's spaces at its ends go outside its delimiters (`**Bold** `), and the
31
+ * characters marks are written with are escaped where they are text.
32
+ */
33
+ export declare function writeMarks(runs: readonly MarkedRun[]): string;
20
34
  /** A line's characters, without its marks' delimiters. */
21
35
  export declare const withoutMarks: (text: string) => string;
22
36
  /** A stretch of a text with the same marks all through it. */
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- const x={"**":"strong","*":"em","~~":"strike","`":"code"},g=/\\([\\*~`])|\*\*|~~|\*|`/g,k=/\s/u;function m(i){const o=[];let d=0;for(const e of i.matchAll(g)){if(e.index>d&&o.push({kind:"text",text:i.slice(d,e.index)}),d=e.index+e[0].length,e[1]!==void 0){o.push({kind:"escape",text:e[1]});continue}const s=i[e.index-1],u=i[d];o.push({kind:"delim",text:e[0],opens:u!==void 0&&!k.test(u),closes:s!==void 0&&!k.test(s)})}return d<i.length&&o.push({kind:"text",text:i.slice(d)}),o}export const hasMarks=i=>/[*~`\\]/.test(i);export function readMarks(i){if(!hasMarks(i))return{text:i,marks:[]};const o=m(i),d=[];for(let t=0;t<o.length;t++){const n=o[t];if(n?.kind!=="delim")continue;if(n.text==="`"){const c=o.findIndex((p,h)=>h>t&&p.kind==="delim"&&p.text==="`");if(c<0)continue;const a=o[c];n.pair=c,a?.kind==="delim"&&(a.pair=t),t=c;continue}let r=-1;if(n.closes)for(let c=d.length-1;c>=0&&r<0;c--)o[d[c]??-1]?.text===n.text&&(r=c);const f=d[r],l=f===void 0?void 0:o[f];f!==void 0&&l?.kind==="delim"&&f<t-1?(l.pair=t,n.pair=f,d.length=r):n.opens&&d.push(t)}let e="";const s=[],u=new Map;for(let t=0;t<o.length;t++){const n=o[t];if(!n)continue;if(n.kind!=="delim"){e+=n.text;continue}if(n.pair===void 0){e+=n.text;continue}const r=x[n.text];if(r===void 0)continue;if(n.pair>t){if(u.set(t,e.length),r!=="code")continue;for(let l=t+1;l<n.pair;l++){const c=o[l];c&&(e+=c.kind==="escape"?`\\${c.text}`:c.text)}t=n.pair-1;continue}const f=u.get(n.pair);f!==void 0&&e.length>f&&s.push({at:f,end:e.length,kind:r})}return s.sort((t,n)=>t.at-n.at||n.end-t.end),{text:e,marks:s}}export const withoutMarks=i=>readMarks(i).text;const M=["strong","em","strike","code"];export function markRuns(i,o=[]){const d=[...new Set([0,i.length,...o.flatMap(s=>[s.at,s.end])])].filter(s=>s>=0&&s<=i.length).sort((s,u)=>s-u),e=[];return d.forEach((s,u)=>{const t=d[u+1];if(t===void 0||t<=s)return;const n=o.filter(r=>r.at<=s&&t<=r.end);e.push({text:i.slice(s,t),kinds:M.filter(r=>n.some(f=>f.kind===r))})}),e}
2
+ const g=/\\([\\*~`])|\*+|~~|`/g,k=/\s/u;function p(c){const f=[];let r=0;for(const n of c.matchAll(g)){if(n.index>r&&f.push({kind:"text",text:c.slice(r,n.index)}),r=n.index+n[0].length,n[1]!==void 0){f.push({kind:"escape",text:n[1]});continue}if(n[0]==="`"){f.push({kind:"tick"});continue}const e=c[n.index-1],o=c[r];f.push({kind:"run",char:n[0][0]??"*",length:n[0].length,left:n[0].length,opens:o!==void 0&&!k.test(o),closes:e!==void 0&&!k.test(e),closing:[],opening:[],closingIds:[]})}return r<c.length&&f.push({kind:"text",text:c.slice(r)}),f}export const hasMarks=c=>/[*~`\\]/.test(c);function x(c,f,r,n){const e=[];for(let o=f;o<r;o++){const i=c[o];if(i?.kind==="run"){if(i.closes)for(let l=e.length-1;l>=0&&i.left>0;l--){const s=e[l]??-1,t=c[s];if(t?.char!==i.char||t.left===0||i.char==="*"&&(t.closes||i.opens)&&(t.length+i.length)%3===0&&!(t.length%3===0&&i.length%3===0))continue;const u=i.char==="~"||i.left>=2&&t.left>=2?2:1;if(i.char==="~"&&(i.left<2||t.left<2))continue;const a=i.char==="~"?"strike":u===2?"strong":"em",d=n();t.opening.push({kind:a,id:d}),i.closing.push(a),i.closingIds.push(d),t.left-=u,i.left-=u,e.length=t.left>0?l+1:l,l=e.length}i.left>0&&i.opens&&e.push(o)}}}export function readMarks(c){if(!hasMarks(c))return{text:c,marks:[]};const f=p(c);for(let s=0;s<f.length;s++){const t=f[s];if(t?.kind!=="tick")continue;const u=f.findIndex((a,d)=>d>s&&a.kind==="tick");u<0||(t.pair=u,s=u)}let r=0;const n=()=>r++;let e=0;for(let s=0;s<=f.length;s++){const t=f[s];(t===void 0||t.kind==="tick"&&t.pair!==void 0)&&(x(f,e,s,n),t?.kind==="tick"&&t.pair!==void 0&&(s=t.pair,e=s+1))}let o="";const i=[],l=new Map;for(let s=0;s<f.length;s++){const t=f[s];if(t){if(t.kind==="text"||t.kind==="escape"){o+=t.text;continue}if(t.kind==="tick"){if(t.pair===void 0){o+="`";continue}const u=o.length;for(let a=s+1;a<t.pair;a++){const d=f[a];d&&(o+=d.kind==="escape"?`\\${d.text}`:d.kind==="text"?d.text:d.kind==="tick"?"`":d.char.repeat(d.length))}o.length>u&&i.push({at:u,end:o.length,kind:"code"}),s=t.pair;continue}t.closingIds.forEach((u,a)=>{const d=l.get(u),h=t.closing[a];d!==void 0&&h!==void 0&&o.length>d&&i.push({at:d,end:o.length,kind:h})}),o+=t.char.repeat(t.left);for(const u of t.opening)l.set(u.id,o.length)}}return i.sort((s,t)=>s.at-t.at||t.end-s.end),{text:o,marks:i}}export function writeMarks(c){const f=(n,e)=>(n.strong??!1)===(e.strong??!1)&&(n.em??!1)===(e.em??!1)&&(n.strike??!1)===(e.strike??!1)&&(n.code??!1)===(e.code??!1),r=[];for(const n of c){if(n.text==="")continue;const e=r.at(-1);e&&f(e,n)?e.text+=n.text:r.push({...n})}return r.map(n=>{const[,e="",o="",i=""]=/^(\s*)([\s\S]*?)(\s*)$/u.exec(n.text)??[];if(o==="")return n.text;if(n.code&&!o.includes("`"))return`${e}\`${o}\`${i}`;let l=o.replace(/[\\*~`]/gu,s=>`\\${s}`);return n.strike&&(l=`~~${l}~~`),n.em&&(l=`*${l}*`),n.strong&&(l=`**${l}**`),`${e}${l}${i}`}).join("")}export const withoutMarks=c=>readMarks(c).text;const $=["strong","em","strike","code"];export function markRuns(c,f=[]){const r=[...new Set([0,c.length,...f.flatMap(e=>[e.at,e.end])])].filter(e=>e>=0&&e<=c.length).sort((e,o)=>e-o),n=[];return r.forEach((e,o)=>{const i=r[o+1];if(i===void 0||i<=e)return;const l=f.filter(s=>s.at<=e&&i<=s.end);n.push({text:c.slice(e,i),kinds:$.filter(s=>l.some(t=>t.kind===s))})}),n}
@@ -20,7 +20,8 @@ export type MusicTime = number | {
20
20
  /** A stretch of the music's file, from `from` to `to`. */
21
21
  export interface MusicStretch<T = MusicTime> {
22
22
  from: T;
23
- to: T;
23
+ /** Where it ends; default the end of the file. */
24
+ to?: T;
24
25
  }
25
26
  /** The music's beat grid, in seconds of its file. */
26
27
  export interface MusicGrid {
@@ -730,6 +730,14 @@ export interface GraphicLayer<P extends object = object> extends LayerTiming {
730
730
  z?: "front" | "behind-person" | "overlay";
731
731
  mount(el: HTMLElement, props: P, ctx: StageContext): void;
732
732
  render(el: HTMLElement, t: number, props: P, ctx: StageContext): void;
733
+ /**
734
+ * Lets go of what mount made that the page does not free with `el` (a
735
+ * WebGL context, a worker, a timer): a deck mounts a slide's components
736
+ * when it is shown and unmounts them when it is let go, and mounts them
737
+ * again on a new element if it is shown again. State a layer carries from
738
+ * slide to slide is props, never what it kept from a mount.
739
+ */
740
+ unmount?(el: HTMLElement, props: P, ctx: StageContext): void;
733
741
  }
734
742
  export type LayerSpec = FootageLayer | GraphicLayer;
735
743
  export declare function isLayerSpec(v: unknown): v is LayerSpec;
@@ -848,8 +856,9 @@ export interface MusicOptions {
848
856
  loop?: boolean | MusicStretch;
849
857
  /**
850
858
  * The stretches of the file to play, in order, back to back (`{ from,
851
- * to }`, each a second of the file, `{ beat: n }` or `{ bar: n }`):
852
- * bars 0 to 7 then 3 to 7 of a song that ends too soon. Each seam is
859
+ * to }`, each a second of the file, `{ beat: n }` or `{ bar: n }`; no
860
+ * `to` runs to the file's end): bars 0 to 7 then 3 to 7 of a song that
861
+ * ends too soon. Each seam is
853
862
  * crossed over `seam`; the film moves on by each stretch's exact length,
854
863
  * so stretches cut on the beat keep the beat. Default: the file from
855
864
  * `from` to its end.
@@ -73,6 +73,10 @@ export declare const RULES: {
73
73
  readonly level: "error";
74
74
  readonly rule: "A sheet's sheet.ts reads the clock or a random number, reaches outside the project, or does not make the same sheets twice";
75
75
  };
76
+ readonly "AK-M013": {
77
+ readonly level: "error";
78
+ readonly rule: "A website's website.json is not JSON or does not match the format";
79
+ };
76
80
  readonly "AK-B001": {
77
81
  readonly level: "error";
78
82
  readonly rule: "Two pieces have the same id";
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- export const RULES={"AK-M001":{level:"error",rule:"The fields of video(), slides() or defineComponent do not match the format"},"AK-M002":{level:"error",rule:"A piece is not the entry file of an item folder"},"AK-M003":{level:"error",rule:"An item's entry file does not match its folder or its kind"},"AK-M004":{level:"error",rule:"The project has no pieces"},"AK-M006":{level:"error",rule:"A messages file does not match the format"},"AK-M007":{level:"error",rule:"A script file does not match the format"},"AK-M008":{level:"error",rule:"A doc's file is not MDX, holds what a doc does not draw, or is not an item of its own"},"AK-M009":{level:"error",rule:"A sheet is wrong whatever the taste: its files cannot be read, a formula does not parse or names what is not there, a reference is circular, or a check does not hold"},"AK-M010":{level:"error",rule:"A video item reaches itself through the videos it shows (a screen, a video take, a footage of a video item)"},"AK-M011":{level:"error",rule:"A deck's slides.yaml does not match the format, or names a layout, a prop, a file or a video item the deck does not have"},"AK-M012":{level:"error",rule:"A sheet's sheet.ts reads the clock or a random number, reaches outside the project, or does not make the same sheets twice"},"AK-B001":{level:"error",rule:"Two pieces have the same id"},"AK-B003":{level:"error",rule:"The build made a network request"},"AK-B004":{level:"error",rule:"The build timed out, or its result is over the size limit"},"AK-B005":{level:"error",rule:"An import of a file outside the project, or of a package not declared in package.json"},"AK-B006":{level:"error",rule:"An import of an @allyhub/sdk entry point that does not exist"},"AK-B008":{level:"error",rule:"The project's @allyhub/sdk is another version than the allyhub that builds it"},"AK-B009":{level:"error",rule:"The project's package.json declares AllyHub, but its packages are not installed"},"AK-B010":{level:"error",rule:"A 3D model does not build"},"AK-K001":{level:"error",rule:"Two parts have the same key"},"AK-K003":{level:"error",rule:"The output has no parts"},"AK-D002":{level:"error",rule:"The same frame has different pixels when drawn in order and out of order"},"AK-N003":{level:"error",rule:"The sandbox blocked a request at run time"},"AK-S001":{level:"error",rule:"The code reads a key that is missing in the default language too"},"AK-T001":{level:"error",rule:"A take has no word times beside it (<name>.words.json)"},"AK-T002":{level:"error",rule:"A say part has no generated file for its text, voice and tool"},"AK-T003":{level:"error",rule:"A take's range phrase, or the line a part is saying, is not found in the take"},"AK-T004":{level:"error",rule:"A word reference is not in its part's words, or an anchor is not in its line"},"AK-T005":{level:"error",rule:"A take's edits file is missing or does not match the format, or an edit's words are no longer in the take"},"AK-T006":{level:"error",rule:"A take's range phrase, or the line a part is saying, is said in words the take's edits remove"},"AK-T007":{level:"error",rule:"A part says a line its generated voice was not made from"},"AK-F001":{level:"error",rule:"The video is longer than its platform profile takes"},"AK-A001":{level:"error",rule:"A referenced media or data file does not exist"},"AK-A003":{level:"error",rule:"Wrong media type"},"AK-A005":{level:"error",rule:"A layer draws a picture that does not load: its source is not a file the stage serves, or not a picture"},"AK-P002":{level:"error",rule:"Loading took longer than the piece's loadLimit (default 10 seconds)"},"AK-P003":{level:"error",rule:"A moment did not finish drawing within the piece's seekLimit (default 30 seconds): work a layer waits for (ctx.wait) or a picture it shows never settled"},"AK-R001":{level:"error",rule:"An unhandled exception was thrown at run time"},"AK-R003":{level:"error",rule:"The page was changed outside the stage"},"AK-R004":{level:"error",rule:"The code sets a style value the browser does not accept, so the style does not apply"},"AK-G001":{level:"error",rule:"Unknown format: not one of the four presets, a platform profile or WIDTHxHEIGHT with even sides"},"AK-X001":{level:"error",rule:"The matrix's slots, structures, rules or combos name something that does not exist, or a combo lacks a slot of its structure"},"AK-X002":{level:"error",rule:"The matrix's rules leave no combination to make, or rule out a combo matrix.combos names"},"AK-X004":{level:"error",rule:"Two chosen combos are the same, or more alike than the matrix's differ allows"},"AK-X005":{level:"error",rule:"A part reads another slot's pick, so one render of it cannot serve every combo"},"AK-X006":{level:"error",rule:"A combo is longer than its output's maxDuration"},"AK-W001":{level:"error",rule:"A scenery does not build: its module's export is not a scenery, its build throws or does not finish, or its update throws"},"AK-W002":{level:"error",rule:"WebGL cannot be made or is lost, or draws on something other than SwiftShader where the CPU was asked for (--cpu, ALLYHUB_GPU=0, or the default off macOS)"},"AK-W003":{level:"error",rule:"A model, texture, environment or splat file does not load, names a file that is not there, or needs a decoder AllyHub does not lend"},"AK-W004":{level:"error",rule:"A camera cannot be drawn: a number that is not finite, a target at its position, a view along its up, a field of view outside (0°, 180°), or near and far planes out of order"},"AK-W005":{level:"error",rule:"A name a camera, a move or a measurement refers to names no object in the scenery, or names two"},"AK-W006":{level:"error",rule:"A material's shader does not compile or link on this renderer, or needs more texture units than the renderer has, so what uses it draws nothing (warn: more than the 16 a GPU may have)"},"AK-W008":{level:"error",rule:"A screen drawn in the scenery cannot show its element as it is: an element of it is in the browser's top layer (a modal dialog, a popover), planes of a preserve-3d context overlap, its element is larger than the largest texture, or its picture could not be copied"},"AK-S002":{level:"warn",rule:"Missing translation"},"AK-L002":{level:"warn",rule:"Text overflows the frame or is clipped"},"AK-L003":{level:"warn",rule:"Missing glyphs"},"AK-L006":{level:"warn",rule:"Text is drawn in a fallback font, or in a bold or italic the font does not have"},"AK-W007":{level:"warn",rule:"A screen asked to be drawn in the scenery is drawn over it, unlit and untoned: this browser cannot draw an element into a canvas (Chrome's HTML-in-Canvas), or ALLYHUB_HTML_IN_CANVAS=0"}};export function problem(e,r,o={}){const{level:t,...l}=o;return{code:e,level:t??RULES[e].level,message:r,...l}}export function countLevels(e){let r=0,o=0;for(const t of e)t.level==="error"?r++:o++;return{errors:r,warnings:o}}
2
+ export const RULES={"AK-M001":{level:"error",rule:"The fields of video(), slides() or defineComponent do not match the format"},"AK-M002":{level:"error",rule:"A piece is not the entry file of an item folder"},"AK-M003":{level:"error",rule:"An item's entry file does not match its folder or its kind"},"AK-M004":{level:"error",rule:"The project has no pieces"},"AK-M006":{level:"error",rule:"A messages file does not match the format"},"AK-M007":{level:"error",rule:"A script file does not match the format"},"AK-M008":{level:"error",rule:"A doc's file is not MDX, holds what a doc does not draw, or is not an item of its own"},"AK-M009":{level:"error",rule:"A sheet is wrong whatever the taste: its files cannot be read, a formula does not parse or names what is not there, a reference is circular, or a check does not hold"},"AK-M010":{level:"error",rule:"A video item reaches itself through the videos it shows (a screen, a video take, a footage of a video item)"},"AK-M011":{level:"error",rule:"A deck's slides.yaml does not match the format, or names a layout, a prop, a file or a video item the deck does not have"},"AK-M012":{level:"error",rule:"A sheet's sheet.ts reads the clock or a random number, reaches outside the project, or does not make the same sheets twice"},"AK-M013":{level:"error",rule:"A website's website.json is not JSON or does not match the format"},"AK-B001":{level:"error",rule:"Two pieces have the same id"},"AK-B003":{level:"error",rule:"The build made a network request"},"AK-B004":{level:"error",rule:"The build timed out, or its result is over the size limit"},"AK-B005":{level:"error",rule:"An import of a file outside the project, or of a package not declared in package.json"},"AK-B006":{level:"error",rule:"An import of an @allyhub/sdk entry point that does not exist"},"AK-B008":{level:"error",rule:"The project's @allyhub/sdk is another version than the allyhub that builds it"},"AK-B009":{level:"error",rule:"The project's package.json declares AllyHub, but its packages are not installed"},"AK-B010":{level:"error",rule:"A 3D model does not build"},"AK-K001":{level:"error",rule:"Two parts have the same key"},"AK-K003":{level:"error",rule:"The output has no parts"},"AK-D002":{level:"error",rule:"The same frame has different pixels when drawn in order and out of order"},"AK-N003":{level:"error",rule:"The sandbox blocked a request at run time"},"AK-S001":{level:"error",rule:"The code reads a key that is missing in the default language too"},"AK-T001":{level:"error",rule:"A take has no word times beside it (<name>.words.json)"},"AK-T002":{level:"error",rule:"A say part has no generated file for its text, voice and tool"},"AK-T003":{level:"error",rule:"A take's range phrase, or the line a part is saying, is not found in the take"},"AK-T004":{level:"error",rule:"A word reference is not in its part's words, or an anchor is not in its line"},"AK-T005":{level:"error",rule:"A take's edits file is missing or does not match the format, or an edit's words are no longer in the take"},"AK-T006":{level:"error",rule:"A take's range phrase, or the line a part is saying, is said in words the take's edits remove"},"AK-T007":{level:"error",rule:"A part says a line its generated voice was not made from"},"AK-F001":{level:"error",rule:"The video is longer than its platform profile takes"},"AK-A001":{level:"error",rule:"A referenced media or data file does not exist"},"AK-A003":{level:"error",rule:"Wrong media type"},"AK-A005":{level:"error",rule:"A layer draws a picture that does not load: its source is not a file the stage serves, or not a picture"},"AK-P002":{level:"error",rule:"Loading took longer than the piece's loadLimit (default 10 seconds)"},"AK-P003":{level:"error",rule:"A moment did not finish drawing within the piece's seekLimit (default 30 seconds): work a layer waits for (ctx.wait) or a picture it shows never settled"},"AK-R001":{level:"error",rule:"An unhandled exception was thrown at run time"},"AK-R003":{level:"error",rule:"The page was changed outside the stage"},"AK-R004":{level:"error",rule:"The code sets a style value the browser does not accept, so the style does not apply"},"AK-G001":{level:"error",rule:"Unknown format: not one of the four presets, a platform profile or WIDTHxHEIGHT with even sides"},"AK-X001":{level:"error",rule:"The matrix's slots, structures, rules or combos name something that does not exist, or a combo lacks a slot of its structure"},"AK-X002":{level:"error",rule:"The matrix's rules leave no combination to make, or rule out a combo matrix.combos names"},"AK-X004":{level:"error",rule:"Two chosen combos are the same, or more alike than the matrix's differ allows"},"AK-X005":{level:"error",rule:"A part reads another slot's pick, so one render of it cannot serve every combo"},"AK-X006":{level:"error",rule:"A combo is longer than its output's maxDuration"},"AK-W001":{level:"error",rule:"A scenery does not build: its module's export is not a scenery, its build throws or does not finish, or its update throws"},"AK-W002":{level:"error",rule:"WebGL cannot be made or is lost, or draws on something other than SwiftShader where the CPU was asked for (--cpu, ALLYHUB_GPU=0, or the default off macOS)"},"AK-W003":{level:"error",rule:"A model, texture, environment or splat file does not load, names a file that is not there, or needs a decoder AllyHub does not lend"},"AK-W004":{level:"error",rule:"A camera cannot be drawn: a number that is not finite, a target at its position, a view along its up, a field of view outside (0°, 180°), or near and far planes out of order"},"AK-W005":{level:"error",rule:"A name a camera, a move or a measurement refers to names no object in the scenery, or names two"},"AK-W006":{level:"error",rule:"A material's shader does not compile or link on this renderer, or needs more texture units than the renderer has, so what uses it draws nothing (warn: more than the 16 a GPU may have)"},"AK-W008":{level:"error",rule:"A screen drawn in the scenery cannot show its element as it is: an element of it is in the browser's top layer (a modal dialog, a popover), planes of a preserve-3d context overlap, its element is larger than the largest texture, or its picture could not be copied"},"AK-S002":{level:"warn",rule:"Missing translation"},"AK-L002":{level:"warn",rule:"Text overflows the frame or is clipped"},"AK-L003":{level:"warn",rule:"Missing glyphs"},"AK-L006":{level:"warn",rule:"Text is drawn in a fallback font, or in a bold or italic the font does not have"},"AK-W007":{level:"warn",rule:"A screen asked to be drawn in the scenery is drawn over it, unlit and untoned: this browser cannot draw an element into a canvas (Chrome's HTML-in-Canvas), or ALLYHUB_HTML_IN_CANVAS=0"}};export function problem(e,r,o={}){const{level:t,...l}=o;return{code:e,level:t??RULES[e].level,message:r,...l}}export function countLevels(e){let r=0,o=0;for(const t of e)t.level==="error"?r++:o++;return{errors:r,warnings:o}}
@@ -104,11 +104,11 @@ export declare const VideoOptionsMeta: z.ZodObject<{
104
104
  from: z.ZodOptional<z.ZodNumber>;
105
105
  loop: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
106
106
  from: z.ZodUnknown;
107
- to: z.ZodUnknown;
107
+ to: z.ZodOptional<z.ZodUnknown>;
108
108
  }, z.core.$strict>]>>;
109
109
  play: z.ZodOptional<z.ZodArray<z.ZodObject<{
110
110
  from: z.ZodUnknown;
111
- to: z.ZodUnknown;
111
+ to: z.ZodOptional<z.ZodUnknown>;
112
112
  }, z.core.$strict>>>;
113
113
  seam: z.ZodOptional<z.ZodNumber>;
114
114
  meter: z.ZodOptional<z.ZodNumber>;
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{z as t}from"zod";import{LOCALE as m}from"./messages.js";import{OUTPUT_KINDS as u}from"./piece.js";import{musicTimeProblem as b}from"./music.js";import{FPS_HELP as d,VIDEO_FORMAT_HELP as g,formatSpecProblem as f,isVideoFormat as h,parseFps as x}from"./formats.js";import{RESERVED_DIMS as l}from"./matrix.js";export const VideoFormatSchema=t.string().refine(h,{message:`unknown format (${g})`}),ComboSchema=t.record(t.string(),t.string()),ProblemSchema=t.strictObject({code:t.string().regex(/^AK-[A-Z]\d{3}$/),level:t.enum(["error","warn"]),message:t.string(),piece:t.string().optional(),output:t.string().optional(),combo:ComboSchema.optional(),format:t.string().optional(),part:t.string().optional(),t:t.number().optional(),page:t.number().int().nonnegative().optional(),where:t.strictObject({file:t.string().optional(),line:t.number().int().optional(),selector:t.string().optional(),bbox:t.tuple([t.number(),t.number(),t.number(),t.number()]).optional()}).optional()}),Locale=t.string().regex(m,"must be a lower-case locale such as en or zh-cn"),PieceId=t.string().regex(/^[a-z0-9][a-z0-9._-]*(\/[a-z0-9][a-z0-9._-]*)*$/,"id: lowercase letters, digits, . _ -, with / between levels"),DimName=t.string().regex(/^[a-z][a-zA-Z0-9_-]*$/,"dimension name: starts with a letter; letters, digits, _ and -"),DimValue=t.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/,"dimension value: letters, digits, . _ -"),OutputName=t.string().regex(/^[A-Za-z][A-Za-z0-9_-]*$/,"output name: starts with a letter; letters, digits, _ and -"),DimsSchema=t.record(DimName,t.array(DimValue).min(1)).superRefine((o,e)=>{for(const[n,a]of Object.entries(o)){if(l.includes(n)){e.addIssue({code:"custom",path:[n],message:n==="size"||n==="format"?`${n} is not a dimension: a piece has one format, format: "9x16", and another format is a piece of its own`:`${n} cannot name a dimension: the preview's address uses it. Choose another name`});continue}if(new Set(a).size!==a.length&&e.addIssue({code:"custom",path:[n],message:"the same value is listed twice"}),n==="lang")for(const s of a)m.test(s)||e.addIssue({code:"custom",path:[n],message:`lang value ${s} must be a lowercase language tag, such as en or zh-cn`})}});const O=o=>l.includes(o)?`${o} cannot name a slot: the framework uses it. Choose another name`:void 0;export const CandidateSchema=t.union([DimValue,t.strictObject({name:DimValue,tags:t.array(t.string().regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/)).optional()})]),SlotSchema=t.union([t.array(CandidateSchema).min(1),t.strictObject({pool:t.string().min(1),tags:t.array(t.string().min(1)).optional()})]);const j=t.union([t.string().min(1),t.array(t.string().min(1)).min(1)]),r=t.record(t.string(),j);export const MatrixSchema=t.strictObject({dims:DimsSchema.optional(),slots:t.record(DimName,SlotSchema).optional(),structures:t.record(DimValue,t.array(DimName).min(1)).optional(),combos:t.array(t.record(DimName,DimValue)).min(1).max(1e4).optional(),pick:t.number().int().min(1).max(1e4).optional(),seed:t.union([t.number(),t.string()]).optional(),differ:t.strictObject({slots:t.number().int().min(1).optional(),first:t.union([t.number().int().min(1),t.array(DimName).min(1)]).optional()}).optional(),rules:t.array(t.strictObject({if:r.optional(),require:r.optional(),exclude:r.optional()})).optional()}).superRefine((o,e)=>{for(const n of Object.keys(o.slots??{})){const a=O(n);a&&e.addIssue({code:"custom",path:["slots",n],message:a})}if(o.structures&&!o.slots&&e.addIssue({code:"custom",path:["structures"],message:"structures order slots: declare matrix.slots too"}),o.combos&&!o.slots&&e.addIssue({code:"custom",path:["combos"],message:"combos choose candidates of slots: declare matrix.slots too"}),o.combos)for(const n of["pick","seed"])o[n]!==void 0&&e.addIssue({code:"custom",path:[n],message:`combos names the combos to make, so nothing is sampled: remove ${n}, which only steers sampling`})}),FormatSpecSchema=t.strictObject({format:t.string().min(1),safe:t.strictObject({top:t.number().optional(),bottom:t.number().optional(),left:t.number().optional(),right:t.number().optional()}).optional(),maxDuration:t.number().positive().optional(),loudness:t.number().min(-70).max(0).optional()}).superRefine((o,e)=>{const n=f(o);n&&e.addIssue({code:"custom",message:n})}),FormatEntrySchema=t.union([t.string().min(1),FormatSpecSchema]);const i=t.number().min(-70).max(0),c=t.unknown().superRefine((o,e)=>{const n=b(o);n&&e.addIssue({code:"custom",message:n})}),p=t.strictObject({from:c,to:c}),S=t.union([t.number().min(0),t.string().min(1),t.strictObject({part:t.string().min(1),at:t.union([t.number(),t.string().min(1)])})]);export const PartDefaultsSchema=t.strictObject({dur:t.number().positive().max(3600).optional(),lead:t.number().min(0).max(60).optional(),tail:t.number().min(0).max(60).optional()}),VideoOptionsMeta=t.strictObject({music:t.strictObject({file:t.union([t.string().min(1),t.record(Locale,t.string().min(1))]).optional(),from:t.number().min(0).optional(),loop:t.union([t.boolean(),p]).optional(),play:t.array(p).min(1).optional(),seam:t.number().min(0).max(5).optional(),meter:t.number().int().min(1).max(32).optional(),downbeat:t.number().min(0).optional(),end:t.enum(["film","bar","beat"]).optional(),snap:t.boolean().optional(),bpm:t.number().min(20).max(400).optional(),gain:t.array(t.strictObject({at:S,db:t.number().min(-60).max(24)})).min(1).optional(),filter:t.string().min(1).optional(),eq:t.array(t.unknown()).optional(),compress:t.unknown().optional()}).optional(),mix:t.strictObject({speech:i.optional(),music:i.optional(),musicAlone:i.optional(),sfx:i.optional(),footage:i.optional(),footageUnderSpeech:i.optional(),duck:t.strictObject({db:t.number().min(-60).max(0).optional(),attack:t.number().min(0).max(10).optional(),release:t.number().min(0).max(10).optional(),hold:t.number().min(0).max(60).optional()}).optional(),musicFade:t.strictObject({in:t.number().min(0).max(60).optional(),out:t.number().min(0).max(60).optional()}).optional()}).optional(),mic:t.union([t.string().min(1),t.record(t.string(),t.unknown()),t.literal(!1)]).optional(),look:t.string().min(1).optional(),defaults:t.strictObject({part:PartDefaultsSchema.optional()}).optional(),covers:t.literal(!0).optional(),fps:t.union([t.number(),t.string()]).refine(o=>x(o)!==void 0,{error:`A frame rate is ${d}`}).optional(),transparent:t.boolean().optional(),maxDuration:t.number().positive().optional(),loadLimit:t.number().positive().optional(),seekLimit:t.number().positive().optional(),deliverable:t.boolean().optional(),master:t.union([i,t.literal(!1),t.strictObject({lufs:t.union([i,t.literal(!1)]).optional(),truePeak:t.number().min(-9).max(0).optional()})]).optional(),motionBlur:t.strictObject({samples:t.number().int().min(2).max(16),shutter:t.number().gt(0).max(1).optional()}).optional(),capture:t.strictObject({bloom:t.strictObject({threshold:t.number().optional(),radius:t.number().optional(),strength:t.number().optional()}).optional(),aberration:t.number().optional(),soften:t.number().optional(),vignette:t.number().optional(),exposure:t.strictObject({drift:t.number().optional(),period:t.number().optional()}).optional(),grain:t.strictObject({amount:t.number().optional(),size:t.number().optional(),shadows:t.number().optional(),highlights:t.number().optional(),chroma:t.number().optional(),chromaSize:t.number().optional(),static:t.boolean().optional()}).optional(),sharpen:t.number().optional()}).optional(),post:t.strictObject({filter:t.string().min(1).optional(),lut:t.string().regex(/\.cube$/i,"A LUT is a .cube file").optional()}).optional()}),OutputMeta=t.strictObject({kind:t.enum(u),options:t.record(t.string(),t.unknown())}),PieceMeta=t.strictObject({id:PieceId.optional(),title:t.union([t.string().min(1),t.record(Locale,t.string().min(1))]).optional(),format:FormatEntrySchema.optional(),matrix:MatrixSchema.optional(),meta:t.record(t.string(),t.unknown()).optional(),outputs:t.record(OutputName,OutputMeta).refine(o=>Object.keys(o).length>0,"outputs needs at least one output")}),LookConfigSchema=t.strictObject({color:t.strictObject({bg:t.string().min(1).optional(),fg:t.string().min(1).optional(),accent:t.string().min(1).optional(),muted:t.string().min(1).optional(),surface:t.string().min(1).optional()}).optional(),font:t.strictObject({display:t.string().min(1).optional(),body:t.string().min(1).optional(),mono:t.string().min(1).optional(),emoji:t.string().min(1).optional()}).optional(),motion:t.strictObject({beat:t.number().positive().optional()}).optional(),sfx:t.record(t.string().regex(/^[a-z][a-z0-9-]*$/,"a sound's name: lowercase letters, digits and -"),t.string().min(1).refine(o=>!o.startsWith("/")&&!o.split(/[\\/]/).includes(".."),"a sound is an audio file relative to the workspace's root")).optional()}),PropSchemaEntry=t.looseObject({type:t.enum(["text","time","asset","color","number","boolean","list","object"])}),ComponentEntry=t.strictObject({name:t.string(),label:t.union([t.string(),t.record(t.string(),t.string())]),file:t.string(),props:t.record(t.string(),PropSchemaEntry),examples:t.array(t.string()),hidden:t.boolean()}),VideoConfigSchema=t.object({look:LookConfigSchema.optional(),defaults:t.strictObject({format:VideoFormatSchema.optional(),part:PartDefaultsSchema.optional()}).optional()});
2
+ import{z as t}from"zod";import{LOCALE as m}from"./messages.js";import{OUTPUT_KINDS as u}from"./piece.js";import{musicTimeProblem as b}from"./music.js";import{FPS_HELP as d,VIDEO_FORMAT_HELP as g,formatSpecProblem as f,isVideoFormat as h,parseFps as x}from"./formats.js";import{RESERVED_DIMS as l}from"./matrix.js";export const VideoFormatSchema=t.string().refine(h,{message:`unknown format (${g})`}),ComboSchema=t.record(t.string(),t.string()),ProblemSchema=t.strictObject({code:t.string().regex(/^AK-[A-Z]\d{3}$/),level:t.enum(["error","warn"]),message:t.string(),piece:t.string().optional(),output:t.string().optional(),combo:ComboSchema.optional(),format:t.string().optional(),part:t.string().optional(),t:t.number().optional(),page:t.number().int().nonnegative().optional(),where:t.strictObject({file:t.string().optional(),line:t.number().int().optional(),selector:t.string().optional(),bbox:t.tuple([t.number(),t.number(),t.number(),t.number()]).optional()}).optional()}),Locale=t.string().regex(m,"must be a lower-case locale such as en or zh-cn"),PieceId=t.string().regex(/^[a-z0-9][a-z0-9._-]*(\/[a-z0-9][a-z0-9._-]*)*$/,"id: lowercase letters, digits, . _ -, with / between levels"),DimName=t.string().regex(/^[a-z][a-zA-Z0-9_-]*$/,"dimension name: starts with a letter; letters, digits, _ and -"),DimValue=t.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/,"dimension value: letters, digits, . _ -"),OutputName=t.string().regex(/^[A-Za-z][A-Za-z0-9_-]*$/,"output name: starts with a letter; letters, digits, _ and -"),DimsSchema=t.record(DimName,t.array(DimValue).min(1)).superRefine((o,e)=>{for(const[n,a]of Object.entries(o)){if(l.includes(n)){e.addIssue({code:"custom",path:[n],message:n==="size"||n==="format"?`${n} is not a dimension: a piece has one format, format: "9x16", and another format is a piece of its own`:`${n} cannot name a dimension: the preview's address uses it. Choose another name`});continue}if(new Set(a).size!==a.length&&e.addIssue({code:"custom",path:[n],message:"the same value is listed twice"}),n==="lang")for(const s of a)m.test(s)||e.addIssue({code:"custom",path:[n],message:`lang value ${s} must be a lowercase language tag, such as en or zh-cn`})}});const O=o=>l.includes(o)?`${o} cannot name a slot: the framework uses it. Choose another name`:void 0;export const CandidateSchema=t.union([DimValue,t.strictObject({name:DimValue,tags:t.array(t.string().regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/)).optional()})]),SlotSchema=t.union([t.array(CandidateSchema).min(1),t.strictObject({pool:t.string().min(1),tags:t.array(t.string().min(1)).optional()})]);const j=t.union([t.string().min(1),t.array(t.string().min(1)).min(1)]),r=t.record(t.string(),j);export const MatrixSchema=t.strictObject({dims:DimsSchema.optional(),slots:t.record(DimName,SlotSchema).optional(),structures:t.record(DimValue,t.array(DimName).min(1)).optional(),combos:t.array(t.record(DimName,DimValue)).min(1).max(1e4).optional(),pick:t.number().int().min(1).max(1e4).optional(),seed:t.union([t.number(),t.string()]).optional(),differ:t.strictObject({slots:t.number().int().min(1).optional(),first:t.union([t.number().int().min(1),t.array(DimName).min(1)]).optional()}).optional(),rules:t.array(t.strictObject({if:r.optional(),require:r.optional(),exclude:r.optional()})).optional()}).superRefine((o,e)=>{for(const n of Object.keys(o.slots??{})){const a=O(n);a&&e.addIssue({code:"custom",path:["slots",n],message:a})}if(o.structures&&!o.slots&&e.addIssue({code:"custom",path:["structures"],message:"structures order slots: declare matrix.slots too"}),o.combos&&!o.slots&&e.addIssue({code:"custom",path:["combos"],message:"combos choose candidates of slots: declare matrix.slots too"}),o.combos)for(const n of["pick","seed"])o[n]!==void 0&&e.addIssue({code:"custom",path:[n],message:`combos names the combos to make, so nothing is sampled: remove ${n}, which only steers sampling`})}),FormatSpecSchema=t.strictObject({format:t.string().min(1),safe:t.strictObject({top:t.number().optional(),bottom:t.number().optional(),left:t.number().optional(),right:t.number().optional()}).optional(),maxDuration:t.number().positive().optional(),loudness:t.number().min(-70).max(0).optional()}).superRefine((o,e)=>{const n=f(o);n&&e.addIssue({code:"custom",message:n})}),FormatEntrySchema=t.union([t.string().min(1),FormatSpecSchema]);const i=t.number().min(-70).max(0),c=t.unknown().superRefine((o,e)=>{const n=b(o);n&&e.addIssue({code:"custom",message:n})}),p=t.strictObject({from:c,to:c.optional()}),S=t.union([t.number().min(0),t.string().min(1),t.strictObject({part:t.string().min(1),at:t.union([t.number(),t.string().min(1)])})]);export const PartDefaultsSchema=t.strictObject({dur:t.number().positive().max(3600).optional(),lead:t.number().min(0).max(60).optional(),tail:t.number().min(0).max(60).optional()}),VideoOptionsMeta=t.strictObject({music:t.strictObject({file:t.union([t.string().min(1),t.record(Locale,t.string().min(1))]).optional(),from:t.number().min(0).optional(),loop:t.union([t.boolean(),p]).optional(),play:t.array(p).min(1).optional(),seam:t.number().min(0).max(5).optional(),meter:t.number().int().min(1).max(32).optional(),downbeat:t.number().min(0).optional(),end:t.enum(["film","bar","beat"]).optional(),snap:t.boolean().optional(),bpm:t.number().min(20).max(400).optional(),gain:t.array(t.strictObject({at:S,db:t.number().min(-60).max(24)})).min(1).optional(),filter:t.string().min(1).optional(),eq:t.array(t.unknown()).optional(),compress:t.unknown().optional()}).optional(),mix:t.strictObject({speech:i.optional(),music:i.optional(),musicAlone:i.optional(),sfx:i.optional(),footage:i.optional(),footageUnderSpeech:i.optional(),duck:t.strictObject({db:t.number().min(-60).max(0).optional(),attack:t.number().min(0).max(10).optional(),release:t.number().min(0).max(10).optional(),hold:t.number().min(0).max(60).optional()}).optional(),musicFade:t.strictObject({in:t.number().min(0).max(60).optional(),out:t.number().min(0).max(60).optional()}).optional()}).optional(),mic:t.union([t.string().min(1),t.record(t.string(),t.unknown()),t.literal(!1)]).optional(),look:t.string().min(1).optional(),defaults:t.strictObject({part:PartDefaultsSchema.optional()}).optional(),covers:t.literal(!0).optional(),fps:t.union([t.number(),t.string()]).refine(o=>x(o)!==void 0,{error:`A frame rate is ${d}`}).optional(),transparent:t.boolean().optional(),maxDuration:t.number().positive().optional(),loadLimit:t.number().positive().optional(),seekLimit:t.number().positive().optional(),deliverable:t.boolean().optional(),master:t.union([i,t.literal(!1),t.strictObject({lufs:t.union([i,t.literal(!1)]).optional(),truePeak:t.number().min(-9).max(0).optional()})]).optional(),motionBlur:t.strictObject({samples:t.number().int().min(2).max(16),shutter:t.number().gt(0).max(1).optional()}).optional(),capture:t.strictObject({bloom:t.strictObject({threshold:t.number().optional(),radius:t.number().optional(),strength:t.number().optional()}).optional(),aberration:t.number().optional(),soften:t.number().optional(),vignette:t.number().optional(),exposure:t.strictObject({drift:t.number().optional(),period:t.number().optional()}).optional(),grain:t.strictObject({amount:t.number().optional(),size:t.number().optional(),shadows:t.number().optional(),highlights:t.number().optional(),chroma:t.number().optional(),chromaSize:t.number().optional(),static:t.boolean().optional()}).optional(),sharpen:t.number().optional()}).optional(),post:t.strictObject({filter:t.string().min(1).optional(),lut:t.string().regex(/\.cube$/i,"A LUT is a .cube file").optional()}).optional()}),OutputMeta=t.strictObject({kind:t.enum(u),options:t.record(t.string(),t.unknown())}),PieceMeta=t.strictObject({id:PieceId.optional(),title:t.union([t.string().min(1),t.record(Locale,t.string().min(1))]).optional(),format:FormatEntrySchema.optional(),matrix:MatrixSchema.optional(),meta:t.record(t.string(),t.unknown()).optional(),outputs:t.record(OutputName,OutputMeta).refine(o=>Object.keys(o).length>0,"outputs needs at least one output")}),LookConfigSchema=t.strictObject({color:t.strictObject({bg:t.string().min(1).optional(),fg:t.string().min(1).optional(),accent:t.string().min(1).optional(),muted:t.string().min(1).optional(),surface:t.string().min(1).optional()}).optional(),font:t.strictObject({display:t.string().min(1).optional(),body:t.string().min(1).optional(),mono:t.string().min(1).optional(),emoji:t.string().min(1).optional()}).optional(),motion:t.strictObject({beat:t.number().positive().optional()}).optional(),sfx:t.record(t.string().regex(/^[a-z][a-z0-9-]*$/,"a sound's name: lowercase letters, digits and -"),t.string().min(1).refine(o=>!o.startsWith("/")&&!o.split(/[\\/]/).includes(".."),"a sound is an audio file relative to the workspace's root")).optional()}),PropSchemaEntry=t.looseObject({type:t.enum(["text","time","asset","color","number","boolean","list","object"])}),ComponentEntry=t.strictObject({name:t.string(),label:t.union([t.string(),t.record(t.string(),t.string())]),file:t.string(),props:t.record(t.string(),PropSchemaEntry),examples:t.array(t.string()),hidden:t.boolean()}),VideoConfigSchema=t.object({look:LookConfigSchema.optional(),defaults:t.strictObject({format:VideoFormatSchema.optional(),part:PartDefaultsSchema.optional()}).optional()});
@@ -15,10 +15,11 @@ export interface ScriptPart {
15
15
  /** What it shows, by name. */
16
16
  screen?: Record<string, ScriptText>;
17
17
  }
18
- /** A deck's slide in its script: its shapes' words by name, and its notes. */
18
+ /** A deck's slide in its script: its shapes' words by name, their alternative text, and its notes. */
19
19
  export interface ScriptSlide {
20
20
  id: string;
21
21
  text?: Record<string, ScriptText>;
22
+ alt?: Record<string, string>;
22
23
  notes?: string | VariantsMessage;
23
24
  }
24
25
  export interface ScriptFile {
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{hasAnchors as k,hasSpans as A,readAnchors as $,spokenLine as j}from"./anchors.js";import{isSpoken as x}from"./messages.js";export const SCRIPT_FILE=/^script\.([a-z]{2,3}(?:-[a-z0-9]{2,8})?)\.ya?ml$/;const g=/^[A-Za-z0-9_-]+$/,b=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),O=e=>e.length===0?"(root)":e.map((r,s)=>typeof r=="number"?`[${String(r)}]`:`${s?".":""}${r}`).join("");function S(e){const r=c=>Array.isArray(c)&&c.every(o=>typeof o=="string"),s=e.match;if(!b(s)||!Object.values(s).every(c=>typeof c=="string"))return"match must map each case to its text";const u=e.declarations??[],h=e.selectors??[];if(!r(u)||!r(h))return"declarations and selectors must be lists of strings";const m=Object.keys(e).filter(c=>!["declarations","selectors","match"].includes(c));return m.length>0?`unknown key ${m.join(", ")}`:{declarations:u,selectors:h,match:s}}function E(e){if(typeof e=="string")return e;if(x(e))return Object.keys(e).length===2?e:"has more than display and speak";if(b(e)&&"match"in e)return S(e)}export function parseScript(e){const r=[],s=(t,n)=>{r.push(`${O(t)}: ${n}`)},u=(t,n)=>{const i=E(t);if(i===void 0||typeof i=="string"&&i!==t){s(n,typeof i=="string"?i:typeof t=="number"||typeof t=="boolean"?`${String(t)} is not text: put it in quotes`:"must be text, { display, speak }, or a plural or selection");return}return i},h=(t,n)=>{if(!b(t)){s(n,"must be names with their text");return}const i={};for(const[a,d]of Object.entries(t)){const y=m(d,[...n,a]);g.test(a)?y!==void 0&&(i[a]=y):s([...n,a],"a name has only letters, digits, _ and -")}return i},m=(t,n)=>{if(Array.isArray(t)){const i=t.map((a,d)=>m(a,[...n,d]));return i.every(a=>a!==void 0)?i:void 0}return b(t)&&!x(t)&&!("match"in t)?h(t,n):u(t,n)};if(e==null)return{script:{parts:[]}};if(!b(e))return{problems:["(root): must be title, text and parts"]};const c={parts:[]};for(const t of Object.keys(e))["title","text","parts","slides"].includes(t)||s([t],"unknown key: a script has title, text, parts and slides");if(e.title!==void 0&&(typeof e.title=="string"?c.title=e.title:s(["title"],"must be text")),e.text!==void 0){const t=h(e.text,["text"]);t&&(c.text=t)}const o=e.parts??[];if(!Array.isArray(o))s(["parts"],"must be a list of parts");else{const t=new Set;o.forEach((n,i)=>{const a=["parts",i];if(!b(n)){s(a,"must be a part: id, say, screen");return}for(const l of Object.keys(n))["id","say","screen"].includes(l)||s([...a,l],"unknown key: a part has id, say and screen");const d=n.id;if(typeof d!="string"||!g.test(d)){s([...a,"id"],"a part needs an id of letters, digits, _ and -");return}if(t.has(d)){s([...a,"id"],`two parts have the id ${d}`);return}t.add(d);const y={id:d};if(n.say!==void 0){const l=u(n.say,[...a,"say"]);if(x(l))s([...a,"say"],"is one line: write a piece that is shown one way and said another inside it, as <shown|said>");else if(l!==void 0){y.say=l;for(const p of w(l))s([...a,"say"],p)}}if(n.screen!==void 0){const l=h(n.screen,[...a,"screen"]);l&&(y.screen=l)}c.parts.push(y)})}const f=e.slides??[];if(!Array.isArray(f))s(["slides"],"must be a list of slides");else{const t=new Set,n=[];f.forEach((i,a)=>{const d=["slides",a];if(!b(i)){s(d,"must be a slide: id, text, notes");return}for(const p of Object.keys(i))["id","text","notes"].includes(p)||s([...d,p],"unknown key: a slide has id, text and notes");const y=i.id;if(typeof y!="string"||!g.test(y)){s([...d,"id"],"a slide needs an id of letters, digits, _ and -");return}if(t.has(y)){s([...d,"id"],`two slides have the id ${y}`);return}t.add(y);const l={id:y};if(i.text!==void 0){const p=h(i.text,[...d,"text"]);p&&(l.text=p)}if(i.notes!==void 0){const p=u(i.notes,[...d,"notes"]);typeof p=="string"||p!==void 0&&!x(p)?l.notes=p:p!==void 0&&s([...d,"notes"],"is text")}n.push(l)}),n.length>0&&(c.slides=n)}return r.length>0?{problems:r}:{script:c}}function w(e){return typeof e=="string"?$(e).problems:x(e)?[]:Object.values(e.match).some(r=>k(r)||A(r))?["a plural or a selection cannot have anchors or <shown|said>"]:[]}export function saidOf(e){if(typeof e!="string")return{value:e,anchors:[]};const r=$(e);if(r.spans.length===0)return{value:r.text,anchors:r.anchors};const s=j(r);return{value:{display:r.text,speak:s.text},anchors:r.anchors.map(u=>({name:u.name,at:s.at(u.at,!1),...u.end===void 0?{}:{end:s.at(u.end,!0)}}))}}const _=e=>typeof e=="string"||!Array.isArray(e)&&(x(e)||"match"in e);export function scriptKeys(e,r){const s=[],u=new Set,h=[],m=(o,f,t,n=[])=>{u.has(o)?h.push(o):(u.add(o),s.push({key:o,value:f,path:t,...n.length>0?{anchors:n}:{}}))},c=(o,f,t)=>{if(_(f))m(o,f,t);else if(Array.isArray(f))f.forEach((n,i)=>{c(`${o}.${String(i)}`,n,[...t,i])});else for(const[n,i]of Object.entries(f))c(`${o}.${n}`,i,[...t,n])};r.title!==void 0&&m(`${e}.title`,r.title,["title"]);for(const[o,f]of Object.entries(r.text??{}))c(`${e}.${o}`,f,["text",o]);return r.parts.forEach((o,f)=>{const t=`${e}.${o.id}`;if(o.say!==void 0){const n=saidOf(o.say);m(`${t}.say`,n.value,["parts",f,"say"],n.anchors)}for(const[n,i]of Object.entries(o.screen??{}))c(`${t}.${n}`,i,["parts",f,"screen",n])}),(r.slides??[]).forEach((o,f)=>{const t=`${e}.${o.id}`;for(const[n,i]of Object.entries(o.text??{}))c(`${t}.${n}`,i,["slides",f,"text",n]);o.notes!==void 0&&m(`${t}.notes`,o.notes,["slides",f,"notes"])}),{keys:s,twice:h}}export function scriptMessages(e,r){return Object.fromEntries(scriptKeys(e,r).keys.map(s=>[s.key,s.value]))}
2
+ import{hasAnchors as A,hasSpans as O,readAnchors as k,spokenLine as S}from"./anchors.js";import{isSpoken as g}from"./messages.js";export const SCRIPT_FILE=/^script\.([a-z]{2,3}(?:-[a-z0-9]{2,8})?)\.ya?ml$/;const $=/^[A-Za-z0-9_-]+$/,b=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),E=e=>e.length===0?"(root)":e.map((r,s)=>typeof r=="number"?`[${String(r)}]`:`${s?".":""}${r}`).join("");function w(e){const r=d=>Array.isArray(d)&&d.every(o=>typeof o=="string"),s=e.match;if(!b(s)||!Object.values(s).every(d=>typeof d=="string"))return"match must map each case to its text";const u=e.declarations??[],m=e.selectors??[];if(!r(u)||!r(m))return"declarations and selectors must be lists of strings";const h=Object.keys(e).filter(d=>!["declarations","selectors","match"].includes(d));return h.length>0?`unknown key ${h.join(", ")}`:{declarations:u,selectors:m,match:s}}function _(e){if(typeof e=="string")return e;if(g(e))return Object.keys(e).length===2?e:"has more than display and speak";if(b(e)&&"match"in e)return w(e)}export function parseScript(e){const r=[],s=(t,n)=>{r.push(`${E(t)}: ${n}`)},u=(t,n)=>{const i=_(t);if(i===void 0||typeof i=="string"&&i!==t){s(n,typeof i=="string"?i:typeof t=="number"||typeof t=="boolean"?`${String(t)} is not text: put it in quotes`:"must be text, { display, speak }, or a plural or selection");return}return i},m=(t,n)=>{if(!b(t)){s(n,"must be names with their text");return}const i={};for(const[c,f]of Object.entries(t)){const y=h(f,[...n,c]);$.test(c)?y!==void 0&&(i[c]=y):s([...n,c],"a name has only letters, digits, _ and -")}return i},h=(t,n)=>{if(Array.isArray(t)){const i=t.map((c,f)=>h(c,[...n,f]));return i.every(c=>c!==void 0)?i:void 0}return b(t)&&!g(t)&&!("match"in t)?m(t,n):u(t,n)};if(e==null)return{script:{parts:[]}};if(!b(e))return{problems:["(root): must be title, text and parts"]};const d={parts:[]};for(const t of Object.keys(e))["title","text","parts","slides"].includes(t)||s([t],"unknown key: a script has title, text, parts and slides");if(e.title!==void 0&&(typeof e.title=="string"?d.title=e.title:s(["title"],"must be text")),e.text!==void 0){const t=m(e.text,["text"]);t&&(d.text=t)}const o=e.parts??[];if(!Array.isArray(o))s(["parts"],"must be a list of parts");else{const t=new Set;o.forEach((n,i)=>{const c=["parts",i];if(!b(n)){s(c,"must be a part: id, say, screen");return}for(const l of Object.keys(n))["id","say","screen"].includes(l)||s([...c,l],"unknown key: a part has id, say and screen");const f=n.id;if(typeof f!="string"||!$.test(f)){s([...c,"id"],"a part needs an id of letters, digits, _ and -");return}if(t.has(f)){s([...c,"id"],`two parts have the id ${f}`);return}t.add(f);const y={id:f};if(n.say!==void 0){const l=u(n.say,[...c,"say"]);if(g(l))s([...c,"say"],"is one line: write a piece that is shown one way and said another inside it, as <shown|said>");else if(l!==void 0){y.say=l;for(const x of z(l))s([...c,"say"],x)}}if(n.screen!==void 0){const l=m(n.screen,[...c,"screen"]);l&&(y.screen=l)}d.parts.push(y)})}const a=e.slides??[];if(!Array.isArray(a))s(["slides"],"must be a list of slides");else{const t=new Set,n=[];a.forEach((i,c)=>{const f=["slides",c];if(!b(i)){s(f,"must be a slide: id, text, alt, notes");return}for(const p of Object.keys(i))["id","text","alt","notes"].includes(p)||s([...f,p],"unknown key: a slide has id, text, alt and notes");const y=i.id;if(typeof y!="string"||!$.test(y)){s([...f,"id"],"a slide needs an id of letters, digits, _ and -");return}if(t.has(y)){s([...f,"id"],`two slides have the id ${y}`);return}t.add(y);const l={id:y};if(i.text!==void 0){const p=m(i.text,[...f,"text"]);p&&(l.text=p)}const x=i.alt;if(x!==void 0&&(b(x)&&Object.entries(x).every(([p,j])=>$.test(p)&&typeof j=="string")?l.alt=x:s([...f,"alt"],"is each shape's alternative text, by name")),i.notes!==void 0){const p=u(i.notes,[...f,"notes"]);typeof p=="string"||p!==void 0&&!g(p)?l.notes=p:p!==void 0&&s([...f,"notes"],"is text")}n.push(l)}),n.length>0&&(d.slides=n)}return r.length>0?{problems:r}:{script:d}}function z(e){return typeof e=="string"?k(e).problems:g(e)?[]:Object.values(e.match).some(r=>A(r)||O(r))?["a plural or a selection cannot have anchors or <shown|said>"]:[]}export function saidOf(e){if(typeof e!="string")return{value:e,anchors:[]};const r=k(e);if(r.spans.length===0)return{value:r.text,anchors:r.anchors};const s=S(r);return{value:{display:r.text,speak:s.text},anchors:r.anchors.map(u=>({name:u.name,at:s.at(u.at,!1),...u.end===void 0?{}:{end:s.at(u.end,!0)}}))}}const L=e=>typeof e=="string"||!Array.isArray(e)&&(g(e)||"match"in e);export function scriptKeys(e,r){const s=[],u=new Set,m=[],h=(o,a,t,n=[])=>{u.has(o)?m.push(o):(u.add(o),s.push({key:o,value:a,path:t,...n.length>0?{anchors:n}:{}}))},d=(o,a,t)=>{if(L(a))h(o,a,t);else if(Array.isArray(a))a.forEach((n,i)=>{d(`${o}.${String(i)}`,n,[...t,i])});else for(const[n,i]of Object.entries(a))d(`${o}.${n}`,i,[...t,n])};r.title!==void 0&&h(`${e}.title`,r.title,["title"]);for(const[o,a]of Object.entries(r.text??{}))d(`${e}.${o}`,a,["text",o]);return r.parts.forEach((o,a)=>{const t=`${e}.${o.id}`;if(o.say!==void 0){const n=saidOf(o.say);h(`${t}.say`,n.value,["parts",a,"say"],n.anchors)}for(const[n,i]of Object.entries(o.screen??{}))d(`${t}.${n}`,i,["parts",a,"screen",n])}),(r.slides??[]).forEach((o,a)=>{const t=`${e}.${o.id}`;for(const[n,i]of Object.entries(o.text??{}))d(`${t}.${n}`,i,["slides",a,"text",n]);o.notes!==void 0&&h(`${t}.notes`,o.notes,["slides",a,"notes"]);for(const[n,i]of Object.entries(o.alt??{}))h(`${t}.alt.${n}`,i,["slides",a,"alt",n])}),{keys:s,twice:m}}export function scriptMessages(e,r){return Object.fromEntries(scriptKeys(e,r).keys.map(s=>[s.key,s.value]))}
@@ -0,0 +1,7 @@
1
+ import type { MediaInfo } from "./media.js";
2
+ import type { BuildSource } from "./timeline.js";
3
+ /** A file's media, its addresses absolute against the tree's root. */
4
+ export declare function resolveMedia(media: Readonly<Record<string, MediaInfo>>, root: string | URL): Record<string, MediaInfo>;
5
+ /** A piece's source, its bundle's, styles' and media's addresses absolute against the tree's root. */
6
+ export declare function resolveSource(source: BuildSource, root: string | URL): BuildSource;
7
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ const t=(e,n)=>e===""?e:new URL(e,n).href;export function resolveMedia(e,n){return Object.fromEntries(Object.entries(e).map(([i,d])=>[i,{...d,url:t(d.url,n),...d.matteUrl===void 0?{}:{matteUrl:t(d.matteUrl,n)},...d.denoisedUrl===void 0?{}:{denoisedUrl:t(d.denoisedUrl,n)}}]))}export function resolveSource(e,n){return{...e,module:t(e.module,n),...e.styles===void 0?{}:{styles:e.styles.map(i=>t(i,n))},media:resolveMedia(e.media,n)}}