@jaimevalasek/aioson 1.5.1 → 1.7.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/CHANGELOG.md +49 -0
- package/README.md +729 -226
- package/docs/design-previews/aurora-command-ui-website.html +884 -0
- package/docs/design-previews/aurora-command-ui.html +682 -0
- package/docs/design-previews/bold-editorial-ui-website.html +658 -0
- package/docs/design-previews/bold-editorial-ui.html +717 -0
- package/docs/design-previews/clean-saas-ui-website.html +1202 -0
- package/docs/design-previews/clean-saas-ui.html +549 -0
- package/docs/design-previews/cognitive-core-ui-website.html +1009 -0
- package/docs/design-previews/cognitive-core-ui.html +463 -0
- package/docs/design-previews/glassmorphism-ui-website.html +572 -0
- package/docs/design-previews/glassmorphism-ui.html +886 -0
- package/docs/design-previews/index.html +699 -0
- package/docs/design-previews/interface-design-website.html +1187 -0
- package/docs/design-previews/interface-design.html +513 -0
- package/docs/design-previews/neo-brutalist-ui-website.html +621 -0
- package/docs/design-previews/neo-brutalist-ui.html +797 -0
- package/docs/design-previews/premium-command-center-ui-website.html +1217 -0
- package/docs/design-previews/premium-command-center-ui.html +552 -0
- package/docs/design-previews/pt.squarespace.com-homepage.html +889 -0
- package/docs/design-previews/warm-craft-ui-website.html +684 -0
- package/docs/design-previews/warm-craft-ui.html +739 -0
- package/docs/en/cli-reference.md +20 -9
- package/docs/integrations/sdlc-genius-boundary.md +76 -0
- package/docs/integrations/sdlc-genius-eval-matrix.md +75 -0
- package/docs/integrations/sdlc-genius-install-checklist.md +93 -0
- package/docs/integrations/sdlc-genius-review-samples.md +86 -0
- package/docs/pt/README.md +10 -0
- package/docs/pt/agent-sharding.md +132 -0
- package/docs/pt/agentes.md +9 -2
- package/docs/pt/busca-de-contexto.md +129 -0
- package/docs/pt/cache-de-contexto.md +156 -0
- package/docs/pt/comandos-cli.md +915 -1
- package/docs/pt/design-hybrid-forge.md +356 -0
- package/docs/pt/devlog-pipeline.md +270 -0
- package/docs/pt/fluxo-artefatos.md +178 -0
- package/docs/pt/hooks-session-guard.md +454 -0
- package/docs/pt/inicio-rapido.md +54 -3
- package/docs/pt/inteligencia-adaptativa.md +324 -0
- package/docs/pt/monitor-de-contexto.md +158 -0
- package/docs/pt/recuperacao-de-sessao.md +125 -0
- package/docs/pt/sandbox.md +125 -0
- package/docs/pt/sdd-automation-scripts.md +557 -0
- package/docs/pt/site-forge.md +309 -0
- package/docs/pt/skills.md +98 -6
- package/docs/pt/spec-learnings-pipeline.md +265 -0
- package/package.json +1 -1
- package/src/a2a/client.js +165 -0
- package/src/a2a/server.js +223 -0
- package/src/agent-loader.js +280 -0
- package/src/cli.js +329 -1
- package/src/commands/agent-audit.js +397 -0
- package/src/commands/agent-export-skill.js +229 -0
- package/src/commands/agent-loader.js +85 -0
- package/src/commands/artifact-validate.js +189 -0
- package/src/commands/brief-gen.js +405 -0
- package/src/commands/brief-validate.js +65 -0
- package/src/commands/classify.js +256 -0
- package/src/commands/context-cache.js +90 -0
- package/src/commands/context-compact.js +49 -0
- package/src/commands/context-health.js +175 -0
- package/src/commands/context-monitor.js +163 -0
- package/src/commands/context-search.js +66 -0
- package/src/commands/context-trim.js +177 -0
- package/src/commands/design-hybrid-options.js +385 -0
- package/src/commands/detect-test-runner.js +55 -0
- package/src/commands/devlog-export-brains.js +27 -0
- package/src/commands/devlog-process.js +292 -0
- package/src/commands/devlog-watch.js +131 -0
- package/src/commands/feature-close.js +165 -0
- package/src/commands/gate-check.js +228 -0
- package/src/commands/health.js +214 -0
- package/src/commands/hooks-emit.js +253 -0
- package/src/commands/hooks-install.js +347 -0
- package/src/commands/init.js +54 -13
- package/src/commands/install.js +52 -13
- package/src/commands/learning-auto-promote.js +195 -0
- package/src/commands/learning-evolve.js +364 -0
- package/src/commands/learning-export.js +103 -0
- package/src/commands/learning-rollback.js +164 -0
- package/src/commands/live.js +59 -1
- package/src/commands/pattern-detect.js +33 -0
- package/src/commands/preflight-context.js +30 -0
- package/src/commands/preflight.js +208 -0
- package/src/commands/pulse-update.js +130 -0
- package/src/commands/recovery.js +43 -0
- package/src/commands/runner-daemon.js +274 -0
- package/src/commands/runner-plan.js +70 -0
- package/src/commands/runner-queue-from-plan.js +166 -0
- package/src/commands/runner-queue.js +189 -0
- package/src/commands/runner-run.js +129 -0
- package/src/commands/runtime.js +47 -1
- package/src/commands/sandbox.js +37 -0
- package/src/commands/self-implement-loop.js +256 -0
- package/src/commands/session-guard.js +218 -0
- package/src/commands/setup-context.js +22 -2
- package/src/commands/setup.js +178 -0
- package/src/commands/sizing.js +165 -0
- package/src/commands/skill.js +144 -32
- package/src/commands/spec-checkpoint.js +177 -0
- package/src/commands/spec-status.js +79 -0
- package/src/commands/spec-sync.js +190 -0
- package/src/commands/spec-tasks.js +288 -0
- package/src/commands/squad-autorun.js +1220 -0
- package/src/commands/squad-bus.js +217 -0
- package/src/commands/squad-card.js +149 -0
- package/src/commands/squad-daemon.js +134 -0
- package/src/commands/squad-dependency-graph.js +164 -0
- package/src/commands/squad-review.js +106 -0
- package/src/commands/squad-scaffold.js +55 -0
- package/src/commands/squad-tool-register.js +157 -0
- package/src/commands/state-save.js +122 -0
- package/src/commands/tool-registry-cmd.js +232 -0
- package/src/commands/update.js +9 -0
- package/src/commands/verify-gate.js +572 -0
- package/src/commands/workflow-execute.js +241 -0
- package/src/constants.js +18 -0
- package/src/context-cache.js +159 -0
- package/src/context-search.js +326 -0
- package/src/design-variation-catalog.js +503 -0
- package/src/i18n/messages/en.js +32 -2
- package/src/i18n/messages/es.js +30 -2
- package/src/i18n/messages/fr.js +30 -2
- package/src/i18n/messages/pt-BR.js +32 -2
- package/src/install-animation.js +260 -0
- package/src/install-profile.js +143 -0
- package/src/install-wizard.js +475 -0
- package/src/installer.js +44 -10
- package/src/lib/health-check.js +158 -0
- package/src/lib/hook-protocol.js +76 -0
- package/src/mcp/apps/squad-dashboard/app.js +163 -0
- package/src/mcp/apps/squad-dashboard/index.html +261 -0
- package/src/mcp/apps/squad-dashboard/mcp-manifest.json +23 -0
- package/src/mcp/resources/squad-state.js +130 -0
- package/src/parser.js +7 -1
- package/src/preflight-engine.js +443 -0
- package/src/recovery-context-session.js +154 -0
- package/src/runner/cascade.js +97 -0
- package/src/runner/cli-launcher.js +109 -0
- package/src/runner/plan-importer.js +63 -0
- package/src/runner/queue-store.js +159 -0
- package/src/runtime-store.js +158 -4
- package/src/sandbox.js +177 -0
- package/src/squad/agent-teams-adapter.js +264 -0
- package/src/squad/brief-validator.js +350 -0
- package/src/squad/bus-bridge.js +140 -0
- package/src/squad/context-compactor.js +265 -0
- package/src/squad/cross-ai-synthesizer.js +250 -0
- package/src/squad/hooks-generator.js +196 -0
- package/src/squad/inter-squad-events.js +175 -0
- package/src/squad/intra-bus.js +345 -0
- package/src/squad/learning-extractor.js +213 -0
- package/src/squad/pattern-detector.js +365 -0
- package/src/squad/preflight-context.js +296 -0
- package/src/squad/recovery-context.js +242 -71
- package/src/squad/reflection.js +365 -0
- package/src/squad/squad-scaffold.js +177 -0
- package/src/squad/state-manager.js +310 -0
- package/src/squad/task-decomposer.js +652 -0
- package/src/squad/verify-gate.js +303 -0
- package/src/tool-executor.js +94 -0
- package/src/updater.js +10 -3
- package/src/worker-runner.js +186 -1
- package/template/.aioson/agents/analyst.md +119 -3
- package/template/.aioson/agents/architect.md +98 -0
- package/template/.aioson/agents/design-hybrid-forge.md +141 -0
- package/template/.aioson/agents/dev.md +335 -14
- package/template/.aioson/agents/deyvin.md +117 -2
- package/template/.aioson/agents/discovery-design-doc.md +44 -0
- package/template/.aioson/agents/genome.md +14 -0
- package/template/.aioson/agents/neo.md +78 -1
- package/template/.aioson/agents/orache.md +50 -4
- package/template/.aioson/agents/orchestrator.md +197 -1
- package/template/.aioson/agents/pm.md +93 -0
- package/template/.aioson/agents/product.md +77 -4
- package/template/.aioson/agents/profiler-enricher.md +14 -0
- package/template/.aioson/agents/profiler-forge.md +14 -0
- package/template/.aioson/agents/profiler-researcher.md +14 -0
- package/template/.aioson/agents/qa.md +249 -19
- package/template/.aioson/agents/setup.md +144 -12
- package/template/.aioson/agents/sheldon.md +237 -11
- package/template/.aioson/agents/site-forge.md +1753 -0
- package/template/.aioson/agents/squad.md +162 -0
- package/template/.aioson/agents/tester.md +209 -0
- package/template/.aioson/agents/ux-ui.md +34 -1
- package/template/.aioson/brains/README.md +128 -0
- package/template/.aioson/brains/_index.json +16 -0
- package/template/.aioson/brains/scripts/query.js +103 -0
- package/template/.aioson/brains/site-forge/visual-patterns.brain.json +205 -0
- package/template/.aioson/config.md +158 -13
- package/template/.aioson/constitution.md +33 -0
- package/template/.aioson/context/forensics/.gitkeep +0 -0
- package/template/.aioson/context/project-pulse.md +34 -0
- package/template/.aioson/context/seeds/seed-example.md +27 -0
- package/template/.aioson/context/user-profile.md +42 -0
- package/template/.aioson/docs/LAYERS.md +79 -0
- package/template/.aioson/docs/README.md +76 -0
- package/template/.aioson/docs/example-external-api-context.md +72 -0
- package/template/.aioson/locales/en/agents/architect.md +17 -0
- package/template/.aioson/locales/en/agents/dev.md +79 -13
- package/template/.aioson/locales/en/agents/orache.md +6 -0
- package/template/.aioson/locales/en/agents/orchestrator.md +24 -0
- package/template/.aioson/locales/en/agents/product.md +50 -0
- package/template/.aioson/locales/en/agents/setup.md +33 -1
- package/template/.aioson/locales/en/agents/sheldon.md +115 -0
- package/template/.aioson/locales/en/agents/squad.md +14 -0
- package/template/.aioson/locales/en/agents/tester.md +6 -0
- package/template/.aioson/locales/es/agents/analyst.md +2 -0
- package/template/.aioson/locales/es/agents/architect.md +19 -0
- package/template/.aioson/locales/es/agents/dev.md +64 -4
- package/template/.aioson/locales/es/agents/deyvin.md +2 -0
- package/template/.aioson/locales/es/agents/discovery-design-doc.md +2 -0
- package/template/.aioson/locales/es/agents/genome.md +2 -0
- package/template/.aioson/locales/es/agents/neo.md +2 -0
- package/template/.aioson/locales/es/agents/orache.md +2 -0
- package/template/.aioson/locales/es/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/es/agents/pair.md +2 -0
- package/template/.aioson/locales/es/agents/pm.md +2 -0
- package/template/.aioson/locales/es/agents/product.md +52 -0
- package/template/.aioson/locales/es/agents/profiler-enricher.md +2 -0
- package/template/.aioson/locales/es/agents/profiler-forge.md +2 -0
- package/template/.aioson/locales/es/agents/profiler-researcher.md +2 -0
- package/template/.aioson/locales/es/agents/qa.md +2 -0
- package/template/.aioson/locales/es/agents/setup.md +35 -1
- package/template/.aioson/locales/es/agents/sheldon.md +117 -0
- package/template/.aioson/locales/es/agents/squad.md +16 -0
- package/template/.aioson/locales/es/agents/tester.md +9 -0
- package/template/.aioson/locales/es/agents/ux-ui.md +2 -0
- package/template/.aioson/locales/fr/agents/analyst.md +2 -0
- package/template/.aioson/locales/fr/agents/architect.md +19 -0
- package/template/.aioson/locales/fr/agents/dev.md +64 -4
- package/template/.aioson/locales/fr/agents/deyvin.md +2 -0
- package/template/.aioson/locales/fr/agents/discovery-design-doc.md +2 -0
- package/template/.aioson/locales/fr/agents/genome.md +2 -0
- package/template/.aioson/locales/fr/agents/neo.md +2 -0
- package/template/.aioson/locales/fr/agents/orache.md +2 -0
- package/template/.aioson/locales/fr/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/fr/agents/pair.md +2 -0
- package/template/.aioson/locales/fr/agents/pm.md +2 -0
- package/template/.aioson/locales/fr/agents/product.md +52 -0
- package/template/.aioson/locales/fr/agents/profiler-enricher.md +2 -0
- package/template/.aioson/locales/fr/agents/profiler-forge.md +2 -0
- package/template/.aioson/locales/fr/agents/profiler-researcher.md +2 -0
- package/template/.aioson/locales/fr/agents/qa.md +2 -0
- package/template/.aioson/locales/fr/agents/setup.md +35 -1
- package/template/.aioson/locales/fr/agents/sheldon.md +117 -0
- package/template/.aioson/locales/fr/agents/squad.md +16 -0
- package/template/.aioson/locales/fr/agents/tester.md +9 -0
- package/template/.aioson/locales/fr/agents/ux-ui.md +2 -0
- package/template/.aioson/locales/pt-BR/agents/analyst.md +64 -3
- package/template/.aioson/locales/pt-BR/agents/architect.md +42 -0
- package/template/.aioson/locales/pt-BR/agents/dev.md +147 -14
- package/template/.aioson/locales/pt-BR/agents/deyvin.md +47 -0
- package/template/.aioson/locales/pt-BR/agents/neo.md +62 -1
- package/template/.aioson/locales/pt-BR/agents/orchestrator.md +158 -2
- package/template/.aioson/locales/pt-BR/agents/pm.md +95 -1
- package/template/.aioson/locales/pt-BR/agents/product.md +145 -18
- package/template/.aioson/locales/pt-BR/agents/qa.md +16 -0
- package/template/.aioson/locales/pt-BR/agents/setup.md +134 -19
- package/template/.aioson/locales/pt-BR/agents/sheldon.md +132 -1
- package/template/.aioson/locales/pt-BR/agents/squad.md +14 -0
- package/template/.aioson/locales/pt-BR/agents/tester.md +449 -0
- package/template/.aioson/rules/README.md +69 -0
- package/template/.aioson/rules/data-format-convention.md +136 -0
- package/template/.aioson/rules/example-monetary-values.md +30 -0
- package/template/.aioson/schemas/squad-manifest.schema.json +124 -3
- package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +243 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +482 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +387 -0
- package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +222 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +213 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -0
- package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -0
- package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +66 -0
- package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +368 -0
- package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -0
- package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -0
- package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -0
- package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +165 -0
- package/template/.aioson/skills/process/aioson-spec-driven/SKILL.md +46 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/analyst.md +30 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/approval-gates.md +109 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/architect.md +23 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/artifact-map.md +44 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/classification-map.md +37 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/dev.md +47 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/deyvin.md +27 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/hardening-lane.md +49 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/maintenance-and-state.md +101 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/product.md +25 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/qa.md +30 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/sheldon.md +25 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/ui-language.md +75 -0
- package/template/.aioson/skills/process/design-hybrid-forge/SKILL.md +147 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/crossover-protocol.md +221 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/naming-registry.md +88 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/output-contract.md +306 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/pair-compatibility.md +149 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/quality-gates.md +208 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/variation-library.md +125 -0
- package/template/.aioson/skills/process/simplify/SKILL.md +173 -0
- package/template/.aioson/skills/static/context-budget-guide.md +46 -0
- package/template/.aioson/skills/static/harness-sensors.md +74 -0
- package/template/.aioson/skills/static/multi-agent-patterns.md +43 -0
- package/template/.aioson/skills/static/react-motion-patterns.md +22 -0
- package/template/.aioson/skills/static/static-html-patterns/checklists.md +43 -0
- package/template/.aioson/skills/static/static-html-patterns/css-tokens.md +609 -0
- package/template/.aioson/skills/static/static-html-patterns/motion.md +193 -0
- package/template/.aioson/skills/static/static-html-patterns/premium.md +711 -0
- package/template/.aioson/skills/static/static-html-patterns/structure.md +209 -0
- package/template/.aioson/skills/static/static-html-patterns/utilities.md +190 -0
- package/template/.aioson/skills/static/static-html-patterns.md +58 -1913
- package/template/.aioson/skills/static/threejs-patterns.md +929 -0
- package/template/.aioson/skills/static/web-research-cache.md +112 -0
- package/template/.aioson/tasks/implementation-plan.md +21 -1
- package/template/.claude/commands/aioson/agent/design-hybrid-forge.md +5 -0
- package/template/.claude/commands/aioson/agent/orache.md +5 -0
- package/template/.claude/commands/aioson/agent/sheldon.md +5 -0
- package/template/.claude/commands/aioson/agent/site-forge.md +5 -0
- package/template/AGENTS.md +75 -1
- package/template/CLAUDE.md +31 -0
- package/template/OPENCODE.md +4 -0
- package/template/researchs/.gitkeep +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
|
+
```
|