@vosjs/cli 0.55.0 → 0.56.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.
package/dist/cli.js CHANGED
@@ -730,7 +730,7 @@ async function cmdCheck(argv) {
730
730
  return result.ok ? EXIT_OK : EXIT_ERROR;
731
731
  }
732
732
  async function delegate(argv, viaAlias = false) {
733
- const { run } = await import("./run-QREATZCN.js");
733
+ const { run } = await import("./run-OIZ7NQPU.js");
734
734
  if (viaAlias && argv[0]) {
735
735
  process.stderr.write(
736
736
  `note: "vos voila ${argv[0]}" is now "vos ${argv[0]}".
@@ -770,7 +770,7 @@ async function main() {
770
770
  const engine = HELP_ENGINE.split("\n").filter(
771
771
  (l) => l.startsWith(` vos ${cmd} `)
772
772
  );
773
- const { verbHelp } = await import("./run-QREATZCN.js");
773
+ const { verbHelp } = await import("./run-OIZ7NQPU.js");
774
774
  const take = verbHelp(cmd);
775
775
  process.stdout.write(
776
776
  `${engine.join("\n")}
@@ -802,7 +802,7 @@ ${take.includes("no such verb") ? "" : take}`
802
802
  main().then(async (code) => {
803
803
  if (code === EXIT_OK) {
804
804
  const verb = process.argv[2] ?? "";
805
- const { HELP } = await import("./run-QREATZCN.js");
805
+ const { HELP } = await import("./run-OIZ7NQPU.js");
806
806
  const documented = [
807
807
  ...helpFlagsFor(HELP_ENGINE, verb),
808
808
  ...helpFlagsFor(HELP, verb)
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  takePaths,
19
19
  validateActions,
20
20
  waitForPageDone
21
- } from "./chunk-FQA7LFXG.js";
21
+ } from "./chunk-XXAY42XS.js";
22
22
  import {
23
23
  BrowserUnavailableError,
24
24
  apiError,
@@ -6,7 +6,7 @@ import {
6
6
  takeBackdrop,
7
7
  takeBrowserArgs,
8
8
  verbHelp
9
- } from "./chunk-FQA7LFXG.js";
9
+ } from "./chunk-XXAY42XS.js";
10
10
  import "./chunk-JX2YEL3M.js";
11
11
  import "./chunk-6XPFWQKP.js";
12
12
  export {
@@ -17,4 +17,4 @@ export {
17
17
  takeBrowserArgs,
18
18
  verbHelp
19
19
  };
20
- //# sourceMappingURL=run-QREATZCN.js.map
20
+ //# sourceMappingURL=run-OIZ7NQPU.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vosjs/cli",
3
- "version": "0.55.0",
3
+ "version": "0.56.0",
4
4
  "description": "The vos CLI: record the real product from a scripted browser flow, auto-zoom from the cursor track, cut as data in doc.json, render deterministic video and stills, deliver a release's media per destination spec, and sync with vos.so. One binary, every verb, MIT.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -53,9 +53,9 @@
53
53
  "playwright": "^1.49.0",
54
54
  "@vosjs/core": "^0.25.5",
55
55
  "@vosjs/editor": "^1.4.0",
56
- "@vosjs/elements": "^0.9.0",
57
- "@vosjs/render-core": "^0.3.11",
58
56
  "@vosjs/shared": "^0.6.0",
57
+ "@vosjs/elements": "^0.10.0",
58
+ "@vosjs/render-core": "^0.3.11",
59
59
  "@vosjs/studio-core": "^0.33.2",
60
60
  "@vosjs/timeline": "^0.4.1",
61
61
  "@vosjs/tween": "^0.8.2"
package/skills/VERSION CHANGED
@@ -1 +1 @@
1
- 0.14.0
1
+ 0.16.0
@@ -164,6 +164,37 @@ Configs pushed to vos.so get preview-rendered on a software-GL fleet: no
164
164
  (too slow), and any fetched asset must be reachable and CORS-open. These are
165
165
  fine for purely local renders on a real GPU.
166
166
 
167
+ ## Your own passes: depth of field, refraction
168
+
169
+ The `postprocessing` list has no depth-of-field pass. For lens effects,
170
+ render the world yourself:
171
+
172
+ - Build the world in a private `THREE.Scene` with its own camera. In the
173
+ timeline's `onUpdate`, render it into `WebGLRenderTarget`s (`samples: 4`
174
+ plus a `DepthTexture` works, the render fleet included), run your passes,
175
+ then restore the renderer's target, clear colour and `autoClear`.
176
+ - `ctx.scene` holds ONE full-screen quad that composites the result
177
+ (`gl_Position = vec4(position.xy, 0.0, 1.0)`, `frustumCulled = false`, no
178
+ depth test). Add it with `ctx.scene.add()`: the engine never adds
179
+ `objects` for you, and a quad left out renders a flat black frame.
180
+ - Size the targets from `renderer.getDrawingBufferSize()`; rebuild them
181
+ when it changes.
182
+
183
+ Depth of field that reads:
184
+
185
+ - **Set the blur in pixels, by design.** A physical lens at scene scale
186
+ (f/1.6 at 40 cm) leaves a sharp zone a few millimetres deep, so the
187
+ subject you mean to show goes soft too. Decide what one depth step should
188
+ cost (8 to 20 px at 1080p) and solve for the lens strength.
189
+ - **Keep the subject square to the camera while it is in focus.** A plane
190
+ seen at an angle spans depth, and shallow focus sharpens only a strip of
191
+ it. Check that the blur at the subject's corners stays under 1 px.
192
+ - **Focus on a plane, not a point:** the focus distance is measured along
193
+ the camera's axis.
194
+ - **Judge focus at full size.** Render `vos still … --width 1920 --height
195
+ 1080` and crop at 100%: a 1280×720 still or a contact sheet hides 10 px
196
+ of blur.
197
+
167
198
  ## Design principles
168
199
 
169
200
  - **Visual impact**: bloom for glow (even 0.3–0.5 elevates); emissive
@@ -169,7 +169,11 @@ approximation.
169
169
  3. **Scaffold**: `npx vos port scaffold` writes `port/program/program.mjs`
170
170
  (every word a bound element, every colour a key, the knobs, a label and a
171
171
  TODO per scene, each scene's words shown in its window, a painter only
172
- when the inventory needs one), `doc.json` with the score as a track, and
172
+ when the inventory needs one, and the PAINTER STARTER as
173
+ `content.refs.lib` when the piece needs a painter or springs: Remotion's
174
+ `spring` to the frame, `springTo` for the timeline, `interpolate`,
175
+ `bezier`, seeded noise; never read another engine's source for these),
176
+ `doc.json` with the score as a track, and
173
177
  `port/REPORT.md` (substituted faces, gaps). Read the report first. On an
174
178
  older CLI, scaffold from `references/intro-port.mjs` by hand.
175
179
  4. **Translate scene by scene** with the tables, replacing each TODO. One
@@ -202,8 +206,8 @@ stated approximation:
202
206
  | a colour per split unit (`charStyle` making one letter red) | segments carry x/y/opacity/scale/rotation only: a separate element, or paint it |
203
207
  | `mixBlendMode` | no blend modes on elements: paint it |
204
208
  | a shape's colour as a knob | an svg's colours are compiled in (static `colors`): paint the shape if its colour must change live |
205
- | `spring()` | no spring ease in the dialect: a `back.out(n)` of the same shape, checked by eye |
206
- | `@remotion/noise`, SVG `feTurbulence` | the painter |
209
+ | `spring()` | no spring EASE in the dialect; the scaffold's painter starter (cli 0.56+) has `lib.springTo`, Remotion's spring on the timeline a step per frame, exact. Older: `back.out(n)`, by eye |
210
+ | `@remotion/noise`, SVG `feTurbulence` | the painter, on the starter's `lib.noise2D/noise3D` (the same character, not the same values) |
207
211
  | a group transform (scale the whole scene) | no element groups: tween each element the same way |
208
212
 
209
213
  Colours render as authored from `@vosjs/elements` 0.8.2 (older versions
@@ -1,4 +1,4 @@
1
- <!-- Generated by scripts/build-element-reference.mjs from @vosjs/core 0.25.3, @vosjs/elements 0.9.0, @vosjs/timeline 0.4.1 and @vosjs/shared 0.5.0. Do not edit by hand: re-run the script. -->
1
+ <!-- Generated by scripts/build-element-reference.mjs from @vosjs/core 0.25.5, @vosjs/elements 0.9.0, @vosjs/timeline 0.4.1 and @vosjs/shared 0.6.0. Do not edit by hand: re-run the script. -->
2
2
 
3
3
  # Elements, the context and eases: the declarations
4
4
 
@@ -353,6 +353,12 @@ unit boundaries, the line aligned by `font.align`). So a per-letter tween
353
353
  moves each letter FROM its laid-out place (`from`, or `s.y + dy`), never
354
354
  to a position computed by hand.
355
355
 
356
+ A split element's `props` are the WORD (`@vosjs/elements` 0.10+): `x`/`y`
357
+ offset every unit, `opacity` multiplies each unit's own, `scale` and
358
+ `rotation` scale and turn the word about its centre, so letters rise
359
+ through `el.segments` while `el.props` drifts or fades the word, two
360
+ tweens, never one per letter. Before 0.10 they moved the FIRST letter only.
361
+
356
362
  Writing any of `content`, `fontSize`, `fontFamily`, `fontWeight`, `fontStyle`, `letterSpacing`, `color`, `strokeColor`, `strokeWidth` on a text element's `props`
357
363
  re-rasters it (the runtime's own list), so a scramble or a counter writes
358
364
  `el.props.content` in `onFrame` and a colour change sets `el.props.color`.
@@ -16,7 +16,7 @@ rows name what has no element equivalent yet.
16
16
  | `useCurrentFrame()` | nothing in a tween (the timeline is the clock); `ctx.time * fps` inside `onFrame` |
17
17
  | `interpolate(f, [a, b], [x, y], { easing, extrapolate: 'clamp' })` | `tl.fromTo(props, { p: x }, { p: y, duration: (b - a) / fps, ease }, a / fps)` |
18
18
  | `Easing.bezier(x1, y1, x2, y2)` | `ease: 'css-bezier(x1, y1, x2, y2)'` (exact) |
19
- | `spring({ frame, fps, config })` | GAP: no spring ease; `back.out(n)` of a similar overshoot, checked by eye |
19
+ | `spring({ frame, fps, config })` | the painter starter (cli 0.56+): `content.refs.lib.springTo(tl, props, { y: [from, to] }, at, { fps, config })` puts Remotion's own spring on the timeline, a step per frame, exact to the frame; `lib.spring({ frame, fps, config })` is the value (`durationInFrames`, `delay`, `overshootClamping` as Remotion's). On an older CLI: `back.out(n)` of a similar overshoot, by eye |
20
20
  | `<Sequence from durationInFrames>` | `tl.addLabel(name, from / fps)` and the scene's elements tweened in and out inside that window |
21
21
  | `<TransitionSeries>` + `fade()` | opacity tweens across the overlap window |
22
22
  | `<AbsoluteFill>` + flex centring | `position: 'center'`; offsets in `transform: { translateX, translateY }` (design px) |
@@ -31,7 +31,7 @@ rows name what has no element equivalent yet.
31
31
  | `<Audio src={staticFile('s.mp3')} />` | `doc.json` `audio: [{ key: 's.mp3', start, in, out, duration, gain, fadeIn, fadeOut }]` |
32
32
  | `<Video>` / `<OffthreadVideo>` | a `video` element, windowed by opacity; a source in-point is not supported yet |
33
33
  | `@remotion/google-fonts` `loadFont()` | `fonts: [{ family, weight, url }]` from `https://vos.so/api/fonts`; a face the catalog lacks is substituted and said |
34
- | `@remotion/noise` `noise3D`, SVG `feTurbulence` grain | the painter, reading its seed and amounts from `data` |
34
+ | `@remotion/noise` `noise3D`, SVG `feTurbulence` grain | the painter, with `content.refs.lib.noise2D/noise3D(seed, …)` (cli 0.56+: seeded simplex, the character of `@remotion/noise`, not its values, so match by eye), reading its seed and amounts from `data` |
35
35
  | `mixBlendMode` | GAP: the painter |
36
36
  | an inline `<svg>` shape | an `svg` element (`src` is the markup); its colours are static, so a shape colour that must be a knob is painted |
37
37
  | a solid background | `ctx.scene.background = new ctx.THREE.Color(ctx.data.ink)` in `createContent`, `.set(ctx.data.ink)` in `onFrame` |