devskill 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -0
- package/README.vn.md +104 -0
- package/SKILL_GUIDE.vn.md +252 -0
- package/bin/devskill.js +11 -0
- package/meta.ts +123 -0
- package/package.json +21 -0
- package/publish.sh +50 -0
- package/scripts/cli.ts +556 -0
- package/skills/builderx_api-contexts/SKILL.md +63 -0
- package/skills/builderx_api-contexts/references/core-multi-outbox.md +57 -0
- package/skills/builderx_api-controllers/SKILL.md +49 -0
- package/skills/builderx_api-controllers/references/core-fallback.md +62 -0
- package/skills/builderx_api-schemas/SKILL.md +76 -0
- package/skills/builderx_api-schemas/references/core-schema.md +78 -0
- package/skills/builderx_spa-api/SKILL.md +67 -0
- package/skills/builderx_spa-api/references/base-api.md +97 -0
- package/skills/builderx_spa-api/references/fetch.md +70 -0
- package/skills/builderx_spa-design/SKILL.md +82 -0
- package/skills/builderx_spa-design/references/core-text-design.md +64 -0
- package/skills/builderx_spa-design/references/features-feedback-actions.md +76 -0
- package/skills/builderx_spa-design/references/features-forms.md +91 -0
- package/skills/builderx_spa-design/references/features-layout-navigation.md +121 -0
- package/skills/builderx_spa-permission/SKILL.md +38 -0
- package/skills/builderx_spa-permission/references/has-permission.md +34 -0
- package/skills/composition-patterns/AGENTS.md +946 -0
- package/skills/composition-patterns/README.md +60 -0
- package/skills/composition-patterns/SKILL.md +89 -0
- package/skills/composition-patterns/SYNC.md +5 -0
- package/skills/composition-patterns/metadata.json +11 -0
- package/skills/composition-patterns/rules/_sections.md +29 -0
- package/skills/composition-patterns/rules/_template.md +24 -0
- package/skills/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skills/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skills/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skills/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skills/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skills/composition-patterns/rules/state-context-interface.md +191 -0
- package/skills/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skills/composition-patterns/rules/state-lift-state.md +125 -0
- package/skills/deploy-to-vercel/Archive.zip +0 -0
- package/skills/deploy-to-vercel/SKILL.md +296 -0
- package/skills/deploy-to-vercel/SYNC.md +5 -0
- package/skills/deploy-to-vercel/resources/deploy-codex.sh +301 -0
- package/skills/deploy-to-vercel/resources/deploy.sh +301 -0
- package/skills/pinia/SKILL.md +105 -0
- package/skills/pinia/references/api-in-composables.md +139 -0
- package/skills/pinia/references/setup-stores.md +105 -0
- package/skills/pinia/references/using-in-components.md +91 -0
- package/skills/pinia-options/SKILL.md +72 -0
- package/skills/pinia-options/references/core-option-stores.md +149 -0
- package/skills/pinia-options/references/using-in-options-api.md +105 -0
- package/skills/react-best-practices/AGENTS.md +3373 -0
- package/skills/react-best-practices/README.md +123 -0
- package/skills/react-best-practices/SKILL.md +143 -0
- package/skills/react-best-practices/SYNC.md +5 -0
- package/skills/react-best-practices/metadata.json +15 -0
- package/skills/react-best-practices/rules/_sections.md +46 -0
- package/skills/react-best-practices/rules/_template.md +28 -0
- package/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/skills/react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/react-best-practices/rules/server-hoist-static-io.md +142 -0
- package/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/skills/react-native-skills/AGENTS.md +2897 -0
- package/skills/react-native-skills/README.md +165 -0
- package/skills/react-native-skills/SKILL.md +121 -0
- package/skills/react-native-skills/SYNC.md +5 -0
- package/skills/react-native-skills/metadata.json +16 -0
- package/skills/react-native-skills/rules/_sections.md +86 -0
- package/skills/react-native-skills/rules/_template.md +28 -0
- package/skills/react-native-skills/rules/animation-derived-value.md +53 -0
- package/skills/react-native-skills/rules/animation-gesture-detector-press.md +95 -0
- package/skills/react-native-skills/rules/animation-gpu-properties.md +65 -0
- package/skills/react-native-skills/rules/design-system-compound-components.md +66 -0
- package/skills/react-native-skills/rules/fonts-config-plugin.md +71 -0
- package/skills/react-native-skills/rules/imports-design-system-folder.md +68 -0
- package/skills/react-native-skills/rules/js-hoist-intl.md +61 -0
- package/skills/react-native-skills/rules/list-performance-callbacks.md +44 -0
- package/skills/react-native-skills/rules/list-performance-function-references.md +132 -0
- package/skills/react-native-skills/rules/list-performance-images.md +53 -0
- package/skills/react-native-skills/rules/list-performance-inline-objects.md +97 -0
- package/skills/react-native-skills/rules/list-performance-item-expensive.md +94 -0
- package/skills/react-native-skills/rules/list-performance-item-memo.md +82 -0
- package/skills/react-native-skills/rules/list-performance-item-types.md +104 -0
- package/skills/react-native-skills/rules/list-performance-virtualize.md +67 -0
- package/skills/react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
- package/skills/react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
- package/skills/react-native-skills/rules/navigation-native-navigators.md +188 -0
- package/skills/react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
- package/skills/react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
- package/skills/react-native-skills/rules/react-state-dispatcher.md +91 -0
- package/skills/react-native-skills/rules/react-state-fallback.md +56 -0
- package/skills/react-native-skills/rules/react-state-minimize.md +65 -0
- package/skills/react-native-skills/rules/rendering-no-falsy-and.md +74 -0
- package/skills/react-native-skills/rules/rendering-text-in-text-component.md +36 -0
- package/skills/react-native-skills/rules/scroll-position-no-state.md +82 -0
- package/skills/react-native-skills/rules/state-ground-truth.md +80 -0
- package/skills/react-native-skills/rules/ui-expo-image.md +66 -0
- package/skills/react-native-skills/rules/ui-image-gallery.md +104 -0
- package/skills/react-native-skills/rules/ui-measure-views.md +78 -0
- package/skills/react-native-skills/rules/ui-menus.md +174 -0
- package/skills/react-native-skills/rules/ui-native-modals.md +77 -0
- package/skills/react-native-skills/rules/ui-pressable.md +61 -0
- package/skills/react-native-skills/rules/ui-safe-area-scroll.md +65 -0
- package/skills/react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
- package/skills/react-native-skills/rules/ui-styling.md +87 -0
- package/skills/slidev/LICENSE.md +21 -0
- package/skills/slidev/README.md +61 -0
- package/skills/slidev/SKILL.md +189 -0
- package/skills/slidev/SYNC.md +5 -0
- package/skills/slidev/references/animation-click-marker.md +37 -0
- package/skills/slidev/references/animation-drawing.md +68 -0
- package/skills/slidev/references/animation-rough-marker.md +53 -0
- package/skills/slidev/references/api-slide-hooks.md +37 -0
- package/skills/slidev/references/build-og-image.md +36 -0
- package/skills/slidev/references/build-pdf.md +40 -0
- package/skills/slidev/references/build-remote-assets.md +34 -0
- package/skills/slidev/references/build-seo-meta.md +43 -0
- package/skills/slidev/references/code-groups.md +64 -0
- package/skills/slidev/references/code-import-snippet.md +55 -0
- package/skills/slidev/references/code-line-highlighting.md +50 -0
- package/skills/slidev/references/code-line-numbers.md +46 -0
- package/skills/slidev/references/code-magic-move.md +57 -0
- package/skills/slidev/references/code-max-height.md +37 -0
- package/skills/slidev/references/code-twoslash.md +42 -0
- package/skills/slidev/references/core-animations.md +196 -0
- package/skills/slidev/references/core-cli.md +140 -0
- package/skills/slidev/references/core-components.md +197 -0
- package/skills/slidev/references/core-exporting.md +148 -0
- package/skills/slidev/references/core-frontmatter.md +195 -0
- package/skills/slidev/references/core-global-context.md +155 -0
- package/skills/slidev/references/core-headmatter.md +188 -0
- package/skills/slidev/references/core-hosting.md +152 -0
- package/skills/slidev/references/core-layouts.md +286 -0
- package/skills/slidev/references/core-syntax.md +155 -0
- package/skills/slidev/references/diagram-latex.md +55 -0
- package/skills/slidev/references/diagram-mermaid.md +44 -0
- package/skills/slidev/references/diagram-plantuml.md +45 -0
- package/skills/slidev/references/editor-monaco-run.md +44 -0
- package/skills/slidev/references/editor-monaco-write.md +24 -0
- package/skills/slidev/references/editor-monaco.md +50 -0
- package/skills/slidev/references/editor-prettier.md +40 -0
- package/skills/slidev/references/editor-side.md +23 -0
- package/skills/slidev/references/editor-vscode.md +55 -0
- package/skills/slidev/references/layout-canvas-size.md +25 -0
- package/skills/slidev/references/layout-draggable.md +57 -0
- package/skills/slidev/references/layout-global-layers.md +50 -0
- package/skills/slidev/references/layout-slots.md +75 -0
- package/skills/slidev/references/layout-transform.md +33 -0
- package/skills/slidev/references/layout-zoom.md +39 -0
- package/skills/slidev/references/presenter-notes-ruby.md +35 -0
- package/skills/slidev/references/presenter-recording.md +30 -0
- package/skills/slidev/references/presenter-remote.md +40 -0
- package/skills/slidev/references/presenter-timer.md +34 -0
- package/skills/slidev/references/style-direction.md +34 -0
- package/skills/slidev/references/style-icons.md +46 -0
- package/skills/slidev/references/style-scoped.md +50 -0
- package/skills/slidev/references/syntax-block-frontmatter.md +39 -0
- package/skills/slidev/references/syntax-frontmatter-merging.md +49 -0
- package/skills/slidev/references/syntax-importing-slides.md +60 -0
- package/skills/slidev/references/syntax-mdc.md +51 -0
- package/skills/slidev/references/tool-eject-theme.md +27 -0
- package/skills/tsdown/LICENSE.md +22 -0
- package/skills/tsdown/README.md +77 -0
- package/skills/tsdown/SKILL.md +407 -0
- package/skills/tsdown/SYNC.md +5 -0
- package/skills/tsdown/references/README.md +139 -0
- package/skills/tsdown/references/advanced-benchmark.md +8 -0
- package/skills/tsdown/references/advanced-ci.md +89 -0
- package/skills/tsdown/references/advanced-hooks.md +363 -0
- package/skills/tsdown/references/advanced-plugins.md +381 -0
- package/skills/tsdown/references/advanced-programmatic.md +378 -0
- package/skills/tsdown/references/advanced-rolldown-options.md +117 -0
- package/skills/tsdown/references/guide-getting-started.md +178 -0
- package/skills/tsdown/references/guide-introduction.md +42 -0
- package/skills/tsdown/references/guide-migrate-from-tsup.md +189 -0
- package/skills/tsdown/references/option-cjs-default.md +98 -0
- package/skills/tsdown/references/option-cleaning.md +275 -0
- package/skills/tsdown/references/option-config-file.md +281 -0
- package/skills/tsdown/references/option-css.md +301 -0
- package/skills/tsdown/references/option-dependencies.md +385 -0
- package/skills/tsdown/references/option-dts.md +251 -0
- package/skills/tsdown/references/option-entry.md +211 -0
- package/skills/tsdown/references/option-exe.md +120 -0
- package/skills/tsdown/references/option-lint.md +127 -0
- package/skills/tsdown/references/option-log-level.md +91 -0
- package/skills/tsdown/references/option-minification.md +177 -0
- package/skills/tsdown/references/option-output-directory.md +270 -0
- package/skills/tsdown/references/option-output-format.md +181 -0
- package/skills/tsdown/references/option-package-exports.md +320 -0
- package/skills/tsdown/references/option-platform.md +256 -0
- package/skills/tsdown/references/option-root.md +88 -0
- package/skills/tsdown/references/option-shims.md +299 -0
- package/skills/tsdown/references/option-sourcemap.md +301 -0
- package/skills/tsdown/references/option-target.md +222 -0
- package/skills/tsdown/references/option-tree-shaking.md +335 -0
- package/skills/tsdown/references/option-unbundle.md +310 -0
- package/skills/tsdown/references/option-watch-mode.md +261 -0
- package/skills/tsdown/references/recipe-react.md +338 -0
- package/skills/tsdown/references/recipe-solid.md +46 -0
- package/skills/tsdown/references/recipe-svelte.md +54 -0
- package/skills/tsdown/references/recipe-vue.md +387 -0
- package/skills/tsdown/references/recipe-wasm.md +125 -0
- package/skills/tsdown/references/reference-cli.md +472 -0
- package/skills/turborepo/LICENSE.md +7 -0
- package/skills/turborepo/SKILL.md +951 -0
- package/skills/turborepo/SYNC.md +5 -0
- package/skills/turborepo/command/turborepo.md +70 -0
- package/skills/turborepo/references/best-practices/RULE.md +241 -0
- package/skills/turborepo/references/best-practices/dependencies.md +246 -0
- package/skills/turborepo/references/best-practices/packages.md +335 -0
- package/skills/turborepo/references/best-practices/structure.md +297 -0
- package/skills/turborepo/references/boundaries/RULE.md +126 -0
- package/skills/turborepo/references/caching/RULE.md +153 -0
- package/skills/turborepo/references/caching/gotchas.md +190 -0
- package/skills/turborepo/references/caching/remote-cache.md +127 -0
- package/skills/turborepo/references/ci/RULE.md +79 -0
- package/skills/turborepo/references/ci/github-actions.md +162 -0
- package/skills/turborepo/references/ci/patterns.md +145 -0
- package/skills/turborepo/references/ci/vercel.md +103 -0
- package/skills/turborepo/references/cli/RULE.md +100 -0
- package/skills/turborepo/references/cli/commands.md +297 -0
- package/skills/turborepo/references/configuration/RULE.md +235 -0
- package/skills/turborepo/references/configuration/global-options.md +239 -0
- package/skills/turborepo/references/configuration/gotchas.md +368 -0
- package/skills/turborepo/references/configuration/tasks.md +325 -0
- package/skills/turborepo/references/environment/RULE.md +123 -0
- package/skills/turborepo/references/environment/gotchas.md +175 -0
- package/skills/turborepo/references/environment/modes.md +101 -0
- package/skills/turborepo/references/filtering/RULE.md +148 -0
- package/skills/turborepo/references/filtering/patterns.md +152 -0
- package/skills/turborepo/references/watch/RULE.md +99 -0
- package/skills/vercel-cli-with-tokens/SKILL.md +328 -0
- package/skills/vercel-cli-with-tokens/SYNC.md +5 -0
- package/skills/vue/SKILL.md +90 -0
- package/skills/vue/references/composables.md +54 -0
- package/skills/vue/references/lifecycle.md +31 -0
- package/skills/vue/references/props-emits.md +62 -0
- package/skills/vue/references/provide-inject.md +47 -0
- package/skills/vue/references/state.md +65 -0
- package/skills/vue-antdv-tailwind/SKILL.md +33 -0
- package/skills/vue-antdv-tailwind/references/styling-rules.md +61 -0
- package/skills/vue-best-practices/LICENSE.md +21 -0
- package/skills/vue-best-practices/SKILL.md +154 -0
- package/skills/vue-best-practices/SYNC.md +5 -0
- package/skills/vue-best-practices/references/animation-class-based-technique.md +254 -0
- package/skills/vue-best-practices/references/animation-state-driven-technique.md +291 -0
- package/skills/vue-best-practices/references/component-async.md +97 -0
- package/skills/vue-best-practices/references/component-data-flow.md +307 -0
- package/skills/vue-best-practices/references/component-fallthrough-attrs.md +174 -0
- package/skills/vue-best-practices/references/component-keep-alive.md +137 -0
- package/skills/vue-best-practices/references/component-slots.md +216 -0
- package/skills/vue-best-practices/references/component-suspense.md +228 -0
- package/skills/vue-best-practices/references/component-teleport.md +108 -0
- package/skills/vue-best-practices/references/component-transition-group.md +128 -0
- package/skills/vue-best-practices/references/component-transition.md +125 -0
- package/skills/vue-best-practices/references/composables.md +290 -0
- package/skills/vue-best-practices/references/directives.md +162 -0
- package/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -0
- package/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -0
- package/skills/vue-best-practices/references/perf-virtualize-large-lists.md +187 -0
- package/skills/vue-best-practices/references/plugins.md +166 -0
- package/skills/vue-best-practices/references/reactivity.md +344 -0
- package/skills/vue-best-practices/references/render-functions.md +201 -0
- package/skills/vue-best-practices/references/sfc.md +310 -0
- package/skills/vue-best-practices/references/state-management.md +135 -0
- package/skills/vue-best-practices/references/updated-hook-performance.md +187 -0
- package/skills/vue-jsx-best-practices/LICENSE.md +21 -0
- package/skills/vue-jsx-best-practices/SKILL.md +12 -0
- package/skills/vue-jsx-best-practices/SYNC.md +5 -0
- package/skills/vue-jsx-best-practices/reference/render-function-jsx-vue-vs-react.md +141 -0
- package/skills/vue-options/SKILL.md +98 -0
- package/skills/vue-options/references/lifecycle.md +107 -0
- package/skills/vue-options/references/mixins.md +96 -0
- package/skills/vue-options/references/props-emits.md +106 -0
- package/skills/vue-options/references/provide-inject.md +92 -0
- package/skills/vue-options/references/state.md +115 -0
- package/skills/vue-options-api-best-practices/LICENSE.md +21 -0
- package/skills/vue-options-api-best-practices/SKILL.md +23 -0
- package/skills/vue-options-api-best-practices/SYNC.md +5 -0
- package/skills/vue-options-api-best-practices/reference/no-arrow-functions-in-lifecycle-hooks.md +95 -0
- package/skills/vue-options-api-best-practices/reference/no-arrow-functions-in-methods.md +68 -0
- package/skills/vue-options-api-best-practices/reference/stateful-methods-lifecycle.md +61 -0
- package/skills/vue-options-api-best-practices/reference/ts-options-api-arrow-functions-validators.md +141 -0
- package/skills/vue-options-api-best-practices/reference/ts-options-api-computed-return-types.md +192 -0
- package/skills/vue-options-api-best-practices/reference/ts-options-api-proptype-complex-types.md +212 -0
- package/skills/vue-options-api-best-practices/reference/ts-options-api-provide-inject-limitations.md +135 -0
- package/skills/vue-options-api-best-practices/reference/ts-options-api-type-event-handlers.md +202 -0
- package/skills/vue-options-api-best-practices/reference/ts-options-api-use-definecomponent.md +172 -0
- package/skills/vue-options-api-best-practices/reference/ts-strict-mode-options-api.md +197 -0
- package/skills/vue-pinia-best-practices/LICENSE.md +21 -0
- package/skills/vue-pinia-best-practices/SKILL.md +21 -0
- package/skills/vue-pinia-best-practices/SYNC.md +5 -0
- package/skills/vue-pinia-best-practices/reference/pinia-no-active-pinia-error.md +248 -0
- package/skills/vue-pinia-best-practices/reference/pinia-setup-store-return-all-state.md +227 -0
- package/skills/vue-pinia-best-practices/reference/pinia-store-destructuring-breaks-reactivity.md +193 -0
- package/skills/vue-pinia-best-practices/reference/state-url-for-ephemeral-filters.md +238 -0
- package/skills/vue-pinia-best-practices/reference/state-use-pinia-for-large-apps.md +262 -0
- package/skills/vue-pinia-best-practices/reference/store-method-binding-parentheses.md +191 -0
- package/skills/vue-router-best-practices/LICENSE.md +21 -0
- package/skills/vue-router-best-practices/SKILL.md +23 -0
- package/skills/vue-router-best-practices/SYNC.md +5 -0
- package/skills/vue-router-best-practices/reference/router-beforeenter-no-param-trigger.md +167 -0
- package/skills/vue-router-best-practices/reference/router-beforerouteenter-no-this.md +176 -0
- package/skills/vue-router-best-practices/reference/router-guard-async-await-pattern.md +227 -0
- package/skills/vue-router-best-practices/reference/router-navigation-guard-infinite-loop.md +187 -0
- package/skills/vue-router-best-practices/reference/router-navigation-guard-next-deprecated.md +150 -0
- package/skills/vue-router-best-practices/reference/router-param-change-no-lifecycle.md +181 -0
- package/skills/vue-router-best-practices/reference/router-simple-routing-cleanup.md +209 -0
- package/skills/vue-router-best-practices/reference/router-use-vue-router-for-production.md +183 -0
- package/skills/vue-testing-best-practices/LICENSE.md +21 -0
- package/skills/vue-testing-best-practices/SKILL.md +29 -0
- package/skills/vue-testing-best-practices/SYNC.md +5 -0
- package/skills/vue-testing-best-practices/reference/async-component-testing.md +163 -0
- package/skills/vue-testing-best-practices/reference/teleport-testing-complexity.md +158 -0
- package/skills/vue-testing-best-practices/reference/testing-async-await-flushpromises.md +175 -0
- package/skills/vue-testing-best-practices/reference/testing-browser-vs-node-runners.md +208 -0
- package/skills/vue-testing-best-practices/reference/testing-component-blackbox-approach.md +144 -0
- package/skills/vue-testing-best-practices/reference/testing-composables-helper-wrapper.md +238 -0
- package/skills/vue-testing-best-practices/reference/testing-e2e-playwright-recommended.md +242 -0
- package/skills/vue-testing-best-practices/reference/testing-no-snapshot-only.md +197 -0
- package/skills/vue-testing-best-practices/reference/testing-pinia-store-setup.md +228 -0
- package/skills/vue-testing-best-practices/reference/testing-suspense-async-components.md +229 -0
- package/skills/vue-testing-best-practices/reference/testing-vitest-recommended-for-vue.md +204 -0
- package/skills/vueuse-functions/LICENSE.md +21 -0
- package/skills/vueuse-functions/SKILL.md +419 -0
- package/skills/vueuse-functions/SYNC.md +5 -0
- package/skills/vueuse-functions/references/computedAsync.md +195 -0
- package/skills/vueuse-functions/references/computedEager.md +62 -0
- package/skills/vueuse-functions/references/computedInject.md +137 -0
- package/skills/vueuse-functions/references/computedWithControl.md +98 -0
- package/skills/vueuse-functions/references/createEventHook.md +86 -0
- package/skills/vueuse-functions/references/createGenericProjection.md +25 -0
- package/skills/vueuse-functions/references/createGlobalState.md +95 -0
- package/skills/vueuse-functions/references/createInjectionState.md +215 -0
- package/skills/vueuse-functions/references/createProjection.md +31 -0
- package/skills/vueuse-functions/references/createRef.md +54 -0
- package/skills/vueuse-functions/references/createReusableTemplate.md +357 -0
- package/skills/vueuse-functions/references/createSharedComposable.md +42 -0
- package/skills/vueuse-functions/references/createTemplatePromise.md +306 -0
- package/skills/vueuse-functions/references/createUnrefFn.md +51 -0
- package/skills/vueuse-functions/references/extendRef.md +76 -0
- package/skills/vueuse-functions/references/from.md +80 -0
- package/skills/vueuse-functions/references/get.md +30 -0
- package/skills/vueuse-functions/references/injectLocal.md +35 -0
- package/skills/vueuse-functions/references/isDefined.md +31 -0
- package/skills/vueuse-functions/references/logicAnd.md +40 -0
- package/skills/vueuse-functions/references/logicNot.md +36 -0
- package/skills/vueuse-functions/references/logicOr.md +40 -0
- package/skills/vueuse-functions/references/makeDestructurable.md +41 -0
- package/skills/vueuse-functions/references/onClickOutside.md +221 -0
- package/skills/vueuse-functions/references/onElementRemoval.md +88 -0
- package/skills/vueuse-functions/references/onKeyStroke.md +211 -0
- package/skills/vueuse-functions/references/onLongPress.md +227 -0
- package/skills/vueuse-functions/references/onStartTyping.md +53 -0
- package/skills/vueuse-functions/references/provideLocal.md +37 -0
- package/skills/vueuse-functions/references/reactify.md +144 -0
- package/skills/vueuse-functions/references/reactifyObject.md +62 -0
- package/skills/vueuse-functions/references/reactiveComputed.md +34 -0
- package/skills/vueuse-functions/references/reactiveOmit.md +86 -0
- package/skills/vueuse-functions/references/reactivePick.md +106 -0
- package/skills/vueuse-functions/references/refAutoReset.md +46 -0
- package/skills/vueuse-functions/references/refDebounced.md +81 -0
- package/skills/vueuse-functions/references/refDefault.md +36 -0
- package/skills/vueuse-functions/references/refManualReset.md +44 -0
- package/skills/vueuse-functions/references/refThrottled.md +99 -0
- package/skills/vueuse-functions/references/refWithControl.md +146 -0
- package/skills/vueuse-functions/references/set.md +30 -0
- package/skills/vueuse-functions/references/syncRef.md +195 -0
- package/skills/vueuse-functions/references/syncRefs.md +128 -0
- package/skills/vueuse-functions/references/templateRef.md +86 -0
- package/skills/vueuse-functions/references/toObserver.md +38 -0
- package/skills/vueuse-functions/references/toReactive.md +41 -0
- package/skills/vueuse-functions/references/toRef.md +75 -0
- package/skills/vueuse-functions/references/toRefs.md +81 -0
- package/skills/vueuse-functions/references/tryOnBeforeMount.md +34 -0
- package/skills/vueuse-functions/references/tryOnBeforeUnmount.md +32 -0
- package/skills/vueuse-functions/references/tryOnMounted.md +34 -0
- package/skills/vueuse-functions/references/tryOnScopeDispose.md +31 -0
- package/skills/vueuse-functions/references/tryOnUnmounted.md +32 -0
- package/skills/vueuse-functions/references/unrefElement.md +54 -0
- package/skills/vueuse-functions/references/until.md +161 -0
- package/skills/vueuse-functions/references/useAbs.md +31 -0
- package/skills/vueuse-functions/references/useActiveElement.md +85 -0
- package/skills/vueuse-functions/references/useAnimate.md +181 -0
- package/skills/vueuse-functions/references/useArrayDifference.md +84 -0
- package/skills/vueuse-functions/references/useArrayEvery.md +59 -0
- package/skills/vueuse-functions/references/useArrayFilter.md +63 -0
- package/skills/vueuse-functions/references/useArrayFind.md +50 -0
- package/skills/vueuse-functions/references/useArrayFindIndex.md +59 -0
- package/skills/vueuse-functions/references/useArrayFindLast.md +52 -0
- package/skills/vueuse-functions/references/useArrayIncludes.md +63 -0
- package/skills/vueuse-functions/references/useArrayJoin.md +74 -0
- package/skills/vueuse-functions/references/useArrayMap.md +59 -0
- package/skills/vueuse-functions/references/useArrayReduce.md +81 -0
- package/skills/vueuse-functions/references/useArraySome.md +59 -0
- package/skills/vueuse-functions/references/useArrayUnique.md +76 -0
- package/skills/vueuse-functions/references/useAsyncQueue.md +136 -0
- package/skills/vueuse-functions/references/useAsyncState.md +185 -0
- package/skills/vueuse-functions/references/useAsyncValidator.md +70 -0
- package/skills/vueuse-functions/references/useAuth.md +123 -0
- package/skills/vueuse-functions/references/useAverage.md +36 -0
- package/skills/vueuse-functions/references/useAxios.md +325 -0
- package/skills/vueuse-functions/references/useBase64.md +136 -0
- package/skills/vueuse-functions/references/useBattery.md +78 -0
- package/skills/vueuse-functions/references/useBluetooth.md +175 -0
- package/skills/vueuse-functions/references/useBreakpoints.md +172 -0
- package/skills/vueuse-functions/references/useBroadcastChannel.md +74 -0
- package/skills/vueuse-functions/references/useBrowserLocation.md +83 -0
- package/skills/vueuse-functions/references/useCached.md +52 -0
- package/skills/vueuse-functions/references/useCeil.md +31 -0
- package/skills/vueuse-functions/references/useChangeCase.md +79 -0
- package/skills/vueuse-functions/references/useClamp.md +85 -0
- package/skills/vueuse-functions/references/useClipboard.md +123 -0
- package/skills/vueuse-functions/references/useClipboardItems.md +94 -0
- package/skills/vueuse-functions/references/useCloned.md +91 -0
- package/skills/vueuse-functions/references/useColorMode.md +172 -0
- package/skills/vueuse-functions/references/useConfirmDialog.md +159 -0
- package/skills/vueuse-functions/references/useCookies.md +162 -0
- package/skills/vueuse-functions/references/useCountdown.md +105 -0
- package/skills/vueuse-functions/references/useCounter.md +86 -0
- package/skills/vueuse-functions/references/useCssSupports.md +35 -0
- package/skills/vueuse-functions/references/useCssVar.md +50 -0
- package/skills/vueuse-functions/references/useCurrentElement.md +61 -0
- package/skills/vueuse-functions/references/useCycleList.md +75 -0
- package/skills/vueuse-functions/references/useDark.md +144 -0
- package/skills/vueuse-functions/references/useDateFormat.md +145 -0
- package/skills/vueuse-functions/references/useDebounceFn.md +100 -0
- package/skills/vueuse-functions/references/useDebouncedRefHistory.md +40 -0
- package/skills/vueuse-functions/references/useDeviceMotion.md +86 -0
- package/skills/vueuse-functions/references/useDeviceOrientation.md +62 -0
- package/skills/vueuse-functions/references/useDevicePixelRatio.md +44 -0
- package/skills/vueuse-functions/references/useDevicesList.md +90 -0
- package/skills/vueuse-functions/references/useDisplayMedia.md +71 -0
- package/skills/vueuse-functions/references/useDocumentVisibility.md +45 -0
- package/skills/vueuse-functions/references/useDraggable.md +317 -0
- package/skills/vueuse-functions/references/useDrauu.md +65 -0
- package/skills/vueuse-functions/references/useDropZone.md +83 -0
- package/skills/vueuse-functions/references/useElementBounding.md +131 -0
- package/skills/vueuse-functions/references/useElementByPoint.md +48 -0
- package/skills/vueuse-functions/references/useElementHover.md +79 -0
- package/skills/vueuse-functions/references/useElementSize.md +78 -0
- package/skills/vueuse-functions/references/useElementVisibility.md +123 -0
- package/skills/vueuse-functions/references/useEventBus.md +101 -0
- package/skills/vueuse-functions/references/useEventListener.md +226 -0
- package/skills/vueuse-functions/references/useEventSource.md +204 -0
- package/skills/vueuse-functions/references/useExtractedObservable.md +198 -0
- package/skills/vueuse-functions/references/useEyeDropper.md +71 -0
- package/skills/vueuse-functions/references/useFavicon.md +67 -0
- package/skills/vueuse-functions/references/useFetch.md +546 -0
- package/skills/vueuse-functions/references/useFileDialog.md +91 -0
- package/skills/vueuse-functions/references/useFileSystemAccess.md +162 -0
- package/skills/vueuse-functions/references/useFirestore.md +129 -0
- package/skills/vueuse-functions/references/useFloor.md +31 -0
- package/skills/vueuse-functions/references/useFocus.md +99 -0
- package/skills/vueuse-functions/references/useFocusTrap.md +245 -0
- package/skills/vueuse-functions/references/useFocusWithin.md +57 -0
- package/skills/vueuse-functions/references/useFps.md +28 -0
- package/skills/vueuse-functions/references/useFullscreen.md +75 -0
- package/skills/vueuse-functions/references/useFuse.md +107 -0
- package/skills/vueuse-functions/references/useGamepad.md +222 -0
- package/skills/vueuse-functions/references/useGeolocation.md +85 -0
- package/skills/vueuse-functions/references/useIDBKeyval.md +93 -0
- package/skills/vueuse-functions/references/useIdle.md +88 -0
- package/skills/vueuse-functions/references/useImage.md +86 -0
- package/skills/vueuse-functions/references/useInfiniteScroll.md +157 -0
- package/skills/vueuse-functions/references/useIntersectionObserver.md +118 -0
- package/skills/vueuse-functions/references/useInterval.md +112 -0
- package/skills/vueuse-functions/references/useIntervalFn.md +50 -0
- package/skills/vueuse-functions/references/useIpcRenderer.md +144 -0
- package/skills/vueuse-functions/references/useIpcRendererInvoke.md +58 -0
- package/skills/vueuse-functions/references/useIpcRendererOn.md +52 -0
- package/skills/vueuse-functions/references/useJwt.md +57 -0
- package/skills/vueuse-functions/references/useKeyModifier.md +87 -0
- package/skills/vueuse-functions/references/useLastChanged.md +63 -0
- package/skills/vueuse-functions/references/useLocalStorage.md +41 -0
- package/skills/vueuse-functions/references/useMagicKeys.md +245 -0
- package/skills/vueuse-functions/references/useManualRefHistory.md +204 -0
- package/skills/vueuse-functions/references/useMath.md +47 -0
- package/skills/vueuse-functions/references/useMax.md +36 -0
- package/skills/vueuse-functions/references/useMediaControls.md +571 -0
- package/skills/vueuse-functions/references/useMediaQuery.md +53 -0
- package/skills/vueuse-functions/references/useMemoize.md +175 -0
- package/skills/vueuse-functions/references/useMemory.md +71 -0
- package/skills/vueuse-functions/references/useMin.md +36 -0
- package/skills/vueuse-functions/references/useMounted.md +38 -0
- package/skills/vueuse-functions/references/useMouse.md +113 -0
- package/skills/vueuse-functions/references/useMouseInElement.md +123 -0
- package/skills/vueuse-functions/references/useMousePressed.md +112 -0
- package/skills/vueuse-functions/references/useMutationObserver.md +61 -0
- package/skills/vueuse-functions/references/useNProgress.md +78 -0
- package/skills/vueuse-functions/references/useNavigatorLanguage.md +57 -0
- package/skills/vueuse-functions/references/useNetwork.md +106 -0
- package/skills/vueuse-functions/references/useNow.md +79 -0
- package/skills/vueuse-functions/references/useObjectUrl.md +55 -0
- package/skills/vueuse-functions/references/useObservable.md +91 -0
- package/skills/vueuse-functions/references/useOffsetPagination.md +199 -0
- package/skills/vueuse-functions/references/useOnline.md +41 -0
- package/skills/vueuse-functions/references/usePageLeave.md +42 -0
- package/skills/vueuse-functions/references/useParallax.md +58 -0
- package/skills/vueuse-functions/references/useParentElement.md +54 -0
- package/skills/vueuse-functions/references/usePerformanceObserver.md +48 -0
- package/skills/vueuse-functions/references/usePermission.md +79 -0
- package/skills/vueuse-functions/references/usePointer.md +89 -0
- package/skills/vueuse-functions/references/usePointerLock.md +60 -0
- package/skills/vueuse-functions/references/usePointerSwipe.md +80 -0
- package/skills/vueuse-functions/references/usePrecision.md +49 -0
- package/skills/vueuse-functions/references/usePreferredColorScheme.md +42 -0
- package/skills/vueuse-functions/references/usePreferredContrast.md +42 -0
- package/skills/vueuse-functions/references/usePreferredDark.md +41 -0
- package/skills/vueuse-functions/references/usePreferredLanguages.md +41 -0
- package/skills/vueuse-functions/references/usePreferredReducedMotion.md +42 -0
- package/skills/vueuse-functions/references/usePreferredReducedTransparency.md +42 -0
- package/skills/vueuse-functions/references/usePrevious.md +40 -0
- package/skills/vueuse-functions/references/useProjection.md +38 -0
- package/skills/vueuse-functions/references/useQRCode.md +53 -0
- package/skills/vueuse-functions/references/useRTDB.md +83 -0
- package/skills/vueuse-functions/references/useRafFn.md +68 -0
- package/skills/vueuse-functions/references/useRefHistory.md +285 -0
- package/skills/vueuse-functions/references/useResizeObserver.md +109 -0
- package/skills/vueuse-functions/references/useRound.md +31 -0
- package/skills/vueuse-functions/references/useRouteHash.md +27 -0
- package/skills/vueuse-functions/references/useRouteParams.md +38 -0
- package/skills/vueuse-functions/references/useRouteQuery.md +79 -0
- package/skills/vueuse-functions/references/useSSRWidth.md +47 -0
- package/skills/vueuse-functions/references/useScreenOrientation.md +96 -0
- package/skills/vueuse-functions/references/useScreenSafeArea.md +60 -0
- package/skills/vueuse-functions/references/useScriptTag.md +116 -0
- package/skills/vueuse-functions/references/useScroll.md +238 -0
- package/skills/vueuse-functions/references/useScrollLock.md +66 -0
- package/skills/vueuse-functions/references/useSessionStorage.md +41 -0
- package/skills/vueuse-functions/references/useShare.md +68 -0
- package/skills/vueuse-functions/references/useSortable.md +235 -0
- package/skills/vueuse-functions/references/useSorted.md +90 -0
- package/skills/vueuse-functions/references/useSpeechRecognition.md +94 -0
- package/skills/vueuse-functions/references/useSpeechSynthesis.md +105 -0
- package/skills/vueuse-functions/references/useStepper.md +137 -0
- package/skills/vueuse-functions/references/useStorage.md +278 -0
- package/skills/vueuse-functions/references/useStorageAsync.md +136 -0
- package/skills/vueuse-functions/references/useStyleTag.md +131 -0
- package/skills/vueuse-functions/references/useSubject.md +77 -0
- package/skills/vueuse-functions/references/useSubscription.md +33 -0
- package/skills/vueuse-functions/references/useSum.md +36 -0
- package/skills/vueuse-functions/references/useSupported.md +29 -0
- package/skills/vueuse-functions/references/useSwipe.md +75 -0
- package/skills/vueuse-functions/references/useTemplateRefsList.md +37 -0
- package/skills/vueuse-functions/references/useTextDirection.md +75 -0
- package/skills/vueuse-functions/references/useTextSelection.md +40 -0
- package/skills/vueuse-functions/references/useTextareaAutosize.md +97 -0
- package/skills/vueuse-functions/references/useThrottleFn.md +57 -0
- package/skills/vueuse-functions/references/useThrottledRefHistory.md +47 -0
- package/skills/vueuse-functions/references/useTimeAgo.md +154 -0
- package/skills/vueuse-functions/references/useTimeAgoIntl.md +117 -0
- package/skills/vueuse-functions/references/useTimeout.md +113 -0
- package/skills/vueuse-functions/references/useTimeoutFn.md +51 -0
- package/skills/vueuse-functions/references/useTimeoutPoll.md +47 -0
- package/skills/vueuse-functions/references/useTimestamp.md +89 -0
- package/skills/vueuse-functions/references/useTitle.md +113 -0
- package/skills/vueuse-functions/references/useToNumber.md +54 -0
- package/skills/vueuse-functions/references/useToString.md +34 -0
- package/skills/vueuse-functions/references/useToggle.md +103 -0
- package/skills/vueuse-functions/references/useTransition.md +265 -0
- package/skills/vueuse-functions/references/useTrunc.md +33 -0
- package/skills/vueuse-functions/references/useUrlSearchParams.md +121 -0
- package/skills/vueuse-functions/references/useUserMedia.md +1138 -0
- package/skills/vueuse-functions/references/useVModel.md +182 -0
- package/skills/vueuse-functions/references/useVModels.md +67 -0
- package/skills/vueuse-functions/references/useVibrate.md +87 -0
- package/skills/vueuse-functions/references/useVirtualList.md +182 -0
- package/skills/vueuse-functions/references/useWakeLock.md +50 -0
- package/skills/vueuse-functions/references/useWebNotification.md +176 -0
- package/skills/vueuse-functions/references/useWebSocket.md +299 -0
- package/skills/vueuse-functions/references/useWebWorker.md +60 -0
- package/skills/vueuse-functions/references/useWebWorkerFn.md +102 -0
- package/skills/vueuse-functions/references/useWindowFocus.md +46 -0
- package/skills/vueuse-functions/references/useWindowScroll.md +61 -0
- package/skills/vueuse-functions/references/useWindowSize.md +76 -0
- package/skills/vueuse-functions/references/useZoomFactor.md +53 -0
- package/skills/vueuse-functions/references/useZoomLevel.md +53 -0
- package/skills/vueuse-functions/references/watchArray.md +53 -0
- package/skills/vueuse-functions/references/watchAtMost.md +55 -0
- package/skills/vueuse-functions/references/watchDebounced.md +101 -0
- package/skills/vueuse-functions/references/watchDeep.md +54 -0
- package/skills/vueuse-functions/references/watchExtractedObservable.md +192 -0
- package/skills/vueuse-functions/references/watchIgnorable.md +120 -0
- package/skills/vueuse-functions/references/watchImmediate.md +44 -0
- package/skills/vueuse-functions/references/watchOnce.md +41 -0
- package/skills/vueuse-functions/references/watchPausable.md +86 -0
- package/skills/vueuse-functions/references/watchThrottled.md +108 -0
- package/skills/vueuse-functions/references/watchTriggerable.md +98 -0
- package/skills/vueuse-functions/references/watchWithFilter.md +54 -0
- package/skills/vueuse-functions/references/whenever.md +100 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/skills/web-design-guidelines/SYNC.md +5 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# React Native Guidelines
|
|
2
|
+
|
|
3
|
+
A structured repository for creating and maintaining React Native Best Practices
|
|
4
|
+
optimized for agents and LLMs.
|
|
5
|
+
|
|
6
|
+
## Structure
|
|
7
|
+
|
|
8
|
+
- `rules/` - Individual rule files (one per rule)
|
|
9
|
+
- `_sections.md` - Section metadata (titles, impacts, descriptions)
|
|
10
|
+
- `_template.md` - Template for creating new rules
|
|
11
|
+
- `area-description.md` - Individual rule files
|
|
12
|
+
- `metadata.json` - Document metadata (version, organization, abstract)
|
|
13
|
+
- **`AGENTS.md`** - Compiled output (generated)
|
|
14
|
+
|
|
15
|
+
## Rules
|
|
16
|
+
|
|
17
|
+
### Core Rendering (CRITICAL)
|
|
18
|
+
|
|
19
|
+
- `rendering-text-in-text-component.md` - Wrap strings in Text components
|
|
20
|
+
- `rendering-no-falsy-and.md` - Avoid falsy && operator in JSX
|
|
21
|
+
|
|
22
|
+
### List Performance (HIGH)
|
|
23
|
+
|
|
24
|
+
- `list-performance-virtualize.md` - Use virtualized lists (LegendList,
|
|
25
|
+
FlashList)
|
|
26
|
+
- `list-performance-function-references.md` - Keep stable object references
|
|
27
|
+
- `list-performance-callbacks.md` - Hoist callbacks to list root
|
|
28
|
+
- `list-performance-inline-objects.md` - Avoid inline objects in renderItem
|
|
29
|
+
- `list-performance-item-memo.md` - Pass primitives for memoization
|
|
30
|
+
- `list-performance-item-expensive.md` - Keep list items lightweight
|
|
31
|
+
- `list-performance-images.md` - Use compressed images in lists
|
|
32
|
+
- `list-performance-item-types.md` - Use item types for heterogeneous lists
|
|
33
|
+
|
|
34
|
+
### Animation (HIGH)
|
|
35
|
+
|
|
36
|
+
- `animation-gpu-properties.md` - Animate transform/opacity instead of layout
|
|
37
|
+
- `animation-gesture-detector-press.md` - Use GestureDetector for press
|
|
38
|
+
animations
|
|
39
|
+
- `animation-derived-value.md` - Prefer useDerivedValue over useAnimatedReaction
|
|
40
|
+
|
|
41
|
+
### Scroll Performance (HIGH)
|
|
42
|
+
|
|
43
|
+
- `scroll-position-no-state.md` - Never track scroll in useState
|
|
44
|
+
|
|
45
|
+
### Navigation (HIGH)
|
|
46
|
+
|
|
47
|
+
- `navigation-native-navigators.md` - Use native stack and native tabs
|
|
48
|
+
|
|
49
|
+
### React State (MEDIUM)
|
|
50
|
+
|
|
51
|
+
- `react-state-dispatcher.md` - Use functional setState updates
|
|
52
|
+
- `react-state-fallback.md` - State should represent user intent only
|
|
53
|
+
- `react-state-minimize.md` - Minimize state variables, derive values
|
|
54
|
+
|
|
55
|
+
### State Architecture (MEDIUM)
|
|
56
|
+
|
|
57
|
+
- `state-ground-truth.md` - State must represent ground truth
|
|
58
|
+
|
|
59
|
+
### React Compiler (MEDIUM)
|
|
60
|
+
|
|
61
|
+
- `react-compiler-destructure-functions.md` - Destructure functions early
|
|
62
|
+
- `react-compiler-reanimated-shared-values.md` - Use .get()/.set() for shared
|
|
63
|
+
values
|
|
64
|
+
|
|
65
|
+
### User Interface (MEDIUM)
|
|
66
|
+
|
|
67
|
+
- `ui-expo-image.md` - Use expo-image for optimized images
|
|
68
|
+
- `ui-image-gallery.md` - Use Galeria for lightbox/galleries
|
|
69
|
+
- `ui-menus.md` - Native dropdown and context menus with Zeego
|
|
70
|
+
- `ui-native-modals.md` - Use native Modal with formSheet
|
|
71
|
+
- `ui-pressable.md` - Use Pressable instead of TouchableOpacity
|
|
72
|
+
- `ui-measure-views.md` - Measuring view dimensions
|
|
73
|
+
- `ui-safe-area-scroll.md` - Use contentInsetAdjustmentBehavior
|
|
74
|
+
- `ui-scrollview-content-inset.md` - Use contentInset for dynamic spacing
|
|
75
|
+
- `ui-styling.md` - Modern styling patterns (gap, boxShadow, gradients)
|
|
76
|
+
|
|
77
|
+
### Design System (MEDIUM)
|
|
78
|
+
|
|
79
|
+
- `design-system-compound-components.md` - Use compound components
|
|
80
|
+
|
|
81
|
+
### Monorepo (LOW)
|
|
82
|
+
|
|
83
|
+
- `monorepo-native-deps-in-app.md` - Install native deps in app directory
|
|
84
|
+
- `monorepo-single-dependency-versions.md` - Single dependency versions
|
|
85
|
+
|
|
86
|
+
### Third-Party Dependencies (LOW)
|
|
87
|
+
|
|
88
|
+
- `imports-design-system-folder.md` - Import from design system folder
|
|
89
|
+
|
|
90
|
+
### JavaScript (LOW)
|
|
91
|
+
|
|
92
|
+
- `js-hoist-intl.md` - Hoist Intl formatter creation
|
|
93
|
+
|
|
94
|
+
### Fonts (LOW)
|
|
95
|
+
|
|
96
|
+
- `fonts-config-plugin.md` - Load fonts natively at build time
|
|
97
|
+
|
|
98
|
+
## Creating a New Rule
|
|
99
|
+
|
|
100
|
+
1. Copy `rules/_template.md` to `rules/area-description.md`
|
|
101
|
+
2. Choose the appropriate area prefix:
|
|
102
|
+
- `rendering-` for Core Rendering
|
|
103
|
+
- `list-performance-` for List Performance
|
|
104
|
+
- `animation-` for Animation
|
|
105
|
+
- `scroll-` for Scroll Performance
|
|
106
|
+
- `navigation-` for Navigation
|
|
107
|
+
- `react-state-` for React State
|
|
108
|
+
- `state-` for State Architecture
|
|
109
|
+
- `react-compiler-` for React Compiler
|
|
110
|
+
- `ui-` for User Interface
|
|
111
|
+
- `design-system-` for Design System
|
|
112
|
+
- `monorepo-` for Monorepo
|
|
113
|
+
- `imports-` for Third-Party Dependencies
|
|
114
|
+
- `js-` for JavaScript
|
|
115
|
+
- `fonts-` for Fonts
|
|
116
|
+
3. Fill in the frontmatter and content
|
|
117
|
+
4. Ensure you have clear examples with explanations
|
|
118
|
+
|
|
119
|
+
## Rule File Structure
|
|
120
|
+
|
|
121
|
+
Each rule file should follow this structure:
|
|
122
|
+
|
|
123
|
+
````markdown
|
|
124
|
+
---
|
|
125
|
+
title: Rule Title Here
|
|
126
|
+
impact: MEDIUM
|
|
127
|
+
impactDescription: Optional description
|
|
128
|
+
tags: tag1, tag2, tag3
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Rule Title Here
|
|
132
|
+
|
|
133
|
+
Brief explanation of the rule and why it matters.
|
|
134
|
+
|
|
135
|
+
**Incorrect (description of what's wrong):**
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
// Bad code example
|
|
139
|
+
```
|
|
140
|
+
````
|
|
141
|
+
|
|
142
|
+
**Correct (description of what's right):**
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
// Good code example
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Reference: [Link](https://example.com)
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## File Naming Convention
|
|
153
|
+
|
|
154
|
+
- Files starting with `_` are special (excluded from build)
|
|
155
|
+
- Rule files: `area-description.md` (e.g., `animation-gpu-properties.md`)
|
|
156
|
+
- Section is automatically inferred from filename prefix
|
|
157
|
+
- Rules are sorted alphabetically by title within each section
|
|
158
|
+
|
|
159
|
+
## Impact Levels
|
|
160
|
+
|
|
161
|
+
- `CRITICAL` - Highest priority, causes crashes or broken UI
|
|
162
|
+
- `HIGH` - Significant performance improvements
|
|
163
|
+
- `MEDIUM` - Moderate performance improvements
|
|
164
|
+
- `LOW` - Incremental improvements
|
|
165
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vercel-react-native-skills
|
|
3
|
+
description:
|
|
4
|
+
React Native and Expo best practices for building performant mobile apps. Use
|
|
5
|
+
when building React Native components, optimizing list performance,
|
|
6
|
+
implementing animations, or working with native modules. Triggers on tasks
|
|
7
|
+
involving React Native, Expo, mobile performance, or native platform APIs.
|
|
8
|
+
license: MIT
|
|
9
|
+
metadata:
|
|
10
|
+
author: vercel
|
|
11
|
+
version: '1.0.0'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# React Native Skills
|
|
15
|
+
|
|
16
|
+
Comprehensive best practices for React Native and Expo applications. Contains
|
|
17
|
+
rules across multiple categories covering performance, animations, UI patterns,
|
|
18
|
+
and platform-specific optimizations.
|
|
19
|
+
|
|
20
|
+
## When to Apply
|
|
21
|
+
|
|
22
|
+
Reference these guidelines when:
|
|
23
|
+
|
|
24
|
+
- Building React Native or Expo apps
|
|
25
|
+
- Optimizing list and scroll performance
|
|
26
|
+
- Implementing animations with Reanimated
|
|
27
|
+
- Working with images and media
|
|
28
|
+
- Configuring native modules or fonts
|
|
29
|
+
- Structuring monorepo projects with native dependencies
|
|
30
|
+
|
|
31
|
+
## Rule Categories by Priority
|
|
32
|
+
|
|
33
|
+
| Priority | Category | Impact | Prefix |
|
|
34
|
+
| -------- | ---------------- | -------- | -------------------- |
|
|
35
|
+
| 1 | List Performance | CRITICAL | `list-performance-` |
|
|
36
|
+
| 2 | Animation | HIGH | `animation-` |
|
|
37
|
+
| 3 | Navigation | HIGH | `navigation-` |
|
|
38
|
+
| 4 | UI Patterns | HIGH | `ui-` |
|
|
39
|
+
| 5 | State Management | MEDIUM | `react-state-` |
|
|
40
|
+
| 6 | Rendering | MEDIUM | `rendering-` |
|
|
41
|
+
| 7 | Monorepo | MEDIUM | `monorepo-` |
|
|
42
|
+
| 8 | Configuration | LOW | `fonts-`, `imports-` |
|
|
43
|
+
|
|
44
|
+
## Quick Reference
|
|
45
|
+
|
|
46
|
+
### 1. List Performance (CRITICAL)
|
|
47
|
+
|
|
48
|
+
- `list-performance-virtualize` - Use FlashList for large lists
|
|
49
|
+
- `list-performance-item-memo` - Memoize list item components
|
|
50
|
+
- `list-performance-callbacks` - Stabilize callback references
|
|
51
|
+
- `list-performance-inline-objects` - Avoid inline style objects
|
|
52
|
+
- `list-performance-function-references` - Extract functions outside render
|
|
53
|
+
- `list-performance-images` - Optimize images in lists
|
|
54
|
+
- `list-performance-item-expensive` - Move expensive work outside items
|
|
55
|
+
- `list-performance-item-types` - Use item types for heterogeneous lists
|
|
56
|
+
|
|
57
|
+
### 2. Animation (HIGH)
|
|
58
|
+
|
|
59
|
+
- `animation-gpu-properties` - Animate only transform and opacity
|
|
60
|
+
- `animation-derived-value` - Use useDerivedValue for computed animations
|
|
61
|
+
- `animation-gesture-detector-press` - Use Gesture.Tap instead of Pressable
|
|
62
|
+
|
|
63
|
+
### 3. Navigation (HIGH)
|
|
64
|
+
|
|
65
|
+
- `navigation-native-navigators` - Use native stack and native tabs over JS navigators
|
|
66
|
+
|
|
67
|
+
### 4. UI Patterns (HIGH)
|
|
68
|
+
|
|
69
|
+
- `ui-expo-image` - Use expo-image for all images
|
|
70
|
+
- `ui-image-gallery` - Use Galeria for image lightboxes
|
|
71
|
+
- `ui-pressable` - Use Pressable over TouchableOpacity
|
|
72
|
+
- `ui-safe-area-scroll` - Handle safe areas in ScrollViews
|
|
73
|
+
- `ui-scrollview-content-inset` - Use contentInset for headers
|
|
74
|
+
- `ui-menus` - Use native context menus
|
|
75
|
+
- `ui-native-modals` - Use native modals when possible
|
|
76
|
+
- `ui-measure-views` - Use onLayout, not measure()
|
|
77
|
+
- `ui-styling` - Use StyleSheet.create or Nativewind
|
|
78
|
+
|
|
79
|
+
### 5. State Management (MEDIUM)
|
|
80
|
+
|
|
81
|
+
- `react-state-minimize` - Minimize state subscriptions
|
|
82
|
+
- `react-state-dispatcher` - Use dispatcher pattern for callbacks
|
|
83
|
+
- `react-state-fallback` - Show fallback on first render
|
|
84
|
+
- `react-compiler-destructure-functions` - Destructure for React Compiler
|
|
85
|
+
- `react-compiler-reanimated-shared-values` - Handle shared values with compiler
|
|
86
|
+
|
|
87
|
+
### 6. Rendering (MEDIUM)
|
|
88
|
+
|
|
89
|
+
- `rendering-text-in-text-component` - Wrap text in Text components
|
|
90
|
+
- `rendering-no-falsy-and` - Avoid falsy && for conditional rendering
|
|
91
|
+
|
|
92
|
+
### 7. Monorepo (MEDIUM)
|
|
93
|
+
|
|
94
|
+
- `monorepo-native-deps-in-app` - Keep native dependencies in app package
|
|
95
|
+
- `monorepo-single-dependency-versions` - Use single versions across packages
|
|
96
|
+
|
|
97
|
+
### 8. Configuration (LOW)
|
|
98
|
+
|
|
99
|
+
- `fonts-config-plugin` - Use config plugins for custom fonts
|
|
100
|
+
- `imports-design-system-folder` - Organize design system imports
|
|
101
|
+
- `js-hoist-intl` - Hoist Intl object creation
|
|
102
|
+
|
|
103
|
+
## How to Use
|
|
104
|
+
|
|
105
|
+
Read individual rule files for detailed explanations and code examples:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
rules/list-performance-virtualize.md
|
|
109
|
+
rules/animation-gpu-properties.md
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Each rule file contains:
|
|
113
|
+
|
|
114
|
+
- Brief explanation of why it matters
|
|
115
|
+
- Incorrect code example with explanation
|
|
116
|
+
- Correct code example with explanation
|
|
117
|
+
- Additional context and references
|
|
118
|
+
|
|
119
|
+
## Full Compiled Document
|
|
120
|
+
|
|
121
|
+
For the complete guide with all rules expanded: `AGENTS.md`
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"organization": "Engineering",
|
|
4
|
+
"date": "January 2026",
|
|
5
|
+
"abstract": "Comprehensive performance optimization guide for React Native applications, designed for AI agents and LLMs. Contains 35+ rules across 13 categories, prioritized by impact from critical (core rendering, list performance) to incremental (fonts, imports). Each rule includes detailed explanations, real-world examples comparing incorrect vs. correct implementations, and specific impact metrics to guide automated refactoring and code generation.",
|
|
6
|
+
"references": [
|
|
7
|
+
"https://react.dev",
|
|
8
|
+
"https://reactnative.dev",
|
|
9
|
+
"https://docs.swmansion.com/react-native-reanimated",
|
|
10
|
+
"https://docs.swmansion.com/react-native-gesture-handler",
|
|
11
|
+
"https://docs.expo.dev",
|
|
12
|
+
"https://legendapp.com/open-source/legend-list",
|
|
13
|
+
"https://github.com/nandorojo/galeria",
|
|
14
|
+
"https://zeego.dev"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Sections
|
|
2
|
+
|
|
3
|
+
This file defines all sections, their ordering, impact levels, and descriptions.
|
|
4
|
+
The section ID (in parentheses) is the filename prefix used to group rules.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Core Rendering (rendering)
|
|
9
|
+
|
|
10
|
+
**Impact:** CRITICAL
|
|
11
|
+
**Description:** Fundamental React Native rendering rules. Violations cause
|
|
12
|
+
runtime crashes or broken UI.
|
|
13
|
+
|
|
14
|
+
## 2. List Performance (list-performance)
|
|
15
|
+
|
|
16
|
+
**Impact:** HIGH
|
|
17
|
+
**Description:** Optimizing virtualized lists (FlatList, LegendList, FlashList)
|
|
18
|
+
for smooth scrolling and fast updates.
|
|
19
|
+
|
|
20
|
+
## 3. Animation (animation)
|
|
21
|
+
|
|
22
|
+
**Impact:** HIGH
|
|
23
|
+
**Description:** GPU-accelerated animations, Reanimated patterns, and avoiding
|
|
24
|
+
render thrashing during gestures.
|
|
25
|
+
|
|
26
|
+
## 4. Scroll Performance (scroll)
|
|
27
|
+
|
|
28
|
+
**Impact:** HIGH
|
|
29
|
+
**Description:** Tracking scroll position without causing render thrashing.
|
|
30
|
+
|
|
31
|
+
## 5. Navigation (navigation)
|
|
32
|
+
|
|
33
|
+
**Impact:** HIGH
|
|
34
|
+
**Description:** Using native navigators for stack and tab navigation instead of
|
|
35
|
+
JS-based alternatives.
|
|
36
|
+
|
|
37
|
+
## 6. React State (react-state)
|
|
38
|
+
|
|
39
|
+
**Impact:** MEDIUM
|
|
40
|
+
**Description:** Patterns for managing React state to avoid stale closures and
|
|
41
|
+
unnecessary re-renders.
|
|
42
|
+
|
|
43
|
+
## 7. State Architecture (state)
|
|
44
|
+
|
|
45
|
+
**Impact:** MEDIUM
|
|
46
|
+
**Description:** Ground truth principles for state variables and derived values.
|
|
47
|
+
|
|
48
|
+
## 8. React Compiler (react-compiler)
|
|
49
|
+
|
|
50
|
+
**Impact:** MEDIUM
|
|
51
|
+
**Description:** Compatibility patterns for React Compiler with React Native and
|
|
52
|
+
Reanimated.
|
|
53
|
+
|
|
54
|
+
## 9. User Interface (ui)
|
|
55
|
+
|
|
56
|
+
**Impact:** MEDIUM
|
|
57
|
+
**Description:** Native UI patterns for images, menus, modals, styling, and
|
|
58
|
+
platform-consistent interfaces.
|
|
59
|
+
|
|
60
|
+
## 10. Design System (design-system)
|
|
61
|
+
|
|
62
|
+
**Impact:** MEDIUM
|
|
63
|
+
**Description:** Architecture patterns for building maintainable component
|
|
64
|
+
libraries.
|
|
65
|
+
|
|
66
|
+
## 11. Monorepo (monorepo)
|
|
67
|
+
|
|
68
|
+
**Impact:** LOW
|
|
69
|
+
**Description:** Dependency management and native module configuration in
|
|
70
|
+
monorepos.
|
|
71
|
+
|
|
72
|
+
## 12. Third-Party Dependencies (imports)
|
|
73
|
+
|
|
74
|
+
**Impact:** LOW
|
|
75
|
+
**Description:** Wrapping and re-exporting third-party dependencies for
|
|
76
|
+
maintainability.
|
|
77
|
+
|
|
78
|
+
## 13. JavaScript (js)
|
|
79
|
+
|
|
80
|
+
**Impact:** LOW
|
|
81
|
+
**Description:** Micro-optimizations like hoisting expensive object creation.
|
|
82
|
+
|
|
83
|
+
## 14. Fonts (fonts)
|
|
84
|
+
|
|
85
|
+
**Impact:** LOW
|
|
86
|
+
**Description:** Native font loading for improved performance.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Rule Title Here
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Optional description of impact (e.g., "20-50% improvement")
|
|
5
|
+
tags: tag1, tag2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Rule Title Here
|
|
9
|
+
|
|
10
|
+
**Impact: MEDIUM (optional impact description)**
|
|
11
|
+
|
|
12
|
+
Brief explanation of the rule and why it matters. This should be clear and concise, explaining the performance implications.
|
|
13
|
+
|
|
14
|
+
**Incorrect (description of what's wrong):**
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// Bad code example here
|
|
18
|
+
const bad = example()
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Correct (description of what's right):**
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Good code example here
|
|
25
|
+
const good = example()
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Reference: [Link to documentation or resource](https://example.com)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Prefer useDerivedValue Over useAnimatedReaction
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: cleaner code, automatic dependency tracking
|
|
5
|
+
tags: animation, reanimated, derived-value
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Prefer useDerivedValue Over useAnimatedReaction
|
|
9
|
+
|
|
10
|
+
When deriving a shared value from another, use `useDerivedValue` instead of
|
|
11
|
+
`useAnimatedReaction`. Derived values are declarative, automatically track
|
|
12
|
+
dependencies, and return a value you can use directly. Animated reactions are
|
|
13
|
+
for side effects, not derivations.
|
|
14
|
+
|
|
15
|
+
**Incorrect (useAnimatedReaction for derivation):**
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { useSharedValue, useAnimatedReaction } from 'react-native-reanimated'
|
|
19
|
+
|
|
20
|
+
function MyComponent() {
|
|
21
|
+
const progress = useSharedValue(0)
|
|
22
|
+
const opacity = useSharedValue(1)
|
|
23
|
+
|
|
24
|
+
useAnimatedReaction(
|
|
25
|
+
() => progress.value,
|
|
26
|
+
(current) => {
|
|
27
|
+
opacity.value = 1 - current
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
// ...
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Correct (useDerivedValue):**
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { useSharedValue, useDerivedValue } from 'react-native-reanimated'
|
|
39
|
+
|
|
40
|
+
function MyComponent() {
|
|
41
|
+
const progress = useSharedValue(0)
|
|
42
|
+
|
|
43
|
+
const opacity = useDerivedValue(() => 1 - progress.get())
|
|
44
|
+
|
|
45
|
+
// ...
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Use `useAnimatedReaction` only for side effects that don't produce a value
|
|
50
|
+
(e.g., triggering haptics, logging, calling `runOnJS`).
|
|
51
|
+
|
|
52
|
+
Reference:
|
|
53
|
+
[Reanimated useDerivedValue](https://docs.swmansion.com/react-native-reanimated/docs/core/useDerivedValue)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use GestureDetector for Animated Press States
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: UI thread animations, smoother press feedback
|
|
5
|
+
tags: animation, gestures, press, reanimated
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use GestureDetector for Animated Press States
|
|
9
|
+
|
|
10
|
+
For animated press states (scale, opacity on press), use `GestureDetector` with
|
|
11
|
+
`Gesture.Tap()` and shared values instead of Pressable's
|
|
12
|
+
`onPressIn`/`onPressOut`. Gesture callbacks run on the UI thread as worklets—no
|
|
13
|
+
JS thread round-trip for press animations.
|
|
14
|
+
|
|
15
|
+
**Incorrect (Pressable with JS thread callbacks):**
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { Pressable } from 'react-native'
|
|
19
|
+
import Animated, {
|
|
20
|
+
useSharedValue,
|
|
21
|
+
useAnimatedStyle,
|
|
22
|
+
withTiming,
|
|
23
|
+
} from 'react-native-reanimated'
|
|
24
|
+
|
|
25
|
+
function AnimatedButton({ onPress }: { onPress: () => void }) {
|
|
26
|
+
const scale = useSharedValue(1)
|
|
27
|
+
|
|
28
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
29
|
+
transform: [{ scale: scale.value }],
|
|
30
|
+
}))
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Pressable
|
|
34
|
+
onPress={onPress}
|
|
35
|
+
onPressIn={() => (scale.value = withTiming(0.95))}
|
|
36
|
+
onPressOut={() => (scale.value = withTiming(1))}
|
|
37
|
+
>
|
|
38
|
+
<Animated.View style={animatedStyle}>
|
|
39
|
+
<Text>Press me</Text>
|
|
40
|
+
</Animated.View>
|
|
41
|
+
</Pressable>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Correct (GestureDetector with UI thread worklets):**
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler'
|
|
50
|
+
import Animated, {
|
|
51
|
+
useSharedValue,
|
|
52
|
+
useAnimatedStyle,
|
|
53
|
+
withTiming,
|
|
54
|
+
interpolate,
|
|
55
|
+
runOnJS,
|
|
56
|
+
} from 'react-native-reanimated'
|
|
57
|
+
|
|
58
|
+
function AnimatedButton({ onPress }: { onPress: () => void }) {
|
|
59
|
+
// Store the press STATE (0 = not pressed, 1 = pressed)
|
|
60
|
+
const pressed = useSharedValue(0)
|
|
61
|
+
|
|
62
|
+
const tap = Gesture.Tap()
|
|
63
|
+
.onBegin(() => {
|
|
64
|
+
pressed.set(withTiming(1))
|
|
65
|
+
})
|
|
66
|
+
.onFinalize(() => {
|
|
67
|
+
pressed.set(withTiming(0))
|
|
68
|
+
})
|
|
69
|
+
.onEnd(() => {
|
|
70
|
+
runOnJS(onPress)()
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// Derive visual values from the state
|
|
74
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
75
|
+
transform: [
|
|
76
|
+
{ scale: interpolate(withTiming(pressed.get()), [0, 1], [1, 0.95]) },
|
|
77
|
+
],
|
|
78
|
+
}))
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<GestureDetector gesture={tap}>
|
|
82
|
+
<Animated.View style={animatedStyle}>
|
|
83
|
+
<Text>Press me</Text>
|
|
84
|
+
</Animated.View>
|
|
85
|
+
</GestureDetector>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Store the press **state** (0 or 1), then derive the scale via `interpolate`.
|
|
91
|
+
This keeps the shared value as ground truth. Use `runOnJS` to call JS functions
|
|
92
|
+
from worklets. Use `.set()` and `.get()` for React Compiler compatibility.
|
|
93
|
+
|
|
94
|
+
Reference:
|
|
95
|
+
[Gesture Handler Tap Gesture](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/tap-gesture)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Animate Transform and Opacity Instead of Layout Properties
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: GPU-accelerated animations, no layout recalculation
|
|
5
|
+
tags: animation, performance, reanimated, transform, opacity
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Animate Transform and Opacity Instead of Layout Properties
|
|
9
|
+
|
|
10
|
+
Avoid animating `width`, `height`, `top`, `left`, `margin`, or `padding`. These trigger layout recalculation on every frame. Instead, use `transform` (scale, translate) and `opacity` which run on the GPU without triggering layout.
|
|
11
|
+
|
|
12
|
+
**Incorrect (animates height, triggers layout every frame):**
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated'
|
|
16
|
+
|
|
17
|
+
function CollapsiblePanel({ expanded }: { expanded: boolean }) {
|
|
18
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
19
|
+
height: withTiming(expanded ? 200 : 0), // triggers layout on every frame
|
|
20
|
+
overflow: 'hidden',
|
|
21
|
+
}))
|
|
22
|
+
|
|
23
|
+
return <Animated.View style={animatedStyle}>{children}</Animated.View>
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Correct (animates scaleY, GPU-accelerated):**
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated'
|
|
31
|
+
|
|
32
|
+
function CollapsiblePanel({ expanded }: { expanded: boolean }) {
|
|
33
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
34
|
+
transform: [
|
|
35
|
+
{ scaleY: withTiming(expanded ? 1 : 0) },
|
|
36
|
+
],
|
|
37
|
+
opacity: withTiming(expanded ? 1 : 0),
|
|
38
|
+
}))
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<Animated.View style={[{ height: 200, transformOrigin: 'top' }, animatedStyle]}>
|
|
42
|
+
{children}
|
|
43
|
+
</Animated.View>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Correct (animates translateY for slide animations):**
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated'
|
|
52
|
+
|
|
53
|
+
function SlideIn({ visible }: { visible: boolean }) {
|
|
54
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
55
|
+
transform: [
|
|
56
|
+
{ translateY: withTiming(visible ? 0 : 100) },
|
|
57
|
+
],
|
|
58
|
+
opacity: withTiming(visible ? 1 : 0),
|
|
59
|
+
}))
|
|
60
|
+
|
|
61
|
+
return <Animated.View style={animatedStyle}>{children}</Animated.View>
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
GPU-accelerated properties: `transform` (translate, scale, rotate), `opacity`. Everything else triggers layout.
|