@kvman/kvvideo 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +1 -1
  2. package/dist/api.d.ts +26 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/brand/brand.d.ts +17 -0
  5. package/dist/brand/brand.d.ts.map +1 -0
  6. package/dist/brand/brand.js +44 -0
  7. package/dist/brand/brand.js.map +1 -0
  8. package/dist/browser/launch.d.ts +2 -0
  9. package/dist/browser/launch.d.ts.map +1 -1
  10. package/dist/browser/launch.js +7 -1
  11. package/dist/browser/launch.js.map +1 -1
  12. package/dist/compose/ass-file.d.ts +5 -0
  13. package/dist/compose/ass-file.d.ts.map +1 -1
  14. package/dist/compose/ass-file.js +32 -3
  15. package/dist/compose/ass-file.js.map +1 -1
  16. package/dist/compose/background.d.ts +23 -0
  17. package/dist/compose/background.d.ts.map +1 -0
  18. package/dist/compose/background.js +31 -0
  19. package/dist/compose/background.js.map +1 -0
  20. package/dist/compose/camera.d.ts +32 -0
  21. package/dist/compose/camera.d.ts.map +1 -0
  22. package/dist/compose/camera.js +98 -0
  23. package/dist/compose/camera.js.map +1 -0
  24. package/dist/compose/caption-font.d.ts +2 -0
  25. package/dist/compose/caption-font.d.ts.map +1 -1
  26. package/dist/compose/caption-font.js +2 -1
  27. package/dist/compose/caption-font.js.map +1 -1
  28. package/dist/compose/compose-drawing.d.ts +19 -0
  29. package/dist/compose/compose-drawing.d.ts.map +1 -0
  30. package/dist/compose/compose-drawing.js +38 -0
  31. package/dist/compose/compose-drawing.js.map +1 -0
  32. package/dist/compose/compose-input.d.ts +139 -0
  33. package/dist/compose/compose-input.d.ts.map +1 -1
  34. package/dist/compose/compose-input.js +48 -9
  35. package/dist/compose/compose-input.js.map +1 -1
  36. package/dist/compose/compose-plan.d.ts +36 -0
  37. package/dist/compose/compose-plan.d.ts.map +1 -0
  38. package/dist/compose/compose-plan.js +55 -0
  39. package/dist/compose/compose-plan.js.map +1 -0
  40. package/dist/compose/compose-size.d.ts +50 -0
  41. package/dist/compose/compose-size.d.ts.map +1 -0
  42. package/dist/compose/compose-size.js +72 -0
  43. package/dist/compose/compose-size.js.map +1 -0
  44. package/dist/compose/drawn-images.d.ts +19 -0
  45. package/dist/compose/drawn-images.d.ts.map +1 -0
  46. package/dist/compose/drawn-images.js +75 -0
  47. package/dist/compose/drawn-images.js.map +1 -0
  48. package/dist/compose/final-pass.d.ts +34 -0
  49. package/dist/compose/final-pass.d.ts.map +1 -0
  50. package/dist/compose/final-pass.js +106 -0
  51. package/dist/compose/final-pass.js.map +1 -0
  52. package/dist/compose/frame-layout.d.ts +30 -0
  53. package/dist/compose/frame-layout.d.ts.map +1 -0
  54. package/dist/compose/frame-layout.js +33 -0
  55. package/dist/compose/frame-layout.js.map +1 -0
  56. package/dist/compose/overlays.d.ts +20 -0
  57. package/dist/compose/overlays.d.ts.map +1 -0
  58. package/dist/compose/overlays.js +30 -0
  59. package/dist/compose/overlays.js.map +1 -0
  60. package/dist/compose/page-again.d.ts +26 -0
  61. package/dist/compose/page-again.d.ts.map +1 -0
  62. package/dist/compose/page-again.js +50 -0
  63. package/dist/compose/page-again.js.map +1 -0
  64. package/dist/compose/player-copies.d.ts +5 -1
  65. package/dist/compose/player-copies.d.ts.map +1 -1
  66. package/dist/compose/player-copies.js +19 -16
  67. package/dist/compose/player-copies.js.map +1 -1
  68. package/dist/compose/register-compose.d.ts.map +1 -1
  69. package/dist/compose/register-compose.js +106 -20
  70. package/dist/compose/register-compose.js.map +1 -1
  71. package/dist/compose/render.d.ts +13 -4
  72. package/dist/compose/render.d.ts.map +1 -1
  73. package/dist/compose/render.js +48 -22
  74. package/dist/compose/render.js.map +1 -1
  75. package/dist/compose/scene-args.d.ts +32 -7
  76. package/dist/compose/scene-args.d.ts.map +1 -1
  77. package/dist/compose/scene-args.js +77 -16
  78. package/dist/compose/scene-args.js.map +1 -1
  79. package/dist/compose/scene-look.d.ts +31 -0
  80. package/dist/compose/scene-look.d.ts.map +1 -0
  81. package/dist/compose/scene-look.js +46 -0
  82. package/dist/compose/scene-look.js.map +1 -0
  83. package/dist/compose/scene-plan.d.ts +0 -2
  84. package/dist/compose/scene-plan.d.ts.map +1 -1
  85. package/dist/compose/scene-plan.js +7 -5
  86. package/dist/compose/scene-plan.js.map +1 -1
  87. package/dist/compose/sound-effects.d.ts +23 -0
  88. package/dist/compose/sound-effects.d.ts.map +1 -0
  89. package/dist/compose/sound-effects.js +40 -0
  90. package/dist/compose/sound-effects.js.map +1 -0
  91. package/dist/compose/srt.d.ts +3 -0
  92. package/dist/compose/srt.d.ts.map +1 -0
  93. package/dist/compose/srt.js +10 -0
  94. package/dist/compose/srt.js.map +1 -0
  95. package/dist/compose/transitions.d.ts +16 -0
  96. package/dist/compose/transitions.d.ts.map +1 -0
  97. package/dist/compose/transitions.js +38 -0
  98. package/dist/compose/transitions.js.map +1 -0
  99. package/dist/connector.d.ts +67 -14
  100. package/dist/connector.d.ts.map +1 -1
  101. package/dist/connector.js +27 -8
  102. package/dist/connector.js.map +1 -1
  103. package/dist/files/sidecar.d.ts +209 -0
  104. package/dist/files/sidecar.d.ts.map +1 -0
  105. package/dist/files/sidecar.js +66 -0
  106. package/dist/files/sidecar.js.map +1 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +7 -1
  109. package/dist/index.js.map +1 -1
  110. package/dist/narration/alignment.d.ts +15 -0
  111. package/dist/narration/alignment.d.ts.map +1 -0
  112. package/dist/narration/alignment.js +21 -0
  113. package/dist/narration/alignment.js.map +1 -0
  114. package/dist/narration/captions.d.ts +22 -4
  115. package/dist/narration/captions.d.ts.map +1 -1
  116. package/dist/narration/captions.js +44 -16
  117. package/dist/narration/captions.js.map +1 -1
  118. package/dist/narration/join-args.d.ts +3 -0
  119. package/dist/narration/join-args.d.ts.map +1 -0
  120. package/dist/narration/join-args.js +19 -0
  121. package/dist/narration/join-args.js.map +1 -0
  122. package/dist/narration/narration-cache.d.ts +25 -0
  123. package/dist/narration/narration-cache.d.ts.map +1 -0
  124. package/dist/narration/narration-cache.js +36 -0
  125. package/dist/narration/narration-cache.js.map +1 -0
  126. package/dist/narration/piper.d.ts +2 -6
  127. package/dist/narration/piper.d.ts.map +1 -1
  128. package/dist/narration/piper.js +9 -15
  129. package/dist/narration/piper.js.map +1 -1
  130. package/dist/narration/pronunciations.d.ts +11 -0
  131. package/dist/narration/pronunciations.d.ts.map +1 -0
  132. package/dist/narration/pronunciations.js +40 -0
  133. package/dist/narration/pronunciations.js.map +1 -0
  134. package/dist/narration/register-narration.d.ts +8 -0
  135. package/dist/narration/register-narration.d.ts.map +1 -1
  136. package/dist/narration/register-narration.js +54 -26
  137. package/dist/narration/register-narration.js.map +1 -1
  138. package/dist/narration/register-voice.d.ts +27 -0
  139. package/dist/narration/register-voice.d.ts.map +1 -0
  140. package/dist/narration/register-voice.js +82 -0
  141. package/dist/narration/register-voice.js.map +1 -0
  142. package/dist/narration/sentence-speaker.d.ts +35 -0
  143. package/dist/narration/sentence-speaker.d.ts.map +1 -0
  144. package/dist/narration/sentence-speaker.js +44 -0
  145. package/dist/narration/sentence-speaker.js.map +1 -0
  146. package/dist/narration/speech-services.d.ts +23 -3
  147. package/dist/narration/speech-services.d.ts.map +1 -1
  148. package/dist/narration/speech-services.js +27 -10
  149. package/dist/narration/speech-services.js.map +1 -1
  150. package/dist/narration/voice-args.d.ts +3 -0
  151. package/dist/narration/voice-args.d.ts.map +1 -0
  152. package/dist/narration/voice-args.js +10 -0
  153. package/dist/narration/voice-args.js.map +1 -0
  154. package/dist/programs/media-duration.d.ts +12 -0
  155. package/dist/programs/media-duration.d.ts.map +1 -1
  156. package/dist/programs/media-duration.js +13 -0
  157. package/dist/programs/media-duration.js.map +1 -1
  158. package/dist/programs/run-program.d.ts +1 -0
  159. package/dist/programs/run-program.d.ts.map +1 -1
  160. package/dist/programs/run-program.js +1 -0
  161. package/dist/programs/run-program.js.map +1 -1
  162. package/dist/record/address.d.ts +1 -1
  163. package/dist/record/address.d.ts.map +1 -1
  164. package/dist/record/address.js +5 -7
  165. package/dist/record/address.js.map +1 -1
  166. package/dist/record/cursor-script.d.ts +2 -1
  167. package/dist/record/cursor-script.d.ts.map +1 -1
  168. package/dist/record/cursor-script.js +52 -14
  169. package/dist/record/cursor-script.js.map +1 -1
  170. package/dist/record/encoder-args.js +1 -1
  171. package/dist/record/motion.d.ts +19 -0
  172. package/dist/record/motion.d.ts.map +1 -0
  173. package/dist/record/motion.js +59 -0
  174. package/dist/record/motion.js.map +1 -0
  175. package/dist/record/narration-cues.d.ts +14 -0
  176. package/dist/record/narration-cues.d.ts.map +1 -0
  177. package/dist/record/narration-cues.js +12 -0
  178. package/dist/record/narration-cues.js.map +1 -0
  179. package/dist/record/page-ready.d.ts +4 -0
  180. package/dist/record/page-ready.d.ts.map +1 -0
  181. package/dist/record/page-ready.js +15 -0
  182. package/dist/record/page-ready.js.map +1 -0
  183. package/dist/record/page-route.d.ts +13 -0
  184. package/dist/record/page-route.d.ts.map +1 -0
  185. package/dist/record/page-route.js +64 -0
  186. package/dist/record/page-route.js.map +1 -0
  187. package/dist/record/pointer.d.ts +6 -7
  188. package/dist/record/pointer.d.ts.map +1 -1
  189. package/dist/record/pointer.js +11 -10
  190. package/dist/record/pointer.js.map +1 -1
  191. package/dist/record/recorder.d.ts +17 -7
  192. package/dist/record/recorder.d.ts.map +1 -1
  193. package/dist/record/recorder.js +48 -18
  194. package/dist/record/recorder.js.map +1 -1
  195. package/dist/record/register-record.d.ts.map +1 -1
  196. package/dist/record/register-record.js +47 -13
  197. package/dist/record/register-record.js.map +1 -1
  198. package/dist/record/run-step.d.ts +16 -3
  199. package/dist/record/run-step.d.ts.map +1 -1
  200. package/dist/record/run-step.js +43 -23
  201. package/dist/record/run-step.js.map +1 -1
  202. package/dist/record/screencast.js +1 -1
  203. package/dist/record/steps.d.ts +54 -1
  204. package/dist/record/steps.d.ts.map +1 -1
  205. package/dist/record/steps.js +34 -16
  206. package/dist/record/steps.js.map +1 -1
  207. package/dist/review/analysis.d.ts +19 -0
  208. package/dist/review/analysis.d.ts.map +1 -0
  209. package/dist/review/analysis.js +36 -0
  210. package/dist/review/analysis.js.map +1 -0
  211. package/dist/review/frames.d.ts +9 -0
  212. package/dist/review/frames.d.ts.map +1 -0
  213. package/dist/review/frames.js +28 -0
  214. package/dist/review/frames.js.map +1 -0
  215. package/dist/review/register-review.d.ts +24 -0
  216. package/dist/review/register-review.d.ts.map +1 -0
  217. package/dist/review/register-review.js +81 -0
  218. package/dist/review/register-review.js.map +1 -0
  219. package/dist/review/sheet-args.d.ts +11 -0
  220. package/dist/review/sheet-args.d.ts.map +1 -0
  221. package/dist/review/sheet-args.js +24 -0
  222. package/dist/review/sheet-args.js.map +1 -0
  223. package/dist/settings.d.ts +4 -0
  224. package/dist/settings.d.ts.map +1 -1
  225. package/dist/settings.js +4 -2
  226. package/dist/settings.js.map +1 -1
  227. package/dist/setup/ffmpeg-readiness.js +1 -1
  228. package/dist/setup/ffmpeg-readiness.js.map +1 -1
  229. package/dist/ui.d.ts.map +1 -1
  230. package/dist/ui.js +3 -2
  231. package/dist/ui.js.map +1 -1
  232. package/dist/web/components/player.css +1 -1
  233. package/dist/web/components/player.js +33 -21
  234. package/docs/guide.md +21 -9
  235. package/locales/ar.json +12 -1
  236. package/locales/en.json +12 -1
  237. package/package.json +11 -5
  238. package/sounds/SOURCES.md +13 -0
  239. package/sounds/click.wav +0 -0
  240. package/sounds/keys.wav +0 -0
  241. package/sounds/pop.wav +0 -0
  242. package/sounds/whoosh.wav +0 -0
package/dist/ui.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from '@kvman/sdk';
2
- // kvvideo's configuration on its extension page (plan 16 §16.2): three cards of setting rows, and nothing else. The
2
+ // kvvideo's configuration on its extension page (plan 16 §16.2): four cards of setting rows, and nothing else. The
3
3
  // keys' secrets are added in the page's own Secrets section (plan 06 §6.6).
4
4
  const settings = (keys) => keys.map((key) => ({ type: 'setting', key }));
5
5
  const configuration = {
@@ -7,7 +7,8 @@ const configuration = {
7
7
  direction: 'vertical',
8
8
  gap: 'md',
9
9
  children: [
10
- { type: 'card', title: 'kvvideo.config.narration', children: settings(['kvvideo.narration.service', 'kvvideo.narration.voice', 'kvvideo.narration.model']) },
10
+ { type: 'card', title: 'kvvideo.config.narration', children: settings(['kvvideo.narration.service', 'kvvideo.narration.voice', 'kvvideo.narration.model', 'kvvideo.narration.pronunciations']) },
11
+ { type: 'card', title: 'kvvideo.config.brand', children: settings(['kvvideo.brand']) },
11
12
  { type: 'card', title: 'kvvideo.config.recording', children: settings(['kvvideo.browser']) },
12
13
  { type: 'card', title: 'kvvideo.config.programs', children: settings(['kvvideo.programs.ffmpeg', 'kvvideo.programs.ffprobe', 'kvvideo.programs.piper']) },
13
14
  ],
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AAEzC,oHAAoH;AACpH,4EAA4E;AAE5E,MAAM,QAAQ,GAAG,CAAC,IAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAE5F,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,UAAU;IACrB,GAAG,EAAE,IAAI;IACT,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,2BAA2B,EAAE,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,EAAE;QAC5J,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE;QAC5F,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,yBAAyB,EAAE,0BAA0B,EAAE,wBAAwB,CAAC,CAAC,EAAE;KAC1J;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAE1K,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,GAAG,CAAC,aAAa,CAAC,gBAAgB,EAAE;QAClC,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACnB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;KAC9E,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AAEzC,mHAAmH;AACnH,4EAA4E;AAE5E,MAAM,QAAQ,GAAG,CAAC,IAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAE5F,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,UAAU;IACrB,GAAG,EAAE,IAAI;IACT,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,2BAA2B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,kCAAkC,CAAC,CAAC,EAAE;QAChM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE;QACtF,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE;QAC5F,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,yBAAyB,EAAE,0BAA0B,EAAE,wBAAwB,CAAC,CAAC,EAAE;KAC1J;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAE1K,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,GAAG,CAAC,aAAa,CAAC,gBAAgB,EAAE;QAClC,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACnB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;KAC9E,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +1,2 @@
1
- .kvvideo-player{padding:var(--kv-space-sm);border:1px solid var(--kv-color-border);border-radius:var(--kv-radius);background:var(--kv-color-surface);max-inline-size:640px;margin:0}.kvvideo-player-head{gap:var(--kv-space-sm);color:var(--kv-color-muted);justify-content:space-between;padding-block-end:var(--kv-space-sm);font-size:.85em;display:flex}.kvvideo-player-file{text-overflow:ellipsis;white-space:nowrap;font-family:var(--kv-font-mono);overflow:hidden}.kvvideo-player-video{border-radius:calc(var(--kv-radius) / 2);background:#000;max-block-size:360px;inline-size:100%;display:block}.kvvideo-player-unavailable{color:var(--kv-color-text);margin:0}
1
+ .kvvideo-player{padding:var(--kv-space-sm);border:1px solid var(--kv-color-border);border-radius:var(--kv-radius);background:var(--kv-color-surface);max-inline-size:640px;margin:0}.kvvideo-player-head{gap:var(--kv-space-sm);color:var(--kv-color-muted);justify-content:space-between;padding-block-end:var(--kv-space-sm);font-size:.85em;display:flex}.kvvideo-player-file{text-overflow:ellipsis;white-space:nowrap;font-family:var(--kv-font-mono);overflow:hidden}.kvvideo-player-video{border-radius:calc(var(--kv-radius) / 2);background:#000;max-block-size:360px;inline-size:100%;display:block}.kvvideo-player-unavailable{color:var(--kv-color-text);margin:0}.kvvideo-player-others{color:var(--kv-color-muted);font-family:var(--kv-font-mono);margin:0;padding-block-start:var(--kv-space-sm);padding-inline-start:0;font-size:.85em;list-style:none}
2
2
  /*$vite$:1*/
@@ -1,43 +1,55 @@
1
- import { computed as e, createElementBlock as t, createElementVNode as n, defineComponent as r, inject as i, openBlock as a, ref as o, toDisplayString as s, unref as c } from "vue";
1
+ import { Fragment as e, computed as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, defineComponent as a, inject as o, openBlock as s, ref as c, renderList as l, toDisplayString as u, unref as d } from "vue";
2
2
  //#region web/components/player.vue?vue&type=script&setup=true&lang.ts
3
- var l = {
3
+ var f = {
4
4
  class: "kvvideo-player",
5
5
  "data-test": "player"
6
- }, u = { class: "kvvideo-player-head" }, d = {
6
+ }, p = { class: "kvvideo-player-head" }, m = {
7
7
  class: "kvvideo-player-file",
8
8
  dir: "auto",
9
9
  "data-test": "file"
10
- }, f = {
10
+ }, h = {
11
11
  class: "kvvideo-player-length",
12
12
  dir: "ltr",
13
13
  "data-test": "length"
14
- }, p = ["src"], m = {
14
+ }, g = ["src", "poster"], _ = {
15
15
  key: 1,
16
16
  class: "kvvideo-player-unavailable",
17
17
  "data-test": "unavailable"
18
- }, h = /* @__PURE__ */ r({
18
+ }, v = {
19
+ key: 2,
20
+ class: "kvvideo-player-others",
21
+ "data-test": "others"
22
+ }, y = /* @__PURE__ */ a({
19
23
  __name: "player",
20
24
  props: {
21
25
  payload: {},
22
26
  output: {}
23
27
  },
24
- setup(r) {
25
- let h = r, g = i("kvman");
26
- if (g === void 0) throw Error("kvvideo components run inside kvwebui, which provides kvman.");
27
- let { t: _, workspace: v } = g, y = o(!1), b = e(() => typeof h.output.file == "string" ? h.output.file : ""), x = e(() => typeof h.output.fileId == "string" ? h.output.fileId : void 0), S = e(() => x.value === void 0 ? void 0 : `/api/files/${encodeURIComponent(x.value)}?workspaceId=${encodeURIComponent(v.value.id)}`), C = e(() => {
28
- let e = Math.round((typeof h.output.durationMs == "number" ? h.output.durationMs : 0) / 1e3);
28
+ setup(a) {
29
+ let y = a, b = o("kvman");
30
+ if (b === void 0) throw Error("kvvideo components run inside kvwebui, which provides kvman.");
31
+ let { t: x, workspace: S } = b, C = c(!1), w = t(() => typeof y.output.file == "string" ? y.output.file : ""), T = t(() => typeof y.output.fileId == "string" ? y.output.fileId : void 0), E = (e) => `/api/files/${encodeURIComponent(e)}?workspaceId=${encodeURIComponent(S.value.id)}`, D = t(() => T.value === void 0 ? void 0 : E(T.value)), O = t(() => typeof y.output.posterFileId == "string" ? E(y.output.posterFileId) : void 0), k = t(() => Array.isArray(y.output.others) ? y.output.others.flatMap((e) => typeof e == "object" && e && "file" in e && typeof e.file == "string" ? [e.file] : []) : []), A = t(() => {
32
+ let e = Math.round((typeof y.output.durationMs == "number" ? y.output.durationMs : 0) / 1e3);
29
33
  return `${String(Math.floor(e / 60))}:${String(e % 60).padStart(2, "0")}`;
30
34
  });
31
- return (e, r) => (a(), t("figure", l, [n("figcaption", u, [n("span", d, s(b.value), 1), n("span", f, s(C.value), 1)]), S.value !== void 0 && !y.value ? (a(), t("video", {
32
- key: 0,
33
- class: "kvvideo-player-video",
34
- "data-test": "video",
35
- src: S.value,
36
- controls: "",
37
- preload: "metadata",
38
- onError: r[0] ||= (e) => y.value = !0
39
- }, null, 40, p)) : (a(), t("p", m, s(c(_)("kvvideo.player.unavailable", { file: b.value })), 1))]));
35
+ return (t, a) => (s(), r("figure", f, [
36
+ i("figcaption", p, [i("span", m, u(w.value), 1), i("span", h, u(A.value), 1)]),
37
+ D.value !== void 0 && !C.value ? (s(), r("video", {
38
+ key: 0,
39
+ class: "kvvideo-player-video",
40
+ "data-test": "video",
41
+ src: D.value,
42
+ poster: O.value,
43
+ controls: "",
44
+ preload: "metadata",
45
+ onError: a[0] ||= (e) => C.value = !0
46
+ }, null, 40, g)) : (s(), r("p", _, u(d(x)("kvvideo.player.unavailable", { file: w.value })), 1)),
47
+ k.value.length > 0 ? (s(), r("ul", v, [(s(!0), r(e, null, l(k.value, (e) => (s(), r("li", {
48
+ key: e,
49
+ dir: "auto"
50
+ }, u(e), 1))), 128))])) : n("v-if", !0)
51
+ ]));
40
52
  }
41
53
  });
42
54
  //#endregion
43
- export { h as default };
55
+ export { y as default };
package/docs/guide.md CHANGED
@@ -1,16 +1,28 @@
1
- You can make videos with the `video` connector: tutorials that show how to use the person's app, demos, and promotional videos. A video is composed from pages of an app running on this computer, recorded in the installed browser, a narration of your script, and captions burned into the picture.
1
+ You can make any kind of video with the `video` connector: a lesson, an explainer, a tutorial of an app or a website, a promotion, an announcement, a story, a social clip. A video is composed, not generated: websites and HTML pages you write, recorded in the installed browser; the person's images and clips, and licensed ones from the web; a narration from a voice service or recorded by the person; captions; joined with ffmpeg. Make it polished unless the person asks otherwise: the script's "Look and sound" section lists your choices, and the person's agreement to the script covers them.
2
2
 
3
- How to make one:
3
+ How a good video is made:
4
4
 
5
- 1. Run `video check` first. When something is missing, tell the person in plain words what to install or set, and stop until it is there: ffmpeg (with libass) from https://ffmpeg.org/download.html; Google Chrome or Microsoft Edge; a narration service chosen on kvvideo's extension page, with its key added there as a secret (`elevenlabs.apiKey` or `openai.apiKey`), or Piper (`pip install piper-tts`) with a voice file.
6
- 2. Make sure the app runs: start its dev server in the background with `shell`, and use its localhost address. Only pages on this computer can be recorded.
7
- 3. Write the script as a Markdown artifact: one section per scene, each with its narration and what is on screen. Keep scenes short, a few sentences each. Have the person agree to it before you narrate, since narration with ElevenLabs or OpenAI costs money.
8
- 4. For each scene, run `narrate` first: its answer has the narration's length and its captions. Then `record` the scene, with `wait` steps so the picture lasts about as long as the narration; each step's `atMs` says when it happened.
9
- 5. Run `compose` last, with each scene's clip, narration, and captions. Tell the person where the file is; the chat shows a player.
5
+ - **Story.** Fit the video to its kind, purpose, and audience: a lesson teaches step by step, a promotion leads to its offer, a story has its arc, a social clip hooks in its first seconds. Open with what the viewer gets, keep one idea per scene in a logical order, and end with the next step or a call to action. Show rather than tell: the narration explains what the picture can't, and on-screen text is a few words. No filler, repetition, or long still shots; scenes of 3 to 12 s unless the content needs more.
6
+ - **Look.** Use the workspace's brand (`video brand`). For the first video, take the colours, font, and logo from what the person gave or what the video is about (their app's or site's styles, their logo file), or design them for the video; list them in the script and save them with `video brand-set` once the person agrees. Keep colours, type, and style the same in every scene. Design each HTML scene with a clear hierarchy, alignment, contrast, and space, and keep important things inside the middle 90% of the frame. Draw titles, diagrams, charts, and illustrations as HTML, CSS, and SVG pages, and use the person's images and clips and licensed ones from the web for what drawing can't show; never generate images. Show a recorded website in a `window` frame, a phone site in a `phone` frame.
7
+ - **Motion.** Let `record` and `compose` move the pointer and the camera. In an HTML scene, animate with eased motion (an ease-out entrance of 300 to 600 ms, never linear), one thing moving at a time, and kinetic text only for the key words. Use `crossfade` between scenes, `slide` for a step forward in a sequence, and `fade-black` before the ending.
8
+ - **Text.** Short, correctly spelled, readable on its background, and in the video's language. Arabic text reads right to left in an Arabic font, with `dir="auto"` on every text element of an HTML scene.
9
+ - **Sound.** Narration in a clear, natural voice whose `tone` and `speed` fit the purpose; names said right through the pronunciation list (`kvvideo.narration.pronunciations`). Sound effects stay on unless the person asks otherwise. There is no music.
10
+ - **Accuracy and licences.** Say only what is true: what the person gave, what was recorded, or what a source read through a connector says; no invented numbers, features, quotes, or claims. Blur emails, keys, names, and other personal data on screen. A font, library, image, or clip from the web is used only under a licence that allows it, saved in the video's folder, with its source and licence written in the script and its credit in the end scene when the licence asks for one; pin a library's exact version.
11
+ - **Review.** Before telling the person the video is ready, run `video review` and look at every sheet for typos, cut-off or overlapping text, bad zooms, and empty frames; fix what is wrong, and compose again.
12
+
13
+ The steps:
14
+
15
+ 1. Run `video check`. When something is missing, tell the person in plain words what to install or set, and stop until it is there: ffmpeg (with libass and libfreetype) from https://ffmpeg.org/download.html; Google Chrome or Microsoft Edge; a narration service chosen on kvvideo's extension page, with its key added there as a secret (`elevenlabs.apiKey` or `openai.apiKey`), or Piper (`pip install piper-tts`) with a voice file.
16
+ 2. Gather what the video uses: the person's files, the sources its facts come from, and licensed media from the web. When it shows an app of the workspace, start the app in the background with `shell` and use its local address.
17
+ 3. Write the script as a Markdown artifact: a "Look and sound" section (the shapes, the brand, the framing, the caption style, the transitions, the sound effects, and the voice: generated, with its service, tone, and speed, or recorded by the person, with what the examples cost), then one section per scene with its narration and what is on screen, then the media from the web with their sources and licences. Have the person agree to it before anything is narrated, since narration with ElevenLabs or OpenAI costs money.
18
+ 4. For each scene, make the narration first: `narrate`; or, for the person's own voice, `narrate` each sentence as an example, `ask record` with one card per scene (each sentence a line, with the words to stress and where to pause), and `voice` with the takes it answers.
19
+ 5. Write each HTML scene, then `record` each website and HTML scene with its `narration`, starting each action at its caption line with `atLine`. An image or a clip goes to `compose` as it is.
20
+ 6. `compose`, then `review`, fix, and compose again. Tell the person where the file is; the chat shows a player.
10
21
 
11
22
  Rules:
12
23
 
13
- - Narrate a scene again only when its text changed.
24
+ - A chat without `ask` (Decide for me) can't record the person's voice: use a generated one, and say so in the script.
25
+ - Narrate a sentence again only when it changed; the cache makes an unchanged one free.
14
26
  - Put the parts of a video in their own folder, such as `videos/<name>/`, and the video beside it.
15
- - When the person asks for a font, find it on the web, save its .ttf or .otf file in the workspace, and name that file in `compose`'s `captions.font`. `video fonts` lists the bundled ones.
27
+ - When the person asks for a font, find it on the web, save its `.ttf` or `.otf` file in the workspace, and name that file.
16
28
  - A target in `record` is a Playwright selector: prefer `role=button[name="Save"]` or `text=Save` to CSS classes.
package/locales/ar.json CHANGED
@@ -33,5 +33,16 @@
33
33
  "kvvideo.errors.NARRATION_KEY_MISSING": "مفتاح {service} مفقود: أضف السر {secret} في صفحة إضافة kvvideo.",
34
34
  "kvvideo.errors.NARRATION_FAILED": "تعذّر على {service} التعليق الصوتي: {reason}",
35
35
  "kvvideo.errors.RENDER_FAILED": "تعذّر على ffmpeg صنع الفيديو: {reason}",
36
- "kvvideo.player.unavailable": "لا يمكن تشغيل هذا الفيديو هنا. افتح {file} في مساحة العمل."
36
+ "kvvideo.player.unavailable": "لا يمكن تشغيل هذا الفيديو هنا. افتح {file} في مساحة العمل.",
37
+ "kvvideo.progress.step": "تسجيل الخطوة {n} من {of}",
38
+ "kvvideo.narration.pronunciations.title": "النطق",
39
+ "kvvideo.narration.pronunciations.description": "كلمات يُنطق بها الراوي بطريقة مختلفة، في قائمة من { \"word\", \"say\" }: تُقرأ \"kvman\" كـ \"kay-vee-man\". تبقى الكلمة في الترجمة النصية كما كُتبت.",
40
+ "kvvideo.progress.sentence": "قراءة الجملة {n} من {of}",
41
+ "kvvideo.config.brand": "الهوية",
42
+ "kvvideo.brand.title": "الهوية",
43
+ "kvvideo.brand.description": "شعار فيديوهات مساحة العمل هذه وألوانها وخطها، بالصيغة { \"logo\", \"colors\": { \"primary\", \"background\", \"text\" }, \"font\" }. يقترحها الوكيل في نص الفيديو ويحفظها حين توافق.",
44
+ "kvvideo.progress.scene": "المشهد {n} من {of}",
45
+ "kvvideo.progress.final": "المرحلة الأخيرة، {percent}%",
46
+ "kvvideo.progress.sheet": "الورقة {n} من {of}",
47
+ "kvvideo.progress.take": "تنقية التسجيل {n} من {of}"
37
48
  }
package/locales/en.json CHANGED
@@ -33,5 +33,16 @@
33
33
  "kvvideo.errors.NARRATION_KEY_MISSING": "The {service} key is missing: add the secret {secret} on kvvideo's extension page.",
34
34
  "kvvideo.errors.NARRATION_FAILED": "{service} couldn't narrate: {reason}",
35
35
  "kvvideo.errors.RENDER_FAILED": "ffmpeg couldn't make the video: {reason}",
36
- "kvvideo.player.unavailable": "This video can't play here. Open {file} in the workspace."
36
+ "kvvideo.player.unavailable": "This video can't play here. Open {file} in the workspace.",
37
+ "kvvideo.progress.step": "Recording step {n} of {of}",
38
+ "kvvideo.narration.pronunciations.title": "Pronunciations",
39
+ "kvvideo.narration.pronunciations.description": "Words the narration says differently, as a list of { \"word\", \"say\" }: \"kvman\" said as \"kay-vee-man\". The captions keep the word as written.",
40
+ "kvvideo.progress.sentence": "Narrating sentence {n} of {of}",
41
+ "kvvideo.config.brand": "Brand",
42
+ "kvvideo.brand.title": "Brand",
43
+ "kvvideo.brand.description": "The logo, colours, and font of this workspace's videos, as { \"logo\", \"colors\": { \"primary\", \"background\", \"text\" }, \"font\" }. The agent proposes it in a video's script and saves it once you agree.",
44
+ "kvvideo.progress.scene": "Scene {n} of {of}",
45
+ "kvvideo.progress.final": "Final pass, {percent}%",
46
+ "kvvideo.progress.sheet": "Sheet {n} of {of}",
47
+ "kvvideo.progress.take": "Cleaning take {n} of {of}"
37
48
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kvman/kvvideo",
3
- "version": "0.1.0",
4
- "description": "kvvideo: the kvcoder extension that makes videos of the person's app, recorded, narrated, and captioned.",
3
+ "version": "0.1.1",
4
+ "description": "kvvideo: the kvcoder extension that makes any kind of video, from websites and pages recorded in the browser, narrated, and captioned.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -26,7 +26,8 @@
26
26
  "dist",
27
27
  "docs",
28
28
  "fonts",
29
- "locales"
29
+ "locales",
30
+ "sounds"
30
31
  ],
31
32
  "peerDependencies": {
32
33
  "@kvman/sdk": "^0.1.5"
@@ -36,8 +37,8 @@
36
37
  "vue": "3.5.43"
37
38
  },
38
39
  "devDependencies": {
39
- "@kvman/kvai": "0.1.8",
40
- "@kvman/kvcoder": "0.1.16",
40
+ "@kvman/kvai": "0.1.9",
41
+ "@kvman/kvcoder": "0.1.20",
41
42
  "@kvman/kvwebui": "0.1.8",
42
43
  "@kvman/sdk": "0.1.5",
43
44
  "@kvman/testkit": "0.1.10",
@@ -60,6 +61,11 @@
60
61
  [
61
62
  "path"
62
63
  ]
64
+ ],
65
+ "narrations": [
66
+ [
67
+ "key"
68
+ ]
63
69
  ]
64
70
  }
65
71
  },
@@ -0,0 +1,13 @@
1
+ # kvvideo's sound effects
2
+
3
+ kvvideo made these four sounds itself with ffmpeg (plan 16 §16.8, ADR 0115, 62). They are released under CC0 1.0
4
+ (public domain): https://creativecommons.org/publicdomain/zero/1.0/
5
+
6
+ Each was made as 48 kHz mono 16-bit PCM from the source below, then turned up or down so its peak is −3 dBFS.
7
+
8
+ | File | Length | Source (`ffmpeg -f lavfi -i <source> -af <filters> -ac 1 -ar 48000 -c:a pcm_s16le`) |
9
+ |---|---|---|
10
+ | `click.wav` | 45 ms | `aevalsrc='0.6*sin(2*PI*2400*t)*exp(-t*180)+0.4*(random(0)-0.5)*exp(-t*320)':d=0.045:s=48000`, filters `highpass=f=900` |
11
+ | `keys.wav` | 2.07 s, a loop of key taps every 115 ms | `aevalsrc='(random(0)-0.5)*exp(-mod(t,0.115)*380)*(0.7+0.3*sin(2*PI*t*0.9))':d=2.07:s=48000`, filters `highpass=f=1800,lowpass=f=9000` |
12
+ | `whoosh.wav` | 550 ms | `aevalsrc='(random(0)-0.5)*pow(sin(PI*t/0.55),2)':d=0.55:s=48000`, filters `highpass=f=250,lowpass=f=2600` |
13
+ | `pop.wav` | 140 ms | `aevalsrc='0.9*sin(2*PI*(380*t+2600*t*t))*exp(-t*38)':d=0.14:s=48000`, filters `afade=t=in:d=0.004` |
Binary file
Binary file
package/sounds/pop.wav ADDED
Binary file
Binary file