@xonovex/skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +21 -0
- package/commands/code-align.md +108 -0
- package/commands/code-harden.md +74 -0
- package/commands/code-simplify.md +145 -0
- package/commands/git-commit.md +146 -0
- package/commands/insights-extract.md +109 -0
- package/commands/insights-integrate.md +100 -0
- package/commands/plan-continue.md +167 -0
- package/commands/plan-create.md +107 -0
- package/commands/plan-research.md +113 -0
- package/commands/plan-subplans-create.md +111 -0
- package/commands/plan-tdd-create.md +128 -0
- package/commands/plan-update.md +99 -0
- package/commands/plan-validate.md +100 -0
- package/commands/plan-worktree-abandon.md +104 -0
- package/commands/plan-worktree-create.md +92 -0
- package/commands/plan-worktree-merge.md +132 -0
- package/package.json +44 -0
- package/skills/astro-guidelines/SKILL.md +23 -0
- package/skills/astro-guidelines/reference/accessibility.md +31 -0
- package/skills/astro-guidelines/reference/components.md +42 -0
- package/skills/astro-guidelines/reference/content-collections.md +32 -0
- package/skills/astro-guidelines/reference/islands-architecture.md +26 -0
- package/skills/astro-guidelines/reference/project-structure.md +32 -0
- package/skills/c99-game-opinionated-guidelines/SKILL.md +43 -0
- package/skills/c99-game-opinionated-guidelines/reference/builder-pattern.md +29 -0
- package/skills/c99-game-opinionated-guidelines/reference/coordinate-system.md +27 -0
- package/skills/c99-game-opinionated-guidelines/reference/geometry-pipeline.md +29 -0
- package/skills/c99-game-opinionated-guidelines/reference/math-types.md +31 -0
- package/skills/c99-game-opinionated-guidelines/reference/mesh-types.md +32 -0
- package/skills/c99-game-opinionated-guidelines/reference/physics-patterns.md +28 -0
- package/skills/c99-game-opinionated-guidelines/reference/spatial-structures.md +26 -0
- package/skills/c99-game-opinionated-guidelines/reference/tagged-unions.md +40 -0
- package/skills/c99-game-opinionated-guidelines/reference/vertex-packing.md +38 -0
- package/skills/c99-guidelines/SKILL.md +29 -0
- package/skills/c99-guidelines/reference/compound-literals.md +33 -0
- package/skills/c99-guidelines/reference/const-correctness.md +32 -0
- package/skills/c99-guidelines/reference/designated-initializers.md +32 -0
- package/skills/c99-guidelines/reference/error-handling.md +49 -0
- package/skills/c99-guidelines/reference/inline-functions.md +37 -0
- package/skills/c99-guidelines/reference/memory-management.md +35 -0
- package/skills/c99-opinionated-guidelines/SKILL.md +44 -0
- package/skills/c99-opinionated-guidelines/reference/alignment.md +50 -0
- package/skills/c99-opinionated-guidelines/reference/caller-owns-memory.md +38 -0
- package/skills/c99-opinionated-guidelines/reference/compound-literals.md +33 -0
- package/skills/c99-opinionated-guidelines/reference/const-correctness.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/data-oriented-design.md +42 -0
- package/skills/c99-opinionated-guidelines/reference/designated-initializers.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/error-handling.md +49 -0
- package/skills/c99-opinionated-guidelines/reference/file-naming.md +33 -0
- package/skills/c99-opinionated-guidelines/reference/implementation-variants.md +35 -0
- package/skills/c99-opinionated-guidelines/reference/inline-functions.md +37 -0
- package/skills/c99-opinionated-guidelines/reference/memory-management.md +35 -0
- package/skills/c99-opinionated-guidelines/reference/safety-validations.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/testing-patterns.md +39 -0
- package/skills/cmake-guidelines/SKILL.md +31 -0
- package/skills/cmake-guidelines/reference/compile-options.md +34 -0
- package/skills/cmake-guidelines/reference/fetchcontent.md +32 -0
- package/skills/cmake-guidelines/reference/find-package.md +29 -0
- package/skills/cmake-guidelines/reference/generator-expressions.md +34 -0
- package/skills/cmake-guidelines/reference/installation.md +38 -0
- package/skills/cmake-guidelines/reference/project-structure.md +40 -0
- package/skills/cmake-guidelines/reference/target-types.md +37 -0
- package/skills/cmake-guidelines/reference/testing.md +30 -0
- package/skills/cmake-guidelines/reference/visibility-specifiers.md +32 -0
- package/skills/content-guidelines/SKILL.md +36 -0
- package/skills/content-guidelines/reference/humanize.md +30 -0
- package/skills/content-guidelines/reference/news.md +28 -0
- package/skills/content-guidelines/reference/travelguide.md +31 -0
- package/skills/docker-guidelines/SKILL.md +23 -0
- package/skills/docker-guidelines/reference/docker-compose.md +40 -0
- package/skills/docker-guidelines/reference/layer-caching.md +25 -0
- package/skills/docker-guidelines/reference/multi-stage-builds.md +37 -0
- package/skills/docker-guidelines/reference/production-config.md +32 -0
- package/skills/docker-guidelines/reference/security.md +27 -0
- package/skills/express.js-guidelines/SKILL.md +32 -0
- package/skills/express.js-guidelines/reference/app-setup.md +39 -0
- package/skills/express.js-guidelines/reference/authentication.md +39 -0
- package/skills/express.js-guidelines/reference/controllers.md +49 -0
- package/skills/express.js-guidelines/reference/error-handling.md +54 -0
- package/skills/express.js-guidelines/reference/project-structure.md +29 -0
- package/skills/express.js-guidelines/reference/responses.md +30 -0
- package/skills/express.js-guidelines/reference/routes.md +29 -0
- package/skills/express.js-guidelines/reference/testing.md +39 -0
- package/skills/express.js-guidelines/reference/validation.md +41 -0
- package/skills/general-fp-guidelines/SKILL.md +28 -0
- package/skills/general-oop-guidelines/SKILL.md +28 -0
- package/skills/git-guidelines/SKILL.md +46 -0
- package/skills/git-guidelines/reference/commit.md +32 -0
- package/skills/git-guidelines/reference/merge-resolve.md +38 -0
- package/skills/git-guidelines/reference/worktree-abandon.md +48 -0
- package/skills/git-guidelines/reference/worktree-cleanup.md +40 -0
- package/skills/git-guidelines/reference/worktree-commit.md +46 -0
- package/skills/git-guidelines/reference/worktree-create.md +42 -0
- package/skills/git-guidelines/reference/worktree-merge.md +45 -0
- package/skills/git-guidelines/reference/worktree-validate.md +44 -0
- package/skills/hono-guidelines/SKILL.md +49 -0
- package/skills/hono-guidelines/reference/application-structure.md +53 -0
- package/skills/hono-guidelines/reference/context-storage.md +46 -0
- package/skills/hono-guidelines/reference/cookie-handling.md +63 -0
- package/skills/hono-guidelines/reference/error-handling.md +69 -0
- package/skills/hono-guidelines/reference/middleware-combine.md +47 -0
- package/skills/hono-guidelines/reference/middleware-patterns.md +58 -0
- package/skills/hono-guidelines/reference/platform-runtime.md +41 -0
- package/skills/hono-guidelines/reference/security-middleware.md +60 -0
- package/skills/hono-guidelines/reference/validation-type-safety.md +43 -0
- package/skills/hono-guidelines/reference/websocket-support.md +59 -0
- package/skills/hono-opinionated-guidelines/SKILL.md +49 -0
- package/skills/hono-opinionated-guidelines/reference/application-structure.md +53 -0
- package/skills/hono-opinionated-guidelines/reference/body-limit.md +57 -0
- package/skills/hono-opinionated-guidelines/reference/context-storage.md +46 -0
- package/skills/hono-opinionated-guidelines/reference/controllers.md +38 -0
- package/skills/hono-opinionated-guidelines/reference/cookie-handling.md +63 -0
- package/skills/hono-opinionated-guidelines/reference/error-handling.md +69 -0
- package/skills/hono-opinionated-guidelines/reference/middleware-combine.md +47 -0
- package/skills/hono-opinionated-guidelines/reference/middleware-patterns.md +58 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-explicit-status-codes.md +61 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-inline-handlers.md +56 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-router-hierarchy.md +64 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-spec-generation.md +57 -0
- package/skills/hono-opinionated-guidelines/reference/platform-runtime.md +41 -0
- package/skills/hono-opinionated-guidelines/reference/router-selection.md +34 -0
- package/skills/hono-opinionated-guidelines/reference/security-middleware.md +60 -0
- package/skills/hono-opinionated-guidelines/reference/validation-type-safety.md +43 -0
- package/skills/hono-opinionated-guidelines/reference/websocket-support.md +59 -0
- package/skills/insights-guidelines/SKILL.md +28 -0
- package/skills/insights-guidelines/reference/insights-extract.md +31 -0
- package/skills/insights-guidelines/reference/insights-integrate.md +35 -0
- package/skills/instruction-guidelines/SKILL.md +26 -0
- package/skills/instruction-guidelines/reference/assimilate.md +38 -0
- package/skills/instruction-guidelines/reference/simplify.md +46 -0
- package/skills/instruction-guidelines/reference/sync.md +41 -0
- package/skills/kubernetes-guidelines/SKILL.md +28 -0
- package/skills/kubernetes-guidelines/reference/configmaps-secrets.md +34 -0
- package/skills/kubernetes-guidelines/reference/deployments.md +55 -0
- package/skills/kubernetes-guidelines/reference/kustomize.md +41 -0
- package/skills/kubernetes-guidelines/reference/network-policies.md +53 -0
- package/skills/kubernetes-guidelines/reference/services.md +36 -0
- package/skills/kubernetes-guidelines/reference/validation.md +32 -0
- package/skills/lua-guidelines/SKILL.md +29 -0
- package/skills/lua-guidelines/reference/coroutines.md +66 -0
- package/skills/lua-guidelines/reference/error-handling.md +41 -0
- package/skills/lua-guidelines/reference/idiomatic-patterns.md +40 -0
- package/skills/lua-guidelines/reference/input-validation.md +42 -0
- package/skills/lua-guidelines/reference/local-variables.md +33 -0
- package/skills/lua-guidelines/reference/metatables.md +52 -0
- package/skills/lua-guidelines/reference/module-pattern.md +37 -0
- package/skills/lua-guidelines/reference/string-concatenation.md +31 -0
- package/skills/lua-opinionated-guidelines/SKILL.md +32 -0
- package/skills/lua-opinionated-guidelines/reference/cache-lookups.md +43 -0
- package/skills/lua-opinionated-guidelines/reference/coroutines.md +66 -0
- package/skills/lua-opinionated-guidelines/reference/error-handling.md +41 -0
- package/skills/lua-opinionated-guidelines/reference/idiomatic-patterns.md +40 -0
- package/skills/lua-opinionated-guidelines/reference/input-validation.md +42 -0
- package/skills/lua-opinionated-guidelines/reference/jit-friendly-tables.md +57 -0
- package/skills/lua-opinionated-guidelines/reference/local-variables.md +33 -0
- package/skills/lua-opinionated-guidelines/reference/metatables.md +52 -0
- package/skills/lua-opinionated-guidelines/reference/module-pattern.md +37 -0
- package/skills/lua-opinionated-guidelines/reference/string-concatenation.md +31 -0
- package/skills/moon-guidelines/SKILL.md +30 -0
- package/skills/moon-guidelines/reference/docker-multistage.md +42 -0
- package/skills/moon-guidelines/reference/project-constraints.md +25 -0
- package/skills/moon-guidelines/reference/query-language.md +27 -0
- package/skills/moon-guidelines/reference/tag-based-filtering.md +28 -0
- package/skills/moon-guidelines/reference/task-configuration.md +38 -0
- package/skills/moon-guidelines/reference/task-inheritance.md +30 -0
- package/skills/motion-react-guidelines/SKILL.md +66 -0
- package/skills/motion-react-guidelines/reference/3d-effects.md +35 -0
- package/skills/motion-react-guidelines/reference/entrance.md +36 -0
- package/skills/motion-react-guidelines/reference/exit.md +35 -0
- package/skills/motion-react-guidelines/reference/gestures.md +23 -0
- package/skills/motion-react-guidelines/reference/layout.md +39 -0
- package/skills/motion-react-guidelines/reference/motion-values.md +33 -0
- package/skills/motion-react-guidelines/reference/performance.md +32 -0
- package/skills/motion-react-guidelines/reference/scroll.md +38 -0
- package/skills/motion-react-guidelines/reference/spring-physics.md +40 -0
- package/skills/motion-react-guidelines/reference/stagger.md +34 -0
- package/skills/motion-react-guidelines/reference/svg-path.md +33 -0
- package/skills/motion-react-guidelines/reference/text-effects.md +39 -0
- package/skills/plan-guidelines/SKILL.md +56 -0
- package/skills/plan-guidelines/reference/code-align.md +23 -0
- package/skills/plan-guidelines/reference/code-barrels-remove.md +24 -0
- package/skills/plan-guidelines/reference/code-comments-remove.md +28 -0
- package/skills/plan-guidelines/reference/code-harden.md +30 -0
- package/skills/plan-guidelines/reference/code-shared-extract.md +25 -0
- package/skills/plan-guidelines/reference/code-simplify.md +33 -0
- package/skills/plan-guidelines/reference/code-template-extract.md +34 -0
- package/skills/plan-guidelines/reference/code-template-scaffold.md +36 -0
- package/skills/plan-guidelines/reference/general-research.md +35 -0
- package/skills/plan-guidelines/reference/plan-create.md +37 -0
- package/skills/plan-guidelines/reference/plan-tdd-create.md +44 -0
- package/skills/plan-guidelines/reference/todos.md +39 -0
- package/skills/presentation-guidelines/SKILL.md +25 -0
- package/skills/presentation-guidelines/reference/presentation-create.md +41 -0
- package/skills/presentation-guidelines/reference/presentation-motion-scaffold.md +38 -0
- package/skills/python-guidelines/SKILL.md +32 -0
- package/skills/python-guidelines/reference/async-await-patterns.md +62 -0
- package/skills/python-guidelines/reference/caching-functions.md +47 -0
- package/skills/python-guidelines/reference/dataclasses-type-hints.md +63 -0
- package/skills/python-guidelines/reference/exception-handling.md +72 -0
- package/skills/python-guidelines/reference/generators-comprehensions.md +54 -0
- package/skills/python-guidelines/reference/pathlib-file-ops.md +60 -0
- package/skills/python-guidelines/reference/resource-management.md +58 -0
- package/skills/python-guidelines/reference/string-formatting.md +41 -0
- package/skills/python-guidelines/reference/type-checking.md +47 -0
- package/skills/react-guidelines/SKILL.md +105 -0
- package/skills/react-guidelines/reference/accessibility.md +31 -0
- package/skills/react-guidelines/reference/activity-effect-event.md +42 -0
- package/skills/react-guidelines/reference/component-design.md +57 -0
- package/skills/react-guidelines/reference/hooks.md +39 -0
- package/skills/react-guidelines/reference/migration-anti-patterns.md +33 -0
- package/skills/react-guidelines/reference/migration-deprecations.md +109 -0
- package/skills/react-guidelines/reference/migration-paradigm-shifts.md +33 -0
- package/skills/react-guidelines/reference/migration-typescript.md +95 -0
- package/skills/react-guidelines/reference/new-hooks.md +94 -0
- package/skills/react-guidelines/reference/performance-optimization.md +41 -0
- package/skills/react-guidelines/reference/react-compiler.md +34 -0
- package/skills/react-guidelines/reference/server-components.md +99 -0
- package/skills/react-guidelines/reference/state-management.md +72 -0
- package/skills/react-guidelines/reference/suspense-streaming.md +36 -0
- package/skills/remotion-guidelines/SKILL.md +67 -0
- package/skills/remotion-guidelines/reference/animations.md +121 -0
- package/skills/remotion-guidelines/reference/assets.md +21 -0
- package/skills/remotion-guidelines/reference/captions.md +33 -0
- package/skills/remotion-guidelines/reference/charts.md +35 -0
- package/skills/remotion-guidelines/reference/compositions.md +40 -0
- package/skills/remotion-guidelines/reference/dom-measurement.md +82 -0
- package/skills/remotion-guidelines/reference/gifs.md +33 -0
- package/skills/remotion-guidelines/reference/lottie.md +41 -0
- package/skills/remotion-guidelines/reference/maps.md +26 -0
- package/skills/remotion-guidelines/reference/media.md +39 -0
- package/skills/remotion-guidelines/reference/mediabunny.md +28 -0
- package/skills/remotion-guidelines/reference/sequencing.md +44 -0
- package/skills/remotion-guidelines/reference/text.md +24 -0
- package/skills/remotion-guidelines/reference/three-d.md +33 -0
- package/skills/remotion-guidelines/reference/timing.md +22 -0
- package/skills/remotion-guidelines/reference/transitions.md +52 -0
- package/skills/shell-scripting-guidelines/SKILL.md +31 -0
- package/skills/shell-scripting-guidelines/reference/argument-parsing.md +67 -0
- package/skills/shell-scripting-guidelines/reference/common-patterns.md +46 -0
- package/skills/shell-scripting-guidelines/reference/error-handling.md +62 -0
- package/skills/shell-scripting-guidelines/reference/functions.md +66 -0
- package/skills/shell-scripting-guidelines/reference/idempotency.md +57 -0
- package/skills/shell-scripting-guidelines/reference/parameter-expansion.md +38 -0
- package/skills/shell-scripting-guidelines/reference/posix-compatibility.md +53 -0
- package/skills/shell-scripting-guidelines/reference/quoting.md +42 -0
- package/skills/shell-scripting-guidelines/reference/script-template.md +70 -0
- package/skills/shell-scripting-guidelines/reference/strict-mode.md +41 -0
- package/skills/shell-scripting-guidelines/reference/validation.md +30 -0
- package/skills/skill-guidelines/SKILL.md +33 -0
- package/skills/skill-guidelines/reference/assimilate.md +51 -0
- package/skills/skill-guidelines/reference/create.md +48 -0
- package/skills/skill-guidelines/reference/extract.md +48 -0
- package/skills/skill-guidelines/reference/simplify.md +56 -0
- package/skills/sql-postgresql-guidelines/SKILL.md +31 -0
- package/skills/sql-postgresql-guidelines/reference/constraints.md +47 -0
- package/skills/sql-postgresql-guidelines/reference/cte-patterns.md +42 -0
- package/skills/sql-postgresql-guidelines/reference/data-types.md +46 -0
- package/skills/sql-postgresql-guidelines/reference/indexing.md +45 -0
- package/skills/sql-postgresql-guidelines/reference/jsonb.md +54 -0
- package/skills/sql-postgresql-guidelines/reference/performance.md +46 -0
- package/skills/sql-postgresql-guidelines/reference/role-based-access.md +47 -0
- package/skills/sql-postgresql-guidelines/reference/row-level-security.md +66 -0
- package/skills/strudel-guidelines/SKILL.md +52 -0
- package/skills/strudel-guidelines/reference/arrangement.md +24 -0
- package/skills/strudel-guidelines/reference/conditionals.md +22 -0
- package/skills/strudel-guidelines/reference/effects.md +22 -0
- package/skills/strudel-guidelines/reference/genre-ambient.md +26 -0
- package/skills/strudel-guidelines/reference/genre-harsh.md +21 -0
- package/skills/strudel-guidelines/reference/genre-trance.md +23 -0
- package/skills/strudel-guidelines/reference/layering.md +22 -0
- package/skills/strudel-guidelines/reference/mini-notation.md +74 -0
- package/skills/strudel-guidelines/reference/modulation.md +22 -0
- package/skills/strudel-guidelines/reference/scales-harmony.md +20 -0
- package/skills/strudel-guidelines/reference/sounds.md +89 -0
- package/skills/strudel-guidelines/reference/tempo-timing.md +23 -0
- package/skills/terraform-guidelines/SKILL.md +28 -0
- package/skills/terraform-guidelines/reference/advanced-patterns.md +88 -0
- package/skills/terraform-guidelines/reference/locals.md +53 -0
- package/skills/terraform-guidelines/reference/module-definition.md +81 -0
- package/skills/terraform-guidelines/reference/module-structure.md +51 -0
- package/skills/terraform-guidelines/reference/remote-state.md +38 -0
- package/skills/terraform-guidelines/reference/root-module.md +71 -0
- package/skills/terraform-guidelines/reference/typed-variables.md +90 -0
- package/skills/threejs-guidelines/SKILL.md +38 -0
- package/skills/threejs-guidelines/reference/animation.md +26 -0
- package/skills/threejs-guidelines/reference/cameras-controls.md +26 -0
- package/skills/threejs-guidelines/reference/geometry.md +22 -0
- package/skills/threejs-guidelines/reference/interaction.md +25 -0
- package/skills/threejs-guidelines/reference/lighting-shadows.md +31 -0
- package/skills/threejs-guidelines/reference/loaders.md +29 -0
- package/skills/threejs-guidelines/reference/materials.md +25 -0
- package/skills/threejs-guidelines/reference/math.md +27 -0
- package/skills/threejs-guidelines/reference/node-materials.md +32 -0
- package/skills/threejs-guidelines/reference/patterns.md +29 -0
- package/skills/threejs-guidelines/reference/performance.md +24 -0
- package/skills/threejs-guidelines/reference/physics-vr.md +36 -0
- package/skills/threejs-guidelines/reference/postprocessing.md +26 -0
- package/skills/threejs-guidelines/reference/scene-fundamentals.md +26 -0
- package/skills/threejs-guidelines/reference/shaders.md +28 -0
- package/skills/threejs-guidelines/reference/textures.md +21 -0
- package/skills/threejs-guidelines/reference/webgpu.md +34 -0
- package/skills/typescript-guidelines/SKILL.md +37 -0
- package/skills/typescript-guidelines/reference/async-without-await.md +32 -0
- package/skills/typescript-guidelines/reference/avoid-barrel-exports.md +25 -0
- package/skills/typescript-guidelines/reference/avoid-eslint-disable.md +28 -0
- package/skills/typescript-guidelines/reference/avoid-reexports.md +26 -0
- package/skills/typescript-guidelines/reference/env-access-bracket-notation.md +29 -0
- package/skills/typescript-guidelines/reference/numeric-separator-enforcement.md +30 -0
- package/skills/typescript-guidelines/reference/template-literals-require-string-conversion.md +26 -0
- package/skills/typescript-guidelines/reference/unbound-method-references.md +32 -0
- package/skills/typescript-guidelines/reference/unnecessary-async-keywords.md +37 -0
- package/skills/typescript-to-lua-guidelines/SKILL.md +33 -0
- package/skills/typescript-to-lua-guidelines/reference/avoiding-heavy-features.md +41 -0
- package/skills/typescript-to-lua-guidelines/reference/coroutine-patterns.md +49 -0
- package/skills/typescript-to-lua-guidelines/reference/function-patterns.md +59 -0
- package/skills/typescript-to-lua-guidelines/reference/lua-interop.md +49 -0
- package/skills/typescript-to-lua-guidelines/reference/module-organization.md +42 -0
- package/skills/typescript-to-lua-guidelines/reference/multi-return-functions.md +47 -0
- package/skills/typescript-to-lua-guidelines/reference/namespaces-vs-classes.md +52 -0
- package/skills/typescript-to-lua-guidelines/reference/performance-tips.md +68 -0
- package/skills/typescript-to-lua-guidelines/reference/stable-tables.md +60 -0
- package/skills/typescript-to-lua-guidelines/reference/tsconfig.md +46 -0
- package/skills/typescript-to-lua-guidelines/reference/tstl-decorators.md +61 -0
- package/skills/typescript-to-lua-guidelines/reference/type-safety.md +79 -0
- package/skills/vitest-guidelines/SKILL.md +32 -0
- package/skills/vitest-guidelines/reference/cors-preflight-status-code.md +34 -0
- package/skills/vitest-guidelines/reference/http-testing.md +57 -0
- package/skills/vitest-guidelines/reference/json-response-type-safety.md +40 -0
- package/skills/vitest-guidelines/reference/mock-patterns.md +53 -0
- package/skills/vitest-guidelines/reference/project-references-path-resolution.md +36 -0
- package/skills/vitest-guidelines/reference/test-organization.md +25 -0
- package/skills/vitest-guidelines/reference/timestamp-testing.md +55 -0
- package/skills/vitest-guidelines/reference/type-safety.md +55 -0
- package/skills/vitest-guidelines/reference/typescript-config.md +43 -0
- package/skills/zod-guidelines/SKILL.md +33 -0
- package/skills/zod-guidelines/reference/default-values-output-type.md +63 -0
- package/skills/zod-guidelines/reference/migration-string-validators.md +38 -0
- package/skills/zod-guidelines/reference/migration-v4.md +46 -0
- package/skills/zod-guidelines/reference/schema-organization.md +73 -0
- package/skills/zod-guidelines/reference/validation-patterns.md +37 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# animations: Frame-Driven Animation
|
|
2
|
+
|
|
3
|
+
**Guideline:** Drive all animations with `useCurrentFrame()` and `interpolate()` or `spring()` functions, never CSS transitions.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Remotion captures each frame as an image; CSS transitions and Tailwind animations won't render in the video output.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
// Simple fade-in over 1 second (30fps = 30 frames)
|
|
11
|
+
const frame = useCurrentFrame();
|
|
12
|
+
const opacity = interpolate(frame, [0, 30], [0, 1], {
|
|
13
|
+
extrapolateRight: "clamp",
|
|
14
|
+
});
|
|
15
|
+
return <div style={{opacity}}>Fades in</div>;
|
|
16
|
+
|
|
17
|
+
// Spring bounce entrance
|
|
18
|
+
const scale = spring({frame, fps: 30, config: {damping: 8}});
|
|
19
|
+
return <div style={{transform: `scale(${scale})`}}>Bounces in</div>;
|
|
20
|
+
|
|
21
|
+
// Bad: Won't animate in Remotion
|
|
22
|
+
<div className="animate-bounce">Won't work</div>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Linear Interpolation:**
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
import {interpolate, useCurrentFrame, useVideoConfig} from "remotion";
|
|
29
|
+
|
|
30
|
+
function FadeIn() {
|
|
31
|
+
const frame = useCurrentFrame();
|
|
32
|
+
const {fps} = useVideoConfig();
|
|
33
|
+
|
|
34
|
+
// Fade in over 0.5 seconds
|
|
35
|
+
const opacity = interpolate(frame, [0, 0.5 * fps], [0, 1], {
|
|
36
|
+
extrapolateRight: "clamp",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return <div style={{opacity}}>Content</div>;
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Spring Animation:**
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
import {spring, useCurrentFrame, useVideoConfig} from "remotion";
|
|
47
|
+
|
|
48
|
+
function BounceIn() {
|
|
49
|
+
const frame = useCurrentFrame();
|
|
50
|
+
const {fps} = useVideoConfig();
|
|
51
|
+
|
|
52
|
+
const scale = spring({
|
|
53
|
+
frame,
|
|
54
|
+
fps,
|
|
55
|
+
config: {damping: 10, stiffness: 100},
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return <div style={{transform: `scale(${scale})`}}>Content</div>;
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Spring Presets:**
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
// Smooth, no bounce (subtle reveals)
|
|
66
|
+
const smooth = {damping: 200};
|
|
67
|
+
|
|
68
|
+
// Snappy, minimal bounce (UI elements)
|
|
69
|
+
const snappy = {damping: 20, stiffness: 200};
|
|
70
|
+
|
|
71
|
+
// Bouncy entrance (playful animations)
|
|
72
|
+
const bouncy = {damping: 8};
|
|
73
|
+
|
|
74
|
+
// Heavy, slow motion
|
|
75
|
+
const heavy = {damping: 15, stiffness: 80, mass: 2};
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Easing Functions:**
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
import {Easing, interpolate, useCurrentFrame} from "remotion";
|
|
82
|
+
|
|
83
|
+
function EasedMove() {
|
|
84
|
+
const frame = useCurrentFrame();
|
|
85
|
+
|
|
86
|
+
const x = interpolate(frame, [0, 30], [0, 200], {
|
|
87
|
+
easing: Easing.inOut(Easing.ease),
|
|
88
|
+
extrapolateRight: "clamp",
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Available easings: Easing.in, Easing.out, Easing.inOut
|
|
92
|
+
// Curves: Easing.ease, Easing.quad, Easing.sin, Easing.exp, Easing.circle
|
|
93
|
+
// Custom: Easing.bezier(0.25, 0.1, 0.25, 1)
|
|
94
|
+
|
|
95
|
+
return <div style={{transform: `translateX(${x}px)`}}>Moving</div>;
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Bad vs. Good:**
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
// Bad: CSS transitions won't render
|
|
103
|
+
<div className="transition-opacity duration-500 opacity-0 hover:opacity-100">Won't animate</div>
|
|
104
|
+
|
|
105
|
+
// Bad: Tailwind animation
|
|
106
|
+
<div className="animate-bounce">Won't work</div>
|
|
107
|
+
|
|
108
|
+
// Good: Frame-driven
|
|
109
|
+
const frame = useCurrentFrame();
|
|
110
|
+
const opacity = interpolate(frame, [0, 30], [0, 1]);
|
|
111
|
+
<div style={{opacity}}>Renders correctly</div>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Techniques:**
|
|
115
|
+
- useCurrentFrame(): Get current frame number from video composition
|
|
116
|
+
- interpolate(): Map frame ranges to value ranges with extrapolation control
|
|
117
|
+
- spring(): Apply physics-based motion with damping, stiffness, mass
|
|
118
|
+
- Spring presets: smooth, snappy, bouncy, heavy for different effects
|
|
119
|
+
- Easing functions: Apply easing curves (ease, quad, sin, exp, circle, bezier)
|
|
120
|
+
- No CSS transitions: Avoid transition classes, they won't render
|
|
121
|
+
- No Tailwind animations: animate-bounce, etc. won't work in Remotion
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# assets: Static Files and Asset Loading
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `staticFile()` for local assets in `public/` folder; use Remotion media components `<Img>`, `<Video>`, `<Audio>` that await loading.
|
|
4
|
+
|
|
5
|
+
**Rationale:** staticFile() ensures correct paths; Remotion components wait for full asset load before rendering (native HTML doesn't).
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
<Img src={staticFile("logo.png")} />
|
|
10
|
+
<Video src={staticFile("video.mp4")} style={{width: "100%"}} />
|
|
11
|
+
<Audio src={staticFile("music.mp3")} volume={0.5} />
|
|
12
|
+
const {fontFamily} = loadFont({family: "Custom", url: staticFile("fonts/font.woff2")});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Techniques:**
|
|
16
|
+
- staticFile("path"): Reference public/ assets; auto-encodes special characters
|
|
17
|
+
- Local assets: Place in public/; organize as images/, videos/, audio/, fonts/
|
|
18
|
+
- Remote URLs: Use directly without staticFile (CORS enabled)
|
|
19
|
+
- Google Fonts: `loadFont()` from @remotion/google-fonts/FontName
|
|
20
|
+
- Custom fonts: Load with @remotion/fonts; measure with measureText()
|
|
21
|
+
- Avoid: Native `<img>`, `<video>`, `<audio>` (don't wait for load)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# filename: captions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `@remotion/captions` with `parseSrt()` for accurate timing; use `createTikTokStyleCaptions()` for word-by-word display.
|
|
4
|
+
|
|
5
|
+
**Rationale:** SRT parsing is error-prone manually; library handles edge cases; `TikTokStyleCaptions` enables smooth word highlighting matching audio timing.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
function Captions({captions}) {
|
|
10
|
+
const frame = useCurrentFrame();
|
|
11
|
+
const {fps} = useVideoConfig();
|
|
12
|
+
const currentTimeMs = (frame / fps) * 1000;
|
|
13
|
+
|
|
14
|
+
const activeCaption = captions.find(
|
|
15
|
+
(c) => currentTimeMs >= c.startMs && currentTimeMs < c.endMs
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
return activeCaption ? (
|
|
19
|
+
<div style={{position: "absolute", bottom: 100, fontSize: 48, color: "white"}}>
|
|
20
|
+
{activeCaption.text}
|
|
21
|
+
</div>
|
|
22
|
+
) : null;
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Techniques:**
|
|
27
|
+
- Parse SRT: `const {captions} = parseSrt({input: srtContent})`; captions have `startMs`, `endMs`, `text`
|
|
28
|
+
- Frame to time: `currentTimeMs = (frame / fps) * 1000`; match against caption range
|
|
29
|
+
- TikTok style: `createTikTokStyleCaptions({captions})` returns pages with tokens (individual words)
|
|
30
|
+
- Word highlighting: Check `isActive` per token; apply color/scale transform on active words
|
|
31
|
+
- Remote SRT: Use `delayRender()`/`continueRender()` for async fetch; load before rendering
|
|
32
|
+
- Styling: Add background, padding, text-shadow for readability; center with `transform: translateX(-50%)`
|
|
33
|
+
- Dynamic timing: Use `spring()` for scale animation on word activation for emphasis effect
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# filename: charts
|
|
2
|
+
|
|
3
|
+
**Guideline:** Build charts with React/SVG; animate with `useCurrentFrame()` + `interpolate()` or `spring()`; disable third-party library animations.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Remotion controls frame-by-frame timing; library animations bypass frame control; manual rendering ensures sync with audio/video.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
function BarChart({data}) {
|
|
10
|
+
const frame = useCurrentFrame();
|
|
11
|
+
const {fps} = useVideoConfig();
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<AbsoluteFill style={{backgroundColor: "#1a1a2e"}}>
|
|
15
|
+
<svg width="100%" height="100%">
|
|
16
|
+
{data.map((item, i) => {
|
|
17
|
+
const delay = i * 5;
|
|
18
|
+
const progress = spring({frame: frame - delay - 10, fps, config: {damping: 18}});
|
|
19
|
+
const barHeight = (item.value / maxValue) * 300 * progress;
|
|
20
|
+
return <rect key={i} y={350 - barHeight} height={barHeight} fill={item.color} />;
|
|
21
|
+
})}
|
|
22
|
+
</svg>
|
|
23
|
+
</AbsoluteFill>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Techniques:**
|
|
29
|
+
- Bar chart: `spring()` for per-bar stagger; `frame - delay` for sequential animation
|
|
30
|
+
- Pie chart: `interpolate()` for smooth arc fill; use SVG path math for arcs
|
|
31
|
+
- Line chart: SVG path with `strokeDasharray`/`strokeDashoffset` for drawing animation
|
|
32
|
+
- Counter numbers: `interpolate(frame, [0, fps], [0, target])` for smooth count
|
|
33
|
+
- Stagger elements: Use `index * delay` to offset animation start per element
|
|
34
|
+
- Disable library animations: Set `animation: false` in Chart.js; don't use D3 `.transition()`
|
|
35
|
+
- Use `interpolate()` for smooth ranges; `spring()` for bouncy/organic feel
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# filename: compositions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Define compositions in `Root.tsx` with `type` declarations (not `interface`) and Zod `schema` for visual parameter UI; use `calculateMetadata()` for dynamic values.
|
|
4
|
+
|
|
5
|
+
**Rationale:** `type` works better with `defaultProps` and Zod inference; schema enables GUI parameter editing; `calculateMetadata` enables dynamic duration/dimensions from props.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
const schema = z.object({
|
|
10
|
+
title: z.string(),
|
|
11
|
+
backgroundColor: zColor(),
|
|
12
|
+
fontSize: z.number().min(10).max(200)
|
|
13
|
+
});
|
|
14
|
+
type Props = z.infer<typeof schema>;
|
|
15
|
+
|
|
16
|
+
export function RemotionRoot() {
|
|
17
|
+
return (
|
|
18
|
+
<Composition<Props>
|
|
19
|
+
id="MyVideo"
|
|
20
|
+
component={MyVideo}
|
|
21
|
+
durationInFrames={300}
|
|
22
|
+
fps={30}
|
|
23
|
+
width={1920}
|
|
24
|
+
height={1080}
|
|
25
|
+
schema={schema}
|
|
26
|
+
defaultProps={{title: "Hello", backgroundColor: "#fff", fontSize: 48}}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Techniques:**
|
|
33
|
+
- Composition setup: `id`, `component`, `durationInFrames`, `fps`, `width`, `height` required
|
|
34
|
+
- Type vs interface: Always use `type`, not `interface`; works better with Zod inference
|
|
35
|
+
- Schema UI: `z.object({...})` with `zColor()`, `z.number().min().max()`, `z.enum()` for visual editor
|
|
36
|
+
- Dynamic metadata: `calculateMetadata({props}) => ({durationInFrames: ...})` for async resolution
|
|
37
|
+
- Folder organization: Wrap `<Composition>` in `<Folder name="...">` for grouping
|
|
38
|
+
- Still images: `<Still>` for single frames; no `durationInFrames`/`fps` needed
|
|
39
|
+
- Props inference: Use `z.infer<typeof schema>` for type-safe props
|
|
40
|
+
- defaultProps required: Set sensible defaults for all schema fields
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# dom-measurement: Measuring DOM Elements
|
|
2
|
+
|
|
3
|
+
**Guideline:** Divide `getBoundingClientRect()` values by `useCurrentScale()` to account for Remotion's scale transforms.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Remotion applies scale transforms to elements; measurements need correction to reflect actual dimensions at scale 1.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
// Without scale correction (wrong)
|
|
11
|
+
const rect = ref.current.getBoundingClientRect();
|
|
12
|
+
const width = rect.width; // Scaled value
|
|
13
|
+
|
|
14
|
+
// With scale correction (correct)
|
|
15
|
+
const scale = useCurrentScale();
|
|
16
|
+
const width = rect.width / scale; // Actual unscaled width
|
|
17
|
+
|
|
18
|
+
// Full example
|
|
19
|
+
const scale = useCurrentScale();
|
|
20
|
+
const {width: scaled_width, height: scaled_height} = ref.current.getBoundingClientRect();
|
|
21
|
+
return <div>Actual size: {scaled_width / scale} x {scaled_height / scale}</div>;
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Correct Measurement:**
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import {useCurrentScale} from "remotion";
|
|
28
|
+
import {useEffect, useRef, useState} from "react";
|
|
29
|
+
|
|
30
|
+
export function MeasuredComponent() {
|
|
31
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
32
|
+
const scale = useCurrentScale();
|
|
33
|
+
const [dimensions, setDimensions] = useState({width: 0, height: 0});
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (!ref.current) return;
|
|
37
|
+
|
|
38
|
+
const rect = ref.current.getBoundingClientRect();
|
|
39
|
+
setDimensions({
|
|
40
|
+
width: rect.width / scale,
|
|
41
|
+
height: rect.height / scale,
|
|
42
|
+
});
|
|
43
|
+
}, [scale]);
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div ref={ref}>
|
|
47
|
+
Content to measure ({dimensions.width}x{dimensions.height})
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Outline vs Border:** Outline doesn't affect layout; border does at different scales.
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
function PositionedElement() {
|
|
57
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
58
|
+
const scale = useCurrentScale();
|
|
59
|
+
const [position, setPosition] = useState({x: 0, y: 0});
|
|
60
|
+
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!ref.current) return;
|
|
63
|
+
|
|
64
|
+
const rect = ref.current.getBoundingClientRect();
|
|
65
|
+
setPosition({
|
|
66
|
+
x: rect.left / scale,
|
|
67
|
+
y: rect.top / scale,
|
|
68
|
+
});
|
|
69
|
+
}, [scale]);
|
|
70
|
+
|
|
71
|
+
return <div ref={ref}>Element at ({position.x}, {position.y})</div>;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Techniques:**
|
|
76
|
+
- useCurrentScale(): Get scale factor applied by Remotion
|
|
77
|
+
- Divide measurements: width/scale, height/scale for correct values
|
|
78
|
+
- useEffect hook: Measure elements after mount with scale dependency
|
|
79
|
+
- outline vs border: Use outline to avoid layout shifts at different scales
|
|
80
|
+
- getBoundingClientRect(): Get left, top, width, height of element
|
|
81
|
+
- useRef: Store reference to DOM element for measurement
|
|
82
|
+
- Sync with scale: Update measurements when scale changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# gifs: Animated Images (GIF, APNG, WebP, AVIF)
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `<AnimatedImage>` for frame-synchronized playback of animated images.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Native img tags don't sync with Remotion's timeline. `<AnimatedImage>` provides proper frame synchronization and playback control.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import { AnimatedImage, staticFile, Composition } from 'remotion'
|
|
10
|
+
|
|
11
|
+
export const MyComposition = () => (
|
|
12
|
+
<Composition>
|
|
13
|
+
<AnimatedImage
|
|
14
|
+
src={staticFile('animation.gif')}
|
|
15
|
+
width={1920}
|
|
16
|
+
height={1080}
|
|
17
|
+
playbackRate={1}
|
|
18
|
+
loop
|
|
19
|
+
fit="contain"
|
|
20
|
+
/>
|
|
21
|
+
</Composition>
|
|
22
|
+
)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Techniques:**
|
|
26
|
+
- Import `AnimatedImage` and `staticFile` from `remotion` package
|
|
27
|
+
- Set explicit `width` and `height` props for proper sizing and rendering
|
|
28
|
+
- Use `staticFile()` for local assets, remote URLs with CORS headers
|
|
29
|
+
- Control playback speed with `playbackRate` prop (0.5 = half, 2 = double)
|
|
30
|
+
- Set loop behavior: `loop` (default), `pause-after-finish`, or `clear-after-finish`
|
|
31
|
+
- Choose sizing mode: `fit="fill"` (stretch), `fit="contain"` (aspect-ratio), `fit="cover"` (crop)
|
|
32
|
+
- Get GIF duration with `getGifDurationInSeconds()` for dynamic composition length
|
|
33
|
+
- Apply CSS styles: borderRadius, position, opacity, filters
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# lottie: Lottie Animations
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `delayRender()` pattern to load Lottie JSON before rendering compositions.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Animations must load asynchronously. `delayRender()` pauses frame rendering until `continueRender()` is called after JSON loads.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import { Lottie, useVideoConfig } from '@remotion/lottie'
|
|
10
|
+
import { delayRender, continueRender } from 'remotion'
|
|
11
|
+
|
|
12
|
+
const handle = delayRender()
|
|
13
|
+
|
|
14
|
+
export const MyAnimation = () => {
|
|
15
|
+
const [animData, setAnimData] = useState<LottieAnimationData | null>(null)
|
|
16
|
+
const { fps } = useVideoConfig()
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
fetch('https://lottiefiles.com/animations/123.json')
|
|
20
|
+
.then(r => r.json())
|
|
21
|
+
.then(data => {
|
|
22
|
+
setAnimData(data)
|
|
23
|
+
continueRender(handle)
|
|
24
|
+
})
|
|
25
|
+
.catch(err => cancelRender(err))
|
|
26
|
+
}, [handle])
|
|
27
|
+
|
|
28
|
+
return animData ? <Lottie animationData={animData} /> : null
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Techniques:**
|
|
33
|
+
- Install `@remotion/lottie` package before use
|
|
34
|
+
- Call `delayRender()` to pause frame rendering while loading
|
|
35
|
+
- Fetch animation JSON from remote (Lottie Files) or local with `staticFile()`
|
|
36
|
+
- Store fetched JSON in state with `useState<LottieAnimationData | null>()`
|
|
37
|
+
- Call `continueRender(handle)` when JSON loaded successfully
|
|
38
|
+
- Call `cancelRender(err)` if fetch fails to report error
|
|
39
|
+
- Return null while loading to prevent rendering with undefined data
|
|
40
|
+
- Pass animation data to `<Lottie animationData={...} />` component
|
|
41
|
+
- Apply width/height styles via style props
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# maps: Map Animations with Mapbox
|
|
2
|
+
|
|
3
|
+
**Guideline:** Disable Mapbox animations (fadeDuration: 0, interactive: false); control camera/lines via Remotion frames; use turf.js for route.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Mapbox animations conflict with frame-by-frame rendering; Remotion frame control ensures deterministic animation.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
const _map = new Map({
|
|
10
|
+
container: ref.current!,
|
|
11
|
+
interactive: false, // CRITICAL
|
|
12
|
+
fadeDuration: 0, // CRITICAL
|
|
13
|
+
zoom: 11.53,
|
|
14
|
+
center: [6.5615, 46.0598],
|
|
15
|
+
});
|
|
16
|
+
// Animate with: turf.along(lineString, distance * progress)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Techniques:**
|
|
20
|
+
- Map config: interactive: false, fadeDuration: 0 disable Mapbox animations
|
|
21
|
+
- delayRender/continueRender: Wait for map.load and camera.idle events
|
|
22
|
+
- turf.js: Route distance, lineSliceAlong for curved animation
|
|
23
|
+
- Add GeoJSON sources for lines, markers, labels
|
|
24
|
+
- Free camera: Use getFreeCameraOptions(), lookAtPoint() for control
|
|
25
|
+
- Render: --gl=angle --concurrency=1 for Mapbox stability
|
|
26
|
+
- Performance: Hide unwanted features with setConfigProperty("basemap", name, false)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# media: Audio and Video Manipulation
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `<Audio>` and `<Video>` from Remotion for frame-synchronized playback.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Native HTML elements don't sync properly with Remotion's timeline. Remotion components provide frame-synchronized playback control.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import { Video, Audio, useVideoConfig } from 'remotion'
|
|
10
|
+
|
|
11
|
+
export const MediaComposition = () => {
|
|
12
|
+
const { fps } = useVideoConfig()
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<>
|
|
16
|
+
<Video
|
|
17
|
+
src="video.mp4"
|
|
18
|
+
startFrom={fps * 2} // Start at 2 seconds
|
|
19
|
+
endAt={fps * 10} // End at 10 seconds
|
|
20
|
+
playbackRate={1}
|
|
21
|
+
volume={0.8}
|
|
22
|
+
style={{ width: '100%', height: '100%' }}
|
|
23
|
+
/>
|
|
24
|
+
<Audio src="audio.mp3" volume={0.5} />
|
|
25
|
+
</>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Techniques:**
|
|
31
|
+
- Import `Audio` and `Video` from `remotion` for frame-synced playback
|
|
32
|
+
- Use `staticFile()` for local media files, remote URLs for external sources
|
|
33
|
+
- Set static volume with number (0-1 range) or dynamic with callback function
|
|
34
|
+
- Trim playback: `startFrom` and `endAt` props in frames (use `fps` for seconds)
|
|
35
|
+
- Control speed with `playbackRate` prop (0.5 = half speed, 2 = double speed)
|
|
36
|
+
- Enable looping with `loop` prop for indefinite repetition
|
|
37
|
+
- Create fade effects with `interpolate()` and frame-based callbacks
|
|
38
|
+
- Get media duration with `getVideoDuration()` or `getAudioDuration()` in calculateMetadata
|
|
39
|
+
- Apply CSS styles: width, height, position, opacity, filters
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# mediabunny: Media Metadata and Frame Extraction
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use Mediabunny for video/audio duration, dimensions, and frame extraction; check decode compatibility before playback.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Duration enables accurate durationInFrames; decode checks prevent runtime failures with unsupported codecs.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import {getVideoDuration, getVideoDimensions} from "mediabunny";
|
|
10
|
+
|
|
11
|
+
calculateMetadata: async ({props}) => {
|
|
12
|
+
const duration = await getVideoDuration(props.videoUrl);
|
|
13
|
+
const {width, height} = await getVideoDimensions(props.videoUrl);
|
|
14
|
+
return {
|
|
15
|
+
durationInFrames: Math.ceil(duration * 30),
|
|
16
|
+
width, height
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Techniques:**
|
|
22
|
+
- getVideoDuration(): Returns seconds; multiply by fps for frames
|
|
23
|
+
- getAudioDuration(): For audio files
|
|
24
|
+
- getVideoDimensions(): Returns {width, height} for dynamic sizing
|
|
25
|
+
- canDecode(): Check Input + getPrimaryVideoTrack/Audio before playback
|
|
26
|
+
- extractFrames(): Sample frames at specific timestamps using VideoSampleSink
|
|
27
|
+
- Filmstrip: Calculate timestamps based on duration and desired grid spacing
|
|
28
|
+
- Cancellation: Pass signal: controller.signal for AbortSignal support
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# sequencing: Sequencing and Scene Orchestration
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `<Sequence>` for timed playback with local frame context and `premountFor` to prevent pop-in.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Sequences provide local frame context reset and timing control. `premountFor` preloads components early to avoid rendering artifacts.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import { Sequence, Series, useCurrentFrame, useVideoConfig } from 'remotion'
|
|
10
|
+
|
|
11
|
+
export const MyComposition = () => {
|
|
12
|
+
const { fps } = useVideoConfig()
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<Series>
|
|
16
|
+
<Series.Sequence durationInFrames={2 * fps}>
|
|
17
|
+
<Scene1 />
|
|
18
|
+
</Series.Sequence>
|
|
19
|
+
<Series.Sequence durationInFrames={3 * fps} offset={-0.5 * fps}>
|
|
20
|
+
<Scene2 /> {/* Overlaps with Scene1 by 0.5 sec */}
|
|
21
|
+
</Series.Sequence>
|
|
22
|
+
<Series.Sequence durationInFrames={2 * fps}>
|
|
23
|
+
<Scene3 />
|
|
24
|
+
</Series.Sequence>
|
|
25
|
+
</Series>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const Scene1 = () => {
|
|
30
|
+
const frame = useCurrentFrame() // Starts at 0 in this Sequence
|
|
31
|
+
return <div style={{ opacity: frame / 30 }} />
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Techniques:**
|
|
36
|
+
- Use `<Sequence>` to show/hide components at specific frame ranges
|
|
37
|
+
- Set `from` prop for start frame (calculate with `fps`: `1.5 * fps` for 1.5 seconds)
|
|
38
|
+
- Set `durationInFrames` for length in frames (calculate with `fps`: `2 * fps` for 2 seconds)
|
|
39
|
+
- Enable `premountFor` to preload components early and avoid rendering pop-in
|
|
40
|
+
- Use `layout="none"` to skip AbsoluteFill wrapper for flex/grid/canvas layouts
|
|
41
|
+
- Remember `useCurrentFrame()` returns local frame context within Sequence (starts at 0)
|
|
42
|
+
- Use `<Series>` for automatic sequential timing of multiple scenes
|
|
43
|
+
- Create overlaps with `offset` prop on Series.Sequence (negative value for overlap)
|
|
44
|
+
- Nest Sequences for complex timing and layered compositions
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# text: Text and Typography
|
|
2
|
+
|
|
3
|
+
**Guideline:** Load fonts first; use measureText() for dimensions; fitText() to auto-scale; animate with frame-based calculations.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Font loading is async; measuring text enables precise layout; frame-based animation ensures consistent timing.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import {loadFont} from "@remotion/google-fonts/Roboto";
|
|
10
|
+
import {measureText, fitText} from "@remotion/layout-utils";
|
|
11
|
+
|
|
12
|
+
const {fontFamily} = loadFont(); // Google Font
|
|
13
|
+
const {width} = measureText({text: "Hello", fontFamily, fontSize: 48});
|
|
14
|
+
const {fontSize} = fitText({text, withinWidth: 500, fontFamily});
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Techniques:**
|
|
18
|
+
- Google Fonts: `loadFont()` from @remotion/google-fonts/FontName
|
|
19
|
+
- Local fonts: `loadFont({family, url: staticFile(), weight})`
|
|
20
|
+
- measureText(): Returns {width, height}; use validateFontIsLoaded: true
|
|
21
|
+
- fitText(): Auto-scale fontSize to fit container width
|
|
22
|
+
- Typewriter: `Math.floor(frame / fps * charsPerSecond)` to slice text
|
|
23
|
+
- Word highlight: spring() to animate background scaleX across word
|
|
24
|
+
- Stagger reveal: Delay each element by `index * delaySeconds * fps`
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# three-d: 3D Content with Three.js
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use ThreeCanvas (not react-three-fiber Canvas); animate with useCurrentFrame, not useFrame(); use layout="none" in Sequences.
|
|
4
|
+
|
|
5
|
+
**Rationale:** useFrame() updates real-time, not frame-perfect; Remotion requires frame-based deterministic animation.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import {ThreeCanvas} from "@remotion/three";
|
|
10
|
+
import {useCurrentFrame, useVideoConfig} from "remotion";
|
|
11
|
+
|
|
12
|
+
function RotatingCube() {
|
|
13
|
+
const frame = useCurrentFrame();
|
|
14
|
+
const {fps} = useVideoConfig();
|
|
15
|
+
const rotation = (frame / (2 * fps)) * Math.PI * 2;
|
|
16
|
+
return (
|
|
17
|
+
<mesh rotation={[0, rotation, 0]}>
|
|
18
|
+
<boxGeometry args={[1, 1, 1]} />
|
|
19
|
+
<meshStandardMaterial color="orange" />
|
|
20
|
+
</mesh>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Techniques:**
|
|
26
|
+
- ThreeCanvas: Remotion-specific wrapper (not R3F Canvas)
|
|
27
|
+
- useCurrentFrame() + fps: Calculate frame-based transforms (rotation, position)
|
|
28
|
+
- interpolate(): Linear motion and camera movement
|
|
29
|
+
- spring(): Bouncing and physics-based animation with config {damping, stiffness}
|
|
30
|
+
- PerspectiveCamera: Animate position/lookAt with useCurrentFrame
|
|
31
|
+
- Sequence layout="none": Required for ThreeCanvas (default layout breaks 3D)
|
|
32
|
+
- Lighting: ambientLight (base), directionalLight (shadows), pointLight (highlights)
|
|
33
|
+
- Stagger: Use `frame - (index * fps * delay)` for sequenced objects
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# timing: Timing and Frame Calculations
|
|
2
|
+
|
|
3
|
+
**Guideline:** Always write durations as seconds multiplied by fps for consistency; use interpolate with frame ranges, not time.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Seconds * fps pattern is clear and frame-accurate; consistent approach prevents calculation errors.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
const frame = useCurrentFrame();
|
|
10
|
+
const {fps} = useVideoConfig();
|
|
11
|
+
const startFrame = 1 * fps; // 1 second
|
|
12
|
+
const fadeIn = interpolate(frame, [0, 0.5 * fps], [0, 1], {extrapolateLeft: "clamp"});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Techniques:**
|
|
16
|
+
- Pattern: `seconds * fps` for all durations (0.1 * fps = 100ms, 1 * fps = 1s)
|
|
17
|
+
- interpolate() ranges in frames: [startFrame, endFrame] not seconds
|
|
18
|
+
- Composition: durationInFrames = totalSeconds * fps
|
|
19
|
+
- Stagger delays: index * delaySeconds * fps
|
|
20
|
+
- Visibility check: frame >= startFrame && frame < endFrame
|
|
21
|
+
- Extrapolation: Use extrapolateLeft/extrapolateRight to clamp values at edges
|
|
22
|
+
- Common: Flash 0.1s, fade 0.5s, transitions 1-2s
|