tribunal-kit 2.4.6 → 3.1.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/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +139 -86
- package/.agent/agents/ai-code-reviewer.md +160 -90
- package/.agent/agents/backend-specialist.md +164 -127
- package/.agent/agents/code-archaeologist.md +115 -73
- package/.agent/agents/database-architect.md +130 -110
- package/.agent/agents/debugger.md +137 -97
- package/.agent/agents/dependency-reviewer.md +78 -30
- package/.agent/agents/devops-engineer.md +161 -118
- package/.agent/agents/documentation-writer.md +151 -87
- package/.agent/agents/explorer-agent.md +117 -99
- package/.agent/agents/frontend-reviewer.md +127 -47
- package/.agent/agents/frontend-specialist.md +169 -109
- package/.agent/agents/game-developer.md +28 -164
- package/.agent/agents/logic-reviewer.md +87 -49
- package/.agent/agents/mobile-developer.md +151 -103
- package/.agent/agents/mobile-reviewer.md +133 -50
- package/.agent/agents/orchestrator.md +121 -110
- package/.agent/agents/penetration-tester.md +103 -77
- package/.agent/agents/performance-optimizer.md +136 -92
- package/.agent/agents/performance-reviewer.md +139 -69
- package/.agent/agents/product-manager.md +104 -70
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +95 -95
- package/.agent/agents/qa-automation-engineer.md +174 -87
- package/.agent/agents/security-auditor.md +133 -129
- package/.agent/agents/seo-specialist.md +160 -99
- package/.agent/agents/sql-reviewer.md +132 -44
- package/.agent/agents/supervisor-agent.md +137 -109
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +132 -53
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +143 -33
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +60 -100
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
- package/.agent/skills/api-patterns/SKILL.md +197 -257
- package/.agent/skills/api-security-auditor/SKILL.md +125 -57
- package/.agent/skills/app-builder/SKILL.md +326 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
- package/.agent/skills/architecture/SKILL.md +161 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
- package/.agent/skills/bash-linux/SKILL.md +71 -166
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +345 -127
- package/.agent/skills/building-native-ui/SKILL.md +125 -57
- package/.agent/skills/clean-code/SKILL.md +266 -149
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +73 -131
- package/.agent/skills/csharp-developer/SKILL.md +434 -73
- package/.agent/skills/database-design/SKILL.md +190 -275
- package/.agent/skills/deployment-procedures/SKILL.md +81 -158
- package/.agent/skills/devops-engineer/SKILL.md +255 -94
- package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +75 -165
- package/.agent/skills/extract-design-system/SKILL.md +84 -58
- package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
- package/.agent/skills/github-operations/SKILL.md +197 -272
- package/.agent/skills/gsap-expert/SKILL.md +194 -0
- package/.agent/skills/i18n-localization/SKILL.md +60 -172
- package/.agent/skills/intelligent-routing/SKILL.md +123 -103
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +281 -195
- package/.agent/skills/local-first/SKILL.md +76 -159
- package/.agent/skills/mcp-builder/SKILL.md +48 -188
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
- package/.agent/skills/observability/SKILL.md +211 -203
- package/.agent/skills/parallel-agents/SKILL.md +53 -146
- package/.agent/skills/performance-profiling/SKILL.md +171 -151
- package/.agent/skills/plan-writing/SKILL.md +49 -153
- package/.agent/skills/platform-engineer/SKILL.md +57 -103
- package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
- package/.agent/skills/powershell-windows/SKILL.md +61 -179
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +273 -114
- package/.agent/skills/react-specialist/SKILL.md +227 -108
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +216 -243
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +525 -142
- package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
- package/.agent/skills/server-management/SKILL.md +110 -166
- package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +543 -68
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +124 -57
- package/.agent/skills/systematic-debugging/SKILL.md +49 -151
- package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
- package/.agent/skills/tdd-workflow/SKILL.md +63 -169
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +437 -130
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +225 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
- package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +71 -196
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +96 -224
- package/.agent/workflows/audit.md +81 -122
- package/.agent/workflows/brainstorm.md +69 -105
- package/.agent/workflows/changelog.md +65 -97
- package/.agent/workflows/create.md +73 -88
- package/.agent/workflows/debug.md +80 -111
- package/.agent/workflows/deploy.md +119 -92
- package/.agent/workflows/enhance.md +80 -91
- package/.agent/workflows/fix.md +68 -97
- package/.agent/workflows/generate.md +165 -164
- package/.agent/workflows/migrate.md +106 -109
- package/.agent/workflows/orchestrate.md +103 -86
- package/.agent/workflows/performance-benchmarker.md +77 -268
- package/.agent/workflows/plan.md +120 -98
- package/.agent/workflows/preview.md +39 -96
- package/.agent/workflows/refactor.md +105 -97
- package/.agent/workflows/review-ai.md +63 -102
- package/.agent/workflows/review.md +71 -110
- package/.agent/workflows/session.md +53 -113
- package/.agent/workflows/status.md +42 -88
- package/.agent/workflows/strengthen-skills.md +90 -51
- package/.agent/workflows/swarm.md +114 -129
- package/.agent/workflows/test.md +125 -102
- package/.agent/workflows/tribunal-backend.md +60 -78
- package/.agent/workflows/tribunal-database.md +62 -100
- package/.agent/workflows/tribunal-frontend.md +62 -82
- package/.agent/workflows/tribunal-full.md +56 -100
- package/.agent/workflows/tribunal-mobile.md +65 -94
- package/.agent/workflows/tribunal-performance.md +62 -105
- package/.agent/workflows/ui-ux-pro-max.md +72 -121
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsap-expert
|
|
3
|
+
description: GreenSock Animation Platform (GSAP 3.12+) mastery. Core tweens, timelines, ScrollTrigger, ScrollSmoother, plugins, React useGSAP hook, responsive animations, performance. Use when building scroll-driven animations, complex sequencing, SVG morphing, or any animation beyond CSS capabilities.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
version: 3.2.0
|
|
6
|
+
last-updated: 2026-04-07
|
|
7
|
+
applies-to-model: gemini-3-1-pro, claude-3-7-sonnet
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# GSAP Expert — 3.12+ Dense Reference
|
|
11
|
+
|
|
12
|
+
## Hallucination Traps (Read First)
|
|
13
|
+
- ❌ `gsap.registerPlugin(ScrollTrigger)` optional → ✅ **REQUIRED** before any use — must call before component mounts
|
|
14
|
+
- ❌ `easeInOut`, `Power2.easeOut` (GSAP 2 syntax) → ✅ `"power2.inOut"` (string, GSAP 3)
|
|
15
|
+
- ❌ `raw useEffect` for GSAP in React → ✅ `useGSAP` from `@gsap/react` — handles cleanup automatically
|
|
16
|
+
- ❌ Timeline position as 2nd arg → ✅ position is the **3rd** arg: `tl.to(el, { x: 100 }, "<")`
|
|
17
|
+
- ❌ `markers: true` in production → ✅ Debug only — never ship. `gsap.config({ markers: false })`
|
|
18
|
+
- ❌ Animate `width`, `height`, `top`, `left` → ✅ Only `x`, `y`, `scale`, `rotation`, `opacity` (GPU composited)
|
|
19
|
+
- ❌ 1 ScrollTrigger per list item → ✅ Use `ScrollTrigger.batch()` for lists — 1 battery per N items
|
|
20
|
+
- ❌ `dependencies` option spelled `deps` → ✅ option is `dependencies` (not `deps`)
|
|
21
|
+
- ❌ GSAP in Next.js Server Components → ✅ Always `"use client"` — GSAP is browser-only
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Core Tweens
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
gsap.to(".box", { x: 100, opacity: 1, duration: 1, ease: "power2.out" });
|
|
29
|
+
gsap.from(".box", { y: -50, opacity: 0, duration: 0.8 });
|
|
30
|
+
gsap.fromTo(".box", { x: -100 }, { x: 0, duration: 1, ease: "expo.out" });
|
|
31
|
+
gsap.set(".box", { transformOrigin: "center center", willChange: "transform" });
|
|
32
|
+
|
|
33
|
+
// Stagger (multiple elements)
|
|
34
|
+
gsap.from(".item", { opacity: 0, y: 30, stagger: 0.08, ease: "power3.out" });
|
|
35
|
+
gsap.from(".item", { opacity: 0, stagger: { each: 0.1, from: "center", grid: "auto" } });
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Timelines
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
const tl = gsap.timeline({ defaults: { ease: "power2.out", duration: 0.6 } });
|
|
44
|
+
|
|
45
|
+
tl.from(".hero-title", { y: 60, opacity: 0 })
|
|
46
|
+
.from(".hero-sub", { y: 40, opacity: 0 }, "-=0.4") // overlap 0.4s
|
|
47
|
+
.from(".hero-cta", { scale: 0.9, opacity: 0 }, "<0.1") // 0.1s after prev starts
|
|
48
|
+
.to(".hero-img", { x: 0, opacity: 1 }, 0.3); // absolute 0.3s into tl
|
|
49
|
+
|
|
50
|
+
// Position symbols:
|
|
51
|
+
// "<" → same start time as previous tween
|
|
52
|
+
// ">" → after previous ends
|
|
53
|
+
// "-=0.5" → 0.5s before previous ends (overlap)
|
|
54
|
+
// "+=0.5" → 0.5s after previous ends (gap)
|
|
55
|
+
// "2" → absolute 2s from timeline start
|
|
56
|
+
|
|
57
|
+
// Runtime control
|
|
58
|
+
tl.play(); tl.pause(); tl.reverse(); tl.seek(1.5); tl.timeScale(2); // 2x speed
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## ScrollTrigger
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
import { gsap } from "gsap";
|
|
67
|
+
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
|
68
|
+
gsap.registerPlugin(ScrollTrigger); // REQUIRED — call once at module level
|
|
69
|
+
|
|
70
|
+
// Basic scroll-triggered animation
|
|
71
|
+
gsap.from(".section", {
|
|
72
|
+
scrollTrigger: {
|
|
73
|
+
trigger: ".section",
|
|
74
|
+
start: "top 80%", // "triggerEdge viewportEdge"
|
|
75
|
+
end: "bottom 20%",
|
|
76
|
+
scrub: 1, // smooth scrubbing (seconds to catch up) | true = instant
|
|
77
|
+
pin: true, // pin element during scroll
|
|
78
|
+
anticipatePin: 1, // prevents jump on pin
|
|
79
|
+
markers: false, // NEVER true in production
|
|
80
|
+
},
|
|
81
|
+
y: 100, opacity: 0,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Batch — for lists (1 ST instance per group, not per item)
|
|
85
|
+
ScrollTrigger.batch(".card", {
|
|
86
|
+
onEnter: (elements) => gsap.from(elements, { opacity: 0, y: 40, stagger: 0.08 }),
|
|
87
|
+
start: "top 85%",
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Pin + scrub storytelling
|
|
91
|
+
const tl = gsap.timeline({
|
|
92
|
+
scrollTrigger: { trigger: ".scene", pin: true, scrub: true, end: "+=3000" }
|
|
93
|
+
});
|
|
94
|
+
tl.from(".layer-1", { x: -200 }).from(".layer-2", { x: 200 }, "<");
|
|
95
|
+
|
|
96
|
+
// Cleanup — MANDATORY on SPA route unmount
|
|
97
|
+
ScrollTrigger.killAll(); // in component cleanup / router onChange
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## React Integration (`useGSAP`)
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
import { useGSAP } from "@gsap/react";
|
|
106
|
+
import { gsap } from "gsap";
|
|
107
|
+
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
|
108
|
+
import { useRef } from "react";
|
|
109
|
+
|
|
110
|
+
gsap.registerPlugin(ScrollTrigger); // once, outside component
|
|
111
|
+
|
|
112
|
+
export function HeroSection() {
|
|
113
|
+
const container = useRef<HTMLDivElement>(null);
|
|
114
|
+
|
|
115
|
+
useGSAP(() => {
|
|
116
|
+
// ✅ All GSAP code here is automatically scoped & cleaned up
|
|
117
|
+
gsap.from(".hero-title", { y: 60, opacity: 0, duration: 0.8 });
|
|
118
|
+
|
|
119
|
+
gsap.from(".hero-card", {
|
|
120
|
+
scrollTrigger: { trigger: ".hero-card", start: "top 80%" },
|
|
121
|
+
y: 40, opacity: 0, stagger: 0.1,
|
|
122
|
+
});
|
|
123
|
+
}, { scope: container, dependencies: [] }); // re-runs when dependencies change
|
|
124
|
+
|
|
125
|
+
return <div ref={container}><h1 className="hero-title">...</h1></div>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// With cleanup for dynamic content:
|
|
129
|
+
useGSAP(() => {
|
|
130
|
+
const ctx = gsap.context(() => {
|
|
131
|
+
gsap.from(".item", { opacity: 0, stagger: 0.05 });
|
|
132
|
+
}, container);
|
|
133
|
+
return () => ctx.revert(); // explicit cleanup if needed beyond useGSAP scope
|
|
134
|
+
}, { scope: container, dependencies: [items] });
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Responsive Animations (`gsap.matchMedia`)
|
|
140
|
+
|
|
141
|
+
```javascript
|
|
142
|
+
// Replaces window.matchMedia listeners + resize handlers
|
|
143
|
+
const mm = gsap.matchMedia();
|
|
144
|
+
|
|
145
|
+
mm.add("(min-width: 768px)", () => {
|
|
146
|
+
gsap.to(".sidebar", { x: 0, duration: 0.5 });
|
|
147
|
+
// Return cleanup function
|
|
148
|
+
return () => gsap.set(".sidebar", { x: -300 });
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
mm.add("(max-width: 767px)", () => {
|
|
152
|
+
gsap.to(".mobile-menu", { y: 0, duration: 0.4 });
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// In React — use inside useGSAP
|
|
156
|
+
useGSAP(() => {
|
|
157
|
+
const mm = gsap.matchMedia();
|
|
158
|
+
mm.add("(prefers-reduced-motion: no-preference)", () => {
|
|
159
|
+
gsap.from(".hero", { y: 100, duration: 1 });
|
|
160
|
+
});
|
|
161
|
+
mm.add("(prefers-reduced-motion: reduce)", () => {
|
|
162
|
+
gsap.set(".hero", { opacity: 1 }); // instant, no animation
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Plugin Reference
|
|
170
|
+
|
|
171
|
+
| Plugin | Use For | Registration |
|
|
172
|
+
|--------|---------|-------------|
|
|
173
|
+
| `ScrollTrigger` | Scroll-driven animations | `gsap.registerPlugin(ScrollTrigger)` |
|
|
174
|
+
| `ScrollSmoother` | Smooth native scroll momentum | Requires `ScrollTrigger` + Club GSAP |
|
|
175
|
+
| `Flip` | Stateful layout morphing (FLIP technique) | `gsap.registerPlugin(Flip)` |
|
|
176
|
+
| `Draggable` | Interactive drag/sort/resize | `gsap.registerPlugin(Draggable)` |
|
|
177
|
+
| `SplitText` | Character/word/line text splits | Call `.revert()` after use to prevent SEO damage |
|
|
178
|
+
| `DrawSVG` | SVG stroke-dasharray animations | Club GSAP |
|
|
179
|
+
| `MorphSVG` | SVG path morphing | Club GSAP |
|
|
180
|
+
| `ScrollToPlugin` | Programmatic scroll-to | `gsap.registerPlugin(ScrollToPlugin)` |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Performance Rules
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
✅ Animate: x, y, scale, rotation, skewX/Y, opacity (GPU composited transforms)
|
|
188
|
+
❌ Never: width, height, top, left, padding, margin (triggers layout/paint)
|
|
189
|
+
✅ Use willChange: "transform" on elements that will animate
|
|
190
|
+
✅ overwrite: "auto" to kill conflicting tweens automatically
|
|
191
|
+
✅ ScrollTrigger.batch() for lists — NOT 1 instance per item
|
|
192
|
+
✅ gsap.ticker.lagSmoothing(0) in high-framerate contexts (optional)
|
|
193
|
+
❌ Don't animate SVG path 'd' attribute directly — use MorphSVG plugin
|
|
194
|
+
```
|
|
@@ -1,216 +1,104 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: i18n-localization
|
|
3
|
-
description: Internationalization and localization
|
|
3
|
+
description: Internationalization (i18n) and localization mastery. Abstracting hardcoded strings, managing JSON/YAML translation dictionaries, bidirectional routing (RTL support for Arabic/Hebrew), Pluralization algorithms, date/currency formatting, and SSR locale detection in Next.js/React. Use when preparing an application for global multilingual scaling.
|
|
4
4
|
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version:
|
|
6
|
-
last-updated: 2026-
|
|
5
|
+
version: 2.0.0
|
|
6
|
+
last-updated: 2026-04-02
|
|
7
7
|
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
11
|
-
|
|
12
|
-
> Internationalization (i18n) is preparing code to support multiple languages.
|
|
13
|
-
> Localization (l10n) is the work of adapting to a specific locale.
|
|
14
|
-
> Do i18n once, properly. Do l10n for each market.
|
|
10
|
+
# i18n & Localization — Global Scale Mastery
|
|
15
11
|
|
|
16
12
|
---
|
|
17
13
|
|
|
18
|
-
## The
|
|
19
|
-
|
|
20
|
-
Every user-visible string in the source code is a localization problem waiting to happen.
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
// ❌ Hardcoded — untranslatable
|
|
24
|
-
<button>Save Changes</button>
|
|
25
|
-
<p>You have {count} messages</p>
|
|
26
|
-
<p>Error: Invalid email address</p>
|
|
14
|
+
## 1. The i18n Architecture (Next.js / React)
|
|
27
15
|
|
|
28
|
-
|
|
29
|
-
<button>{t('common.save')}</button>
|
|
30
|
-
<p>{t('inbox.messageCount', { count })}</p>
|
|
31
|
-
<p>{t('errors.invalidEmail')}</p>
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Translation File Structure
|
|
37
|
-
|
|
38
|
-
Organize translation keys hierarchically — flat files become unmaintainable past ~50 keys:
|
|
16
|
+
Do not hardcode strings inside UI components. Use a standardized library (e.g., `next-intl` or `react-i18next`).
|
|
39
17
|
|
|
18
|
+
### Step 1: Dictionary Abstraction
|
|
40
19
|
```json
|
|
41
|
-
// en.json
|
|
20
|
+
// messages/en.json
|
|
42
21
|
{
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"loading": "Loading…",
|
|
47
|
-
"error": "Something went wrong"
|
|
48
|
-
},
|
|
49
|
-
"auth": {
|
|
50
|
-
"login": "Sign In",
|
|
51
|
-
"logout": "Sign Out",
|
|
52
|
-
"register": "Create Account",
|
|
53
|
-
"errors": {
|
|
54
|
-
"invalidEmail": "Enter a valid email address",
|
|
55
|
-
"passwordTooShort": "Password must be at least {{min}} characters"
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
"inbox": {
|
|
59
|
-
"messageCount_one": "{{count}} message",
|
|
60
|
-
"messageCount_other": "{{count}} messages"
|
|
22
|
+
"Dashboard": {
|
|
23
|
+
"welcomeMessage": "Welcome back, {name}!",
|
|
24
|
+
"unreadAlerts": "{count, plural, =0 {No unread alerts} one {You have 1 unread alert} other {You have # unread alerts}}"
|
|
61
25
|
}
|
|
62
26
|
}
|
|
63
27
|
```
|
|
64
28
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
## Pluralization
|
|
73
|
-
|
|
74
|
-
Pluralization rules differ per language. Use your i18n library's plural system — never manual `if count > 1`:
|
|
75
|
-
|
|
76
|
-
```ts
|
|
77
|
-
// ❌ Only works for English
|
|
78
|
-
const label = count === 1 ? 'message' : 'messages';
|
|
79
|
-
|
|
80
|
-
// ✅ i18next handles per-language plural rules
|
|
81
|
-
t('inbox.messageCount', { count })
|
|
29
|
+
### Step 2: Component Implementation
|
|
30
|
+
```tsx
|
|
31
|
+
// ❌ BAD: Hardcoded English text and manual variable interpolation
|
|
32
|
+
export function Header({ user, alertCount }) {
|
|
33
|
+
return <h1>Welcome back, {user.name}! You have {alertCount} alerts.</h1>;
|
|
34
|
+
}
|
|
82
35
|
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
36
|
+
// ✅ GOOD: i18n Abstraction (using next-intl)
|
|
37
|
+
import { useTranslations } from 'next-intl';
|
|
38
|
+
|
|
39
|
+
export function Header({ user, alertCount }) {
|
|
40
|
+
const t = useTranslations('Dashboard');
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<header>
|
|
44
|
+
<h1>{t('welcomeMessage', { name: user.name })}</h1>
|
|
45
|
+
<p>{t('unreadAlerts', { count: alertCount })}</p>
|
|
46
|
+
</header>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
87
49
|
```
|
|
88
50
|
|
|
89
51
|
---
|
|
90
52
|
|
|
91
|
-
##
|
|
92
|
-
|
|
93
|
-
Never format these manually. Use the browser's `Intl` API:
|
|
94
|
-
|
|
95
|
-
```ts
|
|
96
|
-
// Date
|
|
97
|
-
const date = new Date();
|
|
98
|
-
new Intl.DateTimeFormat('en-US').format(date); // "2/20/2026"
|
|
99
|
-
new Intl.DateTimeFormat('de-DE').format(date); // "20.2.2026"
|
|
100
|
-
|
|
101
|
-
// Number
|
|
102
|
-
new Intl.NumberFormat('en-US').format(1234567.89); // "1,234,567.89"
|
|
103
|
-
new Intl.NumberFormat('de-DE').format(1234567.89); // "1.234.567,89"
|
|
104
|
-
|
|
105
|
-
// Currency
|
|
106
|
-
new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(99.99);
|
|
107
|
-
// "$99.99"
|
|
108
|
-
new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(99.99);
|
|
109
|
-
// "99,99 €"
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
53
|
+
## 2. Advanced Native Formatting (`Intl`)
|
|
113
54
|
|
|
114
|
-
|
|
55
|
+
Do not install `moment.js` or write massive regex string parsers to format currencies in Euros vs Dollars. The browser handles this natively with the `Intl` API.
|
|
115
56
|
|
|
116
|
-
|
|
57
|
+
```typescript
|
|
58
|
+
// Data/Currency Formatting correctly tied to the active locale
|
|
59
|
+
const locale = 'de-DE';
|
|
117
60
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
61
|
+
// ✅ Currency
|
|
62
|
+
const price = new Intl.NumberFormat(locale, { style: 'currency', currency: 'EUR' }).format(1200.50);
|
|
63
|
+
// Output in Germany: "1.200,50 €"
|
|
121
64
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
65
|
+
// ✅ Dates
|
|
66
|
+
const date = new Intl.DateTimeFormat(locale, { dateStyle: 'full' }).format(new Date());
|
|
67
|
+
// Output in Germany: "Freitag, 2. April 2026"
|
|
125
68
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
padding-left: 1rem;
|
|
130
|
-
margin-right: 2rem;
|
|
131
|
-
border-left: 2px solid;
|
|
132
|
-
|
|
133
|
-
/* ✅ Logical: works for both LTR and RTL */
|
|
134
|
-
padding-inline-start: 1rem;
|
|
135
|
-
margin-inline-end: 2rem;
|
|
136
|
-
border-inline-start: 2px solid;
|
|
69
|
+
// ✅ Relative Time
|
|
70
|
+
const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
|
|
71
|
+
rtf.format(-2, 'day'); // Output: "vorgestern" (the day before yesterday)
|
|
137
72
|
```
|
|
138
73
|
|
|
139
74
|
---
|
|
140
75
|
|
|
141
|
-
##
|
|
142
|
-
|
|
143
|
-
Look for:
|
|
144
|
-
- JSX text content directly in tags: `<p>some text</p>` (not `<p>{t(...)}</p>`)
|
|
145
|
-
- Template literals with user-facing copy: `` `Welcome, ${name}!` ``
|
|
146
|
-
- Alert/toast calls with string literals: `toast.success('Saved!')`
|
|
147
|
-
- Error messages: `new Error('Invalid input')` shown to users
|
|
148
|
-
- `placeholder`, `aria-label`, `title` attributes hardcoded
|
|
149
|
-
|
|
150
|
-
---
|
|
76
|
+
## 3. Bidirectional Architecture (RTL)
|
|
151
77
|
|
|
152
|
-
|
|
78
|
+
For languages like Arabic and Hebrew, the UI must fundamentally flip horizontally. Right-To-Left (RTL) breaks standard CSS `marginLeft` and `marginRight`.
|
|
153
79
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
| `scripts/i18n_checker.py` | Scans codebase for hardcoded strings | `python scripts/i18n_checker.py <project_path>` |
|
|
80
|
+
**The Solution:** Logical CSS Properties.
|
|
81
|
+
Tailwind v4 (and modern CSS) natively supports logical direction.
|
|
157
82
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
When this skill produces a recommendation or design decision, structure your output as:
|
|
83
|
+
```css
|
|
84
|
+
/* ❌ BAD: Hardcoded physical space */
|
|
85
|
+
.btn { margin-left: 10px; } /* Will break layout in Hebrew */
|
|
163
86
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
Decision: [what was chosen / proposed]
|
|
167
|
-
Rationale: [why — one concise line]
|
|
168
|
-
Trade-offs: [what is consciously accepted]
|
|
169
|
-
Next action: [concrete next step for the user]
|
|
170
|
-
─────────────────────────────────────────────────
|
|
171
|
-
Pre-Flight: ✅ All checks passed
|
|
172
|
-
or ❌ [blocking item that must be resolved first]
|
|
87
|
+
/* ✅ GOOD: Logical spacing (Tailwind: ms-4, me-4) */
|
|
88
|
+
.btn { margin-inline-start: 10px; } /* Automatically flips in RTL mode */
|
|
173
89
|
```
|
|
174
90
|
|
|
175
|
-
|
|
91
|
+
*In React HTML tag:* `<html lang="ar" dir="rtl">`
|
|
176
92
|
|
|
177
93
|
---
|
|
178
94
|
|
|
179
|
-
##
|
|
95
|
+
## 4. Routing and SSR Detection
|
|
180
96
|
|
|
181
|
-
|
|
97
|
+
Users should not face English UI natively in Japan. Detect their browser headers at the edge routing layer.
|
|
182
98
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
99
|
+
In Next.js Middleware:
|
|
100
|
+
1. Parse the incoming `Accept-Language` header.
|
|
101
|
+
2. Intercept requests to `/dashboard`.
|
|
102
|
+
3. Rewrite URL to the detected locale (e.g., `/ja/dashboard`).
|
|
188
103
|
|
|
189
104
|
---
|
|
190
|
-
|
|
191
|
-
## 🏛️ Tribunal Integration (Anti-Hallucination)
|
|
192
|
-
|
|
193
|
-
**Slash command: `/review` or `/tribunal-full`**
|
|
194
|
-
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
195
|
-
|
|
196
|
-
### ❌ Forbidden AI Tropes
|
|
197
|
-
|
|
198
|
-
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
199
|
-
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
200
|
-
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
201
|
-
|
|
202
|
-
### ✅ Pre-Flight Self-Audit
|
|
203
|
-
|
|
204
|
-
Review these questions before confirming output:
|
|
205
|
-
```
|
|
206
|
-
✅ Did I rely ONLY on real, verified tools and methods?
|
|
207
|
-
✅ Is this solution appropriately scoped to the user's constraints?
|
|
208
|
-
✅ Did I handle potential failure modes and edge cases?
|
|
209
|
-
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
213
|
-
|
|
214
|
-
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
215
|
-
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
216
|
-
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|