Cursor rule
.cursor/rules/mobile-accessibility-standards.mdcMobile accessibility standards per WCAG 2.5.8 Target Size (Minimum), 2.4.1 Bypass Blocks, and 1.3.4 Orientation requirements
Cursor rules
Quality
36/100
Scores the file, not the repository.Length
1,611 words
1 headings · 11 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.1234567# Mobile Accessibility Best Practices89Ensures mobile interfaces follow WCAG compliance and provide proper accessibility for touch interactions, spacing, and orientation flexibility.1011<rule>12name: mobile_accessibility_standards13description: Enforce mobile accessibility standards per WCAG requirements for touch targets, spacing, and orientation14filters:15 - type: file_extension16 pattern: "\\.(vue|jsx|tsx|html|liquid|php|js|ts|css|scss|sass|less)$"1718actions:19 - type: enforce20 conditions:21 # Touch targets smaller than minimum recommended size22 - pattern: "(width|height):\\s*(?:1[0-9]|2[0-3])\\s*(?:px|rem|em|%)"23 pattern_negate: "(min-width|min-height|max-width|max-height)"24 message: "Touch targets should be at least 24x24px (Level AA) or 44x44px (Level AAA) for optimal accessibility. Use CSS padding to increase touch area without affecting visual design."2526 # Touch targets with insufficient padding27 - pattern: "padding:\\s*(?:0|1|2|3|4)\\s*(?:px|rem|em)"28 pattern_negate: "(min-width|min-height|max-width|max-height)"29 message: "Consider increasing padding to create larger touch targets. Google recommends 48x48px with 8px spacing, Apple recommends 44x44px minimum."3031 # Interactive elements without proper touch target sizing32 - pattern: "<(button|a|input|select|textarea)[^>]*>"33 pattern_negate: "(min-width|min-height|width|height|padding)"34 message: "Interactive elements should have sufficient touch target size. Use CSS min-width/min-height or padding to ensure accessibility compliance."3536 # Touch targets too close together (less than 8px spacing)37 - pattern: "(margin|gap):\\s*(?:0|1|2|3|4|5|6|7)\\s*(?:px|rem|em)"38 pattern_negate: "(min-width|min-height|max-width|max-height)"39 message: "Touch targets should have at least 8px spacing between them to prevent accidental activation. Consider increasing margins or gaps."4041 # Fixed orientation restrictions42 - pattern: "orientation:\\s*(portrait|landscape)"43 message: "Avoid restricting content orientation. Allow users to consume content in any orientation they prefer or require for their computing environment."4445 # Viewport meta tag preventing orientation changes46 - pattern: "<meta[^>]*name=\"viewport\"[^>]*>"47 pattern_negate: "(width=device-width|initial-scale)"48 message: "Viewport meta tag should support responsive design and orientation flexibility. Avoid restrictions that prevent content reflow."4950 # CSS that prevents orientation flexibility51 - pattern: "@media\\s*\\(orientation:\\s*(portrait|landscape)\\)"52 pattern_negate: "(min-width|max-width|flex-direction|grid-template)"53 message: "Orientation media queries should enhance layout, not restrict functionality. Ensure content remains accessible in both orientations."5455 # Fixed positioning that may cause issues in different orientations56 - pattern: "position:\\s*fixed"57 pattern_negate: "(top|bottom|left|right|transform)"58 message: "Fixed positioning may cause accessibility issues in different orientations. Consider using relative positioning with responsive adjustments."5960 # Touch targets without proper focus indicators61 - pattern: "<(button|a|input|select|textarea)[^>]*>"62 pattern_negate: "(:focus|:focus-visible|outline|box-shadow)"63 message: "Touch targets should have visible focus indicators for keyboard navigation accessibility."6465 # Mobile-specific elements without touch-friendly sizing66 - pattern: "(?i)<(button|a|input|select|textarea)[^>]*class=\"[^\"]*(?:mobile|touch|small)[^\"]*\"[^>]*>"67 pattern_negate: "(min-width|min-height|width|height|padding)"68 message: "Mobile-specific interactive elements must have adequate touch target sizes for accessibility compliance."6970 # Grid layouts without proper spacing71 - pattern: "display:\\s*grid"72 pattern_negate: "(gap|grid-gap|margin|padding)"73 message: "Grid layouts should include proper spacing between elements to prevent accidental touch activation."7475 # Flexbox layouts without proper spacing76 - pattern: "display:\\s*flex"77 pattern_negate: "(gap|margin|padding|justify-content|align-items)"78 message: "Flexbox layouts should include proper spacing and alignment to ensure touch target accessibility."7980 - type: suggest81 message: |82 **WCAG Mobile Accessibility Requirements:**8384 **Touch Target Size (WCAG 2.5.8 Target Size Minimum):**85 - **Level AA (Required):** Minimum 24x24 pixels86 - **Recommended:** 44x44 pixels or larger for optimal usability87 - **Industry Standards:** Google (48x48px), Apple (44x44px)88 - **Spacing:** At least 8 pixels between touch targets8990 **Touch Target Implementation:**9192 **1. CSS Padding Approach:**93```css94 /* Good: Touch target meeting minimum requirements */95 .touch-button {96 min-width: 24px; /* WCAG 2.5.8 AA minimum */97 min-height: 24px;98 padding: 12px 16px; /* Padding increases effective touch area */99 border: none;100 background: #0056b3;101 color: white;102 border-radius: 4px;103 }104105 /* Better: Larger touch target for optimal usability */106 .touch-button-optimal {107 min-width: 44px; /* Recommended size */108 min-height: 44px;109 padding: 12px 16px;110 border: none;111 background: #0056b3;112 color: white;113 border-radius: 4px;114 }115116 /* Good: Icon button with sufficient touch area */117 .icon-button {118 width: 24px;119 height: 24px;120 padding: 12px; /* Total touch area: 48x48px */121 border: none;122 background: transparent;123 }124```125126 **2. Minimum Dimensions:**127```css128 /* Good: Meets WCAG 2.5.8 AA minimum */129 .mobile-button {130 min-width: 24px;131 min-height: 24px;132 padding: 8px 16px;133 font-size: 16px; /* Prevents zoom on iOS */134 }135136 /* Better: Recommended size for optimal usability */137 .mobile-button-optimal {138 min-width: 44px;139 min-height: 44px;140 padding: 8px 16px;141 font-size: 16px;142 }143144 /* Good: Responsive touch targets */145 .responsive-button {146 min-width: clamp(24px, 8vw, 120px);147 min-height: clamp(24px, 8vh, 60px);148 padding: 12px;149 }150```151152 **3. Touch Target Spacing:**153```css154 /* Good: Proper spacing between touch targets */155 .button-group {156 display: flex;157 gap: 12px; /* 8px minimum, 12px recommended */158 align-items: center;159 }160161 /* Good: Grid with minimum touch target size */162 .touch-grid {163 display: grid;164 grid-template-columns: repeat(auto-fit, minmax(24px, 1fr));165 gap: 12px;166 padding: 16px;167 }168169 /* Better: Grid with recommended touch target size */170 .touch-grid-optimal {171 display: grid;172 grid-template-columns: repeat(auto-fit, minmax(44px, 1fr));173 gap: 12px;174 padding: 16px;175 }176```177178 **Spacing Between Elements (WCAG 2.4.1 Bypass Blocks):**179180 **1. White Space for Navigation:**181```css182 /* Good: Adequate spacing for motor impairment users */183 .navigation-links {184 display: flex;185 gap: 16px; /* Prevents accidental activation */186 padding: 20px;187 flex-wrap: wrap;188 }189190 /* Good: Callout action spacing */191 .callout-actions {192 display: grid;193 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));194 gap: 20px; /* Generous spacing for accessibility */195 margin: 24px 0;196 }197```198199 **2. Touch-Friendly Spacing:**200```css201 /* Good: Touch-friendly button spacing */202 .touch-buttons {203 display: flex;204 flex-direction: column;205 gap: 16px; /* Vertical spacing for thumb navigation */206 }207208 /* Good: Horizontal button spacing */209 .horizontal-buttons {210 display: flex;211 gap: 12px;212 padding: 0 16px; /* Side padding for edge safety */213 }214```215216 **Orientation Flexibility (WCAG 1.3.4 Orientation):**217218 **1. Responsive Design Implementation:**219```css220 /* Good: Flexible layout that works in any orientation */221 .responsive-container {222 display: flex;223 flex-direction: row;224 gap: 16px;225 padding: 20px;226 }227228 /* Responsive adjustments for different orientations */229 @media (orientation: portrait) {230 .responsive-container {231 flex-direction: column;232 gap: 12px;233 }234 }235236 @media (orientation: landscape) {237 .responsive-container {238 flex-direction: row;239 gap: 20px;240 }241 }242```243244 **2. Viewport Meta Tag:**245```html246 <!-- Good: Flexible viewport configuration -->247 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes">248```249250 **3. CSS Grid for Orientation Flexibility:**251```css252 /* Good: Grid that adapts to orientation */253 .adaptive-grid {254 display: grid;255 grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));256 gap: 20px;257 padding: 20px;258 }259260 /* Orientation-specific adjustments */261 @media (orientation: portrait) {262 .adaptive-grid {263 grid-template-columns: 1fr;264 gap: 16px;265 }266 }267```268269 **Mobile Accessibility Best Practices:**270271 **1. Touch Target Guidelines:**272 - **Minimum size:** 24x24px per WCAG 2.5.8 AA273 - **Recommended size:** 44x44px or larger for optimal accessibility274 - **Spacing:** At least 8px between interactive elements275 - **Padding:** Use CSS padding to increase touch area276 - **Visual feedback:** Provide clear touch feedback277 - **Font size:** Minimum 16px to prevent zoom on iOS278279 **2. Spacing and Layout:**280 - **White space:** Generous spacing prevents accidental activation281 - **Grid gaps:** Use CSS Grid gap property for consistent spacing282 - **Flexbox spacing:** Use gap property or margins for flex layouts283 - **Touch margins:** Add margins around touch targets for safety284 - **Visual separation:** Clear visual boundaries between interactive elements285286 **3. Orientation Support:**287 - **Responsive design:** Content should reflow in any orientation288 - **Flexible layouts:** Use CSS Grid and Flexbox for adaptability289 - **No restrictions:** Avoid forcing specific orientations290 - **User choice:** Allow users to choose their preferred orientation291 - **Testing:** Test in both portrait and landscape modes292293 **Implementation Examples:**294295 **Touch-Friendly Button Component:**296```html297 <!-- Good: Accessible touch button meeting WCAG 2.5.8 AA -->298 <button class="touch-button"299 type="button"300 aria-label="Submit form">301 Submit302 </button>303304 <style>305 .touch-button {306 min-width: 24px; /* WCAG 2.5.8 AA minimum */307 min-height: 24px;308 padding: 12px 24px; /* Padding creates larger effective size */309 font-size: 16px;310 border: 2px solid #0056b3;311 background: #0056b3;312 color: white;313 border-radius: 6px;314 cursor: pointer;315 transition: all 0.2s ease;316 }317318 .touch-button:hover,319 .touch-button:focus {320 background: #004085;321 border-color: #004085;322 outline: 3px solid #0056b3;323 outline-offset: 2px;324 }325 </style>326```327328 **Responsive Touch Grid:**329```html330 <!-- Good: Responsive touch-friendly grid -->331 <div class="touch-grid">332 <button class="grid-button">Action 1</button>333 <button class="grid-button">Action 2</button>334 <button class="grid-button">Action 3</button>335 <button class="grid-button">Action 4</button>336 </div>337338 <style>339 .touch-grid {340 display: grid;341 grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));342 gap: 16px;343 padding: 20px;344 }345346 .grid-button {347 min-width: 24px; /* WCAG 2.5.8 AA minimum */348 min-height: 24px;349 padding: 16px; /* Padding creates larger effective size */350 font-size: 16px;351 border: 1px solid #ddd;352 background: white;353 border-radius: 4px;354 cursor: pointer;355 }356357 /* Orientation-specific adjustments */358 @media (orientation: portrait) {359 .touch-grid {360 grid-template-columns: repeat(2, 1fr);361 gap: 12px;362 }363 }364365 @media (orientation: landscape) {366 .touch-grid {367 grid-template-columns: repeat(4, 1fr);368 gap: 20px;369 }370 }371 </style>372```373374 **Touch-Friendly Navigation:**375```html376 <!-- Good: Touch-friendly navigation menu -->377 <nav class="touch-navigation" role="navigation">378 <ul class="nav-list">379 <li><a href="/" class="nav-link">Home</a></li>380 <li><a href="/about" class="nav-link">About</a></li>381 <li><a href="/services" class="nav-link">Services</a></li>382 <li><a href="/contact" class="nav-link">Contact</a></li>383 </ul>384 </nav>385386 <style>387 .touch-navigation {388 padding: 16px;389 }390391 .nav-list {392 display: flex;393 flex-direction: column;394 gap: 16px;395 list-style: none;396 margin: 0;397 padding: 0;398 }399400 .nav-link {401 display: block;402 min-height: 24px; /* WCAG 2.5.8 AA minimum */403 padding: 12px 16px; /* Padding creates larger effective size */404 text-decoration: none;405 color: #333;406 background: #f8f9fa;407 border-radius: 6px;408 border: 2px solid transparent;409 transition: all 0.2s ease;410 }411412 .nav-link:hover,413 .nav-link:focus {414 background: #e9ecef;415 border-color: #0056b3;416 outline: none;417 }418419 /* Landscape orientation adjustment */420 @media (orientation: landscape) {421 .nav-list {422 flex-direction: row;423 gap: 20px;424 }425 }426 </style>427```428429 **Testing and Validation:**430431 **Touch Target Testing:**432 - Use browser dev tools to measure element dimensions433 - Test with touch devices to verify target sizes434 - Verify spacing between interactive elements435 - Check that padding creates adequate touch areas436 - Test with different screen densities437438 **Orientation Testing:**439 - Test in both portrait and landscape modes440 - Verify content reflows properly441 - Check that functionality remains accessible442 - Test with different device orientations443 - Verify touch targets remain accessible444445 **Accessibility Testing:**446 - Test with screen readers in different orientations447 - Verify keyboard navigation works in all orientations448 - Check that focus indicators remain visible449 - Test with motor impairment simulators450 - Validate touch target sizes meet WCAG requirements451452 **Common Mistakes to Avoid:**453 - Touch targets smaller than 24x24px (WCAG 2.5.8 AA minimum)454 - Not using recommended 44x44px or larger sizes for optimal usability455 - Insufficient spacing between interactive elements (minimum 8px)456 - Fixed orientation restrictions457 - Viewport meta tags preventing orientation changes458 - CSS that doesn't adapt to different orientations459 - Touch targets without proper focus indicators460 - Grid layouts without adequate gaps461 - Flexbox layouts without proper spacing462 - Fixed positioning that causes orientation issues463 - Mobile elements without touch-friendly sizing464465metadata:466 priority: high467 version: 1.0468</rule>469
Also in Shopify/horizon
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| Shopify/horizon.cursor/rules/accordion-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/animation-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/blocks.mdc · 428 | Cursor rules | stylearchtypesdatabase+2 | 62/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/breadcrumb-accessibility.mdc · 428 | Cursor rules | ui | 36/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/carousel-accessibility.mdc · 428 | Cursor rules | ui | 32/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/cart-drawer-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/chat-window-accessibility.mdc · 428 | Cursor rules | styleui | 24/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/color-contrast-accessibility.mdc · 428 | Cursor rules | lint-formatui | 44/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/color-swatch-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/commit-messages.mdc · 428 | Cursor rules | setuplint-formattypesgit | 62/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/css-standards.mdc · 428 | Cursor rules | stylearchuiperformance+3 | 49/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/disclosure-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/dropdown-navigation-accessibility.mdc · 428 | Cursor rules | styleui | 36/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/flip-card-accessibility.mdc · 428 | Cursor rules | styleui | 36/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/form-accessibility.mdc · 428 | Cursor rules | ui | 32/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/javascript-standards.mdc · 428 | Cursor rules | stylearchtypesui+2 | 54/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/landmark-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/liquid.mdc · 428 | Cursor rules | buildstyletypesdatabase+2 | 77/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/locales.mdc · 428 | Cursor rules | arch | 49/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/localization.mdc · 428 | Cursor rules | style | 54/100 | 3 days ago |
Diff against .cursor/rules/accordion-accessibility.mdc Diff against .cursor/rules/animation-accessibility.mdc Diff against .cursor/rules/blocks.mdc Diff against .cursor/rules/breadcrumb-accessibility.mdc Diff against .cursor/rules/carousel-accessibility.mdc Diff against .cursor/rules/cart-drawer-accessibility.mdc Diff against .cursor/rules/chat-window-accessibility.mdc Diff against .cursor/rules/color-contrast-accessibility.mdc Diff against .cursor/rules/color-swatch-accessibility.mdc Diff against .cursor/rules/commit-messages.mdc Diff against .cursor/rules/css-standards.mdc Diff against .cursor/rules/disclosure-accessibility.mdc Diff against .cursor/rules/dropdown-navigation-accessibility.mdc Diff against .cursor/rules/flip-card-accessibility.mdc Diff against .cursor/rules/form-accessibility.mdc Diff against .cursor/rules/javascript-standards.mdc Diff against .cursor/rules/landmark-accessibility.mdc Diff against .cursor/rules/liquid.mdc Diff against .cursor/rules/locales.mdc Diff against .cursor/rules/localization.mdc
