Files
tsl-devkit/skills/thirdparty/ui-ux-pro-max/data/stacks/react-native.csv
T
csh 3d83740f88 Squashed 'docs/standards/playbook/' changes from c3f8137..25d895d
25d895d 🐛 fix(gitea_workflow): clean up temp repos after job steps
2bc3b11 🐛 fix(gitea_workflow): clean up temporary repo dirs in workflows
98c3f30 📝 docs(agent_rules): allow plan execution on current branch
16c7230 📝 docs(prompts): define custom verify layering
8efc4dd 🐛 fix(skills): quote commit-message description
bc8498f 🐛 fix(ci): install tomli for gitea tests
55cda3b 🐛 fix(tests): report missing toml parser clearly
c0729c7 🐛 fix(playbook): import Optional for cli compatibility
63e24bf 📦 deps(skills): sync thirdparty skills
d2f9356 🐛 fix(ci): isolate gitea workflow repos
588b81d 🐛 fix(ci): inline gitea workflow bootstrap
e0b1c3a ♻️ refactor(skills): standardize first-party skill contracts
2c5050d ♻️ refactor(skills): rename repo skills source dir
f049dfb 📦 deps(skills): drop duplicate first-party superpowers skills
234b335  feat(workflow): add superpowers planning and execution state tracking
c1702a6 📝 docs(markdown): format tracked markdown and drop stale templates
2325409 📝 docs(markdown): clarify optional markdownlint usage
214c44e 🔧 chore(markdown): add markdownlint baseline and lint fixes
a22b324 📝 docs(templates): add execution and memory-bank prompt templates
223a797 📝 docs(templates): update README for Claude Code and current features
4ac8672 📝 docs: simplify README + platform-agnostic tools + auto-create local rules
2431c9d 📝 docs: add claude_md config and use cross-platform paths
d64b248 📝 docs: fix README.md inaccuracies and add Claude Code info
c8d6bf2 🐛 fix(playbook): use relative paths in CLAUDE.md when not at project root
6518f0f  feat(playbook): auto-create CLAUDE.md with path discovery
6ec9a45  feat(skills): add skill_link symlink support + platform-agnostic prompt
9f8b6b5 📝 docs: update README and config example for Claude Code support
79cff6c 📝 docs(skills): add Claude Code platform support
452c6f5  feat(playbook): auto-inject AGENTS.md into CLAUDE.md
e1dbf3c 🐛 fix(skills): remove dual-path from commit-message skill
f3a7259 🔧 chore(ci): use prepare_repo.sh in both workflows
da08212 🔧 chore(ci): extract prepare_repo.sh and clean up workflows
7ade85e 🗑️ remove(tsl): drop syntax_book/, data/ source and build script
f94dba0 ♻️ refactor(skills): update playbook.py and tests for thirdparty/ layout
b3df412 ♻️ refactor(skills): separate thirdparty skills into thirdparty/ subdirectory
64950e7 📦 deps(skills): sync thirdparty skills
a2e3cb0  feat(playbook): add no_backup deploy controls
8609d59 🐛 fix(docs): repair reference catalog source links
956da11 🐛 fix(playbook): publish hidden ci test fixes
3f67754 📦 deps(skills): sync thirdparty skills
08ca87b 📦 deps(skills): add karpathy thirdparty sync
96b705b 📝 docs(tsl): rebuild canonical syntax and routing manual
3ed5052 📦 deps(skills): sync thirdparty skills
60108dd 📦 deps(skills): sync thirdparty skills
da85d4e 🐛 fix(thirdparty): prune nested project snapshots
a2a697e 📦 deps(skills): sync thirdparty skills
9df610a 🐛 fix(thirdparty): exclude duplicated superpowers skills
33dd5bb 🐛 fix(thirdparty): preserve optional manifest fields
91b0ea7 🐛 fix(thirdparty): preserve manifest during snapshot update
2e26f98 🔧 chore(thirdparty): generalize skills sync pipeline
5b9c1e3 📦 deps(skills): sync superpowers
2f2d34a 📝 docs(readme): normalize subtree command spacing
62db7db 🐛 fix(ci): serialize superpowers update and sync
3463223 🐛 fix(ci): use literal superpowers sync paths
48f6de8 📦 deps(skills): sync superpowers
4b23529 🔧 chore(ci): merge superpowers update and sync workflow
a56d75b 📦 deps(skills): sync superpowers
84bcefa 🔧 chore(ci): use ci[bot] commit author name
00a07e5 📦 deps(skills): sync superpowers
7b84daf 🐛 fix(templates): enforce main loop progress tracking
51373d7 🔧 chore(ci): automate superpowers sync workflow
eaaa39c 🐛 fix(ci): prevent stale superpowers sync from restoring skills block
79755c6 📦 deps(skills): sync superpowers
836d878 📦 deps(skills): sync superpowers
8216c9f 📦 deps(skills): sync superpowers
9439505 🐛 fix(playbook): address reported repo issues

git-subtree-dir: docs/standards/playbook
git-subtree-split: 25d895d8b3f56624ccfe99ad7289e9eb49e0f316
2026-05-24 13:04:14 +08:00

9.7 KiB

1NoCategoryGuidelineDescriptionDoDon'tCode GoodCode BadSeverityDocs URL
21ComponentsUse functional componentsHooks-based components are standardFunctional components with hooksClass componentsconst App = () => { }class App extends ComponentMediumhttps://reactnative.dev/docs/intro-react
32ComponentsKeep components smallSingle responsibility principleSplit into smaller componentsLarge monolithic components<Header /><Content /><Footer />500+ line componentMedium
43ComponentsUse TypeScriptType safety for props and stateTypeScript for new projectsJavaScript without typesconst Button: FC<Props> = () => { }const Button = (props) => { }Medium
54ComponentsColocate component filesKeep related files togetherComponent folder with stylesFlat structurecomponents/Button/index.tsx styles.tscomponents/Button.tsx styles/button.tsLow
65StylingUse StyleSheet.createOptimized style objectsStyleSheet for all stylesInline style objectsStyleSheet.create({ container: {} })style={{ margin: 10 }}Highhttps://reactnative.dev/docs/stylesheet
76StylingAvoid inline stylesPrevent object recreationStyles in StyleSheetInline style objects in renderstyle={styles.container}style={{ margin: 10, padding: 5 }}Medium
87StylingUse flexbox for layoutReact Native uses flexboxflexDirection alignItems justifyContentAbsolute positioning everywhereflexDirection: 'row'position: 'absolute' everywhereMediumhttps://reactnative.dev/docs/flexbox
98StylingHandle platform differencesPlatform-specific stylesPlatform.select or .ios/.android filesSame styles for both platformsPlatform.select({ ios: {}, android: {} })Hardcoded iOS valuesMediumhttps://reactnative.dev/docs/platform-specific-code
109StylingUse responsive dimensionsScale for different screensDimensions or useWindowDimensionsFixed pixel valuesuseWindowDimensions()width: 375Medium
1110NavigationUse React NavigationStandard navigation libraryReact Navigation for routingManual navigation managementcreateStackNavigator()Custom navigation stateMediumhttps://reactnavigation.org/
1211NavigationType navigation paramsType-safe navigationTyped navigation propsUntyped navigationnavigation.navigate<RootStackParamList>('Home', { id })navigation.navigate('Home', { id })Medium
1312NavigationUse deep linkingSupport URL-based navigationConfigure linking propNo deep link supportlinking: { prefixes: [] }No linking configurationMediumhttps://reactnavigation.org/docs/deep-linking/
1413NavigationHandle back buttonAndroid back button handlinguseFocusEffect with BackHandlerIgnore back buttonBackHandler.addEventListenerNo back handlerHigh
1514StateUse useState for local stateSimple component stateuseState for UI stateClass component stateconst [count, setCount] = useState(0)this.state = { count: 0 }Medium
1615StateUse useReducer for complex stateComplex state logicuseReducer for related stateMultiple useState for related valuesuseReducer(reducer initialState)5+ useState callsMedium
1716StateUse context sparinglyContext for global stateContext for theme auth localeContext for frequently changing dataThemeContext for app themeContext for list item dataMedium
1817StateConsider Zustand or ReduxExternal state managementZustand for simple Redux for complexuseState for global statecreate((set) => ({ }))Prop drilling global stateMedium
1918ListsUse FlatList for long listsVirtualized list renderingFlatList for 50+ itemsScrollView with map<FlatList data={items} /><ScrollView>{items.map()}</ScrollView>Highhttps://reactnative.dev/docs/flatlist
2019ListsProvide keyExtractorUnique keys for list itemskeyExtractor with stable IDIndex as keykeyExtractor={(item) => item.id}keyExtractor={(_, index) => index}High
2120ListsOptimize renderItemMemoize list item componentsReact.memo for list itemsInline render functionrenderItem={({ item }) => <MemoizedItem item={item} />}renderItem={({ item }) => <View>...</View>}High
2221ListsUse getItemLayout for fixed heightSkip measurement for performancegetItemLayout when height knownDynamic measurement for fixed itemsgetItemLayout={(_, index) => ({ length: 50, offset: 50 * index, index })}No getItemLayout for fixed heightMedium
2322ListsImplement windowSizeControl render windowSmaller windowSize for memoryDefault windowSize for large listswindowSize={5}windowSize={21} for huge listsMedium
2423PerformanceUse React.memoPrevent unnecessary re-rendersmemo for pure componentsNo memoizationexport default memo(MyComponent)export default MyComponentMedium
2524PerformanceUse useCallback for handlersStable function referencesuseCallback for propsNew function on every renderuseCallback(() => {}, [deps])() => handlePress()Medium
2625PerformanceUse useMemo for expensive opsCache expensive calculationsuseMemo for heavy computationsRecalculate every renderuseMemo(() => expensive(), [deps])const result = expensive()Medium
2726PerformanceAvoid anonymous functions in JSXPrevent re-rendersNamed handlers or useCallbackInline arrow functionsonPress={handlePress}onPress={() => doSomething()}Medium
2827PerformanceUse Hermes engineImproved startup and memoryEnable Hermes in buildJavaScriptCore for new projectshermes_enabled: truehermes_enabled: falseMediumhttps://reactnative.dev/docs/hermes
2928ImagesUse expo-imageModern performant image component for React NativeUse expo-image for caching, blurring, and performanceUse default Image for heavy lists or unmaintained libraries<Image source={url} cachePolicy='memory-disk' /> (expo-image)<FastImage source={url} />Mediumhttps://docs.expo.dev/versions/latest/sdk/image/
3029ImagesSpecify image dimensionsPrevent layout shiftswidth and height for remote imagesNo dimensions for network images<Image style={{ width: 100 height: 100 }} /><Image source={{ uri }} /> no sizeHigh
3130ImagesUse resizeModeControl image scalingresizeMode cover containStretch imagesresizeMode="cover"No resizeModeLow
3231FormsUse controlled inputsState-controlled form fieldsvalue + onChangeTextUncontrolled inputs<TextInput value={text} onChangeText={setText} /><TextInput defaultValue={text} />Medium
3332FormsHandle keyboardManage keyboard visibilityKeyboardAvoidingViewContent hidden by keyboard<KeyboardAvoidingView behavior="padding">No keyboard handlingHighhttps://reactnative.dev/docs/keyboardavoidingview
3433FormsUse proper keyboard typesAppropriate keyboard for inputkeyboardType for input typeDefault keyboard for allkeyboardType="email-address"keyboardType="default" for emailLow
3534TouchUse PressableModern touch handlingPressable for touch interactionsTouchableOpacity for new code<Pressable onPress={} /><TouchableOpacity onPress={} />Lowhttps://reactnative.dev/docs/pressable
3635TouchProvide touch feedbackVisual feedback on pressRipple or opacity changeNo feedback on pressandroid_ripple={{ color: 'gray' }}No press feedbackMedium
3736TouchSet hitSlop for small targetsIncrease touch areahitSlop for icons and small buttonsTiny touch targetshitSlop={{ top: 10 bottom: 10 }}44x44 with no hitSlopMedium
3837AnimationUse ReanimatedHigh-performance animationsreact-native-reanimatedAnimated API for complexuseSharedValue useAnimatedStyleAnimated.timing for gestureMediumhttps://docs.swmansion.com/react-native-reanimated/
3938AnimationRun on UI threadworklets for smooth animationRun animations on UI threadJS thread animationsrunOnUI(() => {})Animated on JS threadHigh
4039AnimationUse gesture handlerNative gesture recognitionreact-native-gesture-handlerJS-based gesture handling<GestureDetector><View onTouchMove={} />Mediumhttps://docs.swmansion.com/react-native-gesture-handler/
4140AsyncHandle loading statesShow loading indicatorsActivityIndicator during loadEmpty screen during load{isLoading ? <ActivityIndicator /> : <Content />}No loading stateMedium
4241AsyncHandle errors gracefullyError boundaries and fallbacksError UI for failed requestsCrash on error{error ? <ErrorView /> : <Content />}No error handlingHigh
4342AsyncCancel async operationsCleanup on unmountAbortController or cleanupMemory leaks from asyncuseEffect cleanupNo cleanup for subscriptionsHigh
4443AccessibilityAdd accessibility labelsDescribe UI elementsaccessibilityLabel for all interactiveMissing labelsaccessibilityLabel="Submit form"<Pressable> without labelHighhttps://reactnative.dev/docs/accessibility
4544AccessibilityUse accessibility rolesSemantic meaningaccessibilityRole for elementsWrong rolesaccessibilityRole="button"No role for buttonMedium
4645AccessibilitySupport screen readersTest with TalkBack/VoiceOverTest with screen readersSkip accessibility testingRegular TalkBack testingNo screen reader testingHigh
4746TestingUse React Native Testing LibraryComponent testingrender and fireEventEnzyme or manual testingrender(<Component />)shallow(<Component />)Mediumhttps://callstack.github.io/react-native-testing-library/
4847TestingTest on real devicesReal device behaviorTest on iOS and Android devicesSimulator onlyDevice testing in CISimulator only testingHigh
4948TestingUse Detox for E2EEnd-to-end testingDetox for critical flowsManual E2E testingdetox testManual testing onlyMediumhttps://wix.github.io/Detox/
5049NativeUse native modules carefullyBridge has overheadBatch native callsFrequent bridge crossingBatch updatesCall native on every keystrokeHigh
5150NativeUse Expo when possibleSimplified developmentExpo for standard featuresBare RN for simple appsexpo install packagereact-native link packageLowhttps://docs.expo.dev/
5251NativeHandle permissionsRequest permissions properlyCheck and request permissionsAssume permissions grantedPermissionsAndroid.request()Access without permission checkHighhttps://reactnative.dev/docs/permissionsandroid