wizz-method 2.18.0 → 2.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -3
- package/removals.txt +10 -0
- package/skills-registry.yaml +60 -39
- package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +9 -9
- package/src/bmm-skills/2-plan-workflows/wizz-ux/references/creative-tools.md +2 -0
- package/src/bmm-skills/2-plan-workflows/wizz-ux/references/design-md-spec.md +2 -0
- package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/checklist.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -5
- package/src/bmm-skills/module-help.csv +1 -1
- package/src/bmm-skills/module.yaml +1 -1
- package/src/core-skills/_shared/handoff-protocol.md +2 -2
- package/src/modules/lowticket/skills/wizz-lowticket-funil/SKILL.md +1 -1
- package/src/modules/lowticket/skills/wizz-lowticket-guia/SKILL.md +1 -1
- package/src/modules/lowticket/skills/wizz-lowticket-metodologia/SKILL.md +1 -1
- package/src/modules/lowticket/skills/wizz-lowticket-minerador/SKILL.md +1 -1
- package/src/modules/lowticket/skills/wizz-lowticket-pagina/SKILL.md +1 -1
- package/src/modules/lowticket/skills/wizz-lowticket-trafego/SKILL.md +1 -1
- package/src/modules/wizz/_shared/cerebro.md +7 -7
- package/src/modules/wizz/_shared/communication-rules.md +1 -1
- package/src/modules/wizz/_shared/encerramento.md +4 -3
- package/src/modules/wizz/_shared/organizacao.md +8 -4
- package/src/modules/wizz/_shared/token-economy.md +1 -1
- package/src/modules/wizz/_shared/video-pipeline.md +4 -4
- package/src/modules/wizz/agents/wizz-ads/SKILL.md +4 -1
- package/src/modules/wizz/agents/wizz-ads/customize.toml +12 -3
- package/src/modules/wizz/agents/wizz-ads/knowledge/playbook.md +36 -0
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +4 -1
- package/src/modules/wizz/agents/wizz-copy/customize.toml +2 -3
- package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +34 -0
- package/src/modules/wizz/agents/wizz-designer/SKILL.md +2 -2
- package/src/modules/wizz/agents/wizz-designer/customize.toml +2 -3
- package/src/modules/wizz/agents/wizz-growth/SKILL.md +4 -1
- package/src/modules/wizz/agents/wizz-growth/customize.toml +33 -4
- package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +39 -0
- package/src/modules/wizz/agents/wizz-maestro/SKILL.md +6 -8
- package/src/modules/wizz/agents/wizz-maestro/customize.toml +2 -3
- package/src/modules/wizz/agents/wizz-memoria/SKILL.md +7 -7
- package/src/modules/wizz/agents/wizz-memoria/customize.toml +5 -6
- package/src/modules/wizz/agents/wizz-qa/SKILL.md +5 -6
- package/src/modules/wizz/agents/wizz-qa/customize.toml +3 -4
- package/src/modules/wizz/agents/wizz-seo/SKILL.md +4 -1
- package/src/modules/wizz/agents/wizz-seo/customize.toml +2 -3
- package/src/modules/wizz/agents/wizz-seo/knowledge/playbook.md +31 -0
- package/src/modules/wizz/agents/wizz-social/SKILL.md +3 -3
- package/src/modules/wizz/agents/wizz-social/customize.toml +2 -3
- package/src/modules/wizz/overrides/wizz-agent-analyst.toml +2 -2
- package/src/modules/wizz/overrides/wizz-agent-architect.toml +3 -3
- package/src/modules/wizz/overrides/wizz-agent-dev.toml +3 -3
- package/src/modules/wizz/overrides/wizz-agent-pm.toml +2 -2
- package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +2 -2
- package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +2 -2
- package/src/skills-lib/_shared/complexity-signal.md +8 -9
- package/src/skills-lib/_shared/dispatch-rule.yaml +21 -0
- package/src/skills-lib/{cerebro → wizz-cerebro}/SKILL.md +1 -1
- package/src/skills-lib/{ctc-align → wizz-ctc-align}/SKILL.md +1 -1
- package/src/skills-lib/wizz-decision-maker/references/output-format.md +21 -0
- package/src/skills-lib/wizz-decision-maker/references/references-and-extraction.md +32 -1
- package/src/skills-lib/wizz-design-needs/references/design-state.md +1 -1
- package/src/skills-lib/wizz-design-needs/references/gap-analysis.md +3 -1
- package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/SKILL.md +1 -1
- package/src/skills-lib/{find-skills → wizz-find-skills}/SKILL.md +1 -1
- package/src/skills-lib/wizz-huashu-design/references/sfx-library.md +1 -1
- package/src/skills-lib/wizz-huashu-design/scripts/add-music.sh +1 -1
- package/src/skills-lib/wizz-huashu-design/scripts/html2pptx.js +45 -37
- package/src/skills-lib/wizz-huashu-design/scripts/mix-voiceover.sh +1 -1
- package/src/skills-lib/wizz-huashu-design/scripts/narrate-pipeline.mjs +11 -5
- package/src/skills-lib/wizz-huashu-design/scripts/test_scripts.py +209 -0
- package/src/skills-lib/wizz-huashu-design/scripts/tts-doubao.mjs +42 -28
- package/src/skills-lib/wizz-ig-profile-optimizer/SKILL.md +1 -1
- package/src/skills-lib/wizz-inicio-de-projeto/SKILL.md +1 -1
- package/src/skills-lib/wizz-launch-readiness/SKILL.md +7 -7
- package/src/skills-lib/wizz-launch-readiness/references/02-seguranca.md +3 -3
- package/src/skills-lib/wizz-launch-readiness/references/03-seo-descoberta.md +5 -5
- package/src/skills-lib/wizz-launch-readiness/references/04-analytics-medicao.md +1 -1
- package/src/skills-lib/wizz-launch-readiness/references/05-conteudo-prova-social.md +6 -6
- package/src/skills-lib/wizz-launch-readiness/references/06-legal-lgpd.md +1 -1
- package/src/skills-lib/wizz-launch-readiness/references/08-fusao-priorizacao.md +1 -1
- package/src/skills-lib/wizz-offer-forge/SKILL.md +3 -3
- package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/README.md +1 -1
- package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/SKILL.md +1 -1
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/component-sources.md +23 -23
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/source-first-protocol.md +15 -3
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/source-links.md +14 -8
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/web-access-and-evidence.md +4 -3
- package/src/skills-lib/wizz-router/SKILL.md +3 -3
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +10 -9
- package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/SKILL.md +1 -1
- package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/SKILL.md +1 -1
- package/src/skills-lib/wizz-ui-component-curator/SKILL.md +1 -1
- package/src/skills-lib/wizz-video-effects/SKILL.md +3 -3
- package/src/skills-lib/wizz-video-effects/references/data-contract.md +3 -3
- package/src/skills-lib/wizz-video-effects/scripts/fill_breaths.py +15 -1
- package/src/skills-lib/wizz-video-effects/scripts/test_fill_breaths.py +20 -0
- package/src/skills-lib/wizz-video-styles/SKILL.md +2 -2
- package/src/skills-lib/wizz-video-styles/data/recipes.json +32 -1
- package/src/skills-lib/wizz-video-styles/data/references.json +211 -1
- package/src/skills-lib/wizz-video-styles/data/styles.json +54 -0
- package/src/skills-lib/wizz-video-styles/references/generated-prompts.md +13 -3
- package/src/skills-lib/wizz-video-styles/references/style-picker.md +4 -2
- package/src/skills-lib/wizz-video-styles/references/styles/ui-morph.md +68 -0
- package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +21 -9
- package/src/skills-lib/wizz-video-styles/scripts/references.mjs +1 -0
- package/src/skills-lib/wizz-web-security/SKILL.md +1 -1
- package/tools/fetch-assets.mjs +1 -1
- package/tools/hooks/README.md +18 -14
- package/tools/hooks/rtk-rewrite.js +95 -0
- package/tools/hooks/security-defensive-context.js +17 -1
- package/tools/hooks/session-rules.js +25 -5
- package/tools/hooks/wizz-arrumar.js +126 -12
- package/tools/hooks/wizz-artifact-guard.js +41 -7
- package/tools/hooks/wizz-cerebro-lib.js +239 -0
- package/tools/hooks/wizz-close-reminder.js +124 -0
- package/tools/hooks/wizz-debug-lib.js +55 -0
- package/tools/hooks/wizz-decision-trace.js +19 -2
- package/tools/hooks/wizz-feature.js +20 -4
- package/tools/hooks/wizz-router-enforce.js +30 -13
- package/tools/installer/command-text.js +243 -0
- package/tools/installer/commands/catalog.js +2 -0
- package/tools/installer/commands/doctor.js +10 -12
- package/tools/installer/commands/fetch-assets.js +5 -5
- package/tools/installer/commands/install.js +6 -7
- package/tools/installer/commands/resolve.js +17 -17
- package/tools/installer/commands/trace-report.js +40 -37
- package/tools/installer/core/doctor.js +60 -55
- package/tools/installer/core/hooks-settings.js +88 -14
- package/tools/installer/core/hooks-smoke.js +134 -0
- package/tools/installer/core/installer.js +61 -52
- package/tools/installer/core/quick-update.js +2 -3
- package/tools/installer/guided/labels.js +5 -0
- package/tools/installer/install-text.js +201 -0
- package/tools/installer/modules/channel-plan.js +2 -2
- package/tools/installer/modules/env-vars.js +5 -6
- package/tools/installer/modules/skills-lib.js +1 -1
- package/tools/installer/ui.js +17 -9
- /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-pesquisa-e-memoria.md +0 -0
- /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-rotina-e-captura.md +0 -0
- /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-sessao.md +0 -0
- /package/src/skills-lib/{ctc-align → wizz-ctc-align}/scripts/align.py +0 -0
- /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/README.md +0 -0
- /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/references/KEYWORDS.md +0 -0
- /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/assets/template.html +0 -0
- /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/prompts.md +0 -0
- /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-1-validacao-entrada.md +0 -0
- /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-2-autorizacao.md +0 -0
- /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-3-abuso-volume.md +0 -0
- /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-4-vazamento-resposta.md +0 -0
- /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-5-fusao-plano.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/01-cta-principal.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/02-barra-fixa-mobile.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/03-tempo-de-resposta.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/04-prova-social.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/05-faq-decisao.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/06-imagens-reais.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/07-endereco-como-chegar.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/08-titles.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/09-open-graph.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/10-breadcrumbs.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/11-alt-text.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/12-schema-local.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/13-robots-sitemap.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/14-privacidade-termos.md +0 -0
- /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/15-medicao.md +0 -0
|
@@ -368,6 +368,37 @@
|
|
|
368
368
|
"Shipping 16:9: every measured reference is horizontal; recompose for 9:16 with the keyword in the upper-middle and nothing in the bottom 20%."
|
|
369
369
|
],
|
|
370
370
|
"template": null
|
|
371
|
+
},
|
|
372
|
+
"ui-morph": {
|
|
373
|
+
"title": "UI morph: one shape, many UI states (twoclipping, verbove, AnnaCher)",
|
|
374
|
+
"needs": "The product's real screens or a list of 8 to 12 UI states that tell its story (button, loader, player, slider, toggle, tabs, chart, ⌘K, toast), one accent colour and a track around 120 BPM. Nobody on camera, no footage: everything is drawn in code (HyperFrames).",
|
|
375
|
+
"fits": "App and SaaS launches, a feature announcement, a product promo for the site or the store page, a portfolio piece. Strong on X and LinkedIn with a product audience; it shows the product working instead of describing it. Weak for teaching step by step or for anything that needs a face.",
|
|
376
|
+
"look": [
|
|
377
|
+
"One shape on screen the whole time, never cut: it becomes button, loader, player, slider, toggle, tabs, chart, ⌘K and toast, changing size, corners and colour (the same language as the iPhone Dynamic Island).",
|
|
378
|
+
"Warm light grey canvas (#EDEBE6), components in black and white, at most one accent colour; a dark variant (navy with one yellow) for a product film.",
|
|
379
|
+
"Real UI and real data: the product's own labels and numbers, never lorem ipsum or generic components.",
|
|
380
|
+
"A cursor drives every change with real clicks and drags; the camera zooms so each state fills the frame."
|
|
381
|
+
],
|
|
382
|
+
"palette": "Warm grey #EDEBE6 or beige #E6E2DA, black #111, white, plus ONE accent (orange, peach or yellow) used only where the eye must go. Dark variant: #0B1020 base, one yellow accent.",
|
|
383
|
+
"type": "One UI sans (Inter, Geist or the product's own font) in regular and semibold; mono only for a URL or a code line. No display fonts.",
|
|
384
|
+
"motion": [
|
|
385
|
+
"Every state grows out of the previous one by a spring (size, corner radius, colour), with at most one small overshoot; content swaps with a short blur.",
|
|
386
|
+
"Something happens on every beat; the state changes land on the downbeats of the beat grid (scripts/beat_grid.py), not on a hand-counted 120 BPM.",
|
|
387
|
+
"Build it as a pure function of time (seek(t)): closed-form springs, no CSS transitions or timers, so every frame renders the same. HyperFrames does this natively.",
|
|
388
|
+
"The last frame equals the first, so the piece loops."
|
|
389
|
+
],
|
|
390
|
+
"captions": "None. The text is the interface's own (button labels, track title, chart numbers). A single short line at most, in the UI font, when the product needs one sentence.",
|
|
391
|
+
"hook": "The first state already on screen at 0 s (a button or the brand pill) and the cursor arriving on the first beat. No logo intro, no title card.",
|
|
392
|
+
"cta": "The shape returns to the first state or closes on the brand pill with the URL in small mono under it, held 1 to 2 s.",
|
|
393
|
+
"music": "The track is the whole soundtrack: a continuous bed in 4 of 6 measured pieces, around -14 LUFS. Pick an electronic or lo-fi track with a clear kick so the beat grid is reliable.",
|
|
394
|
+
"sfx": "Sparse and tied to UI events: a soft click on a press, a low tick on a snap. The measured pieces range from none to a hit on most state changes; never whooshes on every move.",
|
|
395
|
+
"dont": [
|
|
396
|
+
"Cutting between screens: the moment it cuts it becomes a screen recording, not this style.",
|
|
397
|
+
"Bouncy easing, particles, glow, gradients on the UI chrome, icons with uneven stroke, dead time, template look.",
|
|
398
|
+
"Generic components instead of the product's real UI and numbers.",
|
|
399
|
+
"Shipping square or 16:9: every measured piece is 1:1 or 16:9; recompose for 9:16 with the shape in the upper-middle and nothing in the bottom 20 %."
|
|
400
|
+
],
|
|
401
|
+
"template": null
|
|
371
402
|
}
|
|
372
403
|
}
|
|
373
|
-
}
|
|
404
|
+
}
|
|
@@ -3568,5 +3568,215 @@
|
|
|
3568
3568
|
},
|
|
3569
3569
|
"lufs": "-10.7",
|
|
3570
3570
|
"formato": "16:9 (horizontal); adaptar para 9:16"
|
|
3571
|
+
},
|
|
3572
|
+
{
|
|
3573
|
+
"id": "x-twoclipping-2103273003555402193",
|
|
3574
|
+
"url": "https://x.com/twoclipping/status/2103273003555402193",
|
|
3575
|
+
"channel": "zero",
|
|
3576
|
+
"views": "1164424",
|
|
3577
|
+
"nicho": "a",
|
|
3578
|
+
"idioma": "en",
|
|
3579
|
+
"style": "ui-morph",
|
|
3580
|
+
"estilo_visual": "Uma forma preta só sobre cinza quente claro, que vira botão, player, slider de volume, toggle, abas, gráfico, ⌘K e toast, e volta ao botão do início (loop)",
|
|
3581
|
+
"motion_transicoes": "Sem corte nenhum: cada estado nasce do anterior por mola (tamanho, cantos, cor); o conteúdo troca com blur curto; um cursor clica e arrasta de verdade",
|
|
3582
|
+
"legenda": "Nenhuma; o texto é o da própria interface (rótulos de botão, título da faixa, número do gráfico)",
|
|
3583
|
+
"hook_0_3s": "Botão \"Generate\" parado e o cursor chegando nele no primeiro tempo",
|
|
3584
|
+
"paleta": "cinza quente #EDEBE6, preto, branco; um gradiente só na capa do player",
|
|
3585
|
+
"tipografia": "uma sans de interface (tipo Inter), pesos regular e semibold",
|
|
3586
|
+
"ritmo": {
|
|
3587
|
+
"cuts_per_10s": 0.0,
|
|
3588
|
+
"shot_median_s": 14.06
|
|
3589
|
+
},
|
|
3590
|
+
"musica": {
|
|
3591
|
+
"guess": "continua",
|
|
3592
|
+
"ratio": 0.33,
|
|
3593
|
+
"impressão": "heurística de áudio; nome da faixa não confirmado"
|
|
3594
|
+
},
|
|
3595
|
+
"sfx": {
|
|
3596
|
+
"counts": {
|
|
3597
|
+
"pop_click": 0,
|
|
3598
|
+
"whoosh": 1,
|
|
3599
|
+
"impact_low": 0
|
|
3600
|
+
},
|
|
3601
|
+
"per_10s": 0.71,
|
|
3602
|
+
"on_cuts": "0/0"
|
|
3603
|
+
},
|
|
3604
|
+
"lufs": "-14.1",
|
|
3605
|
+
"formato": "1:1 (quadrado); recompor para 9:16"
|
|
3606
|
+
},
|
|
3607
|
+
{
|
|
3608
|
+
"id": "x-verbove-2103483957266268381",
|
|
3609
|
+
"url": "https://x.com/verbove/status/2103483957266268381",
|
|
3610
|
+
"channel": "Martijn Verbove",
|
|
3611
|
+
"views": "17438",
|
|
3612
|
+
"nicho": "d",
|
|
3613
|
+
"idioma": "en",
|
|
3614
|
+
"style": "ui-morph",
|
|
3615
|
+
"estilo_visual": "A mesma forma contínua contando um produto real (MakerMap): pílula da marca, busca, cartão de perfil, globo de pontos com os makers, lista de matches, contador, evento com RSVP",
|
|
3616
|
+
"motion_transicoes": "Sem corte: morfose de pílula para cartão e para globo; o globo gira e se enche de pontos; cursor dirige cada passo",
|
|
3617
|
+
"legenda": "Nenhuma; dados reais na interface (2.266 produtos, 6 matches)",
|
|
3618
|
+
"hook_0_3s": "Pílula preta com o nome do produto e o ponto laranja da marca",
|
|
3619
|
+
"paleta": "cinza quente claro, preto, branco e um laranja de destaque",
|
|
3620
|
+
"tipografia": "sans de interface; mono só na URL do fim",
|
|
3621
|
+
"ritmo": {
|
|
3622
|
+
"cuts_per_10s": 0.0,
|
|
3623
|
+
"shot_median_s": 20.05
|
|
3624
|
+
},
|
|
3625
|
+
"musica": {
|
|
3626
|
+
"guess": "continua",
|
|
3627
|
+
"ratio": 0.3,
|
|
3628
|
+
"impressão": "heurística de áudio; nome da faixa não confirmado"
|
|
3629
|
+
},
|
|
3630
|
+
"sfx": {
|
|
3631
|
+
"counts": {
|
|
3632
|
+
"pop_click": 2,
|
|
3633
|
+
"whoosh": 2,
|
|
3634
|
+
"impact_low": 31
|
|
3635
|
+
},
|
|
3636
|
+
"per_10s": 17.45,
|
|
3637
|
+
"on_cuts": "0/0"
|
|
3638
|
+
},
|
|
3639
|
+
"lufs": "-14.6",
|
|
3640
|
+
"formato": "1:1 (quadrado); recompor para 9:16"
|
|
3641
|
+
},
|
|
3642
|
+
{
|
|
3643
|
+
"id": "x-AnnaCher___-2103571096549433425",
|
|
3644
|
+
"url": "https://x.com/AnnaCher___/status/2103571096549433425",
|
|
3645
|
+
"channel": "Anna Chernikova",
|
|
3646
|
+
"views": "1605",
|
|
3647
|
+
"nicho": "d",
|
|
3648
|
+
"idioma": "en",
|
|
3649
|
+
"style": "ui-morph",
|
|
3650
|
+
"estilo_visual": "Promo feito da própria interface do produto (Sprites): spinner, biblioteca de anúncios, slider de orçamento, abas de plataforma, gráfico de ROAS, toggle de piloto automático, ⌘K",
|
|
3651
|
+
"motion_transicoes": "Sem corte: um componente vira o próximo; números contam; o cursor arrasta o orçamento e liga o toggle",
|
|
3652
|
+
"legenda": "Nenhuma; a interface carrega a mensagem (4.2x ROAS, $200/dia)",
|
|
3653
|
+
"hook_0_3s": "Spinner sozinho no centro, o produto já trabalhando",
|
|
3654
|
+
"paleta": "bege quente, preto, branco e um pêssego de destaque no gráfico",
|
|
3655
|
+
"tipografia": "sans de interface única",
|
|
3656
|
+
"ritmo": {
|
|
3657
|
+
"cuts_per_10s": 0.0,
|
|
3658
|
+
"shot_median_s": 42.09
|
|
3659
|
+
},
|
|
3660
|
+
"musica": {
|
|
3661
|
+
"guess": "sem",
|
|
3662
|
+
"ratio": 0.0,
|
|
3663
|
+
"impressão": "heurística de áudio; nome da faixa não confirmado"
|
|
3664
|
+
},
|
|
3665
|
+
"sfx": {
|
|
3666
|
+
"counts": {
|
|
3667
|
+
"pop_click": 2,
|
|
3668
|
+
"whoosh": 27,
|
|
3669
|
+
"impact_low": 0
|
|
3670
|
+
},
|
|
3671
|
+
"per_10s": 6.89,
|
|
3672
|
+
"on_cuts": "0/0"
|
|
3673
|
+
},
|
|
3674
|
+
"lufs": "-24.0",
|
|
3675
|
+
"formato": "1:1 (quadrado); recompor para 9:16"
|
|
3676
|
+
},
|
|
3677
|
+
{
|
|
3678
|
+
"id": "x-nezbuilds-2103487427365294391",
|
|
3679
|
+
"url": "https://x.com/nezbuilds/status/2103487427365294391",
|
|
3680
|
+
"channel": "Nez",
|
|
3681
|
+
"views": "519",
|
|
3682
|
+
"nicho": "a",
|
|
3683
|
+
"idioma": "en",
|
|
3684
|
+
"style": "ui-morph",
|
|
3685
|
+
"estilo_visual": "Refeito com o mesmo prompt: botão \"Get started\", loader, ilha que abre em player, volume, toggle, abas, gráfico com tooltip, ⌘K \"Export chart\" e toast com Undo",
|
|
3686
|
+
"motion_transicoes": "Sem corte; molas com overshoot pequeno; cursor arrasta a barra do player e escolhe a aba",
|
|
3687
|
+
"legenda": "Nenhuma",
|
|
3688
|
+
"hook_0_3s": "Botão com seta e o cursor clicando no primeiro tempo",
|
|
3689
|
+
"paleta": "bege quente, preto, branco",
|
|
3690
|
+
"tipografia": "sans de interface única",
|
|
3691
|
+
"ritmo": {
|
|
3692
|
+
"cuts_per_10s": 0.0,
|
|
3693
|
+
"shot_median_s": 14.06
|
|
3694
|
+
},
|
|
3695
|
+
"musica": {
|
|
3696
|
+
"guess": "continua",
|
|
3697
|
+
"ratio": 0.226,
|
|
3698
|
+
"impressão": "heurística de áudio; nome da faixa não confirmado"
|
|
3699
|
+
},
|
|
3700
|
+
"sfx": {
|
|
3701
|
+
"counts": {
|
|
3702
|
+
"pop_click": 3,
|
|
3703
|
+
"whoosh": 3,
|
|
3704
|
+
"impact_low": 20
|
|
3705
|
+
},
|
|
3706
|
+
"per_10s": 18.49,
|
|
3707
|
+
"on_cuts": "0/0"
|
|
3708
|
+
},
|
|
3709
|
+
"lufs": "-19.2",
|
|
3710
|
+
"formato": "1:1 (quadrado); recompor para 9:16"
|
|
3711
|
+
},
|
|
3712
|
+
{
|
|
3713
|
+
"id": "x-dzhohola-2103605737595249003",
|
|
3714
|
+
"url": "https://x.com/dzhohola/status/2103605737595249003",
|
|
3715
|
+
"channel": "Andromedus",
|
|
3716
|
+
"views": "222",
|
|
3717
|
+
"nicho": "a",
|
|
3718
|
+
"idioma": "en",
|
|
3719
|
+
"style": "ui-morph",
|
|
3720
|
+
"estilo_visual": "A mesma técnica sobre a interface real de um app (T3 Code): diff de código, menu de esforço, permissões, toggles, temas, gráfico de uso, lista de PRs, celular e contador de estrelas do GitHub",
|
|
3721
|
+
"motion_transicoes": "Sem corte; troca de tema claro para escuro no meio; cada cartão nasce do anterior",
|
|
3722
|
+
"legenda": "Nenhuma",
|
|
3723
|
+
"hook_0_3s": "Pílula \"Working 2m\" com spinner",
|
|
3724
|
+
"paleta": "branco e cinza claros, depois quase preto; azul só nos toggles",
|
|
3725
|
+
"tipografia": "sans de interface; mono no diff",
|
|
3726
|
+
"ritmo": {
|
|
3727
|
+
"cuts_per_10s": 0.0,
|
|
3728
|
+
"shot_median_s": 60.05
|
|
3729
|
+
},
|
|
3730
|
+
"musica": {
|
|
3731
|
+
"guess": "continua",
|
|
3732
|
+
"ratio": 0.454,
|
|
3733
|
+
"impressão": "heurística de áudio; nome da faixa não confirmado"
|
|
3734
|
+
},
|
|
3735
|
+
"sfx": {
|
|
3736
|
+
"counts": {
|
|
3737
|
+
"pop_click": 0,
|
|
3738
|
+
"whoosh": 7,
|
|
3739
|
+
"impact_low": 0
|
|
3740
|
+
},
|
|
3741
|
+
"per_10s": 1.17,
|
|
3742
|
+
"on_cuts": "0/0"
|
|
3743
|
+
},
|
|
3744
|
+
"lufs": "-14.2",
|
|
3745
|
+
"formato": "1:1 (quadrado); recompor para 9:16"
|
|
3746
|
+
},
|
|
3747
|
+
{
|
|
3748
|
+
"id": "x-daniel_haida-2104139720829636937",
|
|
3749
|
+
"url": "https://x.com/daniel_haida/status/2104139720829636937",
|
|
3750
|
+
"channel": "Daniel Haida",
|
|
3751
|
+
"views": "3968",
|
|
3752
|
+
"nicho": "d",
|
|
3753
|
+
"idioma": "en",
|
|
3754
|
+
"style": "ui-morph",
|
|
3755
|
+
"estilo_visual": "Variante escura: filme de produto de um app de contabilidade (taxtello) feito em React, painel com número grande, gráfico, recibo de papel, anel de score e a marca no fim",
|
|
3756
|
+
"motion_transicoes": "Câmera em perspectiva passando sobre o painel; elementos entram em sequência sem corte; o logo fecha",
|
|
3757
|
+
"legenda": "Duas frases curtas grandes (\"Alles im Blick.\", \"In guter Ordnung\")",
|
|
3758
|
+
"hook_0_3s": "Ícone do app sozinho no escuro",
|
|
3759
|
+
"paleta": "azul-marinho quase preto, um amarelo de destaque, verde no score",
|
|
3760
|
+
"tipografia": "sans de interface, números grandes em mono",
|
|
3761
|
+
"ritmo": {
|
|
3762
|
+
"cuts_per_10s": 0.0,
|
|
3763
|
+
"shot_median_s": 14.06
|
|
3764
|
+
},
|
|
3765
|
+
"musica": {
|
|
3766
|
+
"guess": "sem",
|
|
3767
|
+
"ratio": 0.033,
|
|
3768
|
+
"impressão": "heurística de áudio; nome da faixa não confirmado"
|
|
3769
|
+
},
|
|
3770
|
+
"sfx": {
|
|
3771
|
+
"counts": {
|
|
3772
|
+
"pop_click": 0,
|
|
3773
|
+
"whoosh": 0,
|
|
3774
|
+
"impact_low": 3
|
|
3775
|
+
},
|
|
3776
|
+
"per_10s": 2.13,
|
|
3777
|
+
"on_cuts": "0/0"
|
|
3778
|
+
},
|
|
3779
|
+
"lufs": "-17.1",
|
|
3780
|
+
"formato": "16:9 (horizontal); recompor para 9:16"
|
|
3571
3781
|
}
|
|
3572
|
-
]
|
|
3782
|
+
]
|
|
@@ -777,5 +777,59 @@
|
|
|
777
777
|
"url": "https://www.youtube.com/watch?v=5EoO5413dBY"
|
|
778
778
|
}
|
|
779
779
|
]
|
|
780
|
+
},
|
|
781
|
+
"ui-morph": {
|
|
782
|
+
"n": 6,
|
|
783
|
+
"nichos": [
|
|
784
|
+
"a",
|
|
785
|
+
"d"
|
|
786
|
+
],
|
|
787
|
+
"langs": [
|
|
788
|
+
"en"
|
|
789
|
+
],
|
|
790
|
+
"views_max": 1164424,
|
|
791
|
+
"views_median": 2786,
|
|
792
|
+
"cuts_per_10s": [
|
|
793
|
+
0.0,
|
|
794
|
+
0.0,
|
|
795
|
+
0.0
|
|
796
|
+
],
|
|
797
|
+
"shot_median_s": 17.05,
|
|
798
|
+
"music": {
|
|
799
|
+
"continua": 4,
|
|
800
|
+
"fraca": 0,
|
|
801
|
+
"sem": 2
|
|
802
|
+
},
|
|
803
|
+
"sfx_on_cuts": [
|
|
804
|
+
0,
|
|
805
|
+
0
|
|
806
|
+
],
|
|
807
|
+
"top": [
|
|
808
|
+
{
|
|
809
|
+
"channel": "zero",
|
|
810
|
+
"views": "1164424",
|
|
811
|
+
"url": "https://x.com/twoclipping/status/2103273003555402193"
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
"channel": "Martijn Verbove",
|
|
815
|
+
"views": "17438",
|
|
816
|
+
"url": "https://x.com/verbove/status/2103483957266268381"
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
"channel": "Daniel Haida",
|
|
820
|
+
"views": "3968",
|
|
821
|
+
"url": "https://x.com/daniel_haida/status/2104139720829636937"
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
"channel": "Anna Chernikova",
|
|
825
|
+
"views": "1605",
|
|
826
|
+
"url": "https://x.com/AnnaCher___/status/2103571096549433425"
|
|
827
|
+
},
|
|
828
|
+
{
|
|
829
|
+
"channel": "Nez",
|
|
830
|
+
"views": "519",
|
|
831
|
+
"url": "https://x.com/nezbuilds/status/2103487427365294391"
|
|
832
|
+
}
|
|
833
|
+
]
|
|
780
834
|
}
|
|
781
835
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Generated-video prompts, by catalogue style
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Eighteen prompts picked from [awesome-opus5-5-videos](https://github.com/yihui-dev/awesome-opus5-5-videos) (513 entries in its `data/videos.json`, MIT, checked on 2026-10-10): videos that a model wrote as code (canvas, SVG, three.js) and that went viral. Each line says what the prompt asks for, in our words; the full prompt and the video are at the links. The prompts belong to their creators: link to them, quote at most a phrase, never paste the whole prompt into a project or a skill.
|
|
4
4
|
|
|
5
5
|
This page is a fixed sample. For current videos, and to skip the ones a project already used, run `node scripts/references.mjs pick --style <key>`.
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ Use this page **after** the style is chosen ([style-picker.md](style-picker.md))
|
|
|
9
9
|
## How a generated piece runs in the Method
|
|
10
10
|
|
|
11
11
|
- **HyperFrames draws, Remotion assembles** (`_shared/video-pipeline.md`, wizz module). A prompt that asks for "one HTML file with the music" becomes: scenes drawn silent in HyperFrames, assembled in Remotion with the audio.
|
|
12
|
-
- **Timing is measured, never guessed.** Words from `ctc-align`; cuts on the downbeats from [`scripts/beat_grid.py`](../scripts/beat_grid.py). Several prompts below ask for a "120 BPM grid" by hand; the script gives the real grid of the actual song.
|
|
12
|
+
- **Timing is measured, never guessed.** Words from `wizz-ctc-align`; cuts on the downbeats from [`scripts/beat_grid.py`](../scripts/beat_grid.py). Several prompts below ask for a "120 BPM grid" by hand; the script gives the real grid of the actual song.
|
|
13
13
|
- **Recompose for 9:16** when the original was square or horizontal: keyword in the upper-middle, nothing important in the bottom 20 %.
|
|
14
14
|
|
|
15
15
|
## Kinetic typography and lyric video ([card](styles/tipografia-cinetica.md))
|
|
@@ -21,13 +21,23 @@ Use this page **after** the style is chosen ([style-picker.md](style-picker.md))
|
|
|
21
21
|
| ParanoidAmerica · evil pizza parlour | A full music video synced to a `lyrics.txt`, one continuous camera journey through a place, collage plus ballpoint-pen look. | [post](https://x.com/ParanoidAmerica/status/2103570879619686717) · [video](https://skillry.dev/ai-videos/opus-5-5/paranoidamerica-686717) |
|
|
22
22
|
| twoclipping · wordmark launch film | A one-word brand built in one continuous take to a 120 BPM song with a drop and a breakdown; every scene grows out of the previous one, nothing fades or cuts. | [post](https://x.com/twoclipping/status/2103835273813496100) · [video](https://skillry.dev/ai-videos/opus-5-5/twoclipping-496100) |
|
|
23
23
|
|
|
24
|
-
##
|
|
24
|
+
## UI morph: one shape, many UI states ([card](styles/ui-morph.md))
|
|
25
|
+
|
|
26
|
+
The most remade prompt in the catalogue: the "8 to 12 UI states" brief appears 7 times, by different authors, with the same result. All six measured references of the style come from here.
|
|
25
27
|
|
|
26
28
|
| Prompt | What it asks | Links |
|
|
27
29
|
|---|---|---|
|
|
28
30
|
| twoclipping · one shape, many UI states | One element morphs through 8 to 12 UI states (button, loader, player, chart), a cursor drives each change, springs, cut on a 120 BPM grid. | [post](https://x.com/twoclipping/status/2103273003555402193) · [video](https://skillry.dev/ai-videos/opus-5-5/twoclipping-402193) |
|
|
29
31
|
| verbove · product story in one canvas | The same morphing-shape idea as strict rules: one `draw(t)` function, real UI and real data, something on every beat, exports in 1:1, 16:9 and 9:16. | [post](https://x.com/verbove/status/2103483957266268381) · [video](https://skillry.dev/ai-videos/opus-5-5/verbove-268381) |
|
|
30
32
|
| AnnaCher · promo from the product's own UI | Same structure built from the real product UI, one accent colour, last frame equals the first so it loops; a long banned list (glows, particles, bouncy easing). | [post](https://x.com/AnnaCher___/status/2103571096549433425) · [video](https://skillry.dev/ai-videos/opus-5-5/annacher-433425) |
|
|
33
|
+
| dzhohola · the template on a real app | The same "8 to 12 UI states" brief pointed at an existing product (T3 Code): diff, settings, toggles, themes, usage chart and GitHub stars, light turning dark halfway. | [post](https://x.com/dzhohola/status/2103605737595249003) · [video](https://skillry.dev/ai-videos/opus-5-5/dzhohola-249003) |
|
|
34
|
+
| daniel_haida · dark product film | 15 s Apple-level film for a bookkeeping app in React + Remotion, "not a feature walkthrough"; dashboard in perspective, a paper receipt, one yellow accent, soundtrack synthesised in code. | [post](https://x.com/daniel_haida/status/2104139720829636937) · [video](https://skillry.dev/ai-videos/opus-5-5/daniel-haida-636937) |
|
|
35
|
+
| Bilimfili1 · a glance inside the app (vertical) | 45 to 50 s vertical tour of every feature, recorded for real in the simulator, each feature breaking out of the phone; every number on screen comes from the recordings. | [post](https://x.com/Bilimfili1/status/2103743617848459762) · [video](https://skillry.dev/ai-videos/opus-5-5/bilimfili1-459762) |
|
|
36
|
+
|
|
37
|
+
## Motion editorial and product UI ([card](styles/motion-editorial.md))
|
|
38
|
+
|
|
39
|
+
| Prompt | What it asks | Links |
|
|
40
|
+
|---|---|---|
|
|
31
41
|
| jhylee95 · launch video | Research the product, hook in the first second, distinct beats for proof, every cut and hit retimed until it lands on a beat or drop. | [post](https://x.com/jhylee95/status/2103604431627452427) · [video](https://skillry.dev/ai-videos/opus-5-5/jhylee95-452427) |
|
|
32
42
|
| twoclipping · minimal launch with real footage | 10 bars at 120 BPM, one idea per shot, masked type reveals and match cuts over the owner's real vertical clips; no placeholder cards. | [post](https://x.com/twoclipping/status/2102554209166000267) · [video](https://skillry.dev/ai-videos/opus-5-5/twoclipping-000267) |
|
|
33
43
|
| Mounnna · logo reveal | Logo drawn as a wireframe, low-poly shards fly in and assemble it, then the icon background and the typed brand name. A 3 to 5 s sting for the CTA. | [post](https://x.com/Mounnna/status/2103802871934497266) · [video](https://skillry.dev/ai-videos/opus-5-5/mounnna-497266) |
|
|
@@ -8,6 +8,7 @@ The material decides which styles are **possible**. Niche and goal only rank the
|
|
|
8
8
|
|---|---|
|
|
9
9
|
| Voice only (own recording or TTS), no one on camera | [motion-editorial](styles/motion-editorial.md), [explicador-animado](styles/explicador-animado.md), [meme-rapido](styles/meme-rapido.md) |
|
|
10
10
|
| A song with its lyrics, or a voice-over or slogan with no footage at all | [tipografia-cinetica](styles/tipografia-cinetica.md) (the words are the image; scenes generated in code) |
|
|
11
|
+
| Only the product's UI (its screens, or a list of states), no person and no voice | [ui-morph](styles/ui-morph.md) (one shape becomes each UI state, a cursor drives it, cut on the beat) |
|
|
11
12
|
| Voice + app/site screens | [motion-editorial](styles/motion-editorial.md) (screenshots in a phone card), [camera-no-setup](styles/camera-no-setup.md) (film the screen), [meme-rapido](styles/meme-rapido.md) |
|
|
12
13
|
| A person on camera talking, nothing else | [talking-head-legenda](styles/talking-head-legenda.md) |
|
|
13
14
|
| A person on camera + headlines, articles, charts, b-roll | [talking-head-cards](styles/talking-head-cards.md) (face bubble over full-screen b-roll is a variant) |
|
|
@@ -29,10 +30,10 @@ From [`data/references.json`](../data/references.json): the styles measured in e
|
|
|
29
30
|
|
|
30
31
|
| Niche | Styles found (highest views) |
|
|
31
32
|
|---|---|
|
|
32
|
-
| dev / AI / build in public (EN) | meme-rapido (8.8M), camera-no-setup (8.1M), talking-head-legenda (5.4M), quadro-branco (4.4M), motion-editorial (0.83M), talking-head-cards (0.82M), podcast-clip (0.48M) |
|
|
33
|
+
| dev / AI / build in public (EN) | meme-rapido (8.8M), camera-no-setup (8.1M), talking-head-legenda (5.4M), quadro-branco (4.4M), ui-morph (1.2M), motion-editorial (0.83M), talking-head-cards (0.82M), podcast-clip (0.48M) |
|
|
33
34
|
| dev / AI / tech business (BR) | quadro-branco (1.1M), talking-head-cards (0.41M), talking-head-legenda (0.26M), meme-rapido (0.23M), camera-no-setup (0.11M) |
|
|
34
35
|
| personal finance / investing | podcast-clip (1.2M), talking-head-cards (1.2M), talking-head-legenda (0.77M) |
|
|
35
|
-
| product / SaaS / marketing / business / law | desafio-numero (20.9M), talking-head-legenda (9.8M), tipografia-cinetica (1.2M), camera-no-setup (0.53M), podcast-clip (0.33M), quadro-branco (0.15M), talking-head-cards (0.09M) |
|
|
36
|
+
| product / SaaS / marketing / business / law | desafio-numero (20.9M), talking-head-legenda (9.8M), tipografia-cinetica (1.2M), camera-no-setup (0.53M), podcast-clip (0.33M), quadro-branco (0.15M), talking-head-cards (0.09M), ui-morph (0.02M) |
|
|
36
37
|
| health / fitness / nutrition | explicador-animado (33.4M), podcast-clip (9.8M), quadro-branco (0.61M), macro-asmr (0.54M), talking-head-cards (0.43M), desafio-numero (0.22M) |
|
|
37
38
|
| food / recipes / lifestyle / travel | desafio-numero (107M), pov-vlog (8.7M), macro-asmr (7.7M), tour (1.05M) |
|
|
38
39
|
| beauty / fashion / local services (clinic, salon, architecture, real estate) | macro-asmr (10.6M), talking-head-legenda (3.8M), talking-head-cards (2.0M), pov-vlog (1.4M), tour (0.37M) |
|
|
@@ -45,6 +46,7 @@ BR local services (clinic, salon, law, architecture), BR travel and BR sales/mar
|
|
|
45
46
|
|
|
46
47
|
- **Saves and comments (teach, explain a system):** motion-editorial, explicador-animado, quadro-branco, talking-head-cards.
|
|
47
48
|
- **Reach and shares (curiosity, humour):** desafio-numero, experimento, meme-rapido, esquete, pov-vlog, tipografia-cinetica (music and manifestos).
|
|
49
|
+
- **Show the product working (launch, new feature, store page):** ui-morph, motion-editorial.
|
|
48
50
|
- **Trust and authority (a person the audience should know):** talking-head-legenda, podcast-clip, camera-no-setup.
|
|
49
51
|
- **Desire for a product:** macro-asmr, desafio-numero, camera-no-setup.
|
|
50
52
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# UI morph: one shape, many UI states (twoclipping, verbove, AnnaCher)
|
|
2
|
+
|
|
3
|
+
Measured on 6 shorts (en) in: dev / AI / build in public (EN), product / SaaS / marketing / business / law.
|
|
4
|
+
|
|
5
|
+
## Measured
|
|
6
|
+
|
|
7
|
+
| Metric | Value |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Reach (views) | max 1,164,424 · median 2,786 |
|
|
10
|
+
| Cuts per 10 s | min 0.0 · median 0.0 · max 0.0 |
|
|
11
|
+
| Median scene length | 17.05 s |
|
|
12
|
+
| Music bed (continuous / faint / none) | 4 / 0 / 2 |
|
|
13
|
+
| Cuts with a sound effect on them | 0/0 |
|
|
14
|
+
|
|
15
|
+
Cuts come from scene detection (it undercounts overlays and cards); music and SFX from an audio heuristic that classifies type, never names the sound ([../research-method.md](../research-method.md)).
|
|
16
|
+
|
|
17
|
+
## Material it needs
|
|
18
|
+
|
|
19
|
+
The product's real screens or a list of 8 to 12 UI states that tell its story (button, loader, player, slider, toggle, tabs, chart, ⌘K, toast), one accent colour and a track around 120 BPM. Nobody on camera, no footage: everything is drawn in code (HyperFrames).
|
|
20
|
+
|
|
21
|
+
## When it fits
|
|
22
|
+
|
|
23
|
+
App and SaaS launches, a feature announcement, a product promo for the site or the store page, a portfolio piece. Strong on X and LinkedIn with a product audience; it shows the product working instead of describing it. Weak for teaching step by step or for anything that needs a face.
|
|
24
|
+
|
|
25
|
+
## Recipe
|
|
26
|
+
|
|
27
|
+
**Look**
|
|
28
|
+
|
|
29
|
+
- One shape on screen the whole time, never cut: it becomes button, loader, player, slider, toggle, tabs, chart, ⌘K and toast, changing size, corners and colour (the same language as the iPhone Dynamic Island).
|
|
30
|
+
- Warm light grey canvas (#EDEBE6), components in black and white, at most one accent colour; a dark variant (navy with one yellow) for a product film.
|
|
31
|
+
- Real UI and real data: the product's own labels and numbers, never lorem ipsum or generic components.
|
|
32
|
+
- A cursor drives every change with real clicks and drags; the camera zooms so each state fills the frame.
|
|
33
|
+
|
|
34
|
+
**Palette:** Warm grey #EDEBE6 or beige #E6E2DA, black #111, white, plus ONE accent (orange, peach or yellow) used only where the eye must go. Dark variant: #0B1020 base, one yellow accent.
|
|
35
|
+
|
|
36
|
+
**Typography:** One UI sans (Inter, Geist or the product's own font) in regular and semibold; mono only for a URL or a code line. No display fonts.
|
|
37
|
+
|
|
38
|
+
**Motion**
|
|
39
|
+
|
|
40
|
+
- Every state grows out of the previous one by a spring (size, corner radius, colour), with at most one small overshoot; content swaps with a short blur.
|
|
41
|
+
- Something happens on every beat; the state changes land on the downbeats of the beat grid (scripts/beat_grid.py), not on a hand-counted 120 BPM.
|
|
42
|
+
- Build it as a pure function of time (seek(t)): closed-form springs, no CSS transitions or timers, so every frame renders the same. HyperFrames does this natively.
|
|
43
|
+
- The last frame equals the first, so the piece loops.
|
|
44
|
+
|
|
45
|
+
**Captions:** None. The text is the interface's own (button labels, track title, chart numbers). A single short line at most, in the UI font, when the product needs one sentence.
|
|
46
|
+
|
|
47
|
+
**Hook (0 to 3 s):** The first state already on screen at 0 s (a button or the brand pill) and the cursor arriving on the first beat. No logo intro, no title card.
|
|
48
|
+
|
|
49
|
+
**CTA:** The shape returns to the first state or closes on the brand pill with the URL in small mono under it, held 1 to 2 s.
|
|
50
|
+
|
|
51
|
+
**Music:** The track is the whole soundtrack: a continuous bed in 4 of 6 measured pieces, around -14 LUFS. Pick an electronic or lo-fi track with a clear kick so the beat grid is reliable.
|
|
52
|
+
|
|
53
|
+
**SFX:** Sparse and tied to UI events: a soft click on a press, a low tick on a snap. The measured pieces range from none to a hit on most state changes; never whooshes on every move.
|
|
54
|
+
|
|
55
|
+
## Do not
|
|
56
|
+
|
|
57
|
+
- Cutting between screens: the moment it cuts it becomes a screen recording, not this style.
|
|
58
|
+
- Bouncy easing, particles, glow, gradients on the UI chrome, icons with uneven stroke, dead time, template look.
|
|
59
|
+
- Generic components instead of the product's real UI and numbers.
|
|
60
|
+
- Shipping square or 16:9: every measured piece is 1:1 or 16:9; recompose for 9:16 with the shape in the upper-middle and nothing in the bottom 20 %.
|
|
61
|
+
|
|
62
|
+
## Watch before editing
|
|
63
|
+
|
|
64
|
+
- [zero](https://x.com/twoclipping/status/2103273003555402193) · 1,164,424 views
|
|
65
|
+
- [Martijn Verbove](https://x.com/verbove/status/2103483957266268381) · 17,438 views
|
|
66
|
+
- [Daniel Haida](https://x.com/daniel_haida/status/2104139720829636937) · 3,968 views
|
|
67
|
+
- [Anna Chernikova](https://x.com/AnnaCher___/status/2103571096549433425) · 1,605 views
|
|
68
|
+
- [Nez](https://x.com/nezbuilds/status/2103487427365294391) · 519 views
|
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Measures one public
|
|
2
|
+
# Measures one public short: download (720p), cuts (scene detection),
|
|
3
3
|
# audio (music bed, SFX type heuristic, loudness) and a 16-frame contact sheet.
|
|
4
|
-
# Usage: analyze.sh <youtube_id> <out_dir> → <out_dir>/<id>.json + <id>-sheet.png
|
|
4
|
+
# Usage: analyze.sh <youtube_id|url> <out_dir> → <out_dir>/<id>.json + <id>-sheet.png
|
|
5
|
+
# A URL (an X post, any page yt-dlp reads) is measured the same way; its id is
|
|
6
|
+
# x-<author>-<status> for X and a sanitised slug otherwise (2026-10-15: the
|
|
7
|
+
# code-generated UI pieces of the ui-morph style live on X, not on YouTube).
|
|
5
8
|
# The .mp4 is deleted at the end; read the contact sheet before describing the look.
|
|
6
9
|
set -euo pipefail
|
|
7
|
-
[ $# -eq 2 ] || { echo "uso: analyze.sh <youtube_id> <out_dir>" >&2; exit 2; }
|
|
10
|
+
[ $# -eq 2 ] || { echo "uso: analyze.sh <youtube_id|url> <out_dir>" >&2; exit 2; }
|
|
8
11
|
id="$1"; out="$2"
|
|
9
|
-
[[ "$id" =~ ^
|
|
12
|
+
if [[ "$id" =~ ^https?:// ]]; then
|
|
13
|
+
url="$id"
|
|
14
|
+
if [[ "$url" =~ (x|twitter)\.com/([A-Za-z0-9_]+)/status/([0-9]+) ]]; then
|
|
15
|
+
id="x-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}"
|
|
16
|
+
else
|
|
17
|
+
id=$(printf '%s' "$url" | sed -E 's#^https?://##; s#[^A-Za-z0-9_-]+#-#g' | cut -c1-60)
|
|
18
|
+
fi
|
|
19
|
+
else
|
|
20
|
+
[[ "$id" =~ ^[A-Za-z0-9_-]{11}$ ]] || { echo "id inválido: $id" >&2; exit 2; }
|
|
21
|
+
url="https://www.youtube.com/shorts/$id"
|
|
22
|
+
fi
|
|
10
23
|
mkdir -p "$out"; cd "$out"
|
|
11
24
|
f="./$id" # prefixo ./ : ID que começa com hífen não vira opção do ffmpeg
|
|
12
25
|
# .part: a first download that fails (HTTP 403) leaves it behind before the android fallback runs.
|
|
@@ -15,12 +28,11 @@ trap 'rm -f "$f.wav" "$f.mp4" "$f".*.part' EXIT
|
|
|
15
28
|
PY="${VIDEO_STYLES_PY:-python3}"
|
|
16
29
|
"$PY" -c "import librosa, numpy" 2>/dev/null || { echo "precisa de librosa e numpy: pip install librosa numpy (ou VIDEO_STYLES_PY=/caminho/do/python)" >&2; exit 2; }
|
|
17
30
|
for bin in yt-dlp ffmpeg ffprobe; do command -v "$bin" >/dev/null || { echo "falta $bin no PATH" >&2; exit 2; }; done
|
|
18
|
-
url="https://www.youtube.com/shorts/$id"
|
|
19
31
|
fmt="bv*[height<=1280][ext=mp4]+ba[ext=m4a]/b[ext=mp4]/b"
|
|
20
32
|
# When YouTube answers "confirm you're not a bot", the android player client usually still works (no cookies used).
|
|
21
33
|
[ -f "$f.mp4" ] || yt-dlp -q --no-warnings -f "$fmt" --merge-output-format mp4 -o "$f.mp4" "$url" \
|
|
22
34
|
|| yt-dlp -q --no-warnings --extractor-args "youtube:player_client=android" -f "$fmt" --merge-output-format mp4 -o "$f.mp4" "$url"
|
|
23
|
-
meta_fmt="%(view_count)s|%(like_count)s|%(channel)s|%(upload_date)s|%(title)s"
|
|
35
|
+
meta_fmt="%(view_count)s|%(like_count)s|%(channel,uploader)s|%(upload_date)s|%(title)s"
|
|
24
36
|
yt-dlp -q --no-warnings --skip-download --print "$meta_fmt" "$url" > "$f.meta" \
|
|
25
37
|
|| yt-dlp -q --no-warnings --skip-download --extractor-args "youtube:player_client=android" --print "$meta_fmt" "$url" > "$f.meta" \
|
|
26
38
|
|| echo "NA|NA|NA|NA|NA" > "$f.meta"
|
|
@@ -32,9 +44,9 @@ lufs=$(ffmpeg -i "$f.mp4" -af ebur128 -f null - 2>&1 | grep -E "^\s+I:" | tail -
|
|
|
32
44
|
d=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f.mp4")
|
|
33
45
|
step=$(python3 -c "print(max(1.0, $d/16))")
|
|
34
46
|
ffmpeg -loglevel error -y -i "$f.mp4" -vf "fps=1/$step,scale=200:-1,tile=8x2" -frames:v 1 "$f-sheet.png"
|
|
35
|
-
"$PY" - "$id" "$lufs" <<'PY'
|
|
47
|
+
"$PY" - "$id" "$lufs" "$url" <<'PY'
|
|
36
48
|
import librosa, numpy as np, json, sys
|
|
37
|
-
id, lufs = sys.argv[1], sys.argv[2]
|
|
49
|
+
id, lufs, url = sys.argv[1], sys.argv[2], sys.argv[3]
|
|
38
50
|
y, sr = librosa.load(f"{id}.wav", sr=22050); dur = len(y)/sr
|
|
39
51
|
cuts = [float(x) for x in open(f"{id}.cuts").read().split()]
|
|
40
52
|
H, P = librosa.effects.hpss(y, margin=2.0)
|
|
@@ -58,7 +70,7 @@ on_cut = sum(1 for c in cuts if any(abs(t-c) < 0.15 for t,_ in events))
|
|
|
58
70
|
shots = np.diff([0]+cuts+[dur]) if dur else np.array([0])
|
|
59
71
|
bed = float(np.percentile(rh,15)/(np.percentile(rh,95)+1e-9))
|
|
60
72
|
meta = open(f"{id}.meta").read().strip().split("|", 4)
|
|
61
|
-
json.dump({"id": id, "url":
|
|
73
|
+
json.dump({"id": id, "url": url, "views": meta[0], "likes": meta[1], "channel": meta[2], "upload_date": meta[3], "title": meta[4],
|
|
62
74
|
"duration_s": round(dur,1), "cuts": len(cuts), "cuts_per_10s": round(len(cuts)/dur*10,2), "shot_median_s": round(float(np.median(shots)),2), "shot_mean_s": round(float(shots.mean()),2),
|
|
63
75
|
"music_bed_ratio": round(bed,3), "music_bed_guess": "continua" if bed > 0.13 else ("fraca" if bed > 0.07 else "sem"),
|
|
64
76
|
"sfx_counts": kinds, "sfx_per_10s": round(sum(kinds.values())/dur*10,2), "sfx_on_cuts": f"{on_cut}/{len(cuts)}", "sfx_events": events[:40],
|
|
@@ -31,6 +31,7 @@ const HISTORY_REL = path.join('_wizz-output', 'video-styles', 'historico.json');
|
|
|
31
31
|
// tour, macro...) have no entry: a code-generated video is not a reference for them.
|
|
32
32
|
const GENERATED = {
|
|
33
33
|
'tipografia-cinetica': { categories: ['motion', 'explainer', '3d'], match: /lyric|music video|kinetic typograph|\bMV\b/i },
|
|
34
|
+
'ui-morph': { categories: ['motion', 'explainer', '3d', 'interactive'], match: /UI states|one shape|morph|UI moments|product film|inside the app/i },
|
|
34
35
|
'motion-editorial': { categories: ['motion', 'explainer'], match: /\bUI\b|product|launch|saas|\bapp\b|logo|promo|brand/i },
|
|
35
36
|
'explicador-animado': { categories: ['explainer'], match: /./ },
|
|
36
37
|
'quadro-branco': { categories: ['explainer', 'motion'], match: /whiteboard|hand-drawn|sketch|doodle/i },
|
|
@@ -32,7 +32,7 @@ The ones that show up most in an audit, with the direct fix. Use as a quick tria
|
|
|
32
32
|
|
|
33
33
|
> The first four (SQLi, IDOR, mass assignment, and permissive RLS) are **stop-the-line**: if it shows up, fix it before anything else.
|
|
34
34
|
>
|
|
35
|
-
> For a full adversarial audit (hunting with exploit proof + a prioritized plan), use the `security-audit-pentest` skill. This skill here is for **fixing** a specific finding from the table.
|
|
35
|
+
> For a full adversarial audit (hunting with exploit proof + a prioritized plan), use the `wizz-security-audit-pentest` skill. This skill here is for **fixing** a specific finding from the table.
|
|
36
36
|
|
|
37
37
|
## References (load on demand)
|
|
38
38
|
|
package/tools/fetch-assets.mjs
CHANGED
|
@@ -39,7 +39,7 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
39
39
|
const __dirname = path.dirname(__filename);
|
|
40
40
|
const PACKAGE_ROOT = path.resolve(__dirname, '..');
|
|
41
41
|
|
|
42
|
-
export const ASSETS_BASE = 'https://
|
|
42
|
+
export const ASSETS_BASE = 'https://assets.wizzcomms.com';
|
|
43
43
|
|
|
44
44
|
// Fonte única dos bundles conhecidos. `dest` é relativo ao root do pacote
|
|
45
45
|
// (repo em dev, node_modules/wizz-method quando instalado via npm — a mesma
|