wizz-method 2.22.0 → 2.23.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 (118) hide show
  1. package/THIRD-PARTY-NOTICES.md +7 -1
  2. package/package.json +1 -1
  3. package/removals.txt +3 -0
  4. package/skills-registry.yaml +93 -5
  5. package/src/bmm-skills/1-analysis/research/wizz-market-research/steps/step-06-research-completion.md +27 -0
  6. package/src/modules/lowticket/README.md +2 -1
  7. package/src/modules/lowticket/module.yaml +1 -1
  8. package/src/modules/lowticket/skills/wizz-clone-do-expert/SKILL.md +86 -0
  9. package/src/modules/lowticket/skills/wizz-clone-do-expert/references/clone-prompt-template.md +21 -0
  10. package/src/modules/wizz/_shared/video-pipeline.md +2 -0
  11. package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -1
  12. package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +2 -2
  13. package/src/modules/wizz/agents/wizz-growth/customize.toml +7 -2
  14. package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +3 -2
  15. package/src/skills-lib/wizz-ios-build/SKILL.md +61 -0
  16. package/src/skills-lib/wizz-offer-forge/SKILL.md +2 -2
  17. package/src/skills-lib/wizz-paywall-upgrade-cro/SKILL.md +1 -0
  18. package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/README.md +13 -13
  19. package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/SKILL.md +11 -7
  20. package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/assets/template.html +8 -21
  21. package/src/skills-lib/wizz-pesquisa-de-publico/references/interview-mode.md +69 -0
  22. package/src/skills-lib/wizz-premium-landing-ui-researcher/references/component-sources.md +23 -0
  23. package/src/skills-lib/wizz-premium-landing-ui-researcher/references/design-sources.yaml +73 -0
  24. package/src/skills-lib/wizz-router/references/routing-table-flat.md +5 -1
  25. package/src/skills-lib/wizz-seo-audit/SKILL.md +4 -0
  26. package/src/skills-lib/wizz-seo-audit/references/gsc-regex-perguntas.md +64 -0
  27. package/src/skills-lib/wizz-signup-flow-cro/SKILL.md +1 -0
  28. package/src/skills-lib/wizz-signup-flow-cro/references/trial-abuse.md +40 -0
  29. package/src/skills-lib/wizz-ui-ux-pro-max/SKILL.md +1 -1
  30. package/src/skills-lib/wizz-ui-ux-pro-max/references/common-rules-checklist.md +11 -0
  31. package/src/skills-lib/wizz-video-effects/SKILL.md +3 -1
  32. package/src/skills-lib/wizz-video-effects/assets/effects.config.template.json +10 -0
  33. package/src/skills-lib/wizz-video-effects/references/data-contract.md +2 -0
  34. package/src/skills-lib/wizz-video-effects/references/gates.md +1 -0
  35. package/src/skills-lib/wizz-video-effects/references/one-take.md +41 -0
  36. package/src/skills-lib/wizz-video-effects/scripts/check_one_take.py +159 -0
  37. package/src/skills-lib/wizz-video-effects/scripts/test_one_take.py +126 -0
  38. package/src/skills-lib/wizz-video-styles/LICENSE-lemo-opuscar.txt +21 -0
  39. package/src/skills-lib/wizz-video-styles/SKILL.md +12 -7
  40. package/src/skills-lib/wizz-video-styles/assets/film-styles/dark-keynote.html +78 -0
  41. package/src/skills-lib/wizz-video-styles/assets/film-styles/remotion/Riso.tsx +63 -0
  42. package/src/skills-lib/wizz-video-styles/assets/film-styles/risograph.html +69 -0
  43. package/src/skills-lib/wizz-video-styles/assets/film-styles/swiss-motion.html +84 -0
  44. package/src/skills-lib/wizz-video-styles/references/check-ins.md +25 -0
  45. package/src/skills-lib/wizz-video-styles/references/film-styles/DIRECTOR.md +139 -0
  46. package/src/skills-lib/wizz-video-styles/references/film-styles/archive-lighttable.md +109 -0
  47. package/src/skills-lib/wizz-video-styles/references/film-styles/art-deco.md +112 -0
  48. package/src/skills-lib/wizz-video-styles/references/film-styles/ascii-crt.md +115 -0
  49. package/src/skills-lib/wizz-video-styles/references/film-styles/backrooms.md +125 -0
  50. package/src/skills-lib/wizz-video-styles/references/film-styles/blueprint.md +120 -0
  51. package/src/skills-lib/wizz-video-styles/references/film-styles/brick-toy.md +114 -0
  52. package/src/skills-lib/wizz-video-styles/references/film-styles/briefing-board.md +122 -0
  53. package/src/skills-lib/wizz-video-styles/references/film-styles/caption-news.md +137 -0
  54. package/src/skills-lib/wizz-video-styles/references/film-styles/cel-anime-80s.md +119 -0
  55. package/src/skills-lib/wizz-video-styles/references/film-styles/city-symphony.md +142 -0
  56. package/src/skills-lib/wizz-video-styles/references/film-styles/countdown.md +132 -0
  57. package/src/skills-lib/wizz-video-styles/references/film-styles/crayon-book.md +109 -0
  58. package/src/skills-lib/wizz-video-styles/references/film-styles/dark-keynote.md +117 -0
  59. package/src/skills-lib/wizz-video-styles/references/film-styles/data-physical.md +119 -0
  60. package/src/skills-lib/wizz-video-styles/references/film-styles/dataviz.md +123 -0
  61. package/src/skills-lib/wizz-video-styles/references/film-styles/engraving.md +123 -0
  62. package/src/skills-lib/wizz-video-styles/references/film-styles/game-show.md +118 -0
  63. package/src/skills-lib/wizz-video-styles/references/film-styles/glass-product.md +110 -0
  64. package/src/skills-lib/wizz-video-styles/references/film-styles/halftone-dossier.md +122 -0
  65. package/src/skills-lib/wizz-video-styles/references/film-styles/hd-2d.md +111 -0
  66. package/src/skills-lib/wizz-video-styles/references/film-styles/hologram-hud.md +129 -0
  67. package/src/skills-lib/wizz-video-styles/references/film-styles/impasto.md +124 -0
  68. package/src/skills-lib/wizz-video-styles/references/film-styles/ink-wash.md +120 -0
  69. package/src/skills-lib/wizz-video-styles/references/film-styles/iso-infographic.md +117 -0
  70. package/src/skills-lib/wizz-video-styles/references/film-styles/kino-montage.md +151 -0
  71. package/src/skills-lib/wizz-video-styles/references/film-styles/lidar-survey.md +118 -0
  72. package/src/skills-lib/wizz-video-styles/references/film-styles/living-screencast.md +124 -0
  73. package/src/skills-lib/wizz-video-styles/references/film-styles/lowpoly-island.md +112 -0
  74. package/src/skills-lib/wizz-video-styles/references/film-styles/microgame.md +122 -0
  75. package/src/skills-lib/wizz-video-styles/references/film-styles/microscope.md +108 -0
  76. package/src/skills-lib/wizz-video-styles/references/film-styles/midcentury-toon.md +124 -0
  77. package/src/skills-lib/wizz-video-styles/references/film-styles/news-package.md +158 -0
  78. package/src/skills-lib/wizz-video-styles/references/film-styles/newsreel.md +136 -0
  79. package/src/skills-lib/wizz-video-styles/references/film-styles/one-line.md +114 -0
  80. package/src/skills-lib/wizz-video-styles/references/film-styles/paper-lantern.md +116 -0
  81. package/src/skills-lib/wizz-video-styles/references/film-styles/paper-popup.md +119 -0
  82. package/src/skills-lib/wizz-video-styles/references/film-styles/papercut-red.md +110 -0
  83. package/src/skills-lib/wizz-video-styles/references/film-styles/pictogram-motion.md +119 -0
  84. package/src/skills-lib/wizz-video-styles/references/film-styles/pixel-rpg.md +117 -0
  85. package/src/skills-lib/wizz-video-styles/references/film-styles/risograph.md +125 -0
  86. package/src/skills-lib/wizz-video-styles/references/film-styles/rubber-hose.md +112 -0
  87. package/src/skills-lib/wizz-video-styles/references/film-styles/satellite-briefing.md +116 -0
  88. package/src/skills-lib/wizz-video-styles/references/film-styles/scifi-toon.md +121 -0
  89. package/src/skills-lib/wizz-video-styles/references/film-styles/shadow-puppet.md +124 -0
  90. package/src/skills-lib/wizz-video-styles/references/film-styles/silent-film.md +109 -0
  91. package/src/skills-lib/wizz-video-styles/references/film-styles/silkscreen-poster.md +140 -0
  92. package/src/skills-lib/wizz-video-styles/references/film-styles/spy-titles.md +116 -0
  93. package/src/skills-lib/wizz-video-styles/references/film-styles/stained-glass.md +123 -0
  94. package/src/skills-lib/wizz-video-styles/references/film-styles/swiss-motion.md +115 -0
  95. package/src/skills-lib/wizz-video-styles/references/film-styles/teardown.md +127 -0
  96. package/src/skills-lib/wizz-video-styles/references/film-styles/telestrator.md +137 -0
  97. package/src/skills-lib/wizz-video-styles/references/film-styles/tilt-shift.md +107 -0
  98. package/src/skills-lib/wizz-video-styles/references/film-styles/ukiyoe.md +112 -0
  99. package/src/skills-lib/wizz-video-styles/references/film-styles/urban-sketch.md +126 -0
  100. package/src/skills-lib/wizz-video-styles/references/film-styles/visual-investigation.md +140 -0
  101. package/src/skills-lib/wizz-video-styles/references/film-styles/watercolor.md +113 -0
  102. package/src/skills-lib/wizz-video-styles/references/film-styles/white-model.md +115 -0
  103. package/src/skills-lib/wizz-video-styles/references/film-styles/whiteboard.md +118 -0
  104. package/src/skills-lib/wizz-video-styles/references/film-styles/woodcut.md +122 -0
  105. package/src/skills-lib/wizz-video-styles/references/film-styles.md +140 -0
  106. package/src/skills-lib/wizz-video-styles/references/insert-recipes.md +33 -0
  107. package/src/skills-lib/wizz-video-styles/scripts/beat_grid.py +38 -6
  108. package/src/skills-lib/wizz-vsl/SKILL.md +1 -1
  109. package/src/skills-lib/wizz-vsl/references/assembly-qa.md +1 -1
  110. package/src/skills-lib/wizz-vsl/references/blocks-and-leads.md +1 -1
  111. package/src/skills-lib/wizz-vsl/references/diagnosis.md +2 -2
  112. package/src/skills-lib/wizz-vsl/references/intake.md +5 -5
  113. package/src/skills-lib/wizz-web-security/SKILL.md +2 -0
  114. package/tools/installer/guided/labels.js +16 -0
  115. package/tools/installer/install-text.js +2 -0
  116. package/tools/installer/modules/cli-config.js +3 -0
  117. package/tools/installer/ui.js +6 -0
  118. /package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/prompts.md +0 -0
@@ -0,0 +1,123 @@
1
+ <!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/stained-glass), MIT, (c) 2026 LemoLab; see ../../LICENSE-lemo-opuscar.txt. Paths under demo/ and core/ name that repo's engine, which is not shipped here: build the look in HyperFrames (../film-styles.md). -->
2
+
3
+ # Stained Glass — Style Prompt
4
+
5
+ > A medieval stained-glass window seen from inside a dark stone hall, alive only where the sun touches it: light is the clock, the camera and the story.
6
+ > References (grammar only): the window prologue of *Beauty and the Beast* (1991) (chapters pane by pane, a storyteller's pace); the glass knight of *Young Sherlock Holmes* (1985) (glass that cracks and recombines piece by piece); 12th–13th-century Chartres glass (colour logic, grisaille, leading). Copy none of their characters, compositions, subjects or music.
7
+
8
+ ## 1. Essence, and what it is not
9
+
10
+ - **Cut pieces of coloured glass in dark lead cames**, faces and folds **painted in brown grisaille**.
11
+ - Glass has no light of its own: it **glows only when the sun is behind it** and throws a soft coloured copy onto the stone floor; unlit, it is dark and milky.
12
+ - Figures move **piece by piece**, rigid and stepped.
13
+ - The room is always there: stone, a splayed embrasure, iron saddle bars, a floor that catches light.
14
+ - **Secular**: no crosses, saints, halos or other religious imagery; borrow the craft, not the subjects.
15
+
16
+ Not vector art with black outlines, not a kaleidoscope or Voronoi filter, not Tiffany Art Nouveau, not mosaic (mosaic reflects; glass transmits).
17
+
18
+ ## 2. Materials & rendering
19
+
20
+ One formula for everything (a WebGL compositor), so every element sits in the same light:
21
+
22
+ ```
23
+ glass = tonemap( backlight(x,y,time) × transmittance × glass texture ) + weathering haze × room light
24
+ surface = albedo × (room ambient + glow spilled from lit panes + point lights) // stone, lead, iron
25
+ floor = flagstones × (ambient + projected colour-patch map, blurred + halo) // perspective or top-down
26
+ + additive light shafts with dust · bloom (bright glass eats into the lead: the "irradiation" effect)
27
+ ```
28
+
29
+ - **Hue-preserving tone mapping**: per-channel `1-exp(-x)` turns cobalt pastel; blend to per-channel only at the very top so a sun disc burns white while blue stays jewel blue.
30
+ - **Unlit panes**: weak sky light + room-lit weathering haze, figures ghostly but readable. **Lit panes**: backlight ~2–3×, a soft, slightly skewed moving band edge.
31
+ - **Pieces**: smooth Catmull-Rom cuts (no deep concave corners). **Every piece is textured** (`multiply` in its clip): streaks at a per-piece angle, hue drift (±10 %), darker aged edges by the lead, ±9 % thickness variation. The shader adds seed bubbles, scratches and thickness clouds in world space; fade small features below ~0.6× zoom or they sparkle.
32
+ - **Lead**: near-black, one planar network, thinner on small pieces, round joins, faint grey flange, solder blobs; only where colours meet (one colour = one piece).
33
+ - **Grisaille**: tapered trace lines in translucent dark brown; **matting** (stippled wash, graded shade, soft band inside the lead); **scraped highlights** (a thin stroke beside each fold in the piece's own colour: the only highlight transmitted light allows). Patterns (mail, scales, plates) are grisaille arcs and bands.
34
+ - **Faces**: almond eyes, heavy upper lid, big pupils, brow flowing into the nose. **Expression lives in brows and mouth**; change it by swapping the face piece, never morphing.
35
+ - **Backgrounds**: hand-cut **lozenge quarries** (jittered lattice, shared vertices, a painted motif each); borders of a coloured band with pearls and a white fillet with a running vine.
36
+ - **Room**: warm grey ashlar, a lighter embrasure, mullions; floor of **large irregular flagstones**, never the wall's running bond.
37
+ - **Floor projection**: blurred, ~20 % desaturated, modulated by the stone, haloed, mirrored (the window's top lands farthest into the room). **Shafts**: additive with dust, near 0 at the window, peaking ~40 % down.
38
+
39
+ ## 3. Colour logic
40
+
41
+ - Two hues **carry the picture** (one deep, one hot); three or four more only as **small touches**. Example (Chartres logic): cobalt ground, ruby, touches of gold, green, murrey.
42
+ - Greenish white glass sparingly (faces, fillets, sky). **Flesh darker than you think**, or backlit faces burn white.
43
+ - A story light (candle, lamp, screen) may take a colour no glass uses, so it reads as a source.
44
+ - **The sun's colour is the clock**: blue-white dawn, near-white brightest noon, gold afternoon, deep orange dusk (raise intensity rather than redness), weak blue moonlight. Patch length follows sun height.
45
+ - Stone and lead take colour only from spilled or projected light.
46
+
47
+ ## 4. Type & subtitles
48
+
49
+ - **Subtitles**: a parchment **banderole** near the bottom (curled ends, gentle sag, thin rule), IM Fell English ~44 px in dark ink. It unfurls from the centre; text fades in only once it is ≥ 75 % open; pad the ribbon well past the text. Hold ≥ max(1.8 s, speech + 0.6 s).
50
+ - **Titles**: incised Roman capitals (Cinzel 600) in the stone, dark cut, light lower lip, gilding, revealed by a moving band of light; small lines ≥ 30 px on screen. In the glass, text only as grisaille on a white-glass scroll.
51
+
52
+ ## 5. Motion quality
53
+
54
+ - **Figures step at 8 fps**; light, camera, shafts and dust move on ones (24 fps): stepped light reads as flicker.
55
+ - Rigid pieces on 2D FK (`setTransform(base · T(part))`, free draw order); long bodies are spine chains of banded pieces.
56
+ - **Freeze rule**: a pane's figures use `min(t, t_lightLeft)`. Actions land on the beat.
57
+ - **Crack**: jagged lines race from the impact in ~¼ s, bright with light, a short white flash and a 2-frame shake.
58
+ - **Re-leading**: piece groups slide one beat each with a small outward bump along the lead, each ending in a weld spark; cracks become mending leads.
59
+ - Glass never bends or morphs; things appear by being lit, not faded in.
60
+
61
+ ## 6. Camera grammar
62
+
63
+ A vocabulary, not a route. Opening and ending come from the topic.
64
+
65
+ | Move | Expresses | Can serve |
66
+ |---|---|---|
67
+ | Truck sideways with the band of light | Time passing, the story moving on | a sequence of steps; a day; chapters |
68
+ | Locked close-up on one pane | This panel is "now" | a line being read; a character's decision; a detail |
69
+ | Pull back to the whole window | The rule, or the whole story at once | learning the system; a summary; aftermath |
70
+ | Tilt down the shafts to the floor, then top-down | The picture leaves the glass and becomes light | an event too big for its frame; a dream; a memory |
71
+ | Hold through a crack, no cut | The event is the medium breaking | a turning point; a loss; a revelation |
72
+ | Slow push toward a small light | Attention narrowing to one source | a discovery; a secret; hope |
73
+ | Tilt up to a rose or tracery | Something above the panels governs them | a clock; a cycle; an overview |
74
+ | Rack between two panes, one lit, one dark | Past and present side by side | before/after; two lives; cause and effect |
75
+ | Low angle along the embrasure, glass raking | The window as architecture, scale | awe; an institution; a long history |
76
+ | Return to an earlier framing under new light | The rhyme shows what changed | growth; nightfall; repair |
77
+
78
+ Framing: subjects big (close-ups ~1.3–2.3× a lancet width); in a narrow lancet stack figures diagonally; a revealed thing near centre, ≥ ~1/8 frame width with glow. Transitions: moving light, shafts, a crack, darkness; never a dissolve, wipe or flip.
79
+
80
+ ## 7. Sound palette
81
+
82
+ - **Instruments**: organ (pedal drone, soft stops, full), harp, hand chimes, tubular bells, recorder or a chant-like voice, water-glass notes, timpani; also hurdy-gurdy drone, psaltery, portative organ. No generic piano or strings.
83
+ - **Mode families**: church modes (Dorian, Mixolydian, Aeolian, Lydian), open fifths, drones, parallel organum.
84
+ - **Options**: free unmetred chant for darkness; one note meaning "the light" each time a pane wakes; an organ pedal that holds and then cuts out; a rising scale, one step per lit piece.
85
+ - **Foley, material first** (synthesizable): struck glass = inharmonic partials ~1 : 2.32 : 4.25 : 6.63 : 9.38; crack = snap + pane thump + rain of tinkles; lead = stick-slip creak; glass sliding in a came = gritty band noise + faint squeal; solder = hiss + tick; air on light moves; stone-hall ambience; birds in the vault; iron ticking as it cools.
86
+ - **Silence**: a hard stop, reverb tails included, only the glass's own ring or creak inside; a single long-reverb bell can close it.
87
+ - **Mix**: big and reverberant; heavy hits avoid word onsets; music ducked ~9 dB under voice; −14 LUFS. **Voice**: a gentle, even storyteller, few short lines.
88
+
89
+ ## 8. Native moves
90
+
91
+ A menu: use the ones your story needs.
92
+
93
+ - **Light is time, and the camera.** Only the lit pane is alive; figures freeze when the light leaves. *Fits content like:* the steps of a recipe; a factory's shifts; four seasons of one farm.
94
+ - **Glass projects onto stone.** A key scene plays in the floor patch, which stretches as the sun sinks. *Fits content like:* a memory seen larger than life; a sports play replayed as shadows; a data trend drawn by lengthening light.
95
+ - **Glass cracks, lead mends.** Pieces slide along the leads into a new picture, leaving scars. *Fits content like:* a company's reinvention; an injury and recovery; an old building restored.
96
+ - **A window holds its own light.** At night one pane glows from a source inside the story. *Fits content like:* a lighthouse keeper; a night-shift nurse; a server that never sleeps.
97
+ - **The window as a diagram.** Lancets as columns, a rose as a wheel or dial, the border as a timeline. *Fits content like:* a product lineup; the parts of a cycle; a family tree.
98
+
99
+ ## 9. Pitfalls of the medium
100
+
101
+ - Hidden leads show through front pieces → erase the surface under each piece before stroking its lead.
102
+ - Pastel glass → hue-preserving tone mapping; darker flesh. Red dusk × blue glass = mud → keep blue alive, raise intensity.
103
+ - Voronoi reads as a filter; flat fills read as clip-art → hand-cut lozenges, texture on every piece, heavy grisaille.
104
+ - A sharp floor patch looks like a decal → blur, desaturate, stone-modulate, halo. Shafts at full strength at the window wash out the pane.
105
+ - Top-down projection is flipped → put the wall at the frame bottom so figures stand upright (mirrored, correct).
106
+ - Patch-map canvas size mismatched with the code draws into a corner of the texture → one constant size.
107
+ - Carved text in a dark wide is unreadable → push in, park a light on it.
108
+
109
+ ## 10. Engine
110
+
111
+ In `demo/`: `glass.js` (pieces, textures, lead, grisaille, lozenges), `comp.js` (WebGL2 compositor), `window.js` (lancets, rose, borders, wall, carving), `scene.js` (camera, floor projection, shafts, dust), `subs.js` (banderole), `test.js` / `frames.js` (model sheets and style frames from the real engine), `music/score.py`, `mix.py` (glass/lead foley). `knight.js` / `dragon.js` show the rigid-piece FK rig pattern; build your own subjects with it.
112
+
113
+ ## 11. Variation space
114
+
115
+ You decide the window (lancets, a rose, a medallion, a clerestory), the subjects, the order of light, opening, ending, camera path and pacing. All far from our demo:
116
+
117
+ - Structures: **a rose window as a dial** (petals lit in turn like hours, the centre the answer); **one tall lancet read bottom to top** (a tilt up a life or a process, medallion by medallion); **two windows facing each other** (the sun lights one side in the morning, the other in the evening; the floor between them holds their meeting).
118
+ - Openings: **the floor first** (only a coloured patch on stone; tilt up to find its source); **a lit window from outside at night** (a figure passes a glowing pane, then we are inside); **the glazier's bench** (a single piece cut and leaded, becoming the first piece of the picture).
119
+ - Endings: **clouds cover the sun** (every pane fades to grey at once; one line lingers); **a new pane leaded in** (an empty lancet filled with the last scene); **the camera leaves through the door** (the window small behind, its patch still on the floor).
120
+
121
+ ---
122
+
123
+ How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/stained-glass/DEMO.md). Read it after your treatment exists.
@@ -0,0 +1,115 @@
1
+ <!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/swiss-motion), MIT, (c) 2026 LemoLab; see ../../LICENSE-lemo-opuscar.txt. Paths under demo/ and core/ name that repo's engine, which is not shipped here: build the look in HyperFrames (../film-styles.md). -->
2
+
3
+ # Swiss Motion Graphics — Style Prompt
4
+
5
+ > International Typographic Style in motion: a modular grid, one typeface, one signal colour, and movement as exact as a printing press.
6
+ > References (grammar only): 1950s–70s Zurich posters (Müller-Brockmann, Hofmann, Gerstner, Crouwel) for the grid, flush-left type, scale contrast and "designing programmes"; modern identity systems in motion (Experimental Jetset, Pentagram) for snaps on the beat. Never copy a specific historical poster's composition (no concentric-circle or fan layouts lifted from Müller-Brockmann), never use Helvetica or Akzidenz font files, never name a real institution on a poster.
7
+
8
+ ## 1. Essence, and what it is not
9
+
10
+ - **Pure 2D graphic design animated on a grid**: flat paper, black type and bars, a very light grey and **one** saturated signal colour.
11
+ - **Every element snaps to the grid, every move lands on a beat, nothing bounces.**
12
+ - **Rigor with one exception**: the whole frame obeys a system, so the one element that doesn't becomes a character.
13
+ - **Extreme scale contrast**: a giant numeral next to tiny technical notes.
14
+
15
+ Not a keynote (no gradients, no glow, no device renders), not kinetic typography for a lyric video (words don't fly, spin or bounce), not data visualisation (bars have mass as graphic form, not as charted quantities, unless the grid gives them that meaning), not a Bauhaus pastiche of primary shapes.
16
+
17
+ ## 2. Materials & rendering
18
+
19
+ - **Frame grid**: 1920×1080, 12 columns, ~96 px side margins, 24 px gutters, 24 px baseline. The frame can act as a **spread**: a left page (the programme: numeral, rule text, notes) and a right page (the artifact).
20
+ - **Artifact grid** derived from the content (Gerstner): what the columns and rows *mean* is a design decision. **Choose module sizes that give the elements mass**; too many thin columns make a layout look like a chart.
21
+ - **Surfaces**: page, paper, ink, signal colour, grid lines in two or three light greys (on page, while building, on paper). No gradients, no shadows, no particles, no grain (mux grain 0).
22
+ - **Bars and blocks** are flat rects; consecutive cells of one unit merge into one bar, overdrawn 1 px at seams (antialiasing shows hairlines, especially when rotated or scaled).
23
+ - **A secondary voice** can be light-grey elements under the black ones: depth without a second colour.
24
+ - **A 2D camera matrix** (centre, scale, rotation) for all moves.
25
+
26
+ ## 3. Colour logic
27
+
28
+ - **Paper, ink, greys, and one signal colour.** Only one thing carries the signal colour; that makes it the protagonist. It is the only thing allowed to be inexact.
29
+ - Overprint is allowed: black type on the signal colour.
30
+ - The signal colour can be red, orange, ultramarine or green; choose it for the topic, then never add a second.
31
+ - Examples: `#EAE9E5` page, `#FFFFFF` paper, `#111111` ink, signal `#E30613`; or `#F2F0EA` / `#141414` / signal `#FF5A00`; or `#E9ECEF` / `#0B0B0B` / signal `#1F3FFF`.
32
+
33
+ ## 4. Type & subtitles
34
+
35
+ - **One family for the whole film**, an OFL neo-grotesque (Archivo, Inter, Schibsted Grotesk, Instrument Sans…), several weights. Letter-spacing ~−2 % at ≥ 90 px. Headlines can be lowercase. Load every weight with `document.fonts.load` before drawing.
36
+ - **Flush left, ragged right**; everything on a grid line; big white space is part of the layout. Giant numerals are **optically** flush left (subtract the glyph's left bearing).
37
+ - **Subtitles are part of the layout**, not a bar at the bottom: each line sits at a column start in the current composition (a small grey lead-in + a large bold statement, or a caption like a museum label), each word clip-revealed on its whisper timestamp. Hold ≥ max(1.8 s, speech + 0.6 s); assert it in code.
38
+ - **Caption rows**: small (~19 px) medium-weight notes with a 1 px rule above; technical notes in a corner (module sizes, counts, a bar counter).
39
+
40
+ ## 5. Motion quality
41
+
42
+ - **Two curves only**: a precise ease `cubic-bezier(.7,0,.2,1)` for snaps; linear for lines being drawn, playheads and the exception. No overshoot, no spring, no bounce.
43
+ - **Durations are note values** at the film's tempo. A snap starts one note value early and **lands on the beat**.
44
+ - **Entrances are wipes or clip-reveals, never fades**: words rise out of a clip rect from below the baseline and leave upward; lines grow along their length; paper appears by a wipe; big numerals climb in eased steps ("one module at a time").
45
+ - **Deletions are knife cuts**: a thin line crosses the element, then the element collapses to its midline.
46
+ - **Ripples are ordered by distance** from their cause, a couple of units per subdivision.
47
+ - **The exception moves differently**: linear, unsnapped, perhaps pausing mid-flight; a coordinate readout beside it can turn from "on grid" to "off grid".
48
+ - Smooth 24 fps, no stepping: digital precision, not hand-made.
49
+
50
+ ## 6. Camera grammar
51
+
52
+ A vocabulary, not a route. The camera moves only with the precise ease and only on beats. Opening and ending come from the topic.
53
+
54
+ | Move | What it expresses | Can serve |
55
+ |---|---|---|
56
+ | Locked spread | cause (left) → effect (right) | a rule applied; a before/after; a comparison |
57
+ | Hard pan by one page or column | the next step in a system | a sequence; a catalogue; a timeline |
58
+ | Rotate 90° and stop | the same thing read another way | a poster as a score; a chart as a map |
59
+ | Pull out to a wall of artifacts | one programme, many outputs | a brand system; a product range; a series |
60
+ | Push into one module | detail; the unit of the system | a pixel; a letter; a single data point |
61
+ | Grid extends past the page | the system is bigger than the artifact | scale; ambition; a break from constraints |
62
+ | Split frame into equal cells | parallel cases | options; variants; team members |
63
+ | Vertical scroll through a column | reading; a list | a manifesto; a spec sheet; a timetable |
64
+
65
+ Framing: everything on the grid; the signal element may sit off-grid only when it is being the exception. Transitions are wipes, knife cuts, camera moves and re-flows; never dissolves.
66
+
67
+ ## 7. Sound palette
68
+
69
+ - **Music with a grid of its own**: a steady pulse whose subdivisions give snap durations. Options: motorik / krautrock kit and bass, minimal techno, marimba or vibraphone patterns, a mechanical piano ostinato, a drum machine with a glockenspiel; one instrument added per new rule is a clear build.
70
+ - **Picture and music can share one data file** (a column → pitch, a row → onset), so a graphic can literally be the score.
71
+ - **Techniques (options)**: drop the drums for the one moment of the exception; a near-silent bar before a reveal; thin the band during a reveal so every note is audible.
72
+ - **Foley follows the materials of print**, dry and close, no reverb: letterpress clack, ruling pen "tss", guillotine snick, paper slap and slide, numeral thunk, block snap, felt thump for a landing, rubber stamp, typewriter carriage.
73
+ - **The exception can be the only element that sings** (a sine glide following its position).
74
+ - **Silence**: a hard stop of everything on a downbeat; the next snap reads as an event.
75
+ - **Mix**: voice compressed and ≥ 6 dB above music, music ducked ~10 dB under voice, −14 LUFS.
76
+ - **Voice**: cool, crisp, rule-like sentences; prefer voices with bright consonants.
77
+
78
+ ## 8. Native moves
79
+
80
+ A menu: use the ones your story needs.
81
+
82
+ - **The grid means something.** Columns and rows become a quantity (notes, hours, floors, years). *Fits content like:* a building's floors and rooms; a week's timetable; a city's districts.
83
+ - **Snap = beat.** Every arrival is a percussion hit. *Fits content like:* a product's feature list; the steps of a recipe; a countdown.
84
+ - **Programme.** Rules applied one by one to one artifact, then the same programme generating many. *Fits content like:* a brand identity; a typeface family; a set of stamps.
85
+ - **Extreme scale contrast.** A giant element as chapter card beside tiny notes. *Fits content like:* a record statistic; a year; a price.
86
+ - **The exception.** One element breaks the grid, linear and unsnapped. *Fits content like:* an inventor; an outlier in the data; a rebel employee.
87
+ - **Knife cut.** An element deleted by a line. *Fits content like:* budget cuts; editing a text; removing a feature.
88
+ - **Re-flow.** Everything else rearranges around a change, nearest first. *Fits content like:* a team reorganised; traffic after a road closes; a layout adapting to a phone.
89
+
90
+ ## 9. Pitfalls of the medium
91
+
92
+ - Too many thin columns look like a chart → fewer, wider modules.
93
+ - A "better" composition that isn't obviously better → one strong diagonal with long/short rhythm, a larger signal element, bleeds, type over colour. Merely tilting is not enough.
94
+ - Rotating and labelling at once reads as noise → rotate, hold, then add labels.
95
+ - Merged bars show seams after rotation → overdraw 1 px.
96
+ - Elements that share the camera matrix leak into other shots → draw them only when on screen.
97
+ - Canvas `letterSpacing` affects `measureText` → measure after setting the font.
98
+ - Onsets that fall between frames flicker → put visual onsets on whole frames.
99
+ - Whisper splits or merges words and pads the first word → align by letters, clamp to 0.
100
+
101
+ ## 10. Engine
102
+
103
+ In `demo/`: `ease.js` (`cubic-bezier(.7,0,.2,1)`, `snap(t, t_arrive, dur)`, `steps()`, `track()`), `film.js` (layout system, clip-reveal text, knife cuts, bars from a score, rotation reveal, wall of artifacts, caption rows), `main.js` (fonts, whisper word times, `?nosub=1`, `?poster=1`), `score.json` (the shared data file for picture and music), `tools/words.py` and `tools/subs.py` (word timings, asserted subtitle intervals). File list and build steps: [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/swiss-motion/DEMO.md) "Build notes".
104
+
105
+ ## 11. Variation space
106
+
107
+ You decide the system, what the grid means, the exception (or none), the signal colour, the opening and the ending. All far from our demo:
108
+
109
+ - Structures: **a timetable** (a 24-row grid of hours fills with the topic's day, one row per beat); **an alphabet** (A to Z, each letter a module of the topic, the grid completing as a specimen sheet); **a comparison** (two systems side by side on a split spread until one element crosses the gutter).
110
+ - Openings: **a single dot** placed on the page, then the grid growing from it; **the finished artifact** that is then dismantled into its rules; **a giant numeral** filling the frame, which turns out to be a detail of a small layout.
111
+ - Endings: **the empty grid** after every element has been cut away; **a single word** flush left in the corner; **the exception leaves the frame** and the system closes over the space it left.
112
+
113
+ ---
114
+
115
+ How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/swiss-motion/DEMO.md). Read it after your treatment exists.
@@ -0,0 +1,127 @@
1
+ <!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/teardown), MIT, (c) 2026 LemoLab; see ../../LICENSE-lemo-opuscar.txt. Paths under demo/ and core/ name that repo's engine, which is not shipped here: build the look in HyperFrames (../film-styles.md). -->
2
+
3
+ # Exploded Teardown — Style Prompt
4
+
5
+ > A real product, built from its own engineering files (CAD, PCB layout, bill of materials), lit like a studio packshot and taken apart in front of the camera: the layers lift on one axis, the camera travels between them, every part is named with the numbers its files contain, and it closes again into one object.
6
+ > References (grammar only): hardware-launch exploded films (layer stagger, orbit timing), repair-guide teardowns (opening order, the macro on the part that matters), engineering drawing (leaders, dimension lines). Never copy their products, layouts, typefaces or music, or name them in the film.
7
+
8
+ ## 1. Essence, and what it is not
9
+
10
+ A frame reads as this style when:
11
+
12
+ - **the object is real and exact**: geometry, positions and counts come from the product's own files (STEP, KiCad, BOM, assembly guide). Nothing is eyeballed that a file can give;
13
+ - **it is shown apart**: layers float on one axis with even, readable gaps, each still oriented as it sits in the product;
14
+ - **it is photographed, not drawn**: physically based materials, a studio key light, a cool rim, an HDRI reflection, soft contact shadow on an invisible floor;
15
+ - **the numbers live on the object**: thin leader lines from a dot on the part, dimension lines with ticks drawn in the scene's own perspective, never a table beside it;
16
+ - **the camera never stops travelling**: one or a few continuous moves, orbit outside, macro inside.
17
+
18
+ It is not a glass product render (one object, material beauty, no disassembly), not a blueprint (line drawing on a grid, no light), not a keynote (slides, headline type, a stage), not an assembly manual (step numbers, arrows, hands).
19
+
20
+ ## 2. Materials & rendering
21
+
22
+ - Real-time PBR (three.js `MeshPhysicalMaterial`) at 2× and downsampled, ambient occlusion, a depth of field with one aperture for wide and macro (blur follows 1/focus − 1/z, so it grows as the camera comes close), a high-threshold bloom for emitters only, a vignette.
23
+ - Each material keeps its character: plastics with soft sheen (roughness 0.55–0.7), boards with a thin clearcoat and traces as a raised, lighter relief under the mask, metallic pads, tight highlights on machined metal, matte rubber.
24
+ - **Boards are painted from their layout files**: copper pours, every trace, via, pad and drill, silkscreen, on both sides, at 14–20 px per millimetre, with roughness, metalness and bump maps from the same drawing. Components stand at their footprint positions with their package sizes.
25
+ - Light: a warm key from above front, a cool rectangular rim behind that follows the camera so edges separate from the ground, a soft top light, a low HDRI for reflections; a practical fill only where the camera goes inside.
26
+ - Background: a dark graphite seamless sweep (screen-space radial gradient), floor visible only as soft shadow.
27
+ - Effects anchored to the world (leaders, dimension lines, glows) are projected from 3D points every frame; only subtitles and title cards live in screen space.
28
+
29
+ **Where the geometry comes from.** For the user's own product, ask for its STEP / IGES / KiCad / other CAD exports, BOM and spec sheet before anything else. For a public product, look for open hardware (GitHub, GitLab, OSHWA certification list, Hackaday.io, Printables/Thingiverse sources with the original CAD) and component datasheets from the maker. CC0, public domain, CC BY and MIT are fine with credit; CERN-OHL (-P, -W, -S), CC BY-SA, GPL hardware and "no known restrictions" are not the same thing: name the terms to the user and ask before using them. Without files, build only from published dimensions (datasheet, spec page), say on screen or in the voice that it is a model, and show no number you could not source. Never stand in a generated image for the real part.
30
+
31
+ Keep a FACTS.md in the project folder (claim, source URL, quoted wording, or the measurement method for anything measured from the CAD) and deliver it with the film.
32
+
33
+ ## 3. Colour logic
34
+
35
+ - The product brings its own colours; the frame around it is neutral and dark, so the product is always the brightest, most saturated thing.
36
+ - Interface ink is one warm white at two strengths (names at full, specs at about 60 %), plus **one accent** reserved for measured things: dimension lines, label indices and one matching detail on the product itself.
37
+ - Values are ordered: ground darkest, product mid to light, labels lightest. Never put text on a busy, bright part without a dark backing.
38
+ - Example (our demo): ground #34363a → #0d0e10, ink #f1efe9, accent #ff6b3d.
39
+
40
+ ## 4. Type & subtitles
41
+
42
+ - Names: a clean sans at medium weight in the film's script (28–32 px; Noto Sans SC 500 in our demo). Specs and numbers: a monospaced face (15–22 px; JetBrains Mono) so digits line up and read as measurement. A neutral grotesque (Inter) for Latin running text.
43
+ - Label structure is fixed: a two-digit index in the accent, the name, one spec line. Units always written (mm, MB, ×n for counts). A label carries at most one fact the voice does not say.
44
+ - Dimension text sits on a small dark plate, follows the line's angle and is never upside down.
45
+ - Subtitles: a centred strip at the bottom with a soft shadow and no box; if the film is bilingual, the film's language on top. Hold every cue ≥ max(1.8 s, speech + 0.6 s); every label stays fully in frame for CJK ÷ 4.5 + other ÷ 15 + 1.5 s.
46
+
47
+ ## 5. Motion quality
48
+
49
+ - 24 fps on ones; everything is smooth and deterministic.
50
+ - **Separation**: smooth start, fast middle, long settle (ease-in-out cubed); layers leave top first, 0.15–0.2 s apart; repeated parts (keys, screws) fan out in a wave ordered by distance from a corner.
51
+ - **Closing**: bottom first, quicker (about 1 s per layer), the last layer lands with a real mechanical response (a key travels its stroke and returns; nothing bounces like rubber unless it is rubber).
52
+ - While held apart, layers may float a millimetre or two with offset phases; during macro shots they hold perfectly still.
53
+ - Labels draw in (anchor dot, leader growing, text sliding 10 px) and fade out before the parts move again.
54
+ - Never moves: the floor, the light rig's relation to the camera, the label column's x position.
55
+
56
+ ## 6. Camera grammar
57
+
58
+ | Move | What it expresses | Can serve |
59
+ |---|---|---|
60
+ | Orbit while layers separate | the whole, its order of assembly | a reveal; a structure overview |
61
+ | Grazing macro dolly | touch, material, finish | an opening; a texture |
62
+ | Dive between layers | being inside | a hidden component; how it works |
63
+ | Slow push on one still part | the part that matters | a chip, a sensor, a seal |
64
+ | Rise through the stack | one subsystem to the next | a transition between stops |
65
+ | Fast pull back | return, synthesis | a closing; a before/after |
66
+ | High three-quarter drift | scale and precision | sizes, pitch, thickness |
67
+
68
+ - At key moments the subject fills at least a third of the frame height. Labels live in a column on the free side (shift the projection with a view offset rather than moving the object), subtitles in the bottom 12 %.
69
+ - Transitions are camera moves through the object itself. No cuts to black, no slide transitions, no split screens.
70
+ - The camera path is keyed in the product's own coordinates and interpolated without overshoot (monotone cubic), so a held macro really holds.
71
+
72
+ ## 7. Sound palette
73
+
74
+ - Instruments: tuned mallets (marimba, vibraphone, glockenspiel, glass), a round bass, a short synthetic kick and small dry percussion. Precise and dry outside the object; sustained and airy inside it.
75
+ - Foley is the material: hollow plastic clacks for keycaps or housings, a switch click with a low thock, dry taps for boards, inharmonic rings for small machined metal, a soft thud for the enclosure, airy swooshes for layers lifting and for camera dives, a fine pen hiss when a dimension line draws, a tiny tick per label.
76
+ - Every separation and every landing has its sound, panned to where the part is.
77
+ - Silence: at least two near-silences (room tone only) before the big separations or the turn back; the first sound after each is the most important hit around it.
78
+ - Mix: voice clearly on top (music about 10 dB under it while it speaks), music bus ducked, sub-bass kept lean (20–60 Hz well under the full band), loudness −14 LUFS.
79
+ - Voice: calm, close, unhurried, short sentences; numbers spoken as words, written as digits.
80
+
81
+ ## 8. Native moves
82
+
83
+ - **The wave lift.** Repeated parts rise in a wave across the object. *Fits content like:* battery cells; solar tiles; the drawers of a modular shelf.
84
+ - **Inside the gap.** The camera enters the space between two lifted layers to see a hidden face. *Fits content like:* the back of a logic board; the inside of a drone arm; the underside of a sensor module.
85
+ - **The leader that lands on the part.** A macro label whose line ends on the component. *Fits content like:* a pressure sensor in a shoe; a gasket in a waterproof case; a motor driver.
86
+ - **Dimensions drawn on the thing.** After closing, the real outline gets dimension lines in perspective. *Fits content like:* the thickness of a laptop lid; the footprint of a router; the bore of a valve.
87
+ - **One real motion.** A part performs its true mechanical motion once (a press, a hinge, a latch). *Fits content like:* a camera shutter; a buckle; a folding hinge.
88
+ - **Lights on inside.** Emitters inside the product switch on while it is apart. *Fits content like:* status LEDs; a backlit display; an indicator ring.
89
+
90
+ ## 9. Pitfalls of the medium
91
+
92
+ - **Invented numbers.** A size that no file gives. Fix: measure it from the CAD and say "measured" in the facts file, or leave it out.
93
+ - **Mixed-up revisions.** Plates, cases and boards from different versions of a project. Fix: check hole positions and stack heights across the files (they must coincide), and pin the commit.
94
+ - **Panelised boards.** Layout files may hold a panel with breakaway tabs. Fix: take the outline from a plate or case of the same revision, or flood-fill from an interior point.
95
+ - **Zero-length edges.** Duplicate outline points give zero normals → NaN → black squares after bloom. Fix: clean outlines, repair zero normals, scan frames for one-frame black tiles.
96
+ - **Overshooting camera splines.** Catmull-Rom over unevenly spaced keys flies past a macro stop. Fix: monotone interpolation per component.
97
+ - **Labels too short.** Macro stops last about three seconds. Fix: one fact per label, opened before the camera settles; check with `readcheck`.
98
+ - **Over-bright light sweeps.** Area lights blow plastics to white. Fix: sweeps at a fraction of the key, bloom threshold above the brightest diffuse surface.
99
+ - **Brand marks on parts.** Chip tops and connector shells carry trademarks. Fix: plain package tops; drop logo footprints unless the product is the user's own.
100
+ - **Crushed blacks.** Black plastics against a black ground disappear. Fix: lift them to a dark grey and let the rim light separate them.
101
+
102
+ ## 10. Engine
103
+
104
+ All in `demo/src/` (three.js r170, the library's `core/three/post.js` and `core/lib.js`):
105
+
106
+ - `parts.js`: `keycapGeometry(w, d, h)` (lofted shell with a spherical dish and a stem), `switchGeometries()`, `loft(rings)`, `shapeFrom(outline, holes, circles)` (KiCad outline to extrusion), `inset`, `hexSpacer`, `screwGeometry`.
107
+ - `pcbtex.js`: `paintPCB(data, side, outline, box, ppm)` paints colour, roughness/metalness and bump maps from extracted layout data.
108
+ - `comps.js`: `buildBackParts(data, group, y, materials)` places package bodies at footprint positions and returns anchors.
109
+ - `overlay.js`: anchored labels (`label`), perspective dimension lines (`dimension`), subtitles, title card, readcheck texts, subtitle width check.
110
+ - `main.js`: layers, explode and gap functions, the camera keys (orbit or eye/target, monotone), lights, `window.EV` for the mixer.
111
+ - `tools/extract_pcb.py`, `kicad_geom.py`, `sexp.py`: read any `.kicad_pcb` (outlines, tracks, zones, pads, silkscreen, footprints; plain Python). `tools/step2mesh.mjs`: STEP to mesh.
112
+
113
+ **Extra packages and packs**, beyond `setup.sh deps [voice] [music]`: `occt-import-js` (npm, LGPL-2.1, not in the library's package.json) to triangulate STEP files, and the studio HDRI (`sh tools/fetch.sh hdri`). Install the npm package yourself into a private `node_modules` in the project folder (as `tools/fetch_cad.sh` does in a temp folder), never into `$LIB`.
114
+
115
+ Minimal example, not in the demo: read a plate file with `extract_pcb.py`, extrude `shapeFrom(outline, cutouts)` 1.5 mm as aluminium (`metalness: 1, roughness: .35`) and orbit it with three `CAM` keys.
116
+
117
+ ## 11. Variation space
118
+
119
+ Decided per film: which product and revision, which layers to separate and in what order, how many stops inside and which parts deserve them, the camera route, whether to open from the whole or from a detail, the product's palette and the accent, the voice.
120
+
121
+ - **Three structures**: one orbit with two stops; a "how it works" path following a signal or flow through the layers; two revisions taken apart side by side, each held still before a difference is named.
122
+ - **Three openings**: a part performing its real motion in macro; the closed product turning in silence on the seamless; a single component floating alone before the rest of the product assembles around it.
123
+ - **Three endings**: closed with its dimensions drawn on it; closing into a top view that becomes a technical drawing; apart one last time, frozen, every part labelled like a printable sheet.
124
+
125
+ ---
126
+
127
+ How our demo was made (story, shots, score, title card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/teardown/DEMO.md). Read it after your treatment exists.
@@ -0,0 +1,137 @@
1
+ <!-- Vendored from lemo-opuscar (https://github.com/lemomo-ai/lemo-opuscar/tree/413a6bd6/styles/telestrator), MIT, (c) 2026 LemoLab; see ../../LICENSE-lemo-opuscar.txt. Paths under demo/ and core/ name that repo's engine, which is not shipped here: build the look in HyperFrames (../film-styles.md). -->
2
+
3
+ # Sports Telestrator — Style Prompt
4
+
5
+ > The TV football analysis segment: play the clip at full speed, rewind, freeze it, and draw on the broadcast picture — rings under players' feet, marker arrows for the ball, a red patch for the space nobody covered — then play on, switch angles, count the frames, and flatten the pitch into a board. Real match footage is the ground; every line is drawn on top of it and moves with it. A studio show's packaging (sting, corner bug, score bar, a yellow wipe) holds it together. 16:9.
6
+ > References (grammar only): touch-screen analysis segments in televised football (the "telestrator" pundit's board), and explainer channels that annotate real match footage. Never copy a broadcaster's or channel's logo, fonts, colours, idents or graphics, and never name them in the film.
7
+
8
+ ## 1. Essence, and what it is not
9
+
10
+ 1. **Watch it, then take it apart.** Every piece of action is seen moving before it is explained. A freeze always follows play; the explanation never comes first.
11
+ 2. **One freeze, one finding.** Each freeze says one thing (the ball wasn't cleared; nobody stepped out; he struck it from outside the box) with one label and at most two groups of lines. The same few seconds of footage are reused, each pass going one layer deeper.
12
+ 3. **Drawn on the real picture.** Rings sit under feet, arrows follow the ball's real path, the box line is traced over the real line. Nothing floats in an abstract diagram until the film deliberately flattens the pitch.
13
+ 4. **Data counted from the footage.** Times come from frame counts (a stopwatch that runs on source frames), distances from the pitch markings (a perspective transform). What the footage can't measure (ball speed, sprint distance) is not stated.
14
+ 5. **Studio energy.** Bright marker lines, a white flash and a punch on every freeze, the music stopping with the picture.
15
+
16
+ Not **Visual Investigation** (that is restrained, synchronised multi-camera evidence where the timeline is the protagonist; this is a pundit's show with packaging and enthusiasm). Not a **highlight reel** (no montage of goals to music; each clip is analysed). Not **Data Storytelling** or an infographic: charts are not the film; the top-down board appears once, as a summary, and is reached by flattening the real picture.
17
+
18
+ ## 2. Frame and layout (1920×1080)
19
+
20
+ - **Full-frame footage** most of the time. The packaging lives in the corners:
21
+ - **Corner bug**, top right (x 1452–1880, y 38–110): show name on a yellow block + a mode line in the mode's colour — LIVE (red dot) / ANALYSIS (yellow) / REPLAY (cyan). It is in every footage frame from frame 1, because it sits over the broadcaster's logo.
22
+ - **Score bar**, bottom right (x 1392–1880, y 926–996): HOME n – n AWAY + minute. The away number flips on the frame the ball crosses the line (a 0.5 s roll with a yellow flash). It sits over the broadcaster's URL.
23
+ - **Source clock**, top left (x 40–370, y 38–90), on every analysis shot: `❚❚ 04.20s F106` — source seconds and frame number; ▶ ½ in slow motion, ◀◀ in a rewind. Hidden in live play.
24
+ - **Labels** (black card, coloured left bar, Chinese line + small spaced English line) sit in empty grass or crowd, never over the action they describe.
25
+ - **Subtitle bar** bottom, centred at x 880 (its right edge stays left of the score bar), y 938–1044.
26
+ - **Split screen**: two 960×1080 vertical windows, each a 960-px-wide slice of a 1920 frame at 1:1 (no extra scaling), a 6 px yellow divider between them, a camera label at each window's top left (A MAIN CAMERA / B HIGH REVERSE). The slices are chosen so the broadcaster's logo and URL fall outside them.
27
+ - **Board pages** (shot map, data card): dark board `#0C1411` with a faint 60 px grid; left column text, right side drawing. No headers, no centred title-and-bullets.
28
+
29
+ ## 3. Editing grammar
30
+
31
+ - **Order inside one piece of action:** live at 1× (original sound) → rewind (0.6 s, reversed with tracking bars and ◀◀) → freeze ① → slow play (0.6–0.85×, frame-blended) → freeze ② → slow play with a stopwatch → freeze ③ → ball flight with a comet trail → another angle (replay), possibly one more freeze.
32
+ - **Lighter variants** for secondary pieces of action, so the deep breakdown stays special:
33
+ - **Freeze-in-play**: no rewind; play at 1× up to the decisive pass, freeze, draw, then play on to the goal.
34
+ - **Dual-angle freeze**: both angles play side by side and each arrives at the same instant (each at its own speed) where both freeze together; the same player is ringed in both.
35
+ - **Freeze length** 1.8–2.4 s; a freeze longer than ~2.5 s needs a second action inside it. Two to four freezes per piece of action; more than four, split with a replay.
36
+ - **Cuts between segments**: only the packaging wipe — a yellow slanted band with dark edges crossing the frame in 0.34 s. Inside a segment, hard cuts. No dissolves, no page turns.
37
+ - **Comparison frames** (the shot map, the data card) are fully drawn early and held ≥ 2.5 s before the next cut.
38
+
39
+ ## 4. Colour identity (the one rule that matters)
40
+
41
+ | Role | Colour |
42
+ |---|---|
43
+ | The team/player we follow, the ball, main marker lines | `#FFD400` fluorescent yellow |
44
+ | Opponents (rings, block arrows, link lines) | `#3FD8FF` cyan |
45
+ | Space (a patch nobody covers) | `#FF3B30` red, fill 0.34–0.38 + dashed edge |
46
+ | Pitch lines traced, neutral marks, stamps | `#F4F1E8` chalk |
47
+ | Show board | `#0C1411` ink green-black |
48
+ | Label / bug background | `rgba(8,12,14,0.9)`; opaque `#080C0E` where it covers a logo |
49
+
50
+ One colour, one identity, throughout the film: a label's left bar takes the colour of what it names. Change the hues if the show needs to, never the three roles.
51
+
52
+ ## 5. Type
53
+
54
+ - Labels: Noto Sans SC 900, 40 px (30 px for a name), English line Barlow Condensed 600, 21 px, letter-spacing 2 px, in the role colour.
55
+ - Packaging numbers (score, minute, stopwatch, big data): Barlow Condensed 800 Italic.
56
+ - Clock / frame numbers: IBM Plex Mono 500, 24 px.
57
+ - Board pages: title Noto Sans SC 900 60–64 px, rows Noto Sans SC 700 34–42 px with a grey note under each, numbers Barlow Condensed 800 Italic 64–150 px in yellow; text appears left to right with a clip reveal.
58
+ - **No handwriting fonts** anywhere: printed type on a dark card belongs to the same packaging; handwriting reads as a school notebook.
59
+ - Subtitles: Chinese line (Noto Sans SC 500, 38 px) above an English line (Barlow Condensed 600, 32 px), black bar 0.64 with a 4 px yellow edge; one line per language, never wrapped — shorten the line instead of shrinking it.
60
+ - All fonts OFL from Google Fonts, subset to the characters used (`demo/tools/fonts.py`).
61
+
62
+ ## 6. Motion and drawing
63
+
64
+ - **Freeze entry**: white flash 0.1 s (0.55) + punch 1.035 → 1.0 in 0.35 s (ease-out) + desaturate 42 % + a cool cast + heavier vignette; then a slow 1.2 % creep. Overlays use the same transform as the picture, or they slide off the players.
65
+ - **Spotlight**: everything outside a focus ellipse darkens to 0.42 (even-odd hole), 0.3 s fade.
66
+ - **Marker line**: dark outline (w + 6, black 0.55) + coloured core with glow 18 + thin white highlight (w × 0.28); drawn along its length; an arrowhead pops in over the last 10 %; deterministic small wobble at the vertices so it feels hand-drawn. Dashed for intended or future paths (a cross, a run), solid for what happened.
67
+ - **Ring**: perspective ellipse (ry = 0.36 r) under the feet, drawn clockwise, outer dashed ring rotating at 60 px/s; a vertical light beam while the player moves.
68
+ - **Draw order inside a freeze**: ring (who) → area or link (what happened) → label (the one-line finding), 0.3–0.6 s apart.
69
+ - **Slow motion**: source frames at 0.6–0.85×, neighbours cross-blended (no stutter).
70
+ - **Rewind**: the clip reversed in 0.6 s (ease-in-out), ±13 px horizontal jitter, four white tracking bars, a big ◀◀ and the word REWIND.
71
+ - **Trails**: in screen space keep only the last ~0.6 s (ball 0.24 s) — the camera pans, so long trails land in the wrong place.
72
+ - **Stamp** (e.g. a VAR decision): a framed card that drops from 1.7× to 1× with overshoot, slightly rotated, with a small flash — once per film.
73
+ - **Perspective flatten**: see Native moves 7.
74
+
75
+ ## 7. Grade and image quality
76
+
77
+ - Footage: `hqdn3d=1.2:1.2:2.5:2.5` → lanczos to 1920×1080 (modern footage at most 1.5×) → `unsharp=5:5:0.55` → `eq=saturation=0.9:contrast=1.04:gamma=0.97` + slightly cool shadows; one grade for every clip; film grain 2 added once at the master (`mux.sh`).
78
+ - Broadcaster logos and URLs are covered by the packaging (bug and score bar placed exactly over them, present from frame 1), or kept outside split-screen windows — never by cropping past 1.5×.
79
+ - Prefer a broadcaster's native resolution over an "AI-upscaled" stream.
80
+
81
+ ## 8. Sound palette
82
+
83
+ - **Layers**: English voice-over (one line per freeze, ≈2.5–3 s) → match sound (commentary + crowd at full level in live play; under freezes only a low-passed crowd bed, looped; the goal roar on the goal frame) → score → foley. Voice ducks everything else to 0.55.
84
+ - **Score**: sampled band (drum kit, electric bass, staccato trumpet and trombone, timpani, horn, cellos, glockenspiel), about 120 BPM. The groove restarts at the head of each played segment, so cuts don't need a global bar grid. **On a freeze the drums stop**: one brass stab + timpani + low thump + camera shutter, then only closed hi-hat — the music freezes with the picture. Goals: a big brass chord with crash and glockenspiel on the score-bar flip.
85
+ - **Foley**: marker squeak (2–5 kHz band-passed noise with flutter) for each line, pops for rings, a tick per landed label, whoosh on every wipe, tape-motor whine on a rewind, a stopwatch tick every 0.2 s, a thump for the stamp, a long whoosh and a timpani roll under the flatten.
86
+ - Mix limited before `mux.sh` normalises to −14 LUFS.
87
+
88
+ ## 9. Native moves (and how the code does them)
89
+
90
+ 1. **Freeze and draw** — a freeze segment = one source frame + flash + punch + desaturate + spotlight; overlays drawn by progress (`overlayAnalysis()`, `overlayG1()` in `demo/index.html`).
91
+ 2. **Tracked ring** — hand keyframes of the feet point in source pixels every ~3–6 frames, linearly interpolated (`TRK`, `at()`); check them with `?dbg=1`, which paints every tracked point in magenta.
92
+ 3. **Frame-counting stopwatch** — starts at the receiving frame and counts source frames ÷ fps; stops and turns yellow on the strike (`stopwatch()`).
93
+ 4. **Score-bar flip on the goal frame**, one entry per goal (`GOALS`, `scoreAt()`, `bugScore()`).
94
+ 5. **Packaging over watermarks** — corner bug and score bar positioned from the logo and URL coordinates, drawn from frame 1 (`bugTop()`, `bugScore()`).
95
+ 6. **Dual-angle freeze** — two windows, each its own clip and frame range, both reaching their freeze frame on the same beat; overlays drawn in each window's source coordinates (`splitView()`, `overlayG2()`).
96
+ 7. **Perspective flatten into a shot map** — for each shot, mark 6–8 known pitch points in its own frame (box and six-yard corners, where the penalty arc meets the box line; FIFA dimensions) and fit a ground-plane homography by least squares (`demo/tools/homography.py` reads `tools/pitch.json`, writes `assets/pitch.json`; residuals ≤ 6 px are fine). The strike frame is then drawn as a mesh of triangles in pitch coordinates (1.5 m cells), each vertex moving from its image position to its board position, each triangle affine-mapped (`drawTri()`); the picture fades out as the chalk board takes over, and the other shots' feet points, converted with their own frames' matrices, drop onto the same board (`shotMap()`). The broadcaster's URL is painted out of the source frame first, because the flatten drags it into the middle of the screen.
97
+ 8. **Data card** — the counted numbers re-stated on a board page: label left, big yellow number right, red marker circle on the key one (`notes()`).
98
+ 9. **Commentary transcript** — original-language words with timecodes and a translation, in a small box during live play; inaudible words become an ellipsis, never a guess (`transcript()`).
99
+
100
+ ## 10. Material
101
+
102
+ 1. **Ask the user first** whether they have their own footage (club or academy video, their own camera, a licensed broadcast clip), line-ups, event data or photos, and the rights to use them. Their material comes first.
103
+ 2. **Where to look** (judge every file on its own page):
104
+ - **Wikimedia Commons** (search "goal", the match, the player): many clips are cut from broadcasters' own YouTube uploads under CC BY. Fine: CC0, public domain, CC BY. Not used: CC BY-SA, "no known restrictions", unclear licences.
105
+ - **A broadcaster's or club's own YouTube channel** when its video page says *Creative Commons Attribution license (reuse allowed)*: check that the channel is the rights holder's official, verified channel (not a re-upload or a fan mirror), save the evidence (channel id, verification, licence field, date checked), and download the native resolution, not an AI-upscaled stream. Third-party re-uploads, fan mirrors, colourised or "restored" versions are never used.
106
+ - **Facts** (scores, minutes, how a goal was scored): the league's or broadcaster's own match page or video description, then established newspapers; quote them in `FACTS.md`. When sources disagree, use the official list and leave the disputed detail out.
107
+ - Photos of players: Commons (CC BY / CC0); state the year when the photo isn't from the match.
108
+ 3. **Before downloading, tell the user** what you will fetch, from where and under which licence. The finder copied into this style, `demo/tools/footage.py` (`search commons|archive|nasa`, `fetch`, `used`, `md`), logs licence, author, page and the seconds used into `SOURCES.jsonl` and writes `SOURCES.md`; `demo/tools/fetch_sources.sh` shows how a verified YouTube CC BY source is fetched with `uvx yt-dlp`. Wikimedia rate-limits bursts (HTTP 429): one request at a time.
109
+ 4. **People on screen**: players, referees and staff in the event are fine; never slow down or freeze on an identifiable spectator.
110
+
111
+ ## 11. Engine
112
+
113
+ Canvas 2D, one page: `window.render(t)` is async and deterministic, frames load on demand from JPEG sequences (one folder per clip, 90-frame cache). `timeline.json` (segments with clip and source frame range, voice lines) drives the page, `tools/mix.py` and `tools/cues.py`. `window.TEXTS(t)` reports the text that must be read, for `readcheck.mjs`. `core/render/video.mjs` renders at 30 fps.
114
+
115
+ ## 12. Pitfalls
116
+
117
+ - **Wrong tracking points** are the biggest risk: reading coordinates off a scaled contact sheet is easily 20–50 px off. Read them on full-resolution crops with a pixel ruler, then check with `?dbg=1`.
118
+ - **Overlays not under the punch transform** slide off the players during a freeze.
119
+ - **Balls vanish**: long shots are a few pixels with motion blur; colour tracking loses them; frames where the ball is invisible are interpolated and the number says "≈".
120
+ - **Numbers the footage can't support** (ball speed, distance run) are not written. Distances only from a homography fitted to visible markings, each shot in its own frame (the camera zooms and pans between shots).
121
+ - **Packaging late by one frame** shows the logo: bugs never fade in over footage.
122
+ - **Split-screen windows sliding in** reveal what's outside them (a logo, a URL): clip each window to its slice in source coordinates, not only to the screen half.
123
+ - **Score state must match the moment**: before the 67th-minute goal it is 3–2, not 3–3.
124
+ - **Names in TTS**: spell them phonetically for the voice ("Zayits", "Saduk") and keep the real spelling in subtitles; record the ASR result for proper names in `lines.json` (`asr`).
125
+ - **Freeze labels echo the subtitle** and live only ~1 s; anything the viewer must read (scores, board rows, the data card) gets ≥ 2.5 s and goes into `TEXTS`.
126
+
127
+ ## 13. Variation space
128
+
129
+ The agent decides per film: the sport (football, basketball pick-and-roll with screens drawn as bars, tennis rallies with landing zones, F1 overtakes with racing lines — anything with a wide camera that shows the whole play), the moments, the show's fictional name and colours (keeping the three roles), how many freezes.
130
+
131
+ - **Three structures:** chronological build-up to the deep breakdown (secondary moments get light treatments, the decisive one the full rewind-and-freeze); one moment taken apart from three angles; a "what went wrong" defensive breakdown ending on the space map.
132
+ - **Three openings:** the show sting into a match-record card; the goal frame frozen in the first second, then rewind; the stopwatch running over live play.
133
+ - **Three endings:** the top-down board that sums up the moments; the data card with one number circled; the hero shot slowed with the minute and name.
134
+
135
+ ---
136
+
137
+ How our demo was made (story, shots, score, end card, build): [DEMO.md](https://github.com/lemomo-ai/lemo-opuscar/blob/413a6bd6/styles/telestrator/DEMO.md). Read it after your treatment exists.