@0xsown/vibe-code-fe 1.0.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/bin/index.js +181 -0
- package/package.json +32 -0
- package/skills/claude-md-improver/SKILL.md +179 -0
- package/skills/claude-md-improver/references/quality-criteria.md +109 -0
- package/skills/claude-md-improver/references/templates.md +253 -0
- package/skills/claude-md-improver/references/update-guidelines.md +150 -0
- package/skills/find-skills/SKILL.md +133 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/next-best-practices/SKILL.md +153 -0
- package/skills/next-best-practices/async-patterns.md +87 -0
- package/skills/next-best-practices/bundling.md +180 -0
- package/skills/next-best-practices/data-patterns.md +297 -0
- package/skills/next-best-practices/debug-tricks.md +105 -0
- package/skills/next-best-practices/directives.md +73 -0
- package/skills/next-best-practices/error-handling.md +227 -0
- package/skills/next-best-practices/file-conventions.md +140 -0
- package/skills/next-best-practices/font.md +245 -0
- package/skills/next-best-practices/functions.md +108 -0
- package/skills/next-best-practices/hydration-error.md +91 -0
- package/skills/next-best-practices/image.md +173 -0
- package/skills/next-best-practices/metadata.md +301 -0
- package/skills/next-best-practices/parallel-routes.md +287 -0
- package/skills/next-best-practices/route-handlers.md +146 -0
- package/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/skills/next-best-practices/runtime-selection.md +39 -0
- package/skills/next-best-practices/scripts.md +141 -0
- package/skills/next-best-practices/self-hosting.md +371 -0
- package/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/skills/next-cache-components/SKILL.md +411 -0
- package/skills/shadcn-ui/README.md +248 -0
- package/skills/shadcn-ui/SKILL.md +326 -0
- package/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/skills/supabase-postgres-best-practices/AGENTS.md +68 -0
- package/skills/supabase-postgres-best-practices/CLAUDE.md +68 -0
- package/skills/supabase-postgres-best-practices/README.md +116 -0
- package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
- package/skills/tailwind-design-system/SKILL.md +874 -0
- package/skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/skills/vercel-composition-patterns/README.md +60 -0
- package/skills/vercel-composition-patterns/SKILL.md +89 -0
- package/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/skills/vercel-react-best-practices/README.md +123 -0
- package/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/skills/vercel-react-native-skills/AGENTS.md +2897 -0
- package/skills/vercel-react-native-skills/README.md +165 -0
- package/skills/vercel-react-native-skills/SKILL.md +121 -0
- package/skills/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
- package/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
- package/skills/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
- package/skills/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
- package/skills/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
- package/skills/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
- package/skills/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
- package/skills/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
- package/skills/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
- package/skills/vercel-react-native-skills/rules/list-performance-images.md +53 -0
- package/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
- package/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
- package/skills/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
- package/skills/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
- package/skills/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
- package/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
- package/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
- package/skills/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
- package/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
- package/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
- package/skills/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
- package/skills/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
- package/skills/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
- package/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
- package/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
- package/skills/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
- package/skills/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
- package/skills/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
- package/skills/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
- package/skills/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
- package/skills/vercel-react-native-skills/rules/ui-menus.md +174 -0
- package/skills/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
- package/skills/vercel-react-native-skills/rules/ui-pressable.md +61 -0
- package/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
- package/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
- package/skills/vercel-react-native-skills/rules/ui-styling.md +87 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/templates/AGENTS.md +31 -0
- package/templates/CLAUDE.md +31 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Native Modals Over JS-Based Bottom Sheets
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: native performance, gestures, accessibility
|
|
5
|
+
tags: modals, bottom-sheet, native, react-navigation
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Native Modals Over JS-Based Bottom Sheets
|
|
9
|
+
|
|
10
|
+
Use native `<Modal>` with `presentationStyle="formSheet"` or React Navigation
|
|
11
|
+
v7's native form sheet instead of JS-based bottom sheet libraries. Native modals
|
|
12
|
+
have built-in gestures, accessibility, and better performance. Rely on native UI
|
|
13
|
+
for low-level primitives.
|
|
14
|
+
|
|
15
|
+
**Incorrect (JS-based bottom sheet):**
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import BottomSheet from 'custom-js-bottom-sheet'
|
|
19
|
+
|
|
20
|
+
function MyScreen() {
|
|
21
|
+
const sheetRef = useRef<BottomSheet>(null)
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<View style={{ flex: 1 }}>
|
|
25
|
+
<Button onPress={() => sheetRef.current?.expand()} title='Open' />
|
|
26
|
+
<BottomSheet ref={sheetRef} snapPoints={['50%', '90%']}>
|
|
27
|
+
<View>
|
|
28
|
+
<Text>Sheet content</Text>
|
|
29
|
+
</View>
|
|
30
|
+
</BottomSheet>
|
|
31
|
+
</View>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Correct (native Modal with formSheet):**
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import { Modal, View, Text, Button } from 'react-native'
|
|
40
|
+
|
|
41
|
+
function MyScreen() {
|
|
42
|
+
const [visible, setVisible] = useState(false)
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<View style={{ flex: 1 }}>
|
|
46
|
+
<Button onPress={() => setVisible(true)} title='Open' />
|
|
47
|
+
<Modal
|
|
48
|
+
visible={visible}
|
|
49
|
+
presentationStyle='formSheet'
|
|
50
|
+
animationType='slide'
|
|
51
|
+
onRequestClose={() => setVisible(false)}
|
|
52
|
+
>
|
|
53
|
+
<View>
|
|
54
|
+
<Text>Sheet content</Text>
|
|
55
|
+
</View>
|
|
56
|
+
</Modal>
|
|
57
|
+
</View>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Correct (React Navigation v7 native form sheet):**
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
// In your navigator
|
|
66
|
+
<Stack.Screen
|
|
67
|
+
name='Details'
|
|
68
|
+
component={DetailsScreen}
|
|
69
|
+
options={{
|
|
70
|
+
presentation: 'formSheet',
|
|
71
|
+
sheetAllowedDetents: 'fitToContents',
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Native modals provide swipe-to-dismiss, proper keyboard avoidance, and
|
|
77
|
+
accessibility out of the box.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Pressable Instead of Touchable Components
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: modern API, more flexible
|
|
5
|
+
tags: ui, pressable, touchable, gestures
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Pressable Instead of Touchable Components
|
|
9
|
+
|
|
10
|
+
Never use `TouchableOpacity` or `TouchableHighlight`. Use `Pressable` from
|
|
11
|
+
`react-native` or `react-native-gesture-handler` instead.
|
|
12
|
+
|
|
13
|
+
**Incorrect (legacy Touchable components):**
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { TouchableOpacity } from 'react-native'
|
|
17
|
+
|
|
18
|
+
function MyButton({ onPress }: { onPress: () => void }) {
|
|
19
|
+
return (
|
|
20
|
+
<TouchableOpacity onPress={onPress} activeOpacity={0.7}>
|
|
21
|
+
<Text>Press me</Text>
|
|
22
|
+
</TouchableOpacity>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Correct (Pressable):**
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { Pressable } from 'react-native'
|
|
31
|
+
|
|
32
|
+
function MyButton({ onPress }: { onPress: () => void }) {
|
|
33
|
+
return (
|
|
34
|
+
<Pressable onPress={onPress}>
|
|
35
|
+
<Text>Press me</Text>
|
|
36
|
+
</Pressable>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Correct (Pressable from gesture handler for lists):**
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { Pressable } from 'react-native-gesture-handler'
|
|
45
|
+
|
|
46
|
+
function ListItem({ onPress }: { onPress: () => void }) {
|
|
47
|
+
return (
|
|
48
|
+
<Pressable onPress={onPress}>
|
|
49
|
+
<Text>Item</Text>
|
|
50
|
+
</Pressable>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Use `react-native-gesture-handler` Pressable inside scrollable lists for better
|
|
56
|
+
gesture coordination, as long as you are using the ScrollView from
|
|
57
|
+
`react-native-gesture-handler` as well.
|
|
58
|
+
|
|
59
|
+
**For animated press states (scale, opacity changes):** Use `GestureDetector`
|
|
60
|
+
with Reanimated shared values instead of Pressable's style callback. See the
|
|
61
|
+
`animation-gesture-detector-press` rule.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use contentInsetAdjustmentBehavior for Safe Areas
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: native safe area handling, no layout shifts
|
|
5
|
+
tags: safe-area, scrollview, layout
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use contentInsetAdjustmentBehavior for Safe Areas
|
|
9
|
+
|
|
10
|
+
Use `contentInsetAdjustmentBehavior="automatic"` on the root ScrollView instead of wrapping content in SafeAreaView or manual padding. This lets iOS handle safe area insets natively with proper scroll behavior.
|
|
11
|
+
|
|
12
|
+
**Incorrect (SafeAreaView wrapper):**
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
import { SafeAreaView, ScrollView, View, Text } from 'react-native'
|
|
16
|
+
|
|
17
|
+
function MyScreen() {
|
|
18
|
+
return (
|
|
19
|
+
<SafeAreaView style={{ flex: 1 }}>
|
|
20
|
+
<ScrollView>
|
|
21
|
+
<View>
|
|
22
|
+
<Text>Content</Text>
|
|
23
|
+
</View>
|
|
24
|
+
</ScrollView>
|
|
25
|
+
</SafeAreaView>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Incorrect (manual safe area padding):**
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import { ScrollView, View, Text } from 'react-native'
|
|
34
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
35
|
+
|
|
36
|
+
function MyScreen() {
|
|
37
|
+
const insets = useSafeAreaInsets()
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<ScrollView contentContainerStyle={{ paddingTop: insets.top }}>
|
|
41
|
+
<View>
|
|
42
|
+
<Text>Content</Text>
|
|
43
|
+
</View>
|
|
44
|
+
</ScrollView>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Correct (native content inset adjustment):**
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { ScrollView, View, Text } from 'react-native'
|
|
53
|
+
|
|
54
|
+
function MyScreen() {
|
|
55
|
+
return (
|
|
56
|
+
<ScrollView contentInsetAdjustmentBehavior='automatic'>
|
|
57
|
+
<View>
|
|
58
|
+
<Text>Content</Text>
|
|
59
|
+
</View>
|
|
60
|
+
</ScrollView>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The native approach handles dynamic safe areas (keyboard, toolbars) and allows content to scroll behind the status bar naturally.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use contentInset for Dynamic ScrollView Spacing
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: smoother updates, no layout recalculation
|
|
5
|
+
tags: scrollview, layout, contentInset, performance
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use contentInset for Dynamic ScrollView Spacing
|
|
9
|
+
|
|
10
|
+
When adding space to the top or bottom of a ScrollView that may change
|
|
11
|
+
(keyboard, toolbars, dynamic content), use `contentInset` instead of padding.
|
|
12
|
+
Changing `contentInset` doesn't trigger layout recalculation—it adjusts the
|
|
13
|
+
scroll area without re-rendering content.
|
|
14
|
+
|
|
15
|
+
**Incorrect (padding causes layout recalculation):**
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
function Feed({ bottomOffset }: { bottomOffset: number }) {
|
|
19
|
+
return (
|
|
20
|
+
<ScrollView contentContainerStyle={{ paddingBottom: bottomOffset }}>
|
|
21
|
+
{children}
|
|
22
|
+
</ScrollView>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
// Changing bottomOffset triggers full layout recalculation
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Correct (contentInset for dynamic spacing):**
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
function Feed({ bottomOffset }: { bottomOffset: number }) {
|
|
32
|
+
return (
|
|
33
|
+
<ScrollView
|
|
34
|
+
contentInset={{ bottom: bottomOffset }}
|
|
35
|
+
scrollIndicatorInsets={{ bottom: bottomOffset }}
|
|
36
|
+
>
|
|
37
|
+
{children}
|
|
38
|
+
</ScrollView>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
// Changing bottomOffset only adjusts scroll bounds
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Use `scrollIndicatorInsets` alongside `contentInset` to keep the scroll
|
|
45
|
+
indicator aligned. For static spacing that never changes, padding is fine.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Modern React Native Styling Patterns
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: consistent design, smoother borders, cleaner layouts
|
|
5
|
+
tags: styling, css, layout, shadows, gradients
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Modern React Native Styling Patterns
|
|
9
|
+
|
|
10
|
+
Follow these styling patterns for cleaner, more consistent React Native code.
|
|
11
|
+
|
|
12
|
+
**Always use `borderCurve: 'continuous'` with `borderRadius`:**
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
// Incorrect
|
|
16
|
+
{ borderRadius: 12 }
|
|
17
|
+
|
|
18
|
+
// Correct – smoother iOS-style corners
|
|
19
|
+
{ borderRadius: 12, borderCurve: 'continuous' }
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Use `gap` instead of margin for spacing between elements:**
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
// Incorrect – margin on children
|
|
26
|
+
<View>
|
|
27
|
+
<Text style={{ marginBottom: 8 }}>Title</Text>
|
|
28
|
+
<Text style={{ marginBottom: 8 }}>Subtitle</Text>
|
|
29
|
+
</View>
|
|
30
|
+
|
|
31
|
+
// Correct – gap on parent
|
|
32
|
+
<View style={{ gap: 8 }}>
|
|
33
|
+
<Text>Title</Text>
|
|
34
|
+
<Text>Subtitle</Text>
|
|
35
|
+
</View>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Use `padding` for space within, `gap` for space between:**
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<View style={{ padding: 16, gap: 12 }}>
|
|
42
|
+
<Text>First</Text>
|
|
43
|
+
<Text>Second</Text>
|
|
44
|
+
</View>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Use `experimental_backgroundImage` for linear gradients:**
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
// Incorrect – third-party gradient library
|
|
51
|
+
<LinearGradient colors={['#000', '#fff']} />
|
|
52
|
+
|
|
53
|
+
// Correct – native CSS gradient syntax
|
|
54
|
+
<View
|
|
55
|
+
style={{
|
|
56
|
+
experimental_backgroundImage: 'linear-gradient(to bottom, #000, #fff)',
|
|
57
|
+
}}
|
|
58
|
+
/>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Use CSS `boxShadow` string syntax for shadows:**
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
// Incorrect – legacy shadow objects or elevation
|
|
65
|
+
{ shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1 }
|
|
66
|
+
{ elevation: 4 }
|
|
67
|
+
|
|
68
|
+
// Correct – CSS box-shadow syntax
|
|
69
|
+
{ boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)' }
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Avoid multiple font sizes – use weight and color for emphasis:**
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
// Incorrect – varying font sizes for hierarchy
|
|
76
|
+
<Text style={{ fontSize: 18 }}>Title</Text>
|
|
77
|
+
<Text style={{ fontSize: 14 }}>Subtitle</Text>
|
|
78
|
+
<Text style={{ fontSize: 12 }}>Caption</Text>
|
|
79
|
+
|
|
80
|
+
// Correct – consistent size, vary weight and color
|
|
81
|
+
<Text style={{ fontWeight: '600' }}>Title</Text>
|
|
82
|
+
<Text style={{ color: '#666' }}>Subtitle</Text>
|
|
83
|
+
<Text style={{ color: '#999' }}>Caption</Text>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Limiting font sizes creates visual consistency. Use `fontWeight` (bold/semibold)
|
|
87
|
+
and grayscale colors for hierarchy instead.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-design-guidelines
|
|
3
|
+
description: Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
|
|
4
|
+
metadata:
|
|
5
|
+
author: vercel
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
argument-hint: <file-or-pattern>
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Web Interface Guidelines
|
|
11
|
+
|
|
12
|
+
Review files for compliance with Web Interface Guidelines.
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
1. Fetch the latest guidelines from the source URL below
|
|
17
|
+
2. Read the specified files (or prompt user for files/pattern)
|
|
18
|
+
3. Check against all rules in the fetched guidelines
|
|
19
|
+
4. Output findings in the terse `file:line` format
|
|
20
|
+
|
|
21
|
+
## Guidelines Source
|
|
22
|
+
|
|
23
|
+
Fetch fresh guidelines before each review:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
https://raw.githubusercontent.com/vercel-labs/web-interface-guidelines/main/command.md
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Use WebFetch to retrieve the latest rules. The fetched content contains all the rules and output format instructions.
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
When a user provides a file or pattern argument:
|
|
34
|
+
1. Fetch guidelines from the source URL above
|
|
35
|
+
2. Read the specified files
|
|
36
|
+
3. Apply all rules from the fetched guidelines
|
|
37
|
+
4. Output findings using the format specified in the guidelines
|
|
38
|
+
|
|
39
|
+
If no files specified, ask the user which files to review.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Project AI Guidelines
|
|
2
|
+
|
|
3
|
+
## Stack
|
|
4
|
+
- Framework: (e.g. Next.js / Vite / Remix)
|
|
5
|
+
- Language: TypeScript (strict mode)
|
|
6
|
+
- Styling: TailwindCSS
|
|
7
|
+
- State: (e.g. Zustand / Jotai / React Query)
|
|
8
|
+
- Package manager: (e.g. pnpm / bun / npm)
|
|
9
|
+
|
|
10
|
+
## Code Conventions
|
|
11
|
+
- Components go in `src/components/`, pages in `src/pages/` or `src/app/`
|
|
12
|
+
- Use named exports, not default exports for components
|
|
13
|
+
- Prefer composition over prop drilling
|
|
14
|
+
- Keep components small and focused — split when > ~150 lines
|
|
15
|
+
- No `any` in TypeScript
|
|
16
|
+
|
|
17
|
+
## AI Behavior
|
|
18
|
+
- Always read existing code before suggesting modifications
|
|
19
|
+
- Do not add comments unless logic is non-obvious
|
|
20
|
+
- Do not over-engineer — minimum complexity for the task
|
|
21
|
+
- Do not add error handling for impossible scenarios
|
|
22
|
+
- Prefer editing existing files over creating new ones
|
|
23
|
+
|
|
24
|
+
## File Structure
|
|
25
|
+
```
|
|
26
|
+
src/
|
|
27
|
+
components/ # Reusable UI components
|
|
28
|
+
hooks/ # Custom React hooks
|
|
29
|
+
lib/ # Utilities and helpers
|
|
30
|
+
types/ # Shared TypeScript types
|
|
31
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Project AI Guidelines
|
|
2
|
+
|
|
3
|
+
## Stack
|
|
4
|
+
- Framework: (e.g. Next.js / Vite / Remix)
|
|
5
|
+
- Language: TypeScript (strict mode)
|
|
6
|
+
- Styling: TailwindCSS
|
|
7
|
+
- State: (e.g. Zustand / Jotai / React Query)
|
|
8
|
+
- Package manager: (e.g. pnpm / bun / npm)
|
|
9
|
+
|
|
10
|
+
## Code Conventions
|
|
11
|
+
- Components go in `src/components/`, pages in `src/pages/` or `src/app/`
|
|
12
|
+
- Use named exports, not default exports for components
|
|
13
|
+
- Prefer composition over prop drilling
|
|
14
|
+
- Keep components small and focused — split when > ~150 lines
|
|
15
|
+
- No `any` in TypeScript
|
|
16
|
+
|
|
17
|
+
## AI Behavior
|
|
18
|
+
- Always read existing code before suggesting modifications
|
|
19
|
+
- Do not add comments unless logic is non-obvious
|
|
20
|
+
- Do not over-engineer — minimum complexity for the task
|
|
21
|
+
- Do not add error handling for impossible scenarios
|
|
22
|
+
- Prefer editing existing files over creating new ones
|
|
23
|
+
|
|
24
|
+
## File Structure
|
|
25
|
+
```
|
|
26
|
+
src/
|
|
27
|
+
components/ # Reusable UI components
|
|
28
|
+
hooks/ # Custom React hooks
|
|
29
|
+
lib/ # Utilities and helpers
|
|
30
|
+
types/ # Shared TypeScript types
|
|
31
|
+
```
|