@autoaiai/aicut 0.0.0-stage → 0.1.7

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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/MANUAL.md +84 -0
  3. package/README.md +36 -2
  4. package/SPEC.md +221 -0
  5. package/THIRD_PARTY_NOTICES.md +10 -0
  6. package/TRADEMARK.md +25 -0
  7. package/bin/aicut.mjs +264 -0
  8. package/package.json +89 -6
  9. package/product.json +5 -0
  10. package/skills/aicut/LICENSE +21 -0
  11. package/skills/aicut/SKILL.md +66 -0
  12. package/skills/aicut/references/commands.md +72 -0
  13. package/skills/aicut/references/film-format.md +119 -0
  14. package/skills/aicut/references/recipes.md +184 -0
  15. package/skills/aicut/references/troubleshooting.md +57 -0
  16. package/skills/aicut-motion/LICENSE +21 -0
  17. package/skills/aicut-motion/SKILL.md +255 -0
  18. package/skills/aicut-motion/references/design-systems/README.md +25 -0
  19. package/skills/aicut-motion/references/design-systems/bold-poster.md +62 -0
  20. package/skills/aicut-motion/references/design-systems/data-instrument.md +71 -0
  21. package/skills/aicut-motion/references/design-systems/drafting-table.md +76 -0
  22. package/skills/aicut-motion/references/design-systems/editorial-ink.md +83 -0
  23. package/skills/aicut-motion/references/design-systems/riso-halftone.md +70 -0
  24. package/skills/aicut-motion/references/design-systems/storybook-scene.md +75 -0
  25. package/skills/aicut-motion/references/design-systems/swiss-kinetic.md +67 -0
  26. package/skills/aicut-motion/references/pages.md +258 -0
  27. package/src/film-doc.d.mts +204 -0
  28. package/src/film-doc.mjs +1225 -0
  29. package/src/host.d.mts +35 -0
  30. package/src/host.mjs +542 -0
  31. package/src/look.d.mts +2 -0
  32. package/src/look.mjs +358 -0
  33. package/src/media-links.mjs +68 -0
  34. package/src/of-filters.mjs +237 -0
  35. package/src/overrides.mjs +75 -0
  36. package/src/render.mjs +202 -0
  37. package/src/seekable.mjs +101 -0
  38. package/src/shared.d.mts +27 -0
  39. package/src/shared.mjs +391 -0
  40. package/src/timeline.mjs +1158 -0
  41. package/studio/client.mjs +311 -0
  42. package/studio/server/atomic.mjs +41 -0
  43. package/studio/server/bridge.js +89 -0
  44. package/studio/server/browse.mjs +104 -0
  45. package/studio/server/captions.mjs +502 -0
  46. package/studio/server/chat.mjs +49 -0
  47. package/studio/server/closure.mjs +407 -0
  48. package/studio/server/compound.mjs +133 -0
  49. package/studio/server/custom-services.mjs +299 -0
  50. package/studio/server/derived.mjs +225 -0
  51. package/studio/server/examples.mjs +89 -0
  52. package/studio/server/exports.mjs +1621 -0
  53. package/studio/server/fetch-error.mjs +14 -0
  54. package/studio/server/fetch-github.mjs +181 -0
  55. package/studio/server/fetch-repo.mjs +399 -0
  56. package/studio/server/files.mjs +628 -0
  57. package/studio/server/film-subtitle.mjs +869 -0
  58. package/studio/server/film.mjs +109 -0
  59. package/studio/server/folder-picker.mjs +199 -0
  60. package/studio/server/fonts.mjs +308 -0
  61. package/studio/server/get.mjs +700 -0
  62. package/studio/server/heard.mjs +108 -0
  63. package/studio/server/hidden.mjs +85 -0
  64. package/studio/server/history-migrate.mjs +239 -0
  65. package/studio/server/history-store.mjs +538 -0
  66. package/studio/server/history.mjs +682 -0
  67. package/studio/server/html-deck.mjs +168 -0
  68. package/studio/server/html-film.mjs +686 -0
  69. package/studio/server/html-pages.mjs +604 -0
  70. package/studio/server/http.mjs +40 -0
  71. package/studio/server/jianying.mjs +289 -0
  72. package/studio/server/keys.mjs +126 -0
  73. package/studio/server/main.mjs +120 -0
  74. package/studio/server/markers.mjs +80 -0
  75. package/studio/server/nle.mjs +537 -0
  76. package/studio/server/ops.mjs +506 -0
  77. package/studio/server/page-links.mjs +98 -0
  78. package/studio/server/pageframes.mjs +335 -0
  79. package/studio/server/pages.mjs +197 -0
  80. package/studio/server/prefs.mjs +56 -0
  81. package/studio/server/project-fonts.mjs +263 -0
  82. package/studio/server/project-settings.mjs +130 -0
  83. package/studio/server/projects.mjs +457 -0
  84. package/studio/server/providers/azure.mjs +100 -0
  85. package/studio/server/providers/brave.mjs +55 -0
  86. package/studio/server/providers/common.mjs +321 -0
  87. package/studio/server/providers/contract.mjs +98 -0
  88. package/studio/server/providers/doubao.mjs +65 -0
  89. package/studio/server/providers/edge-drm.mjs +263 -0
  90. package/studio/server/providers/edge-speech.mjs +292 -0
  91. package/studio/server/providers/edge-tts.mjs +112 -0
  92. package/studio/server/providers/elevenlabs.mjs +144 -0
  93. package/studio/server/providers/fal.mjs +212 -0
  94. package/studio/server/providers/google.mjs +201 -0
  95. package/studio/server/providers/groq.mjs +97 -0
  96. package/studio/server/providers/index.mjs +284 -0
  97. package/studio/server/providers/local-mdx.mjs +293 -0
  98. package/studio/server/providers/local-whisper.mjs +847 -0
  99. package/studio/server/providers/mdx-net.mjs +275 -0
  100. package/studio/server/providers/openai.mjs +131 -0
  101. package/studio/server/providers/pexels.mjs +40 -0
  102. package/studio/server/providers/pixabay.mjs +53 -0
  103. package/studio/server/providers/tar-bz2.mjs +356 -0
  104. package/studio/server/providers/tavily.mjs +68 -0
  105. package/studio/server/providers/web.mjs +231 -0
  106. package/studio/server/proxies.mjs +151 -0
  107. package/studio/server/recycle.mjs +222 -0
  108. package/studio/server/render-worker.mjs +29 -0
  109. package/studio/server/separate.mjs +44 -0
  110. package/studio/server/server.mjs +1021 -0
  111. package/studio/server/sfx.mjs +321 -0
  112. package/studio/server/skills.mjs +357 -0
  113. package/studio/server/slides.mjs +230 -0
  114. package/studio/server/stage.js +1553 -0
  115. package/studio/server/stock.mjs +122 -0
  116. package/studio/server/subtitle-edits.mjs +234 -0
  117. package/studio/server/subtitle-segments.mjs +602 -0
  118. package/studio/server/template-posters.mjs +68 -0
  119. package/studio/server/templates-page.mjs +93 -0
  120. package/studio/server/templates-styles.mjs +583 -0
  121. package/studio/server/templates.mjs +269 -0
  122. package/studio/server/transcripts.mjs +490 -0
  123. package/studio/server/transition-pages.mjs +43 -0
  124. package/studio/server/trash.mjs +143 -0
  125. package/studio/server/video-models.mjs +226 -0
  126. package/studio/server/watch.mjs +160 -0
  127. package/studio/server/web-agents.mjs +143 -0
  128. package/studio/server/websocket.mjs +82 -0
  129. package/studio/server/zip.mjs +159 -0
  130. package/studio/ui/dist/assets/ExportCenter-F-2vF-lQ.js +1 -0
  131. package/studio/ui/dist/assets/SettingsModal-BgVYguNu.js +2 -0
  132. package/studio/ui/dist/assets/app-icon-BpqHp2uj.png +0 -0
  133. package/studio/ui/dist/assets/es-BRUzvuoM.js +1 -0
  134. package/studio/ui/dist/assets/index-Bhg-9dA3.css +1 -0
  135. package/studio/ui/dist/assets/index-CWur1Iw9.js +1625 -0
  136. package/studio/ui/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  137. package/studio/ui/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  138. package/studio/ui/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  139. package/studio/ui/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  140. package/studio/ui/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  141. package/studio/ui/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  142. package/studio/ui/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  143. package/studio/ui/dist/assets/ja-Cth-uDcW.js +1 -0
  144. package/studio/ui/dist/assets/ko-upvw591D.js +1 -0
  145. package/studio/ui/dist/assets/zh-CN-BCfJFazB.js +1 -0
  146. package/studio/ui/dist/index.html +23 -0
@@ -0,0 +1,71 @@
1
+ # data-instrument
2
+
3
+ Fits: explainers, finance, science, health, SaaS, any film carried by numbers or a process. Not for: pure mood pieces.
4
+
5
+ ## Palette
6
+
7
+ - Paper white `#F7F7F5` or deep slate `#0F1419`; ink `#1C2430` or `#E6EDF3`.
8
+ - One data accent: `#2F6BFF` on light, `#4CC2FF` on dark.
9
+ - A second series colour `#F2994A`, only when comparing.
10
+ - Grid and axes in ink at 15–25%.
11
+
12
+ ## Type
13
+
14
+ - Inter or Geist 600–800 for headlines (90–160 px).
15
+ - Geist Mono or IBM Plex Mono 400–500 for numbers and labels (20–28 px), `font-variant-numeric: tabular-nums`.
16
+
17
+ ## Marks, in a page
18
+
19
+ - 1.5–2 px axes and leader lines; 3 px data lines; 8 px dots with a 2 px ring.
20
+ - Bars with square ends (`<rect>`, no radius).
21
+ - Diagrams from boxes with 8 px corners and 1.5 px strokes.
22
+ - Lines draw on with `drawOn`; values roll with `counter()` (`references/pages.md`).
23
+
24
+ ```js
25
+ const draw = prog(t, 1.0, 0.9, EASE.out);
26
+ line.setAttribute('d', toPath(series.slice(0, Math.ceil(draw * series.length)), false));
27
+ dot.setAttribute('cx', String(xAt(draw * (series.length - 1)))); // the dot rides the line's head, not a timer
28
+ counter(valueEl, 0, 412, draw);
29
+ ```
30
+
31
+ ## Texture
32
+
33
+ None, or one grain rect at 0.04. Precision is the look.
34
+
35
+ ## Layout
36
+
37
+ - A 12-column grid with 150 px margins.
38
+ - One chart or diagram per scene, about 60% of the frame.
39
+ - Labels attach to their marks with leader lines, never a legend if avoidable.
40
+
41
+ ## Composition
42
+
43
+ - Occupancy: one chart or diagram fills about 60% of the frame.
44
+ - Labels attached to their marks; 150 px margins; nothing bleeds.
45
+
46
+ ## Motion character
47
+
48
+ - 100–120 BPM. Axes first, then data, then the annotation, in that order — never all three at once.
49
+ - `EASE.out` 0.4–0.7 s; `settle` without bounce. Numbers roll on `EASE.smooth`.
50
+
51
+ ## Transition grammar
52
+
53
+ - A data point becomes the next scene's origin: zoom into the dot, the dot becomes a ring, the ring becomes a chart.
54
+ - A line chart's line unbends into the next scene's timeline (one path, morphing through an intermediate shape).
55
+ - A bar grows until it is the full-frame background colour (one `<rect>`, no cut).
56
+
57
+ ## Signature details
58
+
59
+ - A live time code and a source line in mono at the bottom.
60
+ - The key number repeated large at the end.
61
+ - Thin crosshairs that track the value being discussed.
62
+
63
+ ## Sound
64
+
65
+ - A soft pad; `tick` as counters roll and values land; a `bell` when the key number lands; `whoosh` on zoom
66
+ transitions.
67
+ - 100–120 BPM.
68
+
69
+ ## Bans
70
+
71
+ 3D charts, pie charts with more than four slices, gradients, glow, invented numbers presented as real, chartjunk.
@@ -0,0 +1,76 @@
1
+ # drafting-table
2
+
3
+ Fits: designers, creative tools, process, engineering, "how it's made". Not for: luxury, emotional storytelling, food.
4
+
5
+ ## Palette
6
+
7
+ - PAPER: background `#EDE6D5`, graphite line `#16161A`, accent blue `#1B3ED2`.
8
+ - BLUEPRINT: background `#1B3ED2`, lines `#FFFFFF`, accent cyan `#45F0DD`.
9
+ - HOLOGRAM: background `#07080A`, lines `#45F0DD`, white core `#FFFFFF`.
10
+ - Rule: each material's accent is the next material's main colour — the film's transitions are already argued for.
11
+
12
+ ## Type
13
+
14
+ Geist only. 900 for big words; 600–800 for labels at 24–28 px, tracked 0.14–0.3 em.
15
+
16
+ ## Marks, in a page
17
+
18
+ - **Paper:** 4 px strokes with `filter="url(#rough)"` (baseFrequency 0.03, scale 5). Fills are a 45° `<pattern>` of
19
+ 2 px blue rules on an 8–9 px pitch; big type is SVG `<text>` with `fill="url(#hatch)"` and a 2 px stroke.
20
+ - **Blueprint:** clean 3–4 px white paths, drawn on with `drawOn(path, p)`; hidden edges 2 px dashed
21
+ (`stroke-dasharray: 10 8`); fine 1.2 px hatching as a `<pattern>`.
22
+ - **Hologram:** the same path twice — cyan at full width, white at 30% of it on top. Fills are horizontal lines on an
23
+ 8 px pitch; thicker means more lit. No blur, no glow.
24
+
25
+ A material change is the same `d` with new paint, never a new shape:
26
+
27
+ ```js
28
+ const d = toPath(morphPts(cube, panel, prog(t, 3.2, 0.5, EASE.inOut))); // X02
29
+ shape.setAttribute('d', d);
30
+ shape.setAttribute('class', materialAt(t)); // .paper | .blueprint | .hologram — colour, stroke, filter only
31
+ ```
32
+
33
+ ## Texture
34
+
35
+ A grain `<rect>` with `filter="url(#grain)"`, `mix-blend-mode: multiply`, opacity 0.15–0.2, on paper only. A 60 px
36
+ grid at 13%, every fifth line at 26%, drawn in the current material's line colour.
37
+
38
+ ## Layout
39
+
40
+ Locked camera, front-on. Safe area 150 / 90 px. Centred, with ruler-like rails running to the frame edge.
41
+
42
+ ## Composition
43
+
44
+ - Occupancy: the subject fills 40–70% of the width.
45
+ - Centred and symmetric; construction marks extend out from it.
46
+ - No bleed except a scan line or a flood mask in transit.
47
+
48
+ ## Motion character
49
+
50
+ 120 BPM, an event on every beat. `settle(t, beat, { lead: 0.05 })` with no overshoot. `EASE.in` for presses and
51
+ drops, `EASE.inOut` for scans. Holds ≤ 0.5 s.
52
+
53
+ ## Transition grammar
54
+
55
+ - A carrier line morphs through shapes (line → circle → polygon → tiles) on equal point counts.
56
+ - Paper → blueprint: a shape floods the frame — `revealCircle(p)` on a full-frame rect.
57
+ - Blueprint → hologram: one horizontal scan line, `revealInset(p, 'top')` on the new material plus a drawn 4 px line
58
+ travelling with it.
59
+ - Cubes unfold into dashboard panels (one path, morphing).
60
+
61
+ ## Signature details
62
+
63
+ - Corner labels: "FIG. 07 — GEAR" top left, "BEAT 27 / 60" bottom right.
64
+ - Pen-tool handles labelled EASE, ruler ticks, dimension lines with live numbers, gears labelled 16T.
65
+ - Charts that describe the film itself.
66
+ - A small box mascot holding a pencil.
67
+
68
+ ## Sound
69
+
70
+ - A `scratch` under each line being drawn on; a `tick` on every beat; a `knock` on presses and claps; a `whoosh` on
71
+ floods and scans; a soft pad bed.
72
+ - 120 BPM. One `<audio>` clip per hit, placed on the `T` block.
73
+
74
+ ## Bans
75
+
76
+ Particles, glows, lens flares, camera shake, RGB split, crossfades, gradients, bounce.
@@ -0,0 +1,83 @@
1
+ # editorial-ink
2
+
3
+ Fits: culture, food and tea, books, craft, heritage, Chinese and East Asian themes, slow luxury. Not for: tech
4
+ launches, sport.
5
+
6
+ ## Palette
7
+
8
+ - Rice paper `#F3EEE3`, ink black `#1A1814`.
9
+ - Washes of ink at 8–40% opacity.
10
+ - Seal red `#B8322A` as the only accent.
11
+ - Optional tea or ochre `#A7774A`.
12
+
13
+ ## Type
14
+
15
+ - Serif with character. Latin: Fraunces 300–600, or Noto Serif SC for Chinese, at 120–260 px.
16
+ - Captions: Noto Sans SC or Inter 400, 22–26 px, tracked 0.1 em.
17
+ - Vertical Chinese titles are welcome: `writing-mode: vertical-rl` on the block, one column per line, right to left
18
+ across the frame.
19
+
20
+ ## Marks, in a page
21
+
22
+ - **Brush strokes:** a `<path>` stroked 10–40 px, round caps, drawn on with `drawOn(path, p)`. Dry edges come from
23
+ `filter="url(#rough)"` with `baseFrequency` 0.02–0.04 and `scale` 4–10: crisper and denser for small or near
24
+ marks, softer and fainter for large or far ones.
25
+ - **Washes and mountains:** layered shapes far to near, 15–40% opacity far and 80–90% near, each layer with its own
26
+ filter `seed`. A wash spreads by morphing outward from a drop (`morphPts` from a small ring to the wash's
27
+ outline) — never by scaling, which reads as a zoom.
28
+ - **Mist:** thin horizontal strokes 10–25 px tall at 10–15% opacity, drifting with `wobble(seed, i, t, 0.15)`. Never
29
+ blurred blobs.
30
+ - **Seals:** a red rounded square with knocked-out characters (`<rect>` plus white `<text>`).
31
+
32
+ ```js
33
+ const spread = prog(t, 1.2, 1.4, EASE.out); // a wash arriving
34
+ wash.setAttribute('d', toPath(morphPts(dropRing, washRing, spread)));
35
+ wash.style.opacity = String(0.15 + 0.5 * spread); // opacity is part of the same move
36
+ ```
37
+
38
+ ## Texture
39
+
40
+ Paper is the background: a full-frame rect of `#F3EEE3` under one grain rect (multiply, 0.2). Ink carries its own
41
+ grain through `url(#rough)`. Keep the two textures separate — never one noise layer over everything.
42
+
43
+ ## Layout
44
+
45
+ Generous negative space; asymmetric, the subject on a third. Columns of vertical text; a seal near a corner of the
46
+ title.
47
+
48
+ ## Composition
49
+
50
+ - Occupancy: the subject within about 60% of the width.
51
+ - At least 50% of the frame is empty paper; nothing bleeds.
52
+ - Mist and washes stay inside the safe area.
53
+ - Title on the right or left third, never centred over the subject.
54
+
55
+ ## Motion character
56
+
57
+ - 60–80 BPM; breathing, never snappy. `EASE.smooth` over 0.8–1.6 s.
58
+ - Ink spreads on `EASE.out`. Holds of 1–2 s are allowed for reading.
59
+ - No overshoot, no bounce.
60
+
61
+ ## Transition grammar
62
+
63
+ - A wash spreads until it fills the frame, then thins into the next scene's paper — one full-frame rect whose
64
+ `clip-path` grows, then fades.
65
+ - A brush stroke sweeps across as a wipe (`revealInset(p, 'left')` clipped to the stroke's path).
66
+ - A shape (a leaf, a mountain) dissolves into wash and re-forms as the next shape: one path, two morphs, wash in
67
+ between.
68
+
69
+ ## Signature details
70
+
71
+ - A seal that stamps on beat 1 of the title (scale down onto the frame with `settle`, no bounce).
72
+ - Small vertical captions with dates or places.
73
+ - One slow drifting element: steam, a petal, mist.
74
+
75
+ ## Sound
76
+
77
+ - A low drone on the root; a `pluck` on a pentatonic scale (for example D E F# A B) once per bar.
78
+ - `drop` for ink and water; `knock` for seals and stamps; a light `scratch` under brush strokes.
79
+ - 60–80 BPM, long reverb.
80
+
81
+ ## Bans
82
+
83
+ Neon, gradients, glossy 3D, fast cuts, sans-serif titles, emoji, more than one red element per scene.
@@ -0,0 +1,70 @@
1
+ # riso-halftone
2
+
3
+ Fits: indie brands, zines, retro, nostalgia, playful education, small makers. Not for: corporate, luxury.
4
+
5
+ ## Palette
6
+
7
+ - Two or three spot inks on paper `#F4EFE4`: fluorescent pink `#FF48B0`, blue `#0078BF`, yellow `#FFE800`, or teal
8
+ `#00838A`.
9
+ - Overlaps multiply (`mix-blend-mode: multiply`) to make the third colour — that is what the third ink is for, so
10
+ never use it as a flat fill where two others already overlap.
11
+
12
+ ## Type
13
+
14
+ - Chunky grotesk or rounded at 700–900 (Space Grotesk, Archivo, or ZCOOL KuaiLe for Chinese) at 140–300 px.
15
+ - Typewriter-like mono for captions (IBM Plex Mono, 22 px).
16
+
17
+ ## Marks, in a page
18
+
19
+ - **Halftone fills:** a `<pattern>` of dots 4–10 px in pitch, dot radius scaled per area to fake tone
20
+ (`patternTransform="scale(0.7)"` on lighter areas, 1.3 on darker ones). Two patterns are enough for a whole film.
21
+ - **Misregistration:** each ink layer is its own element, offset 2–6 px, drifting with
22
+ `wobble(seed, layer, t, 0.3)` — the offset is what makes it read as printed.
23
+ - **Shapes:** simple and blobby, flat fill, drawn as paths — no outlines.
24
+
25
+ ```html
26
+ <g style="mix-blend-mode: multiply">
27
+ <circle cx="820" cy="520" r="260" fill="url(#dotsPink)" style="transform: translate(3px, -2px)"/>
28
+ <circle cx="1080" cy="560" r="300" fill="url(#dotsBlue)" style="transform: translate(-4px, 2px)"/>
29
+ </g>
30
+ ```
31
+
32
+ ## Texture
33
+
34
+ Paper grain at 0.2, plus a mottled `feTurbulence` mask on large fills so some paper shows through
35
+ (`<mask>` with a `feTurbulence` + `feComponentTransfer` alpha ramp). Never a clean vector fill at full opacity.
36
+
37
+ ## Layout
38
+
39
+ Collage-like, slightly off-grid; elements tilted ±3°; tape and sticker motifs; printed margins.
40
+
41
+ ## Composition
42
+
43
+ - Occupancy 50–80%, collage-like and slightly off-grid.
44
+ - Printed margins: a 120 px paper border; nothing bleeds unless it is a page turn.
45
+
46
+ ## Motion character
47
+
48
+ - 100–120 BPM, stepped: positions update on twos — `stepped(t, 12)` — which reads as hand-made.
49
+ - Mild overshoot allowed (`settle(..., { bounce: 0.2 })`). Layers slide into register on the beat: from a 4–6 px
50
+ offset to 0, in 0.12 s.
51
+
52
+ ## Transition grammar
53
+
54
+ - A page turn or a new "sheet" sliding in over the old one.
55
+ - One ink layer wipes across and the next scene is printed in it.
56
+ - A halftone dot grows until it becomes the next background (`revealCircle`, with the dot pattern behind it).
57
+
58
+ ## Signature details
59
+
60
+ Registration crosses in the corners; a print-run counter ("№ 027 / 300"); colour separations shown briefly before
61
+ they combine.
62
+
63
+ ## Sound
64
+
65
+ - A lo-fi `pluck` figure; `knock` when a layer slides into register; `scratch` for paper slides; `tick` on beats.
66
+ - 100–120 BPM.
67
+
68
+ ## Bans
69
+
70
+ Smooth gradients, glossy effects, perfect vector precision everywhere, more than three inks.
@@ -0,0 +1,75 @@
1
+ # storybook-scene
2
+
3
+ Fits: short stories, characters, music videos and lyric clips, picture books, emotional moments, mascots acting. Not
4
+ for: data, product specs.
5
+
6
+ ## Palette
7
+
8
+ - One dominant mood colour for sky and air (night `#2B3150`–`#4A4F7A`, dusk `#5B6A8F`, day `#BFD8E6`).
9
+ - Darker values of it for ground and silhouettes.
10
+ - Two or three accents carry the story: the key object's colour, the light colour (warm lamp `#F2C46D`), skin or
11
+ material tones.
12
+ - Characters are told apart by one flat colour each.
13
+
14
+ ## Type
15
+
16
+ - Title: brush or serif display in a corner, vertical for Chinese (Ma Shan Zheng, Noto Serif SC 700).
17
+ - Captions: Noto Serif SC or Noto Sans SC at 40–48 px, warm white or lamp yellow, with an optional word-by-word
18
+ highlight (one `<span>` per word, `color` swapped on the beat — never a fade).
19
+
20
+ ## Marks, in a page
21
+
22
+ - Flat shapes, one darker shade per object for volume, corners slightly rounded.
23
+ - **Characters are drawn for the story, not rigged from a library.** Give each one a silhouette the story suggests,
24
+ a shade side, clothing or material details, and an expressive face (eyes, brows, mouth). Never a stick figure
25
+ unless asked. Interpolate between named poses with the `poseAt` pattern in `references/pages.md`; anything they hold
26
+ is drawn at the hand's grip point.
27
+ - Weather as many thin streaks (rain) or drifting dots (snow) across the whole frame, in two depths, each offset by
28
+ `rand(seed + i)` so no two are in step.
29
+ - Light as translucent wedge shapes under lamps, lit windows, and reflections as vertical streaks in puddles — no
30
+ blur, no glow.
31
+
32
+ ## Texture
33
+
34
+ Grain at 0.06, or paper at low strength; a soft `url(#rough)` on ground and foliage for a cut-paper edge when the
35
+ story is gentle.
36
+
37
+ ## Composition
38
+
39
+ - Occupancy: the world fills the frame, characters about 25–40% of its height.
40
+ - Wide and locked: horizon on the lower third, characters on a third line, the key object at the focal point.
41
+ - Layers back to front: sky or wall, far (skyline, hills, shelves), mid (the main set), ground, foreground (posts,
42
+ plants, puddles, objects).
43
+ - Captions in the lower third, never over a face.
44
+
45
+ ## Motion character
46
+
47
+ - 60–90 BPM, character-led.
48
+ - Acting in small readable poses: a hand over, a head turn, a wave, a slump. `settle` with `{ bounce: 0.15 }` for
49
+ gestures only.
50
+ - Weather and ambient elements move continuously. The big moves (an arrival, a departure, a gift handed over, a
51
+ reveal) get the most screen time.
52
+
53
+ ## Transition grammar
54
+
55
+ - One continuous shot: the story changes by action inside the world — something arrives or leaves, lights switch on,
56
+ time of day shifts — not by cuts.
57
+ - A slow push-in is allowed only on the emotional beat, and returns to wide for the ending. Push in by scaling the
58
+ world group, holding the characters' scale, so the depth reads.
59
+
60
+ ## Signature details
61
+
62
+ - A sign, label or object in the world that names the place or the theme.
63
+ - A written word inside the world (on fogged glass, a letter, a ticket) that echoes the caption.
64
+ - A final title card over the emptied scene.
65
+
66
+ ## Sound
67
+
68
+ - An ambience bed matching the environment (rain, wind, room) for the whole film, plus event sounds on the story's
69
+ hits: `knock` for doors and objects, `boom` for vehicles or big arrivals, `drop` for water.
70
+ - An optional soft pluck or pad motif under the captions.
71
+
72
+ ## Bans
73
+
74
+ Camera shake, fast cuts, gradients, glow effects (bloom, neon halos), grey captions on a grey sky, characters cropped
75
+ by the frame at rest.
@@ -0,0 +1,67 @@
1
+ # swiss-kinetic
2
+
3
+ Fits: brand statements, launches, conferences, tech, manifestos. Not for: cosy, handmade, heritage.
4
+
5
+ ## Palette
6
+
7
+ - Off-white `#F2F0EB`, near-black `#0E0E0E`, one hot accent picked for the brand (default signal red `#FF3B1F`).
8
+ - Optional support grey `#9A9A96`.
9
+ - Full-frame inversions (black ↔ white) count as scene changes: they are the transition, so do not also wipe.
10
+
11
+ ## Type
12
+
13
+ - One grotesk: Inter Tight, Space Grotesk or Geist. 800–900 for words at 180–420 px, set tight (−0.03 to −0.05 em),
14
+ often cropped by the frame.
15
+ - 500 labels at 22–26 px, tracked 0.08 em, all caps.
16
+
17
+ ## Marks, in a page
18
+
19
+ - Solid rectangles and rules (2–12 px) snapped to the grid — plain `<rect>`, no filter, no radius.
20
+ - Circles only as solid dots.
21
+ - Arrows built from rules (a shaft `<rect>` plus two short strokes).
22
+ - No outlines on type except one deliberately outlined word (`-webkit-text-stroke: 2px currentColor; color: transparent`).
23
+
24
+ ## Texture
25
+
26
+ None, or one grain rect at opacity 0.05. Sharpness is the texture.
27
+
28
+ ## Layout
29
+
30
+ - A 12-column grid: 120 px columns, 40 px gutters, 150 px margins; a 24 px baseline grid.
31
+ - Asymmetric: hang type from the top-left column, keep big negative space.
32
+ - Numbers (01, 02, 03) mark sections.
33
+
34
+ ## Composition
35
+
36
+ - Occupancy: type fills 60–100% and may bleed off an edge on purpose.
37
+ - Everything else snaps to the grid.
38
+ - At least 30% of the frame is empty background in every scene.
39
+
40
+ ## Motion character
41
+
42
+ - 120–128 BPM. Decisive: `EASE.snap` or `EASE.out`, 0.25–0.45 s moves, no bounce.
43
+ - Words slide in on rails along grid lines, letters stagger 0.02–0.04 s (`letters(el, t, beat)` in
44
+ `references/pages.md`).
45
+ - A block wipes on, the word appears behind it, then the block wipes off — three beats, one element each.
46
+
47
+ ## Transition grammar
48
+
49
+ - Hard-edged block wipes along columns: one full-frame rect per column, `revealInset(p, 'bottom')` staggered by
50
+ 0.04 s, on the beat.
51
+ - Inversion cuts on the beat — the background and the type swap colour in one frame, holding for at least a beat.
52
+ - A word scales until the counter of its O becomes the next frame (scale the whole `<svg>` group, then cut).
53
+ - A rule extends to become the next scene's baseline (one path, `drawOn`).
54
+
55
+ ## Signature details
56
+
57
+ Running section numbers; a thin ticker line at the bottom with a time code; the accent used for exactly one thing per
58
+ scene.
59
+
60
+ ## Sound
61
+
62
+ - `kick` on bar 1; `tick` or `hat` on each beat; a short `clap` on word slams; `whoosh` on block wipes.
63
+ - No pads, or one very low drone. 120–128 BPM.
64
+
65
+ ## Bans
66
+
67
+ Gradients, drop shadows, rounded cards, more than one accent, centred-title-over-three-cards, decorative icons.