Files
ONE-OS/axhub-make/skills/ui-ux-pro-max/data/web-interface.csv
王冕 a27e3b8e43 feat: sync full workspace including web modules, docs, and configurations to Gitea
Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 18:12:25 +08:00

7.3 KiB

1NoCategoryIssueKeywordsPlatformDescriptionDoDon'tCode Example GoodCode Example BadSeverity
21AccessibilityIcon Button Labelsicon button aria-labelWebIcon-only buttons must have accessible namesAdd aria-label to icon buttonsIcon button without label<button aria-label='Close'><XIcon /></button><button><XIcon /></button>Critical
32AccessibilityForm Control Labelsform input label ariaWebAll form controls need labels or aria-labelUse label element or aria-labelInput without accessible name<label for='email'>Email</label><input id='email' /><input placeholder='Email' />Critical
43AccessibilityKeyboard Handlerskeyboard onclick onkeydownWebInteractive elements must support keyboard interactionAdd onKeyDown alongside onClickClick-only interaction<div onClick={fn} onKeyDown={fn} tabIndex={0}><div onClick={fn}>High
54AccessibilitySemantic HTMLsemantic button a labelWebUse semantic HTML before ARIA attributesUse button/a/label elementsDiv with role attribute<button onClick={fn}>Submit</button><div role='button' onClick={fn}>Submit</div>High
65AccessibilityAria Livearia-live polite asyncWebAsync updates need aria-live for screen readersAdd aria-live='polite' for dynamic contentSilent async updates<div aria-live='polite'>{status}</div><div>{status}</div> // no announcementMedium
76AccessibilityDecorative Iconsaria-hidden decorative iconWebDecorative icons should be hidden from screen readersAdd aria-hidden='true' to decorative iconsDecorative icon announced<Icon aria-hidden='true' /><Icon /> // announced as 'image'Medium
87FocusVisible Focus Statesfocus-visible outline ringWebAll interactive elements need visible focus statesUse :focus-visible with ring/outlineNo focus indicationfocus-visible:ring-2 focus-visible:ring-blue-500outline-none // no replacementCritical
98FocusNever Remove Outlineoutline-none focus replacementWebNever remove outline without providing replacementReplace outline with visible alternativeRemove outline completelyfocus:outline-none focus:ring-2focus:outline-none // nothing elseCritical
109FocusCheckbox Radio Hit Targetcheckbox radio label targetWebCheckbox/radio must share hit target with labelWrap input and label togetherSeparate tiny checkbox<label class='flex gap-2'><input type='checkbox' /><span>Option</span></label><input type='checkbox' id='x' /><label for='x'>Option</label>Medium
1110FormsAutocomplete Attributeautocomplete input formWebInputs need autocomplete attribute for autofillAdd appropriate autocomplete valueMissing autocomplete<input autocomplete='email' type='email' /><input type='email' />High
1211FormsSemantic Input Typesinput type email tel urlWebUse semantic input type attributesUse email/tel/url/number typestext type for everything<input type='email' /><input type='text' /> // for emailMedium
1312FormsNever Block Pastepaste onpaste passwordWebNever prevent paste functionalityAllow paste on all inputsBlock paste on password/code<input type='password' /><input onPaste={e => e.preventDefault()} />High
1413FormsSpellcheck Disablespellcheck email codeWebDisable spellcheck on emails and codesSet spellcheck='false' on codesSpellcheck on technical input<input spellCheck='false' type='email' /><input type='email' /> // red squigglesLow
1514FormsSubmit Button Enabledsubmit button disabled loadingWebKeep submit enabled and show spinner during requestsShow loading spinner keep enabledDisable button during submit<button>{loading ? <Spinner /> : 'Submit'}</button><button disabled={loading}>Submit</button>Medium
1615FormsInline Errorserror message inline focusWebShow error messages inline near the problem fieldInline error with focus on first errorSingle error at top<input /><span class='text-red-500'>{error}</span><div class='error'>{allErrors}</div> // at topHigh
1716PerformanceVirtualize Listsvirtualize list 50 itemsWebVirtualize lists exceeding 50 itemsUse virtual list for large datasetsRender all items<VirtualList items={items} />items.map(item => <Item />)High
1817PerformanceAvoid Layout Readslayout read render getboundingclientrectWebAvoid layout reads during render phaseRead layout in effects or callbacksgetBoundingClientRect in renderuseEffect(() => { el.getBoundingClientRect() })const rect = el.getBoundingClientRect() // in renderMedium
1918PerformanceBatch DOM Operationsbatch dom write readWebGroup DOM operations to minimize reflowsBatch writes then readsInterleave reads and writeswrites.forEach(w => w()); reads.forEach(r => r())write(); read(); write(); read(); // thrashingMedium
2019PerformancePreconnect CDNpreconnect link cdnWebAdd preconnect links for CDN domainsPreconnect to known domains<link rel='preconnect' href='https://cdn.example.com' />// no preconnect hintLow
2120PerformanceLazy Load Imageslazy loading image below-foldWebLazy-load images below the foldUse loading='lazy' for below-fold imagesLoad all images eagerly<img loading='lazy' src='...' /><img src='...' /> // above fold onlyMedium
2221StateURL Reflects Stateurl state query paramsWebURL should reflect current UI stateSync filters/tabs/pagination to URLState only in memory?tab=settings&page=2useState only // lost on refreshHigh
2322StateDeep Linkingdeep link stateful componentWebStateful components should support deep-linkingEnable sharing current view via URLNo shareable staterouter.push({ query: { ...filters } })setFilters(f) // not in URLMedium
2423StateConfirm Destructive Actionsconfirm destructive delete modalWebDestructive actions require confirmationShow confirmation dialog before deleteDelete without confirmationif (confirm('Delete?')) delete()onClick={delete} // no confirmationHigh
2524TypographyProper Unicodeunicode ellipsis quotesWebUse proper Unicode charactersUse ... curly quotes proper dashesASCII approximations'Hello...' with proper ellipsis'Hello...' with three dotsLow
2625TypographyText Overflowtruncate line-clamp overflowWebHandle text overflow properlyUse truncate/line-clamp/break-wordsText overflows container<p class='truncate'>Long text...</p><p>Long text...</p> // overflowsMedium
2726TypographyNon-Breaking Spacesnbsp unit brandWebUse non-breaking spaces for units and brand namesUse &nbsp; between number and unit10&nbsp;kg or Next.js&nbsp;1410 kg // may wrapLow
2827Anti-PatternNo Zoom Disableviewport zoom disableWebNever disable zoom in viewport metaAllow user zoom<meta name='viewport' content='width=device-width'><meta name='viewport' content='maximum-scale=1'>Critical
2928Anti-PatternNo Transition Alltransition all specificWebAvoid transition: all - specify propertiesTransition specific propertiestransition: alltransition-colors duration-200transition-all duration-200Medium
3029Anti-PatternOutline Replacementoutline-none ring focusWebNever use outline-none without replacementProvide visible focus replacementRemove outline with nothingfocus:outline-none focus:ring-2 focus:ring-blue-500focus:outline-none // aloneCritical
3130Anti-PatternNo Hardcoded Datesdate format intl localeWebUse Intl for date/number formattingUse Intl.DateTimeFormatHardcoded date formatnew Intl.DateTimeFormat('en').format(date)date.toLocaleDateString() // or manual formatMedium