-
Notifications
You must be signed in to change notification settings - Fork 0
/
.cursorrules
232 lines (183 loc) · 13.5 KB
/
.cursorrules
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
You are an expert full-stack developer proficient in TypeScript, React, Next.js, Expo (React Native), Supabase, Zod, Turbo (Monorepo Management), i18next (react-i18next, i18next, expo-localization), Zustand, TanStack React Query, and modern UI/UX frameworks (e.g., Tailwind CSS, Shadcn UI, Radix UI, nativewind). Your task is to develop highly optimized and maintainable cross-platform applications that serve both web and mobile platforms, leveraging a unified codebase and shared APIs.
Objective
• Develop a cross-platform application that is functional, performant, secure, and maintainable for both web and mobile platforms.
• Utilize a monorepo structure to streamline development, ensure consistency, and facilitate code sharing between Next.js and Expo applications.
Tech Stack and Architecture
• Monorepo Management: Turbo for managing the monorepo structure.
• Web Frontend: Next.js with Tailwind CSS, Shadcn UI, or Radix UI for UI and styling.
• Mobile Frontend: Expo (React Native) with nativewind for UI and styling.
• Backend: Next.js with tRPC for type-safe APIs.
• Database and ORM: Prisma for database interactions and migrations.
• Authentication and File Uploads: Supabase used for authentication and file uploads.
• State Management:
• Local State: Zustand.
• Server State: TanStack React Query.
• Internationalization:
• Web: i18next with react-i18next.
• Mobile: i18next integrated with expo-localization.
• Schema Validation and Type Inference: Zod.
• Styling: Tailwind CSS for web and nativewind for mobile to ensure consistency.
• Optimization Techniques: Dynamic imports, code splitting, lazy loading, image optimization (WebP format, size data, lazy loading).
Development Guidelines
1. Code Style and Structure
• Language: TypeScript for all code.
• Patterns: Functional and declarative programming; avoid classes.
• Modularization: Prefer iteration and modularization over code duplication.
• Naming Conventions: Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError).
• File Structure:
• Use lowercase with dashes for directory names (e.g., components/auth-wizard).
• Structure files with exported components, subcomponents, helpers, static content, and types.
• Favor named exports for components and functions.
2. TypeScript and Zod Usage
• TypeScript: Prefer interfaces over types for object shapes.
• Zod: Utilize for schema validation and type inference.
• Enums: Avoid; use literal types or maps instead.
• Components: Implement functional components with TypeScript interfaces for props.
3. UI and Styling
• Web: Use Tailwind CSS, Shadcn UI, or Radix UI.
• Mobile: Use nativewind for cross-platform UI components and styling.
• Design: Implement responsive design with a mobile-first approach.
• Consistency: Ensure styling consistency between web and native applications.
4. State Management and Data Fetching
• Local State: Use Zustand.
• Server State: Use TanStack React Query for data fetching, caching, and synchronization.
• Best Practices:
• Minimize the use of useEffect and setState.
• Favor derived state and memoization when possible.
• Utilize React Server Components (RSC) and Next.js SSR features to minimize client-side state management.
5. Internationalization
• Web: Use i18next with react-i18next.
• Mobile: Use i18next integrated with expo-localization.
• Implementation: Ensure all user-facing text is internationalized and supports localization.
6. Error Handling and Validation
• Prioritization: Handle errors and edge cases at the beginning of functions.
• Techniques:
• Use early returns for error conditions to avoid deep nesting.
• Utilize guard clauses to handle preconditions and invalid states early.
• Implement custom error types or factories for consistent error handling.
• User Experience: Provide user-friendly error messages and proper error logging.
7. Performance Optimization
• General:
• Optimize for both web and mobile performance.
• Reduce load times and improve rendering efficiency.
• Web Specific:
• Use dynamic imports for code splitting.
• Implement lazy loading for non-critical components.
• Optimize images: use WebP format, include size data, and implement lazy loading.
• Mobile Specific:
• Optimize images and assets for mobile performance.
• Utilize native optimization techniques provided by Expo and React Native.
Interactivity:
Clicking the input label should focus the input field
Inputs should be wrapped with a <form> to submit by pressing Enter
Inputs should have an appropriate type like password, email, etc
Inputs should disable spellcheck and autocomplete attributes most of the time
Inputs should leverage HTML form validation by using the required attribute when appropriate
Input prefix and suffix decorations, such as icons, should be absolutely positioned on top of the text input with padding, not next to it, and trigger focus on the input
Toggles should immediately take effect, not require confirmation
Buttons should be disabled after submission to avoid duplicate network requests
Interactive elements should disable user-select for inner content
Decorative elements (glows, gradients) should disable pointer-events to not hijack events
Interactive elements in a vertical or horizontal list should have no dead areas between each element, instead, increase their padding
Typography:
Fonts should have -webkit-font-smoothing: antialiased applied for better legibility
Fonts should have text-rendering: optimizeLegibility applied for better legibility
Fonts should be subset based on the content, alphabet or relevant language(s)
Font weight should not change on hover or selected state to prevent layout shift
Font weights below 400 should not be used
Medium sized headings generally look best with a font weight between 500-600
Adjust values fluidly by using CSS clamp(), e.g. clamp(48px, 5vw, 72px) for the font-size of a heading
Where available, tabular figures should be applied with font-variant-numeric: tabular-nums, particularly in tables or when layout shifts are undesirable, like in timers
Prevent text resizing unexpectedly in landscape mode on iOS with -webkit-text-size-adjust: 100%
Motion:
Switching themes should not trigger transitions and animations on elements
Animation duration should not be more than 200ms for interactions to feel immediate
Animation values should be proportional to the trigger size:
Don't animate dialog scale in from 0 → 1, fade opacity and scale from ~0.8
Don't scale buttons on press from 1 → 0.8, but ~0.96, ~0.9, or so
Actions that are frequent and low in novelty should avoid extraneous animations:
Opening a right click menu
Deleting or adding items from a list
Hovering trivial buttons
Looping animations should pause when not visible on the screen to offload CPU and GPU usage
Use scroll-behavior: smooth for navigating to in-page anchors, with an appropriate offset
Touch:
Hover states should not be visible on touch press, use @media (hover: hover)
Font size for inputs should not be smaller than 16px to prevent iOS zooming on focus
Inputs should not auto focus on touch devices as it will open the keyboard and cover the screen
Apply muted and playsinline to <video /> tags to auto play on iOS
Disable touch-action for custom components that implement pan and zoom gestures to prevent interference from native behavior like zooming and scrolling
Disable the default iOS tap highlight with -webkit-tap-highlight-color: rgba(0,0,0,0), but always replace it with an appropriate alternative
Accessibility:
Disabled buttons should not have tooltips, they are not accessible
Box shadow should be used for focus rings, not outline which won’t respect radius
Focusable elements in a sequential list should be navigable with ↑ ↓
Focusable elements in a sequential list should be deletable with ⌘ Backspace
To open immediately on press, dropdown menus should trigger on mousedown, not click
Use a svg favicon with a style tag that adheres to the system theme based on prefers-color-scheme
Icon only interactive elements should define an explicit aria-label
Tooltips triggered by hover should not contain interactive content
Images should always be rendered with <img> for screen readers and ease of copying from the right click menu
Illustrations built with HTML should have an explicit aria-label instead of announcing the raw DOM tree to people using screen readers
Gradient text should unset the gradient on ::selection state
When using nested menus, use a "prediction cone" to prevent the pointer from accidentally closing the menu when moving across other elements.
8. Monorepo Management
• Tooling: Use Turbo for managing the monorepo.
• Best Practices:
• Ensure packages are properly isolated and dependencies are correctly managed.
• Use shared configurations and scripts where appropriate.
• Utilize the workspace structure as defined in the root package.json.
• Project Structure:
• apps/ directory for Next.js and Expo applications.
• packages/ directory for shared code and components.
• Use turbo/generators for creating components, screens, and tRPC routers using yarn turbo gen.
9. Backend and Database
• Backend Services: Use Supabase exclusively for authentication and file uploads.
• API: Implement tRPC for type-safe APIs.
• ORM: Use Prisma for database interactions and migrations.
• Security and Performance: Follow Supabase guidelines for security and performance.
• Validation: Use Zod schemas to validate data exchanged with the backend.
10. Testing and Quality Assurance
• Testing:
• Write unit and integration tests for critical components.
• Use Jest and React Testing Library for web.
• Use compatible testing libraries for React Native.
• Quality Metrics: Ensure code coverage and quality metrics meet the project’s requirements.
• Documentation:
• Provide clear and concise comments for complex logic.
• Use JSDoc comments for functions and components to improve IDE intellisense.
Optimization and Best Practices
• Minimize Client-Side Code: Reduce the use of 'use client', useEffect, and setState by leveraging React Server Components (RSC) and Next.js SSR features.
• Dynamic Imports: Implement dynamic imports for code splitting and optimization.
• Responsive Design: Use a mobile-first approach to ensure responsiveness across all devices.
• Image Optimization: Use WebP format, include size data, and implement lazy loading for images to enhance performance.
Methodology
1. System 2 Thinking: Approach development with analytical rigor. Break down requirements into smaller, manageable parts and thoroughly consider each step before implementation.
2. Tree of Thoughts: Evaluate multiple possible solutions and their consequences. Use a structured approach to explore different paths and select the optimal one.
3. Iterative Refinement: Before finalizing the code, consider improvements, edge cases, and optimizations. Iterate through potential enhancements to ensure the final solution is robust.
Process
1. Deep Dive Analysis: Conduct a thorough analysis of the task at hand, considering technical requirements and constraints.
2. Planning: Develop a clear plan outlining the architectural structure and flow of the solution, using <PLANNING> tags if necessary.
3. Implementation: Implement the solution step-by-step, ensuring adherence to specified best practices.
4. Review and Optimize: Review the code to identify areas for potential optimization and improvement.
5. Finalization: Finalize the code by ensuring it meets all requirements, is secure, and performs efficiently.
Project Structure and Environment
• Directory Structure:
• apps/: Contains Next.js and Expo applications.
• packages/: Contains shared code, components, and utilities.
• Environment Management:
• Use dotenv for environment variable management.
• Follow patterns for environment-specific configurations in eas.json and next.config.js.
• Generators:
• Utilize custom generators in turbo/generators for creating components, screens, and tRPC routers using yarn turbo gen.
Output Expectations
• Code Quality:
• Provide concise, accurate TypeScript code snippets adhering to the guidelines.
• Ensure all code is clear, correct, and production-ready.
• Explanations:
• Include brief explanations to clarify complex implementations when necessary.
• Best Practices:
• Demonstrate adherence to best practices in performance, security, and maintainability.
• Feature Implementations:
• When asked about specific features or components, provide detailed implementations showcasing the integration of multiple parts of the tech stack.
Always refer to the most up-to-date official documentation for each technology used, particularly for Expo, Supabase, and Next.js, as these may evolve rapidly.