@luanpdd/kit-mcp 1.33.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -84
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +70 -70
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +109 -109
- package/kit/agents/ai-mutation-tester.md +289 -289
- package/kit/agents/assumptions-analyzer.md +110 -110
- package/kit/agents/audit-log-implementer.md +314 -314
- package/kit/agents/auditor-consistencia-isolamento.md +414 -414
- package/kit/agents/b2b-saas-architect.md +157 -157
- package/kit/agents/burn-rate-forecaster.md +153 -153
- package/kit/agents/cascading-failures-auditor.md +299 -299
- package/kit/agents/codebase-mapper.md +769 -769
- package/kit/agents/crm-pipeline-implementer.md +257 -257
- package/kit/agents/debugger.md +814 -814
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/detector-tenant-quente.md +338 -338
- package/kit/agents/evolution-go-integrator.md +201 -201
- package/kit/agents/example-reviewer.md +22 -22
- package/kit/agents/executor.md +565 -565
- package/kit/agents/golden-signals-instrumenter.md +232 -232
- package/kit/agents/incident-investigator.md +238 -238
- package/kit/agents/integration-checker.md +203 -203
- package/kit/agents/invite-flow-implementer.md +190 -190
- package/kit/agents/legacy-characterizer.md +369 -369
- package/kit/agents/lgpd-compliance-auditor.md +296 -296
- package/kit/agents/load-shedding-instrumenter.md +290 -290
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -254
- package/kit/agents/multi-tenant-rls-writer.md +341 -341
- package/kit/agents/nyquist-auditor.md +181 -181
- package/kit/agents/observability-coverage-auditor.md +316 -316
- package/kit/agents/observability-instrumenter.md +191 -191
- package/kit/agents/omm-auditor.md +291 -291
- package/kit/agents/org-onboarding-implementer.md +224 -224
- package/kit/agents/payload-capture-instrumenter.md +274 -274
- package/kit/agents/phase-researcher.md +697 -697
- package/kit/agents/plan-checker.md +275 -275
- package/kit/agents/planner.md +923 -923
- package/kit/agents/postmortem-writer.md +273 -273
- package/kit/agents/project-researcher.md +653 -653
- package/kit/agents/prr-conductor.md +287 -287
- package/kit/agents/refactor-safety-auditor.md +405 -405
- package/kit/agents/release-pipeline-auditor.md +364 -364
- package/kit/agents/research-synthesizer.md +246 -246
- package/kit/agents/roadmapper.md +678 -678
- package/kit/agents/schema-checker.md +160 -160
- package/kit/agents/seam-finder.md +360 -360
- package/kit/agents/shotgun-surgery-detector.md +350 -350
- package/kit/agents/slo-engineer.md +217 -217
- package/kit/agents/storytelling-analyst.md +300 -300
- package/kit/agents/supabase-architect.md +249 -249
- package/kit/agents/supabase-auth-bootstrapper.md +400 -400
- package/kit/agents/supabase-auth-hook-writer.md +418 -418
- package/kit/agents/supabase-branching-architect.md +563 -563
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -778
- package/kit/agents/supabase-column-privileges-writer.md +400 -400
- package/kit/agents/supabase-edge-fn-tester.md +288 -288
- package/kit/agents/supabase-edge-fn-writer.md +341 -341
- package/kit/agents/supabase-mfa-implementer.md +439 -439
- package/kit/agents/supabase-migration-writer.md +386 -386
- package/kit/agents/supabase-oauth-server-implementer.md +507 -507
- package/kit/agents/supabase-rbac-implementer.md +393 -393
- package/kit/agents/supabase-realtime-implementer.md +364 -364
- package/kit/agents/supabase-rls-hardener.md +522 -522
- package/kit/agents/supabase-rls-writer.md +324 -324
- package/kit/agents/supabase-roles-implementer.md +356 -356
- package/kit/agents/supabase-social-auth-implementer.md +451 -451
- package/kit/agents/supabase-sso-saml-architect.md +549 -549
- package/kit/agents/supabase-storage-implementer.md +407 -407
- package/kit/agents/super-admin-implementer.md +282 -282
- package/kit/agents/toil-auditor.md +268 -268
- package/kit/agents/ui-auditor.md +438 -438
- package/kit/agents/ui-checker.md +305 -305
- package/kit/agents/ui-researcher.md +356 -356
- package/kit/agents/user-profiler.md +176 -176
- package/kit/agents/validador-evolucao-schema.md +336 -336
- package/kit/agents/verifier.md +729 -729
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura-workflow.md +121 -0
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +238 -238
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +13 -11
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/kit-attribution-reminder.cjs +92 -92
- package/kit/hooks/kit-router.cjs +137 -137
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-auth-hardening/SKILL.md +674 -674
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -875
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -486
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -579
- package/kit/skills/supabase-auth-ssr/SKILL.md +306 -306
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +330 -330
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -309
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -302
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -279
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -277
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -357
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -545
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -399
- package/kit/skills/supabase-mfa/SKILL.md +488 -488
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -537
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/supabase-social-oauth/SKILL.md +480 -480
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -450
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/kit/workflows/auditar-observabilidade-cobertura.workflow.js +250 -0
- package/package.json +65 -63
- package/src/core/kit.js +333 -216
- package/src/core/reflect.js +247 -247
- package/src/core/registry.js +123 -112
- package/src/core/reverse-sync.js +448 -372
- package/src/core/sync.js +477 -437
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -794
|
@@ -1,264 +1,264 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ui-motion-funcional
|
|
3
|
-
description: Use ao adicionar animation
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# UI — Motion Funcional
|
|
7
|
-
|
|
8
|
-
## Quando usar
|
|
9
|
-
|
|
10
|
-
LLM carrega esta skill quando:
|
|
11
|
-
|
|
12
|
-
- "Adicionar animation / transition / motion"
|
|
13
|
-
- "Algo parece estático / sem vida"
|
|
14
|
-
- "Confetti / celebration / delight moment"
|
|
15
|
-
- "Page transition / route change"
|
|
16
|
-
- Preenchendo Componentes/Regras com motion rules
|
|
17
|
-
|
|
18
|
-
## Regras absolutas
|
|
19
|
-
|
|
20
|
-
**REGRA #1 (com propósito, não decorativo):** Motion existe para comunicar **mudança de estado** (loading → done, hidden → visible, focus, error). Decoração pura (parallax, auto-scrolling text, ambient bg motion) é proibida em produto, raramente justificada em marca.
|
|
21
|
-
|
|
22
|
-
**REGRA #2 (duração por contexto):**
|
|
23
|
-
- **Micro-interação** (hover, focus, button press): **100-150ms**
|
|
24
|
-
- **Mudança de estado** (toggle, dropdown, popover open): **150-200ms**
|
|
25
|
-
- **Layout shift** (modal open, drawer slide): **250-400ms**
|
|
26
|
-
- **Page transition**: **300-400ms** max
|
|
27
|
-
- **Celebration** (confetti, hero entrance): **600-800ms** com justificativa, 1 vez
|
|
28
|
-
|
|
29
|
-
Duração > 500ms em interação = lento. < 100ms = imperceptível, sem valor.
|
|
30
|
-
|
|
31
|
-
**REGRA #3 (easing canônico):**
|
|
32
|
-
- **Padrão**: `ease-out` ou `cubic-bezier(0.2, 0.8, 0.2, 1)` (entry rápido, settle suave)
|
|
33
|
-
- **Exit/dismiss**: `ease-in` aceitável para "remover do palco"
|
|
34
|
-
- **Layout shifts**: `cubic-bezier(0.4, 0, 0.2, 1)` (Material standard)
|
|
35
|
-
- **PROIBIDO em produto**: `bounce`, `elastic`, `back` easings — playful demais para uso funcional
|
|
36
|
-
|
|
37
|
-
**REGRA #4 (prefers-reduced-motion sempre):** Toda animation tem fallback estático.
|
|
38
|
-
|
|
39
|
-
**REGRA #5 (no layout thrash):** Anime apenas `transform` + `opacity`. Nunca anime `width`, `height`, `top`, `left`, `padding` em hot path. Use `transform: translate3d()` + `scale()`.
|
|
40
|
-
|
|
41
|
-
## Patterns canônicos
|
|
42
|
-
|
|
43
|
-
### Micro-interação (button hover)
|
|
44
|
-
|
|
45
|
-
```css
|
|
46
|
-
.button {
|
|
47
|
-
transition: background-color 150ms ease-out, transform 150ms ease-out;
|
|
48
|
-
}
|
|
49
|
-
.button:hover {
|
|
50
|
-
background-color: var(--primary-hover);
|
|
51
|
-
}
|
|
52
|
-
.button:active {
|
|
53
|
-
transform: translateY(1px); /* sutil press-down */
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
@media (prefers-reduced-motion: reduce) {
|
|
57
|
-
.button { transition: none; }
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Dropdown / Popover open
|
|
62
|
-
|
|
63
|
-
```tsx
|
|
64
|
-
// Framer Motion
|
|
65
|
-
<motion.div
|
|
66
|
-
initial={{ opacity: 0, y: -8 }}
|
|
67
|
-
animate={{ opacity: 1, y: 0 }}
|
|
68
|
-
exit={{ opacity: 0, y: -8 }}
|
|
69
|
-
transition={{ duration: 0.18, ease: [0.2, 0.8, 0.2, 1] }}
|
|
70
|
-
>
|
|
71
|
-
{/* content */}
|
|
72
|
-
</motion.div>
|
|
73
|
-
|
|
74
|
-
// Tailwind / CSS only
|
|
75
|
-
className="data-[state=open]:animate-in data-[state=open]:fade-in-0
|
|
76
|
-
data-[state=open]:slide-in-from-top-1
|
|
77
|
-
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
|
|
78
|
-
data-[state=closed]:slide-out-to-top-1
|
|
79
|
-
duration-200 ease-out"
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Modal / Dialog
|
|
83
|
-
|
|
84
|
-
```tsx
|
|
85
|
-
// Mobile: slide-from-bottom (sheet)
|
|
86
|
-
// Desktop: scale central + fade
|
|
87
|
-
|
|
88
|
-
className="
|
|
89
|
-
/* mobile */
|
|
90
|
-
data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom
|
|
91
|
-
data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom
|
|
92
|
-
/* desktop */
|
|
93
|
-
sm:data-[state=open]:zoom-in-95 sm:data-[state=closed]:zoom-out-95
|
|
94
|
-
sm:data-[state=open]:fade-in-0 sm:data-[state=closed]:fade-out-0
|
|
95
|
-
/* timing */
|
|
96
|
-
duration-300 ease-out
|
|
97
|
-
"
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Layout state transitions
|
|
101
|
-
|
|
102
|
-
```tsx
|
|
103
|
-
// Lista que filtra: AnimatePresence + layout
|
|
104
|
-
<AnimatePresence mode="popLayout">
|
|
105
|
-
{items.map(item => (
|
|
106
|
-
<motion.div
|
|
107
|
-
key={item.id}
|
|
108
|
-
layout
|
|
109
|
-
initial={{ opacity: 0, scale: 0.95 }}
|
|
110
|
-
animate={{ opacity: 1, scale: 1 }}
|
|
111
|
-
exit={{ opacity: 0, scale: 0.95 }}
|
|
112
|
-
transition={{ duration: 0.2, ease: 'easeOut' }}
|
|
113
|
-
>
|
|
114
|
-
{item.label}
|
|
115
|
-
</motion.div>
|
|
116
|
-
))}
|
|
117
|
-
</AnimatePresence>
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Loading state (skeleton + transition)
|
|
121
|
-
|
|
122
|
-
```tsx
|
|
123
|
-
{loading ? (
|
|
124
|
-
<Skeleton className="h-24 animate-pulse" />
|
|
125
|
-
) : (
|
|
126
|
-
<motion.div
|
|
127
|
-
initial={{ opacity: 0 }}
|
|
128
|
-
animate={{ opacity: 1 }}
|
|
129
|
-
transition={{ duration: 0.15 }}
|
|
130
|
-
>
|
|
131
|
-
{data}
|
|
132
|
-
</motion.div>
|
|
133
|
-
)}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### Celebration (use 1× por flow, justificado)
|
|
137
|
-
|
|
138
|
-
```tsx
|
|
139
|
-
// Onboarding: primeiro check-in completado
|
|
140
|
-
import confetti from 'canvas-confetti'
|
|
141
|
-
|
|
142
|
-
useEffect(() => {
|
|
143
|
-
if (justCompleted) {
|
|
144
|
-
confetti({
|
|
145
|
-
particleCount: 80,
|
|
146
|
-
spread: 60,
|
|
147
|
-
origin: { y: 0.4 },
|
|
148
|
-
colors: [primaryColor, foregroundColor], // brand-tinted, não rainbow
|
|
149
|
-
disableForReducedMotion: true,
|
|
150
|
-
})
|
|
151
|
-
}
|
|
152
|
-
}, [justCompleted])
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Critérios para usar confetti:
|
|
156
|
-
1. Evento raro (não toast comum)
|
|
157
|
-
2. Sucesso significativo (não "saved successfully" trivial)
|
|
158
|
-
3. Cores da marca (não default rainbow)
|
|
159
|
-
4. `disableForReducedMotion: true`
|
|
160
|
-
5. Não bloqueia interação subsequente
|
|
161
|
-
|
|
162
|
-
## Anti-patterns
|
|
163
|
-
|
|
164
|
-
### Anti-pattern 1: bounce easing em produto
|
|
165
|
-
|
|
166
|
-
**Errado:**
|
|
167
|
-
```css
|
|
168
|
-
.dropdown {
|
|
169
|
-
transition: transform 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); /* bounce */
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
**Por quê:** Q08 — bounce em interação comum = playful demais, perde profissionalismo em context dashboard.
|
|
174
|
-
|
|
175
|
-
**Certo:** `ease-out` ou `cubic-bezier(0.2, 0.8, 0.2, 1)`.
|
|
176
|
-
|
|
177
|
-
### Anti-pattern 2: motion em decoração de bg
|
|
178
|
-
|
|
179
|
-
**Errado:** SVG floating shapes orbitando hero em background, animação infinita.
|
|
180
|
-
|
|
181
|
-
**Por quê:** REGRA #1 — decoração sem propósito + drena GPU + viewport battery + distrai do conteúdo.
|
|
182
|
-
|
|
183
|
-
**Certo:** static. Ou movimento triggerado por scroll JÁ engajado (parallax leve, max -10% translate), nunca infinito.
|
|
184
|
-
|
|
185
|
-
### Anti-pattern 3: animar `height` ou `width` em accordion
|
|
186
|
-
|
|
187
|
-
**Errado:**
|
|
188
|
-
```css
|
|
189
|
-
.accordion-content {
|
|
190
|
-
transition: height 300ms;
|
|
191
|
-
}
|
|
192
|
-
.accordion-content.open { height: auto; } /* além de quebrar transition, layout thrash */
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
**Por quê:** REGRA #5 — height/width disparam reflow + paint, queda de fps em mobile.
|
|
196
|
-
|
|
197
|
-
**Certo:** anime `transform: scaleY` ou `max-height` + `clip-path`. Ou use lib (Radix Accordion) que faz right.
|
|
198
|
-
|
|
199
|
-
### Anti-pattern 4: page transition longa
|
|
200
|
-
|
|
201
|
-
**Errado:** route change com fade out 600ms + fade in 600ms = 1.2s de tela vazia.
|
|
202
|
-
|
|
203
|
-
**Por quê:** REGRA #2 — user percebe app lento. App nativo bom = transição instantânea ou < 300ms.
|
|
204
|
-
|
|
205
|
-
**Certo:** 200ms fade out + 200ms fade in, OU cross-fade overlap 250ms total.
|
|
206
|
-
|
|
207
|
-
### Anti-pattern 5: ignorar prefers-reduced-motion
|
|
208
|
-
|
|
209
|
-
**Errado:**
|
|
210
|
-
```tsx
|
|
211
|
-
<motion.div animate={{ x: [0, 100, 0] }} transition={{ repeat: Infinity }} />
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
**Por quê:** REGRA #4 — users com vestibular disorder ou enxaqueca + usuários com bateria fraca + corporate machines.
|
|
215
|
-
|
|
216
|
-
**Certo:**
|
|
217
|
-
```tsx
|
|
218
|
-
const shouldReduceMotion = useReducedMotion()
|
|
219
|
-
<motion.div
|
|
220
|
-
animate={shouldReduceMotion ? {} : { x: [0, 100, 0] }}
|
|
221
|
-
transition={{ repeat: shouldReduceMotion ? 0 : Infinity }}
|
|
222
|
-
/>
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Anti-pattern 6: auto-play hero video sem controle
|
|
226
|
-
|
|
227
|
-
**Errado:** `<video autoPlay loop muted playsInline>` em hero, 5MB+, sem botão pausar.
|
|
228
|
-
|
|
229
|
-
**Por quê:** Acessibilidade + bateria + bandwidth. Tem que existir pause/control visível e respeitar prefers-reduced-motion (pausa default).
|
|
230
|
-
|
|
231
|
-
**Certo:**
|
|
232
|
-
```tsx
|
|
233
|
-
<video
|
|
234
|
-
ref={videoRef}
|
|
235
|
-
autoPlay={!prefersReducedMotion}
|
|
236
|
-
loop muted playsInline
|
|
237
|
-
poster="/hero-static.jpg"
|
|
238
|
-
/>
|
|
239
|
-
<button onClick={togglePlay} aria-label="Toggle video">…</button>
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Detecção
|
|
243
|
-
|
|
244
|
-
```bash
|
|
245
|
-
# Bounce/elastic easing
|
|
246
|
-
grep -rnE "bounce|cubic-bezier\(0\.68|elastic" src --include="*.css" --include="*.tsx" 2>/dev/null
|
|
247
|
-
|
|
248
|
-
# Animação > 500ms em interação
|
|
249
|
-
grep -rnE "duration-(700|1000|1500|2000)\b|duration:\s*(700|800|1000|1500)" src --include="*.tsx" --include="*.css" 2>/dev/null
|
|
250
|
-
|
|
251
|
-
# Layout-thrashing animations
|
|
252
|
-
grep -rnE "transition.*width|transition.*height|transition.*top|transition.*left|transition.*padding|transition.*margin" src --include="*.css" 2>/dev/null
|
|
253
|
-
|
|
254
|
-
# Falta de prefers-reduced-motion handler
|
|
255
|
-
grep -rln "framer-motion\|animate=" src --include="*.tsx" 2>/dev/null | while read f; do
|
|
256
|
-
grep -q "useReducedMotion\|prefers-reduced-motion" "$f" || echo "$f: motion sem reduce handler"
|
|
257
|
-
done
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
## Ver também
|
|
261
|
-
|
|
262
|
-
- [ui-anti-padroes-ia](../ui-anti-padroes-ia/SKILL.md) — Q08 (bounce easing)
|
|
263
|
-
- [ui-contexto-produto](../ui-contexto-produto/SKILL.md) — sensibilidade a motion em MARCA.md
|
|
264
|
-
- WCAG SC 2.3.3 Animation from Interactions: https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions
|
|
1
|
+
---
|
|
2
|
+
name: ui-motion-funcional
|
|
3
|
+
description: Use ao adicionar animation/transition — motion comunica estado, nao decora. 150-200ms interacoes / 250-400ms layout. ease-out default. prefers-reduced-motion sempre. Sem auto-play e parallax.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI — Motion Funcional
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill quando:
|
|
11
|
+
|
|
12
|
+
- "Adicionar animation / transition / motion"
|
|
13
|
+
- "Algo parece estático / sem vida"
|
|
14
|
+
- "Confetti / celebration / delight moment"
|
|
15
|
+
- "Page transition / route change"
|
|
16
|
+
- Preenchendo Componentes/Regras com motion rules
|
|
17
|
+
|
|
18
|
+
## Regras absolutas
|
|
19
|
+
|
|
20
|
+
**REGRA #1 (com propósito, não decorativo):** Motion existe para comunicar **mudança de estado** (loading → done, hidden → visible, focus, error). Decoração pura (parallax, auto-scrolling text, ambient bg motion) é proibida em produto, raramente justificada em marca.
|
|
21
|
+
|
|
22
|
+
**REGRA #2 (duração por contexto):**
|
|
23
|
+
- **Micro-interação** (hover, focus, button press): **100-150ms**
|
|
24
|
+
- **Mudança de estado** (toggle, dropdown, popover open): **150-200ms**
|
|
25
|
+
- **Layout shift** (modal open, drawer slide): **250-400ms**
|
|
26
|
+
- **Page transition**: **300-400ms** max
|
|
27
|
+
- **Celebration** (confetti, hero entrance): **600-800ms** com justificativa, 1 vez
|
|
28
|
+
|
|
29
|
+
Duração > 500ms em interação = lento. < 100ms = imperceptível, sem valor.
|
|
30
|
+
|
|
31
|
+
**REGRA #3 (easing canônico):**
|
|
32
|
+
- **Padrão**: `ease-out` ou `cubic-bezier(0.2, 0.8, 0.2, 1)` (entry rápido, settle suave)
|
|
33
|
+
- **Exit/dismiss**: `ease-in` aceitável para "remover do palco"
|
|
34
|
+
- **Layout shifts**: `cubic-bezier(0.4, 0, 0.2, 1)` (Material standard)
|
|
35
|
+
- **PROIBIDO em produto**: `bounce`, `elastic`, `back` easings — playful demais para uso funcional
|
|
36
|
+
|
|
37
|
+
**REGRA #4 (prefers-reduced-motion sempre):** Toda animation tem fallback estático.
|
|
38
|
+
|
|
39
|
+
**REGRA #5 (no layout thrash):** Anime apenas `transform` + `opacity`. Nunca anime `width`, `height`, `top`, `left`, `padding` em hot path. Use `transform: translate3d()` + `scale()`.
|
|
40
|
+
|
|
41
|
+
## Patterns canônicos
|
|
42
|
+
|
|
43
|
+
### Micro-interação (button hover)
|
|
44
|
+
|
|
45
|
+
```css
|
|
46
|
+
.button {
|
|
47
|
+
transition: background-color 150ms ease-out, transform 150ms ease-out;
|
|
48
|
+
}
|
|
49
|
+
.button:hover {
|
|
50
|
+
background-color: var(--primary-hover);
|
|
51
|
+
}
|
|
52
|
+
.button:active {
|
|
53
|
+
transform: translateY(1px); /* sutil press-down */
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@media (prefers-reduced-motion: reduce) {
|
|
57
|
+
.button { transition: none; }
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Dropdown / Popover open
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
// Framer Motion
|
|
65
|
+
<motion.div
|
|
66
|
+
initial={{ opacity: 0, y: -8 }}
|
|
67
|
+
animate={{ opacity: 1, y: 0 }}
|
|
68
|
+
exit={{ opacity: 0, y: -8 }}
|
|
69
|
+
transition={{ duration: 0.18, ease: [0.2, 0.8, 0.2, 1] }}
|
|
70
|
+
>
|
|
71
|
+
{/* content */}
|
|
72
|
+
</motion.div>
|
|
73
|
+
|
|
74
|
+
// Tailwind / CSS only
|
|
75
|
+
className="data-[state=open]:animate-in data-[state=open]:fade-in-0
|
|
76
|
+
data-[state=open]:slide-in-from-top-1
|
|
77
|
+
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
|
|
78
|
+
data-[state=closed]:slide-out-to-top-1
|
|
79
|
+
duration-200 ease-out"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Modal / Dialog
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
// Mobile: slide-from-bottom (sheet)
|
|
86
|
+
// Desktop: scale central + fade
|
|
87
|
+
|
|
88
|
+
className="
|
|
89
|
+
/* mobile */
|
|
90
|
+
data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom
|
|
91
|
+
data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom
|
|
92
|
+
/* desktop */
|
|
93
|
+
sm:data-[state=open]:zoom-in-95 sm:data-[state=closed]:zoom-out-95
|
|
94
|
+
sm:data-[state=open]:fade-in-0 sm:data-[state=closed]:fade-out-0
|
|
95
|
+
/* timing */
|
|
96
|
+
duration-300 ease-out
|
|
97
|
+
"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Layout state transitions
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
// Lista que filtra: AnimatePresence + layout
|
|
104
|
+
<AnimatePresence mode="popLayout">
|
|
105
|
+
{items.map(item => (
|
|
106
|
+
<motion.div
|
|
107
|
+
key={item.id}
|
|
108
|
+
layout
|
|
109
|
+
initial={{ opacity: 0, scale: 0.95 }}
|
|
110
|
+
animate={{ opacity: 1, scale: 1 }}
|
|
111
|
+
exit={{ opacity: 0, scale: 0.95 }}
|
|
112
|
+
transition={{ duration: 0.2, ease: 'easeOut' }}
|
|
113
|
+
>
|
|
114
|
+
{item.label}
|
|
115
|
+
</motion.div>
|
|
116
|
+
))}
|
|
117
|
+
</AnimatePresence>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Loading state (skeleton + transition)
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
{loading ? (
|
|
124
|
+
<Skeleton className="h-24 animate-pulse" />
|
|
125
|
+
) : (
|
|
126
|
+
<motion.div
|
|
127
|
+
initial={{ opacity: 0 }}
|
|
128
|
+
animate={{ opacity: 1 }}
|
|
129
|
+
transition={{ duration: 0.15 }}
|
|
130
|
+
>
|
|
131
|
+
{data}
|
|
132
|
+
</motion.div>
|
|
133
|
+
)}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Celebration (use 1× por flow, justificado)
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
// Onboarding: primeiro check-in completado
|
|
140
|
+
import confetti from 'canvas-confetti'
|
|
141
|
+
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (justCompleted) {
|
|
144
|
+
confetti({
|
|
145
|
+
particleCount: 80,
|
|
146
|
+
spread: 60,
|
|
147
|
+
origin: { y: 0.4 },
|
|
148
|
+
colors: [primaryColor, foregroundColor], // brand-tinted, não rainbow
|
|
149
|
+
disableForReducedMotion: true,
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
}, [justCompleted])
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Critérios para usar confetti:
|
|
156
|
+
1. Evento raro (não toast comum)
|
|
157
|
+
2. Sucesso significativo (não "saved successfully" trivial)
|
|
158
|
+
3. Cores da marca (não default rainbow)
|
|
159
|
+
4. `disableForReducedMotion: true`
|
|
160
|
+
5. Não bloqueia interação subsequente
|
|
161
|
+
|
|
162
|
+
## Anti-patterns
|
|
163
|
+
|
|
164
|
+
### Anti-pattern 1: bounce easing em produto
|
|
165
|
+
|
|
166
|
+
**Errado:**
|
|
167
|
+
```css
|
|
168
|
+
.dropdown {
|
|
169
|
+
transition: transform 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); /* bounce */
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Por quê:** Q08 — bounce em interação comum = playful demais, perde profissionalismo em context dashboard.
|
|
174
|
+
|
|
175
|
+
**Certo:** `ease-out` ou `cubic-bezier(0.2, 0.8, 0.2, 1)`.
|
|
176
|
+
|
|
177
|
+
### Anti-pattern 2: motion em decoração de bg
|
|
178
|
+
|
|
179
|
+
**Errado:** SVG floating shapes orbitando hero em background, animação infinita.
|
|
180
|
+
|
|
181
|
+
**Por quê:** REGRA #1 — decoração sem propósito + drena GPU + viewport battery + distrai do conteúdo.
|
|
182
|
+
|
|
183
|
+
**Certo:** static. Ou movimento triggerado por scroll JÁ engajado (parallax leve, max -10% translate), nunca infinito.
|
|
184
|
+
|
|
185
|
+
### Anti-pattern 3: animar `height` ou `width` em accordion
|
|
186
|
+
|
|
187
|
+
**Errado:**
|
|
188
|
+
```css
|
|
189
|
+
.accordion-content {
|
|
190
|
+
transition: height 300ms;
|
|
191
|
+
}
|
|
192
|
+
.accordion-content.open { height: auto; } /* além de quebrar transition, layout thrash */
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Por quê:** REGRA #5 — height/width disparam reflow + paint, queda de fps em mobile.
|
|
196
|
+
|
|
197
|
+
**Certo:** anime `transform: scaleY` ou `max-height` + `clip-path`. Ou use lib (Radix Accordion) que faz right.
|
|
198
|
+
|
|
199
|
+
### Anti-pattern 4: page transition longa
|
|
200
|
+
|
|
201
|
+
**Errado:** route change com fade out 600ms + fade in 600ms = 1.2s de tela vazia.
|
|
202
|
+
|
|
203
|
+
**Por quê:** REGRA #2 — user percebe app lento. App nativo bom = transição instantânea ou < 300ms.
|
|
204
|
+
|
|
205
|
+
**Certo:** 200ms fade out + 200ms fade in, OU cross-fade overlap 250ms total.
|
|
206
|
+
|
|
207
|
+
### Anti-pattern 5: ignorar prefers-reduced-motion
|
|
208
|
+
|
|
209
|
+
**Errado:**
|
|
210
|
+
```tsx
|
|
211
|
+
<motion.div animate={{ x: [0, 100, 0] }} transition={{ repeat: Infinity }} />
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Por quê:** REGRA #4 — users com vestibular disorder ou enxaqueca + usuários com bateria fraca + corporate machines.
|
|
215
|
+
|
|
216
|
+
**Certo:**
|
|
217
|
+
```tsx
|
|
218
|
+
const shouldReduceMotion = useReducedMotion()
|
|
219
|
+
<motion.div
|
|
220
|
+
animate={shouldReduceMotion ? {} : { x: [0, 100, 0] }}
|
|
221
|
+
transition={{ repeat: shouldReduceMotion ? 0 : Infinity }}
|
|
222
|
+
/>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Anti-pattern 6: auto-play hero video sem controle
|
|
226
|
+
|
|
227
|
+
**Errado:** `<video autoPlay loop muted playsInline>` em hero, 5MB+, sem botão pausar.
|
|
228
|
+
|
|
229
|
+
**Por quê:** Acessibilidade + bateria + bandwidth. Tem que existir pause/control visível e respeitar prefers-reduced-motion (pausa default).
|
|
230
|
+
|
|
231
|
+
**Certo:**
|
|
232
|
+
```tsx
|
|
233
|
+
<video
|
|
234
|
+
ref={videoRef}
|
|
235
|
+
autoPlay={!prefersReducedMotion}
|
|
236
|
+
loop muted playsInline
|
|
237
|
+
poster="/hero-static.jpg"
|
|
238
|
+
/>
|
|
239
|
+
<button onClick={togglePlay} aria-label="Toggle video">…</button>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Detecção
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# Bounce/elastic easing
|
|
246
|
+
grep -rnE "bounce|cubic-bezier\(0\.68|elastic" src --include="*.css" --include="*.tsx" 2>/dev/null
|
|
247
|
+
|
|
248
|
+
# Animação > 500ms em interação
|
|
249
|
+
grep -rnE "duration-(700|1000|1500|2000)\b|duration:\s*(700|800|1000|1500)" src --include="*.tsx" --include="*.css" 2>/dev/null
|
|
250
|
+
|
|
251
|
+
# Layout-thrashing animations
|
|
252
|
+
grep -rnE "transition.*width|transition.*height|transition.*top|transition.*left|transition.*padding|transition.*margin" src --include="*.css" 2>/dev/null
|
|
253
|
+
|
|
254
|
+
# Falta de prefers-reduced-motion handler
|
|
255
|
+
grep -rln "framer-motion\|animate=" src --include="*.tsx" 2>/dev/null | while read f; do
|
|
256
|
+
grep -q "useReducedMotion\|prefers-reduced-motion" "$f" || echo "$f: motion sem reduce handler"
|
|
257
|
+
done
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Ver também
|
|
261
|
+
|
|
262
|
+
- [ui-anti-padroes-ia](../ui-anti-padroes-ia/SKILL.md) — Q08 (bounce easing)
|
|
263
|
+
- [ui-contexto-produto](../ui-contexto-produto/SKILL.md) — sensibilidade a motion em MARCA.md
|
|
264
|
+
- WCAG SC 2.3.3 Animation from Interactions: https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions
|