Cursor rule
.cursor/rules/switch-accessibility.mdcSwitch component accessibility compliance pattern
Cursor rules
Quality
40/100
Scores the file, not the repository.Length
464 words
1 headings · 3 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Switch Component Accessibility Standards78Ensures switch components follow WCAG compliance and WAI-ARIA Switch Pattern specifications.910<rule>11name: switch_accessibility_standards12description: Enforce switch component accessibility standards and WAI-ARIA Switch Pattern compliance13filters:14 - type: file_extension15 pattern: "\\.(vue|jsx|tsx|html|liquid|php|js|ts)$"1617actions:18 - type: enforce19 conditions:20 # Switch role requirement21 - pattern: "(?i)<(div|span|button)[^>]*(?:switch|toggle)[^>]*>"22 pattern_negate: "role=\"switch\""23 message: "Switch elements must have role='switch' attribute."2425 # Missing aria-checked state26 - pattern: "(?i)<[^>]*role=\"switch\"[^>]*>"27 pattern_negate: "aria-checked=\"(true|false)\""28 message: "Switch elements must have aria-checked attribute set to 'true' or 'false'."2930 # Missing accessible label31 - pattern: "(?i)<[^>]*role=\"switch\"[^>]*>"32 pattern_negate: "(aria-labelledby|aria-label)"33 message: "Switch elements must have either aria-labelledby or aria-label for accessibility."3435 # Empty aria-label check36 - pattern: "(?i)<[^>]*role=\"switch\"[^>]*aria-label=\"\"[^>]*>"37 message: "Switch aria-label should not be empty; provide a meaningful description."3839 # Missing keyboard event handlers40 - pattern: "(?i)<[^>]*role=\"switch\"[^>]*>"41 pattern_negate: "(onKeyDown|onkeydown|@keydown|v-on:keydown)"42 message: "Switch elements should handle keyboard events (Space, optionally Enter)."4344 # Switch group missing proper structure45 - pattern: "(?i)<(div|section)[^>]*(?:switch.*group|group.*switch)[^>]*>"46 pattern_negate: "(role=\"group\"|fieldset)"47 message: "Switch groups must use role='group' or fieldset element."4849 # Switch group missing label50 - pattern: "(?i)<[^>]*role=\"group\"[^>]*>"51 pattern_negate: "(aria-labelledby|legend)"52 message: "Switch groups must have aria-labelledby or legend element for labeling."5354 - type: suggest55 message: |56 **Switch Component Accessibility Best Practices:**5758 **Required ARIA Attributes:**59 - **role='switch':** Set on the input element60 - **aria-checked:** 'true' if switch is on, 'false' if off61 - **aria-labelledby:** Reference to visible label, OR62 - **aria-label:** Descriptive label if no visible label exists6364 **Optional ARIA Attributes:**65 - **aria-describedby:** Reference to additional descriptive text66 - **aria-disabled:** 'true' if switch cannot be toggled6768 **Keyboard Interaction Requirements:**69 - **Space:** Toggle switch state70 - **Enter:** (Optional) Toggle switch state71 - **Tab/Shift+Tab:** Move through all focusable elements in page order7273 **Structure Requirements:**74 - Switch must have a visible label that doesn't change with state75 - Use semantic HTML within the switch (buttons, spans)76 - Provide clear visual focus indicators77 - Consider using native checkbox input with role='switch' for better semantics7879 **Implementation Patterns:**8081 **Basic Switch:**82```html83 <div class="switch">84 <input type="checkbox"85 id="notifications"86 role="switch"87 aria-checked="false"88 tabindex="0">89 <span class="switch-slider"></span>90 </div>91 <label for="notifications">Notifications</label>92```9394 **Switch with Description:**95```html96 <div class="switch">97 <input type="checkbox"98 id="dark-mode"99 role="switch"100 aria-checked="false"101 tabindex="0"102 aria-describedby="dark-mode-desc">103 <span class="switch-slider"></span>104 </div>105 <label for="dark-mode">Dark Mode</label>106 <span id="dark-mode-desc">Enable dark mode for reduced eye strain</span>107```108109 **Switch Group:**110```html111 <fieldset>112 <legend>Notification Settings</legend>113 <div class="switch">114 <input type="checkbox"115 id="email-notifications"116 role="switch"117 aria-checked="false"118 tabindex="0">119 <span class="switch-slider"></span>120 </div>121 <label for="email-notifications">Email Notifications</label>122 </fieldset>123```124125 **JavaScript Considerations:**126 - Implement Space and optional Enter key handlers127 - Update aria-checked state when switch toggles128 - Ensure focus management is maintained129 - Consider implementing disabled state130 - Use CSS transitions for smooth state changes131132 **Accessibility Notes:**133 - Choose between switch, checkbox, or toggle button based on semantics134 - Use switch when on/off semantics are clearer than checked/unchecked135 - Ensure visual state changes are clear and maintainable136 - Test with screen readers to ensure proper announcement137 - Consider implementing a visible focus indicator138139metadata:140 priority: high141 version: 1.0142</rule>143
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
