ui-ux-pro-max-skill/cli/assets/data/app-interface.csv
Viet Tran a38d04c3d5
feat(search): overhaul relevance and curated design data
Overhaul BM25 relevance, reasoning and data-quality contracts; refresh UI styles and framework guidance; add resilient text, chip, badge and micro-interaction guidance; strengthen release, provenance and catalog refresh gates; update bilingual documentation.
2026-08-14 00:08:23 +07:00

11 KiB
Raw Blame History

1NoCategoryIssueKeywordsPlatformDescriptionDoDon'tCode Example GoodCode Example BadSeverity
21AccessibilityIcon Button Labelsicon button accessibilityLabeliOS/Android/React NativeIcon-only buttons must expose an accessible labelSet accessibilityLabel or label prop on icon buttonsIcon buttons without accessible names<Pressable accessibilityLabel="Close"><XIcon /></Pressable><Pressable><XIcon /></Pressable>Critical
32AccessibilityForm Control Labelsform input label accessibilityLabeliOS/Android/React NativeAll inputs must have a visible label and an accessibility labelPair Text label with input and set accessibilityLabelInputs with placeholder only<View><Text>Email</Text><TextInput accessibilityLabel="Email address" /></View><TextInput placeholder="Email" /></View>Critical
43AccessibilityRole & TraitsaccessibilityRole accessibilityTraitsiOS/Android/React NativeInteractive elements must expose correct roles/traitsUse accessibilityRole/button/link/checkbox etc.Rely on generic views with no roles<Pressable accessibilityRole="button">Submit</Pressable><View onTouchStart={submit}>Submit</View>High
54AccessibilityDynamic UpdatesaccessibilityLiveRegion announceiOS/Android/React NativeAsync status updates should be announced to screen readersUse accessibilityLiveRegion or announceForAccessibilityUpdate text silently with no announcement<Text accessibilityLiveRegion="polite">{status}</Text><Text>{status}</Text>Medium
65AccessibilityDecorative Iconsaccessible={false} importantForAccessibilityiOS/Android/React NativeDecorative icons should be hidden from screen readersMark decorative icons as not accessibleHave screen reader read every icon<Icon accessible={false} importantForAccessibility="no" /><Icon />Medium
76TouchTouch Target Sizetouch target size platform runtime arbitration iOS 44pt Android 48dp web 24 CSS px React Native hitSlopiOS/Android/React NativeNative targets use 44pt on iOS and 48dp on Android; web WCAG 2.2 has a separate 24 by 24 CSS px minimum with exceptionsSelect 44pt for iOS and 48dp for Android at runtime; evaluate web targets separately against WCAG 2.5.8 and its exceptionsCollapse iOS 44pt, Android 48dp, and web 24 CSS px into one cross-platform numberPlatform.select({ ios: 44, android: 48 }); // web: evaluate 24 CSS px + WCAG exceptions<Pressable><Icon size={16} /></Pressable>Critical
87TouchTouch Spacingtouch spacing gap 8pxiOS/Android/React NativeAdjacent touch targets need enough spacingKeep at least 8dp spacing between touchablesCluster many buttons with no gap<View style={{ gap: 8 }}><Button ... /><Button ... /></View><View><Button ... /><Button ... /></View>Medium
98TouchGesture Conflictsscroll swipe back gestureiOS/Android/React NativeCustom gestures must not break system scroll/backReserve horizontal swipes for carouselsFull-screen custom swipe conflicting with backHorizontalPager inside vertical ScrollViewPanResponder on full screen blocking backHigh
109NavigationBack Behaviorback handler navigation stackiOS/Android/React NativeBack navigation should be predictable and preserve stateUse navigation.goBack and keep screen stateReset stack or exit app unexpectedlyonPress={() => navigation.goBack()}BackHandler.exitApp() on first pressCritical
1110NavigationBottom Tabstab bar max itemsiOS/Android/React NativeBottom tab bar should have at most 5 primary itemsUse 35 tabs and move extras to More/SettingsOverloaded tab bar with many iconsHome/Explore/Profile/SettingsHome/Explore/Shop/Cart/Profile/Settings/MoreMedium
1211NavigationModal Escapemodal dismiss close affordanceiOS/Android/React NativeModals/sheets must have clear close actionsProvide close button and swipe-down where platform expectsTrapping users in modal with no obvious exit<Modal><Button title="Close" onPress={onClose} /></Modal><Modal><View>{children}</View></Modal>High
1312StatePreserve Screen Statenavigation preserve stateiOS/Android/React NativeReturning to a screen should restore its scroll and form stateKeep components mounted or persist stateReset list scroll and form inputs on every visit<Tab.Navigator screenOptions={{ unmountOnBlur: false }}><Tab.Screen options={{ unmountOnBlur: true }} />Medium
1413FeedbackLoading Indicatorsactivity indicator skeletoniOS/Android/React NativeShow visible feedback during network operationsUse ActivityIndicator or skeleton for >300ms operationsLeave button and screen frozen{loading ? <ActivityIndicator /> : <Button title="Save" />} "<Button title=""Save"" onPress={submit} /> // no loading"High
1514FeedbackSuccess Feedbacktoast checkmark banneriOS/Android/React NativeConfirm successful actions with brief feedbackShow toast/checkmark or bannerComplete actions silently with no confirmationshowToast('Saved successfully')// silently update state onlyMedium
1615FeedbackError Feedbackinline error banneriOS/Android/React NativeShow clear error messages near the probleminput-level error + summary bannerOnly change border color with no explanation<TextInput ... /><Text style={{color:'red'}}>{error}</Text><TextInput style={{borderColor:'red'}} />High
1716FormsInline ValidationonBlur validationiOS/Android/React NativeValidate inputs on blur or submit with clear messagingValidate onBlur and onSubmitValidate on every keystroke causing jankonBlur={() => validateEmail(value)}onChangeText={v => validateEmail(v)} // every charMedium
1817FormsKeyboard TypekeyboardType returnKeyTypeiOS/Android/React NativeUse appropriate keyboardType and returnKeyTypeMatch email/tel/number/search typesUse default keyboard for all inputs<TextInput keyboardType="email-address" /><TextInput keyboardType="default" />Medium
1918FormsAuto Focus & NextautoFocus blurOnSubmit onSubmitEditingiOS/Android/React NativeGuide users through form fields with Next/Done flowsUse onSubmitEditing to focus next inputForce users to tap each field manuallyonSubmitEditing={() => nextRef.current?.focus()}// no onSubmitEditing, manual tap onlyLow
2019FormsPassword VisibilitysecureTextEntry toggleiOS/Android/React NativeAllow toggling password visibility securelyProvide Show/Hide icon toggling secureTextEntryForce users to type blind with no option<TextInput secureTextEntry={secure} /><Icon onPress={toggle} /><TextInput secureTextEntry /> // no toggleMedium
2120PerformanceVirtualize Long ListsFlatList SectionList virtualizationiOS/Android/React NativeUse FlatList/SectionList for lists over ~50 itemsUse keyExtractor and initialNumToRender appropriatelyRender hundreds of items with ScrollView<FlatList data={items} renderItem={...} /><ScrollView>{items.map(renderItem)}</ScrollView>High
2221PerformanceImage Size & CacheImage resize cacheiOS/Android/React NativeUse correctly sized and cached imagesUse Image component with proper resizeMode and cachingLoad full-resolution images everywhere<Image source={{uri}} resizeMode="cover" /><Image source={require('4k.png')} /> // small avatarMedium
2322PerformanceDebounce High-Freq Eventsdebounce scroll searchiOS/Android/React NativeDebounce scroll/search callbacks to avoid jankWrap handlers with debounce/throttleRun heavy logic on every eventonScroll={debouncedHandleScroll}onScroll={handleScrollHeavy}Medium
2423AnimationDuration & Easinganimation duration easingiOS/Android/React NativeMicro-interactions should be 150300ms with native-like easingUse ease-out for enter/ease-in for exitUse long or linear animations for core UIAnimated.timing(..., { duration: 200, easing: Easing.out(Easing.quad) })Animated.timing(..., { duration: 800, easing: Easing.linear })Medium
2524AnimationRespect Reduced Motionreduced motion accessibilityiOS/Android/React NativeRespect OS reduced-motion accessibility settingCheck reduceMotionEnabled and simplify animationsIgnore user motion preferencesif (reduceMotionEnabled) skipAnimation()Always run complex parallax animationsCritical
2625AnimationLimited Continuous Motionloop animation loaderiOS/Android/React NativeReserve infinite animations for loaders and live dataUse looping only where necessaryKeep decorative elements looping foreverAnimated.loop(loaderAnim) for ActivityIndicatorAnimated.loop(bounceAnim) on background iconsMedium
2726TypographyBase Font SizefontScale dynamic typeiOS/Android/React NativeBody text must be readable and support Dynamic TypeUse platform fontScale and at least 1416pt baseRender critical text below 12pt<Text style={{ fontSize: 16 }}>Body</Text><Text style={{ fontSize: 10 }}>Body</Text>High
2827TypographyDynamic Type SupportallowFontScaling adjustsFontSizeToFitiOS/Android/React NativeSupport system text scaling without breaking layoutSet allowFontScaling and test large textDisable scaling on all text globally<Text allowFontScaling>{label}</Text><Text allowFontScaling={false}>{label}</Text>High
2928Safe AreasSafe Area Insetssafe area insets notch gestureiOS/Android/React NativeContent must not overlap notches/gesture barsWrap screens in SafeAreaView or apply insetsPlace tappable content under system bars<SafeAreaView style={{ flex: 1 }}><Screen /></SafeAreaView><View style={{ flex: 1 }}><Screen /></View>High
3029ThemingLight/Dark Contrastdark mode contrast tokensiOS/Android/React NativeEnsure sufficient contrast in both light and dark themesUse semantic tokens and test both themesReuse light-theme grays directly in dark modecolors.textPrimaryDark = '#F9FAFB'colors.textPrimaryDark = '#9CA3AF' on '#111827'High
3130Anti-PatternNo Gesture-Only Actionsgesture only hidden controlsiOS/Android/React NativeDon't rely solely on hidden gestures for core actionsProvide visible buttons in addition to gesturesRely on swipe/shake only with no UI affordanceSwipe to delete + visible Delete buttonOnly shake device to undo with no UICritical
3231AccessibilityDragging Alternativesaccessible drag interaction drag single pointer alternative keyboard drag alternative reorder resize move buttons React Native native runtime platform router arbitration iOS Android webiOS/Android/React NativeReact Native drag and reorder operations need a non-drag path selected for the active native runtimeProvide named Move up/down buttons or a position menu beside drag handles; route iOS and Android behavior through the runtime platform adapterMake drag, swipe, or a web-only pointer handler the only way to reorder native content<Button title="Move up" onPress={() => moveItem(index, index - 1)} /><DragHandle /> onlyHigh
3332FormsAuthentication Reusepassword manager passkey paste redundant entryiOS/Android/React NativeAuthentication and multi-step flows should reuse prior valuesSupport password managers passkeys paste and prefilled confirmed valuesForce users to retype credentials or the same data in one flowtextContentType="password" autoComplete="current-password"onPaste disabledCritical