tribunal-kit 6.0.0 → 7.0.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/.agent/.manifest.json +78 -0
- package/.agent/ARCHITECTURE.md +19 -241
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +3716 -1
- package/.agent/history/memory/MEMORY.md +246 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2034 -263
- package/.agent/rules/GEMINI.md +12 -10
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +237 -0
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
- package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
- package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +81 -0
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +58 -0
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +15 -14
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +160 -88
- package/SECURITY.md +11 -11
- package/bin/mcp-server.js +512 -233
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +45 -48
- package/dist/cli.js +26 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/memory.js +3 -2
- package/dist/commands/native.js +36 -0
- package/dist/commands/status.js +6 -0
- package/dist/esm/index.mjs +32 -0
- package/dist/index.d.ts +58 -3
- package/package.json +20 -16
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- package/scripts/visual_audit.js +23 -13
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before creating or editing ScrollTrigger animations, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Plugin Registration Requirement (Section 22) → Explicitly execute `gsap.registerPlugin(ScrollTrigger)` once at root; ban unregistered plugin usage
|
|
24
25
|
2. Child Tween ScrollTrigger Ban (Section 288) → Attach `scrollTrigger` to top-level timeline/tweens ONLY; ban attaching `scrollTrigger` to child timeline steps
|
|
25
26
|
3. Horizontal Ease-None Rule (Section 226) → Enforce `ease: "none"` on horizontal scrolling tweens; ban custom easing on containerAnimation tweens
|
|
@@ -45,14 +46,14 @@ gsap.registerPlugin(ScrollTrigger);
|
|
|
45
46
|
Tie a tween or timeline to scroll position:
|
|
46
47
|
|
|
47
48
|
```javascript
|
|
48
|
-
gsap.to(
|
|
49
|
+
gsap.to('.box', {
|
|
49
50
|
x: 500,
|
|
50
51
|
duration: 1,
|
|
51
52
|
scrollTrigger: {
|
|
52
|
-
trigger:
|
|
53
|
-
start:
|
|
54
|
-
end:
|
|
55
|
-
toggleActions:
|
|
53
|
+
trigger: '.box',
|
|
54
|
+
start: 'top center', // when top of trigger hits center of viewport
|
|
55
|
+
end: 'bottom center', // when the bottom of the trigger hits the center of the viewport
|
|
56
|
+
toggleActions: 'play reverse play reverse', // onEnter play, onLeave reverse, onEnterBack play, onLeaveBack reverse
|
|
56
57
|
},
|
|
57
58
|
});
|
|
58
59
|
```
|
|
@@ -89,10 +90,10 @@ Main properties for the `scrollTrigger` config object (shorthand: `scrollTrigger
|
|
|
89
90
|
|
|
90
91
|
```javascript
|
|
91
92
|
ScrollTrigger.create({
|
|
92
|
-
trigger:
|
|
93
|
-
start:
|
|
94
|
-
end:
|
|
95
|
-
onUpdate:
|
|
93
|
+
trigger: '#id',
|
|
94
|
+
start: 'top top',
|
|
95
|
+
end: 'bottom 50%+=100px',
|
|
96
|
+
onUpdate: self => console.log(self.progress.toFixed(3), self.direction),
|
|
96
97
|
});
|
|
97
98
|
```
|
|
98
99
|
|
|
@@ -114,26 +115,26 @@ ScrollTrigger.create({
|
|
|
114
115
|
- **batchMax** (Number | Function) — Max elements per batch. When full, the callback fires and the next batch starts. Use a **function** that returns a number for responsive layouts; it runs on refresh (resize, tab focus, etc.).
|
|
115
116
|
|
|
116
117
|
```javascript
|
|
117
|
-
ScrollTrigger.batch(
|
|
118
|
+
ScrollTrigger.batch('.box', {
|
|
118
119
|
onEnter: (elements, triggers) => {
|
|
119
120
|
gsap.to(elements, { opacity: 1, y: 0, stagger: 0.15 });
|
|
120
121
|
},
|
|
121
122
|
onLeave: (elements, triggers) => {
|
|
122
123
|
gsap.to(elements, { opacity: 0, y: 100 });
|
|
123
124
|
},
|
|
124
|
-
start:
|
|
125
|
-
end:
|
|
125
|
+
start: 'top 80%',
|
|
126
|
+
end: 'bottom 20%',
|
|
126
127
|
});
|
|
127
128
|
```
|
|
128
129
|
|
|
129
130
|
With **batchMax** and **interval** for finer control:
|
|
130
131
|
|
|
131
132
|
```javascript
|
|
132
|
-
ScrollTrigger.batch(
|
|
133
|
+
ScrollTrigger.batch('.card', {
|
|
133
134
|
interval: 0.1,
|
|
134
135
|
batchMax: 4,
|
|
135
|
-
onEnter:
|
|
136
|
-
onLeaveBack:
|
|
136
|
+
onEnter: batch => gsap.to(batch, { opacity: 1, y: 0, stagger: 0.1, overwrite: true }),
|
|
137
|
+
onLeaveBack: batch => gsap.set(batch, { opacity: 0, y: 50, overwrite: true }),
|
|
137
138
|
});
|
|
138
139
|
```
|
|
139
140
|
|
|
@@ -176,12 +177,12 @@ See [ScrollTrigger.scrollerProxy()](https://gsap.com/docs/v3/Plugins/ScrollTrigg
|
|
|
176
177
|
Scrub ties animation progress to scroll. Use for “scroll-driven” feel:
|
|
177
178
|
|
|
178
179
|
```javascript
|
|
179
|
-
gsap.to(
|
|
180
|
+
gsap.to('.box', {
|
|
180
181
|
x: 500,
|
|
181
182
|
scrollTrigger: {
|
|
182
|
-
trigger:
|
|
183
|
-
start:
|
|
184
|
-
end:
|
|
183
|
+
trigger: '.box',
|
|
184
|
+
start: 'top center',
|
|
185
|
+
end: 'bottom center',
|
|
185
186
|
scrub: true, // or number (smoothness delay in seconds), so 0.5 means it'd take 0.5 seconds to "catch up" to the current scroll position.
|
|
186
187
|
},
|
|
187
188
|
});
|
|
@@ -227,14 +228,14 @@ Drive a timeline with scroll and optional scrub:
|
|
|
227
228
|
```javascript
|
|
228
229
|
const tl = gsap.timeline({
|
|
229
230
|
scrollTrigger: {
|
|
230
|
-
trigger:
|
|
231
|
-
start:
|
|
232
|
-
end:
|
|
231
|
+
trigger: '.container',
|
|
232
|
+
start: 'top top',
|
|
233
|
+
end: '+=2000',
|
|
233
234
|
scrub: 1,
|
|
234
235
|
pin: true,
|
|
235
236
|
},
|
|
236
237
|
});
|
|
237
|
-
tl.to(
|
|
238
|
+
tl.to('.a', { x: 100 }).to('.b', { y: 50 }).to('.c', { opacity: 0 });
|
|
238
239
|
```
|
|
239
240
|
|
|
240
241
|
The timeline’s progress is tied to scroll through the trigger’s start/end range.
|
|
@@ -251,27 +252,27 @@ A common pattern: **pin** a section, then as the user scrolls **vertically**, co
|
|
|
251
252
|
4. To trigger things based on the horizontal movement caused by that tween, set **containerAnimation** to that tween.
|
|
252
253
|
|
|
253
254
|
```javascript
|
|
254
|
-
const scrollingEl = document.querySelector(
|
|
255
|
+
const scrollingEl = document.querySelector('.horizontal-el');
|
|
255
256
|
// Panel = pinned viewport-sized section. .horizontal-wrap = inner content that moves left.
|
|
256
257
|
const scrollTween = gsap.to(scrollingEl, {
|
|
257
258
|
xPercent: () => Max.max(0, window.innerWidth - scrollingEl.offsetWidth),
|
|
258
|
-
ease:
|
|
259
|
+
ease: 'none', // ease: "none" is required
|
|
259
260
|
scrollTrigger: {
|
|
260
261
|
trigger: scrollingEl,
|
|
261
262
|
pin: scrollingEl.parentNode, // wrapper so that we're not animating the pinned element
|
|
262
|
-
start:
|
|
263
|
-
end:
|
|
263
|
+
start: 'top top',
|
|
264
|
+
end: '+=1000',
|
|
264
265
|
},
|
|
265
266
|
});
|
|
266
267
|
|
|
267
268
|
// other tweens that trigger based on horizontal movement should reference the containerAnimation:
|
|
268
|
-
gsap.to(
|
|
269
|
+
gsap.to('.nested-el-1', {
|
|
269
270
|
y: 100,
|
|
270
271
|
scrollTrigger: {
|
|
271
272
|
containerAnimation: scrollTween, // IMPORTANT
|
|
272
|
-
trigger:
|
|
273
|
-
start:
|
|
274
|
-
toggleActions:
|
|
273
|
+
trigger: '.nested-wrapper-1',
|
|
274
|
+
start: 'left center', // based on horizontal movement
|
|
275
|
+
toggleActions: 'play none none reset',
|
|
275
276
|
},
|
|
276
277
|
});
|
|
277
278
|
```
|
|
@@ -284,9 +285,9 @@ gsap.to(".nested-el-1", {
|
|
|
284
285
|
- When removing animated elements or changing pages (e.g. in SPAs), **kill** associated ScrollTrigger instances so they don’t run on stale elements:
|
|
285
286
|
|
|
286
287
|
```javascript
|
|
287
|
-
ScrollTrigger.getAll().forEach(
|
|
288
|
+
ScrollTrigger.getAll().forEach(t => t.kill());
|
|
288
289
|
// or kill by the id assigned to the ScrollTrigger in its config object like {id: "my-id", ...}
|
|
289
|
-
ScrollTrigger.getById(
|
|
290
|
+
ScrollTrigger.getById('my-id')?.kill();
|
|
290
291
|
```
|
|
291
292
|
|
|
292
293
|
In React, use the `useGSAP()` hook (@gsap/react NPM package) to ensure proper cleanup automatically, or manually kill in a cleanup (e.g. in useEffect return) when the component unmounts.
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before creating GSAP timelines, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Position Parameter Syntax (Section 27) → Pass position as the 3rd argument (`"<"`, `">"`, `"+=0.5"`) instead of using hardcoded delays
|
|
24
25
|
2. Timeline Defaults (Section 45) → Pass `{ defaults: { duration, ease } }` into `gsap.timeline()` constructor to avoid repetitive child declarations
|
|
25
26
|
3. ScrollTrigger Placement (Section 101) → Place `scrollTrigger` ONLY on the top-level timeline, never on child tweens inside a timeline
|
|
@@ -34,7 +35,9 @@ Apply when building multi-step animations, coordinating several tweens in sequen
|
|
|
34
35
|
|
|
35
36
|
```javascript
|
|
36
37
|
const tl = gsap.timeline();
|
|
37
|
-
tl.to(
|
|
38
|
+
tl.to('.a', { x: 100, duration: 1 })
|
|
39
|
+
.to('.b', { y: 50, duration: 0.5 })
|
|
40
|
+
.to('.c', { opacity: 0, duration: 0.3 });
|
|
38
41
|
```
|
|
39
42
|
|
|
40
43
|
By default, tweens are **appended** one after another. Use the **position parameter** to place tweens at specific times or relative to other tweens.
|
|
@@ -51,10 +54,10 @@ Third argument (or position property in vars) controls placement:
|
|
|
51
54
|
Examples:
|
|
52
55
|
|
|
53
56
|
```javascript
|
|
54
|
-
tl.to(
|
|
55
|
-
tl.to(
|
|
56
|
-
tl.to(
|
|
57
|
-
tl.to(
|
|
57
|
+
tl.to('.a', { x: 100 }, 0); // at 0
|
|
58
|
+
tl.to('.b', { y: 50 }, '+=0.5'); // 0.5s after last end
|
|
59
|
+
tl.to('.c', { opacity: 0 }, '<'); // same start as previous
|
|
60
|
+
tl.to('.d', { scale: 2 }, '<0.2'); // 0.2s after previous start
|
|
58
61
|
```
|
|
59
62
|
|
|
60
63
|
## Timeline Defaults
|
|
@@ -62,8 +65,8 @@ tl.to(".d", { scale: 2 }, "<0.2"); // 0.2s after previous start
|
|
|
62
65
|
Pass defaults into the timeline so all child tweens inherit:
|
|
63
66
|
|
|
64
67
|
```javascript
|
|
65
|
-
const tl = gsap.timeline({ defaults: { duration: 0.5, ease:
|
|
66
|
-
tl.to(
|
|
68
|
+
const tl = gsap.timeline({ defaults: { duration: 0.5, ease: 'power2.out' } });
|
|
69
|
+
tl.to('.a', { x: 100 }).to('.b', { y: 50 }); // both use 0.5s and power2.out
|
|
67
70
|
```
|
|
68
71
|
|
|
69
72
|
## Timeline Options (constructor)
|
|
@@ -78,12 +81,12 @@ tl.to(".a", { x: 100 }).to(".b", { y: 50 }); // both use 0.5s and power2.out
|
|
|
78
81
|
Add and use labels for readable, maintainable sequencing:
|
|
79
82
|
|
|
80
83
|
```javascript
|
|
81
|
-
tl.addLabel(
|
|
82
|
-
tl.to(
|
|
83
|
-
tl.addLabel(
|
|
84
|
-
tl.to(
|
|
85
|
-
tl.play(
|
|
86
|
-
tl.tweenFromTo(
|
|
84
|
+
tl.addLabel('intro', 0);
|
|
85
|
+
tl.to('.a', { x: 100 }, 'intro');
|
|
86
|
+
tl.addLabel('outro', '+=0.5');
|
|
87
|
+
tl.to('.b', { opacity: 0 }, 'outro');
|
|
88
|
+
tl.play('outro'); // start from "outro"
|
|
89
|
+
tl.tweenFromTo('intro', 'outro'); // pauses the timeline and returns a new Tween that animates the timeline's playhead from intro to outro with no ease.
|
|
87
90
|
```
|
|
88
91
|
|
|
89
92
|
## Nesting Timelines
|
|
@@ -93,9 +96,9 @@ Timelines can contain other timelines.
|
|
|
93
96
|
```javascript
|
|
94
97
|
const master = gsap.timeline();
|
|
95
98
|
const child = gsap.timeline();
|
|
96
|
-
child.to(
|
|
99
|
+
child.to('.a', { x: 100 }).to('.b', { y: 50 });
|
|
97
100
|
master.add(child, 0);
|
|
98
|
-
master.to(
|
|
101
|
+
master.to('.c', { opacity: 0 }, '+=0.2');
|
|
99
102
|
```
|
|
100
103
|
|
|
101
104
|
## Controlling Playback
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before using `gsap.utils`, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Pure Number vs Unit strings (Section 306) → `mapRange` and `normalize` work ONLY on numbers; use `getUnit` and `unitize` for string values with units
|
|
24
25
|
2. Reusable Function Form (Section 22) → Omit the value argument (or pass `true` as 4th param for `random()`) to get a reusable function for high-frequency loops
|
|
25
26
|
3. Component Scoping (Section 219) → Use `gsap.utils.selector(containerRef)` inside React components to restrict selector targets
|
|
@@ -90,7 +91,7 @@ Interpolates between two values at a given progress (0–1). Handles numbers, co
|
|
|
90
91
|
|
|
91
92
|
```javascript
|
|
92
93
|
gsap.utils.interpolate(0, 100, 0.5); // 50
|
|
93
|
-
gsap.utils.interpolate(
|
|
94
|
+
gsap.utils.interpolate('#ff0000', '#0000ff', 0.5); // mid color
|
|
94
95
|
gsap.utils.interpolate({ x: 0, y: 0 }, { x: 100, y: 50 }, 0.5); // { x: 50, y: 25 }
|
|
95
96
|
|
|
96
97
|
let lerp = gsap.utils.interpolate(0, 100);
|
|
@@ -114,7 +115,7 @@ randomFn(); // random value in range, snapped to 10
|
|
|
114
115
|
randomFn(); // another random value
|
|
115
116
|
|
|
116
117
|
// array: pick one value at random
|
|
117
|
-
gsap.utils.random([
|
|
118
|
+
gsap.utils.random(['red', 'blue', 'green']); // "red", "blue", or "green"
|
|
118
119
|
let randomFromArray = gsap.utils.random([0, 100, 200], true);
|
|
119
120
|
randomFromArray(); // 0, 100, or 200
|
|
120
121
|
```
|
|
@@ -122,8 +123,8 @@ randomFromArray(); // 0, 100, or 200
|
|
|
122
123
|
**String form in tween vars:** use `"random(-100, 100)"`, `"random(-100, 100, 5)"`, or `"random([0, 100, 200])"`; GSAP evaluates it per target.
|
|
123
124
|
|
|
124
125
|
```javascript
|
|
125
|
-
gsap.to(
|
|
126
|
-
gsap.to(
|
|
126
|
+
gsap.to('.box', { x: 'random(-100, 100, 5)', duration: 1 });
|
|
127
|
+
gsap.to('.item', { backgroundColor: 'random([red, blue, green])' });
|
|
127
128
|
```
|
|
128
129
|
|
|
129
130
|
### snap(snapTo, value?)
|
|
@@ -142,7 +143,7 @@ snapFn(23); // 20
|
|
|
142
143
|
Use in tweens for grid or step-based animation:
|
|
143
144
|
|
|
144
145
|
```javascript
|
|
145
|
-
gsap.to(
|
|
146
|
+
gsap.to('.x', { x: 200, snap: { x: 20 } });
|
|
146
147
|
```
|
|
147
148
|
|
|
148
149
|
### shuffle(array)
|
|
@@ -173,11 +174,11 @@ gsap.utils.shuffle([1, 2, 3, 4]); // e.g. [3, 1, 4, 2]
|
|
|
173
174
|
|
|
174
175
|
```javascript
|
|
175
176
|
// Scale: middle elements 0.5, outer edges 3 (amount 2.5 distributed from center)
|
|
176
|
-
gsap.to(
|
|
177
|
+
gsap.to('.class', {
|
|
177
178
|
scale: gsap.utils.distribute({
|
|
178
179
|
base: 0.5,
|
|
179
180
|
amount: 2.5,
|
|
180
|
-
from:
|
|
181
|
+
from: 'center',
|
|
181
182
|
}),
|
|
182
183
|
});
|
|
183
184
|
```
|
|
@@ -188,10 +189,10 @@ gsap.to(".class", {
|
|
|
188
189
|
const distributor = gsap.utils.distribute({
|
|
189
190
|
base: 50,
|
|
190
191
|
amount: 100,
|
|
191
|
-
from:
|
|
192
|
-
ease:
|
|
192
|
+
from: 'center',
|
|
193
|
+
ease: 'power1.inOut',
|
|
193
194
|
});
|
|
194
|
-
const targets = gsap.utils.toArray(
|
|
195
|
+
const targets = gsap.utils.toArray('.box');
|
|
195
196
|
const valueForIndex2 = distributor(2, targets[2], targets);
|
|
196
197
|
```
|
|
197
198
|
|
|
@@ -204,8 +205,8 @@ See [distribute()](https://gsap.com/docs/v3/GSAP/UtilityMethods/distribute/) for
|
|
|
204
205
|
Returns the unit string of a value (e.g. `"px"`, `"%"`, `"deg"`). Use when normalizing or converting values.
|
|
205
206
|
|
|
206
207
|
```javascript
|
|
207
|
-
gsap.utils.getUnit(
|
|
208
|
-
gsap.utils.getUnit(
|
|
208
|
+
gsap.utils.getUnit('100px'); // "px"
|
|
209
|
+
gsap.utils.getUnit('50%'); // "%"
|
|
209
210
|
gsap.utils.getUnit(42); // "" (unitless)
|
|
210
211
|
```
|
|
211
212
|
|
|
@@ -214,8 +215,8 @@ gsap.utils.getUnit(42); // "" (unitless)
|
|
|
214
215
|
Appends a unit to a number, or returns the value as-is if it already has a unit. Use when building CSS values or tween end values.
|
|
215
216
|
|
|
216
217
|
```javascript
|
|
217
|
-
gsap.utils.unitize(100,
|
|
218
|
-
gsap.utils.unitize(
|
|
218
|
+
gsap.utils.unitize(100, 'px'); // "100px"
|
|
219
|
+
gsap.utils.unitize('2rem', 'px'); // "2rem" (unchanged)
|
|
219
220
|
```
|
|
220
221
|
|
|
221
222
|
### splitColor(color, returnHSL?)
|
|
@@ -223,10 +224,10 @@ gsap.utils.unitize("2rem", "px"); // "2rem" (unchanged)
|
|
|
223
224
|
Converts a color string into an array: **[red, green, blue]** (0–255), or **[red, green, blue, alpha]** (4 elements for RGBA when alpha is present or required). Pass **true** as the second argument (**returnHSL**) to get **[hue, saturation, lightness]** or **[hue, saturation, lightness, alpha]** (HSL/HSLA) instead. Works with `"rgb()"`, `"rgba()"`, `"hsl()"`, `"hsla()"`, hex, and named colors (e.g. `"red"`). Use when animating color components or building gradients. See [splitColor()](https://gsap.com/docs/v3/GSAP/UtilityMethods/splitColor/).
|
|
224
225
|
|
|
225
226
|
```javascript
|
|
226
|
-
gsap.utils.splitColor(
|
|
227
|
-
gsap.utils.splitColor(
|
|
228
|
-
gsap.utils.splitColor(
|
|
229
|
-
gsap.utils.splitColor(
|
|
227
|
+
gsap.utils.splitColor('red'); // [255, 0, 0]
|
|
228
|
+
gsap.utils.splitColor('#6fb936'); // [111, 185, 54]
|
|
229
|
+
gsap.utils.splitColor('rgba(204, 153, 51, 0.5)'); // [204, 153, 51, 0.5] (4 elements)
|
|
230
|
+
gsap.utils.splitColor('#6fb936', true); // [94, 55, 47] (HSL: hue, saturation, lightness)
|
|
230
231
|
```
|
|
231
232
|
|
|
232
233
|
## Arrays and Collections
|
|
@@ -237,8 +238,8 @@ Returns a scoped selector function that finds elements only within the given ele
|
|
|
237
238
|
|
|
238
239
|
```javascript
|
|
239
240
|
const q = gsap.utils.selector(containerRef);
|
|
240
|
-
q(
|
|
241
|
-
gsap.to(q(
|
|
241
|
+
q('.box'); // array of .box elements inside container
|
|
242
|
+
gsap.to(q('.circle'), { x: 100 });
|
|
242
243
|
```
|
|
243
244
|
|
|
244
245
|
### toArray(value, scope?)
|
|
@@ -246,8 +247,8 @@ gsap.to(q(".circle"), { x: 100 });
|
|
|
246
247
|
Converts a value to an array: selector string (scoped to element), NodeList, HTMLCollection, single element, or array. Use when passing mixed inputs to GSAP (e.g. targets) and a true array is needed.
|
|
247
248
|
|
|
248
249
|
```javascript
|
|
249
|
-
gsap.utils.toArray(
|
|
250
|
-
gsap.utils.toArray(
|
|
250
|
+
gsap.utils.toArray('.item'); // array of elements
|
|
251
|
+
gsap.utils.toArray('.item', container); // scoped to container
|
|
251
252
|
gsap.utils.toArray(nodeList); // [ ... ] from NodeList
|
|
252
253
|
```
|
|
253
254
|
|
|
@@ -257,8 +258,8 @@ Composes functions: **pipe(f1, f2, f3)(value)** returns f3(f2(f1(value))). Use w
|
|
|
257
258
|
|
|
258
259
|
```javascript
|
|
259
260
|
const fn = gsap.utils.pipe(
|
|
260
|
-
|
|
261
|
-
|
|
261
|
+
v => gsap.utils.normalize(0, 100, v),
|
|
262
|
+
v => gsap.utils.snap(0.1, v),
|
|
262
263
|
);
|
|
263
264
|
fn(50); // normalized then snapped
|
|
264
265
|
```
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before implementing UI component logic, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Component state tree → Verify presence of explicit loading skeleton, error boundary fallback, and empty states
|
|
24
25
|
2. CLS Prevention rules (Section 36) → Match skeleton placeholder dimensions exactly to incoming content elements
|
|
25
26
|
3. String Expansion (i18n) rules (Section 40) → Avoid hardcoded pixel widths (`width: 120px`); use `min-width` and flexible auto-layout
|
|
@@ -31,26 +32,31 @@ Ensure UI components gracefully handle network failures, missing data, slow conn
|
|
|
31
32
|
## 5 Resilience Domains
|
|
32
33
|
|
|
33
34
|
### 1. Zero-Data Empty States
|
|
35
|
+
|
|
34
36
|
- Never render empty blank slates or blank boxes.
|
|
35
37
|
- Always render a dedicated empty state component featuring:
|
|
36
38
|
- Contextual icon or subtle illustration
|
|
37
|
-
- Clear heading explaining the zero state (
|
|
38
|
-
- Secondary helper copy (
|
|
39
|
-
- Prominent primary action CTA button (
|
|
39
|
+
- Clear heading explaining the zero state (_"No active projects found"_)
|
|
40
|
+
- Secondary helper copy (_"Get started by creating your first project."_)
|
|
41
|
+
- Prominent primary action CTA button (_"Create Project"_)
|
|
40
42
|
|
|
41
43
|
### 2. Error Boundary UI & Retry Hooks
|
|
44
|
+
|
|
42
45
|
- Wrap high-risk component trees in React/framework Error Boundaries.
|
|
43
46
|
- Display localized inline error callouts with explicit "Retry" action buttons rather than crashing the full page view.
|
|
44
47
|
|
|
45
48
|
### 3. Cumulative Layout Shift (CLS) Loading Skeletons
|
|
49
|
+
|
|
46
50
|
- Match skeleton placeholder dimensions EXACTLY to incoming data elements.
|
|
47
51
|
- Use animated pulse keyframes (`@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }`).
|
|
48
52
|
|
|
49
53
|
### 4. Extreme String Expansion (i18n)
|
|
54
|
+
|
|
50
55
|
- German, French, and Spanish strings are 30% - 50% longer than English.
|
|
51
56
|
- Avoid fixed button or container widths (`width: 120px`). Use `min-width` with flexible auto sizing and `flex-wrap: wrap` or text truncation.
|
|
52
57
|
|
|
53
58
|
### 5. Offline & Network Disconnection Handling
|
|
59
|
+
|
|
54
60
|
- Detect `navigator.onLine` state and display subtle offline status banners.
|
|
55
61
|
- Disable mutation buttons during offline mode with explicit tooltip explanation.
|
|
56
62
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before operating in Marathon long-running harness mode, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Active session ledger (`task.md`, `session_manager.js`) → Verify active feature specs and task completion status
|
|
24
25
|
2. Verification-Before-Completion (VBC) Protocol → Provide concrete proof (test run log, compiler pass) before calling `tk marathon mark pass`
|
|
25
26
|
3. Error recovery state machine → Escalate unrecoverable errors after 3 retries via `tk marathon mark fail`
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before engineering multilingual or i18n features, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Dictionary Interpolation (Section 15) → Use ICU parameter interpolation `t('greeting', { name })` instead of string concatenation
|
|
24
25
|
2. Native `Intl` API Formatting (Section 71) → Use native `Intl.NumberFormat` and `Intl.DateTimeFormat` with active locale instead of third-party string parsers
|
|
25
26
|
3. Logical CSS Properties for RTL (Section 94) → Use logical properties (`margin-inline-start`, `ms-4`) instead of physical `marginLeft`/`marginRight` for Arabic/Hebrew support
|
|
@@ -66,15 +67,15 @@ export function Header({ user, alertCount }) {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
// ✅ GOOD: i18n Abstraction (using next-intl)
|
|
69
|
-
import { useTranslations } from
|
|
70
|
+
import { useTranslations } from 'next-intl';
|
|
70
71
|
|
|
71
72
|
export function Header({ user, alertCount }) {
|
|
72
|
-
const t = useTranslations(
|
|
73
|
+
const t = useTranslations('Dashboard');
|
|
73
74
|
|
|
74
75
|
return (
|
|
75
76
|
<header>
|
|
76
|
-
<h1>{t(
|
|
77
|
-
<p>{t(
|
|
77
|
+
<h1>{t('welcomeMessage', { name: user.name })}</h1>
|
|
78
|
+
<p>{t('unreadAlerts', { count: alertCount })}</p>
|
|
78
79
|
</header>
|
|
79
80
|
);
|
|
80
81
|
}
|
|
@@ -88,19 +89,19 @@ Do not install `moment.js` or write massive regex string parsers to format curre
|
|
|
88
89
|
|
|
89
90
|
```typescript
|
|
90
91
|
// Data/Currency Formatting correctly tied to the active locale
|
|
91
|
-
const locale =
|
|
92
|
+
const locale = 'de-DE';
|
|
92
93
|
|
|
93
94
|
// ✅ Currency
|
|
94
|
-
const price = new Intl.NumberFormat(locale, { style:
|
|
95
|
+
const price = new Intl.NumberFormat(locale, { style: 'currency', currency: 'EUR' }).format(1200.5);
|
|
95
96
|
// Output in Germany: "1.200,50 €"
|
|
96
97
|
|
|
97
98
|
// ✅ Dates
|
|
98
|
-
const date = new Intl.DateTimeFormat(locale, { dateStyle:
|
|
99
|
+
const date = new Intl.DateTimeFormat(locale, { dateStyle: 'full' }).format(new Date());
|
|
99
100
|
// Output in Germany: "Freitag, 2. April 2026"
|
|
100
101
|
|
|
101
102
|
// ✅ Relative Time
|
|
102
|
-
const rtf = new Intl.RelativeTimeFormat(locale, { numeric:
|
|
103
|
-
rtf.format(-2,
|
|
103
|
+
const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
|
|
104
|
+
rtf.format(-2, 'day'); // Output: "vorgestern" (the day before yesterday)
|
|
104
105
|
```
|
|
105
106
|
|
|
106
107
|
---
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before designing or engineering frontend components, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. `DESIGN.md` / `package.json` → Verify OKLCH color palettes, font pairings, and responsive container query setups
|
|
24
25
|
2. Core Pillars of Impeccable UI (Section 22) → Enforce `tabular-nums` on digits, `text-wrap: balance` on headings, and strict 8px grid math
|
|
25
26
|
3. Motion & Micro-Interactions (Section 34) → Limit micro-interactions to $\le 160\text{ms}$ and check `prefers-reduced-motion` fallbacks
|
|
@@ -31,22 +32,26 @@ The gold standard framework for crafting bespoke, world-class web applications t
|
|
|
31
32
|
## Core Pillars of Impeccable UI
|
|
32
33
|
|
|
33
34
|
### 1. Typography & Typographic Rhythm
|
|
35
|
+
|
|
34
36
|
- **Optical Sizing & Tracking**: Large display headings (32px+) require tight letter-spacing (`letter-spacing: -0.03em`). Small caption text (12px) requires positive tracking (`letter-spacing: +0.01em`).
|
|
35
37
|
- **Tabular Numbers**: Any numeric data that updates, increments, or displays in columns MUST use `font-variant-numeric: tabular-nums` or `font-feature-settings: "tnum"` to prevent visual jitter.
|
|
36
38
|
- **Text Wrapping & Balance**: Headings MUST use `text-wrap: balance` to prevent typographic orphans. Body paragraphs MUST use `text-wrap: pretty` (where supported) or max `65ch` width.
|
|
37
39
|
|
|
38
40
|
### 2. Color Systems & Gamut Precision
|
|
41
|
+
|
|
39
42
|
- **OKLCH Color Space**: Prefer `oklch()` over `hsl()` or `hex` for smooth perceptual uniformity across hue and lightness shifts.
|
|
40
43
|
- **Subtle Surface Steps**: Define surface colors with small perceptual lightness steps ($L \pm 2\%$) to create hierarchy without harsh dividers.
|
|
41
44
|
- **Adaptive Contrast**: Text contrast MUST adapt automatically across light/dark themes with high legibility ratios ($\ge 7:1$ for primary, $\ge 4.5:1$ for secondary).
|
|
42
45
|
|
|
43
46
|
### 3. Motion & Micro-Interactions
|
|
47
|
+
|
|
44
48
|
- **Intentional Motion**: Animations exist ONLY to convey spatial continuity, provide press feedback, or indicate state changes.
|
|
45
49
|
- **Duration Constraints**: Micro-interactions $\le 160\text{ms}$; dropdowns/popovers $\le 220\text{ms}$; page transitions $\le 300\text{ms}$.
|
|
46
50
|
- **Physically Grounded Entrances**: Elements scale in from `scale(0.96)` and opacity `0`, anchored to their trigger origin.
|
|
47
51
|
- **DOM Entry (@starting-style)**: Use `@starting-style` with `transition-behavior: allow-discrete` for smooth `display: none` to `display: block` entrance animations without JS overhead.
|
|
48
52
|
|
|
49
53
|
### 4. Layout Mechanics & Spatial Math
|
|
54
|
+
|
|
50
55
|
- **8px Grid System**: Every margin, padding, gap, and height MUST derive from an 8px grid (or 4px micro-grid).
|
|
51
56
|
- **Asymmetrical Balance**: Avoid cookie-cutter centered layouts for SaaS apps. Use strong left-aligned structural axes with generous negative space.
|
|
52
57
|
- **Container Queries**: Components adjust layout based on container size (`@container`), not viewport size (`@media`), making them context-agnostic.
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before refactoring or producing an architectural improvement roadmap, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Circular Dependency Breaking Rule (Section 24) → Identify circular imports (`A -> B -> C -> A`) and resolve via event buses or explicit interfaces
|
|
24
25
|
2. Monolithic Controller Line Threshold (500 lines) (Section 27) → Flag any controller/service >500 lines with mixed concerns for immediate decomposition
|
|
25
26
|
3. Incremental Refactoring Rule (Section 46) → Ban shotgun surgery across >5 files simultaneously; enforce phased, test-backed interface extractions
|
|
@@ -33,22 +34,26 @@ Audit an existing codebase for structural rot, circular dependencies, monolithic
|
|
|
33
34
|
## 4 Audit Steps
|
|
34
35
|
|
|
35
36
|
### 1. Dependency Graph Inspection
|
|
37
|
+
|
|
36
38
|
- Map import relationships across modules. Identify circular dependencies (`A -> B -> C -> A`) and break them by introducing event buses or interface abstractions.
|
|
37
39
|
|
|
38
40
|
### 2. Monolithic Controller Detection
|
|
41
|
+
|
|
39
42
|
- Flag files exceeding 500 lines of code containing mixed concerns (database queries, HTTP response handling, email sending, data validation).
|
|
40
43
|
|
|
41
44
|
### 3. Interface Shrinking (Deepening Modules)
|
|
45
|
+
|
|
42
46
|
- Audit public exports. Convert large multi-parameter interfaces into thin, single-responsibility contracts.
|
|
43
47
|
|
|
44
48
|
### 4. Prioritized Architectural Roadmap Output
|
|
49
|
+
|
|
45
50
|
Output audit findings in a clear prioritized Markdown table:
|
|
46
51
|
|
|
47
|
-
| Impact Level
|
|
48
|
-
|
|
|
49
|
-
| 🔴 **High Impact**
|
|
50
|
-
| 🟠 **Medium Impact** | Circular import between Auth and User modules
|
|
51
|
-
| 🟡 **Low Impact**
|
|
52
|
+
| Impact Level | Architectural Issue | Proposed Seam / Refactor |
|
|
53
|
+
| -------------------- | ------------------------------------------------ | ------------------------------------------------- |
|
|
54
|
+
| 🔴 **High Impact** | Direct DB queries inside React Server Components | Extract Repository layer pattern |
|
|
55
|
+
| 🟠 **Medium Impact** | Circular import between Auth and User modules | Introduce `EventBus` for user registration events |
|
|
56
|
+
| 🟡 **Low Impact** | Hardcoded API base URLs across 12 files | Centralize in typed `ConfigService` |
|
|
52
57
|
|
|
53
58
|
---
|
|
54
59
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before auditing UI surfaces or writing remediation plans, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Read-Only Constraint (Section 24) → Strictly NEVER modify product source code (`src/`, `components/`, `app/`) during an `improve-ui` audit session
|
|
24
25
|
2. 3-Proof Requirement (Section 40) → Every reported defect MUST present Observation (code line/element), Basis (token/grid violation), and Consequence
|
|
25
26
|
3. Plan Artifact Output (Section 25) → Write implementation plans to `design-plans/` or output structured markdown for execution
|
|
@@ -39,21 +40,27 @@ Audit a specific product surface against its governing design tokens and guideli
|
|
|
39
40
|
## 2. The 4-Phase Audit Protocol
|
|
40
41
|
|
|
41
42
|
### Phase 1: Surface Selection & Path Tracing
|
|
43
|
+
|
|
42
44
|
1. Focus on one deployable application and one coherent surface family (e.g. `Dashboard / Overview`).
|
|
43
45
|
2. Trace the path from route layout $\rightarrow$ page composition $\rightarrow$ shared UI primitives $\rightarrow$ tokens/CSS variables.
|
|
44
46
|
|
|
45
47
|
### Phase 2: Design Language Reconstruction
|
|
48
|
+
|
|
46
49
|
1. Inspect `DESIGN.md`, `index.css`, Tailwind tokens, or custom properties.
|
|
47
50
|
2. Record active background tokens, typography roles, spatial rules, and border/shadow contracts.
|
|
48
51
|
|
|
49
52
|
### Phase 3: Proof-Gated Defect Verification
|
|
53
|
+
|
|
50
54
|
Before reporting a finding, require 3 explicit proofs:
|
|
55
|
+
|
|
51
56
|
- **Observation**: Exact code line or rendered element showing the discrepancy.
|
|
52
57
|
- **Basis**: Violation of documented design token or 8px grid baseline.
|
|
53
58
|
- **Consequence**: Measurable degradation of visual hierarchy, readability, or interaction response.
|
|
54
59
|
|
|
55
60
|
### Phase 4: Implementation Plan Generation
|
|
61
|
+
|
|
56
62
|
Write a self-contained plan specifying:
|
|
63
|
+
|
|
57
64
|
- Files to modify
|
|
58
65
|
- Exact CSS/JSX diffs
|
|
59
66
|
- Verification steps (browser preview, contrast check, visual alignment)
|
|
@@ -62,11 +69,11 @@ Write a self-contained plan specifying:
|
|
|
62
69
|
|
|
63
70
|
## Anti-Slop Table
|
|
64
71
|
|
|
65
|
-
| Audit Pattern
|
|
66
|
-
|
|
|
67
|
-
| Rewriting entire components
|
|
68
|
-
| Guessing design tokens
|
|
69
|
-
| Speculative visual preferences | Reporting only verified WCAG/token violations | Prevents arbitrary churn
|
|
72
|
+
| Audit Pattern | Evidence-Based Rule | Rationale |
|
|
73
|
+
| ------------------------------ | --------------------------------------------- | -------------------------------- |
|
|
74
|
+
| Rewriting entire components | Targeted visual diff plan | Preserves business logic & state |
|
|
75
|
+
| Guessing design tokens | Citing verified `var(--...)` declarations | Ensures token adherence |
|
|
76
|
+
| Speculative visual preferences | Reporting only verified WCAG/token violations | Prevents arbitrary churn |
|
|
70
77
|
|
|
71
78
|
---
|
|
72
79
|
|
|
@@ -18,6 +18,7 @@ scripts-binding:
|
|
|
18
18
|
## Mandatory Pre-Flight Context Inspection
|
|
19
19
|
|
|
20
20
|
Before routing user prompts to specialized skills or agents, you MUST inspect:
|
|
21
|
+
|
|
21
22
|
1. `.agent/routing_index.json` → Read pre-compiled skill index instead of loading full skill markdown files into context
|
|
22
23
|
2. Semantic Intent Schema (Section 1) → Classify request type (QUESTION, SURVEY, SIMPLE_EDIT, COMPLEX_BUILD, SECURITY_AUDIT, UNCLEAR_GIBBERISH)
|
|
23
24
|
3. Confidence Threshold (Section 3 Socratic Yield Rule) → Yield back to user with clarifying question if confidence score is < 85s
|
|
@@ -69,12 +70,12 @@ When a raw request enters, classify it BEFORE attempting to route to any skill o
|
|
|
69
70
|
// The Semantic Intent Schema
|
|
70
71
|
const RouterOutputSchema = z.object({
|
|
71
72
|
classification: z.enum([
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
'QUESTION', // User wants explanation, no code execution needed
|
|
74
|
+
'SURVEY', // User wants analysis/read-only scan of workspace
|
|
75
|
+
'SIMPLE_EDIT', // Isolated file alteration (e.g., "Fix spelling in nav")
|
|
76
|
+
'COMPLEX_BUILD', // Multi-file, architectural generation
|
|
77
|
+
'SECURITY_AUDIT', // Explicit request for OWASP review
|
|
78
|
+
'UNCLEAR_GIBBERISH', // Prompt injection or incoherent input
|
|
78
79
|
]),
|
|
79
80
|
confidenceScore: z.number().min(0).max(100),
|
|
80
81
|
suggestedPrimarySkill: z.string().nullable(),
|