tribunal-kit 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +187 -220
- package/.agent/agents/ai-code-reviewer.md +199 -233
- package/.agent/agents/backend-specialist.md +215 -238
- package/.agent/agents/code-archaeologist.md +161 -181
- package/.agent/agents/database-architect.md +184 -207
- package/.agent/agents/debugger.md +191 -218
- package/.agent/agents/dependency-reviewer.md +103 -136
- package/.agent/agents/devops-engineer.md +218 -238
- package/.agent/agents/documentation-writer.md +201 -221
- package/.agent/agents/explorer-agent.md +160 -180
- package/.agent/agents/frontend-reviewer.md +160 -194
- package/.agent/agents/frontend-specialist.md +248 -237
- package/.agent/agents/game-developer.md +48 -52
- package/.agent/agents/logic-reviewer.md +116 -149
- package/.agent/agents/mobile-developer.md +200 -223
- package/.agent/agents/mobile-reviewer.md +162 -195
- package/.agent/agents/orchestrator.md +181 -211
- package/.agent/agents/penetration-tester.md +157 -174
- package/.agent/agents/performance-optimizer.md +183 -203
- package/.agent/agents/performance-reviewer.md +178 -211
- package/.agent/agents/product-manager.md +142 -162
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +142 -162
- package/.agent/agents/qa-automation-engineer.md +225 -242
- package/.agent/agents/security-auditor.md +174 -194
- package/.agent/agents/seo-specialist.md +193 -213
- package/.agent/agents/sql-reviewer.md +161 -194
- package/.agent/agents/supervisor-agent.md +184 -203
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +160 -193
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +175 -208
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +92 -126
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +126 -160
- package/.agent/skills/api-patterns/SKILL.md +123 -215
- package/.agent/skills/api-security-auditor/SKILL.md +143 -177
- package/.agent/skills/app-builder/SKILL.md +326 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +87 -121
- package/.agent/skills/architecture/SKILL.md +82 -252
- package/.agent/skills/authentication-best-practices/SKILL.md +139 -173
- package/.agent/skills/bash-linux/SKILL.md +120 -154
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +428 -104
- package/.agent/skills/building-native-ui/SKILL.md +143 -174
- package/.agent/skills/clean-code/SKILL.md +323 -360
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +107 -141
- package/.agent/skills/csharp-developer/SKILL.md +468 -528
- package/.agent/skills/database-design/SKILL.md +104 -369
- package/.agent/skills/deployment-procedures/SKILL.md +111 -145
- package/.agent/skills/devops-engineer/SKILL.md +295 -332
- package/.agent/skills/devops-incident-responder/SKILL.md +79 -113
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +123 -157
- package/.agent/skills/extract-design-system/SKILL.md +100 -134
- package/.agent/skills/framer-motion-expert/SKILL.md +111 -855
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -105
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -122
- package/.agent/skills/geo-fundamentals/SKILL.md +89 -124
- package/.agent/skills/github-operations/SKILL.md +279 -314
- package/.agent/skills/gsap-expert/SKILL.md +119 -826
- package/.agent/skills/i18n-localization/SKILL.md +104 -138
- package/.agent/skills/intelligent-routing/SKILL.md +159 -127
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +344 -357
- package/.agent/skills/local-first/SKILL.md +120 -154
- package/.agent/skills/mcp-builder/SKILL.md +84 -118
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +99 -698
- package/.agent/skills/nodejs-best-practices/SKILL.md +498 -559
- package/.agent/skills/observability/SKILL.md +293 -330
- package/.agent/skills/parallel-agents/SKILL.md +88 -122
- package/.agent/skills/performance-profiling/SKILL.md +217 -254
- package/.agent/skills/plan-writing/SKILL.md +84 -118
- package/.agent/skills/platform-engineer/SKILL.md +89 -123
- package/.agent/skills/playwright-best-practices/SKILL.md +128 -162
- package/.agent/skills/powershell-windows/SKILL.md +112 -146
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +148 -754
- package/.agent/skills/react-specialist/SKILL.md +123 -827
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +269 -304
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +623 -701
- package/.agent/skills/seo-fundamentals/SKILL.md +120 -154
- package/.agent/skills/server-management/SKILL.md +156 -190
- package/.agent/skills/shadcn-ui-expert/SKILL.md +172 -206
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +579 -633
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +142 -176
- package/.agent/skills/systematic-debugging/SKILL.md +84 -118
- package/.agent/skills/tailwind-patterns/SKILL.md +516 -576
- package/.agent/skills/tdd-workflow/SKILL.md +103 -137
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +512 -573
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +127 -866
- package/.agent/skills/vulnerability-scanner/SKILL.md +354 -269
- package/.agent/skills/web-accessibility-auditor/SKILL.md +159 -193
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +111 -145
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +151 -151
- package/.agent/workflows/audit.md +127 -138
- package/.agent/workflows/brainstorm.md +110 -110
- package/.agent/workflows/changelog.md +112 -112
- package/.agent/workflows/create.md +124 -124
- package/.agent/workflows/debug.md +165 -189
- package/.agent/workflows/deploy.md +180 -189
- package/.agent/workflows/enhance.md +128 -151
- package/.agent/workflows/fix.md +114 -135
- package/.agent/workflows/generate.md +12 -4
- package/.agent/workflows/migrate.md +160 -160
- package/.agent/workflows/orchestrate.md +168 -168
- package/.agent/workflows/performance-benchmarker.md +114 -123
- package/.agent/workflows/plan.md +173 -173
- package/.agent/workflows/preview.md +80 -80
- package/.agent/workflows/refactor.md +161 -183
- package/.agent/workflows/review-ai.md +101 -129
- package/.agent/workflows/review.md +116 -116
- package/.agent/workflows/session.md +94 -94
- package/.agent/workflows/status.md +79 -79
- package/.agent/workflows/strengthen-skills.md +138 -139
- package/.agent/workflows/swarm.md +179 -179
- package/.agent/workflows/test.md +189 -211
- package/.agent/workflows/tribunal-backend.md +93 -113
- package/.agent/workflows/tribunal-database.md +94 -115
- package/.agent/workflows/tribunal-frontend.md +95 -118
- package/.agent/workflows/tribunal-full.md +92 -133
- package/.agent/workflows/tribunal-mobile.md +94 -119
- package/.agent/workflows/tribunal-performance.md +109 -133
- package/.agent/workflows/ui-ux-pro-max.md +122 -143
- package/package.json +1 -1
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -1,174 +1,143 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: building-native-ui
|
|
3
|
-
description: Cross-platform Native UI mastery (React Native / Expo). Building seamless, 60fps mobile interfaces, handling safe areas, navigation architectures (Expo Router), native modules, gestures/animations (Reanimated), and platform-specific styling. Use when building React Native or Expo mobile apps.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version: 2.0.0
|
|
6
|
-
last-updated: 2026-04-02
|
|
7
|
-
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Building Native UI — React Native & Expo Mastery
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 1. The Expo Router Architecture
|
|
18
|
-
|
|
19
|
-
File-based routing replaces legacy imperative React Navigation boilerplates.
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
// Directory structure dictates routes
|
|
23
|
-
// app/
|
|
24
|
-
// ├── _layout.tsx (Global wrap, e.g. Stack or Tabs)
|
|
25
|
-
// ├── index.tsx (Matches '/')
|
|
26
|
-
// ├── (auth)/ (Route group, invisible in URL)
|
|
27
|
-
// │ └── login.tsx (Matches '/login')
|
|
28
|
-
// └── user/
|
|
29
|
-
// └── [id].tsx (Dynamic route, matches '/user/123')
|
|
30
|
-
|
|
31
|
-
// Link navigation (Strongly typed in Expo Router v3+)
|
|
32
|
-
import { Link, router } from 'expo-router';
|
|
33
|
-
|
|
34
|
-
export default function Home() {
|
|
35
|
-
return (
|
|
36
|
-
<View>
|
|
37
|
-
{/* Declarative */}
|
|
38
|
-
<Link href="/user/123" asChild>
|
|
39
|
-
<Pressable><Text>Go to Profile</Text></Pressable>
|
|
40
|
-
</Link>
|
|
41
|
-
|
|
42
|
-
{/* Imperative */}
|
|
43
|
-
<Button onPress={() => router.push('/(auth)/login')} title="Login" />
|
|
44
|
-
</View>
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## 2. Platform Nuances & Safe Areas
|
|
52
|
-
|
|
53
|
-
Mobile devices have notches, home indicators, and varied status bars.
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
// ❌ BAD: Ignoring notches
|
|
57
|
-
export const Header = () => <View style={{ paddingTop: 20 }} />
|
|
58
|
-
|
|
59
|
-
// ✅ GOOD: react-native-safe-area-context
|
|
60
|
-
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
61
|
-
|
|
62
|
-
export const Header = () => {
|
|
63
|
-
const insets = useSafeAreaInsets();
|
|
64
|
-
return (
|
|
65
|
-
<View style={{ paddingTop: insets.top, paddingBottom: insets.bottom }}>
|
|
66
|
-
<Text>Header Content</Text>
|
|
67
|
-
</View>
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// ✅ Platform-specific logic
|
|
72
|
-
import { Platform, StyleSheet } from 'react-native';
|
|
73
|
-
|
|
74
|
-
const styles = StyleSheet.create({
|
|
75
|
-
shadow: {
|
|
76
|
-
...Platform.select({
|
|
77
|
-
ios: { shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.2 },
|
|
78
|
-
android: { elevation: 4 }, // Android requires elevation for shadows
|
|
79
|
-
}),
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## 3. High-Performance Animations (Reanimated)
|
|
87
|
-
|
|
88
|
-
Never animate over the React Native bridge. Keep animations strictly on the native UI thread using `react-native-reanimated`.
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
// ❌ BAD: Animated.Value across the bridge, or setState driven animations
|
|
92
|
-
// setState -> JS Thread calculate -> Bridge JSON -> Native UI (Drops frames!)
|
|
93
|
-
|
|
94
|
-
// ✅ GOOD: Reanimated UI thread execution
|
|
95
|
-
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated';
|
|
96
|
-
|
|
97
|
-
export function BouncyBox() {
|
|
98
|
-
const offset = useSharedValue(0); // Lives natively
|
|
99
|
-
|
|
100
|
-
const animatedStyles = useAnimatedStyle(() => {
|
|
101
|
-
return {
|
|
102
|
-
transform: [{ translateY: offset.value }], // Syncs natively
|
|
103
|
-
};
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
return (
|
|
107
|
-
<>
|
|
108
|
-
<Animated.View style={[styles.box, animatedStyles]} />
|
|
109
|
-
<Button onPress={() => (offset.value = withSpring(Math.random() * 255))} title="Bounce" />
|
|
110
|
-
</>
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## 4. List Performance
|
|
118
|
-
|
|
119
|
-
FlatList rendering is the #1 cause of React Native app crashes due to OOM (Out of Memory).
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
import { FlashList } from "@shopify/flash-list";
|
|
123
|
-
|
|
124
|
-
// ❌ BAD: Standard ScrollView for massive lists
|
|
125
|
-
// Maps every item instantly. Crashes on large data sets.
|
|
126
|
-
|
|
127
|
-
// ❌ MEDIOCRE: FlatList
|
|
128
|
-
// Blank spaces when scrolling fast due to JS thread bridge bottlenecks.
|
|
129
|
-
|
|
130
|
-
// ✅ BEST: FlashList (Shopify)
|
|
131
|
-
// Recycles views instantly like native UICollectionView / RecyclerView.
|
|
132
|
-
export function FastList({ data }) {
|
|
133
|
-
return (
|
|
134
|
-
<FlashList
|
|
135
|
-
data={data}
|
|
136
|
-
renderItem={({ item }) => <Text>{item.title}</Text>}
|
|
137
|
-
estimatedItemSize={50} // CRUCIAL for performance
|
|
138
|
-
/>
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## 🤖 LLM-Specific Traps (React Native UI)
|
|
146
|
-
|
|
147
|
-
1. **HTML Elements:** AI frequently hallucinates `<div>`, `<span>`, and `<p>` tags inside React Native code. React Native STRICTLY requires `<View>`, `<Text>`, and `<Pressable>`.
|
|
148
|
-
2. **CSS properties:** AI writes `box-shadow` or `border-radius: 10px`. React Native styling uses `shadowColor / elevation` and numeric `borderRadius: 10`.
|
|
149
|
-
3. **Bridge Animations:** AI suggests legacy `Animated.timing` or `setState` loops for animations. Demand `react-native-reanimated` shared values on the UI thread.
|
|
150
|
-
4. **Ignoring Safe Areas:** Bounding UI boxes against the absolute physical screen edge, resulting in text hidden behind iPhone dynamic islands or Android navigation bars.
|
|
151
|
-
5. **ScrollView Data Dumps:** Rendering a `.map()` inside a `<ScrollView>` for 1000 items, crashing the mobile memory constraint.
|
|
152
|
-
6. **`onClick` instead of `onPress`:** Using standard web synthetic events. React Native buttons use `onPress`.
|
|
153
|
-
7. **Absolute SVGs:** Attempting to render standard `<svg>` tags. Requires `react-native-svg` with precise React-friendly props.
|
|
154
|
-
8. **Keyboard Avoidance:** Failing to wrap inputs in `<KeyboardAvoidingView>`, meaning the digital keyboard pops up and permanently obscures the text input.
|
|
155
|
-
9. **Platform Blindness:** Applying `shadowOpacity` expecting it to work on Android (it doesn't, requires `elevation`).
|
|
156
|
-
10. **Legacy Navigation:** Generating sprawling `react-navigation` stack files instead of utilizing modern Expo Router file-based topologies.
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## 🏛️ Tribunal Integration
|
|
161
|
-
|
|
162
|
-
### ✅ Pre-Flight Self-Audit
|
|
163
|
-
```
|
|
164
|
-
✅ Did I exclusively use native primitives (<View>, <Text>, <Pressable>) and NO HTML tags?
|
|
165
|
-
✅ Is `react-native-reanimated` handling all physics and animations on the UI thread?
|
|
166
|
-
✅ Are large lists utilizing `<FlashList>` with a declared `estimatedItemSize`?
|
|
167
|
-
✅ Is UI guarded from notches using `useSafeAreaInsets`?
|
|
168
|
-
✅ Are styles written strictly via `StyleSheet.create` with numeric values, not string CSS?
|
|
169
|
-
✅ Are interactive touch points using `onPress`, not `onClick`?
|
|
170
|
-
✅ Is the Keyboard explicitly handled via `KeyboardAvoidingView` or `KeyboardAwareScrollView`?
|
|
171
|
-
✅ Is routing leveraging modern Expo Router file systems?
|
|
172
|
-
✅ Are shadows handled specifically for iOS (shadowProps) and Android (elevation)?
|
|
173
|
-
✅ Have I avoided sending massive state updates back and forth across the JS bridge?
|
|
174
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: building-native-ui
|
|
3
|
+
description: Cross-platform Native UI mastery (React Native / Expo). Building seamless, 60fps mobile interfaces, handling safe areas, navigation architectures (Expo Router), native modules, gestures/animations (Reanimated), and platform-specific styling. Use when building React Native or Expo mobile apps.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
version: 2.0.0
|
|
6
|
+
last-updated: 2026-04-02
|
|
7
|
+
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Building Native UI — React Native & Expo Mastery
|
|
11
|
+
|
|
12
|
+
A mobile app isn't a website confined to a small screen.
|
|
13
|
+
60 FPS is not a goal; it is a rigid requirement. The JS thread is a fragile bottleneck.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. The Expo Router Architecture
|
|
18
|
+
|
|
19
|
+
File-based routing replaces legacy imperative React Navigation boilerplates.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// Directory structure dictates routes
|
|
23
|
+
// app/
|
|
24
|
+
// ├── _layout.tsx (Global wrap, e.g. Stack or Tabs)
|
|
25
|
+
// ├── index.tsx (Matches '/')
|
|
26
|
+
// ├── (auth)/ (Route group, invisible in URL)
|
|
27
|
+
// │ └── login.tsx (Matches '/login')
|
|
28
|
+
// └── user/
|
|
29
|
+
// └── [id].tsx (Dynamic route, matches '/user/123')
|
|
30
|
+
|
|
31
|
+
// Link navigation (Strongly typed in Expo Router v3+)
|
|
32
|
+
import { Link, router } from 'expo-router';
|
|
33
|
+
|
|
34
|
+
export default function Home() {
|
|
35
|
+
return (
|
|
36
|
+
<View>
|
|
37
|
+
{/* Declarative */}
|
|
38
|
+
<Link href="/user/123" asChild>
|
|
39
|
+
<Pressable><Text>Go to Profile</Text></Pressable>
|
|
40
|
+
</Link>
|
|
41
|
+
|
|
42
|
+
{/* Imperative */}
|
|
43
|
+
<Button onPress={() => router.push('/(auth)/login')} title="Login" />
|
|
44
|
+
</View>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 2. Platform Nuances & Safe Areas
|
|
52
|
+
|
|
53
|
+
Mobile devices have notches, home indicators, and varied status bars.
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// ❌ BAD: Ignoring notches
|
|
57
|
+
export const Header = () => <View style={{ paddingTop: 20 }} />
|
|
58
|
+
|
|
59
|
+
// ✅ GOOD: react-native-safe-area-context
|
|
60
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
61
|
+
|
|
62
|
+
export const Header = () => {
|
|
63
|
+
const insets = useSafeAreaInsets();
|
|
64
|
+
return (
|
|
65
|
+
<View style={{ paddingTop: insets.top, paddingBottom: insets.bottom }}>
|
|
66
|
+
<Text>Header Content</Text>
|
|
67
|
+
</View>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ✅ Platform-specific logic
|
|
72
|
+
import { Platform, StyleSheet } from 'react-native';
|
|
73
|
+
|
|
74
|
+
const styles = StyleSheet.create({
|
|
75
|
+
shadow: {
|
|
76
|
+
...Platform.select({
|
|
77
|
+
ios: { shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.2 },
|
|
78
|
+
android: { elevation: 4 }, // Android requires elevation for shadows
|
|
79
|
+
}),
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 3. High-Performance Animations (Reanimated)
|
|
87
|
+
|
|
88
|
+
Never animate over the React Native bridge. Keep animations strictly on the native UI thread using `react-native-reanimated`.
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// ❌ BAD: Animated.Value across the bridge, or setState driven animations
|
|
92
|
+
// setState -> JS Thread calculate -> Bridge JSON -> Native UI (Drops frames!)
|
|
93
|
+
|
|
94
|
+
// ✅ GOOD: Reanimated UI thread execution
|
|
95
|
+
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated';
|
|
96
|
+
|
|
97
|
+
export function BouncyBox() {
|
|
98
|
+
const offset = useSharedValue(0); // Lives natively
|
|
99
|
+
|
|
100
|
+
const animatedStyles = useAnimatedStyle(() => {
|
|
101
|
+
return {
|
|
102
|
+
transform: [{ translateY: offset.value }], // Syncs natively
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<>
|
|
108
|
+
<Animated.View style={[styles.box, animatedStyles]} />
|
|
109
|
+
<Button onPress={() => (offset.value = withSpring(Math.random() * 255))} title="Bounce" />
|
|
110
|
+
</>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 4. List Performance
|
|
118
|
+
|
|
119
|
+
FlatList rendering is the #1 cause of React Native app crashes due to OOM (Out of Memory).
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { FlashList } from "@shopify/flash-list";
|
|
123
|
+
|
|
124
|
+
// ❌ BAD: Standard ScrollView for massive lists
|
|
125
|
+
// Maps every item instantly. Crashes on large data sets.
|
|
126
|
+
|
|
127
|
+
// ❌ MEDIOCRE: FlatList
|
|
128
|
+
// Blank spaces when scrolling fast due to JS thread bridge bottlenecks.
|
|
129
|
+
|
|
130
|
+
// ✅ BEST: FlashList (Shopify)
|
|
131
|
+
// Recycles views instantly like native UICollectionView / RecyclerView.
|
|
132
|
+
export function FastList({ data }) {
|
|
133
|
+
return (
|
|
134
|
+
<FlashList
|
|
135
|
+
data={data}
|
|
136
|
+
renderItem={({ item }) => <Text>{item.title}</Text>}
|
|
137
|
+
estimatedItemSize={50} // CRUCIAL for performance
|
|
138
|
+
/>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|