@jaimevalasek/aioson 1.6.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +729 -232
  3. package/docs/design-previews/pt.squarespace.com-homepage.html +889 -0
  4. package/docs/integrations/sdlc-genius-boundary.md +76 -0
  5. package/docs/integrations/sdlc-genius-eval-matrix.md +75 -0
  6. package/docs/integrations/sdlc-genius-install-checklist.md +93 -0
  7. package/docs/integrations/sdlc-genius-review-samples.md +86 -0
  8. package/docs/pt/README.md +3 -0
  9. package/docs/pt/agentes.md +1 -0
  10. package/docs/pt/comandos-cli.md +888 -2
  11. package/docs/pt/design-hybrid-forge.md +255 -6
  12. package/docs/pt/devlog-pipeline.md +270 -0
  13. package/docs/pt/fluxo-artefatos.md +178 -0
  14. package/docs/pt/hooks-session-guard.md +454 -0
  15. package/docs/pt/monitor-de-contexto.md +59 -5
  16. package/docs/pt/sdd-automation-scripts.md +557 -0
  17. package/docs/pt/site-forge.md +309 -0
  18. package/docs/pt/spec-learnings-pipeline.md +265 -0
  19. package/package.json +1 -1
  20. package/src/a2a/client.js +165 -0
  21. package/src/a2a/server.js +223 -0
  22. package/src/cli.js +235 -1
  23. package/src/commands/agent-audit.js +397 -0
  24. package/src/commands/agent-export-skill.js +229 -0
  25. package/src/commands/artifact-validate.js +189 -0
  26. package/src/commands/brief-gen.js +405 -0
  27. package/src/commands/brief-validate.js +65 -0
  28. package/src/commands/classify.js +256 -0
  29. package/src/commands/context-compact.js +49 -0
  30. package/src/commands/context-health.js +175 -0
  31. package/src/commands/context-monitor.js +71 -0
  32. package/src/commands/context-trim.js +177 -0
  33. package/src/commands/detect-test-runner.js +55 -0
  34. package/src/commands/devlog-export-brains.js +27 -0
  35. package/src/commands/devlog-process.js +292 -0
  36. package/src/commands/devlog-watch.js +131 -0
  37. package/src/commands/feature-close.js +165 -0
  38. package/src/commands/gate-check.js +228 -0
  39. package/src/commands/hooks-emit.js +253 -0
  40. package/src/commands/hooks-install.js +347 -0
  41. package/src/commands/learning-auto-promote.js +195 -0
  42. package/src/commands/learning-evolve.js +18 -9
  43. package/src/commands/learning-export.js +103 -0
  44. package/src/commands/learning-rollback.js +164 -0
  45. package/src/commands/live.js +25 -1
  46. package/src/commands/pattern-detect.js +33 -0
  47. package/src/commands/preflight-context.js +30 -0
  48. package/src/commands/preflight.js +208 -0
  49. package/src/commands/pulse-update.js +130 -0
  50. package/src/commands/runner-daemon.js +274 -0
  51. package/src/commands/runner-plan.js +70 -0
  52. package/src/commands/runner-queue-from-plan.js +166 -0
  53. package/src/commands/runner-queue.js +189 -0
  54. package/src/commands/runner-run.js +129 -0
  55. package/src/commands/runtime.js +47 -1
  56. package/src/commands/self-implement-loop.js +256 -0
  57. package/src/commands/session-guard.js +218 -0
  58. package/src/commands/sizing.js +165 -0
  59. package/src/commands/skill.js +65 -0
  60. package/src/commands/spec-checkpoint.js +177 -0
  61. package/src/commands/spec-status.js +79 -0
  62. package/src/commands/spec-sync.js +190 -0
  63. package/src/commands/spec-tasks.js +288 -0
  64. package/src/commands/squad-autorun.js +1220 -0
  65. package/src/commands/squad-bus.js +217 -0
  66. package/src/commands/squad-card.js +149 -0
  67. package/src/commands/squad-daemon.js +134 -0
  68. package/src/commands/squad-dependency-graph.js +164 -0
  69. package/src/commands/squad-review.js +106 -0
  70. package/src/commands/squad-scaffold.js +55 -0
  71. package/src/commands/squad-tool-register.js +157 -0
  72. package/src/commands/state-save.js +122 -0
  73. package/src/commands/update.js +2 -0
  74. package/src/commands/verify-gate.js +572 -0
  75. package/src/commands/workflow-execute.js +241 -0
  76. package/src/constants.js +22 -0
  77. package/src/install-profile.js +2 -2
  78. package/src/install-wizard.js +3 -2
  79. package/src/installer.js +6 -0
  80. package/src/lib/health-check.js +158 -0
  81. package/src/lib/hook-protocol.js +76 -0
  82. package/src/mcp/apps/squad-dashboard/app.js +163 -0
  83. package/src/mcp/apps/squad-dashboard/index.html +261 -0
  84. package/src/mcp/apps/squad-dashboard/mcp-manifest.json +23 -0
  85. package/src/mcp/resources/squad-state.js +130 -0
  86. package/src/preflight-engine.js +443 -0
  87. package/src/runner/cascade.js +97 -0
  88. package/src/runner/cli-launcher.js +109 -0
  89. package/src/runner/plan-importer.js +63 -0
  90. package/src/runner/queue-store.js +159 -0
  91. package/src/runtime-store.js +61 -3
  92. package/src/squad/agent-teams-adapter.js +264 -0
  93. package/src/squad/brief-validator.js +350 -0
  94. package/src/squad/bus-bridge.js +140 -0
  95. package/src/squad/context-compactor.js +265 -0
  96. package/src/squad/cross-ai-synthesizer.js +250 -0
  97. package/src/squad/hooks-generator.js +196 -0
  98. package/src/squad/inter-squad-events.js +175 -0
  99. package/src/squad/intra-bus.js +345 -0
  100. package/src/squad/learning-extractor.js +213 -0
  101. package/src/squad/pattern-detector.js +365 -0
  102. package/src/squad/preflight-context.js +296 -0
  103. package/src/squad/recovery-context.js +242 -71
  104. package/src/squad/reflection.js +365 -0
  105. package/src/squad/squad-scaffold.js +177 -0
  106. package/src/squad/state-manager.js +310 -0
  107. package/src/squad/task-decomposer.js +652 -0
  108. package/src/squad/verify-gate.js +303 -0
  109. package/src/updater.js +4 -5
  110. package/src/worker-runner.js +186 -1
  111. package/template/.aioson/agents/analyst.md +62 -1
  112. package/template/.aioson/agents/architect.md +61 -1
  113. package/template/.aioson/agents/copywriter.md +463 -0
  114. package/template/.aioson/agents/design-hybrid-forge.md +14 -0
  115. package/template/.aioson/agents/dev.md +271 -25
  116. package/template/.aioson/agents/deyvin.md +67 -8
  117. package/template/.aioson/agents/discovery-design-doc.md +44 -0
  118. package/template/.aioson/agents/genome.md +14 -0
  119. package/template/.aioson/agents/neo.md +83 -2
  120. package/template/.aioson/agents/orache.md +50 -4
  121. package/template/.aioson/agents/orchestrator.md +197 -1
  122. package/template/.aioson/agents/pm.md +35 -0
  123. package/template/.aioson/agents/product.md +50 -5
  124. package/template/.aioson/agents/profiler-enricher.md +14 -0
  125. package/template/.aioson/agents/profiler-forge.md +14 -0
  126. package/template/.aioson/agents/profiler-researcher.md +14 -0
  127. package/template/.aioson/agents/qa.md +273 -21
  128. package/template/.aioson/agents/setup.md +96 -10
  129. package/template/.aioson/agents/sheldon.md +131 -6
  130. package/template/.aioson/agents/site-forge.md +1753 -0
  131. package/template/.aioson/agents/squad.md +352 -0
  132. package/template/.aioson/agents/tester.md +53 -0
  133. package/template/.aioson/agents/ux-ui.md +203 -4
  134. package/template/.aioson/brains/README.md +128 -0
  135. package/template/.aioson/brains/_index.json +16 -0
  136. package/template/.aioson/brains/scripts/query.js +103 -0
  137. package/template/.aioson/brains/site-forge/visual-patterns.brain.json +205 -0
  138. package/template/.aioson/config.md +143 -13
  139. package/template/.aioson/constitution.md +33 -0
  140. package/template/.aioson/context/project-pulse.md +34 -0
  141. package/template/.aioson/docs/LAYERS.md +79 -0
  142. package/template/.aioson/docs/README.md +76 -0
  143. package/template/.aioson/docs/example-external-api-context.md +72 -0
  144. package/template/.aioson/genomes/copywriting.md +204 -0
  145. package/template/.aioson/locales/en/agents/architect.md +17 -0
  146. package/template/.aioson/locales/en/agents/dev.md +79 -13
  147. package/template/.aioson/locales/en/agents/orache.md +6 -0
  148. package/template/.aioson/locales/en/agents/orchestrator.md +24 -0
  149. package/template/.aioson/locales/en/agents/product.md +50 -0
  150. package/template/.aioson/locales/en/agents/sheldon.md +115 -0
  151. package/template/.aioson/locales/en/agents/squad.md +14 -0
  152. package/template/.aioson/locales/en/agents/tester.md +6 -0
  153. package/template/.aioson/locales/es/agents/analyst.md +2 -0
  154. package/template/.aioson/locales/es/agents/architect.md +19 -0
  155. package/template/.aioson/locales/es/agents/dev.md +64 -4
  156. package/template/.aioson/locales/es/agents/deyvin.md +2 -0
  157. package/template/.aioson/locales/es/agents/discovery-design-doc.md +2 -0
  158. package/template/.aioson/locales/es/agents/genome.md +2 -0
  159. package/template/.aioson/locales/es/agents/neo.md +2 -0
  160. package/template/.aioson/locales/es/agents/orache.md +2 -0
  161. package/template/.aioson/locales/es/agents/orchestrator.md +26 -0
  162. package/template/.aioson/locales/es/agents/pair.md +2 -0
  163. package/template/.aioson/locales/es/agents/pm.md +2 -0
  164. package/template/.aioson/locales/es/agents/product.md +52 -0
  165. package/template/.aioson/locales/es/agents/profiler-enricher.md +2 -0
  166. package/template/.aioson/locales/es/agents/profiler-forge.md +2 -0
  167. package/template/.aioson/locales/es/agents/profiler-researcher.md +2 -0
  168. package/template/.aioson/locales/es/agents/qa.md +2 -0
  169. package/template/.aioson/locales/es/agents/setup.md +2 -0
  170. package/template/.aioson/locales/es/agents/sheldon.md +117 -0
  171. package/template/.aioson/locales/es/agents/squad.md +16 -0
  172. package/template/.aioson/locales/es/agents/tester.md +9 -0
  173. package/template/.aioson/locales/es/agents/ux-ui.md +2 -0
  174. package/template/.aioson/locales/fr/agents/analyst.md +2 -0
  175. package/template/.aioson/locales/fr/agents/architect.md +19 -0
  176. package/template/.aioson/locales/fr/agents/dev.md +64 -4
  177. package/template/.aioson/locales/fr/agents/deyvin.md +2 -0
  178. package/template/.aioson/locales/fr/agents/discovery-design-doc.md +2 -0
  179. package/template/.aioson/locales/fr/agents/genome.md +2 -0
  180. package/template/.aioson/locales/fr/agents/neo.md +2 -0
  181. package/template/.aioson/locales/fr/agents/orache.md +2 -0
  182. package/template/.aioson/locales/fr/agents/orchestrator.md +26 -0
  183. package/template/.aioson/locales/fr/agents/pair.md +2 -0
  184. package/template/.aioson/locales/fr/agents/pm.md +2 -0
  185. package/template/.aioson/locales/fr/agents/product.md +52 -0
  186. package/template/.aioson/locales/fr/agents/profiler-enricher.md +2 -0
  187. package/template/.aioson/locales/fr/agents/profiler-forge.md +2 -0
  188. package/template/.aioson/locales/fr/agents/profiler-researcher.md +2 -0
  189. package/template/.aioson/locales/fr/agents/qa.md +2 -0
  190. package/template/.aioson/locales/fr/agents/setup.md +2 -0
  191. package/template/.aioson/locales/fr/agents/sheldon.md +117 -0
  192. package/template/.aioson/locales/fr/agents/squad.md +16 -0
  193. package/template/.aioson/locales/fr/agents/tester.md +9 -0
  194. package/template/.aioson/locales/fr/agents/ux-ui.md +2 -0
  195. package/template/.aioson/locales/pt-BR/agents/analyst.md +64 -3
  196. package/template/.aioson/locales/pt-BR/agents/architect.md +42 -0
  197. package/template/.aioson/locales/pt-BR/agents/dev.md +147 -14
  198. package/template/.aioson/locales/pt-BR/agents/deyvin.md +47 -0
  199. package/template/.aioson/locales/pt-BR/agents/neo.md +62 -1
  200. package/template/.aioson/locales/pt-BR/agents/orchestrator.md +158 -2
  201. package/template/.aioson/locales/pt-BR/agents/pm.md +95 -1
  202. package/template/.aioson/locales/pt-BR/agents/product.md +145 -18
  203. package/template/.aioson/locales/pt-BR/agents/qa.md +16 -0
  204. package/template/.aioson/locales/pt-BR/agents/setup.md +101 -18
  205. package/template/.aioson/locales/pt-BR/agents/sheldon.md +132 -1
  206. package/template/.aioson/locales/pt-BR/agents/squad.md +14 -0
  207. package/template/.aioson/locales/pt-BR/agents/tester.md +449 -0
  208. package/template/.aioson/rules/README.md +69 -0
  209. package/template/.aioson/rules/data-format-convention.md +136 -0
  210. package/template/.aioson/rules/example-monetary-values.md +30 -0
  211. package/template/.aioson/schemas/squad-manifest.schema.json +124 -3
  212. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +2 -0
  213. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -0
  214. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +66 -0
  215. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +368 -0
  216. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -0
  217. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -0
  218. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -0
  219. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +165 -0
  220. package/template/.aioson/skills/marketing/references/anti-patterns.md +254 -0
  221. package/template/.aioson/skills/marketing/references/fascinations.md +192 -0
  222. package/template/.aioson/skills/marketing/references/five-acts.md +248 -0
  223. package/template/.aioson/skills/marketing/references/market-intelligence.md +198 -0
  224. package/template/.aioson/skills/marketing/references/offer-structure.md +203 -0
  225. package/template/.aioson/skills/marketing/references/one-belief.md +149 -0
  226. package/template/.aioson/skills/marketing/references/patterns.md +218 -0
  227. package/template/.aioson/skills/marketing/references/pms-research.md +193 -0
  228. package/template/.aioson/skills/marketing/vsl-craft.md +385 -0
  229. package/template/.aioson/skills/process/aioson-spec-driven/SKILL.md +1 -0
  230. package/template/.aioson/skills/process/aioson-spec-driven/references/analyst.md +30 -0
  231. package/template/.aioson/skills/process/aioson-spec-driven/references/architect.md +23 -0
  232. package/template/.aioson/skills/process/aioson-spec-driven/references/dev.md +47 -0
  233. package/template/.aioson/skills/process/aioson-spec-driven/references/deyvin.md +27 -0
  234. package/template/.aioson/skills/process/aioson-spec-driven/references/maintenance-and-state.md +35 -0
  235. package/template/.aioson/skills/process/aioson-spec-driven/references/product.md +25 -0
  236. package/template/.aioson/skills/process/aioson-spec-driven/references/qa.md +30 -0
  237. package/template/.aioson/skills/process/aioson-spec-driven/references/sheldon.md +25 -0
  238. package/template/.aioson/skills/process/design-hybrid-forge/SKILL.md +4 -1
  239. package/template/.aioson/skills/process/design-hybrid-forge/references/output-contract.md +15 -0
  240. package/template/.aioson/skills/process/design-hybrid-forge/references/pair-compatibility.md +32 -0
  241. package/template/.aioson/skills/process/design-hybrid-forge/references/quality-gates.md +20 -0
  242. package/template/.aioson/skills/process/simplify/SKILL.md +173 -0
  243. package/template/.aioson/skills/static/context-budget-guide.md +46 -0
  244. package/template/.aioson/skills/static/harness-sensors.md +74 -0
  245. package/template/.aioson/skills/static/landing-page-deploy.md +192 -0
  246. package/template/.aioson/skills/static/landing-page-forge.md +730 -0
  247. package/template/.aioson/skills/static/multi-agent-patterns.md +43 -0
  248. package/template/.aioson/skills/static/react-motion-patterns.md +22 -0
  249. package/template/.aioson/skills/static/static-html-patterns/checklists.md +43 -0
  250. package/template/.aioson/skills/static/static-html-patterns/css-tokens.md +609 -0
  251. package/template/.aioson/skills/static/static-html-patterns/motion.md +193 -0
  252. package/template/.aioson/skills/static/static-html-patterns/premium.md +711 -0
  253. package/template/.aioson/skills/static/static-html-patterns/structure.md +209 -0
  254. package/template/.aioson/skills/static/static-html-patterns/utilities.md +190 -0
  255. package/template/.aioson/skills/static/static-html-patterns.md +58 -1913
  256. package/template/.aioson/skills/static/threejs-patterns.md +929 -0
  257. package/template/.aioson/skills/static/ui-ux-modern.md +1 -0
  258. package/template/.aioson/skills/static/web-research-cache.md +112 -0
  259. package/template/.aioson/tasks/implementation-plan.md +21 -1
  260. package/template/.aioson/tasks/squad-create.md +22 -0
  261. package/template/.aioson/tasks/squad-design.md +30 -0
  262. package/template/.aioson/templates/squads/digital-marketing-agency/template.json +96 -0
  263. package/template/.claude/commands/aioson/agent/design-hybrid-forge.md +5 -0
  264. package/template/.claude/commands/aioson/agent/orache.md +5 -0
  265. package/template/.claude/commands/aioson/agent/sheldon.md +5 -0
  266. package/template/.claude/commands/aioson/agent/site-forge.md +5 -0
  267. package/template/AGENTS.md +55 -3
  268. package/template/CLAUDE.md +31 -0
  269. package/template/OPENCODE.md +4 -0
  270. package/template/researchs/.gitkeep +0 -0
  271. package/template/.aioson/skills/design-system/components/SKILL.md:Zone.Identifier +0 -0
  272. package/template/.aioson/skills/design-system/dashboards/SKILL.md:Zone.Identifier +0 -0
  273. package/template/.aioson/skills/design-system/foundations/SKILL.md:Zone.Identifier +0 -0
  274. package/template/.aioson/skills/design-system/motion/SKILL.md:Zone.Identifier +0 -0
  275. package/template/.aioson/skills/design-system/patterns/SKILL.md:Zone.Identifier +0 -0
@@ -0,0 +1,711 @@
1
+ # Premium Template Patterns (Aigocy-style)
2
+
3
+ > Load when the user wants an "award-worthy" result or explicitly asks for premium,
4
+ > cinematic, or production-agency quality patterns. These are sourced from a
5
+ > real ThemeForest production template (#61450410).
6
+
7
+ ---
8
+
9
+ ## 14. Premium Template Patterns
10
+
11
+ Real patterns extracted from a production AI agency template (ThemeForest #61450410).
12
+ Use these to elevate landing pages from "nice" to "award-worthy".
13
+
14
+ ---
15
+
16
+ ### 14a. effectFade Animations (signature 3D entrance)
17
+
18
+ Two animation modes used by the Aigocy template — add these classes to any element
19
+ and trigger via GSAP ScrollTrigger or IntersectionObserver.
20
+
21
+ **HTML markup:**
22
+ ```html
23
+ <!-- Simple fade up — most common -->
24
+ <h2 class="effectFade fadeUp" data-delay="0">Headline</h2>
25
+ <p class="effectFade fadeUp" data-delay="0.15">Supporting text</p>
26
+
27
+ <!-- 3D perspective rotate — signature "cinematic" entrance -->
28
+ <div class="effectFade fadeRotateX" data-delay="0.1">Card content</div>
29
+ ```
30
+
31
+ **CSS:**
32
+ ```css
33
+ /* Base state (invisible, ready to animate in) */
34
+ .effectFade { opacity: 0; }
35
+ .effectFade.fadeUp { transform: translateY(50px); }
36
+ .effectFade.fadeRotateX {
37
+ transform: perspective(800px) rotateX(25deg) translateY(40px);
38
+ transform-origin: 50% 0%;
39
+ }
40
+
41
+ /* Animated state (JS adds .animated class) */
42
+ .effectFade.animated {
43
+ opacity: 1;
44
+ transform: none;
45
+ transition: opacity 0.7s ease, transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
46
+ }
47
+ ```
48
+
49
+ **JS (GSAP + data-delay stagger):**
50
+ ```js
51
+ // Use data-delay for precise per-element stagger control
52
+ gsap.utils.toArray('.effectFade').forEach(el => {
53
+ const delay = parseFloat(el.dataset.delay ?? '0');
54
+ gsap.fromTo(el,
55
+ { opacity: 0, y: el.classList.contains('fadeUp') ? 50 : 0,
56
+ rotateX: el.classList.contains('fadeRotateX') ? 25 : 0,
57
+ transformPerspective: 800, transformOrigin: '50% 0%' },
58
+ {
59
+ opacity: 1, y: 0, rotateX: 0,
60
+ duration: 0.8, ease: 'power3.out', delay,
61
+ scrollTrigger: { trigger: el, start: 'top 85%', once: true }
62
+ }
63
+ );
64
+ });
65
+ ```
66
+
67
+ ---
68
+
69
+ ### 14b. Infinite Marquee Logo Rail
70
+
71
+ Seamlessly looping logo strip with CSS animation — no JS needed.
72
+
73
+ **HTML:**
74
+ ```html
75
+ <section class="logos-marquee" aria-label="Trusted by">
76
+ <div class="marquee-track">
77
+ <!-- Original items -->
78
+ <ul class="marquee-list" aria-hidden="false">
79
+ <li><img src="logo-1.svg" alt="Company A" height="32"></li>
80
+ <li><img src="logo-2.svg" alt="Company B" height="32"></li>
81
+ <li><img src="logo-3.svg" alt="Company C" height="32"></li>
82
+ <li><img src="logo-4.svg" alt="Company D" height="32"></li>
83
+ <li><img src="logo-5.svg" alt="Company E" height="32"></li>
84
+ </ul>
85
+ <!-- Cloned items for seamless loop (aria-hidden) -->
86
+ <ul class="marquee-list" aria-hidden="true">
87
+ <!-- same items, duplicated -->
88
+ </ul>
89
+ </div>
90
+ </section>
91
+ ```
92
+
93
+ **CSS:**
94
+ ```css
95
+ .logos-marquee { overflow: hidden; padding: var(--space-xl) 0; }
96
+
97
+ .marquee-track {
98
+ display: flex;
99
+ width: max-content;
100
+ animation: infiniteSlide 24s linear infinite;
101
+ }
102
+
103
+ .marquee-list {
104
+ display: flex; align-items: center; gap: 64px;
105
+ list-style: none; padding: 0 32px;
106
+ }
107
+
108
+ .marquee-list img {
109
+ height: 32px; width: auto;
110
+ filter: grayscale(1) opacity(0.5);
111
+ transition: filter 0.3s ease;
112
+ }
113
+ .marquee-list img:hover {
114
+ filter: grayscale(0) opacity(1);
115
+ }
116
+
117
+ @keyframes infiniteSlide {
118
+ from { transform: translateX(0); }
119
+ to { transform: translateX(-50%); } /* -50% because track = 2× list width */
120
+ }
121
+
122
+ /* Pause on hover for accessibility */
123
+ .logos-marquee:hover .marquee-track { animation-play-state: paused; }
124
+
125
+ @media (prefers-reduced-motion: reduce) {
126
+ .marquee-track { animation: none; }
127
+ }
128
+ ```
129
+
130
+ **JS (optional: auto-clone):**
131
+ ```js
132
+ // Auto-clone the list so you only maintain one set of logos in HTML
133
+ document.querySelectorAll('.marquee-track').forEach(track => {
134
+ const list = track.querySelector('.marquee-list');
135
+ const clone = list.cloneNode(true);
136
+ clone.setAttribute('aria-hidden', 'true');
137
+ track.appendChild(clone);
138
+ });
139
+ ```
140
+
141
+ ---
142
+
143
+ ### 14c. SVG Animated Paths (hub-and-spoke diagram)
144
+
145
+ Dots traveling along SVG paths connecting a center image to surrounding icons.
146
+ Pure SMIL animation — no JS or GSAP needed. Great for "how it works" or "integrations" sections.
147
+
148
+ **HTML:**
149
+ ```html
150
+ <div class="tools-hub" aria-hidden="true">
151
+ <!-- Center image -->
152
+ <div class="hub-center">
153
+ <img src="product-logo.svg" alt="">
154
+ </div>
155
+
156
+ <!-- Surrounding tool icons (positioned absolutely) -->
157
+ <div class="tool-item tool-item--1"><img src="icon-1.svg" alt=""></div>
158
+ <div class="tool-item tool-item--2"><img src="icon-2.svg" alt=""></div>
159
+ <div class="tool-item tool-item--3"><img src="icon-3.svg" alt=""></div>
160
+
161
+ <!-- SVG paths with animated dots -->
162
+ <svg class="hub-svg" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
163
+ <!-- Path from center to tool-1 -->
164
+ <path id="path-1" d="M300 300 C 240 240, 160 200, 100 160" stroke="hsla(265,80%,65%,0.3)" stroke-width="1" fill="none"/>
165
+ <circle r="4" fill="hsl(265,80%,65%)">
166
+ <animateMotion dur="3s" repeatCount="indefinite" begin="0s">
167
+ <mpath href="#path-1"/>
168
+ </animateMotion>
169
+ </circle>
170
+
171
+ <!-- Path from center to tool-2 -->
172
+ <path id="path-2" d="M300 300 C 360 240, 440 200, 500 160" stroke="hsla(265,80%,65%,0.3)" stroke-width="1" fill="none"/>
173
+ <circle r="4" fill="hsl(310,75%,60%)">
174
+ <animateMotion dur="4s" repeatCount="indefinite" begin="1s">
175
+ <mpath href="#path-2"/>
176
+ </animateMotion>
177
+ </circle>
178
+ </svg>
179
+ </div>
180
+ ```
181
+
182
+ **CSS:**
183
+ ```css
184
+ .tools-hub {
185
+ position: relative; width: 600px; height: 600px;
186
+ margin: 0 auto;
187
+ }
188
+ .hub-center {
189
+ position: absolute; top: 50%; left: 50%;
190
+ transform: translate(-50%, -50%);
191
+ width: 120px; height: 120px;
192
+ border-radius: 50%;
193
+ background: var(--bg-surface);
194
+ border: 1px solid var(--border-subtle);
195
+ display: flex; align-items: center; justify-content: center;
196
+ }
197
+ .tool-item {
198
+ position: absolute;
199
+ width: 64px; height: 64px;
200
+ border-radius: var(--radius-md);
201
+ background: var(--bg-elevated);
202
+ border: 1px solid var(--border-faint);
203
+ display: flex; align-items: center; justify-content: center;
204
+ }
205
+ /* Position items around the hub */
206
+ .tool-item--1 { top: 8%; left: 8%; }
207
+ .tool-item--2 { top: 8%; right: 8%; }
208
+ .tool-item--3 { bottom: 8%; left: 50%; transform: translateX(-50%); }
209
+
210
+ .hub-svg {
211
+ position: absolute; inset: 0;
212
+ width: 100%; height: 100%;
213
+ pointer-events: none;
214
+ }
215
+
216
+ @media (max-width: 768px) { .tools-hub { display: none; } /* hide on mobile */ }
217
+ ```
218
+
219
+ ---
220
+
221
+ ### 14d. Scroll-to-top with Circular Progress
222
+
223
+ A back-to-top button that shows reading progress as a circular arc.
224
+ Uses a CSS custom property `--progress-angle` updated by JS.
225
+
226
+ **HTML:**
227
+ ```html
228
+ <button class="scroll-top" id="goTop" aria-label="Back to top" title="Back to top">
229
+ <svg class="scroll-top__ring" viewBox="0 0 48 48" aria-hidden="true">
230
+ <circle class="scroll-top__track" cx="24" cy="24" r="20" fill="none" stroke-width="2"/>
231
+ <circle class="scroll-top__progress" cx="24" cy="24" r="20" fill="none" stroke-width="2"
232
+ style="stroke-dasharray: 125.66; stroke-dashoffset: var(--dash-offset, 125.66)"/>
233
+ </svg>
234
+ <span class="scroll-top__icon" aria-hidden="true">↑</span>
235
+ </button>
236
+ ```
237
+
238
+ **CSS:**
239
+ ```css
240
+ .scroll-top {
241
+ position: fixed; bottom: 32px; right: 32px; z-index: 50;
242
+ width: 48px; height: 48px;
243
+ border-radius: 50%;
244
+ background: var(--bg-surface);
245
+ border: 1px solid var(--border-subtle);
246
+ display: flex; align-items: center; justify-content: center;
247
+ opacity: 0; pointer-events: none;
248
+ transition: opacity 0.3s ease, transform 0.2s ease;
249
+ }
250
+ .scroll-top.visible { opacity: 1; pointer-events: auto; }
251
+ .scroll-top:hover { transform: translateY(-2px); }
252
+
253
+ .scroll-top__ring {
254
+ position: absolute; inset: 0;
255
+ transform: rotate(-90deg); /* start progress from top */
256
+ }
257
+ .scroll-top__track { stroke: var(--border-faint); }
258
+ .scroll-top__progress {
259
+ stroke: var(--accent-primary);
260
+ transition: stroke-dashoffset 0.1s linear;
261
+ }
262
+ .scroll-top__icon {
263
+ font-size: 18px; font-weight: 700;
264
+ color: var(--text-primary); line-height: 1;
265
+ }
266
+ ```
267
+
268
+ **JS:**
269
+ ```js
270
+ const goTop = document.getElementById('goTop');
271
+ const progressCircle = goTop?.querySelector('.scroll-top__progress');
272
+ const circumference = 125.66; // 2π × r (r=20)
273
+
274
+ window.addEventListener('scroll', () => {
275
+ const scrolled = window.scrollY;
276
+ const total = document.body.scrollHeight - window.innerHeight;
277
+ const progress = scrolled / total;
278
+ const offset = circumference * (1 - progress);
279
+
280
+ goTop?.classList.toggle('visible', scrolled > 300);
281
+ progressCircle?.style.setProperty('--dash-offset', offset);
282
+ }, { passive: true });
283
+
284
+ goTop?.addEventListener('click', () =>
285
+ window.scrollTo({ top: 0, behavior: 'smooth' })
286
+ );
287
+ ```
288
+
289
+ ---
290
+
291
+ ### 14e. Split Swiper (synchronized text + image sliders)
292
+
293
+ Two separate Swiper instances that scroll together — one shows testimonial text,
294
+ the other shows the matching portrait. Classic premium agency pattern.
295
+
296
+ **HTML:**
297
+ ```html
298
+ <section class="split-testimonials">
299
+ <div class="container split-testimonials__grid">
300
+ <!-- Left: text slides -->
301
+ <div class="swiper testimonials-text-swiper">
302
+ <div class="swiper-wrapper">
303
+ <div class="swiper-slide">
304
+ <blockquote class="split-quote">
305
+ <p>"This is the most impactful tool we've adopted this year. Our team velocity doubled."</p>
306
+ <footer>
307
+ <cite class="split-quote__name">Maria Silva</cite>
308
+ <span class="split-quote__role">CTO, Acme Corp</span>
309
+ </footer>
310
+ </blockquote>
311
+ </div>
312
+ <!-- more slides -->
313
+ </div>
314
+ <div class="split-testimonials__controls">
315
+ <button class="swiper-button-prev" aria-label="Previous testimonial"></button>
316
+ <div class="swiper-pagination"></div>
317
+ <button class="swiper-button-next" aria-label="Next testimonial"></button>
318
+ </div>
319
+ </div>
320
+
321
+ <!-- Right: image slides (synchronized) -->
322
+ <div class="swiper testimonials-image-swiper">
323
+ <div class="swiper-wrapper">
324
+ <div class="swiper-slide">
325
+ <img src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=480&h=560&fit=crop&crop=face"
326
+ alt="Maria Silva" loading="lazy">
327
+ </div>
328
+ <!-- more slides -->
329
+ </div>
330
+ </div>
331
+ </div>
332
+ </section>
333
+ ```
334
+
335
+ **CSS:**
336
+ ```css
337
+ .split-testimonials__grid {
338
+ display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3xl);
339
+ align-items: center;
340
+ }
341
+ .split-quote p {
342
+ font-size: var(--text-xl); line-height: 1.7;
343
+ color: var(--text-secondary); font-style: italic;
344
+ margin-bottom: var(--space-xl);
345
+ }
346
+ .split-quote::before { content: '"'; font-size: 80px; color: var(--accent-primary); line-height: 0.6; display: block; }
347
+ .split-quote__name { display: block; font-weight: 700; color: var(--text-primary); }
348
+ .split-quote__role { font-size: var(--text-sm); color: var(--text-muted); }
349
+
350
+ .testimonials-image-swiper img {
351
+ border-radius: var(--radius-lg); width: 100%; height: 480px; object-fit: cover;
352
+ }
353
+
354
+ .split-testimonials__controls {
355
+ display: flex; align-items: center; gap: var(--space-md); margin-top: var(--space-xl);
356
+ }
357
+
358
+ @media (max-width: 768px) {
359
+ .split-testimonials__grid { grid-template-columns: 1fr; }
360
+ .testimonials-image-swiper { display: none; }
361
+ }
362
+ ```
363
+
364
+ **JS:**
365
+ ```js
366
+ const textSwiper = new Swiper('.testimonials-text-swiper', {
367
+ loop: true,
368
+ navigation: {
369
+ nextEl: '.testimonials-text-swiper .swiper-button-next',
370
+ prevEl: '.testimonials-text-swiper .swiper-button-prev',
371
+ },
372
+ pagination: { el: '.testimonials-text-swiper .swiper-pagination', clickable: true },
373
+ });
374
+
375
+ const imageSwiper = new Swiper('.testimonials-image-swiper', {
376
+ loop: true,
377
+ allowTouchMove: false, // image slider is controlled only by text slider
378
+ effect: 'fade', fadeEffect: { crossFade: true },
379
+ });
380
+
381
+ // Synchronize: text controls image
382
+ textSwiper.on('slideChange', () => {
383
+ imageSwiper.slideTo(textSwiper.realIndex);
384
+ });
385
+ ```
386
+
387
+ ---
388
+
389
+ ### 14f. Swiper with Progress Bar Navigation
390
+
391
+ Instead of dots, show a thin animated progress bar for long testimonial or case study sliders.
392
+
393
+ **HTML:**
394
+ ```html
395
+ <div class="swiper portfolio-swiper">
396
+ <div class="swiper-wrapper">
397
+ <!-- slides -->
398
+ </div>
399
+ <div class="swiper-progress-bar" aria-hidden="true">
400
+ <div class="swiper-progress-fill"></div>
401
+ </div>
402
+ <div class="swiper-nav">
403
+ <button class="swiper-button-prev" aria-label="Previous"></button>
404
+ <button class="swiper-button-next" aria-label="Next"></button>
405
+ </div>
406
+ </div>
407
+ ```
408
+
409
+ **CSS:**
410
+ ```css
411
+ .swiper-progress-bar {
412
+ width: 100%; height: 2px;
413
+ background: var(--border-faint); border-radius: 2px;
414
+ margin-top: var(--space-lg); overflow: hidden;
415
+ }
416
+ .swiper-progress-fill {
417
+ height: 100%; background: var(--accent-primary);
418
+ border-radius: 2px;
419
+ transition: width 0.3s ease;
420
+ }
421
+ ```
422
+
423
+ **JS:**
424
+ ```js
425
+ const slider = new Swiper('.portfolio-swiper', {
426
+ loop: false,
427
+ navigation: {
428
+ nextEl: '.portfolio-swiper .swiper-button-next',
429
+ prevEl: '.portfolio-swiper .swiper-button-prev',
430
+ },
431
+ on: {
432
+ init(swiper) { updateProgress(swiper); },
433
+ slideChange(swiper) { updateProgress(swiper); },
434
+ },
435
+ });
436
+
437
+ function updateProgress(swiper) {
438
+ const fill = document.querySelector('.swiper-progress-fill');
439
+ if (!fill) return;
440
+ const pct = ((swiper.activeIndex + 1) / swiper.slides.length) * 100;
441
+ fill.style.width = pct + '%';
442
+ }
443
+ ```
444
+
445
+ ---
446
+
447
+ ### 14g. box-white / box-black Section Alternation
448
+
449
+ Aigocy alternates full-width section containers between dark (`box-black`) and light (`box-white`)
450
+ with decorative gradient glow images for depth. This creates the "cinematic layer cake" effect.
451
+
452
+ **HTML:**
453
+ ```html
454
+ <div class="box-black">
455
+ <img class="light-top" src="light-bg-top.png" alt="" aria-hidden="true">
456
+ <section class="features"> ... </section>
457
+ <img class="light-bot" src="light-bg-bot.png" alt="" aria-hidden="true">
458
+ </div>
459
+
460
+ <div class="box-white">
461
+ <section class="how-it-works"> ... </section>
462
+ </div>
463
+ ```
464
+
465
+ **CSS (generate glow with CSS instead of images):**
466
+ ```css
467
+ .box-black {
468
+ background: var(--bg-base);
469
+ position: relative; overflow: hidden;
470
+ }
471
+ .box-white {
472
+ background: var(--bg-surface);
473
+ position: relative; overflow: hidden;
474
+ }
475
+
476
+ /* Decorative ambient glow (replaces light-top/light-bot PNG images) */
477
+ .box-black::before {
478
+ content: '';
479
+ position: absolute; top: -200px; left: 50%;
480
+ transform: translateX(-50%);
481
+ width: 800px; height: 400px;
482
+ background: radial-gradient(ellipse at center,
483
+ hsla(265,60%,40%,0.15) 0%,
484
+ transparent 70%
485
+ );
486
+ pointer-events: none; z-index: 0;
487
+ }
488
+ .box-black::after {
489
+ content: '';
490
+ position: absolute; bottom: -200px; left: 50%;
491
+ transform: translateX(-50%);
492
+ width: 800px; height: 400px;
493
+ background: radial-gradient(ellipse at center,
494
+ hsla(265,60%,40%,0.1) 0%,
495
+ transparent 70%
496
+ );
497
+ pointer-events: none; z-index: 0;
498
+ }
499
+
500
+ /* Ensure section content is above glow */
501
+ .box-black > section, .box-white > section { position: relative; z-index: 1; }
502
+ ```
503
+
504
+ ---
505
+
506
+ ### 14h. Accordion FAQ (Bootstrap collapse pattern)
507
+
508
+ Clean accordion FAQ that works without JS library if you use the native `<details>` element,
509
+ or with Bootstrap's collapse for richer animations.
510
+
511
+ **HTML (native, no-library version):**
512
+ ```html
513
+ <section class="faq" id="faq" aria-labelledby="faq-title">
514
+ <div class="container">
515
+ <div class="section-header">
516
+ <span class="section-label">FAQ</span>
517
+ <h2 class="section-title" id="faq-title">Common questions</h2>
518
+ </div>
519
+ <div class="faq__list">
520
+ <details class="faq__item">
521
+ <summary class="faq__question">
522
+ How long does setup take?
523
+ <span class="faq__icon" aria-hidden="true">+</span>
524
+ </summary>
525
+ <div class="faq__answer">
526
+ <p>Setup takes under 5 minutes. Connect your account, configure your first workflow, and you're live.</p>
527
+ </div>
528
+ </details>
529
+ <!-- repeat -->
530
+ </div>
531
+ </div>
532
+ </section>
533
+ ```
534
+
535
+ **CSS:**
536
+ ```css
537
+ .faq__list { max-width: 800px; margin: 0 auto; }
538
+
539
+ .faq__item {
540
+ border-bottom: 1px solid var(--border-faint);
541
+ padding: var(--space-lg) 0;
542
+ }
543
+ .faq__item:first-child { border-top: 1px solid var(--border-faint); }
544
+
545
+ .faq__question {
546
+ display: flex; justify-content: space-between; align-items: center;
547
+ font-size: var(--text-lg); font-weight: 600;
548
+ color: var(--text-primary); cursor: pointer;
549
+ list-style: none; /* hide default marker */
550
+ }
551
+ .faq__question::-webkit-details-marker { display: none; }
552
+
553
+ .faq__icon {
554
+ font-size: var(--text-xl); font-weight: 300;
555
+ color: var(--accent-primary);
556
+ transition: transform var(--duration-base) var(--ease-out);
557
+ flex-shrink: 0; margin-left: var(--space-lg);
558
+ }
559
+ details[open] .faq__icon { transform: rotate(45deg); }
560
+
561
+ .faq__answer {
562
+ padding-top: var(--space-md);
563
+ }
564
+ .faq__answer p {
565
+ font-size: var(--text-base); color: var(--text-secondary); line-height: 1.7;
566
+ }
567
+ ```
568
+
569
+ ---
570
+
571
+ ### 14i. Footer with Watermark Background Logo
572
+
573
+ Premium footer pattern: brand name as a large faded watermark behind footer content,
574
+ with dense 3-column layout (links / copyright / social).
575
+
576
+ **HTML:**
577
+ ```html
578
+ <footer class="footer" role="contentinfo">
579
+ <div class="footer__watermark" aria-hidden="true">ProductName</div>
580
+ <div class="container footer__body">
581
+ <div class="footer__col footer__col--links">
582
+ <strong>Product</strong>
583
+ <a href="#">Features</a>
584
+ <a href="#">Pricing</a>
585
+ <a href="#">Docs</a>
586
+ </div>
587
+ <div class="footer__col footer__col--center">
588
+ <a href="/" class="footer__logo" aria-label="Home">
589
+ <img src="logo.svg" alt="ProductName" height="32">
590
+ </a>
591
+ <p class="footer__copy">© 2026 ProductName, Inc. All rights reserved.</p>
592
+ </div>
593
+ <div class="footer__col footer__col--social">
594
+ <strong>Follow us</strong>
595
+ <div class="footer__social">
596
+ <a href="#" aria-label="Twitter" class="social-link">
597
+ <svg width="20" height="20" aria-hidden="true"><!-- twitter icon --></svg>
598
+ Twitter
599
+ </a>
600
+ <a href="#" aria-label="LinkedIn" class="social-link">
601
+ <svg width="20" height="20" aria-hidden="true"><!-- linkedin icon --></svg>
602
+ LinkedIn
603
+ </a>
604
+ </div>
605
+ </div>
606
+ </div>
607
+ </footer>
608
+ ```
609
+
610
+ **CSS:**
611
+ ```css
612
+ .footer {
613
+ position: relative; overflow: hidden;
614
+ background: var(--bg-surface);
615
+ border-top: 1px solid var(--border-faint);
616
+ padding: var(--space-3xl) 0 var(--space-xl);
617
+ }
618
+
619
+ /* Faded watermark behind content */
620
+ .footer__watermark {
621
+ position: absolute; bottom: -20px; left: 50%;
622
+ transform: translateX(-50%);
623
+ font-family: var(--font-display); font-size: clamp(80px, 15vw, 160px);
624
+ font-weight: 900; line-height: 1;
625
+ color: var(--text-primary); opacity: 0.04;
626
+ white-space: nowrap; pointer-events: none; user-select: none;
627
+ }
628
+
629
+ .footer__body {
630
+ display: grid; grid-template-columns: 1fr auto 1fr;
631
+ gap: var(--space-xl); align-items: start;
632
+ position: relative; z-index: 1;
633
+ }
634
+ .footer__col { display: flex; flex-direction: column; gap: var(--space-sm); }
635
+ .footer__col--center { text-align: center; align-items: center; }
636
+ .footer__col--social { align-items: flex-end; }
637
+
638
+ .footer__col strong {
639
+ font-size: var(--text-sm); font-weight: 700; text-transform: uppercase;
640
+ letter-spacing: 0.08em; color: var(--text-primary); margin-bottom: var(--space-xs);
641
+ }
642
+ .footer__col a {
643
+ font-size: var(--text-sm); color: var(--text-muted);
644
+ transition: color var(--duration-fast) ease;
645
+ }
646
+ .footer__col a:hover { color: var(--text-primary); }
647
+
648
+ .social-link {
649
+ display: flex; align-items: center; gap: var(--space-sm);
650
+ }
651
+
652
+ .footer__copy {
653
+ font-size: var(--text-sm); color: var(--text-muted); margin-top: var(--space-md);
654
+ }
655
+
656
+ @media (max-width: 768px) {
657
+ .footer__body { grid-template-columns: 1fr; text-align: center; }
658
+ .footer__col--social { align-items: center; }
659
+ .footer__watermark { display: none; }
660
+ }
661
+ ```
662
+
663
+ ---
664
+
665
+ ### 14j. Canvas Cursor Trail (optional, cinematic touch)
666
+
667
+ A subtle canvas trail that follows the cursor — drawn as fading dots.
668
+ Only activate for Bold & Cinematic direction, and skip on touch devices.
669
+
670
+ ```js
671
+ // Add <canvas id="cursorTrail" style="position:fixed;inset:0;pointer-events:none;z-index:9999"></canvas>
672
+ // to <body> to use this.
673
+
674
+ (function initCursorTrail() {
675
+ if (window.matchMedia('(hover: none)').matches) return; // skip on touch
676
+ if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
677
+
678
+ const canvas = document.getElementById('cursorTrail');
679
+ if (!canvas) return;
680
+ const ctx = canvas.getContext('2d');
681
+ canvas.width = window.innerWidth;
682
+ canvas.height = window.innerHeight;
683
+ window.addEventListener('resize', () => {
684
+ canvas.width = window.innerWidth;
685
+ canvas.height = window.innerHeight;
686
+ });
687
+
688
+ const dots = [];
689
+ const MAX_DOTS = 20;
690
+ const COLOR = 'hsla(265, 80%, 65%,';
691
+
692
+ window.addEventListener('mousemove', (e) => {
693
+ dots.push({ x: e.clientX, y: e.clientY, alpha: 1 });
694
+ if (dots.length > MAX_DOTS) dots.shift();
695
+ }, { passive: true });
696
+
697
+ function draw() {
698
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
699
+ dots.forEach((dot, i) => {
700
+ const size = (i / dots.length) * 8 + 2;
701
+ dot.alpha = (i / dots.length) * 0.6;
702
+ ctx.beginPath();
703
+ ctx.arc(dot.x, dot.y, size, 0, Math.PI * 2);
704
+ ctx.fillStyle = `${COLOR}${dot.alpha})`;
705
+ ctx.fill();
706
+ });
707
+ requestAnimationFrame(draw);
708
+ }
709
+ draw();
710
+ })();
711
+ ```