exonous 0.0.0-stage → 2.10.4
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/README.md +100 -2
- package/assets/THIRD-PARTY-NOTICES.md +29 -0
- package/assets/adapters/opencode/exonous.js +54 -0
- package/assets/agents/exo-backend.md +22 -0
- package/assets/agents/exo-cto.md +22 -0
- package/assets/agents/exo-data-ai.md +22 -0
- package/assets/agents/exo-designer.md +22 -0
- package/assets/agents/exo-devops.md +22 -0
- package/assets/agents/exo-frontend.md +22 -0
- package/assets/agents/exo-infra.md +22 -0
- package/assets/agents/exo-mobile.md +22 -0
- package/assets/agents/exo-pm.md +22 -0
- package/assets/agents/exo-qa.md +22 -0
- package/assets/agents/exo-researcher.md +22 -0
- package/assets/agents/exo-security.md +22 -0
- package/assets/agents/roster.json +209 -0
- package/assets/agents/taxis.js +189 -0
- package/assets/editors/cursor/frontend-skills.mdc +27 -0
- package/assets/editors/hooks/cursor/hooks.json +11 -0
- package/assets/machine/PR-TEMPLATE.md +21 -0
- package/assets/machine/hooks/anamnesis.cjs +61 -0
- package/assets/machine/hooks/ethos.cjs +48 -0
- package/assets/machine/hooks/kairos.cjs +46 -0
- package/assets/machine/hooks/lib/cli-options.cjs +133 -0
- package/assets/machine/hooks/lib/memory.cjs +488 -0
- package/assets/machine/hooks/lib/metron.cjs +52 -0
- package/assets/machine/hooks/lib/paths.cjs +99 -0
- package/assets/machine/hooks/lib/payload.cjs +81 -0
- package/assets/machine/hooks/lib/pr-template-validate.cjs +103 -0
- package/assets/machine/hooks/lib/release.cjs +58 -0
- package/assets/machine/hooks/lib/repo.cjs +138 -0
- package/assets/machine/hooks/lib/sanitize.cjs +37 -0
- package/assets/machine/hooks/lib/selfupdate.cjs +354 -0
- package/assets/machine/hooks/lib/shell.cjs +722 -0
- package/assets/machine/hooks/lib/template.cjs +70 -0
- package/assets/machine/hooks/lib/token.cjs +110 -0
- package/assets/machine/hooks/lib/validate-pr-body.cjs +21 -0
- package/assets/machine/hooks/pyle.cjs +302 -0
- package/assets/rules/nomos.md +59 -0
- package/assets/rules/praxis.md +38 -0
- package/assets/skills/code-review/SKILL.md +124 -0
- package/assets/skills/commit-changes/SKILL.md +49 -0
- package/assets/skills/deliver/SKILL.md +114 -0
- package/assets/skills/deliver/references/parallel.md +37 -0
- package/assets/skills/doc/SKILL.md +140 -0
- package/assets/skills/doc/doc.mjs +277 -0
- package/assets/skills/issue-board/SKILL.md +84 -0
- package/assets/skills/issue-board/board.mjs +389 -0
- package/assets/skills/issue-board/config.example.json +9 -0
- package/assets/skills/issue-board/render.py +189 -0
- package/assets/skills/make-pr/SKILL.md +24 -0
- package/assets/skills/native-ui/SKILL.md +67 -0
- package/assets/skills/native-ui/reference/apple.md +180 -0
- package/assets/skills/native-ui/reference/mobile-feel.md +221 -0
- package/assets/skills/native-ui/reference/swift.md +289 -0
- package/assets/skills/project-memory/SKILL.md +59 -0
- package/assets/skills/project-memory/config.example.json +4 -0
- package/assets/skills/project-memory/project-memory.mjs +478 -0
- package/assets/skills/security-review/SKILL.md +102 -0
- package/assets/skills/session-handoff/SKILL.md +23 -0
- package/assets/skills/session-handoff/config.example.json +3 -0
- package/assets/skills/ui-design/SKILL.md +75 -0
- package/assets/skills/ui-design/reference/adapt.md +151 -0
- package/assets/skills/ui-design/reference/adapt.native.md +35 -0
- package/assets/skills/ui-design/reference/android.md +50 -0
- package/assets/skills/ui-design/reference/animate.md +87 -0
- package/assets/skills/ui-design/reference/audit.md +76 -0
- package/assets/skills/ui-design/reference/audit.native.md +126 -0
- package/assets/skills/ui-design/reference/bolder.md +33 -0
- package/assets/skills/ui-design/reference/clarify.md +84 -0
- package/assets/skills/ui-design/reference/colorize.md +86 -0
- package/assets/skills/ui-design/reference/craft-floor.md +25 -0
- package/assets/skills/ui-design/reference/critique.md +345 -0
- package/assets/skills/ui-design/reference/degraded/asset-producer.md +35 -0
- package/assets/skills/ui-design/reference/degraded/documenter.md +23 -0
- package/assets/skills/ui-design/reference/degraded/finish-reviewer.md +43 -0
- package/assets/skills/ui-design/reference/degraded/manual-edit-applier.md +56 -0
- package/assets/skills/ui-design/reference/delight.md +63 -0
- package/assets/skills/ui-design/reference/distill.md +98 -0
- package/assets/skills/ui-design/reference/doctor.md +49 -0
- package/assets/skills/ui-design/reference/document.md +273 -0
- package/assets/skills/ui-design/reference/extract.md +52 -0
- package/assets/skills/ui-design/reference/harden.md +122 -0
- package/assets/skills/ui-design/reference/hooks.md +114 -0
- package/assets/skills/ui-design/reference/init.md +47 -0
- package/assets/skills/ui-design/reference/ios.md +55 -0
- package/assets/skills/ui-design/reference/layout.md +81 -0
- package/assets/skills/ui-design/reference/live-setup.md +75 -0
- package/assets/skills/ui-design/reference/live.md +326 -0
- package/assets/skills/ui-design/reference/new-work.md +350 -0
- package/assets/skills/ui-design/reference/onboard.md +85 -0
- package/assets/skills/ui-design/reference/operate.md +29 -0
- package/assets/skills/ui-design/reference/optimize.md +101 -0
- package/assets/skills/ui-design/reference/overdrive.md +83 -0
- package/assets/skills/ui-design/reference/polish.md +77 -0
- package/assets/skills/ui-design/reference/quieter.md +95 -0
- package/assets/skills/ui-design/reference/routing.md +37 -0
- package/assets/skills/ui-design/reference/shape.md +43 -0
- package/assets/skills/ui-design/reference/styles/brutalist.md +45 -0
- package/assets/skills/ui-design/reference/styles/design-md.md +70 -0
- package/assets/skills/ui-design/reference/styles/direction.md +95 -0
- package/assets/skills/ui-design/reference/styles/full-output.md +42 -0
- package/assets/skills/ui-design/reference/styles/minimalist.md +64 -0
- package/assets/skills/ui-design/reference/styles/premium.md +65 -0
- package/assets/skills/ui-design/reference/styles/redesign.md +59 -0
- package/assets/skills/ui-design/reference/typeset.md +73 -0
- package/assets/skills/ui-design/reference/visualize.md +156 -0
- package/assets/skills/ui-design/scripts/ENGINE-LICENSE +191 -0
- package/assets/skills/ui-design/scripts/VERSION +1 -0
- package/assets/skills/ui-design/scripts/bin/darwin-arm64/impeccable +0 -0
- package/assets/skills/ui-design/scripts/command-metadata.json +94 -0
- package/assets/skills/ui-design/scripts/data/font-index-failures.json +121 -0
- package/assets/skills/ui-design/scripts/data/font-index.json +1 -0
- package/assets/skills/ui-design/scripts/impeccable +206 -0
- package/assets/skills/ui-design/scripts/impeccable.cmd +214 -0
- package/assets/skills/ui-design/scripts/live-browser-dom.js +167 -0
- package/assets/skills/ui-design/scripts/live-browser-ignores.js +242 -0
- package/assets/skills/ui-design/scripts/live-browser-session.js +144 -0
- package/assets/skills/ui-design/scripts/live-browser.js +12990 -0
- package/assets/skills/ui-design/scripts/modern-screenshot.umd.js +14 -0
- package/assets/skills/ui-design/scripts/ui-design +6 -0
- package/assets/skills/ui-design/scripts/ui-design.cmd +3 -0
- package/assets/skills/ui-design/scripts/ui-design.mjs +124 -0
- package/assets/skills/ui-mockup/SKILL.md +68 -0
- package/assets/skills/ui-mockup/reference/brandkit.md +101 -0
- package/assets/skills/ui-mockup/reference/image-to-code.md +83 -0
- package/assets/skills/ui-mockup/reference/mobile-comps.md +94 -0
- package/assets/skills/ui-mockup/reference/web-comps.md +83 -0
- package/assets/skills/ui-motion/SKILL.md +112 -0
- package/assets/skills/ui-motion/reference/expo.md +224 -0
- package/assets/skills/ui-motion/reference/opportunities.md +81 -0
- package/assets/skills/ui-motion/reference/prototype.md +238 -0
- package/assets/skills/ui-motion/reference/review.md +163 -0
- package/assets/skills/ui-motion/reference/toasts.md +144 -0
- package/assets/skills/ui-motion/reference/ui-libraries.md +71 -0
- package/assets/skills/ui-motion/reference/vocabulary.md +130 -0
- package/assets/skills/ui-motion/reference/web.md +294 -0
- package/assets/skills/ui-patterns/SKILL.md +105 -0
- package/assets/skills/ui-patterns/references/stacks/html-tailwind.md +40 -0
- package/assets/skills/ui-patterns/references/stacks/nextjs.md +52 -0
- package/assets/skills/ui-patterns/references/stacks/nuxt.md +100 -0
- package/assets/skills/ui-patterns/references/stacks/react-native.md +48 -0
- package/assets/skills/ui-patterns/references/stacks/react.md +49 -0
- package/assets/skills/ui-patterns/references/stacks/shadcn.md +57 -0
- package/assets/skills/ui-patterns/references/stacks/vue.md +37 -0
- package/assets/techne/.claude-plugin/marketplace.json +31 -0
- package/assets/techne/.claude-plugin/plugin.json +24 -0
- package/assets/techne/.mcp.json +8 -0
- package/assets/techne/commands/build-fix.md +48 -0
- package/assets/techne/commands/refactor-clean.md +46 -0
- package/assets/techne/commands/test-coverage.md +42 -0
- package/assets/techne/hooks/hooks.json +49 -0
- package/assets/techne/rules/angular/coding-style.md +49 -0
- package/assets/techne/rules/angular/hooks.md +23 -0
- package/assets/techne/rules/angular/patterns.md +48 -0
- package/assets/techne/rules/angular/security.md +26 -0
- package/assets/techne/rules/angular/testing.md +46 -0
- package/assets/techne/rules/arkts/coding-style.md +63 -0
- package/assets/techne/rules/arkts/hooks.md +38 -0
- package/assets/techne/rules/arkts/patterns.md +42 -0
- package/assets/techne/rules/arkts/security.md +35 -0
- package/assets/techne/rules/arkts/testing.md +39 -0
- package/assets/techne/rules/common/agents.md +6 -0
- package/assets/techne/rules/common/code-review.md +15 -0
- package/assets/techne/rules/common/coding-style.md +13 -0
- package/assets/techne/rules/common/development-workflow.md +5 -0
- package/assets/techne/rules/common/git-workflow.md +30 -0
- package/assets/techne/rules/common/hooks.md +7 -0
- package/assets/techne/rules/common/patterns.md +3 -0
- package/assets/techne/rules/common/performance.md +3 -0
- package/assets/techne/rules/common/security.md +5 -0
- package/assets/techne/rules/common/testing.md +3 -0
- package/assets/techne/rules/cpp/coding-style.md +31 -0
- package/assets/techne/rules/cpp/hooks.md +26 -0
- package/assets/techne/rules/cpp/patterns.md +31 -0
- package/assets/techne/rules/cpp/security.md +37 -0
- package/assets/techne/rules/cpp/testing.md +31 -0
- package/assets/techne/rules/csharp/coding-style.md +30 -0
- package/assets/techne/rules/csharp/hooks.md +24 -0
- package/assets/techne/rules/csharp/patterns.md +28 -0
- package/assets/techne/rules/csharp/security.md +32 -0
- package/assets/techne/rules/csharp/testing.md +27 -0
- package/assets/techne/rules/dart/coding-style.md +47 -0
- package/assets/techne/rules/dart/hooks.md +26 -0
- package/assets/techne/rules/dart/patterns.md +38 -0
- package/assets/techne/rules/dart/security.md +44 -0
- package/assets/techne/rules/dart/testing.md +39 -0
- package/assets/techne/rules/fsharp/coding-style.md +34 -0
- package/assets/techne/rules/fsharp/hooks.md +25 -0
- package/assets/techne/rules/fsharp/patterns.md +43 -0
- package/assets/techne/rules/fsharp/security.md +32 -0
- package/assets/techne/rules/fsharp/testing.md +27 -0
- package/assets/techne/rules/golang/coding-style.md +30 -0
- package/assets/techne/rules/golang/hooks.md +17 -0
- package/assets/techne/rules/golang/patterns.md +43 -0
- package/assets/techne/rules/golang/security.md +33 -0
- package/assets/techne/rules/golang/testing.md +20 -0
- package/assets/techne/rules/java/coding-style.md +51 -0
- package/assets/techne/rules/java/hooks.md +18 -0
- package/assets/techne/rules/java/patterns.md +55 -0
- package/assets/techne/rules/java/security.md +33 -0
- package/assets/techne/rules/java/testing.md +33 -0
- package/assets/techne/rules/kotlin/coding-style.md +50 -0
- package/assets/techne/rules/kotlin/hooks.md +17 -0
- package/assets/techne/rules/kotlin/patterns.md +44 -0
- package/assets/techne/rules/kotlin/security.md +34 -0
- package/assets/techne/rules/kotlin/testing.md +38 -0
- package/assets/techne/rules/nuxt/coding-style.md +20 -0
- package/assets/techne/rules/nuxt/hooks.md +16 -0
- package/assets/techne/rules/nuxt/patterns.md +46 -0
- package/assets/techne/rules/nuxt/security.md +19 -0
- package/assets/techne/rules/nuxt/testing.md +15 -0
- package/assets/techne/rules/perl/coding-style.md +33 -0
- package/assets/techne/rules/perl/hooks.md +22 -0
- package/assets/techne/rules/perl/patterns.md +43 -0
- package/assets/techne/rules/perl/security.md +39 -0
- package/assets/techne/rules/perl/testing.md +42 -0
- package/assets/techne/rules/php/coding-style.md +30 -0
- package/assets/techne/rules/php/hooks.md +24 -0
- package/assets/techne/rules/php/patterns.md +26 -0
- package/assets/techne/rules/php/security.md +27 -0
- package/assets/techne/rules/php/testing.md +28 -0
- package/assets/techne/rules/python/coding-style.md +38 -0
- package/assets/techne/rules/python/fastapi.md +57 -0
- package/assets/techne/rules/python/hooks.md +19 -0
- package/assets/techne/rules/python/patterns.md +37 -0
- package/assets/techne/rules/python/security.md +26 -0
- package/assets/techne/rules/python/testing.md +32 -0
- package/assets/techne/rules/react/coding-style.md +24 -0
- package/assets/techne/rules/react/hooks.md +62 -0
- package/assets/techne/rules/react/patterns.md +48 -0
- package/assets/techne/rules/react/security.md +45 -0
- package/assets/techne/rules/react/testing.md +42 -0
- package/assets/techne/rules/react-native/accessibility.md +14 -0
- package/assets/techne/rules/react-native/coding-style.md +16 -0
- package/assets/techne/rules/react-native/hooks.md +16 -0
- package/assets/techne/rules/react-native/patterns.md +18 -0
- package/assets/techne/rules/react-native/performance.md +14 -0
- package/assets/techne/rules/react-native/production-readiness.md +16 -0
- package/assets/techne/rules/react-native/security.md +16 -0
- package/assets/techne/rules/react-native/testing.md +14 -0
- package/assets/techne/rules/ruby/coding-style.md +40 -0
- package/assets/techne/rules/ruby/hooks.md +33 -0
- package/assets/techne/rules/ruby/patterns.md +33 -0
- package/assets/techne/rules/ruby/security.md +39 -0
- package/assets/techne/rules/ruby/testing.md +35 -0
- package/assets/techne/rules/rust/coding-style.md +41 -0
- package/assets/techne/rules/rust/hooks.md +16 -0
- package/assets/techne/rules/rust/patterns.md +42 -0
- package/assets/techne/rules/rust/security.md +33 -0
- package/assets/techne/rules/rust/testing.md +30 -0
- package/assets/techne/rules/swift/coding-style.md +30 -0
- package/assets/techne/rules/swift/hooks.md +20 -0
- package/assets/techne/rules/swift/patterns.md +30 -0
- package/assets/techne/rules/swift/security.md +22 -0
- package/assets/techne/rules/swift/testing.md +28 -0
- package/assets/techne/rules/typescript/coding-style.md +38 -0
- package/assets/techne/rules/typescript/hooks.md +14 -0
- package/assets/techne/rules/typescript/patterns.md +12 -0
- package/assets/techne/rules/typescript/security.md +14 -0
- package/assets/techne/rules/typescript/testing.md +12 -0
- package/assets/techne/rules/vue/coding-style.md +19 -0
- package/assets/techne/rules/vue/hooks.md +13 -0
- package/assets/techne/rules/vue/patterns.md +29 -0
- package/assets/techne/rules/vue/security.md +11 -0
- package/assets/techne/rules/vue/testing.md +11 -0
- package/assets/techne/rules/web/coding-style.md +25 -0
- package/assets/techne/rules/web/design-quality.md +21 -0
- package/assets/techne/rules/web/hooks.md +39 -0
- package/assets/techne/rules/web/patterns.md +23 -0
- package/assets/techne/rules/web/performance.md +25 -0
- package/assets/techne/rules/web/security.md +23 -0
- package/assets/techne/rules/web/testing.md +21 -0
- package/assets/techne/scripts/hooks/config-guard.js +50 -0
- package/assets/techne/scripts/hooks/edit-tracker.js +26 -0
- package/assets/techne/scripts/hooks/lib/shell.js +204 -0
- package/assets/techne/scripts/hooks/no-verify-guard.js +205 -0
- package/assets/techne/scripts/hooks/run.js +92 -0
- package/assets/techne/scripts/hooks/stop-checks.js +136 -0
- package/assets/techne/skills/angular/SKILL.md +34 -0
- package/assets/techne/skills/angular/reference/components-and-templates.md +63 -0
- package/assets/techne/skills/angular/reference/dependency-injection.md +44 -0
- package/assets/techne/skills/angular/reference/forms.md +97 -0
- package/assets/techne/skills/angular/reference/routing.md +50 -0
- package/assets/techne/skills/angular/reference/signals-and-state.md +59 -0
- package/assets/techne/skills/angular/reference/styling-motion-a11y.md +54 -0
- package/assets/techne/skills/angular/reference/testing.md +52 -0
- package/assets/techne/skills/angular/reference/tooling.md +31 -0
- package/assets/techne/skills/cpp/SKILL.md +27 -0
- package/assets/techne/skills/cpp/reference/coding-standards.md +160 -0
- package/assets/techne/skills/databases/SKILL.md +35 -0
- package/assets/techne/skills/databases/reference/clickhouse.md +102 -0
- package/assets/techne/skills/databases/reference/migrations.md +94 -0
- package/assets/techne/skills/databases/reference/mysql.md +101 -0
- package/assets/techne/skills/databases/reference/postgres.md +72 -0
- package/assets/techne/skills/databases/reference/prisma.md +105 -0
- package/assets/techne/skills/databases/reference/redis.md +108 -0
- package/assets/techne/skills/delivery/SKILL.md +35 -0
- package/assets/techne/skills/delivery/reference/deployment-patterns.md +58 -0
- package/assets/techne/skills/delivery/reference/docker-patterns.md +77 -0
- package/assets/techne/skills/delivery/reference/git-workflow.md +64 -0
- package/assets/techne/skills/delivery/reference/github-ops.md +67 -0
- package/assets/techne/skills/delivery/reference/jira-integration.md +53 -0
- package/assets/techne/skills/delivery/reference/kubernetes-patterns.md +67 -0
- package/assets/techne/skills/dotnet/SKILL.md +27 -0
- package/assets/techne/skills/dotnet/reference/dotnet-core.md +131 -0
- package/assets/techne/skills/flutter/SKILL.md +29 -0
- package/assets/techne/skills/flutter/reference/code-review.md +76 -0
- package/assets/techne/skills/flutter/reference/patterns.md +201 -0
- package/assets/techne/skills/go/SKILL.md +28 -0
- package/assets/techne/skills/go/reference/patterns.md +87 -0
- package/assets/techne/skills/go/reference/testing.md +142 -0
- package/assets/techne/skills/java/SKILL.md +29 -0
- package/assets/techne/skills/java/reference/java-standards.md +117 -0
- package/assets/techne/skills/java/reference/springboot.md +108 -0
- package/assets/techne/skills/kotlin/SKILL.md +35 -0
- package/assets/techne/skills/kotlin/reference/android-clean-architecture.md +115 -0
- package/assets/techne/skills/kotlin/reference/compose-multiplatform-patterns.md +113 -0
- package/assets/techne/skills/kotlin/reference/kotlin-coroutines-flows.md +93 -0
- package/assets/techne/skills/kotlin/reference/kotlin-patterns.md +74 -0
- package/assets/techne/skills/kotlin/reference/kotlin-testing.md +115 -0
- package/assets/techne/skills/ml/SKILL.md +34 -0
- package/assets/techne/skills/ml/reference/ai-regression-testing.md +99 -0
- package/assets/techne/skills/ml/reference/cost-aware-llm-pipeline.md +133 -0
- package/assets/techne/skills/ml/reference/eval-harness.md +94 -0
- package/assets/techne/skills/ml/reference/mle-workflow.md +177 -0
- package/assets/techne/skills/ml/reference/prompt-optimizer.md +107 -0
- package/assets/techne/skills/ml/reference/pytorch-patterns.md +164 -0
- package/assets/techne/skills/php/SKILL.md +27 -0
- package/assets/techne/skills/php/reference/laravel.md +142 -0
- package/assets/techne/skills/python/SKILL.md +33 -0
- package/assets/techne/skills/python/reference/django.md +104 -0
- package/assets/techne/skills/python/reference/fastapi.md +118 -0
- package/assets/techne/skills/python/reference/python-core.md +88 -0
- package/assets/techne/skills/python/reference/python-testing.md +105 -0
- package/assets/techne/skills/quality/SKILL.md +34 -0
- package/assets/techne/skills/quality/reference/benchmark.md +55 -0
- package/assets/techne/skills/quality/reference/browser-qa.md +60 -0
- package/assets/techne/skills/quality/reference/coding-standards.md +88 -0
- package/assets/techne/skills/quality/reference/e2e-testing.md +99 -0
- package/assets/techne/skills/quality/reference/tdd-workflow.md +89 -0
- package/assets/techne/skills/quality/reference/verification-loop.md +80 -0
- package/assets/techne/skills/react/SKILL.md +30 -0
- package/assets/techne/skills/react/reference/nextjs-turbopack.md +42 -0
- package/assets/techne/skills/react/reference/react-patterns.md +139 -0
- package/assets/techne/skills/react/reference/react-performance.md +101 -0
- package/assets/techne/skills/react/reference/react-testing.md +139 -0
- package/assets/techne/skills/react-native/SKILL.md +28 -0
- package/assets/techne/skills/react-native/reference/expo-patterns.md +196 -0
- package/assets/techne/skills/research/SKILL.md +35 -0
- package/assets/techne/skills/research/reference/architecture-decision-records.md +65 -0
- package/assets/techne/skills/research/reference/codebase-onboarding.md +44 -0
- package/assets/techne/skills/research/reference/deep-research.md +50 -0
- package/assets/techne/skills/research/reference/iterative-retrieval.md +62 -0
- package/assets/techne/skills/research/reference/product-lens.md +38 -0
- package/assets/techne/skills/research/reference/search-first.md +50 -0
- package/assets/techne/skills/rust/SKILL.md +28 -0
- package/assets/techne/skills/rust/reference/patterns.md +108 -0
- package/assets/techne/skills/rust/reference/testing.md +142 -0
- package/assets/techne/skills/services/SKILL.md +32 -0
- package/assets/techne/skills/services/reference/api-contracts.md +139 -0
- package/assets/techne/skills/services/reference/backend-layers.md +95 -0
- package/assets/techne/skills/services/reference/errors-and-resilience.md +146 -0
- package/assets/techne/skills/services/reference/hexagonal-boundaries.md +93 -0
- package/assets/techne/skills/services/reference/mcp-servers.md +50 -0
- package/assets/techne/skills/services/reference/nestjs.md +96 -0
- package/assets/techne/skills/swift/SKILL.md +29 -0
- package/assets/techne/skills/swift/reference/concurrency.md +83 -0
- package/assets/techne/skills/swift/reference/swiftui.md +139 -0
- package/assets/techne/skills/vue/SKILL.md +29 -0
- package/assets/techne/skills/vue/reference/nuxt4-patterns.md +90 -0
- package/assets/techne/skills/vue/reference/ui-to-vue.md +90 -0
- package/assets/techne/skills/vue/reference/vue-patterns.md +151 -0
- package/assets/techne/skills/web/SKILL.md +30 -0
- package/assets/techne/skills/web/reference/bun-runtime.md +55 -0
- package/assets/techne/skills/web/reference/frontend-patterns.md +54 -0
- package/assets/techne/skills/web/reference/seo.md +77 -0
- package/assets/techne/skills/web/reference/vite-patterns.md +96 -0
- package/bin/native.cjs +30 -0
- package/native/aarch64-apple-darwin/exonous +0 -0
- package/native/aarch64-unknown-linux-gnu/exonous +0 -0
- package/native/x86_64-apple-darwin/exonous +0 -0
- package/native/x86_64-pc-windows-msvc/exonous.exe +0 -0
- package/native/x86_64-unknown-linux-gnu/exonous +0 -0
- package/package.json +1 -6
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# UI prototypes with variant picker
|
|
2
|
+
|
|
3
|
+
Build **genuinely different** implementations of one UI piece behind fixed harness chrome so the user compares live and promotes a winner. Not for reviewing shipping code (`reference/review.md`) or dependency choice (`reference/ui-libraries.md`).
|
|
4
|
+
|
|
5
|
+
## Posture
|
|
6
|
+
|
|
7
|
+
Divergence is the product — three accent tweaks teach nothing. Each variant must be shippable-quality motion: ease-out entrances, sub-300ms UI, correct origins, transform/opacity, reduced motion. Sloppy variants waste the picker.
|
|
8
|
+
|
|
9
|
+
## Hard rules
|
|
10
|
+
|
|
11
|
+
1. **No production edits** until user picks winner (Phase 6).
|
|
12
|
+
2. Variants differ on a **named axis** (layout, density, personality, motion model) — shared tokens OK.
|
|
13
|
+
3. Each variant **works** — real interactions, plausible copy, no lorem/dead controls.
|
|
14
|
+
4. Picker chrome is **spec-fixed** below — not themed to the product.
|
|
15
|
+
5. After promote, remove prototype surface unless user keeps it.
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### 1 — Scope
|
|
20
|
+
|
|
21
|
+
One component per run. Multi-piece briefs → pick highest leverage, offer follow-ups. Restate brief in one sentence.
|
|
22
|
+
|
|
23
|
+
### 2 — Recon
|
|
24
|
+
|
|
25
|
+
Stack, styling, motion libs, design tokens, personality, surrounding context. No project → neutral standalone defaults.
|
|
26
|
+
|
|
27
|
+
### 3 — Directions
|
|
28
|
+
|
|
29
|
+
Default **3** variants (max **5**). Name + axis before code; no "Option A". Replace duplicates that differ only in color.
|
|
30
|
+
|
|
31
|
+
### 4 — Harness
|
|
32
|
+
|
|
33
|
+
- **With dev server:** isolated route `/prototypes/<slug>`, one file per variant + harness — no imports into production.
|
|
34
|
+
- **Static:** single HTML file, inline assets.
|
|
35
|
+
|
|
36
|
+
Embed picker spec from **Picker spec** section. Show **one variant full-size** in realistic context (toast needs page behind it). **Variant switch is instant** — high-frequency action, no transition.
|
|
37
|
+
|
|
38
|
+
### 5 — Verify & hand off
|
|
39
|
+
|
|
40
|
+
Run all variants; clean console; screenshot if possible. Present table and **stop for user choice**:
|
|
41
|
+
|
|
42
|
+
| # | Variant | Axis | When to pick it | Cost |
|
|
43
|
+
| --- | --- | --- | --- | --- |
|
|
44
|
+
|
|
45
|
+
Share URL/path and keyboard hints.
|
|
46
|
+
|
|
47
|
+
### 6 — Promote
|
|
48
|
+
|
|
49
|
+
Integrate winner into production conventions; delete prototype dir unless `keep … leave the picker`.
|
|
50
|
+
|
|
51
|
+
### Invocation
|
|
52
|
+
|
|
53
|
+
| Input | Behavior |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| description | Full flow, 3 variants |
|
|
56
|
+
| description xN | N variants (≤5) |
|
|
57
|
+
| riff <name> | New set around that direction |
|
|
58
|
+
| keep <name> | Promote + cleanup |
|
|
59
|
+
| keep <name>, leave the picker | Promote, keep harness |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Picker spec (harness chrome — fixed)
|
|
64
|
+
|
|
65
|
+
Dark glass pill, bottom-center (or `data-position="top"` if variant occupies bottom-center). Not brand-themed.
|
|
66
|
+
|
|
67
|
+
### Markup
|
|
68
|
+
|
|
69
|
+
```html
|
|
70
|
+
<nav class="variant-rail" aria-label="Prototype variants">
|
|
71
|
+
<span class="variant-rail-thumb" aria-hidden="true"></span>
|
|
72
|
+
<button class="variant-rail-btn" data-active aria-current="true">Quiet</button>
|
|
73
|
+
<button class="variant-rail-btn">Bold</button>
|
|
74
|
+
<button class="variant-rail-btn">Playful</button>
|
|
75
|
+
<span class="variant-rail-sep" aria-hidden="true"></span>
|
|
76
|
+
<button class="variant-rail-btn variant-rail-replay" aria-label="Replay animation (R)">↻</button>
|
|
77
|
+
</nav>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Framework: keep class names and structure.
|
|
81
|
+
|
|
82
|
+
### Styles
|
|
83
|
+
|
|
84
|
+
```css
|
|
85
|
+
.variant-rail {
|
|
86
|
+
position: fixed;
|
|
87
|
+
bottom: 24px;
|
|
88
|
+
left: 50%;
|
|
89
|
+
transform: translateX(-50%);
|
|
90
|
+
z-index: 2147483647;
|
|
91
|
+
display: flex;
|
|
92
|
+
align-items: center;
|
|
93
|
+
gap: 2px;
|
|
94
|
+
padding: 4px;
|
|
95
|
+
border-radius: 999px;
|
|
96
|
+
background: rgba(10, 10, 10, 0.82);
|
|
97
|
+
-webkit-backdrop-filter: blur(12px) saturate(1.4);
|
|
98
|
+
backdrop-filter: blur(12px) saturate(1.4);
|
|
99
|
+
box-shadow:
|
|
100
|
+
0 0 0 1px rgba(255, 255, 255, 0.08) inset,
|
|
101
|
+
0 8px 24px rgba(0, 0, 0, 0.24),
|
|
102
|
+
0 2px 6px rgba(0, 0, 0, 0.12);
|
|
103
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
104
|
+
font-size: 13px;
|
|
105
|
+
line-height: 1;
|
|
106
|
+
-webkit-font-smoothing: antialiased;
|
|
107
|
+
user-select: none;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.variant-rail-thumb {
|
|
111
|
+
position: absolute;
|
|
112
|
+
top: 4px;
|
|
113
|
+
left: 0;
|
|
114
|
+
height: 28px;
|
|
115
|
+
border-radius: 999px;
|
|
116
|
+
background: rgba(255, 255, 255, 0.12);
|
|
117
|
+
will-change: transform;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.variant-rail[data-ready] .variant-rail-thumb {
|
|
121
|
+
transition:
|
|
122
|
+
transform 250ms cubic-bezier(0.23, 1, 0.32, 1),
|
|
123
|
+
width 250ms cubic-bezier(0.23, 1, 0.32, 1);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@media (prefers-reduced-motion: reduce) {
|
|
127
|
+
.variant-rail[data-ready] .variant-rail-thumb { transition: none; }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.variant-rail-btn {
|
|
131
|
+
position: relative;
|
|
132
|
+
display: flex;
|
|
133
|
+
align-items: center;
|
|
134
|
+
height: 28px;
|
|
135
|
+
padding: 0 12px;
|
|
136
|
+
border: 0;
|
|
137
|
+
border-radius: 999px;
|
|
138
|
+
background: transparent;
|
|
139
|
+
color: rgba(255, 255, 255, 0.55);
|
|
140
|
+
font: inherit;
|
|
141
|
+
cursor: pointer;
|
|
142
|
+
transition: color 150ms ease-out;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.variant-rail-btn:hover { color: rgba(255, 255, 255, 0.85); }
|
|
146
|
+
.variant-rail-btn:active { transform: scale(0.97); }
|
|
147
|
+
.variant-rail-btn:focus-visible {
|
|
148
|
+
outline: 2px solid rgba(255, 255, 255, 0.4);
|
|
149
|
+
outline-offset: 2px;
|
|
150
|
+
}
|
|
151
|
+
.variant-rail-btn[data-active] { color: #fff; }
|
|
152
|
+
|
|
153
|
+
.variant-rail-sep {
|
|
154
|
+
width: 1px;
|
|
155
|
+
height: 16px;
|
|
156
|
+
margin: 0 4px;
|
|
157
|
+
background: rgba(255, 255, 255, 0.12);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.variant-rail-replay { padding: 0 10px; font-size: 14px; }
|
|
161
|
+
|
|
162
|
+
.variant-rail[data-position="top"] {
|
|
163
|
+
bottom: auto;
|
|
164
|
+
top: 24px;
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Thumb slides (250ms strong ease-out); **preview swap stays instant**. Width transition on thumb is allowed — no layout dependents.
|
|
169
|
+
|
|
170
|
+
Replay control only if a variant has replay-worthy entrance motion.
|
|
171
|
+
|
|
172
|
+
### Behavior
|
|
173
|
+
|
|
174
|
+
- Keys `1–N`, arrows, `R` replay; ignore when focus in input/textarea/select/contenteditable or modifiers held.
|
|
175
|
+
- Click sets `data-active` + `aria-current="true"`; thumb follows.
|
|
176
|
+
- Persist `?v=` in URL; `data-ready` after first paint so load does not animate thumb.
|
|
177
|
+
- Switch remounts variant (entrances replay); `R` remounts current.
|
|
178
|
+
|
|
179
|
+
### Reference wiring (vanilla)
|
|
180
|
+
|
|
181
|
+
```js
|
|
182
|
+
const canvas = document.getElementById('stage');
|
|
183
|
+
const rail = document.querySelector('.variant-rail');
|
|
184
|
+
const thumb = rail.querySelector('.variant-rail-thumb');
|
|
185
|
+
const tabs = [...rail.querySelectorAll('.variant-rail-btn:not(.variant-rail-replay)')];
|
|
186
|
+
const replayBtn = rail.querySelector('.variant-rail-replay');
|
|
187
|
+
let idx = 0;
|
|
188
|
+
|
|
189
|
+
function syncThumb() {
|
|
190
|
+
const tab = tabs[idx];
|
|
191
|
+
thumb.style.width = `${tab.offsetWidth}px`;
|
|
192
|
+
thumb.style.transform = `translateX(${tab.offsetLeft}px)`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function renderVariant(i) {
|
|
196
|
+
canvas.replaceChildren();
|
|
197
|
+
requestAnimationFrame(() => {
|
|
198
|
+
const root = renderers[i]();
|
|
199
|
+
canvas.append(root);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function selectVariant(i) {
|
|
204
|
+
if (i < 0 || i >= renderers.length) return;
|
|
205
|
+
idx = i;
|
|
206
|
+
tabs.forEach((el, j) => {
|
|
207
|
+
const on = j === i;
|
|
208
|
+
el.toggleAttribute('data-active', on);
|
|
209
|
+
el.setAttribute('aria-current', on ? 'true' : 'false');
|
|
210
|
+
});
|
|
211
|
+
syncThumb();
|
|
212
|
+
const loc = new URL(location.href);
|
|
213
|
+
loc.searchParams.set('v', String(i + 1));
|
|
214
|
+
history.replaceState(null, '', loc);
|
|
215
|
+
renderVariant(i);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
tabs.forEach((el, i) => el.addEventListener('click', () => selectVariant(i)));
|
|
219
|
+
replayBtn?.addEventListener('click', () => renderVariant(idx));
|
|
220
|
+
window.addEventListener('resize', syncThumb);
|
|
221
|
+
|
|
222
|
+
document.addEventListener('keydown', (ev) => {
|
|
223
|
+
const tag = ev.target.tagName;
|
|
224
|
+
if (/^(INPUT|TEXTAREA|SELECT)$/.test(tag) || ev.target.isContentEditable) return;
|
|
225
|
+
if (ev.metaKey || ev.ctrlKey || ev.altKey) return;
|
|
226
|
+
const n = parseInt(ev.key, 10);
|
|
227
|
+
if (n >= 1 && n <= renderers.length) selectVariant(n - 1);
|
|
228
|
+
else if (ev.key === 'ArrowRight') selectVariant((idx + 1) % renderers.length);
|
|
229
|
+
else if (ev.key === 'ArrowLeft') selectVariant((idx - 1 + renderers.length) % renderers.length);
|
|
230
|
+
else if (ev.key === 'r' || ev.key === 'R') renderVariant(idx);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const fromUrl = parseInt(new URLSearchParams(location.search).get('v'), 10) || 1;
|
|
234
|
+
selectVariant(fromUrl - 1);
|
|
235
|
+
requestAnimationFrame(() => requestAnimationFrame(() => rail.setAttribute('data-ready', '')));
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
`renderers` = array of functions returning DOM nodes for each variant.
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Review, audit & improve motion
|
|
2
|
+
|
|
3
|
+
Single procedure for: **diff review** (block/approve), **codebase audit** (read-only findings), and **planning fixes** (self-contained plans for executors). Does not apply patches — executors use `exo-frontend` / `exo-mobile` or user-directed agents.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Part A — Review a diff
|
|
8
|
+
|
|
9
|
+
Specialized motion review only. Default **flag**; approval is earned.
|
|
10
|
+
|
|
11
|
+
### Ten standards (violations = findings)
|
|
12
|
+
|
|
13
|
+
1. **Justified motion** — purpose from allowed set; not "looks cool" on frequent UI.
|
|
14
|
+
2. **Frequency fit** — 100+/day and keyboard → no animation; tiers per `SKILL.md`.
|
|
15
|
+
3. **Responsive easing** — enter/exit ease-out or strong custom; **no ease-in** on UI.
|
|
16
|
+
4. **Sub-300ms UI** — unless justified (drawer/marketing tiers).
|
|
17
|
+
5. **Origin & physicality** — trigger-anchored origin; no `scale(0)`; modals centered OK.
|
|
18
|
+
6. **Interruptibility** — transitions/springs for rapid/gesture UI; not keyframes that restart.
|
|
19
|
+
7. **GPU props** — transform/opacity; no layout props; Motion shorthands under load → full transform string.
|
|
20
|
+
8. **Accessibility** — reduced motion (gentler, not zero); hover behind `(hover: hover) and (pointer: fine)`.
|
|
21
|
+
9. **Asymmetric timing** — slow deliberate user phase, fast system response.
|
|
22
|
+
10. **Cohesion** — motion matches product personality; blur(2px) seam optional on bad crossfades.
|
|
23
|
+
|
|
24
|
+
### Escalate immediately
|
|
25
|
+
|
|
26
|
+
`transition: all`; `scale(0)`; ease-in on UI; animation on keyboard/high-frequency; UI >300ms unjustified; center origin on anchored popover; keyframes on toasts/toggles; layout animation; Motion x/y on busy pages; parent CSS var driving child transform; missing reduced-motion or hover gate; symmetric press/release on hold flows; group entrance without 30–80ms stagger.
|
|
27
|
+
|
|
28
|
+
### Fix preference order
|
|
29
|
+
|
|
30
|
+
1. Delete animation → 2. Reduce → 3. Fix easing → 4. Fix origin/physicality → 5. Interruptible mechanism → 6. GPU path → 7. Asymmetric timing → 8. Polish (stagger, blur, `@starting-style`, spring) → 9. A11y & cohesion.
|
|
31
|
+
|
|
32
|
+
### Required output
|
|
33
|
+
|
|
34
|
+
**Table** (not Before/After lists):
|
|
35
|
+
|
|
36
|
+
| Before | After | Why |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
|
|
39
|
+
**Verdict tiers:** feel-breaking → simplifications → performance → interruptibility → origin/cohesion → a11y.
|
|
40
|
+
|
|
41
|
+
Close with **Block** (any feel-breaking, keyboard motion, scale(0), ease-in, easy GPU fix missed) or **Approve**.
|
|
42
|
+
|
|
43
|
+
Cite `file:line`. Values from reference tables below — never approximate.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Part B — Audit playbook (eight categories)
|
|
48
|
+
|
|
49
|
+
Use for full-repo or focused audits. Same value tables as review.
|
|
50
|
+
|
|
51
|
+
### 1. Purpose & frequency
|
|
52
|
+
|
|
53
|
+
Hunt keyboard/palette animation, decorative list/hover on constant paths. Strongest fix: delete.
|
|
54
|
+
|
|
55
|
+
### 2. Easing & duration
|
|
56
|
+
|
|
57
|
+
Decision order: enter/exit → ease-out; on-screen move → ease-in-out; hover/color → ease; constant → linear.
|
|
58
|
+
|
|
59
|
+
Tokens:
|
|
60
|
+
|
|
61
|
+
```css
|
|
62
|
+
--ease-out: cubic-bezier(0.23, 1, 0.32, 1);
|
|
63
|
+
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);
|
|
64
|
+
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Duration budgets: press 100–160; tooltip 125–200; dropdown 150–250; modal/drawer 200–500; marketing longer. UI <300ms. Toolbar tooltips after first should skip delay/animation.
|
|
68
|
+
|
|
69
|
+
### 3. Physicality & origin
|
|
70
|
+
|
|
71
|
+
No `scale(0)` — use 0.9–0.97 + opacity. Popovers: `transform-origin: var(--transform-origin)`. Press: scale(0.97), 160ms ease-out.
|
|
72
|
+
|
|
73
|
+
### 4. Interruptibility
|
|
74
|
+
|
|
75
|
+
Transitions vs keyframes; `@starting-style` or mount flag; springs for gestures `{ type: "spring", duration: 0.5, bounce: 0.2 }` bounce 0.1–0.3; velocity dismiss > ~0.11; rubber-band not wall; asymmetric hold/release.
|
|
76
|
+
|
|
77
|
+
### 5. Performance
|
|
78
|
+
|
|
79
|
+
transform/opacity; no `transition: all`; no parent `--var` driving child transform; Motion → transform string; CSS/WAAPI for predetermined under load; blur <20px.
|
|
80
|
+
|
|
81
|
+
### 6. Accessibility
|
|
82
|
+
|
|
83
|
+
Reduced motion + hover gating (snippets in `SKILL.md`).
|
|
84
|
+
|
|
85
|
+
### 7. Cohesion & tokens
|
|
86
|
+
|
|
87
|
+
Personality match; consolidate duplicate beziers; stagger 30–80ms; crossfade blur mask.
|
|
88
|
+
|
|
89
|
+
### 8. Missed opportunities
|
|
90
|
+
|
|
91
|
+
Teleport states, missing trigger spatial story, rare delight flat — handful only, evidence-based.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Part C — Improve workflow (audit → plans)
|
|
96
|
+
|
|
97
|
+
Read-only on product source. Output lives under `plans/` or `animation-plans/`.
|
|
98
|
+
|
|
99
|
+
### Phase 1 — Recon
|
|
100
|
+
|
|
101
|
+
Stack, motion libs, token locations, personality, frequency map. Grep: `transition`, `@keyframes`, `motion.`, `ease-in`, `transition: all`, `scale(0)`, `prefers-reduced-motion`, `transform-origin`.
|
|
102
|
+
|
|
103
|
+
### Phase 2 — Audit
|
|
104
|
+
|
|
105
|
+
Run Part B categories. Large repos: parallel read-only passes per category with recon facts embedded. Effort levels:
|
|
106
|
+
|
|
107
|
+
| Mode | Scope | Findings |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| quick | Hot paths | ~5 HIGH only |
|
|
110
|
+
| standard | All interactive UI | Full table |
|
|
111
|
+
| deep | Whole repo + marketing | Full + LOW polish |
|
|
112
|
+
|
|
113
|
+
### Phase 3 — Vet & prioritize
|
|
114
|
+
|
|
115
|
+
Confirm every finding at `file:line`. Drop by-design (modal center origin, marketing duration). Table:
|
|
116
|
+
|
|
117
|
+
| # | Impact | Theme | Where | Issue | Remedy (one line) |
|
|
118
|
+
|
|
119
|
+
Impact: **HIGH** breaks feel; **MEDIUM** users notice; **LOW** polish. List 2–4 additive opportunity rows apart from fixes. **Wait for user** to pick plan targets unless batch mode → top 3–5 by leverage.
|
|
120
|
+
|
|
121
|
+
### Phase 4 — Plans
|
|
122
|
+
|
|
123
|
+
One markdown plan per selected finding in `plans/NNN-slug.md`. Plans must be executor-proof:
|
|
124
|
+
|
|
125
|
+
- Full paths and current code excerpt
|
|
126
|
+
- Exact target bezier, ms, spring config inline
|
|
127
|
+
- Ordered steps, scope boundaries
|
|
128
|
+
- Verification + feel-check (slow motion, frame step, real device for gestures)
|
|
129
|
+
- Stamp `git rev-parse --short HEAD` when writing
|
|
130
|
+
|
|
131
|
+
Update `plans/README.md` with order, dependencies, status.
|
|
132
|
+
|
|
133
|
+
### Invocation variants
|
|
134
|
+
|
|
135
|
+
| Call | Behavior |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| default | Full recon → audit → vet → wait → plans |
|
|
138
|
+
| quick / deep | Adjust coverage |
|
|
139
|
+
| category focus | Single category audit |
|
|
140
|
+
| plan <description> | Skip audit; one plan after minimal recon |
|
|
141
|
+
| execute <plan> | Executor implements; re-review diff at Part A bar |
|
|
142
|
+
| reconcile | Refresh plan status vs current code |
|
|
143
|
+
|
|
144
|
+
Respect documented intentional tradeoffs in code/docs — note, do not reopen.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Reference values (cite in findings)
|
|
149
|
+
|
|
150
|
+
**Springs (web Motion):**
|
|
151
|
+
|
|
152
|
+
```js
|
|
153
|
+
{ type: "spring", duration: 0.5, bounce: 0.2 }
|
|
154
|
+
{ type: "spring", mass: 1, stiffness: 100, damping: 10 }
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Gesture dismiss:** `velocity = Math.abs(distance) / elapsedMs`; dismiss if > ~0.11 or past distance threshold.
|
|
158
|
+
|
|
159
|
+
**Stagger:** 30–80ms; decorative only.
|
|
160
|
+
|
|
161
|
+
**Debugging when uncertain:** 2–5× duration, DevTools animation panel, physical device for gestures, revisit next day.
|
|
162
|
+
|
|
163
|
+
**Cohesion note:** Component personality sets curve choice — crisp dashboard vs playful consumer; toast libraries may use slightly slower `ease` for elegance if whole system matches.
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Sonner — React toasts
|
|
2
|
+
|
|
3
|
+
Guide for [Sonner](https://sonner.emilkowal.ski): mount once, call `toast()` from client code, style and debug. Exact prop tables below; options on `toast()` override Toaster defaults.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
1. **Single `<Toaster />`** near app root (Next.js `layout.tsx` works in RSC). Never per-page or conditional — duplicates every toast.
|
|
8
|
+
2. **`toast()` from client** — handlers, effects, callbacks. Server actions: return data; call `toast()` where the client handles the response.
|
|
9
|
+
|
|
10
|
+
```jsx
|
|
11
|
+
import { Toaster } from 'sonner';
|
|
12
|
+
import { toast } from 'sonner';
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Choosing an API
|
|
16
|
+
|
|
17
|
+
| Goal | API |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| Simple line | `toast('Title')` + optional `{ description }` |
|
|
20
|
+
| Typed icon | `toast.success` / `.error` / `.info` / `.warning` |
|
|
21
|
+
| Manual loading → done | `toast.loading` then update same `id` |
|
|
22
|
+
| Promise lifecycle | `toast.promise(promise, { loading, success, error })` — success/error may be functions of result |
|
|
23
|
+
| Primary action | `{ action: { label, onClick } }` — closes unless `preventDefault` on click |
|
|
24
|
+
| Secondary | `{ cancel: { label, onClick } }` |
|
|
25
|
+
| JSX in default chrome | `toast(<Node />)` |
|
|
26
|
+
| Full custom shell | `toast.custom((t) => <Node />)` — `t` has id for dismiss |
|
|
27
|
+
|
|
28
|
+
## Patterns
|
|
29
|
+
|
|
30
|
+
**Update by id**
|
|
31
|
+
|
|
32
|
+
```jsx
|
|
33
|
+
const handleUpload = async () => {
|
|
34
|
+
const id = toast.loading('Sending file…');
|
|
35
|
+
await upload();
|
|
36
|
+
toast.success('Sent', { id });
|
|
37
|
+
};
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Persist / dismiss / inspect**
|
|
41
|
+
|
|
42
|
+
- `{ duration: Infinity }` keeps open
|
|
43
|
+
- `toast.dismiss(id)` or `toast.dismiss()` for all
|
|
44
|
+
- `useSonner()` → `{ toasts }` in React; `toast.getActiveToasts()` outside
|
|
45
|
+
|
|
46
|
+
**Rich title/description** — function returning JSX: `toast(() => <a href="/item">Open</a>)`
|
|
47
|
+
|
|
48
|
+
**Multiple toasters** — unique `id` on each `<Toaster />`; target with `toast('…', { toasterId: 'sidebar' })`. Omitting `toasterId` broadcasts to all.
|
|
49
|
+
|
|
50
|
+
**Close hooks** — `onDismiss` (button/swipe); `onAutoClose` (timeout). No combined callback.
|
|
51
|
+
|
|
52
|
+
## Styling ladder (climb only as needed)
|
|
53
|
+
|
|
54
|
+
1. Defaults; `richColors` for vivid success/error; `invert` for contrast flip.
|
|
55
|
+
2. `toastOptions={{ style: { … } }}` global or per-call `style`.
|
|
56
|
+
3. `classNames` on toast parts — injected Sonner CSS wins; Tailwind needs `!` prefix. Many `!important`s → go headless.
|
|
57
|
+
4. **`toast.custom()`** — recommended for design-system toasts; wrap in your own helper. (`unstyled: true` is partial escape hatch.)
|
|
58
|
+
|
|
59
|
+
**Icons** — Toaster `icons` map or per-toast `icon`; `null` removes default.
|
|
60
|
+
|
|
61
|
+
**Theme** — default `theme='light'` ignores OS. Use `theme="system"` or `<Toaster theme={resolvedTheme} />` from your theme provider.
|
|
62
|
+
|
|
63
|
+
## Troubleshooting
|
|
64
|
+
|
|
65
|
+
| Symptom | Fix |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| Never shows | No root Toaster, or unmounted. Client-only from server actions. |
|
|
68
|
+
| Duplicate | Two Toasters (layout + page). StrictMode double effect → fire from handler or stable `id`. |
|
|
69
|
+
| Classes ignored | Defaults win — `!important`, `unstyled`, or custom. |
|
|
70
|
+
| Unstyled (Astro, view transitions) | `import 'sonner/dist/styles.css'` in layout. |
|
|
71
|
+
| Shadow DOM | Copy `[data-sonner-toaster]` style tag into shadow root. |
|
|
72
|
+
| Behind modal / clipped | Stacking context (`transform`, `filter`, `overflow`) or z-index — mount Toaster at document root outside dialogs. |
|
|
73
|
+
| Dark mode wrong | Set system or resolved theme prop. |
|
|
74
|
+
| Gray success/error | Enable `richColors`. |
|
|
75
|
+
| Won't close | `duration: Infinity`, `dismissible: false`, or unsettled `toast.promise`. |
|
|
76
|
+
| promise stuck loading | Must pass settling Promise; success/error configs valid. |
|
|
77
|
+
| Swipe wrong axis | Set `swipeDirections` on Toaster; defaults follow `position`. |
|
|
78
|
+
| Every toaster shows toast | Use `toasterId` pairing. |
|
|
79
|
+
| Mobile edge tight | `offset` (default 32px desktop), `mobileOffset` (16px <600px) — number, string, or per-side object. |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## API reference
|
|
84
|
+
|
|
85
|
+
### `<Toaster />`
|
|
86
|
+
|
|
87
|
+
| Prop | Type | Default | Description |
|
|
88
|
+
| --- | --- | --- | --- |
|
|
89
|
+
| `theme` | `string` | `'light'` | `'light'`, `'dark'`, `'system'`. |
|
|
90
|
+
| `richColors` | `boolean` | `false` | Stronger error/success color. |
|
|
91
|
+
| `expand` | `boolean` | `false` | Expanded stack default (else expand on hover). |
|
|
92
|
+
| `visibleToasts` | `number` | `3` | Visible count. |
|
|
93
|
+
| `id` | `string` | – | Matched by `toast({ toasterId })`. |
|
|
94
|
+
| `position` | `string` | `'bottom-right'` | `top-left`, `top-center`, `top-right`, `bottom-left`, `bottom-center`, `bottom-right`. |
|
|
95
|
+
| `closeButton` | `boolean` | `false` | Close on all toasts. |
|
|
96
|
+
| `offset` | `string \| number \| object` | `'32px'` | Edge inset; object per side e.g. `{ bottom: '24px', right: '16px' }`. |
|
|
97
|
+
| `mobileOffset` | `string \| number \| object` | `'16px'` | Inset when width < 600px. |
|
|
98
|
+
| `swipeDirections` | `array` | from position | Allowed dismiss swipe directions. |
|
|
99
|
+
| `dir` | `string` | `'ltr'` | Text direction. |
|
|
100
|
+
| `hotkey` | `string` | `⌥/alt + T` | Focus toaster region. |
|
|
101
|
+
| `invert` | `boolean` | `false` | Invert light/dark toast surface. |
|
|
102
|
+
| `toastOptions` | `object` | – | Defaults for every `toast()` option below. |
|
|
103
|
+
| `gap` | `number` | `14` | Gap when expanded. |
|
|
104
|
+
| `icons` | `object` | – | `{ success, info, warning, error, loading }`; `null` clears one. |
|
|
105
|
+
|
|
106
|
+
### `toast(message, options?)`
|
|
107
|
+
|
|
108
|
+
Message: string, JSX, or function → JSX. Returns toast id.
|
|
109
|
+
|
|
110
|
+
| Option | Type | Default | Description |
|
|
111
|
+
| --- | --- | --- | --- |
|
|
112
|
+
| `description` | `ReactNode` | – | Subtitle; may be function → JSX. |
|
|
113
|
+
| `closeButton` | `boolean` | `false` | Per-toast close. |
|
|
114
|
+
| `invert` | `boolean` | `false` | Per-toast invert. |
|
|
115
|
+
| `duration` | `number` | `4000` | Auto-close ms; `Infinity` persists. |
|
|
116
|
+
| `position` | `string` | `'bottom-right'` | Override placement. |
|
|
117
|
+
| `dismissible` | `boolean` | `true` | `false` blocks user dismiss. |
|
|
118
|
+
| `icon` | `ReactNode` | – | Leading icon; `null` hides default. |
|
|
119
|
+
| `action` | `ReactNode \| { label, onClick }` | – | Primary; closes unless `preventDefault`. |
|
|
120
|
+
| `cancel` | `ReactNode \| { label, onClick }` | – | Secondary; closes on click. |
|
|
121
|
+
| `actionButtonStyle` | `object` | `{}` | Action button inline styles. |
|
|
122
|
+
| `cancelButtonStyle` | `object` | `{}` | Cancel button inline styles. |
|
|
123
|
+
| `id` | `string` | – | Re-call with same id updates in place. |
|
|
124
|
+
| `testId` | `string` | – | `data-testid`. |
|
|
125
|
+
| `toasterId` | `string` | – | Target toaster `id`. |
|
|
126
|
+
| `style` | `object` | – | Inline toast styles. |
|
|
127
|
+
| `classNames` | `object` | – | `{ toast, title, description, actionButton, cancelButton, closeButton }` — needs `!important` unless `unstyled`. |
|
|
128
|
+
| `unstyled` | `boolean` | `false` | Strip default styles. |
|
|
129
|
+
| `onDismiss` | `(toast) => void` | – | Close button or swipe. |
|
|
130
|
+
| `onAutoClose` | `(toast) => void` | – | Timeout close. |
|
|
131
|
+
| `containerAriaLabel` | `string` | `'Notifications'` | Region label. |
|
|
132
|
+
|
|
133
|
+
### Functions
|
|
134
|
+
|
|
135
|
+
| API | Role |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `toast(msg, opts?)` | Show; returns id. |
|
|
138
|
+
| `toast.success / .error / .info / .warning` | Typed variants. |
|
|
139
|
+
| `toast.loading` | Spinner; update via id. |
|
|
140
|
+
| `toast.promise(promise, { loading, success, error })` | Async lifecycle. |
|
|
141
|
+
| `toast.custom((t) => jsx, opts?)` | Headless content. |
|
|
142
|
+
| `toast.dismiss(id?)` | One or all. |
|
|
143
|
+
| `toast.getActiveToasts()` | Snapshot outside React. |
|
|
144
|
+
| `useSonner()` | `{ toasts }` hook. |
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Picking UI & motion libraries
|
|
2
|
+
|
|
3
|
+
Explicit invocation only. Map **task → one recommendation** from the curated list. Check `package.json` first — prefer what is installed; flag churn if a competitor is already entrenched.
|
|
4
|
+
|
|
5
|
+
## Steps
|
|
6
|
+
|
|
7
|
+
1. Identify the **task** (dropdown → primitives), not the library user named.
|
|
8
|
+
2. Read existing dependencies.
|
|
9
|
+
3. Recommend **one** library, one-sentence why; wire/install if requested — no option menus when the list is clear.
|
|
10
|
+
4. Uncovered tasks: say you left the list; suggest from general knowledge.
|
|
11
|
+
|
|
12
|
+
## Curated list
|
|
13
|
+
|
|
14
|
+
### UI components & primitives
|
|
15
|
+
|
|
16
|
+
| Task | Library |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| Accessible unstyled primitives (dialog, popover, menu, select…) | [base-ui](https://base-ui.com) |
|
|
19
|
+
| Command palette (⌘K) | [cmdk](https://cmdk.paco.me) |
|
|
20
|
+
| Toasts | [Sonner](https://sonner.emilkowal.ski) — see [toasts.md](toasts.md) |
|
|
21
|
+
| OTP / verification input | [input-otp](https://input-otp.rodz.dev) |
|
|
22
|
+
| Debug/control GUI | [Leva](https://github.com/pmndrs/leva) — [dialkit](https://joshpuckett.me/dialkit) alternate |
|
|
23
|
+
|
|
24
|
+
### Motion & visuals
|
|
25
|
+
|
|
26
|
+
| Task | Library |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Springs, layout, enter/exit, gestures | [motion](https://motion.dev) |
|
|
29
|
+
| Animated numbers | [NumberFlow](https://number-flow.barvian.me) |
|
|
30
|
+
| Animated text | [torph](https://torph.lochie.me/) |
|
|
31
|
+
| 3D globe | [Cobe](https://cobe.vercel.app) |
|
|
32
|
+
| Dynamic OG images | [Satori](https://github.com/vercel/satori) |
|
|
33
|
+
| Syntax highlighting | [shiki](https://shiki.style) |
|
|
34
|
+
|
|
35
|
+
Use Motion when springs/layout/exit/gesture needed — not for a lone CSS hover fade.
|
|
36
|
+
|
|
37
|
+
### Charts
|
|
38
|
+
|
|
39
|
+
| Task | Library |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| Live streaming series | [Liveline](https://github.com/benjitaylor/liveline) |
|
|
42
|
+
| General dashboards | [recharts](https://recharts.org) |
|
|
43
|
+
|
|
44
|
+
### Lists, drag, throughput
|
|
45
|
+
|
|
46
|
+
| Task | Library |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| Reorderable / draggable UI | [dnd kit](https://dndkit.com) |
|
|
49
|
+
| Virtualized long lists or tables | [Virtuoso](https://virtuoso.dev) |
|
|
50
|
+
|
|
51
|
+
### State & styling
|
|
52
|
+
|
|
53
|
+
| Task | Library |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| Client state | [zustand](https://zustand.docs.pmnd.rs) |
|
|
56
|
+
| Conditional class strings | [clsx](https://github.com/lukeed/clsx) |
|
|
57
|
+
| Typed Tailwind variants | [cva](https://cva.style) |
|
|
58
|
+
| Theme without flash | [next-themes](https://github.com/pacocoursey/next-themes) |
|
|
59
|
+
|
|
60
|
+
clsx for ad-hoc classes; cva when variants deserve a typed API — they compose.
|
|
61
|
+
|
|
62
|
+
## Common mismatches
|
|
63
|
+
|
|
64
|
+
- Hand-rolled toasts or modal-as-toast → Sonner
|
|
65
|
+
- Div dropdown without focus trap → base-ui
|
|
66
|
+
- Re-rendered number text → NumberFlow
|
|
67
|
+
- 1000+ DOM rows → Virtuoso
|
|
68
|
+
- Prop-drilled shared state web → zustand
|
|
69
|
+
- Deep ternary class strings → clsx/cva
|
|
70
|
+
|
|
71
|
+
For animation **implementation** after picking Motion or CSS, use [web.md](web.md) or [expo.md](expo.md).
|