agy-superpowers 5.0.8 → 5.0.9
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/package.json +1 -1
- package/template/agent/rules/superpowers.md +54 -0
- package/template/agent/skills/frontend-developer/SKILL.md +39 -0
- package/template/agent/skills/frontend-developer/references/react-nextjs.md +343 -0
- package/template/agent/skills/frontend-developer/references/react-rules/_sections.md +46 -0
- package/template/agent/skills/frontend-developer/references/react-rules/_template.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/advanced-event-handler-refs.md +55 -0
- package/template/agent/skills/frontend-developer/references/react-rules/advanced-init-once.md +42 -0
- package/template/agent/skills/frontend-developer/references/react-rules/advanced-use-latest.md +39 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-api-routes.md +38 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-defer-await.md +80 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-dependencies.md +51 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-parallel.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-suspense-boundaries.md +99 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-barrel-imports.md +59 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-conditional.md +31 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-defer-third-party.md +49 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-dynamic-imports.md +35 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-preload.md +50 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-event-listeners.md +74 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-localstorage-schema.md +71 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-passive-event-listeners.md +48 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-swr-dedup.md +56 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-batch-dom-css.md +107 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-cache-function-results.md +80 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-cache-property-access.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-cache-storage.md +70 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-combine-iterations.md +32 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-early-exit.md +50 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-flatmap-filter.md +60 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-hoist-regexp.md +45 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-index-maps.md +37 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-length-check-first.md +49 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-min-max-loop.md +82 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-set-map-lookups.md +24 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-tosorted-immutable.md +57 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-activity.md +26 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-conditional-render.md +40 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-content-visibility.md +38 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-hoist-jsx.md +46 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-no-flicker.md +82 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-resource-hints.md +85 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-script-defer-async.md +68 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-svg-precision.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-usetransition-loading.md +75 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-defer-reads.md +39 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-dependencies.md +45 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state-no-effect.md +40 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state.md +29 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-functional-setstate.md +74 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-lazy-state-init.md +58 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo-with-default-value.md +38 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo.md +44 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-move-effect-to-event.md +45 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-no-inline-components.md +82 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-split-combined-hooks.md +64 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-transitions.md +40 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-deferred-value.md +59 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-ref-transient-values.md +73 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-after-nonblocking.md +73 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-auth-actions.md +96 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-cache-lru.md +41 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-cache-react.md +76 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-dedup-props.md +65 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-hoist-static-io.md +142 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-parallel-fetching.md +83 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-serialization.md +38 -0
- package/template/agent/skills/frontend-developer/references/svelte-sveltekit.md +220 -0
- package/template/agent/skills/frontend-developer/references/vanilla.md +275 -0
- package/template/agent/skills/frontend-developer/references/vue-nuxt.md +289 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/_index.md +154 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-class-based-technique.md +254 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-state-driven-technique.md +291 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-async.md +97 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-data-flow.md +307 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-fallthrough-attrs.md +174 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-keep-alive.md +137 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-slots.md +216 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-suspense.md +228 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-teleport.md +108 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition-group.md +128 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition.md +125 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/composables.md +290 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/directives.md +162 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-avoid-component-abstraction-in-lists.md +159 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-v-once-v-memo-directives.md +182 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-virtualize-large-lists.md +187 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/plugins.md +166 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/reactivity.md +344 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/render-functions.md +201 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/sfc.md +310 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/state-management.md +135 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/updated-hook-performance.md +187 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/_index.md +23 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforeenter-no-param-trigger.md +167 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforerouteenter-no-this.md +176 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-guard-async-await-pattern.md +227 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-infinite-loop.md +187 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-next-deprecated.md +150 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-param-change-no-lifecycle.md +181 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-simple-routing-cleanup.md +209 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-use-vue-router-for-production.md +183 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/_index.md +29 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/async-component-testing.md +163 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/teleport-testing-complexity.md +158 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-async-await-flushpromises.md +175 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-browser-vs-node-runners.md +208 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-component-blackbox-approach.md +144 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-composables-helper-wrapper.md +238 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-e2e-playwright-recommended.md +242 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-no-snapshot-only.md +197 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-pinia-store-setup.md +228 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-suspense-async-components.md +229 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-vitest-recommended-for-vue.md +204 -0
- package/template/agent/skills/mobile-developer/SKILL.md +52 -0
- package/template/agent/skills/mobile-developer/references/android-native.md +396 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-accessibility.md +36 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-architecture.md +52 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-coroutines.md +139 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-data-layer.md +51 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-emulator-skill.md +108 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-gradle-logic.md +126 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-retrofit.md +142 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-testing.md +102 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-viewmodel.md +43 -0
- package/template/agent/skills/mobile-developer/references/android-rules/coil-compose.md +74 -0
- package/template/agent/skills/mobile-developer/references/android-rules/compose-navigation.md +422 -0
- package/template/agent/skills/mobile-developer/references/android-rules/compose-performance-audit.md +199 -0
- package/template/agent/skills/mobile-developer/references/android-rules/compose-ui.md +49 -0
- package/template/agent/skills/mobile-developer/references/android-rules/gradle-build-performance.md +346 -0
- package/template/agent/skills/mobile-developer/references/android-rules/kotlin-concurrency-expert.md +169 -0
- package/template/agent/skills/mobile-developer/references/android-rules/rxjava-to-coroutines-migration.md +101 -0
- package/template/agent/skills/mobile-developer/references/android-rules/xml-to-compose-migration.md +338 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-best-practices.md +52 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-checks-migration.md +134 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-cli-app-best-practices.md +123 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-doc-validation.md +45 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-matcher-best-practices.md +106 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-modern-features.md +241 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-package-maintenance.md +75 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-test-fundamentals.md +124 -0
- package/template/agent/skills/mobile-developer/references/flutter.md +291 -0
- package/template/agent/skills/mobile-developer/references/ios-native.md +358 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/accessibility-patterns.md +215 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/animation-advanced.md +403 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/animation-basics.md +284 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/animation-transitions.md +326 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/charts-accessibility.md +135 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/charts.md +602 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/image-optimization.md +203 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/latest-apis.md +464 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/layout-best-practices.md +266 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/liquid-glass.md +416 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/list-patterns.md +394 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/macos-scenes.md +318 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/macos-views.md +357 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/macos-window-styling.md +303 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/performance-patterns.md +403 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/scroll-patterns.md +293 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/sheet-navigation-patterns.md +363 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/state-management.md +417 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/view-structure.md +389 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/_sections.md +86 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/_template.md +28 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/animation-derived-value.md +53 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gesture-detector-press.md +95 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gpu-properties.md +65 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/design-system-compound-components.md +66 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/fonts-config-plugin.md +71 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/imports-design-system-folder.md +68 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/js-hoist-intl.md +61 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-callbacks.md +44 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-function-references.md +132 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-images.md +53 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-inline-objects.md +97 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-expensive.md +94 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-memo.md +82 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-types.md +104 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-virtualize.md +67 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-native-deps-in-app.md +46 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-single-dependency-versions.md +63 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/navigation-native-navigators.md +188 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-destructure-functions.md +50 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-reanimated-shared-values.md +48 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-dispatcher.md +91 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-fallback.md +56 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-minimize.md +65 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-no-falsy-and.md +74 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-text-in-text-component.md +36 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/scroll-position-no-state.md +82 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/state-ground-truth.md +80 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-expo-image.md +66 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-image-gallery.md +104 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-measure-views.md +78 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-menus.md +174 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-native-modals.md +77 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-pressable.md +61 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-safe-area-scroll.md +65 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-scrollview-content-inset.md +45 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-styling.md +87 -0
- package/template/agent/skills/mobile-developer/references/react-native.md +345 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
# React Native + Expo Reference
|
|
2
|
+
|
|
3
|
+
> **Philosophy:** JavaScript-first, native-quality. Ship fast with OTA updates, but never sacrifice 60fps.
|
|
4
|
+
> Expo is the default — eject only when you must.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Project Setup & Detection
|
|
9
|
+
|
|
10
|
+
**Stack indicators:** `package.json` with `react-native` or `expo` dependency.
|
|
11
|
+
|
|
12
|
+
**Key config files:**
|
|
13
|
+
|
|
14
|
+
| File | Purpose |
|
|
15
|
+
|------|---------|
|
|
16
|
+
| `app.json` / `app.config.js` | Expo configuration (app name, version, plugins) |
|
|
17
|
+
| `metro.config.js` | Metro bundler configuration |
|
|
18
|
+
| `babel.config.js` | Babel presets and plugins |
|
|
19
|
+
| `tsconfig.json` | TypeScript configuration |
|
|
20
|
+
| `eas.json` | EAS Build/Submit/Update configuration |
|
|
21
|
+
|
|
22
|
+
**Recommended project structure (feature-based):**
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
src/
|
|
26
|
+
features/
|
|
27
|
+
auth/
|
|
28
|
+
screens/LoginScreen.tsx
|
|
29
|
+
components/AuthForm.tsx
|
|
30
|
+
hooks/useAuth.ts
|
|
31
|
+
store/authStore.ts
|
|
32
|
+
home/
|
|
33
|
+
screens/HomeScreen.tsx
|
|
34
|
+
components/FeedList.tsx
|
|
35
|
+
shared/
|
|
36
|
+
components/ # Reusable UI components
|
|
37
|
+
hooks/ # Shared hooks
|
|
38
|
+
utils/ # Pure utility functions
|
|
39
|
+
services/ # API clients, storage wrappers
|
|
40
|
+
constants/ # Theme, config values
|
|
41
|
+
app/ # expo-router file-based routing
|
|
42
|
+
_layout.tsx
|
|
43
|
+
(tabs)/
|
|
44
|
+
_layout.tsx
|
|
45
|
+
index.tsx
|
|
46
|
+
settings.tsx
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Architecture Patterns
|
|
52
|
+
|
|
53
|
+
### State Management
|
|
54
|
+
|
|
55
|
+
| Approach | Use When |
|
|
56
|
+
|----------|----------|
|
|
57
|
+
| **Zustand** (recommended) | Most apps — simple API, selector-based subscriptions, minimal boilerplate |
|
|
58
|
+
| **Redux Toolkit** | Large teams, complex state with many reducers, need Redux DevTools |
|
|
59
|
+
| **Jotai** | Atomic state, when individual pieces of state are independent |
|
|
60
|
+
| **React Context** | Infrequently-changing values (theme, locale, auth status) |
|
|
61
|
+
|
|
62
|
+
**State design principles:**
|
|
63
|
+
- State should be the **minimal source of truth**. If a value can be derived from other state or props, derive it during render — don't store it.
|
|
64
|
+
- Use **selector functions** in Zustand to subscribe to specific slices and avoid unnecessary re-renders.
|
|
65
|
+
- Keep UI state local (`useState`), share only what multiple components need.
|
|
66
|
+
|
|
67
|
+
### Navigation
|
|
68
|
+
|
|
69
|
+
Use **native navigators** over JS-based navigators for performance:
|
|
70
|
+
|
|
71
|
+
| Navigator | Correct | Incorrect |
|
|
72
|
+
|-----------|---------|-----------|
|
|
73
|
+
| Stack | `createNativeStackNavigator` / `expo-router Stack` | `createStackNavigator` (JS-based, slow transitions) |
|
|
74
|
+
| Tabs | `createNativeBottomTabNavigator` / `expo-router NativeTabs` | `createBottomTabNavigator` (JS-based) |
|
|
75
|
+
|
|
76
|
+
Native navigators run transitions on the UI thread, provide platform-native gestures, large titles (iOS), search bars, and proper safe area handling automatically.
|
|
77
|
+
|
|
78
|
+
**Prefer native header options over custom header components.** Native headers support iOS large titles, blur effects, and search bars out of the box.
|
|
79
|
+
|
|
80
|
+
### New Architecture
|
|
81
|
+
|
|
82
|
+
React Native's New Architecture includes:
|
|
83
|
+
- **TurboModules** — lazy-loaded, synchronous native module access (replaces Bridge)
|
|
84
|
+
- **Fabric** — concurrent renderer with synchronous layout (replaces old renderer)
|
|
85
|
+
- **Bridgeless mode** — eliminates the JS-native bridge entirely
|
|
86
|
+
- **React Compiler** — automatic memoization (eliminates `React.memo`, `useCallback`, `useMemo`)
|
|
87
|
+
|
|
88
|
+
When using **React Compiler**, `memo()` and `useCallback()` are unnecessary. However, **object reference stability** still matters for list virtualization.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Performance Optimization
|
|
93
|
+
|
|
94
|
+
### Critical Thresholds
|
|
95
|
+
|
|
96
|
+
| Metric | Target | Critical |
|
|
97
|
+
|--------|--------|----------|
|
|
98
|
+
| Cold start (JS bundle ready) | < 1s | > 2s |
|
|
99
|
+
| Time to interactive | < 2s | > 4s |
|
|
100
|
+
| List scroll frame rate | 60fps | < 45fps |
|
|
101
|
+
| JS bundle size (gzipped) | < 1MB | > 3MB |
|
|
102
|
+
| IPA/APK download size | < 30MB | > 100MB |
|
|
103
|
+
|
|
104
|
+
### List Performance (CRITICAL)
|
|
105
|
+
|
|
106
|
+
**Always use a list virtualizer** — even for short lists. Virtualizers only render visible items, reducing memory and mount time.
|
|
107
|
+
|
|
108
|
+
| Library | When to Use |
|
|
109
|
+
|---------|------------|
|
|
110
|
+
| **LegendList** | Default choice — excellent recycling, great performance |
|
|
111
|
+
| **FlashList** (@shopify) | Alternative — well-tested, widely adopted |
|
|
112
|
+
| **FlatList** (built-in) | Legacy — avoid if possible, use LegendList/FlashList |
|
|
113
|
+
|
|
114
|
+
**Key rules for list performance:**
|
|
115
|
+
|
|
116
|
+
1. **Stable object references** — don't `.map()` or `.filter()` data before passing to lists. Transform data inside list items instead.
|
|
117
|
+
2. **Pass primitives to list items** — enables shallow comparison in `memo()`. Pass `id`, `name`, `email` instead of entire objects.
|
|
118
|
+
3. **Hoist callbacks to list root** — extract `renderItem` and callbacks outside the component, or use `useCallback` if not using React Compiler.
|
|
119
|
+
4. **No inline objects in renderItem** — every render creates new references, causing full re-renders of all visible items.
|
|
120
|
+
5. **Use compressed images** — large images in lists destroy scroll performance.
|
|
121
|
+
6. **Use item types** for heterogeneous lists — helps the virtualizer recycle views correctly.
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
// ❌ Bad: creates new references on every render
|
|
125
|
+
<LegendList
|
|
126
|
+
data={items.map(i => ({ ...i, label: i.name.toUpperCase() }))}
|
|
127
|
+
renderItem={({ item }) => <ItemCard item={item} />}
|
|
128
|
+
/>
|
|
129
|
+
|
|
130
|
+
// ✅ Good: stable data, transform inside item
|
|
131
|
+
const renderItem = ({ item }) => <ItemCard item={item} />
|
|
132
|
+
|
|
133
|
+
<LegendList
|
|
134
|
+
data={items}
|
|
135
|
+
renderItem={renderItem}
|
|
136
|
+
keyExtractor={(item) => item.id}
|
|
137
|
+
estimatedItemSize={80}
|
|
138
|
+
/>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Animation (HIGH)
|
|
142
|
+
|
|
143
|
+
**Only animate GPU-accelerated properties:** `transform` (translate, scale, rotate) and `opacity`. Animating `width`, `height`, `top`, `left`, `margin`, `padding` triggers layout recalculation on every frame.
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
// ❌ Bad: animates height (layout recalc every frame)
|
|
147
|
+
useAnimatedStyle(() => ({ height: withTiming(expanded ? 200 : 0) }))
|
|
148
|
+
|
|
149
|
+
// ✅ Good: animates transform (GPU-accelerated)
|
|
150
|
+
useAnimatedStyle(() => ({
|
|
151
|
+
transform: [{ scaleY: withTiming(expanded ? 1 : 0) }],
|
|
152
|
+
opacity: withTiming(expanded ? 1 : 0),
|
|
153
|
+
}))
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- Use `useDerivedValue` over `useAnimatedReaction` for computed animations.
|
|
157
|
+
- Use `GestureDetector` (from `react-native-gesture-handler`) for press animations instead of `Pressable`.
|
|
158
|
+
|
|
159
|
+
### Scroll Performance
|
|
160
|
+
|
|
161
|
+
**Never track scroll position in useState** — it triggers a JS re-render on every frame. Use `useSharedValue` from Reanimated instead.
|
|
162
|
+
|
|
163
|
+
### Hermes Engine
|
|
164
|
+
|
|
165
|
+
Hermes is the default JS engine. It pre-compiles JavaScript to bytecode at build time, reducing cold start time and memory usage. Ensure Hermes is enabled in your project (`"jsEngine": "hermes"` in `app.json`).
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Common Libraries Ecosystem
|
|
170
|
+
|
|
171
|
+
| Category | Recommended | Alternative |
|
|
172
|
+
|----------|-------------|-------------|
|
|
173
|
+
| **Navigation** | `expo-router` (file-based) | `@react-navigation/native` (imperative) |
|
|
174
|
+
| **State** | `zustand` | `@reduxjs/toolkit`, `jotai` |
|
|
175
|
+
| **Server State** | `@tanstack/react-query` | `swr` |
|
|
176
|
+
| **HTTP** | `fetch` (built-in) | `axios`, `ky` |
|
|
177
|
+
| **Storage (non-sensitive)** | `react-native-mmkv` | `@react-native-async-storage/async-storage` |
|
|
178
|
+
| **Storage (sensitive)** | `expo-secure-store` | `react-native-keychain` |
|
|
179
|
+
| **Images** | `expo-image` | `react-native-fast-image` |
|
|
180
|
+
| **Animation** | `react-native-reanimated` | `react-native-animated` (built-in, limited) |
|
|
181
|
+
| **Gestures** | `react-native-gesture-handler` | — |
|
|
182
|
+
| **Lists** | `@legendapp/list` (LegendList) | `@shopify/flash-list` (FlashList) |
|
|
183
|
+
| **Forms** | `react-hook-form` | `formik` |
|
|
184
|
+
| **Modals** | Native `Modal` with `formSheet` | `react-native-bottom-sheet` |
|
|
185
|
+
| **Menus** | `zeego` (native context/dropdown) | — |
|
|
186
|
+
| **Image Gallery** | `galeria` | — |
|
|
187
|
+
| **Icons** | `expo-symbols` (SF Symbols) | `@expo/vector-icons` |
|
|
188
|
+
| **Fonts** | Config plugin (native load) | `expo-font` (runtime load) |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Anti-Patterns & Gotchas
|
|
193
|
+
|
|
194
|
+
| ❌ Don't | Why | ✅ Do Instead |
|
|
195
|
+
|----------|-----|---------------|
|
|
196
|
+
| `ScrollView` with `.map()` for lists | Renders ALL items, memory explodes | `LegendList` / `FlashList` |
|
|
197
|
+
| `TouchableOpacity` for press | Legacy, limited API | `Pressable` — standard, more flexible |
|
|
198
|
+
| Text not wrapped in `<Text>` | Crashes on Android, undefined behavior | Always wrap strings in `<Text>` |
|
|
199
|
+
| `{condition && <Component/>}` with falsy value | `0` or `NaN` renders as text on Android | `{condition ? <Component/> : null}` |
|
|
200
|
+
| `useState` for scroll position | Re-renders on every frame, janky | `useSharedValue` from Reanimated |
|
|
201
|
+
| Inline objects in `style` prop | New reference every render | `StyleSheet.create()` or `borderCurve: 'continuous'` |
|
|
202
|
+
| `shadowColor`/`elevation` for shadows | Legacy, inconsistent cross-platform | CSS `boxShadow` string syntax |
|
|
203
|
+
| Margin between siblings | Fragile, breaks when children change | `gap` on parent container |
|
|
204
|
+
| `LinearGradient` third-party | Extra dependency | `experimental_backgroundImage: 'linear-gradient(...)'` |
|
|
205
|
+
| Custom header components | Misses native features (large titles, blur) | Native header `options` |
|
|
206
|
+
| `{ borderRadius: 12 }` alone | Sharp iOS corners | Add `borderCurve: 'continuous'` for smooth corners |
|
|
207
|
+
| Import entire lodash | Bundle bloat | `import debounce from 'lodash/debounce'` |
|
|
208
|
+
| `console.log` in production | Blocks JS thread, leaks data | Use a logger with levels, strip in release |
|
|
209
|
+
| Tokens in `AsyncStorage` | Plaintext, exposed on rooted device | `expo-secure-store` / Keychain |
|
|
210
|
+
|
|
211
|
+
### React Compiler Gotchas
|
|
212
|
+
|
|
213
|
+
When React Compiler is enabled:
|
|
214
|
+
- **Destructure functions early** — the compiler optimizes better with destructured function references.
|
|
215
|
+
- **Use `.get()`/`.set()` for Reanimated shared values** — the compiler cannot optimize `.value` property access patterns.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Testing
|
|
220
|
+
|
|
221
|
+
| Layer | Tool | Purpose |
|
|
222
|
+
|-------|------|---------|
|
|
223
|
+
| **Unit** | Jest + React Native Testing Library | Component logic, hooks, utils |
|
|
224
|
+
| **Component** | `@testing-library/react-native` | Render + interact with components |
|
|
225
|
+
| **E2E** | Maestro | Full flow testing, easy YAML syntax |
|
|
226
|
+
| **E2E (alt)** | Detox (Wix) | Full flow testing, JS-based |
|
|
227
|
+
|
|
228
|
+
**Testing principles:**
|
|
229
|
+
- Test behavior, not implementation (don't test component internals)
|
|
230
|
+
- Use `screen.getByRole()` and `getByText()` over `getByTestId()`
|
|
231
|
+
- Mock native modules at the module level (`jest.mock('expo-secure-store')`)
|
|
232
|
+
- Test loading, error, and empty states for every async component
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Deployment & Distribution
|
|
237
|
+
|
|
238
|
+
### EAS (Expo Application Services)
|
|
239
|
+
|
|
240
|
+
| Service | Purpose |
|
|
241
|
+
|---------|---------|
|
|
242
|
+
| **EAS Build** | Cloud builds for iOS and Android (no local Xcode/Android Studio needed) |
|
|
243
|
+
| **EAS Submit** | Publish to App Store / Google Play directly from CLI |
|
|
244
|
+
| **EAS Update** | OTA JavaScript updates (code push without app store review) |
|
|
245
|
+
|
|
246
|
+
**OTA update strategy:**
|
|
247
|
+
- Use `expo-updates` for JS-only changes (bug fixes, UI tweaks)
|
|
248
|
+
- Native changes (new native modules, SDK version bump) require a full build + store submission
|
|
249
|
+
- Set update channels: `production`, `staging`, `preview`
|
|
250
|
+
|
|
251
|
+
### Build commands
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# Development build (with dev client)
|
|
255
|
+
eas build --profile development --platform ios
|
|
256
|
+
|
|
257
|
+
# Production build
|
|
258
|
+
eas build --profile production --platform all
|
|
259
|
+
|
|
260
|
+
# Submit to stores
|
|
261
|
+
eas submit --platform ios
|
|
262
|
+
eas submit --platform android
|
|
263
|
+
|
|
264
|
+
# OTA update
|
|
265
|
+
eas update --branch production --message "Fix login bug"
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### App size optimization
|
|
269
|
+
- Enable Hermes (pre-compiled bytecode, smaller bundle)
|
|
270
|
+
- Use `expo-image` instead of `Image` (optimized loading)
|
|
271
|
+
- Tree-shake unused code with Metro bundler
|
|
272
|
+
- Use `expo-asset` for preloading critical assets
|
|
273
|
+
- Audit dependencies with `npx expo-doctor`
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Quick Reference — Granular Rules
|
|
278
|
+
|
|
279
|
+
Individual rule files in `react-native-rules/` with detailed incorrect/correct
|
|
280
|
+
code examples. Read the specific rule when working in that area.
|
|
281
|
+
|
|
282
|
+
> Source: [Vercel agent-skills](https://github.com/vercel-labs/agent-skills/tree/main/skills/react-native-skills)
|
|
283
|
+
|
|
284
|
+
### CRITICAL — Core Rendering
|
|
285
|
+
|
|
286
|
+
- [rendering-text-in-text-component.md](react-native-rules/rendering-text-in-text-component.md) — All text must be inside `<Text>`
|
|
287
|
+
- [rendering-no-falsy-and.md](react-native-rules/rendering-no-falsy-and.md) — Avoid falsy `&&` rendering
|
|
288
|
+
|
|
289
|
+
### HIGH — List Performance
|
|
290
|
+
|
|
291
|
+
- [list-performance-virtualize.md](react-native-rules/list-performance-virtualize.md) — Always use LegendList/FlashList
|
|
292
|
+
- [list-performance-function-references.md](react-native-rules/list-performance-function-references.md) — Stable object references
|
|
293
|
+
- [list-performance-item-memo.md](react-native-rules/list-performance-item-memo.md) — Pass primitives for memo
|
|
294
|
+
- [list-performance-callbacks.md](react-native-rules/list-performance-callbacks.md) — Hoist callbacks
|
|
295
|
+
- [list-performance-inline-objects.md](react-native-rules/list-performance-inline-objects.md) — No inline objects
|
|
296
|
+
- [list-performance-images.md](react-native-rules/list-performance-images.md) — Compressed images in lists
|
|
297
|
+
- [list-performance-item-types.md](react-native-rules/list-performance-item-types.md) — Item types for recycling
|
|
298
|
+
- [list-performance-item-expensive.md](react-native-rules/list-performance-item-expensive.md) — Defer expensive items
|
|
299
|
+
|
|
300
|
+
### HIGH — Animation
|
|
301
|
+
|
|
302
|
+
- [animation-gpu-properties.md](react-native-rules/animation-gpu-properties.md) — GPU-only properties (transform, opacity)
|
|
303
|
+
- [animation-derived-value.md](react-native-rules/animation-derived-value.md) — useDerivedValue over useAnimatedReaction
|
|
304
|
+
- [animation-gesture-detector-press.md](react-native-rules/animation-gesture-detector-press.md) — GestureDetector for press animations
|
|
305
|
+
|
|
306
|
+
### HIGH — Scroll & Navigation
|
|
307
|
+
|
|
308
|
+
- [scroll-position-no-state.md](react-native-rules/scroll-position-no-state.md) — Never track scroll in useState
|
|
309
|
+
- [navigation-native-navigators.md](react-native-rules/navigation-native-navigators.md) — Native stack/tab navigators
|
|
310
|
+
|
|
311
|
+
### MEDIUM — React State
|
|
312
|
+
|
|
313
|
+
- [react-state-minimize.md](react-native-rules/react-state-minimize.md) — Minimize state, derive values
|
|
314
|
+
- [react-state-dispatcher.md](react-native-rules/react-state-dispatcher.md) — Dispatch pattern for state
|
|
315
|
+
- [react-state-fallback.md](react-native-rules/react-state-fallback.md) — Fallback rendering pattern
|
|
316
|
+
- [state-ground-truth.md](react-native-rules/state-ground-truth.md) — State ground truth principles
|
|
317
|
+
|
|
318
|
+
### MEDIUM — React Compiler
|
|
319
|
+
|
|
320
|
+
- [react-compiler-destructure-functions.md](react-native-rules/react-compiler-destructure-functions.md) — Destructure functions early
|
|
321
|
+
- [react-compiler-reanimated-shared-values.md](react-native-rules/react-compiler-reanimated-shared-values.md) — .get()/.set() for shared values
|
|
322
|
+
|
|
323
|
+
### MEDIUM — UI Patterns
|
|
324
|
+
|
|
325
|
+
- [ui-expo-image.md](react-native-rules/ui-expo-image.md) — Use expo-image
|
|
326
|
+
- [ui-pressable.md](react-native-rules/ui-pressable.md) — Pressable over TouchableOpacity
|
|
327
|
+
- [ui-native-modals.md](react-native-rules/ui-native-modals.md) — Native modal presentations
|
|
328
|
+
- [ui-menus.md](react-native-rules/ui-menus.md) — Native context/dropdown menus (zeego)
|
|
329
|
+
- [ui-image-gallery.md](react-native-rules/ui-image-gallery.md) — Native image gallery (galeria)
|
|
330
|
+
- [ui-measure-views.md](react-native-rules/ui-measure-views.md) — Measure views correctly
|
|
331
|
+
- [ui-safe-area-scroll.md](react-native-rules/ui-safe-area-scroll.md) — Safe area with scroll
|
|
332
|
+
- [ui-scrollview-content-inset.md](react-native-rules/ui-scrollview-content-inset.md) — ScrollView content inset
|
|
333
|
+
- [ui-styling.md](react-native-rules/ui-styling.md) — Modern styling patterns (gap, boxShadow, borderCurve)
|
|
334
|
+
|
|
335
|
+
### MEDIUM — Design System
|
|
336
|
+
|
|
337
|
+
- [design-system-compound-components.md](react-native-rules/design-system-compound-components.md) — Compound component pattern
|
|
338
|
+
|
|
339
|
+
### LOW — Monorepo, Dependencies, JS, Fonts
|
|
340
|
+
|
|
341
|
+
- [monorepo-native-deps-in-app.md](react-native-rules/monorepo-native-deps-in-app.md) — Native deps in app package
|
|
342
|
+
- [monorepo-single-dependency-versions.md](react-native-rules/monorepo-single-dependency-versions.md) — Single dependency versions
|
|
343
|
+
- [imports-design-system-folder.md](react-native-rules/imports-design-system-folder.md) — Re-export third-party deps
|
|
344
|
+
- [js-hoist-intl.md](react-native-rules/js-hoist-intl.md) — Hoist Intl formatters
|
|
345
|
+
- [fonts-config-plugin.md](react-native-rules/fonts-config-plugin.md) — Config plugin for fonts
|