@sylix/coworker 2.0.11 → 2.0.14
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/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +22 -4
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +6 -3
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
- package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
- package/dist/skills/defaults/ai-ml/rag.md +276 -0
- package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
- package/dist/skills/defaults/backend-development/api-design.md +285 -0
- package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
- package/dist/skills/defaults/backend-development/async-python.md +237 -0
- package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
- package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
- package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
- package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
- package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
- package/dist/skills/defaults/backend-development/database-design.md +305 -0
- package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
- package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
- package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
- package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
- package/dist/skills/defaults/backend-development/fastapi.md +309 -0
- package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
- package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
- package/dist/skills/defaults/backend-development/microservices.md +284 -0
- package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
- package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
- package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
- package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
- package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
- package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
- package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
- package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
- package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
- package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
- package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
- package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
- package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
- package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
- package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
- package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
- package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
- package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
- package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
- package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
- package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
- package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
- package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
- package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
- package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
- package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
- package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
- package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
- package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
- package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
- package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
- package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
- package/dist/skills/defaults/data-engineering/airflow.md +519 -0
- package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
- package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
- package/dist/skills/defaults/data-engineering/dbt.md +556 -0
- package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
- package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
- package/dist/skills/defaults/data-engineering/spark.md +411 -0
- package/dist/skills/defaults/database/postgresql.md +202 -0
- package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
- package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
- package/dist/skills/defaults/devops/changelog-automation.md +580 -0
- package/dist/skills/defaults/devops/cicd.md +314 -0
- package/dist/skills/defaults/devops/cloud.md +263 -0
- package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
- package/dist/skills/defaults/devops/cost-optimization.md +295 -0
- package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
- package/dist/skills/defaults/devops/docker.md +281 -0
- package/dist/skills/defaults/devops/git-workflows.md +205 -0
- package/dist/skills/defaults/devops/github-actions.md +311 -0
- package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
- package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
- package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
- package/dist/skills/defaults/devops/kubernetes.md +339 -0
- package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
- package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
- package/dist/skills/defaults/devops/observability.md +243 -0
- package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
- package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
- package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
- package/dist/skills/defaults/devops/secrets-management.md +341 -0
- package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
- package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
- package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
- package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
- package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
- package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
- package/dist/skills/defaults/frontend/interaction-design.md +327 -0
- package/dist/skills/defaults/frontend/javascript.md +311 -0
- package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
- package/dist/skills/defaults/frontend/react-native-design.md +440 -0
- package/dist/skills/defaults/frontend/react.md +345 -0
- package/dist/skills/defaults/frontend/responsive-design.md +472 -0
- package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
- package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
- package/dist/skills/defaults/frontend/typescript.md +334 -0
- package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
- package/dist/skills/defaults/frontend/web-component-design.md +279 -0
- package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
- package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
- package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
- package/dist/skills/defaults/kubernetes/gitops.md +280 -0
- package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
- package/dist/skills/defaults/kubernetes/helm.md +343 -0
- package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
- package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
- package/dist/skills/defaults/kubernetes/manifests.md +330 -0
- package/dist/skills/defaults/kubernetes/security.md +337 -0
- package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
- package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
- package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
- package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
- package/dist/skills/defaults/llm-application/langchain.md +259 -0
- package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
- package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
- package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
- package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
- package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
- package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
- package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
- package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
- package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
- package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
- package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
- package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
- package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
- package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
- package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
- package/dist/skills/defaults/security/auditor.md +168 -0
- package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
- package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
- package/dist/skills/defaults/security/mtls-configuration.md +349 -0
- package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
- package/dist/skills/defaults/security/sast-configuration.md +182 -0
- package/dist/skills/defaults/security/security.md +313 -0
- package/dist/skills/defaults/security/stride-analysis.md +273 -0
- package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
- package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
- package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
- package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
- package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
- package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
- package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
- package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
- package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
- package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
- package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
- package/dist/skills/defaults/testing/testing.md +332 -0
- package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
- package/dist/skills/defaults/workflows/track-management.md +592 -0
- package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +129 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/utils/character.js +4 -4
- package/dist/utils/character.js.map +1 -1
- package/dist/utils/inputbar.d.ts.map +1 -1
- package/dist/utils/inputbar.js +7 -0
- package/dist/utils/inputbar.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-native-design
|
|
3
|
+
description: Master React Native styling, navigation, and Reanimated animations for cross-platform mobile development. Use when building React Native apps, implementing navigation patterns, or creating performant animations.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# React Native Design
|
|
7
|
+
|
|
8
|
+
Master React Native styling patterns, React Navigation, and Reanimated 3 to build performant, cross-platform mobile applications with native-quality user experiences.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Building cross-platform mobile apps with React Native
|
|
13
|
+
- Implementing navigation with React Navigation 6+
|
|
14
|
+
- Creating performant animations with Reanimated 3
|
|
15
|
+
- Styling components with StyleSheet and styled-components
|
|
16
|
+
- Building responsive layouts for different screen sizes
|
|
17
|
+
- Implementing platform-specific designs (iOS/Android)
|
|
18
|
+
- Creating gesture-driven interactions with Gesture Handler
|
|
19
|
+
- Optimizing React Native performance
|
|
20
|
+
|
|
21
|
+
## Core Concepts
|
|
22
|
+
|
|
23
|
+
### 1. StyleSheet and Styling
|
|
24
|
+
|
|
25
|
+
**Basic StyleSheet:**
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { StyleSheet, View, Text } from 'react-native';
|
|
29
|
+
|
|
30
|
+
const styles = StyleSheet.create({
|
|
31
|
+
container: {
|
|
32
|
+
flex: 1,
|
|
33
|
+
padding: 16,
|
|
34
|
+
backgroundColor: '#ffffff',
|
|
35
|
+
},
|
|
36
|
+
title: {
|
|
37
|
+
fontSize: 24,
|
|
38
|
+
fontWeight: '600',
|
|
39
|
+
color: '#1a1a1a',
|
|
40
|
+
marginBottom: 8,
|
|
41
|
+
},
|
|
42
|
+
subtitle: {
|
|
43
|
+
fontSize: 16,
|
|
44
|
+
color: '#666666',
|
|
45
|
+
lineHeight: 24,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
function Card() {
|
|
50
|
+
return (
|
|
51
|
+
<View style={styles.container}>
|
|
52
|
+
<Text style={styles.title}>Title</Text>
|
|
53
|
+
<Text style={styles.subtitle}>Subtitle text</Text>
|
|
54
|
+
</View>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Dynamic Styles:**
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
interface CardProps {
|
|
63
|
+
variant: 'primary' | 'secondary';
|
|
64
|
+
disabled?: boolean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function Card({ variant, disabled }: CardProps) {
|
|
68
|
+
return (
|
|
69
|
+
<View style={[
|
|
70
|
+
styles.card,
|
|
71
|
+
variant === 'primary' ? styles.primary : styles.secondary,
|
|
72
|
+
disabled && styles.disabled,
|
|
73
|
+
]}>
|
|
74
|
+
<Text style={styles.text}>Content</Text>
|
|
75
|
+
</View>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const styles = StyleSheet.create({
|
|
80
|
+
card: {
|
|
81
|
+
padding: 16,
|
|
82
|
+
borderRadius: 12,
|
|
83
|
+
},
|
|
84
|
+
primary: {
|
|
85
|
+
backgroundColor: '#6366f1',
|
|
86
|
+
},
|
|
87
|
+
secondary: {
|
|
88
|
+
backgroundColor: '#f3f4f6',
|
|
89
|
+
borderWidth: 1,
|
|
90
|
+
borderColor: '#e5e7eb',
|
|
91
|
+
},
|
|
92
|
+
disabled: {
|
|
93
|
+
opacity: 0.5,
|
|
94
|
+
},
|
|
95
|
+
text: {
|
|
96
|
+
fontSize: 16,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 2. Flexbox Layout
|
|
102
|
+
|
|
103
|
+
**Row and Column Layouts:**
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
const styles = StyleSheet.create({
|
|
107
|
+
// Vertical stack (column)
|
|
108
|
+
column: {
|
|
109
|
+
flexDirection: "column",
|
|
110
|
+
gap: 12,
|
|
111
|
+
},
|
|
112
|
+
// Horizontal stack (row)
|
|
113
|
+
row: {
|
|
114
|
+
flexDirection: "row",
|
|
115
|
+
alignItems: "center",
|
|
116
|
+
gap: 8,
|
|
117
|
+
},
|
|
118
|
+
// Space between items
|
|
119
|
+
spaceBetween: {
|
|
120
|
+
flexDirection: "row",
|
|
121
|
+
justifyContent: "space-between",
|
|
122
|
+
alignItems: "center",
|
|
123
|
+
},
|
|
124
|
+
// Centered content
|
|
125
|
+
centered: {
|
|
126
|
+
flex: 1,
|
|
127
|
+
justifyContent: "center",
|
|
128
|
+
alignItems: "center",
|
|
129
|
+
},
|
|
130
|
+
// Fill remaining space
|
|
131
|
+
fill: {
|
|
132
|
+
flex: 1,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 3. React Navigation Setup
|
|
138
|
+
|
|
139
|
+
**Stack Navigator:**
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { NavigationContainer } from '@react-navigation/native';
|
|
143
|
+
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
|
144
|
+
|
|
145
|
+
type RootStackParamList = {
|
|
146
|
+
Home: undefined;
|
|
147
|
+
Detail: { itemId: string };
|
|
148
|
+
Settings: undefined;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const Stack = createNativeStackNavigator<RootStackParamList>();
|
|
152
|
+
|
|
153
|
+
function AppNavigator() {
|
|
154
|
+
return (
|
|
155
|
+
<NavigationContainer>
|
|
156
|
+
<Stack.Navigator
|
|
157
|
+
initialRouteName="Home"
|
|
158
|
+
screenOptions={{
|
|
159
|
+
headerStyle: { backgroundColor: '#6366f1' },
|
|
160
|
+
headerTintColor: '#ffffff',
|
|
161
|
+
headerTitleStyle: { fontWeight: '600' },
|
|
162
|
+
}}
|
|
163
|
+
>
|
|
164
|
+
<Stack.Screen
|
|
165
|
+
name="Home"
|
|
166
|
+
component={HomeScreen}
|
|
167
|
+
options={{ title: 'Home' }}
|
|
168
|
+
/>
|
|
169
|
+
<Stack.Screen
|
|
170
|
+
name="Detail"
|
|
171
|
+
component={DetailScreen}
|
|
172
|
+
options={({ route }) => ({
|
|
173
|
+
title: `Item ${route.params.itemId}`,
|
|
174
|
+
})}
|
|
175
|
+
/>
|
|
176
|
+
<Stack.Screen name="Settings" component={SettingsScreen} />
|
|
177
|
+
</Stack.Navigator>
|
|
178
|
+
</NavigationContainer>
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Tab Navigator:**
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
|
187
|
+
import { Ionicons } from '@expo/vector-icons';
|
|
188
|
+
|
|
189
|
+
type TabParamList = {
|
|
190
|
+
Home: undefined;
|
|
191
|
+
Search: undefined;
|
|
192
|
+
Profile: undefined;
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
const Tab = createBottomTabNavigator<TabParamList>();
|
|
196
|
+
|
|
197
|
+
function TabNavigator() {
|
|
198
|
+
return (
|
|
199
|
+
<Tab.Navigator
|
|
200
|
+
screenOptions={({ route }) => ({
|
|
201
|
+
tabBarIcon: ({ focused, color, size }) => {
|
|
202
|
+
const icons: Record<string, keyof typeof Ionicons.glyphMap> = {
|
|
203
|
+
Home: focused ? 'home' : 'home-outline',
|
|
204
|
+
Search: focused ? 'search' : 'search-outline',
|
|
205
|
+
Profile: focused ? 'person' : 'person-outline',
|
|
206
|
+
};
|
|
207
|
+
return <Ionicons name={icons[route.name]} size={size} color={color} />;
|
|
208
|
+
},
|
|
209
|
+
tabBarActiveTintColor: '#6366f1',
|
|
210
|
+
tabBarInactiveTintColor: '#9ca3af',
|
|
211
|
+
})}
|
|
212
|
+
>
|
|
213
|
+
<Tab.Screen name="Home" component={HomeScreen} />
|
|
214
|
+
<Tab.Screen name="Search" component={SearchScreen} />
|
|
215
|
+
<Tab.Screen name="Profile" component={ProfileScreen} />
|
|
216
|
+
</Tab.Navigator>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 4. Reanimated 3 Basics
|
|
222
|
+
|
|
223
|
+
**Animated Values:**
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
import Animated, {
|
|
227
|
+
useSharedValue,
|
|
228
|
+
useAnimatedStyle,
|
|
229
|
+
withSpring,
|
|
230
|
+
withTiming,
|
|
231
|
+
} from 'react-native-reanimated';
|
|
232
|
+
|
|
233
|
+
function AnimatedBox() {
|
|
234
|
+
const scale = useSharedValue(1);
|
|
235
|
+
const opacity = useSharedValue(1);
|
|
236
|
+
|
|
237
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
238
|
+
transform: [{ scale: scale.value }],
|
|
239
|
+
opacity: opacity.value,
|
|
240
|
+
}));
|
|
241
|
+
|
|
242
|
+
const handlePress = () => {
|
|
243
|
+
scale.value = withSpring(1.2, {}, () => {
|
|
244
|
+
scale.value = withSpring(1);
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
return (
|
|
249
|
+
<Pressable onPress={handlePress}>
|
|
250
|
+
<Animated.View style={[styles.box, animatedStyle]} />
|
|
251
|
+
</Pressable>
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Gesture Handler Integration:**
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
260
|
+
import Animated, {
|
|
261
|
+
useSharedValue,
|
|
262
|
+
useAnimatedStyle,
|
|
263
|
+
withSpring,
|
|
264
|
+
} from 'react-native-reanimated';
|
|
265
|
+
|
|
266
|
+
function DraggableCard() {
|
|
267
|
+
const translateX = useSharedValue(0);
|
|
268
|
+
const translateY = useSharedValue(0);
|
|
269
|
+
|
|
270
|
+
const gesture = Gesture.Pan()
|
|
271
|
+
.onUpdate((event) => {
|
|
272
|
+
translateX.value = event.translationX;
|
|
273
|
+
translateY.value = event.translationY;
|
|
274
|
+
})
|
|
275
|
+
.onEnd(() => {
|
|
276
|
+
translateX.value = withSpring(0);
|
|
277
|
+
translateY.value = withSpring(0);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
281
|
+
transform: [
|
|
282
|
+
{ translateX: translateX.value },
|
|
283
|
+
{ translateY: translateY.value },
|
|
284
|
+
],
|
|
285
|
+
}));
|
|
286
|
+
|
|
287
|
+
return (
|
|
288
|
+
<GestureDetector gesture={gesture}>
|
|
289
|
+
<Animated.View style={[styles.card, animatedStyle]}>
|
|
290
|
+
<Text>Drag me!</Text>
|
|
291
|
+
</Animated.View>
|
|
292
|
+
</GestureDetector>
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### 5. Platform-Specific Styling
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
import { Platform, StyleSheet } from "react-native";
|
|
301
|
+
|
|
302
|
+
const styles = StyleSheet.create({
|
|
303
|
+
container: {
|
|
304
|
+
padding: 16,
|
|
305
|
+
...Platform.select({
|
|
306
|
+
ios: {
|
|
307
|
+
shadowColor: "#000",
|
|
308
|
+
shadowOffset: { width: 0, height: 2 },
|
|
309
|
+
shadowOpacity: 0.1,
|
|
310
|
+
shadowRadius: 4,
|
|
311
|
+
},
|
|
312
|
+
android: {
|
|
313
|
+
elevation: 4,
|
|
314
|
+
},
|
|
315
|
+
}),
|
|
316
|
+
},
|
|
317
|
+
text: {
|
|
318
|
+
fontFamily: Platform.OS === "ios" ? "SF Pro Text" : "Roboto",
|
|
319
|
+
fontSize: 16,
|
|
320
|
+
},
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// Platform-specific components
|
|
324
|
+
import { Platform } from "react-native";
|
|
325
|
+
const StatusBarHeight = Platform.OS === "ios" ? 44 : 0;
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Quick Start Component
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
import React from 'react';
|
|
332
|
+
import {
|
|
333
|
+
View,
|
|
334
|
+
Text,
|
|
335
|
+
StyleSheet,
|
|
336
|
+
Pressable,
|
|
337
|
+
Image,
|
|
338
|
+
} from 'react-native';
|
|
339
|
+
import Animated, {
|
|
340
|
+
useSharedValue,
|
|
341
|
+
useAnimatedStyle,
|
|
342
|
+
withSpring,
|
|
343
|
+
} from 'react-native-reanimated';
|
|
344
|
+
|
|
345
|
+
interface ItemCardProps {
|
|
346
|
+
title: string;
|
|
347
|
+
subtitle: string;
|
|
348
|
+
imageUrl: string;
|
|
349
|
+
onPress: () => void;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
|
|
353
|
+
|
|
354
|
+
export function ItemCard({ title, subtitle, imageUrl, onPress }: ItemCardProps) {
|
|
355
|
+
const scale = useSharedValue(1);
|
|
356
|
+
|
|
357
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
358
|
+
transform: [{ scale: scale.value }],
|
|
359
|
+
}));
|
|
360
|
+
|
|
361
|
+
return (
|
|
362
|
+
<AnimatedPressable
|
|
363
|
+
style={[styles.card, animatedStyle]}
|
|
364
|
+
onPress={onPress}
|
|
365
|
+
onPressIn={() => { scale.value = withSpring(0.97); }}
|
|
366
|
+
onPressOut={() => { scale.value = withSpring(1); }}
|
|
367
|
+
>
|
|
368
|
+
<Image source={{ uri: imageUrl }} style={styles.image} />
|
|
369
|
+
<View style={styles.content}>
|
|
370
|
+
<Text style={styles.title} numberOfLines={1}>
|
|
371
|
+
{title}
|
|
372
|
+
</Text>
|
|
373
|
+
<Text style={styles.subtitle} numberOfLines={2}>
|
|
374
|
+
{subtitle}
|
|
375
|
+
</Text>
|
|
376
|
+
</View>
|
|
377
|
+
</AnimatedPressable>
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const styles = StyleSheet.create({
|
|
382
|
+
card: {
|
|
383
|
+
backgroundColor: '#ffffff',
|
|
384
|
+
borderRadius: 16,
|
|
385
|
+
overflow: 'hidden',
|
|
386
|
+
shadowColor: '#000',
|
|
387
|
+
shadowOffset: { width: 0, height: 2 },
|
|
388
|
+
shadowOpacity: 0.1,
|
|
389
|
+
shadowRadius: 8,
|
|
390
|
+
elevation: 4,
|
|
391
|
+
},
|
|
392
|
+
image: {
|
|
393
|
+
width: '100%',
|
|
394
|
+
height: 160,
|
|
395
|
+
backgroundColor: '#f3f4f6',
|
|
396
|
+
},
|
|
397
|
+
content: {
|
|
398
|
+
padding: 16,
|
|
399
|
+
gap: 4,
|
|
400
|
+
},
|
|
401
|
+
title: {
|
|
402
|
+
fontSize: 18,
|
|
403
|
+
fontWeight: '600',
|
|
404
|
+
color: '#1f2937',
|
|
405
|
+
},
|
|
406
|
+
subtitle: {
|
|
407
|
+
fontSize: 14,
|
|
408
|
+
color: '#6b7280',
|
|
409
|
+
lineHeight: 20,
|
|
410
|
+
},
|
|
411
|
+
});
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Best Practices
|
|
415
|
+
|
|
416
|
+
1. **Use TypeScript**: Define navigation and prop types for type safety
|
|
417
|
+
2. **Memoize Components**: Use `React.memo` and `useCallback` to prevent unnecessary rerenders
|
|
418
|
+
3. **Run Animations on UI Thread**: Use Reanimated worklets for 60fps animations
|
|
419
|
+
4. **Avoid Inline Styles**: Use StyleSheet.create for performance
|
|
420
|
+
5. **Handle Safe Areas**: Use `SafeAreaView` or `useSafeAreaInsets`
|
|
421
|
+
6. **Test on Real Devices**: Simulator/emulator performance differs from real devices
|
|
422
|
+
7. **Use FlatList for Lists**: Never use ScrollView with map for long lists
|
|
423
|
+
8. **Platform-Specific Code**: Use Platform.select for iOS/Android differences
|
|
424
|
+
|
|
425
|
+
## Common Issues
|
|
426
|
+
|
|
427
|
+
- **Gesture Conflicts**: Wrap gestures with `GestureDetector` and use `simultaneousHandlers`
|
|
428
|
+
- **Navigation Type Errors**: Define `ParamList` types for all navigators
|
|
429
|
+
- **Animation Jank**: Move animations to UI thread with `runOnUI` worklets
|
|
430
|
+
- **Memory Leaks**: Cancel animations and cleanup in useEffect
|
|
431
|
+
- **Font Loading**: Use `expo-font` or `react-native-asset` for custom fonts
|
|
432
|
+
- **Safe Area Issues**: Test on notched devices (iPhone, Android with cutouts)
|
|
433
|
+
|
|
434
|
+
## Resources
|
|
435
|
+
|
|
436
|
+
- [React Native Documentation](https://reactnative.dev/)
|
|
437
|
+
- [React Navigation](https://reactnavigation.org/)
|
|
438
|
+
- [Reanimated Documentation](https://docs.swmansion.com/react-native-reanimated/)
|
|
439
|
+
- [Gesture Handler](https://docs.swmansion.com/react-native-gesture-handler/)
|
|
440
|
+
- [Expo Documentation](https://docs.expo.dev/)
|